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.

Signed-off-by: Kishon Vijay Abraham I <[email protected]>
---
 drivers/pci/controller/pcie-cadence-host.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/controller/pcie-cadence-host.c 
b/drivers/pci/controller/pcie-cadence-host.c
index 14a54f6a11de..dcecf47805ad 100644
--- a/drivers/pci/controller/pcie-cadence-host.c
+++ b/drivers/pci/controller/pcie-cadence-host.c
@@ -148,6 +148,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:
@@ -167,8 +168,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