1412dd5c5SVarun Wadekar /* 293c78ed2SAntonio Nino Diaz * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3412dd5c5SVarun Wadekar * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5412dd5c5SVarun Wadekar */ 6412dd5c5SVarun Wadekar 7c3cf06f1SAntonio Nino Diaz #ifndef MEMCTRL_V2_H 8c3cf06f1SAntonio Nino Diaz #define MEMCTRL_V2_H 9412dd5c5SVarun Wadekar 10412dd5c5SVarun Wadekar #include <tegra_def.h> 11412dd5c5SVarun Wadekar 12d5dfdeb6SJulius Werner #ifndef __ASSEMBLER__ 1306803cfdSPritesh Raithatha 146e756f6dSAmbroise Vincent #include <lib/mmio.h> 1593c78ed2SAntonio Nino Diaz #include <stdint.h> 1606803cfdSPritesh Raithatha 17412dd5c5SVarun Wadekar /******************************************************************************* 18be87d920SVarun Wadekar * Structure to hold the transaction override settings to use to override 19be87d920SVarun Wadekar * client inputs 20be87d920SVarun Wadekar ******************************************************************************/ 21be87d920SVarun Wadekar typedef struct mc_txn_override_cfg { 22be87d920SVarun Wadekar uint32_t offset; 23be87d920SVarun Wadekar uint8_t cgid_tag; 24be87d920SVarun Wadekar } mc_txn_override_cfg_t; 25be87d920SVarun Wadekar 26be87d920SVarun Wadekar #define mc_make_txn_override_cfg(off, val) \ 27be87d920SVarun Wadekar { \ 28be87d920SVarun Wadekar .offset = MC_TXN_OVERRIDE_CONFIG_ ## off, \ 29be87d920SVarun Wadekar .cgid_tag = MC_TXN_OVERRIDE_ ## val \ 30be87d920SVarun Wadekar } 31be87d920SVarun Wadekar 32be87d920SVarun Wadekar /******************************************************************************* 33412dd5c5SVarun Wadekar * Structure to hold the Stream ID to use to override client inputs 34412dd5c5SVarun Wadekar ******************************************************************************/ 35412dd5c5SVarun Wadekar typedef struct mc_streamid_override_cfg { 36412dd5c5SVarun Wadekar uint32_t offset; 37412dd5c5SVarun Wadekar uint8_t stream_id; 38412dd5c5SVarun Wadekar } mc_streamid_override_cfg_t; 39412dd5c5SVarun Wadekar 40412dd5c5SVarun Wadekar /******************************************************************************* 41412dd5c5SVarun Wadekar * Structure to hold the Stream ID Security Configuration settings 42412dd5c5SVarun Wadekar ******************************************************************************/ 43412dd5c5SVarun Wadekar typedef struct mc_streamid_security_cfg { 44412dd5c5SVarun Wadekar char *name; 45412dd5c5SVarun Wadekar uint32_t offset; 46412dd5c5SVarun Wadekar int override_enable; 47412dd5c5SVarun Wadekar int override_client_inputs; 48412dd5c5SVarun Wadekar int override_client_ns_flag; 49412dd5c5SVarun Wadekar } mc_streamid_security_cfg_t; 50412dd5c5SVarun Wadekar 51aa64c5fbSAnthony Zhou #define OVERRIDE_DISABLE 1U 52aa64c5fbSAnthony Zhou #define OVERRIDE_ENABLE 0U 53aa64c5fbSAnthony Zhou #define CLIENT_FLAG_SECURE 0U 54aa64c5fbSAnthony Zhou #define CLIENT_FLAG_NON_SECURE 1U 55aa64c5fbSAnthony Zhou #define CLIENT_INPUTS_OVERRIDE 1U 56aa64c5fbSAnthony Zhou #define CLIENT_INPUTS_NO_OVERRIDE 0U 57ab2eb455SPuneet Saxena /******************************************************************************* 58ab2eb455SPuneet Saxena * StreamID to indicate no SMMU translations (requests to be steered on the 59ab2eb455SPuneet Saxena * SMMU bypass path) 60ab2eb455SPuneet Saxena ******************************************************************************/ 61ab2eb455SPuneet Saxena #define MC_STREAM_ID_MAX 0x7FU 62ab2eb455SPuneet Saxena 63ab2eb455SPuneet Saxena /******************************************************************************* 64ab2eb455SPuneet Saxena * Memory Controller SMMU Bypass config register 65ab2eb455SPuneet Saxena ******************************************************************************/ 66ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CONFIG 0x1820U 67ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CTRL_MASK 0x3U 68ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CTRL_SHIFT 0U 69ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_BYPASS_ALL (0U << MC_SMMU_BYPASS_CTRL_SHIFT) 70ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_RSVD (1U << MC_SMMU_BYPASS_CTRL_SHIFT) 71ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_BYPASS_SPL_STREAMID (2U << MC_SMMU_BYPASS_CTRL_SHIFT) 72ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_BYPASS_NONE (3U << MC_SMMU_BYPASS_CTRL_SHIFT) 73ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CONFIG_WRITE_ACCESS_BIT (1U << 31) 74ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CONFIG_SETTINGS (MC_SMMU_BYPASS_CONFIG_WRITE_ACCESS_BIT | \ 75ab2eb455SPuneet Saxena MC_SMMU_CTRL_TBU_BYPASS_SPL_STREAMID) 76412dd5c5SVarun Wadekar 77412dd5c5SVarun Wadekar #define mc_make_sec_cfg(off, ns, ovrrd, access) \ 78412dd5c5SVarun Wadekar { \ 79412dd5c5SVarun Wadekar .name = # off, \ 8006803cfdSPritesh Raithatha .offset = MC_STREAMID_OVERRIDE_TO_SECURITY_CFG( \ 8106803cfdSPritesh Raithatha MC_STREAMID_OVERRIDE_CFG_ ## off), \ 82412dd5c5SVarun Wadekar .override_client_ns_flag = CLIENT_FLAG_ ## ns, \ 83412dd5c5SVarun Wadekar .override_client_inputs = CLIENT_INPUTS_ ## ovrrd, \ 84412dd5c5SVarun Wadekar .override_enable = OVERRIDE_ ## access \ 85412dd5c5SVarun Wadekar } 86412dd5c5SVarun Wadekar 87*a391d494SPritesh Raithatha typedef struct mc_regs { 88*a391d494SPritesh Raithatha uint32_t reg; 89*a391d494SPritesh Raithatha uint32_t val; 90*a391d494SPritesh Raithatha } mc_regs_t; 91*a391d494SPritesh Raithatha 92*a391d494SPritesh Raithatha #define mc_make_sid_override_cfg(name) \ 93*a391d494SPritesh Raithatha { \ 94*a391d494SPritesh Raithatha .reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_CFG_ ## name, \ 95*a391d494SPritesh Raithatha .val = 0x00000000U, \ 96*a391d494SPritesh Raithatha } 97*a391d494SPritesh Raithatha 98*a391d494SPritesh Raithatha #define mc_make_sid_security_cfg(name) \ 99*a391d494SPritesh Raithatha { \ 100*a391d494SPritesh Raithatha .reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_TO_SECURITY_CFG(MC_STREAMID_OVERRIDE_CFG_ ## name), \ 101*a391d494SPritesh Raithatha .val = 0x00000000U, \ 102*a391d494SPritesh Raithatha } 103*a391d494SPritesh Raithatha 104*a391d494SPritesh Raithatha #define mc_smmu_bypass_cfg \ 105*a391d494SPritesh Raithatha { \ 106*a391d494SPritesh Raithatha .reg = TEGRA_MC_BASE + MC_SMMU_BYPASS_CONFIG, \ 107*a391d494SPritesh Raithatha .val = 0x00000000U, \ 108*a391d494SPritesh Raithatha } 109*a391d494SPritesh Raithatha 110*a391d494SPritesh Raithatha #define _START_OF_TABLE_ \ 111*a391d494SPritesh Raithatha { \ 112*a391d494SPritesh Raithatha .reg = 0xCAFE05C7U, \ 113*a391d494SPritesh Raithatha .val = 0x00000000U, \ 114*a391d494SPritesh Raithatha } 115*a391d494SPritesh Raithatha 116*a391d494SPritesh Raithatha #define _END_OF_TABLE_ \ 117*a391d494SPritesh Raithatha { \ 118*a391d494SPritesh Raithatha .reg = 0xFFFFFFFFU, \ 119*a391d494SPritesh Raithatha .val = 0xFFFFFFFFU, \ 120*a391d494SPritesh Raithatha } 121*a391d494SPritesh Raithatha 12206803cfdSPritesh Raithatha /******************************************************************************* 12306803cfdSPritesh Raithatha * Structure to hold Memory Controller's Configuration settings 12406803cfdSPritesh Raithatha ******************************************************************************/ 12506803cfdSPritesh Raithatha typedef struct tegra_mc_settings { 12606803cfdSPritesh Raithatha const uint32_t *streamid_override_cfg; 12706803cfdSPritesh Raithatha uint32_t num_streamid_override_cfgs; 12806803cfdSPritesh Raithatha const mc_streamid_security_cfg_t *streamid_security_cfg; 12906803cfdSPritesh Raithatha uint32_t num_streamid_security_cfgs; 13006803cfdSPritesh Raithatha const mc_txn_override_cfg_t *txn_override_cfg; 13106803cfdSPritesh Raithatha uint32_t num_txn_override_cfgs; 132ab2eb455SPuneet Saxena void (*reconfig_mss_clients)(void); 133ab2eb455SPuneet Saxena void (*set_txn_overrides)(void); 134*a391d494SPritesh Raithatha mc_regs_t* (*get_mc_system_suspend_ctx)(void); 13506803cfdSPritesh Raithatha } tegra_mc_settings_t; 13606803cfdSPritesh Raithatha 137412dd5c5SVarun Wadekar static inline uint32_t tegra_mc_read_32(uint32_t off) 138412dd5c5SVarun Wadekar { 139412dd5c5SVarun Wadekar return mmio_read_32(TEGRA_MC_BASE + off); 140412dd5c5SVarun Wadekar } 141412dd5c5SVarun Wadekar 142412dd5c5SVarun Wadekar static inline void tegra_mc_write_32(uint32_t off, uint32_t val) 143412dd5c5SVarun Wadekar { 144412dd5c5SVarun Wadekar mmio_write_32(TEGRA_MC_BASE + off, val); 145412dd5c5SVarun Wadekar } 146412dd5c5SVarun Wadekar 147412dd5c5SVarun Wadekar static inline uint32_t tegra_mc_streamid_read_32(uint32_t off) 148412dd5c5SVarun Wadekar { 149412dd5c5SVarun Wadekar return mmio_read_32(TEGRA_MC_STREAMID_BASE + off); 150412dd5c5SVarun Wadekar } 151412dd5c5SVarun Wadekar 152412dd5c5SVarun Wadekar static inline void tegra_mc_streamid_write_32(uint32_t off, uint32_t val) 153412dd5c5SVarun Wadekar { 154412dd5c5SVarun Wadekar mmio_write_32(TEGRA_MC_STREAMID_BASE + off, val); 155412dd5c5SVarun Wadekar } 156412dd5c5SVarun Wadekar 157e64ce3abSVarun Wadekar #define mc_set_pcfifo_unordered_boot_so_mss(id, client) \ 158aa64c5fbSAnthony Zhou ((uint32_t)~MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_MASK | \ 159e64ce3abSVarun Wadekar MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_UNORDERED) 160e64ce3abSVarun Wadekar 161b86e691eSKrishna Reddy #define mc_set_pcfifo_ordered_boot_so_mss(id, client) \ 162b86e691eSKrishna Reddy MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_ORDERED 163e64ce3abSVarun Wadekar 164e64ce3abSVarun Wadekar #define mc_set_tsa_passthrough(client) \ 165e64ce3abSVarun Wadekar { \ 166e64ce3abSVarun Wadekar mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSW_##client, \ 167e64ce3abSVarun Wadekar (TSA_CONFIG_STATIC0_CSW_##client##_RESET & \ 16861beb3e0SAnthony Zhou (uint32_t)~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \ 16961beb3e0SAnthony Zhou (uint32_t)TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \ 170e64ce3abSVarun Wadekar } 171e64ce3abSVarun Wadekar 172ab2eb455SPuneet Saxena #define mc_set_tsa_w_passthrough(client) \ 173ab2eb455SPuneet Saxena { \ 174ab2eb455SPuneet Saxena mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSW_##client, \ 175ab2eb455SPuneet Saxena (TSA_CONFIG_STATIC0_CSW_RESET_W & \ 176ab2eb455SPuneet Saxena (uint32_t)~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \ 177ab2eb455SPuneet Saxena (uint32_t)TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \ 178ab2eb455SPuneet Saxena } 179ab2eb455SPuneet Saxena 180ab2eb455SPuneet Saxena #define mc_set_tsa_r_passthrough(client) \ 181ab2eb455SPuneet Saxena { \ 182ab2eb455SPuneet Saxena mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSR_##client, \ 183ab2eb455SPuneet Saxena (TSA_CONFIG_STATIC0_CSR_RESET_R & \ 184ab2eb455SPuneet Saxena (uint32_t)~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \ 185ab2eb455SPuneet Saxena (uint32_t)TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \ 186ab2eb455SPuneet Saxena } 187ab2eb455SPuneet Saxena 188b86e691eSKrishna Reddy #define mc_set_txn_override(client, normal_axi_id, so_dev_axi_id, normal_override, so_dev_override) \ 189e64ce3abSVarun Wadekar { \ 190e64ce3abSVarun Wadekar tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_##client, \ 191b86e691eSKrishna Reddy MC_TXN_OVERRIDE_##normal_axi_id | \ 192b86e691eSKrishna Reddy MC_TXN_OVERRIDE_CONFIG_COH_PATH_##so_dev_override##_SO_DEV | \ 193b86e691eSKrishna Reddy MC_TXN_OVERRIDE_CONFIG_COH_PATH_##normal_override##_NORMAL | \ 194b86e691eSKrishna Reddy MC_TXN_OVERRIDE_CONFIG_CGID_##so_dev_axi_id); \ 195e64ce3abSVarun Wadekar } 19606803cfdSPritesh Raithatha 19706803cfdSPritesh Raithatha /******************************************************************************* 19806803cfdSPritesh Raithatha * Handler to read memory configuration settings 19906803cfdSPritesh Raithatha * 20006803cfdSPritesh Raithatha * Implemented by SoCs under tegra/soc/txxx 20106803cfdSPritesh Raithatha ******************************************************************************/ 20206803cfdSPritesh Raithatha tegra_mc_settings_t *tegra_get_mc_settings(void); 20306803cfdSPritesh Raithatha 204d5bd0de6SVarun Wadekar /******************************************************************************* 205*a391d494SPritesh Raithatha * Handler to save MC settings before "System Suspend" to TZDRAM 206*a391d494SPritesh Raithatha * 207*a391d494SPritesh Raithatha * Implemented by Tegra common memctrl_v2 driver under common/drivers/memctrl 208*a391d494SPritesh Raithatha ******************************************************************************/ 209*a391d494SPritesh Raithatha void tegra_mc_save_context(uint64_t mc_ctx_addr); 210*a391d494SPritesh Raithatha 211*a391d494SPritesh Raithatha /******************************************************************************* 212d5bd0de6SVarun Wadekar * Handler to program the scratch registers with TZDRAM settings for the 213d5bd0de6SVarun Wadekar * resume firmware. 214d5bd0de6SVarun Wadekar * 215d5bd0de6SVarun Wadekar * Implemented by SoCs under tegra/soc/txxx 216d5bd0de6SVarun Wadekar ******************************************************************************/ 217d5bd0de6SVarun Wadekar void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes); 218d5bd0de6SVarun Wadekar 219d5dfdeb6SJulius Werner #endif /* __ASSEMBLER__ */ 220e64ce3abSVarun Wadekar 221c3cf06f1SAntonio Nino Diaz #endif /* MEMCTRL_V2_H */ 222