Linux has support for resource_lists. These are for collecting resources along with a translation offset on a list. Copy it over to barebox for use in our pci support. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- common/resource.c | 16 +++++++ include/linux/resource_ext.h | 81 ++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 include/linux/resource_ext.h diff --git a/common/resource.c b/common/resource.c index 8678609229..76f19de494 100644 --- a/common/resource.c +++ b/common/resource.c @@ -10,6 +10,7 @@ #include <init.h> #include <linux/ioport.h> #include <linux/err.h> +#include <linux/resource_ext.h> #include <asm/io.h> static int init_resource(struct resource *res, const char *name) @@ -164,3 +165,18 @@ struct resource *request_ioport_region(const char *name, return res; } + +struct resource_entry *resource_list_create_entry(struct resource *res, + size_t extra_size) +{ + struct resource_entry *entry; + + entry = kzalloc(sizeof(*entry) + extra_size, GFP_KERNEL); + if (entry) { + INIT_LIST_HEAD(&entry->node); + entry->res = res ? res : &entry->__res; + } + + return entry; +} +EXPORT_SYMBOL(resource_list_create_entry); diff --git a/include/linux/resource_ext.h b/include/linux/resource_ext.h new file mode 100644 index 0000000000..ff0339df56 --- /dev/null +++ b/include/linux/resource_ext.h @@ -0,0 +1,81 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2015, Intel Corporation + * Author: Jiang Liu <jiang.liu@xxxxxxxxxxxxxxx> + */ +#ifndef _LINUX_RESOURCE_EXT_H +#define _LINUX_RESOURCE_EXT_H +#include <linux/types.h> +#include <linux/list.h> +#include <linux/ioport.h> +#include <linux/slab.h> + +/* Represent resource window for bridge devices */ +struct resource_win { + struct resource res; /* In master (CPU) address space */ + resource_size_t offset; /* Translation offset for bridge */ +}; + +/* + * Common resource list management data structure and interfaces to support + * ACPI, PNP and PCI host bridge etc. + */ +struct resource_entry { + struct list_head node; + struct resource *res; /* In master (CPU) address space */ + resource_size_t offset; /* Translation offset for bridge */ + struct resource __res; /* Default storage for res */ +}; + +extern struct resource_entry * +resource_list_create_entry(struct resource *res, size_t extra_size); +extern void resource_list_free(struct list_head *head); + +static inline void resource_list_add(struct resource_entry *entry, + struct list_head *head) +{ + list_add(&entry->node, head); +} + +static inline void resource_list_add_tail(struct resource_entry *entry, + struct list_head *head) +{ + list_add_tail(&entry->node, head); +} + +static inline void resource_list_del(struct resource_entry *entry) +{ + list_del(&entry->node); +} + +static inline void resource_list_free_entry(struct resource_entry *entry) +{ + kfree(entry); +} + +static inline void +resource_list_destroy_entry(struct resource_entry *entry) +{ + resource_list_del(entry); + resource_list_free_entry(entry); +} + +#define resource_list_for_each_entry(entry, list) \ + list_for_each_entry((entry), (list), node) + +#define resource_list_for_each_entry_safe(entry, tmp, list) \ + list_for_each_entry_safe((entry), (tmp), (list), node) + +static inline struct resource_entry * +resource_list_first_type(struct list_head *list, unsigned long type) +{ + struct resource_entry *entry; + + resource_list_for_each_entry(entry, list) { + if (resource_type(entry->res) == type) + return entry; + } + return NULL; +} + +#endif /* _LINUX_RESOURCE_EXT_H */ -- 2.39.2