Sarah Walker | 4babef0 | 2023-11-22 16:34:26 +0000 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only OR MIT */ |
| 2 | /* Copyright (c) 2023 Imagination Technologies Ltd. */ |
| 3 | |
| 4 | #ifndef PVR_DRV_H |
| 5 | #define PVR_DRV_H |
| 6 | |
| 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 interface |
| 17 | */ |
| 18 | #define PVR_DRIVER_MAJOR 1 |
| 19 | #define PVR_DRIVER_MINOR 0 |
| 20 | #define PVR_DRIVER_PATCHLEVEL 0 |
| 21 | |
Sarah Walker | f99f5f3 | 2023-11-22 16:34:31 +0000 | [diff] [blame] | 22 | int pvr_get_uobj(u64 usr_ptr, u32 usr_size, u32 min_size, u32 obj_size, void *out); |
| 23 | int pvr_set_uobj(u64 usr_ptr, u32 usr_size, u32 min_size, u32 obj_size, const void *in); |
| 24 | int pvr_get_uobj_array(const struct drm_pvr_obj_array *in, u32 min_stride, u32 obj_size, |
| 25 | void **out); |
| 26 | int 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 from |
| 42 | * userspace. Objects can differ in size, provided the minimum size |
| 43 | * 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 under |
| 45 | * 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 a |
| 53 | * compiler error. |
| 54 | * |
| 55 | * To add compatibility for a type, list it within the macro in an orderly |
| 56 | * fashion. The second argument is the name of the last mandatory field of the |
| 57 | * 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 to |
| 102 | * 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 raw |
| 105 | * pointer to the source C array in user space and the size of each array |
| 106 | * 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 raw |
| 118 | * pointer to the destination C array in user space and the size of each array |
| 119 | * 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 | |
Sarah Walker | 4babef0 | 2023-11-22 16:34:26 +0000 | [diff] [blame] | 129 | #endif /* PVR_DRV_H */ |