14 #define INTEL_DSM_REVISION_ID 1
16 #define INTEL_DSM_FN_SUPPORTED_FUNCTIONS 0
17 #define INTEL_DSM_FN_PLATFORM_MUX_INFO 1
19 static struct intel_dsm_priv {
23 static const u8 intel_dsm_guid[] = {
24 0xd3, 0x73, 0xd8, 0x7e,
28 0x0f, 0x13, 0x17, 0xb0, 0x1c, 0x2c
43 params[0].buffer.length =
sizeof(intel_dsm_guid);
44 params[0].buffer.pointer = (
char *)intel_dsm_guid;
54 DRM_DEBUG_DRIVER(
"failed to evaluate _DSM: %d\n", ret);
67 if (obj->
buffer.length == 4) {
68 result = (obj->
buffer.pointer[0] |
69 (obj->
buffer.pointer[1] << 8) |
70 (obj->
buffer.pointer[2] << 16) |
71 (obj->
buffer.pointer[3] << 24));
78 if (result == 0x80000002)
85 static char *intel_dsm_port_name(
u8 id)
103 return "DisplayPort_A";
105 return "DisplayPort_B";
107 return "DisplayPort_C";
109 return "DisplayPort_D";
121 static char *intel_dsm_mux_type(
u8 type)
127 return "No MUX, iGPU only";
129 return "No MUX, dGPU only";
131 return "MUXed between iGPU and dGPU";
137 static void intel_dsm_platform_mux_info(
void)
148 params[0].buffer.length =
sizeof(intel_dsm_guid);
149 params[0].buffer.pointer = (
char *)intel_dsm_guid;
155 params[3].integer.value = 0;
160 DRM_DEBUG_DRIVER(
"failed to evaluate _DSM: %d\n", ret);
168 DRM_DEBUG_DRIVER(
"MUX info connectors: %lld\n",
169 (
unsigned long long)connector_count->
integer.value);
170 for (i = 1; i < pkg->
package.count; i++) {
175 DRM_DEBUG_DRIVER(
"Connector id: 0x%016llx\n",
176 (
unsigned long long)connector_id->
integer.value);
177 DRM_DEBUG_DRIVER(
" port id: %s\n",
178 intel_dsm_port_name(info->
buffer.pointer[0]));
179 DRM_DEBUG_DRIVER(
" display mux info: %s\n",
180 intel_dsm_mux_type(info->
buffer.pointer[1]));
181 DRM_DEBUG_DRIVER(
" aux/dc mux info: %s\n",
182 intel_dsm_mux_type(info->
buffer.pointer[2]));
183 DRM_DEBUG_DRIVER(
" hpd mux info: %s\n",
184 intel_dsm_mux_type(info->
buffer.pointer[3]));
192 static bool intel_dsm_pci_probe(
struct pci_dev *pdev)
198 dhandle = DEVICE_ACPI_HANDLE(&pdev->
dev);
204 DRM_DEBUG_KMS(
"no _DSM method for intel device\n");
210 DRM_DEBUG_KMS(
"failed to get supported _DSM functions\n");
214 intel_dsm_priv.dhandle = dhandle;
216 intel_dsm_platform_mux_info();
220 static bool intel_dsm_detect(
void)
222 char acpi_method_name[255] = { 0 };
225 bool has_dsm =
false;
230 has_dsm |= intel_dsm_pci_probe(pdev);
233 if (vga_count == 2 && has_dsm) {
235 DRM_DEBUG_DRIVER(
"VGA switcheroo: detected DSM switching method %s handle\n",
245 if (!intel_dsm_detect())