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