Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Add VPG and AFMT low power support for DCN3.1

[WHY]
Power down VPG and AFMT blocks when not in use

[HOW]
Create afmt31 and vpg31 structs and add necessary fields to reg list

Reviewed-by: Eric Yang <eric.yang2@amd.com>
Acked-by: Mikita Lipski <mikita.lipski@amd.com>
Signed-off-by: Michael Strauss <michael.strauss@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Michael Strauss and committed by
Alex Deucher
18b4f1a0 9b3d7652

+593 -29
+10
drivers/gpu/drm/amd/display/dc/core/dc.c
··· 71 71 72 72 #include "dmub/dmub_srv.h" 73 73 74 + #include "dcn30/dcn30_vpg.h" 75 + 74 76 #include "i2caux_interface.h" 75 77 #include "dce/dmub_hw_lock_mgr.h" 76 78 ··· 2557 2555 enum surface_update_type update_type, 2558 2556 struct dc_state *context) 2559 2557 { 2558 + #if defined(CONFIG_DRM_AMD_DC_DCN) 2559 + struct vpg *vpg; 2560 + #endif 2560 2561 int j; 2561 2562 2562 2563 // Stream updates ··· 2580 2575 stream_update->vrr_infopacket || 2581 2576 stream_update->vsc_infopacket || 2582 2577 stream_update->vsp_infopacket) { 2578 + #if defined(CONFIG_DRM_AMD_DC_DCN) 2579 + vpg = pipe_ctx->stream_res.stream_enc->vpg; 2580 + if (vpg && vpg->funcs->vpg_poweron) 2581 + vpg->funcs->vpg_poweron(vpg); 2582 + #endif 2583 2583 resource_build_info_frame(pipe_ctx); 2584 2584 dc->hwss.update_info_frame(pipe_ctx); 2585 2585 }
+17
drivers/gpu/drm/amd/display/dc/core/dc_link.c
··· 51 51 #include "inc/link_enc_cfg.h" 52 52 #include "inc/link_dpcd.h" 53 53 54 + #include "dc/dcn30/dcn30_vpg.h" 55 + 54 56 #define DC_LOGGER_INIT(logger) 55 57 56 58 #define LINK_INFO(...) \ ··· 3610 3608 struct link_encoder *link_enc; 3611 3609 #if defined(CONFIG_DRM_AMD_DC_DCN) 3612 3610 enum otg_out_mux_dest otg_out_dest = OUT_MUX_DIO; 3611 + struct vpg *vpg = pipe_ctx->stream_res.stream_enc->vpg; 3613 3612 #endif 3614 3613 DC_LOGGER_INIT(pipe_ctx->stream->ctx->logger); 3615 3614 ··· 3701 3698 pipe_ctx->stream->apply_edp_fast_boot_optimization; 3702 3699 3703 3700 pipe_ctx->stream->apply_edp_fast_boot_optimization = false; 3701 + 3702 + #if defined(CONFIG_DRM_AMD_DC_DCN) 3703 + // Enable VPG before building infoframe 3704 + if (vpg && vpg->funcs->vpg_poweron) 3705 + vpg->funcs->vpg_poweron(vpg); 3706 + #endif 3704 3707 3705 3708 resource_build_info_frame(pipe_ctx); 3706 3709 dc->hwss.update_info_frame(pipe_ctx); ··· 3854 3845 struct dc *dc = pipe_ctx->stream->ctx->dc; 3855 3846 struct dc_stream_state *stream = pipe_ctx->stream; 3856 3847 struct dc_link *link = stream->sink->link; 3848 + #if defined(CONFIG_DRM_AMD_DC_DCN) 3849 + struct vpg *vpg = pipe_ctx->stream_res.stream_enc->vpg; 3850 + #endif 3857 3851 3858 3852 if (!IS_DIAG_DC(dc->ctx->dce_environment) && 3859 3853 dc_is_virtual_signal(pipe_ctx->stream->signal)) ··· 3939 3927 if (pipe_ctx->stream_res.tg->funcs->set_out_mux) 3940 3928 pipe_ctx->stream_res.tg->funcs->set_out_mux(pipe_ctx->stream_res.tg, OUT_MUX_DIO); 3941 3929 } 3930 + #endif 3931 + 3932 + #if defined(CONFIG_DRM_AMD_DC_DCN) 3933 + if (vpg && vpg->funcs->vpg_powerdown) 3934 + vpg->funcs->vpg_powerdown(vpg); 3942 3935 #endif 3943 3936 } 3944 3937
+2
drivers/gpu/drm/amd/display/dc/dc.h
··· 471 471 bool cm: 1; 472 472 bool mpc: 1; 473 473 bool optc: 1; 474 + bool vpg: 1; 475 + bool afmt: 1; 474 476 } bits; 475 477 uint32_t u32All; 476 478 };
+10
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c
··· 31 31 #include "hw_shared.h" 32 32 #include "inc/link_dpcd.h" 33 33 #include "dpcd_defs.h" 34 + #include "dcn30/dcn30_afmt.h" 34 35 35 36 #define DC_LOGGER \ 36 37 enc1->base.ctx->logger ··· 1402 1401 struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc); 1403 1402 uint32_t value = 0; 1404 1403 1404 + #if defined(CONFIG_DRM_AMD_DC_DCN) 1405 + if (enc->afmt && enc->afmt->funcs->afmt_powerdown) 1406 + enc->afmt->funcs->afmt_powerdown(enc->afmt); 1407 + #endif 1408 + 1405 1409 /* Disable Audio packets */ 1406 1410 REG_UPDATE_5(DP_SEC_CNTL, 1407 1411 DP_SEC_ASP_ENABLE, 0, ··· 1470 1464 void enc1_se_hdmi_audio_disable( 1471 1465 struct stream_encoder *enc) 1472 1466 { 1467 + #if defined(CONFIG_DRM_AMD_DC_DCN) 1468 + if (enc->afmt && enc->afmt->funcs->afmt_powerdown) 1469 + enc->afmt->funcs->afmt_powerdown(enc->afmt); 1470 + #endif 1473 1471 enc1_se_enable_audio_clock(enc, false); 1474 1472 } 1475 1473
+17 -7
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_afmt.c
··· 44 44 afmt3->base.ctx 45 45 46 46 47 - static void afmt3_setup_hdmi_audio( 47 + void afmt3_setup_hdmi_audio( 48 48 struct afmt *afmt) 49 49 { 50 50 struct dcn30_afmt *afmt3 = DCN30_AFMT_FROM_AFMT(afmt); 51 + 52 + if (afmt->funcs->afmt_poweron) 53 + afmt->funcs->afmt_poweron(afmt); 51 54 52 55 /* AFMT_AUDIO_PACKET_CONTROL */ 53 56 REG_UPDATE(AFMT_AUDIO_PACKET_CONTROL, AFMT_60958_CS_UPDATE, 1); ··· 116 113 return cea_channels; 117 114 } 118 115 119 - static void afmt3_se_audio_setup( 116 + void afmt3_se_audio_setup( 120 117 struct afmt *afmt, 121 118 unsigned int az_inst, 122 119 struct audio_info *audio_info) ··· 141 138 REG_UPDATE(AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_CHANNEL_ENABLE, channels); 142 139 143 140 /* Disable forced mem power off */ 144 - REG_UPDATE(AFMT_MEM_PWR, AFMT_MEM_PWR_FORCE, 0); 141 + if (afmt->funcs->afmt_poweron == NULL) 142 + REG_UPDATE(AFMT_MEM_PWR, AFMT_MEM_PWR_FORCE, 0); 145 143 } 146 144 147 - static void afmt3_audio_mute_control( 145 + void afmt3_audio_mute_control( 148 146 struct afmt *afmt, 149 147 bool mute) 150 148 { 151 149 struct dcn30_afmt *afmt3 = DCN30_AFMT_FROM_AFMT(afmt); 152 - 150 + if (mute && afmt->funcs->afmt_powerdown) 151 + afmt->funcs->afmt_powerdown(afmt); 152 + if (!mute && afmt->funcs->afmt_poweron) 153 + afmt->funcs->afmt_poweron(afmt); 153 154 /* enable/disable transmission of audio packets */ 154 155 REG_UPDATE(AFMT_AUDIO_PACKET_CONTROL, AFMT_AUDIO_SAMPLE_SEND, !mute); 155 156 } 156 157 157 - static void afmt3_audio_info_immediate_update( 158 + void afmt3_audio_info_immediate_update( 158 159 struct afmt *afmt) 159 160 { 160 161 struct dcn30_afmt *afmt3 = DCN30_AFMT_FROM_AFMT(afmt); ··· 167 160 REG_UPDATE(AFMT_INFOFRAME_CONTROL0, AFMT_AUDIO_INFO_UPDATE, 1); 168 161 } 169 162 170 - static void afmt3_setup_dp_audio( 163 + void afmt3_setup_dp_audio( 171 164 struct afmt *afmt) 172 165 { 173 166 struct dcn30_afmt *afmt3 = DCN30_AFMT_FROM_AFMT(afmt); 167 + 168 + if (afmt->funcs->afmt_poweron) 169 + afmt->funcs->afmt_poweron(afmt); 174 170 175 171 /* AFMT_AUDIO_PACKET_CONTROL */ 176 172 REG_UPDATE(AFMT_AUDIO_PACKET_CONTROL, AFMT_60958_CS_UPDATE, 1);
+24
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_afmt.h
··· 121 121 122 122 void (*setup_dp_audio)( 123 123 struct afmt *afmt); 124 + 125 + void (*afmt_poweron)( 126 + struct afmt *afmt); 127 + 128 + void (*afmt_powerdown)( 129 + struct afmt *afmt); 124 130 }; 125 131 126 132 struct afmt { ··· 141 135 const struct dcn30_afmt_shift *afmt_shift; 142 136 const struct dcn30_afmt_mask *afmt_mask; 143 137 }; 138 + 139 + void afmt3_setup_hdmi_audio( 140 + struct afmt *afmt); 141 + 142 + void afmt3_se_audio_setup( 143 + struct afmt *afmt, 144 + unsigned int az_inst, 145 + struct audio_info *audio_info); 146 + 147 + void afmt3_audio_mute_control( 148 + struct afmt *afmt, 149 + bool mute); 150 + 151 + void afmt3_audio_info_immediate_update( 152 + struct afmt *afmt); 153 + 154 + void afmt3_setup_dp_audio( 155 + struct afmt *afmt); 144 156 145 157 void afmt3_construct(struct dcn30_afmt *afmt3, 146 158 struct dc_context *ctx,
+2
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c
··· 704 704 static void enc3_se_dp_audio_enable( 705 705 struct stream_encoder *enc) 706 706 { 707 + if (enc->afmt->funcs->afmt_poweron) 708 + enc->afmt->funcs->afmt_poweron(enc->afmt); 707 709 enc1_se_enable_audio_clock(enc, true); 708 710 enc3_se_setup_dp_audio(enc); 709 711 enc1_se_enable_dp_audio(enc);
+1 -1
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_vpg.c
··· 43 43 vpg3->base.ctx 44 44 45 45 46 - static void vpg3_update_generic_info_packet( 46 + void vpg3_update_generic_info_packet( 47 47 struct vpg *vpg, 48 48 uint32_t packet_index, 49 49 const struct dc_info_packet *info_packet)
+11
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_vpg.h
··· 139 139 struct vpg *vpg, 140 140 uint32_t packet_index, 141 141 const struct dc_info_packet *info_packet); 142 + 143 + void (*vpg_poweron)( 144 + struct vpg *vpg); 145 + 146 + void (*vpg_powerdown)( 147 + struct vpg *vpg); 142 148 }; 143 149 144 150 struct vpg { ··· 159 153 const struct dcn30_vpg_shift *vpg_shift; 160 154 const struct dcn30_vpg_mask *vpg_mask; 161 155 }; 156 + 157 + void vpg3_update_generic_info_packet( 158 + struct vpg *vpg, 159 + uint32_t packet_index, 160 + const struct dc_info_packet *info_packet); 162 161 163 162 void vpg3_construct(struct dcn30_vpg *vpg3, 164 163 struct dc_context *ctx,
+2 -1
drivers/gpu/drm/amd/display/dc/dcn31/Makefile
··· 12 12 13 13 DCN31 = dcn31_resource.o dcn31_hubbub.o dcn31_hwseq.o dcn31_init.o dcn31_hubp.o \ 14 14 dcn31_dccg.o dcn31_optc.o dcn31_dio_link_encoder.o dcn31_panel_cntl.o \ 15 - dcn31_apg.o dcn31_hpo_dp_stream_encoder.o dcn31_hpo_dp_link_encoder.o 15 + dcn31_apg.o dcn31_hpo_dp_stream_encoder.o dcn31_hpo_dp_link_encoder.o \ 16 + dcn31_afmt.o dcn31_vpg.o 16 17 17 18 ifdef CONFIG_X86 18 19 CFLAGS_$(AMDDALPATH)/dc/dcn31/dcn31_resource.o := -msse
+92
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_afmt.c
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: AMD 23 + * 24 + */ 25 + 26 + #include "dc_bios_types.h" 27 + #include "hw_shared.h" 28 + #include "dcn30/dcn30_afmt.h" 29 + #include "dcn31_afmt.h" 30 + #include "reg_helper.h" 31 + #include "dc/dc.h" 32 + 33 + #define DC_LOGGER \ 34 + afmt31->base.ctx->logger 35 + 36 + #define REG(reg)\ 37 + (afmt31->regs->reg) 38 + 39 + #undef FN 40 + #define FN(reg_name, field_name) \ 41 + afmt31->afmt_shift->field_name, afmt31->afmt_mask->field_name 42 + 43 + 44 + #define CTX \ 45 + afmt31->base.ctx 46 + 47 + static struct afmt_funcs dcn31_afmt_funcs = { 48 + .setup_hdmi_audio = afmt3_setup_hdmi_audio, 49 + .se_audio_setup = afmt3_se_audio_setup, 50 + .audio_mute_control = afmt3_audio_mute_control, 51 + .audio_info_immediate_update = afmt3_audio_info_immediate_update, 52 + .setup_dp_audio = afmt3_setup_dp_audio, 53 + .afmt_powerdown = afmt31_powerdown, 54 + .afmt_poweron = afmt31_poweron 55 + }; 56 + 57 + void afmt31_powerdown(struct afmt *afmt) 58 + { 59 + struct dcn31_afmt *afmt31 = DCN31_AFMT_FROM_AFMT(afmt); 60 + 61 + if (afmt->ctx->dc->debug.enable_mem_low_power.bits.afmt == false) 62 + return; 63 + 64 + REG_UPDATE_2(AFMT_MEM_PWR, AFMT_MEM_PWR_DIS, 0, AFMT_MEM_PWR_FORCE, 1); 65 + } 66 + 67 + void afmt31_poweron(struct afmt *afmt) 68 + { 69 + struct dcn31_afmt *afmt31 = DCN31_AFMT_FROM_AFMT(afmt); 70 + 71 + if (afmt->ctx->dc->debug.enable_mem_low_power.bits.afmt == false) 72 + return; 73 + 74 + REG_UPDATE_2(AFMT_MEM_PWR, AFMT_MEM_PWR_DIS, 1, AFMT_MEM_PWR_FORCE, 0); 75 + } 76 + 77 + void afmt31_construct(struct dcn31_afmt *afmt31, 78 + struct dc_context *ctx, 79 + uint32_t inst, 80 + const struct dcn31_afmt_registers *afmt_regs, 81 + const struct dcn31_afmt_shift *afmt_shift, 82 + const struct dcn31_afmt_mask *afmt_mask) 83 + { 84 + afmt31->base.ctx = ctx; 85 + 86 + afmt31->base.inst = inst; 87 + afmt31->base.funcs = &dcn31_afmt_funcs; 88 + 89 + afmt31->regs = afmt_regs; 90 + afmt31->afmt_shift = afmt_shift; 91 + afmt31->afmt_mask = afmt_mask; 92 + }
+126
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_afmt.h
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: AMD 23 + * 24 + */ 25 + 26 + #ifndef __DAL_DCN31_AFMT_H__ 27 + #define __DAL_DCN31_AFMT_H__ 28 + 29 + 30 + #define DCN31_AFMT_FROM_AFMT(afmt)\ 31 + container_of(afmt, struct dcn31_afmt, base) 32 + 33 + #define AFMT_DCN31_REG_LIST(id) \ 34 + SRI(AFMT_INFOFRAME_CONTROL0, AFMT, id), \ 35 + SRI(AFMT_VBI_PACKET_CONTROL, AFMT, id), \ 36 + SRI(AFMT_AUDIO_PACKET_CONTROL, AFMT, id), \ 37 + SRI(AFMT_AUDIO_PACKET_CONTROL2, AFMT, id), \ 38 + SRI(AFMT_AUDIO_SRC_CONTROL, AFMT, id), \ 39 + SRI(AFMT_60958_0, AFMT, id), \ 40 + SRI(AFMT_60958_1, AFMT, id), \ 41 + SRI(AFMT_60958_2, AFMT, id), \ 42 + SRI(AFMT_MEM_PWR, AFMT, id) 43 + 44 + struct dcn31_afmt_registers { 45 + uint32_t AFMT_INFOFRAME_CONTROL0; 46 + uint32_t AFMT_VBI_PACKET_CONTROL; 47 + uint32_t AFMT_AUDIO_PACKET_CONTROL; 48 + uint32_t AFMT_AUDIO_PACKET_CONTROL2; 49 + uint32_t AFMT_AUDIO_SRC_CONTROL; 50 + uint32_t AFMT_60958_0; 51 + uint32_t AFMT_60958_1; 52 + uint32_t AFMT_60958_2; 53 + uint32_t AFMT_MEM_PWR; 54 + }; 55 + 56 + #define DCN31_AFMT_MASK_SH_LIST(mask_sh)\ 57 + SE_SF(AFMT0_AFMT_INFOFRAME_CONTROL0, AFMT_AUDIO_INFO_UPDATE, mask_sh),\ 58 + SE_SF(AFMT0_AFMT_AUDIO_SRC_CONTROL, AFMT_AUDIO_SRC_SELECT, mask_sh),\ 59 + SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_CHANNEL_ENABLE, mask_sh),\ 60 + SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL, AFMT_60958_CS_UPDATE, mask_sh),\ 61 + SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL2, AFMT_AUDIO_LAYOUT_OVRD, mask_sh),\ 62 + SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL2, AFMT_60958_OSF_OVRD, mask_sh),\ 63 + SE_SF(AFMT0_AFMT_60958_0, AFMT_60958_CS_CHANNEL_NUMBER_L, mask_sh),\ 64 + SE_SF(AFMT0_AFMT_60958_0, AFMT_60958_CS_CLOCK_ACCURACY, mask_sh),\ 65 + SE_SF(AFMT0_AFMT_60958_1, AFMT_60958_CS_CHANNEL_NUMBER_R, mask_sh),\ 66 + SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_2, mask_sh),\ 67 + SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_3, mask_sh),\ 68 + SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_4, mask_sh),\ 69 + SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_5, mask_sh),\ 70 + SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_6, mask_sh),\ 71 + SE_SF(AFMT0_AFMT_60958_2, AFMT_60958_CS_CHANNEL_NUMBER_7, mask_sh),\ 72 + SE_SF(AFMT0_AFMT_AUDIO_PACKET_CONTROL, AFMT_AUDIO_SAMPLE_SEND, mask_sh),\ 73 + SE_SF(AFMT0_AFMT_MEM_PWR, AFMT_MEM_PWR_FORCE, mask_sh),\ 74 + SE_SF(AFMT0_AFMT_MEM_PWR, AFMT_MEM_PWR_DIS, mask_sh),\ 75 + SE_SF(AFMT0_AFMT_MEM_PWR, AFMT_MEM_PWR_STATE, mask_sh) 76 + 77 + #define AFMT_DCN31_REG_FIELD_LIST(type) \ 78 + type AFMT_AUDIO_INFO_UPDATE;\ 79 + type AFMT_AUDIO_SRC_SELECT;\ 80 + type AFMT_AUDIO_CHANNEL_ENABLE;\ 81 + type AFMT_60958_CS_UPDATE;\ 82 + type AFMT_AUDIO_LAYOUT_OVRD;\ 83 + type AFMT_60958_OSF_OVRD;\ 84 + type AFMT_60958_CS_CHANNEL_NUMBER_L;\ 85 + type AFMT_60958_CS_CLOCK_ACCURACY;\ 86 + type AFMT_60958_CS_CHANNEL_NUMBER_R;\ 87 + type AFMT_60958_CS_CHANNEL_NUMBER_2;\ 88 + type AFMT_60958_CS_CHANNEL_NUMBER_3;\ 89 + type AFMT_60958_CS_CHANNEL_NUMBER_4;\ 90 + type AFMT_60958_CS_CHANNEL_NUMBER_5;\ 91 + type AFMT_60958_CS_CHANNEL_NUMBER_6;\ 92 + type AFMT_60958_CS_CHANNEL_NUMBER_7;\ 93 + type AFMT_AUDIO_SAMPLE_SEND;\ 94 + type AFMT_MEM_PWR_FORCE;\ 95 + type AFMT_MEM_PWR_DIS;\ 96 + type AFMT_MEM_PWR_STATE 97 + 98 + struct dcn31_afmt_shift { 99 + AFMT_DCN31_REG_FIELD_LIST(uint8_t); 100 + }; 101 + 102 + struct dcn31_afmt_mask { 103 + AFMT_DCN31_REG_FIELD_LIST(uint32_t); 104 + }; 105 + 106 + struct dcn31_afmt { 107 + struct afmt base; 108 + const struct dcn31_afmt_registers *regs; 109 + const struct dcn31_afmt_shift *afmt_shift; 110 + const struct dcn31_afmt_mask *afmt_mask; 111 + }; 112 + 113 + void afmt31_poweron( 114 + struct afmt *afmt); 115 + 116 + void afmt31_powerdown( 117 + struct afmt *afmt); 118 + 119 + void afmt31_construct(struct dcn31_afmt *afmt31, 120 + struct dc_context *ctx, 121 + uint32_t inst, 122 + const struct dcn31_afmt_registers *afmt_regs, 123 + const struct dcn31_afmt_shift *afmt_shift, 124 + const struct dcn31_afmt_mask *afmt_mask); 125 + 126 + #endif
+30 -20
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c
··· 56 56 #include "dcn31/dcn31_hpo_dp_link_encoder.h" 57 57 #include "dcn31/dcn31_apg.h" 58 58 #include "dcn31/dcn31_dio_link_encoder.h" 59 + #include "dcn31/dcn31_vpg.h" 60 + #include "dcn31/dcn31_afmt.h" 59 61 #include "dce/dce_clock_source.h" 60 62 #include "dce/dce_audio.h" 61 63 #include "dce/dce_hwseq.h" ··· 416 414 417 415 #define vpg_regs(id)\ 418 416 [id] = {\ 419 - VPG_DCN3_REG_LIST(id)\ 417 + VPG_DCN31_REG_LIST(id)\ 420 418 } 421 419 422 - static const struct dcn30_vpg_registers vpg_regs[] = { 420 + static const struct dcn31_vpg_registers vpg_regs[] = { 423 421 vpg_regs(0), 424 422 vpg_regs(1), 425 423 vpg_regs(2), ··· 432 430 vpg_regs(9), 433 431 }; 434 432 435 - static const struct dcn30_vpg_shift vpg_shift = { 436 - DCN3_VPG_MASK_SH_LIST(__SHIFT) 433 + static const struct dcn31_vpg_shift vpg_shift = { 434 + DCN31_VPG_MASK_SH_LIST(__SHIFT) 437 435 }; 438 436 439 - static const struct dcn30_vpg_mask vpg_mask = { 440 - DCN3_VPG_MASK_SH_LIST(_MASK) 437 + static const struct dcn31_vpg_mask vpg_mask = { 438 + DCN31_VPG_MASK_SH_LIST(_MASK) 441 439 }; 442 440 443 441 #define afmt_regs(id)\ 444 442 [id] = {\ 445 - AFMT_DCN3_REG_LIST(id)\ 443 + AFMT_DCN31_REG_LIST(id)\ 446 444 } 447 445 448 - static const struct dcn30_afmt_registers afmt_regs[] = { 446 + static const struct dcn31_afmt_registers afmt_regs[] = { 449 447 afmt_regs(0), 450 448 afmt_regs(1), 451 449 afmt_regs(2), ··· 454 452 afmt_regs(5) 455 453 }; 456 454 457 - static const struct dcn30_afmt_shift afmt_shift = { 458 - DCN3_AFMT_MASK_SH_LIST(__SHIFT) 455 + static const struct dcn31_afmt_shift afmt_shift = { 456 + DCN31_AFMT_MASK_SH_LIST(__SHIFT) 459 457 }; 460 458 461 - static const struct dcn30_afmt_mask afmt_mask = { 462 - DCN3_AFMT_MASK_SH_LIST(_MASK) 459 + static const struct dcn31_afmt_mask afmt_mask = { 460 + DCN31_AFMT_MASK_SH_LIST(_MASK) 463 461 }; 464 462 465 463 #define apg_regs(id)\ ··· 1016 1014 .cm = false, 1017 1015 .mpc = false, 1018 1016 .optc = false, 1017 + .vpg = false, 1018 + .afmt = false, 1019 1019 } 1020 1020 }, 1021 1021 .optimize_edp_link_rate = true, ··· 1302 1298 struct dc_context *ctx, 1303 1299 uint32_t inst) 1304 1300 { 1305 - struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL); 1301 + struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL); 1306 1302 1307 - if (!vpg3) 1303 + if (!vpg31) 1308 1304 return NULL; 1309 1305 1310 - vpg3_construct(vpg3, ctx, inst, 1306 + vpg31_construct(vpg31, ctx, inst, 1311 1307 &vpg_regs[inst], 1312 1308 &vpg_shift, 1313 1309 &vpg_mask); 1314 1310 1315 - return &vpg3->base; 1311 + // Will re-enable hw block when we enable stream 1312 + // Check for enabled stream before powering down? 1313 + vpg31_powerdown(&vpg31->base); 1314 + 1315 + return &vpg31->base; 1316 1316 } 1317 1317 1318 1318 static struct afmt *dcn31_afmt_create( 1319 1319 struct dc_context *ctx, 1320 1320 uint32_t inst) 1321 1321 { 1322 - struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL); 1322 + struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL); 1323 1323 1324 - if (!afmt3) 1324 + if (!afmt31) 1325 1325 return NULL; 1326 1326 1327 - afmt3_construct(afmt3, ctx, inst, 1327 + afmt31_construct(afmt31, ctx, inst, 1328 1328 &afmt_regs[inst], 1329 1329 &afmt_shift, 1330 1330 &afmt_mask); 1331 1331 1332 - return &afmt3->base; 1332 + // Light sleep by default, no need to power down here 1333 + 1334 + return &afmt31->base; 1333 1335 } 1334 1336 1335 1337 static struct apg *dcn31_apg_create(
+87
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_vpg.c
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: AMD 23 + * 24 + */ 25 + 26 + #include "dc_bios_types.h" 27 + #include "dcn30/dcn30_vpg.h" 28 + #include "dcn31_vpg.h" 29 + #include "reg_helper.h" 30 + #include "dc/dc.h" 31 + 32 + #define DC_LOGGER \ 33 + vpg31->base.ctx->logger 34 + 35 + #define REG(reg)\ 36 + (vpg31->regs->reg) 37 + 38 + #undef FN 39 + #define FN(reg_name, field_name) \ 40 + vpg31->vpg_shift->field_name, vpg31->vpg_mask->field_name 41 + 42 + 43 + #define CTX \ 44 + vpg31->base.ctx 45 + 46 + static struct vpg_funcs dcn31_vpg_funcs = { 47 + .update_generic_info_packet = vpg3_update_generic_info_packet, 48 + .vpg_poweron = vpg31_poweron, 49 + .vpg_powerdown = vpg31_powerdown, 50 + }; 51 + 52 + void vpg31_powerdown(struct vpg *vpg) 53 + { 54 + struct dcn31_vpg *vpg31 = DCN31_VPG_FROM_VPG(vpg); 55 + 56 + if (vpg->ctx->dc->debug.enable_mem_low_power.bits.vpg == false) 57 + return; 58 + 59 + REG_UPDATE_2(VPG_MEM_PWR, VPG_GSP_MEM_LIGHT_SLEEP_DIS, 0, VPG_GSP_LIGHT_SLEEP_FORCE, 1); 60 + } 61 + 62 + void vpg31_poweron(struct vpg *vpg) 63 + { 64 + struct dcn31_vpg *vpg31 = DCN31_VPG_FROM_VPG(vpg); 65 + 66 + if (vpg->ctx->dc->debug.enable_mem_low_power.bits.vpg == false) 67 + return; 68 + 69 + REG_UPDATE_2(VPG_MEM_PWR, VPG_GSP_MEM_LIGHT_SLEEP_DIS, 1, VPG_GSP_LIGHT_SLEEP_FORCE, 0); 70 + } 71 + 72 + void vpg31_construct(struct dcn31_vpg *vpg31, 73 + struct dc_context *ctx, 74 + uint32_t inst, 75 + const struct dcn31_vpg_registers *vpg_regs, 76 + const struct dcn31_vpg_shift *vpg_shift, 77 + const struct dcn31_vpg_mask *vpg_mask) 78 + { 79 + vpg31->base.ctx = ctx; 80 + 81 + vpg31->base.inst = inst; 82 + vpg31->base.funcs = &dcn31_vpg_funcs; 83 + 84 + vpg31->regs = vpg_regs; 85 + vpg31->vpg_shift = vpg_shift; 86 + vpg31->vpg_mask = vpg_mask; 87 + }
+162
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_vpg.h
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: AMD 23 + * 24 + */ 25 + 26 + #ifndef __DAL_DCN31_VPG_H__ 27 + #define __DAL_DCN31_VPG_H__ 28 + 29 + 30 + #define DCN31_VPG_FROM_VPG(vpg)\ 31 + container_of(vpg, struct dcn31_vpg, base) 32 + 33 + #define VPG_DCN31_REG_LIST(id) \ 34 + SRI(VPG_GENERIC_STATUS, VPG, id), \ 35 + SRI(VPG_GENERIC_PACKET_ACCESS_CTRL, VPG, id), \ 36 + SRI(VPG_GENERIC_PACKET_DATA, VPG, id), \ 37 + SRI(VPG_GSP_FRAME_UPDATE_CTRL, VPG, id), \ 38 + SRI(VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG, id), \ 39 + SRI(VPG_MEM_PWR, VPG, id) 40 + 41 + struct dcn31_vpg_registers { 42 + uint32_t VPG_GENERIC_STATUS; 43 + uint32_t VPG_GENERIC_PACKET_ACCESS_CTRL; 44 + uint32_t VPG_GENERIC_PACKET_DATA; 45 + uint32_t VPG_GSP_FRAME_UPDATE_CTRL; 46 + uint32_t VPG_GSP_IMMEDIATE_UPDATE_CTRL; 47 + uint32_t VPG_MEM_PWR; 48 + }; 49 + 50 + #define DCN31_VPG_MASK_SH_LIST(mask_sh)\ 51 + SE_SF(VPG0_VPG_GENERIC_STATUS, VPG_GENERIC_CONFLICT_OCCURED, mask_sh),\ 52 + SE_SF(VPG0_VPG_GENERIC_STATUS, VPG_GENERIC_CONFLICT_CLR, mask_sh),\ 53 + SE_SF(VPG0_VPG_GENERIC_PACKET_ACCESS_CTRL, VPG_GENERIC_DATA_INDEX, mask_sh),\ 54 + SE_SF(VPG0_VPG_GENERIC_PACKET_DATA, VPG_GENERIC_DATA_BYTE0, mask_sh),\ 55 + SE_SF(VPG0_VPG_GENERIC_PACKET_DATA, VPG_GENERIC_DATA_BYTE1, mask_sh),\ 56 + SE_SF(VPG0_VPG_GENERIC_PACKET_DATA, VPG_GENERIC_DATA_BYTE2, mask_sh),\ 57 + SE_SF(VPG0_VPG_GENERIC_PACKET_DATA, VPG_GENERIC_DATA_BYTE3, mask_sh),\ 58 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC0_FRAME_UPDATE, mask_sh),\ 59 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC1_FRAME_UPDATE, mask_sh),\ 60 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC2_FRAME_UPDATE, mask_sh),\ 61 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC3_FRAME_UPDATE, mask_sh),\ 62 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC4_FRAME_UPDATE, mask_sh),\ 63 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC5_FRAME_UPDATE, mask_sh),\ 64 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC6_FRAME_UPDATE, mask_sh),\ 65 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC7_FRAME_UPDATE, mask_sh),\ 66 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC8_FRAME_UPDATE, mask_sh),\ 67 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC9_FRAME_UPDATE, mask_sh),\ 68 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC10_FRAME_UPDATE, mask_sh),\ 69 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC11_FRAME_UPDATE, mask_sh),\ 70 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC12_FRAME_UPDATE, mask_sh),\ 71 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC13_FRAME_UPDATE, mask_sh),\ 72 + SE_SF(VPG0_VPG_GSP_FRAME_UPDATE_CTRL, VPG_GENERIC14_FRAME_UPDATE, mask_sh),\ 73 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC0_IMMEDIATE_UPDATE, mask_sh),\ 74 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC1_IMMEDIATE_UPDATE, mask_sh),\ 75 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC2_IMMEDIATE_UPDATE, mask_sh),\ 76 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC3_IMMEDIATE_UPDATE, mask_sh),\ 77 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC4_IMMEDIATE_UPDATE, mask_sh),\ 78 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC5_IMMEDIATE_UPDATE, mask_sh),\ 79 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC6_IMMEDIATE_UPDATE, mask_sh),\ 80 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC7_IMMEDIATE_UPDATE, mask_sh),\ 81 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC8_IMMEDIATE_UPDATE, mask_sh),\ 82 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC9_IMMEDIATE_UPDATE, mask_sh),\ 83 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC10_IMMEDIATE_UPDATE, mask_sh),\ 84 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC11_IMMEDIATE_UPDATE, mask_sh),\ 85 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC12_IMMEDIATE_UPDATE, mask_sh),\ 86 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC13_IMMEDIATE_UPDATE, mask_sh),\ 87 + SE_SF(VPG0_VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG_GENERIC14_IMMEDIATE_UPDATE, mask_sh),\ 88 + SE_SF(VPG0_VPG_MEM_PWR, VPG_GSP_MEM_LIGHT_SLEEP_DIS, mask_sh),\ 89 + SE_SF(VPG0_VPG_MEM_PWR, VPG_GSP_LIGHT_SLEEP_FORCE, mask_sh),\ 90 + SE_SF(VPG0_VPG_MEM_PWR, VPG_GSP_MEM_PWR_STATE, mask_sh) 91 + 92 + #define VPG_DCN31_REG_FIELD_LIST(type) \ 93 + type VPG_GENERIC_CONFLICT_OCCURED;\ 94 + type VPG_GENERIC_CONFLICT_CLR;\ 95 + type VPG_GENERIC_DATA_INDEX;\ 96 + type VPG_GENERIC_DATA_BYTE0;\ 97 + type VPG_GENERIC_DATA_BYTE1;\ 98 + type VPG_GENERIC_DATA_BYTE2;\ 99 + type VPG_GENERIC_DATA_BYTE3;\ 100 + type VPG_GENERIC0_FRAME_UPDATE;\ 101 + type VPG_GENERIC1_FRAME_UPDATE;\ 102 + type VPG_GENERIC2_FRAME_UPDATE;\ 103 + type VPG_GENERIC3_FRAME_UPDATE;\ 104 + type VPG_GENERIC4_FRAME_UPDATE;\ 105 + type VPG_GENERIC5_FRAME_UPDATE;\ 106 + type VPG_GENERIC6_FRAME_UPDATE;\ 107 + type VPG_GENERIC7_FRAME_UPDATE;\ 108 + type VPG_GENERIC8_FRAME_UPDATE;\ 109 + type VPG_GENERIC9_FRAME_UPDATE;\ 110 + type VPG_GENERIC10_FRAME_UPDATE;\ 111 + type VPG_GENERIC11_FRAME_UPDATE;\ 112 + type VPG_GENERIC12_FRAME_UPDATE;\ 113 + type VPG_GENERIC13_FRAME_UPDATE;\ 114 + type VPG_GENERIC14_FRAME_UPDATE;\ 115 + type VPG_GENERIC0_IMMEDIATE_UPDATE;\ 116 + type VPG_GENERIC1_IMMEDIATE_UPDATE;\ 117 + type VPG_GENERIC2_IMMEDIATE_UPDATE;\ 118 + type VPG_GENERIC3_IMMEDIATE_UPDATE;\ 119 + type VPG_GENERIC4_IMMEDIATE_UPDATE;\ 120 + type VPG_GENERIC5_IMMEDIATE_UPDATE;\ 121 + type VPG_GENERIC6_IMMEDIATE_UPDATE;\ 122 + type VPG_GENERIC7_IMMEDIATE_UPDATE;\ 123 + type VPG_GENERIC8_IMMEDIATE_UPDATE;\ 124 + type VPG_GENERIC9_IMMEDIATE_UPDATE;\ 125 + type VPG_GENERIC10_IMMEDIATE_UPDATE;\ 126 + type VPG_GENERIC11_IMMEDIATE_UPDATE;\ 127 + type VPG_GENERIC12_IMMEDIATE_UPDATE;\ 128 + type VPG_GENERIC13_IMMEDIATE_UPDATE;\ 129 + type VPG_GENERIC14_IMMEDIATE_UPDATE;\ 130 + type VPG_GSP_MEM_LIGHT_SLEEP_DIS;\ 131 + type VPG_GSP_LIGHT_SLEEP_FORCE;\ 132 + type VPG_GSP_MEM_PWR_STATE 133 + 134 + struct dcn31_vpg_shift { 135 + VPG_DCN31_REG_FIELD_LIST(uint8_t); 136 + }; 137 + 138 + struct dcn31_vpg_mask { 139 + VPG_DCN31_REG_FIELD_LIST(uint32_t); 140 + }; 141 + 142 + struct dcn31_vpg { 143 + struct vpg base; 144 + const struct dcn31_vpg_registers *regs; 145 + const struct dcn31_vpg_shift *vpg_shift; 146 + const struct dcn31_vpg_mask *vpg_mask; 147 + }; 148 + 149 + void vpg31_poweron( 150 + struct vpg *vpg); 151 + 152 + void vpg31_powerdown( 153 + struct vpg *vpg); 154 + 155 + void vpg31_construct(struct dcn31_vpg *vpg31, 156 + struct dc_context *ctx, 157 + uint32_t inst, 158 + const struct dcn31_vpg_registers *vpg_regs, 159 + const struct dcn31_vpg_shift *vpg_shift, 160 + const struct dcn31_vpg_mask *vpg_mask); 161 + 162 + #endif