1*3a9f8eecSGrzegorz Jaszczyk /* 2*3a9f8eecSGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd. 3*3a9f8eecSGrzegorz Jaszczyk * 4*3a9f8eecSGrzegorz Jaszczyk * SPDX-License-Identifier: BSD-3-Clause 5*3a9f8eecSGrzegorz Jaszczyk * https://spdx.org/licenses 6*3a9f8eecSGrzegorz Jaszczyk */ 7*3a9f8eecSGrzegorz Jaszczyk 8*3a9f8eecSGrzegorz Jaszczyk #include <addr_map.h> 9*3a9f8eecSGrzegorz Jaszczyk #include <debug.h> 10*3a9f8eecSGrzegorz Jaszczyk #include <mmio.h> 11*3a9f8eecSGrzegorz Jaszczyk #include <mvebu_def.h> 12*3a9f8eecSGrzegorz Jaszczyk #include "mc_trustzone.h" 13*3a9f8eecSGrzegorz Jaszczyk 14*3a9f8eecSGrzegorz Jaszczyk #define TZ_SIZE(x) ((x) >> 13) 15*3a9f8eecSGrzegorz Jaszczyk 16*3a9f8eecSGrzegorz Jaszczyk static int fls(int x) 17*3a9f8eecSGrzegorz Jaszczyk { 18*3a9f8eecSGrzegorz Jaszczyk if (!x) 19*3a9f8eecSGrzegorz Jaszczyk return 0; 20*3a9f8eecSGrzegorz Jaszczyk 21*3a9f8eecSGrzegorz Jaszczyk return 32 - __builtin_clz(x); 22*3a9f8eecSGrzegorz Jaszczyk } 23*3a9f8eecSGrzegorz Jaszczyk 24*3a9f8eecSGrzegorz Jaszczyk /* To not duplicate types, the addr_map_win is used, but the "target" 25*3a9f8eecSGrzegorz Jaszczyk * filed is referring to attributes instead of "target". 26*3a9f8eecSGrzegorz Jaszczyk */ 27*3a9f8eecSGrzegorz Jaszczyk void tz_enable_win(int ap_index, const struct addr_map_win *win, int win_id) 28*3a9f8eecSGrzegorz Jaszczyk { 29*3a9f8eecSGrzegorz Jaszczyk int tz_size; 30*3a9f8eecSGrzegorz Jaszczyk uint32_t val, base = win->base_addr; 31*3a9f8eecSGrzegorz Jaszczyk 32*3a9f8eecSGrzegorz Jaszczyk if ((win_id < 0) || (win_id > MVEBU_TZ_MAX_WINS)) { 33*3a9f8eecSGrzegorz Jaszczyk ERROR("Enabling wrong MC TrustZone window %d!\n", win_id); 34*3a9f8eecSGrzegorz Jaszczyk return; 35*3a9f8eecSGrzegorz Jaszczyk } 36*3a9f8eecSGrzegorz Jaszczyk 37*3a9f8eecSGrzegorz Jaszczyk /* map the window size to trustzone register convention */ 38*3a9f8eecSGrzegorz Jaszczyk tz_size = fls(TZ_SIZE(win->win_size)); 39*3a9f8eecSGrzegorz Jaszczyk 40*3a9f8eecSGrzegorz Jaszczyk VERBOSE("%s: window size = 0x%llx maps to tz_size %d\n", 41*3a9f8eecSGrzegorz Jaszczyk __func__, win->win_size, tz_size); 42*3a9f8eecSGrzegorz Jaszczyk if (tz_size < 0 || tz_size > 31) { 43*3a9f8eecSGrzegorz Jaszczyk ERROR("Using not allowed size for MC TrustZone window %d!\n", 44*3a9f8eecSGrzegorz Jaszczyk win_id); 45*3a9f8eecSGrzegorz Jaszczyk return; 46*3a9f8eecSGrzegorz Jaszczyk } 47*3a9f8eecSGrzegorz Jaszczyk 48*3a9f8eecSGrzegorz Jaszczyk if (base & 0xfff) { 49*3a9f8eecSGrzegorz Jaszczyk base = base & ~0xfff; 50*3a9f8eecSGrzegorz Jaszczyk WARN("Attempt to open MC TZ win. at 0x%llx, truncate to 0x%x\n", 51*3a9f8eecSGrzegorz Jaszczyk win->base_addr, base); 52*3a9f8eecSGrzegorz Jaszczyk } 53*3a9f8eecSGrzegorz Jaszczyk 54*3a9f8eecSGrzegorz Jaszczyk val = base | (tz_size << 7) | win->target_id | TZ_VALID; 55*3a9f8eecSGrzegorz Jaszczyk 56*3a9f8eecSGrzegorz Jaszczyk VERBOSE("%s: base 0x%x, tz_size moved 0x%x, attr 0x%x, val 0x%x\n", 57*3a9f8eecSGrzegorz Jaszczyk __func__, base, (tz_size << 7), win->target_id, val); 58*3a9f8eecSGrzegorz Jaszczyk 59*3a9f8eecSGrzegorz Jaszczyk mmio_write_32(MVEBU_AP_MC_TRUSTZONE_REG_LOW(ap_index, win_id), val); 60*3a9f8eecSGrzegorz Jaszczyk 61*3a9f8eecSGrzegorz Jaszczyk VERBOSE("%s: Win%d[0x%x] configured to 0x%x\n", __func__, win_id, 62*3a9f8eecSGrzegorz Jaszczyk MVEBU_AP_MC_TRUSTZONE_REG_LOW(ap_index, win_id), 63*3a9f8eecSGrzegorz Jaszczyk mmio_read_32(MVEBU_AP_MC_TRUSTZONE_REG_LOW(ap_index, win_id))); 64*3a9f8eecSGrzegorz Jaszczyk 65*3a9f8eecSGrzegorz Jaszczyk mmio_write_32(MVEBU_AP_MC_TRUSTZONE_REG_HIGH(ap_index, win_id), 66*3a9f8eecSGrzegorz Jaszczyk (win->base_addr >> 32)); 67*3a9f8eecSGrzegorz Jaszczyk 68*3a9f8eecSGrzegorz Jaszczyk VERBOSE("%s: Win%d[0x%x] configured to 0x%x\n", __func__, win_id, 69*3a9f8eecSGrzegorz Jaszczyk MVEBU_AP_MC_TRUSTZONE_REG_HIGH(ap_index, win_id), 70*3a9f8eecSGrzegorz Jaszczyk mmio_read_32(MVEBU_AP_MC_TRUSTZONE_REG_HIGH(ap_index, win_id))); 71*3a9f8eecSGrzegorz Jaszczyk } 72