diff options
author | Gary R Hook <gary.hook@amd.com> | 2018-05-01 15:52:52 -0400 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2018-05-03 10:33:17 -0400 |
commit | d64c0486ed50900a3b3b1e22192dc07ad3ad5a8a (patch) | |
tree | 107c629ed93adc4554dfb2dfe4cb480f81e5f7ce | |
parent | 6da6c0db5316275015e8cc2959f12a17584aeb64 (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.c | 31 |
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, | |||
545 | static void iommu_print_event(struct amd_iommu *iommu, void *__evt) | 545 | static 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) | |||
553 | retry: | 553 | retry: |
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 | ||