1b8e80941Smrg/* 2b8e80941Smrg * Copyright © 2016 Red Hat. 3b8e80941Smrg * Copyright © 2016 Bas Nieuwenhuizen 4b8e80941Smrg * 5b8e80941Smrg * Based on radeon_winsys.h which is: 6b8e80941Smrg * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 7b8e80941Smrg * Copyright 2010 Marek Olšák <maraeo@gmail.com> 8b8e80941Smrg * 9b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 10b8e80941Smrg * copy of this software and associated documentation files (the "Software"), 11b8e80941Smrg * to deal in the Software without restriction, including without limitation 12b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the 14b8e80941Smrg * Software is furnished to do so, subject to the following conditions: 15b8e80941Smrg * 16b8e80941Smrg * The above copyright notice and this permission notice (including the next 17b8e80941Smrg * paragraph) shall be included in all copies or substantial portions of the 18b8e80941Smrg * Software. 19b8e80941Smrg * 20b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21b8e80941Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24b8e80941Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25b8e80941Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 26b8e80941Smrg * IN THE SOFTWARE. 27b8e80941Smrg */ 28b8e80941Smrg 29b8e80941Smrg#ifndef RADV_RADEON_WINSYS_H 30b8e80941Smrg#define RADV_RADEON_WINSYS_H 31b8e80941Smrg 32b8e80941Smrg#include <stdio.h> 33b8e80941Smrg#include <stdint.h> 34b8e80941Smrg#include <stdbool.h> 35b8e80941Smrg#include <stdlib.h> 36b8e80941Smrg#include "main/macros.h" 37b8e80941Smrg#include "amd_family.h" 38b8e80941Smrg 39b8e80941Smrgstruct radeon_info; 40b8e80941Smrgstruct ac_surf_info; 41b8e80941Smrgstruct radeon_surf; 42b8e80941Smrg 43b8e80941Smrg#define FREE(x) free(x) 44b8e80941Smrg 45b8e80941Smrgenum radeon_bo_domain { /* bitfield */ 46b8e80941Smrg RADEON_DOMAIN_GTT = 2, 47b8e80941Smrg RADEON_DOMAIN_VRAM = 4, 48b8e80941Smrg RADEON_DOMAIN_VRAM_GTT = RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT 49b8e80941Smrg}; 50b8e80941Smrg 51b8e80941Smrgenum radeon_bo_flag { /* bitfield */ 52b8e80941Smrg RADEON_FLAG_GTT_WC = (1 << 0), 53b8e80941Smrg RADEON_FLAG_CPU_ACCESS = (1 << 1), 54b8e80941Smrg RADEON_FLAG_NO_CPU_ACCESS = (1 << 2), 55b8e80941Smrg RADEON_FLAG_VIRTUAL = (1 << 3), 56b8e80941Smrg RADEON_FLAG_VA_UNCACHED = (1 << 4), 57b8e80941Smrg RADEON_FLAG_IMPLICIT_SYNC = (1 << 5), 58b8e80941Smrg RADEON_FLAG_NO_INTERPROCESS_SHARING = (1 << 6), 59b8e80941Smrg RADEON_FLAG_READ_ONLY = (1 << 7), 60b8e80941Smrg RADEON_FLAG_32BIT = (1 << 8), 61b8e80941Smrg RADEON_FLAG_PREFER_LOCAL_BO = (1 << 9), 62b8e80941Smrg}; 63b8e80941Smrg 64b8e80941Smrgenum radeon_bo_usage { /* bitfield */ 65b8e80941Smrg RADEON_USAGE_READ = 2, 66b8e80941Smrg RADEON_USAGE_WRITE = 4, 67b8e80941Smrg RADEON_USAGE_READWRITE = RADEON_USAGE_READ | RADEON_USAGE_WRITE 68b8e80941Smrg}; 69b8e80941Smrg 70b8e80941Smrgenum ring_type { 71b8e80941Smrg RING_GFX = 0, 72b8e80941Smrg RING_COMPUTE, 73b8e80941Smrg RING_DMA, 74b8e80941Smrg RING_UVD, 75b8e80941Smrg RING_VCE, 76b8e80941Smrg RING_LAST, 77b8e80941Smrg}; 78b8e80941Smrg 79b8e80941Smrgenum radeon_ctx_priority { 80b8e80941Smrg RADEON_CTX_PRIORITY_INVALID = -1, 81b8e80941Smrg RADEON_CTX_PRIORITY_LOW = 0, 82b8e80941Smrg RADEON_CTX_PRIORITY_MEDIUM, 83b8e80941Smrg RADEON_CTX_PRIORITY_HIGH, 84b8e80941Smrg RADEON_CTX_PRIORITY_REALTIME, 85b8e80941Smrg}; 86b8e80941Smrg 87b8e80941Smrgenum radeon_value_id { 88b8e80941Smrg RADEON_ALLOCATED_VRAM, 89b8e80941Smrg RADEON_ALLOCATED_VRAM_VIS, 90b8e80941Smrg RADEON_ALLOCATED_GTT, 91b8e80941Smrg RADEON_TIMESTAMP, 92b8e80941Smrg RADEON_NUM_BYTES_MOVED, 93b8e80941Smrg RADEON_NUM_EVICTIONS, 94b8e80941Smrg RADEON_NUM_VRAM_CPU_PAGE_FAULTS, 95b8e80941Smrg RADEON_VRAM_USAGE, 96b8e80941Smrg RADEON_VRAM_VIS_USAGE, 97b8e80941Smrg RADEON_GTT_USAGE, 98b8e80941Smrg RADEON_GPU_TEMPERATURE, 99b8e80941Smrg RADEON_CURRENT_SCLK, 100b8e80941Smrg RADEON_CURRENT_MCLK, 101b8e80941Smrg}; 102b8e80941Smrg 103b8e80941Smrgstruct radeon_cmdbuf { 104b8e80941Smrg unsigned cdw; /* Number of used dwords. */ 105b8e80941Smrg unsigned max_dw; /* Maximum number of dwords. */ 106b8e80941Smrg uint32_t *buf; /* The base pointer of the chunk. */ 107b8e80941Smrg}; 108b8e80941Smrg 109b8e80941Smrg#define RADEON_SURF_TYPE_MASK 0xFF 110b8e80941Smrg#define RADEON_SURF_TYPE_SHIFT 0 111b8e80941Smrg#define RADEON_SURF_TYPE_1D 0 112b8e80941Smrg#define RADEON_SURF_TYPE_2D 1 113b8e80941Smrg#define RADEON_SURF_TYPE_3D 2 114b8e80941Smrg#define RADEON_SURF_TYPE_CUBEMAP 3 115b8e80941Smrg#define RADEON_SURF_TYPE_1D_ARRAY 4 116b8e80941Smrg#define RADEON_SURF_TYPE_2D_ARRAY 5 117b8e80941Smrg#define RADEON_SURF_MODE_MASK 0xFF 118b8e80941Smrg#define RADEON_SURF_MODE_SHIFT 8 119b8e80941Smrg 120b8e80941Smrg#define RADEON_SURF_GET(v, field) (((v) >> RADEON_SURF_ ## field ## _SHIFT) & RADEON_SURF_ ## field ## _MASK) 121b8e80941Smrg#define RADEON_SURF_SET(v, field) (((v) & RADEON_SURF_ ## field ## _MASK) << RADEON_SURF_ ## field ## _SHIFT) 122b8e80941Smrg#define RADEON_SURF_CLR(v, field) ((v) & ~(RADEON_SURF_ ## field ## _MASK << RADEON_SURF_ ## field ## _SHIFT)) 123b8e80941Smrg 124b8e80941Smrgenum radeon_bo_layout { 125b8e80941Smrg RADEON_LAYOUT_LINEAR = 0, 126b8e80941Smrg RADEON_LAYOUT_TILED, 127b8e80941Smrg RADEON_LAYOUT_SQUARETILED, 128b8e80941Smrg 129b8e80941Smrg RADEON_LAYOUT_UNKNOWN 130b8e80941Smrg}; 131b8e80941Smrg 132b8e80941Smrg/* Tiling info for display code, DRI sharing, and other data. */ 133b8e80941Smrgstruct radeon_bo_metadata { 134b8e80941Smrg /* Tiling flags describing the texture layout for display code 135b8e80941Smrg * and DRI sharing. 136b8e80941Smrg */ 137b8e80941Smrg union { 138b8e80941Smrg struct { 139b8e80941Smrg enum radeon_bo_layout microtile; 140b8e80941Smrg enum radeon_bo_layout macrotile; 141b8e80941Smrg unsigned pipe_config; 142b8e80941Smrg unsigned bankw; 143b8e80941Smrg unsigned bankh; 144b8e80941Smrg unsigned tile_split; 145b8e80941Smrg unsigned mtilea; 146b8e80941Smrg unsigned num_banks; 147b8e80941Smrg unsigned stride; 148b8e80941Smrg bool scanout; 149b8e80941Smrg } legacy; 150b8e80941Smrg 151b8e80941Smrg struct { 152b8e80941Smrg /* surface flags */ 153b8e80941Smrg unsigned swizzle_mode:5; 154b8e80941Smrg } gfx9; 155b8e80941Smrg } u; 156b8e80941Smrg 157b8e80941Smrg /* Additional metadata associated with the buffer, in bytes. 158b8e80941Smrg * The maximum size is 64 * 4. This is opaque for the winsys & kernel. 159b8e80941Smrg * Supported by amdgpu only. 160b8e80941Smrg */ 161b8e80941Smrg uint32_t size_metadata; 162b8e80941Smrg uint32_t metadata[64]; 163b8e80941Smrg}; 164b8e80941Smrg 165b8e80941Smrguint32_t syncobj_handle; 166b8e80941Smrgstruct radeon_winsys_fence; 167b8e80941Smrg 168b8e80941Smrgstruct radeon_winsys_bo { 169b8e80941Smrg uint64_t va; 170b8e80941Smrg bool is_local; 171b8e80941Smrg bool vram_cpu_access; 172b8e80941Smrg}; 173b8e80941Smrgstruct radv_winsys_sem_counts { 174b8e80941Smrg uint32_t syncobj_count; 175b8e80941Smrg uint32_t sem_count; 176b8e80941Smrg uint32_t *syncobj; 177b8e80941Smrg struct radeon_winsys_sem **sem; 178b8e80941Smrg}; 179b8e80941Smrg 180b8e80941Smrgstruct radv_winsys_sem_info { 181b8e80941Smrg bool cs_emit_signal; 182b8e80941Smrg bool cs_emit_wait; 183b8e80941Smrg struct radv_winsys_sem_counts wait; 184b8e80941Smrg struct radv_winsys_sem_counts signal; 185b8e80941Smrg}; 186b8e80941Smrg 187b8e80941Smrgstruct radv_winsys_bo_list { 188b8e80941Smrg struct radeon_winsys_bo **bos; 189b8e80941Smrg unsigned count; 190b8e80941Smrg}; 191b8e80941Smrg 192b8e80941Smrg/* Kernel effectively allows 0-31. This sets some priorities for fixed 193b8e80941Smrg * functionality buffers */ 194b8e80941Smrgenum { 195b8e80941Smrg RADV_BO_PRIORITY_APPLICATION_MAX = 28, 196b8e80941Smrg 197b8e80941Smrg /* virtual buffers have 0 priority since the priority is not used. */ 198b8e80941Smrg RADV_BO_PRIORITY_VIRTUAL = 0, 199b8e80941Smrg 200b8e80941Smrg /* This should be considerably lower than most of the stuff below, 201b8e80941Smrg * but how much lower is hard to say since we don't know application 202b8e80941Smrg * assignments. Put it pretty high since it is GTT anyway. */ 203b8e80941Smrg RADV_BO_PRIORITY_QUERY_POOL = 29, 204b8e80941Smrg 205b8e80941Smrg RADV_BO_PRIORITY_DESCRIPTOR = 30, 206b8e80941Smrg RADV_BO_PRIORITY_UPLOAD_BUFFER = 30, 207b8e80941Smrg RADV_BO_PRIORITY_FENCE = 30, 208b8e80941Smrg RADV_BO_PRIORITY_SHADER = 31, 209b8e80941Smrg RADV_BO_PRIORITY_SCRATCH = 31, 210b8e80941Smrg RADV_BO_PRIORITY_CS = 31, 211b8e80941Smrg}; 212b8e80941Smrg 213b8e80941Smrgstruct radeon_winsys { 214b8e80941Smrg void (*destroy)(struct radeon_winsys *ws); 215b8e80941Smrg 216b8e80941Smrg void (*query_info)(struct radeon_winsys *ws, 217b8e80941Smrg struct radeon_info *info); 218b8e80941Smrg 219b8e80941Smrg uint64_t (*query_value)(struct radeon_winsys *ws, 220b8e80941Smrg enum radeon_value_id value); 221b8e80941Smrg 222b8e80941Smrg bool (*read_registers)(struct radeon_winsys *ws, unsigned reg_offset, 223b8e80941Smrg unsigned num_registers, uint32_t *out); 224b8e80941Smrg 225b8e80941Smrg const char *(*get_chip_name)(struct radeon_winsys *ws); 226b8e80941Smrg 227b8e80941Smrg struct radeon_winsys_bo *(*buffer_create)(struct radeon_winsys *ws, 228b8e80941Smrg uint64_t size, 229b8e80941Smrg unsigned alignment, 230b8e80941Smrg enum radeon_bo_domain domain, 231b8e80941Smrg enum radeon_bo_flag flags, 232b8e80941Smrg unsigned priority); 233b8e80941Smrg 234b8e80941Smrg void (*buffer_destroy)(struct radeon_winsys_bo *bo); 235b8e80941Smrg void *(*buffer_map)(struct radeon_winsys_bo *bo); 236b8e80941Smrg 237b8e80941Smrg struct radeon_winsys_bo *(*buffer_from_ptr)(struct radeon_winsys *ws, 238b8e80941Smrg void *pointer, 239b8e80941Smrg uint64_t size, 240b8e80941Smrg unsigned priority); 241b8e80941Smrg 242b8e80941Smrg struct radeon_winsys_bo *(*buffer_from_fd)(struct radeon_winsys *ws, 243b8e80941Smrg int fd, 244b8e80941Smrg unsigned priority, 245b8e80941Smrg unsigned *stride, unsigned *offset); 246b8e80941Smrg 247b8e80941Smrg bool (*buffer_get_fd)(struct radeon_winsys *ws, 248b8e80941Smrg struct radeon_winsys_bo *bo, 249b8e80941Smrg int *fd); 250b8e80941Smrg 251b8e80941Smrg void (*buffer_unmap)(struct radeon_winsys_bo *bo); 252b8e80941Smrg 253b8e80941Smrg void (*buffer_set_metadata)(struct radeon_winsys_bo *bo, 254b8e80941Smrg struct radeon_bo_metadata *md); 255b8e80941Smrg void (*buffer_get_metadata)(struct radeon_winsys_bo *bo, 256b8e80941Smrg struct radeon_bo_metadata *md); 257b8e80941Smrg 258b8e80941Smrg void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent, 259b8e80941Smrg uint64_t offset, uint64_t size, 260b8e80941Smrg struct radeon_winsys_bo *bo, uint64_t bo_offset); 261b8e80941Smrg struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws, 262b8e80941Smrg enum radeon_ctx_priority priority); 263b8e80941Smrg void (*ctx_destroy)(struct radeon_winsys_ctx *ctx); 264b8e80941Smrg 265b8e80941Smrg bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx, 266b8e80941Smrg enum ring_type ring_type, int ring_index); 267b8e80941Smrg 268b8e80941Smrg struct radeon_cmdbuf *(*cs_create)(struct radeon_winsys *ws, 269b8e80941Smrg enum ring_type ring_type); 270b8e80941Smrg 271b8e80941Smrg void (*cs_destroy)(struct radeon_cmdbuf *cs); 272b8e80941Smrg 273b8e80941Smrg void (*cs_reset)(struct radeon_cmdbuf *cs); 274b8e80941Smrg 275b8e80941Smrg bool (*cs_finalize)(struct radeon_cmdbuf *cs); 276b8e80941Smrg 277b8e80941Smrg void (*cs_grow)(struct radeon_cmdbuf * cs, size_t min_size); 278b8e80941Smrg 279b8e80941Smrg int (*cs_submit)(struct radeon_winsys_ctx *ctx, 280b8e80941Smrg int queue_index, 281b8e80941Smrg struct radeon_cmdbuf **cs_array, 282b8e80941Smrg unsigned cs_count, 283b8e80941Smrg struct radeon_cmdbuf *initial_preamble_cs, 284b8e80941Smrg struct radeon_cmdbuf *continue_preamble_cs, 285b8e80941Smrg struct radv_winsys_sem_info *sem_info, 286b8e80941Smrg const struct radv_winsys_bo_list *bo_list, /* optional */ 287b8e80941Smrg bool can_patch, 288b8e80941Smrg struct radeon_winsys_fence *fence); 289b8e80941Smrg 290b8e80941Smrg void (*cs_add_buffer)(struct radeon_cmdbuf *cs, 291b8e80941Smrg struct radeon_winsys_bo *bo); 292b8e80941Smrg 293b8e80941Smrg void (*cs_execute_secondary)(struct radeon_cmdbuf *parent, 294b8e80941Smrg struct radeon_cmdbuf *child); 295b8e80941Smrg 296b8e80941Smrg void (*cs_dump)(struct radeon_cmdbuf *cs, FILE* file, const int *trace_ids, int trace_id_count); 297b8e80941Smrg 298b8e80941Smrg int (*surface_init)(struct radeon_winsys *ws, 299b8e80941Smrg const struct ac_surf_info *surf_info, 300b8e80941Smrg struct radeon_surf *surf); 301b8e80941Smrg 302b8e80941Smrg struct radeon_winsys_fence *(*create_fence)(); 303b8e80941Smrg void (*destroy_fence)(struct radeon_winsys_fence *fence); 304b8e80941Smrg bool (*fence_wait)(struct radeon_winsys *ws, 305b8e80941Smrg struct radeon_winsys_fence *fence, 306b8e80941Smrg bool absolute, 307b8e80941Smrg uint64_t timeout); 308b8e80941Smrg bool (*fences_wait)(struct radeon_winsys *ws, 309b8e80941Smrg struct radeon_winsys_fence *const *fences, 310b8e80941Smrg uint32_t fence_count, 311b8e80941Smrg bool wait_all, 312b8e80941Smrg uint64_t timeout); 313b8e80941Smrg 314b8e80941Smrg /* old semaphores - non shareable */ 315b8e80941Smrg struct radeon_winsys_sem *(*create_sem)(struct radeon_winsys *ws); 316b8e80941Smrg void (*destroy_sem)(struct radeon_winsys_sem *sem); 317b8e80941Smrg 318b8e80941Smrg /* new shareable sync objects */ 319b8e80941Smrg int (*create_syncobj)(struct radeon_winsys *ws, uint32_t *handle); 320b8e80941Smrg void (*destroy_syncobj)(struct radeon_winsys *ws, uint32_t handle); 321b8e80941Smrg 322b8e80941Smrg void (*reset_syncobj)(struct radeon_winsys *ws, uint32_t handle); 323b8e80941Smrg void (*signal_syncobj)(struct radeon_winsys *ws, uint32_t handle); 324b8e80941Smrg bool (*wait_syncobj)(struct radeon_winsys *ws, const uint32_t *handles, uint32_t handle_count, 325b8e80941Smrg bool wait_all, uint64_t timeout); 326b8e80941Smrg 327b8e80941Smrg int (*export_syncobj)(struct radeon_winsys *ws, uint32_t syncobj, int *fd); 328b8e80941Smrg int (*import_syncobj)(struct radeon_winsys *ws, int fd, uint32_t *syncobj); 329b8e80941Smrg 330b8e80941Smrg int (*export_syncobj_to_sync_file)(struct radeon_winsys *ws, uint32_t syncobj, int *fd); 331b8e80941Smrg 332b8e80941Smrg /* Note that this, unlike the normal import, uses an existing syncobj. */ 333b8e80941Smrg int (*import_syncobj_from_sync_file)(struct radeon_winsys *ws, uint32_t syncobj, int fd); 334b8e80941Smrg 335b8e80941Smrg}; 336b8e80941Smrg 337b8e80941Smrgstatic inline void radeon_emit(struct radeon_cmdbuf *cs, uint32_t value) 338b8e80941Smrg{ 339b8e80941Smrg cs->buf[cs->cdw++] = value; 340b8e80941Smrg} 341b8e80941Smrg 342b8e80941Smrgstatic inline void radeon_emit_array(struct radeon_cmdbuf *cs, 343b8e80941Smrg const uint32_t *values, unsigned count) 344b8e80941Smrg{ 345b8e80941Smrg memcpy(cs->buf + cs->cdw, values, count * 4); 346b8e80941Smrg cs->cdw += count; 347b8e80941Smrg} 348b8e80941Smrg 349b8e80941Smrgstatic inline uint64_t radv_buffer_get_va(struct radeon_winsys_bo *bo) 350b8e80941Smrg{ 351b8e80941Smrg return bo->va; 352b8e80941Smrg} 353b8e80941Smrg 354b8e80941Smrgstatic inline void radv_cs_add_buffer(struct radeon_winsys *ws, 355b8e80941Smrg struct radeon_cmdbuf *cs, 356b8e80941Smrg struct radeon_winsys_bo *bo) 357b8e80941Smrg{ 358b8e80941Smrg if (bo->is_local) 359b8e80941Smrg return; 360b8e80941Smrg 361b8e80941Smrg ws->cs_add_buffer(cs, bo); 362b8e80941Smrg} 363b8e80941Smrg 364b8e80941Smrg#endif /* RADV_RADEON_WINSYS_H */ 365