소스 검색

nouveau/acpi: hook up to the MXM method for mux switching.

this hooks up nouveau to the MXM mux switching method.

With this in place I can switch the LVDS MUX on my T410s,
I expect we need a bit more work for other laptops.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Dave Airlie 14 년 전
부모
커밋
8116188fde
2개의 변경된 파일12개의 추가작업 그리고 0개의 파일을 삭제
  1. 1 0
      drivers/gpu/drm/nouveau/Kconfig
  2. 11 0
      drivers/gpu/drm/nouveau/nouveau_acpi.c

+ 1 - 0
drivers/gpu/drm/nouveau/Kconfig

@@ -11,6 +11,7 @@ config DRM_NOUVEAU
 	select FRAMEBUFFER_CONSOLE if !EXPERT
 	select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT
 	select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT
+	select MXM_WMI if ACPI
 	help
 	  Choose this option for open-source nVidia support.
 

+ 11 - 0
drivers/gpu/drm/nouveau/nouveau_acpi.c

@@ -4,6 +4,8 @@
 #include <acpi/acpi_drivers.h>
 #include <acpi/acpi_bus.h>
 #include <acpi/video.h>
+#include <acpi/acpi.h>
+#include <linux/mxm-wmi.h>
 
 #include "drmP.h"
 #include "drm.h"
@@ -92,6 +94,7 @@ static int nouveau_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
 
 static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
 {
+	mxm_wmi_call_mxds(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
 	return nouveau_dsm(handle, NOUVEAU_DSM_LED, mux_id, NULL);
 }
 
@@ -180,6 +183,14 @@ static bool nouveau_dsm_detect(void)
 	struct pci_dev *pdev = NULL;
 	int has_dsm = 0;
 	int vga_count = 0;
+	bool guid_valid;
+
+	/* lookup the GUID */
+	guid_valid = mxm_wmi_supported();
+	if (!guid_valid)
+		return false;
+
+	printk("MXM GUID detected in BIOS\n");
 
 	while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
 		vga_count++;