staticchar *intel_dsm_port_name(u8 id)
{ switch (id) { case 0: return"Reserved"; case 1: return"Analog VGA"; case 2: return"LVDS"; case 3: return"Reserved"; case 4: return"HDMI/DVI_B"; case 5: return"HDMI/DVI_C"; case 6: return"HDMI/DVI_D"; case 7: return"DisplayPort_A"; case 8: return"DisplayPort_B"; case 9: return"DisplayPort_C"; case 0xa: return"DisplayPort_D"; case 0xb: case 0xc: case 0xd: return"Reserved"; case 0xe: return"WiDi"; default: return"bad type";
}
}
staticchar *intel_dsm_mux_type(u8 type)
{ switch (type) { case 0: return"unknown"; case 1: return"No MUX, iGPU only"; case 2: return"No MUX, dGPU only"; case 3: return"MUXed between iGPU and dGPU"; default: return"bad type";
}
}
staticvoid intel_dsm_platform_mux_info(acpi_handle dhandle)
{ int i; union acpi_object *pkg, *connector_count;
pkg = acpi_evaluate_dsm_typed(dhandle, &intel_dsm_guid,
INTEL_DSM_REVISION_ID, INTEL_DSM_FN_PLATFORM_MUX_INFO,
NULL, ACPI_TYPE_PACKAGE); if (!pkg) {
DRM_DEBUG_DRIVER("failed to evaluate _DSM\n"); return;
}
if (!pkg->package.count) {
DRM_DEBUG_DRIVER("no connection in _DSM\n"); return;
}
connector_count = &pkg->package.elements[0];
DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",
(unsignedlonglong)connector_count->integer.value); for (i = 1; i < pkg->package.count; i++) { union acpi_object *obj = &pkg->package.elements[i]; union acpi_object *connector_id; union acpi_object *info;
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < 2) {
DRM_DEBUG_DRIVER("Invalid object for MUX #%d\n", i); continue;
}
connector_id = &obj->package.elements[0];
info = &obj->package.elements[1]; if (info->type != ACPI_TYPE_BUFFER || info->buffer.length < 4) {
DRM_DEBUG_DRIVER("Invalid info for MUX obj #%d\n", i); continue;
}
switch (connector->base.connector_type) { case DRM_MODE_CONNECTOR_VGA: case DRM_MODE_CONNECTOR_DVIA:
display_type = ACPI_DISPLAY_TYPE_VGA; break; case DRM_MODE_CONNECTOR_Composite: case DRM_MODE_CONNECTOR_SVIDEO: case DRM_MODE_CONNECTOR_Component: case DRM_MODE_CONNECTOR_9PinDIN: case DRM_MODE_CONNECTOR_TV:
display_type = ACPI_DISPLAY_TYPE_TV; break; case DRM_MODE_CONNECTOR_DVII: case DRM_MODE_CONNECTOR_DVID: case DRM_MODE_CONNECTOR_DisplayPort: case DRM_MODE_CONNECTOR_HDMIA: case DRM_MODE_CONNECTOR_HDMIB:
display_type = ACPI_DISPLAY_TYPE_EXTERNAL_DIGITAL; break; case DRM_MODE_CONNECTOR_LVDS: case DRM_MODE_CONNECTOR_eDP: case DRM_MODE_CONNECTOR_DSI:
display_type = ACPI_DISPLAY_TYPE_INTERNAL_DIGITAL; break; case DRM_MODE_CONNECTOR_Unknown: case DRM_MODE_CONNECTOR_VIRTUAL:
display_type = ACPI_DISPLAY_TYPE_OTHER; break; default:
MISSING_CASE(connector->base.connector_type);
display_type = ACPI_DISPLAY_TYPE_OTHER; break;
}
/* Populate the ACPI IDs for all connectors for a given drm_device */
drm_connector_list_iter_begin(display->drm, &conn_iter);
for_each_intel_connector_iter(connector, &conn_iter) {
u32 device_id, type;
device_id = acpi_display_type(connector);
/* Use display type specific display index. */
type = (device_id & ACPI_DISPLAY_TYPE_MASK)
>> ACPI_DISPLAY_TYPE_SHIFT;
device_id |= display_index[type]++ << ACPI_DISPLAY_INDEX_SHIFT;
/* NOTE: The connector order must be final before this is called. */ void intel_acpi_assign_connector_fwnodes(struct intel_display *display)
{ struct drm_device *drm_dev = display->drm; struct drm_connector_list_iter conn_iter; struct fwnode_handle *fwnode = NULL; struct drm_connector *connector; struct acpi_device *adev;
drm_connector_list_iter_begin(drm_dev, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) { /* Always getting the next, even when the last was not used. */
fwnode = device_get_next_child_node(drm_dev->dev, fwnode); if (!fwnode) break;
switch (connector->connector_type) { case DRM_MODE_CONNECTOR_LVDS: case DRM_MODE_CONNECTOR_eDP: case DRM_MODE_CONNECTOR_DSI: /* * Integrated displays have a specific address 0x1f on * most Intel platforms, but not on all of them.
*/
adev = acpi_find_child_device(ACPI_COMPANION(drm_dev->dev),
0x1f, 0); if (adev) {
connector->fwnode =
fwnode_handle_get(acpi_fwnode_handle(adev)); break;
}
fallthrough; default:
connector->fwnode = fwnode_handle_get(fwnode); break;
}
}
drm_connector_list_iter_end(&conn_iter); /* * device_get_next_child_node() takes a reference on the fwnode, if * we stopped iterating because we are out of connectors we need to * put this, otherwise fwnode is NULL and the put is a no-op.
*/
fwnode_handle_put(fwnode);
}
/* * If i915 is driving an internal panel without registering its native * backlight handler try to register the acpi_video backlight. * For panels not driven by i915 another GPU driver may still register * a native backlight later and acpi_video_register_backlight() should * only be called after any native backlights have been registered.
*/
drm_connector_list_iter_begin(display->drm, &conn_iter);
drm_for_each_connector_iter(connector, &conn_iter) { struct intel_panel *panel = &to_intel_connector(connector)->panel;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.