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