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
  18        /* print the first 20 characters to not break the tree-format. */
  19        printf(" %-10.10s  %3d  [ %c ]   %-20.20s  ", dev->uclass->uc_drv->name,
  20               dev_get_uclass_index(dev, NULL),
  21               dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ', dev->driver->name);
  22
  23        for (i = depth; i >= 0; i--) {
  24                is_last = (last_flag >> i) & 1;
  25                if (i) {
  26                        if (is_last)
  27                                printf("    ");
  28                        else
  29                                printf("|   ");
  30                } else {
  31                        if (is_last)
  32                                printf("`-- ");
  33                        else
  34                                printf("|-- ");
  35                }
  36        }
  37
  38        printf("%s\n", dev->name);
  39
  40        list_for_each_entry(child, &dev->child_head, sibling_node) {
  41                is_last = list_is_last(&child->sibling_node, &dev->child_head);
  42                show_devices(child, depth + 1, (last_flag << 1) | is_last);
  43        }
  44}
  45
  46void dm_dump_all(void)
  47{
  48        struct udevice *root;
  49
  50        root = dm_root();
  51        if (root) {
  52                printf(" Class     Index  Probed  Driver                Name\n");
  53                printf("-----------------------------------------------------------\n");
  54                show_devices(root, -1, 0);
  55        }
  56}
  57
  58/**
  59 * dm_display_line() - Display information about a single device
  60 *
  61 * Displays a single line of information with an option prefix
  62 *
  63 * @dev:        Device to display
  64 */
  65static void dm_display_line(struct udevice *dev, int index)
  66{
  67        printf("%-3i %c %s @ %08lx", index,
  68               dev->flags & DM_FLAG_ACTIVATED ? '*' : ' ',
  69               dev->name, (ulong)map_to_sysmem(dev));
  70        if (dev->seq != -1 || dev->req_seq != -1)
  71                printf(", seq %d, (req %d)", dev->seq, dev->req_seq);
  72        puts("\n");
  73}
  74
  75void dm_dump_uclass(void)
  76{
  77        struct uclass *uc;
  78        int ret;
  79        int id;
  80
  81        for (id = 0; id < UCLASS_COUNT; id++) {
  82                struct udevice *dev;
  83                int i = 0;
  84
  85                ret = uclass_get(id, &uc);
  86                if (ret)
  87                        continue;
  88
  89                printf("uclass %d: %s\n", id, uc->uc_drv->name);
  90                if (list_empty(&uc->dev_head))
  91                        continue;
  92                uclass_foreach_dev(dev, uc) {
  93                        dm_display_line(dev, i);
  94                        i++;
  95                }
  96                puts("\n");
  97        }
  98}
  99