hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 *  arch/arm/include/asm/mach/arch.h
 *
 *  Copyright (C) 2000 Russell King
 */
 
#include <linux/types.h>
 
#ifndef __ASSEMBLY__
#include <linux/reboot.h>
 
struct tag;
struct pt_regs;
struct smp_operations;
#ifdef CONFIG_SMP
#define smp_ops(ops) (&(ops))
#define smp_init_ops(ops) (&(ops))
#else
#define smp_ops(ops) (struct smp_operations *)NULL
#define smp_init_ops(ops) (bool (*)(void))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
   phys_addr_t        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    */
   enum reboot_mode    reboot_mode;    /* default restart mode    */
   unsigned        l2c_aux_val;    /* L2 cache aux value    */
   unsigned        l2c_aux_mask;    /* L2 cache aux mask    */
   void            (*l2c_write_sec)(unsigned long, unsigned);
   const struct smp_operations    *smp;    /* SMP operations    */
   bool            (*smp_init)(void);
   void            (*fixup)(struct tag *, char **);
   void            (*dt_fixup)(void);
   long long        (*pv_fixup)(void);
   void            (*reserve)(void);/* reserve mem blocks    */
   void            (*map_io)(void);/* IO mapping function    */
   void            (*init_early)(void);
   void            (*init_irq)(void);
   void            (*init_time)(void);
   void            (*init_machine)(void);
   void            (*init_late)(void);
#ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
   void            (*handle_irq)(struct pt_regs *);
#endif
   void            (*restart)(enum reboot_mode, const char *);
};
 
/*
 * Current machine - only accessible during boot.
 */
extern const struct machine_desc *machine_desc;
 
/*
 * Machine type table - also only accessible during boot
 */
extern const 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                            \
 __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                            \
 __section(".arch.info.init") = {            \
   .nr        = ~0,                \
   .name        = _namestr,
 
#endif