amdgpu.h revision 6532f28e
1/* 2 * Copyright 2014 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 */ 23 24/** 25 * \file amdgpu.h 26 * 27 * Declare public libdrm_amdgpu API 28 * 29 * This file define API exposed by libdrm_amdgpu library. 30 * User wanted to use libdrm_amdgpu functionality must include 31 * this file. 32 * 33 */ 34#ifndef _AMDGPU_H_ 35#define _AMDGPU_H_ 36 37#include <stdint.h> 38#include <stdbool.h> 39 40#ifdef __cplusplus 41extern "C" { 42#endif 43 44struct drm_amdgpu_info_hw_ip; 45struct drm_amdgpu_bo_list_entry; 46 47/*--------------------------------------------------------------------------*/ 48/* --------------------------- Defines ------------------------------------ */ 49/*--------------------------------------------------------------------------*/ 50 51/** 52 * Define max. number of Command Buffers (IB) which could be sent to the single 53 * hardware IP to accommodate CE/DE requirements 54 * 55 * \sa amdgpu_cs_ib_info 56*/ 57#define AMDGPU_CS_MAX_IBS_PER_SUBMIT 4 58 59/** 60 * Special timeout value meaning that the timeout is infinite. 61 */ 62#define AMDGPU_TIMEOUT_INFINITE 0xffffffffffffffffull 63 64/** 65 * Used in amdgpu_cs_query_fence_status(), meaning that the given timeout 66 * is absolute. 67 */ 68#define AMDGPU_QUERY_FENCE_TIMEOUT_IS_ABSOLUTE (1 << 0) 69 70/*--------------------------------------------------------------------------*/ 71/* ----------------------------- Enums ------------------------------------ */ 72/*--------------------------------------------------------------------------*/ 73 74/** 75 * Enum describing possible handle types 76 * 77 * \sa amdgpu_bo_import, amdgpu_bo_export 78 * 79*/ 80enum amdgpu_bo_handle_type { 81 /** GEM flink name (needs DRM authentication, used by DRI2) */ 82 amdgpu_bo_handle_type_gem_flink_name = 0, 83 84 /** KMS handle which is used by all driver ioctls */ 85 amdgpu_bo_handle_type_kms = 1, 86 87 /** DMA-buf fd handle */ 88 amdgpu_bo_handle_type_dma_buf_fd = 2, 89 90 /** KMS handle, but re-importing as a DMABUF handle through 91 * drmPrimeHandleToFD is forbidden. (Glamor does that) 92 */ 93 amdgpu_bo_handle_type_kms_noimport = 3, 94}; 95 96/** Define known types of GPU VM VA ranges */ 97enum amdgpu_gpu_va_range 98{ 99 /** Allocate from "normal"/general range */ 100 amdgpu_gpu_va_range_general = 0 101}; 102 103enum amdgpu_sw_info { 104 amdgpu_sw_info_address32_hi = 0, 105}; 106 107/*--------------------------------------------------------------------------*/ 108/* -------------------------- Datatypes ----------------------------------- */ 109/*--------------------------------------------------------------------------*/ 110 111/** 112 * Define opaque pointer to context associated with fd. 113 * This context will be returned as the result of 114 * "initialize" function and should be pass as the first 115 * parameter to any API call 116 */ 117typedef struct amdgpu_device *amdgpu_device_handle; 118 119/** 120 * Define GPU Context type as pointer to opaque structure 121 * Example of GPU Context is the "rendering" context associated 122 * with OpenGL context (glCreateContext) 123 */ 124typedef struct amdgpu_context *amdgpu_context_handle; 125 126/** 127 * Define handle for amdgpu resources: buffer, GDS, etc. 128 */ 129typedef struct amdgpu_bo *amdgpu_bo_handle; 130 131/** 132 * Define handle for list of BOs 133 */ 134typedef struct amdgpu_bo_list *amdgpu_bo_list_handle; 135 136/** 137 * Define handle to be used to work with VA allocated ranges 138 */ 139typedef struct amdgpu_va *amdgpu_va_handle; 140 141/** 142 * Define handle for semaphore 143 */ 144typedef struct amdgpu_semaphore *amdgpu_semaphore_handle; 145 146/*--------------------------------------------------------------------------*/ 147/* -------------------------- Structures ---------------------------------- */ 148/*--------------------------------------------------------------------------*/ 149 150/** 151 * Structure describing memory allocation request 152 * 153 * \sa amdgpu_bo_alloc() 154 * 155*/ 156struct amdgpu_bo_alloc_request { 157 /** Allocation request. It must be aligned correctly. */ 158 uint64_t alloc_size; 159 160 /** 161 * It may be required to have some specific alignment requirements 162 * for physical back-up storage (e.g. for displayable surface). 163 * If 0 there is no special alignment requirement 164 */ 165 uint64_t phys_alignment; 166 167 /** 168 * UMD should specify where to allocate memory and how it 169 * will be accessed by the CPU. 170 */ 171 uint32_t preferred_heap; 172 173 /** Additional flags passed on allocation */ 174 uint64_t flags; 175}; 176 177/** 178 * Special UMD specific information associated with buffer. 179 * 180 * It may be need to pass some buffer charactersitic as part 181 * of buffer sharing. Such information are defined UMD and 182 * opaque for libdrm_amdgpu as well for kernel driver. 183 * 184 * \sa amdgpu_bo_set_metadata(), amdgpu_bo_query_info, 185 * amdgpu_bo_import(), amdgpu_bo_export 186 * 187*/ 188struct amdgpu_bo_metadata { 189 /** Special flag associated with surface */ 190 uint64_t flags; 191 192 /** 193 * ASIC-specific tiling information (also used by DCE). 194 * The encoding is defined by the AMDGPU_TILING_* definitions. 195 */ 196 uint64_t tiling_info; 197 198 /** Size of metadata associated with the buffer, in bytes. */ 199 uint32_t size_metadata; 200 201 /** UMD specific metadata. Opaque for kernel */ 202 uint32_t umd_metadata[64]; 203}; 204 205/** 206 * Structure describing allocated buffer. Client may need 207 * to query such information as part of 'sharing' buffers mechanism 208 * 209 * \sa amdgpu_bo_set_metadata(), amdgpu_bo_query_info(), 210 * amdgpu_bo_import(), amdgpu_bo_export() 211*/ 212struct amdgpu_bo_info { 213 /** Allocated memory size */ 214 uint64_t alloc_size; 215 216 /** 217 * It may be required to have some specific alignment requirements 218 * for physical back-up storage. 219 */ 220 uint64_t phys_alignment; 221 222 /** Heap where to allocate memory. */ 223 uint32_t preferred_heap; 224 225 /** Additional allocation flags. */ 226 uint64_t alloc_flags; 227 228 /** Metadata associated with buffer if any. */ 229 struct amdgpu_bo_metadata metadata; 230}; 231 232/** 233 * Structure with information about "imported" buffer 234 * 235 * \sa amdgpu_bo_import() 236 * 237 */ 238struct amdgpu_bo_import_result { 239 /** Handle of memory/buffer to use */ 240 amdgpu_bo_handle buf_handle; 241 242 /** Buffer size */ 243 uint64_t alloc_size; 244}; 245 246/** 247 * 248 * Structure to describe GDS partitioning information. 249 * \note OA and GWS resources are asscoiated with GDS partition 250 * 251 * \sa amdgpu_gpu_resource_query_gds_info 252 * 253*/ 254struct amdgpu_gds_resource_info { 255 uint32_t gds_gfx_partition_size; 256 uint32_t compute_partition_size; 257 uint32_t gds_total_size; 258 uint32_t gws_per_gfx_partition; 259 uint32_t gws_per_compute_partition; 260 uint32_t oa_per_gfx_partition; 261 uint32_t oa_per_compute_partition; 262}; 263 264/** 265 * Structure describing CS fence 266 * 267 * \sa amdgpu_cs_query_fence_status(), amdgpu_cs_request, amdgpu_cs_submit() 268 * 269*/ 270struct amdgpu_cs_fence { 271 272 /** In which context IB was sent to execution */ 273 amdgpu_context_handle context; 274 275 /** To which HW IP type the fence belongs */ 276 uint32_t ip_type; 277 278 /** IP instance index if there are several IPs of the same type. */ 279 uint32_t ip_instance; 280 281 /** Ring index of the HW IP */ 282 uint32_t ring; 283 284 /** Specify fence for which we need to check submission status.*/ 285 uint64_t fence; 286}; 287 288/** 289 * Structure describing IB 290 * 291 * \sa amdgpu_cs_request, amdgpu_cs_submit() 292 * 293*/ 294struct amdgpu_cs_ib_info { 295 /** Special flags */ 296 uint64_t flags; 297 298 /** Virtual MC address of the command buffer */ 299 uint64_t ib_mc_address; 300 301 /** 302 * Size of Command Buffer to be submitted. 303 * - The size is in units of dwords (4 bytes). 304 * - Could be 0 305 */ 306 uint32_t size; 307}; 308 309/** 310 * Structure describing fence information 311 * 312 * \sa amdgpu_cs_request, amdgpu_cs_query_fence, 313 * amdgpu_cs_submit(), amdgpu_cs_query_fence_status() 314*/ 315struct amdgpu_cs_fence_info { 316 /** buffer object for the fence */ 317 amdgpu_bo_handle handle; 318 319 /** fence offset in the unit of sizeof(uint64_t) */ 320 uint64_t offset; 321}; 322 323/** 324 * Structure describing submission request 325 * 326 * \note We could have several IBs as packet. e.g. CE, CE, DE case for gfx 327 * 328 * \sa amdgpu_cs_submit() 329*/ 330struct amdgpu_cs_request { 331 /** Specify flags with additional information */ 332 uint64_t flags; 333 334 /** Specify HW IP block type to which to send the IB. */ 335 unsigned ip_type; 336 337 /** IP instance index if there are several IPs of the same type. */ 338 unsigned ip_instance; 339 340 /** 341 * Specify ring index of the IP. We could have several rings 342 * in the same IP. E.g. 0 for SDMA0 and 1 for SDMA1. 343 */ 344 uint32_t ring; 345 346 /** 347 * List handle with resources used by this request. 348 */ 349 amdgpu_bo_list_handle resources; 350 351 /** 352 * Number of dependencies this Command submission needs to 353 * wait for before starting execution. 354 */ 355 uint32_t number_of_dependencies; 356 357 /** 358 * Array of dependencies which need to be met before 359 * execution can start. 360 */ 361 struct amdgpu_cs_fence *dependencies; 362 363 /** Number of IBs to submit in the field ibs. */ 364 uint32_t number_of_ibs; 365 366 /** 367 * IBs to submit. Those IBs will be submit together as single entity 368 */ 369 struct amdgpu_cs_ib_info *ibs; 370 371 /** 372 * The returned sequence number for the command submission 373 */ 374 uint64_t seq_no; 375 376 /** 377 * The fence information 378 */ 379 struct amdgpu_cs_fence_info fence_info; 380}; 381 382/** 383 * Structure which provide information about GPU VM MC Address space 384 * alignments requirements 385 * 386 * \sa amdgpu_query_buffer_size_alignment 387 */ 388struct amdgpu_buffer_size_alignments { 389 /** Size alignment requirement for allocation in 390 * local memory */ 391 uint64_t size_local; 392 393 /** 394 * Size alignment requirement for allocation in remote memory 395 */ 396 uint64_t size_remote; 397}; 398 399/** 400 * Structure which provide information about heap 401 * 402 * \sa amdgpu_query_heap_info() 403 * 404 */ 405struct amdgpu_heap_info { 406 /** Theoretical max. available memory in the given heap */ 407 uint64_t heap_size; 408 409 /** 410 * Number of bytes allocated in the heap. This includes all processes 411 * and private allocations in the kernel. It changes when new buffers 412 * are allocated, freed, and moved. It cannot be larger than 413 * heap_size. 414 */ 415 uint64_t heap_usage; 416 417 /** 418 * Theoretical possible max. size of buffer which 419 * could be allocated in the given heap 420 */ 421 uint64_t max_allocation; 422}; 423 424/** 425 * Describe GPU h/w info needed for UMD correct initialization 426 * 427 * \sa amdgpu_query_gpu_info() 428*/ 429struct amdgpu_gpu_info { 430 /** Asic id */ 431 uint32_t asic_id; 432 /** Chip revision */ 433 uint32_t chip_rev; 434 /** Chip external revision */ 435 uint32_t chip_external_rev; 436 /** Family ID */ 437 uint32_t family_id; 438 /** Special flags */ 439 uint64_t ids_flags; 440 /** max engine clock*/ 441 uint64_t max_engine_clk; 442 /** max memory clock */ 443 uint64_t max_memory_clk; 444 /** number of shader engines */ 445 uint32_t num_shader_engines; 446 /** number of shader arrays per engine */ 447 uint32_t num_shader_arrays_per_engine; 448 /** Number of available good shader pipes */ 449 uint32_t avail_quad_shader_pipes; 450 /** Max. number of shader pipes.(including good and bad pipes */ 451 uint32_t max_quad_shader_pipes; 452 /** Number of parameter cache entries per shader quad pipe */ 453 uint32_t cache_entries_per_quad_pipe; 454 /** Number of available graphics context */ 455 uint32_t num_hw_gfx_contexts; 456 /** Number of render backend pipes */ 457 uint32_t rb_pipes; 458 /** Enabled render backend pipe mask */ 459 uint32_t enabled_rb_pipes_mask; 460 /** Frequency of GPU Counter */ 461 uint32_t gpu_counter_freq; 462 /** CC_RB_BACKEND_DISABLE.BACKEND_DISABLE per SE */ 463 uint32_t backend_disable[4]; 464 /** Value of MC_ARB_RAMCFG register*/ 465 uint32_t mc_arb_ramcfg; 466 /** Value of GB_ADDR_CONFIG */ 467 uint32_t gb_addr_cfg; 468 /** Values of the GB_TILE_MODE0..31 registers */ 469 uint32_t gb_tile_mode[32]; 470 /** Values of GB_MACROTILE_MODE0..15 registers */ 471 uint32_t gb_macro_tile_mode[16]; 472 /** Value of PA_SC_RASTER_CONFIG register per SE */ 473 uint32_t pa_sc_raster_cfg[4]; 474 /** Value of PA_SC_RASTER_CONFIG_1 register per SE */ 475 uint32_t pa_sc_raster_cfg1[4]; 476 /* CU info */ 477 uint32_t cu_active_number; 478 uint32_t cu_ao_mask; 479 uint32_t cu_bitmap[4][4]; 480 /* video memory type info*/ 481 uint32_t vram_type; 482 /* video memory bit width*/ 483 uint32_t vram_bit_width; 484 /** constant engine ram size*/ 485 uint32_t ce_ram_size; 486 /* vce harvesting instance */ 487 uint32_t vce_harvest_config; 488 /* PCI revision ID */ 489 uint32_t pci_rev_id; 490}; 491 492 493/*--------------------------------------------------------------------------*/ 494/*------------------------- Functions --------------------------------------*/ 495/*--------------------------------------------------------------------------*/ 496 497/* 498 * Initialization / Cleanup 499 * 500*/ 501 502/** 503 * 504 * \param fd - \c [in] File descriptor for AMD GPU device 505 * received previously as the result of 506 * e.g. drmOpen() call. 507 * For legacy fd type, the DRI2/DRI3 508 * authentication should be done before 509 * calling this function. 510 * \param major_version - \c [out] Major version of library. It is assumed 511 * that adding new functionality will cause 512 * increase in major version 513 * \param minor_version - \c [out] Minor version of library 514 * \param device_handle - \c [out] Pointer to opaque context which should 515 * be passed as the first parameter on each 516 * API call 517 * 518 * 519 * \return 0 on success\n 520 * <0 - Negative POSIX Error code 521 * 522 * 523 * \sa amdgpu_device_deinitialize() 524*/ 525int amdgpu_device_initialize(int fd, 526 uint32_t *major_version, 527 uint32_t *minor_version, 528 amdgpu_device_handle *device_handle); 529 530/** 531 * 532 * When access to such library does not needed any more the special 533 * function must be call giving opportunity to clean up any 534 * resources if needed. 535 * 536 * \param device_handle - \c [in] Context associated with file 537 * descriptor for AMD GPU device 538 * received previously as the 539 * result e.g. of drmOpen() call. 540 * 541 * \return 0 on success\n 542 * <0 - Negative POSIX Error code 543 * 544 * \sa amdgpu_device_initialize() 545 * 546*/ 547int amdgpu_device_deinitialize(amdgpu_device_handle device_handle); 548 549/* 550 * Memory Management 551 * 552*/ 553 554/** 555 * Allocate memory to be used by UMD for GPU related operations 556 * 557 * \param dev - \c [in] Device handle. 558 * See #amdgpu_device_initialize() 559 * \param alloc_buffer - \c [in] Pointer to the structure describing an 560 * allocation request 561 * \param buf_handle - \c [out] Allocated buffer handle 562 * 563 * \return 0 on success\n 564 * <0 - Negative POSIX Error code 565 * 566 * \sa amdgpu_bo_free() 567*/ 568int amdgpu_bo_alloc(amdgpu_device_handle dev, 569 struct amdgpu_bo_alloc_request *alloc_buffer, 570 amdgpu_bo_handle *buf_handle); 571 572/** 573 * Associate opaque data with buffer to be queried by another UMD 574 * 575 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 576 * \param buf_handle - \c [in] Buffer handle 577 * \param info - \c [in] Metadata to associated with buffer 578 * 579 * \return 0 on success\n 580 * <0 - Negative POSIX Error code 581*/ 582int amdgpu_bo_set_metadata(amdgpu_bo_handle buf_handle, 583 struct amdgpu_bo_metadata *info); 584 585/** 586 * Query buffer information including metadata previusly associated with 587 * buffer. 588 * 589 * \param dev - \c [in] Device handle. 590 * See #amdgpu_device_initialize() 591 * \param buf_handle - \c [in] Buffer handle 592 * \param info - \c [out] Structure describing buffer 593 * 594 * \return 0 on success\n 595 * <0 - Negative POSIX Error code 596 * 597 * \sa amdgpu_bo_set_metadata(), amdgpu_bo_alloc() 598*/ 599int amdgpu_bo_query_info(amdgpu_bo_handle buf_handle, 600 struct amdgpu_bo_info *info); 601 602/** 603 * Allow others to get access to buffer 604 * 605 * \param dev - \c [in] Device handle. 606 * See #amdgpu_device_initialize() 607 * \param buf_handle - \c [in] Buffer handle 608 * \param type - \c [in] Type of handle requested 609 * \param shared_handle - \c [out] Special "shared" handle 610 * 611 * \return 0 on success\n 612 * <0 - Negative POSIX Error code 613 * 614 * \sa amdgpu_bo_import() 615 * 616*/ 617int amdgpu_bo_export(amdgpu_bo_handle buf_handle, 618 enum amdgpu_bo_handle_type type, 619 uint32_t *shared_handle); 620 621/** 622 * Request access to "shared" buffer 623 * 624 * \param dev - \c [in] Device handle. 625 * See #amdgpu_device_initialize() 626 * \param type - \c [in] Type of handle requested 627 * \param shared_handle - \c [in] Shared handle received as result "import" 628 * operation 629 * \param output - \c [out] Pointer to structure with information 630 * about imported buffer 631 * 632 * \return 0 on success\n 633 * <0 - Negative POSIX Error code 634 * 635 * \note Buffer must be "imported" only using new "fd" (different from 636 * one used by "exporter"). 637 * 638 * \sa amdgpu_bo_export() 639 * 640*/ 641int amdgpu_bo_import(amdgpu_device_handle dev, 642 enum amdgpu_bo_handle_type type, 643 uint32_t shared_handle, 644 struct amdgpu_bo_import_result *output); 645 646/** 647 * Request GPU access to user allocated memory e.g. via "malloc" 648 * 649 * \param dev - [in] Device handle. See #amdgpu_device_initialize() 650 * \param cpu - [in] CPU address of user allocated memory which we 651 * want to map to GPU address space (make GPU accessible) 652 * (This address must be correctly aligned). 653 * \param size - [in] Size of allocation (must be correctly aligned) 654 * \param buf_handle - [out] Buffer handle for the userptr memory 655 * resource on submission and be used in other operations. 656 * 657 * 658 * \return 0 on success\n 659 * <0 - Negative POSIX Error code 660 * 661 * \note 662 * This call doesn't guarantee that such memory will be persistently 663 * "locked" / make non-pageable. The purpose of this call is to provide 664 * opportunity for GPU get access to this resource during submission. 665 * 666 * The maximum amount of memory which could be mapped in this call depends 667 * if overcommit is disabled or not. If overcommit is disabled than the max. 668 * amount of memory to be pinned will be limited by left "free" size in total 669 * amount of memory which could be locked simultaneously ("GART" size). 670 * 671 * Supported (theoretical) max. size of mapping is restricted only by 672 * "GART" size. 673 * 674 * It is responsibility of caller to correctly specify access rights 675 * on VA assignment. 676*/ 677int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev, 678 void *cpu, uint64_t size, 679 amdgpu_bo_handle *buf_handle); 680 681/** 682 * Validate if the user memory comes from BO 683 * 684 * \param dev - [in] Device handle. See #amdgpu_device_initialize() 685 * \param cpu - [in] CPU address of user allocated memory which we 686 * want to map to GPU address space (make GPU accessible) 687 * (This address must be correctly aligned). 688 * \param size - [in] Size of allocation (must be correctly aligned) 689 * \param buf_handle - [out] Buffer handle for the userptr memory 690 * if the user memory is not from BO, the buf_handle will be NULL. 691 * \param offset_in_bo - [out] offset in this BO for this user memory 692 * 693 * 694 * \return 0 on success\n 695 * <0 - Negative POSIX Error code 696 * 697*/ 698int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev, 699 void *cpu, 700 uint64_t size, 701 amdgpu_bo_handle *buf_handle, 702 uint64_t *offset_in_bo); 703 704/** 705 * Free previosuly allocated memory 706 * 707 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 708 * \param buf_handle - \c [in] Buffer handle to free 709 * 710 * \return 0 on success\n 711 * <0 - Negative POSIX Error code 712 * 713 * \note In the case of memory shared between different applications all 714 * resources will be “physically” freed only all such applications 715 * will be terminated 716 * \note If is UMD responsibility to ‘free’ buffer only when there is no 717 * more GPU access 718 * 719 * \sa amdgpu_bo_set_metadata(), amdgpu_bo_alloc() 720 * 721*/ 722int amdgpu_bo_free(amdgpu_bo_handle buf_handle); 723 724/** 725 * Increase the reference count of a buffer object 726 * 727 * \param bo - \c [in] Buffer object handle to increase the reference count 728 * 729 * \sa amdgpu_bo_alloc(), amdgpu_bo_free() 730 * 731*/ 732void amdgpu_bo_inc_ref(amdgpu_bo_handle bo); 733 734/** 735 * Request CPU access to GPU accessable memory 736 * 737 * \param buf_handle - \c [in] Buffer handle 738 * \param cpu - \c [out] CPU address to be used for access 739 * 740 * \return 0 on success\n 741 * <0 - Negative POSIX Error code 742 * 743 * \sa amdgpu_bo_cpu_unmap() 744 * 745*/ 746int amdgpu_bo_cpu_map(amdgpu_bo_handle buf_handle, void **cpu); 747 748/** 749 * Release CPU access to GPU memory 750 * 751 * \param buf_handle - \c [in] Buffer handle 752 * 753 * \return 0 on success\n 754 * <0 - Negative POSIX Error code 755 * 756 * \sa amdgpu_bo_cpu_map() 757 * 758*/ 759int amdgpu_bo_cpu_unmap(amdgpu_bo_handle buf_handle); 760 761/** 762 * Wait until a buffer is not used by the device. 763 * 764 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 765 * \param buf_handle - \c [in] Buffer handle. 766 * \param timeout_ns - Timeout in nanoseconds. 767 * \param buffer_busy - 0 if buffer is idle, all GPU access was completed 768 * and no GPU access is scheduled. 769 * 1 GPU access is in fly or scheduled 770 * 771 * \return 0 - on success 772 * <0 - Negative POSIX Error code 773 */ 774int amdgpu_bo_wait_for_idle(amdgpu_bo_handle buf_handle, 775 uint64_t timeout_ns, 776 bool *buffer_busy); 777 778/** 779 * Creates a BO list handle for command submission. 780 * 781 * \param dev - \c [in] Device handle. 782 * See #amdgpu_device_initialize() 783 * \param number_of_buffers - \c [in] Number of BOs in the list 784 * \param buffers - \c [in] List of BO handles 785 * \param result - \c [out] Created BO list handle 786 * 787 * \return 0 on success\n 788 * <0 - Negative POSIX Error code 789 * 790 * \sa amdgpu_bo_list_destroy_raw(), amdgpu_cs_submit_raw2() 791*/ 792int amdgpu_bo_list_create_raw(amdgpu_device_handle dev, 793 uint32_t number_of_buffers, 794 struct drm_amdgpu_bo_list_entry *buffers, 795 uint32_t *result); 796 797/** 798 * Destroys a BO list handle. 799 * 800 * \param bo_list - \c [in] BO list handle. 801 * 802 * \return 0 on success\n 803 * <0 - Negative POSIX Error code 804 * 805 * \sa amdgpu_bo_list_create_raw(), amdgpu_cs_submit_raw2() 806*/ 807int amdgpu_bo_list_destroy_raw(amdgpu_device_handle dev, uint32_t bo_list); 808 809/** 810 * Creates a BO list handle for command submission. 811 * 812 * \param dev - \c [in] Device handle. 813 * See #amdgpu_device_initialize() 814 * \param number_of_resources - \c [in] Number of BOs in the list 815 * \param resources - \c [in] List of BO handles 816 * \param resource_prios - \c [in] Optional priority for each handle 817 * \param result - \c [out] Created BO list handle 818 * 819 * \return 0 on success\n 820 * <0 - Negative POSIX Error code 821 * 822 * \sa amdgpu_bo_list_destroy() 823*/ 824int amdgpu_bo_list_create(amdgpu_device_handle dev, 825 uint32_t number_of_resources, 826 amdgpu_bo_handle *resources, 827 uint8_t *resource_prios, 828 amdgpu_bo_list_handle *result); 829 830/** 831 * Destroys a BO list handle. 832 * 833 * \param handle - \c [in] BO list handle. 834 * 835 * \return 0 on success\n 836 * <0 - Negative POSIX Error code 837 * 838 * \sa amdgpu_bo_list_create() 839*/ 840int amdgpu_bo_list_destroy(amdgpu_bo_list_handle handle); 841 842/** 843 * Update resources for existing BO list 844 * 845 * \param handle - \c [in] BO list handle 846 * \param number_of_resources - \c [in] Number of BOs in the list 847 * \param resources - \c [in] List of BO handles 848 * \param resource_prios - \c [in] Optional priority for each handle 849 * 850 * \return 0 on success\n 851 * <0 - Negative POSIX Error code 852 * 853 * \sa amdgpu_bo_list_update() 854*/ 855int amdgpu_bo_list_update(amdgpu_bo_list_handle handle, 856 uint32_t number_of_resources, 857 amdgpu_bo_handle *resources, 858 uint8_t *resource_prios); 859 860/* 861 * GPU Execution context 862 * 863*/ 864 865/** 866 * Create GPU execution Context 867 * 868 * For the purpose of GPU Scheduler and GPU Robustness extensions it is 869 * necessary to have information/identify rendering/compute contexts. 870 * It also may be needed to associate some specific requirements with such 871 * contexts. Kernel driver will guarantee that submission from the same 872 * context will always be executed in order (first come, first serve). 873 * 874 * 875 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 876 * \param priority - \c [in] Context creation flags. See AMDGPU_CTX_PRIORITY_* 877 * \param context - \c [out] GPU Context handle 878 * 879 * \return 0 on success\n 880 * <0 - Negative POSIX Error code 881 * 882 * \sa amdgpu_cs_ctx_free() 883 * 884*/ 885int amdgpu_cs_ctx_create2(amdgpu_device_handle dev, 886 uint32_t priority, 887 amdgpu_context_handle *context); 888/** 889 * Create GPU execution Context 890 * 891 * Refer to amdgpu_cs_ctx_create2 for full documentation. This call 892 * is missing the priority parameter. 893 * 894 * \sa amdgpu_cs_ctx_create2() 895 * 896*/ 897int amdgpu_cs_ctx_create(amdgpu_device_handle dev, 898 amdgpu_context_handle *context); 899 900/** 901 * 902 * Destroy GPU execution context when not needed any more 903 * 904 * \param context - \c [in] GPU Context handle 905 * 906 * \return 0 on success\n 907 * <0 - Negative POSIX Error code 908 * 909 * \sa amdgpu_cs_ctx_create() 910 * 911*/ 912int amdgpu_cs_ctx_free(amdgpu_context_handle context); 913 914/** 915 * Query reset state for the specific GPU Context 916 * 917 * \param context - \c [in] GPU Context handle 918 * \param state - \c [out] One of AMDGPU_CTX_*_RESET 919 * \param hangs - \c [out] Number of hangs caused by the context. 920 * 921 * \return 0 on success\n 922 * <0 - Negative POSIX Error code 923 * 924 * \sa amdgpu_cs_ctx_create() 925 * 926*/ 927int amdgpu_cs_query_reset_state(amdgpu_context_handle context, 928 uint32_t *state, uint32_t *hangs); 929 930/* 931 * Command Buffers Management 932 * 933*/ 934 935/** 936 * Send request to submit command buffers to hardware. 937 * 938 * Kernel driver could use GPU Scheduler to make decision when physically 939 * sent this request to the hardware. Accordingly this request could be put 940 * in queue and sent for execution later. The only guarantee is that request 941 * from the same GPU context to the same ip:ip_instance:ring will be executed in 942 * order. 943 * 944 * The caller can specify the user fence buffer/location with the fence_info in the 945 * cs_request.The sequence number is returned via the 'seq_no' parameter 946 * in ibs_request structure. 947 * 948 * 949 * \param dev - \c [in] Device handle. 950 * See #amdgpu_device_initialize() 951 * \param context - \c [in] GPU Context 952 * \param flags - \c [in] Global submission flags 953 * \param ibs_request - \c [in/out] Pointer to submission requests. 954 * We could submit to the several 955 * engines/rings simulteniously as 956 * 'atomic' operation 957 * \param number_of_requests - \c [in] Number of submission requests 958 * 959 * \return 0 on success\n 960 * <0 - Negative POSIX Error code 961 * 962 * \note It is required to pass correct resource list with buffer handles 963 * which will be accessible by command buffers from submission 964 * This will allow kernel driver to correctly implement "paging". 965 * Failure to do so will have unpredictable results. 966 * 967 * \sa amdgpu_command_buffer_alloc(), amdgpu_command_buffer_free(), 968 * amdgpu_cs_query_fence_status() 969 * 970*/ 971int amdgpu_cs_submit(amdgpu_context_handle context, 972 uint64_t flags, 973 struct amdgpu_cs_request *ibs_request, 974 uint32_t number_of_requests); 975 976/** 977 * Query status of Command Buffer Submission 978 * 979 * \param fence - \c [in] Structure describing fence to query 980 * \param timeout_ns - \c [in] Timeout value to wait 981 * \param flags - \c [in] Flags for the query 982 * \param expired - \c [out] If fence expired or not.\n 983 * 0 – if fence is not expired\n 984 * !0 - otherwise 985 * 986 * \return 0 on success\n 987 * <0 - Negative POSIX Error code 988 * 989 * \note If UMD wants only to check operation status and returned immediately 990 * then timeout value as 0 must be passed. In this case success will be 991 * returned in the case if submission was completed or timeout error 992 * code. 993 * 994 * \sa amdgpu_cs_submit() 995*/ 996int amdgpu_cs_query_fence_status(struct amdgpu_cs_fence *fence, 997 uint64_t timeout_ns, 998 uint64_t flags, 999 uint32_t *expired); 1000 1001/** 1002 * Wait for multiple fences 1003 * 1004 * \param fences - \c [in] The fence array to wait 1005 * \param fence_count - \c [in] The fence count 1006 * \param wait_all - \c [in] If true, wait all fences to be signaled, 1007 * otherwise, wait at least one fence 1008 * \param timeout_ns - \c [in] The timeout to wait, in nanoseconds 1009 * \param status - \c [out] '1' for signaled, '0' for timeout 1010 * \param first - \c [out] the index of the first signaled fence from @fences 1011 * 1012 * \return 0 on success 1013 * <0 - Negative POSIX Error code 1014 * 1015 * \note Currently it supports only one amdgpu_device. All fences come from 1016 * the same amdgpu_device with the same fd. 1017*/ 1018int amdgpu_cs_wait_fences(struct amdgpu_cs_fence *fences, 1019 uint32_t fence_count, 1020 bool wait_all, 1021 uint64_t timeout_ns, 1022 uint32_t *status, uint32_t *first); 1023 1024/* 1025 * Query / Info API 1026 * 1027*/ 1028 1029/** 1030 * Query allocation size alignments 1031 * 1032 * UMD should query information about GPU VM MC size alignments requirements 1033 * to be able correctly choose required allocation size and implement 1034 * internal optimization if needed. 1035 * 1036 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1037 * \param info - \c [out] Pointer to structure to get size alignment 1038 * requirements 1039 * 1040 * \return 0 on success\n 1041 * <0 - Negative POSIX Error code 1042 * 1043*/ 1044int amdgpu_query_buffer_size_alignment(amdgpu_device_handle dev, 1045 struct amdgpu_buffer_size_alignments 1046 *info); 1047 1048/** 1049 * Query firmware versions 1050 * 1051 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1052 * \param fw_type - \c [in] AMDGPU_INFO_FW_* 1053 * \param ip_instance - \c [in] Index of the IP block of the same type. 1054 * \param index - \c [in] Index of the engine. (for SDMA and MEC) 1055 * \param version - \c [out] Pointer to to the "version" return value 1056 * \param feature - \c [out] Pointer to to the "feature" return value 1057 * 1058 * \return 0 on success\n 1059 * <0 - Negative POSIX Error code 1060 * 1061*/ 1062int amdgpu_query_firmware_version(amdgpu_device_handle dev, unsigned fw_type, 1063 unsigned ip_instance, unsigned index, 1064 uint32_t *version, uint32_t *feature); 1065 1066/** 1067 * Query the number of HW IP instances of a certain type. 1068 * 1069 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1070 * \param type - \c [in] Hardware IP block type = AMDGPU_HW_IP_* 1071 * \param count - \c [out] Pointer to structure to get information 1072 * 1073 * \return 0 on success\n 1074 * <0 - Negative POSIX Error code 1075*/ 1076int amdgpu_query_hw_ip_count(amdgpu_device_handle dev, unsigned type, 1077 uint32_t *count); 1078 1079/** 1080 * Query engine information 1081 * 1082 * This query allows UMD to query information different engines and their 1083 * capabilities. 1084 * 1085 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1086 * \param type - \c [in] Hardware IP block type = AMDGPU_HW_IP_* 1087 * \param ip_instance - \c [in] Index of the IP block of the same type. 1088 * \param info - \c [out] Pointer to structure to get information 1089 * 1090 * \return 0 on success\n 1091 * <0 - Negative POSIX Error code 1092*/ 1093int amdgpu_query_hw_ip_info(amdgpu_device_handle dev, unsigned type, 1094 unsigned ip_instance, 1095 struct drm_amdgpu_info_hw_ip *info); 1096 1097/** 1098 * Query heap information 1099 * 1100 * This query allows UMD to query potentially available memory resources and 1101 * adjust their logic if necessary. 1102 * 1103 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1104 * \param heap - \c [in] Heap type 1105 * \param info - \c [in] Pointer to structure to get needed information 1106 * 1107 * \return 0 on success\n 1108 * <0 - Negative POSIX Error code 1109 * 1110*/ 1111int amdgpu_query_heap_info(amdgpu_device_handle dev, uint32_t heap, 1112 uint32_t flags, struct amdgpu_heap_info *info); 1113 1114/** 1115 * Get the CRTC ID from the mode object ID 1116 * 1117 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1118 * \param id - \c [in] Mode object ID 1119 * \param result - \c [in] Pointer to the CRTC ID 1120 * 1121 * \return 0 on success\n 1122 * <0 - Negative POSIX Error code 1123 * 1124*/ 1125int amdgpu_query_crtc_from_id(amdgpu_device_handle dev, unsigned id, 1126 int32_t *result); 1127 1128/** 1129 * Query GPU H/w Info 1130 * 1131 * Query hardware specific information 1132 * 1133 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1134 * \param heap - \c [in] Heap type 1135 * \param info - \c [in] Pointer to structure to get needed information 1136 * 1137 * \return 0 on success\n 1138 * <0 - Negative POSIX Error code 1139 * 1140*/ 1141int amdgpu_query_gpu_info(amdgpu_device_handle dev, 1142 struct amdgpu_gpu_info *info); 1143 1144/** 1145 * Query hardware or driver information. 1146 * 1147 * The return size is query-specific and depends on the "info_id" parameter. 1148 * No more than "size" bytes is returned. 1149 * 1150 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1151 * \param info_id - \c [in] AMDGPU_INFO_* 1152 * \param size - \c [in] Size of the returned value. 1153 * \param value - \c [out] Pointer to the return value. 1154 * 1155 * \return 0 on success\n 1156 * <0 - Negative POSIX error code 1157 * 1158*/ 1159int amdgpu_query_info(amdgpu_device_handle dev, unsigned info_id, 1160 unsigned size, void *value); 1161 1162/** 1163 * Query hardware or driver information. 1164 * 1165 * The return size is query-specific and depends on the "info_id" parameter. 1166 * No more than "size" bytes is returned. 1167 * 1168 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1169 * \param info - \c [in] amdgpu_sw_info_* 1170 * \param value - \c [out] Pointer to the return value. 1171 * 1172 * \return 0 on success\n 1173 * <0 - Negative POSIX error code 1174 * 1175*/ 1176int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info, 1177 void *value); 1178 1179/** 1180 * Query information about GDS 1181 * 1182 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1183 * \param gds_info - \c [out] Pointer to structure to get GDS information 1184 * 1185 * \return 0 on success\n 1186 * <0 - Negative POSIX Error code 1187 * 1188*/ 1189int amdgpu_query_gds_info(amdgpu_device_handle dev, 1190 struct amdgpu_gds_resource_info *gds_info); 1191 1192/** 1193 * Query information about sensor. 1194 * 1195 * The return size is query-specific and depends on the "sensor_type" 1196 * parameter. No more than "size" bytes is returned. 1197 * 1198 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1199 * \param sensor_type - \c [in] AMDGPU_INFO_SENSOR_* 1200 * \param size - \c [in] Size of the returned value. 1201 * \param value - \c [out] Pointer to the return value. 1202 * 1203 * \return 0 on success\n 1204 * <0 - Negative POSIX Error code 1205 * 1206*/ 1207int amdgpu_query_sensor_info(amdgpu_device_handle dev, unsigned sensor_type, 1208 unsigned size, void *value); 1209 1210/** 1211 * Read a set of consecutive memory-mapped registers. 1212 * Not all registers are allowed to be read by userspace. 1213 * 1214 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize( 1215 * \param dword_offset - \c [in] Register offset in dwords 1216 * \param count - \c [in] The number of registers to read starting 1217 * from the offset 1218 * \param instance - \c [in] GRBM_GFX_INDEX selector. It may have other 1219 * uses. Set it to 0xffffffff if unsure. 1220 * \param flags - \c [in] Flags with additional information. 1221 * \param values - \c [out] The pointer to return values. 1222 * 1223 * \return 0 on success\n 1224 * <0 - Negative POSIX error code 1225 * 1226*/ 1227int amdgpu_read_mm_registers(amdgpu_device_handle dev, unsigned dword_offset, 1228 unsigned count, uint32_t instance, uint32_t flags, 1229 uint32_t *values); 1230 1231/** 1232 * Flag to request VA address range in the 32bit address space 1233*/ 1234#define AMDGPU_VA_RANGE_32_BIT 0x1 1235#define AMDGPU_VA_RANGE_HIGH 0x2 1236 1237/** 1238 * Allocate virtual address range 1239 * 1240 * \param dev - [in] Device handle. See #amdgpu_device_initialize() 1241 * \param va_range_type - \c [in] Type of MC va range from which to allocate 1242 * \param size - \c [in] Size of range. Size must be correctly* aligned. 1243 * It is client responsibility to correctly aligned size based on the future 1244 * usage of allocated range. 1245 * \param va_base_alignment - \c [in] Overwrite base address alignment 1246 * requirement for GPU VM MC virtual 1247 * address assignment. Must be multiple of size alignments received as 1248 * 'amdgpu_buffer_size_alignments'. 1249 * If 0 use the default one. 1250 * \param va_base_required - \c [in] Specified required va base address. 1251 * If 0 then library choose available one. 1252 * If !0 value will be passed and those value already "in use" then 1253 * corresponding error status will be returned. 1254 * \param va_base_allocated - \c [out] On return: Allocated VA base to be used 1255 * by client. 1256 * \param va_range_handle - \c [out] On return: Handle assigned to allocation 1257 * \param flags - \c [in] flags for special VA range 1258 * 1259 * \return 0 on success\n 1260 * >0 - AMD specific error code\n 1261 * <0 - Negative POSIX Error code 1262 * 1263 * \notes \n 1264 * It is client responsibility to correctly handle VA assignments and usage. 1265 * Neither kernel driver nor libdrm_amdpgu are able to prevent and 1266 * detect wrong va assignemnt. 1267 * 1268 * It is client responsibility to correctly handle multi-GPU cases and to pass 1269 * the corresponding arrays of all devices handles where corresponding VA will 1270 * be used. 1271 * 1272*/ 1273int amdgpu_va_range_alloc(amdgpu_device_handle dev, 1274 enum amdgpu_gpu_va_range va_range_type, 1275 uint64_t size, 1276 uint64_t va_base_alignment, 1277 uint64_t va_base_required, 1278 uint64_t *va_base_allocated, 1279 amdgpu_va_handle *va_range_handle, 1280 uint64_t flags); 1281 1282/** 1283 * Free previously allocated virtual address range 1284 * 1285 * 1286 * \param va_range_handle - \c [in] Handle assigned to VA allocation 1287 * 1288 * \return 0 on success\n 1289 * >0 - AMD specific error code\n 1290 * <0 - Negative POSIX Error code 1291 * 1292*/ 1293int amdgpu_va_range_free(amdgpu_va_handle va_range_handle); 1294 1295/** 1296* Query virtual address range 1297* 1298* UMD can query GPU VM range supported by each device 1299* to initialize its own VAM accordingly. 1300* 1301* \param dev - [in] Device handle. See #amdgpu_device_initialize() 1302* \param type - \c [in] Type of virtual address range 1303* \param offset - \c [out] Start offset of virtual address range 1304* \param size - \c [out] Size of virtual address range 1305* 1306* \return 0 on success\n 1307* <0 - Negative POSIX Error code 1308* 1309*/ 1310 1311int amdgpu_va_range_query(amdgpu_device_handle dev, 1312 enum amdgpu_gpu_va_range type, 1313 uint64_t *start, 1314 uint64_t *end); 1315 1316/** 1317 * VA mapping/unmapping for the buffer object 1318 * 1319 * \param bo - \c [in] BO handle 1320 * \param offset - \c [in] Start offset to map 1321 * \param size - \c [in] Size to map 1322 * \param addr - \c [in] Start virtual address. 1323 * \param flags - \c [in] Supported flags for mapping/unmapping 1324 * \param ops - \c [in] AMDGPU_VA_OP_MAP or AMDGPU_VA_OP_UNMAP 1325 * 1326 * \return 0 on success\n 1327 * <0 - Negative POSIX Error code 1328 * 1329*/ 1330 1331int amdgpu_bo_va_op(amdgpu_bo_handle bo, 1332 uint64_t offset, 1333 uint64_t size, 1334 uint64_t addr, 1335 uint64_t flags, 1336 uint32_t ops); 1337 1338/** 1339 * VA mapping/unmapping for a buffer object or PRT region. 1340 * 1341 * This is not a simple drop-in extension for amdgpu_bo_va_op; instead, all 1342 * parameters are treated "raw", i.e. size is not automatically aligned, and 1343 * all flags must be specified explicitly. 1344 * 1345 * \param dev - \c [in] device handle 1346 * \param bo - \c [in] BO handle (may be NULL) 1347 * \param offset - \c [in] Start offset to map 1348 * \param size - \c [in] Size to map 1349 * \param addr - \c [in] Start virtual address. 1350 * \param flags - \c [in] Supported flags for mapping/unmapping 1351 * \param ops - \c [in] AMDGPU_VA_OP_MAP or AMDGPU_VA_OP_UNMAP 1352 * 1353 * \return 0 on success\n 1354 * <0 - Negative POSIX Error code 1355 * 1356*/ 1357 1358int amdgpu_bo_va_op_raw(amdgpu_device_handle dev, 1359 amdgpu_bo_handle bo, 1360 uint64_t offset, 1361 uint64_t size, 1362 uint64_t addr, 1363 uint64_t flags, 1364 uint32_t ops); 1365 1366/** 1367 * create semaphore 1368 * 1369 * \param sem - \c [out] semaphore handle 1370 * 1371 * \return 0 on success\n 1372 * <0 - Negative POSIX Error code 1373 * 1374*/ 1375int amdgpu_cs_create_semaphore(amdgpu_semaphore_handle *sem); 1376 1377/** 1378 * signal semaphore 1379 * 1380 * \param context - \c [in] GPU Context 1381 * \param ip_type - \c [in] Hardware IP block type = AMDGPU_HW_IP_* 1382 * \param ip_instance - \c [in] Index of the IP block of the same type 1383 * \param ring - \c [in] Specify ring index of the IP 1384 * \param sem - \c [in] semaphore handle 1385 * 1386 * \return 0 on success\n 1387 * <0 - Negative POSIX Error code 1388 * 1389*/ 1390int amdgpu_cs_signal_semaphore(amdgpu_context_handle ctx, 1391 uint32_t ip_type, 1392 uint32_t ip_instance, 1393 uint32_t ring, 1394 amdgpu_semaphore_handle sem); 1395 1396/** 1397 * wait semaphore 1398 * 1399 * \param context - \c [in] GPU Context 1400 * \param ip_type - \c [in] Hardware IP block type = AMDGPU_HW_IP_* 1401 * \param ip_instance - \c [in] Index of the IP block of the same type 1402 * \param ring - \c [in] Specify ring index of the IP 1403 * \param sem - \c [in] semaphore handle 1404 * 1405 * \return 0 on success\n 1406 * <0 - Negative POSIX Error code 1407 * 1408*/ 1409int amdgpu_cs_wait_semaphore(amdgpu_context_handle ctx, 1410 uint32_t ip_type, 1411 uint32_t ip_instance, 1412 uint32_t ring, 1413 amdgpu_semaphore_handle sem); 1414 1415/** 1416 * destroy semaphore 1417 * 1418 * \param sem - \c [in] semaphore handle 1419 * 1420 * \return 0 on success\n 1421 * <0 - Negative POSIX Error code 1422 * 1423*/ 1424int amdgpu_cs_destroy_semaphore(amdgpu_semaphore_handle sem); 1425 1426/** 1427 * Get the ASIC marketing name 1428 * 1429 * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() 1430 * 1431 * \return the constant string of the marketing name 1432 * "NULL" means the ASIC is not found 1433*/ 1434const char *amdgpu_get_marketing_name(amdgpu_device_handle dev); 1435 1436/** 1437 * Create kernel sync object 1438 * 1439 * \param dev - \c [in] device handle 1440 * \param flags - \c [in] flags that affect creation 1441 * \param syncobj - \c [out] sync object handle 1442 * 1443 * \return 0 on success\n 1444 * <0 - Negative POSIX Error code 1445 * 1446*/ 1447int amdgpu_cs_create_syncobj2(amdgpu_device_handle dev, 1448 uint32_t flags, 1449 uint32_t *syncobj); 1450 1451/** 1452 * Create kernel sync object 1453 * 1454 * \param dev - \c [in] device handle 1455 * \param syncobj - \c [out] sync object handle 1456 * 1457 * \return 0 on success\n 1458 * <0 - Negative POSIX Error code 1459 * 1460*/ 1461int amdgpu_cs_create_syncobj(amdgpu_device_handle dev, 1462 uint32_t *syncobj); 1463/** 1464 * Destroy kernel sync object 1465 * 1466 * \param dev - \c [in] device handle 1467 * \param syncobj - \c [in] sync object handle 1468 * 1469 * \return 0 on success\n 1470 * <0 - Negative POSIX Error code 1471 * 1472*/ 1473int amdgpu_cs_destroy_syncobj(amdgpu_device_handle dev, 1474 uint32_t syncobj); 1475 1476/** 1477 * Reset kernel sync objects to unsignalled state. 1478 * 1479 * \param dev - \c [in] device handle 1480 * \param syncobjs - \c [in] array of sync object handles 1481 * \param syncobj_count - \c [in] number of handles in syncobjs 1482 * 1483 * \return 0 on success\n 1484 * <0 - Negative POSIX Error code 1485 * 1486*/ 1487int amdgpu_cs_syncobj_reset(amdgpu_device_handle dev, 1488 const uint32_t *syncobjs, uint32_t syncobj_count); 1489 1490/** 1491 * Signal kernel sync objects. 1492 * 1493 * \param dev - \c [in] device handle 1494 * \param syncobjs - \c [in] array of sync object handles 1495 * \param syncobj_count - \c [in] number of handles in syncobjs 1496 * 1497 * \return 0 on success\n 1498 * <0 - Negative POSIX Error code 1499 * 1500*/ 1501int amdgpu_cs_syncobj_signal(amdgpu_device_handle dev, 1502 const uint32_t *syncobjs, uint32_t syncobj_count); 1503 1504/** 1505 * Wait for one or all sync objects to signal. 1506 * 1507 * \param dev - \c [in] self-explanatory 1508 * \param handles - \c [in] array of sync object handles 1509 * \param num_handles - \c [in] self-explanatory 1510 * \param timeout_nsec - \c [in] self-explanatory 1511 * \param flags - \c [in] a bitmask of DRM_SYNCOBJ_WAIT_FLAGS_* 1512 * \param first_signaled - \c [in] self-explanatory 1513 * 1514 * \return 0 on success\n 1515 * -ETIME - Timeout 1516 * <0 - Negative POSIX Error code 1517 * 1518 */ 1519int amdgpu_cs_syncobj_wait(amdgpu_device_handle dev, 1520 uint32_t *handles, unsigned num_handles, 1521 int64_t timeout_nsec, unsigned flags, 1522 uint32_t *first_signaled); 1523 1524/** 1525 * Export kernel sync object to shareable fd. 1526 * 1527 * \param dev - \c [in] device handle 1528 * \param syncobj - \c [in] sync object handle 1529 * \param shared_fd - \c [out] shared file descriptor. 1530 * 1531 * \return 0 on success\n 1532 * <0 - Negative POSIX Error code 1533 * 1534*/ 1535int amdgpu_cs_export_syncobj(amdgpu_device_handle dev, 1536 uint32_t syncobj, 1537 int *shared_fd); 1538/** 1539 * Import kernel sync object from shareable fd. 1540 * 1541 * \param dev - \c [in] device handle 1542 * \param shared_fd - \c [in] shared file descriptor. 1543 * \param syncobj - \c [out] sync object handle 1544 * 1545 * \return 0 on success\n 1546 * <0 - Negative POSIX Error code 1547 * 1548*/ 1549int amdgpu_cs_import_syncobj(amdgpu_device_handle dev, 1550 int shared_fd, 1551 uint32_t *syncobj); 1552 1553/** 1554 * Export kernel sync object to a sync_file. 1555 * 1556 * \param dev - \c [in] device handle 1557 * \param syncobj - \c [in] sync object handle 1558 * \param sync_file_fd - \c [out] sync_file file descriptor. 1559 * 1560 * \return 0 on success\n 1561 * <0 - Negative POSIX Error code 1562 * 1563 */ 1564int amdgpu_cs_syncobj_export_sync_file(amdgpu_device_handle dev, 1565 uint32_t syncobj, 1566 int *sync_file_fd); 1567 1568/** 1569 * Import kernel sync object from a sync_file. 1570 * 1571 * \param dev - \c [in] device handle 1572 * \param syncobj - \c [in] sync object handle 1573 * \param sync_file_fd - \c [in] sync_file file descriptor. 1574 * 1575 * \return 0 on success\n 1576 * <0 - Negative POSIX Error code 1577 * 1578 */ 1579int amdgpu_cs_syncobj_import_sync_file(amdgpu_device_handle dev, 1580 uint32_t syncobj, 1581 int sync_file_fd); 1582 1583/** 1584 * Export an amdgpu fence as a handle (syncobj or fd). 1585 * 1586 * \param what AMDGPU_FENCE_TO_HANDLE_GET_{SYNCOBJ, FD} 1587 * \param out_handle returned handle 1588 * 1589 * \return 0 on success\n 1590 * <0 - Negative POSIX Error code 1591 */ 1592int amdgpu_cs_fence_to_handle(amdgpu_device_handle dev, 1593 struct amdgpu_cs_fence *fence, 1594 uint32_t what, 1595 uint32_t *out_handle); 1596 1597/** 1598 * Submit raw command submission to kernel 1599 * 1600 * \param dev - \c [in] device handle 1601 * \param context - \c [in] context handle for context id 1602 * \param bo_list_handle - \c [in] request bo list handle (0 for none) 1603 * \param num_chunks - \c [in] number of CS chunks to submit 1604 * \param chunks - \c [in] array of CS chunks 1605 * \param seq_no - \c [out] output sequence number for submission. 1606 * 1607 * \return 0 on success\n 1608 * <0 - Negative POSIX Error code 1609 * 1610 */ 1611struct drm_amdgpu_cs_chunk; 1612struct drm_amdgpu_cs_chunk_dep; 1613struct drm_amdgpu_cs_chunk_data; 1614 1615int amdgpu_cs_submit_raw(amdgpu_device_handle dev, 1616 amdgpu_context_handle context, 1617 amdgpu_bo_list_handle bo_list_handle, 1618 int num_chunks, 1619 struct drm_amdgpu_cs_chunk *chunks, 1620 uint64_t *seq_no); 1621 1622/** 1623 * Submit raw command submission to the kernel with a raw BO list handle. 1624 * 1625 * \param dev - \c [in] device handle 1626 * \param context - \c [in] context handle for context id 1627 * \param bo_list_handle - \c [in] raw bo list handle (0 for none) 1628 * \param num_chunks - \c [in] number of CS chunks to submit 1629 * \param chunks - \c [in] array of CS chunks 1630 * \param seq_no - \c [out] output sequence number for submission. 1631 * 1632 * \return 0 on success\n 1633 * <0 - Negative POSIX Error code 1634 * 1635 * \sa amdgpu_bo_list_create_raw(), amdgpu_bo_list_destroy_raw() 1636 */ 1637int amdgpu_cs_submit_raw2(amdgpu_device_handle dev, 1638 amdgpu_context_handle context, 1639 uint32_t bo_list_handle, 1640 int num_chunks, 1641 struct drm_amdgpu_cs_chunk *chunks, 1642 uint64_t *seq_no); 1643 1644void amdgpu_cs_chunk_fence_to_dep(struct amdgpu_cs_fence *fence, 1645 struct drm_amdgpu_cs_chunk_dep *dep); 1646void amdgpu_cs_chunk_fence_info_to_data(struct amdgpu_cs_fence_info *fence_info, 1647 struct drm_amdgpu_cs_chunk_data *data); 1648 1649/** 1650 * Reserve VMID 1651 * \param context - \c [in] GPU Context 1652 * \param flags - \c [in] TBD 1653 * 1654 * \return 0 on success otherwise POSIX Error code 1655*/ 1656int amdgpu_vm_reserve_vmid(amdgpu_device_handle dev, uint32_t flags); 1657 1658/** 1659 * Free reserved VMID 1660 * \param context - \c [in] GPU Context 1661 * \param flags - \c [in] TBD 1662 * 1663 * \return 0 on success otherwise POSIX Error code 1664*/ 1665int amdgpu_vm_unreserve_vmid(amdgpu_device_handle dev, uint32_t flags); 1666 1667#ifdef __cplusplus 1668} 1669#endif 1670#endif /* #ifdef _AMDGPU_H_ */ 1671