diff options
| -rw-r--r-- | drivers/iommu/intel-svm.c | 4 | ||||
| -rw-r--r-- | include/linux/intel-iommu.h | 3 |
2 files changed, 7 insertions, 0 deletions
diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c index 97a818992d6d..d9939fa9b588 100644 --- a/drivers/iommu/intel-svm.c +++ b/drivers/iommu/intel-svm.c | |||
| @@ -524,6 +524,10 @@ static irqreturn_t prq_event_thread(int irq, void *d) | |||
| 524 | struct intel_svm *svm = NULL; | 524 | struct intel_svm *svm = NULL; |
| 525 | int head, tail, handled = 0; | 525 | int head, tail, handled = 0; |
| 526 | 526 | ||
| 527 | /* Clear PPR bit before reading head/tail registers, to | ||
| 528 | * ensure that we get a new interrupt if needed. */ | ||
| 529 | writel(DMA_PRS_PPR, iommu->reg + DMAR_PRS_REG); | ||
| 530 | |||
| 527 | tail = dmar_readq(iommu->reg + DMAR_PQT_REG) & PRQ_RING_MASK; | 531 | tail = dmar_readq(iommu->reg + DMAR_PQT_REG) & PRQ_RING_MASK; |
| 528 | head = dmar_readq(iommu->reg + DMAR_PQH_REG) & PRQ_RING_MASK; | 532 | head = dmar_readq(iommu->reg + DMAR_PQH_REG) & PRQ_RING_MASK; |
| 529 | while (head != tail) { | 533 | while (head != tail) { |
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 821273ca4873..2d9b650047a5 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h | |||
| @@ -235,6 +235,9 @@ static inline void dmar_writeq(void __iomem *addr, u64 val) | |||
| 235 | /* low 64 bit */ | 235 | /* low 64 bit */ |
| 236 | #define dma_frcd_page_addr(d) (d & (((u64)-1) << PAGE_SHIFT)) | 236 | #define dma_frcd_page_addr(d) (d & (((u64)-1) << PAGE_SHIFT)) |
| 237 | 237 | ||
| 238 | /* PRS_REG */ | ||
| 239 | #define DMA_PRS_PPR ((u32)1) | ||
| 240 | |||
| 238 | #define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \ | 241 | #define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \ |
| 239 | do { \ | 242 | do { \ |
| 240 | cycles_t start_time = get_cycles(); \ | 243 | cycles_t start_time = get_cycles(); \ |
