soc/intel/cannonlake: Fix DMAR when no iGPU is present

Don't emit RMRR for the iGPU if it's not present. This is done on
other platforms as well.

Fixes an DMAR error seen in dmesg on platforms without iGPU.

Change-Id: Iafe86e6938a120b707aaae935cb8168f790bb22f
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43994
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Patrick Rudolph 2020-07-28 12:05:17 +02:00 committed by Angel Pons
parent 25ec615408
commit a9eec2cc2f
1 changed files with 11 additions and 8 deletions

View File

@ -285,8 +285,8 @@ static unsigned long soc_fill_dmar(unsigned long current)
struct device *const igfx_dev = pcidev_path_on_root(SA_DEVFN_IGD); struct device *const igfx_dev = pcidev_path_on_root(SA_DEVFN_IGD);
uint64_t gfxvtbar = MCHBAR64(GFXVTBAR) & VTBAR_MASK; uint64_t gfxvtbar = MCHBAR64(GFXVTBAR) & VTBAR_MASK;
bool gfxvten = MCHBAR32(GFXVTBAR) & VTBAR_ENABLED; bool gfxvten = MCHBAR32(GFXVTBAR) & VTBAR_ENABLED;
const bool emit_igd = igfx_dev && igfx_dev->enabled && gfxvtbar && gfxvten;
if (igfx_dev && igfx_dev->enabled && gfxvtbar && gfxvten) { if (emit_igd) {
unsigned long tmp = current; unsigned long tmp = current;
current += acpi_create_dmar_drhd(current, 0, 0, gfxvtbar); current += acpi_create_dmar_drhd(current, 0, 0, gfxvtbar);
@ -326,12 +326,15 @@ static unsigned long soc_fill_dmar(unsigned long current)
acpi_dmar_drhd_fixup(tmp, current); acpi_dmar_drhd_fixup(tmp, current);
} }
/* Add RMRR entry */ /* Add RMRR entry after all DRHD entries */
if (emit_igd) {
const unsigned long tmp = current; const unsigned long tmp = current;
current += acpi_create_dmar_rmrr(current, 0, current += acpi_create_dmar_rmrr(current, 0,
sa_get_gsm_base(), sa_get_tolud_base() - 1); sa_get_gsm_base(), sa_get_tolud_base() - 1);
current += acpi_create_dmar_ds_pci(current, 0, 2, 0); current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
acpi_dmar_rmrr_fixup(tmp, current); acpi_dmar_rmrr_fixup(tmp, current);
}
return current; return current;
} }