aboutsummaryrefslogtreecommitdiff
path: root/product/synquacer/module/synquacer_system/src/nic400.c
blob: a982a8db9ad5fc61ca8e57d923675c67e33eacb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
 * Arm SCP/MCP Software
 * Copyright (c) 2018-2020, Arm Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "low_level_access.h"
#include "synquacer_mmap.h"

#include <sysdef_option.h>

#include <internal/nic400.h>

#include <mod_synquacer_system.h>

#include <fwk_log.h>
#include <fwk_macros.h>

#include <inttypes.h>
#include <stdint.h>

#define NIC_TOP_ADDR_SEC_REG (0x00000008)
#define NIC_SEC_REG_OFFSET (0x04)

static void nic_sec_slave_security(
    uint32_t nic_top_addr,
    uint32_t slave_index,
    uint32_t value)
{
    FWK_LOG_INFO(
        "%s addr 0x%08" PRIx32 " value 0x%08" PRIx32,
        __func__,
        (nic_top_addr + NIC_TOP_ADDR_SEC_REG +
         NIC_SEC_REG_OFFSET * slave_index),
        value);

    writel(
        (nic_top_addr + NIC_TOP_ADDR_SEC_REG +
         NIC_SEC_REG_OFFSET * slave_index),
        value);
}

void nic_secure_access_ctrl_init(void)
{
    uint32_t n, m;
    static const uint32_t nic_base_addr[] = CONFIG_SOC_NIC_ADDR_INFO;
    static const uint32_t nic_config[][32] = CONFIG_SCB_NIC_INFO;
    const uint32_t *config;

    for (n = 0; n < FWK_ARRAY_SIZE(nic_base_addr); n++) {
        for (m = 0; nic_config[n][m] != END_OF_NIC_LIST; m++) {
            if (nic_config[n][m] == NIC_SETUP_SKIP)
                continue;

            nic_sec_slave_security(nic_base_addr[n], m, nic_config[n][m]);
        }
    }

    config = sysdef_option_get_scbm_mv_nic_config();
    for (n = 0; config[n] != END_OF_NIC_LIST; n++) {
        if (config[n] == NIC_SETUP_SKIP)
            continue;

        nic_sec_slave_security(SCBM_MV_NIC, n, config[n]);
    }
}