1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Common Gasket device kernel and user space declarations.
4  *
5  * Copyright (C) 2018 Google, Inc.
6  */
7 #ifndef __GASKET_H__
8 #define __GASKET_H__
9 
10 #include <linux/ioctl.h>
11 #include <linux/types.h>
12 
13 /* ioctl structure declarations */
14 
15 /* Ioctl structures are padded to a multiple of 64 bits */
16 /* and padded to put 64 bit values on 64 bit boundaries. */
17 /* Unsigned 64 bit integers are used to hold pointers. */
18 /* This helps compatibility between 32 and 64 bits. */
19 
20 /*
21  * Common structure for ioctls associating an eventfd with a device interrupt,
22  * when using the Gasket interrupt module.
23  */
24 struct gasket_interrupt_eventfd {
25 	u64 interrupt;
26 	u64 event_fd;
27 };
28 
29 /*
30  * Common structure for ioctls mapping and unmapping buffers when using the
31  * Gasket page_table module.
32  */
33 struct gasket_page_table_ioctl {
34 	u64 page_table_index;
35 	u64 size;
36 	u64 host_address;
37 	u64 device_address;
38 };
39 
40 /*
41  * Common structure for ioctls mapping and unmapping buffers when using the
42  * Gasket page_table module.
43  * dma_address: phys addr start of coherent memory, allocated by kernel
44  */
45 struct gasket_coherent_alloc_config_ioctl {
46 	u64 page_table_index;
47 	u64 enable;
48 	u64 size;
49 	u64 dma_address;
50 };
51 
52 /* Base number for all Gasket-common IOCTLs */
53 #define GASKET_IOCTL_BASE 0xDC
54 
55 /* Reset the device. */
56 #define GASKET_IOCTL_RESET _IO(GASKET_IOCTL_BASE, 0)
57 
58 /* Associate the specified [event]fd with the specified interrupt. */
59 #define GASKET_IOCTL_SET_EVENTFD                                               \
60 	_IOW(GASKET_IOCTL_BASE, 1, struct gasket_interrupt_eventfd)
61 
62 /*
63  * Clears any eventfd associated with the specified interrupt. The (ulong)
64  * argument is the interrupt number to clear.
65  */
66 #define GASKET_IOCTL_CLEAR_EVENTFD _IOW(GASKET_IOCTL_BASE, 2, unsigned long)
67 
68 /*
69  * [Loopbacks only] Requests that the loopback device send the specified
70  * interrupt to the host. The (ulong) argument is the number of the interrupt to
71  * send.
72  */
73 #define GASKET_IOCTL_LOOPBACK_INTERRUPT                                        \
74 	_IOW(GASKET_IOCTL_BASE, 3, unsigned long)
75 
76 /* Queries the kernel for the number of page tables supported by the device. */
77 #define GASKET_IOCTL_NUMBER_PAGE_TABLES _IOR(GASKET_IOCTL_BASE, 4, u64)
78 
79 /*
80  * Queries the kernel for the maximum size of the page table.  Only the size and
81  * page_table_index fields are used from the struct gasket_page_table_ioctl.
82  */
83 #define GASKET_IOCTL_PAGE_TABLE_SIZE                                           \
84 	_IOWR(GASKET_IOCTL_BASE, 5, struct gasket_page_table_ioctl)
85 
86 /*
87  * Queries the kernel for the current simple page table size.  Only the size and
88  * page_table_index fields are used from the struct gasket_page_table_ioctl.
89  */
90 #define GASKET_IOCTL_SIMPLE_PAGE_TABLE_SIZE                                    \
91 	_IOWR(GASKET_IOCTL_BASE, 6, struct gasket_page_table_ioctl)
92 
93 /*
94  * Tells the kernel to change the split between the number of simple and
95  * extended entries in the given page table. Only the size and page_table_index
96  * fields are used from the struct gasket_page_table_ioctl.
97  */
98 #define GASKET_IOCTL_PARTITION_PAGE_TABLE                                      \
99 	_IOW(GASKET_IOCTL_BASE, 7, struct gasket_page_table_ioctl)
100 
101 /*
102  * Tells the kernel to map size bytes at host_address to device_address in
103  * page_table_index page table.
104  */
105 #define GASKET_IOCTL_MAP_BUFFER                                                \
106 	_IOW(GASKET_IOCTL_BASE, 8, struct gasket_page_table_ioctl)
107 
108 /*
109  * Tells the kernel to unmap size bytes at host_address from device_address in
110  * page_table_index page table.
111  */
112 #define GASKET_IOCTL_UNMAP_BUFFER                                              \
113 	_IOW(GASKET_IOCTL_BASE, 9, struct gasket_page_table_ioctl)
114 
115 /* Clear the interrupt counts stored for this device. */
116 #define GASKET_IOCTL_CLEAR_INTERRUPT_COUNTS _IO(GASKET_IOCTL_BASE, 10)
117 
118 /* Enable/Disable and configure the coherent allocator. */
119 #define GASKET_IOCTL_CONFIG_COHERENT_ALLOCATOR                                 \
120 	_IOWR(GASKET_IOCTL_BASE, 11, struct gasket_coherent_alloc_config_ioctl)
121 
122 #endif /* __GASKET_H__ */
123