Esempio n. 1
0
static int shell_pci_rX(
	unsigned long pciid,
	int offset,
	int size)
{
  uint8_t data8;
  uint16_t data16;
  uint32_t data32;
  int result;

  switch(size) {
    case 1:
      result = pci_cfg_r8(pciid, offset, &data8);
      if (result == PCISTS_OK)
        printf(" r08[0x%02x]: 0x%02x  DEC=%d\n", offset, data8, data8);
      break;

    case 2:
      result = pci_cfg_r16(pciid, offset, &data16);
      if (result == PCISTS_OK)
        printf(" r16[0x%02x]: 0x%04x  DEC=%d\n", offset, data16, data16);
      break;

    case 4:
      result = pci_cfg_r32(pciid, offset, &data32);
      if (result == PCISTS_OK)
        printf(" r32[0x%02x]: 0x%08lx  DEC=%lu\n", offset, data32, data32);
      break;

    default:
      return PCISTS_EINVAL;
  }
  return result;
}
void pci_modify_cmdsts(pci_dev_t dev, uint32_t mask, uint32_t val)
{
	uint32_t data;

	pci_cfg_r32(dev, PCI_COMMAND, &data);
	data &= ~mask;
	data |= val;
	pci_cfg_w32(dev, PCI_COMMAND, data);
}
int pci_for_each(int (*func)(pci_dev_t, void*), void *arg)
{
	uint32_t id;
	uint8_t hd;
	int bus, dev, fun, result, fail;
	int maxbus = pci_bus_count();
	pci_dev_t pcidev;

	for (bus = 0; bus < maxbus ; bus++) {
		for (dev = 0; dev < PCI_MAX_DEVICES; dev++) {
			pcidev = PCI_DEV(bus, dev, 0);

			for (fun = 0; fun < PCI_MAX_FUNCTIONS; fun++, pcidev++) {
				fail = pci_cfg_r32(pcidev, PCI_VENDOR_ID, &id);
				if (fail || (0xffffffff == id) || (0 == id)) {
					if (fun == 0)
						break;
					else
						continue;
				}

				DBG("pcibus_for_each: found 0x%08lx at"
				    " %d/%d/%d\n", id, bus, dev, fun);
				result = func(pcidev, arg);
				if (result != 0)
					return result; /* Stopped */

				/* Stop if not a multi-function device */
				if (fun == 0) {
					pci_cfg_r8(pcidev, PCI_HEADER_TYPE,
							&hd);
					if ((hd & PCI_MULTI_FUNCTION) == 0)
						break;
				}
			}
		}
	}

	return 0; /* scanned all */
}