mdesc->init_early()

 

mdesc->init_early()

각 머신에 정의되어 있는 init_early() 함수를 호출한다.

 

아래는 rpi2에서 사용하는 머신 정의이며 init_early 멤버 변수가 bcm2709_init_early() 함수를 가리키는 것을 보여준다.

arch/arm/mach-bcm2709/bcm2709.c

MACHINE_START(BCM2709, "BCM2709")
    /* Maintainer: Broadcom Europe Ltd. */
#ifdef CONFIG_SMP
        .smp            = smp_ops(bcm2709_smp_ops),
#endif
        .map_io = bcm2709_map_io,
        .init_irq = bcm2709_init_irq,
        .init_time = bcm2709_timer_init,
        .init_machine = bcm2709_init,
        .init_early = bcm2709_init_early,
        .reserve = board_reserve,
        .restart        = bcm2709_restart,
        .dt_compat = bcm2709_compat,
MACHINE_END

 

bcm2709_init_early()

arch/arm/mach-bcm2709/bcm2709.c

void __init bcm2709_init_early(void)
{
        /*
         * Some devices allocate their coherent buffers from atomic
         * context. Increase size of atomic coherent pool to make sure such
         * the allocations won't fail.
         */
        init_dma_coherent_pool_size(SZ_4M);
}
  • coherent 버퍼에 대한 사이즈를 기본 256K에서 4M로 증가시킨다.

 

init_dma_coherent_pool_size()

arch/arm/mm/dma-mapping.c

/*      
 * This can be called during early boot to increase the size of the atomic
 * coherent DMA pool above the default value of 256KiB. It must be called
 * before postcore_initcall. 
 */
void __init init_dma_coherent_pool_size(unsigned long size)
{
        /*
         * Catch any attempt to set the pool size too late.
         */
        BUG_ON(atomic_pool);

        /*
         * Set architecture specific coherent pool size only if
         * it has not been changed by kernel command line parameter.
         */
        if (atomic_pool_size == DEFAULT_DMA_COHERENT_POOL_SIZE)
                atomic_pool_size = size;
}
  • coherent 버퍼에 대한 사이즈가 default 256KB 상태이면 요청 size로 변경한다.

 

static size_t atomic_pool_size = DEFAULT_DMA_COHERENT_POOL_SIZE;

 

#define DEFAULT_DMA_COHERENT_POOL_SIZE  SZ_256K

 

coherent_pool 커널 파라메터

early_coherent_pool()

arch/arm/mm/dma-mapping.c

static int __init early_coherent_pool(char *p)
{
        atomic_pool_size = memparse(p, &p);
        return 0;
}
early_param("coherent_pool", early_coherent_pool);

 

  • “coherent_pool=” 커널 파라메터에 의해 coherent 버퍼 사이즈를 변경할 수 있다.
    • 예) “coherent_pool=2M”

 

댓글 남기기