nb/intel/sandybridge/acpi.c: Add RMRRs after all DRHDs
The VT-d architecture specification (Doc. D51397-011, Rev. 3.1) says: BIOS implementations must report these remapping structure types in numerical order. i.e., All remapping structures of type 0 (DRHD) enumerated before remapping structures of type 1 (RMRR), and so forth. So, update the corresponding code to adhere to the specification. Change-Id: I1f84cae41c6281e0d545669f1e7de5cab0d9f9c0 Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/44109 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Rudolph <siro@das-labor.org>
This commit is contained in:
@ -73,16 +73,35 @@ static unsigned long acpi_fill_dmar(unsigned long current)
|
|||||||
{
|
{
|
||||||
const struct device *const igfx = pcidev_on_root(2, 0);
|
const struct device *const igfx = pcidev_on_root(2, 0);
|
||||||
|
|
||||||
|
/* First, add DRHD entries */
|
||||||
if (igfx && igfx->enabled) {
|
if (igfx && igfx->enabled) {
|
||||||
unsigned long tmp;
|
const unsigned long tmp = current;
|
||||||
|
|
||||||
tmp = current;
|
|
||||||
current += acpi_create_dmar_drhd(current, 0, 0, GFXVT_BASE);
|
current += acpi_create_dmar_drhd(current, 0, 0, GFXVT_BASE);
|
||||||
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
||||||
current += acpi_create_dmar_ds_pci(current, 0, 2, 1);
|
current += acpi_create_dmar_ds_pci(current, 0, 2, 1);
|
||||||
acpi_dmar_drhd_fixup(tmp, current);
|
acpi_dmar_drhd_fixup(tmp, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const unsigned long tmp = current;
|
||||||
|
current += acpi_create_dmar_drhd(current, DRHD_INCLUDE_PCI_ALL, 0, VTVC0_BASE);
|
||||||
|
|
||||||
|
current += acpi_create_dmar_ds_ioapic(current, 2, PCH_IOAPIC_PCI_BUS,
|
||||||
|
PCH_IOAPIC_PCI_SLOT, 0);
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < 8; ++i)
|
||||||
|
current += acpi_create_dmar_ds_msi_hpet(current, 0, PCH_HPET_PCI_BUS,
|
||||||
|
PCH_HPET_PCI_SLOT, i);
|
||||||
|
|
||||||
|
acpi_dmar_drhd_fixup(tmp, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then, add RMRR entries after all DRHD entries */
|
||||||
|
if (igfx && igfx->enabled) {
|
||||||
|
const unsigned long tmp = current;
|
||||||
|
|
||||||
tmp = current;
|
|
||||||
current += acpi_create_igfx_rmrr(current);
|
current += acpi_create_igfx_rmrr(current);
|
||||||
if (current != tmp) {
|
if (current != tmp) {
|
||||||
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
||||||
@ -91,19 +110,6 @@ static unsigned long acpi_fill_dmar(unsigned long current)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned long tmp = current;
|
|
||||||
current += acpi_create_dmar_drhd(current, DRHD_INCLUDE_PCI_ALL, 0, VTVC0_BASE);
|
|
||||||
|
|
||||||
current += acpi_create_dmar_ds_ioapic(current, 2, PCH_IOAPIC_PCI_BUS,
|
|
||||||
PCH_IOAPIC_PCI_SLOT, 0);
|
|
||||||
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; i < 8; ++i)
|
|
||||||
current += acpi_create_dmar_ds_msi_hpet(current, 0, PCH_HPET_PCI_BUS,
|
|
||||||
PCH_HPET_PCI_SLOT, i);
|
|
||||||
|
|
||||||
acpi_dmar_drhd_fixup(tmp, current);
|
|
||||||
|
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user