/ src / device / root_device.c
root_device.c
  1  /* SPDX-License-Identifier: GPL-2.0-only */
  2  
  3  #include <console/console.h>
  4  #include <device/device.h>
  5  #include <device/pci.h>
  6  #include <reset.h>
  7  
  8  void enable_static_device(struct device *dev)
  9  {
 10  	if (dev->chip_ops && dev->chip_ops->enable_dev)
 11  		dev->chip_ops->enable_dev(dev);
 12  
 13  	if (dev->ops && dev->ops->enable)
 14  		dev->ops->enable(dev);
 15  
 16  	printk(BIOS_DEBUG, "%s %s\n", dev_path(dev),
 17  	       dev->enabled ? "enabled" : "disabled");
 18  }
 19  
 20  /**
 21   * Enable devices on static buses.
 22   *
 23   * The enumeration of certain buses is purely static. The existence of
 24   * devices on those buses can be completely determined at compile time
 25   * and is specified in the config file. Typical examples are the 'PNP'
 26   * devices on a legacy ISA/LPC bus. There is no need of probing of any kind,
 27   * the only thing we have to do is to walk through the bus and
 28   * enable or disable devices as indicated in the config file.
 29   *
 30   * On the other hand, some devices are virtual and their existence is
 31   * artificial. They can not be probed at run time. One example is the
 32   * debug device. Those virtual devices have to be listed in the config
 33   * file under some static bus in order to be enumerated at run time.
 34   *
 35   * @param bus Pointer to the device to which the static buses are attached to.
 36   */
 37  
 38  void enable_static_devices(struct device *bus)
 39  {
 40  	struct device *child;
 41  
 42  	if (!bus->downstream)
 43  		return;
 44  
 45  	for (child = bus->downstream->children; child; child = child->sibling)
 46  		enable_static_device(child);
 47  }
 48  
 49  void scan_generic_bus(struct device *bus)
 50  {
 51  	struct device *child;
 52  	static int bus_max = 0;
 53  
 54  	printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus));
 55  
 56  	if (bus->downstream) {
 57  		bus->downstream->secondary = ++bus_max;
 58  
 59  		for (child = bus->downstream->children; child; child = child->sibling) {
 60  			enable_static_device(child);
 61  			printk(BIOS_DEBUG, "bus: %s->", dev_path(child->upstream->dev));
 62  		}
 63  	}
 64  
 65  	printk(BIOS_SPEW, "%s for %s done\n", __func__, dev_path(bus));
 66  }
 67  
 68  void scan_smbus(struct device *bus)
 69  {
 70  	scan_generic_bus(bus);
 71  }
 72  
 73  /*
 74   * Default scan_bus() implementation
 75   *
 76   * This is the default implementation for buses that can't
 77   * be probed at runtime. It simply walks through the topology
 78   * given by the mainboard's `devicetree.cb`.
 79   *
 80   * First, all direct descendants of the given device are
 81   * enabled. Then, downstream buses are scanned.
 82   */
 83  void scan_static_bus(struct device *bus)
 84  {
 85  	printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus));
 86  
 87  	enable_static_devices(bus);
 88  
 89  	if (bus->downstream)
 90  		scan_bridges(bus->downstream);
 91  
 92  	printk(BIOS_SPEW, "%s for %s done\n", __func__, dev_path(bus));
 93  }
 94  
 95  static void root_dev_reset(struct bus *bus)
 96  {
 97  	printk(BIOS_INFO, "Resetting board...\n");
 98  	board_reset();
 99  }
100  
101  #if CONFIG(HAVE_ACPI_TABLES)
102  static const char *root_dev_acpi_name(const struct device *dev)
103  {
104  	return "\\_SB";
105  }
106  #endif
107  
108  /**
109   * Default device operation for root device.
110   *
111   * This is the default device operation for root devices. These operations
112   * should be fully usable as is. However the chip_operations::enable_dev()
113   * of a motherboard can override this if you want non-default behavior.
114   */
115  struct device_operations default_dev_ops_root = {
116  	.read_resources   = noop_read_resources,
117  	.set_resources    = noop_set_resources,
118  	.scan_bus         = scan_static_bus,
119  	.reset_bus        = root_dev_reset,
120  #if CONFIG(HAVE_ACPI_TABLES)
121  	.acpi_name        = root_dev_acpi_name,
122  #endif
123  };