nb/intel/gm45/gma: Centralize call to gm45_get_lvds_edid_str()
There is only a single place where we need the LVDS EDID string. Let's call gm45_get_lvds_edid_str() right there. This simplifies the API and helps to follow the execution flow. The function is moved to avoid a forward declaration. Change-Id: I86f3a88e6b661bcf60319edbe301e70304924727 Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/75378 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
This commit is contained in:
parent
e55825f3c6
commit
eae75064a8
3 changed files with 40 additions and 43 deletions
|
@ -38,7 +38,7 @@ int get_blc_values(const struct blc_pwm_t **entries)
|
||||||
|
|
||||||
const char *mainboard_vbt_filename(void)
|
const char *mainboard_vbt_filename(void)
|
||||||
{
|
{
|
||||||
u16 pwm_freq = get_blc_pwm_freq_value(gm45_get_lvds_edid_str());
|
u16 pwm_freq = get_blc_pwm_freq_value();
|
||||||
|
|
||||||
if (pwm_freq == 0) {
|
if (pwm_freq == 0) {
|
||||||
printk(BIOS_DEBUG,
|
printk(BIOS_DEBUG,
|
||||||
|
|
|
@ -444,13 +444,11 @@ struct blc_pwm_t {
|
||||||
int pwm_freq; /* In Hz */
|
int pwm_freq; /* In Hz */
|
||||||
};
|
};
|
||||||
int get_blc_values(const struct blc_pwm_t **entries);
|
int get_blc_values(const struct blc_pwm_t **entries);
|
||||||
u16 get_blc_pwm_freq_value(const char *edid_ascii_string);
|
u16 get_blc_pwm_freq_value(void);
|
||||||
|
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <edid.h>
|
#include <edid.h>
|
||||||
|
|
||||||
const char *gm45_get_lvds_edid_str(void);
|
|
||||||
|
|
||||||
struct acpi_rsdp;
|
struct acpi_rsdp;
|
||||||
unsigned long northbridge_write_acpi_tables(const struct device *device, unsigned long start,
|
unsigned long northbridge_write_acpi_tables(const struct device *device, unsigned long start,
|
||||||
struct acpi_rsdp *rsdp);
|
struct acpi_rsdp *rsdp);
|
||||||
|
|
|
@ -29,6 +29,33 @@ void gtt_write(u32 reg, u32 data)
|
||||||
write32(res2mmio(gtt_res, reg, 0), data);
|
write32(res2mmio(gtt_res, reg, 0), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *gm45_get_lvds_edid_str(void)
|
||||||
|
{
|
||||||
|
u8 *mmio;
|
||||||
|
u8 edid_data_lvds[128];
|
||||||
|
struct edid edid_lvds;
|
||||||
|
static char edid_str[EDID_ASCII_STRING_LENGTH + 1];
|
||||||
|
|
||||||
|
if (edid_str[0])
|
||||||
|
return edid_str;
|
||||||
|
if (!gtt_res) {
|
||||||
|
printk(BIOS_ERR, "Never call %s() outside dev.init() context.\n", __func__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
mmio = res2mmio(gtt_res, 0, 0);
|
||||||
|
|
||||||
|
printk(BIOS_DEBUG, "LVDS EDID\n");
|
||||||
|
intel_gmbus_read_edid(mmio + GMBUS0, GMBUS_PORT_PANEL, 0x50,
|
||||||
|
edid_data_lvds, sizeof(edid_data_lvds));
|
||||||
|
intel_gmbus_stop(mmio + GMBUS0);
|
||||||
|
|
||||||
|
if (decode_edid(edid_data_lvds, sizeof(edid_data_lvds), &edid_lvds)
|
||||||
|
!= EDID_CONFORMANT)
|
||||||
|
return NULL;
|
||||||
|
memcpy(edid_str, edid_lvds.ascii_string, sizeof(edid_str));
|
||||||
|
return edid_str;
|
||||||
|
}
|
||||||
|
|
||||||
static u32 get_cdclk(struct device *const dev)
|
static u32 get_cdclk(struct device *const dev)
|
||||||
{
|
{
|
||||||
const u16 cdclk_sel = pci_read_config16(dev, GCFGC_OFFSET) & GCFGC_CD_MASK;
|
const u16 cdclk_sel = pci_read_config16(dev, GCFGC_OFFSET) & GCFGC_CD_MASK;
|
||||||
|
@ -60,17 +87,22 @@ static u32 freq_to_blc_pwm_ctl(struct device *const dev,
|
||||||
return (blc_mod << 16) | blc_mod;
|
return (blc_mod << 16) | blc_mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 get_blc_pwm_freq_value(const char *edid_ascii_string)
|
u16 get_blc_pwm_freq_value(void)
|
||||||
{
|
{
|
||||||
static u16 blc_pwm_freq;
|
static u16 blc_pwm_freq;
|
||||||
const struct blc_pwm_t *blc_pwm;
|
const struct blc_pwm_t *blc_pwm;
|
||||||
int i;
|
int i;
|
||||||
int blc_array_len;
|
int blc_array_len;
|
||||||
|
|
||||||
/* Prevent null-deref on strcmp() below */
|
if (blc_pwm_freq > 0)
|
||||||
if (blc_pwm_freq > 0 || !edid_ascii_string)
|
|
||||||
return blc_pwm_freq;
|
return blc_pwm_freq;
|
||||||
|
|
||||||
|
const char *const edid_ascii_string = gm45_get_lvds_edid_str();
|
||||||
|
if (!edid_ascii_string) {
|
||||||
|
printk(BIOS_ERR, "Need LVDS EDID string to derive backlight PWM frequency!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
blc_array_len = get_blc_values(&blc_pwm);
|
blc_array_len = get_blc_values(&blc_pwm);
|
||||||
/* Find EDID string and pwm freq in lookup table */
|
/* Find EDID string and pwm freq in lookup table */
|
||||||
for (i = 0; i < blc_array_len; i++) {
|
for (i = 0; i < blc_array_len; i++) {
|
||||||
|
@ -94,8 +126,7 @@ u16 get_blc_pwm_freq_value(const char *edid_ascii_string)
|
||||||
return blc_pwm_freq;
|
return blc_pwm_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gma_pm_init_post_vbios(struct device *const dev,
|
static void gma_pm_init_post_vbios(struct device *const dev)
|
||||||
const char *edid_ascii_string)
|
|
||||||
{
|
{
|
||||||
const struct northbridge_intel_gm45_config *const conf = dev->chip_info;
|
const struct northbridge_intel_gm45_config *const conf = dev->chip_info;
|
||||||
|
|
||||||
|
@ -132,7 +163,7 @@ static void gma_pm_init_post_vbios(struct device *const dev,
|
||||||
reg8 = 100;
|
reg8 = 100;
|
||||||
if (conf->duty_cycle != 0)
|
if (conf->duty_cycle != 0)
|
||||||
reg8 = conf->duty_cycle;
|
reg8 = conf->duty_cycle;
|
||||||
pwm_freq = get_blc_pwm_freq_value(edid_ascii_string);
|
pwm_freq = get_blc_pwm_freq_value();
|
||||||
if (pwm_freq == 0 && conf->default_pwm_freq != 0)
|
if (pwm_freq == 0 && conf->default_pwm_freq != 0)
|
||||||
pwm_freq = conf->default_pwm_freq;
|
pwm_freq = conf->default_pwm_freq;
|
||||||
|
|
||||||
|
@ -143,37 +174,9 @@ static void gma_pm_init_post_vbios(struct device *const dev,
|
||||||
reg8));
|
reg8));
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *gm45_get_lvds_edid_str(void)
|
|
||||||
{
|
|
||||||
u8 *mmio;
|
|
||||||
u8 edid_data_lvds[128];
|
|
||||||
struct edid edid_lvds;
|
|
||||||
static char edid_str[EDID_ASCII_STRING_LENGTH + 1];
|
|
||||||
|
|
||||||
if (edid_str[0])
|
|
||||||
return edid_str;
|
|
||||||
if (!gtt_res) {
|
|
||||||
printk(BIOS_ERR, "Never call %s() outside dev.init() context.\n", __func__);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
mmio = res2mmio(gtt_res, 0, 0);
|
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "LVDS EDID\n");
|
|
||||||
intel_gmbus_read_edid(mmio + GMBUS0, GMBUS_PORT_PANEL, 0x50,
|
|
||||||
edid_data_lvds, sizeof(edid_data_lvds));
|
|
||||||
intel_gmbus_stop(mmio + GMBUS0);
|
|
||||||
|
|
||||||
if (decode_edid(edid_data_lvds, sizeof(edid_data_lvds), &edid_lvds)
|
|
||||||
!= EDID_CONFORMANT)
|
|
||||||
return NULL;
|
|
||||||
memcpy(edid_str, edid_lvds.ascii_string, sizeof(edid_str));
|
|
||||||
return edid_str;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gma_func0_init(struct device *dev)
|
static void gma_func0_init(struct device *dev)
|
||||||
{
|
{
|
||||||
const struct northbridge_intel_gm45_config *const conf = dev->chip_info;
|
const struct northbridge_intel_gm45_config *const conf = dev->chip_info;
|
||||||
const char *edid_str;
|
|
||||||
|
|
||||||
/* Probe MMIO resource first. It's needed even for
|
/* Probe MMIO resource first. It's needed even for
|
||||||
intel_gma_init_igd_opregion() which may call back. */
|
intel_gma_init_igd_opregion() which may call back. */
|
||||||
|
@ -183,10 +186,6 @@ static void gma_func0_init(struct device *dev)
|
||||||
|
|
||||||
intel_gma_init_igd_opregion();
|
intel_gma_init_igd_opregion();
|
||||||
|
|
||||||
edid_str = gm45_get_lvds_edid_str();
|
|
||||||
if (!edid_str)
|
|
||||||
printk(BIOS_ERR, "Failed to obtain LVDS EDID string!\n");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GTT base is at a 2M offset and is 2M big. If GTT is smaller than 2M
|
* GTT base is at a 2M offset and is 2M big. If GTT is smaller than 2M
|
||||||
* cycles are simply not decoded which is fine.
|
* cycles are simply not decoded which is fine.
|
||||||
|
@ -204,7 +203,7 @@ static void gma_func0_init(struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Post VBIOS init */
|
/* Post VBIOS init */
|
||||||
gma_pm_init_post_vbios(dev, edid_str);
|
gma_pm_init_post_vbios(dev);
|
||||||
|
|
||||||
if (CONFIG(MAINBOARD_USE_LIBGFXINIT) && !acpi_is_wakeup_s3()) {
|
if (CONFIG(MAINBOARD_USE_LIBGFXINIT) && !acpi_is_wakeup_s3()) {
|
||||||
int vga_disable = (pci_read_config16(dev, D0F0_GGC) & 2) >> 1;
|
int vga_disable = (pci_read_config16(dev, D0F0_GGC) & 2) >> 1;
|
||||||
|
|
Loading…
Reference in a new issue