blob: 0148b7519dffdb2afe6fc76a7c7ecdac72bc5606 [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>
Jit Loon Lim28c1c782023-05-17 12:26:11 +080011#include <platform_def.h>
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080012
13#include "ncore_ccu.h"
Jit Loon Lim86f6fb32023-05-17 12:26:11 +080014#include "socfpga_plat_def.h"
15#include "socfpga_system_manager.h"
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080016
17uint32_t poll_active_bit(uint32_t dir);
18
19static coh_ss_id_t subsystem_id;
20
21
22void get_subsystem_id(void)
23{
24 uint32_t snoop_filter, directory, coh_agent;
25
26 snoop_filter = CSIDR_NUM_SF(mmio_read_32(NCORE_CCU_CSR(NCORE_CSIDR)));
27 directory = CSUIDR_NUM_DIR(mmio_read_32(NCORE_CCU_CSR(NCORE_CSUIDR)));
28 coh_agent = CSUIDR_NUM_CAI(mmio_read_32(NCORE_CCU_CSR(NCORE_CSUIDR)));
29
30 subsystem_id.num_snoop_filter = snoop_filter + 1;
31 subsystem_id.num_directory = directory;
32 subsystem_id.num_coh_agent = coh_agent;
33}
34
35uint32_t directory_init(void)
36{
37 uint32_t dir_sf_mtn, dir_sf_en;
38 uint32_t dir, sf, ret;
39
40 for (dir = 0; dir < subsystem_id.num_directory; dir++) {
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080041 for (sf = 0; sf < subsystem_id.num_snoop_filter; sf++) {
Tien Hock Loh070ffbb2020-05-11 01:11:55 -070042 dir_sf_mtn = DIRECTORY_UNIT(dir, NCORE_DIRUSFMCR);
43 dir_sf_en = DIRECTORY_UNIT(dir, NCORE_DIRUSFER);
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080044
45 /* Initialize All Entries */
Jit Loon Lim12fd5ed2022-11-10 22:08:13 +080046 mmio_write_32(dir_sf_mtn, SNOOP_FILTER_ID(sf));
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080047
48 /* Poll Active Bit */
49 ret = poll_active_bit(dir);
50 if (ret != 0) {
51 ERROR("Timeout during active bit polling");
52 return -ETIMEDOUT;
53 }
54
Jit Loon Lim12fd5ed2022-11-10 22:08:13 +080055 /* Disable snoop filter, a bit per snoop filter */
56 mmio_clrbits_32(dir_sf_en, BIT(sf));
57
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080058 }
59 }
60
61 return 0;
62}
63
64uint32_t coherent_agent_intfc_init(void)
65{
66 uint32_t dir, ca, ca_id, ca_type, ca_snoop_en;
67
68 for (dir = 0; dir < subsystem_id.num_directory; dir++) {
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080069 for (ca = 0; ca < subsystem_id.num_coh_agent; ca++) {
Tien Hock Loh070ffbb2020-05-11 01:11:55 -070070 ca_snoop_en = DIRECTORY_UNIT(ca, NCORE_DIRUCASER0);
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080071 ca_id = mmio_read_32(COH_AGENT_UNIT(ca, NCORE_CAIUIDR));
72
73 /* Coh Agent Snoop Enable */
74 if (CACHING_AGENT_BIT(ca_id))
Jit Loon Lim8eb61b72023-06-10 00:13:44 +080075 mmio_setbits_32(ca_snoop_en, BIT(ca));
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080076
77 /* Coh Agent Snoop DVM Enable */
78 ca_type = CACHING_AGENT_TYPE(ca_id);
79 if (ca_type == ACE_W_DVM || ca_type == ACE_L_W_DVM)
Jit Loon Lim8eb61b72023-06-10 00:13:44 +080080 mmio_setbits_32(NCORE_CCU_CSR(NCORE_CSADSER0),
Hadi Asyrafi073e70d2019-06-17 12:30:22 +080081 BIT(ca));
82 }
83 }
84
85 return 0;
86}
87
88uint32_t poll_active_bit(uint32_t dir)
89{
90 uint32_t timeout = 80000;
91 uint32_t poll_dir = DIRECTORY_UNIT(dir, NCORE_DIRUSFMAR);
92
93 while (timeout > 0) {
94 if (mmio_read_32(poll_dir) == 0)
95 return 0;
96 timeout--;
97 }
98
99 return -1;
100}
101
102void bypass_ocram_firewall(void)
103{
104 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF1),
105 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
106 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF2),
107 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
108 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF3),
109 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
110 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF4),
111 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
112}
113
Boon Khai Ng1e5550b2021-05-21 22:56:37 +0800114void ncore_enable_ocram_firewall(void)
115{
116 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF1),
117 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
118 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF2),
119 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
120 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF3),
121 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
122 mmio_setbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF4),
123 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
124}
Abdul Halim, Muhammad Hadi Asyrafi2f94ca42020-08-05 22:40:46 +0800125
Hadi Asyrafi073e70d2019-06-17 12:30:22 +0800126uint32_t init_ncore_ccu(void)
127{
128 uint32_t status;
129
130 get_subsystem_id();
131 status = directory_init();
132 status = coherent_agent_intfc_init();
133 bypass_ocram_firewall();
134
135 return status;
136}