xref: /rk3399_ARM-atf/plat/nvidia/tegra/include/drivers/memctrl_v2.h (revision 21ec61a904d8003ab9b0f0092c24ecdd69327587)
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 
87a391d494SPritesh Raithatha typedef struct mc_regs {
88a391d494SPritesh Raithatha 	uint32_t reg;
89a391d494SPritesh Raithatha 	uint32_t val;
90a391d494SPritesh Raithatha } mc_regs_t;
91a391d494SPritesh Raithatha 
92a391d494SPritesh Raithatha #define mc_make_sid_override_cfg(name) \
93a391d494SPritesh Raithatha 	{ \
94a391d494SPritesh Raithatha 		.reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_CFG_ ## name, \
95a391d494SPritesh Raithatha 		.val = 0x00000000U, \
96a391d494SPritesh Raithatha 	}
97a391d494SPritesh Raithatha 
98a391d494SPritesh Raithatha #define mc_make_sid_security_cfg(name) \
99a391d494SPritesh Raithatha 	{ \
100a391d494SPritesh Raithatha 		.reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_TO_SECURITY_CFG(MC_STREAMID_OVERRIDE_CFG_ ## name), \
101a391d494SPritesh Raithatha 		.val = 0x00000000U, \
102a391d494SPritesh Raithatha 	}
103a391d494SPritesh Raithatha 
104a391d494SPritesh Raithatha #define mc_smmu_bypass_cfg \
105a391d494SPritesh Raithatha 	{ \
106a391d494SPritesh Raithatha 		.reg = TEGRA_MC_BASE + MC_SMMU_BYPASS_CONFIG, \
107a391d494SPritesh Raithatha 		.val = 0x00000000U, \
108a391d494SPritesh Raithatha 	}
109a391d494SPritesh Raithatha 
110a391d494SPritesh Raithatha #define _START_OF_TABLE_ \
111a391d494SPritesh Raithatha 	{ \
112a391d494SPritesh Raithatha 		.reg = 0xCAFE05C7U, \
113a391d494SPritesh Raithatha 		.val = 0x00000000U, \
114a391d494SPritesh Raithatha 	}
115a391d494SPritesh Raithatha 
116a391d494SPritesh Raithatha #define _END_OF_TABLE_ \
117a391d494SPritesh Raithatha 	{ \
118a391d494SPritesh Raithatha 		.reg = 0xFFFFFFFFU, \
119a391d494SPritesh Raithatha 		.val = 0xFFFFFFFFU, \
120a391d494SPritesh Raithatha 	}
121a391d494SPritesh 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);
134a391d494SPritesh 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 
147*21ec61a9SVarun Wadekar #if defined(TEGRA_MC_STREAMID_BASE)
148412dd5c5SVarun Wadekar static inline uint32_t tegra_mc_streamid_read_32(uint32_t off)
149412dd5c5SVarun Wadekar {
150412dd5c5SVarun Wadekar 	return mmio_read_32(TEGRA_MC_STREAMID_BASE + off);
151412dd5c5SVarun Wadekar }
152412dd5c5SVarun Wadekar 
153412dd5c5SVarun Wadekar static inline void tegra_mc_streamid_write_32(uint32_t off, uint32_t val)
154412dd5c5SVarun Wadekar {
155412dd5c5SVarun Wadekar 	mmio_write_32(TEGRA_MC_STREAMID_BASE + off, val);
156412dd5c5SVarun Wadekar }
157*21ec61a9SVarun Wadekar #endif
158412dd5c5SVarun Wadekar 
159e64ce3abSVarun Wadekar #define mc_set_pcfifo_unordered_boot_so_mss(id, client) \
160aa64c5fbSAnthony Zhou 	((uint32_t)~MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_MASK | \
161e64ce3abSVarun Wadekar 	 MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_UNORDERED)
162e64ce3abSVarun Wadekar 
163b86e691eSKrishna Reddy #define mc_set_pcfifo_ordered_boot_so_mss(id, client) \
164b86e691eSKrishna Reddy 	 MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_ORDERED
165e64ce3abSVarun Wadekar 
166e64ce3abSVarun Wadekar #define mc_set_tsa_passthrough(client) \
167e64ce3abSVarun Wadekar 	{ \
168e64ce3abSVarun Wadekar 		mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSW_##client, \
169e64ce3abSVarun Wadekar 			(TSA_CONFIG_STATIC0_CSW_##client##_RESET & \
17061beb3e0SAnthony Zhou 			 (uint32_t)~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \
17161beb3e0SAnthony Zhou 			(uint32_t)TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \
172e64ce3abSVarun Wadekar 	}
173e64ce3abSVarun Wadekar 
174ab2eb455SPuneet Saxena #define mc_set_tsa_w_passthrough(client) \
175ab2eb455SPuneet Saxena 	{ \
176ab2eb455SPuneet Saxena 		mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSW_##client, \
177ab2eb455SPuneet Saxena 			(TSA_CONFIG_STATIC0_CSW_RESET_W & \
178ab2eb455SPuneet Saxena 			 (uint32_t)~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \
179ab2eb455SPuneet Saxena 			(uint32_t)TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \
180ab2eb455SPuneet Saxena 	}
181ab2eb455SPuneet Saxena 
182ab2eb455SPuneet Saxena #define mc_set_tsa_r_passthrough(client) \
183ab2eb455SPuneet Saxena 	{ \
184ab2eb455SPuneet Saxena 		mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSR_##client, \
185ab2eb455SPuneet Saxena 			(TSA_CONFIG_STATIC0_CSR_RESET_R & \
186ab2eb455SPuneet Saxena 			 (uint32_t)~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \
187ab2eb455SPuneet Saxena 			(uint32_t)TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \
188ab2eb455SPuneet Saxena 	}
189ab2eb455SPuneet Saxena 
190b86e691eSKrishna Reddy #define mc_set_txn_override(client, normal_axi_id, so_dev_axi_id, normal_override, so_dev_override) \
191e64ce3abSVarun Wadekar 	{ \
192e64ce3abSVarun Wadekar 		tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_##client, \
193b86e691eSKrishna Reddy 				  MC_TXN_OVERRIDE_##normal_axi_id | \
194b86e691eSKrishna Reddy 				  MC_TXN_OVERRIDE_CONFIG_COH_PATH_##so_dev_override##_SO_DEV | \
195b86e691eSKrishna Reddy 				  MC_TXN_OVERRIDE_CONFIG_COH_PATH_##normal_override##_NORMAL | \
196b86e691eSKrishna Reddy 				  MC_TXN_OVERRIDE_CONFIG_CGID_##so_dev_axi_id); \
197e64ce3abSVarun Wadekar 	}
19806803cfdSPritesh Raithatha 
19906803cfdSPritesh Raithatha /*******************************************************************************
20006803cfdSPritesh Raithatha  * Handler to read memory configuration settings
20106803cfdSPritesh Raithatha  *
20206803cfdSPritesh Raithatha  * Implemented by SoCs under tegra/soc/txxx
20306803cfdSPritesh Raithatha  ******************************************************************************/
20406803cfdSPritesh Raithatha tegra_mc_settings_t *tegra_get_mc_settings(void);
20506803cfdSPritesh Raithatha 
206d5bd0de6SVarun Wadekar /*******************************************************************************
207a391d494SPritesh Raithatha  * Handler to save MC settings before "System Suspend" to TZDRAM
208a391d494SPritesh Raithatha  *
209a391d494SPritesh Raithatha  * Implemented by Tegra common memctrl_v2 driver under common/drivers/memctrl
210a391d494SPritesh Raithatha  ******************************************************************************/
211a391d494SPritesh Raithatha void tegra_mc_save_context(uint64_t mc_ctx_addr);
212a391d494SPritesh Raithatha 
213a391d494SPritesh Raithatha /*******************************************************************************
214d5bd0de6SVarun Wadekar  * Handler to program the scratch registers with TZDRAM settings for the
215d5bd0de6SVarun Wadekar  * resume firmware.
216d5bd0de6SVarun Wadekar  *
217d5bd0de6SVarun Wadekar  * Implemented by SoCs under tegra/soc/txxx
218d5bd0de6SVarun Wadekar  ******************************************************************************/
219d5bd0de6SVarun Wadekar void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes);
220d5bd0de6SVarun Wadekar 
221d5dfdeb6SJulius Werner #endif /* __ASSEMBLER__ */
222e64ce3abSVarun Wadekar 
223c3cf06f1SAntonio Nino Diaz #endif /* MEMCTRL_V2_H */
224