diff options
author | Mike Frysinger <vapier@gentoo.org> | 2004-01-19 04:44:03 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2004-01-19 04:44:03 +0000 |
commit | a5bf370c9b7d0b076a147405d584d7a1e2690c7a (patch) | |
tree | c4096a27422b508eabf57b439db1fd9e3b529c93 /sys-apps/pciutils | |
parent | Added amd64 keyword. (diff) | |
download | historical-a5bf370c9b7d0b076a147405d584d7a1e2690c7a.tar.gz historical-a5bf370c9b7d0b076a147405d584d7a1e2690c7a.tar.bz2 historical-a5bf370c9b7d0b076a147405d584d7a1e2690c7a.zip |
sysfs support #38645 and less / bloat #36453
Diffstat (limited to 'sys-apps/pciutils')
-rw-r--r-- | sys-apps/pciutils/ChangeLog | 8 | ||||
-rw-r--r-- | sys-apps/pciutils/files/2.1.11-sysfs.patch | 381 | ||||
-rw-r--r-- | sys-apps/pciutils/files/digest-pciutils-2.1.11-r1 | 1 | ||||
-rw-r--r-- | sys-apps/pciutils/pciutils-2.1.11-r1.ebuild | 57 |
4 files changed, 446 insertions, 1 deletions
diff --git a/sys-apps/pciutils/ChangeLog b/sys-apps/pciutils/ChangeLog index 82a57d9f3115..fd99e4365ca6 100644 --- a/sys-apps/pciutils/ChangeLog +++ b/sys-apps/pciutils/ChangeLog @@ -1,6 +1,12 @@ # ChangeLog for sys-apps/pciutils # Copyright 2002-2004 Gentoo Technologies, Inc.; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sys-apps/pciutils/ChangeLog,v 1.19 2004/01/15 05:16:13 avenj Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-apps/pciutils/ChangeLog,v 1.20 2004/01/19 04:44:03 vapier Exp $ + +*pciutils-2.1.11-r1 (18 Jan 2004) + + 18 Jan 2004; Mike Frysinger <vapier@gentoo.org> : + Add sysfs support (patch from the deb guys) #38645. + Move libpci.a into /usr/lib/ #36453. 15 Jan 2004; Jon Portnoy <avenj@gentoo.org> pciutils-2.1.11.ebuild : Stable on AMD64. diff --git a/sys-apps/pciutils/files/2.1.11-sysfs.patch b/sys-apps/pciutils/files/2.1.11-sysfs.patch new file mode 100644 index 000000000000..39dc36f9ece8 --- /dev/null +++ b/sys-apps/pciutils/files/2.1.11-sysfs.patch @@ -0,0 +1,381 @@ +diff -u pciutils-2.1.11/lib/configure pciutils-2.1.11/lib/configure +--- pciutils-2.1.11/lib/configure ++++ pciutils-2.1.11/lib/configure +@@ -33,7 +33,8 @@ + case $sys in + Linux) + case $rel in +- 2.[1-9]*|[3-9]*) echo_n " proc" ++ 2.[1-9]*|[3-9]*) echo_n "sysfs proc" ++ echo >>$c '#define HAVE_PM_LINUX_SYSFS' + echo >>$c '#define HAVE_PM_LINUX_PROC' + echo >>$c '#define HAVE_LINUX_BYTEORDER_H' + echo >>$c '#define PATH_PROC_BUS_PCI "/proc/bus/pci"' +unchanged: +--- pciutils-2.1.11.orig/lib/Makefile ++++ pciutils-2.1.11/lib/Makefile +@@ -9,6 +9,10 @@ + + PCILIB=libpci.a + ++ifdef HAVE_PM_LINUX_SYSFS ++OBJS += sysfs.o ++endif ++ + ifdef HAVE_PM_LINUX_PROC + OBJS += proc.o + endif +unchanged: +--- pciutils-2.1.11.orig/lib/access.c ++++ pciutils-2.1.11/lib/access.c +@@ -17,6 +17,11 @@ + + static struct pci_methods *pci_methods[PCI_ACCESS_MAX] = { + NULL, ++#ifdef HAVE_PM_LINUX_SYSFS ++ &pm_linux_sysfs, ++#else ++ NULL, ++#endif + #ifdef HAVE_PM_LINUX_PROC + &pm_linux_proc, + #else +unchanged: +--- pciutils-2.1.11.orig/lib/internal.h ++++ pciutils-2.1.11/lib/internal.h +@@ -91,4 +91,5 @@ + int pci_link_dev(struct pci_access *, struct pci_dev *); + + extern struct pci_methods pm_intel_conf1, pm_intel_conf2, pm_linux_proc, +- pm_syscalls, pm_fbsd_device, pm_aix_device, pm_nbsd_libpci, pm_dump; ++ pm_linux_sysfs, pm_syscalls, pm_fbsd_device, pm_aix_device, ++ pm_nbsd_libpci, pm_dump; +unchanged: +--- pciutils-2.1.11.orig/lib/pci.h ++++ pciutils-2.1.11/lib/pci.h +@@ -74,6 +74,7 @@ + enum pci_access_type { + /* Known access methods, remember to update access.c as well */ + PCI_ACCESS_AUTO, /* Autodetection (params: none) */ ++ PCI_ACCESS_SYSFS_BUS_PCI, /* Linux /sys/bus/pci (params: none) */ + PCI_ACCESS_PROC_BUS_PCI, /* Linux /proc/bus/pci (params: path) */ + PCI_ACCESS_I386_TYPE1, /* i386 ports, type 1 (params: none) */ + PCI_ACCESS_I386_TYPE2, /* i386 ports, type 2 (params: none) */ +@@ -127,6 +128,7 @@ + + struct pci_dev { + struct pci_dev *next; /* Next device in the chain */ ++ int domain; /* domains can have the same bus #s */ + word bus; /* Higher byte can select host bridges */ + byte dev, func; /* Device and function */ + +unchanged: +--- pciutils-2.1.11.orig/lib/sysfs.c ++++ pciutils-2.1.11/lib/sysfs.c +@@ -0,0 +1,281 @@ ++/* ++ * $Id: 2.1.11-sysfs.patch,v 1.1 2004/01/19 04:44:03 vapier Exp $ ++ * ++ * The PCI Library -- Configuration Access via /sys/bus/pci ++ * ++ * Copyrigh (c) 2003 Matthew Wilcox <willy@fc.hp.com> ++ * Copyright (c) 1997--1999 Martin Mares <mj@ucw.cz> ++ * ++ * Can be freely distributed and used under the terms of the GNU GPL. ++ */ ++ ++#define _GNU_SOURCE ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <errno.h> ++#include <dirent.h> ++#include <fcntl.h> ++#include <sys/types.h> ++ ++#include "internal.h" ++ ++#define SYSFS_PATH_ROOT "/sys" ++#define SYSFS_PATH SYSFS_PATH_ROOT "/bus/pci/devices" ++ ++/* ++ * We'd like to use pread/pwrite for configuration space accesses, but ++ * unfortunately it isn't simple at all since all libc's until glibc 2.1 ++ * don't define it. ++ */ ++ ++#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ > 0 ++/* glibc 2.1 or newer -> pread/pwrite supported automatically */ ++ ++#elif defined(i386) && defined(__GLIBC__) ++/* glibc 2.0 on i386 -> call syscalls directly */ ++#include <asm/unistd.h> ++#include <syscall-list.h> ++#ifndef SYS_pread ++#define SYS_pread 180 ++#endif ++static int pread(unsigned int fd, void *buf, size_t size, loff_t where) ++{ return syscall(SYS_pread, fd, buf, size, where); } ++#ifndef SYS_pwrite ++#define SYS_pwrite 181 ++#endif ++static int pwrite(unsigned int fd, void *buf, size_t size, loff_t where) ++{ return syscall(SYS_pwrite, fd, buf, size, where); } ++ ++#elif defined(i386) ++/* old libc on i386 -> call syscalls directly the old way */ ++#include <asm/unistd.h> ++static _syscall5(int, pread, unsigned int, fd, void *, buf, size_t, size, u32, where_lo, u32, where_hi); ++static _syscall5(int, pwrite, unsigned int, fd, void *, buf, size_t, size, u32, where_lo, u32, where_hi); ++static int do_read(struct pci_dev *d UNUSED, int fd, void *buf, size_t size, int where) { return pread(fd, buf, size, where, 0); } ++static int do_write(struct pci_dev *d UNUSED, int fd, void *buf, size_t size, int where) { return pwrite(fd, buf, size, where, 0); } ++#define HAVE_DO_READ ++ ++#else ++/* In all other cases we use lseek/read/write instead to be safe */ ++#define make_rw_glue(op) \ ++ static int do_##op(struct pci_dev *d, int fd, void *buf, size_t size, int where) \ ++ { \ ++ struct pci_access *a = d->access; \ ++ int r; \ ++ if (a->fd_pos != where && lseek(fd, where, SEEK_SET) < 0) \ ++ return -1; \ ++ r = op(fd, buf, size); \ ++ if (r < 0) \ ++ a->fd_pos = -1; \ ++ else \ ++ a->fd_pos = where + r; \ ++ return r; \ ++ } ++make_rw_glue(read) ++make_rw_glue(write) ++#define HAVE_DO_READ ++#endif ++ ++#ifndef HAVE_DO_READ ++#define do_read(d,f,b,l,p) pread(f,b,l,p) ++#define do_write(d,f,b,l,p) pwrite(f,b,l,p) ++#endif ++ ++static void ++sysfs_config(struct pci_access *a) ++{ ++#if 0 ++ a->method_params[PCI_ACCESS_PROC_BUS_PCI] = PATH_PROC_BUS_PCI; ++#endif ++} ++ ++static int sysfs_detect(struct pci_access *a) ++{ ++ if (access(SYSFS_PATH_ROOT, R_OK)) ++ return 0; ++ if (access(SYSFS_PATH, R_OK)) { ++ a->warning("Cannot open %s", SYSFS_PATH); ++ return 0; ++ } ++ a->debug("...using %s", SYSFS_PATH); ++ return 1; ++} ++ ++static void sysfs_init(struct pci_access *a) ++{ ++ a->fd = -1; ++} ++ ++static void sysfs_cleanup(struct pci_access *a) ++{ ++ if (a->fd >= 0) { ++ close(a->fd); ++ a->fd = -1; ++ } ++} ++ ++static int sysfs_get_value(char *name, char *object) ++{ ++ int fd, len; ++ char buf[256]; ++ sprintf(buf, "%s/%s/%s", SYSFS_PATH, name, object); ++ fd = open(buf, O_RDONLY); ++ if (fd < 0) ++ return 0; ++ len = read(fd, buf, 256); ++ close(fd); ++ buf[len] = '\0'; ++ return strtol(buf, NULL, 0); ++} ++ ++static int sysfs_get_resources(char *name, struct pci_dev *d) ++{ ++ char buf[256]; ++ FILE *file; ++ int i; ++ sprintf(buf, "%s/%s/%s", SYSFS_PATH, name, "resource"); ++ file = fopen(buf, "r"); ++ if (!file) ++ return errno; ++ for (i = 0; i < 8; i++) { ++ unsigned long long start, end, size = 0; ++ if (!fgets(buf, 256, file)) ++ break; ++ sscanf(buf, "%llx %llx", &start, &end); ++ if (start) ++ size = end - start + 1; ++ if (i < 7) { ++ d->base_addr[i] = start; ++ d->size[i] = size; ++ } else { ++ d->rom_base_addr = start; ++ d->rom_size = size; ++ } ++ } ++ fclose(file); ++ return 0; ++} ++ ++static void sysfs_scan(struct pci_access *a) ++{ ++ DIR *dir; ++ struct dirent *entry; ++ ++ dir = opendir(SYSFS_PATH); ++ if (!dir) ++ a->error("Cannot open %s", SYSFS_PATH); ++ while ((entry = readdir(dir))) { ++ struct pci_dev *d; ++ unsigned int dev, func; ++ ++ /* ".", ".." or a special non-device perhaps */ ++ if (entry->d_name[0] == '.') ++ continue; ++ ++ d = pci_alloc_dev(a); ++ if (sscanf(entry->d_name, "%04x:%02hx:%02x.%d", ++ &d->domain, &d->bus, &dev, &func) < 4) { ++ a->error("Couldn't parse %s", entry->d_name); ++ pci_free_dev(d); ++ continue; ++ } ++ d->dev = dev; ++ d->func = func; ++ d->vendor_id = sysfs_get_value(entry->d_name, "vendor"); ++ d->device_id = sysfs_get_value(entry->d_name, "device"); ++ d->irq = sysfs_get_value(entry->d_name, "irq"); ++ d->hdrtype = pci_read_byte(d, PCI_HEADER_TYPE); ++ ++ if (sysfs_get_resources(entry->d_name, d) != 0) ++ a->error("when reading resources"); ++ d->known_fields = PCI_FILL_IDENT; ++ if (!a->buscentric) { ++ d->known_fields |= PCI_FILL_IRQ | PCI_FILL_BASES | ++ PCI_FILL_ROM_BASE | PCI_FILL_SIZES; ++ } ++ pci_link_dev(a, d); ++ } ++ closedir(dir); ++} ++ ++static int ++sysfs_setup(struct pci_dev *d, int rw) ++{ ++ struct pci_access *a = d->access; ++ ++ if (a->cached_dev != d || a->fd_rw < rw) { ++ char buf[256]; ++ if (a->fd >= 0) ++ close(a->fd); ++ if (snprintf(buf, sizeof(buf), "%s/%04x:%02x:%02x.%d/config", ++ SYSFS_PATH, d->domain, d->bus, d->dev, ++ d->func) == sizeof(buf)) ++ a->error("File name too long"); ++ a->fd_rw = a->writeable || rw; ++ a->fd = open(buf, a->fd_rw ? O_RDWR : O_RDONLY); ++ if (a->fd < 0) ++ a->warning("Cannot open %s", buf); ++ a->cached_dev = d; ++ a->fd_pos = 0; ++ } ++ return a->fd; ++} ++ ++static int sysfs_read(struct pci_dev *d, int pos, byte *buf, int len) ++{ ++ int fd = sysfs_setup(d, 0); ++ int res; ++ ++ if (fd < 0) ++ return 0; ++ res = do_read(d, fd, buf, len, pos); ++ if (res < 0) { ++ d->access->warning("sysfs_read: read failed: %s", strerror(errno)); ++ return 0; ++ } else if (res != len) { ++ d->access->warning("sysfs_read: tried to read %d bytes at %d, but got only %d", len, pos, res); ++ return 0; ++ } ++ return 1; ++} ++ ++static int sysfs_write(struct pci_dev *d, int pos, byte *buf, int len) ++{ ++ int fd = sysfs_setup(d, 1); ++ int res; ++ ++ if (fd < 0) ++ return 0; ++ res = do_write(d, fd, buf, len, pos); ++ if (res < 0) { ++ d->access->warning("sysfs_write: write failed: %s", strerror(errno)); ++ return 0; ++ } else if (res != len) { ++ d->access->warning("sysfs_write: tried to write %d bytes at %d, but got only %d", len, pos, res); ++ return 0; ++ } ++ return 1; ++} ++ ++static void sysfs_cleanup_dev(struct pci_dev *d) ++{ ++ if (d->access->cached_dev == d) ++ d->access->cached_dev = NULL; ++} ++ ++struct pci_methods pm_linux_sysfs = { ++ SYSFS_PATH, ++ sysfs_config, ++ sysfs_detect, ++ sysfs_init, ++ sysfs_cleanup, ++ sysfs_scan, ++ pci_generic_fill_info, ++ sysfs_read, ++ sysfs_write, ++ NULL, /* init_dev */ ++ sysfs_cleanup_dev ++}; +unchanged: +--- pciutils-2.1.11.orig/lspci.c ++++ pciutils-2.1.11/lspci.c +@@ -188,6 +188,10 @@ + const struct pci_dev *a = (*(const struct device **)A)->dev; + const struct pci_dev *b = (*(const struct device **)B)->dev; + ++ if (a->domain < b->domain) ++ return -1; ++ if (a->domain > b->domain) ++ return 1; + if (a->bus < b->bus) + return -1; + if (a->bus > b->bus) +@@ -239,7 +243,8 @@ + struct pci_dev *p = d->dev; + byte classbuf[128], devbuf[128]; + +- printf("%02x:%02x.%x %s: %s", ++ printf("%04x:%02x:%02x.%x %s: %s", ++ p->domain, + p->bus, + p->dev, + p->func, +- diff --git a/sys-apps/pciutils/files/digest-pciutils-2.1.11-r1 b/sys-apps/pciutils/files/digest-pciutils-2.1.11-r1 new file mode 100644 index 000000000000..5bab57abb8f5 --- /dev/null +++ b/sys-apps/pciutils/files/digest-pciutils-2.1.11-r1 @@ -0,0 +1 @@ +MD5 1d40f90aaae69594790bdb8ff90b4a41 pciutils-2.1.11.tar.gz 120948 diff --git a/sys-apps/pciutils/pciutils-2.1.11-r1.ebuild b/sys-apps/pciutils/pciutils-2.1.11-r1.ebuild new file mode 100644 index 000000000000..e5462c8598ca --- /dev/null +++ b/sys-apps/pciutils/pciutils-2.1.11-r1.ebuild @@ -0,0 +1,57 @@ +# Copyright 1999-2004 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-apps/pciutils/pciutils-2.1.11-r1.ebuild,v 1.1 2004/01/19 04:44:03 vapier Exp $ + +inherit eutils + +DESCRIPTION="Various utilities dealing with the PCI bus" +HOMEPAGE="http://atrey.karlin.mff.cuni.cz/~mj/pciutils.html" +SRC_URI="ftp://atrey.karlin.mff.cuni.cz/pub/linux/pci/${P}.tar.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="x86 amd64 ~ppc sparc alpha hppa ~arm ia64 ppc64" + +DEPEND="virtual/glibc + net-misc/wget" + +src_unpack() { + unpack ${A} + cd ${S} + + epatch ${FILESDIR}/pcimodules-${P}.diff + epatch ${FILESDIR}/${PV}-sysfs.patch #38645 + + sed -i "s:-O2:${CFLAGS}:" Makefile + + ./update-pciids.sh +} + +src_compile() { + make PREFIX=/usr lib/config.h || die + + cd ${S}/lib + sed -i "s:/usr/share/pci.ids:/usr/share/misc/pci.ids:" config.h || die + + cd ${S} + make PREFIX=/usr || die + + for i in update-pciids lspci.8 update-pciids.8; do + sed -i "s:/usr/share/pci.ids:/usr/share/misc/pci.ids:" ${i} || die + done +} + +src_install() { + into / + dosbin setpci lspci pcimodules update-pciids + doman *.8 + + insinto /usr/share/misc + doins pci.ids + + into /usr + dolib lib/libpci.a + + insinto /usr/include/pci + doins lib/*.h +} |