On 1/17/22 16:38, Pali Rohár wrote:
'pci regions' currently prints only region information from bus 0 which
belongs to controller 0. Parser for 'pci regions' cmdline currently ignores
any additional arguments and so U-Boot always uses bus 0.

Regions are stored in controller (not on the bus) and therefore to retrieve
controller from the bus, it is needed to call pci_get_controller() which
returns root bus. Because bus 0 is root bus, current code worked fine for
controller 0.

Extend cmdline parser for 'pci regions' to allows specifying bus number,
extend pci_show_regions() code to accept also non-zero bus number and
print bus ranges for which is regions configuration assigned.

Signed-off-by: Pali Rohár <p...@kernel.org>

Nitpicking comment below. But still:

Reviewed-by: Stefan Roese <s...@denx.de>

Thanks,
Stefan

---
  cmd/pci.c | 10 ++++++----
  1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/cmd/pci.c b/cmd/pci.c
index 3b1863f139c9..53edf0d90010 100644
--- a/cmd/pci.c
+++ b/cmd/pci.c
@@ -443,7 +443,7 @@ static const struct pci_flag_info {
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;
@@ -452,6 +452,7 @@ static void pci_show_regions(struct udevice *bus)
                return;
        }
+ 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++) {
@@ -520,8 +521,9 @@ static int do_pci(struct cmd_tbl *cmdtp, int flag, int 
argc, char *const argv[])
                                value = 0;
                                argc--;
                        }
-                       if (argc > 1)
-                               busnum = hextoul(argv[1], NULL);
+                       if (argc > 2 || (argc > 1 && cmd != 'r' && argv[1][0] 
!= 's')) {
+                               busnum = hextoul(argv[argc - 1], NULL);
+                       }

Nitpicking:
Single line statements without parentheses is preferred.

                }
                ret = uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus);
                if (ret) {
@@ -586,7 +588,7 @@ static char pci_help_text[] =
        "    - show header of PCI device 'bus.device.function'\n"
        "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"
        "pci display[.b, .w, .l] b.d.f [address] [# of objects]\n"
        "    - display PCI configuration space (CFG)\n"

Viele Grüße,
Stefan Roese

--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: s...@denx.de

Reply via email to