Dave Airlie
2013-Jun-06  01:35 UTC
[Nouveau] [PATCH 1/2] nouveau/mode: split out create_ranged_atom
From: Dave Airlie <airlied at redhat.com>
This is preperation for the backlight support code.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/drmmode_display.c | 54 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 20 deletions(-)
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 6033a6d..ad7bc1f 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -767,6 +767,33 @@ drmmode_property_ignore(drmModePropertyPtr prop)
 }
 
 static void
+nouveau_create_ranged_atom(xf86OutputPtr output, Atom *atom,
+		   const char *name, INT32 min, INT32 max,
+		   uint64_t value, Bool immutable)
+{
+    int err;
+    INT32 atom_range[2];
+
+    atom_range[0] = min;
+    atom_range[1] = max;
+
+    *atom = MakeAtom(name, strlen(name), TRUE);
+    err = RRConfigureOutputProperty(output->randr_output, *atom,
+				    FALSE, TRUE, immutable,
+				    2, atom_range);
+    if (err != 0) {
+	xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
+		   "RRConfigureOutputProperty error, %d\n", err);
+    }
+    err = RRChangeOutputProperty(output->randr_output, *atom,
+				 XA_INTEGER, 32, PropModeReplace, 1, &value, FALSE, TRUE);
+    if (err != 0) {
+	xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
+		   "RRChangeOutputProperty error, %d\n", err);
+    }
+}
+
+static void
 drmmode_output_create_resources(xf86OutputPtr output)
 {
 	drmmode_output_private_ptr drmmode_output = output->driver_private;
@@ -800,30 +827,17 @@ drmmode_output_create_resources(xf86OutputPtr output)
 		value = drmmode_output->mode_output->prop_values[p->index];
 
 		if (drmmode_prop->flags & DRM_MODE_PROP_RANGE) {
-			INT32 range[2];
-
 			p->num_atoms = 1;
 			p->atoms = calloc(p->num_atoms, sizeof(Atom));
 			if (!p->atoms)
 				continue;
-			p->atoms[0] = MakeAtom(drmmode_prop->name,
strlen(drmmode_prop->name), TRUE);
-			range[0] = drmmode_prop->values[0];
-			range[1] = drmmode_prop->values[1];
-			err = RRConfigureOutputProperty(output->randr_output, p->atoms[0],
-							FALSE, TRUE,
-							drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE,
-							2, range);
-			if (err != 0) {
-				xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
-					   "RRConfigureOutputProperty error, %d\n", err);
-			}
-			err = RRChangeOutputProperty(output->randr_output, p->atoms[0],
-						     XA_INTEGER, 32, PropModeReplace, 1,
-						     &value, FALSE, FALSE);
-			if (err != 0) {
-				xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
-					   "RRChangeOutputProperty error, %d\n", err);
-			}
+
+			nouveau_create_ranged_atom(output, &p->atoms[0],
+						  drmmode_prop->name,
+						  drmmode_prop->values[0],
+						  drmmode_prop->values[1],
+						  value,
+						  drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE);
 		} else if (drmmode_prop->flags & DRM_MODE_PROP_ENUM) {
 			p->num_atoms = drmmode_prop->count_enums + 1;
 			p->atoms = calloc(p->num_atoms, sizeof(Atom));
-- 
1.8.2.1
Dave Airlie
2013-Jun-06  01:35 UTC
[Nouveau] [PATCH 2/2] nouveau: add libbacklight and randr property support.
From: Dave Airlie <airlied at redhat.com>
This adds support to detect libbacklight and use it to provide the standard
randr backlight properties, for desktops environments to use.
untested as of yet.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 configure.ac          |  3 +++
 src/Makefile.am       |  4 ++--
 src/drmmode_display.c | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 137de9c..d3e8692 100644
--- a/configure.ac
+++ b/configure.ac
@@ -81,6 +81,9 @@ sdkdir=$(pkg-config --variable=sdkdir xorg-server)
 # Checks for libraries.
 PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.10])
 
+PKG_CHECK_MODULES(LIBBACKLIGHT, [libbacklight], LIBBACKLIGHT="yes";
AC_DEFINE(HAVE_LIBBACKLIGHT, 1, [libbacklight available]), [LIBBACKLIGHT=no])
+AM_CONDITIONAL(LIBBACKLIGHT, [ test "$LIBBACKLIGHT" = "yes"
])
+
 PKG_CHECK_MODULES(LIBUDEV, [libudev], [LIBUDEV=yes], [LIBUDEV=no])
 if test "x$LIBUDEV" = xyes; then
 	AC_DEFINE(HAVE_LIBUDEV, 1, [libudev support])
diff --git a/src/Makefile.am b/src/Makefile.am
index 17c6389..826a3f6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -23,10 +23,10 @@
 # -avoid-version prevents gratuitous .0.0.0 version numbers on the end
 # _ladir passes a dummy rpath to libtool so the thing will actually link
 # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = @XORG_CFLAGS@ @LIBUDEV_CFLAGS@ @LIBDRM_NOUVEAU_CFLAGS@
+AM_CFLAGS = @XORG_CFLAGS@ @LIBUDEV_CFLAGS@ @LIBDRM_NOUVEAU_CFLAGS@
@LIBBACKLIGHT_CFLAGS@
 nouveau_drv_la_LTLIBRARIES = nouveau_drv.la
 nouveau_drv_la_LDFLAGS = -module -avoid-version @LIBDRM_NOUVEAU_LIBS@ \
-			 @LIBUDEV_LIBS@
+			 @LIBUDEV_LIBS@ @LIBBACKLIGHT_LIBS@
 nouveau_drv_ladir = @moduledir@/drivers
 
 nouveau_drv_la_SOURCES = \
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index ad7bc1f..927dbcf 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -42,6 +42,10 @@
 #include "libudev.h"
 #endif
 
+#ifdef HAVE_LIBBACKLIGHT
+#include "libbacklight.h"
+#endif
+
 static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height);
 typedef struct {
     int fd;
@@ -82,6 +86,11 @@ typedef struct {
     drmModePropertyBlobPtr edid_blob;
     int num_props;
     drmmode_prop_ptr props;
+#ifdef HAVE_LIBBACKLIGHT
+    struct backlight *backlight;
+    int backlight_active_level;
+    int backlight_max;
+#endif
 } drmmode_output_private_rec, *drmmode_output_private_ptr;
 
 typedef struct {
@@ -99,6 +108,13 @@ typedef struct {
     Bool dispatch_me;
 } drmmode_flipevtcarrier_rec, *drmmode_flipevtcarrier_ptr;
 
+#ifdef HAVE_LIBBACKLIGHT
+#define BACKLIGHT_NAME             "Backlight"
+#define BACKLIGHT_DEPRECATED_NAME  "BACKLIGHT"
+
+static Atom backlight_atom, backlight_deprecated_atom;
+#endif
+
 static void drmmode_output_dpms(xf86OutputPtr output, int mode);
 
 static drmmode_ptr
@@ -717,6 +733,9 @@ drmmode_output_destroy(xf86OutputPtr output)
 		drmModeFreeProperty(drmmode_output->props[i].mode_prop);
 		free(drmmode_output->props[i].atoms);
 	}
+#ifdef HAVE_LIBBACKLIGHT
+	backlight_destroy(drmmode_output->backlight);
+#endif
 	drmModeFreeConnector(drmmode_output->mode_output);
 	free(drmmode_output);
 	output->driver_private = NULL;
@@ -868,6 +887,27 @@ drmmode_output_create_resources(xf86OutputPtr output)
 			}
 		}
 	}
+
+#ifdef HAVE_LIBBACKLIGHT
+    {
+	NVPtr pNv = NVPTR(output->scrn);
+	struct pci_device *dev = pNv->PciInfo;
+
+	drmmode_output->backlight = backlight_init(dev, 0,
mode_output->connector_type,
+					mode_output->connector_type_id);
+
+	if (drmmode_output->backlight) {
+	    drmmode_output->backlight_max =
backlight_get_max_brightness(drmmode_output->backlight);
+	    drmmode_output->backlight_active_level =
backlight_get_brightness(drmmode_output->backlight);
+	    nouveau_create_ranged_atom(output, &backlight_atom,
+				      BACKLIGHT_NAME, 0, drmmode_output->backlight_max,
+				      drmmode_output->backlight_active_level, FALSE);
+	    nouveau_create_ranged_atom(output, &backlight_deprecated_atom,
+				      BACKLIGHT_DEPRECATED_NAME, 0, drmmode_output->backlight_max,
+				      drmmode_output->backlight_active_level, FALSE);
+	}
+    }
+#endif
 }
 
 static Bool
-- 
1.8.2.1
Apparently Analagous Threads
- [PATCH] drmmode: Add backlight support
- [PATCH 1/2] nouveau/mode: split out create_ranged_atom
- [PATCH] drmmode: update logic for dynamic connectors, paths, and tiles
- [PATCH] drmmode: update logic for dynamic connectors, paths, and tiles
- TV-out modesetting DDX patches