|
@@ -361,6 +361,41 @@ int cxl_setup_irq(struct cxl *adapter, unsigned int hwirq,
|
|
|
return pnv_cxl_ioda_msi_setup(dev, hwirq, virq);
|
|
|
}
|
|
|
|
|
|
+int cxl_update_image_control(struct cxl *adapter)
|
|
|
+{
|
|
|
+ struct pci_dev *dev = to_pci_dev(adapter->dev.parent);
|
|
|
+ int rc;
|
|
|
+ int vsec;
|
|
|
+ u8 image_state;
|
|
|
+
|
|
|
+ if (!(vsec = find_cxl_vsec(dev))) {
|
|
|
+ dev_err(&dev->dev, "ABORTING: CXL VSEC not found!\n");
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((rc = CXL_READ_VSEC_IMAGE_STATE(dev, vsec, &image_state))) {
|
|
|
+ dev_err(&dev->dev, "failed to read image state: %i\n", rc);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (adapter->perst_loads_image)
|
|
|
+ image_state |= CXL_VSEC_PERST_LOADS_IMAGE;
|
|
|
+ else
|
|
|
+ image_state &= ~CXL_VSEC_PERST_LOADS_IMAGE;
|
|
|
+
|
|
|
+ if (adapter->perst_select_user)
|
|
|
+ image_state |= CXL_VSEC_PERST_SELECT_USER;
|
|
|
+ else
|
|
|
+ image_state &= ~CXL_VSEC_PERST_SELECT_USER;
|
|
|
+
|
|
|
+ if ((rc = CXL_WRITE_VSEC_IMAGE_STATE(dev, vsec, image_state))) {
|
|
|
+ dev_err(&dev->dev, "failed to update image control: %i\n", rc);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int cxl_alloc_one_irq(struct cxl *adapter)
|
|
|
{
|
|
|
struct pci_dev *dev = to_pci_dev(adapter->dev.parent);
|
|
@@ -770,8 +805,8 @@ static int cxl_read_vsec(struct cxl *adapter, struct pci_dev *dev)
|
|
|
CXL_READ_VSEC_BASE_IMAGE(dev, vsec, &adapter->base_image);
|
|
|
CXL_READ_VSEC_IMAGE_STATE(dev, vsec, &image_state);
|
|
|
adapter->user_image_loaded = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED);
|
|
|
- adapter->perst_loads_image = !!(image_state & CXL_VSEC_PERST_LOADS_IMAGE);
|
|
|
- adapter->perst_select_user = !!(image_state & CXL_VSEC_PERST_SELECT_USER);
|
|
|
+ adapter->perst_loads_image = true;
|
|
|
+ adapter->perst_select_user = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED);
|
|
|
|
|
|
CXL_READ_VSEC_NAFUS(dev, vsec, &adapter->slices);
|
|
|
CXL_READ_VSEC_AFU_DESC_OFF(dev, vsec, &afu_desc_off);
|
|
@@ -879,6 +914,9 @@ static struct cxl *cxl_init_adapter(struct pci_dev *dev)
|
|
|
if ((rc = cxl_vsec_looks_ok(adapter, dev)))
|
|
|
goto err2;
|
|
|
|
|
|
+ if ((rc = cxl_update_image_control(adapter)))
|
|
|
+ goto err2;
|
|
|
+
|
|
|
if ((rc = cxl_map_adapter_regs(adapter, dev)))
|
|
|
goto err2;
|
|
|
|