This also changes how debug messages will be printed. I focused on reducing clutter on the screen and made the style of the messages consistent. Before: azalia_audio: Initializing codec #5 codec not ready. azalia_audio: Initializing codec #4 codec not valid. azalia_audio: Initializing codec #3 azalia_audio: viddid: ffffffff azalia_audio: verb_size: 4 azalia_audio: verb loaded. After: azalia_audio: codec #5 not ready azalia_audio: codec #4 not valid azalia_audio: initializing codec #3... azalia_audio: - vendor/device id: 0xffffffff azalia_audio: - verb size: 4 azalia_audio: - verb loaded Change-Id: I92b6d184abccdbe0e1bfce98a2c959a97a618a29 Signed-off-by: Nicholas Sudsgaard <devel+coreboot@nsudsgaard.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/80332 Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
176 lines
5.7 KiB
C
176 lines
5.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#ifndef DEVICE_AZALIA_H
|
|
#define DEVICE_AZALIA_H
|
|
|
|
#include <acpi/acpi.h>
|
|
#include <device/device.h>
|
|
#include <device/mmio.h>
|
|
#include <stdint.h>
|
|
|
|
#define HDA_GCAP_REG 0x00
|
|
#define HDA_GCTL_REG 0x08
|
|
#define HDA_GCTL_CRST (1 << 0)
|
|
#define HDA_STATESTS_REG 0x0e
|
|
#define HDA_IC_REG 0x60
|
|
#define HDA_IR_REG 0x64
|
|
#define HDA_ICII_REG 0x68
|
|
#define HDA_ICII_BUSY (1 << 0)
|
|
#define HDA_ICII_VALID (1 << 1)
|
|
|
|
#define AZALIA_MAX_CODECS 15
|
|
|
|
int azalia_set_bits(void *port, u32 mask, u32 val);
|
|
int azalia_enter_reset(u8 *base);
|
|
int azalia_exit_reset(u8 *base);
|
|
u32 azalia_find_verb(const u32 *verb_table, u32 verb_table_bytes, u32 viddid, const u32 **verb);
|
|
int azalia_program_verb_table(u8 *base, const u32 *verbs, u32 verb_size);
|
|
void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes);
|
|
void azalia_codecs_init(u8 *base, u16 codec_mask);
|
|
void azalia_audio_init(struct device *dev);
|
|
extern struct device_operations default_azalia_audio_ops;
|
|
|
|
/* Optional hook to program codec settings that are only known at runtime */
|
|
void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid);
|
|
|
|
extern const u32 cim_verb_data[];
|
|
extern const u32 cim_verb_data_size;
|
|
extern const u32 pc_beep_verbs[];
|
|
extern const u32 pc_beep_verbs_size;
|
|
|
|
/*
|
|
* The tables found in this file are derived from the Intel High Definition
|
|
* Audio Specification Revision 1.0a, published 17 June 2010
|
|
*
|
|
* 7.3.3.31 Configuration Default (page 177)
|
|
*/
|
|
enum azalia_pin_connection {
|
|
AZALIA_JACK = 0x0,
|
|
AZALIA_NC = 0x1,
|
|
AZALIA_INTEGRATED = 0x2,
|
|
AZALIA_JACK_AND_INTEGRATED = 0x3,
|
|
};
|
|
|
|
enum azalia_pin_location_gross {
|
|
AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x00,
|
|
AZALIA_INTERNAL = 0x10,
|
|
AZALIA_SEPARATE_CHASSIS = 0x20,
|
|
AZALIA_LOCATION_OTHER = 0x30,
|
|
};
|
|
|
|
enum azalia_pin_location_geometric {
|
|
AZALIA_GEOLOCATION_NA = 0x0,
|
|
AZALIA_REAR = 0x1,
|
|
AZALIA_FRONT = 0x2,
|
|
AZALIA_LEFT = 0x3,
|
|
AZALIA_RIGHT = 0x4,
|
|
AZALIA_TOP = 0x5,
|
|
AZALIA_BOTTOM = 0x6,
|
|
AZALIA_SPECIAL7 = 0x7,
|
|
AZALIA_SPECIAL8 = 0x8,
|
|
AZALIA_SPECIAL9 = 0x9,
|
|
};
|
|
|
|
enum azalia_pin_location_special {
|
|
AZALIA_REAR_PANEL = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL7,
|
|
AZALIA_DRIVE_BAY = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL8,
|
|
AZALIA_RISER = AZALIA_INTERNAL | AZALIA_SPECIAL7,
|
|
AZALIA_DIGITAL_DISPLAY = AZALIA_INTERNAL | AZALIA_SPECIAL8,
|
|
AZALIA_ATAPI = AZALIA_INTERNAL | AZALIA_SPECIAL9,
|
|
AZALIA_MOBILE_LID_INSIDE = AZALIA_LOCATION_OTHER | AZALIA_SPECIAL7,
|
|
AZALIA_MOBILE_LID_OUTSIDE = AZALIA_LOCATION_OTHER | AZALIA_SPECIAL8,
|
|
};
|
|
|
|
enum azalia_pin_device {
|
|
AZALIA_LINE_OUT = 0x0,
|
|
AZALIA_SPEAKER = 0x1,
|
|
AZALIA_HP_OUT = 0x2,
|
|
AZALIA_CD = 0x3,
|
|
AZALIA_SPDIF_OUT = 0x4,
|
|
AZALIA_DIGITAL_OTHER_OUT = 0x5,
|
|
AZALIA_MODEM_LINE_SIDE = 0x6,
|
|
AZALIA_MODEM_HANDSET_SIDE = 0x7,
|
|
AZALIA_LINE_IN = 0x8,
|
|
AZALIA_AUX = 0x9,
|
|
AZALIA_MIC_IN = 0xa,
|
|
AZALIA_TELEPHONY = 0xb,
|
|
AZALIA_SPDIF_IN = 0xc,
|
|
AZALIA_DIGITAL_OTHER_IN = 0xd,
|
|
AZALIA_DEVICE_OTHER = 0xf,
|
|
};
|
|
|
|
enum azalia_pin_type {
|
|
AZALIA_TYPE_UNKNOWN = 0x0,
|
|
AZALIA_STEREO_MONO_1_8 = 0x1,
|
|
AZALIA_STEREO_MONO_1_4 = 0x2,
|
|
AZALIA_ATAPI_INTERNAL = 0x3,
|
|
AZALIA_RCA = 0x4,
|
|
AZALIA_OPTICAL = 0x5,
|
|
AZALIA_OTHER_DIGITAL = 0x6,
|
|
AZALIA_OTHER_ANALOG = 0x7,
|
|
AZALIA_MULTICHANNEL_ANALOG = 0x8,
|
|
AZALIA_XLR = 0x9,
|
|
AZALIA_RJ_11 = 0xa,
|
|
AZALIA_COMBINATION = 0xb,
|
|
AZALIA_TYPE_OTHER = 0xf,
|
|
};
|
|
|
|
enum azalia_pin_color {
|
|
AZALIA_COLOR_UNKNOWN = 0x0,
|
|
AZALIA_BLACK = 0x1,
|
|
AZALIA_GREY = 0x2,
|
|
AZALIA_BLUE = 0x3,
|
|
AZALIA_GREEN = 0x4,
|
|
AZALIA_RED = 0x5,
|
|
AZALIA_ORANGE = 0x6,
|
|
AZALIA_YELLOW = 0x7,
|
|
AZALIA_PURPLE = 0x8,
|
|
AZALIA_PINK = 0x9,
|
|
AZALIA_WHITE = 0xe,
|
|
AZALIA_COLOR_OTHER = 0xf,
|
|
};
|
|
|
|
enum azalia_pin_misc {
|
|
AZALIA_JACK_PRESENCE_DETECT = 0x0,
|
|
AZALIA_NO_JACK_PRESENCE_DETECT = 0x1,
|
|
};
|
|
|
|
#define AZALIA_PIN_DESC(conn, location, dev, type, color, misc, association, sequence) \
|
|
((((conn) << 30) & 0xc0000000) | \
|
|
(((location) << 24) & 0x3f000000) | \
|
|
(((dev) << 20) & 0x00f00000) | \
|
|
(((type) << 16) & 0x000f0000) | \
|
|
(((color) << 12) & 0x0000f000) | \
|
|
(((misc) << 8) & 0x00000f00) | \
|
|
(((association) << 4) & 0x000000f0) | \
|
|
(((sequence) << 0) & 0x0000000f))
|
|
|
|
#define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size = \
|
|
ARRAY_SIZE(pc_beep_verbs); \
|
|
const u32 cim_verb_data_size = sizeof(cim_verb_data)
|
|
|
|
#define AZALIA_VERB_12B(codec, pin, verb, val) \
|
|
((codec) << 28 | (pin) << 20 | (verb) << 8 | (val))
|
|
|
|
#define AZALIA_PIN_CFG(codec, pin, val) \
|
|
AZALIA_VERB_12B(codec, pin, 0x71c, ((val) >> 0) & 0xff), \
|
|
AZALIA_VERB_12B(codec, pin, 0x71d, ((val) >> 8) & 0xff), \
|
|
AZALIA_VERB_12B(codec, pin, 0x71e, ((val) >> 16) & 0xff), \
|
|
AZALIA_VERB_12B(codec, pin, 0x71f, ((val) >> 24) & 0xff)
|
|
|
|
#define AZALIA_PIN_CFG_NC(n) (0x411111f0 | ((n) & 0xf))
|
|
|
|
#define AZALIA_RESET(pin) \
|
|
AZALIA_VERB_12B(0, pin, 0x7ff, 0), \
|
|
AZALIA_VERB_12B(0, pin, 0x7ff, 0), \
|
|
AZALIA_VERB_12B(0, pin, 0x7ff, 0), \
|
|
AZALIA_VERB_12B(0, pin, 0x7ff, 0)
|
|
|
|
#define AZALIA_SUBVENDOR(codec, val) \
|
|
AZALIA_VERB_12B(codec, 1, 0x720, ((val) >> 0) & 0xff), \
|
|
AZALIA_VERB_12B(codec, 1, 0x721, ((val) >> 8) & 0xff), \
|
|
AZALIA_VERB_12B(codec, 1, 0x722, ((val) >> 16) & 0xff), \
|
|
AZALIA_VERB_12B(codec, 1, 0x723, ((val) >> 24) & 0xff)
|
|
|
|
#endif /* DEVICE_AZALIA_H */
|