← nacyot / artifacts

Asahi M1 Max 외장 2대 — 막힌 지점과 접은 이유

DP는 드라이버에서 끊기고 · DisplayLink는 4K까지 열리지만 CPU가 비싸다 · 실사용은 본체 HDMI 1대

실측 Asahi DisplayLink Hyprland

이 글이 전하는 것은 “DisplayLink 설치법”이 아니다. stock Asahi M1 Max에서 외장 2대를 노렸을 때, 경로마다 어디서 끝나는지를 갈라 본 기록이다. 케이블·독 문제가 아니라 드라이버 한 곳에서 네이티브 DP가 끊기고, USB 우회는 화면까지 가지만 CPU 비용에서 일상을 접었다.

1 · 네이티브

USB-C DP / TB / MST

천장: atcphy EOPNOTSUPP — 하드웨어 부재가 아님

2 · 우회

DisplayLink + EVDI

천장: 듀얼 4K@60 동작 · 전송 경로 CPU

3 · 실사용

무엇을 남겼나

선택: 본체 HDMI 1대 (+ 내장 패널)
그림 1. 세 경로의 끝 — 네이티브는 드라이버에서, DisplayLink는 CPU 비용에서, HDMI는 그대로 쓴다.

1. 무엇이 되고 무엇이 안 되나

#방법결과비고
1내장 HDMI + DisplayLink USB 어댑터동작 실측 미채택3모니터·듀얼 4K@60까지 됨. CPU 부하로 실사용 포기
2내장 HDMI만 (실사용)채택외장 1대 · GPU 스캔아웃 · CPU≈0. 현재 결론
3USB-C → DP/HDMI 직결 (alt mode)불가atcphy_mux_set EOPNOTSUPP. No Signal, DP-* 미생성
4USB-C MST 분배기 (1포트 2대)불가MST 미지원 + 위 alt mode 동일 장벽
5Thunderbolt / USB4 디스플레이 터널 독불가Asahi에 Thunderbolt 서브시스템 자체 없음
6TB4 독의 “모니터 포트” (호스트 DP 소비형)디스플레이 불가DisplayLink GPU 없으면 호스트 DP 필요. USB 허브·데이터는 됨
7SM768 등 비-DisplayLink USB 그래픽불가aarch64 드라이버 경로 없음 (090c 등)
8실험 커널 fairydust USB-C DP미검증·비추개발자용, blessed 포트 1개, 미패키지. 이 문서 범위 밖

이 머신은 “HDMI 전용 맥”이 아니다. USB-C DP용 DCP·crossbar·ATC/DPTX PHY 인프라는 stock에 있다. 막는 곳은 드라이버 한 함수다.

2. 근본 원인 — 로컬에서 재현한 실패 지점

macOS에서는 되던 DP 케이블을 같은 포트에 꽂으면, stock Asahi에서는 대략 이렇게 진행된다.

  1. 포트에 전원·USB(xHCI 허브)는 올라온다. SMC connector event까지는 간다.
  2. 포트 컨트롤러(tps6598x)가 DisplayPort alt mode를 요청한다.
  3. phy_apple_atcatcphy_mux_set(drivers/phy/apple/atc.c)가 EOPNOTSUPP (−95)로 실패하고 WARNING을 남긴다.
  4. DP PHY가 안 잡히니 DP-* DRM 커넥터가 생기지 않고, 모니터는 No Signal.
WARNING: drivers/phy/apple/atc.c:… at atcphy_mux_set+… [phy_apple_atc]
Workqueue: events cd321x_update_work [tps6598x]
# 레지스터에 -95 = EOPNOTSUPP (“미지원”)

같은 구성으로 여러 차례 재현됐다. 충전 전용 케이블이면 partner/alt-mode 자체가 안 뜨고, 제대로 된 DP 케이블일 때 비로소 위 WARNING이 나온다 — “요청은 되는데 드라이버가 못 받는다”.

그림 2. USB-C DP 협상 흐름. 포트 컨트롤러까지는 살아 있고, ATC PHY mux 전환에서 끊긴다.

3. 칩 판별 — “USB 그래픽”이라고 다 되는 게 아니다

판별Asahi메모
USB idVendor 17e9DisplayLink DL-3xxx~7xxx가능EVDI + DisplayLink 유저스페이스. 제품명에 DisplayLink/DL-6xxx 명시가 안전
USB idVendor 090c (예: 090c:0768)Silicon Motion SM768 등불가리눅스 스택이 x86 중심. aarch64 경로 사실상 없음
Parade/VIA Billboard 장치만 노출DP alt mode 실패 폴백디스플레이 실패독이 잠깐 잡혔다 사라지는 패턴과 자주 동반
TB4 / “DP Alt Mode only” 독호스트 DP 소비형불가독 안에 DisplayLink GPU가 없으면 이 문서의 우회가 아님

수령 직후: lsusb | grep -i 17e9. 안 보이면 반품 후보. 리스팅에 “DL6950/SM768”이 한 줄에 섞인 건 두 라인을 SEO로 묶은 경우가 많아 모델명·드라이버 페이지 버킷으로 가른다.

그림 3. 구매 전 의사결정. “M1 호환” 문구보다 USB VID와 칩 계열이 진실에 가깝다.

실측 통과 하드웨어

  • 제품 문자열: USB-A-C To Dual HDMI 4K Graphic Adapter
  • USB ID: 17e9:6000 (Manufacturer: DisplayLink)
  • 듀얼 HDMI, 헤드당 3840×2160@60 실측
  • 120/144Hz 모드는 EVDI가 pixel clock 초과로 거부 (예상 범위)

리서치상 안전한 구매 축

  • 칩 명확: DL-6950 등 DL-6xxx 명시 어댑터
  • Asahi/Hyprland 커뮤니티 보고가 있는 DL 독 계열
  • 동일 모델명의 변형 주의 (DisplayLink 변형 vs alt-mode 변형)
  • 회피: SM768 / InstantView / MS2109 / FL2000 / “MST only”

4. 소프트웨어 스택 (Arch aarch64 / Asahi)

DisplayLink = 커널 EVDI DRM 장치 + 유저스페이스 DisplayLinkManager. 커널 7.x에서는 오래된 번들 EVDI로는 부족하고, Asahi 컴파일 픽스가 들어간 EVDI 1.14.16+ 가 필요하다.

구성실측 버전역할
커널linux-asahi 7.0.x (stock)호스트. 헤더 패키지로 DKMS 빌드
EVDIevdi-dkms 1.15.0가상 DRM 카드. DKMS로 현재 커널에 설치
DisplayLinkAUR displaylink 6.3 (aarch64 바이너리)USB 인코딩·전송 데몬, systemd 유닛
컴포지터Hyprland + Aquamarine멀티 카드. 필요 시 AQ_DRM_DEVICES(primary 먼저, EVDI 나중)
# 의존성 → EVDI → DisplayLink → 서비스 (개념 순서)
sudo pacman -S --needed base-devel dkms linux-asahi-headers
# AUR: evdi-dkms (또는 evdi-git) 후 displaylink
sudo systemctl enable --now displaylink.service
modprobe evdi   # 보통 서비스 ExecStartPre가 수행
lsmod | grep evdi
lsusb | grep -i 17e9
hyprctl monitors all

설치 직후 udev 스크립트가 exit 2를 몇 번 찍어도, 서비스가 재기동되며 EVDI attach·mode set까지 간 경우가 있었다. 최종 판정은 DRM 커넥터 연결과 실제 화면으로 한다.

5. 동작 실측 — 기술적으로는 된다

실패만 있는 문서가 아니다. DisplayLink 경로는 설치·출력·3모니터 배치까지 성공했다. (채택 여부는 §6.)

그림 4. DisplayLink 성공 파이프라인 (실측). USB 인식 → 스택 기동 → EVDI attach → 4K@60 mode set → 컴포지터 배치.

5.1 타임라인 (요약)

단계관측판정
어댑터 연결lsusb17e9:6000 · 제품명 Dual HDMI 4K Graphic Adapter인식
드라이버 없음EVDI 미로드 · displaylink.service inactive → 화면 미부착(설치 전 상태)
패키지 설치evdi-dkms 1.15.0 DKMS 빌드 성공 → displaylink 6.3OK
서비스 기동systemctl enable --now displaylink · 모듈 로드 · Manager 기동OK
1st head커널: Initialized evdi …mode changed: 3840x2160@604K60
2nd head두 번째 EVDI card · 동일 4K60. 120/144Hz는 pixel clock 거절듀얼
컴포지터Hyprland가 내장 eDP + HDMI + EVDI(DVI-I-*) 3출력 배치3모니터
재부팅 후서비스 enabled 유지, 스택 재기동 가능유지

5.2 최종 모니터 구성 (실측)

출력경로모드
노트북 패널 (eDP-1)apple-drm (내장)~3K급 @ 60Hz (패널 고주사율 가능, 외장과 맞춰 60 고정 가능)
외장 A (HDMI-A-1)본체 HDMI · GPU 스캔아웃3840×2160@60 · CPU 거의 0
외장 B (EVDI, 예: DVI-I-*)DisplayLink USB3840×2160@60 · 이름은 DVI여도 USB 그래픽

커널 로그에 헤드마다 Notifying mode changed: 3840x2160@60 이 남았고, EDID로 두 외장을 각각 인식했다. 모니터 시리얼·EDID 원문은 공개하지 않는다.

그림 5. 동작 실측 당시 논리 레이아웃 예(외장 2대 + 내장). 기술적으로 배치 가능했으나 §6 CPU 이유로 미채택. DL 커넥터명(DVI-I-*)은 재연결 시 변동.

확인된 동작

  • 플러그 후 EVDI 카드 생성 · connector connected
  • 외장 듀얼 4K@60 (HDMI 네이티브 + DisplayLink)
  • 내장 포함 3모니터 · Hyprland 워크스페이스
  • displaylink.service enable + 재부팅 후 스택 유지

부수 함정 (채택 전 이슈)

  • 오디오 샘: 어댑터 HDMI 오디오가 default sink를 가로채 모니터로 새는 경우 → 카드 프로파일 off
  • 커넥터 이름: DVI-I-n 재부팅·재연결 시 변동 → 레이아웃 하드코딩 취약
  • 핫플러그·슬립: 커뮤니티 잔버그 보고 있음

6. 결론 — CPU 부하 때문에 쓰지 않기로 함

판정: “된다” ≠ “쓸 만하다”. DisplayLink는 이 머신에서 미채택.

DisplayLink ≠ CPU로 화면을 그린다에 가깝다. 구조는 이렇다:

  1. 컴포지터(Hyprland)가 Apple GPU로 프레임을 그린다.
  2. 본체 HDMI는 디스플레이 엔진 스캔아웃 → CPU≈0.
  3. DisplayLink는 프레임버퍼 readback → 소프트웨어 압축 → USB bulkDisplayLinkManager가 CPU로 처리한다.

실측에서 이 3번 구간의 부하가 실사용 기준에서 용납하기 어려울 정도로 컸다(4K·화면 변화가 있을 때 특히). 정적 창만 DL에 두는 식의 완화는 가능하지만, 그 제약을 안고 외장 2대를 유지할 가치는 이 환경에서 없다고 판단했다.

실사용 결론: 외장은 본체 HDMI 1대만. 내장 패널 + HDMI. DisplayLink 스택은 실험·재현용으로 남겨 둘 수 있으나 일상 구성에서는 빼기로 함. 네이티브 USB-C DP가 stock에서 열리기 전까지 외장 2대는 보류.

7. 최소 검증 체크리스트

# 1) 진짜 DisplayLink인가
lsusb | grep -i 17e9

# 2) 스택
systemctl is-active displaylink
lsmod | grep evdi
dkms status | grep -i evdi

# 3) 화면
hyprctl monitors all
ls /sys/class/drm

# 4) 실패 시 (네이티브 DP 의심 경로)
dmesg | grep -iE 'atcphy_mux_set|EOPNOTSUPP|phy_apple_atc'

8. 한계 · 범위