arm-pcie-gpu-patches
이 저장소는 비표준 PCIe 통합을 갖춘 Arm 플랫폼에서 외부 GPU를 활성화하는 일련의 패치를 포함하고 있습니다. 이 패치는 Ampere Altra Linux patches를 기반으로 하며, 더 광범위한 시스템 및 커널 버전을 지원하기 위한 추가 수정 사항이 포함되어 있습니다.
지원 하드웨어
AMD
amdgpu 드라이버가 지원하는 모든 AMD 카드는 정상적으로 작동해야 합니다.
테스트는 저렴한 M.2 to PCIe x4 어댑터를 통해 연결된 AMD Radeon RX 580이 장착된 RK3588 기반 SBC에서 수행되었습니다.
NVIDIA
nvidia-wip 브랜치를 참조하십시오. 여기에는 오픈 소스 및 독점 NVIDIA 커널 모듈 모두에 대한 패치와 실험적인 nouveau 패치가 포함되어 있습니다. 또한 open-gpu-kernel-modules pull request도 확인하십시오.
최신 소스에서 빌드된 EDK2를 실행하는 RK3588의 경우, 커널 변경은 필요하지 않습니다. U-Boot/DT 부팅 시에는 PCIe MMIO 영역을 수정하기 위해 0004-PCI-dwrockchip-Disable-root-port-BARs.patch와 DT 변경이 필요할 수 있습니다.
배경
대부분의 Arm SoC는 동일한 PCIe 메모리 접근 및 캐싱 문제로 어려움을 겪고 있으며, 현재 패치들은 이를 해결하려고 시도합니다. 또한 일부 SoC는 다음과 같은 문제가 있을 수 있습니다:
- GPU의 대용량 VRAM BAR를 수용할 충분한 연속 MMIO 공간이 부족함 (예: RX 580은 256MB 이상 필요하지만, 구형 RK3399는 30MB만 가짐).
- 32비트(또는 그 이하...) DMA 제약 사항을 가짐 (일부 드라이버의 경우 4GB 이상의 RAM에서 문제가 될 수 있음).
- MMIO에 대한 엄격한 32비트 접근 요구 사항을 가짐 (즉, 64비트 정렬된 접근조차 작동하지 않을 수 있음).
이러한 후자의 제한 사항들은 하드웨어를 GPU 사용에 완전히 부적합하게 만들 수 있습니다.
사용 방법
1) Linux 커널을 클론하고 필요한 빌드 도구를 설치하십시오
만약 귀하의 장치가 상위 레벨(upstream)에서 지원되지 않는다면, 공급업체가 제공하는 BSP를 사용해야 합니다.
2) 이 저장소를 클론하고 패치를 커널 트리에 적용합니다
~/linux$ git am -3 ../arm-pcie-gpu-patches/linux/<VERSION>/*.patch
[!NOTE]
이 패치는 kernel 6.1 이상에 적용됩니다 (최대 6.17까지 검증됨).
커널 버전보다 작거나 같은 최신 <VERSION>을 사용하십시오. 예: 커널 6.6의 경우, 6.1 패치 세트를 사용합니다.
3) 커널 구성 및 빌드
관련 DRM GPU 드라이버와 여기서 제공하는 워크어라운드가 커널 설정에서 활성화되어 있는지 확인해야 합니다.
모든 워크어라운드는 기본적으로 Y로 설정됩니다 (RK3588에 의도된 방식). 하지만 일부 플랫폼에서는 모든 것이 필요하지 않을 수 있습니다. 예를 들면:
CONFIG_ARM64_FORCE_PCIE_MMIO_DEVICE_MAPPINGS는 성능에 영향을 미치므로, PCIe MMIO에 대한 정렬되지 않은 접근이 올바르게 작동하는 경우 비활성화해야 합니다.
CONFIG_DRM_FORCE_DMA_WRITE_COMBINED_MAPPINGS는 캐시 일관성(cache-coherent) PCIe에서 문제를 일으킬 수 있습니다 (Altra의 경우 비활성화 가능).
4) 새 커널 및 추가 펌웨어 설치
GPU 장치는 비자유(non-free) 펌웨어를 필요로 합니다. 예: Debian용 AMD GPU의 경우, firmware-amd-graphics를 설치하십시오.
UEFI 지원
이러한 시스템에서도 UEFI GOP 지원을 얻는 것이 가능합니다. 완전히 갖춰진 UEFI 구현이 필요하며, 즉 EDK2 기반이어야 합니다.
GPU는 OpROM에 x64 UEFI 드라이버를 포함하고 있으며, 이는 에뮬레이터를 통해 실행할 수 있습니다.
AMD
AMD의 x64 OpROM 드라이버는 캐시 일관성 PCIe를 가정하는데, 이는 시스템에서 아닐 수 있으며 디스플레이 이미지가 손상될 수 있습니다.
대신 AArch64 드라이버를 사용해야 합니다.
위의 드라이버들(에뮬레이터와 함께)은 펌웨어에 의해 어떤 방식으로든 로드되어야 합니다. 방법은 다음과 같습니다:
참고: 디스플레이 출력이 나오지 않고 카드에 듀얼 BIOS 스위치가 있는 경우, 이를 전환해 보세요. GOP 드라이버는 VBIOS가 일치하지 않는 서명으로 수정된 경우 로드되지 않습니다.
NVIDIA
카드에 따라 지원 여부가 다를 수 있습니다.
RTX 3050의 x64 OpROM 드라이버는 에뮬레이터에서 올바르게 실행되는 것으로 확인되었습니다(단, 해당 드라이버가 프레임버퍼용 MMIO 변환을 지원하지 않는다는 작은 주의사항이 있습니다.)