1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   *   intel_hdmi_lpe_audio.h - Intel HDMI LPE audio driver
4   *
5   *  Copyright (C) 2016 Intel Corp
6   *  Authors:	Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>
7   *		Ramesh Babu K V <ramesh.babu@intel.com>
8   *		Vaibhav Agarwal <vaibhav.agarwal@intel.com>
9   *		Jerome Anand <jerome.anand@intel.com>
10   *		Aravind Siddappaji <aravindx.siddappaji@intel.com>
11   *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12   *
13   * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14   */
15  #ifndef __INTEL_HDMI_LPE_AUDIO_H
16  #define __INTEL_HDMI_LPE_AUDIO_H
17  
18  #define HAD_MIN_CHANNEL		2
19  #define HAD_MAX_CHANNEL		8
20  #define HAD_NUM_OF_RING_BUFS	4
21  
22  /* max 20bit address, aligned to 64 */
23  #define HAD_MAX_BUFFER		((1024 * 1024 - 1) & ~0x3f)
24  #define HAD_DEFAULT_BUFFER	(600 * 1024) /* default prealloc size */
25  #define HAD_MAX_PERIODS		256	/* arbitrary, but should suffice */
26  #define HAD_MIN_PERIODS		1
27  #define HAD_MAX_PERIOD_BYTES	((HAD_MAX_BUFFER / HAD_MIN_PERIODS) & ~0x3f)
28  #define HAD_MIN_PERIOD_BYTES	1024	/* might be smaller */
29  #define HAD_FIFO_SIZE		0 /* fifo not being used */
30  #define MAX_SPEAKERS		8
31  
32  #define AUD_SAMPLE_RATE_32	32000
33  #define AUD_SAMPLE_RATE_44_1	44100
34  #define AUD_SAMPLE_RATE_48	48000
35  #define AUD_SAMPLE_RATE_88_2	88200
36  #define AUD_SAMPLE_RATE_96	96000
37  #define AUD_SAMPLE_RATE_176_4	176400
38  #define AUD_SAMPLE_RATE_192	192000
39  
40  #define HAD_MIN_RATE		AUD_SAMPLE_RATE_32
41  #define HAD_MAX_RATE		AUD_SAMPLE_RATE_192
42  
43  #define DIS_SAMPLE_RATE_25_2	25200
44  #define DIS_SAMPLE_RATE_27	27000
45  #define DIS_SAMPLE_RATE_54	54000
46  #define DIS_SAMPLE_RATE_74_25	74250
47  #define DIS_SAMPLE_RATE_148_5	148500
48  #define HAD_REG_WIDTH		0x08
49  #define HAD_MAX_DIP_WORDS		16
50  
51  /* DP Link Rates */
52  #define DP_2_7_GHZ			270000
53  #define DP_1_62_GHZ			162000
54  
55  /* Maud Values */
56  #define AUD_SAMPLE_RATE_32_DP_2_7_MAUD_VAL		1988
57  #define AUD_SAMPLE_RATE_44_1_DP_2_7_MAUD_VAL		2740
58  #define AUD_SAMPLE_RATE_48_DP_2_7_MAUD_VAL		2982
59  #define AUD_SAMPLE_RATE_88_2_DP_2_7_MAUD_VAL		5480
60  #define AUD_SAMPLE_RATE_96_DP_2_7_MAUD_VAL		5965
61  #define AUD_SAMPLE_RATE_176_4_DP_2_7_MAUD_VAL		10961
62  #define HAD_MAX_RATE_DP_2_7_MAUD_VAL			11930
63  #define AUD_SAMPLE_RATE_32_DP_1_62_MAUD_VAL		3314
64  #define AUD_SAMPLE_RATE_44_1_DP_1_62_MAUD_VAL		4567
65  #define AUD_SAMPLE_RATE_48_DP_1_62_MAUD_VAL		4971
66  #define AUD_SAMPLE_RATE_88_2_DP_1_62_MAUD_VAL		9134
67  #define AUD_SAMPLE_RATE_96_DP_1_62_MAUD_VAL		9942
68  #define AUD_SAMPLE_RATE_176_4_DP_1_62_MAUD_VAL		18268
69  #define HAD_MAX_RATE_DP_1_62_MAUD_VAL			19884
70  
71  /* Naud Value */
72  #define DP_NAUD_VAL					32768
73  
74  /* HDMI Controller register offsets - audio domain common */
75  /* Base address for below regs = 0x65000 */
76  enum hdmi_ctrl_reg_offset_common {
77  	AUDIO_HDMI_CONFIG_A = 0x000,
78  	AUDIO_HDMI_CONFIG_B = 0x800,
79  	AUDIO_HDMI_CONFIG_C = 0x900,
80  };
81  /* HDMI controller register offsets */
82  enum hdmi_ctrl_reg_offset {
83  	AUD_CONFIG		= 0x0,
84  	AUD_CH_STATUS_0		= 0x08,
85  	AUD_CH_STATUS_1		= 0x0C,
86  	AUD_HDMI_CTS		= 0x10,
87  	AUD_N_ENABLE		= 0x14,
88  	AUD_SAMPLE_RATE		= 0x18,
89  	AUD_BUF_CONFIG		= 0x20,
90  	AUD_BUF_CH_SWAP		= 0x24,
91  	AUD_BUF_A_ADDR		= 0x40,
92  	AUD_BUF_A_LENGTH	= 0x44,
93  	AUD_BUF_B_ADDR		= 0x48,
94  	AUD_BUF_B_LENGTH	= 0x4c,
95  	AUD_BUF_C_ADDR		= 0x50,
96  	AUD_BUF_C_LENGTH	= 0x54,
97  	AUD_BUF_D_ADDR		= 0x58,
98  	AUD_BUF_D_LENGTH	= 0x5c,
99  	AUD_CNTL_ST		= 0x60,
100  	AUD_HDMI_STATUS		= 0x64, /* v2 */
101  	AUD_HDMIW_INFOFR	= 0x68, /* v2 */
102  };
103  
104  /* Audio configuration */
105  union aud_cfg {
106  	struct {
107  		u32 aud_en:1;
108  		u32 layout:1;		/* LAYOUT[01], see below */
109  		u32 fmt:2;
110  		u32 num_ch:3;
111  		u32 set:1;
112  		u32 flat:1;
113  		u32 val_bit:1;
114  		u32 user_bit:1;
115  		u32 underrun:1;		/* 0: send null packets,
116  					 * 1: send silence stream
117  					 */
118  		u32 packet_mode:1;	/* 0: 32bit container, 1: 16bit */
119  		u32 left_align:1;	/* 0: MSB bits 0-23, 1: bits 8-31 */
120  		u32 bogus_sample:1;	/* bogus sample for odd channels */
121  		u32 dp_modei:1;		/* 0: HDMI, 1: DP */
122  		u32 rsvd:16;
123  	} regx;
124  	u32 regval;
125  };
126  
127  #define AUD_CONFIG_VALID_BIT			(1 << 9)
128  #define AUD_CONFIG_DP_MODE			(1 << 15)
129  #define AUD_CONFIG_CH_MASK	0x70
130  #define LAYOUT0			0		/* interleaved stereo */
131  #define LAYOUT1			1		/* for channels > 2 */
132  
133  /* Audio Channel Status 0 Attributes */
134  union aud_ch_status_0 {
135  	struct {
136  		u32 ch_status:1;
137  		u32 lpcm_id:1;
138  		u32 cp_info:1;
139  		u32 format:3;
140  		u32 mode:2;
141  		u32 ctg_code:8;
142  		u32 src_num:4;
143  		u32 ch_num:4;
144  		u32 samp_freq:4;	/* CH_STATUS_MAP_XXX */
145  		u32 clk_acc:2;
146  		u32 rsvd:2;
147  	} regx;
148  	u32 regval;
149  };
150  
151  /* samp_freq values - Sampling rate as per IEC60958 Ver 3 */
152  #define CH_STATUS_MAP_32KHZ	0x3
153  #define CH_STATUS_MAP_44KHZ	0x0
154  #define CH_STATUS_MAP_48KHZ	0x2
155  #define CH_STATUS_MAP_88KHZ	0x8
156  #define CH_STATUS_MAP_96KHZ	0xA
157  #define CH_STATUS_MAP_176KHZ	0xC
158  #define CH_STATUS_MAP_192KHZ	0xE
159  
160  /* Audio Channel Status 1 Attributes */
161  union aud_ch_status_1 {
162  	struct {
163  		u32 max_wrd_len:1;
164  		u32 wrd_len:3;
165  		u32 rsvd:28;
166  	} regx;
167  	u32 regval;
168  };
169  
170  #define MAX_SMPL_WIDTH_20	0x0
171  #define MAX_SMPL_WIDTH_24	0x1
172  #define SMPL_WIDTH_16BITS	0x1
173  #define SMPL_WIDTH_24BITS	0x5
174  
175  /* CTS register */
176  union aud_hdmi_cts {
177  	struct {
178  		u32 cts_val:24;
179  		u32 en_cts_prog:1;
180  		u32 rsvd:7;
181  	} regx;
182  	u32 regval;
183  };
184  
185  /* N register */
186  union aud_hdmi_n_enable {
187  	struct {
188  		u32 n_val:24;
189  		u32 en_n_prog:1;
190  		u32 rsvd:7;
191  	} regx;
192  	u32 regval;
193  };
194  
195  /* Audio Buffer configurations */
196  union aud_buf_config {
197  	struct {
198  		u32 audio_fifo_watermark:8;
199  		u32 dma_fifo_watermark:3;
200  		u32 rsvd0:5;
201  		u32 aud_delay:8;
202  		u32 rsvd1:8;
203  	} regx;
204  	u32 regval;
205  };
206  
207  #define FIFO_THRESHOLD		0xFE
208  #define DMA_FIFO_THRESHOLD	0x7
209  
210  /* Audio Sample Swapping offset */
211  union aud_buf_ch_swap {
212  	struct {
213  		u32 first_0:3;
214  		u32 second_0:3;
215  		u32 first_1:3;
216  		u32 second_1:3;
217  		u32 first_2:3;
218  		u32 second_2:3;
219  		u32 first_3:3;
220  		u32 second_3:3;
221  		u32 rsvd:8;
222  	} regx;
223  	u32 regval;
224  };
225  
226  #define SWAP_LFE_CENTER		0x00fac4c8	/* octal 76543210 */
227  
228  /* Address for Audio Buffer */
229  union aud_buf_addr {
230  	struct {
231  		u32 valid:1;
232  		u32 intr_en:1;
233  		u32 rsvd:4;
234  		u32 addr:26;
235  	} regx;
236  	u32 regval;
237  };
238  
239  #define AUD_BUF_VALID		(1U << 0)
240  #define AUD_BUF_INTR_EN		(1U << 1)
241  
242  /* Length of Audio Buffer */
243  union aud_buf_len {
244  	struct {
245  		u32 buf_len:20;
246  		u32 rsvd:12;
247  	} regx;
248  	u32 regval;
249  };
250  
251  /* Audio Control State Register offset */
252  union aud_ctrl_st {
253  	struct {
254  		u32 ram_addr:4;
255  		u32 eld_ack:1;
256  		u32 eld_addr:4;
257  		u32 eld_buf_size:5;
258  		u32 eld_valid:1;
259  		u32 cp_ready:1;
260  		u32 dip_freq:2;
261  		u32 dip_idx:3;
262  		u32 dip_en_sta:4;
263  		u32 rsvd:7;
264  	} regx;
265  	u32 regval;
266  };
267  
268  /* Audio HDMI Widget Data Island Packet offset */
269  union aud_info_frame1 {
270  	struct {
271  		u32 pkt_type:8;
272  		u32 ver_num:8;
273  		u32 len:5;
274  		u32 rsvd:11;
275  	} regx;
276  	u32 regval;
277  };
278  
279  #define HDMI_INFO_FRAME_WORD1	0x000a0184
280  #define DP_INFO_FRAME_WORD1	0x00441b84
281  
282  /* DIP frame 2 */
283  union aud_info_frame2 {
284  	struct {
285  		u32 chksum:8;
286  		u32 chnl_cnt:3;
287  		u32 rsvd0:1;
288  		u32 coding_type:4;
289  		u32 smpl_size:2;
290  		u32 smpl_freq:3;
291  		u32 rsvd1:3;
292  		u32 format:8;
293  	} regx;
294  	u32 regval;
295  };
296  
297  /* DIP frame 3 */
298  union aud_info_frame3 {
299  	struct {
300  		u32 chnl_alloc:8;
301  		u32 rsvd0:3;
302  		u32 lsv:4;
303  		u32 dm_inh:1;
304  		u32 rsvd1:16;
305  	} regx;
306  	u32 regval;
307  };
308  
309  #define VALID_DIP_WORDS		3
310  
311  /* AUD_HDMI_STATUS bits */
312  #define HDMI_AUDIO_UNDERRUN		(1U << 31)
313  #define HDMI_AUDIO_BUFFER_DONE		(1U << 29)
314  
315  /* AUD_HDMI_STATUS register mask */
316  #define AUD_HDMI_STATUS_MASK_UNDERRUN	0xC0000000
317  #define AUD_HDMI_STATUS_MASK_SRDBG	0x00000002
318  #define AUD_HDMI_STATUSG_MASK_FUNCRST	0x00000001
319  
320  #endif
321