soc/intel/skylake: Generate ACPI RMRR table
An ACPI RMRR table is requried for IOMMU to work properly with an iGPU (without using passthrough mode), so create one along with the DRHD DMAR table if the iGPU is present and enabled. Test: build/boot google/chell and purism/librem13v2 with kernel parameter 'intel_iommu=on' but without 'iommu=pt;' observe integrated graphics functional without corruption. Change-Id: I202fb3eb8618f99d41f3d1c5bbb83b2ec982aca4 Signed-off-by: Matt DeVillier <matt.devillier@gmail.com> Reviewed-on: https://review.coreboot.org/27270 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Youness Alaoui <snifikino@gmail.com>
This commit is contained in:
parent
7866d497ad
commit
cbe73ea28b
|
@ -77,6 +77,8 @@ void enable_power_aware_intr(void);
|
||||||
uintptr_t sa_get_tolud_base(void);
|
uintptr_t sa_get_tolud_base(void);
|
||||||
/* API to get DSM size */
|
/* API to get DSM size */
|
||||||
size_t sa_get_dsm_size(void);
|
size_t sa_get_dsm_size(void);
|
||||||
|
/* API to get GSM base address */
|
||||||
|
uintptr_t sa_get_gsm_base(void);
|
||||||
/* API to get GSM size */
|
/* API to get GSM size */
|
||||||
size_t sa_get_gsm_size(void);
|
size_t sa_get_gsm_size(void);
|
||||||
/* API to get TSEG base address */
|
/* API to get TSEG base address */
|
||||||
|
|
|
@ -174,7 +174,7 @@ size_t sa_get_dsm_size(void)
|
||||||
return (prealloc_memory - 0xEF) * 4*MiB;
|
return (prealloc_memory - 0xEF) * 4*MiB;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uintptr_t sa_get_gsm_base(void)
|
uintptr_t sa_get_gsm_base(void)
|
||||||
{
|
{
|
||||||
/* All regions concerned for have 1 MiB alignment. */
|
/* All regions concerned for have 1 MiB alignment. */
|
||||||
return ALIGN_DOWN(pci_read_config32(SA_DEV_ROOT, BGSM), 1*MiB);
|
return ALIGN_DOWN(pci_read_config32(SA_DEV_ROOT, BGSM), 1*MiB);
|
||||||
|
|
|
@ -554,12 +554,20 @@ static unsigned long acpi_fill_dmar(unsigned long current)
|
||||||
/* iGFX has to be enabled, GFXVTBAR set and in 32-bit space. */
|
/* iGFX has to be enabled, GFXVTBAR set and in 32-bit space. */
|
||||||
if (igfx_dev && igfx_dev->enabled && gfxvten &&
|
if (igfx_dev && igfx_dev->enabled && gfxvten &&
|
||||||
gfx_vtbar && !MCHBAR32(GFXVTBAR + 4)) {
|
gfx_vtbar && !MCHBAR32(GFXVTBAR + 4)) {
|
||||||
const unsigned long tmp = current;
|
unsigned long tmp = current;
|
||||||
|
|
||||||
current += acpi_create_dmar_drhd(current, 0, 0, gfx_vtbar);
|
current += acpi_create_dmar_drhd(current, 0, 0, gfx_vtbar);
|
||||||
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
||||||
|
|
||||||
acpi_dmar_drhd_fixup(tmp, current);
|
acpi_dmar_drhd_fixup(tmp, current);
|
||||||
|
|
||||||
|
/* Add RMRR entry */
|
||||||
|
tmp = current;
|
||||||
|
|
||||||
|
current += acpi_create_dmar_rmrr(current, 0,
|
||||||
|
sa_get_gsm_base(), sa_get_tolud_base() - 1);
|
||||||
|
current += acpi_create_dmar_ds_pci(current, 0, 2, 0);
|
||||||
|
acpi_dmar_rmrr_fixup(tmp, current);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct device *const p2sb_dev = dev_find_slot(0, PCH_DEVFN_P2SB);
|
struct device *const p2sb_dev = dev_find_slot(0, PCH_DEVFN_P2SB);
|
||||||
|
|
Loading…
Reference in New Issue