summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/device/device.c35
-rw-r--r--src/include/device/device.h6
-rw-r--r--src/soc/intel/xeon_sp/chip_common.c9
-rw-r--r--src/soc/intel/xeon_sp/spr/ioat.c7
4 files changed, 40 insertions, 17 deletions
diff --git a/src/device/device.c b/src/device/device.c
index 811b70937c..d877e14eab 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -125,6 +125,41 @@ struct device *alloc_dev(struct bus *parent, struct device_path *path)
return dev;
}
+DECLARE_SPIN_LOCK(bus_lock)
+
+/**
+ * Allocate a new bus structure
+ *
+ * Allocate a new downstream bus structure below a device and attach it
+ * to the device tree if the device doesn't already have a downstream bus.
+ *
+ * @param parent Parent device the to be created bus should be attached to.
+ * @return Pointer to the newly created bus structure or the existing bus.
+ *
+ */
+static struct bus *__alloc_bus(struct device *parent)
+{
+ if (parent->link_list)
+ return parent->link_list;
+
+ struct bus *bus = calloc(1, sizeof(struct bus));
+ if (!bus)
+ die("Couldn't allocate downstream bus!\n");
+ parent->link_list = bus;
+ bus->dev = parent;
+
+ return bus;
+}
+
+struct bus *alloc_bus(struct device *parent)
+{
+ struct bus *bus;
+ spin_lock(&bus_lock);
+ bus = __alloc_bus(parent);
+ spin_unlock(&bus_lock);
+ return bus;
+}
+
/**
* See if a device structure already exists and if not allocate it.
*
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 83588d4735..13bc8dcb34 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -171,6 +171,7 @@ extern struct bus *free_links;
/* Generic device interface functions */
struct device *alloc_dev(struct bus *parent, struct device_path *path);
+struct bus *alloc_bus(struct device *parent);
void dev_initialize_chips(void);
void dev_enumerate(void);
void dev_configure(void);
@@ -229,10 +230,9 @@ void mp_init_cpus(DEVTREE_CONST struct bus *cpu_bus);
static inline void mp_cpu_bus_init(struct device *dev)
{
/* Make sure the cpu cluster has a downstream bus for LAPICs to be allocated. */
- if (!dev->link_list)
- add_more_links(dev, 1);
+ struct bus *bus = alloc_bus(dev);
- mp_init_cpus(dev->link_list);
+ mp_init_cpus(bus);
}
/* Debug functions */
diff --git a/src/soc/intel/xeon_sp/chip_common.c b/src/soc/intel/xeon_sp/chip_common.c
index bf2a015ed9..845e968a62 100644
--- a/src/soc/intel/xeon_sp/chip_common.c
+++ b/src/soc/intel/xeon_sp/chip_common.c
@@ -72,14 +72,7 @@ void iio_pci_domain_scan_bus(struct device *dev)
if (!sr)
return;
- if (!dev->link_list) {
- dev->link_list = calloc(1, sizeof(struct bus));
- if (!dev->link_list)
- die("%s: out of memory.\n", __func__);
- }
-
- struct bus *bus = dev->link_list;
- bus->dev = dev;
+ struct bus *bus = alloc_bus(dev);
bus->secondary = sr->BusBase;
bus->subordinate = sr->BusBase;
bus->max_subordinate = sr->BusLimit;
diff --git a/src/soc/intel/xeon_sp/spr/ioat.c b/src/soc/intel/xeon_sp/spr/ioat.c
index 02f35cfe77..60936a8a42 100644
--- a/src/soc/intel/xeon_sp/spr/ioat.c
+++ b/src/soc/intel/xeon_sp/spr/ioat.c
@@ -45,12 +45,7 @@ static void create_ioat_domain(const union xeon_domain_path dp, struct bus *cons
domain->ops = &ioat_domain_ops;
- domain->link_list = calloc(1, sizeof(struct bus));
- if (!domain->link_list)
- die("%s: out of memory.\n", __func__);
-
- struct bus *const bus = domain->link_list;
- bus->dev = domain;
+ struct bus *const bus = alloc_bus(domain);
bus->secondary = bus_base;
bus->subordinate = bus->secondary;
bus->max_subordinate = bus_limit;