diff options
author | Angel Pons <th3fanbus@gmail.com> | 2021-03-22 14:21:28 +0100 |
---|---|---|
committer | Angel Pons <th3fanbus@gmail.com> | 2021-04-19 19:02:08 +0000 |
commit | b922cbbdd6bad68f9d3c6f1c6de6b557646c5dbb (patch) | |
tree | f0276140e4621d2adc18de96e23b7434b466fbff /src/device | |
parent | 6b89746644c173a2fbba4d9a4308f2b07c903575 (diff) |
device/azalia_device.c: Add option to lock down GCAP
On Intel 6-series PCHs, the GCAP register is R/WO (Read / Write Once),
and needs to be written to after the HD Audio controller is taken out
of reset. Add a Kconfig option to read and write back GCAP in order to
lock it down. Follow-up commits will select this option when switching
platforms to use common Azalia code, to preserve original behaviour.
Change-Id: I70bab20816fb6c0bf7bff35c3d2f5828cd96172d
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50794
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Diffstat (limited to 'src/device')
-rw-r--r-- | src/device/Kconfig | 9 | ||||
-rw-r--r-- | src/device/azalia_device.c | 5 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/device/Kconfig b/src/device/Kconfig index 63b7d6c9ee..5ae3466d32 100644 --- a/src/device/Kconfig +++ b/src/device/Kconfig @@ -527,6 +527,15 @@ config AZALIA_MAX_CODECS help The maximum number of codecs supported on a single HD Audio controller. +config AZALIA_LOCK_DOWN_R_WO_GCAP + def_bool n + depends on AZALIA_PLUGIN_SUPPORT + help + The GCAP register is implemented as R/WO (Read / Write Once) on some + HD Audio controllers, such as Intel 6-series PCHs. Select this option + to lock down the GCAP register after deasserting the controller reset + bit. Locking is done by reading GCAP and writing back the read value. + config PCIEXP_PLUGIN_SUPPORT bool default y diff --git a/src/device/azalia_device.c b/src/device/azalia_device.c index 013a49a2c0..9202f72a4e 100644 --- a/src/device/azalia_device.c +++ b/src/device/azalia_device.c @@ -56,6 +56,11 @@ static u16 codec_detect(u8 *base) if (azalia_exit_reset(base) < 0) goto no_codec; + if (CONFIG(AZALIA_LOCK_DOWN_R_WO_GCAP)) { + /* If GCAP is R/WO, lock it down after deasserting controller reset */ + write16(base + HDA_GCAP_REG, read16(base + HDA_GCAP_REG)); + } + /* clear STATESTS bits (BAR + 0xe)[2:0] */ reg16 = read16(base + HDA_STATESTS_REG); reg16 |= codec_mask; |