173de3de5SBhawanpreet Lakha /*
273de3de5SBhawanpreet Lakha  * Copyright 2020 Advanced Micro Devices, Inc.
373de3de5SBhawanpreet Lakha  *
473de3de5SBhawanpreet Lakha  * Permission is hereby granted, free of charge, to any person obtaining a
573de3de5SBhawanpreet Lakha  * copy of this software and associated documentation files (the "Software"),
673de3de5SBhawanpreet Lakha  * to deal in the Software without restriction, including without limitation
773de3de5SBhawanpreet Lakha  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
873de3de5SBhawanpreet Lakha  * and/or sell copies of the Software, and to permit persons to whom the
973de3de5SBhawanpreet Lakha  * Software is furnished to do so, subject to the following conditions:
1073de3de5SBhawanpreet Lakha  *
1173de3de5SBhawanpreet Lakha  * The above copyright notice and this permission notice shall be included in
1273de3de5SBhawanpreet Lakha  * all copies or substantial portions of the Software.
1373de3de5SBhawanpreet Lakha  *
1473de3de5SBhawanpreet Lakha  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1573de3de5SBhawanpreet Lakha  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1673de3de5SBhawanpreet Lakha  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1773de3de5SBhawanpreet Lakha  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1873de3de5SBhawanpreet Lakha  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1973de3de5SBhawanpreet Lakha  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2073de3de5SBhawanpreet Lakha  * OTHER DEALINGS IN THE SOFTWARE.
2173de3de5SBhawanpreet Lakha  *
2273de3de5SBhawanpreet Lakha  * Authors: AMD
2373de3de5SBhawanpreet Lakha  *
2473de3de5SBhawanpreet Lakha  */
2573de3de5SBhawanpreet Lakha 
2673de3de5SBhawanpreet Lakha #ifndef __DAL_DCN30_AFMT_H__
2773de3de5SBhawanpreet Lakha #define __DAL_DCN30_AFMT_H__
2873de3de5SBhawanpreet Lakha 
2973de3de5SBhawanpreet Lakha 
3073de3de5SBhawanpreet Lakha #define DCN30_AFMT_FROM_AFMT(afmt)\
3173de3de5SBhawanpreet Lakha 	container_of(afmt, struct dcn30_afmt, base)
3273de3de5SBhawanpreet Lakha 
3373de3de5SBhawanpreet Lakha #define AFMT_DCN3_REG_LIST(id) \
3473de3de5SBhawanpreet Lakha 	SRI(AFMT_INFOFRAME_CONTROL0, AFMT, id), \
3573de3de5SBhawanpreet Lakha 	SRI(AFMT_VBI_PACKET_CONTROL, AFMT, id), \
3673de3de5SBhawanpreet Lakha 	SRI(AFMT_AUDIO_PACKET_CONTROL, AFMT, id), \
3773de3de5SBhawanpreet Lakha 	SRI(AFMT_AUDIO_PACKET_CONTROL2, AFMT, id), \
3873de3de5SBhawanpreet Lakha 	SRI(AFMT_AUDIO_SRC_CONTROL, AFMT, id), \
3973de3de5SBhawanpreet Lakha 	SRI(AFMT_60958_0, AFMT, id), \
4073de3de5SBhawanpreet Lakha 	SRI(AFMT_60958_1, AFMT, id), \
4173de3de5SBhawanpreet Lakha 	SRI(AFMT_60958_2, AFMT, id), \
4273de3de5SBhawanpreet Lakha 	SRI(AFMT_MEM_PWR, AFMT, id)
4373de3de5SBhawanpreet Lakha 
4473de3de5SBhawanpreet Lakha struct dcn30_afmt_registers {
4573de3de5SBhawanpreet Lakha 	uint32_t AFMT_INFOFRAME_CONTROL0;
4673de3de5SBhawanpreet Lakha 	uint32_t AFMT_VBI_PACKET_CONTROL;
4773de3de5SBhawanpreet Lakha 	uint32_t AFMT_AUDIO_PACKET_CONTROL;
4873de3de5SBhawanpreet Lakha 	uint32_t AFMT_AUDIO_PACKET_CONTROL2;
4973de3de5SBhawanpreet Lakha 	uint32_t AFMT_AUDIO_SRC_CONTROL;
5073de3de5SBhawanpreet Lakha 	uint32_t AFMT_60958_0;
5173de3de5SBhawanpreet Lakha 	uint32_t AFMT_60958_1;
5273de3de5SBhawanpreet Lakha 	uint32_t AFMT_60958_2;
5373de3de5SBhawanpreet Lakha 	uint32_t AFMT_MEM_PWR;
5473de3de5SBhawanpreet Lakha };
5573de3de5SBhawanpreet Lakha 
5673de3de5SBhawanpreet Lakha #define DCN3_AFMT_MASK_SH_LIST(mask_sh)\
5773de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_INFOFRAME_CONTROL0, AFMT_AUDIO_INFO_UPDATE, mask_sh),\
5873de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_AUDIO_SRC_CONTROL, AFMT_AUDIO_SRC_SELECT, mask_sh),\
5973de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_CHANNEL_ENABLE, mask_sh),\
6073de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL, AFMT_60958_CS_UPDATE, mask_sh),\
6173de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_LAYOUT_OVRD, mask_sh),\
6273de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL2, AFMT_60958_OSF_OVRD, mask_sh),\
6373de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_0, AFMT_60958_CS_CHANNEL_NUMBER_L, mask_sh),\
6473de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_0, AFMT_60958_CS_CLOCK_ACCURACY, mask_sh),\
6573de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_1, AFMT_60958_CS_CHANNEL_NUMBER_R, mask_sh),\
6673de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_2, mask_sh),\
6773de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_3, mask_sh),\
6873de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_4, mask_sh),\
6973de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_5, mask_sh),\
7073de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_6, mask_sh),\
7173de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_7, mask_sh),\
7273de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL, AFMT_AUDIO_SAMPLE_SEND, mask_sh),\
7373de3de5SBhawanpreet Lakha 	SE_SF(AFMT0_AFMT_MEM_PWR, AFMT_MEM_PWR_FORCE, mask_sh)
7473de3de5SBhawanpreet Lakha 
7573de3de5SBhawanpreet Lakha #define AFMT_DCN3_REG_FIELD_LIST(type) \
7673de3de5SBhawanpreet Lakha 		type AFMT_AUDIO_INFO_UPDATE;\
7773de3de5SBhawanpreet Lakha 		type AFMT_AUDIO_SRC_SELECT;\
7873de3de5SBhawanpreet Lakha 		type AFMT_AUDIO_CHANNEL_ENABLE;\
7973de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_UPDATE;\
8073de3de5SBhawanpreet Lakha 		type AFMT_AUDIO_LAYOUT_OVRD;\
8173de3de5SBhawanpreet Lakha 		type AFMT_60958_OSF_OVRD;\
8273de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_L;\
8373de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CLOCK_ACCURACY;\
8473de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_R;\
8573de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_2;\
8673de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_3;\
8773de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_4;\
8873de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_5;\
8973de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_6;\
9073de3de5SBhawanpreet Lakha 		type AFMT_60958_CS_CHANNEL_NUMBER_7;\
9173de3de5SBhawanpreet Lakha 		type AFMT_AUDIO_SAMPLE_SEND;\
9273de3de5SBhawanpreet Lakha 		type AFMT_MEM_PWR_FORCE
9373de3de5SBhawanpreet Lakha 
9473de3de5SBhawanpreet Lakha struct dcn30_afmt_shift {
9573de3de5SBhawanpreet Lakha 	AFMT_DCN3_REG_FIELD_LIST(uint8_t);
9673de3de5SBhawanpreet Lakha };
9773de3de5SBhawanpreet Lakha 
9873de3de5SBhawanpreet Lakha struct dcn30_afmt_mask {
9973de3de5SBhawanpreet Lakha 	AFMT_DCN3_REG_FIELD_LIST(uint32_t);
10073de3de5SBhawanpreet Lakha };
10173de3de5SBhawanpreet Lakha 
10273de3de5SBhawanpreet Lakha 
10373de3de5SBhawanpreet Lakha struct afmt;
10473de3de5SBhawanpreet Lakha 
10573de3de5SBhawanpreet Lakha struct afmt_funcs {
10673de3de5SBhawanpreet Lakha 
10773de3de5SBhawanpreet Lakha 	void (*setup_hdmi_audio)(
10873de3de5SBhawanpreet Lakha 		struct afmt *afmt);
10973de3de5SBhawanpreet Lakha 
11073de3de5SBhawanpreet Lakha 	void (*se_audio_setup)(
11173de3de5SBhawanpreet Lakha 		struct afmt *afmt,
11273de3de5SBhawanpreet Lakha 		unsigned int az_inst,
11373de3de5SBhawanpreet Lakha 		struct audio_info *audio_info);
11473de3de5SBhawanpreet Lakha 
11573de3de5SBhawanpreet Lakha 	void (*audio_mute_control)(
11673de3de5SBhawanpreet Lakha 		struct afmt *afmt,
11773de3de5SBhawanpreet Lakha 		bool mute);
11873de3de5SBhawanpreet Lakha 
11973de3de5SBhawanpreet Lakha 	void (*audio_info_immediate_update)(
12073de3de5SBhawanpreet Lakha 		struct afmt *afmt);
12173de3de5SBhawanpreet Lakha 
12273de3de5SBhawanpreet Lakha 	void (*setup_dp_audio)(
12373de3de5SBhawanpreet Lakha 		struct afmt *afmt);
124*18b4f1a0SMichael Strauss 
125*18b4f1a0SMichael Strauss 	void (*afmt_poweron)(
126*18b4f1a0SMichael Strauss 		struct afmt *afmt);
127*18b4f1a0SMichael Strauss 
128*18b4f1a0SMichael Strauss 	void (*afmt_powerdown)(
129*18b4f1a0SMichael Strauss 		struct afmt *afmt);
13073de3de5SBhawanpreet Lakha };
13173de3de5SBhawanpreet Lakha 
13273de3de5SBhawanpreet Lakha struct afmt {
13373de3de5SBhawanpreet Lakha 	const struct afmt_funcs *funcs;
13473de3de5SBhawanpreet Lakha 	struct dc_context *ctx;
13573de3de5SBhawanpreet Lakha 	int inst;
13673de3de5SBhawanpreet Lakha };
13773de3de5SBhawanpreet Lakha 
13873de3de5SBhawanpreet Lakha struct dcn30_afmt {
13973de3de5SBhawanpreet Lakha 	struct afmt base;
14073de3de5SBhawanpreet Lakha 	const struct dcn30_afmt_registers *regs;
14173de3de5SBhawanpreet Lakha 	const struct dcn30_afmt_shift *afmt_shift;
14273de3de5SBhawanpreet Lakha 	const struct dcn30_afmt_mask *afmt_mask;
14373de3de5SBhawanpreet Lakha };
14473de3de5SBhawanpreet Lakha 
145*18b4f1a0SMichael Strauss void afmt3_setup_hdmi_audio(
146*18b4f1a0SMichael Strauss 	struct afmt *afmt);
147*18b4f1a0SMichael Strauss 
148*18b4f1a0SMichael Strauss void afmt3_se_audio_setup(
149*18b4f1a0SMichael Strauss 	struct afmt *afmt,
150*18b4f1a0SMichael Strauss 	unsigned int az_inst,
151*18b4f1a0SMichael Strauss 	struct audio_info *audio_info);
152*18b4f1a0SMichael Strauss 
153*18b4f1a0SMichael Strauss void afmt3_audio_mute_control(
154*18b4f1a0SMichael Strauss 	struct afmt *afmt,
155*18b4f1a0SMichael Strauss 	bool mute);
156*18b4f1a0SMichael Strauss 
157*18b4f1a0SMichael Strauss void afmt3_audio_info_immediate_update(
158*18b4f1a0SMichael Strauss 	struct afmt *afmt);
159*18b4f1a0SMichael Strauss 
160*18b4f1a0SMichael Strauss void afmt3_setup_dp_audio(
161*18b4f1a0SMichael Strauss 		struct afmt *afmt);
162*18b4f1a0SMichael Strauss 
16373de3de5SBhawanpreet Lakha void afmt3_construct(struct dcn30_afmt *afmt3,
16473de3de5SBhawanpreet Lakha 	struct dc_context *ctx,
16573de3de5SBhawanpreet Lakha 	uint32_t inst,
16673de3de5SBhawanpreet Lakha 	const struct dcn30_afmt_registers *afmt_regs,
16773de3de5SBhawanpreet Lakha 	const struct dcn30_afmt_shift *afmt_shift,
16873de3de5SBhawanpreet Lakha 	const struct dcn30_afmt_mask *afmt_mask);
16973de3de5SBhawanpreet Lakha 
17073de3de5SBhawanpreet Lakha 
17173de3de5SBhawanpreet Lakha #endif
172