cxl: Support the cxl kernel API from a guest
Like on bare-metal, the cxl driver creates a virtual PHB and a pci device for the AFU. The configuration space of the device is mapped to the configuration record of the AFU. Reuse the code defined in afu_cr_read8|16|32() when reading the configuration space of the AFU device. Even though the (virtual) AFU device is a pci device, the adapter is not. So a driver using the cxl kernel API cannot read the VPD of the adapter through the usual PCI interface. Therefore, we add a call to the cxl kernel API: ssize_t cxl_read_adapter_vpd(struct pci_dev *dev, void *buf, size_t count); Co-authored-by: Christophe Lombard <clombard@linux.vnet.ibm.com> Signed-off-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com> Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> Reviewed-by: Manoj Kumar <manoj@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
b40844aa55
commit
d601ea918b
@@ -881,6 +881,7 @@ static void cxl_pci_remove_afu(struct cxl_afu *afu)
|
||||
if (!afu)
|
||||
return;
|
||||
|
||||
cxl_pci_vphb_remove(afu);
|
||||
cxl_sysfs_afu_remove(afu);
|
||||
cxl_debugfs_afu_remove(afu);
|
||||
|
||||
@@ -1067,6 +1068,11 @@ static int cxl_vsec_looks_ok(struct cxl *adapter, struct pci_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t cxl_pci_read_adapter_vpd(struct cxl *adapter, void *buf, size_t len)
|
||||
{
|
||||
return pci_read_vpd(to_pci_dev(adapter->dev.parent), 0, len, buf);
|
||||
}
|
||||
|
||||
static void cxl_release_adapter(struct device *dev)
|
||||
{
|
||||
struct cxl *adapter = to_cxl_adapter(dev);
|
||||
@@ -1272,7 +1278,6 @@ static void cxl_remove(struct pci_dev *dev)
|
||||
*/
|
||||
for (i = 0; i < adapter->slices; i++) {
|
||||
afu = adapter->afu[i];
|
||||
cxl_pci_vphb_remove(afu);
|
||||
cxl_pci_remove_afu(afu);
|
||||
}
|
||||
cxl_pci_remove_adapter(adapter);
|
||||
@@ -1451,8 +1456,6 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev)
|
||||
if (cxl_afu_select_best_mode(afu))
|
||||
goto err;
|
||||
|
||||
cxl_pci_vphb_reconfigure(afu);
|
||||
|
||||
list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
|
||||
/* Reset the device context.
|
||||
* TODO: make this less disruptive
|
||||
|
Reference in New Issue
Block a user