1*b843c749SSergey Zigachev /* 2*b843c749SSergey Zigachev * Copyright 2016 Advanced Micro Devices, Inc. 3*b843c749SSergey Zigachev * 4*b843c749SSergey Zigachev * Permission is hereby granted, free of charge, to any person obtaining a 5*b843c749SSergey Zigachev * copy of this software and associated documentation files (the "Software"), 6*b843c749SSergey Zigachev * to deal in the Software without restriction, including without limitation 7*b843c749SSergey Zigachev * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*b843c749SSergey Zigachev * and/or sell copies of the Software, and to permit persons to whom the 9*b843c749SSergey Zigachev * Software is furnished to do so, subject to the following conditions: 10*b843c749SSergey Zigachev * 11*b843c749SSergey Zigachev * The above copyright notice and this permission notice shall be included in 12*b843c749SSergey Zigachev * all copies or substantial portions of the Software. 13*b843c749SSergey Zigachev * 14*b843c749SSergey Zigachev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*b843c749SSergey Zigachev * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*b843c749SSergey Zigachev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*b843c749SSergey Zigachev * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*b843c749SSergey Zigachev * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*b843c749SSergey Zigachev * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*b843c749SSergey Zigachev * OTHER DEALINGS IN THE SOFTWARE. 21*b843c749SSergey Zigachev * 22*b843c749SSergey Zigachev * Authors: AMD 23*b843c749SSergey Zigachev * 24*b843c749SSergey Zigachev */ 25*b843c749SSergey Zigachev 26*b843c749SSergey Zigachev #ifndef __DC_HUBBUB_DCN10_H__ 27*b843c749SSergey Zigachev #define __DC_HUBBUB_DCN10_H__ 28*b843c749SSergey Zigachev 29*b843c749SSergey Zigachev #include "core_types.h" 30*b843c749SSergey Zigachev #include "dchubbub.h" 31*b843c749SSergey Zigachev 32*b843c749SSergey Zigachev #define HUBHUB_REG_LIST_DCN()\ 33*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),\ 34*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A),\ 35*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A),\ 36*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B),\ 37*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B),\ 38*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B),\ 39*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C),\ 40*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C),\ 41*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C),\ 42*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D),\ 43*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D),\ 44*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D),\ 45*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL),\ 46*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_DRAM_STATE_CNTL),\ 47*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_SAT_LEVEL),\ 48*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_DF_REQ_OUTSTAND),\ 49*b843c749SSergey Zigachev SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \ 50*b843c749SSergey Zigachev SR(DCHUBBUB_TEST_DEBUG_INDEX), \ 51*b843c749SSergey Zigachev SR(DCHUBBUB_TEST_DEBUG_DATA),\ 52*b843c749SSergey Zigachev SR(DCHUBBUB_SOFT_RESET) 53*b843c749SSergey Zigachev 54*b843c749SSergey Zigachev #define HUBBUB_SR_WATERMARK_REG_LIST()\ 55*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A),\ 56*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A),\ 57*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B),\ 58*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B),\ 59*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C),\ 60*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C),\ 61*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D),\ 62*b843c749SSergey Zigachev SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D) 63*b843c749SSergey Zigachev 64*b843c749SSergey Zigachev #define HUBBUB_REG_LIST_DCN10(id)\ 65*b843c749SSergey Zigachev HUBHUB_REG_LIST_DCN(), \ 66*b843c749SSergey Zigachev HUBBUB_SR_WATERMARK_REG_LIST(), \ 67*b843c749SSergey Zigachev SR(DCHUBBUB_SDPIF_FB_TOP),\ 68*b843c749SSergey Zigachev SR(DCHUBBUB_SDPIF_FB_BASE),\ 69*b843c749SSergey Zigachev SR(DCHUBBUB_SDPIF_FB_OFFSET),\ 70*b843c749SSergey Zigachev SR(DCHUBBUB_SDPIF_AGP_BASE),\ 71*b843c749SSergey Zigachev SR(DCHUBBUB_SDPIF_AGP_BOT),\ 72*b843c749SSergey Zigachev SR(DCHUBBUB_SDPIF_AGP_TOP) 73*b843c749SSergey Zigachev 74*b843c749SSergey Zigachev struct dcn_hubbub_registers { 75*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A; 76*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A; 77*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A; 78*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A; 79*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A; 80*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B; 81*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B; 82*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B; 83*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B; 84*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B; 85*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C; 86*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C; 87*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C; 88*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C; 89*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C; 90*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D; 91*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D; 92*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D; 93*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D; 94*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D; 95*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL; 96*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_SAT_LEVEL; 97*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_DF_REQ_OUTSTAND; 98*b843c749SSergey Zigachev uint32_t DCHUBBUB_GLOBAL_TIMER_CNTL; 99*b843c749SSergey Zigachev uint32_t DCHUBBUB_ARB_DRAM_STATE_CNTL; 100*b843c749SSergey Zigachev uint32_t DCHUBBUB_TEST_DEBUG_INDEX; 101*b843c749SSergey Zigachev uint32_t DCHUBBUB_TEST_DEBUG_DATA; 102*b843c749SSergey Zigachev uint32_t DCHUBBUB_SDPIF_FB_TOP; 103*b843c749SSergey Zigachev uint32_t DCHUBBUB_SDPIF_FB_BASE; 104*b843c749SSergey Zigachev uint32_t DCHUBBUB_SDPIF_FB_OFFSET; 105*b843c749SSergey Zigachev uint32_t DCHUBBUB_SDPIF_AGP_BASE; 106*b843c749SSergey Zigachev uint32_t DCHUBBUB_SDPIF_AGP_BOT; 107*b843c749SSergey Zigachev uint32_t DCHUBBUB_SDPIF_AGP_TOP; 108*b843c749SSergey Zigachev uint32_t DCHUBBUB_CRC_CTRL; 109*b843c749SSergey Zigachev uint32_t DCHUBBUB_SOFT_RESET; 110*b843c749SSergey Zigachev }; 111*b843c749SSergey Zigachev 112*b843c749SSergey Zigachev /* set field name */ 113*b843c749SSergey Zigachev #define HUBBUB_SF(reg_name, field_name, post_fix)\ 114*b843c749SSergey Zigachev .field_name = reg_name ## __ ## field_name ## post_fix 115*b843c749SSergey Zigachev 116*b843c749SSergey Zigachev 117*b843c749SSergey Zigachev #define HUBBUB_MASK_SH_LIST_DCN(mask_sh)\ 118*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, mask_sh), \ 119*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SOFT_RESET, DCHUBBUB_GLOBAL_SOFT_RESET, mask_sh), \ 120*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, mask_sh), \ 121*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE, mask_sh), \ 122*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, mask_sh), \ 123*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, mask_sh), \ 124*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, mask_sh), \ 125*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, mask_sh), \ 126*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_SAT_LEVEL, DCHUBBUB_ARB_SAT_LEVEL, mask_sh), \ 127*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_ARB_DF_REQ_OUTSTAND, DCHUBBUB_ARB_MIN_REQ_OUTSTAND, mask_sh) 128*b843c749SSergey Zigachev 129*b843c749SSergey Zigachev #define HUBBUB_MASK_SH_LIST_DCN10(mask_sh)\ 130*b843c749SSergey Zigachev HUBBUB_MASK_SH_LIST_DCN(mask_sh), \ 131*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SDPIF_FB_TOP, SDPIF_FB_TOP, mask_sh), \ 132*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, mask_sh), \ 133*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, mask_sh), \ 134*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SDPIF_AGP_BASE, SDPIF_AGP_BASE, mask_sh), \ 135*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SDPIF_AGP_BOT, SDPIF_AGP_BOT, mask_sh), \ 136*b843c749SSergey Zigachev HUBBUB_SF(DCHUBBUB_SDPIF_AGP_TOP, SDPIF_AGP_TOP, mask_sh) 137*b843c749SSergey Zigachev 138*b843c749SSergey Zigachev #define DCN_HUBBUB_REG_FIELD_LIST(type) \ 139*b843c749SSergey Zigachev type DCHUBBUB_GLOBAL_TIMER_ENABLE; \ 140*b843c749SSergey Zigachev type DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST;\ 141*b843c749SSergey Zigachev type DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE;\ 142*b843c749SSergey Zigachev type DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE;\ 143*b843c749SSergey Zigachev type DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE;\ 144*b843c749SSergey Zigachev type DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE;\ 145*b843c749SSergey Zigachev type DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE;\ 146*b843c749SSergey Zigachev type DCHUBBUB_ARB_SAT_LEVEL;\ 147*b843c749SSergey Zigachev type DCHUBBUB_ARB_MIN_REQ_OUTSTAND;\ 148*b843c749SSergey Zigachev type DCHUBBUB_GLOBAL_TIMER_REFDIV;\ 149*b843c749SSergey Zigachev type DCHUBBUB_GLOBAL_SOFT_RESET; \ 150*b843c749SSergey Zigachev type SDPIF_FB_TOP;\ 151*b843c749SSergey Zigachev type SDPIF_FB_BASE;\ 152*b843c749SSergey Zigachev type SDPIF_FB_OFFSET;\ 153*b843c749SSergey Zigachev type SDPIF_AGP_BASE;\ 154*b843c749SSergey Zigachev type SDPIF_AGP_BOT;\ 155*b843c749SSergey Zigachev type SDPIF_AGP_TOP 156*b843c749SSergey Zigachev 157*b843c749SSergey Zigachev 158*b843c749SSergey Zigachev struct dcn_hubbub_shift { 159*b843c749SSergey Zigachev DCN_HUBBUB_REG_FIELD_LIST(uint8_t); 160*b843c749SSergey Zigachev }; 161*b843c749SSergey Zigachev 162*b843c749SSergey Zigachev struct dcn_hubbub_mask { 163*b843c749SSergey Zigachev DCN_HUBBUB_REG_FIELD_LIST(uint32_t); 164*b843c749SSergey Zigachev }; 165*b843c749SSergey Zigachev 166*b843c749SSergey Zigachev struct dc; 167*b843c749SSergey Zigachev 168*b843c749SSergey Zigachev struct dcn_hubbub_wm_set { 169*b843c749SSergey Zigachev uint32_t wm_set; 170*b843c749SSergey Zigachev uint32_t data_urgent; 171*b843c749SSergey Zigachev uint32_t pte_meta_urgent; 172*b843c749SSergey Zigachev uint32_t sr_enter; 173*b843c749SSergey Zigachev uint32_t sr_exit; 174*b843c749SSergey Zigachev uint32_t dram_clk_chanage; 175*b843c749SSergey Zigachev }; 176*b843c749SSergey Zigachev 177*b843c749SSergey Zigachev struct dcn_hubbub_wm { 178*b843c749SSergey Zigachev struct dcn_hubbub_wm_set sets[4]; 179*b843c749SSergey Zigachev }; 180*b843c749SSergey Zigachev 181*b843c749SSergey Zigachev struct hubbub { 182*b843c749SSergey Zigachev const struct hubbub_funcs *funcs; 183*b843c749SSergey Zigachev struct dc_context *ctx; 184*b843c749SSergey Zigachev const struct dcn_hubbub_registers *regs; 185*b843c749SSergey Zigachev const struct dcn_hubbub_shift *shifts; 186*b843c749SSergey Zigachev const struct dcn_hubbub_mask *masks; 187*b843c749SSergey Zigachev unsigned int debug_test_index_pstate; 188*b843c749SSergey Zigachev struct dcn_watermark_set watermarks; 189*b843c749SSergey Zigachev }; 190*b843c749SSergey Zigachev 191*b843c749SSergey Zigachev void hubbub1_update_dchub( 192*b843c749SSergey Zigachev struct hubbub *hubbub, 193*b843c749SSergey Zigachev struct dchub_init_data *dh_data); 194*b843c749SSergey Zigachev 195*b843c749SSergey Zigachev bool hubbub1_verify_allow_pstate_change_high( 196*b843c749SSergey Zigachev struct hubbub *hubbub); 197*b843c749SSergey Zigachev 198*b843c749SSergey Zigachev void hubbub1_wm_change_req_wa(struct hubbub *hubbub); 199*b843c749SSergey Zigachev 200*b843c749SSergey Zigachev void hubbub1_program_watermarks( 201*b843c749SSergey Zigachev struct hubbub *hubbub, 202*b843c749SSergey Zigachev struct dcn_watermark_set *watermarks, 203*b843c749SSergey Zigachev unsigned int refclk_mhz, 204*b843c749SSergey Zigachev bool safe_to_lower); 205*b843c749SSergey Zigachev 206*b843c749SSergey Zigachev void hubbub1_toggle_watermark_change_req( 207*b843c749SSergey Zigachev struct hubbub *hubbub); 208*b843c749SSergey Zigachev 209*b843c749SSergey Zigachev void hubbub1_wm_read_state(struct hubbub *hubbub, 210*b843c749SSergey Zigachev struct dcn_hubbub_wm *wm); 211*b843c749SSergey Zigachev 212*b843c749SSergey Zigachev void hubbub1_soft_reset(struct hubbub *hubbub, bool reset); 213*b843c749SSergey Zigachev void hubbub1_construct(struct hubbub *hubbub, 214*b843c749SSergey Zigachev struct dc_context *ctx, 215*b843c749SSergey Zigachev const struct dcn_hubbub_registers *hubbub_regs, 216*b843c749SSergey Zigachev const struct dcn_hubbub_shift *hubbub_shift, 217*b843c749SSergey Zigachev const struct dcn_hubbub_mask *hubbub_mask); 218*b843c749SSergey Zigachev 219*b843c749SSergey Zigachev #endif 220