Skip to content

Commit

Permalink
dmaengine: idxd: clear MSIX permission entry on shutdown
Browse files Browse the repository at this point in the history
[ Upstream commit 6df0e6c ]

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: 8e50d39 ("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>
  • Loading branch information
davejiang authored and gregkh committed Apr 21, 2021
1 parent d3e9ffc commit c84b898
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 9 deletions.
30 changes: 30 additions & 0 deletions drivers/dma/idxd/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions drivers/dma/idxd/idxd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
11 changes: 2 additions & 9 deletions drivers/dma/idxd/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit c84b898

Please sign in to comment.