summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Hui <buurin@gmail.com>2023-12-26 16:33:57 -0500
committerFelix Singer <service+coreboot-gerrit@felixsinger.de>2024-05-13 17:18:22 +0000
commit8869414105b4852268e484a38d170405e984bc7c (patch)
tree073ba30142959156ef1257013bc77bcf69c6c29d
parentca3764ab18efdc7921689c6de1dc4adcddf07207 (diff)
mb/asus/p8z77-m: Support AC97 front audio panel
Add a nvram option for front audio panel type. If it is set to AC97, reprogram front line out and microphone pins to match vendor firmware under same configuration. TEST=On asus/p8z77-m housed in an AOpen H340D case with an AC97 front audio panel, front panel line out port is now available as headphone port in Fedora 39 with this patch applied and option set correctly. And it works. Without the patch (or with this option set to HD Audio), front audio ports are completely inoperable. Change-Id: I39ccf066d87c5744a697599861719182768e0728 Signed-off-by: Keith Hui <buurin@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/79734 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Nicholas Chin <nic.c3.14@gmail.com>
-rw-r--r--src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default1
-rw-r--r--src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout9
-rw-r--r--src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c32
3 files changed, 42 insertions, 0 deletions
diff --git a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default
index 3cc854d6c3..79ea560466 100644
--- a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default
+++ b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.default
@@ -9,3 +9,4 @@ sata_mode=AHCI
usb3_mode=Enable
usb3_drv=Enable
usb3_streams=Enable
+audio_panel_type=HDA
diff --git a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout
index 3053b8d913..86bd35a907 100644
--- a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout
+++ b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/cmos.layout
@@ -51,6 +51,11 @@ entries
#
424 1 e 1 usb3_streams
+# audio_panel_type
+# HD Audio or AC'97
+#
+425 1 e 9 audio_panel_type
+
# -----------------------------------------------------------------
# Sandy/Ivy Bridge MRC Scrambler Seed values
# note: MUST NOT be covered by checksum!
@@ -128,6 +133,10 @@ enumerations
8 2 Auto
8 3 SmartAuto
+# audio_panel_type
+9 0 HDA
+9 1 AC97
+
# -----------------------------------------------------------------
# <startBit[must be byte-aligned]> <endBit[must be byte aligned]>
# <bit where to start storing checksum[must be 16bits-aligned]>
diff --git a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c
index 738ba53569..b553b17a84 100644
--- a/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c
+++ b/src/mainboard/asus/p8x7x-series/variants/p8z77-m/hda_verb.c
@@ -1,6 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <device/azalia_device.h>
+#include <stdint.h>
+
+#include <option.h>
const u32 cim_verb_data[] = {
0x10ec0887, /* Codec Vendor / Device ID: Realtek */
@@ -34,3 +37,32 @@ const u32 cim_verb_data[] = {
const u32 pc_beep_verbs[0] = {};
AZALIA_ARRAY_SIZES;
+
+void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid)
+{
+ unsigned int ac97 = get_uint_option("audio_panel_type", 0) & 0x1;
+
+ /*
+ * The verbs above are for a HD Audio front panel.
+ * With vendor firmware, if audio front panel type is set as AC97, line out 2
+ * (0x1b) and mic 2 (0x19) pins of ALC887 are configured differently.
+ *
+ * The differences are all in the "Misc" fields of configuration defaults (in byte 2)
+ * as shown below. ALC887 datasheet did not offer details on what those bits
+ * (listed as reserved in HDA spec) are, so we'll have to take their word for it.
+ *
+ * Pin | 0x19 | 0x1b
+ * -----+------+-----
+ * HDA | 1100 | 1100
+ * AC97 | 1001 | 0001
+ */
+
+ const u32 verbs[] = {
+ AZALIA_VERB_12B(0, 0x19, 0x71d, 0x99),
+ AZALIA_VERB_12B(0, 0x1b, 0x71d, 0x41)
+ };
+
+ if ((viddid == 0x10ec0887) && ac97) {
+ azalia_program_verb_table(base, verbs, ARRAY_SIZE(verbs));
+ }
+}