2424#define ICC_PMR_DEF_PRIO 0xf0
2525
2626struct gicv3_data {
27- void * dist_base ;
28- void * redist_base [GICV3_MAX_CPUS ];
2927 unsigned int nr_cpus ;
3028 unsigned int nr_spis ;
3129};
@@ -46,17 +44,23 @@ static void gicv3_gicd_wait_for_rwp(void)
4644{
4745 unsigned int count = 100000 ; /* 1s */
4846
49- while (readl (gicv3_data . dist_base + GICD_CTLR ) & GICD_CTLR_RWP ) {
47+ while (readl (GICD_BASE_GVA + GICD_CTLR ) & GICD_CTLR_RWP ) {
5048 GUEST_ASSERT (count -- );
5149 udelay (10 );
5250 }
5351}
5452
55- static void gicv3_gicr_wait_for_rwp (void * redist_base )
53+ static inline volatile void * gicr_base_cpu (uint32_t cpu )
54+ {
55+ /* Align all the redistributors sequentially */
56+ return GICR_BASE_GVA + cpu * SZ_64K * 2 ;
57+ }
58+
59+ static void gicv3_gicr_wait_for_rwp (uint32_t cpu )
5660{
5761 unsigned int count = 100000 ; /* 1s */
5862
59- while (readl (redist_base + GICR_CTLR ) & GICR_CTLR_RWP ) {
63+ while (readl (gicr_base_cpu ( cpu ) + GICR_CTLR ) & GICR_CTLR_RWP ) {
6064 GUEST_ASSERT (count -- );
6165 udelay (10 );
6266 }
@@ -67,7 +71,7 @@ static void gicv3_wait_for_rwp(uint32_t cpu_or_dist)
6771 if (cpu_or_dist & DIST_BIT )
6872 gicv3_gicd_wait_for_rwp ();
6973 else
70- gicv3_gicr_wait_for_rwp (gicv3_data . redist_base [ cpu_or_dist ] );
74+ gicv3_gicr_wait_for_rwp (cpu_or_dist );
7175}
7276
7377static enum gicv3_intid_range get_intid_range (unsigned int intid )
@@ -127,15 +131,15 @@ static void gicv3_set_eoi_split(bool split)
127131
128132uint32_t gicv3_reg_readl (uint32_t cpu_or_dist , uint64_t offset )
129133{
130- void * base = cpu_or_dist & DIST_BIT ? gicv3_data . dist_base
131- : sgi_base_from_redist (gicv3_data . redist_base [ cpu_or_dist ] );
134+ volatile void * base = cpu_or_dist & DIST_BIT ? GICD_BASE_GVA
135+ : sgi_base_from_redist (gicr_base_cpu ( cpu_or_dist ) );
132136 return readl (base + offset );
133137}
134138
135139void gicv3_reg_writel (uint32_t cpu_or_dist , uint64_t offset , uint32_t reg_val )
136140{
137- void * base = cpu_or_dist & DIST_BIT ? gicv3_data . dist_base
138- : sgi_base_from_redist (gicv3_data . redist_base [ cpu_or_dist ] );
141+ volatile void * base = cpu_or_dist & DIST_BIT ? GICD_BASE_GVA
142+ : sgi_base_from_redist (gicr_base_cpu ( cpu_or_dist ) );
139143 writel (reg_val , base + offset );
140144}
141145
@@ -274,7 +278,7 @@ static bool gicv3_irq_get_pending(uint32_t intid)
274278 return gicv3_read_reg (intid , GICD_ISPENDR , 32 , 1 );
275279}
276280
277- static void gicv3_enable_redist (void * redist_base )
281+ static void gicv3_enable_redist (volatile void * redist_base )
278282{
279283 uint32_t val = readl (redist_base + GICR_WAKER );
280284 unsigned int count = 100000 ; /* 1s */
@@ -289,21 +293,15 @@ static void gicv3_enable_redist(void *redist_base)
289293 }
290294}
291295
292- static inline void * gicr_base_cpu ( void * redist_base , uint32_t cpu )
296+ static void gicv3_cpu_init ( unsigned int cpu )
293297{
294- /* Align all the redistributors sequentially */
295- return redist_base + cpu * SZ_64K * 2 ;
296- }
297-
298- static void gicv3_cpu_init (unsigned int cpu , void * redist_base )
299- {
300- void * sgi_base ;
298+ volatile void * sgi_base ;
301299 unsigned int i ;
302- void * redist_base_cpu ;
300+ volatile void * redist_base_cpu ;
303301
304302 GUEST_ASSERT (cpu < gicv3_data .nr_cpus );
305303
306- redist_base_cpu = gicr_base_cpu (redist_base , cpu );
304+ redist_base_cpu = gicr_base_cpu (cpu );
307305 sgi_base = sgi_base_from_redist (redist_base_cpu );
308306
309307 gicv3_enable_redist (redist_base_cpu );
@@ -321,7 +319,7 @@ static void gicv3_cpu_init(unsigned int cpu, void *redist_base)
321319 writel (GICD_INT_DEF_PRI_X4 ,
322320 sgi_base + GICR_IPRIORITYR0 + i );
323321
324- gicv3_gicr_wait_for_rwp (redist_base_cpu );
322+ gicv3_gicr_wait_for_rwp (cpu );
325323
326324 /* Enable the GIC system register (ICC_*) access */
327325 write_sysreg_s (read_sysreg_s (SYS_ICC_SRE_EL1 ) | ICC_SRE_EL1_SRE ,
@@ -332,51 +330,47 @@ static void gicv3_cpu_init(unsigned int cpu, void *redist_base)
332330
333331 /* Enable non-secure Group-1 interrupts */
334332 write_sysreg_s (ICC_IGRPEN1_EL1_MASK , SYS_ICC_IGRPEN1_EL1 );
335-
336- gicv3_data .redist_base [cpu ] = redist_base_cpu ;
337333}
338334
339335static void gicv3_dist_init (void )
340336{
341- void * dist_base = gicv3_data .dist_base ;
342337 unsigned int i ;
343338
344339 /* Disable the distributor until we set things up */
345- writel (0 , dist_base + GICD_CTLR );
340+ writel (0 , GICD_BASE_GVA + GICD_CTLR );
346341 gicv3_gicd_wait_for_rwp ();
347342
348343 /*
349344 * Mark all the SPI interrupts as non-secure Group-1.
350345 * Also, deactivate and disable them.
351346 */
352347 for (i = 32 ; i < gicv3_data .nr_spis ; i += 32 ) {
353- writel (~0 , dist_base + GICD_IGROUPR + i / 8 );
354- writel (~0 , dist_base + GICD_ICACTIVER + i / 8 );
355- writel (~0 , dist_base + GICD_ICENABLER + i / 8 );
348+ writel (~0 , GICD_BASE_GVA + GICD_IGROUPR + i / 8 );
349+ writel (~0 , GICD_BASE_GVA + GICD_ICACTIVER + i / 8 );
350+ writel (~0 , GICD_BASE_GVA + GICD_ICENABLER + i / 8 );
356351 }
357352
358353 /* Set a default priority for all the SPIs */
359354 for (i = 32 ; i < gicv3_data .nr_spis ; i += 4 )
360355 writel (GICD_INT_DEF_PRI_X4 ,
361- dist_base + GICD_IPRIORITYR + i );
356+ GICD_BASE_GVA + GICD_IPRIORITYR + i );
362357
363358 /* Wait for the settings to sync-in */
364359 gicv3_gicd_wait_for_rwp ();
365360
366361 /* Finally, enable the distributor globally with ARE */
367362 writel (GICD_CTLR_ARE_NS | GICD_CTLR_ENABLE_G1A |
368- GICD_CTLR_ENABLE_G1 , dist_base + GICD_CTLR );
363+ GICD_CTLR_ENABLE_G1 , GICD_BASE_GVA + GICD_CTLR );
369364 gicv3_gicd_wait_for_rwp ();
370365}
371366
372- static void gicv3_init (unsigned int nr_cpus , void * dist_base )
367+ static void gicv3_init (unsigned int nr_cpus )
373368{
374369 GUEST_ASSERT (nr_cpus <= GICV3_MAX_CPUS );
375370
376371 gicv3_data .nr_cpus = nr_cpus ;
377- gicv3_data .dist_base = dist_base ;
378372 gicv3_data .nr_spis = GICD_TYPER_SPIS (
379- readl (gicv3_data . dist_base + GICD_TYPER ));
373+ readl (GICD_BASE_GVA + GICD_TYPER ));
380374 if (gicv3_data .nr_spis > 1020 )
381375 gicv3_data .nr_spis = 1020 ;
382376
0 commit comments