1 /* 2 * Copyright © 2017 Broadcom 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 24 #include "igt.h" 25 #include "igt_vc4.h" 26 #include <unistd.h> 27 #include <stdlib.h> 28 #include <stdio.h> 29 #include <string.h> 30 #include <fcntl.h> 31 #include <inttypes.h> 32 #include <errno.h> 33 #include <sys/stat.h> 34 #include <sys/ioctl.h> 35 #include <poll.h> 36 #include "vc4_drm.h" 37 38 igt_main 39 { 40 int fd; 41 42 igt_fixture 43 fd = drm_open_driver(DRIVER_VC4); 44 45 igt_subtest("get-bad-handle") { 46 struct drm_vc4_get_tiling get = { 47 .handle = 0xd0d0d0d0, 48 }; 49 do_ioctl_err(fd, DRM_IOCTL_VC4_GET_TILING, &get, ENOENT); 50 } 51 52 igt_subtest("set-bad-handle") { 53 struct drm_vc4_set_tiling set = { 54 .handle = 0xd0d0d0d0, 55 .modifier = DRM_FORMAT_MOD_NONE, 56 }; 57 do_ioctl_err(fd, DRM_IOCTL_VC4_SET_TILING, &set, ENOENT); 58 } 59 60 igt_subtest("get-bad-flags") { 61 int bo = igt_vc4_create_bo(fd, 4096); 62 struct drm_vc4_get_tiling get = { 63 .handle = bo, 64 .flags = 0xd0d0d0d0, 65 }; 66 do_ioctl_err(fd, DRM_IOCTL_VC4_GET_TILING, &get, EINVAL); 67 gem_close(fd, bo); 68 } 69 70 igt_subtest("set-bad-flags") { 71 int bo = igt_vc4_create_bo(fd, 4096); 72 struct drm_vc4_set_tiling set = { 73 .handle = bo, 74 .flags = 0xd0d0d0d0, 75 .modifier = DRM_FORMAT_MOD_NONE, 76 }; 77 do_ioctl_err(fd, DRM_IOCTL_VC4_SET_TILING, &set, EINVAL); 78 gem_close(fd, bo); 79 } 80 81 igt_subtest("get-bad-modifier") { 82 int bo = igt_vc4_create_bo(fd, 4096); 83 struct drm_vc4_get_tiling get = { 84 .handle = bo, 85 .modifier = 0xd0d0d0d0, 86 }; 87 do_ioctl_err(fd, DRM_IOCTL_VC4_GET_TILING, &get, EINVAL); 88 gem_close(fd, bo); 89 } 90 91 igt_subtest("set-bad-modifier") { 92 int bo = igt_vc4_create_bo(fd, 4096); 93 struct drm_vc4_set_tiling set = { 94 .handle = bo, 95 .modifier = 0xd0d0d0d0, 96 }; 97 do_ioctl_err(fd, DRM_IOCTL_VC4_SET_TILING, &set, EINVAL); 98 gem_close(fd, bo); 99 } 100 101 igt_subtest("set-get") { 102 int bo = igt_vc4_create_bo(fd, 4096); 103 104 /* Default is untiled. */ 105 igt_assert(igt_vc4_get_tiling(fd, bo) == DRM_FORMAT_MOD_NONE); 106 107 /* Set to tiled and check. */ 108 igt_vc4_set_tiling(fd, bo, DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED); 109 igt_assert(igt_vc4_get_tiling(fd, bo) == 110 DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED); 111 112 /* Set it back and check. */ 113 igt_vc4_set_tiling(fd, bo, DRM_FORMAT_MOD_NONE); 114 igt_assert(igt_vc4_get_tiling(fd, bo) == DRM_FORMAT_MOD_NONE); 115 116 gem_close(fd, bo); 117 } 118 119 igt_subtest("get-after-free") { 120 /* Some size that probably nobody else is using, to 121 * encourage getting the same BO back from the cache. 122 */ 123 int size = 91 * 4096; 124 int bo; 125 126 bo = igt_vc4_create_bo(fd, size); 127 igt_vc4_set_tiling(fd, bo, DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED); 128 gem_close(fd, bo); 129 130 bo = igt_vc4_create_bo(fd, size); 131 igt_assert(igt_vc4_get_tiling(fd, bo) == DRM_FORMAT_MOD_NONE); 132 gem_close(fd, bo); 133 } 134 135 igt_fixture 136 close(fd); 137 } 138