| From 18f8f3bd35a224cf8bd105c4772bc5e91975d62e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 12 Apr 2021 09:23:27 -0700 |
| Subject: dmaengine: idxd: clear MSIX permission entry on shutdown |
| |
| From: Dave Jiang <dave.jiang@intel.com> |
| |
| [ Upstream commit 6df0e6c57dfc064af330071f372f11aa8c584997 ] |
| |
| Add disabling/clearing of MSIX permission entries on device shutdown to |
| mirror the enabling of the MSIX entries on probe. Current code left the |
| MSIX enabled and the pasid entries still programmed at device shutdown. |
| |
| Fixes: 8e50d392652f ("dmaengine: idxd: Add shared workqueue support") |
| Signed-off-by: Dave Jiang <dave.jiang@intel.com> |
| Link: https://lore.kernel.org/r/161824457969.882533.6020239898682672311.stgit@djiang5-desk3.ch.intel.com |
| Signed-off-by: Vinod Koul <vkoul@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/dma/idxd/device.c | 30 ++++++++++++++++++++++++++++++ |
| drivers/dma/idxd/idxd.h | 2 ++ |
| drivers/dma/idxd/init.c | 11 ++--------- |
| 3 files changed, 34 insertions(+), 9 deletions(-) |
| |
| diff --git a/drivers/dma/idxd/device.c b/drivers/dma/idxd/device.c |
| index 84a6ea60ecf0..c09687013d29 100644 |
| --- a/drivers/dma/idxd/device.c |
| +++ b/drivers/dma/idxd/device.c |
| @@ -574,6 +574,36 @@ void idxd_device_drain_pasid(struct idxd_device *idxd, int pasid) |
| } |
| |
| /* Device configuration bits */ |
| +void idxd_msix_perm_setup(struct idxd_device *idxd) |
| +{ |
| + union msix_perm mperm; |
| + int i, msixcnt; |
| + |
| + msixcnt = pci_msix_vec_count(idxd->pdev); |
| + if (msixcnt < 0) |
| + return; |
| + |
| + mperm.bits = 0; |
| + mperm.pasid = idxd->pasid; |
| + mperm.pasid_en = device_pasid_enabled(idxd); |
| + for (i = 1; i < msixcnt; i++) |
| + iowrite32(mperm.bits, idxd->reg_base + idxd->msix_perm_offset + i * 8); |
| +} |
| + |
| +void idxd_msix_perm_clear(struct idxd_device *idxd) |
| +{ |
| + union msix_perm mperm; |
| + int i, msixcnt; |
| + |
| + msixcnt = pci_msix_vec_count(idxd->pdev); |
| + if (msixcnt < 0) |
| + return; |
| + |
| + mperm.bits = 0; |
| + for (i = 1; i < msixcnt; i++) |
| + iowrite32(mperm.bits, idxd->reg_base + idxd->msix_perm_offset + i * 8); |
| +} |
| + |
| static void idxd_group_config_write(struct idxd_group *group) |
| { |
| struct idxd_device *idxd = group->idxd; |
| diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h |
| index 81a0e65fd316..eda2ee10501f 100644 |
| --- a/drivers/dma/idxd/idxd.h |
| +++ b/drivers/dma/idxd/idxd.h |
| @@ -316,6 +316,8 @@ void idxd_unregister_driver(void); |
| struct bus_type *idxd_get_bus_type(struct idxd_device *idxd); |
| |
| /* device interrupt control */ |
| +void idxd_msix_perm_setup(struct idxd_device *idxd); |
| +void idxd_msix_perm_clear(struct idxd_device *idxd); |
| irqreturn_t idxd_irq_handler(int vec, void *data); |
| irqreturn_t idxd_misc_thread(int vec, void *data); |
| irqreturn_t idxd_wq_thread(int irq, void *data); |
| diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c |
| index fa04acd5582a..8f3df64aa1be 100644 |
| --- a/drivers/dma/idxd/init.c |
| +++ b/drivers/dma/idxd/init.c |
| @@ -61,7 +61,6 @@ static int idxd_setup_interrupts(struct idxd_device *idxd) |
| struct idxd_irq_entry *irq_entry; |
| int i, msixcnt; |
| int rc = 0; |
| - union msix_perm mperm; |
| |
| msixcnt = pci_msix_vec_count(pdev); |
| if (msixcnt < 0) { |
| @@ -140,14 +139,7 @@ static int idxd_setup_interrupts(struct idxd_device *idxd) |
| } |
| |
| idxd_unmask_error_interrupts(idxd); |
| - |
| - /* Setup MSIX permission table */ |
| - mperm.bits = 0; |
| - mperm.pasid = idxd->pasid; |
| - mperm.pasid_en = device_pasid_enabled(idxd); |
| - for (i = 1; i < msixcnt; i++) |
| - iowrite32(mperm.bits, idxd->reg_base + idxd->msix_perm_offset + i * 8); |
| - |
| + idxd_msix_perm_setup(idxd); |
| return 0; |
| |
| err_no_irq: |
| @@ -504,6 +496,7 @@ static void idxd_shutdown(struct pci_dev *pdev) |
| idxd_flush_work_list(irq_entry); |
| } |
| |
| + idxd_msix_perm_clear(idxd); |
| destroy_workqueue(idxd->wq); |
| } |
| |
| -- |
| 2.30.2 |
| |