Example #1
0
static int
sysfs_get_string(struct pci_dev *d, char *object, char *buf, int mandatory)
{
  struct pci_access *a = d->access;
  int fd, n;
  char namebuf[OBJNAMELEN];
  void (*warn)(char *msg, ...) = (mandatory ? a->error : a->warning);

  sysfs_obj_name(d, object, namebuf);
  fd = open(namebuf, O_RDONLY);
  if (fd < 0)
    {
      if (mandatory || errno != ENOENT)
	warn("Cannot open %s: %s", namebuf, strerror(errno));
      return 0;
    }
  n = read(fd, buf, OBJBUFSIZE);
  close(fd);
  if (n < 0)
    {
      warn("Error reading %s: %s", namebuf, strerror(errno));
      return 0;
     }
  if (n >= OBJBUFSIZE)
    {
      warn("Value in %s too long", namebuf);
      return 0;
    }
  buf[n] = 0;
  return 1;
}
Example #2
0
static void
sysfs_get_resources(struct pci_dev *d)
{
  struct pci_access *a = d->access;
  char namebuf[OBJNAMELEN], buf[256];
  FILE *file;
  int i;

  sysfs_obj_name(d, "resource", namebuf);
  file = fopen(namebuf, "r");
  if (!file)
    a->error("Cannot open %s: %s", namebuf, strerror(errno));
  for (i = 0; i < 7; i++)
    {
      unsigned long long start, end, size;
      if (!fgets(buf, sizeof(buf), file))
	break;
      if (sscanf(buf, "%llx %llx", &start, &end) != 2)
	a->error("Syntax error in %s", namebuf);
      if (start != (unsigned long long)(pciaddr_t) start ||
	  end != (unsigned long long)(pciaddr_t) end)
	{
	  a->warning("Resource %d in %s has a 64-bit address, ignoring", i, namebuf);
	  start = end = 0;
	}
      if (start)
	size = end - start + 1;
      else
	size = 0;
      if (i < 6)
	{
	  d->base_addr[i] = start;
	  d->size[i] = size;
	}
      else
	{
	  d->rom_base_addr = start;
	  d->rom_size = size;
	}
    }
  fclose(file);
}
Example #3
0
static int
sysfs_get_value(struct pci_dev *d, char *object)
{
  struct pci_access *a = d->access;
  int fd, n;
  char namebuf[OBJNAMELEN], buf[256];

  sysfs_obj_name(d, object, namebuf);
  fd = open(namebuf, O_RDONLY);
  if (fd < 0)
    a->error("Cannot open %s: %s", namebuf, strerror(errno));
  n = read(fd, buf, sizeof(buf));
  close(fd);
  if (n < 0)
    a->error("Error reading %s: %s", namebuf, strerror(errno));
  if (n >= (int) sizeof(buf))
    a->error("Value in %s too long", namebuf);
  buf[n] = 0;
  return strtol(buf, NULL, 0);
}
Example #4
0
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 namebuf[OBJNAMELEN];
      if (a->fd >= 0)
	close(a->fd);
      sysfs_obj_name(d, "config", namebuf);
      a->fd_rw = a->writeable || rw;
      a->fd = open(namebuf, a->fd_rw ? O_RDWR : O_RDONLY);
      if (a->fd < 0)
	a->warning("Cannot open %s", namebuf);
      a->cached_dev = d;
      a->fd_pos = 0;
    }
  return a->fd;
}
Example #5
0
static void
sysfs_get_resources(struct pci_dev *d)
{
  struct pci_access *a = d->access;
  char namebuf[OBJNAMELEN], buf[256];
  FILE *file;
  int i;

  sysfs_obj_name(d, "resource", namebuf);
  file = fopen(namebuf, "r");
  if (!file)
    a->error("Cannot open %s: %s", namebuf, strerror(errno));
  for (i = 0; i < 7; i++)
    {
      unsigned long long start, end, size, flags;
      if (!fgets(buf, sizeof(buf), file))
	break;
      if (sscanf(buf, "%llx %llx %llx", &start, &end, &flags) != 3)
	a->error("Syntax error in %s", namebuf);
      if (end > start)
	size = end - start + 1;
      else
	size = 0;
      flags &= PCI_ADDR_FLAG_MASK;
      if (i < 6)
	{
	  d->base_addr[i] = start | flags;
	  d->size[i] = size;
	}
      else
	{
	  d->rom_base_addr = start | flags;
	  d->rom_size = size;
	}
    }
  fclose(file);
}