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