插拔時,誰收到 IRQ,誰改了什麼狀態?

插拔時,誰收到 IRQ,誰改了什麼狀態? An architecture diagram generated by Archify. 外接螢幕 · MSI 或 Studio Display HPD:1 = 可用;0 = 暫時不可用 · 外接螢幕 · 電源、拔線、初始化都可能改變 HPD 外接螢幕 MSI 或 Studio Display HPD:1 = 可用;0 = 暫時不可用 電源、拔線、初始化都可能改變 HPD CD321x · USB-C controller event / status / data status · MacBook Pro:硬體與 Linux kernel · 硬體狀態先在這裡更新 CD321x USB-C controller event / status / data status 硬體狀態先在這裡更新 ATC PHY · 實際切換高速 lane SAFE / USB / DP · MacBook Pro:硬體與 Linux kernel · 硬體 register ATC PHY 實際切換高速 lane SAFE / USB / DP 硬體 register DCP · Apple DCP firmware DP connect / disconnect · MacBook Pro:硬體與 Linux kernel DCP Apple DCP firmware DP connect / disconnect cd321x_interrupt() · 已註冊的 threaded IRQ handler · MacBook Pro:硬體與 Linux kernel · Linux kernel cd321x_interrupt() 已註冊的 threaded IRQ handler Linux kernel 讀 CD321x register · event、ack、status、power、data status · MacBook Pro:硬體與 Linux kernel · Linux kernel 讀 CD321x register event、ack、status、power、data status Linux kernel tps cache + queue · 更新 tps;排 500 ms delayed work · MacBook Pro:硬體與 Linux kernel · Linux kernel tps cache + queue 更新 tps;排 500 ms delayed work Linux kernel cd321x_update_work() · 讀 snapshot;更新 Type-C 狀態 · MacBook Pro:硬體與 Linux kernel · Linux kernel cd321x_update_work() 讀 snapshot;更新 Type-C 狀態 Linux kernel 完整拔線 · PLUG_PRESENT = 0 typec_set_mode(SAFE),return · MacBook Pro:硬體與 Linux kernel · 不進 cd321x_typec_update_mode 完整拔線 PLUG_PRESENT = 0 typec_set_mode(SAFE),return 不進 cd321x_typec_update_mode 仍插著而且是 DP · DP_CONNECTION = 1 cd321x_typec_update_mode() · MacBook Pro:硬體與 Linux kernel · Linux kernel 仍插著而且是 DP DP_CONNECTION = 1 cd321x_typec_update_mode() Linux kernel Type-C mux framework · typec_set_mode / typec_mux_set → atcphy_mux_set · MacBook Pro:硬體與 Linux kernel · Linux kernel → hardware Type-C mux framework typec_set_mode / typec_mux_set → atcphy_mux_set Linux kernel → hardware USB-C:HPD / DP 狀態 hardware IRQ 500 ms 寫 ATC PHY register oob hotplug 外接螢幕 MacBook Pro:硬體與 Linux kernel Legend Linux framework 狀態 硬體或 Linux driver 外接裝置/Apple firmware

IRQ 不是資料本身

  • • CD321x 的 register 在 IRQ 前已經更新
  • • IRQ 只表示「狀態變了,來讀我」
  • • cd321x_interrupt() 讀回資料後,kernel cache 才更新

完整拔線與 HPD 變化不同

  • • 完整拔線:PLUG_PRESENT = 0,走 SAFE 分支並 return
  • • HPD 變化時,線可能仍插著,仍可能維持 DP mode
  • • 所以 DP mux already in mode 4 不等於再次實體插線

兩個你新增的 log 在哪裡

  • • DP mux request:DP branch 第一次要求 mux 切換
  • • DP mux already:仍是 DP,但 cd321x state 已是 DP,不重設
  • • Type-C mux configure ... : 0:ATC PHY 設定成功