NetBSD-Bugs archive

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

Re: kern/48708: i915drmkms(4): Can't probe dual-link LVDS setting.



Hi,

2014-04-24 4:50 GMT+09:00 Taylor R Campbell <riastradh%netbsd.org@localhost>:

>  Right above the code you added in your patch, there is an `#ifndef
>  __NetBSD__' block with a conditional on dmi_check_system.  Does the
>  body of the conditional work for you?  If so, we should just adapt
>  dmi_check_system to NetBSD rather than duplicating the code.  If not,
>  it seems to me intel_opregion.c is probably incorrectly computing the
>  offsets, and that should be fixed.

Where can I find dmi_check_system() in NetBSD repository? ;-)

I tested with attached new patch without previous patch.
dmi_check_system code block seems to work fine for me.
I think my previous patch is not need, too.

Regards,
-- 
NONAKA Kimihiro
Index: sys/external/bsd/drm2/dist/drm/i915/intel_bios.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/i915/intel_bios.c,v
retrieving revision 1.2
diff -u -r1.2 intel_bios.c
--- sys/external/bsd/drm2/dist/drm/i915/intel_bios.c    18 Mar 2014 18:20:42 
-0000      1.2
+++ sys/external/bsd/drm2/dist/drm/i915/intel_bios.c    24 Apr 2014 13:07:27 
-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;
Index: sys/external/bsd/drm2/include/linux/dmi.h
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/include/linux/dmi.h,v
retrieving revision 1.2
diff -u -r1.2 dmi.h
--- sys/external/bsd/drm2/include/linux/dmi.h   18 Mar 2014 18:20:43 -0000      
1.2
+++ sys/external/bsd/drm2/include/linux/dmi.h   24 Apr 2014 13:07:27 -0000
@@ -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: sys/external/bsd/drm2/include/linux/init.h
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/include/linux/init.h,v
retrieving revision 1.2
diff -u -r1.2 init.h
--- sys/external/bsd/drm2/include/linux/init.h  18 Mar 2014 18:20:43 -0000      
1.2
+++ sys/external/bsd/drm2/include/linux/init.h  24 Apr 2014 13:07:27 -0000
@@ -32,4 +32,6 @@
 #ifndef _LINUX_INIT_H_
 #define _LINUX_INIT_H_
 
+#define __init
+
 #endif  /* _LINUX_INIT_H_ */
Index: sys/external/bsd/drm2/linux/files.drmkms_linux
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/linux/files.drmkms_linux,v
retrieving revision 1.4
diff -u -r1.4 files.drmkms_linux
--- sys/external/bsd/drm2/linux/files.drmkms_linux      1 Apr 2014 15:08:58 
-0000       1.4
+++ sys/external/bsd/drm2/linux/files.drmkms_linux      24 Apr 2014 13:07:27 
-0000
@@ -5,6 +5,7 @@
 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
Index: sys/external/bsd/drm2/linux/linux_dmi.c
===================================================================
RCS file: sys/external/bsd/drm2/linux/linux_dmi.c
diff -N sys/external/bsd/drm2/linux/linux_dmi.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ sys/external/bsd/drm2/linux/linux_dmi.c     24 Apr 2014 13:07:27 -0000
@@ -0,0 +1,120 @@
+/*     $NetBSD$        */
+
+/*-
+ * 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$");
+
+#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