diff options
author | kettenis <kettenis@openbsd.org> | 2020-06-22 14:26:23 +0000 |
---|---|---|
committer | kettenis <kettenis@openbsd.org> | 2020-06-22 14:26:23 +0000 |
commit | c22bbf6dec62ada7da550feed8e0d5ad21553628 (patch) | |
tree | c0ada77eb82834a1e68f16db0ea82ed51da41cfe | |
parent | apart from the lock wait_queue_head struct is unused so replace it (diff) | |
download | wireguard-openbsd-c22bbf6dec62ada7da550feed8e0d5ad21553628.tar.xz wireguard-openbsd-c22bbf6dec62ada7da550feed8e0d5ad21553628.zip |
Some connectors attach late when the drm driver is registers. For
that reason we have to delay attaching Backlight properties to those
connectors until after drm driver registration. However the drm midlayer
code now warns about attaching new properties to connectors after
driver registration. So add some workarounds to suppress these
warning messages.
Figured out by jcs@
ok jsg@, jcs@
-rw-r--r-- | sys/dev/pci/drm/i915/i915_drv.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/sys/dev/pci/drm/i915/i915_drv.c b/sys/dev/pci/drm/i915/i915_drv.c index 1f8d92140f6..647b3471cd3 100644 --- a/sys/dev/pci/drm/i915/i915_drv.c +++ b/sys/dev/pci/drm/i915/i915_drv.c @@ -1132,12 +1132,12 @@ int i915_driver_probe(struct drm_i915_private *i915, const struct pci_device_id if (ret < 0) goto out_cleanup_irq; + i915_driver_register(i915); + #ifdef __OpenBSD__ inteldrm_init_backlight(i915); #endif - i915_driver_register(i915); - enable_rpm_wakeref_asserts(&i915->runtime_pm); i915_welcome_messages(i915); @@ -2668,23 +2668,37 @@ void inteldrm_native_backlight(struct inteldrm_softc *dev_priv) { struct drm_device *dev = &dev_priv->drm; - struct intel_connector *intel_connector; + struct drm_connector_list_iter conn_iter; + struct drm_connector *connector; - list_for_each_entry(intel_connector, - &dev->mode_config.connector_list, base.head) { - struct drm_connector *connector = &intel_connector->base; - struct intel_panel *panel = &intel_connector->panel; - struct backlight_device *bd = panel->backlight.device; + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { + struct intel_connector *intel_connector; + struct intel_panel *panel; + struct backlight_device *bd; + + if (connector->registration_state != DRM_CONNECTOR_REGISTERED) + continue; + + intel_connector = to_intel_connector(connector); + panel = &intel_connector->panel; + bd = panel->backlight.device; if (!panel->backlight.present || bd == NULL) continue; + dev->registered = false; + connector->registration_state = DRM_CONNECTOR_UNREGISTERED; + connector->backlight_device = bd; connector->backlight_property = drm_property_create_range(dev, 0, "Backlight", 0, bd->props.max_brightness); drm_object_attach_property(&connector->base, connector->backlight_property, bd->props.brightness); + connector->registration_state = DRM_CONNECTOR_REGISTERED; + dev->registered = true; + /* * Use backlight from the first connector that has one * for wscons(4). @@ -2692,6 +2706,7 @@ inteldrm_native_backlight(struct inteldrm_softc *dev_priv) if (dev_priv->backlight == NULL) dev_priv->backlight = bd; } + drm_connector_list_iter_end(&conn_iter); } void @@ -2699,7 +2714,8 @@ inteldrm_firmware_backlight(struct inteldrm_softc *dev_priv, struct wsdisplay_param *dp) { struct drm_device *dev = &dev_priv->drm; - struct intel_connector *intel_connector; + struct drm_connector_list_iter conn_iter; + struct drm_connector *connector; struct backlight_properties props; struct backlight_device *bd; @@ -2709,21 +2725,29 @@ inteldrm_firmware_backlight(struct inteldrm_softc *dev_priv, bd = backlight_device_register(dev->dev->dv_xname, NULL, NULL, &inteldrm_backlight_ops, &props); - list_for_each_entry(intel_connector, - &dev->mode_config.connector_list, base.head) { - struct drm_connector *connector = &intel_connector->base; - + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS && connector->connector_type != DRM_MODE_CONNECTOR_eDP && connector->connector_type != DRM_MODE_CONNECTOR_DSI) continue; + if (connector->registration_state != DRM_CONNECTOR_REGISTERED) + continue; + + dev->registered = false; + connector->registration_state = DRM_CONNECTOR_UNREGISTERED; + connector->backlight_device = bd; connector->backlight_property = drm_property_create_range(dev, 0, "Backlight", dp->min, dp->max); drm_object_attach_property(&connector->base, connector->backlight_property, dp->curval); + + connector->registration_state = DRM_CONNECTOR_REGISTERED; + dev->registered = true; } + drm_connector_list_iter_end(&conn_iter); } void @@ -2732,15 +2756,11 @@ inteldrm_init_backlight(struct inteldrm_softc *dev_priv) struct drm_device *dev = &dev_priv->drm; struct wsdisplay_param dp; - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); - dp.param = WSDISPLAYIO_PARAM_BRIGHTNESS; if (ws_get_param && ws_get_param(&dp) == 0) inteldrm_firmware_backlight(dev_priv, &dp); else inteldrm_native_backlight(dev_priv); - - drm_modeset_unlock(&dev->mode_config.connection_mutex); } int |