From 7d8bed460a6d0c711d1aca65dd4d19a205be4372 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 1 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-01 --- alphapc/fns.h | 1 + alphapc/pci.c | 15 ++++++++++ pc/devi82365.c | 1 - pc/sdata.c | 5 ++++ port/devpnp.c | 75 ++++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 88 insertions(+), 9 deletions(-) diff --git a/alphapc/fns.h b/alphapc/fns.h index 9cf4fc1f5afac3dee97c5447e572c9c715bb245f..4552b73ffdd129f2e3c5e72ec16a627a1637a3e1 100644 --- a/alphapc/fns.h +++ b/alphapc/fns.h @@ -75,6 +75,7 @@ void pcicfgw16(Pcidev*, int, int); void pcicfgw32(Pcidev*, int, int); void pcihinv(Pcidev*); Pcidev* pcimatch(Pcidev*, int, int); +Pcidev* pcimatchtbdf(int); void pcireset(void); void pcisetbme(Pcidev*); void prflush(void); diff --git a/alphapc/pci.c b/alphapc/pci.c index e4897d5c48b54e9cdfe864b5c8f0b7d722d03092..1a8dcdef928666a65a761a2faeda146873d25525 100644 --- a/alphapc/pci.c +++ b/alphapc/pci.c @@ -320,6 +320,21 @@ pcimatch(Pcidev* prev, int vid, int did) return prev; } +Pcidev* +pcimatchtbdf(int tbdf) +{ + Pcidev *pcidev; + + if(pcicfgmode == -1) + pcicfginit(); + + for(pcidev = pcilist; pcidev != nil; pcidev = pcidev->list) { + if(pcidev->tbdf == tbdf) + break; + } + return pcidev; +} + void pcihinv(Pcidev* p) { diff --git a/pc/devi82365.c b/pc/devi82365.c index 58e732ca937bd578941e342d7a2a2df6e4c9eca7..612b05bc3548f3f7ea519957e1fa5b25806c1c6c 100644 --- a/pc/devi82365.c +++ b/pc/devi82365.c @@ -151,7 +151,6 @@ slotinfo(PCMslot *pp) pp->wrprot = isr & (1<<4); pp->busy = isr & (1<<5); pp->msec = TK2MS(MACHP(0)->ticks); -print("isr %2.2uX misc1 %2.2uX\n", isr, rdreg(pp, Rmisc1)); } static int diff --git a/pc/sdata.c b/pc/sdata.c index d936fa8357d488222010801c40cecc2d86cd93fd..f4be934a81731b4d32bbe20a19eccc1c69c9e317 100644 --- a/pc/sdata.c +++ b/pc/sdata.c @@ -1659,6 +1659,11 @@ atapnp(void) */ break; case (0x0646<<16)|0x1095: /* CMD 646 */ + /* + * Is this correct? + */ + pi |= 0x0f; + break; case (0x0571<<16)|0x1106: /* VIA 82C686 */ case (0x0211<<16)|0x1166: /* ServerWorks IB6566 */ case (0x1230<<16)|0x8086: /* 82371FB (PIIX) */ diff --git a/port/devpnp.c b/port/devpnp.c index c51280fd23a4b8a8aae4c6fabec07c0d1fcf8e3c..9434af5e94862eb8e0563012872748b5f06278ba 100644 --- a/port/devpnp.c +++ b/port/devpnp.c @@ -3,6 +3,7 @@ #include "mem.h" #include "dat.h" #include "fns.h" +#include "io.h" #include "../port/error.h" typedef struct Pnp Pnp; @@ -319,10 +320,10 @@ bad: } static int -pnpgen1(Chan *c, int t, int csn, Card *cp, Dir *dp) +csngen(Chan *c, int t, int csn, Card *cp, Dir *dp) { Qid q; - char buf[20]; + static char buf[20]; switch(t) { case Qcsnctl: @@ -339,13 +340,34 @@ pnpgen1(Chan *c, int t, int csn, Card *cp, Dir *dp) return -1; } +static int +pcigen(Chan *c, int t, int tbdf, Dir *dp) +{ + Qid q; + static char name[KNAMELEN]; + + q = (Qid){BUSBDF(tbdf)|t, 0, 0}; + switch(t) { + case Qpcictl: + snprint(name, KNAMELEN, "%d.%d.%dctl", BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf)); + devdir(c, q, name, 0, eve, 0444, dp); + return 1; + case Qpciraw: + snprint(name, KNAMELEN, "%d.%d.%draw", BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf)); + devdir(c, q, name, 128, eve, 0444, dp); + return 1; + } + return -1; +} + static int pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) { Qid q; - int csn; Card *cp; - char name[KNAMELEN]; + Pcidev *p; + int csn, tbdf; + static char name[KNAMELEN]; switch(TYPE(c->qid)){ case Qtopdir: @@ -375,7 +397,7 @@ pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) iunlock(&pnp); if(cp == nil) return -1; - return pnpgen1(c, s+Qcsnctl, cp->csn, cp, dp); + return csngen(c, s+Qcsnctl, cp->csn, cp, dp); case Qpnpctl: return devgen(c, nil, pnpdir, nelem(pnpdir), s, dp); case Qcsnctl: @@ -386,7 +408,29 @@ pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) iunlock(&pnp); if(cp == nil) return -1; - return pnpgen1(c, TYPE(c->qid), csn, cp, dp); + return csngen(c, TYPE(c->qid), csn, cp, dp); + case Qpcidir: + if(s == DEVDOTDOT){ + q = (Qid){QID(0, Qtopdir), 0, QTDIR}; + snprint(name, KNAMELEN, "#%C", pnpdevtab.dc); + devdir(c, q, name, 0, eve, 0555, dp); + return 1; + } + p = pcimatch(nil, 0, 0); + while(s >= 2 && p != nil) { + p = pcimatch(p, 0, 0); + s -= 2; + } + if(p == nil) + return -1; + return pcigen(c, s+Qpcictl, p->tbdf, dp); + case Qpcictl: + case Qpciraw: + tbdf = MKBUS(BusPCI, 0, 0, 0)|BUSBDF((ulong)c->qid.path); + p = pcimatchtbdf(tbdf); + if(p == nil) + return -1; + return pcigen(c, TYPE(c->qid), tbdf, dp); default: break; } @@ -430,9 +474,10 @@ pnpclose(Chan*) static long pnpread(Chan *c, void *va, long n, vlong offset) { - int csn, i; Card *cp; - char *a = va, buf[20]; + Pcidev *p; + int csn, i, tbdf; + char *a = va, buf[256]; switch(TYPE(c->qid)){ case Qtopdir: @@ -474,6 +519,20 @@ pnpread(Chan *c, void *va, long n, vlong offset) error(Egreg); sprint(buf, "%s\n", serial(cp->id1, cp->id2)); return readstr(offset, a, n, buf); + case Qpcictl: + tbdf = MKBUS(BusPCI, 0, 0, 0)|BUSBDF((ulong)c->qid.path); + p = pcimatchtbdf(tbdf); + if(p == nil) + error(Egreg); + snprint(buf, sizeof(buf), "class %.2x subclass %.2x piclass %.2x vid %.4x did %.4x intl %d\n", + p->ccrb, p->ccru, p->ccrp, p->vid, p->did, p->intl); + return readstr(offset, a, n, buf); + case Qpciraw: + tbdf = MKBUS(BusPCI, 0, 0, 0)|BUSBDF((ulong)c->qid.path); + p = pcimatchtbdf(tbdf); + if(p == nil) + error(Egreg); + break; default: error(Egreg); }