Skip to content

Commit

Permalink
Implement IVRS IVHD type 11h parsing
Browse files Browse the repository at this point in the history
The AMD IVRS table parsing supported only IVHD type 10h structures.
Parsing an IVHD type 11h caused the iasl to report unknown subtable type.
Add necessary structure definition for IVHD type 11h and apply correct
parsing method based on subtable type.

Signed-off-by: Michał Żygowski <michal.zygowski@3mdeb.com>
  • Loading branch information
miczyg1 committed Feb 19, 2020
1 parent f3504c5 commit 6ddc194
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 12 deletions.
3 changes: 2 additions & 1 deletion source/common/dmtable.c
Original file line number Diff line number Diff line change
Expand Up @@ -1676,7 +1676,8 @@ AcpiDmDumpTable (
Temp8 = *Target;
switch (Temp8)
{
case ACPI_IVRS_TYPE_HARDWARE:
case ACPI_IVRS_TYPE_HARDWARE1:
case ACPI_IVRS_TYPE_HARDWARE2:

Name = AcpiDmIvrsSubnames[0];
break;
Expand Down
25 changes: 20 additions & 5 deletions source/common/dmtbdump2.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,11 +475,16 @@ AcpiDmDumpIvrs (

switch (Subtable->Type)
{
case ACPI_IVRS_TYPE_HARDWARE:
case ACPI_IVRS_TYPE_HARDWARE1:

InfoTable = AcpiDmTableInfoIvrs0;
break;

case ACPI_IVRS_TYPE_HARDWARE2:

InfoTable = AcpiDmTableInfoIvrs01;
break;

case ACPI_IVRS_TYPE_MEMORY1:
case ACPI_IVRS_TYPE_MEMORY2:
case ACPI_IVRS_TYPE_MEMORY3:
Expand Down Expand Up @@ -514,11 +519,21 @@ AcpiDmDumpIvrs (

/* The hardware subtable can contain multiple device entries */

if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE)
if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2)
{
EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE);
DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
sizeof (ACPI_IVRS_HARDWARE));
if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE1)
{
EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE1);
DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
sizeof (ACPI_IVRS_HARDWARE1));
}
else if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE2)
{
EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE2);
DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
sizeof (ACPI_IVRS_HARDWARE2));
}

while (EntryOffset < (Offset + Subtable->Length))
{
Expand Down
14 changes: 14 additions & 0 deletions source/common/dmtbinfo2.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,20 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[] =
ACPI_DMT_TERMINATOR
};

/* 0x10: I/O Virtualization Hardware Definition (IVHD) Block */

ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs01[] =
{
{ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (CapabilityOffset), "Capability Offset", 0},
{ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (BaseAddress), "Base Address", 0},
{ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (PciSegmentGroup), "PCI Segment Group", 0},
{ACPI_DMT_UINT16, ACPI_IVRS01_OFFSET (Info), "Virtualization Info", 0},
{ACPI_DMT_UINT32, ACPI_IVRS01_OFFSET (Attributes), "Attributes", 0},
{ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (EfrRegisterImage), "EFR Image", 0},
{ACPI_DMT_UINT64, ACPI_IVRS01_OFFSET (Reserved), "Reserved", 0},
ACPI_DMT_TERMINATOR
};

/* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition (IVMD) Block */

ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs1[] =
Expand Down
10 changes: 8 additions & 2 deletions source/compiler/dttable1.c
Original file line number Diff line number Diff line change
Expand Up @@ -1967,11 +1967,16 @@ DtCompileIvrs (

switch (IvrsHeader->Type)
{
case ACPI_IVRS_TYPE_HARDWARE:
case ACPI_IVRS_TYPE_HARDWARE1:

InfoTable = AcpiDmTableInfoIvrs0;
break;

case ACPI_IVRS_TYPE_HARDWARE2:

InfoTable = AcpiDmTableInfoIvrs01;
break;

case ACPI_IVRS_TYPE_MEMORY1:
case ACPI_IVRS_TYPE_MEMORY2:
case ACPI_IVRS_TYPE_MEMORY3:
Expand All @@ -1994,7 +1999,8 @@ DtCompileIvrs (
ParentTable = DtPeekSubtable ();
DtInsertSubtable (ParentTable, Subtable);

if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE1 ||
IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE2)
{
while (*PFieldList &&
!strcmp ((*PFieldList)->Name, "Entry Type"))
Expand Down
1 change: 1 addition & 0 deletions source/include/acdisasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoIortMap[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIortPad[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs01[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs1[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs4[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoIvrs8a[];
Expand Down
3 changes: 2 additions & 1 deletion source/include/actbinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,8 @@
#define ACPI_IORTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IORT_NODE,f)
#define ACPI_IORTM_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IORT_ID_MAPPING,f)
#define ACPI_IVRSH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HEADER,f)
#define ACPI_IVRS0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE,f)
#define ACPI_IVRS0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE1,f)
#define ACPI_IVRS01_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_HARDWARE2,f)
#define ACPI_IVRS1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_MEMORY,f)
#define ACPI_IVRSD_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_DE_HEADER,f)
#define ACPI_IVRS8A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_IVRS_DEVICE8A,f)
Expand Down
21 changes: 18 additions & 3 deletions source/include/actbl2.h
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,8 @@ typedef struct acpi_ivrs_header

enum AcpiIvrsType
{
ACPI_IVRS_TYPE_HARDWARE = 0x10,
ACPI_IVRS_TYPE_HARDWARE1 = 0x10,
ACPI_IVRS_TYPE_HARDWARE2 = 0x11,
ACPI_IVRS_TYPE_MEMORY1 = 0x20,
ACPI_IVRS_TYPE_MEMORY2 = 0x21,
ACPI_IVRS_TYPE_MEMORY3 = 0x22
Expand Down Expand Up @@ -485,7 +486,7 @@ enum AcpiIvrsType

/* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */

typedef struct acpi_ivrs_hardware
typedef struct acpi_ivrs_hardware_10
{
ACPI_IVRS_HEADER Header;
UINT16 CapabilityOffset; /* Offset for IOMMU control fields */
Expand All @@ -494,7 +495,21 @@ typedef struct acpi_ivrs_hardware
UINT16 Info; /* MSI number and unit ID */
UINT32 Reserved;

} ACPI_IVRS_HARDWARE;
} ACPI_IVRS_HARDWARE1;

/* 0x11: I/O Virtualization Hardware Definition Block (IVHD) */

typedef struct acpi_ivrs_hardware_11
{
ACPI_IVRS_HEADER Header;
UINT16 CapabilityOffset; /* Offset for IOMMU control fields */
UINT64 BaseAddress; /* IOMMU control registers */
UINT16 PciSegmentGroup;
UINT16 Info; /* MSI number and unit ID */
UINT32 Attributes;
UINT64 EfrRegisterImage;
UINT64 Reserved;
} ACPI_IVRS_HARDWARE2;

/* Masks for Info field above */

Expand Down

0 comments on commit 6ddc194

Please sign in to comment.