sylware / si-user (public) (License: Unspecified) (since 2019-09-09) (hash sha1)
old sample user level code to go with my gpu driver (has interesting code)
List of commits:
Subject Hash Author Date (UTC)
stream of page flips 8ba2374b2c3c507cbae55ae3cc615511ed38815e Sylvain BERTRAND 2014-08-28 15:27:28
better UAPI naming 68e750f17d4256bef0e890d03b6dfc5612bd41d8 Sylvain BERTRAND 2013-10-23 04:58:26
use of simpler userland API e7f555a4d2ab2944efcae0c840c19a1cec929325 Sylvain BERTRAND 2013-09-20 11:16:15
timeouts in userspace a9dcf2e0c1e8d1601305a4afd47e09a7a4aff748 Sylvain BERTRAND 2013-09-01 21:27:20
use monotonic raw timespec for page flipping aa5758c53e6a58038013c7be87a1ba865cb9b3df Sylvain BERTRAND 2013-08-31 02:48:33
pf is now asynchronous 246114120ed41152e5cc551ff28da99cac20d470 Sylvain BERTRAND 2013-08-28 00:16:17
memory caches love c51aedf797f97ec3426511b1578e52d575f25321 Sylvain BERTRAND 2013-08-23 14:48:06
add files 28fe912c85541ca80777d87fc4ac21447e9d57d0 Sylvain BERTRAND 2013-08-23 13:44:21
Initial commit 18d8ad18c54c32f78561e26d949d58efb8483bd3 Sylvain BERTRAND 2013-08-23 12:50:05
Commit 8ba2374b2c3c507cbae55ae3cc615511ed38815e - stream of page flips
Author: Sylvain BERTRAND
Author date (UTC): 2014-08-28 15:27
Committer name: Sylvain BERTRAND
Committer date (UTC): 2014-08-28 15:27
Parent(s): 68e750f17d4256bef0e890d03b6dfc5612bd41d8
Signer:
Signing key:
Signing status: N
Tree: 1e5824dcb32d565436eaee1e5da2c756c6c024ae
File Lines added Lines deleted
pf.c 41 39
File pf.c changed (mode: 100644) (index 32aa9c7..9daad25)
... ... int main(int argc, char *argv[])
34 34 return EXIT_FAILURE; return EXIT_FAILURE;
35 35 } }
36 36
37 uint8_t idx=strtoul(argv[1],NULL,10);
38 unsignedl req=_IOW('d',SI_DCE_PF,idx);
39 errno=0;
40 int r=ioctl(d_fd,req,&idx);
41 if(r==-1){
42 e("pf failed:%s",strerror(errno));
43 return EXIT_FAILURE;
44 }
45
46 37 errno=0; errno=0;
47 38 int efd=epoll_create1(0); int efd=epoll_create1(0);
48 39 if(efd==-1){ if(efd==-1){
 
... ... int main(int argc, char *argv[])
54 45 evt.events=EPOLLIN; evt.events=EPOLLIN;
55 46 evt.data.fd=d_fd; evt.data.fd=d_fd;
56 47 errno=0; errno=0;
57 r=epoll_ctl(efd,EPOLL_CTL_ADD,d_fd,&evt);
48 int r=epoll_ctl(efd,EPOLL_CTL_ADD,d_fd,&evt);
58 49 if(r==-1){ if(r==-1){
59 50 e("epoll_ctl:add driver file descriptor:%s",strerror(errno)); e("epoll_ctl:add driver file descriptor:%s",strerror(errno));
60 51 return EXIT_FAILURE; return EXIT_FAILURE;
61 52 } }
62 53
63 struct epoll_event evts[EVTS_MAX];
64 memset(&evts,0,sizeof(evts));
65 errno=0;
66 int fds_n=epoll_wait(efd,&evts[0],EVTS_MAX,-1);
67 if(fds_n==-1){
68 e("epoll_wait:%s",strerror(errno));
69 return EXIT_FAILURE;
70 }
54 while (1) {
55 uint8_t idx=strtoul(argv[1],NULL,10);
56 unsignedl req=_IOW('d',SI_DCE_PF,idx);
57 errno=0;
58 r=ioctl(d_fd,req,&idx);
59 if(r==-1){
60 e("pf failed:%s",strerror(errno));
61 return EXIT_FAILURE;
62 }
63
64 struct epoll_event evts[EVTS_MAX];
65 memset(&evts,0,sizeof(evts));
66 errno=0;
67 int fds_n=epoll_wait(efd,&evts[0],EVTS_MAX,-1);
68 if(fds_n==-1){
69 e("epoll_wait:%s",strerror(errno));
70 return EXIT_FAILURE;
71 }
72
73 o("fds_n=%u",fds_n);
71 74
72 o("fds_n=%u",fds_n);
75 int fd=0;
76 while(1){
77 if(fd==fds_n) break;
78 if(evts[fd].data.fd==d_fd){
79 struct si_evt si_evt;
73 80
74 int fd=0;
75 while(1){
76 if(fd==fds_n) break;
77 if(evts[fd].data.fd==d_fd){
78 struct si_evt si_evt;
79
80 o("found driver fd");
81 o("found driver fd");
81 82
82 //XXX:the driver file has no end and read will block if there is no
83 //event available.
84 errno=0;
85 ssize_t rd=read(d_fd,&si_evt,sizeof(si_evt));
86 o("read one event of %ld bytes",(long)rd);
87 if(rd==-1){
88 e("read:%s",strerror(errno));
89 return EXIT_FAILURE;
83 //XXX:the driver file has no end and read will block if there is no
84 //event available.
85 errno=0;
86 ssize_t rd=read(d_fd,&si_evt,sizeof(si_evt));
87 o("read one event of %ld bytes",(long)rd);
88 if(rd==-1){
89 e("read:%s",strerror(errno));
90 return EXIT_FAILURE;
91 }
92 struct si_evt_pf *si_evt_pf=&si_evt.params.pf;
93 struct timespec *tp=&si_evt.params.pf.monotonic_raw_tp;
94 o("pf event on dp%u vblanks_n=0x%08x sec=%lu nsec=%lu",si_evt_pf->idx,
95 si_evt_pf->vblanks_n,tp->tv_sec,tp->tv_nsec);
90 96 } }
91 struct si_evt_pf *si_evt_pf=&si_evt.params.pf;
92 struct timespec *tp=&si_evt.params.pf.monotonic_raw_tp;
93 o("pf event on dp%u vblanks_n=0x%08x sec=%lu nsec=%lu",si_evt_pf->idx,
94 si_evt_pf->vblanks_n,tp->tv_sec,tp->tv_nsec);
97 ++fd;
95 98 } }
96 ++fd;
97 99 } }
98 100 return EXIT_SUCCESS; return EXIT_SUCCESS;
99 101 } }
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/sylware/si-user

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/sylware/si-user

Clone this repository using git:
git clone git://git.rocketgit.com/user/sylware/si-user

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main