uboot/drivers/core/dump.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 2015 Google, Inc
   4 */
   5
   6#include <common.h>
   7#include <dm.h>
   8#include <mapmem.h>
   9#include <dm/root.h>
  10#include <dm/util.h>
  11#include <dm/uclass-internal.h>
  12
  13static void show_devices(struct udevice *dev, int depth, int last_flag)
  14{
  15        int i, is_last;
  16        struct udevice *child;
  17        u32 flags = dev_get_flags(dev);
  18
  19        /* print the first 20 characters to not break the tree-format. */
  20        printf(IS_ENABLED(CONFIG_SPL_BUILD) ? " %s  %d  [ %c ]   %s  " :
  21               " %-10.10s  %3d  [ %c ]   %-20.20s  ", dev->uclass->uc_drv->name,
  22               dev_get_uclass_index(dev, NULL),
  23               flags & DM_FLAG_ACTIVATED ? '+' : ' ', dev->driver->name);
  24
  25        for (i = depth; i >= 0; i--) {
  26                is_last = (last_flag >> i) & 1;
  27                if (i) {
  28                        if (is_last)
  29                                printf("    ");
  30                        else
  31                                printf("|   ");
  32                } else {
  33                        if (is_last)
  34                                printf("`-- ");
  35                        else
  36                                printf("|-- ");
  37                }
  38        }
  39
  40        printf("%s\n", dev->name);
  41
  42        list_for_each_entry(child, &dev->child_head, sibling_node) {
  43                is_last = list_is_last(&child->sibling_node, &dev->child_head);
  44                show_devices(child, depth + 1, (last_flag << 1) | is_last);
  45        }
  46}
  47
  48void dm_dump_all(void)
  49{
  50        struct udevice *root;
  51
  52        root = dm_root();
  53        if (root) {
  54                printf(" Class     Index  Probed  Driver                Name\n");
  55                printf("-----------------------------------------------------------\n");
  56                show_devices(root, -1, 0);
  57        }
  58}
  59
  60/**
  61 * dm_display_line() - Display information about a single device
  62 *
  63 * Displays a single line of information with an option prefix
  64 *
  65 * @dev:        Device to display
  66 */
  67static void dm_display_line(struct udevice *dev, int index)
  68{
  69        printf("%-3i %c %s @ %08lx", index,
  70               dev_get_flags(dev) & DM_FLAG_ACTIVATED ? '*' : ' ',
  71               dev->name, (ulong)map_to_sysmem(dev));
  72        if (dev->seq_ != -1)
  73                printf(", seq %d", dev_seq(dev));
  74        puts("\n");
  75}
  76
  77void dm_dump_uclass(void)
  78{
  79        struct uclass *uc;
  80        int ret;
  81        int id;
  82
  83        for (id = 0; id < UCLASS_COUNT; id++) {
  84                struct udevice *dev;
  85                int i = 0;
  86
  87                ret = uclass_get(id, &uc);
  88                if (ret)
  89                        continue;
  90
  91                printf("uclass %d: %s\n", id, uc->uc_drv->name);
  92                if (list_empty(&uc->dev_head))
  93                        continue;
  94                uclass_foreach_dev(dev, uc) {
  95                        dm_display_line(dev, i);
  96                        i++;
  97                }
  98                puts("\n");
  99        }
 100}
 101
 102void dm_dump_driver_compat(void)
 103{
 104        struct driver *d = ll_entry_start(struct driver, driver);
 105        const int n_ents = ll_entry_count(struct driver, driver);
 106        struct driver *entry;
 107        const struct udevice_id *match;
 108
 109        puts("Driver                Compatible\n");
 110        puts("--------------------------------\n");
 111        for (entry = d; entry < d + n_ents; entry++) {
 112                match = entry->of_match;
 113
 114                printf("%-20.20s", entry->name);
 115                if (match) {
 116                        printf("  %s", match->compatible);
 117                        match++;
 118                }
 119                printf("\n");
 120
 121                for (; match && match->compatible; match++)
 122                        printf("%-20.20s  %s\n", "", match->compatible);
 123        }
 124}
 125
 126void dm_dump_drivers(void)
 127{
 128        struct driver *d = ll_entry_start(struct driver, driver);
 129        const int n_ents = ll_entry_count(struct driver, driver);
 130        struct driver *entry;
 131        struct udevice *udev;
 132        struct uclass *uc;
 133        int ret;
 134        int i;
 135
 136        puts("Driver                    uid uclass               Devices\n");
 137        puts("----------------------------------------------------------\n");
 138
 139        for (entry = d; entry < d + n_ents; entry++) {
 140                ret = uclass_get(entry->id, &uc);
 141
 142                printf("%-25.25s %-3.3d %-20.20s ", entry->name, entry->id,
 143                       !ret ? uc->uc_drv->name : "<no uclass>");
 144
 145                if (ret) {
 146                        puts("\n");
 147                        continue;
 148                }
 149
 150                i = 0;
 151                uclass_foreach_dev(udev, uc) {
 152                        if (udev->driver != entry)
 153                                continue;
 154                        if (i)
 155                                printf("%-51.51s", "");
 156
 157                        printf("%-25.25s\n", udev->name);
 158                        i++;
 159                }
 160                if (!i)
 161                        puts("<none>\n");
 162        }
 163}
 164
 165void dm_dump_static_driver_info(void)
 166{
 167        struct driver_info *drv = ll_entry_start(struct driver_info,
 168                                                 driver_info);
 169        const int n_ents = ll_entry_count(struct driver_info, driver_info);
 170        struct driver_info *entry;
 171
 172        puts("Driver                    Address\n");
 173        puts("---------------------------------\n");
 174        for (entry = drv; entry != drv + n_ents; entry++) {
 175                printf("%-25.25s @%08lx\n", entry->name,
 176                       (ulong)map_to_sysmem(entry->plat));
 177        }
 178}
 179