PCI: cadence: Fix updating Vendor ID and Subsystem Vendor ID register
authorKishon Vijay Abraham I <kishon@ti.com>
Wed, 22 Jul 2020 11:03:11 +0000 (16:33 +0530)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Mon, 27 Jul 2020 14:46:16 +0000 (15:46 +0100)
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.

Link: https://lore.kernel.org/r/20200722110317.4744-10-kishon@ti.com
Fixes: 1b79c5284439 ("PCI: cadence: Add host driver for Cadence PCIe controller")
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Rob Herring <robh@kernel.org>
drivers/pci/controller/cadence/pcie-cadence-host.c

index 6069a46..89d2632 100644 (file)
@@ -82,6 +82,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:
@@ -101,8 +102,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);