• Andrew Donnellan's avatar
    cxl: Add cxl_check_and_switch_mode() API to switch bi-modal cards · b0b5e591
    Andrew Donnellan authored
    Add a new API, cxl_check_and_switch_mode() to allow for switching of
    bi-modal CAPI cards, such as the Mellanox CX-4 network card.
    
    When a driver requests to switch a card to CAPI mode, use PCI hotplug
    infrastructure to remove all PCI devices underneath the slot. We then write
    an updated mode control register to the CAPI VSEC, hot reset the card, and
    reprobe the card.
    
    As the card may present a different set of PCI devices after the mode
    switch, use the infrastructure provided by the pnv_php driver and the OPAL
    PCI slot management facilities to ensure that:
    
      * the old devices are removed from both the OPAL and Linux device trees
      * the new devices are probed by OPAL and added to the OPAL device tree
      * the new devices are added to the Linux device tree and probed through
        the regular PCI device probe path
    
    As such, introduce a new option, CONFIG_CXL_BIMODAL, with a dependency on
    the pnv_php driver.
    
    Refactor existing code that touches the mode control register in the
    regular single mode case into a new function, setup_cxl_protocol_area().
    Co-authored-by: default avatarIan Munsie <imunsie@au1.ibm.com>
    Cc: Gavin Shan <gwshan@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Donnellan <andrew.donnellan@au1.ibm.com>
    Signed-off-by: default avatarIan Munsie <imunsie@au1.ibm.com>
    Reviewed-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    b0b5e591
cxl.h 12.7 KB