Module Name:    src
Committed By:   nonaka
Date:           Wed Nov  5 23:46:09 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_dma.c i915_drv.h
            intel_acpi.c intel_opregion.c
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms
        src/sys/external/bsd/drm2/include/linux: acpi.h pci.h

Log Message:
i915drmkms(4): Enable CONFIG_ACPI if NACPICA > 0.
Now brightness can be adjusted via hotkey on Mouse Computer LB-J300X (Clevo 
W330SU2).


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/i915/intel_acpi.c
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_opregion.c
cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/acpi.h
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/include/linux/pci.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.11 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.12
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.11	Sun Sep  7 23:03:11 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c	Wed Nov  5 23:46:09 2014
@@ -1375,7 +1375,11 @@ static int i915_load_modeset_init(struct
 		goto out;
 #endif
 
+#ifdef __NetBSD__
+	intel_register_dsm_handler(dev);
+#else
 	intel_register_dsm_handler();
+#endif
 
 #ifndef __NetBSD__		/* XXX vga */
 	ret = vga_switcheroo_register_client(dev->pdev, &i915_switcheroo_ops, false);

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.9 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.10
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.9	Sun Sep  7 23:03:11 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h	Wed Nov  5 23:46:09 2014
@@ -30,6 +30,13 @@
 #ifndef _I915_DRV_H_
 #define _I915_DRV_H_
 
+#if defined(__NetBSD__) && (defined(i386) || defined(amd64))
+#include "acpica.h"
+#if (NACPICA > 0)
+#define CONFIG_ACPI
+#endif
+#endif
+
 #include <uapi/drm/i915_drm.h>
 
 #include "i915_reg.h"
@@ -2720,8 +2727,8 @@ extern void intel_i2c_reset(struct drm_d
 
 /* intel_opregion.c */
 struct intel_encoder;
-extern int intel_opregion_setup(struct drm_device *dev);
 #ifdef CONFIG_ACPI
+extern int intel_opregion_setup(struct drm_device *dev);
 extern void intel_opregion_init(struct drm_device *dev);
 extern void intel_opregion_fini(struct drm_device *dev);
 extern void intel_opregion_asle_intr(struct drm_device *dev);
@@ -2730,6 +2737,7 @@ extern int intel_opregion_notify_encoder
 extern int intel_opregion_notify_adapter(struct drm_device *dev,
 					 pci_power_t state);
 #else
+static inline int intel_opregion_setup(struct drm_device *dev) { return 0; }
 static inline void intel_opregion_init(struct drm_device *dev) { return; }
 static inline void intel_opregion_fini(struct drm_device *dev) { return; }
 static inline void intel_opregion_asle_intr(struct drm_device *dev) { return; }
@@ -2747,10 +2755,22 @@ intel_opregion_notify_adapter(struct drm
 
 /* intel_acpi.c */
 #ifdef CONFIG_ACPI
+#ifdef __NetBSD__
+extern void intel_register_dsm_handler(struct drm_device *);
+#else
 extern void intel_register_dsm_handler(void);
+#endif
 extern void intel_unregister_dsm_handler(void);
 #else
+#ifdef __NetBSD__
+static inline void
+intel_register_dsm_handler(struct drm_device *dev)
+{
+	return;
+}
+#else
 static inline void intel_register_dsm_handler(void) { return; }
+#endif
 static inline void intel_unregister_dsm_handler(void) { return; }
 #endif /* CONFIG_ACPI */
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_acpi.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_acpi.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/intel_acpi.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_acpi.c:1.2	Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_acpi.c	Wed Nov  5 23:46:09 2014
@@ -9,11 +9,104 @@
 #include <drm/drmP.h>
 #include "i915_drv.h"
 
+#ifdef CONFIG_ACPI
+
+#ifdef __NetBSD__
+static ACPI_OBJECT *
+acpi_evaluate_dsm(ACPI_HANDLE handle, const uint8_t *uuid, int rev, int func,
+    ACPI_OBJECT *argv4)
+{
+	ACPI_OBJECT_LIST arg;
+	ACPI_OBJECT params[4];
+	ACPI_BUFFER buf;
+	ACPI_STATUS rv;
+
+	if (handle == NULL)
+		handle = ACPI_ROOT_OBJECT;
+
+	arg.Count = 4;
+	arg.Pointer = params;
+	params[0].Type = ACPI_TYPE_BUFFER;
+	params[0].Buffer.Length = 16;
+	params[0].Buffer.Pointer = (char *)__UNCONST(uuid);
+	params[1].Type = ACPI_TYPE_INTEGER;
+	params[1].Integer.Value = rev;
+	params[2].Type = ACPI_TYPE_INTEGER;
+	params[2].Integer.Value = func;
+	if (argv4 != NULL) {
+		params[3] = *argv4;
+	} else {
+		params[3].Type = ACPI_TYPE_PACKAGE;
+		params[3].Package.Count = 0;
+		params[3].Package.Elements = NULL;
+	}
+
+	buf.Pointer = NULL;
+	buf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
+	rv = AcpiEvaluateObject(handle, "_DSM", &arg, &buf);
+	if (ACPI_SUCCESS(rv))
+		return (ACPI_OBJECT *)buf.Pointer;
+	return NULL;
+}
+
+static inline ACPI_OBJECT *
+acpi_evaluate_dsm_typed(ACPI_HANDLE handle, const uint8_t *uuid, int rev,
+    int func, ACPI_OBJECT *argv4, ACPI_OBJECT_TYPE type)
+{
+	ACPI_OBJECT *obj;
+
+	obj = acpi_evaluate_dsm(handle, uuid, rev, func, argv4);
+	if (obj != NULL && obj->Type != type) {
+		ACPI_FREE(obj);
+		obj = NULL;
+	}
+	return obj;
+}
+
+#define	ACPI_INIT_DSM_ARGV4(cnt, eles)		\
+{						\
+	.Package.Type = ACPI_TYPE_PACKAGE,	\
+	.Package.Count = (cnt),			\
+	.Package.Elements = (eles)		\
+}
+
+static bool
+acpi_check_dsm(ACPI_HANDLE handle, const uint8_t *uuid, int rev, uint64_t funcs)
+{
+	ACPI_OBJECT *obj;
+	uint64_t mask = 0;
+	int i;
+
+	if (funcs == 0)
+		return false;
+
+	obj = acpi_evaluate_dsm(handle, uuid, rev, 0, NULL);
+	if (obj == NULL)
+		return false;
+
+	if (obj->Type == ACPI_TYPE_INTEGER)
+		mask = obj->Integer.Value;
+	else if (obj->Type == ACPI_TYPE_BUFFER)
+		for (i = 0; i < obj->Buffer.Length && i < 8; i++)
+			mask |= (uint64_t)obj->Buffer.Pointer[i] << (i * 8);
+	ACPI_FREE(obj);
+
+	if ((mask & 0x1) == 0x1 && (mask & funcs) == funcs)
+		return true;
+	return false;
+}
+#endif
+
 #define INTEL_DSM_REVISION_ID 1 /* For Calpella anyway... */
 #define INTEL_DSM_FN_PLATFORM_MUX_INFO 1 /* No args */
 
 static struct intel_dsm_priv {
+#ifdef __NetBSD__
+	ACPI_HANDLE dhandle;
+#else
 	acpi_handle dhandle;
+#endif
 } intel_dsm_priv;
 
 static const u8 intel_dsm_guid[] = {
@@ -79,7 +172,11 @@ static const char *intel_dsm_mux_type(u8
 static void intel_dsm_platform_mux_info(void)
 {
 	int i;
+#ifdef __NetBSD__
+	ACPI_OBJECT *pkg, *connector_count;
+#else
 	union acpi_object *pkg, *connector_count;
+#endif
 
 	pkg = acpi_evaluate_dsm_typed(intel_dsm_priv.dhandle, intel_dsm_guid,
 			INTEL_DSM_REVISION_ID, INTEL_DSM_FN_PLATFORM_MUX_INFO,
@@ -89,6 +186,26 @@ static void intel_dsm_platform_mux_info(
 		return;
 	}
 
+#ifdef __NetBSD__
+	connector_count = &pkg->Package.Elements[0];
+	DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",
+		  (unsigned long long)connector_count->Integer.Value);
+	for (i = 1; i < pkg->Package.Count; i++) {
+		ACPI_OBJECT *obj = &pkg->Package.Elements[i];
+		ACPI_OBJECT *connector_id = &obj->Package.Elements[0];
+		ACPI_OBJECT *info = &obj->Package.Elements[1];
+		DRM_DEBUG_DRIVER("Connector id: 0x%016llx\n",
+			  (unsigned long long)connector_id->Integer.Value);
+		DRM_DEBUG_DRIVER("  port id: %s\n",
+		       intel_dsm_port_name(info->Buffer.Pointer[0]));
+		DRM_DEBUG_DRIVER("  display mux info: %s\n",
+		       intel_dsm_mux_type(info->Buffer.Pointer[1]));
+		DRM_DEBUG_DRIVER("  aux/dc mux info: %s\n",
+		       intel_dsm_mux_type(info->Buffer.Pointer[2]));
+		DRM_DEBUG_DRIVER("  hpd mux info: %s\n",
+		       intel_dsm_mux_type(info->Buffer.Pointer[3]));
+	}
+#else
 	connector_count = &pkg->package.elements[0];
 	DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",
 		  (unsigned long long)connector_count->integer.value);
@@ -107,15 +224,21 @@ static void intel_dsm_platform_mux_info(
 		DRM_DEBUG_DRIVER("  hpd mux info: %s\n",
 		       intel_dsm_mux_type(info->buffer.pointer[3]));
 	}
-
+#endif
 	ACPI_FREE(pkg);
 }
 
+#ifdef __NetBSD__
+static bool intel_dsm_pci_probe(ACPI_HANDLE dhandle)
+#else
 static bool intel_dsm_pci_probe(struct pci_dev *pdev)
+#endif
 {
+#ifndef __NetBSD__
 	acpi_handle dhandle;
 
 	dhandle = ACPI_HANDLE(&pdev->dev);
+#endif
 	if (!dhandle)
 		return false;
 
@@ -131,6 +254,57 @@ static bool intel_dsm_pci_probe(struct p
 	return true;
 }
 
+#ifdef __NetBSD__
+struct dsm_pa {
+	struct pci_attach_args	pa;
+	int			vga_count;
+	bool			has_dsm;
+};
+
+/* XXX from sys/dev/pci/vga_pcivar.h */
+#define	DEVICE_IS_VGA_PCI(class, id)					\
+	    (((PCI_CLASS(class) == PCI_CLASS_DISPLAY &&			\
+	      PCI_SUBCLASS(class) == PCI_SUBCLASS_DISPLAY_VGA) ||	\
+	     (PCI_CLASS(class) == PCI_CLASS_PREHISTORIC &&		\
+	      PCI_SUBCLASS(class) == PCI_SUBCLASS_PREHISTORIC_VGA)) ? 1 : 0)
+
+static int
+intel_dsm_vga_match(const struct pci_attach_args *pa)
+{
+	struct dsm_pa *dpa = (struct dsm_pa *)__UNCONST(pa);
+
+	if (!DEVICE_IS_VGA_PCI(pa->pa_class, pa->pa_id))
+		return 0;
+
+	dpa->vga_count++;
+	struct acpi_devnode *node = acpi_pcidev_find(0 /*XXX segment*/,
+	    pa->pa_bus, pa->pa_device, pa->pa_function);
+	if (node != NULL)
+		dpa->has_dsm |= intel_dsm_pci_probe(node->ad_handle);
+	return 0;
+}
+
+static bool intel_dsm_detect(struct drm_device *dev)
+{
+	char acpi_method_name[255] = { 0 };
+	struct dsm_pa dpa;
+
+	dpa.pa = dev->pdev->pd_pa;
+	dpa.vga_count = 0;
+	dpa.has_dsm = false;
+	pci_find_device(&dpa.pa, intel_dsm_vga_match);
+
+	if (dpa.vga_count == 2 && dpa.has_dsm) {
+		const char *name = acpi_name(intel_dsm_priv.dhandle);
+		strlcpy(acpi_method_name, name, sizeof(acpi_method_name));
+		DRM_DEBUG_DRIVER("VGA switcheroo: detected DSM switching method %s handle\n",
+				 acpi_method_name);
+		return true;
+	}
+
+	return false;
+}
+#else
 static bool intel_dsm_detect(void)
 {
 	char acpi_method_name[255] = { 0 };
@@ -153,13 +327,24 @@ static bool intel_dsm_detect(void)
 
 	return false;
 }
+#endif
 
+#ifdef __NetBSD__
+void intel_register_dsm_handler(struct drm_device *dev)
+{
+	if (!intel_dsm_detect(dev))
+		return;
+}
+#else
 void intel_register_dsm_handler(void)
 {
 	if (!intel_dsm_detect())
 		return;
 }
+#endif
 
 void intel_unregister_dsm_handler(void)
 {
 }
+
+#endif	/* CONFIG_ACPI */

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_opregion.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_opregion.c:1.5 src/sys/external/bsd/drm2/dist/drm/i915/intel_opregion.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_opregion.c:1.5	Wed Jul 16 20:56:25 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_opregion.c	Wed Nov  5 23:46:09 2014
@@ -27,6 +27,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/printk.h>
 #include <linux/acpi.h>
 #include <acpi/video.h>
 #include <asm/io.h>
@@ -36,6 +37,8 @@
 #include "i915_drv.h"
 #include "intel_drv.h"
 
+#ifdef CONFIG_ACPI
+
 #define PCI_ASLE		0xe4
 #define PCI_ASLS		0xfc
 #define PCI_SWSCI		0xe8
@@ -588,6 +591,29 @@ void intel_opregion_asle_intr(struct drm
 
 static struct intel_opregion *system_opregion;
 
+#ifdef __NetBSD__
+static void
+intel_opregion_video_event(ACPI_HANDLE hdl, uint32_t notify, void *opaque)
+{
+	device_t self = opaque;
+	struct opregion_acpi __iomem *acpi;
+
+	DRM_DEBUG_DRIVER("notify=0x%08x\n", notify);
+
+	if (!system_opregion)
+		return;
+
+	acpi = system_opregion->acpi;
+
+	if (notify != 0x80) {
+		aprint_error_dev(self, "unknown notify 0x%02x\n", notify);
+	} else if ((ioread32(&acpi->cevt) & 1) == 0) {
+		aprint_error_dev(self, "bad notify\n");
+	}
+
+	iowrite32(0, &acpi->csts);
+}
+#else	/* !__NetBSD__ */
 static int intel_opregion_video_event(struct notifier_block *nb,
 				      unsigned long val, void *data)
 {
@@ -620,6 +646,7 @@ static int intel_opregion_video_event(st
 static struct notifier_block intel_opregion_notifier = {
 	.notifier_call = intel_opregion_video_event,
 };
+#endif	/* __NetBSD__ */
 
 /*
  * Initialise the DIDL field in opregion. This passes a list of devices to
@@ -632,13 +659,24 @@ static void intel_didl_outputs(struct dr
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_opregion *opregion = &dev_priv->opregion;
 	struct drm_connector *connector;
+#ifdef __NetBSD__
+	struct acpi_devnode *ad, *child;
+	ACPI_INTEGER device_id;
+	ACPI_STATUS status;
+#else
 	acpi_handle handle;
 	struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL;
 	unsigned long long device_id;
 	acpi_status status;
+#endif
 	u32 temp;
 	int i = 0;
 
+#ifdef __NetBSD__
+	ad = dev->pdev->pd_ad;
+	if (ad == NULL || !device_is_a(ad->ad_device, "acpivga"))
+		return;
+#else
 	handle = ACPI_HANDLE(&dev->pdev->dev);
 	if (!handle || acpi_bus_get_device(handle, &acpi_dev))
 		return;
@@ -658,16 +696,29 @@ static void intel_didl_outputs(struct dr
 		pr_warn("No ACPI video bus found\n");
 		return;
 	}
+#endif
 
+#ifdef __NetBSD__
+	SIMPLEQ_FOREACH(child, &ad->ad_child_head, ad_child_list) {
+#else
 	list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) {
+#endif
 		if (i >= 8) {
+#ifdef __NetBSD__
+			aprint_error_dev(dev->pdev->pd_dev,
+#else
 			dev_dbg(&dev->pdev->dev,
+#endif
 				"More than 8 outputs detected via ACPI\n");
 			return;
 		}
 		status =
+#ifdef __NetBSD__
+			acpi_eval_integer(child->ad_handle, "_ADR", &device_id);
+#else
 			acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
 						NULL, &device_id);
+#endif
 		if (ACPI_SUCCESS(status)) {
 			if (!device_id)
 				goto blind_set;
@@ -688,7 +739,11 @@ blind_set:
 	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
 		int output_type = ACPI_OTHER_OUTPUT;
 		if (i >= 8) {
+#ifdef __NetBSD__
+			aprint_error_dev(dev->pdev->pd_dev,
+#else
 			dev_dbg(&dev->pdev->dev,
+#endif
 				"More than 8 outputs in connector list\n");
 			return;
 		}
@@ -762,7 +817,13 @@ void intel_opregion_init(struct drm_devi
 		iowrite32(1, &opregion->acpi->drdy);
 
 		system_opregion = opregion;
+#ifdef __NetBSD__
+		if (dev->pdev->pd_ad != NULL)
+			acpi_register_notify(dev->pdev->pd_ad,
+			    intel_opregion_video_event);
+#else
 		register_acpi_notifier(&intel_opregion_notifier);
+#endif
 	}
 
 	if (opregion->asle) {
@@ -788,11 +849,20 @@ void intel_opregion_fini(struct drm_devi
 		iowrite32(0, &opregion->acpi->drdy);
 
 		system_opregion = NULL;
+#ifdef __NetBSD__
+		if (dev->pdev->pd_ad != NULL)
+			acpi_deregister_notify(dev->pdev->pd_ad);
+#else
 		unregister_acpi_notifier(&intel_opregion_notifier);
+#endif
 	}
 
 	/* just clear all opregion memory pointers now */
+#ifdef __NetBSD__
+	acpi_os_iounmap(opregion->header, OPREGION_SIZE);
+#else
 	iounmap(opregion->header);
+#endif
 	opregion->header = NULL;
 	opregion->acpi = NULL;
 	opregion->swsci = NULL;
@@ -925,3 +995,5 @@ err_out:
 #endif
 	return err;
 }
+
+#endif	/* CONFIG_ACPI */

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.7 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.8
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.7	Sun Nov  2 02:03:31 2014
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Wed Nov  5 23:46:09 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.7 2014/11/02 02:03:31 christos Exp $
+#	$NetBSD: files.i915drmkms,v 1.8 2014/11/05 23:46:09 nonaka Exp $
 
 define	intelfbbus	{ }
 device	i915drmkms: drmkms, drmkms_pci, intelfbbus, agp_i810
@@ -16,7 +16,6 @@ makeoptions 	i915drmkms 	"CWARNFLAGS.int
 makeoptions 	i915drmkms 	"CWARNFLAGS.intel_pm.c"+="-Wno-shadow"
 
 # XXX x86 kludge.
-#makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_ACPI"
 makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_I915_FBDEV"
 
 file	external/bsd/drm2/dist/drm/i915/dvo_ch7017.c	i915drmkms
@@ -45,7 +44,7 @@ file	external/bsd/drm2/dist/drm/i915/i91
 file	external/bsd/drm2/dist/drm/i915/i915_suspend.c	i915drmkms
 file	external/bsd/drm2/i915drm/i915_sysfs.c		i915drmkms
 file	external/bsd/drm2/dist/drm/i915/i915_ums.c	i915drmkms
-#file	external/bsd/drm2/dist/drm/i915/intel_acpi.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_acpi.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/intel_bios.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/intel_crt.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/intel_ddi.c	i915drmkms

Index: src/sys/external/bsd/drm2/include/linux/acpi.h
diff -u src/sys/external/bsd/drm2/include/linux/acpi.h:1.2 src/sys/external/bsd/drm2/include/linux/acpi.h:1.3
--- src/sys/external/bsd/drm2/include/linux/acpi.h:1.2	Tue Mar 18 18:20:43 2014
+++ src/sys/external/bsd/drm2/include/linux/acpi.h	Wed Nov  5 23:46:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $	*/
+/*	$NetBSD: acpi.h,v 1.3 2014/11/05 23:46:09 nonaka Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,4 +32,6 @@
 #ifndef _LINUX_ACPI_H_
 #define _LINUX_ACPI_H_
 
+#include <dev/acpi/acpivar.h>
+
 #endif  /* _LINUX_ACPI_H_ */

Index: src/sys/external/bsd/drm2/include/linux/pci.h
diff -u src/sys/external/bsd/drm2/include/linux/pci.h:1.9 src/sys/external/bsd/drm2/include/linux/pci.h:1.10
--- src/sys/external/bsd/drm2/include/linux/pci.h:1.9	Thu Oct 16 12:31:23 2014
+++ src/sys/external/bsd/drm2/include/linux/pci.h	Wed Nov  5 23:46:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: pci.h,v 1.9 2014/10/16 12:31:23 riastradh Exp $	*/
+/*	$NetBSD: pci.h,v 1.10 2014/11/05 23:46:09 nonaka Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,6 +32,12 @@
 #ifndef _LINUX_PCI_H_
 #define _LINUX_PCI_H_
 
+#if defined(i386) || defined(amd64)
+#include "acpica.h"
+#else	/* !(i386 || amd64) */
+#define NACPICA	0
+#endif	/* i386 || amd64 */
+
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -46,10 +52,15 @@
 #include <dev/pci/pcivar.h>
 #include <dev/pci/agpvar.h>
 
+#include <dev/acpi/acpivar.h>
+#include <dev/acpi/acpi_pci.h>
+
 #include <linux/dma-mapping.h>
 #include <linux/ioport.h>
 
-struct pci_bus;
+struct pci_bus {
+	u_int		number;
+};
 
 struct pci_device_id {
 	uint32_t	vendor;
@@ -122,6 +133,7 @@ struct pci_dev {
 		void __pci_iomem	*kva;
 	}			pd_resources[PCI_NUM_RESOURCES];
 	struct pci_conf_state	*pd_saved_state;
+	struct acpi_devnode	*pd_ad;
 	struct device		dev;		/* XXX Don't believe me!  */
 	struct pci_bus		*bus;
 	uint32_t		devfn;
@@ -152,7 +164,14 @@ linux_pci_dev_init(struct pci_dev *pdev,
 	pdev->pd_kludges = kludges;
 	pdev->pd_rom_vaddr = NULL;
 	pdev->pd_dev = dev;
-	pdev->bus = NULL;	/* XXX struct pci_dev::bus */
+#if (NACPICA > 0)
+	pdev->pd_ad = acpi_pcidev_find(0 /*XXX segment*/, pa->pa_bus,
+	    pa->pa_device, pa->pa_function);
+#else
+	pdev->pd_ad = NULL;
+#endif
+	pdev->bus = kmem_zalloc(sizeof(struct pci_bus), KM_NOSLEEP);
+	pdev->bus->number = pa->pa_bus;
 	pdev->devfn = PCI_DEVFN(pa->pa_device, pa->pa_function);
 	pdev->vendor = PCI_VENDOR(pa->pa_id);
 	pdev->device = PCI_PRODUCT(pa->pa_id);

Reply via email to