cxl: Introduce implementation-specific API
The backend API (in cxl.h) lists some low-level functions whose implementation is different on bare-metal and in a guest. Each environment implements its own functions, and the common code uses them through function pointers, defined in cxl_backend_ops 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
cca44c0192
commit
5be587b111
@@ -69,7 +69,7 @@ static ssize_t reset_adapter_store(struct device *device,
|
||||
if ((rc != 1) || (val != 1))
|
||||
return -EINVAL;
|
||||
|
||||
if ((rc = cxl_reset(adapter)))
|
||||
if ((rc = cxl_ops->adapter_reset(adapter)))
|
||||
return rc;
|
||||
return count;
|
||||
}
|
||||
@@ -211,7 +211,7 @@ static ssize_t reset_store_afu(struct device *device,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if ((rc = __cxl_afu_reset(afu)))
|
||||
if ((rc = cxl_ops->afu_reset(afu)))
|
||||
goto err;
|
||||
|
||||
rc = count;
|
||||
@@ -348,7 +348,7 @@ static ssize_t mode_store(struct device *device, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
/*
|
||||
* cxl_afu_deactivate_mode needs to be done outside the lock, prevent
|
||||
* afu_deactivate_mode needs to be done outside the lock, prevent
|
||||
* other contexts coming in before we are ready:
|
||||
*/
|
||||
old_mode = afu->current_mode;
|
||||
@@ -357,9 +357,9 @@ static ssize_t mode_store(struct device *device, struct device_attribute *attr,
|
||||
|
||||
mutex_unlock(&afu->contexts_lock);
|
||||
|
||||
if ((rc = _cxl_afu_deactivate_mode(afu, old_mode)))
|
||||
if ((rc = cxl_ops->afu_deactivate_mode(afu, old_mode)))
|
||||
return rc;
|
||||
if ((rc = cxl_afu_activate_mode(afu, mode)))
|
||||
if ((rc = cxl_ops->afu_activate_mode(afu, mode)))
|
||||
return rc;
|
||||
|
||||
return count;
|
||||
@@ -389,7 +389,7 @@ static ssize_t afu_eb_read(struct file *filp, struct kobject *kobj,
|
||||
struct cxl_afu *afu = to_cxl_afu(container_of(kobj,
|
||||
struct device, kobj));
|
||||
|
||||
return cxl_afu_read_err_buffer(afu, buf, off, count);
|
||||
return cxl_ops->afu_read_err_buffer(afu, buf, off, count);
|
||||
}
|
||||
|
||||
static struct device_attribute afu_attrs[] = {
|
||||
@@ -469,10 +469,12 @@ static ssize_t afu_read_config(struct file *filp, struct kobject *kobj,
|
||||
struct afu_config_record *cr = to_cr(kobj);
|
||||
struct cxl_afu *afu = to_cxl_afu(container_of(kobj->parent, struct device, kobj));
|
||||
|
||||
u64 i, j, val;
|
||||
u64 i, j, val, rc;
|
||||
|
||||
for (i = 0; i < count;) {
|
||||
val = cxl_afu_cr_read64(afu, cr->cr, off & ~0x7);
|
||||
rc = cxl_ops->afu_cr_read64(afu, cr->cr, off & ~0x7, &val);
|
||||
if (rc)
|
||||
val = ~0ULL;
|
||||
for (j = off & 0x7; j < 8 && i < count; i++, j++, off++)
|
||||
buf[i] = (val >> (j * 8)) & 0xff;
|
||||
}
|
||||
@@ -517,9 +519,17 @@ static struct afu_config_record *cxl_sysfs_afu_new_cr(struct cxl_afu *afu, int c
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
cr->cr = cr_idx;
|
||||
cr->device = cxl_afu_cr_read16(afu, cr_idx, PCI_DEVICE_ID);
|
||||
cr->vendor = cxl_afu_cr_read16(afu, cr_idx, PCI_VENDOR_ID);
|
||||
cr->class = cxl_afu_cr_read32(afu, cr_idx, PCI_CLASS_REVISION) >> 8;
|
||||
|
||||
rc = cxl_ops->afu_cr_read16(afu, cr_idx, PCI_DEVICE_ID, &cr->device);
|
||||
if (rc)
|
||||
goto err;
|
||||
rc = cxl_ops->afu_cr_read16(afu, cr_idx, PCI_VENDOR_ID, &cr->vendor);
|
||||
if (rc)
|
||||
goto err;
|
||||
rc = cxl_ops->afu_cr_read32(afu, cr_idx, PCI_CLASS_REVISION, &cr->class);
|
||||
if (rc)
|
||||
goto err;
|
||||
cr->class >>= 8;
|
||||
|
||||
/*
|
||||
* Export raw AFU PCIe like config record. For now this is read only by
|
||||
|
Reference in New Issue
Block a user