1
1
/*
2
2
* Copyright 2020 Broadcom
3
- * Copyright 2024 NXP
3
+ * Copyright 2024-2025 NXP
4
4
* Copyright 2025 Arm Limited and/or its affiliates <[email protected] >
5
5
*
6
6
* SPDX-License-Identifier: Apache-2.0
7
7
*/
8
8
9
+ #include <zephyr/cache.h>
9
10
#include <zephyr/device.h>
10
11
#include <zephyr/kernel.h>
11
12
#include <zephyr/arch/cpu.h>
@@ -111,7 +112,11 @@ static void arm_gic_lpi_setup(unsigned int intid, bool enable)
111
112
* cfg &= ~BIT (0 );
112
113
}
113
114
115
+ #ifdef CONFIG_GIC_V3_RDIST_DMA_NONCOHERENT
116
+ arch_dcache_flush_and_invd_range (cfg , sizeof (* cfg ));
117
+ #else
114
118
barrier_dsync_fence_full ();
119
+ #endif
115
120
116
121
its_rdist_invall ();
117
122
}
@@ -123,7 +128,11 @@ static void arm_gic_lpi_set_priority(unsigned int intid, unsigned int prio)
123
128
* cfg &= 0xfc ;
124
129
* cfg |= prio & 0xfc ;
125
130
131
+ #ifdef CONFIG_GIC_V3_RDIST_DMA_NONCOHERENT
132
+ arch_dcache_flush_and_invd_range (cfg , sizeof (* cfg ));
133
+ #else
126
134
barrier_dsync_fence_full ();
135
+ #endif
127
136
128
137
its_rdist_invall ();
129
138
}
@@ -406,7 +415,7 @@ static void gicv3_rdist_setup_lpis(mem_addr_t rdist)
406
415
unsigned int lpi_id_bits =
407
416
MIN (GICD_TYPER_IDBITS (sys_read32 (GICD_TYPER )), ITS_MAX_LPI_NRBITS );
408
417
uintptr_t lpi_pend_table ;
409
- uint64_t reg ;
418
+ uint64_t reg , tmp ;
410
419
uint32_t ctlr ;
411
420
412
421
/* If not, alloc a common prop table for all redistributors */
@@ -418,6 +427,11 @@ static void gicv3_rdist_setup_lpis(mem_addr_t rdist)
418
427
lpi_pend_table = (uintptr_t )k_aligned_alloc (64 * 1024 , LPI_PENDBASE_SZ (lpi_id_bits ));
419
428
memset ((void * )lpi_pend_table , 0 , LPI_PENDBASE_SZ (lpi_id_bits ));
420
429
430
+ #ifdef CONFIG_GIC_V3_RDIST_DMA_NONCOHERENT
431
+ arch_dcache_flush_and_invd_range ((void * )lpi_prop_table , LPI_PROPBASE_SZ (lpi_id_bits ));
432
+ arch_dcache_flush_and_invd_range ((void * )lpi_pend_table , LPI_PENDBASE_SZ (lpi_id_bits ));
433
+ #endif
434
+
421
435
ctlr = sys_read32 (rdist + GICR_CTLR );
422
436
ctlr &= ~GICR_CTLR_ENABLE_LPIS ;
423
437
sys_write32 (ctlr , rdist + GICR_CTLR );
@@ -429,15 +443,33 @@ static void gicv3_rdist_setup_lpis(mem_addr_t rdist)
429
443
(GIC_BASER_CACHE_INNERLIKE << GITR_PROPBASER_OUTER_CACHE_SHIFT ) |
430
444
((lpi_id_bits - 1 ) & GITR_PROPBASER_ID_BITS_MASK );
431
445
sys_write64 (reg , rdist + GICR_PROPBASER );
432
- /* TOFIX: check SHAREABILITY validity */
446
+ /* Check SHAREABILITY validity */
447
+ tmp = sys_read64 (rdist + GICR_PROPBASER );
448
+ #ifdef CONFIG_GIC_V3_RDIST_DMA_NONCOHERENT
449
+ tmp &= ~MASK (GITR_PROPBASER_SHAREABILITY );
450
+ #endif
451
+ if (!(tmp & MASK (GITR_PROPBASER_SHAREABILITY ))) {
452
+ reg &= ~(MASK (GITR_PROPBASER_SHAREABILITY ) | MASK (GITR_PROPBASER_INNER_CACHE ));
453
+ reg |= GIC_BASER_CACHE_NCACHEABLE << GITR_PROPBASER_INNER_CACHE_SHIFT ;
454
+ sys_write64 (reg , rdist + GICR_PROPBASER );
455
+ }
433
456
434
457
/* PENDBASE */
435
458
reg = (GIC_BASER_SHARE_INNER << GITR_PENDBASER_SHAREABILITY_SHIFT ) |
436
459
(GIC_BASER_CACHE_RAWAWB << GITR_PENDBASER_INNER_CACHE_SHIFT ) |
437
460
(lpi_pend_table & (GITR_PENDBASER_ADDR_MASK << GITR_PENDBASER_ADDR_SHIFT )) |
438
461
(GIC_BASER_CACHE_INNERLIKE << GITR_PENDBASER_OUTER_CACHE_SHIFT ) | GITR_PENDBASER_PTZ ;
439
462
sys_write64 (reg , rdist + GICR_PENDBASER );
440
- /* TOFIX: check SHAREABILITY validity */
463
+ /* Check SHAREABILITY validity */
464
+ tmp = sys_read64 (rdist + GICR_PENDBASER );
465
+ #ifdef CONFIG_GIC_V3_RDIST_DMA_NONCOHERENT
466
+ tmp &= ~MASK (GITR_PENDBASER_SHAREABILITY );
467
+ #endif
468
+ if (!(tmp & MASK (GITR_PENDBASER_SHAREABILITY ))) {
469
+ reg &= ~(MASK (GITR_PENDBASER_SHAREABILITY ) | MASK (GITR_PENDBASER_INNER_CACHE ));
470
+ reg |= GIC_BASER_CACHE_NCACHEABLE << GITR_PENDBASER_INNER_CACHE_SHIFT ;
471
+ sys_write64 (reg , rdist + GICR_PENDBASER );
472
+ }
441
473
442
474
ctlr = sys_read32 (rdist + GICR_CTLR );
443
475
ctlr |= GICR_CTLR_ENABLE_LPIS ;
0 commit comments