xref: /optee_os/core/drivers/imx_snvs.c (revision c2e4eb43b7b7211345cd38ceceac97773bd78d2c)
11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2c6ac89bcSPeng Fan /*
3599784c7SRouven Czerwinski  * Copyright (C) 2020 Pengutronix
4599784c7SRouven Czerwinski  * Rouven Czerwinski <entwicklung@pengutronix.de>
5c6ac89bcSPeng Fan  */
6c6ac89bcSPeng Fan 
7c6ac89bcSPeng Fan #include <io.h>
8c6ac89bcSPeng Fan #include <drivers/imx_snvs.h>
9c6ac89bcSPeng Fan #include <mm/core_memprot.h>
10c6ac89bcSPeng Fan #include <mm/core_mmu.h>
11c6ac89bcSPeng Fan #include <stdint.h>
12c6ac89bcSPeng Fan #include <types_ext.h>
13c6ac89bcSPeng Fan #include <trace.h>
14c6ac89bcSPeng Fan 
15599784c7SRouven Czerwinski enum snvs_security_cfg snvs_get_security_cfg(void)
16c6ac89bcSPeng Fan {
17*c2e4eb43SAnton Rybakov 	vaddr_t snvs = core_mmu_get_va(SNVS_BASE, MEM_AREA_IO_SEC,
18*c2e4eb43SAnton Rybakov 				       SNVS_HPSR + sizeof(uint32_t));
19599784c7SRouven Czerwinski 	uint32_t val = 0;
20c6ac89bcSPeng Fan 
21599784c7SRouven Czerwinski 	val = io_read32(snvs + SNVS_HPSR);
22599784c7SRouven Czerwinski 	DMSG("HPSR: 0x%"PRIx32, val);
23599784c7SRouven Czerwinski 	if (val & SNVS_HPSR_SYS_SECURITY_BAD)
24599784c7SRouven Czerwinski 		return SNVS_SECURITY_CFG_FIELD_RETURN;
25599784c7SRouven Czerwinski 	else if (val & SNVS_HPSR_SYS_SECURITY_CLOSED)
26599784c7SRouven Czerwinski 		return SNVS_SECURITY_CFG_CLOSED;
27599784c7SRouven Czerwinski 	else if (val & SNVS_HPSR_SYS_SECURITY_OPEN)
28599784c7SRouven Czerwinski 		return SNVS_SECURITY_CFG_OPEN;
29599784c7SRouven Czerwinski 	else if (val > 4 && val < 8)
30599784c7SRouven Czerwinski 		return SNVS_SECURITY_CFG_OPEN;
31c6ac89bcSPeng Fan 
32599784c7SRouven Czerwinski 	return SNVS_SECURITY_CFG_FAB;
33c6ac89bcSPeng Fan }
34c6ac89bcSPeng Fan 
35599784c7SRouven Czerwinski enum snvs_ssm_mode snvs_get_ssm_mode(void)
36c6ac89bcSPeng Fan {
37*c2e4eb43SAnton Rybakov 	vaddr_t snvs = core_mmu_get_va(SNVS_BASE, MEM_AREA_IO_SEC,
38*c2e4eb43SAnton Rybakov 				       SNVS_HPSR + sizeof(uint32_t));
39599784c7SRouven Czerwinski 	uint32_t val = 0;
40c6ac89bcSPeng Fan 
41599784c7SRouven Czerwinski 	val = io_read32(snvs + SNVS_HPSR);
42599784c7SRouven Czerwinski 	val &= HPSR_SSM_ST_MASK;
43599784c7SRouven Czerwinski 	val = val >> HPSR_SSM_ST_SHIFT;
44599784c7SRouven Czerwinski 	DMSG("HPSR: SSM ST Mode: 0x%01"PRIx32, val);
45599784c7SRouven Czerwinski 	return val;
46c6ac89bcSPeng Fan }
47