VGA Switcheroo¶
vga_switcheroo是Linux用於筆記型電腦混合顯示卡的子系統。這些顯示卡有兩種型別
複用型:具有雙GPU和一個複用器晶片,用於在GPU之間切換輸出。
非複用型:具有雙GPU,但只有一個連線到輸出。另一個僅用於分擔渲染任務,其結果透過PCIe複製到幀緩衝區中。在Linux上,這透過DRI PRIME支援。
混合顯示卡在2000年代後期開始出現,最初都是複用型的。較新的筆記型電腦出於成本原因轉向非複用架構。一個值得注意的例外是MacBook Pro,它繼續使用複用器。複用器具有不同的功能:有些僅切換面板,有些還可以切換外部顯示器。有些一次切換所有顯示引腳,而另一些只能切換DDC線路。(允許探測非活動GPU的EDID。)此外,複用器通常用於在未使用獨立GPU時切斷其電源。
DRM驅動程式向vga_switcheroo註冊GPU,這些GPU此後被稱為客戶端。複用器被稱為處理程式。非複用機器也註冊一個處理程式來控制獨立GPU的電源狀態,其->switchto回撥由於顯而易見的原因是一個空操作。獨立GPU通常配備用於HDMI/DP音訊訊號的HDA控制器,它也將註冊為客戶端,以便vga_switcheroo可以在更改獨立GPU的電源狀態時處理正確的掛起/恢復順序。總共有最多三個客戶端:兩個vga客戶端(GPU)和一個音訊客戶端(在獨立GPU上)。程式碼主要準備好支援具有兩個以上GPU的機器,如果它們可用的話。
當前輸出切換到的GPU在vga_switcheroo術語中稱為活動客戶端。未使用的GPU是非活動客戶端。當非活動客戶端的DRM驅動程式載入時,它將無法探測面板的EDID,因此依賴於VBIOS來提供其顯示模式。如果VBIOS模式是錯誤的,或者根本沒有VBIOS(這在MacBook Pro上很常見),則客戶端可以替代地請求將DDC線路臨時切換到它,前提是處理程式支援此操作。僅切換DDC線路而不切換整個輸出可以避免不必要的閃爍。
使用模式¶
手動切換和手動電源控制¶
在這種使用模式下,可以讀取檔案/sys/kernel/debug/vgaswitcheroo/switch以檢索當前的vga_switcheroo狀態,並且可以向其寫入命令以更改狀態。一旦兩個GPU驅動程式和一個處理程式已向vga_switcheroo註冊,該檔案就會出現。理解以下命令
OFF:關閉未使用的裝置的電源。
ON:開啟未使用的裝置的電源。
IGD:切換到整合顯示卡裝置。如有必要,開啟整合GPU的電源,關閉獨立GPU的電源。前提是沒有使用者空間程序(例如Xorg,alsactl)已開啟GPU或音訊裝置的裝置檔案。如果切換失敗,使用者可以在/dev/dri/和/dev/snd/controlC1上呼叫lsof(8)或fuser(1)以識別阻止切換的程序。
DIS:切換到獨立顯示卡裝置。
DIGD:延遲切換到整合顯示卡裝置。一旦最後一個使用者空間程序關閉GPU和音訊裝置的裝置檔案,這將執行切換。
DDIS:延遲切換到獨立顯示卡裝置。
MIGD:僅複用器切換到整合顯示卡裝置。不重新對映控制檯或更改任一gpu的電源狀態。如果當前關閉整合GPU,螢幕將變黑。如果已開啟,螢幕將顯示VRAM中發生的任何事情。無論哪種方式,使用者都必須盲目地輸入命令才能切換回來。
MDIS:僅複用器切換到獨立顯示卡裝置。
對於其電源狀態由驅動程式的執行時pm控制的GPU,ON和OFF命令是空操作(請參見下一節)。
對於非複用機器,不應使用IGD/DIS,DIGD/DDIS和MIGD/MDIS命令。
驅動程式電源控制¶
在這種使用模式下,獨立GPU會自動開啟和關閉電源,由驅動程式的執行時pm決定。在複用機器上,使用者仍然可以透過debugfs介面影響複用器的狀態,但是ON和OFF命令對於獨立GPU變為空操作。
此模式是Nvidia HybridPower/Optimus和ATI PowerXpress上的預設模式。在核心命令列上指定nouveau.runpm=0,radeon.runpm=0或amdgpu.runpm=0會停用它。
在GPU掛起後,需要呼叫處理程式以切斷GPU的電源。同樣,在GPU可以恢復之前,需要恢復電源。這是透過vga_switcheroo_init_domain_pm_ops()實現的,它透過對處理程式的必要呼叫來擴充GPU的掛起/恢復功能。
當音訊裝置恢復時,需要喚醒GPU。這是透過一個PCI quirk實現的,該quirk呼叫device_link_add()來宣告對GPU的依賴性。這樣,只要音訊裝置正在使用,GPU就會保持喚醒狀態。
在複用機器上,如果複用器最初切換到獨立GPU,則使用者最終會在啟動後GPU斷電時得到黑屏。作為一種解決方法,在執行時掛起時,複用器被迫切換到整合GPU,請參見https://bugs.freedesktop.org/show_bug.cgi?id=75917
API¶
公共函式¶
-
int vga_switcheroo_register_handler(const struct vga_switcheroo_handler *handler, enum vga_switcheroo_handler_flags_t handler_flags)¶
註冊處理程式
引數
const struct vga_switcheroo_handler *handler處理程式回撥
enum vga_switcheroo_handler_flags_t handler_flags處理程式標誌
描述
註冊處理程式。如果兩個vga客戶端已經註冊,則啟用vga_switcheroo。
返回值
成功時返回0,如果已註冊處理程式,則返回-EINVAL。
-
void vga_switcheroo_unregister_handler(void)¶
登出處理程式
引數
void無引數
描述
登出處理程式。停用vga_switcheroo。
-
enum vga_switcheroo_handler_flags_t vga_switcheroo_handler_flags(void)¶
獲取處理程式標誌
引數
void無引數
描述
客戶端獲取處理程式標誌位掩碼的助手函式。
返回值
處理程式標誌。值為0表示未註冊處理程式或處理程式沒有特殊功能。
-
int vga_switcheroo_register_client(struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, bool driver_power_control)¶
註冊vga客戶端
引數
struct pci_dev *pdev客戶端pci裝置
const struct vga_switcheroo_client_ops *ops客戶端回撥
bool driver_power_control電源狀態是否由驅動程式的執行時pm控制
描述
註冊vga客戶端(GPU)。如果另一個GPU和一個處理程式已註冊,則啟用vga_switcheroo。客戶端的電源狀態假定為ON。在此之前,應呼叫vga_switcheroo_client_probe_defer()以確保滿足所有前提條件。
返回值
成功時返回0,記憶體分配錯誤時返回-ENOMEM。
-
int vga_switcheroo_register_audio_client(struct pci_dev *pdev, const struct vga_switcheroo_client_ops *ops, struct pci_dev *vga_dev)¶
註冊音訊客戶端
引數
struct pci_dev *pdev客戶端pci裝置
const struct vga_switcheroo_client_ops *ops客戶端回撥
struct pci_dev *vga_dev繫結到當前音訊客戶端的pci裝置
描述
註冊音訊客戶端(GPU上的音訊裝置)。假定客戶端使用執行時PM。在此之前,應呼叫vga_switcheroo_client_probe_defer()以確保滿足所有前提條件。
返回值
成功時返回0,記憶體分配錯誤時返回-ENOMEM,獲取客戶端id錯誤時返回-EINVAL。
-
bool vga_switcheroo_client_probe_defer(struct pci_dev *pdev)¶
是否推遲探測給定客戶端
引數
struct pci_dev *pdev客戶端pci裝置
描述
確定是否未滿足任何前提條件來探測給定客戶端。驅動程式應在其->probe回撥中儘早呼叫此方法,如果評估結果為true,則返回-EPROBE_DEFER。在你呼叫此函式之前,你不應該註冊客戶端。
返回值
如果應推遲探測,則返回true,否則返回false。
-
enum vga_switcheroo_state vga_switcheroo_get_client_state(struct pci_dev *pdev)¶
獲取給定客戶端的電源狀態
引數
struct pci_dev *pdev客戶端pci裝置
描述
從vga_switcheroo獲取給定客戶端的電源狀態。該函式僅從hda_intel.c呼叫。
返回值
電源狀態。
-
void vga_switcheroo_unregister_client(struct pci_dev *pdev)¶
登出客戶端
引數
struct pci_dev *pdev客戶端pci裝置
描述
登出客戶端。如果這是一個vga客戶端(GPU),則停用vga_switcheroo。
-
void vga_switcheroo_client_fb_set(struct pci_dev *pdev, struct fb_info *info)¶
設定給定客戶端的幀緩衝區
引數
struct pci_dev *pdev客戶端pci裝置
struct fb_info *info幀緩衝區
描述
設定給定客戶端的幀緩衝區。切換時,控制檯將重新對映到此緩衝區。
-
int vga_switcheroo_lock_ddc(struct pci_dev *pdev)¶
暫時將DDC線路切換到給定客戶端
引數
struct pci_dev *pdev客戶端pci裝置
描述
暫時將DDC線路切換到由pdev標識的客戶端(但保持輸出切換到它們所在的位置)。這允許非活動客戶端探測EDID。之後必須透過呼叫vga_switcheroo_unlock_ddc()將DDC線路切換回去,即使此函式返回錯誤也是如此。
返回值
成功時的先前DDC所有者,如果出錯,則返回負整數。具體來說,如果沒有註冊處理程式或者處理程式不支援切換DDC線路,則返回-ENODEV。此外,處理程式返回的負值會傳播回撥用方。返回值僅對可能對其感興趣的任何呼叫方具有資訊目的。可以忽略返回值,而僅依賴於後續EDID探測的結果,如果DDC切換失敗,則結果將為NULL。
-
int vga_switcheroo_unlock_ddc(struct pci_dev *pdev)¶
將DDC線路切換回先前的所有者
引數
struct pci_dev *pdev客戶端pci裝置
描述
在呼叫vga_switcheroo_lock_ddc()之後,將DDC線路切換回先前的所有者。即使vga_switcheroo_lock_ddc()返回錯誤,也必須呼叫此函式。
返回值
成功時的先前DDC所有者(即pdev的客戶端識別符號),如果出錯,則返回負整數。具體來說,如果沒有註冊處理程式或者處理程式不支援切換DDC線路,則返回-ENODEV。此外,處理程式返回的負值會傳播回撥用方。最後,不允許在沒有首先呼叫vga_switcheroo_lock_ddc()的情況下呼叫此函式,並將導致-EINVAL。
-
int vga_switcheroo_process_delayed_switch(void)¶
延遲切換的助手函式
引數
void無引數
描述
如果存在掛起的延遲切換,則進行處理。
返回值
成功時返回0。如果沒有掛起的延遲切換,如果客戶端在此期間已登出,或者如果存在阻止切換的其他客戶端,則返回-EINVAL。如果實際切換失敗,則報告錯誤並返回0。
-
int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain)¶
驅動程式電源控制的助手函式
引數
struct device *devvga客戶端裝置
struct dev_pm_domain *domain電源域
描述
用於其電源狀態由驅動程式的執行時pm控制的GPU的助手函式。在GPU掛起後,需要呼叫處理程式以切斷GPU的電源。同樣,在GPU可以恢復之前,需要恢復電源。為此,此助手函式透過對處理程式的必要呼叫來擴充掛起/恢復功能。它只需要在電源開關與被斷電的裝置分開的平臺上呼叫。
公共結構¶
-
struct vga_switcheroo_handler¶
處理程式回撥
定義:
struct vga_switcheroo_handler {
int (*init)(void);
int (*switchto)(enum vga_switcheroo_client_id id);
int (*switch_ddc)(enum vga_switcheroo_client_id id);
int (*power_state)(enum vga_switcheroo_client_id id, enum vga_switcheroo_state state);
enum vga_switcheroo_client_id (*get_client_id)(struct pci_dev *pdev);
};
成員
init初始化處理程式。可選。當啟用vga_switcheroo時,即當兩個vga客戶端已註冊時,將呼叫此方法。它允許處理程式執行一些依賴於vga客戶端存在的延遲初始化。目前只有radeon和amdgpu驅動程式使用此方法。返回值將被忽略
switchto將輸出切換到給定客戶端。強制。對於非複用機器,這應該是一個空操作。返回0表示成功,否則表示失敗(在這種情況下,切換將被中止)
switch_ddc將DDC線路切換到給定客戶端。可選。成功時應返回先前的DDC所有者,失敗時返回負整數
power_state切斷或恢復給定客戶端的電源。可選。返回值將被忽略
get_client_id確定給定pci裝置是整合GPU還是獨立GPU。強制
描述
處理程式回撥。複用器本身。switchto和get_client_id方法是強制的,所有其他方法都可以設定為NULL。
-
struct vga_switcheroo_client_ops¶
客戶端回撥
定義:
struct vga_switcheroo_client_ops {
void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state);
void (*reprobe)(struct pci_dev *dev);
bool (*can_switch)(struct pci_dev *dev);
void (*gpu_bound)(struct pci_dev *dev, enum vga_switcheroo_client_id);
};
成員
set_gpu_state為卡執行相當於掛起/恢復的操作。強制。這不應切斷獨立GPU的電源,這是處理程式的工作
reprobe輪詢輸出。可選。這會在喚醒GPU並將輸出切換到GPU後呼叫
can_switch檢查裝置現在是否處於可以切換的位置。強制。如果使用者空間程序已開啟其裝置檔案之一,則客戶端應返回false
gpu_bound在GPU繫結時通知音訊客戶端客戶端ID。
描述
客戶端回撥。客戶端可以是GPU或GPU上的音訊裝置。set_gpu_state和can_switch方法是強制的,reprobe可以設定為NULL。對於音訊客戶端,reprobe成員是虛假的。OTOH,gpu_bound僅適用於音訊客戶端,而不適用於GPU客戶端。
公共常量¶
-
enum vga_switcheroo_handler_flags_t¶
處理程式標誌位掩碼
常量
VGA_SWITCHEROO_CAN_SWITCH_DDC處理程式是否能夠單獨切換DDC線路。這向客戶端發出訊號,表明它們應該呼叫
drm_get_edid_switcheroo()來探測EDIDVGA_SWITCHEROO_NEEDS_EDP_CONFIG處理程式是否無法單獨切換AUX通道。這向客戶端發出訊號,表明活動GPU需要訓練鏈路並將鏈路引數傳達給非活動GPU(透過vga_switcheroo調解)。然後,非活動GPU可以跳過AUX握手並使用這些預校準的值設定其輸出(DisplayPort規範v1.1a,第2.5.3.3節)
描述
處理程式標誌位掩碼。處理程式在向vga_switcheroo註冊時使用它來宣告其功能。
-
enum vga_switcheroo_client_id¶
客戶端識別符號
常量
VGA_SWITCHEROO_UNKNOWN_ID分配給vga客戶端的初始識別符號。確定id需要處理程式,因此GPU在vga_switcheroo_enable()中以延遲方式獲得其真實id
VGA_SWITCHEROO_IGD整合顯示卡裝置
VGA_SWITCHEROO_DIS獨立顯示卡裝置
VGA_SWITCHEROO_MAX_CLIENTS目前最多支援兩個GPU
描述
客戶端識別符號。音訊客戶端使用相同的識別符號&0x100。
-
enum vga_switcheroo_state¶
客戶端電源狀態
常量
VGA_SWITCHEROO_OFF關
VGA_SWITCHEROO_ON開
VGA_SWITCHEROO_NOT_FOUND客戶端未向vga_switcheroo註冊。僅在
vga_switcheroo_get_client_state()中使用,而vga_switcheroo_get_client_state()又僅從hda_intel.c呼叫
描述
客戶端電源狀態。
私有結構¶
-
struct vgasr_priv¶
vga_switcheroo私有資料
定義:
struct vgasr_priv {
bool active;
bool delayed_switch_active;
enum vga_switcheroo_client_id delayed_client_id;
struct dentry *debugfs_root;
int registered_clients;
struct list_head clients;
const struct vga_switcheroo_handler *handler;
enum vga_switcheroo_handler_flags_t handler_flags;
struct mutex mux_hw_lock;
int old_ddc_owner;
};
成員
active是否啟用vga_switcheroo。前提是註冊兩個GPU和一個處理程式
delayed_switch_active是否存在掛起的延遲切換
delayed_client_id掛起延遲切換的客戶端
debugfs_rootvga_switcheroo debugfs介面的目錄
registered_clients已註冊GPU的數量(僅計算vga客戶端,不計算音訊客戶端)
clients已註冊客戶端的列表
handler已註冊處理程式
handler_flags已註冊處理程式的標誌
mux_hw_lock保護複用器狀態(尤其是在臨時切換DDC線路時)
old_ddc_owner將在解鎖時切換回DDC線路的客戶端
描述
vga_switcheroo私有資料。目前每個系統僅支援一個vga_switcheroo例項。
-
struct vga_switcheroo_client¶
已註冊客戶端
定義:
struct vga_switcheroo_client {
struct pci_dev *pdev;
struct fb_info *fb_info;
enum vga_switcheroo_state pwr_state;
const struct vga_switcheroo_client_ops *ops;
enum vga_switcheroo_client_id id;
bool active;
bool driver_power_control;
struct list_head list;
struct pci_dev *vga_dev;
};
成員
pdev客戶端pci裝置
fb_info在切換時控制檯重新對映到的幀緩衝區
pwr_state如果使用手動電源控制,則為當前電源狀態。對於驅動程式電源控制,請呼叫vga_switcheroo_pwr_state()。
ops客戶端回撥
id客戶端識別符號。確定id需要處理程式,因此gpu最初分配了VGA_SWITCHEROO_UNKNOWN_ID,然後在vga_switcheroo_enable()中給出了它們的真實id
active當前輸出是否切換到此客戶端
driver_power_control電源狀態是否由驅動程式的執行時pm控制。如果為true,則將ON和OFF寫入vga_switcheroo debugfs介面是一個空操作,因此不會干擾執行時pm
list客戶端列表
vga_devpci裝置,指示哪個GPU繫結到當前音訊客戶端
描述
已註冊客戶端。客戶端可以是GPU或GPU上的音訊裝置。對於音訊客戶端,fb_info和active成員是虛假的。對於GPU客戶端,vga_dev是虛假的。
處理程式¶
apple-gmux處理程式¶
gmux是內置於MacBook Pro中的微控制器,用於支援雙GPU:pre-retinas上的Lattice XP2,pre-T2 retinas上的Renesas R4F2113。
在T2 Macbooks上,gmux是T2協處理器的SMC的一部分。SMC具有與NXP PCAL6524 GPIO擴充套件器的I2C連線,該擴充套件器啟用/停用獨立GPU的穩壓器,驅動顯示面板電源,並具有一個GPIO來切換eDP複用器。Intel CPU可以透過MMIO與gmux互動,類似於控制主SMC介面的方式。
(MacPro6,1 2013也有一個gmux,但是尚不清楚原因,因為它具有雙GPU,但沒有內建顯示器。)
gmux連線到南橋的LPC匯流排。根據微控制器的不同,其I/O埠的訪問方式也不同:訪問pre-retina gmux的驅動程式函式以_pio_作為字尾,pre-T2 retina gmux的驅動程式函式以_index_作為字尾,T2 Macs上的驅動程式函式以_mmio_作為字尾。
gmux還連線到南橋的GPIO引腳,因此能夠觸發ACPI GPE。ACPI名稱GMGP儲存此GPIO引腳的編號。在MBP5 2008/09上,它是Nvidia MCP79的GPIO引腳22,在以下幾代產品中,它是Intel PCH的GPIO引腳6,在MMIO gmux上,它是引腳21。
GPE僅表示發生了中斷,實際事件型別是透過讀取gmux暫存器來識別的。
除了GMGP名稱外,gmux的ACPI裝置還有兩種方法GMSP和GMLV。GMLV可能表示“GMUX級別”,並讀取GPIO的值,而GMSP可能表示“GMUX設定極性”,並且似乎寫入GPIO的值。在較新的Macbooks上(這是在MacBookPro14,3之前或之後的某個時間引入的),ACPI GPE方法區分OS型別:在Darwin上,僅發出通知訊號,而在其他OS上,讀取GPIO的值然後反轉。
由於Linux偽裝成Darwin,因此最終進入僅通知程式碼路徑。在MMIO gmux上,這似乎導致我們無法清除中斷,除非我們呼叫GMSP(0)。沒有這個,會湧現無法清除的狀態=0中斷。此問題似乎是MMIO gmux獨有的。
圖形複用器¶
在 pre-retina 型號上,兩個 GPU 的 LVDS 輸出都連線到 gmux,gmux 會將其中一個輸出複用到面板。gmux 的一個技巧是在切換時延長其輸出的消隱間隔,以使其與切換到的 GPU 同步。這允許使用者察覺不到的無閃爍切換(US 8,687,007 B2)。
在 retina 型號上,複用不再由 gmux 本身完成,而是由一個單獨的晶片完成,該晶片由 gmux 控制。該晶片有三個來源,分別是 NXP CBTL06142、TI HD3SS212 或 Pericom PI3VDP12412。面板使用 eDP 而不是 LVDS 驅動,因為 retina 解析度所需的畫素時鐘超過了 LVDS 的限制。
Pre-retina 型號能夠單獨切換面板的 DDC 引腳。這由 TI SN74LV4066A 處理,它由 gmux 控制。因此,非活動 GPU 可以在不切換整個面板的情況下探測面板的 EDID。Retina 型號缺少此功能,因為用於 eDP 複用的晶片無法單獨切換 AUX 通道(請參閱連結的資料表,Pericom 能夠做到,但未被使用)。但是,retina 面板在其 DPCD 中設定了 NO_AUX_HANDSHAKE_LINK_TRAINING 位,允許非活動 GPU 跳過 AUX 握手,並使用活動 GPU 預先校準的鏈路引數設定輸出。
外部 DP 埠僅在最初的兩代一體式 MacBook Pro 上完全可切換,即 MBP5 2008/09 和 MBP6 2010。這由 NXP CBTL06141 完成,它由 gmux 控制。它是 retina 型號上 eDP 複用器的前身,區別在於支援 2.7 與 5.4 Gbit/s。
以下幾代 MacBook Pro 用組合的 DP/Thunderbolt 埠取代了外部 DP 埠,並失去了在 GPU 之間切換它的能力,將其連線到獨立 GPU 或 Thunderbolt 控制器。奇怪的是,雖然完整的埠不再可切換,但 AUX 和 HPD 仍然可以透過 NXP CBTL03062(在 pre-retina 型號 MBP8 2011 和 MBP9 2012 上)或兩個 TI TS3DS10224(在 pre-T2 retina 型號上)在 gmux 的控制下切換。由於整合 GPU 缺少主鏈路,因此外部顯示器對其顯示為幻像,無法進行鏈路訓練。
gmux 接收所有顯示聯結器的 HPD 訊號,並在熱插拔時傳送中斷。在無法切換外部埠的幾代產品中,可以喚醒獨立 GPU 以驅動新連線的顯示器。在這些代產品上切換 AUX 的能力可以用於提高熱插拔檢測的可靠性,方法是讓整合 GPU 在獨立 GPU 休眠時輪詢埠,但目前我們沒有利用此功能。
我們對外部埠的切換策略是,在能夠完全切換它的幾代產品中,當向 vga_switcheroo 發出 IGD / DIS 命令時,埠與面板一起切換。因此,可以使用整合 GPU 在電池供電情況下驅動例如投影儀。如果需要更高的效能,使用者可以手動切換到獨立 GPU。
在所有較新的代產品中,外部埠只能由獨立 GPU 驅動。如果在面板切換到整合 GPU 時插入顯示器,兩個 GPU 都將被使用以獲得最大效能。為了降低功耗,使用者可以手動切換到獨立 GPU,從而掛起整合 GPU。
gmux 在啟動時的初始切換狀態可透過 EFI 變數 gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9(第 5 個位元組,1 = IGD,0 = DIS)配置。根據此設定,EFI 韌體告訴 gmux 切換面板和外部 DP 聯結器,併為所選 GPU 分配幀緩衝區。
電源控制¶
gmux 能夠切斷獨立 GPU 的電源。它會自動處理正確的序列,以拆卸和啟動核心電壓、VRAM 和 PCIe 的電源軌。
背光控制¶
在單 GPU MacBook 上,背光的 PWM 訊號由 GPU 生成。相比之下,在雙 GPU MacBook Pro 上,可以掛起任一 GPU 以節省能量。因此,PWM 訊號需要由單獨的背光碟機動程式生成,該驅動程式由 gmux 控制。最早的 MBP5 2008/09 代使用 TI LP8543 背光碟機動程式。較新的型號使用 TI LP8545 或 TI LP8548。
公共函式¶
引數
struct pnp_dev *pnp_dev要探測的裝置,如果為 NULL,則使用第一個匹配的裝置
enum apple_gmux_type *type_ret(透過引用)返回裝置的 apple_gmux_type
描述
透過實際探測來檢測是否存在受支援的 gmux 裝置。這避免了 apple_gmux_present() 在某些型號上返回的誤報。
返回值
如果檢測到受支援的 gmux ACPI 裝置,並且核心已配置 CONFIG_APPLE_GMUX,則為 true,否則為 false。
-
bool apple_gmux_present(void)¶
檢查是否存在 gmux ACPI 裝置
引數
void無引數
描述
驅動程式可以使用此功能來啟用特定於雙 GPU MacBook Pro 和 Mac Pro 的怪癖,例如延遲探測、執行時電源管理和背光。
返回值
如果存在 gmux ACPI 裝置並且核心已配置 CONFIG_APPLE_GMUX,則為 true,否則為 false。