OSDN Git Service

amdgpu: reuse the kernel IB flags v2
[android-x86/external-libdrm.git] / amdgpu / amdgpu.h
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 struct drm_amdgpu_info_hw_ip;
41
42 /*--------------------------------------------------------------------------*/
43 /* --------------------------- Defines ------------------------------------ */
44 /*--------------------------------------------------------------------------*/
45
46 /**
47  * Define max. number of Command Buffers (IB) which could be sent to the single
48  * hardware IP to accommodate CE/DE requirements
49  *
50  * \sa amdgpu_cs_ib_info
51 */
52 #define AMDGPU_CS_MAX_IBS_PER_SUBMIT            4
53
54 /**
55  *
56  */
57 #define AMDGPU_TIMEOUT_INFINITE                 0xffffffffffffffffull
58
59 /**
60  * The special flag to mark that this IB will re-used
61  * by client and should not be automatically return back
62  * to free pool by libdrm_amdgpu when submission is completed.
63  *
64  * \sa amdgpu_cs_ib_info
65 */
66 #define AMDGPU_CS_REUSE_IB                      0x2
67
68 /**
69  * The special resource flag for IB submission.
70  * When VRAM is full, some resources may be moved to GTT to make place
71  * for other resources which want to be in VRAM. This flag affects the order
72  * in which resources are moved back to VRAM until there is no space there.
73  * The resources with the highest priority will be moved first.
74  * The value can be between 0 and 15, inclusive.
75  */
76 #define AMDGPU_IB_RESOURCE_PRIORITY(x)          ((x) & 0xf)
77
78
79 /*--------------------------------------------------------------------------*/
80 /* ----------------------------- Enums ------------------------------------ */
81 /*--------------------------------------------------------------------------*/
82
83 /**
84  * Enum describing possible handle types
85  *
86  * \sa amdgpu_bo_import, amdgpu_bo_export
87  *
88 */
89 enum amdgpu_bo_handle_type {
90         /** GEM flink name (needs DRM authentication, used by DRI2) */
91         amdgpu_bo_handle_type_gem_flink_name = 0,
92
93         /** KMS handle which is used by all driver ioctls */
94         amdgpu_bo_handle_type_kms = 1,
95
96         /** DMA-buf fd handle */
97         amdgpu_bo_handle_type_dma_buf_fd = 2
98 };
99
100 /**
101  * Enum describing possible context reset states
102  *
103  * \sa amdgpu_cs_query_reset_state()
104  *
105 */
106 enum amdgpu_cs_ctx_reset_state {
107         /** No reset was detected */
108         amdgpu_cs_reset_no_error = 0,
109
110         /** Reset/TDR was detected and context caused */
111         amdgpu_cs_reset_guilty   = 1,
112
113         /** Reset/TDR was detected caused by other context */
114         amdgpu_cs_reset_innocent = 2,
115
116         /** Reset TDR was detected by cause of it unknown */
117         amdgpu_cs_reset_unknown  = 3
118 };
119
120 /**
121  * For performance reasons and to simplify logic libdrm_amdgpu will handle
122  * IBs only some pre-defined sizes.
123  *
124  * \sa amdgpu_cs_alloc_ib()
125  */
126 enum amdgpu_cs_ib_size {
127         amdgpu_cs_ib_size_4K    = 1,
128         amdgpu_cs_ib_size_16K   = 2,
129         amdgpu_cs_ib_size_32K   = 3,
130         amdgpu_cs_ib_size_64K   = 4,
131         amdgpu_cs_ib_size_128K  = 5
132 };
133
134 /** The number of different IB sizes */
135 #define AMDGPU_CS_IB_SIZE_NUM 6
136
137
138 /*--------------------------------------------------------------------------*/
139 /* -------------------------- Datatypes ----------------------------------- */
140 /*--------------------------------------------------------------------------*/
141
142 /**
143  * Define opaque pointer to context associated with fd.
144  * This context will be returned as the result of
145  * "initialize" function and should be pass as the first
146  * parameter to any API call
147  */
148 typedef struct amdgpu_device *amdgpu_device_handle;
149
150 /**
151  * Define GPU Context type as pointer to opaque structure
152  * Example of GPU Context is the "rendering" context associated
153  * with OpenGL context (glCreateContext)
154  */
155 typedef struct amdgpu_context *amdgpu_context_handle;
156
157 /**
158  * Define handle for amdgpu resources: buffer, GDS, etc.
159  */
160 typedef struct amdgpu_bo *amdgpu_bo_handle;
161
162 /**
163  * Define handle for list of BOs
164  */
165 typedef struct amdgpu_bo_list *amdgpu_bo_list_handle;
166
167 /**
168  * Define handle to be used when dealing with command
169  * buffers (a.k.a. ibs)
170  *
171  */
172 typedef struct amdgpu_ib *amdgpu_ib_handle;
173
174
175 /*--------------------------------------------------------------------------*/
176 /* -------------------------- Structures ---------------------------------- */
177 /*--------------------------------------------------------------------------*/
178
179 /**
180  * Structure describing memory allocation request
181  *
182  * \sa amdgpu_bo_alloc()
183  *
184 */
185 struct amdgpu_bo_alloc_request {
186         /** Allocation request. It must be aligned correctly. */
187         uint64_t alloc_size;
188
189         /**
190          * It may be required to have some specific alignment requirements
191          * for physical back-up storage (e.g. for displayable surface).
192          * If 0 there is no special alignment requirement
193          */
194         uint64_t phys_alignment;
195
196         /**
197          * UMD should specify where to allocate memory and how it
198          * will be accessed by the CPU.
199          */
200         uint32_t preferred_heap;
201
202         /** Additional flags passed on allocation */
203         uint64_t flags;
204 };
205
206 /**
207  * Structure describing memory allocation request
208  *
209  * \sa amdgpu_bo_alloc()
210 */
211 struct amdgpu_bo_alloc_result {
212         /** Assigned virtual MC Base Address */
213         uint64_t virtual_mc_base_address;
214
215         /** Handle of allocated memory to be used by the given process only. */
216         amdgpu_bo_handle buf_handle;
217 };
218
219 /**
220  * Special UMD specific information associated with buffer.
221  *
222  * It may be need to pass some buffer charactersitic as part
223  * of buffer sharing. Such information are defined UMD and
224  * opaque for libdrm_amdgpu as well for kernel driver.
225  *
226  * \sa amdgpu_bo_set_metadata(), amdgpu_bo_query_info,
227  *     amdgpu_bo_import(), amdgpu_bo_export
228  *
229 */
230 struct amdgpu_bo_metadata {
231         /** Special flag associated with surface */
232         uint64_t flags;
233
234         /**
235          * ASIC-specific tiling information (also used by DCE).
236          * The encoding is defined by the AMDGPU_TILING_* definitions.
237          */
238         uint64_t tiling_info;
239
240         /** Size of metadata associated with the buffer, in bytes. */
241         uint32_t size_metadata;
242
243         /** UMD specific metadata. Opaque for kernel */
244         uint32_t umd_metadata[64];
245 };
246
247 /**
248  * Structure describing allocated buffer. Client may need
249  * to query such information as part of 'sharing' buffers mechanism
250  *
251  * \sa amdgpu_bo_set_metadata(), amdgpu_bo_query_info(),
252  *     amdgpu_bo_import(), amdgpu_bo_export()
253 */
254 struct amdgpu_bo_info {
255         /** Allocated memory size */
256         uint64_t alloc_size;
257
258         /**
259          * It may be required to have some specific alignment requirements
260          * for physical back-up storage.
261          */
262         uint64_t phys_alignment;
263
264         /**
265          * Assigned virtual MC Base Address.
266          * \note  This information will be returned only if this buffer was
267          * allocated in the same process otherwise 0 will be returned.
268         */
269         uint64_t virtual_mc_base_address;
270
271         /** Heap where to allocate memory. */
272         uint32_t preferred_heap;
273
274         /** Additional allocation flags. */
275         uint64_t alloc_flags;
276
277         /** Metadata associated with buffer if any. */
278         struct amdgpu_bo_metadata metadata;
279 };
280
281 /**
282  * Structure with information about "imported" buffer
283  *
284  * \sa amdgpu_bo_import()
285  *
286  */
287 struct amdgpu_bo_import_result {
288         /** Handle of memory/buffer to use */
289         amdgpu_bo_handle  buf_handle;
290
291          /** Buffer size */
292         uint64_t alloc_size;
293
294          /** Assigned virtual MC Base Address */
295         uint64_t virtual_mc_base_address;
296 };
297
298
299 /**
300  *
301  * Structure to describe GDS partitioning information.
302  * \note OA and GWS resources are asscoiated with GDS partition
303  *
304  * \sa amdgpu_gpu_resource_query_gds_info
305  *
306 */
307 struct amdgpu_gds_resource_info {
308         uint32_t   gds_gfx_partition_size;
309         uint32_t   compute_partition_size;
310         uint32_t   gds_total_size;
311         uint32_t   gws_per_gfx_partition;
312         uint32_t   gws_per_compute_partition;
313         uint32_t   oa_per_gfx_partition;
314         uint32_t   oa_per_compute_partition;
315 };
316
317
318
319 /**
320  *  Structure describing result of request to allocate GDS
321  *
322  *  \sa amdgpu_gpu_resource_gds_alloc
323  *
324 */
325 struct amdgpu_gds_alloc_info {
326         /** Handle assigned to gds allocation */
327         amdgpu_bo_handle resource_handle;
328
329         /** How much was really allocated */
330         uint32_t   gds_memory_size;
331
332         /** Number of GWS resources allocated */
333         uint32_t   gws;
334
335         /** Number of OA resources allocated */
336         uint32_t   oa;
337 };
338
339 /**
340  * Structure to described allocated command buffer (a.k.a. IB)
341  *
342  * \sa amdgpu_cs_alloc_ib()
343  *
344 */
345 struct amdgpu_cs_ib_alloc_result {
346         /** IB allocation handle */
347         amdgpu_ib_handle handle;
348
349         /** Assigned GPU VM MC Address of command buffer */
350         uint64_t        mc_address;
351
352         /** Address to be used for CPU access */
353         void            *cpu;
354 };
355
356 /**
357  * Structure describing IB
358  *
359  * \sa amdgpu_cs_request, amdgpu_cs_submit()
360  *
361 */
362 struct amdgpu_cs_ib_info {
363         /** Special flags */
364         uint64_t      flags;
365
366         /** Handle of command buffer */
367         amdgpu_ib_handle ib_handle;
368
369         /**
370          * Size of Command Buffer to be submitted.
371          *   - The size is in units of dwords (4 bytes).
372          *   - Must be less or equal to the size of allocated IB
373          *   - Could be 0
374          */
375         uint32_t       size;
376 };
377
378 /**
379  * Structure describing submission request
380  *
381  * \note We could have several IBs as packet. e.g. CE, CE, DE case for gfx
382  *
383  * \sa amdgpu_cs_submit()
384 */
385 struct amdgpu_cs_request {
386         /** Specify flags with additional information */
387         uint64_t        flags;
388
389         /** Specify HW IP block type to which to send the IB. */
390         unsigned        ip_type;
391
392         /** IP instance index if there are several IPs of the same type. */
393         unsigned        ip_instance;
394
395         /**
396          * Specify ring index of the IP. We could have several rings
397          * in the same IP. E.g. 0 for SDMA0 and 1 for SDMA1.
398          */
399         uint32_t           ring;
400
401         /**
402          * List handle with resources used by this request.
403          */
404         amdgpu_bo_list_handle resources;
405
406         /** Number of IBs to submit in the field ibs. */
407         uint32_t number_of_ibs;
408
409         /**
410          * IBs to submit. Those IBs will be submit together as single entity
411          */
412         struct amdgpu_cs_ib_info *ibs;
413 };
414
415 /**
416  * Structure describing request to check submission state using fence
417  *
418  * \sa amdgpu_cs_query_fence_status()
419  *
420 */
421 struct amdgpu_cs_query_fence {
422
423         /** In which context IB was sent to execution */
424         amdgpu_context_handle  context;
425
426         /** Timeout in nanoseconds. */
427         uint64_t  timeout_ns;
428
429         /** To which HW IP type the fence belongs */
430         unsigned  ip_type;
431
432         /** IP instance index if there are several IPs of the same type. */
433         unsigned ip_instance;
434
435         /** Ring index of the HW IP */
436         uint32_t      ring;
437
438         /** Flags */
439         uint64_t  flags;
440
441         /** Specify fence for which we need to check
442          * submission status.*/
443         uint64_t        fence;
444 };
445
446 /**
447  * Structure which provide information about GPU VM MC Address space
448  * alignments requirements
449  *
450  * \sa amdgpu_query_buffer_size_alignment
451  */
452 struct amdgpu_buffer_size_alignments {
453         /** Size alignment requirement for allocation in
454          * local memory */
455         uint64_t size_local;
456
457         /**
458          * Size alignment requirement for allocation in remote memory
459          */
460         uint64_t size_remote;
461 };
462
463
464 /**
465  * Structure which provide information about heap
466  *
467  * \sa amdgpu_query_heap_info()
468  *
469  */
470 struct amdgpu_heap_info {
471         /** Theoretical max. available memory in the given heap */
472         uint64_t  heap_size;
473
474         /**
475          * Number of bytes allocated in the heap. This includes all processes
476          * and private allocations in the kernel. It changes when new buffers
477          * are allocated, freed, and moved. It cannot be larger than
478          * heap_size.
479          */
480         uint64_t  heap_usage;
481
482         /**
483          * Theoretical possible max. size of buffer which
484          * could be allocated in the given heap
485          */
486         uint64_t  max_allocation;
487 };
488
489
490
491 /**
492  * Describe GPU h/w info needed for UMD correct initialization
493  *
494  * \sa amdgpu_query_gpu_info()
495 */
496 struct amdgpu_gpu_info {
497         /** Asic id */
498         uint32_t asic_id;
499         /**< Chip revision */
500         uint32_t chip_rev;
501         /** Chip external revision */
502         uint32_t chip_external_rev;
503         /** Family ID */
504         uint32_t family_id;
505         /** Special flags */
506         uint64_t ids_flags;
507         /** max engine clock*/
508         uint64_t max_engine_clk;
509         /** number of shader engines */
510         uint32_t num_shader_engines;
511         /** number of shader arrays per engine */
512         uint32_t num_shader_arrays_per_engine;
513         /**  Number of available good shader pipes */
514         uint32_t avail_quad_shader_pipes;
515         /**  Max. number of shader pipes.(including good and bad pipes  */
516         uint32_t max_quad_shader_pipes;
517         /** Number of parameter cache entries per shader quad pipe */
518         uint32_t cache_entries_per_quad_pipe;
519         /**  Number of available graphics context */
520         uint32_t num_hw_gfx_contexts;
521         /** Number of render backend pipes */
522         uint32_t rb_pipes;
523         /**  Enabled render backend pipe mask */
524         uint32_t enabled_rb_pipes_mask;
525         /** Frequency of GPU Counter */
526         uint32_t gpu_counter_freq;
527         /** CC_RB_BACKEND_DISABLE.BACKEND_DISABLE per SE */
528         uint32_t backend_disable[4];
529         /** Value of MC_ARB_RAMCFG register*/
530         uint32_t mc_arb_ramcfg;
531         /** Value of GB_ADDR_CONFIG */
532         uint32_t gb_addr_cfg;
533         /** Values of the GB_TILE_MODE0..31 registers */
534         uint32_t gb_tile_mode[32];
535         /** Values of GB_MACROTILE_MODE0..15 registers */
536         uint32_t gb_macro_tile_mode[16];
537         /** Value of PA_SC_RASTER_CONFIG register per SE */
538         uint32_t pa_sc_raster_cfg[4];
539         /** Value of PA_SC_RASTER_CONFIG_1 register per SE */
540         uint32_t pa_sc_raster_cfg1[4];
541         /* CU info */
542         uint32_t cu_active_number;
543         uint32_t cu_ao_mask;
544         uint32_t cu_bitmap[4][4];
545 };
546
547
548 /*--------------------------------------------------------------------------*/
549 /*------------------------- Functions --------------------------------------*/
550 /*--------------------------------------------------------------------------*/
551
552 /*
553  * Initialization / Cleanup
554  *
555 */
556
557
558 /**
559  *
560  * \param   fd            - \c [in]  File descriptor for AMD GPU device
561  *                                   received previously as the result of
562  *                                   e.g. drmOpen() call.
563  *                                   For legacy fd type, the DRI2/DRI3 authentication
564  *                                   should be done before calling this function.
565  * \param   major_version - \c [out] Major version of library. It is assumed
566  *                                   that adding new functionality will cause
567  *                                   increase in major version
568  * \param   minor_version - \c [out] Minor version of library
569  * \param   device_handle - \c [out] Pointer to opaque context which should
570  *                                   be passed as the first parameter on each
571  *                                   API call
572  *
573  *
574  * \return   0 on success\n
575  *          >0 - AMD specific error code\n
576  *          <0 - Negative POSIX Error code
577  *
578  *
579  * \sa amdgpu_device_deinitialize()
580 */
581 int amdgpu_device_initialize(int fd,
582                              uint32_t *major_version,
583                              uint32_t *minor_version,
584                              amdgpu_device_handle *device_handle);
585
586
587
588 /**
589  *
590  * When access to such library does not needed any more the special
591  * function must be call giving opportunity to clean up any
592  * resources if needed.
593  *
594  * \param   device_handle - \c [in]  Context associated with file
595  *                                   descriptor for AMD GPU device
596  *                                   received previously as the
597  *                                   result e.g. of drmOpen() call.
598  *
599  * \return  0 on success\n
600  *         >0 - AMD specific error code\n
601  *         <0 - Negative POSIX Error code
602  *
603  * \sa amdgpu_device_initialize()
604  *
605 */
606 int amdgpu_device_deinitialize(amdgpu_device_handle device_handle);
607
608
609 /*
610  * Memory Management
611  *
612 */
613
614 /**
615  * Allocate memory to be used by UMD for GPU related operations
616  *
617  * \param   dev          - \c [in] Device handle.
618  *                                 See #amdgpu_device_initialize()
619  * \param   alloc_buffer - \c [in] Pointer to the structure describing an
620  *                                 allocation request
621  * \param   info         - \c [out] Pointer to structure which return
622  *                                  information about allocated memory
623  *
624  * \return   0 on success\n
625  *          >0 - AMD specific error code\n
626  *          <0 - Negative POSIX Error code
627  *
628  * \sa amdgpu_bo_free()
629 */
630 int amdgpu_bo_alloc(amdgpu_device_handle dev,
631                     struct amdgpu_bo_alloc_request *alloc_buffer,
632                     struct amdgpu_bo_alloc_result *info);
633
634 /**
635  * Associate opaque data with buffer to be queried by another UMD
636  *
637  * \param   dev        - \c [in] Device handle. See #amdgpu_device_initialize()
638  * \param   buf_handle - \c [in] Buffer handle
639  * \param   info       - \c [in] Metadata to associated with buffer
640  *
641  * \return   0 on success\n
642  *          >0 - AMD specific error code\n
643  *          <0 - Negative POSIX Error code
644 */
645 int amdgpu_bo_set_metadata(amdgpu_bo_handle buf_handle,
646                            struct amdgpu_bo_metadata *info);
647
648 /**
649  * Query buffer information including metadata previusly associated with
650  * buffer.
651  *
652  * \param   dev        - \c [in] Device handle.
653  *                               See #amdgpu_device_initialize()
654  * \param   buf_handle - \c [in]   Buffer handle
655  * \param   info       - \c [out]  Structure describing buffer
656  *
657  * \return   0 on success\n
658  *          >0 - AMD specific error code\n
659  *          <0 - Negative POSIX Error code
660  *
661  * \sa amdgpu_bo_set_metadata(), amdgpu_bo_alloc()
662 */
663 int amdgpu_bo_query_info(amdgpu_bo_handle buf_handle,
664                          struct amdgpu_bo_info *info);
665
666 /**
667  * Allow others to get access to buffer
668  *
669  * \param   dev           - \c [in] Device handle.
670  *                                  See #amdgpu_device_initialize()
671  * \param   buf_handle    - \c [in] Buffer handle
672  * \param   type          - \c [in] Type of handle requested
673  * \param   shared_handle - \c [out] Special "shared" handle
674  *
675  * \return   0 on success\n
676  *          >0 - AMD specific error code\n
677  *          <0 - Negative POSIX Error code
678  *
679  * \sa amdgpu_bo_import()
680  *
681 */
682 int amdgpu_bo_export(amdgpu_bo_handle buf_handle,
683                      enum amdgpu_bo_handle_type type,
684                      uint32_t *shared_handle);
685
686 /**
687  * Request access to "shared" buffer
688  *
689  * \param   dev           - \c [in] Device handle.
690  *                                  See #amdgpu_device_initialize()
691  * \param   type          - \c [in] Type of handle requested
692  * \param   shared_handle - \c [in] Shared handle received as result "import"
693  *                                   operation
694  * \param   output        - \c [out] Pointer to structure with information
695  *                                   about imported buffer
696  *
697  * \return   0 on success\n
698  *          >0 - AMD specific error code\n
699  *          <0 - Negative POSIX Error code
700  *
701  * \note  Buffer must be "imported" only using new "fd" (different from
702  *        one used by "exporter").
703  *
704  * \sa amdgpu_bo_export()
705  *
706 */
707 int amdgpu_bo_import(amdgpu_device_handle dev,
708                      enum amdgpu_bo_handle_type type,
709                      uint32_t shared_handle,
710                      struct amdgpu_bo_import_result *output);
711
712 /**
713  * Free previosuly allocated memory
714  *
715  * \param   dev        - \c [in] Device handle. See #amdgpu_device_initialize()
716  * \param   buf_handle - \c [in]  Buffer handle to free
717  *
718  * \return   0 on success\n
719  *          >0 - AMD specific error code\n
720  *          <0 - Negative POSIX Error code
721  *
722  * \note In the case of memory shared between different applications all
723  *       resources will be “physically” freed only all such applications
724  *       will be terminated
725  * \note If is UMD responsibility to ‘free’ buffer only when there is no
726  *       more GPU access
727  *
728  * \sa amdgpu_bo_set_metadata(), amdgpu_bo_alloc()
729  *
730 */
731 int amdgpu_bo_free(amdgpu_bo_handle buf_handle);
732
733 /**
734  * Request CPU access to GPU accessable memory
735  *
736  * \param   buf_handle - \c [in] Buffer handle
737  * \param   cpu        - \c [out] CPU address to be used for access
738  *
739  * \return   0 on success\n
740  *          >0 - AMD specific error code\n
741  *          <0 - Negative POSIX Error code
742  *
743  * \sa amdgpu_bo_cpu_unmap()
744  *
745 */
746 int 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 - AMD specific error code\n
755  *          <0 - Negative POSIX Error code
756  *
757  * \sa amdgpu_bo_cpu_map()
758  *
759 */
760 int amdgpu_bo_cpu_unmap(amdgpu_bo_handle buf_handle);
761
762
763 /**
764  * Wait until a buffer is not used by the device.
765  *
766  * \param   dev           - \c [in] Device handle. See #amdgpu_lib_initialize()
767  * \param   buf_handle    - \c [in] Buffer handle.
768  * \param   timeout_ns    - Timeout in nanoseconds.
769  * \param   buffer_busy   - 0 if buffer is idle, all GPU access was completed
770  *                            and no GPU access is scheduled.
771  *                          1 GPU access is in fly or scheduled
772  *
773  * \return   0 - on success
774  *          <0 - AMD specific error code
775  */
776 int amdgpu_bo_wait_for_idle(amdgpu_bo_handle buf_handle,
777                             uint64_t timeout_ns,
778                             bool *buffer_busy);
779
780 /**
781  * Creates a BO list handle for command submission.
782  *
783  * \param   dev                 - \c [in] Device handle.
784  *                                 See #amdgpu_device_initialize()
785  * \param   number_of_resources - \c [in] Number of BOs in the list
786  * \param   resources           - \c [in] List of BO handles
787  * \param   resource_prios      - \c [in] Optional priority for each handle
788  * \param   result              - \c [out] Created BO list handle
789  *
790  * \return   0 on success\n
791  *          >0 - AMD specific error code\n
792  *          <0 - Negative POSIX Error code
793  *
794  * \sa amdgpu_bo_list_destroy()
795 */
796 int amdgpu_bo_list_create(amdgpu_device_handle dev,
797                           uint32_t number_of_resources,
798                           amdgpu_bo_handle *resources,
799                           uint8_t *resource_prios,
800                           amdgpu_bo_list_handle *result);
801
802 /**
803  * Destroys a BO list handle.
804  *
805  * \param   handle      - \c [in] BO list handle.
806  *
807  * \return   0 on success\n
808  *          >0 - AMD specific error code\n
809  *          <0 - Negative POSIX Error code
810  *
811  * \sa amdgpu_bo_list_create()
812 */
813 int amdgpu_bo_list_destroy(amdgpu_bo_list_handle handle);
814
815 /*
816  * Special GPU Resources
817  *
818 */
819
820
821
822 /**
823  * Query information about GDS
824  *
825  * \param   dev      - \c [in] Device handle. See #amdgpu_device_initialize()
826  * \param   gds_info - \c [out] Pointer to structure to get GDS information
827  *
828  * \return   0 on success\n
829  *          >0 - AMD specific error code\n
830  *          <0 - Negative POSIX Error code
831  *
832 */
833 int amdgpu_gpu_resource_query_gds_info(amdgpu_device_handle dev,
834                                         struct amdgpu_gds_resource_info *
835                                                                 gds_info);
836
837
838 /**
839  * Allocate GDS partitions
840  *
841  * \param   dev        - \c [in] Device handle. See #amdgpu_device_initialize()
842  * \param   gds_size   - \c [in] Size of gds allocation. Must be aligned
843  *                              accordingly.
844  * \param   alloc_info - \c [out] Pointer to structure to receive information
845  *                                about allocation
846  *
847  * \return   0 on success\n
848  *          >0 - AMD specific error code\n
849  *          <0 - Negative POSIX Error code
850  *
851  *
852 */
853 int amdgpu_gpu_resource_gds_alloc(amdgpu_device_handle dev,
854                                    uint32_t gds_size,
855                                    struct amdgpu_gds_alloc_info *alloc_info);
856
857
858
859
860 /**
861  * Release GDS resource. When GDS and associated resources not needed any
862  * more UMD should free them
863  *
864  * \param   dev    - \c [in] Device handle. See #amdgpu_device_initialize()
865  * \param   handle - \c [in] Handle assigned to GDS allocation
866  *
867  * \return   0 on success\n
868  *          >0 - AMD specific error code\n
869  *          <0 - Negative POSIX Error code
870  *
871 */
872 int amdgpu_gpu_resource_gds_free(amdgpu_bo_handle handle);
873
874
875
876 /*
877  * GPU Execution context
878  *
879 */
880
881 /**
882  * Create GPU execution Context
883  *
884  * For the purpose of GPU Scheduler and GPU Robustness extensions it is
885  * necessary to have information/identify rendering/compute contexts.
886  * It also may be needed to associate some specific requirements with such
887  * contexts.  Kernel driver will guarantee that submission from the same
888  * context will always be executed in order (first come, first serve).
889  *
890  *
891  * \param   dev     - \c [in] Device handle. See #amdgpu_device_initialize()
892  * \param   context - \c [out] GPU Context handle
893  *
894  * \return   0 on success\n
895  *          >0 - AMD specific error code\n
896  *          <0 - Negative POSIX Error code
897  *
898  * \sa amdgpu_cs_ctx_free()
899  *
900 */
901 int amdgpu_cs_ctx_create(amdgpu_device_handle dev,
902                          amdgpu_context_handle *context);
903
904 /**
905  *
906  * Destroy GPU execution context when not needed any more
907  *
908  * \param   context - \c [in] GPU Context handle
909  *
910  * \return   0 on success\n
911  *          >0 - AMD specific error code\n
912  *          <0 - Negative POSIX Error code
913  *
914  * \sa amdgpu_cs_ctx_create()
915  *
916 */
917 int amdgpu_cs_ctx_free(amdgpu_context_handle context);
918
919 /**
920  * Query reset state for the specific GPU Context
921  *
922  * \param   context - \c [in]  GPU Context handle
923  * \param   state   - \c [out] Reset state status
924  *
925  * \return   0 on success\n
926  *          >0 - AMD specific error code\n
927  *          <0 - Negative POSIX Error code
928  *
929  * \sa amdgpu_cs_ctx_create()
930  *
931 */
932 int amdgpu_cs_query_reset_state(amdgpu_context_handle context,
933                                 enum amdgpu_cs_ctx_reset_state *state);
934
935
936 /*
937  * Command Buffers Management
938  *
939 */
940
941
942 /**
943  * Allocate memory to be filled with PM4 packets and be served as the first
944  * entry point of execution (a.k.a. Indirect Buffer)
945  *
946  * \param   context - \c [in]  GPU Context which will use IB
947  * \param   ib_size - \c [in]  Size of allocation
948  * \param   output  - \c [out] Pointer to structure to get information about
949  *                                 allocated IB
950  *
951  * \return   0 on success\n
952  *          >0 - AMD specific error code\n
953  *          <0 - Negative POSIX Error code
954  *
955  * \sa amdgpu_cs_free_ib()
956  *
957 */
958 int amdgpu_cs_alloc_ib(amdgpu_context_handle context,
959                        enum amdgpu_cs_ib_size ib_size,
960                        struct amdgpu_cs_ib_alloc_result *output);
961
962 /**
963  * If UMD has allocates IBs which doesn’t need any more than those IBs must
964  * be explicitly freed
965  *
966  * \param   handle  - \c [in] IB handle
967  *
968  * \return   0 on success\n
969  *          >0 - AMD specific error code\n
970  *          <0 - Negative POSIX Error code
971  *
972  * \note Libdrm_amdgpu will guarantee that it will correctly detect when it
973  *      is safe to return IB to free pool
974  *
975  * \sa amdgpu_cs_alloc_ib()
976  *
977 */
978 int amdgpu_cs_free_ib(amdgpu_ib_handle handle);
979
980 /**
981  * Send request to submit command buffers to hardware.
982  *
983  * Kernel driver could use GPU Scheduler to make decision when physically
984  * sent this request to the hardware. Accordingly this request could be put
985  * in queue and sent for execution later. The only guarantee is that request
986  * from the same GPU context to the same ip:ip_instance:ring will be executed in
987  * order.
988  *
989  *
990  * \param   dev                - \c [in]  Device handle.
991  *                                        See #amdgpu_device_initialize()
992  * \param   context            - \c [in]  GPU Context
993  * \param   flags              - \c [in]  Global submission flags
994  * \param   ibs_request        - \c [in]  Pointer to submission requests.
995  *                                        We could submit to the several
996  *                                        engines/rings simulteniously as
997  *                                        'atomic' operation
998  * \param   number_of_requests - \c [in]  Number of submission requests
999  * \param   fences             - \c [out] Pointer to array of data to get
1000  *                                        fences to identify submission
1001  *                                        requests. Timestamps are valid
1002  *                                        in this GPU context and could be used
1003  *                                        to identify/detect completion of
1004  *                                        submission request
1005  *
1006  * \return   0 on success\n
1007  *          >0 - AMD specific error code\n
1008  *          <0 - Negative POSIX Error code
1009  *
1010  * \note It is assumed that by default IB will be returned to free pool
1011  *       automatically by libdrm_amdgpu when submission will completed.
1012  *       It is possible for UMD to make decision to re-use the same IB in
1013  *       this case it should be explicitly freed.\n
1014  *       Accordingly, by default, after submission UMD should not touch passed
1015  *       IBs. If UMD needs to re-use IB then the special flag AMDGPU_CS_REUSE_IB
1016  *       must be passed.
1017  *
1018  * \note It is required to pass correct resource list with buffer handles
1019  *       which will be accessible by command buffers from submission
1020  *       This will allow kernel driver to correctly implement "paging".
1021  *       Failure to do so will have unpredictable results.
1022  *
1023  * \sa amdgpu_command_buffer_alloc(), amdgpu_command_buffer_free(),
1024  *     amdgpu_cs_query_fence_status()
1025  *
1026 */
1027 int amdgpu_cs_submit(amdgpu_context_handle context,
1028                      uint64_t flags,
1029                      struct amdgpu_cs_request *ibs_request,
1030                      uint32_t number_of_requests,
1031                      uint64_t *fences);
1032
1033 /**
1034  *  Query status of Command Buffer Submission
1035  *
1036  * \param   dev     - \c [in] Device handle. See #amdgpu_device_initialize()
1037  * \param   fence   - \c [in] Structure describing fence to query
1038  * \param   expired - \c [out] If fence expired or not.\n
1039  *                              0  – if fence is not expired\n
1040  *                              !0 - otherwise
1041  *
1042  * \return   0 on success\n
1043  *          >0 - AMD specific error code\n
1044  *          <0 - Negative POSIX Error code
1045  *
1046  * \note If UMD wants only to check operation status and returned immediately
1047  *       then timeout value as 0 must be passed. In this case success will be
1048  *       returned in the case if submission was completed or timeout error
1049  *       code.
1050  *
1051  * \sa amdgpu_cs_submit()
1052 */
1053 int amdgpu_cs_query_fence_status(struct amdgpu_cs_query_fence *fence,
1054                                  uint32_t *expired);
1055
1056
1057 /*
1058  * Query / Info API
1059  *
1060 */
1061
1062
1063 /**
1064  * Query allocation size alignments
1065  *
1066  * UMD should query information about GPU VM MC size alignments requirements
1067  * to be able correctly choose required allocation size and implement
1068  * internal optimization if needed.
1069  *
1070  * \param   dev  - \c [in] Device handle. See #amdgpu_device_initialize()
1071  * \param   info - \c [out] Pointer to structure to get size alignment
1072  *                        requirements
1073  *
1074  * \return   0 on success\n
1075  *          >0 - AMD specific error code\n
1076  *          <0 - Negative POSIX Error code
1077  *
1078 */
1079 int amdgpu_query_buffer_size_alignment(amdgpu_device_handle dev,
1080                                         struct amdgpu_buffer_size_alignments
1081                                                                         *info);
1082
1083
1084
1085 /**
1086  * Query firmware versions
1087  *
1088  * \param   dev         - \c [in] Device handle. See #amdgpu_device_initialize()
1089  * \param   fw_type     - \c [in] AMDGPU_INFO_FW_*
1090  * \param   ip_instance - \c [in] Index of the IP block of the same type.
1091  * \param   index       - \c [in] Index of the engine. (for SDMA and MEC)
1092  * \param   version     - \c [out] Pointer to to the "version" return value
1093  * \param   feature     - \c [out] Pointer to to the "feature" return value
1094  *
1095  * \return   0 on success\n
1096  *          >0 - AMD specific error code\n
1097  *          <0 - Negative POSIX Error code
1098  *
1099 */
1100 int amdgpu_query_firmware_version(amdgpu_device_handle dev, unsigned fw_type,
1101                                   unsigned ip_instance, unsigned index,
1102                                   uint32_t *version, uint32_t *feature);
1103
1104
1105
1106 /**
1107  * Query the number of HW IP instances of a certain type.
1108  *
1109  * \param   dev      - \c [in] Device handle. See #amdgpu_device_initialize()
1110  * \param   type     - \c [in] Hardware IP block type = AMDGPU_HW_IP_*
1111  * \param   count    - \c [out] Pointer to structure to get information
1112  *
1113  * \return   0 on success\n
1114  *          >0 - AMD specific error code\n
1115  *          <0 - Negative POSIX Error code
1116 */
1117 int amdgpu_query_hw_ip_count(amdgpu_device_handle dev, unsigned type,
1118                              uint32_t *count);
1119
1120
1121
1122 /**
1123  * Query engine information
1124  *
1125  * This query allows UMD to query information different engines and their
1126  * capabilities.
1127  *
1128  * \param   dev         - \c [in] Device handle. See #amdgpu_device_initialize()
1129  * \param   type        - \c [in] Hardware IP block type = AMDGPU_HW_IP_*
1130  * \param   ip_instance - \c [in] Index of the IP block of the same type.
1131  * \param   info        - \c [out] Pointer to structure to get information
1132  *
1133  * \return   0 on success\n
1134  *          >0 - AMD specific error code\n
1135  *          <0 - Negative POSIX Error code
1136 */
1137 int amdgpu_query_hw_ip_info(amdgpu_device_handle dev, unsigned type,
1138                             unsigned ip_instance,
1139                             struct drm_amdgpu_info_hw_ip *info);
1140
1141
1142
1143
1144 /**
1145  * Query heap information
1146  *
1147  * This query allows UMD to query potentially available memory resources and
1148  * adjust their logic if necessary.
1149  *
1150  * \param   dev  - \c [in] Device handle. See #amdgpu_device_initialize()
1151  * \param   heap - \c [in] Heap type
1152  * \param   info - \c [in] Pointer to structure to get needed information
1153  *
1154  * \return   0 on success\n
1155  *          >0 - AMD specific error code\n
1156  *          <0 - Negative POSIX Error code
1157  *
1158 */
1159 int amdgpu_query_heap_info(amdgpu_device_handle dev,
1160                             uint32_t heap,
1161                                 uint32_t flags,
1162                             struct amdgpu_heap_info *info);
1163
1164
1165
1166 /**
1167  * Get the CRTC ID from the mode object ID
1168  *
1169  * \param   dev    - \c [in] Device handle. See #amdgpu_device_initialize()
1170  * \param   id     - \c [in] Mode object ID
1171  * \param   result - \c [in] Pointer to the CRTC ID
1172  *
1173  * \return   0 on success\n
1174  *          >0 - AMD specific error code\n
1175  *          <0 - Negative POSIX Error code
1176  *
1177 */
1178 int amdgpu_query_crtc_from_id(amdgpu_device_handle dev, unsigned id,
1179                               int32_t *result);
1180
1181
1182
1183 /**
1184  * Query GPU H/w Info
1185  *
1186  * Query hardware specific information
1187  *
1188  * \param   dev  - \c [in] Device handle. See #amdgpu_device_initialize()
1189  * \param   heap - \c [in] Heap type
1190  * \param   info - \c [in] Pointer to structure to get needed information
1191  *
1192  * \return   0 on success\n
1193  *          >0 - AMD specific error code\n
1194  *          <0 - Negative POSIX Error code
1195  *
1196 */
1197 int amdgpu_query_gpu_info(amdgpu_device_handle dev,
1198                            struct amdgpu_gpu_info *info);
1199
1200
1201
1202 /**
1203  * Query hardware or driver information.
1204  *
1205  * The return size is query-specific and depends on the "info_id" parameter.
1206  * No more than "size" bytes is returned.
1207  *
1208  * \param   dev     - \c [in] Device handle. See #amdgpu_device_initialize()
1209  * \param   info_id - \c [in] AMDGPU_INFO_*
1210  * \param   size    - \c [in] Size of the returned value.
1211  * \param   value   - \c [out] Pointer to the return value.
1212  *
1213  * \return   0 on success\n
1214  *          >0 - AMD specific error code\n
1215  *          <0 - Negative POSIX error code
1216  *
1217 */
1218 int amdgpu_query_info(amdgpu_device_handle dev, unsigned info_id,
1219                       unsigned size, void *value);
1220
1221
1222
1223 /**
1224  * Read a set of consecutive memory-mapped registers.
1225  * Not all registers are allowed to be read by userspace.
1226  *
1227  * \param   dev          - \c [in] Device handle. See #amdgpu_device_initialize(
1228  * \param   dword_offset - \c [in] Register offset in dwords
1229  * \param   count        - \c [in] The number of registers to read starting
1230  *                                 from the offset
1231  * \param   instance     - \c [in] GRBM_GFX_INDEX selector. It may have other
1232  *                                 uses. Set it to 0xffffffff if unsure.
1233  * \param   flags        - \c [in] Flags with additional information.
1234  * \param   values       - \c [out] The pointer to return values.
1235  *
1236  * \return   0 on success\n
1237  *          >0 - AMD specific error code\n
1238  *          <0 - Negative POSIX error code
1239  *
1240 */
1241 int amdgpu_read_mm_registers(amdgpu_device_handle dev, unsigned dword_offset,
1242                              unsigned count, uint32_t instance, uint32_t flags,
1243                              uint32_t *values);
1244
1245
1246
1247 /**
1248  * Request GPU access to user allocated memory e.g. via "malloc"
1249  *
1250  * \param dev - [in] Device handle. See #amdgpu_device_initialize()
1251  * \param cpu - [in] CPU address of user allocated memory which we
1252  * want to map to GPU address space (make GPU accessible)
1253  * (This address must be correctly aligned).
1254  * \param size - [in] Size of allocation (must be correctly aligned)
1255  * \param amdgpu_bo_alloc_result - [out] Handle of allocation to be passed as resource
1256  * on submission and be used in other operations.(e.g. for VA submission)
1257  * ( Temporally defined amdgpu_bo_alloc_result as parameter for return mc address. )
1258  *
1259  *
1260  * \return 0 on success
1261  * >0 - AMD specific error code
1262  * <0 - Negative POSIX Error code
1263  *
1264  *
1265  * \note
1266  * This call doesn't guarantee that such memory will be persistently
1267  * "locked" / make non-pageable. The purpose of this call is to provide
1268  * opportunity for GPU get access to this resource during submission.
1269  *
1270  * The maximum amount of memory which could be mapped in this call depends
1271  * if overcommit is disabled or not. If overcommit is disabled than the max.
1272  * amount of memory to be pinned will be limited by left "free" size in total
1273  * amount of memory which could be locked simultaneously ("GART" size).
1274  *
1275  * Supported (theoretical) max. size of mapping is restricted only by
1276  * "GART" size.
1277  *
1278  * It is responsibility of caller to correctly specify access rights
1279  * on VA assignment.
1280 */
1281 int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
1282                                     void *cpu,
1283                                     uint64_t size,
1284                                     struct amdgpu_bo_alloc_result *info);
1285
1286
1287 #endif /* #ifdef _AMDGPU_H_ */