1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Adapted from Linux kernel driver 4 * Copyright (C) 2017 Texas Instruments 5 * Author: Kishon Vijay Abraham I <kishon@ti.com> 6 * 7 * (C) Copyright 2019 8 * Ramon Fried <ramon.fried@gmail.com> 9 */ 10 11 #ifndef _PCI_EP_H 12 #define _PCI_EP_H 13 14 #include <pci.h> 15 16 /** 17 * enum pci_interrupt_pin - PCI INTx interrupt values 18 * @PCI_INTERRUPT_UNKNOWN: Unknown or unassigned interrupt 19 * @PCI_INTERRUPT_INTA: PCI INTA pin 20 * @PCI_INTERRUPT_INTB: PCI INTB pin 21 * @PCI_INTERRUPT_INTC: PCI INTC pin 22 * @PCI_INTERRUPT_INTD: PCI INTD pin 23 * 24 * Corresponds to values for legacy PCI INTx interrupts, as can be found in the 25 * PCI_INTERRUPT_PIN register. 26 */ 27 enum pci_interrupt_pin { 28 PCI_INTERRUPT_UNKNOWN, 29 PCI_INTERRUPT_INTA, 30 PCI_INTERRUPT_INTB, 31 PCI_INTERRUPT_INTC, 32 PCI_INTERRUPT_INTD, 33 }; 34 35 enum pci_barno { 36 BAR_0, 37 BAR_1, 38 BAR_2, 39 BAR_3, 40 BAR_4, 41 BAR_5, 42 }; 43 44 enum pci_ep_irq_type { 45 PCI_EP_IRQ_UNKNOWN, 46 PCI_EP_IRQ_LEGACY, 47 PCI_EP_IRQ_MSI, 48 PCI_EP_IRQ_MSIX, 49 }; 50 51 /** 52 * struct pci_bar - represents the BAR (Base Address Register) of EP device 53 * @phys_addr: physical address that should be mapped to the BAR 54 * @size: the size of the address space present in BAR 55 * pci_barno: number of pci BAR to set (0..5) 56 * @flags: BAR access flags 57 */ 58 struct pci_bar { 59 dma_addr_t phys_addr; 60 size_t size; 61 enum pci_barno barno; 62 int flags; 63 }; 64 65 /** 66 * struct pci_ep_header - represents standard configuration header 67 * @vendorid: identifies device manufacturer 68 * @deviceid: identifies a particular device 69 * @revid: specifies a device-specific revision identifier 70 * @progif_code: identifies a specific register-level programming interface 71 * @subclass_code: identifies more specifically the function of the device 72 * @baseclass_code: broadly classifies the type of function the device performs 73 * @cache_line_size: specifies the system cacheline size in units of DWORDs 74 * @subsys_vendor_id: vendor of the add-in card or subsystem 75 * @subsys_id: id specific to vendor 76 * @interrupt_pin: interrupt pin the device (or device function) uses 77 */ 78 struct pci_ep_header { 79 u16 vendorid; 80 u16 deviceid; 81 u8 revid; 82 u8 progif_code; 83 u8 subclass_code; 84 u8 baseclass_code; 85 u8 cache_line_size; 86 u16 subsys_vendor_id; 87 u16 subsys_id; 88 enum pci_interrupt_pin interrupt_pin; 89 }; 90 91 /* PCI endpoint operations */ 92 struct pci_ep_ops { 93 /** 94 * write_header() - Write a PCI configuration space header 95 * 96 * @dev: device to write to 97 * @func_num: EP function to fill 98 * @hdr: header to write 99 * @return 0 if OK, -ve on error 100 */ 101 int (*write_header)(struct udevice *dev, uint func_num, 102 struct pci_ep_header *hdr); 103 /** 104 * read_header() - Read a PCI configuration space header 105 * 106 * @dev: device to write to 107 * @func_num: EP function to fill 108 * @hdr: header to read to 109 * @return 0 if OK, -ve on error 110 */ 111 int (*read_header)(struct udevice *dev, uint func_num, 112 struct pci_ep_header *hdr); 113 /** 114 * set_bar() - Set BAR (Base Address Register) properties 115 * 116 * @dev: device to set 117 * @func_num: EP function to set 118 * @bar: bar data 119 * @return 0 if OK, -ve on error 120 */ 121 int (*set_bar)(struct udevice *dev, uint func_num, 122 struct pci_bar *bar); 123 /** 124 * read_bar() - Read BAR (Base Address Register) properties 125 * 126 * @dev: device to read 127 * @func_num: EP function to read 128 * @bar: struct to copy data to 129 * @barno: bar number to read 130 * @return 0 if OK, -ve on error 131 */ 132 int (*read_bar)(struct udevice *dev, uint func_num, 133 struct pci_bar *bar, enum pci_barno barno); 134 /** 135 * clear_bar() - clear BAR (Base Address Register) 136 * 137 * @dev: device to clear 138 * @func_num: EP function to clear 139 * @bar: bar number 140 * @return 0 if OK, -ve on error 141 */ 142 int (*clear_bar)(struct udevice *dev, uint func_num, 143 enum pci_barno bar); 144 /** 145 * map_addr() - map CPU address to PCI address 146 * 147 * outband region is used in order to generate PCI read/write 148 * transaction from local memory/write. 149 * 150 * @dev: device to set 151 * @func_num: EP function to set 152 * @addr: local physical address base 153 * @pci_addr: pci address to translate to 154 * @size: region size 155 * @return 0 if OK, -ve on error 156 */ 157 int (*map_addr)(struct udevice *dev, uint func_num, 158 phys_addr_t addr, u64 pci_addr, size_t size); 159 /** 160 * unmap_addr() - unmap CPU address to PCI address 161 * 162 * unmap previously mapped region. 163 * 164 * @dev: device to set 165 * @func_num: EP function to set 166 * @addr: local physical address base 167 * @return 0 if OK, -ve on error 168 */ 169 int (*unmap_addr)(struct udevice *dev, uint func_num, 170 phys_addr_t addr); 171 /** 172 * set_msi() - set msi capability property 173 * 174 * set the number of required MSI vectors the device 175 * needs for operation. 176 * 177 * @dev: device to set 178 * @func_num: EP function to set 179 * @interrupts: required interrupts count 180 * @return 0 if OK, -ve on error 181 */ 182 int (*set_msi)(struct udevice *dev, uint func_num, uint interrupts); 183 184 /** 185 * get_msi() - get the number of MSI interrupts allocated by the host. 186 * 187 * Read the Multiple Message Enable bitfield from 188 * Message control register. 189 * 190 * @dev: device to use 191 * @func_num: EP function to use 192 * @return msi count if OK, -EINVAL if msi were not enabled at host. 193 */ 194 int (*get_msi)(struct udevice *dev, uint func_num); 195 196 /** 197 * set_msix() - set msix capability property 198 * 199 * set the number of required MSIx vectors the device 200 * needs for operation. 201 * 202 * @dev: device to set 203 * @func_num: EP function to set 204 * @interrupts: required interrupts count 205 * @return 0 if OK, -ve on error 206 */ 207 int (*set_msix)(struct udevice *dev, uint func_num, 208 uint interrupts); 209 210 /** 211 * get_msix() - get the number of MSIx interrupts allocated by the host. 212 * 213 * Read the Multiple Message Enable bitfield from 214 * Message control register. 215 * 216 * @dev: device to use 217 * @func_num: EP function to use 218 * @return msi count if OK, -EINVAL if msi were not enabled at host. 219 */ 220 int (*get_msix)(struct udevice *dev, uint func_num); 221 222 /** 223 * raise_irq() - raise a legacy, MSI or MSI-X interrupt 224 * 225 * @dev: device to set 226 * @func_num: EP function to set 227 * @type: type of irq to send 228 * @interrupt_num: interrupt vector to use 229 * @return 0 if OK, -ve on error 230 */ 231 int (*raise_irq)(struct udevice *dev, uint func_num, 232 enum pci_ep_irq_type type, uint interrupt_num); 233 /** 234 * start() - start the PCI link 235 * 236 * @dev: device to set 237 * @return 0 if OK, -ve on error 238 */ 239 int (*start)(struct udevice *dev); 240 241 /** 242 * stop() - stop the PCI link 243 * 244 * @dev: device to set 245 * @return 0 if OK, -ve on error 246 */ 247 int (*stop)(struct udevice *dev); 248 }; 249 250 #define pci_ep_get_ops(dev) ((struct pci_ep_ops *)(dev)->driver->ops) 251 252 /** 253 * pci_ep_write_header() - Write a PCI configuration space header 254 * 255 * @dev: device to write to 256 * @func_num: EP function to fill 257 * @hdr: header to write 258 * @return 0 if OK, -ve on error 259 */ 260 int pci_ep_write_header(struct udevice *dev, uint func_num, 261 struct pci_ep_header *hdr); 262 263 /** 264 * dm_pci_ep_read_header() - Read a PCI configuration space header 265 * 266 * @dev: device to write to 267 * @func_num: EP function to fill 268 * @hdr: header to read to 269 * @return 0 if OK, -ve on error 270 */ 271 int pci_ep_read_header(struct udevice *dev, uint func_num, 272 struct pci_ep_header *hdr); 273 /** 274 * pci_ep_set_bar() - Set BAR (Base Address Register) properties 275 * 276 * @dev: device to set 277 * @func_num: EP function to set 278 * @bar: bar data 279 * @return 0 if OK, -ve on error 280 */ 281 int pci_ep_set_bar(struct udevice *dev, uint func_num, struct pci_bar *bar); 282 283 /** 284 * pci_ep_read_bar() - Read BAR (Base Address Register) properties 285 * 286 * @dev: device to read 287 * @func_num: EP function to read 288 * @bar: struct to copy data to 289 * @barno: bar number to read 290 * @return 0 if OK, -ve on error 291 */ 292 int pci_ep_read_bar(struct udevice *dev, uint func_no, struct pci_bar *ep_bar, 293 enum pci_barno barno); 294 295 /** 296 * pci_ep_clear_bar() - Clear BAR (Base Address Register) 297 * mark the BAR as empty so host won't map it. 298 * @dev: device to clear 299 * @func_num: EP function to clear 300 * @bar: bar number 301 * @return 0 if OK, -ve on error 302 */ 303 int pci_ep_clear_bar(struct udevice *dev, uint func_num, enum pci_barno bar); 304 /** 305 * pci_ep_map_addr() - map CPU address to PCI address 306 * 307 * outband region is used in order to generate PCI read/write 308 * transaction from local memory/write. 309 * 310 * @dev: device to set 311 * @func_num: EP function to set 312 * @addr: local physical address base 313 * @pci_addr: pci address to translate to 314 * @size: region size 315 * @return 0 if OK, -ve on error 316 */ 317 int pci_ep_map_addr(struct udevice *dev, uint func_num, phys_addr_t addr, 318 u64 pci_addr, size_t size); 319 /** 320 * pci_ep_unmap_addr() - unmap CPU address to PCI address 321 * 322 * unmap previously mapped region. 323 * 324 * @dev: device to set 325 * @func_num: EP function to set 326 * @addr: local physical address base 327 * @return 0 if OK, -ve on error 328 */ 329 int pci_ep_unmap_addr(struct udevice *dev, uint func_num, phys_addr_t addr); 330 331 /** 332 * pci_ep_set_msi() - set msi capability property 333 * 334 * set the number of required MSI vectors the device 335 * needs for operation. 336 * 337 * @dev: device to set 338 * @func_num: EP function to set 339 * @interrupts: required interrupts count 340 * @return 0 if OK, -ve on error 341 */ 342 int pci_ep_set_msi(struct udevice *dev, uint func_num, uint interrupts); 343 344 /** 345 * pci_ep_get_msi() - get the number of MSI interrupts allocated by the host. 346 * 347 * Read the Multiple Message Enable bitfield from 348 * Message control register. 349 * 350 * @dev: device to use 351 * @func_num: EP function to use 352 * @return msi count if OK, -EINVAL if msi were not enabled at host. 353 */ 354 int pci_ep_get_msi(struct udevice *dev, uint func_num); 355 356 /** 357 * pci_ep_set_msix() - set msi capability property 358 * 359 * set the number of required MSIx vectors the device 360 * needs for operation. 361 * 362 * @dev: device to set 363 * @func_num: EP function to set 364 * @interrupts: required interrupts count 365 * @return 0 if OK, -ve on error 366 */ 367 int pci_ep_set_msix(struct udevice *dev, uint func_num, uint interrupts); 368 369 /** 370 * pci_ep_get_msix() - get the number of MSIx interrupts allocated by the host. 371 * 372 * Read the Multiple Message Enable bitfield from 373 * Message control register. 374 * 375 * @dev: device to use 376 * @func_num: EP function to use 377 * @return msi count if OK, -EINVAL if msi were not enabled at host. 378 */ 379 int pci_ep_get_msix(struct udevice *dev, uint func_num); 380 381 /** 382 * pci_ep_raise_irq() - raise a legacy, MSI or MSI-X interrupt 383 * 384 * @dev: device to set 385 * @func_num: EP function to set 386 * @type: type of irq to send 387 * @interrupt_num: interrupt vector to use 388 * @return 0 if OK, -ve on error 389 */ 390 int pci_ep_raise_irq(struct udevice *dev, uint func_num, 391 enum pci_ep_irq_type type, uint interrupt_num); 392 /** 393 * pci_ep_start() - start the PCI link 394 * 395 * Enable PCI endpoint device and start link 396 * process. 397 * 398 * @dev: device to set 399 * @return 0 if OK, -ve on error 400 */ 401 int pci_ep_start(struct udevice *dev); 402 403 /** 404 * pci_ep_stop() - stop the PCI link 405 * 406 * Disable PCI endpoint device and stop 407 * link. 408 * 409 * @dev: device to set 410 * @return 0 if OK, -ve on error 411 */ 412 int pci_ep_stop(struct udevice *dev); 413 414 #endif 415