환경

Kernel 사용하면서 발생하는 이슈와 그에 대한 해결방법을 이 페이지에 기록한다

분석

#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
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 ) ;
    void             ( * restart      )( enum reboot_mode , const char * ) ; 
} ;

수정

DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad/DualLite (Device Tree)")
	.l2c_aux_val  =  0 ,
	.l2c_aux_mask = ~0 ,
	.smp          = smp_ops( imx_smp_ops ) ,
	.map_io       = imx6q_map_io ,
	.init_irq     = imx6q_init_irq ,
	.init_machine = imx6q_init_machine ,
	.init_late    = imx6q_init_late ,
	.dt_compat    = imx6q_dt_compat ,
	.restart      = mxc_restart ,
MACHINE_END