$NetBSD: patch-ac,v 1.2 2011/10/01 22:32:11 dholland Exp $ --- i810switch.c.orig 2005-06-12 04:36:36.000000000 +0000 +++ i810switch.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -9,7 +10,11 @@ #include #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 @@ struct i810_par { /* 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 @@ -243,62 +260,48 @@ void probe_card_I830(struct i810_par *pa i810_readl(par->mmio, I830_DSPBSTRIDE)); } -char *i810_chip(char **buff_ptr, int *len_ptr, FILE *pci_f, int* chiptype) +char *i810_chip(char **buff_ptr, size_t *len_ptr, FILE *pci_f, int* chiptype) { 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; } -unsigned long i810_addr(char **buff_ptr, int *len_ptr, FILE *pci_f) +unsigned long i810_addr(char **buff_ptr, size_t *len_ptr, FILE *pci_f) { 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; } @@ -316,10 +319,15 @@ int main (int argc, char *argv[]) { struct i810_par par; unsigned long addr; - int i, crt = -1, lcd = -1, probe = 0, err = 0, count = 0, chiptype, len = 0; + int i, crt = -1, lcd = -1, probe = 0, err = 0, count = 0, chiptype; + size_t 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 +365,11 @@ int main (int argc, char *argv[]) } } - 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 +381,19 @@ int main (int argc, char *argv[]) } 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,9 +401,10 @@ int main (int argc, char *argv[]) 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);