Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vkms: Add config for default plane pipeline

With the introduction of color pipeline in VKMS, the default device may
have planes with color pipelines. To avoid breaking existing uAPI,
create a kernel argument to disable them by default and a vkms_config
field to configure the plane.

This field is not definitive and will be replaced once the uAPI will be
able to configure color pipelines. For now devices created with ConfigFS
will not have any color pipeline so we can decide later how the uAPI
will look like.

Reviewed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Simon Ser <contact@emersion.fr>
Link: https://patch.msgid.link/20251115000237.3561250-17-alex.hung@amd.com

authored by

Louis Chauvet and committed by
Simon Ser
9b5c7e8b c1e578bd

+71 -21
+30 -17
drivers/gpu/drm/vkms/tests/vkms_config_test.c
··· 83 83 bool enable_cursor; 84 84 bool enable_writeback; 85 85 bool enable_overlay; 86 + bool enable_plane_pipeline; 86 87 }; 87 88 88 89 static void vkms_config_test_empty_config(struct kunit *test) ··· 109 108 } 110 109 111 110 static struct default_config_case default_config_cases[] = { 112 - { false, false, false }, 113 - { true, false, false }, 114 - { true, true, false }, 115 - { true, false, true }, 116 - { false, true, false }, 117 - { false, true, true }, 118 - { false, false, true }, 119 - { true, true, true }, 111 + { false, false, false, false }, 112 + { true, false, false, false }, 113 + { true, true, false, false }, 114 + { true, false, true, false }, 115 + { false, true, false, false }, 116 + { false, true, true, false }, 117 + { false, false, true, false }, 118 + { true, true, true, false }, 119 + { false, false, false, true }, 120 + { true, false, false, true }, 121 + { true, true, false, true }, 122 + { true, false, true, true }, 123 + { false, true, false, true }, 124 + { false, true, true, true }, 125 + { false, false, true, true }, 126 + { true, true, true, true }, 120 127 }; 121 128 122 129 KUNIT_ARRAY_PARAM(default_config, default_config_cases, NULL); ··· 141 132 142 133 config = vkms_config_default_create(params->enable_cursor, 143 134 params->enable_writeback, 144 - params->enable_overlay); 135 + params->enable_overlay, 136 + params->enable_plane_pipeline); 145 137 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 146 138 147 139 /* Planes */ 148 140 vkms_config_for_each_plane(config, plane_cfg) { 141 + KUNIT_EXPECT_EQ(test, 142 + vkms_config_plane_get_default_pipeline(plane_cfg), 143 + params->enable_plane_pipeline); 149 144 switch (vkms_config_plane_get_type(plane_cfg)) { 150 145 case DRM_PLANE_TYPE_PRIMARY: 151 146 n_primaries++; ··· 381 368 struct vkms_config_plane *plane_cfg; 382 369 int n; 383 370 384 - config = vkms_config_default_create(false, false, false); 371 + config = vkms_config_default_create(false, false, false, false); 385 372 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 386 373 387 374 /* Invalid: No planes */ ··· 406 393 struct vkms_config_encoder *encoder_cfg; 407 394 int err; 408 395 409 - config = vkms_config_default_create(false, false, false); 396 + config = vkms_config_default_create(false, false, false, false); 410 397 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 411 398 412 399 plane_cfg = get_first_plane(config); ··· 487 474 struct vkms_config_plane *plane_cfg; 488 475 struct vkms_config_crtc *crtc_cfg; 489 476 490 - config = vkms_config_default_create(false, false, false); 477 + config = vkms_config_default_create(false, false, false, false); 491 478 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 492 479 493 480 plane_cfg = get_first_plane(config); ··· 506 493 struct vkms_config_crtc *crtc_cfg; 507 494 int n; 508 495 509 - config = vkms_config_default_create(false, false, false); 496 + config = vkms_config_default_create(false, false, false, false); 510 497 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 511 498 512 499 /* Invalid: No CRTCs */ ··· 529 516 struct vkms_config_encoder *encoder_cfg; 530 517 int n; 531 518 532 - config = vkms_config_default_create(false, false, false); 519 + config = vkms_config_default_create(false, false, false, false); 533 520 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 534 521 535 522 /* Invalid: No encoders */ ··· 554 541 struct vkms_config_encoder *encoder_cfg; 555 542 int err; 556 543 557 - config = vkms_config_default_create(false, false, false); 544 + config = vkms_config_default_create(false, false, false, false); 558 545 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 559 546 560 547 crtc_cfg1 = get_first_crtc(config); ··· 600 587 struct vkms_config_connector *connector_cfg; 601 588 int n; 602 589 603 - config = vkms_config_default_create(false, false, false); 590 + config = vkms_config_default_create(false, false, false, false); 604 591 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 605 592 606 593 /* Invalid: No connectors */ ··· 623 610 struct vkms_config_encoder *encoder_cfg; 624 611 struct vkms_config_connector *connector_cfg; 625 612 626 - config = vkms_config_default_create(false, false, false); 613 + config = vkms_config_default_create(false, false, false, false); 627 614 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 628 615 629 616 encoder_cfg = get_first_encoder(config);
+6 -1
drivers/gpu/drm/vkms/vkms_config.c
··· 33 33 34 34 struct vkms_config *vkms_config_default_create(bool enable_cursor, 35 35 bool enable_writeback, 36 - bool enable_overlay) 36 + bool enable_overlay, 37 + bool enable_plane_pipeline) 37 38 { 38 39 struct vkms_config *config; 39 40 struct vkms_config_plane *plane_cfg; ··· 59 58 60 59 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) 61 60 goto err_alloc; 61 + vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline); 62 62 63 63 if (enable_overlay) { 64 64 for (n = 0; n < NUM_OVERLAY_PLANES; n++) { ··· 69 67 70 68 vkms_config_plane_set_type(plane_cfg, 71 69 DRM_PLANE_TYPE_OVERLAY); 70 + vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline); 72 71 73 72 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) 74 73 goto err_alloc; ··· 82 79 goto err_alloc; 83 80 84 81 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); 82 + vkms_config_plane_set_default_pipeline(plane_cfg, enable_plane_pipeline); 85 83 86 84 if (vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg)) 87 85 goto err_alloc; ··· 393 389 return ERR_PTR(-ENOMEM); 394 390 395 391 plane_cfg->config = config; 392 + plane_cfg->default_pipeline = false; 396 393 vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); 397 394 xa_init_flags(&plane_cfg->possible_crtcs, XA_FLAGS_ALLOC); 398 395
+27 -1
drivers/gpu/drm/vkms/vkms_config.h
··· 49 49 50 50 enum drm_plane_type type; 51 51 struct xarray possible_crtcs; 52 + bool default_pipeline; 52 53 53 54 /* Internal usage */ 54 55 struct vkms_plane *plane; ··· 204 203 */ 205 204 struct vkms_config *vkms_config_default_create(bool enable_cursor, 206 205 bool enable_writeback, 207 - bool enable_overlay); 206 + bool enable_overlay, 207 + bool enable_plane_pipeline); 208 208 209 209 /** 210 210 * vkms_config_destroy() - Free a VKMS configuration ··· 288 286 enum drm_plane_type type) 289 287 { 290 288 plane_cfg->type = type; 289 + } 290 + 291 + /** 292 + * vkms_config_plane_get_default_pipeline() - Return if the plane will 293 + * be created with the default pipeline 294 + * @plane_cfg: Plane to get the information from 295 + */ 296 + static inline bool 297 + vkms_config_plane_get_default_pipeline(struct vkms_config_plane *plane_cfg) 298 + { 299 + return plane_cfg->default_pipeline; 300 + } 301 + 302 + /** 303 + * vkms_config_plane_set_default_pipeline() - Set if the plane will 304 + * be created with the default pipeline 305 + * @plane_cfg: Plane to configure the pipeline 306 + * @default_pipeline: New default pipeline value 307 + */ 308 + static inline void 309 + vkms_config_plane_set_default_pipeline(struct vkms_config_plane *plane_cfg, 310 + bool default_pipeline) 311 + { 312 + plane_cfg->default_pipeline = default_pipeline; 291 313 } 292 314 293 315 /**
+6 -1
drivers/gpu/drm/vkms/vkms_drv.c
··· 51 51 module_param_named(enable_overlay, enable_overlay, bool, 0444); 52 52 MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay support"); 53 53 54 + static bool enable_plane_pipeline; 55 + module_param_named(enable_plane_pipeline, enable_plane_pipeline, bool, 0444); 56 + MODULE_PARM_DESC(enable_plane_pipeline, "Enable/Disable plane pipeline support"); 57 + 54 58 static bool create_default_dev = true; 55 59 module_param_named(create_default_dev, create_default_dev, bool, 0444); 56 60 MODULE_PARM_DESC(create_default_dev, "Create or not the default VKMS device"); ··· 231 227 if (!create_default_dev) 232 228 return 0; 233 229 234 - config = vkms_config_default_create(enable_cursor, enable_writeback, enable_overlay); 230 + config = vkms_config_default_create(enable_cursor, enable_writeback, 231 + enable_overlay, enable_plane_pipeline); 235 232 if (IS_ERR(config)) 236 233 return PTR_ERR(config); 237 234
+2 -1
drivers/gpu/drm/vkms/vkms_plane.c
··· 246 246 DRM_COLOR_YCBCR_BT601, 247 247 DRM_COLOR_YCBCR_FULL_RANGE); 248 248 249 - vkms_initialize_colorops(&plane->base); 249 + if (vkms_config_plane_get_default_pipeline(plane_cfg)) 250 + vkms_initialize_colorops(&plane->base); 250 251 251 252 return plane; 252 253 }