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 13*05cc21deSLad Prabhakar #include "G2E/qos_init_g2e_v10.h" 1486c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h" 15f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 16f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 17f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 18f8ecfd68SLad Prabhakar #include "G2N/qos_init_g2n_v10.h" 19f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */ 20f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 21f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 22f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 23f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 24f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */ 2586c3cc30SLad Prabhakar #if RCAR_LSI == RZ_G2H 2686c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h" 2786c3cc30SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */ 28f8ecfd68SLad Prabhakar #if RCAR_LSI == RZ_G2N 29f8ecfd68SLad Prabhakar #include "G2N/qos_init_g2n_v10.h" 30f8ecfd68SLad Prabhakar #endif /* RCAR_LSI == RZ_G2N */ 31*05cc21deSLad Prabhakar #if RCAR_LSI == RZ_G2E 32*05cc21deSLad Prabhakar #include "G2E/qos_init_g2e_v10.h" 33*05cc21deSLad Prabhakar #endif /* RCAR_LSI == RZ_G2E */ 34f4db9216SBiju Das #include "qos_common.h" 35f4db9216SBiju Das #include "qos_init.h" 36f4db9216SBiju Das #include "qos_reg.h" 37f4db9216SBiju Das #include "rcar_def.h" 38f4db9216SBiju Das 39*05cc21deSLad Prabhakar #if (RCAR_LSI != RZ_G2E) 40f4db9216SBiju Das #define DRAM_CH_CNT 0x04U 41f4db9216SBiju Das uint32_t qos_init_ddr_ch; 42f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid; 43*05cc21deSLad Prabhakar #endif /* RCAR_LSI != RZ_G2E */ 44f4db9216SBiju Das 45f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg) \ 46f4db9216SBiju Das { \ 47f4db9216SBiju Das ERROR("LSI Product ID(PRR=0x%x) QoS " \ 48f4db9216SBiju Das "initialize not supported.\n", reg); \ 49f4db9216SBiju Das panic(); \ 50f4db9216SBiju Das } 51f4db9216SBiju Das 52f4db9216SBiju Das #define PRR_CUT_ERR(reg) \ 53f4db9216SBiju Das { \ 54f4db9216SBiju Das ERROR("LSI Cut ID(PRR=0x%x) QoS " \ 55f4db9216SBiju Das "initialize not supported.\n", reg); \ 56f4db9216SBiju Das panic(); \ 57f4db9216SBiju Das } 58f4db9216SBiju Das 59f4db9216SBiju Das void rzg_qos_init(void) 60f4db9216SBiju Das { 61f4db9216SBiju Das uint32_t reg; 62*05cc21deSLad Prabhakar #if (RCAR_LSI != RZ_G2E) 63f4db9216SBiju Das uint32_t i; 64f4db9216SBiju Das 65f4db9216SBiju Das qos_init_ddr_ch = 0U; 66778db0e9SLad Prabhakar qos_init_ddr_phyvalid = get_boardcnf_phyvalid(); 67f4db9216SBiju Das for (i = 0U; i < DRAM_CH_CNT; i++) { 68f4db9216SBiju Das if ((qos_init_ddr_phyvalid & (1U << i))) { 69f4db9216SBiju Das qos_init_ddr_ch++; 70f4db9216SBiju Das } 71f4db9216SBiju Das } 72*05cc21deSLad Prabhakar #endif /* RCAR_LSI != RZ_G2E */ 73f4db9216SBiju Das 74f4db9216SBiju Das reg = mmio_read_32(PRR); 75f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 76f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 77f4db9216SBiju Das case PRR_PRODUCT_M3: 78f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 79f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 80f4db9216SBiju Das case PRR_PRODUCT_10: 81f4db9216SBiju Das qos_init_g2m_v10(); 82f4db9216SBiju Das break; 83f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 84f4db9216SBiju Das qos_init_g2m_v11(); 85f4db9216SBiju Das break; 86f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 87f4db9216SBiju Das default: 88f4db9216SBiju Das qos_init_g2m_v30(); 89f4db9216SBiju Das break; 90f4db9216SBiju Das } 91f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 92f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 93f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 94f4db9216SBiju Das break; 9586c3cc30SLad Prabhakar case PRR_PRODUCT_H3: 9686c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 9786c3cc30SLad Prabhakar switch (reg & PRR_CUT_MASK) { 9886c3cc30SLad Prabhakar case PRR_PRODUCT_30: 9986c3cc30SLad Prabhakar default: 10086c3cc30SLad Prabhakar qos_init_g2h_v30(); 10186c3cc30SLad Prabhakar break; 10286c3cc30SLad Prabhakar } 10386c3cc30SLad Prabhakar #else 10486c3cc30SLad Prabhakar PRR_PRODUCT_ERR(reg); 10586c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 10686c3cc30SLad Prabhakar break; 107f8ecfd68SLad Prabhakar case PRR_PRODUCT_M3N: 108f8ecfd68SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) 109f8ecfd68SLad Prabhakar switch (reg & PRR_CUT_MASK) { 110f8ecfd68SLad Prabhakar case PRR_PRODUCT_10: 111f8ecfd68SLad Prabhakar default: 112f8ecfd68SLad Prabhakar qos_init_g2n_v10(); 113f8ecfd68SLad Prabhakar break; 114f8ecfd68SLad Prabhakar } 115f8ecfd68SLad Prabhakar #else 116f8ecfd68SLad Prabhakar PRR_PRODUCT_ERR(reg); 117f8ecfd68SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */ 118f8ecfd68SLad Prabhakar break; 119*05cc21deSLad Prabhakar case PRR_PRODUCT_E3: 120*05cc21deSLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2E) 121*05cc21deSLad Prabhakar switch (reg & PRR_CUT_MASK) { 122*05cc21deSLad Prabhakar case PRR_PRODUCT_10: 123*05cc21deSLad Prabhakar default: 124*05cc21deSLad Prabhakar qos_init_g2e_v10(); 125*05cc21deSLad Prabhakar break; 126*05cc21deSLad Prabhakar } 127*05cc21deSLad Prabhakar #else 128*05cc21deSLad Prabhakar PRR_PRODUCT_ERR(reg); 129*05cc21deSLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2E) */ 130*05cc21deSLad Prabhakar break; 131f4db9216SBiju Das default: 132f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 133f4db9216SBiju Das break; 134f4db9216SBiju Das } 135f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 136f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 137f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 138f4db9216SBiju Das /* G2M Cut 10 */ 139f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10) 140f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 141f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 142f4db9216SBiju Das } 143f4db9216SBiju Das qos_init_g2m_v10(); 144f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11 145f4db9216SBiju Das /* G2M Cut 11 */ 146f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20) 147f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 148f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 149f4db9216SBiju Das } 150f4db9216SBiju Das qos_init_g2m_v11(); 151f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13 152f4db9216SBiju Das /* G2M Cut 13 */ 153f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21) 154f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 155f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 156f4db9216SBiju Das } 157f4db9216SBiju Das qos_init_g2m_v11(); 158f4db9216SBiju Das #else 159f4db9216SBiju Das /* G2M Cut 30 or later */ 160f4db9216SBiju Das if ((PRR_PRODUCT_M3) 161f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK))) { 162f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 163f4db9216SBiju Das } 164f4db9216SBiju Das qos_init_g2m_v30(); 165f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 16686c3cc30SLad Prabhakar #elif (RCAR_LSI == RZ_G2H) 16786c3cc30SLad Prabhakar /* G2H Cut 30 or later */ 16886c3cc30SLad Prabhakar if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) { 16986c3cc30SLad Prabhakar PRR_PRODUCT_ERR(reg); 17086c3cc30SLad Prabhakar } 17186c3cc30SLad Prabhakar qos_init_g2h_v30(); 172f8ecfd68SLad Prabhakar #elif (RCAR_LSI == RZ_G2N) 173f8ecfd68SLad Prabhakar /* G2N Cut 10 or later */ 174f8ecfd68SLad Prabhakar if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_M3N) { 175f8ecfd68SLad Prabhakar PRR_PRODUCT_ERR(reg); 176f8ecfd68SLad Prabhakar } 177f8ecfd68SLad Prabhakar qos_init_g2n_v10(); 178*05cc21deSLad Prabhakar #elif RCAR_LSI == RZ_G2E 179*05cc21deSLad Prabhakar /* G2E Cut 10 or later */ 180*05cc21deSLad Prabhakar if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_E3) { 181*05cc21deSLad Prabhakar PRR_PRODUCT_ERR(reg); 182*05cc21deSLad Prabhakar } 183*05cc21deSLad Prabhakar qos_init_g2e_v10(); 184f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */ 185f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)." 186f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */ 187f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 188f4db9216SBiju Das } 189f4db9216SBiju Das 190*05cc21deSLad Prabhakar #if (RCAR_LSI != RZ_G2E) 191f4db9216SBiju Das uint32_t get_refperiod(void) 192f4db9216SBiju Das { 193f4db9216SBiju Das uint32_t refperiod = QOSWT_WTSET0_CYCLE; 194f4db9216SBiju Das 195f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 196f4db9216SBiju Das uint32_t reg; 197f4db9216SBiju Das 198f4db9216SBiju Das reg = mmio_read_32(PRR); 199f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 200f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 201f4db9216SBiju Das case PRR_PRODUCT_M3: 202f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 203f4db9216SBiju Das case PRR_PRODUCT_10: 204f4db9216SBiju Das break; 205f4db9216SBiju Das case PRR_PRODUCT_20: /* G2M Cut 11 */ 206f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 207f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 208f4db9216SBiju Das default: 209f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 210f4db9216SBiju Das break; 211f4db9216SBiju Das } 212f4db9216SBiju Das break; 213f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 21486c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 21586c3cc30SLad Prabhakar case PRR_PRODUCT_H3: 21686c3cc30SLad Prabhakar switch (reg & PRR_CUT_MASK) { 21786c3cc30SLad Prabhakar case PRR_PRODUCT_30: 21886c3cc30SLad Prabhakar default: 21986c3cc30SLad Prabhakar refperiod = REFPERIOD_CYCLE; 22086c3cc30SLad Prabhakar break; 22186c3cc30SLad Prabhakar } 22286c3cc30SLad Prabhakar break; 22386c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 224f8ecfd68SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) 225f8ecfd68SLad Prabhakar case PRR_PRODUCT_M3N: 226f8ecfd68SLad Prabhakar refperiod = REFPERIOD_CYCLE; 227f8ecfd68SLad Prabhakar break; 228f8ecfd68SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */ 229f4db9216SBiju Das default: 230f4db9216SBiju Das break; 231f4db9216SBiju Das } 232f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M 233f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 234f4db9216SBiju Das /* G2M Cut 10 */ 235f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */ 236f4db9216SBiju Das /* G2M Cut 11|13|30 or later */ 237f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 238f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 239f8ecfd68SLad Prabhakar #elif RCAR_LSI == RZ_G2N 240f8ecfd68SLad Prabhakar refperiod = REFPERIOD_CYCLE; 24186c3cc30SLad Prabhakar #elif RCAR_LSI == RZ_G2H 24286c3cc30SLad Prabhakar /* G2H Cut 30 or later */ 24386c3cc30SLad Prabhakar refperiod = REFPERIOD_CYCLE; 244f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 245f4db9216SBiju Das return refperiod; 246f4db9216SBiju Das } 247*05cc21deSLad Prabhakar #endif /* RCAR_LSI != RZ_G2E */ 248f4db9216SBiju Das 249f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos, 250f4db9216SBiju Das unsigned int qos_size, bool dbsc_wren) 251f4db9216SBiju Das { 252f4db9216SBiju Das unsigned int i; 253f4db9216SBiju Das 254f4db9216SBiju Das /* Register write enable */ 255f4db9216SBiju Das if (dbsc_wren) { 256f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U); 257f4db9216SBiju Das } 258f4db9216SBiju Das 259f4db9216SBiju Das for (i = 0; i < qos_size; i++) { 260f4db9216SBiju Das mmio_write_32(qos[i].reg, qos[i].val); 261f4db9216SBiju Das } 262f4db9216SBiju Das 263f4db9216SBiju Das /* Register write protect */ 264f4db9216SBiju Das if (dbsc_wren) { 265f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U); 266f4db9216SBiju Das } 267f4db9216SBiju Das } 268