1 /* 2 * Copyright © 2014 Broadcom 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24 #ifndef VC4_DRV_H 25 #define VC4_DRV_H 26 27 #include "vc4_simulator_validate.h" 28 29 struct vc4_exec_info { 30 /* Sequence number for this bin/render job. */ 31 uint64_t seqno; 32 33 /* Kernel-space copy of the ioctl arguments */ 34 struct drm_vc4_submit_cl *args; 35 36 /* This is the array of BOs that were looked up at the start of exec. 37 * Command validation will use indices into this array. 38 */ 39 struct drm_gem_cma_object **bo; 40 uint32_t bo_count; 41 42 /* List of other BOs used in the job that need to be released 43 * once the job is complete. 44 */ 45 struct list_head unref_list; 46 47 /* Current unvalidated indices into @bo loaded by the non-hardware 48 * VC4_PACKET_GEM_HANDLES. 49 */ 50 uint32_t bo_index[2]; 51 52 /* This is the BO where we store the validated command lists, shader 53 * records, and uniforms. 54 */ 55 struct drm_gem_cma_object *exec_bo; 56 57 /** 58 * This tracks the per-shader-record state (packet 64) that 59 * determines the length of the shader record and the offset 60 * it's expected to be found at. It gets read in from the 61 * command lists. 62 */ 63 struct vc4_shader_state { 64 uint32_t addr; 65 /* Maximum vertex index referenced by any primitive using this 66 * shader state. 67 */ 68 uint32_t max_index; 69 } *shader_state; 70 71 /** How many shader states the user declared they were using. */ 72 uint32_t shader_state_size; 73 /** How many shader state records the validator has seen. */ 74 uint32_t shader_state_count; 75 76 bool found_tile_binning_mode_config_packet; 77 bool found_start_tile_binning_packet; 78 bool found_increment_semaphore_packet; 79 bool found_flush; 80 uint8_t bin_tiles_x, bin_tiles_y; 81 struct drm_gem_cma_object *tile_bo; 82 uint32_t tile_alloc_offset; 83 84 uint32_t tile_width, tile_height; 85 86 /** 87 * Computed addresses pointing into exec_bo where we start the 88 * bin thread (ct0) and render thread (ct1). 89 */ 90 uint32_t ct0ca, ct0ea; 91 uint32_t ct1ca, ct1ea; 92 93 /* Pointer to the unvalidated bin CL (if present). */ 94 void *bin_u; 95 96 /* Pointers to the shader recs. These paddr gets incremented as CL 97 * packets are relocated in validate_gl_shader_state, and the vaddrs 98 * (u and v) get incremented and size decremented as the shader recs 99 * themselves are validated. 100 */ 101 void *shader_rec_u; 102 void *shader_rec_v; 103 uint32_t shader_rec_p; 104 uint32_t shader_rec_size; 105 106 /* Pointers to the uniform data. These pointers are incremented, and 107 * size decremented, as each batch of uniforms is uploaded. 108 */ 109 void *uniforms_u; 110 void *uniforms_v; 111 uint32_t uniforms_p; 112 uint32_t uniforms_size; 113 }; 114 115 /** 116 * struct vc4_texture_sample_info - saves the offsets into the UBO for texture 117 * setup parameters. 118 * 119 * This will be used at draw time to relocate the reference to the texture 120 * contents in p0, and validate that the offset combined with 121 * width/height/stride/etc. from p1 and p2/p3 doesn't sample outside the BO. 122 * Note that the hardware treats unprovided config parameters as 0, so not all 123 * of them need to be set up for every texure sample, and we'll store ~0 as 124 * the offset to mark the unused ones. 125 * 126 * See the VC4 3D architecture guide page 41 ("Texture and Memory Lookup Unit 127 * Setup") for definitions of the texture parameters. 128 */ 129 struct vc4_texture_sample_info { 130 bool is_direct; 131 uint32_t p_offset[4]; 132 }; 133 134 /** 135 * struct vc4_validated_shader_info - information about validated shaders that 136 * needs to be used from command list validation. 137 * 138 * For a given shader, each time a shader state record references it, we need 139 * to verify that the shader doesn't read more uniforms than the shader state 140 * record's uniform BO pointer can provide, and we need to apply relocations 141 * and validate the shader state record's uniforms that define the texture 142 * samples. 143 */ 144 struct vc4_validated_shader_info 145 { 146 uint32_t uniforms_size; 147 uint32_t uniforms_src_size; 148 uint32_t num_texture_samples; 149 struct vc4_texture_sample_info *texture_samples; 150 151 uint32_t num_uniform_addr_offsets; 152 uint32_t *uniform_addr_offsets; 153 154 bool is_threaded; 155 }; 156 157 /* vc4_validate.c */ 158 int 159 vc4_validate_bin_cl(struct drm_device *dev, 160 void *validated, 161 void *unvalidated, 162 struct vc4_exec_info *exec); 163 164 int 165 vc4_validate_shader_recs(struct drm_device *dev, struct vc4_exec_info *exec); 166 167 struct vc4_validated_shader_info * 168 vc4_validate_shader(struct drm_gem_cma_object *shader_obj); 169 170 struct drm_gem_cma_object *vc4_use_bo(struct vc4_exec_info *exec, 171 uint32_t hindex); 172 173 int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec); 174 175 bool vc4_check_tex_size(struct vc4_exec_info *exec, 176 struct drm_gem_cma_object *fbo, 177 uint32_t offset, uint8_t tiling_format, 178 uint32_t width, uint32_t height, uint8_t cpp); 179 180 #endif /* VC4_DRV_H */ 181