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);