162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright © 2014-2018 Broadcom 462306a36Sopenharmony_ci * Copyright © 2019 Collabora ltd. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef _PANFROST_DRM_H_ 762306a36Sopenharmony_ci#define _PANFROST_DRM_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "drm.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#if defined(__cplusplus) 1262306a36Sopenharmony_ciextern "C" { 1362306a36Sopenharmony_ci#endif 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define DRM_PANFROST_SUBMIT 0x00 1662306a36Sopenharmony_ci#define DRM_PANFROST_WAIT_BO 0x01 1762306a36Sopenharmony_ci#define DRM_PANFROST_CREATE_BO 0x02 1862306a36Sopenharmony_ci#define DRM_PANFROST_MMAP_BO 0x03 1962306a36Sopenharmony_ci#define DRM_PANFROST_GET_PARAM 0x04 2062306a36Sopenharmony_ci#define DRM_PANFROST_GET_BO_OFFSET 0x05 2162306a36Sopenharmony_ci#define DRM_PANFROST_PERFCNT_ENABLE 0x06 2262306a36Sopenharmony_ci#define DRM_PANFROST_PERFCNT_DUMP 0x07 2362306a36Sopenharmony_ci#define DRM_PANFROST_MADVISE 0x08 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_SUBMIT DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_SUBMIT, struct drm_panfrost_submit) 2662306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_WAIT_BO DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_WAIT_BO, struct drm_panfrost_wait_bo) 2762306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_CREATE_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_CREATE_BO, struct drm_panfrost_create_bo) 2862306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_MMAP_BO, struct drm_panfrost_mmap_bo) 2962306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_GET_PARAM, struct drm_panfrost_get_param) 3062306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_GET_BO_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_GET_BO_OFFSET, struct drm_panfrost_get_bo_offset) 3162306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFROST_MADVISE, struct drm_panfrost_madvise) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* 3462306a36Sopenharmony_ci * Unstable ioctl(s): only exposed when the unsafe unstable_ioctls module 3562306a36Sopenharmony_ci * param is set to true. 3662306a36Sopenharmony_ci * All these ioctl(s) are subject to deprecation, so please don't rely on 3762306a36Sopenharmony_ci * them for anything but debugging purpose. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_PERFCNT_ENABLE DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_PERFCNT_ENABLE, struct drm_panfrost_perfcnt_enable) 4062306a36Sopenharmony_ci#define DRM_IOCTL_PANFROST_PERFCNT_DUMP DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST_PERFCNT_DUMP, struct drm_panfrost_perfcnt_dump) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define PANFROST_JD_REQ_FS (1 << 0) 4362306a36Sopenharmony_ci/** 4462306a36Sopenharmony_ci * struct drm_panfrost_submit - ioctl argument for submitting commands to the 3D 4562306a36Sopenharmony_ci * engine. 4662306a36Sopenharmony_ci * 4762306a36Sopenharmony_ci * This asks the kernel to have the GPU execute a render command list. 4862306a36Sopenharmony_ci */ 4962306a36Sopenharmony_cistruct drm_panfrost_submit { 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /** Address to GPU mapping of job descriptor */ 5262306a36Sopenharmony_ci __u64 jc; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci /** An optional array of sync objects to wait on before starting this job. */ 5562306a36Sopenharmony_ci __u64 in_syncs; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci /** Number of sync objects to wait on before starting this job. */ 5862306a36Sopenharmony_ci __u32 in_sync_count; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci /** An optional sync object to place the completion fence in. */ 6162306a36Sopenharmony_ci __u32 out_sync; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci /** Pointer to a u32 array of the BOs that are referenced by the job. */ 6462306a36Sopenharmony_ci __u64 bo_handles; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci /** Number of BO handles passed in (size is that times 4). */ 6762306a36Sopenharmony_ci __u32 bo_handle_count; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci /** A combination of PANFROST_JD_REQ_* */ 7062306a36Sopenharmony_ci __u32 requirements; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/** 7462306a36Sopenharmony_ci * struct drm_panfrost_wait_bo - ioctl argument for waiting for 7562306a36Sopenharmony_ci * completion of the last DRM_PANFROST_SUBMIT on a BO. 7662306a36Sopenharmony_ci * 7762306a36Sopenharmony_ci * This is useful for cases where multiple processes might be 7862306a36Sopenharmony_ci * rendering to a BO and you want to wait for all rendering to be 7962306a36Sopenharmony_ci * completed. 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_cistruct drm_panfrost_wait_bo { 8262306a36Sopenharmony_ci __u32 handle; 8362306a36Sopenharmony_ci __u32 pad; 8462306a36Sopenharmony_ci __s64 timeout_ns; /* absolute */ 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* Valid flags to pass to drm_panfrost_create_bo */ 8862306a36Sopenharmony_ci#define PANFROST_BO_NOEXEC 1 8962306a36Sopenharmony_ci#define PANFROST_BO_HEAP 2 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/** 9262306a36Sopenharmony_ci * struct drm_panfrost_create_bo - ioctl argument for creating Panfrost BOs. 9362306a36Sopenharmony_ci * 9462306a36Sopenharmony_ci * The flags argument is a bit mask of PANFROST_BO_* flags. 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_cistruct drm_panfrost_create_bo { 9762306a36Sopenharmony_ci __u32 size; 9862306a36Sopenharmony_ci __u32 flags; 9962306a36Sopenharmony_ci /** Returned GEM handle for the BO. */ 10062306a36Sopenharmony_ci __u32 handle; 10162306a36Sopenharmony_ci /* Pad, must be zero-filled. */ 10262306a36Sopenharmony_ci __u32 pad; 10362306a36Sopenharmony_ci /** 10462306a36Sopenharmony_ci * Returned offset for the BO in the GPU address space. This offset 10562306a36Sopenharmony_ci * is private to the DRM fd and is valid for the lifetime of the GEM 10662306a36Sopenharmony_ci * handle. 10762306a36Sopenharmony_ci * 10862306a36Sopenharmony_ci * This offset value will always be nonzero, since various HW 10962306a36Sopenharmony_ci * units treat 0 specially. 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_ci __u64 offset; 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/** 11562306a36Sopenharmony_ci * struct drm_panfrost_mmap_bo - ioctl argument for mapping Panfrost BOs. 11662306a36Sopenharmony_ci * 11762306a36Sopenharmony_ci * This doesn't actually perform an mmap. Instead, it returns the 11862306a36Sopenharmony_ci * offset you need to use in an mmap on the DRM device node. This 11962306a36Sopenharmony_ci * means that tools like valgrind end up knowing about the mapped 12062306a36Sopenharmony_ci * memory. 12162306a36Sopenharmony_ci * 12262306a36Sopenharmony_ci * There are currently no values for the flags argument, but it may be 12362306a36Sopenharmony_ci * used in a future extension. 12462306a36Sopenharmony_ci */ 12562306a36Sopenharmony_cistruct drm_panfrost_mmap_bo { 12662306a36Sopenharmony_ci /** Handle for the object being mapped. */ 12762306a36Sopenharmony_ci __u32 handle; 12862306a36Sopenharmony_ci __u32 flags; 12962306a36Sopenharmony_ci /** offset into the drm node to use for subsequent mmap call. */ 13062306a36Sopenharmony_ci __u64 offset; 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cienum drm_panfrost_param { 13462306a36Sopenharmony_ci DRM_PANFROST_PARAM_GPU_PROD_ID, 13562306a36Sopenharmony_ci DRM_PANFROST_PARAM_GPU_REVISION, 13662306a36Sopenharmony_ci DRM_PANFROST_PARAM_SHADER_PRESENT, 13762306a36Sopenharmony_ci DRM_PANFROST_PARAM_TILER_PRESENT, 13862306a36Sopenharmony_ci DRM_PANFROST_PARAM_L2_PRESENT, 13962306a36Sopenharmony_ci DRM_PANFROST_PARAM_STACK_PRESENT, 14062306a36Sopenharmony_ci DRM_PANFROST_PARAM_AS_PRESENT, 14162306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_PRESENT, 14262306a36Sopenharmony_ci DRM_PANFROST_PARAM_L2_FEATURES, 14362306a36Sopenharmony_ci DRM_PANFROST_PARAM_CORE_FEATURES, 14462306a36Sopenharmony_ci DRM_PANFROST_PARAM_TILER_FEATURES, 14562306a36Sopenharmony_ci DRM_PANFROST_PARAM_MEM_FEATURES, 14662306a36Sopenharmony_ci DRM_PANFROST_PARAM_MMU_FEATURES, 14762306a36Sopenharmony_ci DRM_PANFROST_PARAM_THREAD_FEATURES, 14862306a36Sopenharmony_ci DRM_PANFROST_PARAM_MAX_THREADS, 14962306a36Sopenharmony_ci DRM_PANFROST_PARAM_THREAD_MAX_WORKGROUP_SZ, 15062306a36Sopenharmony_ci DRM_PANFROST_PARAM_THREAD_MAX_BARRIER_SZ, 15162306a36Sopenharmony_ci DRM_PANFROST_PARAM_COHERENCY_FEATURES, 15262306a36Sopenharmony_ci DRM_PANFROST_PARAM_TEXTURE_FEATURES0, 15362306a36Sopenharmony_ci DRM_PANFROST_PARAM_TEXTURE_FEATURES1, 15462306a36Sopenharmony_ci DRM_PANFROST_PARAM_TEXTURE_FEATURES2, 15562306a36Sopenharmony_ci DRM_PANFROST_PARAM_TEXTURE_FEATURES3, 15662306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES0, 15762306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES1, 15862306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES2, 15962306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES3, 16062306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES4, 16162306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES5, 16262306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES6, 16362306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES7, 16462306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES8, 16562306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES9, 16662306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES10, 16762306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES11, 16862306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES12, 16962306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES13, 17062306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES14, 17162306a36Sopenharmony_ci DRM_PANFROST_PARAM_JS_FEATURES15, 17262306a36Sopenharmony_ci DRM_PANFROST_PARAM_NR_CORE_GROUPS, 17362306a36Sopenharmony_ci DRM_PANFROST_PARAM_THREAD_TLS_ALLOC, 17462306a36Sopenharmony_ci DRM_PANFROST_PARAM_AFBC_FEATURES, 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistruct drm_panfrost_get_param { 17862306a36Sopenharmony_ci __u32 param; 17962306a36Sopenharmony_ci __u32 pad; 18062306a36Sopenharmony_ci __u64 value; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/** 18462306a36Sopenharmony_ci * Returns the offset for the BO in the GPU address space for this DRM fd. 18562306a36Sopenharmony_ci * This is the same value returned by drm_panfrost_create_bo, if that was called 18662306a36Sopenharmony_ci * from this DRM fd. 18762306a36Sopenharmony_ci */ 18862306a36Sopenharmony_cistruct drm_panfrost_get_bo_offset { 18962306a36Sopenharmony_ci __u32 handle; 19062306a36Sopenharmony_ci __u32 pad; 19162306a36Sopenharmony_ci __u64 offset; 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistruct drm_panfrost_perfcnt_enable { 19562306a36Sopenharmony_ci __u32 enable; 19662306a36Sopenharmony_ci /* 19762306a36Sopenharmony_ci * On bifrost we have 2 sets of counters, this parameter defines the 19862306a36Sopenharmony_ci * one to track. 19962306a36Sopenharmony_ci */ 20062306a36Sopenharmony_ci __u32 counterset; 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistruct drm_panfrost_perfcnt_dump { 20462306a36Sopenharmony_ci __u64 buf_ptr; 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/* madvise provides a way to tell the kernel in case a buffers contents 20862306a36Sopenharmony_ci * can be discarded under memory pressure, which is useful for userspace 20962306a36Sopenharmony_ci * bo cache where we want to optimistically hold on to buffer allocate 21062306a36Sopenharmony_ci * and potential mmap, but allow the pages to be discarded under memory 21162306a36Sopenharmony_ci * pressure. 21262306a36Sopenharmony_ci * 21362306a36Sopenharmony_ci * Typical usage would involve madvise(DONTNEED) when buffer enters BO 21462306a36Sopenharmony_ci * cache, and madvise(WILLNEED) if trying to recycle buffer from BO cache. 21562306a36Sopenharmony_ci * In the WILLNEED case, 'retained' indicates to userspace whether the 21662306a36Sopenharmony_ci * backing pages still exist. 21762306a36Sopenharmony_ci */ 21862306a36Sopenharmony_ci#define PANFROST_MADV_WILLNEED 0 /* backing pages are needed, status returned in 'retained' */ 21962306a36Sopenharmony_ci#define PANFROST_MADV_DONTNEED 1 /* backing pages not needed */ 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistruct drm_panfrost_madvise { 22262306a36Sopenharmony_ci __u32 handle; /* in, GEM handle */ 22362306a36Sopenharmony_ci __u32 madv; /* in, PANFROST_MADV_x */ 22462306a36Sopenharmony_ci __u32 retained; /* out, whether backing store still exists */ 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci/* Definitions for coredump decoding in user space */ 22862306a36Sopenharmony_ci#define PANFROSTDUMP_MAJOR 1 22962306a36Sopenharmony_ci#define PANFROSTDUMP_MINOR 0 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci#define PANFROSTDUMP_MAGIC 0x464E4150 /* PANF */ 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#define PANFROSTDUMP_BUF_REG 0 23462306a36Sopenharmony_ci#define PANFROSTDUMP_BUF_BOMAP (PANFROSTDUMP_BUF_REG + 1) 23562306a36Sopenharmony_ci#define PANFROSTDUMP_BUF_BO (PANFROSTDUMP_BUF_BOMAP + 1) 23662306a36Sopenharmony_ci#define PANFROSTDUMP_BUF_TRAILER (PANFROSTDUMP_BUF_BO + 1) 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* 23962306a36Sopenharmony_ci * This structure is the native endianness of the dumping machine, tools can 24062306a36Sopenharmony_ci * detect the endianness by looking at the value in 'magic'. 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_cistruct panfrost_dump_object_header { 24362306a36Sopenharmony_ci __u32 magic; 24462306a36Sopenharmony_ci __u32 type; 24562306a36Sopenharmony_ci __u32 file_size; 24662306a36Sopenharmony_ci __u32 file_offset; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci union { 24962306a36Sopenharmony_ci struct { 25062306a36Sopenharmony_ci __u64 jc; 25162306a36Sopenharmony_ci __u32 gpu_id; 25262306a36Sopenharmony_ci __u32 major; 25362306a36Sopenharmony_ci __u32 minor; 25462306a36Sopenharmony_ci __u64 nbos; 25562306a36Sopenharmony_ci } reghdr; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci struct { 25862306a36Sopenharmony_ci __u32 valid; 25962306a36Sopenharmony_ci __u64 iova; 26062306a36Sopenharmony_ci __u32 data[2]; 26162306a36Sopenharmony_ci } bomap; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci /* 26462306a36Sopenharmony_ci * Force same size in case we want to expand the header 26562306a36Sopenharmony_ci * with new fields and also keep it 512-byte aligned 26662306a36Sopenharmony_ci */ 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci __u32 sizer[496]; 26962306a36Sopenharmony_ci }; 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci/* Registers object, an array of these */ 27362306a36Sopenharmony_cistruct panfrost_dump_registers { 27462306a36Sopenharmony_ci __u32 reg; 27562306a36Sopenharmony_ci __u32 value; 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci#if defined(__cplusplus) 27962306a36Sopenharmony_ci} 28062306a36Sopenharmony_ci#endif 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#endif /* _PANFROST_DRM_H_ */ 283