521086412e
Normally different ARM platform has different way to decode the IRQ hardware status and demultiplex to the corresponding IRQ handler. This is highly optimized by macro irq_handler in entry-armv.S, and each machine defines their own macro to decode the IRQ number. However, this prevents multiple machine classes to be built into a single kernel. By allowing each machine to specify thier own handler, and making function pointer 'handle_arch_irq' to point to it at run time, this can be solved. And introduce CONFIG_MULTI_IRQ_HANDLER to allow both solutions to work. Comparing with the highly optimized macro of irq_handler, the new function must be written with care not to lose too much performance. And the IPI stuff on SMP is expected to move to the provided arch IRQ handler as well. The assembly code to invoke handle_arch_irq is optimized by Russell King. Signed-off-by: Eric Miao <eric.miao@canonical.com> Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
/*
|
|
* arch/arm/include/asm/mach/arch.h
|
|
*
|
|
* Copyright (C) 2000 Russell King
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
struct tag;
|
|
struct meminfo;
|
|
struct sys_timer;
|
|
|
|
struct machine_desc {
|
|
/*
|
|
* Note! The first two elements are used
|
|
* by assembler code in head.S, head-common.S
|
|
*/
|
|
unsigned int nr; /* architecture number */
|
|
const char *name; /* architecture name */
|
|
unsigned long boot_params; /* tagged list */
|
|
|
|
unsigned int nr_irqs; /* number of IRQs */
|
|
|
|
unsigned int video_start; /* start of video RAM */
|
|
unsigned int video_end; /* end of video RAM */
|
|
|
|
unsigned int reserve_lp0 :1; /* never has lp0 */
|
|
unsigned int reserve_lp1 :1; /* never has lp1 */
|
|
unsigned int reserve_lp2 :1; /* never has lp2 */
|
|
unsigned int soft_reboot :1; /* soft reboot */
|
|
void (*fixup)(struct machine_desc *,
|
|
struct tag *, char **,
|
|
struct meminfo *);
|
|
void (*reserve)(void);/* reserve mem blocks */
|
|
void (*map_io)(void);/* IO mapping function */
|
|
void (*init_irq)(void);
|
|
struct sys_timer *timer; /* system tick timer */
|
|
void (*init_machine)(void);
|
|
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
void (*handle_irq)(struct pt_regs *);
|
|
#endif
|
|
};
|
|
|
|
/*
|
|
* Set of macros to define architecture features. This is built into
|
|
* a table by the linker.
|
|
*/
|
|
#define MACHINE_START(_type,_name) \
|
|
static const struct machine_desc __mach_desc_##_type \
|
|
__used \
|
|
__attribute__((__section__(".arch.info.init"))) = { \
|
|
.nr = MACH_TYPE_##_type, \
|
|
.name = _name,
|
|
|
|
#define MACHINE_END \
|
|
};
|
|
|
|
#endif
|