From 9df731a176aab8e03b984b681b1bea01ccff6644 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 07:23:06 +0000 Subject: [PATCH] rk3568 rt uboot init --- u-boot/cmd/pci.c | 285 +++++++++++---------------------------------------------- 1 files changed, 55 insertions(+), 230 deletions(-) diff --git a/u-boot/cmd/pci.c b/u-boot/cmd/pci.c index b8c799f..6eecd69 100644 --- a/u-boot/cmd/pci.c +++ b/u-boot/cmd/pci.c @@ -47,7 +47,6 @@ return pci_byte_size(size) * 2; } -#ifdef CONFIG_DM_PCI static void pci_show_regs(struct udevice *dev, struct pci_reg_info *regs) { for (; regs->name; regs++) { @@ -59,41 +58,8 @@ pci_field_width(regs->size), val); } } -#else -static unsigned long pci_read_config(pci_dev_t dev, int offset, - enum pci_size_t size) -{ - u32 val32; - u16 val16; - u8 val8; - switch (size) { - case PCI_SIZE_8: - pci_read_config_byte(dev, offset, &val8); - return val8; - case PCI_SIZE_16: - pci_read_config_word(dev, offset, &val16); - return val16; - case PCI_SIZE_32: - default: - pci_read_config_dword(dev, offset, &val32); - return val32; - } -} - -static void pci_show_regs(pci_dev_t dev, struct pci_reg_info *regs) -{ - for (; regs->name; regs++) { - printf(" %s =%*s%#.*lx\n", regs->name, - (int)(28 - strlen(regs->name)), "", - pci_field_width(regs->size), - pci_read_config(dev, regs->offset, regs->size)); - } -} -#endif - -#ifdef CONFIG_DM_PCI -int pci_bar_show(struct udevice *dev) +static int pci_bar_show(struct udevice *dev) { u8 header_type; int bar_cnt, bar_id, mem_type; @@ -105,9 +71,14 @@ int prefetchable; dm_pci_read_config8(dev, PCI_HEADER_TYPE, &header_type); + header_type &= 0x7f; if (header_type == PCI_HEADER_TYPE_CARDBUS) { printf("CardBus doesn't support BARs\n"); + return -ENOSYS; + } else if (header_type != PCI_HEADER_TYPE_NORMAL && + header_type != PCI_HEADER_TYPE_BRIDGE) { + printf("unknown header type\n"); return -ENOSYS; } @@ -149,7 +120,7 @@ if ((!is_64 && size_low) || (is_64 && size)) { size = ~size + 1; - printf(" %d %#016llx %#016llx %d %s %s\n", + printf(" %d %#018llx %#018llx %d %s %s\n", bar_id, (unsigned long long)base, (unsigned long long)size, is_64 ? 64 : 32, is_io ? "I/O" : "MEM", @@ -162,7 +133,6 @@ return 0; } -#endif static struct pci_reg_info regs_start[] = { { "vendor ID", PCI_SIZE_16, PCI_VENDOR_ID }, @@ -258,29 +228,18 @@ * * @dev: Bus+Device+Function number */ -#ifdef CONFIG_DM_PCI -void pci_header_show(struct udevice *dev) -#else -void pci_header_show(pci_dev_t dev) -#endif +static void pci_header_show(struct udevice *dev) { -#ifdef CONFIG_DM_PCI unsigned long class, header_type; dm_pci_read_config(dev, PCI_CLASS_CODE, &class, PCI_SIZE_8); dm_pci_read_config(dev, PCI_HEADER_TYPE, &header_type, PCI_SIZE_8); -#else - u8 class, header_type; - - pci_read_config_byte(dev, PCI_CLASS_CODE, &class); - pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type); -#endif pci_show_regs(dev, regs_start); printf(" class code = 0x%.2x (%s)\n", (int)class, pci_class_str(class)); pci_show_regs(dev, regs_rest); - switch (header_type & 0x03) { + switch (header_type & 0x7f) { case PCI_HEADER_TYPE_NORMAL: /* "normal" PCI device */ pci_show_regs(dev, regs_normal); break; @@ -297,17 +256,14 @@ } } -void pciinfo_header(int busnum, bool short_listing) +static void pciinfo_header(bool short_listing) { - printf("Scanning PCI devices on bus %d\n", busnum); - if (short_listing) { printf("BusDevFun VendorId DeviceId Device Class Sub-Class\n"); printf("_____________________________________________________________\n"); } } -#ifdef CONFIG_DM_PCI /** * pci_header_show_brief() - Show the short-form PCI device header * @@ -330,11 +286,15 @@ pci_class_str(class), subclass); } -static void pciinfo(struct udevice *bus, bool short_listing) +static void pciinfo(struct udevice *bus, bool short_listing, bool multi) { struct udevice *dev; - pciinfo_header(bus->seq, short_listing); + if (!multi) + printf("Scanning PCI devices on bus %d\n", bus->seq); + + if (!multi || bus->seq == 0) + pciinfo_header(short_listing); for (device_find_first_child(bus, &dev); dev; @@ -353,102 +313,6 @@ } } } - -#else - -/** - * pci_header_show_brief() - Show the short-form PCI device header - * - * Reads and prints the header of the specified PCI device in short form. - * - * @dev: Bus+Device+Function number - */ -void pci_header_show_brief(pci_dev_t dev) -{ - u16 vendor, device; - u8 class, subclass; - - pci_read_config_word(dev, PCI_VENDOR_ID, &vendor); - pci_read_config_word(dev, PCI_DEVICE_ID, &device); - pci_read_config_byte(dev, PCI_CLASS_CODE, &class); - pci_read_config_byte(dev, PCI_CLASS_SUB_CODE, &subclass); - - printf("0x%.4x 0x%.4x %-23s 0x%.2x\n", - vendor, device, - pci_class_str(class), subclass); -} - -/** - * pciinfo() - Show a list of devices on the PCI bus - * - * Show information about devices on PCI bus. Depending on @short_pci_listing - * the output will be more or less exhaustive. - * - * @bus_num: The number of the bus to be scanned - * @short_pci_listing: true to use short form, showing only a brief header - * for each device - */ -void pciinfo(int bus_num, int short_pci_listing) -{ - struct pci_controller *hose = pci_bus_to_hose(bus_num); - int device; - int function; - unsigned char header_type; - unsigned short vendor_id; - pci_dev_t dev; - int ret; - - if (!hose) - return; - - pciinfo_header(bus_num, short_pci_listing); - - for (device = 0; device < PCI_MAX_PCI_DEVICES; device++) { - header_type = 0; - vendor_id = 0; - for (function = 0; function < PCI_MAX_PCI_FUNCTIONS; - function++) { - /* - * If this is not a multi-function device, we skip - * the rest. - */ - if (function && !(header_type & 0x80)) - break; - - dev = PCI_BDF(bus_num, device, function); - - if (pci_skip_dev(hose, dev)) - continue; - - ret = pci_read_config_word(dev, PCI_VENDOR_ID, - &vendor_id); - if (ret) - goto error; - if ((vendor_id == 0xFFFF) || (vendor_id == 0x0000)) - continue; - - if (!function) { - pci_read_config_byte(dev, PCI_HEADER_TYPE, - &header_type); - } - - if (short_pci_listing) { - printf("%02x.%02x.%02x ", bus_num, device, - function); - pci_header_show_brief(dev); - } else { - printf("\nFound PCI device %02x.%02x.%02x:\n", - bus_num, device, function); - pci_header_show(dev); - } - } - } - - return; -error: - printf("Cannot read bus configuration: %d\n", ret); -} -#endif /** * get_pci_dev() - Convert the "bus.device.function" identifier into a number @@ -481,13 +345,8 @@ return PCI_BDF(bdfs[0], bdfs[1], bdfs[2]); } -#ifdef CONFIG_DM_PCI static int pci_cfg_display(struct udevice *dev, ulong addr, enum pci_size_t size, ulong length) -#else -static int pci_cfg_display(pci_dev_t bdf, ulong addr, enum pci_size_t size, - ulong length) -#endif { #define DISP_LINE_LEN 16 ulong i, nbytes, linebytes; @@ -508,11 +367,7 @@ for (i = 0; i < linebytes; i += byte_size) { unsigned long val; -#ifdef CONFIG_DM_PCI dm_pci_read_config(dev, addr, &val, size); -#else - val = pci_read_config(bdf, addr, size); -#endif printf(" %0*lx", pci_field_width(size), val); addr += byte_size; } @@ -527,31 +382,8 @@ return (rc); } -#ifndef CONFIG_DM_PCI -static int pci_cfg_write (pci_dev_t bdf, ulong addr, ulong size, ulong value) -{ - if (size == 4) { - pci_write_config_dword(bdf, addr, value); - } - else if (size == 2) { - ushort val = value & 0xffff; - pci_write_config_word(bdf, addr, val); - } - else { - u_char val = value & 0xff; - pci_write_config_byte(bdf, addr, val); - } - return 0; -} -#endif - -#ifdef CONFIG_DM_PCI static int pci_cfg_modify(struct udevice *dev, ulong addr, ulong size, ulong value, int incrflag) -#else -static int pci_cfg_modify(pci_dev_t bdf, ulong addr, ulong size, ulong value, - int incrflag) -#endif { ulong i; int nbytes; @@ -562,11 +394,7 @@ */ do { printf("%08lx:", addr); -#ifdef CONFIG_DM_PCI dm_pci_read_config(dev, addr, &val, size); -#else - val = pci_read_config(bdf, addr, size); -#endif printf(" %0*lx", pci_field_width(size), val); nbytes = cli_readline(" ? "); @@ -593,11 +421,7 @@ /* good enough to not time out */ bootretry_reset_cmd_timeout(); -#ifdef CONFIG_DM_PCI dm_pci_write_config(dev, addr, i, size); -#else - pci_cfg_write(bdf, addr, size, i); -#endif if (incrflag) addr += size; } @@ -607,7 +431,6 @@ return 0; } -#ifdef CONFIG_DM_PCI static const struct pci_flag_info { uint flag; const char *name; @@ -621,7 +444,7 @@ static void pci_show_regions(struct udevice *bus) { - struct pci_controller *hose = dev_get_uclass_priv(bus); + struct pci_controller *hose = dev_get_uclass_priv(pci_get_controller(bus)); const struct pci_region *reg; int i, j; @@ -630,10 +453,11 @@ return; } - printf("# %-16s %-16s %-16s %s\n", "Bus start", "Phys start", "Size", + printf("Buses %02x-%02x\n", hose->first_busno, hose->last_busno); + printf("# %-18s %-18s %-18s %s\n", "Bus start", "Phys start", "Size", "Flags"); for (i = 0, reg = hose->regions; i < hose->region_count; i++, reg++) { - printf("%d %#016llx %#016llx %#016llx ", i, + printf("%d %#018llx %#018llx %#018llx ", i, (unsigned long long)reg->bus_start, (unsigned long long)reg->phys_start, (unsigned long long)reg->size); @@ -646,7 +470,6 @@ printf("\n"); } } -#endif /* PCI Configuration Space access commands * @@ -660,15 +483,12 @@ { 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; + int busnum = -1; pci_dev_t bdf = 0; char cmd = 's'; int ret = 0; + char *endp; if (argc > 1) cmd = argv[1][0]; @@ -686,19 +506,15 @@ 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 */ @@ -707,10 +523,37 @@ value = 0; argc--; } - if (argc > 1) - busnum = simple_strtoul(argv[1], NULL, 16); + if (argc > 2 || (argc > 1 && cmd != 'r' && argv[1][0] != 's')) { + if (argv[argc - 1][0] != '*') { + busnum = simple_strtoul(argv[argc - 1], &endp, 16); + if (*endp) + goto usage; + } + argc--; + } + if (cmd == 'r' && argc > 2) + goto usage; + else if (cmd != 'r' && (argc > 2 || (argc == 2 && argv[1][0] != 's'))) + goto usage; } -#ifdef CONFIG_DM_PCI + if (busnum == -1) { + if (cmd != 'r') { + for (busnum = 0; + uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus) == 0; + busnum++) + pciinfo(bus, value, true); + } else { + for (busnum = 0; + uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus) == 0; + busnum++) { + /* Regions are controller specific so skip non-root buses */ + if (device_is_on_pci_bus(bus)) + continue; + pci_show_regions(bus); + } + } + return 0; + } ret = uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus); if (ret) { printf("No such bus\n"); @@ -719,22 +562,15 @@ if (cmd == 'r') pci_show_regions(bus); else - pciinfo(bus, value); -#else - pciinfo(busnum, value); -#endif + pciinfo(bus, value, false); 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 */ @@ -755,17 +591,10 @@ 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; @@ -780,20 +609,16 @@ #ifdef CONFIG_SYS_LONGHELP static char pci_help_text[] = - "[bus] [long]\n" + "[bus|*] [long]\n" " - short or long list of PCI devices on bus 'bus'\n" -#if defined(CONFIG_DM_PCI) "pci enum\n" " - Enumerate PCI buses\n" -#endif "pci header b.d.f\n" " - show header of PCI device 'bus.device.function'\n" -#ifdef CONFIG_DM_PCI "pci bar b.d.f\n" " - show BARs base and size for device b.d.f'\n" - "pci regions\n" + "pci regions [bus|*]\n" " - show PCI regions\n" -#endif "pci display[.b, .w, .l] b.d.f [address] [# of objects]\n" " - display PCI configuration space (CFG)\n" "pci next[.b, .w, .l] b.d.f address\n" -- Gitblit v1.6.2