drv/intel/gma/opregion: Add interface for GNVS ASLB handling
Add and use new interface to set and get GNVS' ASLB register. To be used by Intel's gma driver to set ASLB at ACPI table creation and to get ASLB on S3 resume. Change-Id: If30c6b2270069783b0892774802f47406404da5f Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/20435 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
bdae93571b
commit
19c2ad8758
|
@ -246,5 +246,7 @@ typedef struct {
|
||||||
} __attribute__((packed)) optionrom_vbt_t;
|
} __attribute__((packed)) optionrom_vbt_t;
|
||||||
|
|
||||||
void intel_gma_opregion_register(uintptr_t opregion);
|
void intel_gma_opregion_register(uintptr_t opregion);
|
||||||
|
uintptr_t gma_get_gnvs_aslb(const void *gnvs);
|
||||||
|
void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb);
|
||||||
|
|
||||||
#endif /* _COMMON_GMA_H_ */
|
#endif /* _COMMON_GMA_H_ */
|
||||||
|
|
|
@ -53,6 +53,19 @@ u32 map_oprom_vendev(u32 vendev)
|
||||||
return new_vendev;
|
return new_vendev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uintptr_t gma_get_gnvs_aslb(const void *gnvs)
|
||||||
|
{
|
||||||
|
const global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
return (uintptr_t)(gnvs_ptr ? gnvs_ptr->aslb : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb)
|
||||||
|
{
|
||||||
|
global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
if (gnvs_ptr)
|
||||||
|
gnvs_ptr->aslb = aslb;
|
||||||
|
}
|
||||||
|
|
||||||
static void gma_set_subsystem(device_t dev, unsigned vendor, unsigned device)
|
static void gma_set_subsystem(device_t dev, unsigned vendor, unsigned device)
|
||||||
{
|
{
|
||||||
if (!vendor || !device) {
|
if (!vendor || !device) {
|
||||||
|
@ -121,7 +134,7 @@ gma_write_acpi_tables(struct device *const dev,
|
||||||
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
||||||
if (gnvs) {
|
if (gnvs) {
|
||||||
/* IGD OpRegion Base Address */
|
/* IGD OpRegion Base Address */
|
||||||
gnvs->aslb = (u32)(uintptr_t)opregion;
|
gma_set_gnvs_aslb(gnvs, (uintptr_t)opregion);
|
||||||
} else {
|
} else {
|
||||||
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,6 +215,19 @@ int gtt_poll(u32 reg, u32 mask, u32 value)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uintptr_t gma_get_gnvs_aslb(const void *gnvs)
|
||||||
|
{
|
||||||
|
const global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
return (uintptr_t)(gnvs_ptr ? gnvs_ptr->aslb : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb)
|
||||||
|
{
|
||||||
|
global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
if (gnvs_ptr)
|
||||||
|
gnvs_ptr->aslb = aslb;
|
||||||
|
}
|
||||||
|
|
||||||
static void power_well_enable(void)
|
static void power_well_enable(void)
|
||||||
{
|
{
|
||||||
gtt_write(HSW_PWR_WELL_CTL1, HSW_PWR_WELL_ENABLE);
|
gtt_write(HSW_PWR_WELL_CTL1, HSW_PWR_WELL_ENABLE);
|
||||||
|
@ -527,7 +540,7 @@ gma_write_acpi_tables(struct device *const dev,
|
||||||
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
||||||
if (gnvs) {
|
if (gnvs) {
|
||||||
/* IGD OpRegion Base Address */
|
/* IGD OpRegion Base Address */
|
||||||
gnvs->aslb = (u32)(uintptr_t)opregion;
|
gma_set_gnvs_aslb(gnvs, (uintptr_t)opregion);
|
||||||
} else {
|
} else {
|
||||||
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,6 +304,19 @@ int gtt_poll(u32 reg, u32 mask, u32 value)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uintptr_t gma_get_gnvs_aslb(const void *gnvs)
|
||||||
|
{
|
||||||
|
const global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
return (uintptr_t)(gnvs_ptr ? gnvs_ptr->aslb : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb)
|
||||||
|
{
|
||||||
|
global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
if (gnvs_ptr)
|
||||||
|
gnvs_ptr->aslb = aslb;
|
||||||
|
}
|
||||||
|
|
||||||
static void gma_pm_init_pre_vbios(struct device *dev)
|
static void gma_pm_init_pre_vbios(struct device *dev)
|
||||||
{
|
{
|
||||||
u32 reg32;
|
u32 reg32;
|
||||||
|
@ -1136,7 +1149,7 @@ gma_write_acpi_tables(struct device *const dev,
|
||||||
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
||||||
if (gnvs) {
|
if (gnvs) {
|
||||||
/* IGD OpRegion Base Address */
|
/* IGD OpRegion Base Address */
|
||||||
gnvs->aslb = (u32)(uintptr_t)opregion;
|
gma_set_gnvs_aslb(gnvs, (uintptr_t)opregion);
|
||||||
} else {
|
} else {
|
||||||
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -311,6 +311,19 @@ int gtt_poll(u32 reg, u32 mask, u32 value)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uintptr_t gma_get_gnvs_aslb(const void *gnvs)
|
||||||
|
{
|
||||||
|
const global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
return (uintptr_t)(gnvs_ptr ? gnvs_ptr->aslb : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb)
|
||||||
|
{
|
||||||
|
global_nvs_t *gnvs_ptr = gnvs;
|
||||||
|
if (gnvs_ptr)
|
||||||
|
gnvs_ptr->aslb = aslb;
|
||||||
|
}
|
||||||
|
|
||||||
static void gma_pm_init_pre_vbios(struct device *dev)
|
static void gma_pm_init_pre_vbios(struct device *dev)
|
||||||
{
|
{
|
||||||
u32 reg32;
|
u32 reg32;
|
||||||
|
@ -689,7 +702,7 @@ gma_write_acpi_tables(struct device *const dev,
|
||||||
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
gnvs = cbmem_find(CBMEM_ID_ACPI_GNVS);
|
||||||
if (gnvs) {
|
if (gnvs) {
|
||||||
/* IGD OpRegion Base Address */
|
/* IGD OpRegion Base Address */
|
||||||
gnvs->aslb = (u32)(uintptr_t)opregion;
|
gma_set_gnvs_aslb(gnvs, (uintptr_t)opregion);
|
||||||
} else {
|
} else {
|
||||||
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
printk(BIOS_ERR, "Error: GNVS table not found.\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue