130 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only OR MIT */2/* Copyright (c) 2023 Imagination Technologies Ltd. */3 4#ifndef PVR_DRV_H5#define PVR_DRV_H6 7#include "linux/compiler_attributes.h"8#include <uapi/drm/pvr_drm.h>9 10#define PVR_DRIVER_NAME "powervr"11#define PVR_DRIVER_DESC "Imagination PowerVR (Series 6 and later) & IMG Graphics"12#define PVR_DRIVER_DATE "20230904"13 14/*15 * Driver interface version:16 * - 1.0: Initial interface17 */18#define PVR_DRIVER_MAJOR 119#define PVR_DRIVER_MINOR 020#define PVR_DRIVER_PATCHLEVEL 021 22int pvr_get_uobj(u64 usr_ptr, u32 usr_size, u32 min_size, u32 obj_size, void *out);23int pvr_set_uobj(u64 usr_ptr, u32 usr_size, u32 min_size, u32 obj_size, const void *in);24int pvr_get_uobj_array(const struct drm_pvr_obj_array *in, u32 min_stride, u32 obj_size,25 void **out);26int pvr_set_uobj_array(const struct drm_pvr_obj_array *out, u32 min_stride, u32 obj_size,27 const void *in);28 29#define PVR_UOBJ_MIN_SIZE_INTERNAL(_typename, _last_mandatory_field) \30 (offsetof(_typename, _last_mandatory_field) + \31 sizeof(((_typename *)NULL)->_last_mandatory_field))32 33/* NOLINTBEGIN(bugprone-macro-parentheses) */34#define PVR_UOBJ_DECL(_typename, _last_mandatory_field) \35 , _typename : PVR_UOBJ_MIN_SIZE_INTERNAL(_typename, _last_mandatory_field)36/* NOLINTEND(bugprone-macro-parentheses) */37 38/**39 * DOC: PVR user objects.40 *41 * Macros used to aid copying structured and array data to and from42 * userspace. Objects can differ in size, provided the minimum size43 * allowed is specified (using the last mandatory field in the struct).44 * All types used with PVR_UOBJ_GET/SET macros must be listed here under45 * PVR_UOBJ_MIN_SIZE, with the last mandatory struct field specified.46 */47 48/**49 * PVR_UOBJ_MIN_SIZE() - Fetch the minimum copy size of a compatible type object.50 * @_obj_name: The name of the object. Cannot be a typename - this is deduced.51 *52 * This cannot fail. Using the macro with an incompatible type will result in a53 * compiler error.54 *55 * To add compatibility for a type, list it within the macro in an orderly56 * fashion. The second argument is the name of the last mandatory field of the57 * struct type, which is used to calculate the size. See also PVR_UOBJ_DECL().58 *59 * Return: The minimum copy size.60 */61#define PVR_UOBJ_MIN_SIZE(_obj_name) _Generic(_obj_name \62 PVR_UOBJ_DECL(struct drm_pvr_job, hwrt) \63 PVR_UOBJ_DECL(struct drm_pvr_sync_op, value) \64 PVR_UOBJ_DECL(struct drm_pvr_dev_query_gpu_info, num_phantoms) \65 PVR_UOBJ_DECL(struct drm_pvr_dev_query_runtime_info, cdm_max_local_mem_size_regs) \66 PVR_UOBJ_DECL(struct drm_pvr_dev_query_quirks, _padding_c) \67 PVR_UOBJ_DECL(struct drm_pvr_dev_query_enhancements, _padding_c) \68 PVR_UOBJ_DECL(struct drm_pvr_heap, page_size_log2) \69 PVR_UOBJ_DECL(struct drm_pvr_dev_query_heap_info, heaps) \70 PVR_UOBJ_DECL(struct drm_pvr_static_data_area, offset) \71 PVR_UOBJ_DECL(struct drm_pvr_dev_query_static_data_areas, static_data_areas) \72 )73 74/**75 * PVR_UOBJ_GET() - Copies from _src_usr_ptr to &_dest_obj.76 * @_dest_obj: The destination container object in kernel space.77 * @_usr_size: The size of the source container in user space.78 * @_src_usr_ptr: __u64 raw pointer to the source container in user space.79 *80 * Return: Error code. See pvr_get_uobj().81 */82#define PVR_UOBJ_GET(_dest_obj, _usr_size, _src_usr_ptr) \83 pvr_get_uobj(_src_usr_ptr, _usr_size, \84 PVR_UOBJ_MIN_SIZE(_dest_obj), \85 sizeof(_dest_obj), &(_dest_obj))86 87/**88 * PVR_UOBJ_SET() - Copies from &_src_obj to _dest_usr_ptr.89 * @_dest_usr_ptr: __u64 raw pointer to the destination container in user space.90 * @_usr_size: The size of the destination container in user space.91 * @_src_obj: The source container object in kernel space.92 *93 * Return: Error code. See pvr_set_uobj().94 */95#define PVR_UOBJ_SET(_dest_usr_ptr, _usr_size, _src_obj) \96 pvr_set_uobj(_dest_usr_ptr, _usr_size, \97 PVR_UOBJ_MIN_SIZE(_src_obj), \98 sizeof(_src_obj), &(_src_obj))99 100/**101 * PVR_UOBJ_GET_ARRAY() - Copies from @_src_drm_pvr_obj_array.array to102 * alloced memory and returns a pointer in _dest_array.103 * @_dest_array: The destination C array object in kernel space.104 * @_src_drm_pvr_obj_array: The &struct drm_pvr_obj_array containing a __u64 raw105 * pointer to the source C array in user space and the size of each array106 * element in user space (the 'stride').107 *108 * Return: Error code. See pvr_get_uobj_array().109 */110#define PVR_UOBJ_GET_ARRAY(_dest_array, _src_drm_pvr_obj_array) \111 pvr_get_uobj_array(_src_drm_pvr_obj_array, \112 PVR_UOBJ_MIN_SIZE((_dest_array)[0]), \113 sizeof((_dest_array)[0]), (void **)&(_dest_array))114 115/**116 * PVR_UOBJ_SET_ARRAY() - Copies from _src_array to @_dest_drm_pvr_obj_array.array.117 * @_dest_drm_pvr_obj_array: The &struct drm_pvr_obj_array containing a __u64 raw118 * pointer to the destination C array in user space and the size of each array119 * element in user space (the 'stride').120 * @_src_array: The source C array object in kernel space.121 *122 * Return: Error code. See pvr_set_uobj_array().123 */124#define PVR_UOBJ_SET_ARRAY(_dest_drm_pvr_obj_array, _src_array) \125 pvr_set_uobj_array(_dest_drm_pvr_obj_array, \126 PVR_UOBJ_MIN_SIZE((_src_array)[0]), \127 sizeof((_src_array)[0]), _src_array)128 129#endif /* PVR_DRV_H */130