Path: blob/21.2-virgl/src/freedreno/drm-shim/freedreno_noop.c
4564 views
/*1* Copyright © 2019 Google LLC2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER20* DEALINGS IN THE SOFTWARE.21*/2223#include <limits.h>24#include <stdio.h>25#include <stdlib.h>26#include "drm-shim/drm_shim.h"27#include "drm-uapi/msm_drm.h"28#include <sys/ioctl.h>2930#include "util/u_math.h"3132bool drm_shim_driver_prefers_first_render_node = true;3334struct msm_bo {35struct shim_bo base;36uint32_t offset;37};3839static struct msm_bo *40msm_bo(struct shim_bo *bo)41{42return (struct msm_bo *)bo;43}4445struct msm_device {46uint32_t next_offset;47};4849static struct msm_device msm = {50.next_offset = 0x1000,51};5253struct msm_device_info {54uint32_t gpu_id;55uint32_t chip_id;56uint32_t gmem_size;57};5859static const struct msm_device_info *device_info;6061static int62msm_ioctl_noop(int fd, unsigned long request, void *arg)63{64return 0;65}6667static int68msm_ioctl_gem_new(int fd, unsigned long request, void *arg)69{70struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);71struct drm_msm_gem_new *create = arg;72struct msm_bo *bo = calloc(1, sizeof(*bo));73size_t size = ALIGN(create->size, 4096);7475drm_shim_bo_init(&bo->base, size);7677assert(UINT_MAX - msm.next_offset > size);7879bo->offset = msm.next_offset;80msm.next_offset += size;8182create->handle = drm_shim_bo_get_handle(shim_fd, &bo->base);8384drm_shim_bo_put(&bo->base);8586return 0;87}8889static int90msm_ioctl_gem_info(int fd, unsigned long request, void *arg)91{92struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);93struct drm_msm_gem_info *args = arg;94struct shim_bo *bo = drm_shim_bo_lookup(shim_fd, args->handle);9596switch (args->info) {97case MSM_INFO_GET_OFFSET:98args->value = drm_shim_bo_get_mmap_offset(shim_fd, bo);99break;100case MSM_INFO_GET_IOVA:101args->value = msm_bo(bo)->offset;102break;103case MSM_INFO_SET_NAME:104break;105default:106fprintf(stderr, "Unknown DRM_IOCTL_MSM_GEM_INFO %d\n", args->info);107drm_shim_bo_put(bo);108return -1;109}110111drm_shim_bo_put(bo);112113return 0;114}115116static int117msm_ioctl_get_param(int fd, unsigned long request, void *arg)118{119struct drm_msm_param *gp = arg;120121switch (gp->param) {122case MSM_PARAM_GPU_ID:123gp->value = device_info->gpu_id;124return 0;125case MSM_PARAM_GMEM_SIZE:126gp->value = device_info->gmem_size;127return 0;128case MSM_PARAM_GMEM_BASE:129gp->value = 0x100000;130return 0;131case MSM_PARAM_CHIP_ID:132gp->value = device_info->chip_id;133return 0;134case MSM_PARAM_NR_RINGS:135gp->value = 1;136return 0;137case MSM_PARAM_MAX_FREQ:138gp->value = 1000000;139return 0;140case MSM_PARAM_TIMESTAMP:141gp->value = 0;142return 0;143case MSM_PARAM_PP_PGTABLE:144gp->value = 1;145return 0;146case MSM_PARAM_FAULTS:147gp->value = 0;148return 0;149default:150fprintf(stderr, "Unknown DRM_IOCTL_MSM_GET_PARAM %d\n", gp->param);151return -1;152}153}154155static int156msm_ioctl_gem_madvise(int fd, unsigned long request, void *arg)157{158struct drm_msm_gem_madvise *args = arg;159160args->retained = true;161162return 0;163}164165static ioctl_fn_t driver_ioctls[] = {166[DRM_MSM_GET_PARAM] = msm_ioctl_get_param,167[DRM_MSM_GEM_NEW] = msm_ioctl_gem_new,168[DRM_MSM_GEM_INFO] = msm_ioctl_gem_info,169[DRM_MSM_GEM_CPU_PREP] = msm_ioctl_noop,170[DRM_MSM_GEM_CPU_FINI] = msm_ioctl_noop,171[DRM_MSM_GEM_SUBMIT] = msm_ioctl_noop,172[DRM_MSM_WAIT_FENCE] = msm_ioctl_noop,173[DRM_MSM_GEM_MADVISE] = msm_ioctl_gem_madvise,174[DRM_MSM_SUBMITQUEUE_NEW] = msm_ioctl_noop,175[DRM_MSM_SUBMITQUEUE_CLOSE] = msm_ioctl_noop,176[DRM_MSM_SUBMITQUEUE_QUERY] = msm_ioctl_noop,177};178179#define CHIPID(maj, min, rev, pat) \180((maj << 24) | (min << 16) | (rev << 8) | (pat))181182static const struct msm_device_info device_infos[] = {183{184/* First entry is default */185.gpu_id = 630,186.chip_id = CHIPID(6, 3, 0, 0xff),187.gmem_size = 1024 * 1024,188},189{190.gpu_id = 200,191.chip_id = CHIPID(2, 0, 0, 0),192.gmem_size = 256 * 1024,193},194{195.gpu_id = 201,196.chip_id = CHIPID(2, 0, 0, 1),197.gmem_size = 128 * 1024,198},199{200.gpu_id = 220,201.chip_id = CHIPID(2, 2, 0, 0xff),202.gmem_size = 512 * 1024,203},204{205.gpu_id = 305,206.chip_id = CHIPID(3, 0, 5, 0xff),207.gmem_size = 256 * 1024,208},209{210.gpu_id = 307,211.chip_id = CHIPID(3, 0, 6, 0),212.gmem_size = 128 * 1024,213},214{215.gpu_id = 320,216.chip_id = CHIPID(3, 2, 0xff, 0xff),217.gmem_size = 512 * 1024,218},219{220.gpu_id = 330,221.chip_id = CHIPID(3, 3, 0, 0xff),222.gmem_size = 1024 * 1024,223},224{225.gpu_id = 420,226.chip_id = CHIPID(4, 2, 0, 0xff),227.gmem_size = 1536 * 1024,228},229{230.gpu_id = 430,231.chip_id = CHIPID(4, 3, 0, 0xff),232.gmem_size = 1536 * 1024,233},234{235.gpu_id = 510,236.chip_id = CHIPID(5, 1, 0, 0xff),237.gmem_size = 256 * 1024,238},239{240.gpu_id = 530,241.chip_id = CHIPID(5, 3, 0, 2),242.gmem_size = 1024 * 1024,243},244{245.gpu_id = 540,246.chip_id = CHIPID(5, 4, 0, 2),247.gmem_size = 1024 * 1024,248},249{250.gpu_id = 618,251.chip_id = CHIPID(6, 1, 8, 0xff),252.gmem_size = 512 * 1024,253},254{255.gpu_id = 630,256.chip_id = CHIPID(6, 3, 0, 0xff),257.gmem_size = 1024 * 1024,258},259};260261static void262msm_driver_get_device_info(void)263{264const char *env = getenv("FD_GPU_ID");265266if (!env) {267device_info = &device_infos[0];268return;269}270271int gpu_id = atoi(env);272for (int i = 0; i < ARRAY_SIZE(device_infos); i++) {273if (device_infos[i].gpu_id == gpu_id) {274device_info = &device_infos[i];275return;276}277}278279fprintf(stderr, "FD_GPU_ID unrecognized, shim supports %d",280device_infos[0].gpu_id);281for (int i = 1; i < ARRAY_SIZE(device_infos); i++)282fprintf(stderr, ", %d", device_infos[i].gpu_id);283fprintf(stderr, "\n");284abort();285}286287void288drm_shim_driver_init(void)289{290shim_device.bus_type = DRM_BUS_PLATFORM;291shim_device.driver_name = "msm";292shim_device.driver_ioctls = driver_ioctls;293shim_device.driver_ioctl_count = ARRAY_SIZE(driver_ioctls);294295/* msm uses the DRM version to expose features, instead of getparam. */296shim_device.version_major = 1;297shim_device.version_minor = 6;298shim_device.version_patchlevel = 0;299300msm_driver_get_device_info();301302drm_shim_override_file("OF_FULLNAME=/rdb/msm\n"303"OF_COMPATIBLE_N=1\n"304"OF_COMPATIBLE_0=qcom,adreno\n",305"/sys/dev/char/%d:%d/device/uevent", DRM_MAJOR,306render_node_minor);307}308309310