CHAPTER 08
8. DWC eDMA를 endpoint의 DMA engine과 분리한다
DWC eDMA는 IP에 선택적으로 합성되는 local DMA engine입니다. NVMe, Ethernet 또는 accelerator endpoint의 자체 queue와 DMA는 이 엔진과 구분합니다. Linux DWC common code는 mode와 channel 수를 detect한 뒤 dw-edma core에 등록합니다.
Linux DWC eDMA detection 순서
| 순서 | 함수/값 | 판정 | 실패했을 때의 의미 |
|---|---|---|---|
| 1 | dw_pcie_edma_init_data | platform이 준 mf/ops 또는 default | integration 정보 준비 |
| 2 | dw_pcie_edma_find_mf | Legacy viewport/Unroll/HDMA mode | register layout 미확정 |
| 3 | PCIE_DMA_VIEWPORT_BASE + CTRL | viewport register read 유효성 | unrolled 여부 선택 |
| 4 | PCIE_DMA_UNROLL_BASE | unrolled register base | DBI DMA offset와 mapping |
| 5 | PCIE_DMA_CTRL | write/read channel count field | 0 또는 상한 초과면 미지원/오류 |
| 6 | dw_pcie_edma_irq_verify | channel IRQ resource 수 | IRQ topology 불일치 |
| 7 | dw_pcie_edma_ll_alloc | linked-list memory/resource | LL aperture/size 문제 |
| 8 | dw_edma_probe | DMA engine 등록 | DMAengine consumer 사용 가능 |
eDMA와 endpoint bus-master DMA 비교
| 항목 | DWC eDMA | Endpoint 자체 DMA |
|---|---|---|
| 위치 | Root Port/Endpoint DWC IP 내부 option | Endpoint function 내부 |
| register | DWC DMA viewport/unrolled bank | endpoint BAR register |
| Linux driver | dw-edma/DWC common | NVMe/NIC/accelerator driver |
| channel | 합성된 read/write channel | device queue/channel |
| descriptor | DWC eDMA linked list | device-specific descriptor |
| interrupt | eDMA channel IRQ | MSI/MSI-X 또는 device IRQ |
| 주소 경로 | local/remote eDMA 설정 | PCI bus-master TLP + IOMMU |
| 사용 목적 | SoC/EP data movement option | device datapath 핵심 |
eDMA register 위치 식별값
| Macro | 값 | 의미 | 검증 |
|---|---|---|---|
| PCIE_DMA_VIEWPORT_BASE | 0x970 | legacy viewport base | viewport mode에서만 |
| PCIE_DMA_UNROLL_BASE | 0x80000 | unrolled register base | DBI aperture size 확인 |
| PCIE_DMA_CTRL | 0x008 | channel capability | raw value 보존 |
| PCIE_DMA_NUM_WR_CHAN | bits 3:0 | write channel count | 1..EDMA_MAX_WR_CH |
| PCIE_DMA_NUM_RD_CHAN | bits 19:16 | read channel count | 1..EDMA_MAX_RD_CH |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | IP configuration report에서 eDMA option과 channel 수를 먼저 확인합니다. | silicon 합성값과 Linux detect 일치 | 없는 engine의 register를 해석하지 않음 |
| 2 | viewport/unrolled base가 mapped DBI resource 안에 있는지 확인합니다. | access가 bus fault 없이 documented value | 잘못된 aperture 크기 발견 |
| 3 | channel count와 IRQ resource 수를 비교합니다. | 각 read/write channel이 지원되는 IRQ topology | probe 후 특정 channel만 무응답 방지 |
| 4 | eDMA test와 endpoint driver DMA test를 별도 이름으로 기록합니다. | 어느 engine이 TLP를 생성했는지 명확 | 두 DMA engine의 fault 혼합 방지 |
주의PCIE_DMA_CTRL field가 읽힌다고 해서 eDMA가 실사용 가능하다고 판정하지 않습니다. channel IRQ, linked-list memory와 platform integration까지 통과해야 합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 제조사 레지스터나 제품별 오프셋은 추측하지 않았습니다. 아래의 제조사 자료, 아키텍처 문서, Linux v6.18.37 원본으로 확인할 수 있는 내용만 다뤘습니다.
Linux v6.18.37 DWC common source
iATU programming, version/capability와 eDMA detection
Linux v6.18.37 DWC host source
ECAM/CFG access, Root Port setup, MSI irqdomain와 host lifecycle
Linux v6.18.37 PCI probe
Vendor ID read, pci_dev 생성, BAR sizing와 bridge scan
Linux v6.18.37 PCI resource assignment
bridge window와 endpoint BAR resource 배치
Linux DWC Devicetree binding
reg/ranges, iATU window 수, lane/speed와 MSI/IOMMU 연결