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 <[email protected]>
+ * 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;
+}