cxl: Ignore CAPI adapters misplaced in switched slots
One should not attempt to switch a PHB into CAPI mode if there is a switch between the PHB and the adapter. This patch modifies the cxl driver to ignore CAPI adapters misplaced in switched slots. Signed-off-by: Philippe Bergheaud <felix@linux.vnet.ibm.com> Reviewed-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com> Acked-by: Ian Munsie <imunsie@au1.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
committed by
Michael Ellerman
parent
e00878be3f
commit
3b3dcd61fa
@@ -1402,6 +1402,30 @@ static void cxl_pci_remove_adapter(struct cxl *adapter)
|
|||||||
device_unregister(&adapter->dev);
|
device_unregister(&adapter->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CXL_MAX_PCIEX_PARENT 2
|
||||||
|
|
||||||
|
static int cxl_slot_is_switched(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
int depth = 0;
|
||||||
|
const __be32 *prop;
|
||||||
|
|
||||||
|
if (!(np = pci_device_to_OF_node(dev))) {
|
||||||
|
pr_err("cxl: np = NULL\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
of_node_get(np);
|
||||||
|
while (np) {
|
||||||
|
np = of_get_next_parent(np);
|
||||||
|
prop = of_get_property(np, "device_type", NULL);
|
||||||
|
if (!prop || strcmp((char *)prop, "pciex"))
|
||||||
|
break;
|
||||||
|
depth++;
|
||||||
|
}
|
||||||
|
of_node_put(np);
|
||||||
|
return (depth > CXL_MAX_PCIEX_PARENT);
|
||||||
|
}
|
||||||
|
|
||||||
static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||||
{
|
{
|
||||||
struct cxl *adapter;
|
struct cxl *adapter;
|
||||||
@@ -1413,6 +1437,11 @@ static int cxl_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cxl_slot_is_switched(dev)) {
|
||||||
|
dev_info(&dev->dev, "Ignoring card on incompatible PCI slot\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
if (cxl_verbose)
|
if (cxl_verbose)
|
||||||
dump_cxl_config_space(dev);
|
dump_cxl_config_space(dev);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user