xref: /rk3399_ARM-atf/plat/nvidia/tegra/include/drivers/memctrl_v2.h (revision e180cdbac177ae14794edd1fe352b379e0a97336)
1412dd5c5SVarun Wadekar /*
2*c959ea78SManish V Badarkhe  * Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
308e60f80SVarun Wadekar  * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
4412dd5c5SVarun Wadekar  *
582cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
6412dd5c5SVarun Wadekar  */
7412dd5c5SVarun Wadekar 
8c3cf06f1SAntonio Nino Diaz #ifndef MEMCTRL_V2_H
9c3cf06f1SAntonio Nino Diaz #define MEMCTRL_V2_H
10412dd5c5SVarun Wadekar 
1108e60f80SVarun Wadekar #include <arch.h>
1208e60f80SVarun Wadekar 
13412dd5c5SVarun Wadekar #include <tegra_def.h>
14412dd5c5SVarun Wadekar 
15ab2eb455SPuneet Saxena /*******************************************************************************
16ab2eb455SPuneet Saxena  * Memory Controller SMMU Bypass config register
17ab2eb455SPuneet Saxena  ******************************************************************************/
18ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CONFIG			0x1820U
19ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CTRL_MASK		0x3U
20ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CTRL_SHIFT		0U
21ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_BYPASS_ALL		(0U << MC_SMMU_BYPASS_CTRL_SHIFT)
22ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_RSVD			(1U << MC_SMMU_BYPASS_CTRL_SHIFT)
23ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_BYPASS_SPL_STREAMID	(2U << MC_SMMU_BYPASS_CTRL_SHIFT)
24ab2eb455SPuneet Saxena #define MC_SMMU_CTRL_TBU_BYPASS_NONE		(3U << MC_SMMU_BYPASS_CTRL_SHIFT)
25ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CONFIG_WRITE_ACCESS_BIT	(1U << 31)
26ab2eb455SPuneet Saxena #define MC_SMMU_BYPASS_CONFIG_SETTINGS		(MC_SMMU_BYPASS_CONFIG_WRITE_ACCESS_BIT | \
27ab2eb455SPuneet Saxena 						 MC_SMMU_CTRL_TBU_BYPASS_SPL_STREAMID)
28412dd5c5SVarun Wadekar 
29*c959ea78SManish V Badarkhe #ifndef	__ASSEMBLER__
30412dd5c5SVarun Wadekar 
312561cb50SAnthony Zhou #include <assert.h>
322561cb50SAnthony Zhou 
33a391d494SPritesh Raithatha typedef struct mc_regs {
34a391d494SPritesh Raithatha 	uint32_t reg;
35a391d494SPritesh Raithatha 	uint32_t val;
36a391d494SPritesh Raithatha } mc_regs_t;
37a391d494SPritesh Raithatha 
38a391d494SPritesh Raithatha #define mc_smmu_bypass_cfg \
39a391d494SPritesh Raithatha 	{ \
40a391d494SPritesh Raithatha 		.reg = TEGRA_MC_BASE + MC_SMMU_BYPASS_CONFIG, \
41a391d494SPritesh Raithatha 		.val = 0x00000000U, \
42a391d494SPritesh Raithatha 	}
43a391d494SPritesh Raithatha 
44a391d494SPritesh Raithatha #define _START_OF_TABLE_ \
45a391d494SPritesh Raithatha 	{ \
46a391d494SPritesh Raithatha 		.reg = 0xCAFE05C7U, \
47a391d494SPritesh Raithatha 		.val = 0x00000000U, \
48a391d494SPritesh Raithatha 	}
49a391d494SPritesh Raithatha 
50a391d494SPritesh Raithatha #define _END_OF_TABLE_ \
51a391d494SPritesh Raithatha 	{ \
52a391d494SPritesh Raithatha 		.reg = 0xFFFFFFFFU, \
53a391d494SPritesh Raithatha 		.val = 0xFFFFFFFFU, \
54a391d494SPritesh Raithatha 	}
55a391d494SPritesh Raithatha 
56*c959ea78SManish V Badarkhe #endif /* __ASSEMBLER__ */
5708e60f80SVarun Wadekar 
58*c959ea78SManish V Badarkhe #ifndef __ASSEMBLER__
5908e60f80SVarun Wadekar 
6008e60f80SVarun Wadekar #include <lib/mmio.h>
6106803cfdSPritesh Raithatha 
tegra_mc_read_32(uint32_t off)62412dd5c5SVarun Wadekar static inline uint32_t tegra_mc_read_32(uint32_t off)
63412dd5c5SVarun Wadekar {
64412dd5c5SVarun Wadekar 	return mmio_read_32(TEGRA_MC_BASE + off);
65412dd5c5SVarun Wadekar }
66412dd5c5SVarun Wadekar 
tegra_mc_write_32(uint32_t off,uint32_t val)67412dd5c5SVarun Wadekar static inline void tegra_mc_write_32(uint32_t off, uint32_t val)
68412dd5c5SVarun Wadekar {
69412dd5c5SVarun Wadekar 	mmio_write_32(TEGRA_MC_BASE + off, val);
70412dd5c5SVarun Wadekar }
71412dd5c5SVarun Wadekar 
7221ec61a9SVarun Wadekar #if defined(TEGRA_MC_STREAMID_BASE)
tegra_mc_streamid_read_32(uint32_t off)73412dd5c5SVarun Wadekar static inline uint32_t tegra_mc_streamid_read_32(uint32_t off)
74412dd5c5SVarun Wadekar {
75412dd5c5SVarun Wadekar 	return mmio_read_32(TEGRA_MC_STREAMID_BASE + off);
76412dd5c5SVarun Wadekar }
77412dd5c5SVarun Wadekar 
tegra_mc_streamid_write_32(uint32_t off,uint32_t val)78412dd5c5SVarun Wadekar static inline void tegra_mc_streamid_write_32(uint32_t off, uint32_t val)
79412dd5c5SVarun Wadekar {
80412dd5c5SVarun Wadekar 	mmio_write_32(TEGRA_MC_STREAMID_BASE + off, val);
812561cb50SAnthony Zhou 	assert(mmio_read_32(TEGRA_MC_STREAMID_BASE + off) == val);
82412dd5c5SVarun Wadekar }
8321ec61a9SVarun Wadekar #endif
84412dd5c5SVarun Wadekar 
8508e60f80SVarun Wadekar void plat_memctrl_setup(void);
86e64ce3abSVarun Wadekar 
8708e60f80SVarun Wadekar void plat_memctrl_restore(void);
8808e60f80SVarun Wadekar mc_regs_t *plat_memctrl_get_sys_suspend_ctx(void);
8906803cfdSPritesh Raithatha 
90d5bd0de6SVarun Wadekar /*******************************************************************************
91a391d494SPritesh Raithatha  * Handler to save MC settings before "System Suspend" to TZDRAM
92a391d494SPritesh Raithatha  *
93a391d494SPritesh Raithatha  * Implemented by Tegra common memctrl_v2 driver under common/drivers/memctrl
94a391d494SPritesh Raithatha  ******************************************************************************/
95a391d494SPritesh Raithatha void tegra_mc_save_context(uint64_t mc_ctx_addr);
96a391d494SPritesh Raithatha 
97a391d494SPritesh Raithatha /*******************************************************************************
98d5bd0de6SVarun Wadekar  * Handler to program the scratch registers with TZDRAM settings for the
99d5bd0de6SVarun Wadekar  * resume firmware.
100d5bd0de6SVarun Wadekar  *
101d5bd0de6SVarun Wadekar  * Implemented by SoCs under tegra/soc/txxx
102d5bd0de6SVarun Wadekar  ******************************************************************************/
103d5bd0de6SVarun Wadekar void plat_memctrl_tzdram_setup(uint64_t phys_base, uint64_t size_in_bytes);
104d5bd0de6SVarun Wadekar 
105d5dfdeb6SJulius Werner #endif /* __ASSEMBLER__ */
106e64ce3abSVarun Wadekar 
107c3cf06f1SAntonio Nino Diaz #endif /* MEMCTRL_V2_H */
108