Angel Pons | c74dae9 | 2020-04-02 23:48:16 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* This file is part of the coreboot project. */ |
Uwe Hermann | b80dbf0 | 2007-04-22 19:08:13 +0000 | [diff] [blame] | 3 | |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 4 | #include <console/console.h> |
| 5 | #include <device/device.h> |
| 6 | #include <device/pci.h> |
Stefan Reinauer | de3206a | 2010-02-22 06:09:43 +0000 | [diff] [blame] | 7 | #include <reset.h> |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 8 | |
Kyösti Mälkki | a93c3fe | 2012-10-09 22:28:56 +0300 | [diff] [blame] | 9 | const char mainboard_name[] = CONFIG_MAINBOARD_VENDOR " " CONFIG_MAINBOARD_PART_NUMBER; |
| 10 | |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 11 | /** |
Nico Huber | f7ed3d4 | 2019-03-14 15:50:06 +0100 | [diff] [blame] | 12 | * Enable devices on static buses. |
Li-Ta Lo | fb4c50f | 2004-05-07 21:52:47 +0000 | [diff] [blame] | 13 | * |
Li-Ta Lo | 9f0d0f9 | 2004-05-10 16:05:16 +0000 | [diff] [blame] | 14 | * The enumeration of certain buses is purely static. The existence of |
| 15 | * devices on those buses can be completely determined at compile time |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 16 | * and is specified in the config file. Typical examples are the 'PNP' |
| 17 | * devices on a legacy ISA/LPC bus. There is no need of probing of any kind, |
| 18 | * the only thing we have to do is to walk through the bus and |
Li-Ta Lo | 0493069 | 2004-11-25 17:37:19 +0000 | [diff] [blame] | 19 | * enable or disable devices as indicated in the config file. |
Li-Ta Lo | fb4c50f | 2004-05-07 21:52:47 +0000 | [diff] [blame] | 20 | * |
Li-Ta Lo | 0493069 | 2004-11-25 17:37:19 +0000 | [diff] [blame] | 21 | * On the other hand, some devices are virtual and their existence is |
| 22 | * artificial. They can not be probed at run time. One example is the |
| 23 | * debug device. Those virtual devices have to be listed in the config |
| 24 | * file under some static bus in order to be enumerated at run time. |
Li-Ta Lo | fb4c50f | 2004-05-07 21:52:47 +0000 | [diff] [blame] | 25 | * |
Uwe Hermann | c1ee429 | 2010-10-17 19:01:48 +0000 | [diff] [blame] | 26 | * @param bus Pointer to the device to which the static buses are attached to. |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 27 | */ |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 28 | |
Nico Huber | f7ed3d4 | 2019-03-14 15:50:06 +0100 | [diff] [blame] | 29 | void enable_static_devices(struct device *bus) |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 30 | { |
Elyes HAOUAS | 6e019d8 | 2018-05-02 21:34:56 +0200 | [diff] [blame] | 31 | struct device *child; |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 32 | struct bus *link; |
Li-Ta Lo | e526669 | 2004-03-23 21:28:05 +0000 | [diff] [blame] | 33 | |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 34 | for (link = bus->link_list; link; link = link->next) { |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 35 | for (child = link->children; child; child = child->sibling) { |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 36 | |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 37 | if (child->chip_ops && child->chip_ops->enable_dev) |
Eric Biederman | 7003ba4 | 2004-10-16 06:20:29 +0000 | [diff] [blame] | 38 | child->chip_ops->enable_dev(child); |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 39 | |
| 40 | if (child->ops && child->ops->enable) |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 41 | child->ops->enable(child); |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 42 | |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 43 | printk(BIOS_DEBUG, "%s %s\n", dev_path(child), |
| 44 | child->enabled ? "enabled" : "disabled"); |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 45 | } |
| 46 | } |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 47 | } |
| 48 | |
Elyes HAOUAS | 6e019d8 | 2018-05-02 21:34:56 +0200 | [diff] [blame] | 49 | void scan_generic_bus(struct device *bus) |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 50 | { |
Elyes HAOUAS | 6e019d8 | 2018-05-02 21:34:56 +0200 | [diff] [blame] | 51 | struct device *child; |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 52 | struct bus *link; |
Furquan Shaikh | 4e08479 | 2017-02-13 13:22:19 -0800 | [diff] [blame] | 53 | static int bus_max = 0; |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 54 | |
| 55 | printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus)); |
| 56 | |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 57 | for (link = bus->link_list; link; link = link->next) { |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 58 | |
Furquan Shaikh | 4e08479 | 2017-02-13 13:22:19 -0800 | [diff] [blame] | 59 | link->secondary = ++bus_max; |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 60 | |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 61 | for (child = link->children; child; child = child->sibling) { |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 62 | |
| 63 | if (child->chip_ops && child->chip_ops->enable_dev) |
| 64 | child->chip_ops->enable_dev(child); |
| 65 | |
| 66 | if (child->ops && child->ops->enable) |
| 67 | child->ops->enable(child); |
| 68 | |
Furquan Shaikh | 4e08479 | 2017-02-13 13:22:19 -0800 | [diff] [blame] | 69 | printk(BIOS_DEBUG, "bus: %s[%d]->", dev_path(child->bus->dev), |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 70 | child->bus->link_num); |
| 71 | |
| 72 | printk(BIOS_DEBUG, "%s %s\n", dev_path(child), |
| 73 | child->enabled ? "enabled" : "disabled"); |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 74 | } |
| 75 | } |
Li-Ta Lo | fb4c50f | 2004-05-07 21:52:47 +0000 | [diff] [blame] | 76 | |
Stefan Reinauer | c02b4fc | 2010-03-22 11:42:32 +0000 | [diff] [blame] | 77 | printk(BIOS_SPEW, "%s for %s done\n", __func__, dev_path(bus)); |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 78 | } |
| 79 | |
Elyes HAOUAS | 6e019d8 | 2018-05-02 21:34:56 +0200 | [diff] [blame] | 80 | void scan_smbus(struct device *bus) |
Furquan Shaikh | 4e08479 | 2017-02-13 13:22:19 -0800 | [diff] [blame] | 81 | { |
| 82 | scan_generic_bus(bus); |
| 83 | } |
| 84 | |
Nico Huber | a89c82e | 2017-09-14 15:40:28 +0200 | [diff] [blame] | 85 | /* |
| 86 | * Default scan_bus() implementation |
Li-Ta Lo | 9782f75 | 2004-05-05 21:15:42 +0000 | [diff] [blame] | 87 | * |
Nico Huber | a89c82e | 2017-09-14 15:40:28 +0200 | [diff] [blame] | 88 | * This is the default implementation for buses that can't |
| 89 | * be probed at runtime. It simply walks through the topology |
| 90 | * given by the mainboard's `devicetree.cb`. |
Uwe Hermann | c1ee429 | 2010-10-17 19:01:48 +0000 | [diff] [blame] | 91 | * |
Nico Huber | a89c82e | 2017-09-14 15:40:28 +0200 | [diff] [blame] | 92 | * First, all direct descendants of the given device are |
| 93 | * enabled. Then, downstream buses are scanned. |
Li-Ta Lo | 9782f75 | 2004-05-05 21:15:42 +0000 | [diff] [blame] | 94 | */ |
Nico Huber | a89c82e | 2017-09-14 15:40:28 +0200 | [diff] [blame] | 95 | void scan_static_bus(struct device *bus) |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 96 | { |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 97 | struct bus *link; |
| 98 | |
| 99 | printk(BIOS_SPEW, "%s for %s\n", __func__, dev_path(bus)); |
| 100 | |
Nico Huber | f7ed3d4 | 2019-03-14 15:50:06 +0100 | [diff] [blame] | 101 | enable_static_devices(bus); |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 102 | |
Kyösti Mälkki | 2d2367c | 2015-02-20 21:28:31 +0200 | [diff] [blame] | 103 | for (link = bus->link_list; link; link = link->next) |
| 104 | scan_bridges(link); |
Kyösti Mälkki | d0e212c | 2015-02-26 20:47:47 +0200 | [diff] [blame] | 105 | |
| 106 | printk(BIOS_SPEW, "%s for %s done\n", __func__, dev_path(bus)); |
Eric Biederman | 03acab6 | 2004-10-14 21:25:53 +0000 | [diff] [blame] | 107 | } |
| 108 | |
Myles Watson | 7eac445 | 2010-06-17 16:16:56 +0000 | [diff] [blame] | 109 | static void root_dev_reset(struct bus *bus) |
Yinghai Lu | 13f1c2a | 2005-07-08 02:49:49 +0000 | [diff] [blame] | 110 | { |
Uwe Hermann | d453dd0 | 2010-10-18 00:00:57 +0000 | [diff] [blame] | 111 | printk(BIOS_INFO, "Resetting board...\n"); |
Nico Huber | 4f32b64 | 2018-10-05 23:40:21 +0200 | [diff] [blame] | 112 | board_reset(); |
Yinghai Lu | 13f1c2a | 2005-07-08 02:49:49 +0000 | [diff] [blame] | 113 | } |
| 114 | |
Julius Werner | cd49cce | 2019-03-05 16:53:33 -0800 | [diff] [blame] | 115 | #if CONFIG(HAVE_ACPI_TABLES) |
Aaron Durbin | aa090cb | 2017-09-13 16:01:52 -0600 | [diff] [blame] | 116 | static const char *root_dev_acpi_name(const struct device *dev) |
Duncan Laurie | d9af3ce | 2016-05-08 18:15:25 -0700 | [diff] [blame] | 117 | { |
| 118 | return "\\_SB"; |
| 119 | } |
| 120 | #endif |
| 121 | |
Li-Ta Lo | 9782f75 | 2004-05-05 21:15:42 +0000 | [diff] [blame] | 122 | /** |
Uwe Hermann | c1ee429 | 2010-10-17 19:01:48 +0000 | [diff] [blame] | 123 | * Default device operation for root device. |
Li-Ta Lo | 9782f75 | 2004-05-05 21:15:42 +0000 | [diff] [blame] | 124 | * |
Li-Ta Lo | 0493069 | 2004-11-25 17:37:19 +0000 | [diff] [blame] | 125 | * This is the default device operation for root devices. These operations |
Uwe Hermann | c1ee429 | 2010-10-17 19:01:48 +0000 | [diff] [blame] | 126 | * should be fully usable as is. However the chip_operations::enable_dev() |
Li-Ta Lo | 0493069 | 2004-11-25 17:37:19 +0000 | [diff] [blame] | 127 | * of a motherboard can override this if you want non-default behavior. |
Li-Ta Lo | 9782f75 | 2004-05-05 21:15:42 +0000 | [diff] [blame] | 128 | */ |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 129 | struct device_operations default_dev_ops_root = { |
Kyösti Mälkki | 85756c1 | 2015-02-06 09:15:52 +0200 | [diff] [blame] | 130 | .read_resources = DEVICE_NOOP, |
| 131 | .set_resources = DEVICE_NOOP, |
Nico Huber | a89c82e | 2017-09-14 15:40:28 +0200 | [diff] [blame] | 132 | .scan_bus = scan_static_bus, |
Yinghai Lu | 13f1c2a | 2005-07-08 02:49:49 +0000 | [diff] [blame] | 133 | .reset_bus = root_dev_reset, |
Julius Werner | cd49cce | 2019-03-05 16:53:33 -0800 | [diff] [blame] | 134 | #if CONFIG(HAVE_ACPI_TABLES) |
Duncan Laurie | d9af3ce | 2016-05-08 18:15:25 -0700 | [diff] [blame] | 135 | .acpi_name = root_dev_acpi_name, |
| 136 | #endif |
Eric Biederman | e9a271e3 | 2003-09-02 03:36:25 +0000 | [diff] [blame] | 137 | }; |