1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * arch/arm/include/asm/mach/arch.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2000 Russell King 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/types.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 11*4882a593Smuzhiyun #include <linux/reboot.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct tag; 14*4882a593Smuzhiyun struct pt_regs; 15*4882a593Smuzhiyun struct smp_operations; 16*4882a593Smuzhiyun #ifdef CONFIG_SMP 17*4882a593Smuzhiyun #define smp_ops(ops) (&(ops)) 18*4882a593Smuzhiyun #define smp_init_ops(ops) (&(ops)) 19*4882a593Smuzhiyun #else 20*4882a593Smuzhiyun #define smp_ops(ops) (struct smp_operations *)NULL 21*4882a593Smuzhiyun #define smp_init_ops(ops) (bool (*)(void))NULL 22*4882a593Smuzhiyun #endif 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct machine_desc { 25*4882a593Smuzhiyun unsigned int nr; /* architecture number */ 26*4882a593Smuzhiyun const char *name; /* architecture name */ 27*4882a593Smuzhiyun unsigned long atag_offset; /* tagged list (relative) */ 28*4882a593Smuzhiyun const char *const *dt_compat; /* array of device tree 29*4882a593Smuzhiyun * 'compatible' strings */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun unsigned int nr_irqs; /* number of IRQs */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #ifdef CONFIG_ZONE_DMA 34*4882a593Smuzhiyun phys_addr_t dma_zone_size; /* size of DMA-able area */ 35*4882a593Smuzhiyun #endif 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun unsigned int video_start; /* start of video RAM */ 38*4882a593Smuzhiyun unsigned int video_end; /* end of video RAM */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun unsigned char reserve_lp0 :1; /* never has lp0 */ 41*4882a593Smuzhiyun unsigned char reserve_lp1 :1; /* never has lp1 */ 42*4882a593Smuzhiyun unsigned char reserve_lp2 :1; /* never has lp2 */ 43*4882a593Smuzhiyun enum reboot_mode reboot_mode; /* default restart mode */ 44*4882a593Smuzhiyun unsigned l2c_aux_val; /* L2 cache aux value */ 45*4882a593Smuzhiyun unsigned l2c_aux_mask; /* L2 cache aux mask */ 46*4882a593Smuzhiyun void (*l2c_write_sec)(unsigned long, unsigned); 47*4882a593Smuzhiyun const struct smp_operations *smp; /* SMP operations */ 48*4882a593Smuzhiyun bool (*smp_init)(void); 49*4882a593Smuzhiyun void (*fixup)(struct tag *, char **); 50*4882a593Smuzhiyun void (*dt_fixup)(void); 51*4882a593Smuzhiyun long long (*pv_fixup)(void); 52*4882a593Smuzhiyun void (*reserve)(void);/* reserve mem blocks */ 53*4882a593Smuzhiyun void (*map_io)(void);/* IO mapping function */ 54*4882a593Smuzhiyun void (*init_early)(void); 55*4882a593Smuzhiyun void (*init_irq)(void); 56*4882a593Smuzhiyun void (*init_time)(void); 57*4882a593Smuzhiyun void (*init_machine)(void); 58*4882a593Smuzhiyun void (*init_late)(void); 59*4882a593Smuzhiyun #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER 60*4882a593Smuzhiyun void (*handle_irq)(struct pt_regs *); 61*4882a593Smuzhiyun #endif 62*4882a593Smuzhiyun void (*restart)(enum reboot_mode, const char *); 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* 66*4882a593Smuzhiyun * Current machine - only accessible during boot. 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun extern const struct machine_desc *machine_desc; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* 71*4882a593Smuzhiyun * Machine type table - also only accessible during boot 72*4882a593Smuzhiyun */ 73*4882a593Smuzhiyun extern const struct machine_desc __arch_info_begin[], __arch_info_end[]; 74*4882a593Smuzhiyun #define for_each_machine_desc(p) \ 75*4882a593Smuzhiyun for (p = __arch_info_begin; p < __arch_info_end; p++) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* 78*4882a593Smuzhiyun * Set of macros to define architecture features. This is built into 79*4882a593Smuzhiyun * a table by the linker. 80*4882a593Smuzhiyun */ 81*4882a593Smuzhiyun #define MACHINE_START(_type,_name) \ 82*4882a593Smuzhiyun static const struct machine_desc __mach_desc_##_type \ 83*4882a593Smuzhiyun __used \ 84*4882a593Smuzhiyun __section(".arch.info.init") = { \ 85*4882a593Smuzhiyun .nr = MACH_TYPE_##_type, \ 86*4882a593Smuzhiyun .name = _name, 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define MACHINE_END \ 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define DT_MACHINE_START(_name, _namestr) \ 92*4882a593Smuzhiyun static const struct machine_desc __mach_desc_##_name \ 93*4882a593Smuzhiyun __used \ 94*4882a593Smuzhiyun __section(".arch.info.init") = { \ 95*4882a593Smuzhiyun .nr = ~0, \ 96*4882a593Smuzhiyun .name = _namestr, 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #endif 99