Commit 1b79c5284439 ("PCI: cadence: Add host driver for Cadence PCIe
controller") in order to update Vendor ID, directly wrote to
PCI_VENDOR_ID register. However PCI_VENDOR_ID in root port configuration
space is read-only register and writing to it will have no effect.
Use local management register to configure Vendor ID and Subsystem Vendor
ID.

Fixes: 1b79c5284439 ("PCI: cadence: Add host driver for Cadence PCIe 
controller")
Reviewed-by: Rob Herring <r...@kernel.org>
Signed-off-by: Kishon Vijay Abraham I <kis...@ti.com>
---
 drivers/pci/controller/cadence/pcie-cadence-host.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/controller/cadence/pcie-cadence-host.c 
b/drivers/pci/controller/cadence/pcie-cadence-host.c
index 3003fafa3bfa..7ee9e06f1285 100644
--- a/drivers/pci/controller/cadence/pcie-cadence-host.c
+++ b/drivers/pci/controller/cadence/pcie-cadence-host.c
@@ -76,6 +76,7 @@ static int cdns_pcie_host_init_root_port(struct cdns_pcie_rc 
*rc)
 {
        struct cdns_pcie *pcie = &rc->pcie;
        u32 value, ctrl;
+       u32 id;
 
        /*
         * Set the root complex BAR configuration register:
@@ -95,8 +96,12 @@ static int cdns_pcie_host_init_root_port(struct cdns_pcie_rc 
*rc)
        cdns_pcie_writel(pcie, CDNS_PCIE_LM_RC_BAR_CFG, value);
 
        /* Set root port configuration space */
-       if (rc->vendor_id != 0xffff)
-               cdns_pcie_rp_writew(pcie, PCI_VENDOR_ID, rc->vendor_id);
+       if (rc->vendor_id != 0xffff) {
+               id = CDNS_PCIE_LM_ID_VENDOR(rc->vendor_id) |
+                       CDNS_PCIE_LM_ID_SUBSYS(rc->vendor_id);
+               cdns_pcie_writel(pcie, CDNS_PCIE_LM_ID, id);
+       }
+
        if (rc->device_id != 0xffff)
                cdns_pcie_rp_writew(pcie, PCI_DEVICE_ID, rc->device_id);
 
-- 
2.17.1

Reply via email to