mark.kette...@xs4all.nl (Mark Kettenis), 2017.07.09 (Sun) 23:41 (CEST): > Diff below publishes a "Backlight" property that can be used to get > and set the backlight associated with a particular output. This > property can easily be exported by the X11 graphics drivers trough the > RandR protocol. A future diff will let the "modesetting" driver do > this and make xbacklight(1) work.
xbacklight(1) works again, though I did not expect that after reading your message above. I used the snapshot "#93: Thu Jul 6 15:41:21 MDT 2017", updated src, applied your patch and compiled/installed/booted kernel. BTW, I noticed that xrandr outputs were formerly named like "LVDS1", now they follow the format of "LVDS-1". Is this part of the inteldrm changes and is going to stay? Thanks! Marcus > Index: dev/pci/drm/drm_crtc.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/drm_crtc.c,v > retrieving revision 1.25 > diff -u -p -r1.25 drm_crtc.c > --- dev/pci/drm/drm_crtc.c 1 Jul 2017 16:00:25 -0000 1.25 > +++ dev/pci/drm/drm_crtc.c 9 Jul 2017 21:32:53 -0000 > @@ -4049,6 +4049,23 @@ int drm_object_property_get_value(struct > { > int i; > > +#ifdef __OpenBSD__ > + if (obj->type == DRM_MODE_OBJECT_CONNECTOR) { > + struct drm_connector *connector = obj_to_connector(obj); > + > + if (property == connector->backlight_property) { > + struct backlight_device *bd = > + connector->backlight_device; > + > + if (bd->props.type == BACKLIGHT_FIRMWARE) > + *val = bd->ops->get_brightness(bd); > + else > + *val = bd->props.brightness; > + return 0; > + } > + } > +#endif > + > /* read-only properties bypass atomic mechanism and still store > * their value in obj->properties->values[].. mostly to avoid > * having to deal w/ EDID and similar props in atomic paths: > @@ -4840,6 +4857,12 @@ static int drm_mode_connector_set_obj_pr > ret = 0; > if (connector->funcs->dpms) > ret = (*connector->funcs->dpms)(connector, (int)value); > +#ifdef __OpenBSD__ > + } else if (property == connector->backlight_property) { > + ret = 0; > + connector->backlight_device->props.brightness = value; > + backlight_schedule_update_status(connector->backlight_device); > +#endif > } else if (connector->funcs->set_property) > ret = connector->funcs->set_property(connector, property, > value); > > Index: dev/pci/drm/drm_crtc.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/drm_crtc.h,v > retrieving revision 1.10 > diff -u -p -r1.10 drm_crtc.h > --- dev/pci/drm/drm_crtc.h 1 Jul 2017 16:00:25 -0000 1.10 > +++ dev/pci/drm/drm_crtc.h 9 Jul 2017 21:32:54 -0000 > @@ -741,6 +741,11 @@ struct drm_connector { > uint8_t num_h_tile, num_v_tile; > uint8_t tile_h_loc, tile_v_loc; > uint16_t tile_h_size, tile_v_size; > + > +#ifdef __OpenBSD__ > + struct backlight_device *backlight_device; > + struct drm_property *backlight_property; > +#endif > }; > > /** > Index: dev/pci/drm/drm_linux.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v > retrieving revision 1.14 > diff -u -p -r1.14 drm_linux.c > --- dev/pci/drm/drm_linux.c 5 Jul 2017 20:30:13 -0000 1.14 > +++ dev/pci/drm/drm_linux.c 9 Jul 2017 21:32:54 -0000 > @@ -697,6 +697,12 @@ acpi_get_table_with_size(const char *sig > > #endif > > +void > +backlight_do_update_status(void *arg) > +{ > + backlight_update_status(arg); > +} > + > struct backlight_device * > backlight_device_register(const char *name, void *kdev, void *data, > const struct backlight_ops *ops, struct backlight_properties *props) > @@ -707,6 +713,8 @@ backlight_device_register(const char *na > bd->ops = ops; > bd->props = *props; > bd->data = data; > + > + task_set(&bd->task, backlight_do_update_status, bd); > > return bd; > } > @@ -715,4 +723,10 @@ void > backlight_device_unregister(struct backlight_device *bd) > { > free(bd, M_DRM, sizeof(*bd)); > +} > + > +void > +backlight_schedule_update_status(struct backlight_device *bd) > +{ > + task_add(systq, &bd->task); > } > Index: dev/pci/drm/drm_linux.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.h,v > retrieving revision 1.53 > diff -u -p -r1.53 drm_linux.h > --- dev/pci/drm/drm_linux.h 5 Jul 2017 20:30:13 -0000 1.53 > +++ dev/pci/drm/drm_linux.h 9 Jul 2017 21:32:54 -0000 > @@ -1917,12 +1917,14 @@ struct backlight_ops { > struct backlight_device { > const struct backlight_ops *ops; > struct backlight_properties props; > + struct task task; > void *data; > }; > > #define bl_get_data(bd) (bd)->data > > -#define BACKLIGHT_RAW 0 > +#define BACKLIGHT_RAW 0 > +#define BACKLIGHT_FIRMWARE 1 > > struct backlight_device *backlight_device_register(const char *, void *, > void *, const struct backlight_ops *, struct backlight_properties *); > @@ -1932,7 +1934,9 @@ static inline void > backlight_update_status(struct backlight_device *bd) > { > bd->ops->update_status(bd); > -}; > +} > + > +void backlight_schedule_update_status(struct backlight_device *); > > #define MIPI_DSI_V_SYNC_START 0x01 > #define MIPI_DSI_V_SYNC_END 0x11 > Index: dev/pci/drm/i915/i915_drv.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v > retrieving revision 1.104 > diff -u -p -r1.104 i915_drv.c > --- dev/pci/drm/i915/i915_drv.c 5 Jul 2017 20:30:13 -0000 1.104 > +++ dev/pci/drm/i915/i915_drv.c 9 Jul 2017 21:32:54 -0000 > @@ -2092,6 +2092,32 @@ inteldrm_burner_cb(void *arg1) > drm_fb_helper_blank(dev_priv->burner_fblank, helper->fbdev); > } > > +int > +inteldrm_backlight_update_status(struct backlight_device *bd) > +{ > + struct wsdisplay_param dp; > + > + dp.param = WSDISPLAYIO_PARAM_BRIGHTNESS; > + dp.curval = bd->props.brightness; > + ws_set_param(&dp); > + return 0; > +} > + > +int > +inteldrm_backlight_get_brightness(struct backlight_device *bd) > +{ > + struct wsdisplay_param dp; > + > + dp.param = WSDISPLAYIO_PARAM_BRIGHTNESS; > + ws_get_param(&dp); > + return dp.curval; > +} > + > +const struct backlight_ops inteldrm_backlight_ops = { > + .update_status = inteldrm_backlight_update_status, > + .get_brightness = inteldrm_backlight_get_brightness > +}; > + > int inteldrm_match(struct device *, void *, void *); > void inteldrm_attach(struct device *, struct device *, void *); > int inteldrm_detach(struct device *, int); > @@ -2106,6 +2132,7 @@ struct cfdriver inteldrm_cd = { > 0, "inteldrm", DV_DULL > }; > > +void inteldrm_init_backlight(struct inteldrm_softc *); > int inteldrm_intr(void *); > > int > @@ -2126,7 +2153,6 @@ inteldrm_attach(struct device *parent, s > struct pci_attach_args *pa = aux; > const struct drm_pcidev *id; > struct intel_device_info *info, *device_info; > - struct intel_connector *intel_connector; > struct rasops_info *ri = &dev_priv->ro; > struct wsemuldisplaydev_attach_args aa; > extern int vga_console_attached; > @@ -2242,18 +2268,7 @@ inteldrm_attach(struct device *parent, s > > intel_fbdev_restore_mode(dev); > > - /* Grab backlight from the first connector that has one. */ > - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); > - list_for_each_entry(intel_connector, &dev->mode_config.connector_list, > - base.head) { > - struct intel_panel *panel = &intel_connector->panel; > - > - if (panel->backlight.present) { > - dev_priv->backlight = panel->backlight.device; > - break; > - } > - } > - drm_modeset_unlock(&dev->mode_config.connection_mutex); > + inteldrm_init_backlight(dev_priv); > > ri->ri_flg = RI_CENTER | RI_WRONLY | RI_VCONS | RI_CLEAR; > ri->ri_hw = dev_priv; > @@ -2327,6 +2342,85 @@ inteldrm_activate(struct device *self, i > } > > return (rv); > +} > + > +void > +inteldrm_native_backlight(struct inteldrm_softc *dev_priv) > +{ > + struct drm_device *dev = dev_priv->dev; > + struct intel_connector *intel_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; > + > + if (!panel->backlight.present) > + continue; > + > + 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); > + > + /* > + * Use backlight from the first connector that has one > + * for wscons(4). > + */ > + if (dev_priv->backlight == NULL) > + dev_priv->backlight = bd; > + } > +} > + > +void > +inteldrm_firmware_backlight(struct inteldrm_softc *dev_priv, > + struct wsdisplay_param *dp) > +{ > + struct drm_device *dev = dev_priv->dev; > + struct intel_connector *intel_connector; > + struct backlight_properties props; > + struct backlight_device *bd; > + > + memset(&props, 0, sizeof(props)); > + props.type = BACKLIGHT_FIRMWARE; > + props.brightness = dp->curval; > + bd = backlight_device_register(dev->device.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; > + > + if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS && > + connector->connector_type != DRM_MODE_CONNECTOR_eDP && > + connector->connector_type != DRM_MODE_CONNECTOR_DSI) > + continue; > + > + 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); > + } > +} > + > +void > +inteldrm_init_backlight(struct inteldrm_softc *dev_priv) > +{ > + struct drm_device *dev = dev_priv->dev; > + 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 > > > !DSPAM:5962a34a177071238424933! >