Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2 Implement Linux dmi_check_system API.



details:   https://anonhg.NetBSD.org/src/rev/50e35843d861
branches:  trunk
changeset: 328964:50e35843d861
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Fri Apr 25 23:54:59 2014 +0000

description:
Implement Linux dmi_check_system API.

Use it to get a Thinkpad quirk for i915 graphics.

Patch from nonoka@, PR 48708.

diffstat:

 sys/external/bsd/drm2/dist/drm/i915/intel_bios.c |    6 +-
 sys/external/bsd/drm2/include/linux/dmi.h        |   40 +++++++-
 sys/external/bsd/drm2/include/linux/init.h       |    4 +-
 sys/external/bsd/drm2/linux/files.drmkms_linux   |    3 +-
 sys/external/bsd/drm2/linux/linux_dmi.c          |  120 +++++++++++++++++++++++
 5 files changed, 165 insertions(+), 8 deletions(-)

diffs (246 lines):

diff -r a0f33643d760 -r 50e35843d861 sys/external/bsd/drm2/dist/drm/i915/intel_bios.c
--- a/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c  Fri Apr 25 23:54:58 2014 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c  Fri Apr 25 23:54:59 2014 +0000
@@ -662,7 +662,6 @@
        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 @@
                        DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"),
                },
        },
-       { }
+       { 0, }
 };
-#endif
 
 /**
  * intel_parse_bios - find VBT and initialize settings from the BIOS
@@ -706,7 +704,6 @@
 
        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 @@
                } else
                        dev_priv->opregion.vbt = NULL;
        }
-#endif
 
        if (bdb == NULL) {
                struct vbt_header *vbt = NULL;
diff -r a0f33643d760 -r 50e35843d861 sys/external/bsd/drm2/include/linux/dmi.h
--- a/sys/external/bsd/drm2/include/linux/dmi.h Fri Apr 25 23:54:58 2014 +0000
+++ b/sys/external/bsd/drm2/include/linux/dmi.h Fri Apr 25 23:54:59 2014 +0000
@@ -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_ */
diff -r a0f33643d760 -r 50e35843d861 sys/external/bsd/drm2/include/linux/init.h
--- a/sys/external/bsd/drm2/include/linux/init.h        Fri Apr 25 23:54:58 2014 +0000
+++ b/sys/external/bsd/drm2/include/linux/init.h        Fri Apr 25 23:54:59 2014 +0000
@@ -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_ */
diff -r a0f33643d760 -r 50e35843d861 sys/external/bsd/drm2/linux/files.drmkms_linux
--- a/sys/external/bsd/drm2/linux/files.drmkms_linux    Fri Apr 25 23:54:58 2014 +0000
+++ b/sys/external/bsd/drm2/linux/files.drmkms_linux    Fri Apr 25 23:54:59 2014 +0000
@@ -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
diff -r a0f33643d760 -r 50e35843d861 sys/external/bsd/drm2/linux/linux_dmi.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/external/bsd/drm2/linux/linux_dmi.c   Fri Apr 25 23:54:59 2014 +0000
@@ -0,0 +1,120 @@
+/*     $NetBSD: linux_dmi.c,v 1.1 2014/04/25 23:54:59 riastradh Exp $  */
+
+/*-
+ * Copyright (C) 2014 NONAKA Kimihiro <nonaka%netbsd.org@localhost>
+ * 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;
+}



Home | Main Index | Thread Index | Old Index