1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * PCI Peer 2 Peer DMA support. |
4 | * |
5 | * Copyright (c) 2016-2018, Logan Gunthorpe |
6 | * Copyright (c) 2016-2017, Microsemi Corporation |
7 | * Copyright (c) 2017, Christoph Hellwig |
8 | * Copyright (c) 2018, Eideticom Inc. |
9 | */ |
10 | |
11 | #ifndef _LINUX_PCI_P2PDMA_H |
12 | #define _LINUX_PCI_P2PDMA_H |
13 | |
14 | #include <linux/pci.h> |
15 | |
16 | struct block_device; |
17 | struct scatterlist; |
18 | |
19 | #ifdef CONFIG_PCI_P2PDMA |
20 | int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, |
21 | u64 offset); |
22 | int pci_p2pdma_distance_many(struct pci_dev *provider, struct device **clients, |
23 | int num_clients, bool verbose); |
24 | bool pci_has_p2pmem(struct pci_dev *pdev); |
25 | struct pci_dev *pci_p2pmem_find_many(struct device **clients, int num_clients); |
26 | void *pci_alloc_p2pmem(struct pci_dev *pdev, size_t size); |
27 | void pci_free_p2pmem(struct pci_dev *pdev, void *addr, size_t size); |
28 | pci_bus_addr_t pci_p2pmem_virt_to_bus(struct pci_dev *pdev, void *addr); |
29 | struct scatterlist *pci_p2pmem_alloc_sgl(struct pci_dev *pdev, |
30 | unsigned int *nents, u32 length); |
31 | void pci_p2pmem_free_sgl(struct pci_dev *pdev, struct scatterlist *sgl); |
32 | void pci_p2pmem_publish(struct pci_dev *pdev, bool publish); |
33 | int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev, |
34 | bool *use_p2pdma); |
35 | ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev, |
36 | bool use_p2pdma); |
37 | #else /* CONFIG_PCI_P2PDMA */ |
38 | static inline int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, |
39 | size_t size, u64 offset) |
40 | { |
41 | return -EOPNOTSUPP; |
42 | } |
43 | static inline int pci_p2pdma_distance_many(struct pci_dev *provider, |
44 | struct device **clients, int num_clients, bool verbose) |
45 | { |
46 | return -1; |
47 | } |
48 | static inline bool pci_has_p2pmem(struct pci_dev *pdev) |
49 | { |
50 | return false; |
51 | } |
52 | static inline struct pci_dev *pci_p2pmem_find_many(struct device **clients, |
53 | int num_clients) |
54 | { |
55 | return NULL; |
56 | } |
57 | static inline void *pci_alloc_p2pmem(struct pci_dev *pdev, size_t size) |
58 | { |
59 | return NULL; |
60 | } |
61 | static inline void pci_free_p2pmem(struct pci_dev *pdev, void *addr, |
62 | size_t size) |
63 | { |
64 | } |
65 | static inline pci_bus_addr_t pci_p2pmem_virt_to_bus(struct pci_dev *pdev, |
66 | void *addr) |
67 | { |
68 | return 0; |
69 | } |
70 | static inline struct scatterlist *pci_p2pmem_alloc_sgl(struct pci_dev *pdev, |
71 | unsigned int *nents, u32 length) |
72 | { |
73 | return NULL; |
74 | } |
75 | static inline void pci_p2pmem_free_sgl(struct pci_dev *pdev, |
76 | struct scatterlist *sgl) |
77 | { |
78 | } |
79 | static inline void pci_p2pmem_publish(struct pci_dev *pdev, bool publish) |
80 | { |
81 | } |
82 | static inline int pci_p2pdma_enable_store(const char *page, |
83 | struct pci_dev **p2p_dev, bool *use_p2pdma) |
84 | { |
85 | *use_p2pdma = false; |
86 | return 0; |
87 | } |
88 | static inline ssize_t pci_p2pdma_enable_show(char *page, |
89 | struct pci_dev *p2p_dev, bool use_p2pdma) |
90 | { |
91 | return sprintf(page, "none\n" ); |
92 | } |
93 | #endif /* CONFIG_PCI_P2PDMA */ |
94 | |
95 | |
96 | static inline int pci_p2pdma_distance(struct pci_dev *provider, |
97 | struct device *client, bool verbose) |
98 | { |
99 | return pci_p2pdma_distance_many(provider, clients: &client, num_clients: 1, verbose); |
100 | } |
101 | |
102 | static inline struct pci_dev *pci_p2pmem_find(struct device *client) |
103 | { |
104 | return pci_p2pmem_find_many(clients: &client, num_clients: 1); |
105 | } |
106 | |
107 | #endif /* _LINUX_PCI_P2P_H */ |
108 | |