From 365cfb4244d6a3e5f985da493cfc74a23363df58 Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Mon, 14 Aug 2017 17:33:14 -0700 Subject: msm: pcie: add global lock for PCIe enumeration Multiple root complexes can enumerate concurrently. Add a global lock to prevent race condition when PCI framework discovers and updates the PCIe bus driver's global device table. Change-Id: I9c88f12aef9fce05d95cfb2fa0f5374c6c4ab1e8 Signed-off-by: Tony Truong --- drivers/pci/host/pci-msm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/pci/host/pci-msm.c b/drivers/pci/host/pci-msm.c index 8e66cd5770b5..a741c9c7d115 100644 --- a/drivers/pci/host/pci-msm.c +++ b/drivers/pci/host/pci-msm.c @@ -596,7 +596,6 @@ struct msm_pcie_dev_t { bool cfg_access; spinlock_t cfg_lock; unsigned long irqsave_flags; - struct mutex enumerate_lock; struct mutex setup_lock; struct irq_domain *irq_domain; @@ -704,6 +703,9 @@ static u32 num_rc_on; /* global lock for PCIe common PHY */ static struct mutex com_phy_lock; +/* global lock for PCIe enumeration */ +static struct mutex enumerate_lock; + /* Table to track info of PCIe devices */ static struct msm_pcie_device_info msm_pcie_dev_tbl[MAX_RC_NUM * MAX_DEVICE_NUM]; @@ -5050,7 +5052,7 @@ int msm_pcie_enumerate(u32 rc_idx) int ret = 0, bus_ret = 0, scan_ret = 0; struct msm_pcie_dev_t *dev = &msm_pcie_dev[rc_idx]; - mutex_lock(&dev->enumerate_lock); + mutex_lock(&enumerate_lock); PCIE_DBG(dev, "Enumerate RC%d\n", rc_idx); @@ -5169,7 +5171,7 @@ int msm_pcie_enumerate(u32 rc_idx) } out: - mutex_unlock(&dev->enumerate_lock); + mutex_unlock(&enumerate_lock); return ret; } @@ -6631,6 +6633,7 @@ int __init pcie_init(void) pcie_drv.rc_num = 0; mutex_init(&pcie_drv.drv_lock); mutex_init(&com_phy_lock); + mutex_init(&enumerate_lock); for (i = 0; i < MAX_RC_NUM; i++) { snprintf(rc_name, MAX_RC_NAME_LEN, "pcie%d-short", i); @@ -6665,7 +6668,6 @@ int __init pcie_init(void) rc_name, i); spin_lock_init(&msm_pcie_dev[i].cfg_lock); msm_pcie_dev[i].cfg_access = true; - mutex_init(&msm_pcie_dev[i].enumerate_lock); mutex_init(&msm_pcie_dev[i].setup_lock); mutex_init(&msm_pcie_dev[i].recovery_lock); spin_lock_init(&msm_pcie_dev[i].linkdown_lock); -- cgit v1.2.3