]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
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)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Fri, 4 Sep 2020 19:29:12 +0000 (16:29 -0300)
BugLink: https://bugs.launchpad.net/bugs/1892417
[ Upstream commit e3bca37d15dca118f2ef1f0a068bb6e07846ea20 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
drivers/pci/controller/pcie-cadence-host.c

index 97e251090b4f9777bffe45928bf494980a357a2b..0dfc778f40a7aaf36a94664dd947cd9ab632784a 100644 (file)
@@ -102,6 +102,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:
@@ -121,8 +122,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);