ACPI: Add RHSA and ANDD structures for DMAR table
Remapping Hardware Status Affinity (RHSA) structure is applicable for platforms supporting non-uniform memory. An ACPI Name-space Device Declaration (ANDD) structure uniquely represents an ACPI name-space enumerated device capable of issuing DMA requests in the platform. Add RHSA and ANDD structures support for DMAR table generation. BUG=b:130351429 TEST=Image built and booted to kernel Change-Id: I042925a7c03831061870d9bca03f11bf25aeb3e7 Signed-off-by: John Zhao <john.zhao@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/32189 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
parent
44c6cf67c3
commit
76e70675d9
|
@ -569,6 +569,33 @@ unsigned long acpi_create_dmar_atsr(unsigned long current, u8 flags,
|
|||
return atsr->length;
|
||||
}
|
||||
|
||||
unsigned long acpi_create_dmar_rhsa(unsigned long current, u64 base_addr,
|
||||
u32 proximity_domain)
|
||||
{
|
||||
dmar_rhsa_entry_t *rhsa = (dmar_rhsa_entry_t *)current;
|
||||
memset(rhsa, 0, sizeof(*rhsa));
|
||||
rhsa->type = DMAR_RHSA;
|
||||
rhsa->length = sizeof(*rhsa);
|
||||
rhsa->base_address = base_addr;
|
||||
rhsa->proximity_domain = proximity_domain;
|
||||
|
||||
return rhsa->length;
|
||||
}
|
||||
|
||||
unsigned long acpi_create_dmar_andd(unsigned long current, u8 device_number,
|
||||
const char *device_name)
|
||||
{
|
||||
dmar_andd_entry_t *andd = (dmar_andd_entry_t *)current;
|
||||
int andd_len = sizeof(dmar_andd_entry_t) + strlen(device_name) + 1;
|
||||
memset(andd, 0, andd_len);
|
||||
andd->type = DMAR_ANDD;
|
||||
andd->length = andd_len;
|
||||
andd->device_number = device_number;
|
||||
memcpy(&andd->device_name, device_name, strlen(device_name));
|
||||
|
||||
return andd->length;
|
||||
}
|
||||
|
||||
void acpi_dmar_drhd_fixup(unsigned long base, unsigned long current)
|
||||
{
|
||||
dmar_entry_t *drhd = (dmar_entry_t *)base;
|
||||
|
|
|
@ -366,6 +366,22 @@ typedef struct dmar_atsr_entry {
|
|||
u16 segment;
|
||||
} __packed dmar_atsr_entry_t;
|
||||
|
||||
typedef struct dmar_rhsa_entry {
|
||||
u16 type;
|
||||
u16 length;
|
||||
u32 reserved;
|
||||
u64 base_address;
|
||||
u32 proximity_domain;
|
||||
} __packed dmar_rhsa_entry_t;
|
||||
|
||||
typedef struct dmar_andd_entry {
|
||||
u16 type;
|
||||
u16 length;
|
||||
u8 reserved[3];
|
||||
u8 device_number;
|
||||
u8 device_name[];
|
||||
} __packed dmar_andd_entry_t;
|
||||
|
||||
/* DMAR (DMA Remapping Reporting Structure) */
|
||||
typedef struct acpi_dmar {
|
||||
struct acpi_table_header header;
|
||||
|
@ -850,6 +866,10 @@ unsigned long acpi_create_dmar_rmrr(unsigned long current, u16 segment,
|
|||
u64 bar, u64 limit);
|
||||
unsigned long acpi_create_dmar_atsr(unsigned long current, u8 flags,
|
||||
u16 segment);
|
||||
unsigned long acpi_create_dmar_rhsa(unsigned long current, u64 base_addr,
|
||||
u32 proximity_domain);
|
||||
unsigned long acpi_create_dmar_andd(unsigned long current, u8 device_number,
|
||||
const char *device_name);
|
||||
void acpi_dmar_drhd_fixup(unsigned long base, unsigned long current);
|
||||
void acpi_dmar_rmrr_fixup(unsigned long base, unsigned long current);
|
||||
void acpi_dmar_atsr_fixup(unsigned long base, unsigned long current);
|
||||
|
|
Loading…
Reference in New Issue