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

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm/dpu: move writeback's atomic_check to dpu_writeback.c

dpu_encoder_phys_wb is the only user of encoder's atomic_check callback.
Move corresponding checks to drm_writeback_connector's implementation
and drop the dpu_encoder_phys_wb_atomic_check() function.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
Tested-by: Paloma Arellano <quic_parellan@quicinc.com>
Patchwork: https://patchwork.freedesktop.org/patch/577524/
Link: https://lore.kernel.org/r/20240208-fd_remove_phys_ops_atomic_mode_set-v4-4-caf5dcd125c0@linaro.org

+68 -59
-54
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
··· 355 355 } 356 356 357 357 /** 358 - * dpu_encoder_phys_wb_atomic_check - verify and fixup given atomic states 359 - * @phys_enc: Pointer to physical encoder 360 - * @crtc_state: Pointer to CRTC atomic state 361 - * @conn_state: Pointer to connector atomic state 362 - */ 363 - static int dpu_encoder_phys_wb_atomic_check( 364 - struct dpu_encoder_phys *phys_enc, 365 - struct drm_crtc_state *crtc_state, 366 - struct drm_connector_state *conn_state) 367 - { 368 - struct drm_framebuffer *fb; 369 - const struct drm_display_mode *mode = &crtc_state->mode; 370 - 371 - DPU_DEBUG("[atomic_check:%d, \"%s\",%d,%d]\n", 372 - phys_enc->hw_wb->idx, mode->name, mode->hdisplay, mode->vdisplay); 373 - 374 - if (!conn_state || !conn_state->connector) { 375 - DPU_ERROR("invalid connector state\n"); 376 - return -EINVAL; 377 - } else if (conn_state->connector->status != 378 - connector_status_connected) { 379 - DPU_ERROR("connector not connected %d\n", 380 - conn_state->connector->status); 381 - return -EINVAL; 382 - } 383 - 384 - if (!conn_state->writeback_job || !conn_state->writeback_job->fb) 385 - return 0; 386 - 387 - fb = conn_state->writeback_job->fb; 388 - 389 - DPU_DEBUG("[fb_id:%u][fb:%u,%u]\n", fb->base.id, 390 - fb->width, fb->height); 391 - 392 - if (fb->width != mode->hdisplay) { 393 - DPU_ERROR("invalid fb w=%d, mode w=%d\n", fb->width, 394 - mode->hdisplay); 395 - return -EINVAL; 396 - } else if (fb->height != mode->vdisplay) { 397 - DPU_ERROR("invalid fb h=%d, mode h=%d\n", fb->height, 398 - mode->vdisplay); 399 - return -EINVAL; 400 - } else if (fb->width > phys_enc->hw_wb->caps->maxlinewidth) { 401 - DPU_ERROR("invalid fb w=%d, maxlinewidth=%u\n", 402 - fb->width, phys_enc->hw_wb->caps->maxlinewidth); 403 - return -EINVAL; 404 - } 405 - 406 - return drm_atomic_helper_check_wb_connector_state(conn_state->connector, conn_state->state); 407 - } 408 - 409 - 410 - /** 411 358 * _dpu_encoder_phys_wb_update_flush - flush hardware update 412 359 * @phys_enc: Pointer to physical encoder 413 360 */ ··· 724 777 ops->is_master = dpu_encoder_phys_wb_is_master; 725 778 ops->enable = dpu_encoder_phys_wb_enable; 726 779 ops->disable = dpu_encoder_phys_wb_disable; 727 - ops->atomic_check = dpu_encoder_phys_wb_atomic_check; 728 780 ops->wait_for_commit_done = dpu_encoder_phys_wb_wait_for_commit_done; 729 781 ops->prepare_for_kickoff = dpu_encoder_phys_wb_prepare_for_kickoff; 730 782 ops->handle_post_kickoff = dpu_encoder_phys_wb_handle_post_kickoff;
+6 -3
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
··· 630 630 { 631 631 struct drm_encoder *encoder = NULL; 632 632 struct msm_display_info info; 633 + const enum dpu_wb wb_idx = WB_2; 634 + u32 maxlinewidth; 633 635 int rc; 634 636 635 637 memset(&info, 0, sizeof(info)); 636 638 637 639 info.num_of_h_tiles = 1; 638 640 /* use only WB idx 2 instance for DPU */ 639 - info.h_tile_instance[0] = WB_2; 641 + info.h_tile_instance[0] = wb_idx; 640 642 info.intf_type = INTF_WB; 643 + 644 + maxlinewidth = dpu_rm_get_wb(&dpu_kms->rm, info.h_tile_instance[0])->caps->maxlinewidth; 641 645 642 646 encoder = dpu_encoder_init(dev, DRM_MODE_ENCODER_VIRTUAL, &info); 643 647 if (IS_ERR(encoder)) { ··· 649 645 return PTR_ERR(encoder); 650 646 } 651 647 652 - rc = dpu_writeback_init(dev, encoder, wb_formats, 653 - n_formats); 648 + rc = dpu_writeback_init(dev, encoder, wb_formats, n_formats, maxlinewidth); 654 649 if (rc) { 655 650 DPU_ERROR("dpu_writeback_init, rc = %d\n", rc); 656 651 return rc;
+60 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
··· 4 4 */ 5 5 6 6 #include <drm/drm_edid.h> 7 + #include <drm/drm_framebuffer.h> 7 8 8 9 #include "dpu_writeback.h" 9 10 ··· 23 22 */ 24 23 return drm_add_modes_noedid(connector, dpu_kms->catalog->caps->max_mixer_width, 25 24 dev->mode_config.max_height); 25 + } 26 + 27 + static int dpu_wb_conn_atomic_check(struct drm_connector *connector, 28 + struct drm_atomic_state *state) 29 + { 30 + struct drm_writeback_connector *wb_conn = drm_connector_to_writeback(connector); 31 + struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(wb_conn); 32 + struct drm_connector_state *conn_state = 33 + drm_atomic_get_new_connector_state(state, connector); 34 + struct drm_crtc *crtc; 35 + struct drm_crtc_state *crtc_state; 36 + const struct drm_display_mode *mode; 37 + struct drm_framebuffer *fb; 38 + 39 + DPU_DEBUG("[atomic_check:%d]\n", connector->base.id); 40 + 41 + if (!conn_state || !conn_state->connector) { 42 + DPU_ERROR("invalid connector state\n"); 43 + return -EINVAL; 44 + } else if (conn_state->connector->status != connector_status_connected) { 45 + DPU_ERROR("connector not connected %d\n", conn_state->connector->status); 46 + return -EINVAL; 47 + } 48 + 49 + crtc = conn_state->crtc; 50 + if (!crtc) 51 + return 0; 52 + 53 + if (!conn_state->writeback_job || !conn_state->writeback_job->fb) 54 + return 0; 55 + 56 + crtc_state = drm_atomic_get_crtc_state(state, crtc); 57 + if (IS_ERR(crtc_state)) 58 + return PTR_ERR(crtc_state); 59 + 60 + mode = &crtc_state->mode; 61 + 62 + fb = conn_state->writeback_job->fb; 63 + 64 + DPU_DEBUG("[fb_id:%u][fb:%u,%u][mode:\"%s\":%ux%u]\n", fb->base.id, fb->width, fb->height, 65 + mode->name, mode->hdisplay, mode->vdisplay); 66 + 67 + if (fb->width != mode->hdisplay) { 68 + DPU_ERROR("invalid fb w=%d, mode w=%d\n", fb->width, mode->hdisplay); 69 + return -EINVAL; 70 + } else if (fb->height != mode->vdisplay) { 71 + DPU_ERROR("invalid fb h=%d, mode h=%d\n", fb->height, mode->vdisplay); 72 + return -EINVAL; 73 + } else if (fb->width > dpu_wb_conn->maxlinewidth) { 74 + DPU_ERROR("invalid fb w=%d, maxlinewidth=%u\n", 75 + fb->width, dpu_wb_conn->maxlinewidth); 76 + return -EINVAL; 77 + } 78 + 79 + return drm_atomic_helper_check_wb_connector_state(conn_state->connector, conn_state->state); 26 80 } 27 81 28 82 static const struct drm_connector_funcs dpu_wb_conn_funcs = { ··· 115 59 116 60 static const struct drm_connector_helper_funcs dpu_wb_conn_helper_funcs = { 117 61 .get_modes = dpu_wb_conn_get_modes, 62 + .atomic_check = dpu_wb_conn_atomic_check, 118 63 .prepare_writeback_job = dpu_wb_conn_prepare_job, 119 64 .cleanup_writeback_job = dpu_wb_conn_cleanup_job, 120 65 }; 121 66 122 67 int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc, 123 - const u32 *format_list, u32 num_formats) 68 + const u32 *format_list, u32 num_formats, u32 maxlinewidth) 124 69 { 125 70 struct dpu_wb_connector *dpu_wb_conn; 126 71 int rc = 0; ··· 129 72 dpu_wb_conn = devm_kzalloc(dev->dev, sizeof(*dpu_wb_conn), GFP_KERNEL); 130 73 if (!dpu_wb_conn) 131 74 return -ENOMEM; 75 + 76 + dpu_wb_conn->maxlinewidth = maxlinewidth; 132 77 133 78 drm_connector_helper_add(&dpu_wb_conn->base.base, &dpu_wb_conn_helper_funcs); 134 79
+2 -1
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
··· 18 18 struct dpu_wb_connector { 19 19 struct drm_writeback_connector base; 20 20 struct drm_encoder *wb_enc; 21 + u32 maxlinewidth; 21 22 }; 22 23 23 24 static inline struct dpu_wb_connector *to_dpu_wb_conn(struct drm_writeback_connector *conn) ··· 27 26 } 28 27 29 28 int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc, 30 - const u32 *format_list, u32 num_formats); 29 + const u32 *format_list, u32 num_formats, u32 maxlinewidth); 31 30 32 31 #endif /*_DPU_WRITEBACK_H */