xref: /aosp_15_r20/external/coreboot/src/include/device/azalia_device.h (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef DEVICE_AZALIA_H
4 #define DEVICE_AZALIA_H
5 
6 #include <acpi/acpi.h>
7 #include <device/device.h>
8 #include <device/mmio.h>
9 #include <stdint.h>
10 
11 #define HDA_GCAP_REG		0x00
12 #define HDA_GCTL_REG		0x08
13 #define   HDA_GCTL_CRST		(1 << 0)
14 #define HDA_STATESTS_REG	0x0e
15 #define HDA_IC_REG		0x60
16 #define HDA_IR_REG		0x64
17 #define HDA_ICII_REG		0x68
18 #define   HDA_ICII_BUSY		(1 << 0)
19 #define   HDA_ICII_VALID	(1 << 1)
20 
21 #define AZALIA_MAX_CODECS	15
22 
23 int azalia_set_bits(void *port, u32 mask, u32 val);
24 int azalia_enter_reset(u8 *base);
25 int azalia_exit_reset(u8 *base);
26 u32 azalia_find_verb(const u32 *verb_table, u32 verb_table_bytes, u32 viddid, const u32 **verb);
27 int azalia_program_verb_table(u8 *base, const u32 *verbs, u32 verb_size);
28 void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes);
29 void azalia_codecs_init(u8 *base, u16 codec_mask);
30 void azalia_audio_init(struct device *dev);
31 extern struct device_operations default_azalia_audio_ops;
32 
33 /* Optional hook to program codec settings that are only known at runtime */
34 void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid);
35 
36 extern const u32 cim_verb_data[];
37 extern const u32 cim_verb_data_size;
38 extern const u32 pc_beep_verbs[];
39 extern const u32 pc_beep_verbs_size;
40 
41 /*
42  * The tables found in this file are derived from the Intel High Definition
43  * Audio Specification Revision 1.0a, published 17 June 2010
44  *
45  * 7.3.3.31 Configuration Default (page 177)
46  */
47 enum azalia_pin_connection {
48 	AZALIA_JACK                = 0x0,
49 	AZALIA_NC                  = 0x1,
50 	AZALIA_INTEGRATED          = 0x2,
51 	AZALIA_JACK_AND_INTEGRATED = 0x3,
52 };
53 
54 enum azalia_pin_location_gross {
55 	AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x00,
56 	AZALIA_INTERNAL                 = 0x10,
57 	AZALIA_SEPARATE_CHASSIS         = 0x20,
58 	AZALIA_LOCATION_OTHER           = 0x30,
59 };
60 
61 enum azalia_pin_location_geometric {
62 	AZALIA_GEOLOCATION_NA = 0x0,
63 	AZALIA_REAR           = 0x1,
64 	AZALIA_FRONT          = 0x2,
65 	AZALIA_LEFT           = 0x3,
66 	AZALIA_RIGHT          = 0x4,
67 	AZALIA_TOP            = 0x5,
68 	AZALIA_BOTTOM         = 0x6,
69 	AZALIA_SPECIAL7       = 0x7,
70 	AZALIA_SPECIAL8       = 0x8,
71 	AZALIA_SPECIAL9       = 0x9,
72 };
73 
74 enum azalia_pin_location_special {
75 	AZALIA_REAR_PANEL         = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL7,
76 	AZALIA_DRIVE_BAY          = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL8,
77 	AZALIA_RISER              = AZALIA_INTERNAL                 | AZALIA_SPECIAL7,
78 	AZALIA_DIGITAL_DISPLAY    = AZALIA_INTERNAL                 | AZALIA_SPECIAL8,
79 	AZALIA_ATAPI              = AZALIA_INTERNAL                 | AZALIA_SPECIAL9,
80 	AZALIA_MOBILE_LID_INSIDE  = AZALIA_LOCATION_OTHER           | AZALIA_SPECIAL7,
81 	AZALIA_MOBILE_LID_OUTSIDE = AZALIA_LOCATION_OTHER           | AZALIA_SPECIAL8,
82 };
83 
84 enum azalia_pin_device {
85 	AZALIA_LINE_OUT           = 0x0,
86 	AZALIA_SPEAKER            = 0x1,
87 	AZALIA_HP_OUT             = 0x2,
88 	AZALIA_CD                 = 0x3,
89 	AZALIA_SPDIF_OUT          = 0x4,
90 	AZALIA_DIGITAL_OTHER_OUT  = 0x5,
91 	AZALIA_MODEM_LINE_SIDE    = 0x6,
92 	AZALIA_MODEM_HANDSET_SIDE = 0x7,
93 	AZALIA_LINE_IN            = 0x8,
94 	AZALIA_AUX                = 0x9,
95 	AZALIA_MIC_IN             = 0xa,
96 	AZALIA_TELEPHONY          = 0xb,
97 	AZALIA_SPDIF_IN           = 0xc,
98 	AZALIA_DIGITAL_OTHER_IN   = 0xd,
99 	AZALIA_DEVICE_OTHER       = 0xf,
100 };
101 
102 enum azalia_pin_type {
103 	AZALIA_TYPE_UNKNOWN        = 0x0,
104 	AZALIA_STEREO_MONO_1_8     = 0x1,
105 	AZALIA_STEREO_MONO_1_4     = 0x2,
106 	AZALIA_ATAPI_INTERNAL      = 0x3,
107 	AZALIA_RCA                 = 0x4,
108 	AZALIA_OPTICAL             = 0x5,
109 	AZALIA_OTHER_DIGITAL       = 0x6,
110 	AZALIA_OTHER_ANALOG        = 0x7,
111 	AZALIA_MULTICHANNEL_ANALOG = 0x8,
112 	AZALIA_XLR                 = 0x9,
113 	AZALIA_RJ_11               = 0xa,
114 	AZALIA_COMBINATION         = 0xb,
115 	AZALIA_TYPE_OTHER          = 0xf,
116 };
117 
118 enum azalia_pin_color {
119 	AZALIA_COLOR_UNKNOWN = 0x0,
120 	AZALIA_BLACK         = 0x1,
121 	AZALIA_GREY          = 0x2,
122 	AZALIA_BLUE          = 0x3,
123 	AZALIA_GREEN         = 0x4,
124 	AZALIA_RED           = 0x5,
125 	AZALIA_ORANGE        = 0x6,
126 	AZALIA_YELLOW        = 0x7,
127 	AZALIA_PURPLE        = 0x8,
128 	AZALIA_PINK          = 0x9,
129 	AZALIA_WHITE         = 0xe,
130 	AZALIA_COLOR_OTHER   = 0xf,
131 };
132 
133 enum azalia_pin_misc {
134 	AZALIA_JACK_PRESENCE_DETECT    = 0x0,
135 	AZALIA_NO_JACK_PRESENCE_DETECT = 0x1,
136 };
137 
138 #define AZALIA_PIN_DESC(conn, location, dev, type, color, misc, association, sequence)	\
139 	((((conn)        << 30) & 0xc0000000) |						\
140 	 (((location)    << 24) & 0x3f000000) |						\
141 	 (((dev)         << 20) & 0x00f00000) |						\
142 	 (((type)        << 16) & 0x000f0000) |						\
143 	 (((color)       << 12) & 0x0000f000) |						\
144 	 (((misc)        <<  8) & 0x00000f00) |						\
145 	 (((association) <<  4) & 0x000000f0) |						\
146 	 (((sequence)    <<  0) & 0x0000000f))
147 
148 #define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size =	\
149 	ARRAY_SIZE(pc_beep_verbs);				\
150 	const u32 cim_verb_data_size = sizeof(cim_verb_data)
151 
152 #define AZALIA_VERB_12B(codec, pin, verb, val)		\
153 	((codec) << 28 | (pin) << 20 | (verb) << 8 | (val))
154 
155 #define AZALIA_PIN_CFG(codec, pin, val)					\
156 	AZALIA_VERB_12B(codec, pin, 0x71c, ((val) >>  0) & 0xff),	\
157 	AZALIA_VERB_12B(codec, pin, 0x71d, ((val) >>  8) & 0xff),	\
158 	AZALIA_VERB_12B(codec, pin, 0x71e, ((val) >> 16) & 0xff),	\
159 	AZALIA_VERB_12B(codec, pin, 0x71f, ((val) >> 24) & 0xff)
160 
161 #define AZALIA_PIN_CFG_NC(n)   (0x411111f0 | ((n) & 0xf))
162 
163 #define AZALIA_RESET(pin)			\
164 	AZALIA_VERB_12B(0, pin, 0x7ff, 0),	\
165 	AZALIA_VERB_12B(0, pin, 0x7ff, 0),	\
166 	AZALIA_VERB_12B(0, pin, 0x7ff, 0),	\
167 	AZALIA_VERB_12B(0, pin, 0x7ff, 0)
168 
169 #define AZALIA_SUBVENDOR(codec, val)				\
170 	AZALIA_VERB_12B(codec, 1, 0x720, ((val) >>  0) & 0xff),	\
171 	AZALIA_VERB_12B(codec, 1, 0x721, ((val) >>  8) & 0xff),	\
172 	AZALIA_VERB_12B(codec, 1, 0x722, ((val) >> 16) & 0xff),	\
173 	AZALIA_VERB_12B(codec, 1, 0x723, ((val) >> 24) & 0xff)
174 
175 #endif /* DEVICE_AZALIA_H */
176