1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2021, Renesas Electronics Corporation. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <stdint.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <lib/mmio.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #if RCAR_LSI == RCAR_AUTO 13*91f16700Schasinglulu #include "G2E/qos_init_g2e_v10.h" 14*91f16700Schasinglulu #include "G2H/qos_init_g2h_v30.h" 15*91f16700Schasinglulu #include "G2M/qos_init_g2m_v10.h" 16*91f16700Schasinglulu #include "G2M/qos_init_g2m_v11.h" 17*91f16700Schasinglulu #include "G2M/qos_init_g2m_v30.h" 18*91f16700Schasinglulu #include "G2N/qos_init_g2n_v10.h" 19*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO */ 20*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2M) 21*91f16700Schasinglulu #include "G2M/qos_init_g2m_v10.h" 22*91f16700Schasinglulu #include "G2M/qos_init_g2m_v11.h" 23*91f16700Schasinglulu #include "G2M/qos_init_g2m_v30.h" 24*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2M */ 25*91f16700Schasinglulu #if RCAR_LSI == RZ_G2H 26*91f16700Schasinglulu #include "G2H/qos_init_g2h_v30.h" 27*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2H */ 28*91f16700Schasinglulu #if RCAR_LSI == RZ_G2N 29*91f16700Schasinglulu #include "G2N/qos_init_g2n_v10.h" 30*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2N */ 31*91f16700Schasinglulu #if RCAR_LSI == RZ_G2E 32*91f16700Schasinglulu #include "G2E/qos_init_g2e_v10.h" 33*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2E */ 34*91f16700Schasinglulu #include "qos_common.h" 35*91f16700Schasinglulu #include "qos_init.h" 36*91f16700Schasinglulu #include "qos_reg.h" 37*91f16700Schasinglulu #include "rcar_def.h" 38*91f16700Schasinglulu 39*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2E) 40*91f16700Schasinglulu #define DRAM_CH_CNT 0x04U 41*91f16700Schasinglulu uint32_t qos_init_ddr_ch; 42*91f16700Schasinglulu uint8_t qos_init_ddr_phyvalid; 43*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2E */ 44*91f16700Schasinglulu 45*91f16700Schasinglulu #define PRR_PRODUCT_ERR(reg) \ 46*91f16700Schasinglulu { \ 47*91f16700Schasinglulu ERROR("LSI Product ID(PRR=0x%x) QoS " \ 48*91f16700Schasinglulu "initialize not supported.\n", reg); \ 49*91f16700Schasinglulu panic(); \ 50*91f16700Schasinglulu } 51*91f16700Schasinglulu 52*91f16700Schasinglulu #define PRR_CUT_ERR(reg) \ 53*91f16700Schasinglulu { \ 54*91f16700Schasinglulu ERROR("LSI Cut ID(PRR=0x%x) QoS " \ 55*91f16700Schasinglulu "initialize not supported.\n", reg); \ 56*91f16700Schasinglulu panic(); \ 57*91f16700Schasinglulu } 58*91f16700Schasinglulu 59*91f16700Schasinglulu void rzg_qos_init(void) 60*91f16700Schasinglulu { 61*91f16700Schasinglulu uint32_t reg; 62*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2E) 63*91f16700Schasinglulu uint32_t i; 64*91f16700Schasinglulu 65*91f16700Schasinglulu qos_init_ddr_ch = 0U; 66*91f16700Schasinglulu qos_init_ddr_phyvalid = get_boardcnf_phyvalid(); 67*91f16700Schasinglulu for (i = 0U; i < DRAM_CH_CNT; i++) { 68*91f16700Schasinglulu if ((qos_init_ddr_phyvalid & (1U << i))) { 69*91f16700Schasinglulu qos_init_ddr_ch++; 70*91f16700Schasinglulu } 71*91f16700Schasinglulu } 72*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2E */ 73*91f16700Schasinglulu 74*91f16700Schasinglulu reg = mmio_read_32(PRR); 75*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 76*91f16700Schasinglulu switch (reg & PRR_PRODUCT_MASK) { 77*91f16700Schasinglulu case PRR_PRODUCT_M3: 78*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 79*91f16700Schasinglulu switch (reg & PRR_CUT_MASK) { 80*91f16700Schasinglulu case PRR_PRODUCT_10: 81*91f16700Schasinglulu qos_init_g2m_v10(); 82*91f16700Schasinglulu break; 83*91f16700Schasinglulu case PRR_PRODUCT_21: /* G2M Cut 13 */ 84*91f16700Schasinglulu qos_init_g2m_v11(); 85*91f16700Schasinglulu break; 86*91f16700Schasinglulu case PRR_PRODUCT_30: /* G2M Cut 30 */ 87*91f16700Schasinglulu default: 88*91f16700Schasinglulu qos_init_g2m_v30(); 89*91f16700Schasinglulu break; 90*91f16700Schasinglulu } 91*91f16700Schasinglulu #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 92*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 93*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 94*91f16700Schasinglulu break; 95*91f16700Schasinglulu case PRR_PRODUCT_H3: 96*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 97*91f16700Schasinglulu switch (reg & PRR_CUT_MASK) { 98*91f16700Schasinglulu case PRR_PRODUCT_30: 99*91f16700Schasinglulu default: 100*91f16700Schasinglulu qos_init_g2h_v30(); 101*91f16700Schasinglulu break; 102*91f16700Schasinglulu } 103*91f16700Schasinglulu #else 104*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 105*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 106*91f16700Schasinglulu break; 107*91f16700Schasinglulu case PRR_PRODUCT_M3N: 108*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) 109*91f16700Schasinglulu switch (reg & PRR_CUT_MASK) { 110*91f16700Schasinglulu case PRR_PRODUCT_10: 111*91f16700Schasinglulu default: 112*91f16700Schasinglulu qos_init_g2n_v10(); 113*91f16700Schasinglulu break; 114*91f16700Schasinglulu } 115*91f16700Schasinglulu #else 116*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 117*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */ 118*91f16700Schasinglulu break; 119*91f16700Schasinglulu case PRR_PRODUCT_E3: 120*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2E) 121*91f16700Schasinglulu switch (reg & PRR_CUT_MASK) { 122*91f16700Schasinglulu case PRR_PRODUCT_10: 123*91f16700Schasinglulu default: 124*91f16700Schasinglulu qos_init_g2e_v10(); 125*91f16700Schasinglulu break; 126*91f16700Schasinglulu } 127*91f16700Schasinglulu #else 128*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 129*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2E) */ 130*91f16700Schasinglulu break; 131*91f16700Schasinglulu default: 132*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 133*91f16700Schasinglulu break; 134*91f16700Schasinglulu } 135*91f16700Schasinglulu #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 136*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2M) 137*91f16700Schasinglulu #if RCAR_LSI_CUT == RCAR_CUT_10 138*91f16700Schasinglulu /* G2M Cut 10 */ 139*91f16700Schasinglulu if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10) 140*91f16700Schasinglulu != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 141*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 142*91f16700Schasinglulu } 143*91f16700Schasinglulu qos_init_g2m_v10(); 144*91f16700Schasinglulu #elif RCAR_LSI_CUT == RCAR_CUT_11 145*91f16700Schasinglulu /* G2M Cut 11 */ 146*91f16700Schasinglulu if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20) 147*91f16700Schasinglulu != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 148*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 149*91f16700Schasinglulu } 150*91f16700Schasinglulu qos_init_g2m_v11(); 151*91f16700Schasinglulu #elif RCAR_LSI_CUT == RCAR_CUT_13 152*91f16700Schasinglulu /* G2M Cut 13 */ 153*91f16700Schasinglulu if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21) 154*91f16700Schasinglulu != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 155*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 156*91f16700Schasinglulu } 157*91f16700Schasinglulu qos_init_g2m_v11(); 158*91f16700Schasinglulu #else 159*91f16700Schasinglulu /* G2M Cut 30 or later */ 160*91f16700Schasinglulu if ((PRR_PRODUCT_M3) 161*91f16700Schasinglulu != (reg & (PRR_PRODUCT_MASK))) { 162*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 163*91f16700Schasinglulu } 164*91f16700Schasinglulu qos_init_g2m_v30(); 165*91f16700Schasinglulu #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 166*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2H) 167*91f16700Schasinglulu /* G2H Cut 30 or later */ 168*91f16700Schasinglulu if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) { 169*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 170*91f16700Schasinglulu } 171*91f16700Schasinglulu qos_init_g2h_v30(); 172*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2N) 173*91f16700Schasinglulu /* G2N Cut 10 or later */ 174*91f16700Schasinglulu if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_M3N) { 175*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 176*91f16700Schasinglulu } 177*91f16700Schasinglulu qos_init_g2n_v10(); 178*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2E 179*91f16700Schasinglulu /* G2E Cut 10 or later */ 180*91f16700Schasinglulu if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_E3) { 181*91f16700Schasinglulu PRR_PRODUCT_ERR(reg); 182*91f16700Schasinglulu } 183*91f16700Schasinglulu qos_init_g2e_v10(); 184*91f16700Schasinglulu #else /* (RCAR_LSI == RZ_G2M) */ 185*91f16700Schasinglulu #error "Don't have QoS initialize routine(Unknown chip)." 186*91f16700Schasinglulu #endif /* (RCAR_LSI == RZ_G2M) */ 187*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 188*91f16700Schasinglulu } 189*91f16700Schasinglulu 190*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2E) 191*91f16700Schasinglulu uint32_t get_refperiod(void) 192*91f16700Schasinglulu { 193*91f16700Schasinglulu uint32_t refperiod = QOSWT_WTSET0_CYCLE; 194*91f16700Schasinglulu 195*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 196*91f16700Schasinglulu uint32_t reg; 197*91f16700Schasinglulu 198*91f16700Schasinglulu reg = mmio_read_32(PRR); 199*91f16700Schasinglulu switch (reg & PRR_PRODUCT_MASK) { 200*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 201*91f16700Schasinglulu case PRR_PRODUCT_M3: 202*91f16700Schasinglulu switch (reg & PRR_CUT_MASK) { 203*91f16700Schasinglulu case PRR_PRODUCT_10: 204*91f16700Schasinglulu break; 205*91f16700Schasinglulu case PRR_PRODUCT_20: /* G2M Cut 11 */ 206*91f16700Schasinglulu case PRR_PRODUCT_21: /* G2M Cut 13 */ 207*91f16700Schasinglulu case PRR_PRODUCT_30: /* G2M Cut 30 */ 208*91f16700Schasinglulu default: 209*91f16700Schasinglulu refperiod = REFPERIOD_CYCLE; 210*91f16700Schasinglulu break; 211*91f16700Schasinglulu } 212*91f16700Schasinglulu break; 213*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 214*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 215*91f16700Schasinglulu case PRR_PRODUCT_H3: 216*91f16700Schasinglulu switch (reg & PRR_CUT_MASK) { 217*91f16700Schasinglulu case PRR_PRODUCT_30: 218*91f16700Schasinglulu default: 219*91f16700Schasinglulu refperiod = REFPERIOD_CYCLE; 220*91f16700Schasinglulu break; 221*91f16700Schasinglulu } 222*91f16700Schasinglulu break; 223*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 224*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) 225*91f16700Schasinglulu case PRR_PRODUCT_M3N: 226*91f16700Schasinglulu refperiod = REFPERIOD_CYCLE; 227*91f16700Schasinglulu break; 228*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */ 229*91f16700Schasinglulu default: 230*91f16700Schasinglulu break; 231*91f16700Schasinglulu } 232*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2M 233*91f16700Schasinglulu #if RCAR_LSI_CUT == RCAR_CUT_10 234*91f16700Schasinglulu /* G2M Cut 10 */ 235*91f16700Schasinglulu #else /* RCAR_LSI_CUT == RCAR_CUT_10 */ 236*91f16700Schasinglulu /* G2M Cut 11|13|30 or later */ 237*91f16700Schasinglulu refperiod = REFPERIOD_CYCLE; 238*91f16700Schasinglulu #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 239*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2N 240*91f16700Schasinglulu refperiod = REFPERIOD_CYCLE; 241*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2H 242*91f16700Schasinglulu /* G2H Cut 30 or later */ 243*91f16700Schasinglulu refperiod = REFPERIOD_CYCLE; 244*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 245*91f16700Schasinglulu return refperiod; 246*91f16700Schasinglulu } 247*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2E */ 248*91f16700Schasinglulu 249*91f16700Schasinglulu void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos, 250*91f16700Schasinglulu unsigned int qos_size, bool dbsc_wren) 251*91f16700Schasinglulu { 252*91f16700Schasinglulu unsigned int i; 253*91f16700Schasinglulu 254*91f16700Schasinglulu /* Register write enable */ 255*91f16700Schasinglulu if (dbsc_wren) { 256*91f16700Schasinglulu mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U); 257*91f16700Schasinglulu } 258*91f16700Schasinglulu 259*91f16700Schasinglulu for (i = 0; i < qos_size; i++) { 260*91f16700Schasinglulu mmio_write_32(qos[i].reg, qos[i].val); 261*91f16700Schasinglulu } 262*91f16700Schasinglulu 263*91f16700Schasinglulu /* Register write protect */ 264*91f16700Schasinglulu if (dbsc_wren) { 265*91f16700Schasinglulu mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U); 266*91f16700Schasinglulu } 267*91f16700Schasinglulu } 268