mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 20:37:27 +00:00
abcee5fb0d
This adds a 'struct smp_operations' to abstract the CPU initialization and hot plugging functions on SMP systems, which otherwise conflict in a multiplatform kernel. This also helps shmobile and potentially others that have more than one method to do these. To allow the kernel to continue building, the platform hooks are defined as weak symbols which are overrided by the platform code. Once all platforms are converted, the "weak" attribute will be removed and the function made static. Unlike the original version from Marc, this new version from Arnd does not use a generalized abstraction for per-soc data structures but only tries to solve the problem for the SMP operations. This way, we can collapse the previous four data structures into a single struct, which is less systematic but also easier to follow as a causal reader. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Acked-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
94 lines
2.5 KiB
C
94 lines
2.5 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 pt_regs;
|
|
struct smp_operations;
|
|
#ifdef CONFIG_SMP
|
|
#define smp_ops(ops) (&(ops))
|
|
#else
|
|
#define smp_ops(ops) (struct smp_operations *)NULL
|
|
#endif
|
|
|
|
struct machine_desc {
|
|
unsigned int nr; /* architecture number */
|
|
const char *name; /* architecture name */
|
|
unsigned long atag_offset; /* tagged list (relative) */
|
|
const char *const *dt_compat; /* array of device tree
|
|
* 'compatible' strings */
|
|
|
|
unsigned int nr_irqs; /* number of IRQs */
|
|
|
|
#ifdef CONFIG_ZONE_DMA
|
|
unsigned long dma_zone_size; /* size of DMA-able area */
|
|
#endif
|
|
|
|
unsigned int video_start; /* start of video RAM */
|
|
unsigned int video_end; /* end of video RAM */
|
|
|
|
unsigned char reserve_lp0 :1; /* never has lp0 */
|
|
unsigned char reserve_lp1 :1; /* never has lp1 */
|
|
unsigned char reserve_lp2 :1; /* never has lp2 */
|
|
char restart_mode; /* default restart mode */
|
|
struct smp_operations *smp; /* SMP operations */
|
|
void (*fixup)(struct tag *, char **,
|
|
struct meminfo *);
|
|
void (*reserve)(void);/* reserve mem blocks */
|
|
void (*map_io)(void);/* IO mapping function */
|
|
void (*init_early)(void);
|
|
void (*init_irq)(void);
|
|
struct sys_timer *timer; /* system tick timer */
|
|
void (*init_machine)(void);
|
|
void (*init_late)(void);
|
|
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
void (*handle_irq)(struct pt_regs *);
|
|
#endif
|
|
void (*restart)(char, const char *);
|
|
};
|
|
|
|
/*
|
|
* Current machine - only accessible during boot.
|
|
*/
|
|
extern struct machine_desc *machine_desc;
|
|
|
|
/*
|
|
* Machine type table - also only accessible during boot
|
|
*/
|
|
extern struct machine_desc __arch_info_begin[], __arch_info_end[];
|
|
#define for_each_machine_desc(p) \
|
|
for (p = __arch_info_begin; p < __arch_info_end; p++)
|
|
|
|
/*
|
|
* 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 \
|
|
};
|
|
|
|
#define DT_MACHINE_START(_name, _namestr) \
|
|
static const struct machine_desc __mach_desc_##_name \
|
|
__used \
|
|
__attribute__((__section__(".arch.info.init"))) = { \
|
|
.nr = ~0, \
|
|
.name = _namestr,
|
|
|
|
#endif
|