drivers/intel/gma: Support IGD Opregion 2.1
List of changes: 1. Define new configs for Opregion versions. 2. Assign RVDA to relative address of the Opregion buffer in case of opregion 2.1+. BUG=b:190019970 BRANCH=None Signed-off-by: Meera Ravindranath <meera.ravindranath@intel.com> Change-Id: I95a9f3df185002a4e38faa910f867ace0b97ac2b Reviewed-on: https://review.coreboot.org/c/coreboot/+/52758 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
committed by
Patrick Georgi
parent
8d4e67da20
commit
1b8159b3a1
@@ -102,6 +102,15 @@ config GFX_GMA_PANEL_1_ON_LVDS
|
|||||||
default y if NORTHBRIDGE_INTEL_GM45 || NORTHBRIDGE_INTEL_IRONLAKE
|
default y if NORTHBRIDGE_INTEL_GM45 || NORTHBRIDGE_INTEL_IRONLAKE
|
||||||
default n
|
default n
|
||||||
|
|
||||||
|
config INTEL_GMA_OPREGION_2_0
|
||||||
|
bool
|
||||||
|
default n if INTEL_GMA_OPREGION_2_1
|
||||||
|
default y
|
||||||
|
|
||||||
|
config INTEL_GMA_OPREGION_2_1
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
if GFX_GMA
|
if GFX_GMA
|
||||||
|
|
||||||
config GFX_GMA_DYN_CPU
|
config GFX_GMA_DYN_CPU
|
||||||
|
@@ -258,6 +258,9 @@ static enum cb_err find_vbt_location(struct region_device *rdev)
|
|||||||
/* Function to get the IGD Opregion version */
|
/* Function to get the IGD Opregion version */
|
||||||
static struct opregion_version opregion_get_version(void)
|
static struct opregion_version opregion_get_version(void)
|
||||||
{
|
{
|
||||||
|
if (CONFIG(INTEL_GMA_OPREGION_2_1))
|
||||||
|
return (struct opregion_version) { .major = 2, .minor = 1 };
|
||||||
|
|
||||||
return (struct opregion_version) { .major = 2, .minor = 0 };
|
return (struct opregion_version) { .major = 2, .minor = 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,6 +274,15 @@ static inline bool is_ext_vbt_required(igd_opregion_t *opregion, optionrom_vbt_t
|
|||||||
return (vbt->hdr_vbt_size > sizeof(opregion->vbt.gvd1));
|
return (vbt->hdr_vbt_size > sizeof(opregion->vbt.gvd1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Function to determine if the VBT uses a relative address */
|
||||||
|
static inline bool uses_relative_vbt_addr(opregion_header_t *header)
|
||||||
|
{
|
||||||
|
if (header->opver.major > 2)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return header->opver.major >= 2 && header->opver.minor >= 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy extended VBT at the end of opregion and fill rvda and rvds
|
* Copy extended VBT at the end of opregion and fill rvda and rvds
|
||||||
* values correctly for the opregion.
|
* values correctly for the opregion.
|
||||||
@@ -278,11 +290,19 @@ static inline bool is_ext_vbt_required(igd_opregion_t *opregion, optionrom_vbt_t
|
|||||||
static void opregion_add_ext_vbt(igd_opregion_t *opregion, uint8_t *ext_vbt,
|
static void opregion_add_ext_vbt(igd_opregion_t *opregion, uint8_t *ext_vbt,
|
||||||
optionrom_vbt_t *vbt)
|
optionrom_vbt_t *vbt)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
opregion_header_t *header = &opregion->header;
|
||||||
/* Copy VBT into extended VBT region (at offset 8 KiB) */
|
/* Copy VBT into extended VBT region (at offset 8 KiB) */
|
||||||
memcpy(ext_vbt, vbt, vbt->hdr_vbt_size);
|
memcpy(ext_vbt, vbt, vbt->hdr_vbt_size);
|
||||||
|
|
||||||
/* Fill RVDA value with address of physical pointer */
|
/* Fill RVDA value with relative address of the opregion buffer in case of
|
||||||
opregion->mailbox3.rvda = (uintptr_t)ext_vbt;
|
IGD Opregion version 2.1+ and physical address otherwise */
|
||||||
|
|
||||||
|
if (uses_relative_vbt_addr(header))
|
||||||
|
opregion->mailbox3.rvda = sizeof(*opregion);
|
||||||
|
else
|
||||||
|
opregion->mailbox3.rvda = (uintptr_t)ext_vbt;
|
||||||
|
|
||||||
opregion->mailbox3.rvds = vbt->hdr_vbt_size;
|
opregion->mailbox3.rvds = vbt->hdr_vbt_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,6 +347,10 @@ enum cb_err intel_gma_init_igd_opregion(void)
|
|||||||
sizeof(opregion->header.signature));
|
sizeof(opregion->header.signature));
|
||||||
memcpy(opregion->header.vbios_version, vbt->coreblock_biosbuild,
|
memcpy(opregion->header.vbios_version, vbt->coreblock_biosbuild,
|
||||||
ARRAY_SIZE(vbt->coreblock_biosbuild));
|
ARRAY_SIZE(vbt->coreblock_biosbuild));
|
||||||
|
|
||||||
|
/* Get the opregion version information */
|
||||||
|
opregion->header.opver = opregion_get_version();
|
||||||
|
|
||||||
/* Extended VBT support */
|
/* Extended VBT support */
|
||||||
if (is_ext_vbt_required(opregion, vbt)) {
|
if (is_ext_vbt_required(opregion, vbt)) {
|
||||||
/* Place extended VBT just after opregion */
|
/* Place extended VBT just after opregion */
|
||||||
@@ -339,9 +363,6 @@ enum cb_err intel_gma_init_igd_opregion(void)
|
|||||||
|
|
||||||
rdev_munmap(&rdev, vbt);
|
rdev_munmap(&rdev, vbt);
|
||||||
|
|
||||||
/* Get the opregion version information */
|
|
||||||
opregion->header.opver = opregion_get_version();
|
|
||||||
|
|
||||||
/* 8kb */
|
/* 8kb */
|
||||||
opregion->header.size = sizeof(igd_opregion_t) / 1024;
|
opregion->header.size = sizeof(igd_opregion_t) / 1024;
|
||||||
|
|
||||||
|
@@ -147,7 +147,8 @@ typedef struct {
|
|||||||
u32 fdss; /* Offset 178 FFS Display Size */
|
u32 fdss; /* Offset 178 FFS Display Size */
|
||||||
u32 stat; /* Offset 182 State Indicator */
|
u32 stat; /* Offset 182 State Indicator */
|
||||||
u64 rvda; /* Offset 186 (Igd opregion offset 0x3BAh)
|
u64 rvda; /* Offset 186 (Igd opregion offset 0x3BAh)
|
||||||
* Physical address of Raw VBT data
|
* Physical(2.0) or relative opregion
|
||||||
|
* (2.1+) address of Raw VBT data
|
||||||
*/
|
*/
|
||||||
u32 rvds; /* Offset 194 (Igd opregion offset 0x3C2h)
|
u32 rvds; /* Offset 194 (Igd opregion offset 0x3C2h)
|
||||||
* Size of Raw VBT data
|
* Size of Raw VBT data
|
||||||
|
Reference in New Issue
Block a user