Path: blob/21.2-virgl/src/etnaviv/drm-shim/etnaviv_noop.c
4565 views
/*1* Copyright (c) 2019 Etnaviv Project2* Copyright (c) 2019 Zodiac Inflight Innovations3*4* Permission is hereby granted, free of charge, to any person obtaining a5* copy of this software and associated documentation files (the "Software"),6* to deal in the Software without restriction, including without limitation7* the rights to use, copy, modify, merge, publish, distribute, sub license,8* and/or sell copies of the Software, and to permit persons to whom the9* Software is furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice (including the12* next paragraph) shall be included in all copies or substantial portions13* of the Software.14*15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL18* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER19* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING20* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER21* DEALINGS IN THE SOFTWARE.22*23* Authors:24* Christian Gmeiner <[email protected]>25*/2627#include <stdio.h>28#include <sys/ioctl.h>29#include "drm-uapi/etnaviv_drm.h"30#include "drm-shim/drm_shim.h"31#include "util/u_debug.h"3233bool drm_shim_driver_prefers_first_render_node = true;3435struct etna_shim_gpu36{37const char *name;38const uint64_t *reg_map;39};4041static const struct etna_shim_gpu gpus[] = {42{43.name = "GC400",44.reg_map = (const uint64_t[]){45[ETNAVIV_PARAM_GPU_MODEL] = 0x400,46[ETNAVIV_PARAM_GPU_REVISION] = 0x4652,47[ETNAVIV_PARAM_GPU_FEATURES_0] = 0xa0e9e004,48[ETNAVIV_PARAM_GPU_FEATURES_1] = 0xe1299fff,49[ETNAVIV_PARAM_GPU_FEATURES_2] = 0xbe13b219,50[ETNAVIV_PARAM_GPU_FEATURES_3] = 0xce110010,51[ETNAVIV_PARAM_GPU_FEATURES_4] = 0x8000001,52[ETNAVIV_PARAM_GPU_FEATURES_5] = 0x20102,53[ETNAVIV_PARAM_GPU_FEATURES_6] = 0x120000,54[ETNAVIV_PARAM_GPU_FEATURES_7] = 0x0,55[ETNAVIV_PARAM_GPU_STREAM_COUNT] = 0x4,56[ETNAVIV_PARAM_GPU_REGISTER_MAX] = 0x40,57[ETNAVIV_PARAM_GPU_THREAD_COUNT] = 0x80,58[ETNAVIV_PARAM_GPU_VERTEX_CACHE_SIZE] = 0x8,59[ETNAVIV_PARAM_GPU_SHADER_CORE_COUNT] = 0x1,60[ETNAVIV_PARAM_GPU_PIXEL_PIPES] = 0x1,61[ETNAVIV_PARAM_GPU_VERTEX_OUTPUT_BUFFER_SIZE] = 0x80,62[ETNAVIV_PARAM_GPU_BUFFER_SIZE] = 0x0,63[ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT] = 0x100,64[ETNAVIV_PARAM_GPU_NUM_CONSTANTS] = 0x140,65[ETNAVIV_PARAM_GPU_NUM_VARYINGS] = 0x8,66[ETNAVIV_PARAM_SOFTPIN_START_ADDR] = ~0ULL,67}68},69{70.name = "GC2000",71.reg_map = (const uint64_t[]){72[ETNAVIV_PARAM_GPU_MODEL] = 0x2000,73[ETNAVIV_PARAM_GPU_REVISION] = 0x5108,74[ETNAVIV_PARAM_GPU_FEATURES_0] = 0xe0296cad,75[ETNAVIV_PARAM_GPU_FEATURES_1] = 0xc9799eff,76[ETNAVIV_PARAM_GPU_FEATURES_2] = 0x2efbf2d9,77[ETNAVIV_PARAM_GPU_FEATURES_3] = 0x0,78[ETNAVIV_PARAM_GPU_FEATURES_4] = 0x0,79[ETNAVIV_PARAM_GPU_FEATURES_5] = 0x0,80[ETNAVIV_PARAM_GPU_FEATURES_6] = 0x0,81[ETNAVIV_PARAM_GPU_FEATURES_7] = 0x0,82[ETNAVIV_PARAM_GPU_STREAM_COUNT] = 0x8,83[ETNAVIV_PARAM_GPU_REGISTER_MAX] = 0x40,84[ETNAVIV_PARAM_GPU_THREAD_COUNT] = 0x400,85[ETNAVIV_PARAM_GPU_VERTEX_CACHE_SIZE] = 0x10,86[ETNAVIV_PARAM_GPU_SHADER_CORE_COUNT] = 0x4,87[ETNAVIV_PARAM_GPU_PIXEL_PIPES] = 0x2,88[ETNAVIV_PARAM_GPU_VERTEX_OUTPUT_BUFFER_SIZE] = 0x200,89[ETNAVIV_PARAM_GPU_BUFFER_SIZE] = 0x0,90[ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT] = 0x200,91[ETNAVIV_PARAM_GPU_NUM_CONSTANTS] = 0xa8,92[ETNAVIV_PARAM_GPU_NUM_VARYINGS] = 0xb,93[ETNAVIV_PARAM_SOFTPIN_START_ADDR] = ~0ULL,94}95},96{97.name = "GC3000",98.reg_map = (const uint64_t[]){99[ETNAVIV_PARAM_GPU_MODEL] = 0x3000,100[ETNAVIV_PARAM_GPU_REVISION] = 0x5450,101[ETNAVIV_PARAM_GPU_FEATURES_0] = 0xe0287cad,102[ETNAVIV_PARAM_GPU_FEATURES_1] = 0xc9799efb,103[ETNAVIV_PARAM_GPU_FEATURES_2] = 0xfefbfadb,104[ETNAVIV_PARAM_GPU_FEATURES_3] = 0xeb9d4bbf,105[ETNAVIV_PARAM_GPU_FEATURES_4] = 0xedffdced,106[ETNAVIV_PARAM_GPU_FEATURES_5] = 0x930d2f47,107[ETNAVIV_PARAM_GPU_FEATURES_6] = 0x10000133,108[ETNAVIV_PARAM_GPU_FEATURES_7] = 0x0,109[ETNAVIV_PARAM_GPU_STREAM_COUNT] = 0x10,110[ETNAVIV_PARAM_GPU_REGISTER_MAX] = 0x40,111[ETNAVIV_PARAM_GPU_THREAD_COUNT] = 0x400,112[ETNAVIV_PARAM_GPU_VERTEX_CACHE_SIZE] = 0x10,113[ETNAVIV_PARAM_GPU_SHADER_CORE_COUNT] = 0x4,114[ETNAVIV_PARAM_GPU_PIXEL_PIPES] = 0x2,115[ETNAVIV_PARAM_GPU_VERTEX_OUTPUT_BUFFER_SIZE] = 0x400,116[ETNAVIV_PARAM_GPU_BUFFER_SIZE] = 0x0,117[ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT] = 0x100,118[ETNAVIV_PARAM_GPU_NUM_CONSTANTS] = 0x140,119[ETNAVIV_PARAM_GPU_NUM_VARYINGS] = 0x10,120[ETNAVIV_PARAM_SOFTPIN_START_ADDR] = ~0ULL,121}122},123{124.name = "GC7000L",125.reg_map = (const uint64_t[]){126[ETNAVIV_PARAM_GPU_MODEL] = 0x7000,127[ETNAVIV_PARAM_GPU_REVISION] = 0x6214,128[ETNAVIV_PARAM_GPU_FEATURES_0] = 0xe0287cad,129[ETNAVIV_PARAM_GPU_FEATURES_1] = 0xc1799eff,130[ETNAVIV_PARAM_GPU_FEATURES_2] = 0xfefbfad9,131[ETNAVIV_PARAM_GPU_FEATURES_3] = 0xeb9d4fbf,132[ETNAVIV_PARAM_GPU_FEATURES_4] = 0xedfffced,133[ETNAVIV_PARAM_GPU_FEATURES_5] = 0xdb0dafc7,134[ETNAVIV_PARAM_GPU_FEATURES_6] = 0xbb5ac333,135[ETNAVIV_PARAM_GPU_FEATURES_7] = 0xfc8ee200,136[ETNAVIV_PARAM_GPU_STREAM_COUNT] = 0x10,137[ETNAVIV_PARAM_GPU_REGISTER_MAX] = 0x40,138[ETNAVIV_PARAM_GPU_THREAD_COUNT] = 0x400,139[ETNAVIV_PARAM_GPU_VERTEX_CACHE_SIZE] = 0x10,140[ETNAVIV_PARAM_GPU_SHADER_CORE_COUNT] = 0x4,141[ETNAVIV_PARAM_GPU_PIXEL_PIPES] = 0x2,142[ETNAVIV_PARAM_GPU_VERTEX_OUTPUT_BUFFER_SIZE] = 0x400,143[ETNAVIV_PARAM_GPU_BUFFER_SIZE] = 0x0,144[ETNAVIV_PARAM_GPU_INSTRUCTION_COUNT] = 0x200,145[ETNAVIV_PARAM_GPU_NUM_CONSTANTS] = 0x140,146[ETNAVIV_PARAM_GPU_NUM_VARYINGS] = 0x10,147[ETNAVIV_PARAM_SOFTPIN_START_ADDR] = 0x00400000,148}149}150};151152static const struct etna_shim_gpu *shim_gpu;153154static int155etnaviv_ioctl_noop(int fd, unsigned long request, void *arg)156{157return 0;158}159160static int161etnaviv_ioctl_gem_new(int fd, unsigned long request, void *arg)162{163struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);164struct drm_etnaviv_gem_new *create = arg;165struct shim_bo *bo = calloc(1, sizeof(*bo));166167drm_shim_bo_init(bo, create->size);168create->handle = drm_shim_bo_get_handle(shim_fd, bo);169drm_shim_bo_put(bo);170171return 0;172}173174static int175etnaviv_ioctl_gem_info(int fd, unsigned long request, void *arg)176{177struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);178struct drm_etnaviv_gem_info *args = arg;179struct shim_bo *bo = drm_shim_bo_lookup(shim_fd, args->handle);180181args->offset = drm_shim_bo_get_mmap_offset(shim_fd, bo);182drm_shim_bo_put(bo);183184return 0;185}186187static int188etnaviv_ioctl_get_param(int fd, unsigned long request, void *arg)189{190struct drm_etnaviv_param *gp = arg;191192if (gp->param > ETNAVIV_PARAM_SOFTPIN_START_ADDR) {193fprintf(stderr, "Unknown DRM_IOCTL_ETNAVIV_GET_PARAM %d\n", gp->param);194return -1;195}196197gp->value = shim_gpu->reg_map[gp->param];198199return 0;200}201202static ioctl_fn_t driver_ioctls[] = {203[DRM_ETNAVIV_GET_PARAM] = etnaviv_ioctl_get_param,204[DRM_ETNAVIV_GEM_NEW] = etnaviv_ioctl_gem_new,205[DRM_ETNAVIV_GEM_INFO] = etnaviv_ioctl_gem_info,206[DRM_ETNAVIV_GEM_CPU_PREP] = etnaviv_ioctl_noop,207[DRM_ETNAVIV_GEM_CPU_FINI] = etnaviv_ioctl_noop,208[DRM_ETNAVIV_GEM_SUBMIT] = etnaviv_ioctl_noop,209[DRM_ETNAVIV_WAIT_FENCE] = etnaviv_ioctl_noop,210[DRM_ETNAVIV_GEM_USERPTR] = etnaviv_ioctl_noop,211[DRM_ETNAVIV_GEM_WAIT] = etnaviv_ioctl_noop,212[DRM_ETNAVIV_PM_QUERY_DOM] = etnaviv_ioctl_noop,213[DRM_ETNAVIV_PM_QUERY_SIG] = etnaviv_ioctl_noop,214};215216void217drm_shim_driver_init(void)218{219shim_device.bus_type = DRM_BUS_PLATFORM;220shim_device.driver_name = "etnaviv";221shim_device.driver_ioctls = driver_ioctls;222shim_device.driver_ioctl_count = ARRAY_SIZE(driver_ioctls);223224/* etnaviv uses the DRM version to expose features, instead of getparam. */225shim_device.version_major = 1;226shim_device.version_minor = 1;227shim_device.version_patchlevel = 0;228229drm_shim_override_file("DRIVER=etnaviv\n"230"MODALIAS=platform:etnaviv\n",231"/sys/dev/char/%d:%d/device/uevent",232DRM_MAJOR, render_node_minor);233234/* decide what GPU to emulate */235const char *gpu = debug_get_option("ETNA_SHIM_GPU", "GC2000");236237for (unsigned i = 0; i < ARRAY_SIZE(gpus); i++) {238if (strncasecmp(gpu, gpus[i].name, strlen(gpus[i].name)) == 0) {239shim_gpu = &gpus[i];240break;241}242}243244/* NOTE: keep keep default value and fallback index in sync */245if (!shim_gpu)246shim_gpu = &gpus[1];247248fprintf(stderr, "Using %s as shim gpu\n", shim_gpu->name);249}250251252