xref: /rk3399_ARM-atf/include/drivers/arm/tzc_dmc500.h (revision 01c44dddbda2bf74dff4bdbaee43177236982887)
1f568604bSVikram Kanigiri /*
2af6491f8SAntonio Nino Diaz  * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
3f568604bSVikram Kanigiri  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5f568604bSVikram Kanigiri  */
6f568604bSVikram Kanigiri 
7af6491f8SAntonio Nino Diaz #ifndef TZC_DMC500_H
8af6491f8SAntonio Nino Diaz #define TZC_DMC500_H
9f568604bSVikram Kanigiri 
1009d40e0eSAntonio Nino Diaz #include <drivers/arm/tzc_common.h>
1109d40e0eSAntonio Nino Diaz #include <lib/utils_def.h>
12f568604bSVikram Kanigiri 
13af6491f8SAntonio Nino Diaz #define SI_STATUS_OFFSET				U(0x000)
14af6491f8SAntonio Nino Diaz #define SI_STATE_CTRL_OFFSET				U(0x030)
15af6491f8SAntonio Nino Diaz #define SI_FLUSH_CTRL_OFFSET				U(0x034)
16af6491f8SAntonio Nino Diaz #define SI_INT_CONTROL_OFFSET				U(0x048)
17f568604bSVikram Kanigiri 
18af6491f8SAntonio Nino Diaz #define SI_INT_STATUS_OFFSET				U(0x004)
19af6491f8SAntonio Nino Diaz #define SI_TZ_FAIL_ADDRESS_LOW_OFFSET			U(0x008)
20af6491f8SAntonio Nino Diaz #define SI_TZ_FAIL_ADDRESS_HIGH_OFFSET			U(0x00c)
21af6491f8SAntonio Nino Diaz #define SI_FAIL_CONTROL_OFFSET				U(0x010)
22af6491f8SAntonio Nino Diaz #define SI_FAIL_ID_OFFSET				U(0x014)
23af6491f8SAntonio Nino Diaz #define SI_INT_CLR_OFFSET				U(0x04c)
24f568604bSVikram Kanigiri 
25f568604bSVikram Kanigiri /*
26f568604bSVikram Kanigiri  * DMC-500 has 2 system interfaces each having a similar set of regs
27f568604bSVikram Kanigiri  * to configure each interface.
28f568604bSVikram Kanigiri  */
29af6491f8SAntonio Nino Diaz #define SI0_BASE					U(0x0000)
30af6491f8SAntonio Nino Diaz #define SI1_BASE					U(0x0200)
31f568604bSVikram Kanigiri 
32f568604bSVikram Kanigiri /* Bit positions of SIx_SI_STATUS */
33af6491f8SAntonio Nino Diaz #define SI_EMPTY_SHIFT					1
34af6491f8SAntonio Nino Diaz #define SI_STALL_ACK_SHIFT				0
35af6491f8SAntonio Nino Diaz #define SI_EMPTY_MASK					U(0x01)
36af6491f8SAntonio Nino Diaz #define SI_STALL_ACK_MASK				U(0x01)
37f568604bSVikram Kanigiri 
38f568604bSVikram Kanigiri /* Bit positions of SIx_SI_INT_STATUS */
39f568604bSVikram Kanigiri #define PMU_REQ_INT_OVERFLOW_STATUS_SHIFT		18
40f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_OVERFLOW_STATUS_SHIFT		16
41f568604bSVikram Kanigiri #define PMU_REQ_INT_STATUS_SHIFT			2
42f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_INFO_TZ_OVERLAP_STATUS_SHIFT	1
43f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_STATUS_SHIFT			0
44af6491f8SAntonio Nino Diaz #define PMU_REQ_INT_OVERFLOW_STATUS_MASK		U(0x1)
45af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_OVERFLOW_STATUS_MASK		U(0x1)
46af6491f8SAntonio Nino Diaz #define PMU_REQ_INT_STATUS_MASK				U(0x1)
47af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_INFO_TZ_OVERLAP_STATUS_MASK	U(0x1)
48af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_STATUS_MASK			U(0x1)
49f568604bSVikram Kanigiri 
50f568604bSVikram Kanigiri /* Bit positions of SIx_TZ_FAIL_CONTROL */
51f568604bSVikram Kanigiri #define DIRECTION_SHIFT					24
52f568604bSVikram Kanigiri #define NON_SECURE_SHIFT				21
53f568604bSVikram Kanigiri #define PRIVILEGED_SHIFT				20
54f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_INFO_RANK_MASKED_SHIFT	3
55f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_INFO_UNMAPPED_SHIFT		2
56af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_TZ_FAIL_SHIFT			1
57f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_INFO_OUTSIDE_DEFAULT_SHIFT	0
58af6491f8SAntonio Nino Diaz #define DIRECTION_MASK					U(0x1)
59af6491f8SAntonio Nino Diaz #define NON_SECURE_MASK					U(0x1)
60af6491f8SAntonio Nino Diaz #define PRIVILEGED_MASK					U(0x1)
61af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_INFO_RANK_MASKED_MASK		U(0x1)
62af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_INFO_UNMAPPED_MASK		U(0x1)
63af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_TZ_FAIL_MASK			U(0x1)
64af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_INFO_OUTSIDE_DEFAULT_MASK	U(0x1)
65f568604bSVikram Kanigiri 
66f568604bSVikram Kanigiri /* Bit positions of SIx_FAIL_STATUS */
67f568604bSVikram Kanigiri #define FAIL_ID_VNET_SHIFT				24
68f568604bSVikram Kanigiri #define FAIL_ID_ID_SHIFT				0
69af6491f8SAntonio Nino Diaz #define FAIL_ID_VNET_MASK				U(0xf)
70af6491f8SAntonio Nino Diaz #define FAIL_ID_ID_MASK					U(0xffffff)
71f568604bSVikram Kanigiri 
72f568604bSVikram Kanigiri /* Bit positions of SIx_SI_STATE_CONTRL */
73f568604bSVikram Kanigiri #define SI_STALL_REQ_GO					0x0
74f568604bSVikram Kanigiri #define SI_STALL_REQ_STALL				0x1
75f568604bSVikram Kanigiri 
76f568604bSVikram Kanigiri /* Bit positions of SIx_SI_FLUSH_CONTROL */
77f568604bSVikram Kanigiri #define SI_FLUSH_REQ_INACTIVE				0x0
78f568604bSVikram Kanigiri #define SI_FLUSH_REQ_ACTIVE				0x1
79f568604bSVikram Kanigiri #define SI_FLUSH_REQ_MASK				0x1
80f568604bSVikram Kanigiri 
81f568604bSVikram Kanigiri /* Bit positions of SIx_SI_INT_CONTROL */
82f568604bSVikram Kanigiri #define PMU_REQ_INT_EN_SHIFT				2
83f568604bSVikram Kanigiri #define OVERLAP_DETECT_INT_EN_SHIFT			1
84f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_EN_SHIFT			0
85af6491f8SAntonio Nino Diaz #define PMU_REQ_INT_EN_MASK				U(0x1)
86af6491f8SAntonio Nino Diaz #define OVERLAP_DETECT_INT_EN_MASK			U(0x1)
87af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_EN_MASK			U(0x1)
88af6491f8SAntonio Nino Diaz #define PMU_REQ_INT_EN					U(0x1)
89af6491f8SAntonio Nino Diaz #define OVERLAP_DETECT_INT_EN				U(0x1)
90af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_EN				U(0x1)
91f568604bSVikram Kanigiri 
92f568604bSVikram Kanigiri /* Bit positions of SIx_SI_INT_CLR */
93f568604bSVikram Kanigiri #define PMU_REQ_OFLOW_CLR_SHIFT				18
94f568604bSVikram Kanigiri #define FAILED_ACCESS_OFLOW_CLR_SHIFT			16
95f568604bSVikram Kanigiri #define PMU_REQ_INT_CLR_SHIFT				2
96f568604bSVikram Kanigiri #define FAILED_ACCESS_INT_CLR_SHIFT			0
97af6491f8SAntonio Nino Diaz #define PMU_REQ_OFLOW_CLR_MASK				U(0x1)
98af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_OFLOW_CLR_MASK			U(0x1)
99af6491f8SAntonio Nino Diaz #define PMU_REQ_INT_CLR_MASK				U(0x1)
100af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_CLR_MASK			U(0x1)
101af6491f8SAntonio Nino Diaz #define PMU_REQ_OFLOW_CLR				U(0x1)
102af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_OFLOW_CLR				U(0x1)
103af6491f8SAntonio Nino Diaz #define PMU_REQ_INT_CLR					U(0x1)
104af6491f8SAntonio Nino Diaz #define FAILED_ACCESS_INT_CLR				U(0x1)
105f568604bSVikram Kanigiri 
106f568604bSVikram Kanigiri /* Macro to get the correct base register for a system interface */
107f568604bSVikram Kanigiri #define IFACE_OFFSET(sys_if)	((sys_if) ? SI1_BASE : SI0_BASE)
108f568604bSVikram Kanigiri 
109af6491f8SAntonio Nino Diaz #define MAX_SYS_IF_COUNT				U(2)
110f568604bSVikram Kanigiri #define MAX_REGION_VAL					8
111f568604bSVikram Kanigiri 
112f568604bSVikram Kanigiri /* DMC-500 supports striping across a max of 4 DMC instances */
113f568604bSVikram Kanigiri #define MAX_DMC_COUNT					4
114f568604bSVikram Kanigiri 
115f568604bSVikram Kanigiri /* Consist of part_number_1 and part_number_0 */
116af6491f8SAntonio Nino Diaz #define DMC500_PERIPHERAL_ID				U(0x0450)
117f568604bSVikram Kanigiri 
118f568604bSVikram Kanigiri /* Filter enable bits in a TZC */
119af6491f8SAntonio Nino Diaz #define TZC_DMC500_REGION_ATTR_F_EN_MASK		U(0x1)
120f568604bSVikram Kanigiri 
121f568604bSVikram Kanigiri /* Length of registers for configuring each region */
122af6491f8SAntonio Nino Diaz #define TZC_DMC500_REGION_SIZE				U(0x018)
123f568604bSVikram Kanigiri 
124*d5dfdeb6SJulius Werner #ifndef __ASSEMBLER__
125f568604bSVikram Kanigiri 
126f568604bSVikram Kanigiri #include <stdint.h>
127f568604bSVikram Kanigiri 
128f568604bSVikram Kanigiri /*
129f568604bSVikram Kanigiri  * Contains the base addresses of all the DMC instances.
130f568604bSVikram Kanigiri  */
131f568604bSVikram Kanigiri typedef struct tzc_dmc500_driver_data {
132f568604bSVikram Kanigiri 	uintptr_t dmc_base[MAX_DMC_COUNT];
133f568604bSVikram Kanigiri 	int dmc_count;
134d12afc8eSAmit Daniel Kachhap 	unsigned int sys_if_count;
135f568604bSVikram Kanigiri } tzc_dmc500_driver_data_t;
136f568604bSVikram Kanigiri 
137f568604bSVikram Kanigiri void tzc_dmc500_driver_init(const tzc_dmc500_driver_data_t *plat_driver_data);
138af6491f8SAntonio Nino Diaz void tzc_dmc500_configure_region0(unsigned int sec_attr,
139f568604bSVikram Kanigiri 				unsigned int nsaid_permissions);
140af6491f8SAntonio Nino Diaz void tzc_dmc500_configure_region(unsigned int region_no,
1419fbdb802SYatharth Kochar 				unsigned long long region_base,
1429fbdb802SYatharth Kochar 				unsigned long long region_top,
143af6491f8SAntonio Nino Diaz 				unsigned int sec_attr,
144f568604bSVikram Kanigiri 				unsigned int nsaid_permissions);
145af6491f8SAntonio Nino Diaz void tzc_dmc500_set_action(unsigned int action);
146f568604bSVikram Kanigiri void tzc_dmc500_config_complete(void);
147f568604bSVikram Kanigiri int tzc_dmc500_verify_complete(void);
148f568604bSVikram Kanigiri 
149f568604bSVikram Kanigiri 
150*d5dfdeb6SJulius Werner #endif /* __ASSEMBLER__ */
151af6491f8SAntonio Nino Diaz #endif /* TZC_DMC500_H */
152