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”