blob: bebb289ab6b0e0108256c570669fa7b27c2cc4db [file] [log] [blame]
Hadi Asyrafi073e70d2019-06-17 12:30:22 +08001/*
Jit Loon Lim86f6fb32023-05-17 12:26:11 +08002 * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
Hadi Asyrafi073e70d2019-06-17 12:30:22 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <assert.h>
8#include <common/debug.h>
9#include <errno.h>
10#include <lib/mmio.h>
11
12#include "ncore_ccu.h"
Jit Loon Lim86f6fb32023-05-17 12:26:11 +080013#include "socfpga_plat_def.h"
14#include "socfpga_system_manager.h"
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080015
16uint32_t poll_active_bit(uint32_t dir);
17
18static coh_ss_id_t subsystem_id;
19
20
21void get_subsystem_id(void)
22{
23 uint32_t snoop_filter, directory, coh_agent;
24
25 snoop_filter = CSIDR_NUM_SF(mmio_read_32(NCORE_CCU_CSR(NCORE_CSIDR)));
26 directory = CSUIDR_NUM_DIR(mmio_read_32(NCORE_CCU_CSR(NCORE_CSUIDR)));
27 coh_agent = CSUIDR_NUM_CAI(mmio_read_32(NCORE_CCU_CSR(NCORE_CSUIDR)));
28
29 subsystem_id.num_snoop_filter = snoop_filter + 1;
30 subsystem_id.num_directory = directory;
31 subsystem_id.num_coh_agent = coh_agent;
32}
33
34uint32_t directory_init(void)
35{
36 uint32_t dir_sf_mtn, dir_sf_en;
37 uint32_t dir, sf, ret;
38
39 for (dir = 0; dir < subsystem_id.num_directory; dir++) {
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080040 for (sf = 0; sf < subsystem_id.num_snoop_filter; sf++) {
Tien Hock Loh070ffbb2020-05-11 01:11:55 -070041 dir_sf_mtn = DIRECTORY_UNIT(dir, NCORE_DIRUSFMCR);
42 dir_sf_en = DIRECTORY_UNIT(dir, NCORE_DIRUSFER);
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080043
44 /* Initialize All Entries */
Jit Loon Lim12fd5ed2022-11-10 22:08:13 +080045 mmio_write_32(dir_sf_mtn, SNOOP_FILTER_ID(sf));
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080046
47 /* Poll Active Bit */
48 ret = poll_active_bit(dir);
49 if (ret != 0) {
50 ERROR("Timeout during active bit polling");
51 return -ETIMEDOUT;
52 }
53
Jit Loon Lim12fd5ed2022-11-10 22:08:13 +080054 /* Disable snoop filter, a bit per snoop filter */
55 mmio_clrbits_32(dir_sf_en, BIT(sf));
56
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080057 }
58 }
59
60 return 0;
61}
62
63uint32_t coherent_agent_intfc_init(void)
64{
65 uint32_t dir, ca, ca_id, ca_type, ca_snoop_en;
66
67 for (dir = 0; dir < subsystem_id.num_directory; dir++) {
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080068 for (ca = 0; ca < subsystem_id.num_coh_agent; ca++) {
Tien Hock Loh070ffbb2020-05-11 01:11:55 -070069 ca_snoop_en = DIRECTORY_UNIT(ca, NCORE_DIRUCASER0);
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080070 ca_id = mmio_read_32(COH_AGENT_UNIT(ca, NCORE_CAIUIDR));
71
72 /* Coh Agent Snoop Enable */
73 if (CACHING_AGENT_BIT(ca_id))
74 mmio_write_32(ca_snoop_en, BIT(ca));
75
76 /* Coh Agent Snoop DVM Enable */
77 ca_type = CACHING_AGENT_TYPE(ca_id);
78 if (ca_type == ACE_W_DVM || ca_type == ACE_L_W_DVM)
79 mmio_write_32(NCORE_CCU_CSR(NCORE_CSADSER0),
80 BIT(ca));
81 }
82 }
83
84 return 0;
85}
86
87uint32_t poll_active_bit(uint32_t dir)
88{
89 uint32_t timeout = 80000;
90 uint32_t poll_dir = DIRECTORY_UNIT(dir, NCORE_DIRUSFMAR);
91
92 while (timeout > 0) {
93 if (mmio_read_32(poll_dir) == 0)
94 return 0;
95 timeout--;
96 }
97
98 return -1;
99}
100
101void bypass_ocram_firewall(void)
102{
103 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF1),
104 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
105 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF2),
106 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
107 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF3),
108 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
109 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF4),
110 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
111}
112
Boon Khai Ng1e5550b2021-05-21 22:56:37 +0800113void ncore_enable_ocram_firewall(void)
114{
115 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF1),
116 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
117 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF2),
118 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
119 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF3),
120 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
121 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF4),
122 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
123}
Abdul Halim, Muhammad Hadi Asyrafi2f94ca42020-08-05 22:40:46 +0800124
Hadi Asyrafi073e70d2019-06-17 12:30:22 +0800125uint32_t init_ncore_ccu(void)
126{
127 uint32_t status;
128
129 get_subsystem_id();
130 status = directory_init();
131 status = coherent_agent_intfc_init();
132 bypass_ocram_firewall();
133
134 return status;
135}