1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Test cases for the drm_format functions 4 * 5 * Copyright (c) 2022 Maíra Canal <mairacanal@riseup.net> 6 */ 7 8 #include <kunit/test.h> 9 10 #include <drm/drm_fourcc.h> 11 12 static void igt_check_drm_format_block_width(struct kunit *test) 13 { 14 const struct drm_format_info *info = NULL; 15 16 /* Test invalid arguments */ 17 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 0)); 18 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 19 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 1)); 20 21 /* Test 1 plane format */ 22 info = drm_format_info(DRM_FORMAT_XRGB4444); 23 KUNIT_EXPECT_TRUE(test, info); 24 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 0)); 25 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 1)); 26 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 27 28 /* Test 2 planes format */ 29 info = drm_format_info(DRM_FORMAT_NV12); 30 KUNIT_EXPECT_TRUE(test, info); 31 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 0)); 32 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 1)); 33 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 2)); 34 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 35 36 /* Test 3 planes format */ 37 info = drm_format_info(DRM_FORMAT_YUV422); 38 KUNIT_EXPECT_TRUE(test, info); 39 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 0)); 40 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 1)); 41 KUNIT_EXPECT_TRUE(test, drm_format_info_block_width(info, 2)); 42 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 3)); 43 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 44 45 /* Test a tiled format */ 46 info = drm_format_info(DRM_FORMAT_X0L0); 47 KUNIT_EXPECT_TRUE(test, info); 48 KUNIT_EXPECT_EQ(test, drm_format_info_block_width(info, 0), 2); 49 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, 1)); 50 KUNIT_EXPECT_FALSE(test, drm_format_info_block_width(info, -1)); 51 } 52 53 static void igt_check_drm_format_block_height(struct kunit *test) 54 { 55 const struct drm_format_info *info = NULL; 56 57 /* Test invalid arguments */ 58 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 0)); 59 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 60 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 1)); 61 62 /* Test 1 plane format */ 63 info = drm_format_info(DRM_FORMAT_XRGB4444); 64 KUNIT_EXPECT_TRUE(test, info); 65 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 0)); 66 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 67 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 1)); 68 69 /* Test 2 planes format */ 70 info = drm_format_info(DRM_FORMAT_NV12); 71 KUNIT_EXPECT_TRUE(test, info); 72 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 0)); 73 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 1)); 74 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 2)); 75 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 76 77 /* Test 3 planes format */ 78 info = drm_format_info(DRM_FORMAT_YUV422); 79 KUNIT_EXPECT_TRUE(test, info); 80 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 0)); 81 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 1)); 82 KUNIT_EXPECT_TRUE(test, drm_format_info_block_height(info, 2)); 83 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 3)); 84 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 85 86 /* Test a tiled format */ 87 info = drm_format_info(DRM_FORMAT_X0L0); 88 KUNIT_EXPECT_TRUE(test, info); 89 KUNIT_EXPECT_EQ(test, drm_format_info_block_height(info, 0), 2); 90 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, 1)); 91 KUNIT_EXPECT_FALSE(test, drm_format_info_block_height(info, -1)); 92 } 93 94 static void igt_check_drm_format_min_pitch(struct kunit *test) 95 { 96 const struct drm_format_info *info = NULL; 97 98 /* Test invalid arguments */ 99 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 100 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 101 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 102 103 /* Test 1 plane 8 bits per pixel format */ 104 info = drm_format_info(DRM_FORMAT_RGB332); 105 KUNIT_EXPECT_TRUE(test, info); 106 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 107 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 108 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 109 110 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 1); 111 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 2); 112 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 640); 113 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 1024); 114 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 1920); 115 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 4096); 116 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 671); 117 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 118 (uint64_t)UINT_MAX); 119 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 120 (uint64_t)(UINT_MAX - 1)); 121 122 /* Test 1 plane 16 bits per pixel format */ 123 info = drm_format_info(DRM_FORMAT_XRGB4444); 124 KUNIT_EXPECT_TRUE(test, info); 125 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 126 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 127 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 128 129 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 2); 130 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 4); 131 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 1280); 132 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 2048); 133 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 3840); 134 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 8192); 135 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 1342); 136 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 137 (uint64_t)UINT_MAX * 2); 138 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 139 (uint64_t)(UINT_MAX - 1) * 2); 140 141 /* Test 1 plane 24 bits per pixel format */ 142 info = drm_format_info(DRM_FORMAT_RGB888); 143 KUNIT_EXPECT_TRUE(test, info); 144 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 145 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 146 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 147 148 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 3); 149 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 6); 150 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 1920); 151 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 3072); 152 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 5760); 153 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 12288); 154 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 2013); 155 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 156 (uint64_t)UINT_MAX * 3); 157 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 158 (uint64_t)(UINT_MAX - 1) * 3); 159 160 /* Test 1 plane 32 bits per pixel format */ 161 info = drm_format_info(DRM_FORMAT_ABGR8888); 162 KUNIT_EXPECT_TRUE(test, info); 163 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 164 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 165 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 166 167 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 4); 168 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 8); 169 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 2560); 170 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 4096); 171 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 7680); 172 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 16384); 173 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 2684); 174 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 175 (uint64_t)UINT_MAX * 4); 176 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 177 (uint64_t)(UINT_MAX - 1) * 4); 178 179 /* Test 2 planes format */ 180 info = drm_format_info(DRM_FORMAT_NV12); 181 KUNIT_EXPECT_TRUE(test, info); 182 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 183 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 184 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 185 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 2, 0)); 186 187 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 1); 188 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 1), 2); 189 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 2); 190 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 1), 2); 191 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 640); 192 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 320), 640); 193 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 1024); 194 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 512), 1024); 195 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 1920); 196 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 960), 1920); 197 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 4096); 198 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 2048), 4096); 199 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 671); 200 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 336), 672); 201 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 202 (uint64_t)UINT_MAX); 203 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, UINT_MAX / 2 + 1), 204 (uint64_t)UINT_MAX + 1); 205 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1)), 206 (uint64_t)(UINT_MAX - 1)); 207 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, (UINT_MAX - 1) / 2), 208 (uint64_t)(UINT_MAX - 1)); 209 210 /* Test 3 planes 8 bits per pixel format */ 211 info = drm_format_info(DRM_FORMAT_YUV422); 212 KUNIT_EXPECT_TRUE(test, info); 213 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 214 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 215 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 2, 0)); 216 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 217 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 3, 0)); 218 219 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 1); 220 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 1), 1); 221 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 1), 1); 222 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 2); 223 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 2), 2); 224 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 2), 2); 225 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 640); 226 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 320), 320); 227 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 320), 320); 228 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 1024); 229 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 512), 512); 230 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 512), 512); 231 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 1920); 232 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 960), 960); 233 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 960), 960); 234 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 4096); 235 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 2048), 2048); 236 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 2048), 2048); 237 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 671); 238 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, 336), 336); 239 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, 336), 336); 240 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 241 (uint64_t)UINT_MAX); 242 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, UINT_MAX / 2 + 1), 243 (uint64_t)UINT_MAX / 2 + 1); 244 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, UINT_MAX / 2 + 1), 245 (uint64_t)UINT_MAX / 2 + 1); 246 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, (UINT_MAX - 1) / 2), 247 (uint64_t)(UINT_MAX - 1) / 2); 248 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 1, (UINT_MAX - 1) / 2), 249 (uint64_t)(UINT_MAX - 1) / 2); 250 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 2, (UINT_MAX - 1) / 2), 251 (uint64_t)(UINT_MAX - 1) / 2); 252 253 /* Test tiled format */ 254 info = drm_format_info(DRM_FORMAT_X0L2); 255 KUNIT_EXPECT_TRUE(test, info); 256 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 0, 0)); 257 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, -1, 0)); 258 KUNIT_EXPECT_FALSE(test, drm_format_info_min_pitch(info, 1, 0)); 259 260 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1), 2); 261 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 2), 4); 262 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 640), 1280); 263 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1024), 2048); 264 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 1920), 3840); 265 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 4096), 8192); 266 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, 671), 1342); 267 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX), 268 (uint64_t)UINT_MAX * 2); 269 KUNIT_EXPECT_EQ(test, drm_format_info_min_pitch(info, 0, UINT_MAX - 1), 270 (uint64_t)(UINT_MAX - 1) * 2); 271 } 272 273 static struct kunit_case drm_format_tests[] = { 274 KUNIT_CASE(igt_check_drm_format_block_width), 275 KUNIT_CASE(igt_check_drm_format_block_height), 276 KUNIT_CASE(igt_check_drm_format_min_pitch), 277 { } 278 }; 279 280 static struct kunit_suite drm_format_test_suite = { 281 .name = "drm_format", 282 .test_cases = drm_format_tests, 283 }; 284 285 kunit_test_suite(drm_format_test_suite); 286 287 MODULE_LICENSE("GPL"); 288