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