1 /* 2 * Copyright 2016 Red Hat. 3 * Copyright 2016 Bas Nieuwenhuizen 4 * 5 * Based on radeon_winsys.h which is: 6 * Copyright 2008 Corbin Simpson <MostAwesomeDude (at) gmail.com> 7 * Copyright 2010 Marek Olk <maraeo (at) gmail.com> 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the next 17 * paragraph) shall be included in all copies or substantial portions of the 18 * Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 26 * IN THE SOFTWARE. 27 */ 28 29 #ifndef RADV_RADEON_WINSYS_H 30 #define RADV_RADEON_WINSYS_H 31 32 #include <stdint.h> 33 #include <stdbool.h> 34 #include <stdlib.h> 35 #include "main/macros.h" 36 #include "amd_family.h" 37 38 #define FREE(x) free(x) 39 40 enum radeon_bo_domain { /* bitfield */ 41 RADEON_DOMAIN_GTT = 2, 42 RADEON_DOMAIN_VRAM = 4, 43 RADEON_DOMAIN_VRAM_GTT = RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT 44 }; 45 46 enum radeon_bo_flag { /* bitfield */ 47 RADEON_FLAG_GTT_WC = (1 << 0), 48 RADEON_FLAG_CPU_ACCESS = (1 << 1), 49 RADEON_FLAG_NO_CPU_ACCESS = (1 << 2), 50 }; 51 52 enum radeon_bo_usage { /* bitfield */ 53 RADEON_USAGE_READ = 2, 54 RADEON_USAGE_WRITE = 4, 55 RADEON_USAGE_READWRITE = RADEON_USAGE_READ | RADEON_USAGE_WRITE 56 }; 57 58 enum ring_type { 59 RING_GFX = 0, 60 RING_COMPUTE, 61 RING_DMA, 62 RING_UVD, 63 RING_VCE, 64 RING_LAST, 65 }; 66 67 struct radeon_winsys_cs { 68 unsigned cdw; /* Number of used dwords. */ 69 unsigned max_dw; /* Maximum number of dwords. */ 70 uint32_t *buf; /* The base pointer of the chunk. */ 71 }; 72 73 struct radeon_info { 74 /* PCI info: domain:bus:dev:func */ 75 uint32_t pci_domain; 76 uint32_t pci_bus; 77 uint32_t pci_dev; 78 uint32_t pci_func; 79 80 /* Device info. */ 81 uint32_t pci_id; 82 enum radeon_family family; 83 const char *name; 84 enum chip_class chip_class; 85 uint32_t gart_page_size; 86 uint64_t gart_size; 87 uint64_t vram_size; 88 uint64_t visible_vram_size; 89 bool has_dedicated_vram; 90 bool has_virtual_memory; 91 bool gfx_ib_pad_with_type2; 92 bool has_uvd; 93 uint32_t sdma_rings; 94 uint32_t compute_rings; 95 uint32_t vce_fw_version; 96 uint32_t vce_harvest_config; 97 uint32_t clock_crystal_freq; 98 99 /* Kernel info. */ 100 uint32_t drm_major; /* version */ 101 uint32_t drm_minor; 102 uint32_t drm_patchlevel; 103 bool has_userptr; 104 105 /* Shader cores. */ 106 uint32_t r600_max_quad_pipes; /* wave size / 16 */ 107 uint32_t max_shader_clock; 108 uint32_t num_good_compute_units; 109 uint32_t max_se; /* shader engines */ 110 uint32_t max_sh_per_se; /* shader arrays per shader engine */ 111 112 /* Render backends (color + depth blocks). */ 113 uint32_t r300_num_gb_pipes; 114 uint32_t r300_num_z_pipes; 115 uint32_t r600_gb_backend_map; /* R600 harvest config */ 116 bool r600_gb_backend_map_valid; 117 uint32_t r600_num_banks; 118 uint32_t num_render_backends; 119 uint32_t num_tile_pipes; /* pipe count from PIPE_CONFIG */ 120 uint32_t pipe_interleave_bytes; 121 uint32_t enabled_rb_mask; /* GCN harvest config */ 122 123 /* Tile modes. */ 124 uint32_t si_tile_mode_array[32]; 125 uint32_t cik_macrotile_mode_array[16]; 126 }; 127 128 #define RADEON_SURF_MAX_LEVEL 32 129 130 #define RADEON_SURF_TYPE_MASK 0xFF 131 #define RADEON_SURF_TYPE_SHIFT 0 132 #define RADEON_SURF_TYPE_1D 0 133 #define RADEON_SURF_TYPE_2D 1 134 #define RADEON_SURF_TYPE_3D 2 135 #define RADEON_SURF_TYPE_CUBEMAP 3 136 #define RADEON_SURF_TYPE_1D_ARRAY 4 137 #define RADEON_SURF_TYPE_2D_ARRAY 5 138 #define RADEON_SURF_MODE_MASK 0xFF 139 #define RADEON_SURF_MODE_SHIFT 8 140 #define RADEON_SURF_MODE_LINEAR_ALIGNED 1 141 #define RADEON_SURF_MODE_1D 2 142 #define RADEON_SURF_MODE_2D 3 143 #define RADEON_SURF_SCANOUT (1 << 16) 144 #define RADEON_SURF_ZBUFFER (1 << 17) 145 #define RADEON_SURF_SBUFFER (1 << 18) 146 #define RADEON_SURF_Z_OR_SBUFFER (RADEON_SURF_ZBUFFER | RADEON_SURF_SBUFFER) 147 #define RADEON_SURF_HAS_SBUFFER_MIPTREE (1 << 19) 148 #define RADEON_SURF_HAS_TILE_MODE_INDEX (1 << 20) 149 #define RADEON_SURF_FMASK (1 << 21) 150 #define RADEON_SURF_DISABLE_DCC (1 << 22) 151 152 #define RADEON_SURF_GET(v, field) (((v) >> RADEON_SURF_ ## field ## _SHIFT) & RADEON_SURF_ ## field ## _MASK) 153 #define RADEON_SURF_SET(v, field) (((v) & RADEON_SURF_ ## field ## _MASK) << RADEON_SURF_ ## field ## _SHIFT) 154 #define RADEON_SURF_CLR(v, field) ((v) & ~(RADEON_SURF_ ## field ## _MASK << RADEON_SURF_ ## field ## _SHIFT)) 155 156 struct radeon_surf_level { 157 uint64_t offset; 158 uint64_t slice_size; 159 uint32_t npix_x; 160 uint32_t npix_y; 161 uint32_t npix_z; 162 uint32_t nblk_x; 163 uint32_t nblk_y; 164 uint32_t nblk_z; 165 uint32_t pitch_bytes; 166 uint32_t mode; 167 uint64_t dcc_offset; 168 uint64_t dcc_fast_clear_size; 169 bool dcc_enabled; 170 }; 171 172 173 /* surface defintions from the winsys */ 174 struct radeon_surf { 175 /* These are inputs to the calculator. */ 176 uint32_t npix_x; 177 uint32_t npix_y; 178 uint32_t npix_z; 179 uint32_t blk_w; 180 uint32_t blk_h; 181 uint32_t blk_d; 182 uint32_t array_size; 183 uint32_t last_level; 184 uint32_t bpe; 185 uint32_t nsamples; 186 uint32_t flags; 187 188 /* These are return values. Some of them can be set by the caller, but 189 * they will be treated as hints (e.g. bankw, bankh) and might be 190 * changed by the calculator. 191 */ 192 uint64_t bo_size; 193 uint64_t bo_alignment; 194 /* This applies to EG and later. */ 195 uint32_t bankw; 196 uint32_t bankh; 197 uint32_t mtilea; 198 uint32_t tile_split; 199 uint32_t stencil_tile_split; 200 uint64_t stencil_offset; 201 struct radeon_surf_level level[RADEON_SURF_MAX_LEVEL]; 202 struct radeon_surf_level stencil_level[RADEON_SURF_MAX_LEVEL]; 203 uint32_t tiling_index[RADEON_SURF_MAX_LEVEL]; 204 uint32_t stencil_tiling_index[RADEON_SURF_MAX_LEVEL]; 205 uint32_t pipe_config; 206 uint32_t num_banks; 207 uint32_t macro_tile_index; 208 uint32_t micro_tile_mode; /* displayable, thin, depth, rotated */ 209 210 /* Whether the depth miptree or stencil miptree as used by the DB are 211 * adjusted from their TC compatible form to ensure depth/stencil 212 * compatibility. If either is true, the corresponding plane cannot be 213 * sampled from. 214 */ 215 bool depth_adjusted; 216 bool stencil_adjusted; 217 218 uint64_t dcc_size; 219 uint64_t dcc_alignment; 220 }; 221 222 enum radeon_bo_layout { 223 RADEON_LAYOUT_LINEAR = 0, 224 RADEON_LAYOUT_TILED, 225 RADEON_LAYOUT_SQUARETILED, 226 227 RADEON_LAYOUT_UNKNOWN 228 }; 229 230 /* Tiling info for display code, DRI sharing, and other data. */ 231 struct radeon_bo_metadata { 232 /* Tiling flags describing the texture layout for display code 233 * and DRI sharing. 234 */ 235 enum radeon_bo_layout microtile; 236 enum radeon_bo_layout macrotile; 237 unsigned pipe_config; 238 unsigned bankw; 239 unsigned bankh; 240 unsigned tile_split; 241 unsigned mtilea; 242 unsigned num_banks; 243 unsigned stride; 244 bool scanout; 245 246 /* Additional metadata associated with the buffer, in bytes. 247 * The maximum size is 64 * 4. This is opaque for the winsys & kernel. 248 * Supported by amdgpu only. 249 */ 250 uint32_t size_metadata; 251 uint32_t metadata[64]; 252 }; 253 254 struct radeon_winsys_bo; 255 struct radeon_winsys_fence; 256 struct radeon_winsys_sem; 257 258 struct radeon_winsys { 259 void (*destroy)(struct radeon_winsys *ws); 260 261 void (*query_info)(struct radeon_winsys *ws, 262 struct radeon_info *info); 263 264 struct radeon_winsys_bo *(*buffer_create)(struct radeon_winsys *ws, 265 uint64_t size, 266 unsigned alignment, 267 enum radeon_bo_domain domain, 268 enum radeon_bo_flag flags); 269 270 void (*buffer_destroy)(struct radeon_winsys_bo *bo); 271 void *(*buffer_map)(struct radeon_winsys_bo *bo); 272 273 struct radeon_winsys_bo *(*buffer_from_fd)(struct radeon_winsys *ws, 274 int fd, 275 unsigned *stride, unsigned *offset); 276 277 bool (*buffer_get_fd)(struct radeon_winsys *ws, 278 struct radeon_winsys_bo *bo, 279 int *fd); 280 281 void (*buffer_unmap)(struct radeon_winsys_bo *bo); 282 283 uint64_t (*buffer_get_va)(struct radeon_winsys_bo *bo); 284 285 void (*buffer_set_metadata)(struct radeon_winsys_bo *bo, 286 struct radeon_bo_metadata *md); 287 struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws); 288 void (*ctx_destroy)(struct radeon_winsys_ctx *ctx); 289 290 bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx, 291 enum ring_type ring_type, int ring_index); 292 293 struct radeon_winsys_cs *(*cs_create)(struct radeon_winsys *ws, 294 enum ring_type ring_type); 295 296 void (*cs_destroy)(struct radeon_winsys_cs *cs); 297 298 void (*cs_reset)(struct radeon_winsys_cs *cs); 299 300 bool (*cs_finalize)(struct radeon_winsys_cs *cs); 301 302 void (*cs_grow)(struct radeon_winsys_cs * cs, size_t min_size); 303 304 int (*cs_submit)(struct radeon_winsys_ctx *ctx, 305 int queue_index, 306 struct radeon_winsys_cs **cs_array, 307 unsigned cs_count, 308 struct radeon_winsys_sem **wait_sem, 309 unsigned wait_sem_count, 310 struct radeon_winsys_sem **signal_sem, 311 unsigned signal_sem_count, 312 bool can_patch, 313 struct radeon_winsys_fence *fence); 314 315 void (*cs_add_buffer)(struct radeon_winsys_cs *cs, 316 struct radeon_winsys_bo *bo, 317 uint8_t priority); 318 319 void (*cs_execute_secondary)(struct radeon_winsys_cs *parent, 320 struct radeon_winsys_cs *child); 321 322 void (*cs_dump)(struct radeon_winsys_cs *cs, FILE* file, uint32_t trace_id); 323 324 int (*surface_init)(struct radeon_winsys *ws, 325 struct radeon_surf *surf); 326 327 int (*surface_best)(struct radeon_winsys *ws, 328 struct radeon_surf *surf); 329 330 struct radeon_winsys_fence *(*create_fence)(); 331 void (*destroy_fence)(struct radeon_winsys_fence *fence); 332 bool (*fence_wait)(struct radeon_winsys *ws, 333 struct radeon_winsys_fence *fence, 334 bool absolute, 335 uint64_t timeout); 336 337 struct radeon_winsys_sem *(*create_sem)(struct radeon_winsys *ws); 338 void (*destroy_sem)(struct radeon_winsys_sem *sem); 339 340 }; 341 342 static inline void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value) 343 { 344 cs->buf[cs->cdw++] = value; 345 } 346 347 static inline void radeon_emit_array(struct radeon_winsys_cs *cs, 348 const uint32_t *values, unsigned count) 349 { 350 memcpy(cs->buf + cs->cdw, values, count * 4); 351 cs->cdw += count; 352 } 353 354 #endif /* RADV_RADEON_WINSYS_H */ 355