mb/prodrive/hermes/hda_verb: Update verb table for latest board revision

Use different verb tables depending on board revision.

For board revision R03 and older use the existing verb tables.

For revisions newer than R03 use the new verb tables and also
apply the dynamic audio configuration recently added.

Also do the following:
* Use correct NID port mapping
* Fix verb count in ALC888 header
* Fix NID in Intel codec verbs

Change-Id: I24ea9149eb2cddb815ff82744a351c926a94aaef
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/44772
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Patrick Rudolph 2020-08-25 12:00:06 +02:00 committed by Patrick Georgi
parent 4084702567
commit 560eab7de5
5 changed files with 164 additions and 222 deletions

View File

@ -10,3 +10,6 @@ romstage-y += eeprom.c
ramstage-y += ramstage.c
ramstage-y += mainboard.c
ramstage-y += eeprom.c
ramstage-$(CONFIG_AZALIA_PLUGIN_SUPPORT) += variants/baseboard/hda_verb.c
ramstage-$(CONFIG_AZALIA_PLUGIN_SUPPORT) += variants/r04/hda_verb.c

View File

@ -2,232 +2,17 @@
#include <device/azalia_device.h>
#include <types.h>
#include <console/console.h>
#include "variants/baseboard/include/eeprom.h"
const u32 cim_verb_data[] = {
0x10ec0888, /* Codec Vendor / Device ID: Realtek ALC888 */
0x10ec0888, /* Subsystem ID */
10, /* Number of 4 dword sets */
AZALIA_SUBVENDOR(0, 0x10ec0888),
/* Port A: Front, Audio Header #1 */
AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
SPECIAL7,
LINE_OUT,
OTHER_ANALOG,
COLOR_UNKNOWN,
false,
0xf,
0
)),
/* Port B: Mic1, Line input (pink) */
AZALIA_PIN_CFG(0, 0x15, AZALIA_PIN_DESC(
JACK,
EXTERNAL_PRIMARY_CHASSIS,
REAR, //FIXME
LINE_IN,
STEREO_MONO_1_8,
PINK,
false,
0xf,
0
)),
/* Port C: Line, Speaker (only L) */
AZALIA_PIN_CFG(0, 0x16, AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
NA,
SPEAKER,
TYPE_UNKNOWN,
COLOR_UNKNOWN,
false,
0xf,
0
)),
/* Port D: Sidesurr, Line out (green) */
AZALIA_PIN_CFG(0, 0x17, AZALIA_PIN_DESC(
//JACK,
LINE_OUT,
EXTERNAL_PRIMARY_CHASSIS,
REAR, //FIXME
LINE_OUT,
STEREO_MONO_1_8,
GREEN,
false,
0xf,
0
)),
/* Port E: Line2, Line input (blue) */
AZALIA_PIN_CFG(0, 0x18, AZALIA_PIN_DESC(
JACK,
EXTERNAL_PRIMARY_CHASSIS,
REAR, //FIXME
LINE_IN,
STEREO_MONO_1_8,
BLUE,
false,
0xf,
0
)),
/* Port F: Mic2, Audio Header #2 */
AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
SPECIAL7,
LINE_IN,
OTHER_ANALOG,
COLOR_UNKNOWN,
false,
0xf,
0
)),
/* Port G: Not connected */
AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_DESC(
NC,
LOCATION_OTHER,
NA,
DEVICE_OTHER,
TYPE_OTHER,
COLOR_OTHER,
true,
0,
0
)),
/* Port H: Not connected */
AZALIA_PIN_CFG(0, 0x1b, AZALIA_PIN_DESC(
NC,
LOCATION_OTHER,
NA,
DEVICE_OTHER,
TYPE_OTHER,
COLOR_OTHER,
true,
0,
0
)),
/* S/PDIF-OUT */
AZALIA_PIN_CFG(0, 0x1e, AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
NA,
SPDIF_OUT,
OTHER_DIGITAL,
COLOR_UNKNOWN,
true,
0xf,
0
)),
/* S/PDIF-IN */
AZALIA_PIN_CFG(0, 0x1f, AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
NA,
SPDIF_IN,
OTHER_DIGITAL,
COLOR_UNKNOWN,
true,
0xf,
0
)),
//FIXME COdec ID
/*
* VerbTable: CFL Display Audio Codec
* Revision ID = 0xFF
* Codec Vendor: 0x8086280B
*/
0x8086280B,
0xFFFFFFFF,
5, /* Number of 4 dword sets */
/*
* Display Audio Verb Table
* For GEN9, the Vendor Node ID is 08h
* Port to be exposed to the inbox driver in the vanilla mode
* PORT C - BIT[7:6] = 01b
*/
0x00878140,
0x00878140,
0x00878140,
0x00878140,
/* Pin Widget 5 - PORT B - Configuration Default: 0x18560010 */
AZALIA_PIN_CFG(2, 0x05, 0x18560010),
/* Pin Widget 6 - PORT C - Configuration Default: 0x18560020 */
AZALIA_PIN_CFG(2, 0x06, 0x18560020),
/* Pin Widget 7 - PORT D - Configuration Default: 0x18560030 */
AZALIA_PIN_CFG(2, 0x07, 0x18560030),
/* Disable the third converter and third Pin (NID 08h) */
0x00878140,
0x00878140,
0x00878140,
0x00878140,
};
const u32 pc_beep_verbs[0] = {};
AZALIA_ARRAY_SIZES;
static u32 get_port_c_vref_cfg(uint8_t blue_rear_vref)
{
switch (blue_rear_vref) {
default:
case 0:
return 0x02040000;
case 1:
return 0x02041000;
case 2:
return 0x02044000;
case 3:
return 0x02045000;
case 4:
return 0x02046000;
}
}
static u32 get_internal_audio_cfg(uint8_t internal_audio_connection)
{
switch (internal_audio_connection) {
default:
case 0:
return AZALIA_PIN_CFG_NC(0);
case 1:
return 0x022a4c40;
case 2:
return AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
NA,
SPEAKER,
TYPE_UNKNOWN,
COLOR_UNKNOWN,
false,
0xf,
0);
}
}
#include "variants/baseboard/include/variant/variants.h"
void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid)
{
if (viddid != 0x10ec0888)
return;
if (viddid == 0x10ec0888) {
u8 hsi = get_bmc_hsi();
const struct eeprom_board_settings *const board_cfg = get_board_settings();
if (!board_cfg)
return;
const u32 config = get_internal_audio_cfg(board_cfg->internal_audio_connection);
const u32 verbs[] = {
AZALIA_PIN_CFG(0, 0x1b, config),
0x0205000d,
get_port_c_vref_cfg(board_cfg->blue_rear_vref),
};
azalia_program_verb_table(base, verbs, ARRAY_SIZE(verbs));
if (hsi >= 4)
mainboard_r0x_configure_alc888(base, viddid);
}
}

View File

@ -0,0 +1,77 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <device/azalia_device.h>
#include <types.h>
const u32 cim_verb_data[] = {
0x10ec0888, /* Codec Vendor / Device ID: Realtek ALC888 */
0x10ec0888, /* Subsystem ID */
17, /* Number of 4 dword sets */
AZALIA_SUBVENDOR(0, 0x10ec0888),
/* Port configuration control */
0x018707e1, /* port B VREF 50% of LDO-OUT */
0x019707e1, /* port F VREF 50% of LDO-OUT */
0x01b707e1, /* port E VREF 50% of LDO-OUT*/
0x0205000d, /* pin 37 vrefo hidden register - used as port C vref */
0x02041000, /* pin 37 vrefo 50% of LDO-OUT */
0x02041000, /* Dummy entry */
0x02041000, /* Dummy entry */
0x02041000, /* Dummy entry */
/* Pin widgets */
AZALIA_PIN_CFG(0, 0x11, 0x411111f0), /* SPDIF-OUT2 - disabled */
AZALIA_PIN_CFG(0, 0x12, 0x411111f0), /* digital MIC - disabled */
AZALIA_PIN_CFG(0, 0x14, 0x01014430), /* PORT D - rear line out */
AZALIA_PIN_CFG(0, 0x16, 0x411111f0), /* PORT G - disabled */
AZALIA_PIN_CFG(0, 0x17, 0x411111f0), /* PORT H - disabled */
AZALIA_PIN_CFG(0, 0x18, 0x01a19c50), /* PORT B - rear mic in */
AZALIA_PIN_CFG(0, 0x1c, 0x411111f0), /* CD audio - disabled */
AZALIA_PIN_CFG(0, 0x1d, 0x4004c601), /* BEEPIN */
AZALIA_PIN_CFG(0, 0x1e, 0x01452160), /* SPDIF-OUT */
AZALIA_PIN_CFG(0, 0x1f, 0x01C52170), /* SPDIF-IN */
/* Config for R02 and older */
AZALIA_PIN_CFG(0, 0x19, 0x02214c40), /* port F - front hp out */
AZALIA_PIN_CFG(0, 0x1a, 0x901001f0), /* port C - internal speaker */
AZALIA_PIN_CFG(0, 0x1b, 0x01813c10), /* port E - rear line in/mic - Blue */
AZALIA_PIN_CFG(0, 0x15, 0x02a19c20), /* port A - audio hdr input */
/*
* VerbTable: CFL Display Audio Codec
* Revision ID = 0xFF
* Codec Vendor: 0x8086280B
*/
0x8086280B,
0xFFFFFFFF,
5, /* Number of 4 dword sets */
AZALIA_SUBVENDOR(2, 0x80860101),
/*
* Display Audio Verb Table
* For GEN9, the Vendor Node ID is 08h
* Port to be exposed to the inbox driver in the vanilla mode
* PORT C - BIT[7:6] = 01b
*/
0x20878101,
/* Pin Widget 5 - PORT B - Configuration Default: 0x18560010 */
AZALIA_PIN_CFG(2, 0x05, 0x18560010),
/* Pin Widget 6 - PORT C - Configuration Default: 0x18560020 */
AZALIA_PIN_CFG(2, 0x06, 0x18560020),
/* Pin Widget 7 - PORT D - Configuration Default: 0x18560030 */
AZALIA_PIN_CFG(2, 0x07, 0x18560030),
/* Disable the third converter and third Pin (NID 08h) */
0x20878100,
/* Dummy entries */
0x20878100,
0x20878100,
};
const u32 pc_beep_verbs[0] = {};
AZALIA_ARRAY_SIZES;

View File

@ -1,4 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <soc/cnl_memcfg_init.h>
#include <types.h>
/* Return memory configuration structure. */
const struct cnl_mb_cfg *variant_memcfg_config(void);
void mainboard_r0x_configure_alc888(u8 *base, u32 viddid);

View File

@ -0,0 +1,72 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <device/azalia_device.h>
#include <types.h>
#include "variant/variants.h"
#include "eeprom.h"
static const u32 r04_verb_data[] = {
AZALIA_PIN_CFG(0, 0x19, 0x02a19c20), /* PORT F - front mic in */
AZALIA_PIN_CFG(0, 0x1a, 0x01813c51), /* PORT C - rear line in (mic support) */
AZALIA_PIN_CFG(0, 0x15, 0x411111f0), /* PORT A - disabled */
};
static u32 get_port_c_vref_cfg(uint8_t blue_rear_vref)
{
switch (blue_rear_vref) {
default:
case 0:
return 0x02040000;
case 1:
return 0x02041000;
case 2:
return 0x02044000;
case 3:
return 0x02045000;
case 4:
return 0x02046000;
}
}
static u32 get_internal_audio_cfg(uint8_t internal_audio_connection)
{
switch (internal_audio_connection) {
default:
case 0:
return AZALIA_PIN_CFG_NC(0);
case 1:
return 0x022a4c40;
case 2:
return AZALIA_PIN_DESC(
INTEGRATED,
INTERNAL,
NA,
SPEAKER,
TYPE_UNKNOWN,
COLOR_UNKNOWN,
false,
0xf,
0);
}
}
void mainboard_r0x_configure_alc888(u8 *base, u32 viddid)
{
/* Overwrite settings made by baseboard */
azalia_program_verb_table(base, r04_verb_data, ARRAY_SIZE(r04_verb_data));
const struct eeprom_board_settings *const board_cfg = get_board_settings();
if (!board_cfg)
return;
const u32 config = get_internal_audio_cfg(board_cfg->internal_audio_connection);
const u32 verbs[] = {
AZALIA_PIN_CFG(0, 0x1b, config),
0x0205000d,
get_port_c_vref_cfg(board_cfg->blue_rear_vref),
};
azalia_program_verb_table(base, verbs, ARRAY_SIZE(verbs));
}