0
点赞
收藏
分享

微信扫一扫

Linux下ARM SoC信息描述


在linux kernel中,各个ARM下平台都会实现一个描述平台的对象struct machine_desc,这是一个很重要的数据结构,各个平台都需要实现这样的一个对象,系统初始化过程中,会对这里定义的函数回调,已完成对系统的初始化。我们这里先列出基本数据结构,下面将逐一介绍这些函数调用处理。

arch/arm/include/asm/mach/arch.h
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);
     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_MULTI_IRQ_HANDLER
     void            (*handle_irq)(struct pt_regs *);
 #endif
     void            (*restart)(enum reboot_mode, const char *);
 };extern const struct machine_desc *machine_desc;
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++)

用于定义平台的宏定义:

#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,

这些宏定义被链接器编译进一个表中,即在__arch_info_begin 和__arch_info_end之间,或者说在.arch.info.init节中。


具体平台定义此对象,如下:

MACHINE_START(MAGICIAN, "HTC Magician")
     .atag_offset = 0x100,
     .map_io = pxa27x_map_io,
     .nr_irqs = MAGICIAN_NR_IRQS,
     .init_irq = pxa27x_init_irq,
     .handle_irq = pxa27x_handle_irq,
     .init_machine = magician_init,
     .init_time    = pxa_timer_init,
     .restart    = pxa_restart,
 MACHINE_END

 DT_MACHINE_START(TEGRA_DT, "NVIDIA Tegra SoC (Flattened Device Tree)")
     .l2c_aux_val    = 0x3c400001,
     .l2c_aux_mask    = 0xc20fc3fe,
     .smp        = smp_ops(tegra_smp_ops),
     .map_io        = tegra_map_common_io,
     .init_early    = tegra_init_early,
     .init_irq    = tegra_dt_init_irq,
     .init_machine    = tegra_dt_init,
     .init_late    = tegra_dt_init_late,
     .dt_compat    = tegra_dt_board_compat,
 MACHINE_END

举报

相关推荐

0 条评论