1 /*
2 * Copyright (c) 2020-2021, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <common/debug.h>
8 #include <drivers/arm/gic600_multichip.h>
9 #include <plat/arm/common/plat_arm.h>
10 #include <plat/common/platform.h>
11 #include <sgi_soc_platform_def_v2.h>
12 #include <sgi_plat.h>
13
14 #if defined(IMAGE_BL31)
15 #if (CSS_SGI_PLATFORM_VARIANT == 2)
16 static const mmap_region_t rdn2mc_dynamic_mmap[] = {
17 #if CSS_SGI_CHIP_COUNT > 1
18 ARM_MAP_SHARED_RAM_REMOTE_CHIP(1),
19 CSS_SGI_MAP_DEVICE_REMOTE_CHIP(1),
20 #endif
21 #if CSS_SGI_CHIP_COUNT > 2
22 ARM_MAP_SHARED_RAM_REMOTE_CHIP(2),
23 CSS_SGI_MAP_DEVICE_REMOTE_CHIP(2),
24 #endif
25 #if CSS_SGI_CHIP_COUNT > 3
26 ARM_MAP_SHARED_RAM_REMOTE_CHIP(3),
27 CSS_SGI_MAP_DEVICE_REMOTE_CHIP(3),
28 #endif
29 };
30 #endif
31
32 #if (CSS_SGI_PLATFORM_VARIANT == 2)
33 static struct gic600_multichip_data rdn2mc_multichip_data __init = {
34 .rt_owner_base = PLAT_ARM_GICD_BASE,
35 .rt_owner = 0,
36 .chip_count = CSS_SGI_CHIP_COUNT,
37 .chip_addrs = {
38 PLAT_ARM_GICD_BASE >> 16,
39 #if CSS_SGI_CHIP_COUNT > 1
40 (PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1)) >> 16,
41 #endif
42 #if CSS_SGI_CHIP_COUNT > 2
43 (PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2)) >> 16,
44 #endif
45 #if CSS_SGI_CHIP_COUNT > 3
46 (PLAT_ARM_GICD_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3)) >> 16,
47 #endif
48 },
49 .spi_ids = {
50 {32, 479},
51 #if CSS_SGI_CHIP_COUNT > 1
52 {0, 0},
53 #endif
54 #if CSS_SGI_CHIP_COUNT > 2
55 {0, 0},
56 #endif
57 #if CSS_SGI_CHIP_COUNT > 3
58 {0, 0},
59 #endif
60 }
61 };
62 #endif
63
64 #if (CSS_SGI_PLATFORM_VARIANT == 2)
65 static uintptr_t rdn2mc_multichip_gicr_frames[] = {
66 /* Chip 0's GICR Base */
67 PLAT_ARM_GICR_BASE,
68 #if CSS_SGI_CHIP_COUNT > 1
69 /* Chip 1's GICR BASE */
70 PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(1),
71 #endif
72 #if CSS_SGI_CHIP_COUNT > 2
73 /* Chip 2's GICR BASE */
74 PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(2),
75 #endif
76 #if CSS_SGI_CHIP_COUNT > 3
77 /* Chip 3's GICR BASE */
78 PLAT_ARM_GICR_BASE + CSS_SGI_REMOTE_CHIP_MEM_OFFSET(3),
79 #endif
80 UL(0) /* Zero Termination */
81 };
82 #endif
83 #endif /* IMAGE_BL31 */
84
plat_arm_sgi_get_platform_id(void)85 unsigned int plat_arm_sgi_get_platform_id(void)
86 {
87 return mmio_read_32(SID_REG_BASE + SID_SYSTEM_ID_OFFSET)
88 & SID_SYSTEM_ID_PART_NUM_MASK;
89 }
90
plat_arm_sgi_get_config_id(void)91 unsigned int plat_arm_sgi_get_config_id(void)
92 {
93 return mmio_read_32(SID_REG_BASE + SID_SYSTEM_CFG_OFFSET);
94 }
95
plat_arm_sgi_get_multi_chip_mode(void)96 unsigned int plat_arm_sgi_get_multi_chip_mode(void)
97 {
98 return (mmio_read_32(SID_REG_BASE + SID_NODE_ID_OFFSET) &
99 SID_MULTI_CHIP_MODE_MASK) >>
100 SID_MULTI_CHIP_MODE_SHIFT;
101 }
102
103 #if defined(IMAGE_BL31)
bl31_platform_setup(void)104 void bl31_platform_setup(void)
105 {
106 #if (CSS_SGI_PLATFORM_VARIANT == 2)
107 int ret;
108 unsigned int i;
109
110 if (plat_arm_sgi_get_multi_chip_mode() == 0) {
111 ERROR("Chip Count is set to %u but multi-chip mode is not "
112 "enabled\n", CSS_SGI_CHIP_COUNT);
113 panic();
114 } else {
115 INFO("Enabling multi-chip support for RD-N2 variant\n");
116
117 for (i = 0; i < ARRAY_SIZE(rdn2mc_dynamic_mmap); i++) {
118 ret = mmap_add_dynamic_region(
119 rdn2mc_dynamic_mmap[i].base_pa,
120 rdn2mc_dynamic_mmap[i].base_va,
121 rdn2mc_dynamic_mmap[i].size,
122 rdn2mc_dynamic_mmap[i].attr);
123 if (ret != 0) {
124 ERROR("Failed to add dynamic mmap entry for"
125 " i: %d " "(ret=%d)\n", i, ret);
126 panic();
127 }
128 }
129
130 plat_arm_override_gicr_frames(
131 rdn2mc_multichip_gicr_frames);
132 gic600_multichip_init(&rdn2mc_multichip_data);
133 }
134 #endif
135
136 sgi_bl31_common_platform_setup();
137 }
138 #endif /* IMAGE_BL31 */
139