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!
> 

Reply via email to