Skip site navigation (1)Skip section navigation (2)
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>