1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 1999-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: MIT
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 
25 /*
26  * Os interface definitions needed by os-interface.c
27  */
28 
29 #ifndef OS_INTERFACE_H
30 #define OS_INTERFACE_H
31 
32 /******************* Operating System Interface Routines *******************\
33 *                                                                           *
34 *       Operating system wrapper functions used to abstract the OS.         *
35 *                                                                           *
36 \***************************************************************************/
37 
38 #include <nvtypes.h>
39 #include <nvstatus.h>
40 #include "nv_stdarg.h"
41 #include <nv-kernel-interface-api.h>
42 #include <os/nv_memory_type.h>
43 #include <nv-caps.h>
44 
45 
46 
47 typedef struct
48 {
49     NvU32  os_major_version;
50     NvU32  os_minor_version;
51     NvU32  os_build_number;
52     const char * os_build_version_str;
53     const char * os_build_date_plus_str;
54 }os_version_info;
55 
56 /* Each OS defines its own version of this opaque type */
57 struct os_work_queue;
58 
59 /* Each OS defines its own version of this opaque type */
60 typedef struct os_wait_queue os_wait_queue;
61 
62 /*
63  * ---------------------------------------------------------------------------
64  *
65  * Function prototypes for OS interface.
66  *
67  * ---------------------------------------------------------------------------
68  */
69 
70 NvU64       NV_API_CALL  os_get_num_phys_pages       (void);
71 NV_STATUS   NV_API_CALL  os_alloc_mem                (void **, NvU64);
72 void        NV_API_CALL  os_free_mem                 (void *);
73 NV_STATUS   NV_API_CALL  os_get_current_time         (NvU32 *, NvU32 *);
74 NvU64       NV_API_CALL  os_get_current_tick         (void);
75 NvU64       NV_API_CALL  os_get_current_tick_hr      (void);
76 NvU64       NV_API_CALL  os_get_tick_resolution      (void);
77 NV_STATUS   NV_API_CALL  os_delay                    (NvU32);
78 NV_STATUS   NV_API_CALL  os_delay_us                 (NvU32);
79 NvU64       NV_API_CALL  os_get_cpu_frequency        (void);
80 NvU32       NV_API_CALL  os_get_current_process      (void);
81 void        NV_API_CALL  os_get_current_process_name (char *, NvU32);
82 NV_STATUS   NV_API_CALL  os_get_current_thread       (NvU64 *);
83 char*       NV_API_CALL  os_string_copy              (char *, const char *);
84 NvU32       NV_API_CALL  os_string_length            (const char *);
85 NvU32       NV_API_CALL  os_strtoul                  (const char *, char **, NvU32);
86 NvS32       NV_API_CALL  os_string_compare           (const char *, const char *);
87 NvS32       NV_API_CALL  os_snprintf                 (char *, NvU32, const char *, ...);
88 NvS32       NV_API_CALL  os_vsnprintf                (char *, NvU32, const char *, va_list);
89 void        NV_API_CALL  os_log_error                (const char *, va_list);
90 void*       NV_API_CALL  os_mem_copy                 (void *, const void *, NvU32);
91 NV_STATUS   NV_API_CALL  os_memcpy_from_user         (void *, const void *, NvU32);
92 NV_STATUS   NV_API_CALL  os_memcpy_to_user           (void *, const void *, NvU32);
93 void*       NV_API_CALL  os_mem_set                  (void *, NvU8, NvU32);
94 NvS32       NV_API_CALL  os_mem_cmp                  (const NvU8 *, const NvU8 *, NvU32);
95 void*       NV_API_CALL  os_pci_init_handle          (NvU32, NvU8, NvU8, NvU8, NvU16 *, NvU16 *);
96 NV_STATUS   NV_API_CALL  os_pci_read_byte            (void *, NvU32, NvU8 *);
97 NV_STATUS   NV_API_CALL  os_pci_read_word            (void *, NvU32, NvU16 *);
98 NV_STATUS   NV_API_CALL  os_pci_read_dword           (void *, NvU32, NvU32 *);
99 NV_STATUS   NV_API_CALL  os_pci_write_byte           (void *, NvU32, NvU8);
100 NV_STATUS   NV_API_CALL  os_pci_write_word           (void *, NvU32, NvU16);
101 NV_STATUS   NV_API_CALL  os_pci_write_dword          (void *, NvU32, NvU32);
102 NvBool      NV_API_CALL  os_pci_remove_supported     (void);
103 void        NV_API_CALL  os_pci_remove               (void *);
104 void*       NV_API_CALL  os_map_kernel_space         (NvU64, NvU64, NvU32);
105 void        NV_API_CALL  os_unmap_kernel_space       (void *, NvU64);
106 void*       NV_API_CALL  os_map_user_space           (NvU64, NvU64, NvU32, NvU32, void **);
107 void        NV_API_CALL  os_unmap_user_space         (void *, NvU64, void *);
108 NV_STATUS   NV_API_CALL  os_flush_cpu_cache          (void);
109 NV_STATUS   NV_API_CALL  os_flush_cpu_cache_all      (void);
110 NV_STATUS   NV_API_CALL  os_flush_user_cache         (void);
111 void        NV_API_CALL  os_flush_cpu_write_combine_buffer(void);
112 NvU8        NV_API_CALL  os_io_read_byte             (NvU32);
113 NvU16       NV_API_CALL  os_io_read_word             (NvU32);
114 NvU32       NV_API_CALL  os_io_read_dword            (NvU32);
115 void        NV_API_CALL  os_io_write_byte            (NvU32, NvU8);
116 void        NV_API_CALL  os_io_write_word            (NvU32, NvU16);
117 void        NV_API_CALL  os_io_write_dword           (NvU32, NvU32);
118 NvBool      NV_API_CALL  os_is_administrator         (void);
119 NvBool      NV_API_CALL  os_allow_priority_override  (void);
120 void        NV_API_CALL  os_dbg_init                 (void);
121 void        NV_API_CALL  os_dbg_breakpoint           (void);
122 void        NV_API_CALL  os_dbg_set_level            (NvU32);
123 NvU32       NV_API_CALL  os_get_cpu_count            (void);
124 NvU32       NV_API_CALL  os_get_cpu_number           (void);
125 void        NV_API_CALL  os_disable_console_access   (void);
126 void        NV_API_CALL  os_enable_console_access    (void);
127 NV_STATUS   NV_API_CALL  os_registry_init            (void);
128 NvU64       NV_API_CALL  os_get_max_user_va          (void);
129 NV_STATUS   NV_API_CALL  os_schedule                 (void);
130 NV_STATUS   NV_API_CALL  os_alloc_spinlock           (void **);
131 void        NV_API_CALL  os_free_spinlock            (void *);
132 NvU64       NV_API_CALL  os_acquire_spinlock         (void *);
133 void        NV_API_CALL  os_release_spinlock         (void *, NvU64);
134 NV_STATUS   NV_API_CALL  os_queue_work_item          (struct os_work_queue *, void *);
135 NV_STATUS   NV_API_CALL  os_flush_work_queue         (struct os_work_queue *);
136 NV_STATUS   NV_API_CALL  os_alloc_mutex              (void **);
137 void        NV_API_CALL  os_free_mutex               (void *);
138 NV_STATUS   NV_API_CALL  os_acquire_mutex            (void *);
139 NV_STATUS   NV_API_CALL  os_cond_acquire_mutex       (void *);
140 void        NV_API_CALL  os_release_mutex            (void *);
141 void*       NV_API_CALL  os_alloc_semaphore          (NvU32);
142 void        NV_API_CALL  os_free_semaphore           (void *);
143 NV_STATUS   NV_API_CALL  os_acquire_semaphore        (void *);
144 NV_STATUS   NV_API_CALL  os_cond_acquire_semaphore   (void *);
145 NV_STATUS   NV_API_CALL  os_release_semaphore        (void *);
146 void*       NV_API_CALL  os_alloc_rwlock             (void);
147 void        NV_API_CALL  os_free_rwlock              (void *);
148 NV_STATUS   NV_API_CALL  os_acquire_rwlock_read      (void *);
149 NV_STATUS   NV_API_CALL  os_acquire_rwlock_write     (void *);
150 NV_STATUS   NV_API_CALL  os_cond_acquire_rwlock_read (void *);
151 NV_STATUS   NV_API_CALL  os_cond_acquire_rwlock_write(void *);
152 void        NV_API_CALL  os_release_rwlock_read      (void *);
153 void        NV_API_CALL  os_release_rwlock_write     (void *);
154 NvBool      NV_API_CALL  os_semaphore_may_sleep      (void);
155 NV_STATUS   NV_API_CALL  os_get_version_info         (os_version_info*);
156 NvBool      NV_API_CALL  os_is_isr                   (void);
157 NvBool      NV_API_CALL  os_pat_supported            (void);
158 void        NV_API_CALL  os_dump_stack               (void);
159 NvBool      NV_API_CALL  os_is_efi_enabled           (void);
160 NvBool      NV_API_CALL  os_is_xen_dom0              (void);
161 NvBool      NV_API_CALL  os_is_vgx_hyper             (void);
162 NV_STATUS   NV_API_CALL  os_inject_vgx_msi           (NvU16, NvU64, NvU32);
163 NvBool      NV_API_CALL  os_is_grid_supported        (void);
164 NvU32       NV_API_CALL  os_get_grid_csp_support     (void);
165 void        NV_API_CALL  os_get_screen_info          (NvU64 *, NvU16 *, NvU16 *, NvU16 *, NvU16 *, NvU64, NvU64);
166 void        NV_API_CALL  os_bug_check                (NvU32, const char *);
167 NV_STATUS   NV_API_CALL  os_lock_user_pages          (void *, NvU64, void **, NvU32);
168 NV_STATUS   NV_API_CALL  os_lookup_user_io_memory    (void *, NvU64, NvU64 **, void**);
169 NV_STATUS   NV_API_CALL  os_unlock_user_pages        (NvU64, void *);
170 NV_STATUS   NV_API_CALL  os_match_mmap_offset        (void *, NvU64, NvU64 *);
171 NV_STATUS   NV_API_CALL  os_get_euid                 (NvU32 *);
172 NV_STATUS   NV_API_CALL  os_get_smbios_header        (NvU64 *pSmbsAddr);
173 NV_STATUS   NV_API_CALL  os_get_acpi_rsdp_from_uefi  (NvU32 *);
174 void        NV_API_CALL  os_add_record_for_crashLog  (void *, NvU32);
175 void        NV_API_CALL  os_delete_record_for_crashLog (void *);
176 NV_STATUS   NV_API_CALL  os_call_vgpu_vfio           (void *, NvU32);
177 NV_STATUS   NV_API_CALL  os_numa_memblock_size       (NvU64 *);
178 NV_STATUS   NV_API_CALL  os_alloc_pages_node         (NvS32, NvU32, NvU32, NvU64 *);
179 NV_STATUS   NV_API_CALL  os_get_page                 (NvU64 address);
180 NV_STATUS   NV_API_CALL  os_put_page                 (NvU64 address);
181 NvU32       NV_API_CALL  os_get_page_refcount        (NvU64 address);
182 NvU32       NV_API_CALL  os_count_tail_pages         (NvU64 address);
183 void        NV_API_CALL  os_free_pages_phys          (NvU64, NvU32);
184 NV_STATUS   NV_API_CALL  os_open_temporary_file      (void **);
185 void        NV_API_CALL  os_close_file               (void *);
186 NV_STATUS   NV_API_CALL  os_write_file               (void *, NvU8 *, NvU64, NvU64);
187 NV_STATUS   NV_API_CALL  os_read_file                (void *, NvU8 *, NvU64, NvU64);
188 NV_STATUS   NV_API_CALL  os_open_readonly_file       (const char *, void **);
189 NV_STATUS   NV_API_CALL  os_open_and_read_file       (const char *, NvU8 *, NvU64);
190 NvBool      NV_API_CALL  os_is_nvswitch_present      (void);
191 NV_STATUS   NV_API_CALL  os_get_random_bytes         (NvU8 *, NvU16);
192 NV_STATUS   NV_API_CALL  os_alloc_wait_queue         (os_wait_queue **);
193 void        NV_API_CALL  os_free_wait_queue          (os_wait_queue *);
194 void        NV_API_CALL  os_wait_uninterruptible     (os_wait_queue *);
195 void        NV_API_CALL  os_wait_interruptible       (os_wait_queue *);
196 void        NV_API_CALL  os_wake_up                  (os_wait_queue *);
197 nv_cap_t*   NV_API_CALL  os_nv_cap_init               (const char *);
198 nv_cap_t*   NV_API_CALL  os_nv_cap_create_dir_entry   (nv_cap_t *, const char *, int);
199 nv_cap_t*   NV_API_CALL  os_nv_cap_create_file_entry  (nv_cap_t *, const char *, int);
200 void        NV_API_CALL  os_nv_cap_destroy_entry      (nv_cap_t *);
201 int         NV_API_CALL  os_nv_cap_validate_and_dup_fd(const nv_cap_t *, int);
202 void        NV_API_CALL  os_nv_cap_close_fd           (int);
203 
204 enum os_pci_req_atomics_type {
205     OS_INTF_PCIE_REQ_ATOMICS_32BIT,
206     OS_INTF_PCIE_REQ_ATOMICS_64BIT,
207     OS_INTF_PCIE_REQ_ATOMICS_128BIT
208 };
209 NV_STATUS   NV_API_CALL  os_enable_pci_req_atomics   (void *, enum os_pci_req_atomics_type);
210 NV_STATUS   NV_API_CALL  os_numa_add_gpu_memory      (void *, NvU64, NvU64, NvU32 *);
211 NV_STATUS   NV_API_CALL  os_numa_remove_gpu_memory   (void *, NvU64, NvU64, NvU32);
212 NV_STATUS   NV_API_CALL  os_offline_page_at_address(NvU64 address);
213 
214 extern NvU32 os_page_size;
215 extern NvU64 os_page_mask;
216 extern NvU8  os_page_shift;
217 extern NvU32 os_sev_status;
218 extern NvBool os_sev_enabled;
219 extern NvBool os_dma_buf_enabled;
220 
221 /*
222  * ---------------------------------------------------------------------------
223  *
224  * Debug macros.
225  *
226  * ---------------------------------------------------------------------------
227  */
228 
229 #define NV_DBG_INFO       0x0
230 #define NV_DBG_SETUP      0x1
231 #define NV_DBG_USERERRORS 0x2
232 #define NV_DBG_WARNINGS   0x3
233 #define NV_DBG_ERRORS     0x4
234 
235 
236 void NV_API_CALL  out_string(const char *str);
237 int  NV_API_CALL  nv_printf(NvU32 debuglevel, const char *printf_format, ...);
238 
239 #define NV_DEV_PRINTF(debuglevel, nv, format, ... ) \
240         nv_printf(debuglevel, "NVRM: GPU " NV_PCI_DEV_FMT ": " format, NV_PCI_DEV_FMT_ARGS(nv), ## __VA_ARGS__)
241 
242 #define NV_DEV_PRINTF_STATUS(debuglevel, nv, status, format, ... ) \
243         nv_printf(debuglevel, "NVRM: GPU " NV_PCI_DEV_FMT ": " format " (0x%x)\n", NV_PCI_DEV_FMT_ARGS(nv), ## __VA_ARGS__, status)
244 
245 /*
246  * Fields for os_lock_user_pages flags parameter
247  */
248 #define NV_LOCK_USER_PAGES_FLAGS_WRITE                     0:0
249 #define NV_LOCK_USER_PAGES_FLAGS_WRITE_NO                  0x00000000
250 #define NV_LOCK_USER_PAGES_FLAGS_WRITE_YES                 0x00000001
251 
252 #endif /* OS_INTERFACE_H */
253