| 1 |
|
| 2 | |
| 3 | * Copyright (C) The Asahi Linux Contributors
|
| 4 | * Copyright (C) 2018-2023 Collabora Ltd.
|
| 5 | * Copyright (C) 2014-2018 Broadcom
|
| 6 |
|
| 7 | #ifndef _ASAHI_DRM_H_
|
| 8 | #define _ASAHI_DRM_H_
|
| 9 |
|
| 10 | #include "drm.h"
|
| 11 |
|
| 12 | #if defined(__cplusplus)
|
| 13 | extern "C" {
|
| 14 | #endif
|
| 15 |
|
| 16 | |
| 17 | * DOC: Introduction to the Asahi UAPI
|
| 18 | *
|
| 19 | * This documentation describes the Asahi IOCTLs.
|
| 20 | *
|
| 21 | * Just a few generic rules about the data passed to the Asahi IOCTLs (cribbed
|
| 22 | * from Panthor):
|
| 23 | *
|
| 24 | * - Structures must be aligned on 64-bit/8-byte. If the object is not
|
| 25 | * naturally aligned, a padding field must be added.
|
| 26 | * - Fields must be explicitly aligned to their natural type alignment with
|
| 27 | * pad[0..N] fields.
|
| 28 | * - All padding fields will be checked by the driver to make sure they are
|
| 29 | * zeroed.
|
| 30 | * - Flags can be added, but not removed/replaced.
|
| 31 | * - New fields can be added to the main structures (the structures
|
| 32 | * directly passed to the ioctl). Those fields can be added at the end of
|
| 33 | * the structure, or replace existing padding fields. Any new field being
|
| 34 | * added must preserve the behavior that existed before those fields were
|
| 35 | * added when a value of zero is passed.
|
| 36 | * - New fields can be added to indirect objects (objects pointed by the
|
| 37 | * main structure), iff those objects are passed a size to reflect the
|
| 38 | * size known by the userspace driver (see
|
| 39 | * drm_asahi_cmd_header::size).
|
| 40 | * - If the kernel driver is too old to know some fields, those will be
|
| 41 | * ignored if zero, and otherwise rejected (and so will be zero on output).
|
| 42 | * - If userspace is too old to know some fields, those will be zeroed
|
| 43 | * (input) before the structure is parsed by the kernel driver.
|
| 44 | * - Each new flag/field addition must come with a driver version update so
|
| 45 | * the userspace driver doesn't have to guess which flags are supported.
|
| 46 | * - Structures should not contain unions, as this would defeat the
|
| 47 | * extensibility of such structures.
|
| 48 | * - IOCTLs can't be removed or replaced. New IOCTL IDs should be placed
|
| 49 | * at the end of the drm_asahi_ioctl_id enum.
|
| 50 |
|
| 51 |
|
| 52 | |
| 53 | * enum drm_asahi_ioctl_id - IOCTL IDs
|
| 54 | *
|
| 55 | * Place new ioctls at the end, don't re-order, don't replace or remove entries.
|
| 56 | *
|
| 57 | * These IDs are not meant to be used directly. Use the DRM_IOCTL_ASAHI_xxx
|
| 58 | * definitions instead.
|
| 59 |
|
| 60 | enum drm_asahi_ioctl_id {
|
| 61 |
|
| 62 | DRM_ASAHI_GET_PARAMS = 0,
|
| 63 |
|
| 64 |
|
| 65 | DRM_ASAHI_GET_TIME,
|
| 66 |
|
| 67 |
|
| 68 | DRM_ASAHI_VM_CREATE,
|
| 69 |
|
| 70 |
|
| 71 | DRM_ASAHI_VM_DESTROY,
|
| 72 |
|
| 73 |
|
| 74 | DRM_ASAHI_VM_BIND,
|
| 75 |
|
| 76 |
|
| 77 | DRM_ASAHI_GEM_CREATE,
|
| 78 |
|
| 79 | |
| 80 | * @DRM_ASAHI_GEM_MMAP_OFFSET: Get offset to pass to mmap() to map a
|
| 81 | * given GEM handle.
|
| 82 |
|
| 83 | DRM_ASAHI_GEM_MMAP_OFFSET,
|
| 84 |
|
| 85 |
|
| 86 | DRM_ASAHI_GEM_BIND_OBJECT,
|
| 87 |
|
| 88 |
|
| 89 | DRM_ASAHI_QUEUE_CREATE,
|
| 90 |
|
| 91 |
|
| 92 | DRM_ASAHI_QUEUE_DESTROY,
|
| 93 |
|
| 94 |
|
| 95 | DRM_ASAHI_SUBMIT,
|
| 96 | };
|
| 97 |
|
| 98 | #define DRM_ASAHI_MAX_CLUSTERS 64
|
| 99 |
|
| 100 | |
| 101 | * struct drm_asahi_params_global - Global parameters.
|
| 102 | *
|
| 103 | * This struct may be queried by drm_asahi_get_params.
|
| 104 |
|
| 105 | struct drm_asahi_params_global {
|
| 106 |
|
| 107 | __u64 features;
|
| 108 |
|
| 109 |
|
| 110 | __u32 gpu_generation;
|
| 111 |
|
| 112 |
|
| 113 | __u32 gpu_variant;
|
| 114 |
|
| 115 | |
| 116 | * @gpu_revision: GPU revision in BCD, e.g. 0x00 for 'A0' or
|
| 117 | * 0x21 for 'C1'
|
| 118 |
|
| 119 | __u32 gpu_revision;
|
| 120 |
|
| 121 |
|
| 122 | __u32 chip_id;
|
| 123 |
|
| 124 |
|
| 125 | __u32 num_dies;
|
| 126 |
|
| 127 |
|
| 128 | __u32 num_clusters_total;
|
| 129 |
|
| 130 | |
| 131 | * @num_cores_per_cluster: Number of logical cores per cluster
|
| 132 | * (including inactive/nonexistent)
|
| 133 |
|
| 134 | __u32 num_cores_per_cluster;
|
| 135 |
|
| 136 |
|
| 137 | __u32 max_frequency_khz;
|
| 138 |
|
| 139 |
|
| 140 | __u64 core_masks[DRM_ASAHI_MAX_CLUSTERS];
|
| 141 |
|
| 142 | |
| 143 | * @vm_start: VM range start VMA. Together with @vm_end, this defines
|
| 144 | * the window of valid GPU VAs. Userspace is expected to subdivide VAs
|
| 145 | * out of this window.
|
| 146 | *
|
| 147 | * This window contains all virtual addresses that userspace needs to
|
| 148 | * know about. There may be kernel-internal GPU VAs outside this range,
|
| 149 | * but that detail is not relevant here.
|
| 150 |
|
| 151 | __u64 vm_start;
|
| 152 |
|
| 153 |
|
| 154 | __u64 vm_end;
|
| 155 |
|
| 156 | |
| 157 | * @vm_kernel_min_size: Minimum kernel VMA window size.
|
| 158 | *
|
| 159 | * When creating a VM, userspace is required to carve out a section of
|
| 160 | * virtual addresses (within the range given by @vm_start and
|
| 161 | * @vm_end). The kernel will allocate various internal structures
|
| 162 | * within the specified VA range.
|
| 163 | *
|
| 164 | * Allowing userspace to choose the VA range for the kernel, rather than
|
| 165 | * the kernel reserving VAs and requiring userspace to cope, can assist
|
| 166 | * in implementing SVM.
|
| 167 |
|
| 168 | __u64 vm_kernel_min_size;
|
| 169 |
|
| 170 | |
| 171 | * @max_commands_per_submission: Maximum number of supported commands
|
| 172 | * per submission. This mirrors firmware limits. Userspace must split up
|
| 173 | * larger command buffers, which may require inserting additional
|
| 174 | * synchronization.
|
| 175 |
|
| 176 | __u32 max_commands_per_submission;
|
| 177 |
|
| 178 | |
| 179 | * @max_attachments: Maximum number of drm_asahi_attachment's per
|
| 180 | * command
|
| 181 |
|
| 182 | __u32 max_attachments;
|
| 183 |
|
| 184 | |
| 185 | * @command_timestamp_frequency_hz: Timebase frequency for timestamps
|
| 186 | * written during command execution, specified via drm_asahi_timestamp
|
| 187 | * structures. As this rate is controlled by the firmware, it is a
|
| 188 | * queryable parameter.
|
| 189 | *
|
| 190 | * Userspace must divide by this frequency to convert timestamps to
|
| 191 | * seconds, rather than hardcoding a particular firmware's rate.
|
| 192 |
|
| 193 | __u64 command_timestamp_frequency_hz;
|
| 194 | };
|
| 195 |
|
| 196 | |
| 197 | * enum drm_asahi_feature - Feature bits
|
| 198 | *
|
| 199 | * This covers only features that userspace cannot infer from the architecture
|
| 200 | * version. Most features don't need to be here.
|
| 201 |
|
| 202 | enum drm_asahi_feature {
|
| 203 | |
| 204 | * @DRM_ASAHI_FEATURE_SOFT_FAULTS: GPU has "soft fault" enabled. Shader
|
| 205 | * loads of unmapped memory will return zero. Shader stores to unmapped
|
| 206 | * memory will be silently discarded. Note that only shader load/store
|
| 207 | * is affected. Other hardware units are not affected, notably including
|
| 208 | * texture sampling.
|
| 209 | *
|
| 210 | * Soft fault is set when initializing the GPU and cannot be runtime
|
| 211 | * toggled. Therefore, it is exposed as a feature bit and not a
|
| 212 | * userspace-settable flag on the VM. When soft fault is enabled,
|
| 213 | * userspace can speculate memory accesses more aggressively.
|
| 214 |
|
| 215 | DRM_ASAHI_FEATURE_SOFT_FAULTS = (1UL) << 0,
|
| 216 | };
|
| 217 |
|
| 218 | |
| 219 | * struct drm_asahi_get_params - Arguments passed to DRM_IOCTL_ASAHI_GET_PARAMS
|
| 220 |
|
| 221 | struct drm_asahi_get_params {
|
| 222 |
|
| 223 | __u32 param_group;
|
| 224 |
|
| 225 |
|
| 226 | __u32 pad;
|
| 227 |
|
| 228 |
|
| 229 | __u64 pointer;
|
| 230 |
|
| 231 | |
| 232 | * @size: Size of the user buffer. In case of older userspace, this may
|
| 233 | * be less than sizeof(struct drm_asahi_params_global). The kernel will
|
| 234 | * not write past the length specified here, allowing extensibility.
|
| 235 |
|
| 236 | __u64 size;
|
| 237 | };
|
| 238 |
|
| 239 | |
| 240 | * struct drm_asahi_vm_create - Arguments passed to DRM_IOCTL_ASAHI_VM_CREATE
|
| 241 |
|
| 242 | struct drm_asahi_vm_create {
|
| 243 | |
| 244 | * @kernel_start: Start of the kernel-reserved address range. See
|
| 245 | * drm_asahi_params_global::vm_kernel_min_size.
|
| 246 | *
|
| 247 | * Both @kernel_start and @kernel_end must be within the range of
|
| 248 | * valid VAs given by drm_asahi_params_global::vm_start and
|
| 249 | * drm_asahi_params_global::vm_end. The size of the kernel range
|
| 250 | * (@kernel_end - @kernel_start) must be at least
|
| 251 | * drm_asahi_params_global::vm_kernel_min_size.
|
| 252 | *
|
| 253 | * Userspace must not bind any memory on this VM into this reserved
|
| 254 | * range, it is for kernel use only.
|
| 255 |
|
| 256 | __u64 kernel_start;
|
| 257 |
|
| 258 | |
| 259 | * @kernel_end: End of the kernel-reserved address range. See
|
| 260 | * @kernel_start.
|
| 261 |
|
| 262 | __u64 kernel_end;
|
| 263 |
|
| 264 |
|
| 265 | __u32 vm_id;
|
| 266 |
|
| 267 |
|
| 268 | __u32 pad;
|
| 269 | };
|
| 270 |
|
| 271 | |
| 272 | * struct drm_asahi_vm_destroy - Arguments passed to DRM_IOCTL_ASAHI_VM_DESTROY
|
| 273 |
|
| 274 | struct drm_asahi_vm_destroy {
|
| 275 |
|
| 276 | __u32 vm_id;
|
| 277 |
|
| 278 |
|
| 279 | __u32 pad;
|
| 280 | };
|
| 281 |
|
| 282 | |
| 283 | * enum drm_asahi_gem_flags - Flags for GEM creation
|
| 284 |
|
| 285 | enum drm_asahi_gem_flags {
|
| 286 | |
| 287 | * @DRM_ASAHI_GEM_WRITEBACK: BO should be CPU-mapped as writeback.
|
| 288 | *
|
| 289 | * Map as writeback instead of write-combine. This optimizes for CPU
|
| 290 | * reads.
|
| 291 |
|
| 292 | DRM_ASAHI_GEM_WRITEBACK = (1L << 0),
|
| 293 |
|
| 294 | |
| 295 | * @DRM_ASAHI_GEM_VM_PRIVATE: BO is private to this GPU VM (no exports).
|
| 296 |
|
| 297 | DRM_ASAHI_GEM_VM_PRIVATE = (1L << 1),
|
| 298 | };
|
| 299 |
|
| 300 | |
| 301 | * struct drm_asahi_gem_create - Arguments passed to DRM_IOCTL_ASAHI_GEM_CREATE
|
| 302 |
|
| 303 | struct drm_asahi_gem_create {
|
| 304 |
|
| 305 | __u64 size;
|
| 306 |
|
| 307 |
|
| 308 | __u32 flags;
|
| 309 |
|
| 310 | |
| 311 | * @vm_id: VM ID to assign to the BO, if DRM_ASAHI_GEM_VM_PRIVATE is set
|
| 312 |
|
| 313 | __u32 vm_id;
|
| 314 |
|
| 315 |
|
| 316 | __u32 handle;
|
| 317 |
|
| 318 |
|
| 319 | __u32 pad;
|
| 320 | };
|
| 321 |
|
| 322 | |
| 323 | * struct drm_asahi_gem_mmap_offset - Arguments passed to
|
| 324 | * DRM_IOCTL_ASAHI_GEM_MMAP_OFFSET
|
| 325 |
|
| 326 | struct drm_asahi_gem_mmap_offset {
|
| 327 |
|
| 328 | __u32 handle;
|
| 329 |
|
| 330 |
|
| 331 | __u32 flags;
|
| 332 |
|
| 333 |
|
| 334 | __u64 offset;
|
| 335 | };
|
| 336 |
|
| 337 | |
| 338 | * enum drm_asahi_bind_flags - Flags for GEM binding
|
| 339 |
|
| 340 | enum drm_asahi_bind_flags {
|
| 341 | |
| 342 | * @DRM_ASAHI_BIND_UNBIND: Instead of binding a GEM object to the range,
|
| 343 | * simply unbind the GPU VMA range.
|
| 344 |
|
| 345 | DRM_ASAHI_BIND_UNBIND = (1L << 0),
|
| 346 |
|
| 347 |
|
| 348 | DRM_ASAHI_BIND_READ = (1L << 1),
|
| 349 |
|
| 350 |
|
| 351 | DRM_ASAHI_BIND_WRITE = (1L << 2),
|
| 352 |
|
| 353 | |
| 354 | * @DRM_ASAHI_BIND_SINGLE_PAGE: Map a single page of the BO repeatedly
|
| 355 | * across the VA range.
|
| 356 | *
|
| 357 | * This is useful to fill a VA range with scratch pages or zero pages.
|
| 358 | * It is intended as a mechanism to accelerate sparse.
|
| 359 |
|
| 360 | DRM_ASAHI_BIND_SINGLE_PAGE = (1L << 3),
|
| 361 | };
|
| 362 |
|
| 363 | |
| 364 | * struct drm_asahi_gem_bind_op - Description of a single GEM bind operation.
|
| 365 |
|
| 366 | struct drm_asahi_gem_bind_op {
|
| 367 |
|
| 368 | __u32 flags;
|
| 369 |
|
| 370 |
|
| 371 | __u32 handle;
|
| 372 |
|
| 373 | |
| 374 | * @offset: Offset into the object (except for UNBIND).
|
| 375 | *
|
| 376 | * For a regular bind, this is the beginning of the region of the GEM
|
| 377 | * object to bind.
|
| 378 | *
|
| 379 | * For a single-page bind, this is the offset to the single page that
|
| 380 | * will be repeatedly bound.
|
| 381 | *
|
| 382 | * Must be page-size aligned.
|
| 383 |
|
| 384 | __u64 offset;
|
| 385 |
|
| 386 | |
| 387 | * @range: Number of bytes to bind/unbind to @addr.
|
| 388 | *
|
| 389 | * Must be page-size aligned.
|
| 390 |
|
| 391 | __u64 range;
|
| 392 |
|
| 393 | |
| 394 | * @addr: Address to bind to.
|
| 395 | *
|
| 396 | * Must be page-size aligned.
|
| 397 |
|
| 398 | __u64 addr;
|
| 399 | };
|
| 400 |
|
| 401 | |
| 402 | * struct drm_asahi_vm_bind - Arguments passed to
|
| 403 | * DRM_IOCTL_ASAHI_VM_BIND
|
| 404 |
|
| 405 | struct drm_asahi_vm_bind {
|
| 406 |
|
| 407 | __u32 vm_id;
|
| 408 |
|
| 409 |
|
| 410 | __u32 num_binds;
|
| 411 |
|
| 412 | |
| 413 | * @stride: Stride in bytes between consecutive binds. This allows
|
| 414 | * extensibility of drm_asahi_gem_bind_op.
|
| 415 |
|
| 416 | __u32 stride;
|
| 417 |
|
| 418 |
|
| 419 | __u32 pad;
|
| 420 |
|
| 421 | |
| 422 | * @userptr: User pointer to an array of @num_binds structures of type
|
| 423 | * @drm_asahi_gem_bind_op and size @stride bytes.
|
| 424 |
|
| 425 | __u64 userptr;
|
| 426 | };
|
| 427 |
|
| 428 | |
| 429 | * enum drm_asahi_bind_object_op - Special object bind operation
|
| 430 |
|
| 431 | enum drm_asahi_bind_object_op {
|
| 432 |
|
| 433 | DRM_ASAHI_BIND_OBJECT_OP_BIND = 0,
|
| 434 |
|
| 435 |
|
| 436 | DRM_ASAHI_BIND_OBJECT_OP_UNBIND = 1,
|
| 437 | };
|
| 438 |
|
| 439 | |
| 440 | * enum drm_asahi_bind_object_flags - Special object bind flags
|
| 441 |
|
| 442 | enum drm_asahi_bind_object_flags {
|
| 443 | |
| 444 | * @DRM_ASAHI_BIND_OBJECT_USAGE_TIMESTAMPS: Map a BO as a timestamp
|
| 445 | * buffer.
|
| 446 |
|
| 447 | DRM_ASAHI_BIND_OBJECT_USAGE_TIMESTAMPS = (1L << 0),
|
| 448 | };
|
| 449 |
|
| 450 | |
| 451 | * struct drm_asahi_gem_bind_object - Arguments passed to
|
| 452 | * DRM_IOCTL_ASAHI_GEM_BIND_OBJECT
|
| 453 |
|
| 454 | struct drm_asahi_gem_bind_object {
|
| 455 |
|
| 456 | __u32 op;
|
| 457 |
|
| 458 |
|
| 459 | __u32 flags;
|
| 460 |
|
| 461 |
|
| 462 | __u32 handle;
|
| 463 |
|
| 464 |
|
| 465 | __u32 vm_id;
|
| 466 |
|
| 467 |
|
| 468 | __u64 offset;
|
| 469 |
|
| 470 |
|
| 471 | __u64 range;
|
| 472 |
|
| 473 |
|
| 474 | __u32 object_handle;
|
| 475 |
|
| 476 |
|
| 477 | __u32 pad;
|
| 478 | };
|
| 479 |
|
| 480 | |
| 481 | * enum drm_asahi_cmd_type - Command type
|
| 482 |
|
| 483 | enum drm_asahi_cmd_type {
|
| 484 | |
| 485 | * @DRM_ASAHI_CMD_RENDER: Render command, executing on the render
|
| 486 | * subqueue. Combined vertex and fragment operation.
|
| 487 | *
|
| 488 | * Followed by a @drm_asahi_cmd_render payload.
|
| 489 |
|
| 490 | DRM_ASAHI_CMD_RENDER = 0,
|
| 491 |
|
| 492 | |
| 493 | * @DRM_ASAHI_CMD_COMPUTE: Compute command on the compute subqueue.
|
| 494 | *
|
| 495 | * Followed by a @drm_asahi_cmd_compute payload.
|
| 496 |
|
| 497 | DRM_ASAHI_CMD_COMPUTE = 1,
|
| 498 |
|
| 499 | |
| 500 | * @DRM_ASAHI_SET_VERTEX_ATTACHMENTS: Software command to set
|
| 501 | * attachments for subsequent vertex shaders in the same submit.
|
| 502 | *
|
| 503 | * Followed by (possibly multiple) @drm_asahi_attachment payloads.
|
| 504 |
|
| 505 | DRM_ASAHI_SET_VERTEX_ATTACHMENTS = 2,
|
| 506 |
|
| 507 | |
| 508 | * @DRM_ASAHI_SET_FRAGMENT_ATTACHMENTS: Software command to set
|
| 509 | * attachments for subsequent fragment shaders in the same submit.
|
| 510 | *
|
| 511 | * Followed by (possibly multiple) @drm_asahi_attachment payloads.
|
| 512 |
|
| 513 | DRM_ASAHI_SET_FRAGMENT_ATTACHMENTS = 3,
|
| 514 |
|
| 515 | |
| 516 | * @DRM_ASAHI_SET_COMPUTE_ATTACHMENTS: Software command to set
|
| 517 | * attachments for subsequent compute shaders in the same submit.
|
| 518 | *
|
| 519 | * Followed by (possibly multiple) @drm_asahi_attachment payloads.
|
| 520 |
|
| 521 | DRM_ASAHI_SET_COMPUTE_ATTACHMENTS = 4,
|
| 522 | };
|
| 523 |
|
| 524 | |
| 525 | * enum drm_asahi_priority - Scheduling queue priority.
|
| 526 | *
|
| 527 | * These priorities are forwarded to the firmware to influence firmware
|
| 528 | * scheduling. The exact policy is ultimately decided by firmware, but
|
| 529 | * these enums allow userspace to communicate the intentions.
|
| 530 |
|
| 531 | enum drm_asahi_priority {
|
| 532 |
|
| 533 | DRM_ASAHI_PRIORITY_LOW = 0,
|
| 534 |
|
| 535 |
|
| 536 | DRM_ASAHI_PRIORITY_MEDIUM = 1,
|
| 537 |
|
| 538 | |
| 539 | * @DRM_ASAHI_PRIORITY_HIGH: High priority queue.
|
| 540 | *
|
| 541 | * Reserved for future extension.
|
| 542 |
|
| 543 | DRM_ASAHI_PRIORITY_HIGH = 2,
|
| 544 |
|
| 545 | |
| 546 | * @DRM_ASAHI_PRIORITY_REALTIME: Real-time priority queue.
|
| 547 | *
|
| 548 | * Reserved for future extension.
|
| 549 |
|
| 550 | DRM_ASAHI_PRIORITY_REALTIME = 3,
|
| 551 | };
|
| 552 |
|
| 553 | |
| 554 | * struct drm_asahi_queue_create - Arguments passed to
|
| 555 | * DRM_IOCTL_ASAHI_QUEUE_CREATE
|
| 556 |
|
| 557 | struct drm_asahi_queue_create {
|
| 558 |
|
| 559 | __u32 flags;
|
| 560 |
|
| 561 |
|
| 562 | __u32 vm_id;
|
| 563 |
|
| 564 |
|
| 565 | __u32 priority;
|
| 566 |
|
| 567 |
|
| 568 | __u32 queue_id;
|
| 569 |
|
| 570 | |
| 571 | * @usc_exec_base: GPU base address for all USC binaries (shaders) on
|
| 572 | * this queue. USC addresses are 32-bit relative to this 64-bit base.
|
| 573 | *
|
| 574 | * This sets the following registers on all queue commands:
|
| 575 | *
|
| 576 | * USC_EXEC_BASE_TA (vertex)
|
| 577 | * USC_EXEC_BASE_ISP (fragment)
|
| 578 | * USC_EXEC_BASE_CP (compute)
|
| 579 | *
|
| 580 | * While the hardware lets us configure these independently per command,
|
| 581 | * we do not have a use case for this. Instead, we expect userspace to
|
| 582 | * fix a 4GiB VA carveout for USC memory and pass its base address here.
|
| 583 |
|
| 584 | __u64 usc_exec_base;
|
| 585 | };
|
| 586 |
|
| 587 | |
| 588 | * struct drm_asahi_queue_destroy - Arguments passed to
|
| 589 | * DRM_IOCTL_ASAHI_QUEUE_DESTROY
|
| 590 |
|
| 591 | struct drm_asahi_queue_destroy {
|
| 592 |
|
| 593 | __u32 queue_id;
|
| 594 |
|
| 595 |
|
| 596 | __u32 pad;
|
| 597 | };
|
| 598 |
|
| 599 | |
| 600 | * enum drm_asahi_sync_type - Sync item type
|
| 601 |
|
| 602 | enum drm_asahi_sync_type {
|
| 603 |
|
| 604 | DRM_ASAHI_SYNC_SYNCOBJ = 0,
|
| 605 |
|
| 606 |
|
| 607 | DRM_ASAHI_SYNC_TIMELINE_SYNCOBJ = 1,
|
| 608 | };
|
| 609 |
|
| 610 | |
| 611 | * struct drm_asahi_sync - Sync item
|
| 612 |
|
| 613 | struct drm_asahi_sync {
|
| 614 |
|
| 615 | __u32 sync_type;
|
| 616 |
|
| 617 |
|
| 618 | __u32 handle;
|
| 619 |
|
| 620 |
|
| 621 | __u64 timeline_value;
|
| 622 | };
|
| 623 |
|
| 624 | |
| 625 | * define DRM_ASAHI_BARRIER_NONE - Command index for no barrier
|
| 626 | *
|
| 627 | * This special value may be passed in to drm_asahi_command::vdm_barrier or
|
| 628 | * drm_asahi_command::cdm_barrier to indicate that the respective subqueue
|
| 629 | * should not wait on any previous work.
|
| 630 |
|
| 631 | #define DRM_ASAHI_BARRIER_NONE (0xFFFFu)
|
| 632 |
|
| 633 | |
| 634 | * struct drm_asahi_cmd_header - Top level command structure
|
| 635 | *
|
| 636 | * This struct is core to the command buffer definition and therefore is not
|
| 637 | * extensible.
|
| 638 |
|
| 639 | struct drm_asahi_cmd_header {
|
| 640 |
|
| 641 | __u16 cmd_type;
|
| 642 |
|
| 643 | |
| 644 | * @size: Size of this command, not including this header.
|
| 645 | *
|
| 646 | * For hardware commands, this enables extensibility of commands without
|
| 647 | * requiring extra command types. Passing a command that is shorter
|
| 648 | * than expected is explicitly allowed for backwards-compatibility.
|
| 649 | * Truncated fields will be zeroed.
|
| 650 | *
|
| 651 | * For the synthetic attachment setting commands, this implicitly
|
| 652 | * encodes the number of attachments. These commands take multiple
|
| 653 | * fixed-size @drm_asahi_attachment structures as their payload, so size
|
| 654 | * equals number of attachments * sizeof(struct drm_asahi_attachment).
|
| 655 |
|
| 656 | __u16 size;
|
| 657 |
|
| 658 | |
| 659 | * @vdm_barrier: VDM (render) command index to wait on.
|
| 660 | *
|
| 661 | * Barriers are indices relative to the beginning of a given submit. A
|
| 662 | * barrier of 0 waits on commands submitted to the respective subqueue
|
| 663 | * in previous submit ioctls. A barrier of N waits on N previous
|
| 664 | * commands on the subqueue within the current submit ioctl. As a
|
| 665 | * special case, passing @DRM_ASAHI_BARRIER_NONE avoids waiting on any
|
| 666 | * commands in the subqueue.
|
| 667 | *
|
| 668 | * Examples:
|
| 669 | *
|
| 670 | * 0: This waits on all previous work.
|
| 671 | *
|
| 672 | * NONE: This does not wait for anything on this subqueue.
|
| 673 | *
|
| 674 | * 1: This waits on the first render command in the submit.
|
| 675 | * This is valid only if there are multiple render commands in the
|
| 676 | * same submit.
|
| 677 | *
|
| 678 | * Barriers are valid only for hardware commands. Synthetic software
|
| 679 | * commands to set attachments must pass NONE here.
|
| 680 |
|
| 681 | __u16 vdm_barrier;
|
| 682 |
|
| 683 | |
| 684 | * @cdm_barrier: CDM (compute) command index to wait on.
|
| 685 | *
|
| 686 | * See @vdm_barrier, and replace VDM/render with CDM/compute.
|
| 687 |
|
| 688 | __u16 cdm_barrier;
|
| 689 | };
|
| 690 |
|
| 691 | |
| 692 | * struct drm_asahi_submit - Arguments passed to DRM_IOCTL_ASAHI_SUBMIT
|
| 693 |
|
| 694 | struct drm_asahi_submit {
|
| 695 | |
| 696 | * @syncs: An optional pointer to an array of drm_asahi_sync. The first
|
| 697 | * @in_sync_count elements are in-syncs, then the remaining
|
| 698 | * @out_sync_count elements are out-syncs. Using a single array with
|
| 699 | * explicit partitioning simplifies handling.
|
| 700 |
|
| 701 | __u64 syncs;
|
| 702 |
|
| 703 | |
| 704 | * @cmdbuf: Pointer to the command buffer to submit.
|
| 705 | *
|
| 706 | * This is a flat command buffer. By design, it contains no CPU
|
| 707 | * pointers, which makes it suitable for a virtgpu wire protocol without
|
| 708 | * requiring any serializing/deserializing step.
|
| 709 | *
|
| 710 | * It consists of a series of commands. Each command begins with a
|
| 711 | * fixed-size @drm_asahi_cmd_header header and is followed by a
|
| 712 | * variable-length payload according to the type and size in the header.
|
| 713 | *
|
| 714 | * The combined count of "real" hardware commands must be nonzero and at
|
| 715 | * most drm_asahi_params_global::max_commands_per_submission.
|
| 716 |
|
| 717 | __u64 cmdbuf;
|
| 718 |
|
| 719 |
|
| 720 | __u32 flags;
|
| 721 |
|
| 722 |
|
| 723 | __u32 queue_id;
|
| 724 |
|
| 725 | |
| 726 | * @in_sync_count: Number of sync objects to wait on before starting
|
| 727 | * this job.
|
| 728 |
|
| 729 | __u32 in_sync_count;
|
| 730 |
|
| 731 | |
| 732 | * @out_sync_count: Number of sync objects to signal upon completion of
|
| 733 | * this job.
|
| 734 |
|
| 735 | __u32 out_sync_count;
|
| 736 |
|
| 737 |
|
| 738 | __u32 cmdbuf_size;
|
| 739 |
|
| 740 |
|
| 741 | __u32 pad;
|
| 742 | };
|
| 743 |
|
| 744 | |
| 745 | * struct drm_asahi_attachment - Describe an "attachment".
|
| 746 | *
|
| 747 | * Attachments are any memory written by shaders, notably including render
|
| 748 | * target attachments written by the end-of-tile program. This is purely a hint
|
| 749 | * about the accessed memory regions. It is optional to specify, which is
|
| 750 | * fortunate as it cannot be specified precisely with bindless access anyway.
|
| 751 | * But where possible, it's probably a good idea for userspace to include these
|
| 752 | * hints, forwarded to the firmware.
|
| 753 | *
|
| 754 | * This struct is implicitly sized and therefore is not extensible.
|
| 755 |
|
| 756 | struct drm_asahi_attachment {
|
| 757 |
|
| 758 | __u64 pointer;
|
| 759 |
|
| 760 |
|
| 761 | __u64 size;
|
| 762 |
|
| 763 |
|
| 764 | __u32 pad;
|
| 765 |
|
| 766 |
|
| 767 | __u32 flags;
|
| 768 | };
|
| 769 |
|
| 770 | enum drm_asahi_render_flags {
|
| 771 | |
| 772 | * @DRM_ASAHI_RENDER_VERTEX_SCRATCH: A vertex stage shader uses scratch
|
| 773 | * memory.
|
| 774 |
|
| 775 | DRM_ASAHI_RENDER_VERTEX_SCRATCH = (1U << 0),
|
| 776 |
|
| 777 | |
| 778 | * @DRM_ASAHI_RENDER_PROCESS_EMPTY_TILES: Process even empty tiles.
|
| 779 | * This must be set when clearing render targets.
|
| 780 |
|
| 781 | DRM_ASAHI_RENDER_PROCESS_EMPTY_TILES = (1U << 1),
|
| 782 |
|
| 783 | |
| 784 | * @DRM_ASAHI_RENDER_NO_VERTEX_CLUSTERING: Run vertex stage on a single
|
| 785 | * cluster (on multi-cluster GPUs)
|
| 786 | *
|
| 787 | * This harms performance but can workaround certain sync/coherency
|
| 788 | * bugs, and therefore is useful for debugging.
|
| 789 |
|
| 790 | DRM_ASAHI_RENDER_NO_VERTEX_CLUSTERING = (1U << 2),
|
| 791 |
|
| 792 | |
| 793 | * @DRM_ASAHI_RENDER_DBIAS_IS_INT: Use integer depth bias formula.
|
| 794 | *
|
| 795 | * Graphics specifications contain two alternate formulas for depth
|
| 796 | * bias, a float formula used with floating-point depth buffers and an
|
| 797 | * integer formula using with unorm depth buffers. This flag specifies
|
| 798 | * that the integer formula should be used. If omitted, the float
|
| 799 | * formula is used instead.
|
| 800 | *
|
| 801 | * This corresponds to bit 18 of the relevant hardware control register,
|
| 802 | * so we match that here for efficiency.
|
| 803 |
|
| 804 | DRM_ASAHI_RENDER_DBIAS_IS_INT = (1U << 18),
|
| 805 | };
|
| 806 |
|
| 807 | |
| 808 | * struct drm_asahi_zls_buffer - Describe a depth or stencil buffer.
|
| 809 | *
|
| 810 | * These fields correspond to hardware registers in the ZLS (Z Load/Store) unit.
|
| 811 | * There are three hardware registers for each field respectively for loads,
|
| 812 | * stores, and partial renders. In practice, it makes sense to set all to the
|
| 813 | * same values, except in exceptional cases not yet implemented in userspace, so
|
| 814 | * we do not duplicate here for simplicity/efficiency.
|
| 815 | *
|
| 816 | * This struct is embedded in other structs and therefore is not extensible.
|
| 817 |
|
| 818 | struct drm_asahi_zls_buffer {
|
| 819 |
|
| 820 | __u64 base;
|
| 821 |
|
| 822 | |
| 823 | * @comp_base: If the load buffer is compressed, address of the
|
| 824 | * compression metadata section.
|
| 825 |
|
| 826 | __u64 comp_base;
|
| 827 |
|
| 828 | |
| 829 | * @stride: If layered rendering is enabled, the number of bytes
|
| 830 | * between each layer of the buffer.
|
| 831 |
|
| 832 | __u32 stride;
|
| 833 |
|
| 834 | |
| 835 | * @comp_stride: If layered rendering is enabled, the number of bytes
|
| 836 | * between each layer of the compression metadata.
|
| 837 |
|
| 838 | __u32 comp_stride;
|
| 839 | };
|
| 840 |
|
| 841 | |
| 842 | * struct drm_asahi_timestamp - Describe a timestamp write.
|
| 843 | *
|
| 844 | * The firmware can optionally write the GPU timestamp at render pass
|
| 845 | * granularities, but it needs to be mapped specially via
|
| 846 | * DRM_IOCTL_ASAHI_GEM_BIND_OBJECT. This structure therefore describes where to
|
| 847 | * write as a handle-offset pair, rather than a GPU address like normal.
|
| 848 | *
|
| 849 | * This struct is embedded in other structs and therefore is not extensible.
|
| 850 |
|
| 851 | struct drm_asahi_timestamp {
|
| 852 | |
| 853 | * @handle: Handle of the timestamp buffer, or 0 to skip this
|
| 854 | * timestamp. If nonzero, this must equal the value returned in
|
| 855 | * drm_asahi_gem_bind_object::object_handle.
|
| 856 |
|
| 857 | __u32 handle;
|
| 858 |
|
| 859 |
|
| 860 | __u32 offset;
|
| 861 | };
|
| 862 |
|
| 863 | |
| 864 | * struct drm_asahi_timestamps - Describe timestamp writes.
|
| 865 | *
|
| 866 | * Each operation that can be timestamped, can be timestamped at the start and
|
| 867 | * end. Therefore, drm_asahi_timestamp structs always come in pairs, bundled
|
| 868 | * together into drm_asahi_timestamps.
|
| 869 | *
|
| 870 | * This struct is embedded in other structs and therefore is not extensible.
|
| 871 |
|
| 872 | struct drm_asahi_timestamps {
|
| 873 |
|
| 874 | struct drm_asahi_timestamp start;
|
| 875 |
|
| 876 |
|
| 877 | struct drm_asahi_timestamp end;
|
| 878 | };
|
| 879 |
|
| 880 | |
| 881 | * struct drm_asahi_helper_program - Describe helper program configuration.
|
| 882 | *
|
| 883 | * The helper program is a compute-like kernel required for various hardware
|
| 884 | * functionality. Its most important role is dynamically allocating
|
| 885 | * scratch/stack memory for individual subgroups, by partitioning a static
|
| 886 | * allocation shared for the whole device. It is supplied by userspace via
|
| 887 | * drm_asahi_helper_program and internally dispatched by the hardware as needed.
|
| 888 | *
|
| 889 | * This struct is embedded in other structs and therefore is not extensible.
|
| 890 |
|
| 891 | struct drm_asahi_helper_program {
|
| 892 | |
| 893 | * @binary: USC address to the helper program binary. This is a tagged
|
| 894 | * pointer with configuration in the bottom bits.
|
| 895 |
|
| 896 | __u32 binary;
|
| 897 |
|
| 898 |
|
| 899 | __u32 cfg;
|
| 900 |
|
| 901 | |
| 902 | * @data: Data passed to the helper program. This value is not
|
| 903 | * interpreted by the kernel, firmware, or hardware in any way. It is
|
| 904 | * simply a sideband for userspace, set with the submit ioctl and read
|
| 905 | * via special registers inside the helper program.
|
| 906 | *
|
| 907 | * In practice, userspace will pass a 64-bit GPU VA here pointing to the
|
| 908 | * actual arguments, which presumably don't fit in 64-bits.
|
| 909 |
|
| 910 | __u64 data;
|
| 911 | };
|
| 912 |
|
| 913 | |
| 914 | * struct drm_asahi_bg_eot - Describe a background or end-of-tile program.
|
| 915 | *
|
| 916 | * The background and end-of-tile programs are dispatched by the hardware at the
|
| 917 | * beginning and end of rendering. As the hardware "tilebuffer" is simply local
|
| 918 | * memory, these programs are necessary to implement API-level render targets.
|
| 919 | * The fragment-like background program is responsible for loading either the
|
| 920 | * clear colour or the existing render target contents, while the compute-like
|
| 921 | * end-of-tile program stores the tilebuffer contents to memory.
|
| 922 | *
|
| 923 | * This struct is embedded in other structs and therefore is not extensible.
|
| 924 |
|
| 925 | struct drm_asahi_bg_eot {
|
| 926 | |
| 927 | * @usc: USC address of the hardware USC words binding resources
|
| 928 | * (including images and uniforms) and the program itself. Note this is
|
| 929 | * an additional layer of indirection compared to the helper program,
|
| 930 | * avoiding the need for a sideband for data. This is a tagged pointer
|
| 931 | * with additional configuration in the bottom bits.
|
| 932 |
|
| 933 | __u32 usc;
|
| 934 |
|
| 935 | |
| 936 | * @rsrc_spec: Resource specifier for the program. This is a packed
|
| 937 | * hardware data structure describing the required number of registers,
|
| 938 | * uniforms, bound textures, and bound samplers.
|
| 939 |
|
| 940 | __u32 rsrc_spec;
|
| 941 | };
|
| 942 |
|
| 943 | |
| 944 | * struct drm_asahi_cmd_render - Command to submit 3D
|
| 945 | *
|
| 946 | * This command submits a single render pass. The hardware control stream may
|
| 947 | * include many draws and subpasses, but within the command, the framebuffer
|
| 948 | * dimensions and attachments are fixed.
|
| 949 | *
|
| 950 | * The hardware requires the firmware to set a large number of Control Registers
|
| 951 | * setting up state at render pass granularity before each command rendering 3D.
|
| 952 | * The firmware bundles this state into data structures. Unfortunately, we
|
| 953 | * cannot expose either any of that directly to userspace, because the
|
| 954 | * kernel-firmware ABI is not stable. Although we can guarantee the firmware
|
| 955 | * updates in tandem with the kernel, we cannot break old userspace when
|
| 956 | * upgrading the firmware and kernel. Therefore, we need to abstract well the
|
| 957 | * data structures to avoid tying our hands with future firmwares.
|
| 958 | *
|
| 959 | * The bulk of drm_asahi_cmd_render therefore consists of values of hardware
|
| 960 | * control registers, marshalled via the firmware interface.
|
| 961 | *
|
| 962 | * The framebuffer/tilebuffer dimensions are also specified here. In addition to
|
| 963 | * being passed to the firmware/hardware, the kernel requires these dimensions
|
| 964 | * to calculate various essential tiling-related data structures. It is
|
| 965 | * unfortunate that our submits are heavier than on vendors with saner
|
| 966 | * hardware-software interfaces. The upshot is all of this information is
|
| 967 | * readily available to userspace with all current APIs.
|
| 968 | *
|
| 969 | * It looks odd - but it's not overly burdensome and it ensures we can remain
|
| 970 | * compatible with old userspace.
|
| 971 |
|
| 972 | struct drm_asahi_cmd_render {
|
| 973 |
|
| 974 | __u32 flags;
|
| 975 |
|
| 976 | |
| 977 | * @isp_zls_pixels: ISP_ZLS_PIXELS register value. This contains the
|
| 978 | * depth/stencil width/height, which may differ from the framebuffer
|
| 979 | * width/height.
|
| 980 |
|
| 981 | __u32 isp_zls_pixels;
|
| 982 |
|
| 983 | |
| 984 | * @vdm_ctrl_stream_base: VDM_CTRL_STREAM_BASE register value. GPU
|
| 985 | * address to the beginning of the VDM control stream.
|
| 986 |
|
| 987 | __u64 vdm_ctrl_stream_base;
|
| 988 |
|
| 989 |
|
| 990 | struct drm_asahi_helper_program vertex_helper;
|
| 991 |
|
| 992 |
|
| 993 | struct drm_asahi_helper_program fragment_helper;
|
| 994 |
|
| 995 | |
| 996 | * @isp_scissor_base: ISP_SCISSOR_BASE register value. GPU address of an
|
| 997 | * array of scissor descriptors indexed in the render pass.
|
| 998 |
|
| 999 | __u64 isp_scissor_base;
|
| 1000 |
|
| 1001 | |
| 1002 | * @isp_dbias_base: ISP_DBIAS_BASE register value. GPU address of an
|
| 1003 | * array of depth bias values indexed in the render pass.
|
| 1004 |
|
| 1005 | __u64 isp_dbias_base;
|
| 1006 |
|
| 1007 | |
| 1008 | * @isp_oclqry_base: ISP_OCLQRY_BASE register value. GPU address of an
|
| 1009 | * array of occlusion query results written by the render pass.
|
| 1010 |
|
| 1011 | __u64 isp_oclqry_base;
|
| 1012 |
|
| 1013 |
|
| 1014 | struct drm_asahi_zls_buffer depth;
|
| 1015 |
|
| 1016 |
|
| 1017 | struct drm_asahi_zls_buffer stencil;
|
| 1018 |
|
| 1019 |
|
| 1020 | __u64 zls_ctrl;
|
| 1021 |
|
| 1022 |
|
| 1023 | __u64 ppp_multisamplectl;
|
| 1024 |
|
| 1025 | |
| 1026 | * @sampler_heap: Base address of the sampler heap. This heap is used
|
| 1027 | * for both vertex shaders and fragment shaders. The registers are
|
| 1028 | * per-stage, but there is no known use case for separate heaps.
|
| 1029 |
|
| 1030 | __u64 sampler_heap;
|
| 1031 |
|
| 1032 |
|
| 1033 | __u32 ppp_ctrl;
|
| 1034 |
|
| 1035 |
|
| 1036 | __u16 width_px;
|
| 1037 |
|
| 1038 |
|
| 1039 | __u16 height_px;
|
| 1040 |
|
| 1041 |
|
| 1042 | __u16 layers;
|
| 1043 |
|
| 1044 |
|
| 1045 | __u16 sampler_count;
|
| 1046 |
|
| 1047 |
|
| 1048 | __u8 utile_width_px;
|
| 1049 |
|
| 1050 |
|
| 1051 | __u8 utile_height_px;
|
| 1052 |
|
| 1053 |
|
| 1054 | __u8 samples;
|
| 1055 |
|
| 1056 |
|
| 1057 | __u8 sample_size_B;
|
| 1058 |
|
| 1059 | |
| 1060 | * @isp_merge_upper_x: 32-bit float used in the hardware triangle
|
| 1061 | * merging. Calculate as: tan(60 deg) * width.
|
| 1062 | *
|
| 1063 | * Making these values UAPI avoids requiring floating-point calculations
|
| 1064 | * in the kernel in the hot path.
|
| 1065 |
|
| 1066 | __u32 isp_merge_upper_x;
|
| 1067 |
|
| 1068 | |
| 1069 | * @isp_merge_upper_y: 32-bit float. Calculate as: tan(60 deg) * height.
|
| 1070 | * See @isp_merge_upper_x.
|
| 1071 |
|
| 1072 | __u32 isp_merge_upper_y;
|
| 1073 |
|
| 1074 |
|
| 1075 | struct drm_asahi_bg_eot bg;
|
| 1076 |
|
| 1077 |
|
| 1078 | struct drm_asahi_bg_eot eot;
|
| 1079 |
|
| 1080 | |
| 1081 | * @partial_bg: Background program ran at the start of each tile when
|
| 1082 | * resuming the render pass during a partial render.
|
| 1083 |
|
| 1084 | struct drm_asahi_bg_eot partial_bg;
|
| 1085 |
|
| 1086 | |
| 1087 | * @partial_eot: End-of-tile program ran at the end of each tile when
|
| 1088 | * pausing the render pass during a partial render.
|
| 1089 |
|
| 1090 | struct drm_asahi_bg_eot partial_eot;
|
| 1091 |
|
| 1092 | |
| 1093 | * @isp_bgobjdepth: ISP_BGOBJDEPTH register value. This is the depth
|
| 1094 | * buffer clear value, encoded in the depth buffer's format: either a
|
| 1095 | * 32-bit float or a 16-bit unorm (with upper bits zeroed).
|
| 1096 |
|
| 1097 | __u32 isp_bgobjdepth;
|
| 1098 |
|
| 1099 | |
| 1100 | * @isp_bgobjvals: ISP_BGOBJVALS register value. The bottom 8-bits
|
| 1101 | * contain the stencil buffer clear value.
|
| 1102 |
|
| 1103 | __u32 isp_bgobjvals;
|
| 1104 |
|
| 1105 |
|
| 1106 | struct drm_asahi_timestamps ts_vtx;
|
| 1107 |
|
| 1108 |
|
| 1109 | struct drm_asahi_timestamps ts_frag;
|
| 1110 | };
|
| 1111 |
|
| 1112 | |
| 1113 | * struct drm_asahi_cmd_compute - Command to submit compute
|
| 1114 | *
|
| 1115 | * This command submits a control stream consisting of compute dispatches. There
|
| 1116 | * is essentially no limit on how many compute dispatches may be included in a
|
| 1117 | * single compute command, although timestamps are at command granularity.
|
| 1118 |
|
| 1119 | struct drm_asahi_cmd_compute {
|
| 1120 |
|
| 1121 | __u32 flags;
|
| 1122 |
|
| 1123 |
|
| 1124 | __u32 sampler_count;
|
| 1125 |
|
| 1126 | |
| 1127 | * @cdm_ctrl_stream_base: CDM_CTRL_STREAM_BASE register value. GPU
|
| 1128 | * address to the beginning of the CDM control stream.
|
| 1129 |
|
| 1130 | __u64 cdm_ctrl_stream_base;
|
| 1131 |
|
| 1132 | |
| 1133 | * @cdm_ctrl_stream_end: GPU base address to the end of the hardware
|
| 1134 | * control stream. Note this only considers the first contiguous segment
|
| 1135 | * of the control stream, as the stream might jump elsewhere.
|
| 1136 |
|
| 1137 | __u64 cdm_ctrl_stream_end;
|
| 1138 |
|
| 1139 |
|
| 1140 | __u64 sampler_heap;
|
| 1141 |
|
| 1142 |
|
| 1143 | struct drm_asahi_helper_program helper;
|
| 1144 |
|
| 1145 |
|
| 1146 | struct drm_asahi_timestamps ts;
|
| 1147 | };
|
| 1148 |
|
| 1149 | |
| 1150 | * struct drm_asahi_get_time - Arguments passed to DRM_IOCTL_ASAHI_GET_TIME
|
| 1151 |
|
| 1152 | struct drm_asahi_get_time {
|
| 1153 |
|
| 1154 | __u64 flags;
|
| 1155 |
|
| 1156 |
|
| 1157 | __u64 gpu_timestamp;
|
| 1158 | };
|
| 1159 |
|
| 1160 | |
| 1161 | * DRM_IOCTL_ASAHI() - Build an Asahi IOCTL number
|
| 1162 | * @__access: Access type. Must be R, W or RW.
|
| 1163 | * @__id: One of the DRM_ASAHI_xxx id.
|
| 1164 | * @__type: Suffix of the type being passed to the IOCTL.
|
| 1165 | *
|
| 1166 | * Don't use this macro directly, use the DRM_IOCTL_ASAHI_xxx
|
| 1167 | * values instead.
|
| 1168 | *
|
| 1169 | * Return: An IOCTL number to be passed to ioctl() from userspace.
|
| 1170 |
|
| 1171 | #define DRM_IOCTL_ASAHI(__access, __id, __type) \
|
| 1172 | DRM_IO ## __access(DRM_COMMAND_BASE + DRM_ASAHI_ ## __id, \
|
| 1173 | struct drm_asahi_ ## __type)
|
| 1174 |
|
| 1175 |
|
| 1176 | enum {
|
| 1177 | DRM_IOCTL_ASAHI_GET_PARAMS = DRM_IOCTL_ASAHI(W, GET_PARAMS, get_params),
|
| 1178 | DRM_IOCTL_ASAHI_GET_TIME = DRM_IOCTL_ASAHI(WR, GET_TIME, get_time),
|
| 1179 | DRM_IOCTL_ASAHI_VM_CREATE = DRM_IOCTL_ASAHI(WR, VM_CREATE, vm_create),
|
| 1180 | DRM_IOCTL_ASAHI_VM_DESTROY = DRM_IOCTL_ASAHI(W, VM_DESTROY, vm_destroy),
|
| 1181 | DRM_IOCTL_ASAHI_VM_BIND = DRM_IOCTL_ASAHI(W, VM_BIND, vm_bind),
|
| 1182 | DRM_IOCTL_ASAHI_GEM_CREATE = DRM_IOCTL_ASAHI(WR, GEM_CREATE, gem_create),
|
| 1183 | DRM_IOCTL_ASAHI_GEM_MMAP_OFFSET = DRM_IOCTL_ASAHI(WR, GEM_MMAP_OFFSET, gem_mmap_offset),
|
| 1184 | DRM_IOCTL_ASAHI_GEM_BIND_OBJECT = DRM_IOCTL_ASAHI(WR, GEM_BIND_OBJECT, gem_bind_object),
|
| 1185 | DRM_IOCTL_ASAHI_QUEUE_CREATE = DRM_IOCTL_ASAHI(WR, QUEUE_CREATE, queue_create),
|
| 1186 | DRM_IOCTL_ASAHI_QUEUE_DESTROY = DRM_IOCTL_ASAHI(W, QUEUE_DESTROY, queue_destroy),
|
| 1187 | DRM_IOCTL_ASAHI_SUBMIT = DRM_IOCTL_ASAHI(W, SUBMIT, submit),
|
| 1188 | };
|
| 1189 |
|
| 1190 | #if defined(__cplusplus)
|
| 1191 | }
|
| 1192 | #endif
|
| 1193 |
|
| 1194 | #endif
|