f009429503
chips.
207 lines
4.7 KiB
Text
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);
|