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*86c3cc30SLad 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" 17f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */ 18f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 19f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h" 20f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h" 21f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h" 22f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */ 23*86c3cc30SLad Prabhakar #if RCAR_LSI == RZ_G2H 24*86c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h" 25*86c3cc30SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */ 26f4db9216SBiju Das #include "qos_common.h" 27f4db9216SBiju Das #include "qos_init.h" 28f4db9216SBiju Das #include "qos_reg.h" 29f4db9216SBiju Das #include "rcar_def.h" 30f4db9216SBiju Das 31f4db9216SBiju Das #define DRAM_CH_CNT 0x04U 32f4db9216SBiju Das uint32_t qos_init_ddr_ch; 33f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid; 34f4db9216SBiju Das 35f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg) \ 36f4db9216SBiju Das { \ 37f4db9216SBiju Das ERROR("LSI Product ID(PRR=0x%x) QoS " \ 38f4db9216SBiju Das "initialize not supported.\n", reg); \ 39f4db9216SBiju Das panic(); \ 40f4db9216SBiju Das } 41f4db9216SBiju Das 42f4db9216SBiju Das #define PRR_CUT_ERR(reg) \ 43f4db9216SBiju Das { \ 44f4db9216SBiju Das ERROR("LSI Cut ID(PRR=0x%x) QoS " \ 45f4db9216SBiju Das "initialize not supported.\n", reg); \ 46f4db9216SBiju Das panic(); \ 47f4db9216SBiju Das } 48f4db9216SBiju Das 49f4db9216SBiju Das void rzg_qos_init(void) 50f4db9216SBiju Das { 51f4db9216SBiju Das uint32_t reg; 52f4db9216SBiju Das uint32_t i; 53f4db9216SBiju Das 54f4db9216SBiju Das qos_init_ddr_ch = 0U; 55778db0e9SLad Prabhakar qos_init_ddr_phyvalid = get_boardcnf_phyvalid(); 56f4db9216SBiju Das for (i = 0U; i < DRAM_CH_CNT; i++) { 57f4db9216SBiju Das if ((qos_init_ddr_phyvalid & (1U << i))) { 58f4db9216SBiju Das qos_init_ddr_ch++; 59f4db9216SBiju Das } 60f4db9216SBiju Das } 61f4db9216SBiju Das 62f4db9216SBiju Das reg = mmio_read_32(PRR); 63f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 64f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 65f4db9216SBiju Das case PRR_PRODUCT_M3: 66f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 67f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 68f4db9216SBiju Das case PRR_PRODUCT_10: 69f4db9216SBiju Das qos_init_g2m_v10(); 70f4db9216SBiju Das break; 71f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 72f4db9216SBiju Das qos_init_g2m_v11(); 73f4db9216SBiju Das break; 74f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 75f4db9216SBiju Das default: 76f4db9216SBiju Das qos_init_g2m_v30(); 77f4db9216SBiju Das break; 78f4db9216SBiju Das } 79f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 80f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 81f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 82f4db9216SBiju Das break; 83*86c3cc30SLad Prabhakar case PRR_PRODUCT_H3: 84*86c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 85*86c3cc30SLad Prabhakar switch (reg & PRR_CUT_MASK) { 86*86c3cc30SLad Prabhakar case PRR_PRODUCT_30: 87*86c3cc30SLad Prabhakar default: 88*86c3cc30SLad Prabhakar qos_init_g2h_v30(); 89*86c3cc30SLad Prabhakar break; 90*86c3cc30SLad Prabhakar } 91*86c3cc30SLad Prabhakar #else 92*86c3cc30SLad Prabhakar PRR_PRODUCT_ERR(reg); 93*86c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 94*86c3cc30SLad Prabhakar break; 95f4db9216SBiju Das default: 96f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 97f4db9216SBiju Das break; 98f4db9216SBiju Das } 99f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 100f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M) 101f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 102f4db9216SBiju Das /* G2M Cut 10 */ 103f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10) 104f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 105f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 106f4db9216SBiju Das } 107f4db9216SBiju Das qos_init_g2m_v10(); 108f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11 109f4db9216SBiju Das /* G2M Cut 11 */ 110f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20) 111f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 112f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 113f4db9216SBiju Das } 114f4db9216SBiju Das qos_init_g2m_v11(); 115f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13 116f4db9216SBiju Das /* G2M Cut 13 */ 117f4db9216SBiju Das if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21) 118f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) { 119f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 120f4db9216SBiju Das } 121f4db9216SBiju Das qos_init_g2m_v11(); 122f4db9216SBiju Das #else 123f4db9216SBiju Das /* G2M Cut 30 or later */ 124f4db9216SBiju Das if ((PRR_PRODUCT_M3) 125f4db9216SBiju Das != (reg & (PRR_PRODUCT_MASK))) { 126f4db9216SBiju Das PRR_PRODUCT_ERR(reg); 127f4db9216SBiju Das } 128f4db9216SBiju Das qos_init_g2m_v30(); 129f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 130*86c3cc30SLad Prabhakar #elif (RCAR_LSI == RZ_G2H) 131*86c3cc30SLad Prabhakar /* G2H Cut 30 or later */ 132*86c3cc30SLad Prabhakar if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) { 133*86c3cc30SLad Prabhakar PRR_PRODUCT_ERR(reg); 134*86c3cc30SLad Prabhakar } 135*86c3cc30SLad Prabhakar qos_init_g2h_v30(); 136f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */ 137f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)." 138f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */ 139f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 140f4db9216SBiju Das } 141f4db9216SBiju Das 142f4db9216SBiju Das uint32_t get_refperiod(void) 143f4db9216SBiju Das { 144f4db9216SBiju Das uint32_t refperiod = QOSWT_WTSET0_CYCLE; 145f4db9216SBiju Das 146f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT 147f4db9216SBiju Das uint32_t reg; 148f4db9216SBiju Das 149f4db9216SBiju Das reg = mmio_read_32(PRR); 150f4db9216SBiju Das switch (reg & PRR_PRODUCT_MASK) { 151f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) 152f4db9216SBiju Das case PRR_PRODUCT_M3: 153f4db9216SBiju Das switch (reg & PRR_CUT_MASK) { 154f4db9216SBiju Das case PRR_PRODUCT_10: 155f4db9216SBiju Das break; 156f4db9216SBiju Das case PRR_PRODUCT_20: /* G2M Cut 11 */ 157f4db9216SBiju Das case PRR_PRODUCT_21: /* G2M Cut 13 */ 158f4db9216SBiju Das case PRR_PRODUCT_30: /* G2M Cut 30 */ 159f4db9216SBiju Das default: 160f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 161f4db9216SBiju Das break; 162f4db9216SBiju Das } 163f4db9216SBiju Das break; 164f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */ 165*86c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) 166*86c3cc30SLad Prabhakar case PRR_PRODUCT_H3: 167*86c3cc30SLad Prabhakar switch (reg & PRR_CUT_MASK) { 168*86c3cc30SLad Prabhakar case PRR_PRODUCT_30: 169*86c3cc30SLad Prabhakar default: 170*86c3cc30SLad Prabhakar refperiod = REFPERIOD_CYCLE; 171*86c3cc30SLad Prabhakar break; 172*86c3cc30SLad Prabhakar } 173*86c3cc30SLad Prabhakar break; 174*86c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */ 175f4db9216SBiju Das default: 176f4db9216SBiju Das break; 177f4db9216SBiju Das } 178f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M 179f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10 180f4db9216SBiju Das /* G2M Cut 10 */ 181f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */ 182f4db9216SBiju Das /* G2M Cut 11|13|30 or later */ 183f4db9216SBiju Das refperiod = REFPERIOD_CYCLE; 184f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */ 185*86c3cc30SLad Prabhakar #elif RCAR_LSI == RZ_G2H 186*86c3cc30SLad Prabhakar /* G2H Cut 30 or later */ 187*86c3cc30SLad Prabhakar refperiod = REFPERIOD_CYCLE; 188f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */ 189f4db9216SBiju Das return refperiod; 190f4db9216SBiju Das } 191f4db9216SBiju Das 192f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos, 193f4db9216SBiju Das unsigned int qos_size, bool dbsc_wren) 194f4db9216SBiju Das { 195f4db9216SBiju Das unsigned int i; 196f4db9216SBiju Das 197f4db9216SBiju Das /* Register write enable */ 198f4db9216SBiju Das if (dbsc_wren) { 199f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U); 200f4db9216SBiju Das } 201f4db9216SBiju Das 202f4db9216SBiju Das for (i = 0; i < qos_size; i++) { 203f4db9216SBiju Das mmio_write_32(qos[i].reg, qos[i].val); 204f4db9216SBiju Das } 205f4db9216SBiju Das 206f4db9216SBiju Das /* Register write protect */ 207f4db9216SBiju Das if (dbsc_wren) { 208f4db9216SBiju Das mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U); 209f4db9216SBiju Das } 210f4db9216SBiju Das } 211