ACPI: Fix the devices scope in the SATC structure

This change adds the ATC_REQUIRED flag for the address translation cache
indicator and fixes the devices scope entry in the SATC reporting
structure. The SoC integrated devices in the specified PCI segment
with address translation caches are a type of PCI Endpoint Device.

BUG=None
TEST=Built image successfully.

Signed-off-by: John Zhao <john.zhao@intel.com>
Change-Id: I57b3551f11502da48f3951da59d9426df5a40723
Reviewed-on: https://review.coreboot.org/c/coreboot/+/52479
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Lance Zhao
Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
John Zhao 2021-04-17 16:03:21 -07:00 committed by Nico Huber
parent f095d15d0e
commit 091532d8ee
2 changed files with 7 additions and 6 deletions

View File

@ -638,17 +638,15 @@ unsigned long acpi_create_dmar_andd(unsigned long current, u8 device_number,
return andd->length;
}
unsigned long acpi_create_dmar_satc(unsigned long current, u8 flags,
u16 segment, const char *device_scope)
unsigned long acpi_create_dmar_satc(unsigned long current, u8 flags, u16 segment)
{
dmar_satc_entry_t *satc = (dmar_satc_entry_t *)current;
int satc_len = sizeof(dmar_satc_entry_t) + strlen(device_scope) + 1;
int satc_len = sizeof(dmar_satc_entry_t);
memset(satc, 0, satc_len);
satc->type = DMAR_SATC;
satc->length = satc_len;
satc->flags = flags;
satc->segment_number = segment;
memcpy(&satc->device_scope, device_scope, strlen(device_scope));
return satc->length;
}

View File

@ -418,6 +418,10 @@ enum {
DRHD_INCLUDE_PCI_ALL = 1
};
enum {
ATC_REQUIRED = 1
};
enum dmar_flags {
DMAR_INTR_REMAP = 1 << 0,
DMAR_X2APIC_OPT_OUT = 1 << 1,
@ -472,7 +476,6 @@ typedef struct dmar_satc_entry {
u8 flags;
u8 reserved;
u16 segment_number;
u8 device_scope[];
} __packed dmar_satc_entry_t;
/* DMAR (DMA Remapping Reporting Structure) */
@ -1085,7 +1088,7 @@ unsigned long acpi_create_dmar_rhsa(unsigned long current, u64 base_addr,
unsigned long acpi_create_dmar_andd(unsigned long current, u8 device_number,
const char *device_name);
unsigned long acpi_create_dmar_satc(unsigned long current, u8 flags,
u16 segment, const char *device_scope);
u16 segment);
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);