pkgsrc/sysutils/i810switch/patches/patch-ac

207 lines
4.7 KiB
Text

$NetBSD: patch-ac,v 1.1 2006/12/04 04:42:03 christos Exp $
--- i810switch.c 2005-06-12 00:36:36.000000000 -0400
+++ i810switch.c 2006-12-03 23:12:44.000000000 -0500
@@ -1,3 +1,4 @@
+#include <assert.h>
#include <stdarg.h>
#include <stdlib.h>
#include <fcntl.h>
@@ -9,7 +10,11 @@
#include <errno.h>
#define VERSION "0.6.5beta"
+#ifdef __NetBSD__
+#define CMD_LSPCI "pcictl /dev/pci0"
+#else
#define CMD_LSPCI "lspci"
+#endif
static const char *Opt_lcd = NULL;
static const char *Opt_crt = NULL;
@@ -49,19 +54,31 @@
/* PCI IDs */
-#define I810STR "8086:7121"
-#define I810ESTR "8086:7123"
-#define I810_DC100STR_1 "8086:7125"
-#define I810_DC100STR_2 "8086:1102"
-#define I810_IGSTR "8086:1112"
-#define I810_CFCSTR "8086:1132"
-#define I830STR "8086:3577"
-#define I845STR "8086:2562"
-#define I855STR "8086:3582"
-//#define I865STR "8086:2572"
-#define I915STR "8086:2592"
-#define MEMSTR "Memory at"
+static const struct {
+ char *id;
+ int type;
+} i8xx[] = {
+/* I810STR */ { "7121", I810 },
+/* I810ESTR */ { "7123", I810 },
+/* I810_DC100STR_1 */ { "7125", I810 },
+/* I810_DC100STR_2 */ { "1102", I810 },
+/* I810_IGSTR */ { "1112", I810 },
+/* I810_CFCSTR */ { "1132", I810 },
+/* I830STR */ { "3577", I830 },
+/* I845STR */ { "2562", I855 },
+/* I855STR */ { "3582", I855 },
+/* I865STR { "2572", I865 }, */
+/* I915STR */ { "2592", I915 },
+ { NULL, 0 },
+};
+
+#ifdef __NetBSD__
+#define NONPRSTR "32-bit nonprefetchable memory"
+#define MEMSTR "base:"
+#else
#define NONPRSTR "32-bit, non-prefetchable"
+#define MEMSTR "Memory at"
+#endif
/* I810 registers */
#define I810_HVSYNC 0x05000
@@ -247,43 +264,25 @@
{
int i;
char *p;
+ char buf[10];
while (getline(buff_ptr, len_ptr, pci_f) > 0) {
- i = (p = strstr(*buff_ptr, I810STR)) != NULL ||
- (p = strstr(*buff_ptr, I810ESTR)) != NULL ||
- (p = strstr(*buff_ptr, I810_DC100STR_1)) != NULL ||
- (p = strstr(*buff_ptr, I810_DC100STR_2)) != NULL ||
- (p = strstr(*buff_ptr, I810_IGSTR)) != NULL ||
- (p = strstr(*buff_ptr, I810_CFCSTR)) != NULL;
- if (i)
- {
- *chiptype = I810;
- return p;
- }
-
- i = (p = strstr(*buff_ptr, I830STR)) != NULL ||
-#if defined (I865STR)
- (p = strstr(*buff_ptr, I865STR)) != NULL ||
-#endif /*defined (I865STR)*/
- (p = strstr(*buff_ptr, I845STR)) != NULL;
- if (i)
- {
- *chiptype = I830;
- return p;
- }
-
- i = (p = strstr(*buff_ptr, I855STR)) != NULL;
- if (i)
- {
- *chiptype = I855;
- return p;
- }
-
- i = (p = strstr(*buff_ptr, I915STR)) != NULL;
- if (i)
- {
- *chiptype = I915;
+ for (i = 0; i8xx[i].id != NULL; i++) {
+#ifdef __NetBSD__
+ snprintf(buf, sizeof(buf), "%s8086", i8xx[i].id);
+#else
+ snprintf(buf, sizeof(buf), "8086:%s", i8xx[i].id);
+#endif
+ if ((p = strstr(*buff_ptr, buf)) != NULL)
+ break;
+ }
+ if (i8xx[i].id) {
+ *chiptype = i8xx[i].type;
+#ifdef __NetBSD__
+ return *buff_ptr;
+#else
return p;
+#endif
}
}
return NULL;
@@ -293,12 +292,16 @@
{
char *p;
- while (getline(buff_ptr, len_ptr, pci_f) > 0)
+ while (getline(buff_ptr, len_ptr, pci_f) > 0) {
if (strstr(*buff_ptr, NONPRSTR) != NULL) {
+#ifdef __NetBSD__
+ assert(getline(buff_ptr, len_ptr, pci_f) > 0);
+#endif
p = strstr(*buff_ptr, MEMSTR);
if (p != NULL)
return strtoul(p+sizeof(MEMSTR), NULL, 16);
}
+ }
return 0;
}
@@ -319,7 +322,11 @@
int i, crt = -1, lcd = -1, probe = 0, err = 0, count = 0, chiptype, len = 0;
FILE *pci_f;
char *buff = NULL;
+#ifdef __NetBSD__
+ char lspcistr[] = CMD_LSPCI " dump -d %d -f %d";
+#else
char lspcistr[] = CMD_LSPCI " -v -d xxxx:xxxx";
+#endif
char *chip;
putenv("PATH=/sbin:/usr/sbin:/bin:/usr/bin");
@@ -357,7 +364,11 @@
}
}
- pci_f = popen(CMD_LSPCI " -n", "r");
+ pci_f = popen(CMD_LSPCI
+#ifdef __NetBSD__
+ " list"
+#endif
+ " -n", "r");
if (!pci_f) {
fprintf(stderr, "Something is wrong with lspci.\n");
exit(1);
@@ -369,6 +380,19 @@
}
pclose(pci_f);
+#ifdef __NetBSD__
+ {
+ char cmd[100];
+ int dev = -1, fun = -1;
+ sscanf(chip, "000:%d:%d:", &dev, &fun);
+ if (dev == -1 || fun == -1) {
+ fprintf(stderr, "CMD_LSPCI is wrong.\n");
+ exit(1);
+ }
+ snprintf(cmd, sizeof(cmd), lspcistr, dev, fun);
+ pci_f = popen(cmd, "r");
+ }
+#else
{
char *p = strstr(lspcistr, "xxxx:xxxx");
if (p == 0) {
@@ -376,16 +400,17 @@
exit(1);
}
memcpy(p, chip, 9);
+ pci_f = popen(lspcistr, "r");
}
+#endif
- pci_f = popen(lspcistr, "r");
if (!pci_f) {
fprintf(stderr, "Something is wrong with lspci.\n");
exit(1);
}
addr = i810_addr(&buff, &len, pci_f);
if (addr == 0) {
- fprintf(stderr, "Something is wrong with lspci.\n");
+ fprintf(stderr, "Something is wrong with lspci.\n");
exit(1);
}
pclose(pci_f);