Index: sys/external/bsd/drm2/dist/drm/i915/intel_panel.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/i915/intel_panel.c,v
retrieving revision 1.6
diff -p -u -r1.6 intel_panel.c
--- sys/external/bsd/drm2/dist/drm/i915/intel_panel.c	4 Nov 2014 03:05:36 -0000	1.6
+++ sys/external/bsd/drm2/dist/drm/i915/intel_panel.c	15 Feb 2016 20:15:36 -0000
@@ -30,6 +30,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/err.h>
 #include <linux/moduleparam.h>
 #include <linux/module.h>
 #include <linux/printk.h>
Index: sys/external/bsd/drm2/dist/drm/nouveau/nouveau_backlight.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_backlight.c,v
retrieving revision 1.1.1.1
diff -p -u -r1.1.1.1 nouveau_backlight.c
--- sys/external/bsd/drm2/dist/drm/nouveau/nouveau_backlight.c	16 Jul 2014 19:35:26 -0000	1.1.1.1
+++ sys/external/bsd/drm2/dist/drm/nouveau/nouveau_backlight.c	15 Feb 2016 20:15:37 -0000
@@ -32,6 +32,7 @@
 
 #include <linux/backlight.h>
 #include <linux/acpi.h>
+#include <linux/err.h>
 
 #include "nouveau_drm.h"
 #include "nouveau_reg.h"
Index: sys/external/bsd/drm2/dist/drm/radeon/radeon_legacy_encoders.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/radeon_legacy_encoders.c,v
retrieving revision 1.2
diff -p -u -r1.2 radeon_legacy_encoders.c
--- sys/external/bsd/drm2/dist/drm/radeon/radeon_legacy_encoders.c	20 Aug 2015 21:41:12 -0000	1.2
+++ sys/external/bsd/drm2/dist/drm/radeon/radeon_legacy_encoders.c	15 Feb 2016 20:15:37 -0000
@@ -29,6 +29,7 @@
 #include "radeon.h"
 #include "atom.h"
 #include <linux/backlight.h>
+#include <linux/err.h>
 #ifdef CONFIG_PMAC_BACKLIGHT
 #include <asm/backlight.h>
 #endif
Index: sys/external/bsd/drm2/drm/files.drmkms
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/drm/files.drmkms,v
retrieving revision 1.12
diff -p -u -r1.12 files.drmkms
--- sys/external/bsd/drm2/drm/files.drmkms	20 Aug 2015 21:41:12 -0000	1.12
+++ sys/external/bsd/drm2/drm/files.drmkms	15 Feb 2016 20:15:37 -0000
@@ -27,7 +27,7 @@ makeoptions 	drmkms 	"CWARNFLAGS.drm_edi
 makeoptions	drmkms	CPPFLAGS+="-D__KERNEL__"
 
 makeoptions	drmkms	CPPFLAGS+="-DCONFIG_FB=0"
-makeoptions	drmkms	CPPFLAGS+="-DCONFIG_BACKLIGHT_CLASS_DEVICE=0"
+makeoptions	drmkms	CPPFLAGS+="-DCONFIG_BACKLIGHT_CLASS_DEVICE=1"
 makeoptions	drmkms	CPPFLAGS+="-DCONFIG_BACKLIGHT_CLASS_DEVICE_MODULE=0"
 
 file	external/bsd/drm2/dist/drm/drm_auth.c		drmkms
Index: sys/external/bsd/drm2/include/linux/backlight.h
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/include/linux/backlight.h,v
retrieving revision 1.2
diff -p -u -r1.2 backlight.h
--- sys/external/bsd/drm2/include/linux/backlight.h	18 Mar 2014 18:20:43 -0000	1.2
+++ sys/external/bsd/drm2/include/linux/backlight.h	15 Feb 2016 20:15:37 -0000
@@ -1,7 +1,7 @@
 /*	$NetBSD: backlight.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $	*/
 
 /*-
- * Copyright (c) 2013 The NetBSD Foundation, Inc.
+ * Copyright (c) 2013, 2016 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -32,4 +32,49 @@
 #ifndef _LINUX_BACKLIGHT_H_
 #define _LINUX_BACKLIGHT_H_
 
+struct backlight_device;
+struct backlight_ops;
+struct backlight_properties;
+typedef struct device *device_t;
+
+struct backlight_properties {
+	int	brightness;	/* requested brightness */
+	int	max_brightness;	/* maximum brightness */
+	int	power;		/* 0 off; 1, 2, 3 powersave; 4 off */
+
+	enum {
+		BACKLIGHT_RAW,
+	}	type;
+};
+
+#define	FB_BLANK_UNBLANK	0
+
+struct backlight_device {
+	struct backlight_properties	props;
+	const struct backlight_ops	*ops;
+
+	device_t			bd_dev;
+	void				*bd_cookie;
+	const char			*bd_name;
+};
+
+struct backlight_ops {
+	int	options;
+	int	(*update_status)(struct backlight_device *);
+	int	(*get_brightness)(struct backlight_device *);
+};
+#define	BL_CORE_SUSPENDRESUME	0
+
+#define	backlight_device_register	linux_backlight_device_register
+#define	backlight_device_unregister	linux_backlight_device_unregister
+#define	backlight_update_status		linux_backlight_update_status
+#define	bl_get_data			linux_bl_get_data
+
+struct backlight_device *
+	backlight_device_register(const char *, device_t, void *,
+	    const struct backlight_ops *, const struct backlight_properties *);
+void	backlight_device_unregister(struct backlight_device *);
+void	backlight_update_status(struct backlight_device *);
+void *	bl_get_data(struct backlight_device *);
+
 #endif  /* _LINUX_BACKLIGHT_H_ */
Index: sys/external/bsd/drm2/include/linux/pci.h
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/include/linux/pci.h,v
retrieving revision 1.22
diff -p -u -r1.22 pci.h
--- sys/external/bsd/drm2/include/linux/pci.h	17 Jan 2016 01:40:39 -0000	1.22
+++ sys/external/bsd/drm2/include/linux/pci.h	15 Feb 2016 20:15:37 -0000
@@ -90,6 +90,7 @@ struct pci_device_id {
 CTASSERT(PCI_CLASS_BRIDGE_ISA == 0x0601);
 
 /* XXX This is getting silly...  */
+#define	PCI_VENDOR_ID_APPLE	PCI_VENDOR_APPLE
 #define	PCI_VENDOR_ID_ASUSTEK	PCI_VENDOR_ASUSTEK
 #define	PCI_VENDOR_ID_ATI	PCI_VENDOR_ATI
 #define	PCI_VENDOR_ID_DELL	PCI_VENDOR_DELL
Index: sys/external/bsd/drm2/linux/files.drmkms_linux
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/linux/files.drmkms_linux,v
retrieving revision 1.8
diff -p -u -r1.8 files.drmkms_linux
--- sys/external/bsd/drm2/linux/files.drmkms_linux	8 Jan 2015 23:35:47 -0000	1.8
+++ sys/external/bsd/drm2/linux/files.drmkms_linux	15 Feb 2016 20:15:37 -0000
@@ -5,6 +5,7 @@ define	drmkms_linux: i2cexec, i2c_bitban
 makeoptions 	drmkms_linux	CPPFLAGS+="-I$S/external/bsd/drm2/include"
 makeoptions 	drmkms_linux	CPPFLAGS+="-I$S/external/bsd/common/include"
 
+file	external/bsd/drm2/linux/linux_backlight.c	drmkms_linux
 file	external/bsd/drm2/linux/linux_dmi.c		drmkms_linux
 file	external/bsd/drm2/linux/linux_kmap.c		drmkms_linux
 file	external/bsd/drm2/linux/linux_i2c.c		drmkms_linux
Index: sys/external/bsd/drm2/linux/linux_backlight.c
===================================================================
RCS file: sys/external/bsd/drm2/linux/linux_backlight.c
diff -N sys/external/bsd/drm2/linux/linux_backlight.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/external/bsd/drm2/linux/linux_backlight.c	15 Feb 2016 20:18:21 -0000
@@ -0,0 +1,291 @@
+/*	$NetBSD$	*/
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Taylor R. Campbell.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/kmem.h>
+
+#include <lib/libkern/libkern.h>
+
+#include <linux/backlight.h>
+#include <linux/err.h>
+
+#define	DEVPROP_BACKLIGHTS	"backlights"
+
+static void
+backlight_foreach(device_t dev, void (*fn)(struct backlight_device *, void *),
+    void *cookie)
+{
+	prop_dictionary_t devprops, backlights;
+	prop_object_iterator_t iterator;
+	prop_dictionary_keysym_t keysym;
+	const char *name, *end;
+	uintmax_t bd_addr;
+	struct backlight_device *bd;
+
+	/* Acquire the kernel lock for any backlight callbacks.  */
+	KERNEL_LOCK(1, NULL);
+
+	/* Get the device properties, which should always be there.  */
+	devprops = device_properties(dev);
+	KASSERT(devprops != NULL);
+
+	/* Get the backlights dictionary, if it is there.  */
+	backlights = prop_dictionary_get(devprops, DEVPROP_BACKLIGHTS);
+	if (backlights == NULL)
+		/* Not there.  Nothing to do.  */
+		goto out;
+
+	/* Iterate over the backlights for this device.  */
+	iterator = prop_dictionary_iterator(backlights);
+	while ((keysym = prop_object_iterator_next(iterator)) != NULL) {
+		/* Parse the keysym.  */
+		name = prop_dictionary_keysym_cstring_nocopy(keysym);
+		bd_addr = strtoumax(name, __UNCONST(&end), 0x10);
+		if (end != name + 16 || *end != '\0') {
+			/*
+			 * Warn system operator if it failed.  This
+			 * probably indicates a bug -- nobody else
+			 * should touch the backlights dictionary.
+			 */
+			device_printf(dev, "invalid backlight key: %s\n",
+			    name);
+			continue;
+		}
+
+		/* Get the backlight device and call the function.  */
+		CTASSERT(sizeof(uintptr_t) <= sizeof(uint64_t));
+		bd = (struct backlight_device *)(uintptr_t)bd_addr;
+		(*fn)(bd, cookie);
+	}
+
+	/* Release the prop object iterator.  */
+	prop_object_iterator_release(iterator);
+
+out:	KERNEL_UNLOCK_ONE();
+}
+
+static void
+backlight_brightness_delta(struct backlight_device *bd, void *cookie)
+{
+	const int delta = *(const int *)cookie;
+	int brightness, max_brightness;
+
+	/* Get the current and maximum brightness.  */
+	brightness = (*bd->ops->get_brightness)(bd);
+	max_brightness = bd->props.max_brightness;
+
+	/*
+	 * Set the `brightness' property to the current one plus delta,
+	 * clamped to be at least 0 and at most the maximum.
+	 */
+	bd->props.brightness = MAX(0, MIN(brightness + delta, max_brightness));
+
+	/* Call the update callback.  */
+	(*bd->ops->update_status)(bd);
+}
+
+static void
+backlight_brightness_up(device_t dev)
+{
+	int delta = 1;
+
+	backlight_foreach(dev, &backlight_brightness_delta, &delta);
+}
+
+static void
+backlight_brightness_down(device_t dev)
+{
+	int delta = -1;
+
+	backlight_foreach(dev, &backlight_brightness_delta, &delta);
+}
+
+struct backlight_device *
+backlight_device_register(const char *name, device_t dev, void *cookie,
+    const struct backlight_ops *ops, const struct backlight_properties *props)
+{
+	struct backlight_device *bd;
+	prop_dictionary_t devprops, backlights;
+	char key[16 + 1];
+	int n __diagused;
+	int error;
+
+	/* Allocate a backlight device object.  */
+	bd = kmem_alloc(sizeof(*bd), KM_SLEEP);
+	if (bd == NULL) {
+		error = ENOMEM;
+		goto fail0;
+	}
+
+	/* Initialize the backlight device object.  */
+	bd->props = *props;
+	bd->ops = ops;
+	bd->bd_dev = dev;
+	bd->bd_cookie = cookie;
+
+	/* Get the device properties, which should always be there.  */
+	devprops = device_properties(dev);
+	KASSERT(devprops != NULL);
+
+	/* Look up an existing backlights dictionary.  */
+	backlights = prop_dictionary_get(devprops, DEVPROP_BACKLIGHTS);
+	if (backlights != NULL) {
+		/*
+		 * Got it: retain it until we're done.  Not strictly
+		 * necessary, but it makes the failure branches
+		 * simpler.
+		 */
+		prop_object_retain(backlights);
+	} else {
+		/* None there: create a new backlights dictionary.  */
+		backlights = prop_dictionary_create();
+		if (backlights == NULL) {
+			error = ENOMEM;
+			goto fail1;
+		}
+
+		/* Store it in the device properties.  */
+		if (!prop_dictionary_set(devprops, DEVPROP_BACKLIGHTS,
+			backlights)) {
+			error = ENOMEM;
+			goto fail2;
+		}
+
+		/* Register a PMF event handler for brightness up.  */
+		if (!pmf_event_register(dev, PMFE_DISPLAY_BRIGHTNESS_UP,
+			&backlight_brightness_up, true)) {
+			device_printf(dev, "failed to register brightness up"
+			    " handler\n");
+			error = ENOMEM;
+			goto fail3;
+		}
+
+		/* Register a PMF event handler for brightness down.  */
+		if (!pmf_event_register(dev, PMFE_DISPLAY_BRIGHTNESS_DOWN,
+			&backlight_brightness_down, true)) {
+			device_printf(dev, "failed to register brightness down"
+			    " handler\n");
+			error = ENOMEM;
+			goto fail4;
+		}
+	}
+	KASSERT(backlights != NULL);
+
+	/* Format the key for this backlight.  */
+	CTASSERT(sizeof(uintptr_t) <= sizeof(uint64_t));
+	n = snprintf(key, sizeof key, "%016"PRIx64, (uint64_t)(uintptr_t)bd);
+	KASSERT(n == 16);
+
+	/* Save the backlight.  */
+	if (!prop_dictionary_set_cstring(backlights, key, name)) {
+		device_printf(dev, "failed to create backlight\n");
+		error = ENOMEM;
+		goto fail5;
+	}
+
+	/* Success!  */
+	return bd;
+
+fail5:	(void)pmf_event_deregister(dev, PMFE_DISPLAY_BRIGHTNESS_DOWN,
+	    &backlight_brightness_down, true);
+fail4:	(void)pmf_event_deregister(dev, PMFE_DISPLAY_BRIGHTNESS_UP,
+	    &backlight_brightness_up, true);
+fail3:	if (prop_dictionary_count(backlights) == 0)
+		prop_dictionary_remove(devprops, DEVPROP_BACKLIGHTS);
+fail2:	prop_object_release(backlights);
+fail1:	kmem_free(bd, sizeof(*bd));
+fail0:	return ERR_PTR(-error);
+}
+
+void
+backlight_device_unregister(struct backlight_device *bd)
+{
+	device_t dev = bd->bd_dev;
+	prop_dictionary_t devprops, backlights;
+	char key[16 + 1];
+	int n __diagused;
+
+	/* Get the device properties, which should always be there.  */
+	devprops = device_properties(dev);
+	KASSERT(devprops != NULL);
+
+	/*
+	 * Get the backlights dictionary, which should be there if we
+	 * have a backlight device to unregister.
+	 */
+	backlights = prop_dictionary_get(devprops, DEVPROP_BACKLIGHTS);
+	KASSERT(backlights != NULL);
+
+	/* Format the key for this backlight.  */
+	CTASSERT(sizeof(uintptr_t) <= sizeof(uint64_t));
+	n = snprintf(key, sizeof key, "%016"PRIx64, (uint64_t)(uintptr_t)bd);
+	KASSERT(n == 16);
+
+	/* Remove the backlight.  */
+	KASSERT(prop_dictionary_get(backlights, key) != NULL);
+	prop_dictionary_remove(backlights, key);
+
+	/* Check to see whether this is the last one.  */
+	if (prop_dictionary_count(backlights) == 0) {
+		/* Last one: remove the backlight dictionary.  */
+		prop_dictionary_remove(devprops, DEVPROP_BACKLIGHTS);
+
+		/* Deregister PMF event handlers.  */
+		(void)pmf_event_deregister(dev, PMFE_DISPLAY_BRIGHTNESS_DOWN,
+		    &backlight_brightness_down, true);
+		(void)pmf_event_deregister(dev, PMFE_DISPLAY_BRIGHTNESS_UP,
+		    &backlight_brightness_up, true);
+	}
+
+	/* Free the backlight object.  */
+	kmem_free(bd, sizeof(*bd));
+}
+
+void
+backlight_update_status(struct backlight_device *bd)
+{
+
+	KERNEL_LOCK(1, NULL);
+	(*bd->ops->update_status)(bd);
+	KERNEL_UNLOCK_ONE();
+}
+
+void *
+bl_get_data(struct backlight_device *bd)
+{
+
+	return bd->bd_cookie;
+}
Index: sys/external/bsd/drm2/nouveau/files.nouveau
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/nouveau/files.nouveau,v
retrieving revision 1.14
diff -p -u -r1.14 files.nouveau
--- sys/external/bsd/drm2/nouveau/files.nouveau	11 Feb 2016 04:43:32 -0000	1.14
+++ sys/external/bsd/drm2/nouveau/files.nouveau	15 Feb 2016 20:15:37 -0000
@@ -22,6 +22,8 @@ makeoptions	nouveau	CPPFLAGS+="-I$S/exte
 makeoptions	nouveau	CPPFLAGS+="-DCONFIG_NOUVEAU_DEBUG=5"
 makeoptions	nouveau	CPPFLAGS+="-DCONFIG_NOUVEAU_DEBUG_DEFAULT=3"
 
+makeoptions	nouveau	CPPFLAGS+="-DCONFIG_DRM_NOUVEAU_BACKLIGHT"
+
 # XXX If you find a way to apply the warning flags to all Nouveau
 # sources, please apply it here and remove this stupidly gigantic list!
 makeoptions	nouveau	"CWARNFLAGS.nouveau_agp.c"+="-Wno-missing-field-initializers"
@@ -574,6 +576,7 @@ file	external/bsd/drm2/dist/drm/nouveau/
 file	external/bsd/drm2/dist/drm/nouveau/dispnv04/nouveau_dispnv04_tvnv17.c	nouveau
 file	external/bsd/drm2/dist/drm/nouveau/nouveau_abi16.c	nouveau
 file	external/bsd/drm2/dist/drm/nouveau/nouveau_agp.c	nouveau
+file	external/bsd/drm2/dist/drm/nouveau/nouveau_backlight.c	nouveau
 file	external/bsd/drm2/dist/drm/nouveau/nouveau_bios.c	nouveau
 file	external/bsd/drm2/dist/drm/nouveau/nouveau_bo.c	nouveau
 file	external/bsd/drm2/dist/drm/nouveau/nouveau_chan.c	nouveau