Date: Wed, 21 Oct 2015 21:09:52 +0200 From: "Ranjan1018 ." <214748mv@gmail.com> To: =?UTF-8?B?SmVhbi1Tw6liYXN0aWVuIFDDqWRyb24=?= <dumbbell@freebsd.org>, "freebsd-x11@freebsd.org" <freebsd-x11@freebsd.org> Subject: [patch] Testing the new i915 driver (rev. 3820047) Message-ID: <CACyC=qa6M5Bna=wwO4S95RWzDngExVYGD0ifX6nDB=KdzKYrLQ@mail.gmail.com> In-Reply-To: <2055370.RNj6gJ7qL2@asbach.renzel.net> References: <56224C70.8040906@FreeBSD.org> <28961.174542974$1445329913@news.gmane.org> <2055370.RNj6gJ7qL2@asbach.renzel.net>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Backlight support for the i915 driver via sysctl.
Instructions:
Install the attached patch :
# cd freebsd-base-graphics
# patch -p2 < i915_backlight.patch
Rebuild, install and reboot the new kernel.
Now you can control the backlight of your laptop via sysctl:
set backlight to 10%
# sysctl hw.dri.0.i915_backlight=10
hw.dri.0.i915_backlight: 9 -> 10
set backlight to 20%
# sysctl hw.dri.0.i915_backlight=20
hw.dri.0.i915_backlight: 10 -> 20
increment the backlight
# sysctl -n hw.dri.0.i915_backlight=1000
20 -> 25
decrement the backlight
# sysctl -n hw.dri.0.i915_backlight=-1000
25 -> 20
decrement the backlight
# sysctl hw.dri.0.i915_backlight=-1000
hw.dri.0.i915_backlight: 20 -> 16
You can also set the initial backlight at boot in /boot/loader.conf :
drm.i915.init_backlight=10
or via /etc/sysctl.conf
hw.dri.0.i915_backlight=10
set a 10% backlight.
I am running this patch on current for months on my Samsung Samsung ATIV
Book 2 270E5E with Intel HD Graphics 4000.
Thanks,
Maurizio
[-- Attachment #2 --]
--- usr/src/sys/dev/drm2/i915/i915_debug.c.orig 2015-03-18 11:09:13.000000000 +0100
+++ usr/src/sys/dev/drm2/i915/i915_debug.c working copy
@@ -38,6 +38,8 @@
#include <sys/sysctl.h>
+#define NUM_ELEMENTS(array) (sizeof(array) / sizeof(array[0]))
+
enum {
ACTIVE_LIST,
FLUSHING_LIST,
@@ -45,6 +47,9 @@
PINNED_LIST,
};
+static int brightness_levels[] = {1, 2, 4, 6, 9, 12, 16, 20, 25, 30, 36,
+ 43, 51, 60, 70, 80, 90, 100};
+
static const char *yesno(int v)
{
return v ? "yes" : "no";
@@ -1571,6 +1576,72 @@
return (0);
}
+static int brightness_incr(int curr)
+{
+ int i;
+ for (i = 0; i < NUM_ELEMENTS(brightness_levels) - 1; ++i)
+ if (curr < brightness_levels[i])
+ break;
+ return brightness_levels[i];
+}
+
+static int brightness_decr(int curr)
+{
+ int i;
+ for (i = NUM_ELEMENTS(brightness_levels) - 1; i > 0; --i)
+ if (brightness_levels[i] < curr)
+ break;
+ return brightness_levels[i];
+}
+
+static int i915_backlight(SYSCTL_HANDLER_ARGS)
+{
+ struct drm_device *dev;
+ drm_i915_private_t *dev_priv;
+ int error, cur_level, level;
+ u32 val, cur, min, max;
+
+ dev = arg1;
+ dev_priv = dev->dev_private;
+ if(dev_priv == NULL)
+ return (EBUSY);
+ DRM_LOCK(dev);
+ cur = intel_panel_get_backlight(dev);
+ max = intel_panel_get_max_backlight(dev);
+ DRM_UNLOCK(dev);
+
+ if (max == 0)
+ return (ENODEV);
+
+ // XXX specific devices, works fine on ivy bridge though
+ cur_level = level = (max / 2 + 100 * cur) / max;
+ error = sysctl_handle_int(oidp, &level, 0, req);
+ if (error || !req->newptr)
+ return (error);
+
+ if (level == 1000)
+ val = (max / 100 + brightness_incr(cur_level) * max) / 100;
+ else if (level == -1000)
+ val = (max / 100 + brightness_decr(cur_level) * max) / 100;
+ else if (level < 0 || level > 100)
+ return (EINVAL);
+ else
+ val= (max / 100 + level * max) / 100;
+
+ min = max / 200; // 0.5%
+ if (val < min)
+ val = min;
+ else if (val > max)
+ val = max;
+
+ if (val != cur) {
+ DRM_LOCK(dev);
+ intel_panel_set_backlight(dev, val);
+ DRM_UNLOCK(dev);
+ }
+ return (0);
+}
+
static struct i915_info_sysctl_list {
const char *name;
int (*ptr)(struct drm_device *dev, struct sbuf *m, void *data);
@@ -1734,7 +1805,12 @@
CTLFLAG_RW, &i915_intr_pf, 0, NULL);
if (oid == NULL)
return (-ENOMEM);
-
+ oid = SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(top), OID_AUTO,
+ "i915_backlight", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev,
+ 0, i915_backlight, "I", NULL);
+ if (oid == NULL)
+ return (ENOMEM);
+
error = drm_add_busid_modesetting(dev, ctx, top);
if (error != 0)
return (error);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACyC=qa6M5Bna=wwO4S95RWzDngExVYGD0ifX6nDB=KdzKYrLQ>
