11bb92983SJerome Forissier // SPDX-License-Identifier: (BSD-2-Clause AND BSD-3-Clause) 25d1638f3SJens Wiklander /* 35d1638f3SJens Wiklander * Copyright (c) 2015, Linaro Limited 45d1638f3SJens Wiklander * All rights reserved. 55d1638f3SJens Wiklander * 65d1638f3SJens Wiklander * Redistribution and use in source and binary forms, with or without 75d1638f3SJens Wiklander * modification, are permitted provided that the following conditions are met: 85d1638f3SJens Wiklander * 95d1638f3SJens Wiklander * 1. Redistributions of source code must retain the above copyright notice, 105d1638f3SJens Wiklander * this list of conditions and the following disclaimer. 115d1638f3SJens Wiklander * 125d1638f3SJens Wiklander * 2. Redistributions in binary form must reproduce the above copyright notice, 135d1638f3SJens Wiklander * this list of conditions and the following disclaimer in the documentation 145d1638f3SJens Wiklander * and/or other materials provided with the distribution. 155d1638f3SJens Wiklander * 165d1638f3SJens Wiklander * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 175d1638f3SJens Wiklander * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 185d1638f3SJens Wiklander * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 195d1638f3SJens Wiklander * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 205d1638f3SJens Wiklander * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 215d1638f3SJens Wiklander * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 225d1638f3SJens Wiklander * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 235d1638f3SJens Wiklander * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 245d1638f3SJens Wiklander * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 255d1638f3SJens Wiklander * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 265d1638f3SJens Wiklander * POSSIBILITY OF SUCH DAMAGE. 275d1638f3SJens Wiklander */ 285d1638f3SJens Wiklander /* 295d1638f3SJens Wiklander * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. 305d1638f3SJens Wiklander * 315d1638f3SJens Wiklander * Redistribution and use in source and binary forms, with or without 325d1638f3SJens Wiklander * modification, are permitted provided that the following conditions are met: 335d1638f3SJens Wiklander * 345d1638f3SJens Wiklander * Redistributions of source code must retain the above copyright notice, this 355d1638f3SJens Wiklander * list of conditions and the following disclaimer. 365d1638f3SJens Wiklander * 375d1638f3SJens Wiklander * Redistributions in binary form must reproduce the above copyright notice, 385d1638f3SJens Wiklander * this list of conditions and the following disclaimer in the documentation 395d1638f3SJens Wiklander * and/or other materials provided with the distribution. 405d1638f3SJens Wiklander * 415d1638f3SJens Wiklander * Neither the name of ARM nor the names of its contributors may be used 425d1638f3SJens Wiklander * to endorse or promote products derived from this software without specific 435d1638f3SJens Wiklander * prior written permission. 445d1638f3SJens Wiklander * 455d1638f3SJens Wiklander * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 465d1638f3SJens Wiklander * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 475d1638f3SJens Wiklander * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 485d1638f3SJens Wiklander * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 495d1638f3SJens Wiklander * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 505d1638f3SJens Wiklander * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 515d1638f3SJens Wiklander * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 525d1638f3SJens Wiklander * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 535d1638f3SJens Wiklander * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 545d1638f3SJens Wiklander * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 555d1638f3SJens Wiklander * POSSIBILITY OF SUCH DAMAGE. 565d1638f3SJens Wiklander */ 575d1638f3SJens Wiklander 585d1638f3SJens Wiklander #include <assert.h> 595d1638f3SJens Wiklander #include <drivers/tzc400.h> 605d1638f3SJens Wiklander #include <io.h> 615d1638f3SJens Wiklander #include <kernel/panic.h> 625d1638f3SJens Wiklander #include <stddef.h> 635d1638f3SJens Wiklander #include <trace.h> 645d1638f3SJens Wiklander #include <util.h> 655d1638f3SJens Wiklander 665d1638f3SJens Wiklander /* 675d1638f3SJens Wiklander * Implementation defined values used to validate inputs later. 685d1638f3SJens Wiklander * Filters : max of 4 ; 0 to 3 695d1638f3SJens Wiklander * Regions : max of 9 ; 0 to 8 705d1638f3SJens Wiklander * Address width : Values between 32 to 64 715d1638f3SJens Wiklander */ 725d1638f3SJens Wiklander struct tzc_instance { 735d1638f3SJens Wiklander vaddr_t base; 745d1638f3SJens Wiklander uint8_t addr_width; 755d1638f3SJens Wiklander uint8_t num_filters; 765d1638f3SJens Wiklander uint8_t num_regions; 775d1638f3SJens Wiklander }; 785d1638f3SJens Wiklander 795d1638f3SJens Wiklander static struct tzc_instance tzc; 805d1638f3SJens Wiklander 815d1638f3SJens Wiklander 825d1638f3SJens Wiklander static uint32_t tzc_read_build_config(vaddr_t base) 835d1638f3SJens Wiklander { 84*918bb3a5SEtienne Carriere return io_read32(base + BUILD_CONFIG_OFF); 855d1638f3SJens Wiklander } 865d1638f3SJens Wiklander 875d1638f3SJens Wiklander static uint32_t tzc_read_gate_keeper(vaddr_t base) 885d1638f3SJens Wiklander { 89*918bb3a5SEtienne Carriere return io_read32(base + GATE_KEEPER_OFF); 905d1638f3SJens Wiklander } 915d1638f3SJens Wiklander 925d1638f3SJens Wiklander static void tzc_write_gate_keeper(vaddr_t base, uint32_t val) 935d1638f3SJens Wiklander { 94*918bb3a5SEtienne Carriere io_write32(base + GATE_KEEPER_OFF, val); 955d1638f3SJens Wiklander } 965d1638f3SJens Wiklander 975d1638f3SJens Wiklander static void tzc_write_action(vaddr_t base, enum tzc_action action) 985d1638f3SJens Wiklander { 99*918bb3a5SEtienne Carriere io_write32(base + ACTION_OFF, action); 1005d1638f3SJens Wiklander } 1015d1638f3SJens Wiklander 1025d1638f3SJens Wiklander static void tzc_write_region_base_low(vaddr_t base, uint32_t region, 1035d1638f3SJens Wiklander uint32_t val) 1045d1638f3SJens Wiklander { 105*918bb3a5SEtienne Carriere io_write32(base + REGION_BASE_LOW_OFF + REGION_NUM_OFF(region), val); 1065d1638f3SJens Wiklander } 1075d1638f3SJens Wiklander 1085d1638f3SJens Wiklander static void tzc_write_region_base_high(vaddr_t base, uint32_t region, 1095d1638f3SJens Wiklander uint32_t val) 1105d1638f3SJens Wiklander { 111*918bb3a5SEtienne Carriere io_write32(base + REGION_BASE_HIGH_OFF + REGION_NUM_OFF(region), val); 1125d1638f3SJens Wiklander } 1135d1638f3SJens Wiklander 1145d1638f3SJens Wiklander static void tzc_write_region_top_low(vaddr_t base, uint32_t region, 1155d1638f3SJens Wiklander uint32_t val) 1165d1638f3SJens Wiklander { 117*918bb3a5SEtienne Carriere io_write32(base + REGION_TOP_LOW_OFF + REGION_NUM_OFF(region), val); 1185d1638f3SJens Wiklander } 1195d1638f3SJens Wiklander 1205d1638f3SJens Wiklander static void tzc_write_region_top_high(vaddr_t base, uint32_t region, 1215d1638f3SJens Wiklander uint32_t val) 1225d1638f3SJens Wiklander { 123*918bb3a5SEtienne Carriere io_write32(base + REGION_TOP_HIGH_OFF + REGION_NUM_OFF(region), val); 1245d1638f3SJens Wiklander } 1255d1638f3SJens Wiklander 1265d1638f3SJens Wiklander static void tzc_write_region_attributes(vaddr_t base, uint32_t region, 1275d1638f3SJens Wiklander uint32_t val) 1285d1638f3SJens Wiklander { 129*918bb3a5SEtienne Carriere io_write32(base + REGION_ATTRIBUTES_OFF + REGION_NUM_OFF(region), val); 1305d1638f3SJens Wiklander } 1315d1638f3SJens Wiklander 1325d1638f3SJens Wiklander static void tzc_write_region_id_access(vaddr_t base, uint32_t region, 1335d1638f3SJens Wiklander uint32_t val) 1345d1638f3SJens Wiklander { 135*918bb3a5SEtienne Carriere io_write32(base + REGION_ID_ACCESS_OFF + REGION_NUM_OFF(region), val); 1365d1638f3SJens Wiklander } 1375d1638f3SJens Wiklander 1385d1638f3SJens Wiklander static uint32_t tzc_read_component_id(vaddr_t base) 1395d1638f3SJens Wiklander { 1405d1638f3SJens Wiklander uint32_t id; 1415d1638f3SJens Wiklander 142*918bb3a5SEtienne Carriere id = io_read8(base + CID0_OFF); 143*918bb3a5SEtienne Carriere id |= SHIFT_U32(io_read8(base + CID1_OFF), 8); 144*918bb3a5SEtienne Carriere id |= SHIFT_U32(io_read8(base + CID2_OFF), 16); 145*918bb3a5SEtienne Carriere id |= SHIFT_U32(io_read8(base + CID3_OFF), 24); 1465d1638f3SJens Wiklander 1475d1638f3SJens Wiklander return id; 1485d1638f3SJens Wiklander } 1495d1638f3SJens Wiklander 1505d1638f3SJens Wiklander static uint32_t tzc_get_gate_keeper(vaddr_t base, uint8_t filter) 1515d1638f3SJens Wiklander { 1525d1638f3SJens Wiklander uint32_t tmp; 1535d1638f3SJens Wiklander 1545d1638f3SJens Wiklander tmp = (tzc_read_gate_keeper(base) >> GATE_KEEPER_OS_SHIFT) & 1555d1638f3SJens Wiklander GATE_KEEPER_OS_MASK; 1565d1638f3SJens Wiklander 1575d1638f3SJens Wiklander return (tmp >> filter) & GATE_KEEPER_FILTER_MASK; 1585d1638f3SJens Wiklander } 1595d1638f3SJens Wiklander 1605d1638f3SJens Wiklander /* This function is not MP safe. */ 1615d1638f3SJens Wiklander static void tzc_set_gate_keeper(vaddr_t base, uint8_t filter, uint32_t val) 1625d1638f3SJens Wiklander { 1635d1638f3SJens Wiklander uint32_t tmp; 1645d1638f3SJens Wiklander 1655d1638f3SJens Wiklander /* Upper half is current state. Lower half is requested state. */ 1665d1638f3SJens Wiklander tmp = (tzc_read_gate_keeper(base) >> GATE_KEEPER_OS_SHIFT) & 1675d1638f3SJens Wiklander GATE_KEEPER_OS_MASK; 1685d1638f3SJens Wiklander 1695d1638f3SJens Wiklander if (val) 1705d1638f3SJens Wiklander tmp |= (1 << filter); 1715d1638f3SJens Wiklander else 1725d1638f3SJens Wiklander tmp &= ~(1 << filter); 1735d1638f3SJens Wiklander 1745d1638f3SJens Wiklander tzc_write_gate_keeper(base, (tmp & GATE_KEEPER_OR_MASK) << 1755d1638f3SJens Wiklander GATE_KEEPER_OR_SHIFT); 1765d1638f3SJens Wiklander 1775d1638f3SJens Wiklander /* Wait here until we see the change reflected in the TZC status. */ 1785d1638f3SJens Wiklander while (((tzc_read_gate_keeper(base) >> GATE_KEEPER_OS_SHIFT) & 1795d1638f3SJens Wiklander GATE_KEEPER_OS_MASK) != tmp) 1805d1638f3SJens Wiklander ; 1815d1638f3SJens Wiklander } 1825d1638f3SJens Wiklander 1835d1638f3SJens Wiklander 1845d1638f3SJens Wiklander void tzc_init(vaddr_t base) 1855d1638f3SJens Wiklander { 1865d1638f3SJens Wiklander uint32_t tzc_id, tzc_build; 1875d1638f3SJens Wiklander 1885d1638f3SJens Wiklander assert(base); 1895d1638f3SJens Wiklander tzc.base = base; 1905d1638f3SJens Wiklander 1915d1638f3SJens Wiklander /* 1925d1638f3SJens Wiklander * We expect to see a tzc400. Check component ID. The TZC-400 TRM shows 1935d1638f3SJens Wiklander * component ID is expected to be "0xB105F00D". 1945d1638f3SJens Wiklander */ 1955d1638f3SJens Wiklander tzc_id = tzc_read_component_id(tzc.base); 1965d1638f3SJens Wiklander if (tzc_id != TZC400_COMPONENT_ID) { 1975d1638f3SJens Wiklander EMSG("TZC : Wrong device ID (0x%x).\n", tzc_id); 1985d1638f3SJens Wiklander panic(); 1995d1638f3SJens Wiklander } 2005d1638f3SJens Wiklander 2015d1638f3SJens Wiklander /* Save values we will use later. */ 2025d1638f3SJens Wiklander tzc_build = tzc_read_build_config(tzc.base); 2035d1638f3SJens Wiklander tzc.num_filters = ((tzc_build >> BUILD_CONFIG_NF_SHIFT) & 2045d1638f3SJens Wiklander BUILD_CONFIG_NF_MASK) + 1; 2055d1638f3SJens Wiklander tzc.addr_width = ((tzc_build >> BUILD_CONFIG_AW_SHIFT) & 2065d1638f3SJens Wiklander BUILD_CONFIG_AW_MASK) + 1; 2075d1638f3SJens Wiklander tzc.num_regions = ((tzc_build >> BUILD_CONFIG_NR_SHIFT) & 2085d1638f3SJens Wiklander BUILD_CONFIG_NR_MASK) + 1; 2095d1638f3SJens Wiklander } 2105d1638f3SJens Wiklander 2115d1638f3SJens Wiklander static uint32_t addr_low(vaddr_t addr) 2125d1638f3SJens Wiklander { 2135d1638f3SJens Wiklander return (uint32_t)addr; 2145d1638f3SJens Wiklander } 2155d1638f3SJens Wiklander 2165d1638f3SJens Wiklander static uint32_t addr_high(vaddr_t addr __unused) 2175d1638f3SJens Wiklander { 2185d1638f3SJens Wiklander #if (UINTPTR_MAX == UINT64_MAX) 2195d1638f3SJens Wiklander return (addr >> 32); 2205d1638f3SJens Wiklander #else 2215d1638f3SJens Wiklander return 0; 2225d1638f3SJens Wiklander #endif 2235d1638f3SJens Wiklander } 2245d1638f3SJens Wiklander 2255d1638f3SJens Wiklander 2265d1638f3SJens Wiklander /* 2275d1638f3SJens Wiklander * `tzc_configure_region` is used to program regions into the TrustZone 2285d1638f3SJens Wiklander * controller. A region can be associated with more than one filter. The 2295d1638f3SJens Wiklander * associated filters are passed in as a bitmap (bit0 = filter0). 2305d1638f3SJens Wiklander * NOTE: 2315d1638f3SJens Wiklander * The region 0 covers the whole address space and is enabled on all filters, 2325d1638f3SJens Wiklander * this cannot be changed. It is, however, possible to change some region 0 2335d1638f3SJens Wiklander * permissions. 2345d1638f3SJens Wiklander */ 2355d1638f3SJens Wiklander void tzc_configure_region(uint32_t filters, 2365d1638f3SJens Wiklander uint8_t region, 2375d1638f3SJens Wiklander vaddr_t region_base, 2385d1638f3SJens Wiklander vaddr_t region_top, 2395d1638f3SJens Wiklander enum tzc_region_attributes sec_attr, 2405d1638f3SJens Wiklander uint32_t ns_device_access) 2415d1638f3SJens Wiklander { 2425d1638f3SJens Wiklander assert(tzc.base); 2435d1638f3SJens Wiklander 2445d1638f3SJens Wiklander /* Do range checks on filters and regions. */ 2455d1638f3SJens Wiklander assert(((filters >> tzc.num_filters) == 0) && 2465d1638f3SJens Wiklander (region < tzc.num_regions)); 2475d1638f3SJens Wiklander 2485d1638f3SJens Wiklander /* 2495d1638f3SJens Wiklander * Do address range check based on TZC configuration. A 64bit address is 2505d1638f3SJens Wiklander * the max and expected case. 2515d1638f3SJens Wiklander */ 2525d1638f3SJens Wiklander #if (UINTPTR_MAX == UINT64_MAX) 2535d1638f3SJens Wiklander assert(((region_top <= (UINT64_MAX >> (64 - tzc.addr_width))) && 2545d1638f3SJens Wiklander (region_base < region_top))); 2555d1638f3SJens Wiklander #endif 2565d1638f3SJens Wiklander /* region_base and (region_top + 1) must be 4KB aligned */ 2575d1638f3SJens Wiklander assert(((region_base | (region_top + 1)) & (4096 - 1)) == 0); 2585d1638f3SJens Wiklander 2595d1638f3SJens Wiklander assert(sec_attr <= TZC_REGION_S_RDWR); 2605d1638f3SJens Wiklander 2615d1638f3SJens Wiklander /* 2625d1638f3SJens Wiklander * Inputs look ok, start programming registers. 2635d1638f3SJens Wiklander * All the address registers are 32 bits wide and have a LOW and HIGH 2645d1638f3SJens Wiklander * component used to construct a up to a 64bit address. 2655d1638f3SJens Wiklander */ 2665d1638f3SJens Wiklander tzc_write_region_base_low(tzc.base, region, 2675d1638f3SJens Wiklander addr_low(region_base)); 2685d1638f3SJens Wiklander tzc_write_region_base_high(tzc.base, region, 2695d1638f3SJens Wiklander addr_high(region_base)); 2705d1638f3SJens Wiklander 2715d1638f3SJens Wiklander tzc_write_region_top_low(tzc.base, region, 2725d1638f3SJens Wiklander addr_low(region_top)); 2735d1638f3SJens Wiklander tzc_write_region_top_high(tzc.base, region, 2745d1638f3SJens Wiklander addr_high(region_top)); 2755d1638f3SJens Wiklander 2765d1638f3SJens Wiklander /* Assign the region to a filter and set secure attributes */ 2775d1638f3SJens Wiklander tzc_write_region_attributes(tzc.base, region, 2785d1638f3SJens Wiklander (sec_attr << REG_ATTR_SEC_SHIFT) | filters); 2795d1638f3SJens Wiklander 2805d1638f3SJens Wiklander /* 2815d1638f3SJens Wiklander * Specify which non-secure devices have permission to access this 2825d1638f3SJens Wiklander * region. 2835d1638f3SJens Wiklander */ 2845d1638f3SJens Wiklander tzc_write_region_id_access(tzc.base, region, ns_device_access); 2855d1638f3SJens Wiklander } 2865d1638f3SJens Wiklander 2875d1638f3SJens Wiklander 2885d1638f3SJens Wiklander void tzc_set_action(enum tzc_action action) 2895d1638f3SJens Wiklander { 2905d1638f3SJens Wiklander assert(tzc.base); 2915d1638f3SJens Wiklander 2925d1638f3SJens Wiklander /* 2935d1638f3SJens Wiklander * - Currently no handler is provided to trap an error via interrupt 2945d1638f3SJens Wiklander * or exception. 2955d1638f3SJens Wiklander * - The interrupt action has not been tested. 2965d1638f3SJens Wiklander */ 2975d1638f3SJens Wiklander tzc_write_action(tzc.base, action); 2985d1638f3SJens Wiklander } 2995d1638f3SJens Wiklander 3005d1638f3SJens Wiklander 3015d1638f3SJens Wiklander void tzc_enable_filters(void) 3025d1638f3SJens Wiklander { 3035d1638f3SJens Wiklander uint32_t state; 3045d1638f3SJens Wiklander uint32_t filter; 3055d1638f3SJens Wiklander 3065d1638f3SJens Wiklander assert(tzc.base); 3075d1638f3SJens Wiklander 3085d1638f3SJens Wiklander for (filter = 0; filter < tzc.num_filters; filter++) { 3095d1638f3SJens Wiklander state = tzc_get_gate_keeper(tzc.base, filter); 3105d1638f3SJens Wiklander if (state) { 3115d1638f3SJens Wiklander /* 3125d1638f3SJens Wiklander * The TZC filter is already configured. Changing the 3135d1638f3SJens Wiklander * programmer's view in an active system can cause 3145d1638f3SJens Wiklander * unpredictable behavior therefore panic for now rather 3155d1638f3SJens Wiklander * than try to determine whether this is safe in this 3165d1638f3SJens Wiklander * instance. See: 3175d1638f3SJens Wiklander * http://infocenter.arm.com/help/index.jsp?\ 3185d1638f3SJens Wiklander * topic=/com.arm.doc.ddi0504c/CJHHECBF.html 3195d1638f3SJens Wiklander */ 3205d1638f3SJens Wiklander EMSG("TZC : Filter %d Gatekeeper already enabled.\n", 3215d1638f3SJens Wiklander filter); 3225d1638f3SJens Wiklander panic(); 3235d1638f3SJens Wiklander } 3245d1638f3SJens Wiklander tzc_set_gate_keeper(tzc.base, filter, 1); 3255d1638f3SJens Wiklander } 3265d1638f3SJens Wiklander } 3275d1638f3SJens Wiklander 3285d1638f3SJens Wiklander 3295d1638f3SJens Wiklander void tzc_disable_filters(void) 3305d1638f3SJens Wiklander { 3315d1638f3SJens Wiklander uint32_t filter; 3325d1638f3SJens Wiklander 3335d1638f3SJens Wiklander assert(tzc.base); 3345d1638f3SJens Wiklander 3355d1638f3SJens Wiklander /* 3365d1638f3SJens Wiklander * We don't do the same state check as above as the Gatekeepers are 3375d1638f3SJens Wiklander * disabled after reset. 3385d1638f3SJens Wiklander */ 3395d1638f3SJens Wiklander for (filter = 0; filter < tzc.num_filters; filter++) 3405d1638f3SJens Wiklander tzc_set_gate_keeper(tzc.base, filter, 0); 3415d1638f3SJens Wiklander } 3425d1638f3SJens Wiklander 3435d1638f3SJens Wiklander #if TRACE_LEVEL >= TRACE_DEBUG 3445d1638f3SJens Wiklander 3455d1638f3SJens Wiklander static uint32_t tzc_read_region_attributes(vaddr_t base, uint32_t region) 3465d1638f3SJens Wiklander { 347*918bb3a5SEtienne Carriere return io_read32(base + REGION_ATTRIBUTES_OFF + REGION_NUM_OFF(region)); 3485d1638f3SJens Wiklander } 3495d1638f3SJens Wiklander 3505d1638f3SJens Wiklander static uint32_t tzc_read_region_base_low(vaddr_t base, uint32_t region) 3515d1638f3SJens Wiklander { 352*918bb3a5SEtienne Carriere return io_read32(base + REGION_BASE_LOW_OFF + REGION_NUM_OFF(region)); 3535d1638f3SJens Wiklander } 3545d1638f3SJens Wiklander 3555d1638f3SJens Wiklander static uint32_t tzc_read_region_base_high(vaddr_t base, uint32_t region) 3565d1638f3SJens Wiklander { 357*918bb3a5SEtienne Carriere return io_read32(base + REGION_BASE_HIGH_OFF + REGION_NUM_OFF(region)); 3585d1638f3SJens Wiklander } 3595d1638f3SJens Wiklander 3605d1638f3SJens Wiklander static uint32_t tzc_read_region_top_low(vaddr_t base, uint32_t region) 3615d1638f3SJens Wiklander { 362*918bb3a5SEtienne Carriere return io_read32(base + REGION_TOP_LOW_OFF + REGION_NUM_OFF(region)); 3635d1638f3SJens Wiklander } 3645d1638f3SJens Wiklander 3655d1638f3SJens Wiklander static uint32_t tzc_read_region_top_high(vaddr_t base, uint32_t region) 3665d1638f3SJens Wiklander { 367*918bb3a5SEtienne Carriere return io_read32(base + REGION_TOP_HIGH_OFF + REGION_NUM_OFF(region)); 3685d1638f3SJens Wiklander } 3695d1638f3SJens Wiklander 3705d1638f3SJens Wiklander #define REGION_MAX 8 3715d1638f3SJens Wiklander static const __maybe_unused char * const tzc_attr_msg[] = { 3725d1638f3SJens Wiklander "TZC_REGION_S_NONE", 3735d1638f3SJens Wiklander "TZC_REGION_S_RD", 3745d1638f3SJens Wiklander "TZC_REGION_S_WR", 3755d1638f3SJens Wiklander "TZC_REGION_S_RDWR" 3765d1638f3SJens Wiklander }; 3775d1638f3SJens Wiklander 3785d1638f3SJens Wiklander void tzc_dump_state(void) 3795d1638f3SJens Wiklander { 3805d1638f3SJens Wiklander uint32_t n; 3815d1638f3SJens Wiklander uint32_t temp_32reg, temp_32reg_h; 3825d1638f3SJens Wiklander 3835d1638f3SJens Wiklander DMSG("enter"); 3845d1638f3SJens Wiklander for (n = 0; n <= REGION_MAX; n++) { 3855d1638f3SJens Wiklander temp_32reg = tzc_read_region_attributes(tzc.base, n); 3865d1638f3SJens Wiklander if (!(temp_32reg & REG_ATTR_F_EN_MASK)) 3875d1638f3SJens Wiklander continue; 3885d1638f3SJens Wiklander 3895d1638f3SJens Wiklander DMSG("\n"); 3905d1638f3SJens Wiklander DMSG("region %d", n); 3915d1638f3SJens Wiklander temp_32reg = tzc_read_region_base_low(tzc.base, n); 3925d1638f3SJens Wiklander temp_32reg_h = tzc_read_region_base_high(tzc.base, n); 3935d1638f3SJens Wiklander DMSG("region_base: 0x%08x%08x", temp_32reg_h, temp_32reg); 3945d1638f3SJens Wiklander temp_32reg = tzc_read_region_top_low(tzc.base, n); 3955d1638f3SJens Wiklander temp_32reg_h = tzc_read_region_top_high(tzc.base, n); 3965d1638f3SJens Wiklander DMSG("region_top: 0x%08x%08x", temp_32reg_h, temp_32reg); 3975d1638f3SJens Wiklander temp_32reg = tzc_read_region_attributes(tzc.base, n); 3985d1638f3SJens Wiklander DMSG("secure rw: %s", 3995d1638f3SJens Wiklander tzc_attr_msg[temp_32reg >> REG_ATTR_SEC_SHIFT]); 4005d1638f3SJens Wiklander if (temp_32reg & (1 << 0)) 4015d1638f3SJens Wiklander DMSG("filter 0 enable"); 4025d1638f3SJens Wiklander if (temp_32reg & (1 << 1)) 4035d1638f3SJens Wiklander DMSG("filter 1 enable"); 4045d1638f3SJens Wiklander if (temp_32reg & (1 << 2)) 4055d1638f3SJens Wiklander DMSG("filter 2 enable"); 4065d1638f3SJens Wiklander if (temp_32reg & (1 << 3)) 4075d1638f3SJens Wiklander DMSG("filter 3 enable"); 4085d1638f3SJens Wiklander } 4095d1638f3SJens Wiklander DMSG("exit"); 4105d1638f3SJens Wiklander } 4115d1638f3SJens Wiklander 4125d1638f3SJens Wiklander #endif /* CFG_TRACE_LEVEL >= TRACE_DEBUG */ 413