Angel Pons has submitted this change. ( https://review.coreboot.org/c/coreboot/+/50794 )
Change subject: device/azalia_device.c: Add option to lock down GCAP ......................................................................
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 --- M src/device/Kconfig M src/device/azalia_device.c 2 files changed, 14 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Arthur Heymans: Looks good to me, approved
diff --git a/src/device/Kconfig b/src/device/Kconfig index 63b7d6c..5ae3466 100644 --- a/src/device/Kconfig +++ b/src/device/Kconfig @@ -527,6 +527,15 @@ 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 013a49a..9202f72 100644 --- a/src/device/azalia_device.c +++ b/src/device/azalia_device.c @@ -56,6 +56,11 @@ 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;