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