static int vc4_rcl_render_config_surface_setup(struct vc4_exec_info *exec, struct vc4_rcl_setup *setup, struct drm_gem_cma_object **obj, struct drm_vc4_submit_rcl_surface *surf) { uint8_t tiling = VC4_GET_FIELD(surf->bits, VC4_RENDER_CONFIG_MEMORY_FORMAT); uint8_t format = VC4_GET_FIELD(surf->bits, VC4_RENDER_CONFIG_FORMAT); int cpp; if (surf->flags != 0) { DRM_ERROR("No flags supported on render config.\n"); return -EINVAL; } if (surf->bits & ~(VC4_RENDER_CONFIG_MEMORY_FORMAT_MASK | VC4_RENDER_CONFIG_FORMAT_MASK | VC4_RENDER_CONFIG_MS_MODE_4X | VC4_RENDER_CONFIG_DECIMATE_MODE_4X)) { DRM_ERROR("Unknown bits in render config: 0x%04x\n", surf->bits); return -EINVAL; } if (surf->hindex == ~0) return 0; *obj = vc4_use_bo(exec, surf->hindex); if (!*obj) return -EINVAL; exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj; if (tiling > VC4_TILING_FORMAT_LT) { DRM_ERROR("Bad tiling format\n"); return -EINVAL; } switch (format) { case VC4_RENDER_CONFIG_FORMAT_BGR565_DITHERED: case VC4_RENDER_CONFIG_FORMAT_BGR565: cpp = 2; break; case VC4_RENDER_CONFIG_FORMAT_RGBA8888: cpp = 4; break; default: DRM_ERROR("Bad tile buffer format\n"); return -EINVAL; } if (!vc4_check_tex_size(exec, *obj, surf->offset, tiling, exec->args->width, exec->args->height, cpp)) { return -EINVAL; } return 0; }
int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused) { struct drm_info_node *node = (struct drm_info_node *)m->private; struct drm_device *dev = node->minor->dev; struct vc4_dev *vc4 = to_vc4_dev(dev); uint32_t ident1 = V3D_READ(V3D_IDENT1); uint32_t nslc = VC4_GET_FIELD(ident1, V3D_IDENT1_NSLC); uint32_t tups = VC4_GET_FIELD(ident1, V3D_IDENT1_TUPS); uint32_t qups = VC4_GET_FIELD(ident1, V3D_IDENT1_QUPS); seq_printf(m, "Revision: %d\n", VC4_GET_FIELD(ident1, V3D_IDENT1_REV)); seq_printf(m, "Slices: %d\n", nslc); seq_printf(m, "TMUs: %d\n", nslc * tups); seq_printf(m, "QPUs: %d\n", nslc * qups); seq_printf(m, "Semaphores: %d\n", VC4_GET_FIELD(ident1, V3D_IDENT1_NSEM)); return 0; }
static int vc4_rcl_surface_setup(struct vc4_exec_info *exec, struct drm_gem_cma_object **obj, struct drm_vc4_submit_rcl_surface *surf) { uint8_t tiling = VC4_GET_FIELD(surf->bits, VC4_LOADSTORE_TILE_BUFFER_TILING); uint8_t buffer = VC4_GET_FIELD(surf->bits, VC4_LOADSTORE_TILE_BUFFER_BUFFER); uint8_t format = VC4_GET_FIELD(surf->bits, VC4_LOADSTORE_TILE_BUFFER_FORMAT); int cpp; int ret; if (surf->flags & ~VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES) { DRM_ERROR("Extra flags set\n"); return -EINVAL; } if (surf->hindex == ~0) return 0; *obj = vc4_use_bo(exec, surf->hindex); if (!*obj) return -EINVAL; if (surf->flags & VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES) { if (surf == &exec->args->zs_write) { DRM_ERROR("general zs write may not be a full-res.\n"); return -EINVAL; } if (surf->bits != 0) { DRM_ERROR("load/store general bits set with " "full res load/store.\n"); return -EINVAL; } ret = vc4_full_res_bounds_check(exec, *obj, surf); if (!ret) return ret; return 0; } if (surf->bits & ~(VC4_LOADSTORE_TILE_BUFFER_TILING_MASK | VC4_LOADSTORE_TILE_BUFFER_BUFFER_MASK | VC4_LOADSTORE_TILE_BUFFER_FORMAT_MASK)) { DRM_ERROR("Unknown bits in load/store: 0x%04x\n", surf->bits); return -EINVAL; } if (tiling > VC4_TILING_FORMAT_LT) { DRM_ERROR("Bad tiling format\n"); return -EINVAL; } if (buffer == VC4_LOADSTORE_TILE_BUFFER_ZS) { if (format != 0) { DRM_ERROR("No color format should be set for ZS\n"); return -EINVAL; } cpp = 4; } else if (buffer == VC4_LOADSTORE_TILE_BUFFER_COLOR) { switch (format) { case VC4_LOADSTORE_TILE_BUFFER_BGR565: case VC4_LOADSTORE_TILE_BUFFER_BGR565_DITHER: cpp = 2; break; case VC4_LOADSTORE_TILE_BUFFER_RGBA8888: cpp = 4; break; default: DRM_ERROR("Bad tile buffer format\n"); return -EINVAL; } } else { DRM_ERROR("Bad load/store buffer %d.\n", buffer); return -EINVAL; } if (surf->offset & 0xf) { DRM_ERROR("load/store buffer must be 16b aligned.\n"); return -EINVAL; } if (!vc4_check_tex_size(exec, *obj, surf->offset, tiling, exec->args->width, exec->args->height, cpp)) { return -EINVAL; } return 0; }
static void dump_VC4_PACKET_TILE_RENDERING_MODE_CONFIG(void *cl, uint32_t offset, uint32_t hw_offset) { uint32_t *render_offset = cl + offset; uint16_t *shorts = cl + offset + 4; uint8_t *bytes = cl + offset + 8; fprintf(stderr, "0x%08x 0x%08x: color offset 0x%08x\n", offset, hw_offset, *render_offset); fprintf(stderr, "0x%08x 0x%08x: width %d\n", offset + 4, hw_offset + 4, shorts[0]); fprintf(stderr, "0x%08x 0x%08x: height %d\n", offset + 6, hw_offset + 6, shorts[1]); const char *format = "???"; switch (VC4_GET_FIELD(shorts[2], VC4_RENDER_CONFIG_FORMAT)) { case VC4_RENDER_CONFIG_FORMAT_BGR565_DITHERED: format = "BGR565_DITHERED"; break; case VC4_RENDER_CONFIG_FORMAT_RGBA8888: format = "RGBA8888"; break; case VC4_RENDER_CONFIG_FORMAT_BGR565: format = "BGR565"; break; } if (shorts[2] & VC4_RENDER_CONFIG_TILE_BUFFER_64BIT) format = "64bit"; const char *tiling = "???"; switch (VC4_GET_FIELD(shorts[2], VC4_RENDER_CONFIG_MEMORY_FORMAT)) { case VC4_TILING_FORMAT_LINEAR: tiling = "linear"; break; case VC4_TILING_FORMAT_T: tiling = "T"; break; case VC4_TILING_FORMAT_LT: tiling = "LT"; break; } fprintf(stderr, "0x%08x 0x%08x: 0x%02x %s %s %s %s\n", offset + 8, hw_offset + 8, bytes[0], format, tiling, (shorts[2] & VC4_RENDER_CONFIG_MS_MODE_4X) ? "ms" : "ss", (shorts[2] & VC4_RENDER_CONFIG_DECIMATE_MODE_4X) ? "ms_decimate" : "ss_decimate"); const char *earlyz = ""; if (shorts[2] & VC4_RENDER_CONFIG_EARLY_Z_COVERAGE_DISABLE) { earlyz = "early_z disabled"; } else { if (shorts[2] & VC4_RENDER_CONFIG_EARLY_Z_DIRECTION_G) earlyz = "early_z >"; else earlyz = "early_z <"; } fprintf(stderr, "0x%08x 0x%08x: 0x%02x %s\n", offset + 9, hw_offset + 9, bytes[1], earlyz); }