setup_dma_zone

DMA zone을 필요로하는 머신의 경우 DMA size 등의 정보를 설정한다.

  • CONFIG_ZONE_DMA 옵션 사용
    • 특정 메모리 영역을 ZONE_DMA에 구성해야 할 때 필요한 옵션이다.
    • CONFIG_DMADEVICES 옵션과 관련 없다.
  • ARM 아키텍처 중 다음 머신들이 DMA zone을 사용한다.
    • mach-prima2, Cortex-A9
    • mach-shmobile, Renesas ARM SoCs, LPAE
    • mach-mvenu, Marvell Engineering Business Unit (MVEBU) SoCs, LPAE
    • mach-imx, Freescale LS1021A, LPAE
    • mach-realview, RealView(R) Platform Baseboard Explore
    • mach-axxia, LSI Axxia platforms, LPAE
    • mach-highbank, Calxeda ECX-1000/2000 (Highbank/Midway), LPAE
    • mach-keystone, Texas Instruments Keystone Devices, LPAE
    • 기타: mach-ixp4xx, mach-pxa, mach-davinchi, mach-sa1100 등등
  • ARM 아키텍처에서 ZONE_DMA size는 보통 1M, 16M, 64M, 128M 또는 256M이다.
  • LPAE를 지원하는 시스템에서의 ZONE_DMA size는 보통 1G, 2G 또는 4G이다.
  • 라즈베리파이2: DMA zone을 사용하지 않는다.

 

CONFIG_ZONE_DMA

  • DMA를 사용하는 디바이스가 아키텍처가 사용하는 전체 물리주소 영역에 대해 대응하지 못하는 경우 DMA 디바이스의 사용 주소 범위를 좁혀줄 필요가 있다. 따라서 이러한 디바이스를 위해 영역을 제한한 메모리 영역을 지정하여 메모리의 할당 관리를 별도로 한다.
  • x86 시스템에서는 24비트 주소를 사용하는 ISA 버스 방식을 사용하는 디바이스가 있고 이러한 디바이스가 DMA 방식으로 RAM과 communication을 하기 위해 DMA 존 크기를 16M로 지정하여 사용해야 한다.
  • ARM 시스템에서는 머신 설계 마다 다르다. DMA 디바이스가 32bit address를 갖춘 경우에는 DMA 존을 별도로 운영할 필요가 없다. 일부 머신에서는 address가 제한된 DMA 디바이스를 사용하는 경우 그 머신에 맞추어 DMA 존 크기가 지정되어 운용되어야 한다.
  • 64bit 머신에서는 32bit용으로 설계된 DMA 디바이스를 위해 CONFIG_ZONE_DMA32를 운용한다.

 

setup_dma_zone()

  • 3가지의 DMA zone 관련 전역 변수를 설정한다.
    • arm_dma_ zone_size <- mdesc->dma_zone_size 대입
    • arm_dma_zone_limit <- 물리 RAM 주소 + dma_zone_size – 1
      • 예) dma_zone_size=32M이면 dma_zone_limit=0x01ff_ffff
      • dma_zone_size가 0인 경우 dma_zone_limit <- 0xffff_ffff
    • arm_dma_pfn_limit <- arm_dma_zone_limit를 12비트 우측으로 쉬프트시켜 물리주소의 PFN으로 변환한다.
arch/arm/mm/init.c
void __init setup_dma_zone(const struct machine_desc *mdesc)
{
#ifdef CONFIG_ZONE_DMA
        if (mdesc->dma_zone_size) {
                arm_dma_zone_size = mdesc->dma_zone_size;
                arm_dma_limit = PHYS_OFFSET + arm_dma_zone_size - 1;
        } else
                arm_dma_limit = 0xffffffff;
        arm_dma_pfn_limit = arm_dma_limit >> PAGE_SHIFT;
#endif
}

 

예) mach-realview/realview-dt.c

DT_MACHINE_START(REALVIEW_DT, "ARM RealView Machine (Device Tree Support)")
#ifdef CONFIG_ZONE_DMA
        .dma_zone_size  = SZ_256M,
#endif
        .dt_compat      = realview_dt_platform_compat,
        .l2c_aux_val = 0x0,
        .l2c_aux_mask = ~0x0,
MACHINE_END

 

댓글 남기기