1f4db9216SBiju Das /* 2f4db9216SBiju Das * Copyright (c) 2021, Renesas Electronics Corporation. All rights reserved. 3f4db9216SBiju Das * 4f4db9216SBiju Das * SPDX-License-Identifier: BSD-3-Clause 5f4db9216SBiju Das */ 6f4db9216SBiju Das 7f4db9216SBiju Das #include <stdint.h> 8f4db9216SBiju Das 9f4db9216SBiju Das #include <common/debug.h> 10f4db9216SBiju Das #include <lib/mmio.h> 11f4db9216SBiju Das 12f4db9216SBiju Das #if RCAR_LSI == RCAR_AUTO 1386c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h" 14f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 15f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 16f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 17*f8ecfd68SLad Prabhakar #include "G2N/qos_init_g2n_v10.h" 18f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */ 19f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 20f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 21f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 22f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 23f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */ 2486c3cc30SLad Prabhakar #if RCAR_LSI == RZ_G2H 2586c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h" 2686c3cc30SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */ 27*f8ecfd68SLad Prabhakar #if RCAR_LSI == RZ_G2N 28*f8ecfd68SLad Prabhakar #include "G2N/qos_init_g2n_v10.h" 29*f8ecfd68SLad Prabhakar #endif /* RCAR_LSI == RZ_G2N */ 30f4db9216SBiju Das #include "qos_common.h" 31f4db9216SBiju Das #include "qos_init.h" 32f4db9216SBiju Das #include "qos_reg.h" 33f4db9216SBiju Das #include "rcar_def.h" 34f4db9216SBiju Das 35f4db9216SBiju Das #define DRAM_CH_CNT 0x04U 36f4db9216SBiju Das uint32_t qos_init_ddr_ch; 37f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid; 38f4db9216SBiju Das 39f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg) \ 40f4db9216SBiju Das { \ 41f4db9216SBiju Das ERROR("LSI Product ID(PRR=0x%x) QoS " \ 42f4db9216SBiju Das "initialize not supported.\n", reg); \ 43f4db9216SBiju Das panic(); \ 44f4db9216SBiju Das } 45f4db9216SBiju Das 46f4db9216SBiju Das #define PRR_CUT_ERR(reg) \ 47f4db9216SBiju Das { \ 48f4db9216SBiju Das ERROR("LSI Cut ID(PRR=0x%x) QoS " \ 49f4db9216SBiju Das "initialize not supported.\n", reg); \ 50f4db9216SBiju Das panic(); \ 51f4db9216SBiju Das } 52f4db9216SBiju Das 53f4db9216SBiju Das void rzg_qos_init(void) 54f4db9216SBiju Das { 55f4db9216SBiju Das uint32_t reg; 56f4db9216SBiju Das uint32_t i; 57f4db9216SBiju Das 58f4db9216SBiju Das qos_init_ddr_ch = 0U; 59778db0e9SLad Prabhakar qos_init_ddr_phyvalid = get_boardcnf_phyvalid(); 60f4db9216SBiju Das for (i = 0U; i < DRAM_CH_CNT; i++) { 61f4db9216SBiju Das if ((qos_init_ddr_phyvalid & (1U << i))) { 62f4db9216SBiju Das qos_init_ddr_ch++; 63f4db9216SBiju Das } 64f4db9216SBiju Das } 65f4db9216SBiju Das 66f4db9216SBiju Das reg = mmio_read_32(PRR); 67f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 68f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 69f4db9216SBiju Das case PRR_PRODUCT_M3: 70f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 71f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 72f4db9216SBiju Das case PRR_PRODUCT_10: 73f4db9216SBiju Das qos_init_g2m_v10(); 74f4db9216SBiju Das break; 75f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 76f4db9216SBiju Das qos_init_g2m_v11(); 77f4db9216SBiju Das break; 78f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 79f4db9216SBiju Das default: 80f4db9216SBiju Das qos_init_g2m_v30(); 81f4db9216SBiju Das break; 82f4db9216SBiju Das } 83f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 84f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 85f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 86f4db9216SBiju Das break; 8786c3cc30SLad Prabhakar case PRR_PRODUCT_H3: 8886c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 8986c3cc30SLad Prabhakar switch (reg & PRR_CUT_MASK) { 9086c3cc30SLad Prabhakar case PRR_PRODUCT_30: 9186c3cc30SLad Prabhakar default: 9286c3cc30SLad Prabhakar qos_init_g2h_v30(); 9386c3cc30SLad Prabhakar break; 9486c3cc30SLad Prabhakar } 9586c3cc30SLad Prabhakar #else 9686c3cc30SLad Prabhakar PRR_PRODUCT_ERR(reg); 9786c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 9886c3cc30SLad Prabhakar break; 99*f8ecfd68SLad Prabhakar case PRR_PRODUCT_M3N: 100*f8ecfd68SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) 101*f8ecfd68SLad Prabhakar switch (reg & PRR_CUT_MASK) { 102*f8ecfd68SLad Prabhakar case PRR_PRODUCT_10: 103*f8ecfd68SLad Prabhakar default: 104*f8ecfd68SLad Prabhakar qos_init_g2n_v10(); 105*f8ecfd68SLad Prabhakar break; 106*f8ecfd68SLad Prabhakar } 107*f8ecfd68SLad Prabhakar #else 108*f8ecfd68SLad Prabhakar PRR_PRODUCT_ERR(reg); 109*f8ecfd68SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */ 110*f8ecfd68SLad Prabhakar break; 111f4db9216SBiju Das default: 112f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 113f4db9216SBiju Das break; 114f4db9216SBiju Das } 115f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 116f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 117f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 118f4db9216SBiju Das /* G2M Cut 10 */ 119f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10) 120f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 121f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 122f4db9216SBiju Das } 123f4db9216SBiju Das qos_init_g2m_v10(); 124f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11 125f4db9216SBiju Das /* G2M Cut 11 */ 126f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20) 127f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 128f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 129f4db9216SBiju Das } 130f4db9216SBiju Das qos_init_g2m_v11(); 131f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13 132f4db9216SBiju Das /* G2M Cut 13 */ 133f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21) 134f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 135f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 136f4db9216SBiju Das } 137f4db9216SBiju Das qos_init_g2m_v11(); 138f4db9216SBiju Das #else 139f4db9216SBiju Das /* G2M Cut 30 or later */ 140f4db9216SBiju Das if ((PRR_PRODUCT_M3) 141f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK))) { 142f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 143f4db9216SBiju Das } 144f4db9216SBiju Das qos_init_g2m_v30(); 145f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 14686c3cc30SLad Prabhakar #elif (RCAR_LSI == RZ_G2H) 14786c3cc30SLad Prabhakar /* G2H Cut 30 or later */ 14886c3cc30SLad Prabhakar if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) { 14986c3cc30SLad Prabhakar PRR_PRODUCT_ERR(reg); 15086c3cc30SLad Prabhakar } 15186c3cc30SLad Prabhakar qos_init_g2h_v30(); 152*f8ecfd68SLad Prabhakar #elif (RCAR_LSI == RZ_G2N) 153*f8ecfd68SLad Prabhakar /* G2N Cut 10 or later */ 154*f8ecfd68SLad Prabhakar if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_M3N) { 155*f8ecfd68SLad Prabhakar PRR_PRODUCT_ERR(reg); 156*f8ecfd68SLad Prabhakar } 157*f8ecfd68SLad Prabhakar qos_init_g2n_v10(); 158f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */ 159f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)." 160f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */ 161f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 162f4db9216SBiju Das } 163f4db9216SBiju Das 164f4db9216SBiju Das uint32_t get_refperiod(void) 165f4db9216SBiju Das { 166f4db9216SBiju Das uint32_t refperiod = QOSWT_WTSET0_CYCLE; 167f4db9216SBiju Das 168f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 169f4db9216SBiju Das uint32_t reg; 170f4db9216SBiju Das 171f4db9216SBiju Das reg = mmio_read_32(PRR); 172f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 173f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 174f4db9216SBiju Das case PRR_PRODUCT_M3: 175f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 176f4db9216SBiju Das case PRR_PRODUCT_10: 177f4db9216SBiju Das break; 178f4db9216SBiju Das case PRR_PRODUCT_20: /* G2M Cut 11 */ 179f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 180f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 181f4db9216SBiju Das default: 182f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 183f4db9216SBiju Das break; 184f4db9216SBiju Das } 185f4db9216SBiju Das break; 186f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 18786c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 18886c3cc30SLad Prabhakar case PRR_PRODUCT_H3: 18986c3cc30SLad Prabhakar switch (reg & PRR_CUT_MASK) { 19086c3cc30SLad Prabhakar case PRR_PRODUCT_30: 19186c3cc30SLad Prabhakar default: 19286c3cc30SLad Prabhakar refperiod = REFPERIOD_CYCLE; 19386c3cc30SLad Prabhakar break; 19486c3cc30SLad Prabhakar } 19586c3cc30SLad Prabhakar break; 19686c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 197*f8ecfd68SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) 198*f8ecfd68SLad Prabhakar case PRR_PRODUCT_M3N: 199*f8ecfd68SLad Prabhakar refperiod = REFPERIOD_CYCLE; 200*f8ecfd68SLad Prabhakar break; 201*f8ecfd68SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */ 202f4db9216SBiju Das default: 203f4db9216SBiju Das break; 204f4db9216SBiju Das } 205f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M 206f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 207f4db9216SBiju Das /* G2M Cut 10 */ 208f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */ 209f4db9216SBiju Das /* G2M Cut 11|13|30 or later */ 210f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 211f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 212*f8ecfd68SLad Prabhakar #elif RCAR_LSI == RZ_G2N 213*f8ecfd68SLad Prabhakar refperiod = REFPERIOD_CYCLE; 21486c3cc30SLad Prabhakar #elif RCAR_LSI == RZ_G2H 21586c3cc30SLad Prabhakar /* G2H Cut 30 or later */ 21686c3cc30SLad Prabhakar refperiod = REFPERIOD_CYCLE; 217f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 218f4db9216SBiju Das return refperiod; 219f4db9216SBiju Das } 220f4db9216SBiju Das 221f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos, 222f4db9216SBiju Das unsigned int qos_size, bool dbsc_wren) 223f4db9216SBiju Das { 224f4db9216SBiju Das unsigned int i; 225f4db9216SBiju Das 226f4db9216SBiju Das /* Register write enable */ 227f4db9216SBiju Das if (dbsc_wren) { 228f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U); 229f4db9216SBiju Das } 230f4db9216SBiju Das 231f4db9216SBiju Das for (i = 0; i < qos_size; i++) { 232f4db9216SBiju Das mmio_write_32(qos[i].reg, qos[i].val); 233f4db9216SBiju Das } 234f4db9216SBiju Das 235f4db9216SBiju Das /* Register write protect */ 236f4db9216SBiju Das if (dbsc_wren) { 237f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U); 238f4db9216SBiju Das } 239f4db9216SBiju Das } 240