Module Name:    xsrc
Committed By:   jmcneill
Date:           Mon Nov 14 11:26:52 UTC 2011

Modified Files:
        xsrc/external/mit/xf86-video-intel/dist/src: i830_quirks.c

Log Message:
Use sysctl machdep.dmi.* instead of /sys/class/dmi/id/* for extracting DMI info 
on NetBSD


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.2 -r1.2 \
    xsrc/external/mit/xf86-video-intel/dist/src/i830_quirks.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/xf86-video-intel/dist/src/i830_quirks.c
diff -u xsrc/external/mit/xf86-video-intel/dist/src/i830_quirks.c:1.1.1.2 xsrc/external/mit/xf86-video-intel/dist/src/i830_quirks.c:1.2
--- xsrc/external/mit/xf86-video-intel/dist/src/i830_quirks.c:1.1.1.2	Tue Jun  9 02:54:33 2009
+++ xsrc/external/mit/xf86-video-intel/dist/src/i830_quirks.c	Mon Nov 14 11:26:52 2011
@@ -32,8 +32,14 @@
 
 #define SUBSYS_ANY (~0)
 
+#ifdef __NetBSD__
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#define DMIID_SYSCTL_PREFIX "machdep.dmi."
+#else
 #define DMIID_DIR "/sys/class/dmi/id/"
 #define DMIID_FILE(x) (DMIID_DIR # x)
+#endif
 
 typedef struct {
     int chipType;
@@ -66,6 +72,62 @@ enum i830_dmi_data_t {
 
 static char *i830_dmi_data[dmi_data_max];
 
+#ifdef __NetBSD__
+/* NetBSD 6.0+ stores DMI data in sysctl machdep.dmi.* */
+static void
+i830_dmi_sysctl_load(enum i830_dmi_data_t field)
+{
+	const char *name;
+	char *buf;
+	size_t buflen = 0;
+	int err;
+
+	switch (field) {
+	case bios_vendor:	name = DMIID_SYSCTL_PREFIX "bios-vendor"; break;
+	case bios_version:	name = DMIID_SYSCTL_PREFIX "bios-version"; break;
+	case bios_date:		name = DMIID_SYSCTL_PREFIX "bios-date"; break;
+	case sys_vendor:	name = DMIID_SYSCTL_PREFIX "system-vendor"; break;
+	case product_name:	name = DMIID_SYSCTL_PREFIX "system-product"; break;
+	case product_version:	name = DMIID_SYSCTL_PREFIX "system-version"; break;
+	case product_serial:	name = DMIID_SYSCTL_PREFIX "system-serial"; break;
+	case product_uuid:	name = DMIID_SYSCTL_PREFIX "system-uuid"; break;
+	case board_vendor:	name = DMIID_SYSCTL_PREFIX "board-vendor"; break;
+	case board_name:	name = DMIID_SYSCTL_PREFIX "board-product"; break;
+	case board_version:	name = DMIID_SYSCTL_PREFIX "board-version"; break;
+	case board_serial:	name = DMIID_SYSCTL_PREFIX "board-serial"; break;
+	default:		goto not_found;
+	}
+
+	err = sysctlbyname(name, buf, &buflen, NULL, 0);
+	if (err || buflen == 0)
+		goto not_found;
+
+	buf = xcalloc(1, buflen);
+	if (buf == NULL)
+		goto not_found;
+
+	err = sysctlbyname(name, buf, &buflen, NULL, 0);
+	if (err)
+		goto not_found;
+
+	/* i830_dmi_scan uses a fixed-size buffer, use our own instead */
+	xfree(i830_dmi_data[field]);
+	i830_dmi_data[field] = buf;
+
+	return;
+
+not_found:
+	xfree(i830_dmi_data[field]);
+	i830_dmi_data[field] = NULL;
+}
+
+#define I830_DMI_FIELD_FUNC(field) \
+static void i830_dmi_store_##field(void) \
+{\
+    i830_dmi_sysctl_load(field);\
+}
+#else
+/* Linux stores DMI data in /sys/class/dmi/id/... */
 #define I830_DMI_FIELD_FUNC(field) \
 static void i830_dmi_store_##field(void) \
 {\
@@ -78,6 +140,7 @@ static void i830_dmi_store_##field(void)
     fread(i830_dmi_data[field], 64, 1, f);\
     fclose(f);\
 }
+#endif
 
 I830_DMI_FIELD_FUNC(bios_vendor);
 I830_DMI_FIELD_FUNC(bios_version);

Reply via email to