Linux下ARM SoC信息描述

本文详细介绍了Linux内核中ARM平台的描述结构struct machine_desc。该结构体是ARM平台初始化过程中的核心组件,定义了诸如中断数量、内存映射、设备树兼容字符串等关键属性,并包含了多个初始化函数指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值