From 18906318c03afd25fad86537f70ae5faba75546b Mon Sep 17 00:00:00 2001 From: Vivek Pernamitta Date: Mon, 8 Feb 2021 22:51:30 +0530 Subject: [PATCH] msm: pcie: Disable masking MSI interrupts at EP Disable masking MSI interrupts at EP side to avoid premeption disable on the CPU core while writing MSI mask register. Change-Id: I64fbb5aa8d9b21a78748b51b086506ce63a06a53 Signed-off-by: Vivek Pernamitta --- drivers/pci/controller/pci-msm-msi.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/pci/controller/pci-msm-msi.c b/drivers/pci/controller/pci-msm-msi.c index 5a0f2c5a7a32..c1a337544e22 100644 --- a/drivers/pci/controller/pci-msm-msi.c +++ b/drivers/pci/controller/pci-msm-msi.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.*/ +/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.*/ #include #include @@ -63,6 +63,7 @@ struct msm_msi { phys_addr_t msi_addr; u32 msi_addr_size; enum msi_type type; + bool msi_mask_disable; spinlock_t cfg_lock; /* lock for configuring Synopsys MSI registers */ bool cfg_access; /* control access to MSI registers */ void __iomem *pcie_cfg; @@ -162,7 +163,7 @@ static void msm_msi_mask_irq(struct irq_data *data) msi = msi_irq->client->msi; spin_lock_irqsave(&msi->cfg_lock, flags); - if (msi->cfg_access) + if (!msi->msi_mask_disable && msi->cfg_access) pci_msi_mask_irq(data); spin_unlock_irqrestore(&msi->cfg_lock, flags); @@ -213,7 +214,7 @@ static void msm_msi_unmask_irq(struct irq_data *data) msi->unmask_irq(parent_data); spin_lock_irqsave(&msi->cfg_lock, flags); - if (msi->cfg_access) + if (!msi->msi_mask_disable && msi->cfg_access) pci_msi_unmask_irq(data); spin_unlock_irqrestore(&msi->cfg_lock, flags); } @@ -643,6 +644,12 @@ int msm_msi_init(struct device *dev) mutex_init(&msi->mutex); spin_lock_init(&msi->cfg_lock); INIT_LIST_HEAD(&msi->clients); + msi->msi_mask_disable = of_property_read_bool(dev->of_node, + "qcom,msi_mask_disable"); + + if (msi->msi_mask_disable) + pr_warn("MSI interrupts mask disabled:%d\n", + msi->msi_mask_disable); prop_val = of_get_address(msi->of_node, 0, NULL, NULL); if (!prop_val) {