tests: s/return igt_retval();/igt_exit();/
[platform/upstream/intel-gpu-tools.git] / tests / gem_pwrite.c
1 /*
2  * Copyright © 2011 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Chris Wilson <chris@chris-wilson.co.uk>
25  *
26  */
27
28 #include <unistd.h>
29 #include <stdlib.h>
30 #include <stdint.h>
31 #include <stdio.h>
32 #include <string.h>
33 #include <assert.h>
34 #include <fcntl.h>
35 #include <inttypes.h>
36 #include <errno.h>
37 #include <sys/stat.h>
38 #include <sys/ioctl.h>
39 #include <sys/mman.h>
40 #include <sys/time.h>
41 #include "drm.h"
42 #include "i915_drm.h"
43 #include "drmtest.h"
44
45 #define OBJECT_SIZE 16384
46
47 #define COPY_BLT_CMD            (2<<29|0x53<<22|0x6)
48 #define BLT_WRITE_ALPHA         (1<<21)
49 #define BLT_WRITE_RGB           (1<<20)
50 #define BLT_SRC_TILED           (1<<15)
51 #define BLT_DST_TILED           (1<<11)
52
53 static void do_gem_write(int fd, uint32_t handle, void *buf, int len, int loops)
54 {
55         while (loops--)
56                 gem_write(fd, handle, 0, buf, len);
57 }
58
59 static double elapsed(const struct timeval *start,
60                       const struct timeval *end,
61                       int loop)
62 {
63         return (1e6*(end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec))/loop;
64 }
65
66 static const char *bytes_per_sec(char *buf, double v)
67 {
68         const char *order[] = {
69                 "",
70                 "KiB",
71                 "MiB",
72                 "GiB",
73                 "TiB",
74                 NULL,
75         }, **o = order;
76
77         while (v > 1000 && o[1]) {
78                 v /= 1000;
79                 o++;
80         }
81         sprintf(buf, "%.1f%s/s", v, *o);
82         return buf;
83 }
84
85
86 int main(int argc, char **argv)
87 {
88         int object_size = 0;
89         uint32_t buf[20];
90         uint32_t *src, dst;
91         int fd, count;
92         const struct {
93                 int level;
94                 const char *name;
95         } cache[] = {
96                 { 0, "uncached" },
97                 { 1, "snoop" },
98                 { 2, "display" },
99                 { -1 },
100         }, *c;
101
102         igt_skip_on_simulation();
103
104         igt_subtest_init(argc, argv);
105         igt_skip_on_simulation();
106
107         if (argc > 1 && atoi(argv[1]))
108                 object_size = atoi(argv[1]);
109         if (object_size == 0)
110                 object_size = OBJECT_SIZE;
111         object_size = (object_size + 3) & -4;
112
113         fd = drm_open_any();
114
115         dst = gem_create(fd, object_size);
116         src = malloc(object_size);
117
118         igt_subtest("normal") {
119                 for (count = 1; count <= 1<<17; count <<= 1) {
120                         struct timeval start, end;
121
122                         gettimeofday(&start, NULL);
123                         do_gem_write(fd, dst, src, object_size, count);
124                         gettimeofday(&end, NULL);
125                         printf("Time to pwrite %d bytes x %6d:  %7.3fµs, %s\n",
126                                object_size, count,
127                                elapsed(&start, &end, count),
128                                bytes_per_sec((char *)buf, object_size/elapsed(&start, &end, count)*1e6));
129                         fflush(stdout);
130                 }
131         }
132
133         for (c = cache; c->level != -1; c++) {
134                 igt_subtest(c->name) {
135                         gem_set_caching(fd, dst, c->level);
136
137                         for (count = 1; count <= 1<<17; count <<= 1) {
138                                 struct timeval start, end;
139
140                                 gettimeofday(&start, NULL);
141                                 do_gem_write(fd, dst, src, object_size, count);
142                                 gettimeofday(&end, NULL);
143                                 printf("Time to %s pwrite %d bytes x %6d:       %7.3fµs, %s\n",
144                                        c->name, object_size, count,
145                                        elapsed(&start, &end, count),
146                                        bytes_per_sec((char *)buf, object_size/elapsed(&start, &end, count)*1e6));
147                                 fflush(stdout);
148                         }
149                 }
150         }
151
152         free(src);
153         gem_close(fd, dst);
154
155         close(fd);
156
157         igt_exit();
158 }