Skip to content

Commit 5fea8ae

Browse files
committed
[PIC/GIC] Fixup GIC affinity init
GICv2 is not support if current CPU is not startup, but RT-Thread SMP is startup after the devices init in the `main` thread. This patch fixup the cpumask to init once and check the init status in affinity interface. Signed-off-by: GuEe-GUI <[email protected]>
1 parent 9c9a3e4 commit 5fea8ae

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

components/drivers/pic/pic-gic-common.c

+8
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,11 @@ void gic_common_cpu_config(void *base, int nr, void (*sync_access)(void *), void
173173
sync_access(data);
174174
}
175175
}
176+
177+
void gic_fill_ppi_affinity(bitmap_t *affinity)
178+
{
179+
for (int cpuid = 0; cpuid < RT_CPUS_NR; ++cpuid)
180+
{
181+
RT_IRQ_AFFINITY_SET(affinity, cpuid);
182+
}
183+
}

components/drivers/pic/pic-gic-common.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
#define GIC_SGI_NR 16
1818

19-
#define GICD_INT_DEF_PRI 0xa0
19+
#define GICD_INT_DEF_PRI 0xa0U
2020
#define GICD_INT_DEF_PRI_X4 \
2121
( \
2222
(GICD_INT_DEF_PRI << 24) | \
@@ -43,6 +43,8 @@ rt_err_t gic_common_configure_irq(void *base, int irq, rt_uint32_t mode, void (*
4343
void gic_common_dist_config(void *base, int max_irqs, void (*sync_access)(void *), void *data);
4444
void gic_common_cpu_config(void *base, int nr, void (*sync_access)(void *), void *data);
4545

46+
void gic_fill_ppi_affinity(bitmap_t *affinity);
47+
4648
#ifdef RT_PIC_ARM_GIC_V2M
4749
rt_err_t gicv2m_ofw_probe(struct rt_ofw_node *ic_np, const struct rt_ofw_node_id *id);
4850
#endif

components/drivers/pic/pic-gicv2.c

+18-3
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ static void gicv2_dist_init(struct gicv2 *gic)
6666
rt_uint32_t i;
6767
rt_uint32_t cpumask = gicv2_cpumask_map(gic);
6868

69+
_init_cpu_id = rt_hw_cpu_id();
70+
6971
gic->max_irq = HWREG32(base + GIC_DIST_TYPE) & 0x1f;
7072
gic->max_irq = (gic->max_irq + 1) * 32;
7173

@@ -102,7 +104,7 @@ static void gicv2_cpu_init(struct gicv2 *gic)
102104
rt_uint32_t cpumask;
103105
void *base = gic->cpu_base;
104106
rt_uint32_t config = GICC_ENABLE;
105-
int cpu_id = _init_cpu_id = rt_hw_cpu_id();
107+
int cpu_id = rt_hw_cpu_id();
106108

107109
cpumask = gicv2_cpumask_map(gic);
108110
_gicv2_cpumask_map[cpu_id] = cpumask;
@@ -204,6 +206,11 @@ static rt_err_t gicv2_irq_set_affinity(struct rt_pic_irq *pirq, rt_bitmap_t *aff
204206
rt_uint8_t valb = _gicv2_cpumask_map[__rt_ffs(target_list) - 1];
205207
void *io_addr = gic->dist_base + GIC_DIST_TARGET + hwirq;
206208

209+
if (valb == 0xfe)
210+
{
211+
return -RT_EIO;
212+
}
213+
207214
if (needs_rmw_access)
208215
{
209216
/* RMW write byte */
@@ -278,7 +285,15 @@ static int gicv2_irq_map(struct rt_pic *pic, int hwirq, rt_uint32_t mode)
278285
{
279286
pirq->mode = mode;
280287
pirq->priority = GICD_INT_DEF_PRI;
281-
rt_bitmap_set_bit(pirq->affinity, _init_cpu_id);
288+
289+
if (hwirq < 32)
290+
{
291+
gic_fill_ppi_affinity(pirq->affinity);
292+
}
293+
else
294+
{
295+
bitmap_set_bit(pirq->affinity, _init_cpu_id);
296+
}
282297

283298
irq = rt_pic_config_irq(pic, irq_index, hwirq);
284299

@@ -326,7 +341,7 @@ static rt_err_t gicv2_irq_parse(struct rt_pic *pic, struct rt_ofw_cell_args *arg
326341
return err;
327342
}
328343

329-
static struct rt_pic_ops gicv2_ops =
344+
const static struct rt_pic_ops gicv2_ops =
330345
{
331346
.name = "GICv2",
332347
.irq_init = gicv2_irq_init,

components/drivers/pic/pic-gicv3.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,9 @@ static int gicv3_irq_map(struct rt_pic *pic, int hwirq, rt_uint32_t mode)
622622

623623
switch (gicv3_hwirq_type(hwirq))
624624
{
625+
case PPI_TYPE:
626+
gic_fill_ppi_affinity(pirq->affinity);
627+
break;
625628
case SPI_TYPE:
626629
case ESPI_TYPE:
627630
pirq->priority = GICD_INT_DEF_PRI;
@@ -701,7 +704,7 @@ static rt_err_t gicv3_irq_parse(struct rt_pic *pic, struct rt_ofw_cell_args *arg
701704
return err;
702705
}
703706

704-
static struct rt_pic_ops gicv3_ops =
707+
const static struct rt_pic_ops gicv3_ops =
705708
{
706709
.name = "GICv3",
707710
.irq_init = gicv3_irq_init,

0 commit comments

Comments
 (0)