1be059e88SSimon Glass /* 2be059e88SSimon Glass * (C) Copyright 2008-2011 3be059e88SSimon Glass * Graeme Russ, <graeme.russ@gmail.com> 4be059e88SSimon Glass * 5be059e88SSimon Glass * (C) Copyright 2002 6be059e88SSimon Glass * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se> 7be059e88SSimon Glass * 8be059e88SSimon Glass * Portions of this file are derived from the Linux kernel source 9be059e88SSimon Glass * Copyright (C) 1991, 1992 Linus Torvalds 10be059e88SSimon Glass * 11be059e88SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 12be059e88SSimon Glass */ 13be059e88SSimon Glass 14be059e88SSimon Glass #include <common.h> 15be059e88SSimon Glass #include <dm.h> 16be059e88SSimon Glass #include <asm/control_regs.h> 17be059e88SSimon Glass #include <asm/i8259.h> 18be059e88SSimon Glass #include <asm/interrupt.h> 19be059e88SSimon Glass #include <asm/io.h> 20be059e88SSimon Glass #include <asm/lapic.h> 21be059e88SSimon Glass #include <asm/processor-flags.h> 22be059e88SSimon Glass 23be059e88SSimon Glass DECLARE_GLOBAL_DATA_PTR; 24be059e88SSimon Glass 25be059e88SSimon Glass #define DECLARE_INTERRUPT(x) \ 26be059e88SSimon Glass ".globl irq_"#x"\n" \ 27be059e88SSimon Glass ".hidden irq_"#x"\n" \ 28be059e88SSimon Glass ".type irq_"#x", @function\n" \ 29be059e88SSimon Glass "irq_"#x":\n" \ 30be059e88SSimon Glass "pushl $"#x"\n" \ 31*3c03f492SJ. Tang "jmp.d32 irq_common_entry\n" 32be059e88SSimon Glass 33be059e88SSimon Glass static char *exceptions[] = { 34be059e88SSimon Glass "Divide Error", 35be059e88SSimon Glass "Debug", 36be059e88SSimon Glass "NMI Interrupt", 37be059e88SSimon Glass "Breakpoint", 38be059e88SSimon Glass "Overflow", 39be059e88SSimon Glass "BOUND Range Exceeded", 40be059e88SSimon Glass "Invalid Opcode (Undefined Opcode)", 41be059e88SSimon Glass "Device Not Avaiable (No Math Coprocessor)", 42be059e88SSimon Glass "Double Fault", 43be059e88SSimon Glass "Coprocessor Segment Overrun", 44be059e88SSimon Glass "Invalid TSS", 45be059e88SSimon Glass "Segment Not Present", 46be059e88SSimon Glass "Stack Segment Fault", 47be059e88SSimon Glass "General Protection", 48be059e88SSimon Glass "Page Fault", 49be059e88SSimon Glass "Reserved", 50be059e88SSimon Glass "x87 FPU Floating-Point Error", 51be059e88SSimon Glass "Alignment Check", 52be059e88SSimon Glass "Machine Check", 53be059e88SSimon Glass "SIMD Floating-Point Exception", 54be059e88SSimon Glass "Virtualization Exception", 55be059e88SSimon Glass "Reserved", 56be059e88SSimon Glass "Reserved", 57be059e88SSimon Glass "Reserved", 58be059e88SSimon Glass "Reserved", 59be059e88SSimon Glass "Reserved", 60be059e88SSimon Glass "Reserved", 61be059e88SSimon Glass "Reserved", 62be059e88SSimon Glass "Reserved", 63be059e88SSimon Glass "Reserved", 64be059e88SSimon Glass "Reserved", 65be059e88SSimon Glass "Reserved" 66be059e88SSimon Glass }; 67be059e88SSimon Glass 68be059e88SSimon Glass static void dump_regs(struct irq_regs *regs) 69be059e88SSimon Glass { 70be059e88SSimon Glass unsigned long cs, eip, eflags; 71be059e88SSimon Glass unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L; 72be059e88SSimon Glass unsigned long d0, d1, d2, d3, d6, d7; 73be059e88SSimon Glass unsigned long sp; 74be059e88SSimon Glass 75be059e88SSimon Glass /* 76be059e88SSimon Glass * Some exceptions cause an error code to be saved on the current stack 77be059e88SSimon Glass * after the EIP value. We should extract CS/EIP/EFLAGS from different 78be059e88SSimon Glass * position on the stack based on the exception number. 79be059e88SSimon Glass */ 80be059e88SSimon Glass switch (regs->irq_id) { 81be059e88SSimon Glass case EXC_DF: 82be059e88SSimon Glass case EXC_TS: 83be059e88SSimon Glass case EXC_NP: 84be059e88SSimon Glass case EXC_SS: 85be059e88SSimon Glass case EXC_GP: 86be059e88SSimon Glass case EXC_PF: 87be059e88SSimon Glass case EXC_AC: 88be059e88SSimon Glass cs = regs->context.ctx2.xcs; 89be059e88SSimon Glass eip = regs->context.ctx2.eip; 90be059e88SSimon Glass eflags = regs->context.ctx2.eflags; 91be059e88SSimon Glass /* We should fix up the ESP due to error code */ 92be059e88SSimon Glass regs->esp += 4; 93be059e88SSimon Glass break; 94be059e88SSimon Glass default: 95be059e88SSimon Glass cs = regs->context.ctx1.xcs; 96be059e88SSimon Glass eip = regs->context.ctx1.eip; 97be059e88SSimon Glass eflags = regs->context.ctx1.eflags; 98be059e88SSimon Glass break; 99be059e88SSimon Glass } 100be059e88SSimon Glass 101be059e88SSimon Glass printf("EIP: %04x:[<%08lx>] EFLAGS: %08lx\n", 102be059e88SSimon Glass (u16)cs, eip, eflags); 103be059e88SSimon Glass if (gd->flags & GD_FLG_RELOC) 104be059e88SSimon Glass printf("Original EIP :[<%08lx>]\n", eip - gd->reloc_off); 105be059e88SSimon Glass 106be059e88SSimon Glass printf("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", 107be059e88SSimon Glass regs->eax, regs->ebx, regs->ecx, regs->edx); 108be059e88SSimon Glass printf("ESI: %08lx EDI: %08lx EBP: %08lx ESP: %08lx\n", 109be059e88SSimon Glass regs->esi, regs->edi, regs->ebp, regs->esp); 110be059e88SSimon Glass printf(" DS: %04x ES: %04x FS: %04x GS: %04x SS: %04x\n", 111be059e88SSimon Glass (u16)regs->xds, (u16)regs->xes, (u16)regs->xfs, 112be059e88SSimon Glass (u16)regs->xgs, (u16)regs->xss); 113be059e88SSimon Glass 114be059e88SSimon Glass cr0 = read_cr0(); 115be059e88SSimon Glass cr2 = read_cr2(); 116be059e88SSimon Glass cr3 = read_cr3(); 117be059e88SSimon Glass cr4 = read_cr4(); 118be059e88SSimon Glass 119be059e88SSimon Glass printf("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", 120be059e88SSimon Glass cr0, cr2, cr3, cr4); 121be059e88SSimon Glass 122be059e88SSimon Glass d0 = get_debugreg(0); 123be059e88SSimon Glass d1 = get_debugreg(1); 124be059e88SSimon Glass d2 = get_debugreg(2); 125be059e88SSimon Glass d3 = get_debugreg(3); 126be059e88SSimon Glass 127be059e88SSimon Glass printf("DR0: %08lx DR1: %08lx DR2: %08lx DR3: %08lx\n", 128be059e88SSimon Glass d0, d1, d2, d3); 129be059e88SSimon Glass 130be059e88SSimon Glass d6 = get_debugreg(6); 131be059e88SSimon Glass d7 = get_debugreg(7); 132be059e88SSimon Glass printf("DR6: %08lx DR7: %08lx\n", 133be059e88SSimon Glass d6, d7); 134be059e88SSimon Glass 135be059e88SSimon Glass printf("Stack:\n"); 136be059e88SSimon Glass sp = regs->esp; 137be059e88SSimon Glass 138be059e88SSimon Glass sp += 64; 139be059e88SSimon Glass 140be059e88SSimon Glass while (sp > (regs->esp - 16)) { 141be059e88SSimon Glass if (sp == regs->esp) 142be059e88SSimon Glass printf("--->"); 143be059e88SSimon Glass else 144be059e88SSimon Glass printf(" "); 145be059e88SSimon Glass printf("0x%8.8lx : 0x%8.8lx\n", sp, (ulong)readl(sp)); 146be059e88SSimon Glass sp -= 4; 147be059e88SSimon Glass } 148be059e88SSimon Glass } 149be059e88SSimon Glass 150be059e88SSimon Glass static void do_exception(struct irq_regs *regs) 151be059e88SSimon Glass { 152be059e88SSimon Glass printf("%s\n", exceptions[regs->irq_id]); 153be059e88SSimon Glass dump_regs(regs); 154be059e88SSimon Glass hang(); 155be059e88SSimon Glass } 156be059e88SSimon Glass 157be059e88SSimon Glass struct idt_entry { 158be059e88SSimon Glass u16 base_low; 159be059e88SSimon Glass u16 selector; 160be059e88SSimon Glass u8 res; 161be059e88SSimon Glass u8 access; 162be059e88SSimon Glass u16 base_high; 163be059e88SSimon Glass } __packed; 164be059e88SSimon Glass 165be059e88SSimon Glass struct desc_ptr { 166be059e88SSimon Glass unsigned short size; 167be059e88SSimon Glass unsigned long address; 168be059e88SSimon Glass } __packed; 169be059e88SSimon Glass 170be059e88SSimon Glass struct idt_entry idt[256] __aligned(16); 171be059e88SSimon Glass 172be059e88SSimon Glass struct desc_ptr idt_ptr; 173be059e88SSimon Glass 174be059e88SSimon Glass static inline void load_idt(const struct desc_ptr *dtr) 175be059e88SSimon Glass { 176be059e88SSimon Glass asm volatile("cs lidt %0" : : "m" (*dtr)); 177be059e88SSimon Glass } 178be059e88SSimon Glass 179be059e88SSimon Glass void set_vector(u8 intnum, void *routine) 180be059e88SSimon Glass { 181be059e88SSimon Glass idt[intnum].base_high = (u16)((ulong)(routine) >> 16); 182be059e88SSimon Glass idt[intnum].base_low = (u16)((ulong)(routine) & 0xffff); 183be059e88SSimon Glass } 184be059e88SSimon Glass 185be059e88SSimon Glass /* 186be059e88SSimon Glass * Ideally these would be defined static to avoid a checkpatch warning, but 187be059e88SSimon Glass * the compiler cannot see them in the inline asm and complains that they 188be059e88SSimon Glass * aren't defined 189be059e88SSimon Glass */ 190be059e88SSimon Glass void irq_0(void); 191be059e88SSimon Glass void irq_1(void); 192be059e88SSimon Glass 193be059e88SSimon Glass int cpu_init_interrupts(void) 194be059e88SSimon Glass { 195be059e88SSimon Glass int i; 196be059e88SSimon Glass 197be059e88SSimon Glass int irq_entry_size = irq_1 - irq_0; 198be059e88SSimon Glass void *irq_entry = (void *)irq_0; 199be059e88SSimon Glass 200be059e88SSimon Glass /* Setup the IDT */ 201be059e88SSimon Glass for (i = 0; i < 256; i++) { 202be059e88SSimon Glass idt[i].access = 0x8e; 203be059e88SSimon Glass idt[i].res = 0; 204be059e88SSimon Glass idt[i].selector = X86_GDT_ENTRY_32BIT_CS * X86_GDT_ENTRY_SIZE; 205be059e88SSimon Glass set_vector(i, irq_entry); 206be059e88SSimon Glass irq_entry += irq_entry_size; 207be059e88SSimon Glass } 208be059e88SSimon Glass 209be059e88SSimon Glass idt_ptr.size = 256 * 8 - 1; 210be059e88SSimon Glass idt_ptr.address = (unsigned long) idt; 211be059e88SSimon Glass 212be059e88SSimon Glass load_idt(&idt_ptr); 213be059e88SSimon Glass 214be059e88SSimon Glass return 0; 215be059e88SSimon Glass } 216be059e88SSimon Glass 217be059e88SSimon Glass void *x86_get_idt(void) 218be059e88SSimon Glass { 219be059e88SSimon Glass return &idt_ptr; 220be059e88SSimon Glass } 221be059e88SSimon Glass 222be059e88SSimon Glass void __do_irq(int irq) 223be059e88SSimon Glass { 224be059e88SSimon Glass printf("Unhandled IRQ : %d\n", irq); 225be059e88SSimon Glass } 226be059e88SSimon Glass void do_irq(int irq) __attribute__((weak, alias("__do_irq"))); 227be059e88SSimon Glass 228be059e88SSimon Glass void enable_interrupts(void) 229be059e88SSimon Glass { 230be059e88SSimon Glass asm("sti\n"); 231be059e88SSimon Glass } 232be059e88SSimon Glass 233be059e88SSimon Glass int disable_interrupts(void) 234be059e88SSimon Glass { 235be059e88SSimon Glass long flags; 236be059e88SSimon Glass 23734722da6SSimon Glass #if CONFIG_IS_ENABLED(X86_64) 238be059e88SSimon Glass asm volatile ("pushfq ; popq %0 ; cli\n" : "=g" (flags) : ); 239be059e88SSimon Glass #else 240be059e88SSimon Glass asm volatile ("pushfl ; popl %0 ; cli\n" : "=g" (flags) : ); 241be059e88SSimon Glass #endif 242be059e88SSimon Glass return flags & X86_EFLAGS_IF; 243be059e88SSimon Glass } 244be059e88SSimon Glass 245be059e88SSimon Glass int interrupt_init(void) 246be059e88SSimon Glass { 247be059e88SSimon Glass struct udevice *dev; 248be059e88SSimon Glass int ret; 249be059e88SSimon Glass 250be059e88SSimon Glass /* Try to set up the interrupt router, but don't require one */ 251be059e88SSimon Glass ret = uclass_first_device_err(UCLASS_IRQ, &dev); 252be059e88SSimon Glass if (ret && ret != -ENODEV) 253be059e88SSimon Glass return ret; 254be059e88SSimon Glass 255be059e88SSimon Glass /* 256be059e88SSimon Glass * When running as an EFI application we are not in control of 257be059e88SSimon Glass * interrupts and should leave them alone. 258be059e88SSimon Glass */ 259be059e88SSimon Glass #ifndef CONFIG_EFI_APP 260be059e88SSimon Glass /* Just in case... */ 261be059e88SSimon Glass disable_interrupts(); 262be059e88SSimon Glass 263be059e88SSimon Glass #ifdef CONFIG_I8259_PIC 264be059e88SSimon Glass /* Initialize the master/slave i8259 pic */ 265be059e88SSimon Glass i8259_init(); 266be059e88SSimon Glass #endif 267be059e88SSimon Glass 268be059e88SSimon Glass lapic_setup(); 269be059e88SSimon Glass 270be059e88SSimon Glass /* Initialize core interrupt and exception functionality of CPU */ 271be059e88SSimon Glass cpu_init_interrupts(); 272be059e88SSimon Glass 273be059e88SSimon Glass /* 274be059e88SSimon Glass * It is now safe to enable interrupts. 275be059e88SSimon Glass * 276be059e88SSimon Glass * TODO(sjg@chromium.org): But we don't handle these correctly when 277be059e88SSimon Glass * booted from EFI. 278be059e88SSimon Glass */ 279be059e88SSimon Glass if (ll_boot_init()) 280be059e88SSimon Glass enable_interrupts(); 281be059e88SSimon Glass #endif 282be059e88SSimon Glass 283be059e88SSimon Glass return 0; 284be059e88SSimon Glass } 285be059e88SSimon Glass 286be059e88SSimon Glass /* IRQ Low-Level Service Routine */ 287be059e88SSimon Glass void irq_llsr(struct irq_regs *regs) 288be059e88SSimon Glass { 289be059e88SSimon Glass /* 290be059e88SSimon Glass * For detailed description of each exception, refer to: 291be059e88SSimon Glass * Intel® 64 and IA-32 Architectures Software Developer's Manual 292be059e88SSimon Glass * Volume 1: Basic Architecture 293be059e88SSimon Glass * Order Number: 253665-029US, November 2008 294be059e88SSimon Glass * Table 6-1. Exceptions and Interrupts 295be059e88SSimon Glass */ 296be059e88SSimon Glass if (regs->irq_id < 32) { 297be059e88SSimon Glass /* Architecture defined exception */ 298be059e88SSimon Glass do_exception(regs); 299be059e88SSimon Glass } else { 300be059e88SSimon Glass /* Hardware or User IRQ */ 301be059e88SSimon Glass do_irq(regs->irq_id); 302be059e88SSimon Glass } 303be059e88SSimon Glass } 304be059e88SSimon Glass 305be059e88SSimon Glass /* 306be059e88SSimon Glass * OK - This looks really horrible, but it serves a purpose - It helps create 307be059e88SSimon Glass * fully relocatable code. 308be059e88SSimon Glass * - The call to irq_llsr will be a relative jump 309be059e88SSimon Glass * - The IRQ entries will be guaranteed to be in order 310be059e88SSimon Glass * Interrupt entries are now very small (a push and a jump) but they are 311be059e88SSimon Glass * now slower (all registers pushed on stack which provides complete 312be059e88SSimon Glass * crash dumps in the low level handlers 313be059e88SSimon Glass * 314be059e88SSimon Glass * Interrupt Entry Point: 315be059e88SSimon Glass * - Interrupt has caused eflags, CS and EIP to be pushed 316be059e88SSimon Glass * - Interrupt Vector Handler has pushed orig_eax 317be059e88SSimon Glass * - pt_regs.esp needs to be adjusted by 40 bytes: 318be059e88SSimon Glass * 12 bytes pushed by CPU (EFLAGSF, CS, EIP) 319be059e88SSimon Glass * 4 bytes pushed by vector handler (irq_id) 320be059e88SSimon Glass * 24 bytes pushed before SP (SS, GS, FS, ES, DS, EAX) 321be059e88SSimon Glass * NOTE: Only longs are pushed on/popped off the stack! 322be059e88SSimon Glass */ 323be059e88SSimon Glass asm(".globl irq_common_entry\n" \ 324be059e88SSimon Glass ".hidden irq_common_entry\n" \ 325be059e88SSimon Glass ".type irq_common_entry, @function\n" \ 326be059e88SSimon Glass "irq_common_entry:\n" \ 327be059e88SSimon Glass "cld\n" \ 328be059e88SSimon Glass "pushl %ss\n" \ 329be059e88SSimon Glass "pushl %gs\n" \ 330be059e88SSimon Glass "pushl %fs\n" \ 331be059e88SSimon Glass "pushl %es\n" \ 332be059e88SSimon Glass "pushl %ds\n" \ 333be059e88SSimon Glass "pushl %eax\n" \ 334be059e88SSimon Glass "movl %esp, %eax\n" \ 335be059e88SSimon Glass "addl $40, %eax\n" \ 336be059e88SSimon Glass "pushl %eax\n" \ 337be059e88SSimon Glass "pushl %ebp\n" \ 338be059e88SSimon Glass "pushl %edi\n" \ 339be059e88SSimon Glass "pushl %esi\n" \ 340be059e88SSimon Glass "pushl %edx\n" \ 341be059e88SSimon Glass "pushl %ecx\n" \ 342be059e88SSimon Glass "pushl %ebx\n" \ 343be059e88SSimon Glass "mov %esp, %eax\n" \ 344be059e88SSimon Glass "call irq_llsr\n" \ 345be059e88SSimon Glass "popl %ebx\n" \ 346be059e88SSimon Glass "popl %ecx\n" \ 347be059e88SSimon Glass "popl %edx\n" \ 348be059e88SSimon Glass "popl %esi\n" \ 349be059e88SSimon Glass "popl %edi\n" \ 350be059e88SSimon Glass "popl %ebp\n" \ 351be059e88SSimon Glass "popl %eax\n" \ 352be059e88SSimon Glass "popl %eax\n" \ 353be059e88SSimon Glass "popl %ds\n" \ 354be059e88SSimon Glass "popl %es\n" \ 355be059e88SSimon Glass "popl %fs\n" \ 356be059e88SSimon Glass "popl %gs\n" \ 357be059e88SSimon Glass "popl %ss\n" \ 358be059e88SSimon Glass "add $4, %esp\n" \ 359be059e88SSimon Glass "iret\n" \ 360be059e88SSimon Glass DECLARE_INTERRUPT(0) \ 361be059e88SSimon Glass DECLARE_INTERRUPT(1) \ 362be059e88SSimon Glass DECLARE_INTERRUPT(2) \ 363be059e88SSimon Glass DECLARE_INTERRUPT(3) \ 364be059e88SSimon Glass DECLARE_INTERRUPT(4) \ 365be059e88SSimon Glass DECLARE_INTERRUPT(5) \ 366be059e88SSimon Glass DECLARE_INTERRUPT(6) \ 367be059e88SSimon Glass DECLARE_INTERRUPT(7) \ 368be059e88SSimon Glass DECLARE_INTERRUPT(8) \ 369be059e88SSimon Glass DECLARE_INTERRUPT(9) \ 370be059e88SSimon Glass DECLARE_INTERRUPT(10) \ 371be059e88SSimon Glass DECLARE_INTERRUPT(11) \ 372be059e88SSimon Glass DECLARE_INTERRUPT(12) \ 373be059e88SSimon Glass DECLARE_INTERRUPT(13) \ 374be059e88SSimon Glass DECLARE_INTERRUPT(14) \ 375be059e88SSimon Glass DECLARE_INTERRUPT(15) \ 376be059e88SSimon Glass DECLARE_INTERRUPT(16) \ 377be059e88SSimon Glass DECLARE_INTERRUPT(17) \ 378be059e88SSimon Glass DECLARE_INTERRUPT(18) \ 379be059e88SSimon Glass DECLARE_INTERRUPT(19) \ 380be059e88SSimon Glass DECLARE_INTERRUPT(20) \ 381be059e88SSimon Glass DECLARE_INTERRUPT(21) \ 382be059e88SSimon Glass DECLARE_INTERRUPT(22) \ 383be059e88SSimon Glass DECLARE_INTERRUPT(23) \ 384be059e88SSimon Glass DECLARE_INTERRUPT(24) \ 385be059e88SSimon Glass DECLARE_INTERRUPT(25) \ 386be059e88SSimon Glass DECLARE_INTERRUPT(26) \ 387be059e88SSimon Glass DECLARE_INTERRUPT(27) \ 388be059e88SSimon Glass DECLARE_INTERRUPT(28) \ 389be059e88SSimon Glass DECLARE_INTERRUPT(29) \ 390be059e88SSimon Glass DECLARE_INTERRUPT(30) \ 391be059e88SSimon Glass DECLARE_INTERRUPT(31) \ 392be059e88SSimon Glass DECLARE_INTERRUPT(32) \ 393be059e88SSimon Glass DECLARE_INTERRUPT(33) \ 394be059e88SSimon Glass DECLARE_INTERRUPT(34) \ 395be059e88SSimon Glass DECLARE_INTERRUPT(35) \ 396be059e88SSimon Glass DECLARE_INTERRUPT(36) \ 397be059e88SSimon Glass DECLARE_INTERRUPT(37) \ 398be059e88SSimon Glass DECLARE_INTERRUPT(38) \ 399be059e88SSimon Glass DECLARE_INTERRUPT(39) \ 400be059e88SSimon Glass DECLARE_INTERRUPT(40) \ 401be059e88SSimon Glass DECLARE_INTERRUPT(41) \ 402be059e88SSimon Glass DECLARE_INTERRUPT(42) \ 403be059e88SSimon Glass DECLARE_INTERRUPT(43) \ 404be059e88SSimon Glass DECLARE_INTERRUPT(44) \ 405be059e88SSimon Glass DECLARE_INTERRUPT(45) \ 406be059e88SSimon Glass DECLARE_INTERRUPT(46) \ 407be059e88SSimon Glass DECLARE_INTERRUPT(47) \ 408be059e88SSimon Glass DECLARE_INTERRUPT(48) \ 409be059e88SSimon Glass DECLARE_INTERRUPT(49) \ 410be059e88SSimon Glass DECLARE_INTERRUPT(50) \ 411be059e88SSimon Glass DECLARE_INTERRUPT(51) \ 412be059e88SSimon Glass DECLARE_INTERRUPT(52) \ 413be059e88SSimon Glass DECLARE_INTERRUPT(53) \ 414be059e88SSimon Glass DECLARE_INTERRUPT(54) \ 415be059e88SSimon Glass DECLARE_INTERRUPT(55) \ 416be059e88SSimon Glass DECLARE_INTERRUPT(56) \ 417be059e88SSimon Glass DECLARE_INTERRUPT(57) \ 418be059e88SSimon Glass DECLARE_INTERRUPT(58) \ 419be059e88SSimon Glass DECLARE_INTERRUPT(59) \ 420be059e88SSimon Glass DECLARE_INTERRUPT(60) \ 421be059e88SSimon Glass DECLARE_INTERRUPT(61) \ 422be059e88SSimon Glass DECLARE_INTERRUPT(62) \ 423be059e88SSimon Glass DECLARE_INTERRUPT(63) \ 424be059e88SSimon Glass DECLARE_INTERRUPT(64) \ 425be059e88SSimon Glass DECLARE_INTERRUPT(65) \ 426be059e88SSimon Glass DECLARE_INTERRUPT(66) \ 427be059e88SSimon Glass DECLARE_INTERRUPT(67) \ 428be059e88SSimon Glass DECLARE_INTERRUPT(68) \ 429be059e88SSimon Glass DECLARE_INTERRUPT(69) \ 430be059e88SSimon Glass DECLARE_INTERRUPT(70) \ 431be059e88SSimon Glass DECLARE_INTERRUPT(71) \ 432be059e88SSimon Glass DECLARE_INTERRUPT(72) \ 433be059e88SSimon Glass DECLARE_INTERRUPT(73) \ 434be059e88SSimon Glass DECLARE_INTERRUPT(74) \ 435be059e88SSimon Glass DECLARE_INTERRUPT(75) \ 436be059e88SSimon Glass DECLARE_INTERRUPT(76) \ 437be059e88SSimon Glass DECLARE_INTERRUPT(77) \ 438be059e88SSimon Glass DECLARE_INTERRUPT(78) \ 439be059e88SSimon Glass DECLARE_INTERRUPT(79) \ 440be059e88SSimon Glass DECLARE_INTERRUPT(80) \ 441be059e88SSimon Glass DECLARE_INTERRUPT(81) \ 442be059e88SSimon Glass DECLARE_INTERRUPT(82) \ 443be059e88SSimon Glass DECLARE_INTERRUPT(83) \ 444be059e88SSimon Glass DECLARE_INTERRUPT(84) \ 445be059e88SSimon Glass DECLARE_INTERRUPT(85) \ 446be059e88SSimon Glass DECLARE_INTERRUPT(86) \ 447be059e88SSimon Glass DECLARE_INTERRUPT(87) \ 448be059e88SSimon Glass DECLARE_INTERRUPT(88) \ 449be059e88SSimon Glass DECLARE_INTERRUPT(89) \ 450be059e88SSimon Glass DECLARE_INTERRUPT(90) \ 451be059e88SSimon Glass DECLARE_INTERRUPT(91) \ 452be059e88SSimon Glass DECLARE_INTERRUPT(92) \ 453be059e88SSimon Glass DECLARE_INTERRUPT(93) \ 454be059e88SSimon Glass DECLARE_INTERRUPT(94) \ 455be059e88SSimon Glass DECLARE_INTERRUPT(95) \ 456be059e88SSimon Glass DECLARE_INTERRUPT(97) \ 457be059e88SSimon Glass DECLARE_INTERRUPT(96) \ 458be059e88SSimon Glass DECLARE_INTERRUPT(98) \ 459be059e88SSimon Glass DECLARE_INTERRUPT(99) \ 460be059e88SSimon Glass DECLARE_INTERRUPT(100) \ 461be059e88SSimon Glass DECLARE_INTERRUPT(101) \ 462be059e88SSimon Glass DECLARE_INTERRUPT(102) \ 463be059e88SSimon Glass DECLARE_INTERRUPT(103) \ 464be059e88SSimon Glass DECLARE_INTERRUPT(104) \ 465be059e88SSimon Glass DECLARE_INTERRUPT(105) \ 466be059e88SSimon Glass DECLARE_INTERRUPT(106) \ 467be059e88SSimon Glass DECLARE_INTERRUPT(107) \ 468be059e88SSimon Glass DECLARE_INTERRUPT(108) \ 469be059e88SSimon Glass DECLARE_INTERRUPT(109) \ 470be059e88SSimon Glass DECLARE_INTERRUPT(110) \ 471be059e88SSimon Glass DECLARE_INTERRUPT(111) \ 472be059e88SSimon Glass DECLARE_INTERRUPT(112) \ 473be059e88SSimon Glass DECLARE_INTERRUPT(113) \ 474be059e88SSimon Glass DECLARE_INTERRUPT(114) \ 475be059e88SSimon Glass DECLARE_INTERRUPT(115) \ 476be059e88SSimon Glass DECLARE_INTERRUPT(116) \ 477be059e88SSimon Glass DECLARE_INTERRUPT(117) \ 478be059e88SSimon Glass DECLARE_INTERRUPT(118) \ 479be059e88SSimon Glass DECLARE_INTERRUPT(119) \ 480be059e88SSimon Glass DECLARE_INTERRUPT(120) \ 481be059e88SSimon Glass DECLARE_INTERRUPT(121) \ 482be059e88SSimon Glass DECLARE_INTERRUPT(122) \ 483be059e88SSimon Glass DECLARE_INTERRUPT(123) \ 484be059e88SSimon Glass DECLARE_INTERRUPT(124) \ 485be059e88SSimon Glass DECLARE_INTERRUPT(125) \ 486be059e88SSimon Glass DECLARE_INTERRUPT(126) \ 487be059e88SSimon Glass DECLARE_INTERRUPT(127) \ 488be059e88SSimon Glass DECLARE_INTERRUPT(128) \ 489be059e88SSimon Glass DECLARE_INTERRUPT(129) \ 490be059e88SSimon Glass DECLARE_INTERRUPT(130) \ 491be059e88SSimon Glass DECLARE_INTERRUPT(131) \ 492be059e88SSimon Glass DECLARE_INTERRUPT(132) \ 493be059e88SSimon Glass DECLARE_INTERRUPT(133) \ 494be059e88SSimon Glass DECLARE_INTERRUPT(134) \ 495be059e88SSimon Glass DECLARE_INTERRUPT(135) \ 496be059e88SSimon Glass DECLARE_INTERRUPT(136) \ 497be059e88SSimon Glass DECLARE_INTERRUPT(137) \ 498be059e88SSimon Glass DECLARE_INTERRUPT(138) \ 499be059e88SSimon Glass DECLARE_INTERRUPT(139) \ 500be059e88SSimon Glass DECLARE_INTERRUPT(140) \ 501be059e88SSimon Glass DECLARE_INTERRUPT(141) \ 502be059e88SSimon Glass DECLARE_INTERRUPT(142) \ 503be059e88SSimon Glass DECLARE_INTERRUPT(143) \ 504be059e88SSimon Glass DECLARE_INTERRUPT(144) \ 505be059e88SSimon Glass DECLARE_INTERRUPT(145) \ 506be059e88SSimon Glass DECLARE_INTERRUPT(146) \ 507be059e88SSimon Glass DECLARE_INTERRUPT(147) \ 508be059e88SSimon Glass DECLARE_INTERRUPT(148) \ 509be059e88SSimon Glass DECLARE_INTERRUPT(149) \ 510be059e88SSimon Glass DECLARE_INTERRUPT(150) \ 511be059e88SSimon Glass DECLARE_INTERRUPT(151) \ 512be059e88SSimon Glass DECLARE_INTERRUPT(152) \ 513be059e88SSimon Glass DECLARE_INTERRUPT(153) \ 514be059e88SSimon Glass DECLARE_INTERRUPT(154) \ 515be059e88SSimon Glass DECLARE_INTERRUPT(155) \ 516be059e88SSimon Glass DECLARE_INTERRUPT(156) \ 517be059e88SSimon Glass DECLARE_INTERRUPT(157) \ 518be059e88SSimon Glass DECLARE_INTERRUPT(158) \ 519be059e88SSimon Glass DECLARE_INTERRUPT(159) \ 520be059e88SSimon Glass DECLARE_INTERRUPT(160) \ 521be059e88SSimon Glass DECLARE_INTERRUPT(161) \ 522be059e88SSimon Glass DECLARE_INTERRUPT(162) \ 523be059e88SSimon Glass DECLARE_INTERRUPT(163) \ 524be059e88SSimon Glass DECLARE_INTERRUPT(164) \ 525be059e88SSimon Glass DECLARE_INTERRUPT(165) \ 526be059e88SSimon Glass DECLARE_INTERRUPT(166) \ 527be059e88SSimon Glass DECLARE_INTERRUPT(167) \ 528be059e88SSimon Glass DECLARE_INTERRUPT(168) \ 529be059e88SSimon Glass DECLARE_INTERRUPT(169) \ 530be059e88SSimon Glass DECLARE_INTERRUPT(170) \ 531be059e88SSimon Glass DECLARE_INTERRUPT(171) \ 532be059e88SSimon Glass DECLARE_INTERRUPT(172) \ 533be059e88SSimon Glass DECLARE_INTERRUPT(173) \ 534be059e88SSimon Glass DECLARE_INTERRUPT(174) \ 535be059e88SSimon Glass DECLARE_INTERRUPT(175) \ 536be059e88SSimon Glass DECLARE_INTERRUPT(176) \ 537be059e88SSimon Glass DECLARE_INTERRUPT(177) \ 538be059e88SSimon Glass DECLARE_INTERRUPT(178) \ 539be059e88SSimon Glass DECLARE_INTERRUPT(179) \ 540be059e88SSimon Glass DECLARE_INTERRUPT(180) \ 541be059e88SSimon Glass DECLARE_INTERRUPT(181) \ 542be059e88SSimon Glass DECLARE_INTERRUPT(182) \ 543be059e88SSimon Glass DECLARE_INTERRUPT(183) \ 544be059e88SSimon Glass DECLARE_INTERRUPT(184) \ 545be059e88SSimon Glass DECLARE_INTERRUPT(185) \ 546be059e88SSimon Glass DECLARE_INTERRUPT(186) \ 547be059e88SSimon Glass DECLARE_INTERRUPT(187) \ 548be059e88SSimon Glass DECLARE_INTERRUPT(188) \ 549be059e88SSimon Glass DECLARE_INTERRUPT(189) \ 550be059e88SSimon Glass DECLARE_INTERRUPT(190) \ 551be059e88SSimon Glass DECLARE_INTERRUPT(191) \ 552be059e88SSimon Glass DECLARE_INTERRUPT(192) \ 553be059e88SSimon Glass DECLARE_INTERRUPT(193) \ 554be059e88SSimon Glass DECLARE_INTERRUPT(194) \ 555be059e88SSimon Glass DECLARE_INTERRUPT(195) \ 556be059e88SSimon Glass DECLARE_INTERRUPT(196) \ 557be059e88SSimon Glass DECLARE_INTERRUPT(197) \ 558be059e88SSimon Glass DECLARE_INTERRUPT(198) \ 559be059e88SSimon Glass DECLARE_INTERRUPT(199) \ 560be059e88SSimon Glass DECLARE_INTERRUPT(200) \ 561be059e88SSimon Glass DECLARE_INTERRUPT(201) \ 562be059e88SSimon Glass DECLARE_INTERRUPT(202) \ 563be059e88SSimon Glass DECLARE_INTERRUPT(203) \ 564be059e88SSimon Glass DECLARE_INTERRUPT(204) \ 565be059e88SSimon Glass DECLARE_INTERRUPT(205) \ 566be059e88SSimon Glass DECLARE_INTERRUPT(206) \ 567be059e88SSimon Glass DECLARE_INTERRUPT(207) \ 568be059e88SSimon Glass DECLARE_INTERRUPT(208) \ 569be059e88SSimon Glass DECLARE_INTERRUPT(209) \ 570be059e88SSimon Glass DECLARE_INTERRUPT(210) \ 571be059e88SSimon Glass DECLARE_INTERRUPT(211) \ 572be059e88SSimon Glass DECLARE_INTERRUPT(212) \ 573be059e88SSimon Glass DECLARE_INTERRUPT(213) \ 574be059e88SSimon Glass DECLARE_INTERRUPT(214) \ 575be059e88SSimon Glass DECLARE_INTERRUPT(215) \ 576be059e88SSimon Glass DECLARE_INTERRUPT(216) \ 577be059e88SSimon Glass DECLARE_INTERRUPT(217) \ 578be059e88SSimon Glass DECLARE_INTERRUPT(218) \ 579be059e88SSimon Glass DECLARE_INTERRUPT(219) \ 580be059e88SSimon Glass DECLARE_INTERRUPT(220) \ 581be059e88SSimon Glass DECLARE_INTERRUPT(221) \ 582be059e88SSimon Glass DECLARE_INTERRUPT(222) \ 583be059e88SSimon Glass DECLARE_INTERRUPT(223) \ 584be059e88SSimon Glass DECLARE_INTERRUPT(224) \ 585be059e88SSimon Glass DECLARE_INTERRUPT(225) \ 586be059e88SSimon Glass DECLARE_INTERRUPT(226) \ 587be059e88SSimon Glass DECLARE_INTERRUPT(227) \ 588be059e88SSimon Glass DECLARE_INTERRUPT(228) \ 589be059e88SSimon Glass DECLARE_INTERRUPT(229) \ 590be059e88SSimon Glass DECLARE_INTERRUPT(230) \ 591be059e88SSimon Glass DECLARE_INTERRUPT(231) \ 592be059e88SSimon Glass DECLARE_INTERRUPT(232) \ 593be059e88SSimon Glass DECLARE_INTERRUPT(233) \ 594be059e88SSimon Glass DECLARE_INTERRUPT(234) \ 595be059e88SSimon Glass DECLARE_INTERRUPT(235) \ 596be059e88SSimon Glass DECLARE_INTERRUPT(236) \ 597be059e88SSimon Glass DECLARE_INTERRUPT(237) \ 598be059e88SSimon Glass DECLARE_INTERRUPT(238) \ 599be059e88SSimon Glass DECLARE_INTERRUPT(239) \ 600be059e88SSimon Glass DECLARE_INTERRUPT(240) \ 601be059e88SSimon Glass DECLARE_INTERRUPT(241) \ 602be059e88SSimon Glass DECLARE_INTERRUPT(242) \ 603be059e88SSimon Glass DECLARE_INTERRUPT(243) \ 604be059e88SSimon Glass DECLARE_INTERRUPT(244) \ 605be059e88SSimon Glass DECLARE_INTERRUPT(245) \ 606be059e88SSimon Glass DECLARE_INTERRUPT(246) \ 607be059e88SSimon Glass DECLARE_INTERRUPT(247) \ 608be059e88SSimon Glass DECLARE_INTERRUPT(248) \ 609be059e88SSimon Glass DECLARE_INTERRUPT(249) \ 610be059e88SSimon Glass DECLARE_INTERRUPT(250) \ 611be059e88SSimon Glass DECLARE_INTERRUPT(251) \ 612be059e88SSimon Glass DECLARE_INTERRUPT(252) \ 613be059e88SSimon Glass DECLARE_INTERRUPT(253) \ 614be059e88SSimon Glass DECLARE_INTERRUPT(254) \ 615be059e88SSimon Glass DECLARE_INTERRUPT(255)); 616