blk-mq, elevator: Count requests per hctx to improve performance
[linux-2.6-microblaze.git] / include / linux / pci-epc.h
index e0ed9d0..cc66bec 100644 (file)
@@ -65,20 +65,28 @@ struct pci_epc_ops {
        struct module *owner;
 };
 
+/**
+ * struct pci_epc_mem_window - address window of the endpoint controller
+ * @phys_base: physical base address of the PCI address window
+ * @size: the size of the PCI address window
+ * @page_size: size of each page
+ */
+struct pci_epc_mem_window {
+       phys_addr_t     phys_base;
+       size_t          size;
+       size_t          page_size;
+};
+
 /**
  * struct pci_epc_mem - address space of the endpoint controller
- * @phys_base: physical base address of the PCI address space
- * @size: the size of the PCI address space
+ * @window: address window of the endpoint controller
  * @bitmap: bitmap to manage the PCI address space
  * @pages: number of bits representing the address region
- * @page_size: size of each page
  * @lock: mutex to protect bitmap
  */
 struct pci_epc_mem {
-       phys_addr_t     phys_base;
-       size_t          size;
+       struct pci_epc_mem_window window;
        unsigned long   *bitmap;
-       size_t          page_size;
        int             pages;
        /* mutex to protect against concurrent access for memory allocation*/
        struct mutex    lock;
@@ -89,7 +97,11 @@ struct pci_epc_mem {
  * @dev: PCI EPC device
  * @pci_epf: list of endpoint functions present in this EPC device
  * @ops: function pointers for performing endpoint operations
- * @mem: address space of the endpoint controller
+ * @windows: array of address space of the endpoint controller
+ * @mem: first window of the endpoint controller, which corresponds to
+ *       default address space of the endpoint controller supporting
+ *       single window.
+ * @num_windows: number of windows supported by device
  * @max_functions: max number of functions that can be configured in this EPC
  * @group: configfs group representing the PCI EPC device
  * @lock: mutex to protect pci_epc ops
@@ -100,7 +112,9 @@ struct pci_epc {
        struct device                   dev;
        struct list_head                pci_epf;
        const struct pci_epc_ops        *ops;
+       struct pci_epc_mem              **windows;
        struct pci_epc_mem              *mem;
+       unsigned int                    num_windows;
        u8                              max_functions;
        struct config_group             *group;
        /* mutex to protect against concurrent access of EP controller */
@@ -137,9 +151,6 @@ struct pci_epc_features {
 #define devm_pci_epc_create(dev, ops)    \
                __devm_pci_epc_create((dev), (ops), THIS_MODULE)
 
-#define pci_epc_mem_init(epc, phys_addr, size) \
-               __pci_epc_mem_init((epc), (phys_addr), (size), PAGE_SIZE)
-
 static inline void epc_set_drvdata(struct pci_epc *epc, void *data)
 {
        dev_set_drvdata(&epc->dev, data);
@@ -195,8 +206,11 @@ unsigned int pci_epc_get_first_free_bar(const struct pci_epc_features
 struct pci_epc *pci_epc_get(const char *epc_name);
 void pci_epc_put(struct pci_epc *epc);
 
-int __pci_epc_mem_init(struct pci_epc *epc, phys_addr_t phys_addr, size_t size,
-                      size_t page_size);
+int pci_epc_mem_init(struct pci_epc *epc, phys_addr_t base,
+                    size_t size, size_t page_size);
+int pci_epc_multi_mem_init(struct pci_epc *epc,
+                          struct pci_epc_mem_window *window,
+                          unsigned int num_windows);
 void pci_epc_mem_exit(struct pci_epc *epc);
 void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc,
                                     phys_addr_t *phys_addr, size_t size);