xref: /rk3399_rockchip-uboot/drivers/misc/fsl_sec_mon.c (revision fe78378d7df90541c09b279b67ce79ebbdca93d5)
1*fe78378dSgaurav rana /*
2*fe78378dSgaurav rana  * Copyright 2015 Freescale Semiconductor, Inc.
3*fe78378dSgaurav rana  *
4*fe78378dSgaurav rana  * SPDX-License-Identifier:	GPL-2.0+
5*fe78378dSgaurav rana  */
6*fe78378dSgaurav rana 
7*fe78378dSgaurav rana #include <common.h>
8*fe78378dSgaurav rana #include <fsl_sec_mon.h>
9*fe78378dSgaurav rana 
10*fe78378dSgaurav rana int change_sec_mon_state(u32 initial_state, u32 final_state)
11*fe78378dSgaurav rana {
12*fe78378dSgaurav rana 	struct ccsr_sec_mon_regs *sec_mon_regs = (void *)
13*fe78378dSgaurav rana 						(CONFIG_SYS_SEC_MON_ADDR);
14*fe78378dSgaurav rana 	u32 sts = sec_mon_in32(&sec_mon_regs->hp_stat);
15*fe78378dSgaurav rana 	int timeout = 10;
16*fe78378dSgaurav rana 
17*fe78378dSgaurav rana 	if ((sts & HPSR_SSM_ST_MASK) != initial_state)
18*fe78378dSgaurav rana 		return -1;
19*fe78378dSgaurav rana 
20*fe78378dSgaurav rana 	if (initial_state == HPSR_SSM_ST_TRUST) {
21*fe78378dSgaurav rana 		switch (final_state) {
22*fe78378dSgaurav rana 		case HPSR_SSM_ST_NON_SECURE:
23*fe78378dSgaurav rana 			printf("SEC_MON state transitioning to Soft Fail.\n");
24*fe78378dSgaurav rana 			sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SW_SV);
25*fe78378dSgaurav rana 
26*fe78378dSgaurav rana 			/*
27*fe78378dSgaurav rana 			 * poll till SEC_MON is in
28*fe78378dSgaurav rana 			 * Soft Fail state
29*fe78378dSgaurav rana 			 */
30*fe78378dSgaurav rana 			while (((sts & HPSR_SSM_ST_MASK) !=
31*fe78378dSgaurav rana 				HPSR_SSM_ST_SOFT_FAIL)) {
32*fe78378dSgaurav rana 				while (timeout) {
33*fe78378dSgaurav rana 					sts = sec_mon_in32
34*fe78378dSgaurav rana 						(&sec_mon_regs->hp_stat);
35*fe78378dSgaurav rana 
36*fe78378dSgaurav rana 					if ((sts & HPSR_SSM_ST_MASK) ==
37*fe78378dSgaurav rana 						HPSR_SSM_ST_SOFT_FAIL)
38*fe78378dSgaurav rana 						break;
39*fe78378dSgaurav rana 
40*fe78378dSgaurav rana 					udelay(10);
41*fe78378dSgaurav rana 					timeout--;
42*fe78378dSgaurav rana 				}
43*fe78378dSgaurav rana 			}
44*fe78378dSgaurav rana 
45*fe78378dSgaurav rana 			if (timeout == 0) {
46*fe78378dSgaurav rana 				printf("SEC_MON state transition timeout.\n");
47*fe78378dSgaurav rana 				return -1;
48*fe78378dSgaurav rana 			}
49*fe78378dSgaurav rana 
50*fe78378dSgaurav rana 			timeout = 10;
51*fe78378dSgaurav rana 
52*fe78378dSgaurav rana 			printf("SEC_MON state transitioning to Non Secure.\n");
53*fe78378dSgaurav rana 			sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SSM_ST);
54*fe78378dSgaurav rana 
55*fe78378dSgaurav rana 			/*
56*fe78378dSgaurav rana 			 * poll till SEC_MON is in
57*fe78378dSgaurav rana 			 * Non Secure state
58*fe78378dSgaurav rana 			 */
59*fe78378dSgaurav rana 			while (((sts & HPSR_SSM_ST_MASK) !=
60*fe78378dSgaurav rana 				HPSR_SSM_ST_NON_SECURE)) {
61*fe78378dSgaurav rana 				while (timeout) {
62*fe78378dSgaurav rana 					sts = sec_mon_in32
63*fe78378dSgaurav rana 						(&sec_mon_regs->hp_stat);
64*fe78378dSgaurav rana 
65*fe78378dSgaurav rana 					if ((sts & HPSR_SSM_ST_MASK) ==
66*fe78378dSgaurav rana 						HPSR_SSM_ST_NON_SECURE)
67*fe78378dSgaurav rana 						break;
68*fe78378dSgaurav rana 
69*fe78378dSgaurav rana 					udelay(10);
70*fe78378dSgaurav rana 					timeout--;
71*fe78378dSgaurav rana 				}
72*fe78378dSgaurav rana 			}
73*fe78378dSgaurav rana 
74*fe78378dSgaurav rana 			if (timeout == 0) {
75*fe78378dSgaurav rana 				printf("SEC_MON state transition timeout.\n");
76*fe78378dSgaurav rana 				return -1;
77*fe78378dSgaurav rana 			}
78*fe78378dSgaurav rana 			break;
79*fe78378dSgaurav rana 		case HPSR_SSM_ST_SOFT_FAIL:
80*fe78378dSgaurav rana 			printf("SEC_MON state transitioning to Soft Fail.\n");
81*fe78378dSgaurav rana 			sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SW_FSV);
82*fe78378dSgaurav rana 
83*fe78378dSgaurav rana 			/*
84*fe78378dSgaurav rana 			 * polling loop till SEC_MON is in
85*fe78378dSgaurav rana 			 * Soft Fail state
86*fe78378dSgaurav rana 			 */
87*fe78378dSgaurav rana 			while (((sts & HPSR_SSM_ST_MASK) !=
88*fe78378dSgaurav rana 				HPSR_SSM_ST_SOFT_FAIL)) {
89*fe78378dSgaurav rana 				while (timeout) {
90*fe78378dSgaurav rana 					sts = sec_mon_in32
91*fe78378dSgaurav rana 						(&sec_mon_regs->hp_stat);
92*fe78378dSgaurav rana 
93*fe78378dSgaurav rana 					if ((sts & HPSR_SSM_ST_MASK) ==
94*fe78378dSgaurav rana 						HPSR_SSM_ST_SOFT_FAIL)
95*fe78378dSgaurav rana 						break;
96*fe78378dSgaurav rana 
97*fe78378dSgaurav rana 					udelay(10);
98*fe78378dSgaurav rana 					timeout--;
99*fe78378dSgaurav rana 				}
100*fe78378dSgaurav rana 			}
101*fe78378dSgaurav rana 
102*fe78378dSgaurav rana 			if (timeout == 0) {
103*fe78378dSgaurav rana 				printf("SEC_MON state transition timeout.\n");
104*fe78378dSgaurav rana 				return -1;
105*fe78378dSgaurav rana 			}
106*fe78378dSgaurav rana 			break;
107*fe78378dSgaurav rana 		default:
108*fe78378dSgaurav rana 			return -1;
109*fe78378dSgaurav rana 		}
110*fe78378dSgaurav rana 	} else if (initial_state == HPSR_SSM_ST_NON_SECURE) {
111*fe78378dSgaurav rana 		switch (final_state) {
112*fe78378dSgaurav rana 		case HPSR_SSM_ST_SOFT_FAIL:
113*fe78378dSgaurav rana 			printf("SEC_MON state transitioning to Soft Fail.\n");
114*fe78378dSgaurav rana 			sec_mon_setbits32(&sec_mon_regs->hp_com, HPCOMR_SW_FSV);
115*fe78378dSgaurav rana 
116*fe78378dSgaurav rana 			/*
117*fe78378dSgaurav rana 			 * polling loop till SEC_MON is in
118*fe78378dSgaurav rana 			 * Soft Fail state
119*fe78378dSgaurav rana 			 */
120*fe78378dSgaurav rana 			while (((sts & HPSR_SSM_ST_MASK) !=
121*fe78378dSgaurav rana 				HPSR_SSM_ST_SOFT_FAIL)) {
122*fe78378dSgaurav rana 				while (timeout) {
123*fe78378dSgaurav rana 					sts = sec_mon_in32
124*fe78378dSgaurav rana 						(&sec_mon_regs->hp_stat);
125*fe78378dSgaurav rana 
126*fe78378dSgaurav rana 					if ((sts & HPSR_SSM_ST_MASK) ==
127*fe78378dSgaurav rana 						HPSR_SSM_ST_SOFT_FAIL)
128*fe78378dSgaurav rana 						break;
129*fe78378dSgaurav rana 
130*fe78378dSgaurav rana 					udelay(10);
131*fe78378dSgaurav rana 					timeout--;
132*fe78378dSgaurav rana 				}
133*fe78378dSgaurav rana 			}
134*fe78378dSgaurav rana 
135*fe78378dSgaurav rana 			if (timeout == 0) {
136*fe78378dSgaurav rana 				printf("SEC_MON state transition timeout.\n");
137*fe78378dSgaurav rana 				return -1;
138*fe78378dSgaurav rana 			}
139*fe78378dSgaurav rana 			break;
140*fe78378dSgaurav rana 		default:
141*fe78378dSgaurav rana 			return -1;
142*fe78378dSgaurav rana 		}
143*fe78378dSgaurav rana 	}
144*fe78378dSgaurav rana 
145*fe78378dSgaurav rana 	return 0;
146*fe78378dSgaurav rana }
147