1/* SPDX-License-Identifier: MIT */ 2/* 3 * Copyright 2023 Advanced Micro Devices, Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: AMD 24 * 25 */ 26 27#ifndef _DCN35_PG_CNTL_H_ 28#define _DCN35_PG_CNTL_H_ 29 30#include "pg_cntl.h" 31 32#define PG_CNTL_REG_LIST_DCN35()\ 33 SR(DOMAIN0_PG_CONFIG), \ 34 SR(DOMAIN1_PG_CONFIG), \ 35 SR(DOMAIN2_PG_CONFIG), \ 36 SR(DOMAIN3_PG_CONFIG), \ 37 SR(DOMAIN16_PG_CONFIG), \ 38 SR(DOMAIN17_PG_CONFIG), \ 39 SR(DOMAIN18_PG_CONFIG), \ 40 SR(DOMAIN19_PG_CONFIG), \ 41 SR(DOMAIN22_PG_CONFIG), \ 42 SR(DOMAIN23_PG_CONFIG), \ 43 SR(DOMAIN24_PG_CONFIG), \ 44 SR(DOMAIN25_PG_CONFIG), \ 45 SR(DOMAIN0_PG_STATUS), \ 46 SR(DOMAIN1_PG_STATUS), \ 47 SR(DOMAIN2_PG_STATUS), \ 48 SR(DOMAIN3_PG_STATUS), \ 49 SR(DOMAIN16_PG_STATUS), \ 50 SR(DOMAIN17_PG_STATUS), \ 51 SR(DOMAIN18_PG_STATUS), \ 52 SR(DOMAIN19_PG_STATUS), \ 53 SR(DOMAIN22_PG_STATUS), \ 54 SR(DOMAIN23_PG_STATUS), \ 55 SR(DOMAIN24_PG_STATUS), \ 56 SR(DOMAIN25_PG_STATUS), \ 57 SR(DC_IP_REQUEST_CNTL) 58 59#define PG_CNTL_SF(reg_name, field_name, post_fix)\ 60 .field_name = reg_name ## __ ## field_name ## post_fix 61 62#define PG_CNTL_MASK_SH_LIST_DCN35(mask_sh) \ 63 PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 64 PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 65 PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 66 PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 67 PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 68 PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 69 PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 70 PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 71 PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 72 PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 73 PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 74 PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 75 PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 76 PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 77 PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 78 PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 79 PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 80 PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 81 PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 82 PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 83 PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 84 PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 85 PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \ 86 PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \ 87 PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 88 PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 89 PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 90 PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 91 PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 92 PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 93 PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 94 PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 95 PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 96 PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 97 PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 98 PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 99 PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 100 PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 101 PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 102 PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 103 PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 104 PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 105 PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 106 PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 107 PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 108 PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 109 PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \ 110 PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \ 111 PG_CNTL_SF(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh) 112 113#define PG_CNTL_REG_FIELD_LIST(type) \ 114 type IPS2;\ 115 type IPS1;\ 116 type IPS0;\ 117 type IPS0_All 118 119#define PG_CNTL_DCN35_REG_FIELD_LIST(type) \ 120 type IP_REQUEST_EN; \ 121 type DOMAIN_POWER_FORCEON; \ 122 type DOMAIN_POWER_GATE; \ 123 type DOMAIN_DESIRED_PWR_STATE; \ 124 type DOMAIN_PGFSM_PWR_STATUS 125 126struct pg_cntl_shift { 127 PG_CNTL_REG_FIELD_LIST(uint8_t); 128 PG_CNTL_DCN35_REG_FIELD_LIST(uint8_t); 129}; 130 131struct pg_cntl_mask { 132 PG_CNTL_REG_FIELD_LIST(uint32_t); 133 PG_CNTL_DCN35_REG_FIELD_LIST(uint32_t); 134}; 135 136struct pg_cntl_registers { 137 uint32_t LONO_STATE; 138 uint32_t DC_IP_REQUEST_CNTL; 139 uint32_t DOMAIN0_PG_CONFIG; 140 uint32_t DOMAIN1_PG_CONFIG; 141 uint32_t DOMAIN2_PG_CONFIG; 142 uint32_t DOMAIN3_PG_CONFIG; 143 uint32_t DOMAIN16_PG_CONFIG; 144 uint32_t DOMAIN17_PG_CONFIG; 145 uint32_t DOMAIN18_PG_CONFIG; 146 uint32_t DOMAIN19_PG_CONFIG; 147 uint32_t DOMAIN22_PG_CONFIG; 148 uint32_t DOMAIN23_PG_CONFIG; 149 uint32_t DOMAIN24_PG_CONFIG; 150 uint32_t DOMAIN25_PG_CONFIG; 151 uint32_t DOMAIN0_PG_STATUS; 152 uint32_t DOMAIN1_PG_STATUS; 153 uint32_t DOMAIN2_PG_STATUS; 154 uint32_t DOMAIN3_PG_STATUS; 155 uint32_t DOMAIN16_PG_STATUS; 156 uint32_t DOMAIN17_PG_STATUS; 157 uint32_t DOMAIN18_PG_STATUS; 158 uint32_t DOMAIN19_PG_STATUS; 159 uint32_t DOMAIN22_PG_STATUS; 160 uint32_t DOMAIN23_PG_STATUS; 161 uint32_t DOMAIN24_PG_STATUS; 162 uint32_t DOMAIN25_PG_STATUS; 163}; 164 165struct dcn_pg_cntl { 166 struct pg_cntl base; 167 const struct pg_cntl_registers *regs; 168 const struct pg_cntl_shift *pg_cntl_shift; 169 const struct pg_cntl_mask *pg_cntl_mask; 170}; 171 172void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on); 173void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl, 174 unsigned int hubp_dpp_inst, bool power_on); 175void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on); 176void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on); 177void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on); 178void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl, 179 unsigned int mpcc_inst, bool power_on); 180void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl, 181 unsigned int opp_inst, bool power_on); 182void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl, 183 unsigned int optc_inst, bool power_on); 184void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on); 185void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl); 186 187struct pg_cntl *pg_cntl35_create( 188 struct dc_context *ctx, 189 const struct pg_cntl_registers *regs, 190 const struct pg_cntl_shift *pg_cntl_shift, 191 const struct pg_cntl_mask *pg_cntl_mask); 192 193void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl); 194 195#endif /* DCN35_PG_CNTL */ 196