Report if getresources call fails
[glamo-dri-tests.git] / gdrm-kms-addfb.c
1 /*
2  * gdrm-gem-mmap_arg.c
3  *
4  * Test Glamo DRM KMS
5  *
6  * (c) 2009 Thomas White <taw@bitwiz.org.uk>
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  * Copyright © 2008 Intel Corporation
21  *
22  *
23  * Based on tests/gem_mmap_arg.c from libdrm, to which the following notice applies:
24  *
25  * Copyright © 2008 Intel Corporation
26  *
27  * Permission is hereby granted, free of charge, to any person obtaining a
28  * copy of this software and associated documentation files (the "Software"),
29  * to deal in the Software without restriction, including without limitation
30  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
31  * and/or sell copies of the Software, and to permit persons to whom the
32  * Software is furnished to do so, subject to the following conditions:
33  *
34  * The above copyright notice and this permission notice (including the next
35  * paragraph) shall be included in all copies or substantial portions of the
36  * Software.
37  *
38  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
41  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
43  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
44  * IN THE SOFTWARE.
45  *
46  * Authors:
47  *    Eric Anholt <eric@anholt.net>
48  *
49  */
50
51 #define _FILE_OFFSET_BITS 64
52
53 #include <stdlib.h>
54 #include <stdio.h>
55 #include <string.h>
56 #include <assert.h>
57 #include <fcntl.h>
58 #include <inttypes.h>
59 #include <errno.h>
60 #include <sys/stat.h>
61 #include <sys/mman.h>
62 #include <xf86drmMode.h>
63
64 #include "drm.h"
65 #include "glamo_drm.h"
66 #include "drmtest.h"
67
68 #define OBJECT_SIZE (640*480*2)
69
70
71 int main(int argc, char **argv)
72 {
73         int fd;
74         struct drm_glamo_gem_create create;
75         struct drm_glamo_gem_mmap mmap_arg;
76         struct drm_gem_close unref;
77         uint8_t expected[OBJECT_SIZE];
78         uint8_t buf[OBJECT_SIZE];
79         uint8_t *addr;
80         uint16_t *addr16;
81         int ret;
82         int handle;
83         char tmp[4];
84         int i;
85         drmModeResPtr r;
86         drmModeCrtcPtr crtc;
87         int crtc_id;
88         int conn_id;
89         int fb_id;
90         uint32_t old_buffer_id;
91
92         fd = drm_open_any();
93
94         printf("Creating a GEM object\n");
95         memset(&create, 0, sizeof(create));
96         create.size = OBJECT_SIZE;
97         ret = ioctl(fd, DRM_IOCTL_GLAMO_GEM_CREATE, &create);
98         assert(ret == 0);
99         handle = create.handle;
100
101         printf("Getting an mmap() offset for the new object\n");
102         mmap_arg.handle = handle;
103         mmap_arg.offset = 0;
104         ret = ioctl(fd, DRM_IOCTL_GLAMO_GEM_MMAP, &mmap_arg);
105         assert(ret == 0);
106
107         printf("The offset is %8llx\n", (long long int)mmap_arg.offset);
108         addr = mmap(0, OBJECT_SIZE, PROT_READ | PROT_WRITE,
109                     MAP_SHARED, fd, mmap_arg.offset);
110         addr16 = (uint16_t *)addr;
111         printf("Virtual address is 0x%p\n", addr);
112
113         r = drmModeGetResources(fd);
114         if ( r == NULL ) {
115                 printf("Could not get DRM resources\n");
116                 return 1;
117         }
118         printf("There are %i CRTCs, %i connectors, %i encoders"
119                " and %i framebuffers\n",
120                r->count_crtcs, r->count_connectors, r->count_encoders,
121                r->count_fbs);
122
123         crtc_id = r->crtcs[0];
124         conn_id = r->connectors[0];
125         printf("The first CRTC ID is %i\n", crtc_id);
126         printf("The first connector ID is %i\n", conn_id);
127
128         drmModeAddFB(fd, 480, 640, 16, 16, 480*2, handle, &fb_id);
129         printf("My new FB handle is %i\n", fb_id);
130         if (!fb_id) {
131                 printf("Could not add FB\n");
132                 return 1;
133         }
134
135         printf("Getting CRTC info\n");
136         crtc = drmModeGetCrtc(fd, crtc_id);
137         old_buffer_id = crtc->buffer_id;
138         printf("Old FB handle is %i\n", old_buffer_id);
139
140         printf("crtc=%p\n", crtc);
141         if ( drmModeSetCrtc(fd, crtc_id, fb_id, 0, 0, r->connectors, 1,
142                             &(crtc->mode)) ) {
143                 printf("drmModeSetCrtc returned %i\n", ret);
144         }
145
146         do {
147
148                 uint16_t val;
149
150                 val = random() & 0xff;
151                 val += (random() & 0xff)<<8;
152                 for ( i=0; i<OBJECT_SIZE/2; i++ ) {
153                         addr16[i] = val;
154                 }
155
156                 printf("Press <enter> to continue, q<enter> to finish...");
157                 fgets(tmp, 3, stdin);
158
159         } while ( tmp[0] != 'q' );
160
161         printf("Unmapping\n");
162         munmap(addr, OBJECT_SIZE);
163
164         printf("Removing FB\n");
165         drmModeRmFB(fd, fb_id);
166
167         printf("Restoring original FB\n");
168         if ( drmModeSetCrtc(fd, crtc_id, old_buffer_id, 0, 0, r->connectors, 1,
169                              &(crtc->mode)) ) {
170                 printf("drmModeSetCrtc returned %i\n", ret);
171         }
172
173         close(fd);
174
175         return 0;
176 }