Annotation of embedaddon/pciutils/lib/nbsd-libpci.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     The PCI Library -- NetBSD libpci access
                      3:  *         (based on FreeBSD /dev/pci access)
                      4:  *
                      5:  *     Copyright (c) 1999 Jari Kirma <kirma@cs.hut.fi>
                      6:  *      Copyright (c) 2002 Quentin Garnier <cube@cubidou.net>
                      7:  *     Copyright (c) 2002 Martin Mares <mj@ucw.cz>
                      8:  *
                      9:  *     Can be freely distributed and used under the terms of the GNU GPL.
                     10:  */
                     11: 
                     12: /*
                     13:  *      Read functionality of this driver is briefly tested, and seems
                     14:  *      to supply basic information correctly, but I promise no more.
                     15:  */
                     16: 
                     17: #include <fcntl.h>
                     18: #include <string.h>
                     19: #include <unistd.h>
                     20: 
                     21: #include <pci.h>
                     22: 
                     23: #include "internal.h"
                     24: 
                     25: static void
                     26: nbsd_config(struct pci_access *a)
                     27: {
                     28:   pci_define_param(a, "nbsd.path", PCI_PATH_NBSD_DEVICE, "Path to the NetBSD PCI device");
                     29: }
                     30: 
                     31: static int
                     32: nbsd_detect(struct pci_access *a)
                     33: {
                     34:   char *name = pci_get_param(a, "nbsd.path");
                     35: 
                     36:   if (access(name, R_OK))
                     37:     {
                     38:       a->warning("Cannot open %s", name);
                     39:       return 0;
                     40:     }
                     41: 
                     42:   if (!access(name, W_OK))
                     43:     a->writeable = O_RDWR;
                     44:   a->debug("...using %s", name);
                     45:   return 1;
                     46: }
                     47: 
                     48: static void
                     49: nbsd_init(struct pci_access *a)
                     50: {
                     51:   char *name = pci_get_param(a, "nbsd.path");
                     52:   int mode = a->writeable ? O_RDWR : O_RDONLY;
                     53: 
                     54:   a->fd = open(name, mode, 0);
                     55:   if (a->fd < 0)
                     56:     a->error("nbsd_init: %s open failed", name);
                     57: }
                     58: 
                     59: static void
                     60: nbsd_cleanup(struct pci_access *a)
                     61: {
                     62:   close(a->fd);
                     63: }
                     64: 
                     65: static int
                     66: nbsd_read(struct pci_dev *d, int pos, byte *buf, int len)
                     67: {
                     68:   pcireg_t val;
                     69:   int shift;
                     70: 
                     71:   if (!(len == 1 || len == 2 || len == 4))
                     72:     return pci_generic_block_read(d, pos, buf, len);
                     73: 
                     74:   if (pos >= 256)
                     75:     return 0;
                     76: 
                     77:   shift = 8*(pos % 4);
                     78:   pos &= ~3;
                     79: 
                     80:   if (pcibus_conf_read(d->access->fd, d->bus, d->dev, d->func, pos, &val) < 0)
                     81:     d->access->error("nbsd_read: pci_bus_conf_read() failed");
                     82: 
                     83:   switch (len)
                     84:     {
                     85:     case 1:
                     86:       *buf = val >> shift;
                     87:       break;
                     88:     case 2:
                     89:       *(u16*)buf = cpu_to_le16(val >> shift);
                     90:       break;
                     91:     case 4:
                     92:       *(u32*)buf = cpu_to_le32(val);
                     93:       break;
                     94:     }
                     95:   return 1;
                     96: }
                     97: 
                     98: static int
                     99: nbsd_write(struct pci_dev *d, int pos, byte *buf, int len)
                    100: {
                    101:   pcireg_t val = 0;
                    102:   int shift;
                    103: 
                    104:   if (!(len == 1 || len == 2 || len == 4))
                    105:     return pci_generic_block_write(d, pos, buf, len);
                    106: 
                    107:   if (pos >= 256)
                    108:     return 0;
                    109: 
                    110:   /*
                    111:    *  BEWARE: NetBSD seems to support only 32-bit access, so we have
                    112:    *  to emulate byte and word writes by read-modify-write, possibly
                    113:    *  causing troubles.
                    114:    */
                    115: 
                    116:   shift = 8*(pos % 4);
                    117:   pos &= ~3;
                    118:   if (len != 4)
                    119:     {
                    120:       if (pcibus_conf_read(d->access->fd, d->bus, d->dev, d->func, pos, &val) < 0)
                    121:        d->access->error("nbsd_write: pci_bus_conf_read() failed");
                    122:     }
                    123: 
                    124:   switch (len)
                    125:     {
                    126:     case 1:
                    127:       val = (val & ~(0xff << shift)) | (buf[0] << shift);
                    128:       break;
                    129:     case 2:
                    130:       val = (val & ~(0xffff << shift)) | (le16_to_cpu(*(u16*)buf) << shift);
                    131:       break;
                    132:     case 4:
                    133:       val = le32_to_cpu(*(u32*)buf);
                    134:       break;
                    135:     }
                    136: 
                    137:   if (pcibus_conf_write(d->access->fd, d->bus, d->dev, d->func, pos, val) < 0)
                    138:     d->access->error("nbsd_write: pci_bus_conf_write() failed");
                    139: 
                    140:   return 1;
                    141: }
                    142: 
                    143: struct pci_methods pm_nbsd_libpci = {
                    144:   "nbsd-libpci",
                    145:   "NetBSD libpci",
                    146:   nbsd_config,
                    147:   nbsd_detect,
                    148:   nbsd_init,
                    149:   nbsd_cleanup,
                    150:   pci_generic_scan,
                    151:   pci_generic_fill_info,
                    152:   nbsd_read,
                    153:   nbsd_write,
                    154:   NULL,                                 /* read_vpd */
                    155:   NULL,                                 /* dev_init */
                    156:   NULL                                  /* dev_cleanup */
                    157: };

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>