Module Name: src Committed By: riastradh Date: Fri Apr 25 23:54:59 UTC 2014
Modified Files: src/sys/dev/ic: apple_smc.c src/sys/external/bsd/drm2/dist/drm/i915: intel_bios.c src/sys/external/bsd/drm2/include/linux: dmi.h init.h src/sys/external/bsd/drm2/linux: files.drmkms_linux Added Files: src/sys/external/bsd/drm2/linux: linux_dmi.c Log Message: Implement Linux dmi_check_system API. Use it to get a Thinkpad quirk for i915 graphics. Patch from nonoka@, PR 48708. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/ic/apple_smc.c cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/dmi.h \ src/sys/external/bsd/drm2/include/linux/init.h cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/linux/files.drmkms_linux cvs rdiff -u -r0 -r1.1 src/sys/external/bsd/drm2/linux/linux_dmi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ic/apple_smc.c diff -u src/sys/dev/ic/apple_smc.c:1.5 src/sys/dev/ic/apple_smc.c:1.6 --- src/sys/dev/ic/apple_smc.c:1.5 Tue Apr 1 17:49:17 2014 +++ src/sys/dev/ic/apple_smc.c Fri Apr 25 23:54:59 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: apple_smc.c,v 1.5 2014/04/01 17:49:17 riastradh Exp $ */ +/* $NetBSD: apple_smc.c,v 1.6 2014/04/25 23:54:59 riastradh Exp $ */ /* * Apple System Management Controller @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: apple_smc.c,v 1.5 2014/04/01 17:49:17 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: apple_smc.c,v 1.6 2014/04/25 23:54:59 riastradh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -480,6 +480,7 @@ apple_smc_key_search(struct apple_smc_ta { struct apple_smc_key *key; uint32_t start = 0, end = apple_smc_nkeys(smc), median; + int cmp; int error; /* Do a binary search on the SMC's key space. */ @@ -489,10 +490,14 @@ apple_smc_key_search(struct apple_smc_ta if (error) return error; - if (memcmp(name, apple_smc_key_name(key), 4) < 0) + cmp = memcmp(name, apple_smc_key_name(key), 4); + if (cmp < 0) end = median; - else + else if (cmp > 0) start = (median + 1); + else + start = end = median; /* stop here */ + apple_smc_release_key(smc, key); } Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c:1.2 Tue Mar 18 18:20:42 2014 +++ src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c Fri Apr 25 23:54:59 2014 @@ -662,7 +662,6 @@ init_vbt_defaults(struct drm_i915_privat DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); } -#ifndef __NetBSD__ /* XXX dmi hack */ static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) { DRM_DEBUG_KMS("Falling back to manually reading VBT from " @@ -680,9 +679,8 @@ static const struct dmi_system_id intel_ DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"), }, }, - { } + { 0, } }; -#endif /** * intel_parse_bios - find VBT and initialize settings from the BIOS @@ -706,7 +704,6 @@ intel_parse_bios(struct drm_device *dev) init_vbt_defaults(dev_priv); -#ifndef __NetBSD__ /* XXX dmi hack */ /* XXX Should this validation be moved to intel_opregion.c? */ if (!dmi_check_system(intel_no_opregion_vbt) && dev_priv->opregion.vbt) { struct vbt_header *vbt = dev_priv->opregion.vbt; @@ -717,7 +714,6 @@ intel_parse_bios(struct drm_device *dev) } else dev_priv->opregion.vbt = NULL; } -#endif if (bdb == NULL) { struct vbt_header *vbt = NULL; Index: src/sys/external/bsd/drm2/include/linux/dmi.h diff -u src/sys/external/bsd/drm2/include/linux/dmi.h:1.2 src/sys/external/bsd/drm2/include/linux/dmi.h:1.3 --- src/sys/external/bsd/drm2/include/linux/dmi.h:1.2 Tue Mar 18 18:20:43 2014 +++ src/sys/external/bsd/drm2/include/linux/dmi.h Fri Apr 25 23:54:59 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dmi.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $ */ +/* $NetBSD: dmi.h,v 1.3 2014/04/25 23:54:59 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -32,4 +32,42 @@ #ifndef _LINUX_DMI_H_ #define _LINUX_DMI_H_ +enum dmi_field { + DMI_NONE, + DMI_BIOS_VENDOR, + DMI_BIOS_VERSION, + DMI_BIOS_DATE, + DMI_SYS_VENDOR, + DMI_PRODUCT_NAME, + DMI_PRODUCT_VERSION, + DMI_PRODUCT_SERIAL, + DMI_PRODUCT_UUID, + DMI_BOARD_VENDOR, + DMI_BOARD_NAME, + DMI_BOARD_VERSION, + DMI_BOARD_SERIAL, + DMI_BOARD_ASSET_TAG, + DMI_CHASSIS_VENDOR, + DMI_CHASSIS_TYPE, + DMI_CHASSIS_VERSION, + DMI_CHASSIS_SERIAL, + DMI_CHASSIS_ASSET_TAG, + DMI_STRING_MAX +}; + +struct dmi_strmatch { + unsigned char slot; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; +}; +#define DMI_MATCH(a, b) {(a), (b)} +#define DMI_EXACT_MATCH(a, b) {(a), (b)} + +int dmi_check_system(const struct dmi_system_id *list); + #endif /* _LINUX_DMI_H_ */ Index: src/sys/external/bsd/drm2/include/linux/init.h diff -u src/sys/external/bsd/drm2/include/linux/init.h:1.2 src/sys/external/bsd/drm2/include/linux/init.h:1.3 --- src/sys/external/bsd/drm2/include/linux/init.h:1.2 Tue Mar 18 18:20:43 2014 +++ src/sys/external/bsd/drm2/include/linux/init.h Fri Apr 25 23:54:59 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: init.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $ */ +/* $NetBSD: init.h,v 1.3 2014/04/25 23:54:59 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -32,4 +32,6 @@ #ifndef _LINUX_INIT_H_ #define _LINUX_INIT_H_ +#define __init + #endif /* _LINUX_INIT_H_ */ Index: src/sys/external/bsd/drm2/linux/files.drmkms_linux diff -u src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.4 src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.5 --- src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.4 Tue Apr 1 15:08:58 2014 +++ src/sys/external/bsd/drm2/linux/files.drmkms_linux Fri Apr 25 23:54:59 2014 @@ -1,10 +1,11 @@ -# $NetBSD: files.drmkms_linux,v 1.4 2014/04/01 15:08:58 riastradh Exp $ +# $NetBSD: files.drmkms_linux,v 1.5 2014/04/25 23:54:59 riastradh Exp $ define drmkms_linux: i2cexec, i2c_bitbang 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_dmi.c drmkms_linux file external/bsd/drm2/linux/linux_gfp.c drmkms_linux file external/bsd/drm2/linux/linux_kmap.c drmkms_linux file external/bsd/drm2/linux/linux_i2c.c drmkms_linux Added files: Index: src/sys/external/bsd/drm2/linux/linux_dmi.c diff -u /dev/null src/sys/external/bsd/drm2/linux/linux_dmi.c:1.1 --- /dev/null Fri Apr 25 23:54:59 2014 +++ src/sys/external/bsd/drm2/linux/linux_dmi.c Fri Apr 25 23:54:59 2014 @@ -0,0 +1,120 @@ +/* $NetBSD: linux_dmi.c,v 1.1 2014/04/25 23:54:59 riastradh Exp $ */ + +/*- + * Copyright (C) 2014 NONAKA Kimihiro <non...@netbsd.org> + * All rights reserved. + * + * 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 AUTHOR ``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 AUTHOR 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: linux_dmi.c,v 1.1 2014/04/25 23:54:59 riastradh Exp $"); + +#include <sys/param.h> +#include <sys/types.h> +#include <sys/pmf.h> + +#include <linux/dmi.h> + +static bool +dmi_found(const struct dmi_system_id *dsi) +{ + const char *p; + int i, slot; + + for (i = 0; i < __arraycount(dsi->matches); i++) { + p = NULL; + slot = dsi->matches[i].slot; + switch (slot) { + case DMI_NONE: + continue; + case DMI_BIOS_VENDOR: + p = pmf_get_platform("bios-vendor"); + break; + case DMI_BIOS_VERSION: + p = pmf_get_platform("bios-version"); + break; + case DMI_BIOS_DATE: + p = pmf_get_platform("bios-date"); + break; + case DMI_SYS_VENDOR: + p = pmf_get_platform("system-vendor"); + break; + case DMI_PRODUCT_NAME: + p = pmf_get_platform("system-product"); + break; + case DMI_PRODUCT_VERSION: + p = pmf_get_platform("system-version"); + break; + case DMI_PRODUCT_SERIAL: + p = pmf_get_platform("system-serial"); + break; + case DMI_PRODUCT_UUID: + p = pmf_get_platform("system-uuid"); + break; + case DMI_BOARD_VENDOR: + p = pmf_get_platform("board-vendor"); + break; + case DMI_BOARD_NAME: + p = pmf_get_platform("board-product"); + break; + case DMI_BOARD_VERSION: + p = pmf_get_platform("board-version"); + break; + case DMI_BOARD_SERIAL: + p = pmf_get_platform("board-serial"); + break; + case DMI_BOARD_ASSET_TAG: + p = pmf_get_platform("board-asset-tag"); + break; + case DMI_CHASSIS_VENDOR: + case DMI_CHASSIS_TYPE: + case DMI_CHASSIS_VERSION: + case DMI_CHASSIS_SERIAL: + case DMI_CHASSIS_ASSET_TAG: + return false; + case DMI_STRING_MAX: + default: + aprint_error("%s: unknown DMI field(%d)\n", __func__, + slot); + return false; + } + if (p == NULL || strcmp(p, dsi->matches[i].substr)) + return false; + } + return true; +} + +int +dmi_check_system(const struct dmi_system_id *sysid) +{ + const struct dmi_system_id *dsi; + int num = 0; + + for (dsi = sysid; dsi->matches[0].slot != DMI_NONE; dsi++) { + if (dmi_found(dsi)) { + num++; + if (dsi->callback && dsi->callback(dsi)) + break; + } + } + return num; +}