svn commit: r330439 - in head/sys: amd64/vmm/amd contrib/dev/acpica/include
Anish Gupta
anish at FreeBSD.org
Mon Mar 5 02:28:26 UTC 2018
Author: anish
Date: Mon Mar 5 02:28:25 2018
New Revision: 330439
URL: https://svnweb.freebsd.org/changeset/base/330439
Log:
Move the new AMD-Vi IVHD [ACPI_IVRS_HARDWARE_NEW]definitions added in r329360 in contrib ACPI to local files till ACPI code adds new definitions reported by jkim.
Rename ACPI_IVRS_HARDWARE_NEW to ACPI_IVRS_HARDWARE_EFRSUP, since new definitions add Extended Feature Register support. Use IvrsType to distinguish three types of IVHD - 0x10(legacy), 0x11 and 0x40(with EFR). IVHD 0x40 is also called mixed type since it supports HID device entries.
Fix 2 coverity bugs reported by cem.
Reported by:jkim, cem
Approved by:grehan
Differential Revision://reviews.freebsd.org/D14501
Modified:
head/sys/amd64/vmm/amd/amdvi_priv.h
head/sys/amd64/vmm/amd/ivrs_drv.c
head/sys/contrib/dev/acpica/include/actbl2.h
Modified: head/sys/amd64/vmm/amd/amdvi_priv.h
==============================================================================
--- head/sys/amd64/vmm/amd/amdvi_priv.h Mon Mar 5 02:13:28 2018 (r330438)
+++ head/sys/amd64/vmm/amd/amdvi_priv.h Mon Mar 5 02:28:25 2018 (r330439)
@@ -355,12 +355,43 @@ struct amdvi_domain {
};
/*
+ * I/O Virtualization Hardware Definition Block (IVHD) type 0x10 (legacy)
+ * uses ACPI_IVRS_HARDWARE define in contrib/dev/acpica/include/actbl2.h
+ * New IVHD types 0x11 and 0x40 as defined in AMD IOMMU spec[48882] are missing in
+ * ACPI code. These new types add extra field EFR(Extended Feature Register).
+ * XXX : Use definition from ACPI when it is available.
+ */
+typedef struct acpi_ivrs_hardware_efr_sup
+{
+ 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 Attr; /* IOMMU Feature */
+ UINT64 ExtFR; /* IOMMU Extended Feature */
+ UINT64 Reserved; /* v1 feature or v2 attribute */
+} __attribute__ ((__packed__)) ACPI_IVRS_HARDWARE_EFRSUP;
+CTASSERT(sizeof(ACPI_IVRS_HARDWARE_EFRSUP) == 40);
+
+/*
+ * Different type of IVHD.
+ * XXX: Use AcpiIvrsType once new IVHD types are available.
+*/
+enum IvrsType
+{
+ IVRS_TYPE_HARDWARE_LEGACY = 0x10, /* Legacy without EFRi support. */
+ IVRS_TYPE_HARDWARE_EFR = 0x11, /* With EFR support. */
+ IVRS_TYPE_HARDWARE_MIXED = 0x40, /* Mixed with EFR support. */
+};
+
+/*
* AMD IOMMU softc.
*/
struct amdvi_softc {
struct amdvi_ctrl *ctrl; /* Control area. */
device_t dev; /* IOMMU device. */
- enum AcpiIvrsType ivhd_type; /* IOMMU IVHD type 0x10/0x11 or 0x40 */
+ enum IvrsType ivhd_type; /* IOMMU IVHD type. */
bool iotlb; /* IOTLB supported by IOMMU */
struct amdvi_cmd *cmd; /* Command descriptor area. */
int cmd_max; /* Max number of commands. */
Modified: head/sys/amd64/vmm/amd/ivrs_drv.c
==============================================================================
--- head/sys/amd64/vmm/amd/ivrs_drv.c Mon Mar 5 02:13:28 2018 (r330438)
+++ head/sys/amd64/vmm/amd/ivrs_drv.c Mon Mar 5 02:28:25 2018 (r330439)
@@ -86,9 +86,9 @@ ivrs_hdr_iterate_tbl(ivhd_iter_t iter, void *arg)
}
switch (ivrs_hdr->Type) {
- case ACPI_IVRS_TYPE_HARDWARE: /* Legacy */
- case 0x11:
- case 0x40: /* ACPI HID */
+ case IVRS_TYPE_HARDWARE_LEGACY: /* Legacy */
+ case IVRS_TYPE_HARDWARE_EFR:
+ case IVRS_TYPE_HARDWARE_MIXED:
if (!iter(ivrs_hdr, arg))
return;
break;
@@ -116,9 +116,9 @@ ivrs_is_ivhd(UINT8 type)
{
switch(type) {
- case ACPI_IVRS_TYPE_HARDWARE:
- case ACPI_IVRS_TYPE_HARDWARE_EXT1:
- case ACPI_IVRS_TYPE_HARDWARE_EXT2:
+ case IVRS_TYPE_HARDWARE_LEGACY:
+ case IVRS_TYPE_HARDWARE_EFR:
+ case IVRS_TYPE_HARDWARE_MIXED:
return (true);
default:
@@ -206,17 +206,13 @@ ivhd_dev_parse(ACPI_IVRS_HARDWARE* ivhd, struct amdvi_
softc->end_dev_rid = 0;
switch (ivhd->Header.Type) {
- case ACPI_IVRS_TYPE_HARDWARE_EXT1:
- case ACPI_IVRS_TYPE_HARDWARE_EXT2:
- p = (uint8_t *)ivhd + sizeof(ACPI_IVRS_HARDWARE_NEW);
- de = (ACPI_IVRS_DE_HEADER *) ((uint8_t *)ivhd +
- sizeof(ACPI_IVRS_HARDWARE_NEW));
+ case IVRS_TYPE_HARDWARE_LEGACY:
+ p = (uint8_t *)ivhd + sizeof(ACPI_IVRS_HARDWARE);
break;
- case ACPI_IVRS_TYPE_HARDWARE:
- p = (uint8_t *)ivhd + sizeof(ACPI_IVRS_HARDWARE);
- de = (ACPI_IVRS_DE_HEADER *) ((uint8_t *)ivhd +
- sizeof(ACPI_IVRS_HARDWARE));
+ case IVRS_TYPE_HARDWARE_EFR:
+ case IVRS_TYPE_HARDWARE_MIXED:
+ p = (uint8_t *)ivhd + sizeof(ACPI_IVRS_HARDWARE_EFRSUP);
break;
default:
@@ -316,9 +312,9 @@ ivhd_is_newer(ACPI_IVRS_HEADER *old, ACPI_IVRS_HEADER
* Newer IVRS header type take precedence.
*/
if ((old->DeviceId == new->DeviceId) &&
- (old->Type == ACPI_IVRS_TYPE_HARDWARE) &&
- ((new->Type == ACPI_IVRS_TYPE_HARDWARE_EXT1) ||
- (new->Type == ACPI_IVRS_TYPE_HARDWARE_EXT1))) {
+ (old->Type == IVRS_TYPE_HARDWARE_LEGACY) &&
+ ((new->Type == IVRS_TYPE_HARDWARE_EFR) ||
+ (new->Type == IVRS_TYPE_HARDWARE_MIXED))) {
return (true);
}
@@ -422,23 +418,33 @@ ivhd_probe(device_t dev)
ivhd = ivhd_hdrs[unit];
KASSERT(ivhd, ("ivhd is NULL"));
- if (ivhd->Header.Type == ACPI_IVRS_TYPE_HARDWARE)
- device_set_desc(dev, "AMD-Vi/IOMMU ivhd");
- else
+ switch (ivhd->Header.Type) {
+ case IVRS_TYPE_HARDWARE_EFR:
device_set_desc(dev, "AMD-Vi/IOMMU ivhd with EFR");
+ break;
+
+ case IVRS_TYPE_HARDWARE_MIXED:
+ device_set_desc(dev, "AMD-Vi/IOMMU ivhd in mixed format");
+ break;
+ case IVRS_TYPE_HARDWARE_LEGACY:
+ default:
+ device_set_desc(dev, "AMD-Vi/IOMMU ivhd");
+ break;
+ }
+
return (BUS_PROBE_NOWILDCARD);
}
static void
-ivhd_print_flag(device_t dev, enum AcpiIvrsType ivhd_type, uint8_t flag)
+ivhd_print_flag(device_t dev, enum IvrsType ivhd_type, uint8_t flag)
{
/*
* IVHD lgeacy type has two extra high bits in flag which has
* been moved to EFR for non-legacy device.
*/
switch (ivhd_type) {
- case ACPI_IVRS_TYPE_HARDWARE:
+ case IVRS_TYPE_HARDWARE_LEGACY:
device_printf(dev, "Flag:%b\n", flag,
"\020"
"\001HtTunEn"
@@ -451,8 +457,8 @@ ivhd_print_flag(device_t dev, enum AcpiIvrsType ivhd_t
"\008PPRSup");
break;
- case ACPI_IVRS_TYPE_HARDWARE_EXT1:
- case ACPI_IVRS_TYPE_HARDWARE_EXT2:
+ case IVRS_TYPE_HARDWARE_EFR:
+ case IVRS_TYPE_HARDWARE_MIXED:
device_printf(dev, "Flag:%b\n", flag,
"\020"
"\001HtTunEn"
@@ -474,10 +480,10 @@ ivhd_print_flag(device_t dev, enum AcpiIvrsType ivhd_t
* Feature in legacy IVHD type(0x10) and attribute in newer type(0x11 and 0x40).
*/
static void
-ivhd_print_feature(device_t dev, enum AcpiIvrsType ivhd_type, uint32_t feature)
+ivhd_print_feature(device_t dev, enum IvrsType ivhd_type, uint32_t feature)
{
switch (ivhd_type) {
- case ACPI_IVRS_TYPE_HARDWARE:
+ case IVRS_TYPE_HARDWARE_LEGACY:
device_printf(dev, "Features(type:0x%x) HATS = %d GATS = %d"
" MsiNumPPR = %d PNBanks= %d PNCounters= %d\n",
ivhd_type,
@@ -500,8 +506,8 @@ ivhd_print_feature(device_t dev, enum AcpiIvrsType ivh
break;
/* Fewer features or attributes are reported in non-legacy type. */
- case ACPI_IVRS_TYPE_HARDWARE_EXT1:
- case ACPI_IVRS_TYPE_HARDWARE_EXT2:
+ case IVRS_TYPE_HARDWARE_EFR:
+ case IVRS_TYPE_HARDWARE_MIXED:
device_printf(dev, "Features(type:0x%x) MsiNumPPR = %d"
" PNBanks= %d PNCounters= %d\n",
ivhd_type,
@@ -605,7 +611,7 @@ static int
ivhd_attach(device_t dev)
{
ACPI_IVRS_HARDWARE *ivhd;
- ACPI_IVRS_HARDWARE_NEW *ivhd1;
+ ACPI_IVRS_HARDWARE_EFRSUP *ivhd_efr;
struct amdvi_softc *softc;
int status, unit;
@@ -640,10 +646,10 @@ ivhd_attach(device_t dev)
softc->event_msix = ivhd->Info & 0x1F;
#endif
switch (ivhd->Header.Type) {
- case ACPI_IVRS_TYPE_HARDWARE_EXT1:
- case ACPI_IVRS_TYPE_HARDWARE_EXT2:
- ivhd1 = (ACPI_IVRS_HARDWARE_NEW *)ivhd;
- softc->ext_feature = ivhd1->ExtFR;
+ case IVRS_TYPE_HARDWARE_EFR:
+ case IVRS_TYPE_HARDWARE_MIXED:
+ ivhd_efr = (ACPI_IVRS_HARDWARE_EFRSUP *)ivhd;
+ softc->ext_feature = ivhd_efr->ExtFR;
break;
}
Modified: head/sys/contrib/dev/acpica/include/actbl2.h
==============================================================================
--- head/sys/contrib/dev/acpica/include/actbl2.h Mon Mar 5 02:13:28 2018 (r330438)
+++ head/sys/contrib/dev/acpica/include/actbl2.h Mon Mar 5 02:28:25 2018 (r330439)
@@ -444,8 +444,6 @@ typedef struct acpi_ivrs_header
enum AcpiIvrsType
{
ACPI_IVRS_TYPE_HARDWARE = 0x10,
- ACPI_IVRS_TYPE_HARDWARE_EXT1 = 0x11,
- ACPI_IVRS_TYPE_HARDWARE_EXT2 = 0x40,
ACPI_IVRS_TYPE_MEMORY1 = 0x20,
ACPI_IVRS_TYPE_MEMORY2 = 0x21,
ACPI_IVRS_TYPE_MEMORY3 = 0x22
@@ -483,21 +481,6 @@ typedef struct acpi_ivrs_hardware
UINT32 Reserved;
} ACPI_IVRS_HARDWARE;
-
-/* 0x11 and 0x40: I/O Virtualization Hardware Definition Block (IVHD) */
-
-typedef struct acpi_ivrs_hardware_new
-{
- 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 Attr; /* IOMMU Feature */
- UINT64 ExtFR; /* IOMMU Extended Feature */
- UINT64 Reserved; /* v1 feature or v2 attribute */
-
-} ACPI_IVRS_HARDWARE_NEW;
/* Masks for Info field above */
More information about the svn-src-all
mailing list