Hi,

FWIW, I've been successfully using the following patch for quite some
time. It allows to set the brightness on Intel hw with wsconsctl and
xrandr --output XXX --set BACKLIGHT YYY.

It doesn't use ACPI though, but relies on the code in the DRM/KMS kernel
driver.

Regards,
 Aymeric

diff -r 6b4d07813856 sys/external/bsd/drm2/dist/drm/i915/intel_panel.c
--- a/sys/external/bsd/drm2/dist/drm/i915/intel_panel.c Sun Mar 07 19:06:20 
2021 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/intel_panel.c Thu Mar 11 14:52:04 
2021 +0100
@@ -432,7 +432,7 @@
        return target_val;
 }
 
-#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
+#if 1
 /* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
 static inline u32 scale_user_to_hw(struct intel_connector *connector,
                                   u32 user_level, u32 user_max)
@@ -677,9 +677,11 @@
        panel->backlight.set(connector, level);
 }
 
-#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
+#if 1
+void intel_panel_set_backlight(struct intel_connector *, u32, u32);
+
 /* set backlight brightness to level in range [0..max], scaling wrt hw min */
-static void intel_panel_set_backlight(struct intel_connector *connector,
+void intel_panel_set_backlight(struct intel_connector *connector,
                                      u32 user_level, u32 user_max)
 {
        struct drm_device *dev = connector->base.dev;
diff -r 6b4d07813856 sys/external/bsd/drm2/i915drm/intelfb.c
--- a/sys/external/bsd/drm2/i915drm/intelfb.c   Sun Mar 07 19:06:20 2021 +0000
+++ b/sys/external/bsd/drm2/i915drm/intelfb.c   Thu Mar 11 14:52:04 2021 +0100
@@ -55,12 +55,18 @@
 
 static paddr_t intelfb_drmfb_mmapfb(struct drmfb_softc *, off_t, int);
 
+static int     intelfb_get_brightness(void *, int *);
+static int     intelfb_set_brightness(void *, int);
+static int     intelfb_upd_brightness(void *, int);
+
 struct intelfb_softc {
        struct drmfb_softc              sc_drmfb; /* XXX Must be first.  */
        device_t                        sc_dev;
        struct intelfb_attach_args      sc_ifa;
        bus_space_handle_t              sc_fb_bsh;
        struct i915drmkms_task          sc_attach_task;
+       struct genfb_parameter_callback genfb_brightness_params;
+       int                             current_brightness;
        bool                            sc_mapped:1;
        bool                            sc_scheduled:1;
        bool                            sc_attached:1;
@@ -97,6 +103,8 @@
        sc->sc_scheduled = false;
        sc->sc_attached = false;
 
+       sc->current_brightness = 255;
+
        aprint_naive("\n");
        aprint_normal("\n");
 
@@ -166,6 +174,7 @@
        struct intelfb_softc *const sc = container_of(task,
            struct intelfb_softc, sc_attach_task);
        const struct intelfb_attach_args *const ifa = &sc->sc_ifa;
+       prop_dictionary_t dict = device_properties(sc->sc_dev);
        const struct drmfb_attach_args da = {
                .da_dev = sc->sc_dev,
                .da_fb_helper = ifa->ifa_fb_helper,
@@ -176,6 +185,17 @@
        };
        int error;
 
+       sc->genfb_brightness_params.gpc_cookie = sc;
+       sc->genfb_brightness_params.gpc_get_parameter = intelfb_get_brightness;
+       sc->genfb_brightness_params.gpc_set_parameter = intelfb_set_brightness;
+       sc->genfb_brightness_params.gpc_upd_parameter = intelfb_upd_brightness;
+
+       if (!prop_dictionary_set_uint64(dict, "brightness_callback",
+               (uint64_t) (intptr_t) &sc->genfb_brightness_params)) {
+               aprint_error_dev(sc->sc_dev,
+                       "Could not set brightness callback");
+       }
+
        error = drmfb_attach(&sc->sc_drmfb, &da);
        if (error) {
                aprint_error_dev(sc->sc_dev, "failed to attach drmfb: %d\n",
@@ -218,3 +238,45 @@
            i915_gem_obj_ggtt_offset(fbdev->fb->obj) + offset,
            prot, BUS_SPACE_MAP_PREFETCHABLE);
 }
+
+static int
+intelfb_get_brightness(void *cookie, int *valp) {
+       struct intelfb_softc *sc = cookie;
+
+       *valp = sc->current_brightness;
+
+       return 0;
+}
+
+void intel_panel_set_backlight(struct intel_connector *, u32, u32);
+
+static int
+intelfb_set_brightness(void *cookie, int val) {
+       struct intelfb_softc *sc = cookie;
+       struct drm_fb_helper *const fb_helper = sc->sc_ifa.ifa_fb_helper;
+       unsigned i;
+
+       sc->current_brightness = val;
+
+       for (i = 0; i < fb_helper->connector_count; i++) {
+               struct intel_connector *const connector =
+                   (struct intel_connector *const)
+                       fb_helper->connector_info[i]->connector;
+               intel_panel_set_backlight(connector, val, 255);
+       }
+
+       return 0;
+}
+
+static int
+intelfb_upd_brightness(void *cookie, int delta) {
+       struct intelfb_softc *sc = cookie;
+       int new_val = sc->current_brightness + delta;
+
+       if (new_val < 0)
+               new_val = 0;
+       if (new_val > 255)
+               new_val = 255;
+
+       return intelfb_set_brightness(cookie, new_val);
+}

Reply via email to