Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2015, Intel Corporation
0004  * Author: Jiang Liu <jiang.liu@linux.intel.com>
0005  */
0006 #ifndef _LINUX_RESOURCE_EXT_H
0007 #define _LINUX_RESOURCE_EXT_H
0008 #include <linux/types.h>
0009 #include <linux/list.h>
0010 #include <linux/ioport.h>
0011 #include <linux/slab.h>
0012 
0013 /* Represent resource window for bridge devices */
0014 struct resource_win {
0015     struct resource res;        /* In master (CPU) address space */
0016     resource_size_t offset;     /* Translation offset for bridge */
0017 };
0018 
0019 /*
0020  * Common resource list management data structure and interfaces to support
0021  * ACPI, PNP and PCI host bridge etc.
0022  */
0023 struct resource_entry {
0024     struct list_head    node;
0025     struct resource     *res;   /* In master (CPU) address space */
0026     resource_size_t     offset; /* Translation offset for bridge */
0027     struct resource     __res;  /* Default storage for res */
0028 };
0029 
0030 extern struct resource_entry *
0031 resource_list_create_entry(struct resource *res, size_t extra_size);
0032 extern void resource_list_free(struct list_head *head);
0033 
0034 static inline void resource_list_add(struct resource_entry *entry,
0035                      struct list_head *head)
0036 {
0037     list_add(&entry->node, head);
0038 }
0039 
0040 static inline void resource_list_add_tail(struct resource_entry *entry,
0041                       struct list_head *head)
0042 {
0043     list_add_tail(&entry->node, head);
0044 }
0045 
0046 static inline void resource_list_del(struct resource_entry *entry)
0047 {
0048     list_del(&entry->node);
0049 }
0050 
0051 static inline void resource_list_free_entry(struct resource_entry *entry)
0052 {
0053     kfree(entry);
0054 }
0055 
0056 static inline void
0057 resource_list_destroy_entry(struct resource_entry *entry)
0058 {
0059     resource_list_del(entry);
0060     resource_list_free_entry(entry);
0061 }
0062 
0063 #define resource_list_for_each_entry(entry, list)   \
0064     list_for_each_entry((entry), (list), node)
0065 
0066 #define resource_list_for_each_entry_safe(entry, tmp, list) \
0067     list_for_each_entry_safe((entry), (tmp), (list), node)
0068 
0069 static inline struct resource_entry *
0070 resource_list_first_type(struct list_head *list, unsigned long type)
0071 {
0072     struct resource_entry *entry;
0073 
0074     resource_list_for_each_entry(entry, list) {
0075         if (resource_type(entry->res) == type)
0076             return entry;
0077     }
0078     return NULL;
0079 }
0080 
0081 #endif /* _LINUX_RESOURCE_EXT_H */