1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /**
3*4882a593Smuzhiyun * PCI Endpoint *Function* (EPF) header file
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2017 Texas Instruments
6*4882a593Smuzhiyun * Author: Kishon Vijay Abraham I <kishon@ti.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef __LINUX_PCI_EPF_H
10*4882a593Smuzhiyun #define __LINUX_PCI_EPF_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
14*4882a593Smuzhiyun #include <linux/pci.h>
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun struct pci_epf;
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun enum pci_notify_event {
19*4882a593Smuzhiyun CORE_INIT,
20*4882a593Smuzhiyun LINK_UP,
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun enum pci_barno {
24*4882a593Smuzhiyun NO_BAR = -1,
25*4882a593Smuzhiyun BAR_0,
26*4882a593Smuzhiyun BAR_1,
27*4882a593Smuzhiyun BAR_2,
28*4882a593Smuzhiyun BAR_3,
29*4882a593Smuzhiyun BAR_4,
30*4882a593Smuzhiyun BAR_5,
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /**
34*4882a593Smuzhiyun * struct pci_epf_header - represents standard configuration header
35*4882a593Smuzhiyun * @vendorid: identifies device manufacturer
36*4882a593Smuzhiyun * @deviceid: identifies a particular device
37*4882a593Smuzhiyun * @revid: specifies a device-specific revision identifier
38*4882a593Smuzhiyun * @progif_code: identifies a specific register-level programming interface
39*4882a593Smuzhiyun * @subclass_code: identifies more specifically the function of the device
40*4882a593Smuzhiyun * @baseclass_code: broadly classifies the type of function the device performs
41*4882a593Smuzhiyun * @cache_line_size: specifies the system cacheline size in units of DWORDs
42*4882a593Smuzhiyun * @subsys_vendor_id: vendor of the add-in card or subsystem
43*4882a593Smuzhiyun * @subsys_id: id specific to vendor
44*4882a593Smuzhiyun * @interrupt_pin: interrupt pin the device (or device function) uses
45*4882a593Smuzhiyun */
46*4882a593Smuzhiyun struct pci_epf_header {
47*4882a593Smuzhiyun u16 vendorid;
48*4882a593Smuzhiyun u16 deviceid;
49*4882a593Smuzhiyun u8 revid;
50*4882a593Smuzhiyun u8 progif_code;
51*4882a593Smuzhiyun u8 subclass_code;
52*4882a593Smuzhiyun u8 baseclass_code;
53*4882a593Smuzhiyun u8 cache_line_size;
54*4882a593Smuzhiyun u16 subsys_vendor_id;
55*4882a593Smuzhiyun u16 subsys_id;
56*4882a593Smuzhiyun enum pci_interrupt_pin interrupt_pin;
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun /**
60*4882a593Smuzhiyun * struct pci_epf_ops - set of function pointers for performing EPF operations
61*4882a593Smuzhiyun * @bind: ops to perform when a EPC device has been bound to EPF device
62*4882a593Smuzhiyun * @unbind: ops to perform when a binding has been lost between a EPC device
63*4882a593Smuzhiyun * and EPF device
64*4882a593Smuzhiyun */
65*4882a593Smuzhiyun struct pci_epf_ops {
66*4882a593Smuzhiyun int (*bind)(struct pci_epf *epf);
67*4882a593Smuzhiyun void (*unbind)(struct pci_epf *epf);
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /**
71*4882a593Smuzhiyun * struct pci_epf_driver - represents the PCI EPF driver
72*4882a593Smuzhiyun * @probe: ops to perform when a new EPF device has been bound to the EPF driver
73*4882a593Smuzhiyun * @remove: ops to perform when the binding between the EPF device and EPF
74*4882a593Smuzhiyun * driver is broken
75*4882a593Smuzhiyun * @driver: PCI EPF driver
76*4882a593Smuzhiyun * @ops: set of function pointers for performing EPF operations
77*4882a593Smuzhiyun * @owner: the owner of the module that registers the PCI EPF driver
78*4882a593Smuzhiyun * @epf_group: list of configfs group corresponding to the PCI EPF driver
79*4882a593Smuzhiyun * @id_table: identifies EPF devices for probing
80*4882a593Smuzhiyun */
81*4882a593Smuzhiyun struct pci_epf_driver {
82*4882a593Smuzhiyun int (*probe)(struct pci_epf *epf);
83*4882a593Smuzhiyun int (*remove)(struct pci_epf *epf);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun struct device_driver driver;
86*4882a593Smuzhiyun struct pci_epf_ops *ops;
87*4882a593Smuzhiyun struct module *owner;
88*4882a593Smuzhiyun struct list_head epf_group;
89*4882a593Smuzhiyun const struct pci_epf_device_id *id_table;
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun #define to_pci_epf_driver(drv) (container_of((drv), struct pci_epf_driver, \
93*4882a593Smuzhiyun driver))
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun /**
96*4882a593Smuzhiyun * struct pci_epf_bar - represents the BAR of EPF device
97*4882a593Smuzhiyun * @phys_addr: physical address that should be mapped to the BAR
98*4882a593Smuzhiyun * @addr: virtual address corresponding to the @phys_addr
99*4882a593Smuzhiyun * @size: the size of the address space present in BAR
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyun struct pci_epf_bar {
102*4882a593Smuzhiyun dma_addr_t phys_addr;
103*4882a593Smuzhiyun void *addr;
104*4882a593Smuzhiyun size_t size;
105*4882a593Smuzhiyun enum pci_barno barno;
106*4882a593Smuzhiyun int flags;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun /**
110*4882a593Smuzhiyun * struct pci_epf - represents the PCI EPF device
111*4882a593Smuzhiyun * @dev: the PCI EPF device
112*4882a593Smuzhiyun * @name: the name of the PCI EPF device
113*4882a593Smuzhiyun * @header: represents standard configuration header
114*4882a593Smuzhiyun * @bar: represents the BAR of EPF device
115*4882a593Smuzhiyun * @msi_interrupts: number of MSI interrupts required by this function
116*4882a593Smuzhiyun * @func_no: unique function number within this endpoint device
117*4882a593Smuzhiyun * @epc: the EPC device to which this EPF device is bound
118*4882a593Smuzhiyun * @driver: the EPF driver to which this EPF device is bound
119*4882a593Smuzhiyun * @list: to add pci_epf as a list of PCI endpoint functions to pci_epc
120*4882a593Smuzhiyun * @nb: notifier block to notify EPF of any EPC events (like linkup)
121*4882a593Smuzhiyun * @lock: mutex to protect pci_epf_ops
122*4882a593Smuzhiyun */
123*4882a593Smuzhiyun struct pci_epf {
124*4882a593Smuzhiyun struct device dev;
125*4882a593Smuzhiyun const char *name;
126*4882a593Smuzhiyun struct pci_epf_header *header;
127*4882a593Smuzhiyun struct pci_epf_bar bar[6];
128*4882a593Smuzhiyun u8 msi_interrupts;
129*4882a593Smuzhiyun u16 msix_interrupts;
130*4882a593Smuzhiyun u8 func_no;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun struct pci_epc *epc;
133*4882a593Smuzhiyun struct pci_epf_driver *driver;
134*4882a593Smuzhiyun struct list_head list;
135*4882a593Smuzhiyun struct notifier_block nb;
136*4882a593Smuzhiyun /* mutex to protect against concurrent access of pci_epf_ops */
137*4882a593Smuzhiyun struct mutex lock;
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /**
141*4882a593Smuzhiyun * struct pci_epf_msix_tbl - represents the MSIX table entry structure
142*4882a593Smuzhiyun * @msg_addr: Writes to this address will trigger MSIX interrupt in host
143*4882a593Smuzhiyun * @msg_data: Data that should be written to @msg_addr to trigger MSIX interrupt
144*4882a593Smuzhiyun * @vector_ctrl: Identifies if the function is prohibited from sending a message
145*4882a593Smuzhiyun * using this MSIX table entry
146*4882a593Smuzhiyun */
147*4882a593Smuzhiyun struct pci_epf_msix_tbl {
148*4882a593Smuzhiyun u64 msg_addr;
149*4882a593Smuzhiyun u32 msg_data;
150*4882a593Smuzhiyun u32 vector_ctrl;
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun #define to_pci_epf(epf_dev) container_of((epf_dev), struct pci_epf, dev)
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun #define pci_epf_register_driver(driver) \
156*4882a593Smuzhiyun __pci_epf_register_driver((driver), THIS_MODULE)
157*4882a593Smuzhiyun
epf_set_drvdata(struct pci_epf * epf,void * data)158*4882a593Smuzhiyun static inline void epf_set_drvdata(struct pci_epf *epf, void *data)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun dev_set_drvdata(&epf->dev, data);
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
epf_get_drvdata(struct pci_epf * epf)163*4882a593Smuzhiyun static inline void *epf_get_drvdata(struct pci_epf *epf)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun return dev_get_drvdata(&epf->dev);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun const struct pci_epf_device_id *
169*4882a593Smuzhiyun pci_epf_match_device(const struct pci_epf_device_id *id, struct pci_epf *epf);
170*4882a593Smuzhiyun struct pci_epf *pci_epf_create(const char *name);
171*4882a593Smuzhiyun void pci_epf_destroy(struct pci_epf *epf);
172*4882a593Smuzhiyun int __pci_epf_register_driver(struct pci_epf_driver *driver,
173*4882a593Smuzhiyun struct module *owner);
174*4882a593Smuzhiyun void pci_epf_unregister_driver(struct pci_epf_driver *driver);
175*4882a593Smuzhiyun void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar,
176*4882a593Smuzhiyun size_t align);
177*4882a593Smuzhiyun void pci_epf_free_space(struct pci_epf *epf, void *addr, enum pci_barno bar);
178*4882a593Smuzhiyun int pci_epf_bind(struct pci_epf *epf);
179*4882a593Smuzhiyun void pci_epf_unbind(struct pci_epf *epf);
180*4882a593Smuzhiyun #endif /* __LINUX_PCI_EPF_H */
181