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