10
10
#define IOAPIC_REGSEL_OFFSET 0
11
11
#define IOAPIC_WINSWL_OFFSET 0x10
12
12
13
- #define IOAPIC_MAX_PIN 256
13
+ #define IOAPIC_MAX_PIN 240U
14
+ #define IOAPIC_INVALID_PIN 0xffU
14
15
15
16
/* IOAPIC Redirection Table (RTE) Entry structure */
16
17
struct ioapic_rte {
@@ -33,7 +34,7 @@ static struct ioapic_rte saved_rte[CONFIG_NR_IOAPICS][IOAPIC_MAX_PIN];
33
34
* the irq to ioapic pin mapping should extract from ACPI MADT table
34
35
* hardcoded here
35
36
*/
36
- uint16_t legacy_irq_to_pin [NR_LEGACY_IRQ ] = {
37
+ uint8_t legacy_irq_to_pin [NR_LEGACY_IRQ ] = {
37
38
2U , /* IRQ0*/
38
39
1U , /* IRQ1*/
39
40
0U , /* IRQ2 connected to Pin0 (ExtInt source of PIC) if existing */
@@ -43,7 +44,7 @@ uint16_t legacy_irq_to_pin[NR_LEGACY_IRQ] = {
43
44
6U , /* IRQ6*/
44
45
7U , /* IRQ7*/
45
46
8U , /* IRQ8*/
46
- 9U | IOAPIC_RTE_TRGRLVL , /* IRQ9*/
47
+ 9U , /* IRQ9*/
47
48
10U , /* IRQ10*/
48
49
11U , /* IRQ11*/
49
50
12U , /* IRQ12*/
@@ -52,7 +53,26 @@ uint16_t legacy_irq_to_pin[NR_LEGACY_IRQ] = {
52
53
15U , /* IRQ15*/
53
54
};
54
55
55
- uint16_t pic_ioapic_pin_map [NR_LEGACY_PIN ] = {
56
+ uint32_t legacy_irq_trigger_mode [NR_LEGACY_IRQ ] = {
57
+ IOAPIC_RTE_TRGREDG , /* IRQ0*/
58
+ IOAPIC_RTE_TRGREDG , /* IRQ1*/
59
+ IOAPIC_RTE_TRGREDG , /* IRQ2*/
60
+ IOAPIC_RTE_TRGREDG , /* IRQ3*/
61
+ IOAPIC_RTE_TRGREDG , /* IRQ4*/
62
+ IOAPIC_RTE_TRGREDG , /* IRQ5*/
63
+ IOAPIC_RTE_TRGREDG , /* IRQ6*/
64
+ IOAPIC_RTE_TRGREDG , /* IRQ7*/
65
+ IOAPIC_RTE_TRGREDG , /* IRQ8*/
66
+ IOAPIC_RTE_TRGRLVL , /* IRQ9*/
67
+ IOAPIC_RTE_TRGREDG , /* IRQ10*/
68
+ IOAPIC_RTE_TRGREDG , /* IRQ11*/
69
+ IOAPIC_RTE_TRGREDG , /* IRQ12*/
70
+ IOAPIC_RTE_TRGREDG , /* IRQ13*/
71
+ IOAPIC_RTE_TRGREDG , /* IRQ14*/
72
+ IOAPIC_RTE_TRGREDG , /* IRQ15*/
73
+ };
74
+
75
+ uint8_t pic_ioapic_pin_map [NR_LEGACY_PIN ] = {
56
76
2U , /* pin0*/
57
77
1U , /* pin1*/
58
78
0U , /* pin2*/
@@ -80,7 +100,7 @@ static void *map_ioapic(uint64_t ioapic_paddr)
80
100
}
81
101
82
102
static inline uint32_t
83
- ioapic_read_reg32 (const void * ioapic_base , const uint8_t offset )
103
+ ioapic_read_reg32 (const void * ioapic_base , const uint32_t offset )
84
104
{
85
105
uint32_t v ;
86
106
@@ -99,7 +119,7 @@ ioapic_read_reg32(const void *ioapic_base, const uint8_t offset)
99
119
100
120
static inline void
101
121
ioapic_write_reg32 (const void * ioapic_base ,
102
- const uint8_t offset , const uint32_t value )
122
+ const uint32_t offset , const uint32_t value )
103
123
{
104
124
spinlock_rflags ;
105
125
@@ -133,18 +153,20 @@ get_ioapic_base(uint8_t apic_id)
133
153
134
154
static inline void
135
155
ioapic_get_rte_entry (void * ioapic_addr ,
136
- int pin , struct ioapic_rte * rte )
156
+ uint8_t pin , struct ioapic_rte * rte )
137
157
{
138
- rte -> lo_32 = ioapic_read_reg32 (ioapic_addr , pin * 2 + 0x10 );
139
- rte -> hi_32 = ioapic_read_reg32 (ioapic_addr , pin * 2 + 0x11 );
158
+ uint32_t rte_addr = (uint32_t )pin * 2U + 0x10U ;
159
+ rte -> lo_32 = ioapic_read_reg32 (ioapic_addr , rte_addr );
160
+ rte -> hi_32 = ioapic_read_reg32 (ioapic_addr , rte_addr + 1U );
140
161
}
141
162
142
163
static inline void
143
164
ioapic_set_rte_entry (void * ioapic_addr ,
144
- int pin , struct ioapic_rte * rte )
165
+ uint8_t pin , struct ioapic_rte * rte )
145
166
{
146
- ioapic_write_reg32 (ioapic_addr , pin * 2 + 0x10 , rte -> lo_32 );
147
- ioapic_write_reg32 (ioapic_addr , pin * 2 + 0x11 , rte -> hi_32 );
167
+ uint32_t rte_addr = (uint32_t )pin * 2U + 0x10U ;
168
+ ioapic_write_reg32 (ioapic_addr , rte_addr , rte -> lo_32 );
169
+ ioapic_write_reg32 (ioapic_addr , rte_addr + 1U , rte -> hi_32 );
148
170
}
149
171
150
172
static inline struct ioapic_rte
@@ -158,7 +180,8 @@ create_rte_for_legacy_irq(uint32_t irq, uint32_t vr)
158
180
*/
159
181
160
182
rte .lo_32 |= IOAPIC_RTE_INTMSET ;
161
- rte .lo_32 |= (legacy_irq_to_pin [irq ] & IOAPIC_RTE_TRGRLVL );
183
+
184
+ rte .lo_32 |= legacy_irq_trigger_mode [irq ];
162
185
rte .lo_32 |= DEFAULT_DEST_MODE ;
163
186
rte .lo_32 |= DEFAULT_DELIVERY_MODE ;
164
187
rte .lo_32 |= (IOAPIC_RTE_INTVEC & vr );
@@ -210,7 +233,7 @@ static void ioapic_set_routing(uint32_t gsi, uint32_t vr)
210
233
else
211
234
update_irq_handler (gsi , common_handler_edge );
212
235
213
- dev_dbg (ACRN_DBG_IRQ , "GSI: irq:%d pin:%d rte:%x" ,
236
+ dev_dbg (ACRN_DBG_IRQ , "GSI: irq:%d pin:%hhu rte:%x" ,
214
237
gsi , gsi_table [gsi ].pin ,
215
238
rte .lo_32 );
216
239
}
@@ -243,7 +266,7 @@ void ioapic_set_rte(uint32_t irq, uint64_t raw_rte)
243
266
rte .hi_32 = raw_rte >> 32 ;
244
267
ioapic_set_rte_entry (addr , gsi_table [irq ].pin , & rte );
245
268
246
- dev_dbg (ACRN_DBG_IRQ , "GSI: irq:%d pin:%d rte:%x" ,
269
+ dev_dbg (ACRN_DBG_IRQ , "GSI: irq:%d pin:%hhu rte:%x" ,
247
270
irq , gsi_table [irq ].pin ,
248
271
rte .lo_32 );
249
272
}
@@ -258,23 +281,20 @@ bool irq_is_gsi(uint32_t irq)
258
281
return irq < nr_gsi ;
259
282
}
260
283
261
- int irq_to_pin (uint32_t irq )
284
+ uint8_t irq_to_pin (uint32_t irq )
262
285
{
263
286
if (irq_is_gsi (irq ))
264
287
return gsi_table [irq ].pin ;
265
288
else
266
- return -1 ;
289
+ return IOAPIC_INVALID_PIN ;
267
290
}
268
291
269
- uint32_t pin_to_irq (int pin )
292
+ uint32_t pin_to_irq (uint8_t pin )
270
293
{
271
294
uint32_t i ;
272
295
273
- if (pin < 0 )
274
- return IRQ_INVALID ;
275
-
276
296
for (i = 0U ; i < nr_gsi ; i ++ ) {
277
- if (gsi_table [i ].pin == ( uint8_t ) pin )
297
+ if (gsi_table [i ].pin == pin )
278
298
return i ;
279
299
}
280
300
return IRQ_INVALID ;
284
304
irq_gsi_mask_unmask (uint32_t irq , bool mask )
285
305
{
286
306
void * addr = gsi_table [irq ].addr ;
287
- int pin = gsi_table [irq ].pin ;
307
+ uint8_t pin = gsi_table [irq ].pin ;
288
308
struct ioapic_rte rte ;
289
309
290
310
if (!irq_is_gsi (irq ))
@@ -296,23 +316,24 @@ irq_gsi_mask_unmask(uint32_t irq, bool mask)
296
316
else
297
317
rte .lo_32 &= ~IOAPIC_RTE_INTMASK ;
298
318
ioapic_set_rte_entry (addr , pin , & rte );
299
- dev_dbg (ACRN_DBG_PTIRQ , "update: irq:%d pin:%d rte:%x" ,
319
+ dev_dbg (ACRN_DBG_PTIRQ , "update: irq:%d pin:%hhu rte:%x" ,
300
320
irq , pin , rte .lo_32 );
301
321
}
302
322
303
- static uint32_t
323
+ static uint8_t
304
324
ioapic_nr_pins (void * ioapic_base )
305
325
{
306
326
uint32_t version ;
307
- uint32_t nr_pins ;
327
+ uint8_t nr_pins ;
308
328
309
329
version = ioapic_read_reg32 (ioapic_base , IOAPIC_VER );
310
330
dev_dbg (ACRN_DBG_IRQ , "IOAPIC version: %x" , version );
311
331
312
332
/* The 23:16 bits in the version register is the highest entry in the
313
333
* I/O redirection table, which is 1 smaller than the number of
314
334
* interrupt input pins. */
315
- nr_pins = (((version & IOAPIC_MAX_RTE_MASK ) >> MAX_RTE_SHIFT ) + 1U );
335
+ nr_pins = (uint8_t )
336
+ (((version & IOAPIC_MAX_RTE_MASK ) >> MAX_RTE_SHIFT ) + 1U );
316
337
317
338
ASSERT (nr_pins > NR_LEGACY_IRQ , "Legacy IRQ num > total GSI" );
318
339
ASSERT (nr_pins <= IOAPIC_MAX_PIN , "IOAPIC pins exceeding 240" );
@@ -331,11 +352,11 @@ void setup_ioapic_irq(void)
331
352
for (ioapic_id = 0U ;
332
353
ioapic_id < CONFIG_NR_IOAPICS ; ioapic_id ++ ) {
333
354
void * addr ;
334
- uint32_t pin , nr_pins ;
355
+ uint8_t pin , nr_pins ;
335
356
336
357
addr = map_ioapic (get_ioapic_base (ioapic_id ));
337
358
nr_pins = ioapic_nr_pins (addr );
338
- for (pin = 0 ; pin < nr_pins ; pin ++ ) {
359
+ for (pin = 0U ; pin < nr_pins ; pin ++ ) {
339
360
gsi_table [gsi ].ioapic_id = ioapic_id ;
340
361
gsi_table [gsi ].addr = addr ;
341
362
@@ -381,42 +402,42 @@ void dump_ioapic(void)
381
402
382
403
for (irq = 0U ; irq < nr_gsi ; irq ++ ) {
383
404
void * addr = gsi_table [irq ].addr ;
384
- int pin = gsi_table [irq ].pin ;
405
+ uint8_t pin = gsi_table [irq ].pin ;
385
406
struct ioapic_rte rte ;
386
407
387
408
ioapic_get_rte_entry (addr , pin , & rte );
388
- dev_dbg (ACRN_DBG_IRQ , "DUMP: irq:%d pin:%d rte:%x" ,
409
+ dev_dbg (ACRN_DBG_IRQ , "DUMP: irq:%d pin:%hhu rte:%x" ,
389
410
irq , pin , rte .lo_32 );
390
411
}
391
412
}
392
413
393
414
void suspend_ioapic (void )
394
415
{
395
- int ioapic_id , ioapic_pin ;
416
+ uint8_t ioapic_id , ioapic_pin ;
396
417
397
- for (ioapic_id = 0 ; ioapic_id < CONFIG_NR_IOAPICS ; ioapic_id ++ ) {
418
+ for (ioapic_id = 0U ; ioapic_id < CONFIG_NR_IOAPICS ; ioapic_id ++ ) {
398
419
void * addr ;
399
- uint32_t nr_pins ;
420
+ uint8_t nr_pins ;
400
421
401
422
addr = map_ioapic (get_ioapic_base (ioapic_id ));
402
423
nr_pins = ioapic_nr_pins (addr );
403
- for (ioapic_pin = 0 ; ioapic_pin < nr_pins ; ioapic_pin ++ )
424
+ for (ioapic_pin = 0U ; ioapic_pin < nr_pins ; ioapic_pin ++ )
404
425
ioapic_get_rte_entry (addr , ioapic_pin ,
405
426
& saved_rte [ioapic_id ][ioapic_pin ]);
406
427
}
407
428
}
408
429
409
430
void resume_ioapic (void )
410
431
{
411
- int ioapic_id , ioapic_pin ;
432
+ uint8_t ioapic_id , ioapic_pin ;
412
433
413
- for (ioapic_id = 0 ; ioapic_id < CONFIG_NR_IOAPICS ; ioapic_id ++ ) {
434
+ for (ioapic_id = 0U ; ioapic_id < CONFIG_NR_IOAPICS ; ioapic_id ++ ) {
414
435
void * addr ;
415
- uint32_t nr_pins ;
436
+ uint8_t nr_pins ;
416
437
417
438
addr = map_ioapic (get_ioapic_base (ioapic_id ));
418
439
nr_pins = ioapic_nr_pins (addr );
419
- for (ioapic_pin = 0 ; ioapic_pin < nr_pins ; ioapic_pin ++ )
440
+ for (ioapic_pin = 0U ; ioapic_pin < nr_pins ; ioapic_pin ++ )
420
441
ioapic_set_rte_entry (addr , ioapic_pin ,
421
442
& saved_rte [ioapic_id ][ioapic_pin ]);
422
443
}
@@ -447,7 +468,7 @@ int get_ioapic_info(char *str, int str_max_len)
447
468
448
469
for (irq = 0U ; irq < nr_gsi ; irq ++ ) {
449
470
void * addr = gsi_table [irq ].addr ;
450
- int pin = gsi_table [irq ].pin ;
471
+ uint8_t pin = gsi_table [irq ].pin ;
451
472
struct ioapic_rte rte ;
452
473
453
474
bool irr , phys , level , mask ;
@@ -459,7 +480,7 @@ int get_ioapic_info(char *str, int str_max_len)
459
480
get_rte_info (& rte , & mask , & irr , & phys , & delmode , & level ,
460
481
& vector , & dest );
461
482
462
- len = snprintf (str , size , "\r\n%03d\t%03d \t0x%08X\t0x%08X\t" ,
483
+ len = snprintf (str , size , "\r\n%03d\t%03hhu \t0x%08X\t0x%08X\t" ,
463
484
irq , pin , rte .hi_32 , rte .lo_32 );
464
485
size -= len ;
465
486
str += len ;
0 commit comments