diff options
Diffstat (limited to 'include/linux/pci-epc.h')
-rw-r--r-- | include/linux/pci-epc.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h new file mode 100644 index 000000000000..af5edbf3eea3 --- /dev/null +++ b/include/linux/pci-epc.h | |||
@@ -0,0 +1,144 @@ | |||
1 | /** | ||
2 | * PCI Endpoint *Controller* (EPC) header file | ||
3 | * | ||
4 | * Copyright (C) 2017 Texas Instruments | ||
5 | * Author: Kishon Vijay Abraham I <kishon@ti.com> | ||
6 | * | ||
7 | * This program is free software: you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 of | ||
9 | * the License as published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef __LINUX_PCI_EPC_H | ||
13 | #define __LINUX_PCI_EPC_H | ||
14 | |||
15 | #include <linux/pci-epf.h> | ||
16 | |||
17 | struct pci_epc; | ||
18 | |||
19 | enum pci_epc_irq_type { | ||
20 | PCI_EPC_IRQ_UNKNOWN, | ||
21 | PCI_EPC_IRQ_LEGACY, | ||
22 | PCI_EPC_IRQ_MSI, | ||
23 | }; | ||
24 | |||
25 | /** | ||
26 | * struct pci_epc_ops - set of function pointers for performing EPC operations | ||
27 | * @write_header: ops to populate configuration space header | ||
28 | * @set_bar: ops to configure the BAR | ||
29 | * @clear_bar: ops to reset the BAR | ||
30 | * @map_addr: ops to map CPU address to PCI address | ||
31 | * @unmap_addr: ops to unmap CPU address and PCI address | ||
32 | * @set_msi: ops to set the requested number of MSI interrupts in the MSI | ||
33 | * capability register | ||
34 | * @get_msi: ops to get the number of MSI interrupts allocated by the RC from | ||
35 | * the MSI capability register | ||
36 | * @raise_irq: ops to raise a legacy or MSI interrupt | ||
37 | * @start: ops to start the PCI link | ||
38 | * @stop: ops to stop the PCI link | ||
39 | * @owner: the module owner containing the ops | ||
40 | */ | ||
41 | struct pci_epc_ops { | ||
42 | int (*write_header)(struct pci_epc *pci_epc, | ||
43 | struct pci_epf_header *hdr); | ||
44 | int (*set_bar)(struct pci_epc *epc, enum pci_barno bar, | ||
45 | dma_addr_t bar_phys, size_t size, int flags); | ||
46 | void (*clear_bar)(struct pci_epc *epc, enum pci_barno bar); | ||
47 | int (*map_addr)(struct pci_epc *epc, phys_addr_t addr, | ||
48 | u64 pci_addr, size_t size); | ||
49 | void (*unmap_addr)(struct pci_epc *epc, phys_addr_t addr); | ||
50 | int (*set_msi)(struct pci_epc *epc, u8 interrupts); | ||
51 | int (*get_msi)(struct pci_epc *epc); | ||
52 | int (*raise_irq)(struct pci_epc *pci_epc, | ||
53 | enum pci_epc_irq_type type, u8 interrupt_num); | ||
54 | int (*start)(struct pci_epc *epc); | ||
55 | void (*stop)(struct pci_epc *epc); | ||
56 | struct module *owner; | ||
57 | }; | ||
58 | |||
59 | /** | ||
60 | * struct pci_epc_mem - address space of the endpoint controller | ||
61 | * @phys_base: physical base address of the PCI address space | ||
62 | * @size: the size of the PCI address space | ||
63 | * @bitmap: bitmap to manage the PCI address space | ||
64 | * @pages: number of bits representing the address region | ||
65 | */ | ||
66 | struct pci_epc_mem { | ||
67 | phys_addr_t phys_base; | ||
68 | size_t size; | ||
69 | unsigned long *bitmap; | ||
70 | int pages; | ||
71 | }; | ||
72 | |||
73 | /** | ||
74 | * struct pci_epc - represents the PCI EPC device | ||
75 | * @dev: PCI EPC device | ||
76 | * @pci_epf: list of endpoint functions present in this EPC device | ||
77 | * @ops: function pointers for performing endpoint operations | ||
78 | * @mem: address space of the endpoint controller | ||
79 | * @max_functions: max number of functions that can be configured in this EPC | ||
80 | * @group: configfs group representing the PCI EPC device | ||
81 | * @lock: spinlock to protect pci_epc ops | ||
82 | */ | ||
83 | struct pci_epc { | ||
84 | struct device dev; | ||
85 | struct list_head pci_epf; | ||
86 | const struct pci_epc_ops *ops; | ||
87 | struct pci_epc_mem *mem; | ||
88 | u8 max_functions; | ||
89 | struct config_group *group; | ||
90 | /* spinlock to protect against concurrent access of EP controller */ | ||
91 | spinlock_t lock; | ||
92 | }; | ||
93 | |||
94 | #define to_pci_epc(device) container_of((device), struct pci_epc, dev) | ||
95 | |||
96 | #define pci_epc_create(dev, ops) \ | ||
97 | __pci_epc_create((dev), (ops), THIS_MODULE) | ||
98 | #define devm_pci_epc_create(dev, ops) \ | ||
99 | __devm_pci_epc_create((dev), (ops), THIS_MODULE) | ||
100 | |||
101 | static inline void epc_set_drvdata(struct pci_epc *epc, void *data) | ||
102 | { | ||
103 | dev_set_drvdata(&epc->dev, data); | ||
104 | } | ||
105 | |||
106 | static inline void *epc_get_drvdata(struct pci_epc *epc) | ||
107 | { | ||
108 | return dev_get_drvdata(&epc->dev); | ||
109 | } | ||
110 | |||
111 | struct pci_epc * | ||
112 | __devm_pci_epc_create(struct device *dev, const struct pci_epc_ops *ops, | ||
113 | struct module *owner); | ||
114 | struct pci_epc * | ||
115 | __pci_epc_create(struct device *dev, const struct pci_epc_ops *ops, | ||
116 | struct module *owner); | ||
117 | void devm_pci_epc_destroy(struct device *dev, struct pci_epc *epc); | ||
118 | void pci_epc_destroy(struct pci_epc *epc); | ||
119 | int pci_epc_add_epf(struct pci_epc *epc, struct pci_epf *epf); | ||
120 | void pci_epc_linkup(struct pci_epc *epc); | ||
121 | void pci_epc_remove_epf(struct pci_epc *epc, struct pci_epf *epf); | ||
122 | int pci_epc_write_header(struct pci_epc *epc, struct pci_epf_header *hdr); | ||
123 | int pci_epc_set_bar(struct pci_epc *epc, enum pci_barno bar, | ||
124 | dma_addr_t bar_phys, size_t size, int flags); | ||
125 | void pci_epc_clear_bar(struct pci_epc *epc, int bar); | ||
126 | int pci_epc_map_addr(struct pci_epc *epc, phys_addr_t phys_addr, | ||
127 | u64 pci_addr, size_t size); | ||
128 | void pci_epc_unmap_addr(struct pci_epc *epc, phys_addr_t phys_addr); | ||
129 | int pci_epc_set_msi(struct pci_epc *epc, u8 interrupts); | ||
130 | int pci_epc_get_msi(struct pci_epc *epc); | ||
131 | int pci_epc_raise_irq(struct pci_epc *epc, enum pci_epc_irq_type type, | ||
132 | u8 interrupt_num); | ||
133 | int pci_epc_start(struct pci_epc *epc); | ||
134 | void pci_epc_stop(struct pci_epc *epc); | ||
135 | struct pci_epc *pci_epc_get(const char *epc_name); | ||
136 | void pci_epc_put(struct pci_epc *epc); | ||
137 | |||
138 | int pci_epc_mem_init(struct pci_epc *epc, phys_addr_t phys_addr, size_t size); | ||
139 | void pci_epc_mem_exit(struct pci_epc *epc); | ||
140 | void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc, | ||
141 | phys_addr_t *phys_addr, size_t size); | ||
142 | void pci_epc_mem_free_addr(struct pci_epc *epc, phys_addr_t phys_addr, | ||
143 | void __iomem *virt_addr, size_t size); | ||
144 | #endif /* __LINUX_PCI_EPC_H */ | ||