1*f4db9216SBiju Das /* 2*f4db9216SBiju Das * Copyright (c) 2021, Renesas Electronics Corporation. All rights reserved. 3*f4db9216SBiju Das * 4*f4db9216SBiju Das * SPDX-License-Identifier: BSD-3-Clause 5*f4db9216SBiju Das */ 6*f4db9216SBiju Das 7*f4db9216SBiju Das #include <stdint.h> 8*f4db9216SBiju Das 9*f4db9216SBiju Das #include <common/debug.h> 10*f4db9216SBiju Das #include <lib/mmio.h> 11*f4db9216SBiju Das 12*f4db9216SBiju Das #if RCAR_LSI == RCAR_AUTO 13*f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 14*f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 15*f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 16*f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */ 17*f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 18*f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 19*f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 20*f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 21*f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */ 22*f4db9216SBiju Das #include "qos_common.h" 23*f4db9216SBiju Das #include "qos_init.h" 24*f4db9216SBiju Das #include "qos_reg.h" 25*f4db9216SBiju Das #include "rcar_def.h" 26*f4db9216SBiju Das 27*f4db9216SBiju Das #define DRAM_CH_CNT 0x04U 28*f4db9216SBiju Das uint32_t qos_init_ddr_ch; 29*f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid; 30*f4db9216SBiju Das 31*f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg) \ 32*f4db9216SBiju Das { \ 33*f4db9216SBiju Das ERROR("LSI Product ID(PRR=0x%x) QoS " \ 34*f4db9216SBiju Das "initialize not supported.\n", reg); \ 35*f4db9216SBiju Das panic(); \ 36*f4db9216SBiju Das } 37*f4db9216SBiju Das 38*f4db9216SBiju Das #define PRR_CUT_ERR(reg) \ 39*f4db9216SBiju Das { \ 40*f4db9216SBiju Das ERROR("LSI Cut ID(PRR=0x%x) QoS " \ 41*f4db9216SBiju Das "initialize not supported.\n", reg); \ 42*f4db9216SBiju Das panic(); \ 43*f4db9216SBiju Das } 44*f4db9216SBiju Das 45*f4db9216SBiju Das void rzg_qos_init(void) 46*f4db9216SBiju Das { 47*f4db9216SBiju Das uint32_t reg; 48*f4db9216SBiju Das uint32_t i; 49*f4db9216SBiju Das 50*f4db9216SBiju Das qos_init_ddr_ch = 0U; 51*f4db9216SBiju Das qos_init_ddr_phyvalid = rzg_get_boardcnf_phyvalid(); 52*f4db9216SBiju Das for (i = 0U; i < DRAM_CH_CNT; i++) { 53*f4db9216SBiju Das if ((qos_init_ddr_phyvalid & (1U << i))) { 54*f4db9216SBiju Das qos_init_ddr_ch++; 55*f4db9216SBiju Das } 56*f4db9216SBiju Das } 57*f4db9216SBiju Das 58*f4db9216SBiju Das reg = mmio_read_32(PRR); 59*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 60*f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 61*f4db9216SBiju Das case PRR_PRODUCT_M3: 62*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 63*f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 64*f4db9216SBiju Das case PRR_PRODUCT_10: 65*f4db9216SBiju Das qos_init_g2m_v10(); 66*f4db9216SBiju Das break; 67*f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 68*f4db9216SBiju Das qos_init_g2m_v11(); 69*f4db9216SBiju Das break; 70*f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 71*f4db9216SBiju Das default: 72*f4db9216SBiju Das qos_init_g2m_v30(); 73*f4db9216SBiju Das break; 74*f4db9216SBiju Das } 75*f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 76*f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 77*f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 78*f4db9216SBiju Das break; 79*f4db9216SBiju Das default: 80*f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 81*f4db9216SBiju Das break; 82*f4db9216SBiju Das } 83*f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 84*f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 85*f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 86*f4db9216SBiju Das /* G2M Cut 10 */ 87*f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10) 88*f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 89*f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 90*f4db9216SBiju Das } 91*f4db9216SBiju Das qos_init_g2m_v10(); 92*f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11 93*f4db9216SBiju Das /* G2M Cut 11 */ 94*f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20) 95*f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 96*f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 97*f4db9216SBiju Das } 98*f4db9216SBiju Das qos_init_g2m_v11(); 99*f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13 100*f4db9216SBiju Das /* G2M Cut 13 */ 101*f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21) 102*f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 103*f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 104*f4db9216SBiju Das } 105*f4db9216SBiju Das qos_init_g2m_v11(); 106*f4db9216SBiju Das #else 107*f4db9216SBiju Das /* G2M Cut 30 or later */ 108*f4db9216SBiju Das if ((PRR_PRODUCT_M3) 109*f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK))) { 110*f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 111*f4db9216SBiju Das } 112*f4db9216SBiju Das qos_init_g2m_v30(); 113*f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 114*f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */ 115*f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)." 116*f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */ 117*f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 118*f4db9216SBiju Das } 119*f4db9216SBiju Das 120*f4db9216SBiju Das uint32_t get_refperiod(void) 121*f4db9216SBiju Das { 122*f4db9216SBiju Das uint32_t refperiod = QOSWT_WTSET0_CYCLE; 123*f4db9216SBiju Das 124*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 125*f4db9216SBiju Das uint32_t reg; 126*f4db9216SBiju Das 127*f4db9216SBiju Das reg = mmio_read_32(PRR); 128*f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 129*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 130*f4db9216SBiju Das case PRR_PRODUCT_M3: 131*f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 132*f4db9216SBiju Das case PRR_PRODUCT_10: 133*f4db9216SBiju Das break; 134*f4db9216SBiju Das case PRR_PRODUCT_20: /* G2M Cut 11 */ 135*f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 136*f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 137*f4db9216SBiju Das default: 138*f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 139*f4db9216SBiju Das break; 140*f4db9216SBiju Das } 141*f4db9216SBiju Das break; 142*f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 143*f4db9216SBiju Das default: 144*f4db9216SBiju Das break; 145*f4db9216SBiju Das } 146*f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M 147*f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 148*f4db9216SBiju Das /* G2M Cut 10 */ 149*f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */ 150*f4db9216SBiju Das /* G2M Cut 11|13|30 or later */ 151*f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 152*f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 153*f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 154*f4db9216SBiju Das return refperiod; 155*f4db9216SBiju Das } 156*f4db9216SBiju Das 157*f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos, 158*f4db9216SBiju Das unsigned int qos_size, bool dbsc_wren) 159*f4db9216SBiju Das { 160*f4db9216SBiju Das unsigned int i; 161*f4db9216SBiju Das 162*f4db9216SBiju Das /* Register write enable */ 163*f4db9216SBiju Das if (dbsc_wren) { 164*f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U); 165*f4db9216SBiju Das } 166*f4db9216SBiju Das 167*f4db9216SBiju Das for (i = 0; i < qos_size; i++) { 168*f4db9216SBiju Das mmio_write_32(qos[i].reg, qos[i].val); 169*f4db9216SBiju Das } 170*f4db9216SBiju Das 171*f4db9216SBiju Das /* Register write protect */ 172*f4db9216SBiju Das if (dbsc_wren) { 173*f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U); 174*f4db9216SBiju Das } 175*f4db9216SBiju Das } 176