Thanks.

I think we can change our pciutils port to use this instead of the raw
PIO interface.  I'll put that on the TODO list.


Merged to master at ae845bf89452..b34a7f60faa0 (from, to]

You can see the entire diff with 'git diff' or at
https://github.com/brho/akaros/compare/ae845bf89452...b34a7f60faa0


On 2016-08-23 at 15:05 "Ronald G. Minnich" <[email protected]> wrote:
> This is not strictly an AHCI thing but I needed it for
> AHCI debugging. It's been in our tree for a long time and
> it was time to turn it on.
> 
> Usage:
> /bin/bind -a '#pci' /dev
> 
> bash-4.3$ ls /dev/pci
> 0.0.0ctl   0.2.0ctl   0.25.0ctl  0.29.0ctl  0.5.0ctl   1.0.0ctl   6.0.0ctl
> 0.0.0raw   0.2.0raw   0.25.0raw  0.29.0raw  0.5.0raw   1.0.0raw   6.0.0raw
> 0.1.0ctl   0.20.0ctl  0.26.0ctl  0.3.0ctl   0.5.1ctl   1.0.1ctl
> 0.1.0raw   0.20.0raw  0.26.0raw  0.3.0raw   0.5.1raw   1.0.1raw
> 0.17.0ctl  0.22.0ctl  0.28.0ctl  0.31.0ctl  0.5.2ctl   5.0.0ctl
> 0.17.0raw  0.22.0raw  0.28.0raw  0.31.0raw  0.5.2raw   5.0.0raw
> 
> The raw file is the config space; the ctl file is operations.
> 
> This is inherently safer than what we've done to date using
> direct IO to the 0xcf8/cfc addresses, as they are shared
> resources and multiple users can interfere with each other
> (which has been seen in the nature).
> 
> Change-Id: I54e2f0e9af1361bfd8aebf0d7094d2a749f6065b
> Signed-off-by: Ronald G. Minnich <[email protected]>
> ---
>  kern/drivers/dev/Kbuild |   2 +-
>  kern/drivers/dev/pci.c  | 258 
> ++++++++++++++++++++++++------------------------
>  2 files changed, 130 insertions(+), 130 deletions(-)
> 
> diff --git a/kern/drivers/dev/Kbuild b/kern/drivers/dev/Kbuild
> index 040bab3..183bddd 100644
> --- a/kern/drivers/dev/Kbuild
> +++ b/kern/drivers/dev/Kbuild
> @@ -6,7 +6,7 @@ obj-y                                         += ether.o
>  obj-y                                                += eventfd.o
>  obj-y                                                += kprof.o
>  obj-y                                                += mnt.o
> -#obj-y                                               += pci.o
> +obj-y                                                += pci.o
>  obj-y                                                += pipe.o
>  obj-y                                                += proc.o
>  obj-y                                                += random.o
> diff --git a/kern/drivers/dev/pci.c b/kern/drivers/dev/pci.c
> index ab1618b..e37014c 100644
> --- a/kern/drivers/dev/pci.c
> +++ b/kern/drivers/dev/pci.c
> @@ -52,65 +52,65 @@ static int pcidirgen(struct chan *c, int t, int tbdf, 
> struct dir *dp)
>       struct qid q;
>  
>       q = (struct qid) {
> -     BUSBDF(tbdf) | t, 0, 0};
> +             BUSBDF(tbdf) | t, 0, 0};
>       switch (t) {
> -             case Qpcictl:
> -                     snprintf(get_cur_genbuf(), GENBUF_SZ, "%d.%d.%dctl",
> -                                      BUSBNO(tbdf), BUSDNO(tbdf), 
> BUSFNO(tbdf));
> -                     devdir(c, q, get_cur_genbuf(), 0, eve, 0444, dp);
> -                     return 1;
> -             case Qpciraw:
> -                     snprintf(get_cur_genbuf(), GENBUF_SZ, "%d.%d.%draw",
> -                                      BUSBNO(tbdf), BUSDNO(tbdf), 
> BUSFNO(tbdf));
> -                     devdir(c, q, get_cur_genbuf(), 128, eve, 0664, dp);
> -                     return 1;
> +     case Qpcictl:
> +             snprintf(get_cur_genbuf(), GENBUF_SZ, "%d.%d.%dctl",
> +                      BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf));
> +             devdir(c, q, get_cur_genbuf(), 0, eve, 0444, dp);
> +             return 1;
> +     case Qpciraw:
> +             snprintf(get_cur_genbuf(), GENBUF_SZ, "%d.%d.%draw",
> +                      BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf));
> +             devdir(c, q, get_cur_genbuf(), 128, eve, 0664, dp);
> +             return 1;
>       }
>       return -1;
>  }
>  
>  static int
> -pcigen(struct chan *c, char *, struct dirtab *, int unused_int, int s,
> -        struct dir *dp)
> +pcigen(struct chan *c, char *_1, struct dirtab *_2, int _3, int s,
> +       struct dir *dp)
>  {
>       int tbdf;
> -     Pcidev *p;
> +     struct pci_device *p;
>       struct qid q;
>  
>       switch (TYPE(c->qid)) {
> -             case Qtopdir:
> -                     if (s == DEVDOTDOT) {
> -                             q = (struct qid) {
> +     case Qtopdir:
> +             if (s == DEVDOTDOT) {
> +                     q = (struct qid) {
>                               QID(0, Qtopdir), 0, QTDIR};
> -                             snprintf(get_cur_genbuf(), GENBUF_SZ, "#%C", 
> pcidevtab.dc);
> -                             devdir(c, q, get_cur_genbuf(), 0, eve, 0555, 
> dp);
> -                             return 1;
> -                     }
> -                     return devgen(c, NULL, topdir, ARRAY_SIZE(topdir), s, 
> dp);
> -             case Qpcidir:
> -                     if (s == DEVDOTDOT) {
> -                             q = (struct qid) {
> +                     snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s", 
> pcidevtab.name);
> +                     devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
> +                     return 1;
> +             }
> +             return devgen(c, NULL, topdir, ARRAY_SIZE(topdir), s, dp);
> +     case Qpcidir:
> +             if (s == DEVDOTDOT) {
> +                     q = (struct qid) {
>                               QID(0, Qtopdir), 0, QTDIR};
> -                             snprintf(get_cur_genbuf(), GENBUF_SZ, "#%C", 
> pcidevtab.dc);
> -                             devdir(c, q, get_cur_genbuf(), 0, eve, 0555, 
> dp);
> -                             return 1;
> -                     }
> -                     p = pcimatch(NULL, 0, 0);
> -                     while (s >= 2 && p != NULL) {
> -                             p = pcimatch(p, 0, 0);
> -                             s -= 2;
> -                     }
> -                     if (p == NULL)
> -                             return -1;
> -                     return pcidirgen(c, s + Qpcictl, p->tbdf, dp);
> -             case Qpcictl:
> -             case Qpciraw:
> -                     tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) 
> c->qid.path);
> -                     p = pcimatchtbdf(tbdf);
> -                     if (p == NULL)
> -                             return -1;
> -                     return pcidirgen(c, TYPE(c->qid), tbdf, dp);
> -             default:
> -                     break;
> +                     snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s", 
> pcidevtab.name);
> +                     devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
> +                     return 1;
> +             }
> +             STAILQ_FOREACH(p, &pci_devices, all_dev) {
> +                     if (s < 2)
> +                             break;
> +                     s -= 2;
> +             }
> +             if (p == NULL)
> +                     return -1;
> +             return pcidirgen(c, s + Qpcictl, pci_to_tbdf(p), dp);
> +     case Qpcictl:
> +     case Qpciraw:
> +             tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) c->qid.path);
> +             p = pci_match_tbdf(tbdf);
> +             if (p == NULL)
> +                     return -1;
> +             return pcidirgen(c, TYPE(c->qid), tbdf, dp);
> +     default:
> +             break;
>       }
>       return -1;
>  }
> @@ -125,7 +125,7 @@ struct walkqid *pciwalk(struct chan *c, struct chan *nc, 
> char **name, int nname)
>       return devwalk(c, nc, name, nname, (struct dirtab *)0, 0, pcigen);
>  }
>  
> -static long pcistat(struct chan *c, uint8_t * dp, long n)
> +static int pcistat(struct chan *c, uint8_t * dp, int n)
>  {
>       return devstat(c, dp, n, (struct dirtab *)0, 0L, pcigen);
>  }
> @@ -134,13 +134,13 @@ static struct chan *pciopen(struct chan *c, int omode)
>  {
>       c = devopen(c, omode, (struct dirtab *)0, 0, pcigen);
>       switch (TYPE(c->qid)) {
> -             default:
> -                     break;
> +     default:
> +             break;
>       }
>       return c;
>  }
>  
> -static void pciclose(struct chan *)
> +static void pciclose(struct chan *_)
>  {
>  }
>  
> @@ -149,59 +149,59 @@ static long pciread(struct chan *c, void *va, long n, 
> int64_t offset)
>       char buf[PCI_CONFIG_SZ], *ebuf, *w, *a;
>       int i, tbdf, r;
>       uint32_t x;
> -     Pcidev *p;
> +     struct pci_device *p;
>  
>       a = va;
>       switch (TYPE(c->qid)) {
> -             case Qtopdir:
> -             case Qpcidir:
> -                     return devdirread(c, a, n, (struct dirtab *)0, 0L, 
> pcigen);
> -             case Qpcictl:
> -                     tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) 
> c->qid.path);
> -                     p = pcimatchtbdf(tbdf);
> -                     if (p == NULL)
> -                             error(EINVAL, ERROR_FIXME);
> -                     ebuf = buf + sizeof buf - 1;    /* -1 for newline */
> -                     w = seprintf(buf, ebuf, "%.2x.%.2x.%.2x %.4x/%.4x %3d",
> -                                              p->ccrb, p->ccru, p->ccrp, 
> p->vid, p->did, p->intl);
> -                     for (i = 0; i < ARRAY_SIZE(p->mem); i++) {
> -                             if (p->mem[i].size == 0)
> -                                     continue;
> -                             w = seprintf(w, ebuf, " %d:%.8lux %d", i, 
> p->mem[i].bar,
> -                                                      p->mem[i].size);
> -                     }
> -                     *w++ = '\n';
> -                     *w = '\0';
> -                     return readstr(offset, a, n, buf);
> -             case Qpciraw:
> -                     tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) 
> c->qid.path);
> -                     p = pcimatchtbdf(tbdf);
> -                     if (p == NULL)
> -                             error(EINVAL, ERROR_FIXME);
> -                     if (n + offset > 256)
> -                             n = 256 - offset;
> -                     if (n < 0)
> -                             return 0;
> -                     r = offset;
> -                     if (!(r & 3) && n == 4) {
> -                             x = pcicfgr32(p, r);
> -                             PBIT32(a, x);
> -                             return 4;
> -                     }
> -                     if (!(r & 1) && n == 2) {
> -                             x = pcicfgr16(p, r);
> -                             PBIT16(a, x);
> -                             return 2;
> -                     }
> -                     for (i = 0; i < n; i++) {
> -                             x = pcicfgr8(p, r);
> -                             PBIT8(a, x);
> -                             a++;
> -                             r++;
> -                     }
> -                     return i;
> -             default:
> +     case Qtopdir:
> +     case Qpcidir:
> +             return devdirread(c, a, n, (struct dirtab *)0, 0L, pcigen);
> +     case Qpcictl:
> +             tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) c->qid.path);
> +             p = pci_match_tbdf(tbdf);
> +             if (p == NULL)
> +                     error(EINVAL, ERROR_FIXME);
> +             ebuf = buf + sizeof buf - 1;    /* -1 for newline */
> +             w = seprintf(buf, ebuf, "%.2x.%.2x.%.2x %.4x/%.4x %3d",
> +                          p->class, p->subclass, p->progif, p->ven_id, 
> p->dev_id, p->irqline);
> +             for (i = 0; i < COUNT_OF(p->bar); i++) {
> +                     if (p->bar[i].mmio_sz == 0)
> +                             continue;
> +                     w = seprintf(w, ebuf, " %d:%.8lux %d", i, 
> p->bar[i].pio_base,
> +                                  p->bar[i].mmio_sz);
> +             }
> +             *w++ = '\n';
> +             *w = '\0';
> +             return readstr(offset, a, n, buf);
> +     case Qpciraw:
> +             tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) c->qid.path);
> +             p = pci_match_tbdf(tbdf);
> +             if (p == NULL)
>                       error(EINVAL, ERROR_FIXME);
> +             if (n + offset > 256)
> +                     n = 256 - offset;
> +             if (n < 0)
> +                     return 0;
> +             r = offset;
> +             if (!(r & 3) && n == 4) {
> +                     x = pcidev_read32(p, r);
> +                     PBIT32(a, x);
> +                     return 4;
> +             }
> +             if (!(r & 1) && n == 2) {
> +                     x = pcidev_read16(p, r);
> +                     PBIT16(a, x);
> +                     return 2;
> +             }
> +             for (i = 0; i < n; i++) {
> +                     x = pcidev_read8(p, r);
> +                     PBIT8(a, x);
> +                     a++;
> +                     r++;
> +             }
> +             return i;
> +     default:
> +             error(EINVAL, ERROR_FIXME);
>       }
>       return n;
>  }
> @@ -211,47 +211,47 @@ static long pciwrite(struct chan *c, void *va, long n, 
> int64_t offset)
>       uint8_t *a;
>       int i, r, tbdf;
>       uint32_t x;
> -     Pcidev *p;
> +     struct pci_device *p;
>  
>       if (n > PCI_CONFIG_SZ)
>               n = PCI_CONFIG_SZ;
>       a = va;
>  
>       switch (TYPE(c->qid)) {
> -             case Qpciraw:
> -                     tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) 
> c->qid.path);
> -                     p = pcimatchtbdf(tbdf);
> -                     if (p == NULL)
> -                             error(EINVAL, ERROR_FIXME);
> -                     if (offset > PCI_CONFIG_SZ)
> -                             return 0;
> -                     if (n + offset > PCI_CONFIG_SZ)
> -                             n = PCI_CONFIG_SZ - offset;
> -                     r = offset;
> -                     if (!(r & 3) && n == 4) {
> -                             x = GBIT32(a);
> -                             pcicfgw32(p, r, x);
> -                             return 4;
> -                     }
> -                     if (!(r & 1) && n == 2) {
> -                             x = GBIT16(a);
> -                             pcicfgw16(p, r, x);
> -                             return 2;
> -                     }
> -                     for (i = 0; i < n; i++) {
> -                             x = GBIT8(a);
> -                             pcicfgw8(p, r, x);
> -                             a++;
> -                             r++;
> -                     }
> -                     return i;
> -             default:
> +     case Qpciraw:
> +             tbdf = MKBUS(BusPCI, 0, 0, 0) | BUSBDF((uint32_t) c->qid.path);
> +             p = pci_match_tbdf(tbdf);
> +             if (p == NULL)
>                       error(EINVAL, ERROR_FIXME);
> +             if (offset > PCI_CONFIG_SZ)
> +                     return 0;
> +             if (n + offset > PCI_CONFIG_SZ)
> +                     n = PCI_CONFIG_SZ - offset;
> +             r = offset;
> +             if (!(r & 3) && n == 4) {
> +                     x = GBIT32(a);
> +                     pcidev_write32(p, r, x);
> +                     return 4;
> +             }
> +             if (!(r & 1) && n == 2) {
> +                     x = GBIT16(a);
> +                     pcidev_write16(p, r, x);
> +                     return 2;
> +             }
> +             for (i = 0; i < n; i++) {
> +                     x = GBIT8(a);
> +                     pcidev_write8(p, r, x);
> +                     a++;
> +                     r++;
> +             }
> +             return i;
> +     default:
> +             error(EINVAL, ERROR_FIXME);
>       }
>       return n;
>  }
>  
> -struct dev pcidevtab = {
> +struct dev pcidevtab __devtab = {
>       .name = "pci",
>  
>       .reset = devreset,

-- 
You received this message because you are subscribed to the Google Groups 
"Akaros" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to