xref: /optee_os/core/arch/arm/plat-sam/matrix.h (revision 45febb458e2a4ad5496bc1b287db835d526a769b)
1 /* SPDX-License-Identifier: BSD-Source-Code */
2 /* ----------------------------------------------------------------------------
3  *         ATMEL Microcontroller Software Support
4  * ----------------------------------------------------------------------------
5  * Copyright (c) 2013, Atmel Corporation
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * - Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the disclaimer below.
14  *
15  * Atmel's name may not be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
21  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 #ifndef MATRIX_H
30 #define MATRIX_H
31 
32 #include <mm/core_memprot.h>
33 #include <stdint.h>
34 #include <tee_api_types.h>
35 
36 #define SECURITY_TYPE_AS	1
37 #define SECURITY_TYPE_NS	2
38 #define SECURITY_TYPE_PS	3
39 
40 #define MATRIX_SPSELR_COUNT	3
41 #define MATRIX_SLAVE_COUNT	15
42 
43 #ifdef CFG_PM_ARM32
44 struct matrix_state {
45 	uint32_t spselr[MATRIX_SPSELR_COUNT];
46 	uint32_t ssr[MATRIX_SLAVE_COUNT];
47 	uint32_t srtsr[MATRIX_SLAVE_COUNT];
48 	uint32_t sassr[MATRIX_SLAVE_COUNT];
49 	uint32_t meier;
50 	uint32_t meimr;
51 };
52 #endif
53 
54 struct matrix {
55 	unsigned int matrix;
56 	struct io_pa_va p;
57 #ifdef CFG_PM_ARM32
58 	struct matrix_state state;
59 #endif
60 };
61 
62 struct peri_security {
63 	unsigned int peri_id;
64 	unsigned int matrix;
65 	unsigned int security_type;
66 	paddr_t addr;
67 };
68 
69 struct peri_security *peri_security_get(unsigned int idx);
70 struct matrix *matrix_get(unsigned int idx);
71 vaddr_t matrix_base(unsigned int matrix);
72 
73 void matrix_write_protect_enable(unsigned int matrix_base);
74 void matrix_write_protect_disable(unsigned int matrix_base);
75 void matrix_configure_slave_security(unsigned int matrix_base,
76 				     unsigned int slave,
77 				     unsigned int srtop_setting,
78 				     unsigned int srsplit_setting,
79 				     unsigned int ssr_setting);
80 
81 int matrix_configure_periph_non_secure(unsigned int *peri_id_array,
82 				       unsigned int size);
83 int matrix_configure_periph_secure(unsigned int peri_id);
84 TEE_Result matrix_dt_get_id(const void *fdt, int node, unsigned int *id);
85 
86 #endif /* #ifndef MATRIX_H */
87