/* SPDX-License-Identifier: (GPL-2.0-only WITH Linux-syscall-note) OR MIT */1/* Copyright (c) 2023 Imagination Technologies Ltd. */23#ifndef PVR_DRM_UAPI_H4#define PVR_DRM_UAPI_H56#include "drm.h"78#include <linux/const.h>9#include <linux/types.h>1011#if defined(__cplusplus)12extern "C" {13#endif1415/**16* DOC: PowerVR UAPI17*18* The PowerVR IOCTL argument structs have a few limitations in place, in19* addition to the standard kernel restrictions:20*21* - All members must be type-aligned.22* - The overall struct must be padded to 64-bit alignment.23* - Explicit padding is almost always required. This takes the form of24* ``_padding_[x]`` members of sufficient size to pad to the next power-of-two25* alignment, where [x] is the offset into the struct in hexadecimal. Arrays26* are never used for alignment. Padding fields must be zeroed; this is27* always checked.28* - Unions may only appear as the last member of a struct.29* - Individual union members may grow in the future. The space between the30* end of a union member and the end of its containing union is considered31* "implicit padding" and must be zeroed. This is always checked.32*33* In addition to the IOCTL argument structs, the PowerVR UAPI makes use of34* DEV_QUERY argument structs. These are used to fetch information about the35* device and runtime. These structs are subject to the same rules set out36* above.37*/3839/**40* struct drm_pvr_obj_array - Container used to pass arrays of objects41*42* It is not unusual to have to extend objects to pass new parameters, and the DRM43* ioctl infrastructure is supporting that by padding ioctl arguments with zeros44* when the data passed by userspace is smaller than the struct defined in the45* drm_ioctl_desc, thus keeping things backward compatible. This type is just46* applying the same concepts to indirect objects passed through arrays referenced47* from the main ioctl arguments structure: the stride basically defines the size48* of the object passed by userspace, which allows the kernel driver to pad with49* zeros when it's smaller than the size of the object it expects.50*51* Use ``DRM_PVR_OBJ_ARRAY()`` to fill object array fields, unless you52* have a very good reason not to.53*/54struct drm_pvr_obj_array {55/** @stride: Stride of object struct. Used for versioning. */56__u32 stride;5758/** @count: Number of objects in the array. */59__u32 count;6061/** @array: User pointer to an array of objects. */62__u64 array;63};6465/**66* DRM_PVR_OBJ_ARRAY() - Helper macro for filling &struct drm_pvr_obj_array.67* @cnt: Number of elements pointed to py @ptr.68* @ptr: Pointer to start of a C array.69*70* Return: Literal of type &struct drm_pvr_obj_array.71*/72#define DRM_PVR_OBJ_ARRAY(cnt, ptr) \73{ .stride = sizeof((ptr)[0]), .count = (cnt), .array = (__u64)(uintptr_t)(ptr) }7475/**76* DOC: PowerVR IOCTL interface77*/7879/**80* PVR_IOCTL() - Build a PowerVR IOCTL number81* @_ioctl: An incrementing id for this IOCTL. Added to %DRM_COMMAND_BASE.82* @_mode: Must be one of %DRM_IOR, %DRM_IOW or %DRM_IOWR.83* @_data: The type of the args struct passed by this IOCTL.84*85* The struct referred to by @_data must have a ``drm_pvr_ioctl_`` prefix and an86* ``_args suffix``. They are therefore omitted from @_data.87*88* This should only be used to build the constants described below; it should89* never be used to call an IOCTL directly.90*91* Return: An IOCTL number to be passed to ioctl() from userspace.92*/93#define PVR_IOCTL(_ioctl, _mode, _data) \94_mode(DRM_COMMAND_BASE + (_ioctl), struct drm_pvr_ioctl_##_data##_args)9596#define DRM_IOCTL_PVR_DEV_QUERY PVR_IOCTL(0x00, DRM_IOWR, dev_query)97#define DRM_IOCTL_PVR_CREATE_BO PVR_IOCTL(0x01, DRM_IOWR, create_bo)98#define DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET PVR_IOCTL(0x02, DRM_IOWR, get_bo_mmap_offset)99#define DRM_IOCTL_PVR_CREATE_VM_CONTEXT PVR_IOCTL(0x03, DRM_IOWR, create_vm_context)100#define DRM_IOCTL_PVR_DESTROY_VM_CONTEXT PVR_IOCTL(0x04, DRM_IOW, destroy_vm_context)101#define DRM_IOCTL_PVR_VM_MAP PVR_IOCTL(0x05, DRM_IOW, vm_map)102#define DRM_IOCTL_PVR_VM_UNMAP PVR_IOCTL(0x06, DRM_IOW, vm_unmap)103#define DRM_IOCTL_PVR_CREATE_CONTEXT PVR_IOCTL(0x07, DRM_IOWR, create_context)104#define DRM_IOCTL_PVR_DESTROY_CONTEXT PVR_IOCTL(0x08, DRM_IOW, destroy_context)105#define DRM_IOCTL_PVR_CREATE_FREE_LIST PVR_IOCTL(0x09, DRM_IOWR, create_free_list)106#define DRM_IOCTL_PVR_DESTROY_FREE_LIST PVR_IOCTL(0x0a, DRM_IOW, destroy_free_list)107#define DRM_IOCTL_PVR_CREATE_HWRT_DATASET PVR_IOCTL(0x0b, DRM_IOWR, create_hwrt_dataset)108#define DRM_IOCTL_PVR_DESTROY_HWRT_DATASET PVR_IOCTL(0x0c, DRM_IOW, destroy_hwrt_dataset)109#define DRM_IOCTL_PVR_SUBMIT_JOBS PVR_IOCTL(0x0d, DRM_IOW, submit_jobs)110111/**112* DOC: PowerVR IOCTL DEV_QUERY interface113*/114115/**116* struct drm_pvr_dev_query_gpu_info - Container used to fetch information about117* the graphics processor.118*119* When fetching this type &struct drm_pvr_ioctl_dev_query_args.type must be set120* to %DRM_PVR_DEV_QUERY_GPU_INFO_GET.121*/122struct drm_pvr_dev_query_gpu_info {123/**124* @gpu_id: GPU identifier.125*126* For all currently supported GPUs this is the BVNC encoded as a 64-bit127* value as follows:128*129* +--------+--------+--------+-------+130* | 63..48 | 47..32 | 31..16 | 15..0 |131* +========+========+========+=======+132* | B | V | N | C |133* +--------+--------+--------+-------+134*/135__u64 gpu_id;136137/**138* @num_phantoms: Number of Phantoms present.139*/140__u32 num_phantoms;141142/** @_padding_c: Reserved. This field must be zeroed. */143__u32 _padding_c;144};145146/**147* struct drm_pvr_dev_query_runtime_info - Container used to fetch information148* about the graphics runtime.149*150* When fetching this type &struct drm_pvr_ioctl_dev_query_args.type must be set151* to %DRM_PVR_DEV_QUERY_RUNTIME_INFO_GET.152*/153struct drm_pvr_dev_query_runtime_info {154/**155* @free_list_min_pages: Minimum allowed free list size,156* in PM physical pages.157*/158__u64 free_list_min_pages;159160/**161* @free_list_max_pages: Maximum allowed free list size,162* in PM physical pages.163*/164__u64 free_list_max_pages;165166/**167* @common_store_alloc_region_size: Size of the Allocation168* Region within the Common Store used for coefficient and shared169* registers, in dwords.170*/171__u32 common_store_alloc_region_size;172173/**174* @common_store_partition_space_size: Size of the175* Partition Space within the Common Store for output buffers, in176* dwords.177*/178__u32 common_store_partition_space_size;179180/**181* @max_coeffs: Maximum coefficients, in dwords.182*/183__u32 max_coeffs;184185/**186* @cdm_max_local_mem_size_regs: Maximum amount of local187* memory available to a compute kernel, in dwords.188*/189__u32 cdm_max_local_mem_size_regs;190};191192/**193* struct drm_pvr_dev_query_quirks - Container used to fetch information about194* hardware fixes for which the device may require support in the user mode195* driver.196*197* When fetching this type &struct drm_pvr_ioctl_dev_query_args.type must be set198* to %DRM_PVR_DEV_QUERY_QUIRKS_GET.199*/200struct drm_pvr_dev_query_quirks {201/**202* @quirks: A userspace address for the hardware quirks __u32 array.203*204* The first @musthave_count items in the list are quirks that the205* client must support for this device. If userspace does not support206* all these quirks then functionality is not guaranteed and client207* initialisation must fail.208* The remaining quirks in the list affect userspace and the kernel or209* firmware. They are disabled by default and require userspace to210* opt-in. The opt-in mechanism depends on the quirk.211*/212__u64 quirks;213214/** @count: Length of @quirks (number of __u32). */215__u16 count;216217/**218* @musthave_count: The number of entries in @quirks that are219* mandatory, starting at index 0.220*/221__u16 musthave_count;222223/** @_padding_c: Reserved. This field must be zeroed. */224__u32 _padding_c;225};226227/**228* struct drm_pvr_dev_query_enhancements - Container used to fetch information229* about optional enhancements supported by the device that require support in230* the user mode driver.231*232* When fetching this type &struct drm_pvr_ioctl_dev_query_args.type must be set233* to %DRM_PVR_DEV_ENHANCEMENTS_GET.234*/235struct drm_pvr_dev_query_enhancements {236/**237* @enhancements: A userspace address for the hardware enhancements238* __u32 array.239*240* These enhancements affect userspace and the kernel or firmware. They241* are disabled by default and require userspace to opt-in. The opt-in242* mechanism depends on the enhancement.243*/244__u64 enhancements;245246/** @count: Length of @enhancements (number of __u32). */247__u16 count;248249/** @_padding_a: Reserved. This field must be zeroed. */250__u16 _padding_a;251252/** @_padding_c: Reserved. This field must be zeroed. */253__u32 _padding_c;254};255256/**257* enum drm_pvr_heap_id - Array index for heap info data returned by258* %DRM_PVR_DEV_QUERY_HEAP_INFO_GET.259*260* For compatibility reasons all indices will be present in the returned array,261* however some heaps may not be present. These are indicated where262* &struct drm_pvr_heap.size is set to zero.263*/264enum drm_pvr_heap_id {265/** @DRM_PVR_HEAP_GENERAL: General purpose heap. */266DRM_PVR_HEAP_GENERAL = 0,267/** @DRM_PVR_HEAP_PDS_CODE_DATA: PDS code and data heap. */268DRM_PVR_HEAP_PDS_CODE_DATA,269/** @DRM_PVR_HEAP_USC_CODE: USC code heap. */270DRM_PVR_HEAP_USC_CODE,271/** @DRM_PVR_HEAP_RGNHDR: Region header heap. Only used if GPU has BRN63142. */272DRM_PVR_HEAP_RGNHDR,273/** @DRM_PVR_HEAP_VIS_TEST: Visibility test heap. */274DRM_PVR_HEAP_VIS_TEST,275/** @DRM_PVR_HEAP_TRANSFER_FRAG: Transfer fragment heap. */276DRM_PVR_HEAP_TRANSFER_FRAG,277278/**279* @DRM_PVR_HEAP_COUNT: The number of heaps returned by280* %DRM_PVR_DEV_QUERY_HEAP_INFO_GET.281*282* More heaps may be added, so this also serves as the copy limit when283* sent by the caller.284*/285DRM_PVR_HEAP_COUNT286/* Please only add additional heaps above DRM_PVR_HEAP_COUNT! */287};288289/**290* struct drm_pvr_heap - Container holding information about a single heap.291*292* This will always be fetched as an array.293*/294struct drm_pvr_heap {295/** @base: Base address of heap. */296__u64 base;297298/** @size: Size of heap, in bytes. Will be 0 if the heap is not present. */299__u64 size;300301/** @flags: Flags for this heap. Currently always 0. */302__u32 flags;303304/** @page_size_log2: Log2 of page size. */305__u32 page_size_log2;306};307308/**309* struct drm_pvr_dev_query_heap_info - Container used to fetch information310* about heaps supported by the device driver.311*312* Please note all driver-supported heaps will be returned up to &heaps.count.313* Some heaps will not be present in all devices, which will be indicated by314* &struct drm_pvr_heap.size being set to zero.315*316* When fetching this type &struct drm_pvr_ioctl_dev_query_args.type must be set317* to %DRM_PVR_DEV_QUERY_HEAP_INFO_GET.318*/319struct drm_pvr_dev_query_heap_info {320/**321* @heaps: Array of &struct drm_pvr_heap. If pointer is NULL, the count322* and stride will be updated with those known to the driver version, to323* facilitate allocation by the caller.324*/325struct drm_pvr_obj_array heaps;326};327328/**329* enum drm_pvr_static_data_area_usage - Array index for static data area info330* returned by %DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET.331*332* For compatibility reasons all indices will be present in the returned array,333* however some areas may not be present. These are indicated where334* &struct drm_pvr_static_data_area.size is set to zero.335*/336enum drm_pvr_static_data_area_usage {337/**338* @DRM_PVR_STATIC_DATA_AREA_EOT: End of Tile PDS program code segment.339*340* The End of Tile PDS task runs at completion of a tile during a fragment job, and is341* responsible for emitting the tile to the Pixel Back End.342*/343DRM_PVR_STATIC_DATA_AREA_EOT = 0,344345/**346* @DRM_PVR_STATIC_DATA_AREA_FENCE: MCU fence area, used during cache flush and347* invalidation.348*349* This must point to valid physical memory but the contents otherwise are not used.350*/351DRM_PVR_STATIC_DATA_AREA_FENCE,352353/**354* @DRM_PVR_STATIC_DATA_AREA_VDM_SYNC: VDM sync program.355*356* The VDM sync program is used to synchronise multiple areas of the GPU hardware.357*/358DRM_PVR_STATIC_DATA_AREA_VDM_SYNC,359360/**361* @DRM_PVR_STATIC_DATA_AREA_YUV_CSC: YUV coefficients.362*363* Area contains up to 16 slots with stride of 64 bytes. Each is a 3x4 matrix of u16 fixed364* point numbers, with 1 sign bit, 2 integer bits and 13 fractional bits.365*366* The slots are :367* 0 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR368* 1 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR (full range)369* 2 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR (conformant range)370* 3 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR (full range)371* 4 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR (conformant range)372* 5 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR (full range)373* 6 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR (conformant range)374* 7 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR (full range)375* 8 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR (conformant range)376* 9 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR (conformant range, 10 bit)377* 10 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR (conformant range, 10 bit)378* 11 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR (conformant range, 10 bit)379* 14 = Identity (biased)380* 15 = Identity381*/382DRM_PVR_STATIC_DATA_AREA_YUV_CSC,383};384385/**386* struct drm_pvr_static_data_area - Container holding information about a387* single static data area.388*389* This will always be fetched as an array.390*/391struct drm_pvr_static_data_area {392/**393* @area_usage: Usage of static data area.394* See &enum drm_pvr_static_data_area_usage.395*/396__u16 area_usage;397398/**399* @location_heap_id: Array index of heap where this of static data400* area is located. This array is fetched using401* %DRM_PVR_DEV_QUERY_HEAP_INFO_GET.402*/403__u16 location_heap_id;404405/** @size: Size of static data area. Not present if set to zero. */406__u32 size;407408/** @offset: Offset of static data area from start of heap. */409__u64 offset;410};411412/**413* struct drm_pvr_dev_query_static_data_areas - Container used to fetch414* information about the static data areas in heaps supported by the device415* driver.416*417* Please note all driver-supported static data areas will be returned up to418* &static_data_areas.count. Some will not be present for all devices which,419* will be indicated by &struct drm_pvr_static_data_area.size being set to zero.420*421* Further, some heaps will not be present either. See &struct422* drm_pvr_dev_query_heap_info.423*424* When fetching this type &struct drm_pvr_ioctl_dev_query_args.type must be set425* to %DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET.426*/427struct drm_pvr_dev_query_static_data_areas {428/**429* @static_data_areas: Array of &struct drm_pvr_static_data_area. If430* pointer is NULL, the count and stride will be updated with those431* known to the driver version, to facilitate allocation by the caller.432*/433struct drm_pvr_obj_array static_data_areas;434};435436/**437* enum drm_pvr_dev_query - For use with &drm_pvr_ioctl_dev_query_args.type to438* indicate the type of the receiving container.439*440* Append only. Do not reorder.441*/442enum drm_pvr_dev_query {443/**444* @DRM_PVR_DEV_QUERY_GPU_INFO_GET: The dev query args contain a pointer445* to &struct drm_pvr_dev_query_gpu_info.446*/447DRM_PVR_DEV_QUERY_GPU_INFO_GET = 0,448449/**450* @DRM_PVR_DEV_QUERY_RUNTIME_INFO_GET: The dev query args contain a451* pointer to &struct drm_pvr_dev_query_runtime_info.452*/453DRM_PVR_DEV_QUERY_RUNTIME_INFO_GET,454455/**456* @DRM_PVR_DEV_QUERY_QUIRKS_GET: The dev query args contain a pointer457* to &struct drm_pvr_dev_query_quirks.458*/459DRM_PVR_DEV_QUERY_QUIRKS_GET,460461/**462* @DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET: The dev query args contain a463* pointer to &struct drm_pvr_dev_query_enhancements.464*/465DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET,466467/**468* @DRM_PVR_DEV_QUERY_HEAP_INFO_GET: The dev query args contain a469* pointer to &struct drm_pvr_dev_query_heap_info.470*/471DRM_PVR_DEV_QUERY_HEAP_INFO_GET,472473/**474* @DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET: The dev query args contain475* a pointer to &struct drm_pvr_dev_query_static_data_areas.476*/477DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET,478};479480/**481* struct drm_pvr_ioctl_dev_query_args - Arguments for %DRM_IOCTL_PVR_DEV_QUERY.482*/483struct drm_pvr_ioctl_dev_query_args {484/**485* @type: Type of query and output struct. See &enum drm_pvr_dev_query.486*/487__u32 type;488489/**490* @size: Size of the receiving struct, see @type.491*492* After a successful call this will be updated to the written byte493* length.494* Can also be used to get the minimum byte length (see @pointer).495* This allows additional fields to be appended to the structs in496* future.497*/498__u32 size;499500/**501* @pointer: Pointer to struct @type.502*503* Must be large enough to contain @size bytes.504* If pointer is NULL, the expected size will be returned in the @size505* field, but no other data will be written.506*/507__u64 pointer;508};509510/**511* DOC: PowerVR IOCTL CREATE_BO interface512*/513514/**515* DOC: Flags for CREATE_BO516*517* We use "device" to refer to the GPU here because of the ambiguity between CPU and GPU in some518* fonts.519*520* Device mapping options521* :DRM_PVR_BO_BYPASS_DEVICE_CACHE: Specify that device accesses to this memory will bypass the522* cache. This is used for buffers that will either be regularly updated by the CPU (eg free523* lists) or will be accessed only once and therefore isn't worth caching (eg partial render524* buffers).525* By default, the device flushes its memory caches after every job, so this is not normally526* required for coherency.527* :DRM_PVR_BO_PM_FW_PROTECT: Specify that only the Parameter Manager (PM) and/or firmware528* processor should be allowed to access this memory when mapped to the device. It is not529* valid to specify this flag with DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS.530*531* CPU mapping options532* :DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS: Allow userspace to map and access the contents of this533* memory. It is not valid to specify this flag with DRM_PVR_BO_PM_FW_PROTECT.534*/535#define DRM_PVR_BO_BYPASS_DEVICE_CACHE _BITULL(0)536#define DRM_PVR_BO_PM_FW_PROTECT _BITULL(1)537#define DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS _BITULL(2)538/* Bits 3..63 are reserved. */539540#define DRM_PVR_BO_FLAGS_MASK (DRM_PVR_BO_BYPASS_DEVICE_CACHE | DRM_PVR_BO_PM_FW_PROTECT | \541DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS)542543/**544* struct drm_pvr_ioctl_create_bo_args - Arguments for %DRM_IOCTL_PVR_CREATE_BO545*/546struct drm_pvr_ioctl_create_bo_args {547/**548* @size: [IN] Size of buffer object to create. This must be page size549* aligned.550*/551__u64 size;552553/**554* @handle: [OUT] GEM handle of the new buffer object for use in555* userspace.556*/557__u32 handle;558559/** @_padding_c: Reserved. This field must be zeroed. */560__u32 _padding_c;561562/**563* @flags: [IN] Options which will affect the behaviour of this564* creation operation and future mapping operations on the created565* object. This field must be a valid combination of ``DRM_PVR_BO_*``566* values, with all bits marked as reserved set to zero.567*/568__u64 flags;569};570571/**572* DOC: PowerVR IOCTL GET_BO_MMAP_OFFSET interface573*/574575/**576* struct drm_pvr_ioctl_get_bo_mmap_offset_args - Arguments for577* %DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET578*579* Like other DRM drivers, the "mmap" IOCTL doesn't actually map any memory.580* Instead, it allocates a fake offset which refers to the specified buffer581* object. This offset can be used with a real mmap call on the DRM device582* itself.583*/584struct drm_pvr_ioctl_get_bo_mmap_offset_args {585/** @handle: [IN] GEM handle of the buffer object to be mapped. */586__u32 handle;587588/** @_padding_4: Reserved. This field must be zeroed. */589__u32 _padding_4;590591/** @offset: [OUT] Fake offset to use in the real mmap call. */592__u64 offset;593};594595/**596* DOC: PowerVR IOCTL CREATE_VM_CONTEXT and DESTROY_VM_CONTEXT interfaces597*/598599/**600* struct drm_pvr_ioctl_create_vm_context_args - Arguments for601* %DRM_IOCTL_PVR_CREATE_VM_CONTEXT602*/603struct drm_pvr_ioctl_create_vm_context_args {604/** @handle: [OUT] Handle for new VM context. */605__u32 handle;606607/** @_padding_4: Reserved. This field must be zeroed. */608__u32 _padding_4;609};610611/**612* struct drm_pvr_ioctl_destroy_vm_context_args - Arguments for613* %DRM_IOCTL_PVR_DESTROY_VM_CONTEXT614*/615struct drm_pvr_ioctl_destroy_vm_context_args {616/**617* @handle: [IN] Handle for VM context to be destroyed.618*/619__u32 handle;620621/** @_padding_4: Reserved. This field must be zeroed. */622__u32 _padding_4;623};624625/**626* DOC: PowerVR IOCTL VM_MAP and VM_UNMAP interfaces627*628* The VM UAPI allows userspace to create buffer object mappings in GPU virtual address space.629*630* The client is responsible for managing GPU address space. It should allocate mappings within631* the heaps returned by %DRM_PVR_DEV_QUERY_HEAP_INFO_GET.632*633* %DRM_IOCTL_PVR_VM_MAP creates a new mapping. The client provides the target virtual address for634* the mapping. Size and offset within the mapped buffer object can be specified, so the client can635* partially map a buffer.636*637* %DRM_IOCTL_PVR_VM_UNMAP removes a mapping. The entire mapping will be removed from GPU address638* space only if the size of the mapping matches that known to the driver.639*/640641/**642* struct drm_pvr_ioctl_vm_map_args - Arguments for %DRM_IOCTL_PVR_VM_MAP.643*/644struct drm_pvr_ioctl_vm_map_args {645/**646* @vm_context_handle: [IN] Handle for VM context for this mapping to647* exist in.648*/649__u32 vm_context_handle;650651/** @flags: [IN] Flags which affect this mapping. Currently always 0. */652__u32 flags;653654/**655* @device_addr: [IN] Requested device-virtual address for the mapping.656* This must be non-zero and aligned to the device page size for the657* heap containing the requested address. It is an error to specify an658* address which is not contained within one of the heaps returned by659* %DRM_PVR_DEV_QUERY_HEAP_INFO_GET.660*/661__u64 device_addr;662663/**664* @handle: [IN] Handle of the target buffer object. This must be a665* valid handle returned by %DRM_IOCTL_PVR_CREATE_BO.666*/667__u32 handle;668669/** @_padding_14: Reserved. This field must be zeroed. */670__u32 _padding_14;671672/**673* @offset: [IN] Offset into the target bo from which to begin the674* mapping.675*/676__u64 offset;677678/**679* @size: [IN] Size of the requested mapping. Must be aligned to680* the device page size for the heap containing the requested address,681* as well as the host page size. When added to @device_addr, the682* result must not overflow the heap which contains @device_addr (i.e.683* the range specified by @device_addr and @size must be completely684* contained within a single heap specified by685* %DRM_PVR_DEV_QUERY_HEAP_INFO_GET).686*/687__u64 size;688};689690/**691* struct drm_pvr_ioctl_vm_unmap_args - Arguments for %DRM_IOCTL_PVR_VM_UNMAP.692*/693struct drm_pvr_ioctl_vm_unmap_args {694/**695* @vm_context_handle: [IN] Handle for VM context that this mapping696* exists in.697*/698__u32 vm_context_handle;699700/** @_padding_4: Reserved. This field must be zeroed. */701__u32 _padding_4;702703/**704* @device_addr: [IN] Device-virtual address at the start of the target705* mapping. This must be non-zero.706*/707__u64 device_addr;708709/**710* @size: Size in bytes of the target mapping. This must be non-zero.711*/712__u64 size;713};714715/**716* DOC: PowerVR IOCTL CREATE_CONTEXT and DESTROY_CONTEXT interfaces717*/718719/**720* enum drm_pvr_ctx_priority - Arguments for721* &drm_pvr_ioctl_create_context_args.priority722*/723enum drm_pvr_ctx_priority {724/** @DRM_PVR_CTX_PRIORITY_LOW: Priority below normal. */725DRM_PVR_CTX_PRIORITY_LOW = -512,726727/** @DRM_PVR_CTX_PRIORITY_NORMAL: Normal priority. */728DRM_PVR_CTX_PRIORITY_NORMAL = 0,729730/**731* @DRM_PVR_CTX_PRIORITY_HIGH: Priority above normal.732* Note this requires ``CAP_SYS_NICE`` or ``DRM_MASTER``.733*/734DRM_PVR_CTX_PRIORITY_HIGH = 512,735};736737/**738* enum drm_pvr_ctx_type - Arguments for739* &struct drm_pvr_ioctl_create_context_args.type740*/741enum drm_pvr_ctx_type {742/**743* @DRM_PVR_CTX_TYPE_RENDER: Render context.744*/745DRM_PVR_CTX_TYPE_RENDER = 0,746747/**748* @DRM_PVR_CTX_TYPE_COMPUTE: Compute context.749*/750DRM_PVR_CTX_TYPE_COMPUTE,751752/**753* @DRM_PVR_CTX_TYPE_TRANSFER_FRAG: Transfer context for fragment data754* master.755*/756DRM_PVR_CTX_TYPE_TRANSFER_FRAG,757};758759/**760* struct drm_pvr_ioctl_create_context_args - Arguments for761* %DRM_IOCTL_PVR_CREATE_CONTEXT762*/763struct drm_pvr_ioctl_create_context_args {764/**765* @type: [IN] Type of context to create.766*767* This must be one of the values defined by &enum drm_pvr_ctx_type.768*/769__u32 type;770771/** @flags: [IN] Flags for context. */772__u32 flags;773774/**775* @priority: [IN] Priority of new context.776*777* This must be one of the values defined by &enum drm_pvr_ctx_priority.778*/779__s32 priority;780781/** @handle: [OUT] Handle for new context. */782__u32 handle;783784/**785* @static_context_state: [IN] Pointer to static context state stream.786*/787__u64 static_context_state;788789/**790* @static_context_state_len: [IN] Length of static context state, in bytes.791*/792__u32 static_context_state_len;793794/**795* @vm_context_handle: [IN] Handle for VM context that this context is796* associated with.797*/798__u32 vm_context_handle;799800/**801* @callstack_addr: [IN] Address for initial call stack pointer. Only valid802* if @type is %DRM_PVR_CTX_TYPE_RENDER, otherwise must be 0.803*/804__u64 callstack_addr;805};806807/**808* struct drm_pvr_ioctl_destroy_context_args - Arguments for809* %DRM_IOCTL_PVR_DESTROY_CONTEXT810*/811struct drm_pvr_ioctl_destroy_context_args {812/**813* @handle: [IN] Handle for context to be destroyed.814*/815__u32 handle;816817/** @_padding_4: Reserved. This field must be zeroed. */818__u32 _padding_4;819};820821/**822* DOC: PowerVR IOCTL CREATE_FREE_LIST and DESTROY_FREE_LIST interfaces823*/824825/**826* struct drm_pvr_ioctl_create_free_list_args - Arguments for827* %DRM_IOCTL_PVR_CREATE_FREE_LIST828*829* Free list arguments have the following constraints :830*831* - @max_num_pages must be greater than zero.832* - @grow_threshold must be between 0 and 100.833* - @grow_num_pages must be less than or equal to &max_num_pages.834* - @initial_num_pages, @max_num_pages and @grow_num_pages must be multiples835* of 4.836* - When &grow_num_pages is 0, @initial_num_pages must be equal to837* @max_num_pages.838* - When &grow_num_pages is non-zero, @initial_num_pages must be less than839* @max_num_pages.840*/841struct drm_pvr_ioctl_create_free_list_args {842/**843* @free_list_gpu_addr: [IN] Address of GPU mapping of buffer object844* containing memory to be used by free list.845*846* The mapped region of the buffer object must be at least847* @max_num_pages * ``sizeof(__u32)``.848*849* The buffer object must have been created with850* %DRM_PVR_BO_DEVICE_PM_FW_PROTECT set and851* %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS not set.852*/853__u64 free_list_gpu_addr;854855/** @initial_num_pages: [IN] Pages initially allocated to free list. */856__u32 initial_num_pages;857858/** @max_num_pages: [IN] Maximum number of pages in free list. */859__u32 max_num_pages;860861/** @grow_num_pages: [IN] Pages to grow free list by per request. */862__u32 grow_num_pages;863864/**865* @grow_threshold: [IN] Percentage of FL memory used that should866* trigger a new grow request.867*/868__u32 grow_threshold;869870/**871* @vm_context_handle: [IN] Handle for VM context that the free list buffer872* object is mapped in.873*/874__u32 vm_context_handle;875876/**877* @handle: [OUT] Handle for created free list.878*/879__u32 handle;880};881882/**883* struct drm_pvr_ioctl_destroy_free_list_args - Arguments for884* %DRM_IOCTL_PVR_DESTROY_FREE_LIST885*/886struct drm_pvr_ioctl_destroy_free_list_args {887/**888* @handle: [IN] Handle for free list to be destroyed.889*/890__u32 handle;891892/** @_padding_4: Reserved. This field must be zeroed. */893__u32 _padding_4;894};895896/**897* DOC: PowerVR IOCTL CREATE_HWRT_DATASET and DESTROY_HWRT_DATASET interfaces898*/899900/**901* struct drm_pvr_create_hwrt_geom_data_args - Geometry data arguments used for902* &struct drm_pvr_ioctl_create_hwrt_dataset_args.geom_data_args.903*/904struct drm_pvr_create_hwrt_geom_data_args {905/** @tpc_dev_addr: [IN] Tail pointer cache GPU virtual address. */906__u64 tpc_dev_addr;907908/** @tpc_size: [IN] Size of TPC, in bytes. */909__u32 tpc_size;910911/** @tpc_stride: [IN] Stride between layers in TPC, in pages */912__u32 tpc_stride;913914/** @vheap_table_dev_addr: [IN] VHEAP table GPU virtual address. */915__u64 vheap_table_dev_addr;916917/** @rtc_dev_addr: [IN] Render Target Cache virtual address. */918__u64 rtc_dev_addr;919};920921/**922* struct drm_pvr_create_hwrt_rt_data_args - Render target arguments used for923* &struct drm_pvr_ioctl_create_hwrt_dataset_args.rt_data_args.924*/925struct drm_pvr_create_hwrt_rt_data_args {926/** @pm_mlist_dev_addr: [IN] PM MLIST GPU virtual address. */927__u64 pm_mlist_dev_addr;928929/** @macrotile_array_dev_addr: [IN] Macrotile array GPU virtual address. */930__u64 macrotile_array_dev_addr;931932/** @region_header_dev_addr: [IN] Region header array GPU virtual address. */933__u64 region_header_dev_addr;934};935936#define PVR_DRM_HWRT_FREE_LIST_LOCAL 0937#define PVR_DRM_HWRT_FREE_LIST_GLOBAL 1U938939/**940* struct drm_pvr_ioctl_create_hwrt_dataset_args - Arguments for941* %DRM_IOCTL_PVR_CREATE_HWRT_DATASET942*/943struct drm_pvr_ioctl_create_hwrt_dataset_args {944/** @geom_data_args: [IN] Geometry data arguments. */945struct drm_pvr_create_hwrt_geom_data_args geom_data_args;946947/**948* @rt_data_args: [IN] Array of render target arguments.949*950* Each entry in this array represents a render target in a double buffered951* setup.952*/953struct drm_pvr_create_hwrt_rt_data_args rt_data_args[2];954955/**956* @free_list_handles: [IN] Array of free list handles.957*958* free_list_handles[PVR_DRM_HWRT_FREE_LIST_LOCAL] must have initial959* size of at least that reported by960* &drm_pvr_dev_query_runtime_info.free_list_min_pages.961*/962__u32 free_list_handles[2];963964/** @width: [IN] Width in pixels. */965__u32 width;966967/** @height: [IN] Height in pixels. */968__u32 height;969970/** @samples: [IN] Number of samples. */971__u32 samples;972973/** @layers: [IN] Number of layers. */974__u32 layers;975976/** @isp_merge_lower_x: [IN] Lower X coefficient for triangle merging. */977__u32 isp_merge_lower_x;978979/** @isp_merge_lower_y: [IN] Lower Y coefficient for triangle merging. */980__u32 isp_merge_lower_y;981982/** @isp_merge_scale_x: [IN] Scale X coefficient for triangle merging. */983__u32 isp_merge_scale_x;984985/** @isp_merge_scale_y: [IN] Scale Y coefficient for triangle merging. */986__u32 isp_merge_scale_y;987988/** @isp_merge_upper_x: [IN] Upper X coefficient for triangle merging. */989__u32 isp_merge_upper_x;990991/** @isp_merge_upper_y: [IN] Upper Y coefficient for triangle merging. */992__u32 isp_merge_upper_y;993994/**995* @region_header_size: [IN] Size of region header array. This common field is used by996* both render targets in this data set.997*998* The units for this field differ depending on what version of the simple internal999* parameter format the device uses. If format 2 is in use then this is interpreted as the1000* number of region headers. For other formats it is interpreted as the size in dwords.1001*/1002__u32 region_header_size;10031004/**1005* @handle: [OUT] Handle for created HWRT dataset.1006*/1007__u32 handle;1008};10091010/**1011* struct drm_pvr_ioctl_destroy_hwrt_dataset_args - Arguments for1012* %DRM_IOCTL_PVR_DESTROY_HWRT_DATASET1013*/1014struct drm_pvr_ioctl_destroy_hwrt_dataset_args {1015/**1016* @handle: [IN] Handle for HWRT dataset to be destroyed.1017*/1018__u32 handle;10191020/** @_padding_4: Reserved. This field must be zeroed. */1021__u32 _padding_4;1022};10231024/**1025* DOC: PowerVR IOCTL SUBMIT_JOBS interface1026*/10271028/**1029* DOC: Flags for the drm_pvr_sync_op object.1030*1031* .. c:macro:: DRM_PVR_SYNC_OP_HANDLE_TYPE_MASK1032*1033* Handle type mask for the drm_pvr_sync_op::flags field.1034*1035* .. c:macro:: DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_SYNCOBJ1036*1037* Indicates the handle passed in drm_pvr_sync_op::handle is a syncobj handle.1038* This is the default type.1039*1040* .. c:macro:: DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_TIMELINE_SYNCOBJ1041*1042* Indicates the handle passed in drm_pvr_sync_op::handle is a timeline syncobj handle.1043*1044* .. c:macro:: DRM_PVR_SYNC_OP_FLAG_SIGNAL1045*1046* Signal operation requested. The out-fence bound to the job will be attached to1047* the syncobj whose handle is passed in drm_pvr_sync_op::handle.1048*1049* .. c:macro:: DRM_PVR_SYNC_OP_FLAG_WAIT1050*1051* Wait operation requested. The job will wait for this particular syncobj or syncobj1052* point to be signaled before being started.1053* This is the default operation.1054*/1055#define DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_MASK 0xf1056#define DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_SYNCOBJ 01057#define DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_TIMELINE_SYNCOBJ 11058#define DRM_PVR_SYNC_OP_FLAG_SIGNAL _BITULL(31)1059#define DRM_PVR_SYNC_OP_FLAG_WAIT 010601061#define DRM_PVR_SYNC_OP_FLAGS_MASK (DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_MASK | \1062DRM_PVR_SYNC_OP_FLAG_SIGNAL)10631064/**1065* struct drm_pvr_sync_op - Object describing a sync operation1066*/1067struct drm_pvr_sync_op {1068/** @handle: Handle of sync object. */1069__u32 handle;10701071/** @flags: Combination of ``DRM_PVR_SYNC_OP_FLAG_`` flags. */1072__u32 flags;10731074/** @value: Timeline value for this drm_syncobj. MBZ for a binary syncobj. */1075__u64 value;1076};10771078/**1079* DOC: Flags for SUBMIT_JOB ioctl geometry command.1080*1081* .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST1082*1083* Indicates if this the first command to be issued for a render.1084*1085* .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST1086*1087* Indicates if this the last command to be issued for a render.1088*1089* .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE1090*1091* Forces to use single core in a multi core device.1092*1093* .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK1094*1095* Logical OR of all the geometry cmd flags.1096*/1097#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST _BITULL(0)1098#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST _BITULL(1)1099#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE _BITULL(2)1100#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK \1101(DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST | \1102DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST | \1103DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE)11041105/**1106* DOC: Flags for SUBMIT_JOB ioctl fragment command.1107*1108* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE1109*1110* Use single core in a multi core setup.1111*1112* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER1113*1114* Indicates whether a depth buffer is present.1115*1116* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER1117*1118* Indicates whether a stencil buffer is present.1119*1120* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP1121*1122* Disallow compute overlapped with this render.1123*1124* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_GET_VIS_RESULTS1125*1126* Indicates whether this render produces visibility results.1127*1128* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_SCRATCHBUFFER1129*1130* Indicates whether partial renders write to a scratch buffer instead of1131* the final surface. It also forces the full screen copy expected to be1132* present on the last render after all partial renders have completed.1133*1134* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_DISABLE_PIXELMERGE1135*1136* Disable pixel merging for this render.1137*1138* .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK1139*1140* Logical OR of all the fragment cmd flags.1141*/1142#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE _BITULL(0)1143#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER _BITULL(1)1144#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER _BITULL(2)1145#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP _BITULL(3)1146#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_SCRATCHBUFFER _BITULL(4)1147#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_GET_VIS_RESULTS _BITULL(5)1148#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_PARTIAL_RENDER _BITULL(6)1149#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_DISABLE_PIXELMERGE _BITULL(7)1150#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK \1151(DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE | \1152DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER | \1153DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER | \1154DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP | \1155DRM_PVR_SUBMIT_JOB_FRAG_CMD_SCRATCHBUFFER | \1156DRM_PVR_SUBMIT_JOB_FRAG_CMD_GET_VIS_RESULTS | \1157DRM_PVR_SUBMIT_JOB_FRAG_CMD_PARTIAL_RENDER | \1158DRM_PVR_SUBMIT_JOB_FRAG_CMD_DISABLE_PIXELMERGE)11591160/**1161* DOC: Flags for SUBMIT_JOB ioctl compute command.1162*1163* .. c:macro:: DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP1164*1165* Disallow other jobs overlapped with this compute.1166*1167* .. c:macro:: DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE1168*1169* Forces to use single core in a multi core device.1170*1171* .. c:macro:: DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_FLAGS_MASK1172*1173* Logical OR of all the compute cmd flags.1174*/1175#define DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP _BITULL(0)1176#define DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE _BITULL(1)1177#define DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_FLAGS_MASK \1178(DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP | \1179DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE)11801181/**1182* DOC: Flags for SUBMIT_JOB ioctl transfer command.1183*1184* .. c:macro:: DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_SINGLE_CORE1185*1186* Forces job to use a single core in a multi core device.1187*1188* .. c:macro:: DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_FLAGS_MASK1189*1190* Logical OR of all the transfer cmd flags.1191*/1192#define DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_SINGLE_CORE _BITULL(0)11931194#define DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_FLAGS_MASK \1195DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_SINGLE_CORE11961197/**1198* enum drm_pvr_job_type - Arguments for &struct drm_pvr_job.job_type1199*/1200enum drm_pvr_job_type {1201/** @DRM_PVR_JOB_TYPE_GEOMETRY: Job type is geometry. */1202DRM_PVR_JOB_TYPE_GEOMETRY = 0,12031204/** @DRM_PVR_JOB_TYPE_FRAGMENT: Job type is fragment. */1205DRM_PVR_JOB_TYPE_FRAGMENT,12061207/** @DRM_PVR_JOB_TYPE_COMPUTE: Job type is compute. */1208DRM_PVR_JOB_TYPE_COMPUTE,12091210/** @DRM_PVR_JOB_TYPE_TRANSFER_FRAG: Job type is a fragment transfer. */1211DRM_PVR_JOB_TYPE_TRANSFER_FRAG,1212};12131214/**1215* struct drm_pvr_hwrt_data_ref - Reference HWRT data1216*/1217struct drm_pvr_hwrt_data_ref {1218/** @set_handle: HWRT data set handle. */1219__u32 set_handle;12201221/** @data_index: Index of the HWRT data inside the data set. */1222__u32 data_index;1223};12241225/**1226* struct drm_pvr_job - Job arguments passed to the %DRM_IOCTL_PVR_SUBMIT_JOBS ioctl1227*/1228struct drm_pvr_job {1229/**1230* @type: [IN] Type of job being submitted1231*1232* This must be one of the values defined by &enum drm_pvr_job_type.1233*/1234__u32 type;12351236/**1237* @context_handle: [IN] Context handle.1238*1239* When @job_type is %DRM_PVR_JOB_TYPE_RENDER, %DRM_PVR_JOB_TYPE_COMPUTE or1240* %DRM_PVR_JOB_TYPE_TRANSFER_FRAG, this must be a valid handle returned by1241* %DRM_IOCTL_PVR_CREATE_CONTEXT. The type of context must be compatible1242* with the type of job being submitted.1243*1244* When @job_type is %DRM_PVR_JOB_TYPE_NULL, this must be zero.1245*/1246__u32 context_handle;12471248/**1249* @flags: [IN] Flags for command.1250*1251* Those are job-dependent. See all ``DRM_PVR_SUBMIT_JOB_*``.1252*/1253__u32 flags;12541255/**1256* @cmd_stream_len: [IN] Length of command stream, in bytes.1257*/1258__u32 cmd_stream_len;12591260/**1261* @cmd_stream: [IN] Pointer to command stream for command.1262*1263* The command stream must be u64-aligned.1264*/1265__u64 cmd_stream;12661267/** @sync_ops: [IN] Fragment sync operations. */1268struct drm_pvr_obj_array sync_ops;12691270/**1271* @hwrt: [IN] HWRT data used by render jobs (geometry or fragment).1272*1273* Must be zero for non-render jobs.1274*/1275struct drm_pvr_hwrt_data_ref hwrt;1276};12771278/**1279* struct drm_pvr_ioctl_submit_jobs_args - Arguments for %DRM_IOCTL_PVR_SUBMIT_JOB1280*1281* If the syscall returns an error it is important to check the value of1282* @jobs.count. This indicates the index into @jobs.array where the1283* error occurred.1284*/1285struct drm_pvr_ioctl_submit_jobs_args {1286/** @jobs: [IN] Array of jobs to submit. */1287struct drm_pvr_obj_array jobs;1288};12891290#if defined(__cplusplus)1291}1292#endif12931294#endif /* PVR_DRM_UAPI_H */129512961297