Module Name: src Committed By: riastradh Date: Sun Dec 19 10:25:15 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915: i915_drv.c src/sys/external/bsd/drm2/dist/drm/i915/display: intel_acpi.c intel_acpi.h Log Message: Restore local intel_acpi changes. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.c \ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.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_drv.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.23 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.24 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.23 Sun Dec 19 10:25:00 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c Sun Dec 19 10:25:15 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_drv.c,v 1.23 2021/12/19 10:25:00 riastradh Exp $ */ +/* $NetBSD: i915_drv.c,v 1.24 2021/12/19 10:25:15 riastradh Exp $ */ /* i915_drv.c -- i830,i845,i855,i865,i915 driver -*- linux-c -*- */ @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v 1.23 2021/12/19 10:25:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v 1.24 2021/12/19 10:25:15 riastradh Exp $"); #include <linux/acpi.h> #include <linux/device.h> @@ -308,7 +308,11 @@ static int i915_driver_modeset_probe(str goto out; #endif +#ifdef __NetBSD__ + intel_register_dsm_handler(i915); +#else intel_register_dsm_handler(); +#endif ret = i915_switcheroo_register(i915); if (ret) Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.c:1.2 Sat Dec 18 23:45:29 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.c Sun Dec 19 10:25:15 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: intel_acpi.c,v 1.2 2021/12/18 23:45:29 riastradh Exp $ */ +/* $NetBSD: intel_acpi.c,v 1.3 2021/12/19 10:25:15 riastradh Exp $ */ // SPDX-License-Identifier: GPL-2.0 /* @@ -8,7 +8,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intel_acpi.c,v 1.2 2021/12/18 23:45:29 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intel_acpi.c,v 1.3 2021/12/19 10:25:15 riastradh Exp $"); #include <linux/pci.h> #include <linux/acpi.h> @@ -16,6 +16,105 @@ __KERNEL_RCSID(0, "$NetBSD: intel_acpi.c #include "i915_drv.h" #include "intel_acpi.h" +#ifdef __NetBSD__ + +#include <dev/acpi/acpireg.h> +#define _COMPONENT ACPI_BUTTON_COMPONENT +ACPI_MODULE_NAME("acpi_intel_brightness") + +#define acpi_handle ACPI_HANDLE +#define buffer Buffer +#define elements Elements +#define integer Integer +#define package Package +#define value Value + +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 */ @@ -78,7 +177,11 @@ static char *intel_dsm_mux_type(u8 type) static void intel_dsm_platform_mux_info(acpi_handle dhandle) { int i; +#ifdef __NetBSD__ + ACPI_OBJECT *pkg, *connector_count; +#else union acpi_object *pkg, *connector_count; +#endif pkg = acpi_evaluate_dsm_typed(dhandle, &intel_dsm_guid, INTEL_DSM_REVISION_ID, INTEL_DSM_FN_PLATFORM_MUX_INFO, @@ -92,9 +195,15 @@ static void intel_dsm_platform_mux_info( DRM_DEBUG_DRIVER("MUX info connectors: %lld\n", (unsigned long long)connector_count->integer.value); for (i = 1; i < pkg->package.count; i++) { +#ifdef __NetBSD__ + ACPI_OBJECT *obj = &pkg->package.elements[i]; + ACPI_OBJECT *connector_id = &obj->package.elements[0]; + ACPI_OBJECT *info = &obj->package.elements[1]; +#else union acpi_object *obj = &pkg->package.elements[i]; union acpi_object *connector_id = &obj->package.elements[0]; union acpi_object *info = &obj->package.elements[1]; +#endif DRM_DEBUG_DRIVER("Connector id: 0x%016llx\n", (unsigned long long)connector_id->integer.value); DRM_DEBUG_DRIVER(" port id: %s\n", @@ -110,13 +219,19 @@ static void intel_dsm_platform_mux_info( ACPI_FREE(pkg); } +#ifdef __NetBSD__ +static bool intel_dsm_pci_probe(ACPI_HANDLE dhandle) +#else static acpi_handle intel_dsm_pci_probe(struct pci_dev *pdev) +#endif { +#ifndef __NetBSD__ acpi_handle dhandle; dhandle = ACPI_HANDLE(&pdev->dev); if (!dhandle) return NULL; +#endif if (!acpi_check_dsm(dhandle, &intel_dsm_guid, INTEL_DSM_REVISION_ID, 1 << INTEL_DSM_FN_PLATFORM_MUX_INFO)) { @@ -129,6 +244,52 @@ static acpi_handle intel_dsm_pci_probe(s return dhandle; } +#ifdef __NetBSD__ + +static int vga_count; +static 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) +{ + + if (!DEVICE_IS_VGA_PCI(pa->pa_class, pa->pa_id)) + return 0; + + vga_count++; + struct acpi_devnode *node = acpi_pcidev_find(0 /*XXX segment*/, + pa->pa_bus, pa->pa_device, pa->pa_function); + if (node != NULL) + 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 }; + + vga_count = 0; + has_dsm = false; + pci_find_device(&dev->pdev->pd_pa, intel_dsm_vga_match); + + if (vga_count == 2 && 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) { acpi_handle dhandle = NULL; @@ -151,12 +312,21 @@ static bool intel_dsm_detect(void) return false; } +#endif +#ifdef __NetBSD__ +void intel_register_dsm_handler(struct drm_i915_private *i915) +{ + if (!intel_dsm_detect(i915->base.pdev)) + return; +} +#else void intel_register_dsm_handler(void) { if (!intel_dsm_detect()) return; } +#endif void intel_unregister_dsm_handler(void) { Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.h diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.h:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.h:1.2 Sat Dec 18 23:45:29 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_acpi.h Sun Dec 19 10:25:15 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: intel_acpi.h,v 1.2 2021/12/18 23:45:29 riastradh Exp $ */ +/* $NetBSD: intel_acpi.h,v 1.3 2021/12/19 10:25:15 riastradh Exp $ */ /* SPDX-License-Identifier: MIT */ /* @@ -8,11 +8,21 @@ #ifndef __INTEL_ACPI_H__ #define __INTEL_ACPI_H__ +struct drm_i915_private; + #ifdef CONFIG_ACPI +#ifdef __NetBSD__ +void intel_register_dsm_handler(struct drm_i915_private *); +#else void intel_register_dsm_handler(void); +#endif void intel_unregister_dsm_handler(void); #else +#ifdef __NetBSD__ +static inline void intel_register_dsm_handler(struct drm_i915_private *) { return; } +#else static inline void intel_register_dsm_handler(void) { return; } +#endif static inline void intel_unregister_dsm_handler(void) { return; } #endif /* CONFIG_ACPI */