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까지 통과해야 합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 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 연결