Module Name: xsrc
Committed By: mrg
Date: Wed Jun 10 01:55:38 UTC 2009
Modified Files:
xsrc/external/mit/libpciaccess/dist/src: netbsd_pci.c
Log Message:
apply pkgsrc patch-ac to make this work.
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1 -r1.2 \
xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c
diff -u xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c:1.1.1.1 xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c:1.2
--- xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c:1.1.1.1 Wed Jun 10 00:46:09 2009
+++ xsrc/external/mit/libpciaccess/dist/src/netbsd_pci.c Wed Jun 10 01:55:37 2009
@@ -20,12 +20,15 @@
#include <sys/mman.h>
#include <sys/types.h>
+#ifdef HAVE_MTRR
#include <machine/sysarch.h>
#include <machine/mtrr.h>
+#define netbsd_set_mtrr(mr, num) _X86_SYSARCH_L(set_mtrr)(mr, num)
+#endif
+#include <dev/pci/pcidevs.h>
#include <dev/pci/pciio.h>
#include <dev/pci/pcireg.h>
-#include <dev/pci/pcidevs.h>
#include <errno.h>
#include <fcntl.h>
@@ -35,6 +38,8 @@
#include <unistd.h>
+#include <pci.h>
+
#include "pciaccess.h"
#include "pciaccess_private.h"
@@ -43,20 +48,12 @@
static int
pci_read(int bus, int dev, int func, uint32_t reg, uint32_t *val)
{
- struct pciio_bdf_cfgreg io;
- int err;
+ uint32_t rval;
- bzero(&io, sizeof(io));
- io.bus = bus;
- io.device = dev;
- io.function = func;
- io.cfgreg.reg = reg;
+ if (pcibus_conf_read(pcifd, bus, dev, func, reg, &rval) == -1)
+ return (-1);
- err = ioctl(pcifd, PCI_IOC_BDF_CFGREAD, &io);
- if (err)
- return (err);
-
- *val = io.cfgreg.val;
+ *val = rval;
return 0;
}
@@ -64,16 +61,7 @@
static int
pci_write(int bus, int dev, int func, uint32_t reg, uint32_t val)
{
- struct pciio_bdf_cfgreg io;
-
- bzero(&io, sizeof(io));
- io.bus = bus;
- io.device = dev;
- io.function = func;
- io.cfgreg.reg = reg;
- io.cfgreg.val = val;
-
- return ioctl(pcifd, PCI_IOC_BDF_CFGWRITE, &io);
+ return pcibus_conf_write(pcifd, bus, dev, func, reg, val);
}
static int
@@ -91,70 +79,68 @@
pci_device_netbsd_map_range(struct pci_device *dev,
struct pci_device_mapping *map)
{
- struct mtrr mtrr;
- int fd, error, nmtrr, prot = PROT_READ;
+#ifdef HAVE_MTRR
+ struct mtrr m;
+ int n = 1;
+#endif
+ int prot, fd, ret = 0;
- if ((fd = open("/dev/mem", O_RDWR)) == -1)
- return errno;
+ prot = PROT_READ;
if (map->flags & PCI_DEV_MAP_FLAG_WRITABLE)
prot |= PROT_WRITE;
- map->memory = mmap(NULL, map->size, prot, MAP_SHARED,
- fd, map->base);
+ fd = open("/dev/mem", O_RDWR);
+ if (fd == -1)
+ return errno;
+ map->memory = mmap(NULL, map->size, prot, MAP_SHARED, fd, map->base);
if (map->memory == MAP_FAILED)
return errno;
+#ifdef HAVE_MTRR
+ memset(&m, 0, sizeof(m));
+
/* No need to set an MTRR if it's the default mode. */
if ((map->flags & PCI_DEV_MAP_FLAG_CACHABLE) ||
(map->flags & PCI_DEV_MAP_FLAG_WRITE_COMBINE)) {
- mtrr.base = map->base;
- mtrr.len = map->size;
- mtrr.flags = MTRR_VALID;
-
- if (map->flags & PCI_DEV_MAP_FLAG_CACHABLE)
- mtrr.type = MTRR_TYPE_WB;
+ m.base = base;
+ m.flags = MTRR_VALID | MTRR_PRIVATE;
+ m.len = size;
+ m.owner = getpid();
+ if (map->flags & PCI_DEV_MAP_FLAG_CACHEABLE)
+ m.type = MTRR_TYPE_WB;
if (map->flags & PCI_DEV_MAP_FLAG_WRITE_COMBINE)
- mtrr.type = MTRR_TYPE_WC;
-#ifdef __i386__
- error = i386_set_mtrr(&mtrr, &nmtrr);
-#endif
-#ifdef __amd64__
- error = x86_64_set_mtrr(&mtrr, &nmtrr);
-#endif
- if (error) {
- close(fd);
- return errno;
- }
+ m.type = MTRR_TYPE_WC;
+
+ if ((netbsd_set_mtrr(&m, &n)) == -1)
+ ret = errno;
}
+#endif
close(fd);
- return 0;
+ return ret;
}
static int
pci_device_netbsd_unmap_range(struct pci_device *dev,
struct pci_device_mapping *map)
{
- struct mtrr mtrr;
- int nmtrr, error;
+#ifdef HAVE_MTRR
+ struct mtrr m;
+ int n = 1;
+
+ memset(&m, 0, sizeof(m));
if ((map->flags & PCI_DEV_MAP_FLAG_CACHABLE) ||
(map->flags & PCI_DEV_MAP_FLAG_WRITE_COMBINE)) {
- mtrr.base = map->base;
- mtrr.len = map->size;
- mtrr.type = MTRR_TYPE_UC;
- mtrr.flags = 0; /* clear/set MTRR */
-#ifdef __i386__
- error = i386_set_mtrr(&mtrr, &nmtrr);
-#endif
-#ifdef __amd64__
- error = x86_64_set_mtrr(&mtrr, &nmtrr);
-#endif
- if (error)
- return errno;
+ m.base = map->base;
+ m.flags = 0;
+ m.len = size;
+ m.type = MTRR_TYPE_UC;
+ (void)netbsd_set_mtrr(&m, &n);
}
+#endif
return pci_device_generic_unmap_range(dev, map);
}
@@ -163,25 +149,22 @@
pci_device_netbsd_read(struct pci_device *dev, void *data,
pciaddr_t offset, pciaddr_t size, pciaddr_t *bytes_read)
{
- struct pciio_bdf_cfgreg io;
-
- io.bus = dev->bus;
- io.device = dev->dev;
- io.function = dev->func;
+ u_int reg, rval;
*bytes_read = 0;
while (size > 0) {
int toread = MIN(size, 4 - (offset & 0x3));
- io.cfgreg.reg = (offset & ~0x3);
+ reg = (offset & ~0x3);
- if (ioctl(pcifd, PCI_IOC_BDF_CFGREAD, &io) == -1)
+ if ((pcibus_conf_read(pcifd, dev->bus, dev->dev, dev->func,
+ reg, &rval)) == -1)
return errno;
- io.cfgreg.val = htole32(io.cfgreg.val);
- io.cfgreg.val >>= ((offset & 0x3) * 8);
+ rval = htole32(rval);
+ rval >>= ((offset & 0x3) * 8);
- memcpy(data, &io.cfgreg.val, toread);
+ memcpy(data, &rval, toread);
offset += toread;
data = (char *)data + toread;
@@ -196,21 +179,18 @@
pci_device_netbsd_write(struct pci_device *dev, const void *data,
pciaddr_t offset, pciaddr_t size, pciaddr_t *bytes_written)
{
- struct pciio_bdf_cfgreg io;
+ u_int reg, val;
if ((offset % 4) != 0 || (size % 4) != 0)
return EINVAL;
- io.bus = dev->bus;
- io.device = dev->dev;
- io.function = dev->func;
-
*bytes_written = 0;
while (size > 0) {
- io.cfgreg.reg = offset;
- memcpy(&io.cfgreg.val, data, 4);
+ reg = offset;
+ memcpy(&val, data, 4);
- if (ioctl(pcifd, PCI_IOC_BDF_CFGWRITE, &io) == -1)
+ if ((pcibus_conf_write(pcifd, dev->bus, dev->dev, dev->func,
+ reg, val)) == -1)
return errno;
offset += 4;