blob: ac8218ecd9627ef859b5cd6d630cd30e3199eb24 [file] [log] [blame]
Hadi Asyrafi073e70d2019-06-17 12:30:22 +08001/*
2 * Copyright (c) 2019, Intel Corporation. All rights reserved.
3 *
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"
13#include <platform_def.h>
14
15uint32_t poll_active_bit(uint32_t dir);
16
17static coh_ss_id_t subsystem_id;
18
19
20void get_subsystem_id(void)
21{
22 uint32_t snoop_filter, directory, coh_agent;
23
24 snoop_filter = CSIDR_NUM_SF(mmio_read_32(NCORE_CCU_CSR(NCORE_CSIDR)));
25 directory = CSUIDR_NUM_DIR(mmio_read_32(NCORE_CCU_CSR(NCORE_CSUIDR)));
26 coh_agent = CSUIDR_NUM_CAI(mmio_read_32(NCORE_CCU_CSR(NCORE_CSUIDR)));
27
28 subsystem_id.num_snoop_filter = snoop_filter + 1;
29 subsystem_id.num_directory = directory;
30 subsystem_id.num_coh_agent = coh_agent;
31}
32
33uint32_t directory_init(void)
34{
35 uint32_t dir_sf_mtn, dir_sf_en;
36 uint32_t dir, sf, ret;
37
38 for (dir = 0; dir < subsystem_id.num_directory; dir++) {
39
40 dir_sf_mtn = DIRECTORY_UNIT(dir, NCORE_DIRUSFMCR);
41 dir_sf_en = DIRECTORY_UNIT(dir, NCORE_DIRUSFER);
42
43 for (sf = 0; sf < subsystem_id.num_snoop_filter; sf++) {
44
45 /* Initialize All Entries */
46 mmio_write_32(dir_sf_mtn, SNOOP_FILTER_ID(sf));
47
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
55 /* Snoope Filter Enable */
56 mmio_write_32(dir_sf_en, BIT(sf));
57 }
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++) {
68
69 ca_snoop_en = DIRECTORY_UNIT(dir, NCORE_DIRUCASER0);
70
71 for (ca = 0; ca < subsystem_id.num_coh_agent; ca++) {
72
73 ca_id = mmio_read_32(COH_AGENT_UNIT(ca, NCORE_CAIUIDR));
74
75 /* Coh Agent Snoop Enable */
76 if (CACHING_AGENT_BIT(ca_id))
77 mmio_write_32(ca_snoop_en, BIT(ca));
78
79 /* Coh Agent Snoop DVM Enable */
80 ca_type = CACHING_AGENT_TYPE(ca_id);
81 if (ca_type == ACE_W_DVM || ca_type == ACE_L_W_DVM)
82 mmio_write_32(NCORE_CCU_CSR(NCORE_CSADSER0),
83 BIT(ca));
84 }
85 }
86
87 return 0;
88}
89
90uint32_t poll_active_bit(uint32_t dir)
91{
92 uint32_t timeout = 80000;
93 uint32_t poll_dir = DIRECTORY_UNIT(dir, NCORE_DIRUSFMAR);
94
95 while (timeout > 0) {
96 if (mmio_read_32(poll_dir) == 0)
97 return 0;
98 timeout--;
99 }
100
101 return -1;
102}
103
104void bypass_ocram_firewall(void)
105{
106 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF1),
107 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
108 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF2),
109 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
110 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF3),
111 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
112 mmio_clrbits_32(COH_CPU0_BYPASS_REG(NCORE_FW_OCRAM_BLK_CGF4),
113 OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
114}
115
116uint32_t init_ncore_ccu(void)
117{
118 uint32_t status;
119
120 get_subsystem_id();
121 status = directory_init();
122 status = coherent_agent_intfc_init();
123 bypass_ocram_firewall();
124
125 return status;
126}