/* PCI Configuration Space access commands * * Syntax: * pci display[.b, .w, .l] bus.device.function} [addr] [len] * pci next[.b, .w, .l] bus.device.function [addr] * pci modify[.b, .w, .l] bus.device.function [addr] * pci write[.b, .w, .l] bus.device.function addr value */ static int do_pci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { ulong addr = 0, value = 0, size = 0; pci_dev_t bdf = 0; char cmd = 's'; if (argc > 1) cmd = argv[1][0]; switch (cmd) { case 'd': /* display */ case 'n': /* next */ case 'm': /* modify */ case 'w': /* write */ /* Check for a size specification. */ size = cmd_get_data_size(argv[1], 4); if (argc > 3) addr = simple_strtoul(argv[3], NULL, 16); if (argc > 4) value = simple_strtoul(argv[4], NULL, 16); case 'h': /* header */ if (argc < 3) goto usage; if ((bdf = get_pci_dev(argv[2])) == -1) return 1; break; #ifdef CONFIG_CMD_PCI_ENUM case 'e': break; #endif default: /* scan bus */ value = 1; /* short listing */ bdf = 0; /* bus number */ if (argc > 1) { if (argv[argc-1][0] == 'l') { value = 0; argc--; } if (argc > 1) bdf = simple_strtoul(argv[1], NULL, 16); } pciinfo(bdf, value); return 0; } switch (argv[1][0]) { case 'h': /* header */ pci_header_show(bdf); return 0; case 'd': /* display */ return pci_cfg_display(bdf, addr, size, value); #ifdef CONFIG_CMD_PCI_ENUM case 'e': pci_init(); return 0; #endif case 'n': /* next */ if (argc < 4) goto usage; return pci_cfg_modify(bdf, addr, size, value, 0); case 'm': /* modify */ if (argc < 4) goto usage; return pci_cfg_modify(bdf, addr, size, value, 1); case 'w': /* write */ if (argc < 5) goto usage; return pci_cfg_write(bdf, addr, size, value); } return 1; usage: return CMD_RET_USAGE; }
/* PCI Configuration Space access commands * * Syntax: * pci display[.b, .w, .l] bus.device.function} [addr] [len] * pci next[.b, .w, .l] bus.device.function [addr] * pci modify[.b, .w, .l] bus.device.function [addr] * pci write[.b, .w, .l] bus.device.function addr value */ static int do_pci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { ulong addr = 0, value = 0, cmd_size = 0; enum pci_size_t size = PCI_SIZE_32; #ifdef CONFIG_DM_PCI struct udevice *dev, *bus; #else pci_dev_t dev; #endif int busnum = 0; pci_dev_t bdf = 0; char cmd = 's'; int ret = 0; if (argc > 1) cmd = argv[1][0]; switch (cmd) { case 'd': /* display */ case 'n': /* next */ case 'm': /* modify */ case 'w': /* write */ /* Check for a size specification. */ cmd_size = cmd_get_data_size(argv[1], 4); size = (cmd_size == 4) ? PCI_SIZE_32 : cmd_size - 1; if (argc > 3) addr = simple_strtoul(argv[3], NULL, 16); if (argc > 4) value = simple_strtoul(argv[4], NULL, 16); case 'h': /* header */ #ifdef CONFIG_DM_PCI case 'b': /* bars */ #endif if (argc < 3) goto usage; if ((bdf = get_pci_dev(argv[2])) == -1) return 1; break; #if defined(CONFIG_DM_PCI) case 'e': pci_init(); return 0; #endif case 'r': /* no break */ default: /* scan bus */ value = 1; /* short listing */ if (argc > 1) { if (cmd != 'r' && argv[argc-1][0] == 'l') { value = 0; argc--; } if (argc > 1) busnum = simple_strtoul(argv[1], NULL, 16); } #ifdef CONFIG_DM_PCI ret = uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus); if (ret) { printf("No such bus\n"); return CMD_RET_FAILURE; } if (cmd == 'r') pci_show_regions(bus); else pciinfo(bus, value); #else pciinfo(busnum, value); #endif return 0; } #ifdef CONFIG_DM_PCI ret = dm_pci_bus_find_bdf(bdf, &dev); if (ret) { printf("No such device\n"); return CMD_RET_FAILURE; } #else dev = bdf; #endif switch (argv[1][0]) { case 'h': /* header */ pci_header_show(dev); break; case 'd': /* display */ return pci_cfg_display(dev, addr, size, value); case 'n': /* next */ if (argc < 4) goto usage; ret = pci_cfg_modify(dev, addr, size, value, 0); break; case 'm': /* modify */ if (argc < 4) goto usage; ret = pci_cfg_modify(dev, addr, size, value, 1); break; case 'w': /* write */ if (argc < 5) goto usage; #ifdef CONFIG_DM_PCI ret = dm_pci_write_config(dev, addr, value, size); #else ret = pci_cfg_write(dev, addr, size, value); #endif break; #ifdef CONFIG_DM_PCI case 'b': /* bars */ return pci_bar_show(dev); #endif default: ret = CMD_RET_USAGE; break; } return ret; usage: return CMD_RET_USAGE; }