@@ -13,19 +13,19 @@ static void eiointc_set_sw_coreisr(struct loongarch_eiointc *s)
1313 struct kvm_vcpu * vcpu ;
1414
1515 for (irq = 0 ; irq < EIOINTC_IRQS ; irq ++ ) {
16- ipnum = s -> ipmap . reg_u8 [ irq / 32 ] ;
16+ ipnum = ( s -> ipmap >> ( irq / 32 * 8 )) & 0xff ;
1717 if (!(s -> status & BIT (EIOINTC_ENABLE_INT_ENCODE ))) {
1818 ipnum = count_trailing_zeros (ipnum );
1919 ipnum = (ipnum >= 0 && ipnum < 4 ) ? ipnum : 0 ;
2020 }
2121
22- cpuid = s -> coremap . reg_u8 [irq ];
22+ cpuid = (( u8 * ) s -> coremap ) [irq ];
2323 vcpu = kvm_get_vcpu_by_cpuid (s -> kvm , cpuid );
2424 if (!vcpu )
2525 continue ;
2626
2727 cpu = vcpu -> vcpu_id ;
28- if (test_bit (irq , (unsigned long * )s -> coreisr . reg_u32 [cpu ]))
28+ if (test_bit (irq , (unsigned long * )s -> coreisr [cpu ]))
2929 __set_bit (irq , s -> sw_coreisr [cpu ][ipnum ]);
3030 else
3131 __clear_bit (irq , s -> sw_coreisr [cpu ][ipnum ]);
@@ -38,7 +38,7 @@ static void eiointc_update_irq(struct loongarch_eiointc *s, int irq, int level)
3838 struct kvm_vcpu * vcpu ;
3939 struct kvm_interrupt vcpu_irq ;
4040
41- ipnum = s -> ipmap . reg_u8 [ irq / 32 ] ;
41+ ipnum = ( s -> ipmap >> ( irq / 32 * 8 )) & 0xff ;
4242 if (!(s -> status & BIT (EIOINTC_ENABLE_INT_ENCODE ))) {
4343 ipnum = count_trailing_zeros (ipnum );
4444 ipnum = (ipnum >= 0 && ipnum < 4 ) ? ipnum : 0 ;
@@ -53,13 +53,13 @@ static void eiointc_update_irq(struct loongarch_eiointc *s, int irq, int level)
5353
5454 if (level ) {
5555 /* if not enable return false */
56- if (!test_bit (irq , (unsigned long * )s -> enable . reg_u32 ))
56+ if (!test_bit (irq , (unsigned long * )s -> enable ))
5757 return ;
58- __set_bit (irq , (unsigned long * )s -> coreisr . reg_u32 [cpu ]);
58+ __set_bit (irq , (unsigned long * )s -> coreisr [cpu ]);
5959 found = find_first_bit (s -> sw_coreisr [cpu ][ipnum ], EIOINTC_IRQS );
6060 __set_bit (irq , s -> sw_coreisr [cpu ][ipnum ]);
6161 } else {
62- __clear_bit (irq , (unsigned long * )s -> coreisr . reg_u32 [cpu ]);
62+ __clear_bit (irq , (unsigned long * )s -> coreisr [cpu ]);
6363 __clear_bit (irq , s -> sw_coreisr [cpu ][ipnum ]);
6464 found = find_first_bit (s -> sw_coreisr [cpu ][ipnum ], EIOINTC_IRQS );
6565 }
@@ -94,7 +94,7 @@ static inline void eiointc_update_sw_coremap(struct loongarch_eiointc *s,
9494 if (s -> sw_coremap [irq + i ] == cpu )
9595 continue ;
9696
97- if (notify && test_bit (irq + i , (unsigned long * )s -> isr . reg_u8 )) {
97+ if (notify && test_bit (irq + i , (unsigned long * )s -> isr )) {
9898 /* lower irq at old cpu and raise irq at new cpu */
9999 eiointc_update_irq (s , irq + i , 0 );
100100 s -> sw_coremap [irq + i ] = cpu ;
@@ -108,7 +108,7 @@ static inline void eiointc_update_sw_coremap(struct loongarch_eiointc *s,
108108void eiointc_set_irq (struct loongarch_eiointc * s , int irq , int level )
109109{
110110 unsigned long flags ;
111- unsigned long * isr = (unsigned long * )s -> isr . reg_u8 ;
111+ unsigned long * isr = (unsigned long * )s -> isr ;
112112
113113 spin_lock_irqsave (& s -> lock , flags );
114114 level ? __set_bit (irq , isr ) : __clear_bit (irq , isr );
@@ -127,27 +127,27 @@ static int loongarch_eiointc_read(struct kvm_vcpu *vcpu, struct loongarch_eioint
127127 switch (offset ) {
128128 case EIOINTC_NODETYPE_START ... EIOINTC_NODETYPE_END :
129129 index = (offset - EIOINTC_NODETYPE_START ) >> 3 ;
130- data = s -> nodetype . reg_u64 [index ];
130+ data = s -> nodetype [index ];
131131 break ;
132132 case EIOINTC_IPMAP_START ... EIOINTC_IPMAP_END :
133133 index = (offset - EIOINTC_IPMAP_START ) >> 3 ;
134- data = s -> ipmap . reg_u64 ;
134+ data = s -> ipmap ;
135135 break ;
136136 case EIOINTC_ENABLE_START ... EIOINTC_ENABLE_END :
137137 index = (offset - EIOINTC_ENABLE_START ) >> 3 ;
138- data = s -> enable . reg_u64 [index ];
138+ data = s -> enable [index ];
139139 break ;
140140 case EIOINTC_BOUNCE_START ... EIOINTC_BOUNCE_END :
141141 index = (offset - EIOINTC_BOUNCE_START ) >> 3 ;
142- data = s -> bounce . reg_u64 [index ];
142+ data = s -> bounce [index ];
143143 break ;
144144 case EIOINTC_COREISR_START ... EIOINTC_COREISR_END :
145145 index = (offset - EIOINTC_COREISR_START ) >> 3 ;
146- data = s -> coreisr . reg_u64 [vcpu -> vcpu_id ][index ];
146+ data = s -> coreisr [vcpu -> vcpu_id ][index ];
147147 break ;
148148 case EIOINTC_COREMAP_START ... EIOINTC_COREMAP_END :
149149 index = (offset - EIOINTC_COREMAP_START ) >> 3 ;
150- data = s -> coremap . reg_u64 [index ];
150+ data = s -> coremap [index ];
151151 break ;
152152 default :
153153 ret = - EINVAL ;
@@ -223,26 +223,26 @@ static int loongarch_eiointc_write(struct kvm_vcpu *vcpu,
223223 switch (offset ) {
224224 case EIOINTC_NODETYPE_START ... EIOINTC_NODETYPE_END :
225225 index = (offset - EIOINTC_NODETYPE_START ) >> 3 ;
226- old = s -> nodetype . reg_u64 [index ];
227- s -> nodetype . reg_u64 [index ] = (old & ~mask ) | data ;
226+ old = s -> nodetype [index ];
227+ s -> nodetype [index ] = (old & ~mask ) | data ;
228228 break ;
229229 case EIOINTC_IPMAP_START ... EIOINTC_IPMAP_END :
230230 /*
231231 * ipmap cannot be set at runtime, can be set only at the beginning
232232 * of irqchip driver, need not update upper irq level
233233 */
234- old = s -> ipmap . reg_u64 ;
235- s -> ipmap . reg_u64 = (old & ~mask ) | data ;
234+ old = s -> ipmap ;
235+ s -> ipmap = (old & ~mask ) | data ;
236236 break ;
237237 case EIOINTC_ENABLE_START ... EIOINTC_ENABLE_END :
238238 index = (offset - EIOINTC_ENABLE_START ) >> 3 ;
239- old = s -> enable . reg_u64 [index ];
240- s -> enable . reg_u64 [index ] = (old & ~mask ) | data ;
239+ old = s -> enable [index ];
240+ s -> enable [index ] = (old & ~mask ) | data ;
241241 /*
242242 * 1: enable irq.
243243 * update irq when isr is set.
244244 */
245- data = s -> enable . reg_u64 [index ] & ~old & s -> isr . reg_u64 [index ];
245+ data = s -> enable [index ] & ~old & s -> isr [index ];
246246 while (data ) {
247247 irq = __ffs (data );
248248 eiointc_update_irq (s , irq + index * 64 , 1 );
@@ -252,7 +252,7 @@ static int loongarch_eiointc_write(struct kvm_vcpu *vcpu,
252252 * 0: disable irq.
253253 * update irq when isr is set.
254254 */
255- data = ~s -> enable . reg_u64 [index ] & old & s -> isr . reg_u64 [index ];
255+ data = ~s -> enable [index ] & old & s -> isr [index ];
256256 while (data ) {
257257 irq = __ffs (data );
258258 eiointc_update_irq (s , irq + index * 64 , 0 );
@@ -262,16 +262,16 @@ static int loongarch_eiointc_write(struct kvm_vcpu *vcpu,
262262 case EIOINTC_BOUNCE_START ... EIOINTC_BOUNCE_END :
263263 /* do not emulate hw bounced irq routing */
264264 index = (offset - EIOINTC_BOUNCE_START ) >> 3 ;
265- old = s -> bounce . reg_u64 [index ];
266- s -> bounce . reg_u64 [index ] = (old & ~mask ) | data ;
265+ old = s -> bounce [index ];
266+ s -> bounce [index ] = (old & ~mask ) | data ;
267267 break ;
268268 case EIOINTC_COREISR_START ... EIOINTC_COREISR_END :
269269 index = (offset - EIOINTC_COREISR_START ) >> 3 ;
270270 /* use attrs to get current cpu index */
271271 cpu = vcpu -> vcpu_id ;
272- old = s -> coreisr . reg_u64 [cpu ][index ];
272+ old = s -> coreisr [cpu ][index ];
273273 /* write 1 to clear interrupt */
274- s -> coreisr . reg_u64 [cpu ][index ] = old & ~data ;
274+ s -> coreisr [cpu ][index ] = old & ~data ;
275275 data &= old ;
276276 while (data ) {
277277 irq = __ffs (data );
@@ -281,9 +281,9 @@ static int loongarch_eiointc_write(struct kvm_vcpu *vcpu,
281281 break ;
282282 case EIOINTC_COREMAP_START ... EIOINTC_COREMAP_END :
283283 index = (offset - EIOINTC_COREMAP_START ) >> 3 ;
284- old = s -> coremap . reg_u64 [index ];
285- s -> coremap . reg_u64 [index ] = (old & ~mask ) | data ;
286- data = s -> coremap . reg_u64 [index ];
284+ old = s -> coremap [index ];
285+ s -> coremap [index ] = (old & ~mask ) | data ;
286+ data = s -> coremap [index ];
287287 eiointc_update_sw_coremap (s , index * 8 , data , sizeof (data ), true);
288288 break ;
289289 default :
@@ -451,10 +451,10 @@ static int kvm_eiointc_ctrl_access(struct kvm_device *dev,
451451 break ;
452452 case KVM_DEV_LOONGARCH_EXTIOI_CTRL_LOAD_FINISHED :
453453 eiointc_set_sw_coreisr (s );
454- for (i = 0 ; i < (EIOINTC_IRQS / 4 ); i ++ ) {
455- start_irq = i * 4 ;
454+ for (i = 0 ; i < (EIOINTC_IRQS / 8 ); i ++ ) {
455+ start_irq = i * 8 ;
456456 eiointc_update_sw_coremap (s , start_irq ,
457- s -> coremap . reg_u32 [i ], sizeof (u32 ), false);
457+ s -> coremap [i ], sizeof (u64 ), false);
458458 }
459459 break ;
460460 default :
@@ -481,34 +481,34 @@ static int kvm_eiointc_regs_access(struct kvm_device *dev,
481481 switch (addr ) {
482482 case EIOINTC_NODETYPE_START ... EIOINTC_NODETYPE_END :
483483 offset = (addr - EIOINTC_NODETYPE_START ) / 4 ;
484- p = & s -> nodetype . reg_u32 [ offset ] ;
484+ p = s -> nodetype + offset * 4 ;
485485 break ;
486486 case EIOINTC_IPMAP_START ... EIOINTC_IPMAP_END :
487487 offset = (addr - EIOINTC_IPMAP_START ) / 4 ;
488- p = & s -> ipmap . reg_u32 [ offset ] ;
488+ p = & s -> ipmap + offset * 4 ;
489489 break ;
490490 case EIOINTC_ENABLE_START ... EIOINTC_ENABLE_END :
491491 offset = (addr - EIOINTC_ENABLE_START ) / 4 ;
492- p = & s -> enable . reg_u32 [ offset ] ;
492+ p = s -> enable + offset * 4 ;
493493 break ;
494494 case EIOINTC_BOUNCE_START ... EIOINTC_BOUNCE_END :
495495 offset = (addr - EIOINTC_BOUNCE_START ) / 4 ;
496- p = & s -> bounce . reg_u32 [ offset ] ;
496+ p = s -> bounce + offset * 4 ;
497497 break ;
498498 case EIOINTC_ISR_START ... EIOINTC_ISR_END :
499499 offset = (addr - EIOINTC_ISR_START ) / 4 ;
500- p = & s -> isr . reg_u32 [ offset ] ;
500+ p = s -> isr + offset * 4 ;
501501 break ;
502502 case EIOINTC_COREISR_START ... EIOINTC_COREISR_END :
503503 if (cpu >= s -> num_cpu )
504504 return - EINVAL ;
505505
506506 offset = (addr - EIOINTC_COREISR_START ) / 4 ;
507- p = & s -> coreisr . reg_u32 [cpu ][ offset ] ;
507+ p = s -> coreisr [cpu ] + offset * 4 ;
508508 break ;
509509 case EIOINTC_COREMAP_START ... EIOINTC_COREMAP_END :
510510 offset = (addr - EIOINTC_COREMAP_START ) / 4 ;
511- p = & s -> coremap . reg_u32 [ offset ] ;
511+ p = s -> coremap + offset * 4 ;
512512 break ;
513513 default :
514514 kvm_err ("%s: unknown eiointc register, addr = %d\n" , __func__ , addr );
0 commit comments