aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGary R Hook <gary.hook@amd.com>2018-05-01 15:52:52 -0400
committerJoerg Roedel <jroedel@suse.de>2018-05-03 10:33:17 -0400
commitd64c0486ed50900a3b3b1e22192dc07ad3ad5a8a (patch)
tree107c629ed93adc4554dfb2dfe4cb480f81e5f7ce
parent6da6c0db5316275015e8cc2959f12a17584aeb64 (diff)
iommu/amd: Update the PASID information printed to the system log
Provide detailed data for each event, as appropriate. Signed-off-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
-rw-r--r--drivers/iommu/amd_iommu.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 2a99f0f14795..aecc49aa6fdb 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -545,7 +545,7 @@ static void amd_iommu_report_page_fault(u16 devid, u16 domain_id,
545static void iommu_print_event(struct amd_iommu *iommu, void *__evt) 545static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
546{ 546{
547 struct device *dev = iommu->iommu.dev; 547 struct device *dev = iommu->iommu.dev;
548 int type, devid, domid, flags; 548 int type, devid, pasid, flags;
549 volatile u32 *event = __evt; 549 volatile u32 *event = __evt;
550 int count = 0; 550 int count = 0;
551 u64 address; 551 u64 address;
@@ -553,7 +553,7 @@ static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
553retry: 553retry:
554 type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK; 554 type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK;
555 devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK; 555 devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK;
556 domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK; 556 pasid = PPR_PASID(*(u64 *)&event[0]);
557 flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK; 557 flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK;
558 address = (u64)(((u64)event[3]) << 32) | event[2]; 558 address = (u64)(((u64)event[3]) << 32) | event[2];
559 559
@@ -568,7 +568,7 @@ retry:
568 } 568 }
569 569
570 if (type == EVENT_TYPE_IO_FAULT) { 570 if (type == EVENT_TYPE_IO_FAULT) {
571 amd_iommu_report_page_fault(devid, domid, address, flags); 571 amd_iommu_report_page_fault(devid, pasid, address, flags);
572 return; 572 return;
573 } else { 573 } else {
574 dev_err(dev, "AMD-Vi: Event logged ["); 574 dev_err(dev, "AMD-Vi: Event logged [");
@@ -576,10 +576,9 @@ retry:
576 576
577 switch (type) { 577 switch (type) {
578 case EVENT_TYPE_ILL_DEV: 578 case EVENT_TYPE_ILL_DEV:
579 dev_err(dev, "ILLEGAL_DEV_TABLE_ENTRY device=%02x:%02x.%x " 579 dev_err(dev, "ILLEGAL_DEV_TABLE_ENTRY device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
580 "address=0x%016llx flags=0x%04x]\n",
581 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid), 580 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
582 address, flags); 581 pasid, address, flags);
583 dump_dte_entry(devid); 582 dump_dte_entry(devid);
584 break; 583 break;
585 case EVENT_TYPE_DEV_TAB_ERR: 584 case EVENT_TYPE_DEV_TAB_ERR:
@@ -589,34 +588,30 @@ retry:
589 address, flags); 588 address, flags);
590 break; 589 break;
591 case EVENT_TYPE_PAGE_TAB_ERR: 590 case EVENT_TYPE_PAGE_TAB_ERR:
592 dev_err(dev, "PAGE_TAB_HARDWARE_ERROR device=%02x:%02x.%x " 591 dev_err(dev, "PAGE_TAB_HARDWARE_ERROR device=%02x:%02x.%x domain=0x%04x address=0x%016llx flags=0x%04x]\n",
593 "domain=0x%04x address=0x%016llx flags=0x%04x]\n",
594 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid), 592 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
595 domid, address, flags); 593 pasid, address, flags);
596 break; 594 break;
597 case EVENT_TYPE_ILL_CMD: 595 case EVENT_TYPE_ILL_CMD:
598 dev_err(dev, "ILLEGAL_COMMAND_ERROR address=0x%016llx]\n", address); 596 dev_err(dev, "ILLEGAL_COMMAND_ERROR address=0x%016llx]\n", address);
599 dump_command(address); 597 dump_command(address);
600 break; 598 break;
601 case EVENT_TYPE_CMD_HARD_ERR: 599 case EVENT_TYPE_CMD_HARD_ERR:
602 dev_err(dev, "COMMAND_HARDWARE_ERROR address=0x%016llx " 600 dev_err(dev, "COMMAND_HARDWARE_ERROR address=0x%016llx flags=0x%04x]\n",
603 "flags=0x%04x]\n", address, flags); 601 address, flags);
604 break; 602 break;
605 case EVENT_TYPE_IOTLB_INV_TO: 603 case EVENT_TYPE_IOTLB_INV_TO:
606 dev_err(dev, "IOTLB_INV_TIMEOUT device=%02x:%02x.%x " 604 dev_err(dev, "IOTLB_INV_TIMEOUT device=%02x:%02x.%x address=0x%016llx]\n",
607 "address=0x%016llx]\n",
608 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid), 605 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
609 address); 606 address);
610 break; 607 break;
611 case EVENT_TYPE_INV_DEV_REQ: 608 case EVENT_TYPE_INV_DEV_REQ:
612 dev_err(dev, "INVALID_DEVICE_REQUEST device=%02x:%02x.%x " 609 dev_err(dev, "INVALID_DEVICE_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
613 "address=0x%016llx flags=0x%04x]\n",
614 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid), 610 PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
615 address, flags); 611 pasid, address, flags);
616 break; 612 break;
617 default: 613 default:
618 dev_err(dev, KERN_ERR "UNKNOWN event[0]=0x%08x event[1]=0x%08x " 614 dev_err(dev, "UNKNOWN event[0]=0x%08x event[1]=0x%08x event[2]=0x%08x event[3]=0x%08x\n",
619 "event[2]=0x%08x event[3]=0x%08x\n",
620 event[0], event[1], event[2], event[3]); 615 event[0], event[1], event[2], event[3]);
621 } 616 }
622 617