1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 4 * Author: Rob Clark <rob@ti.com> 5 */ 6 7 #include <linux/math64.h> 8 9 #include <drm/drm_atomic.h> 10 #include <drm/drm_atomic_helper.h> 11 #include <drm/drm_crtc.h> 12 #include <drm/drm_mode.h> 13 #include <drm/drm_plane_helper.h> 14 #include <drm/drm_vblank.h> 15 16 #include "omap_drv.h" 17 18 #define to_omap_crtc_state(x) container_of(x, struct omap_crtc_state, base) 19 20 struct omap_crtc_state { 21 /* Must be first. */ 22 struct drm_crtc_state base; 23 /* Shadow values for legacy userspace support. */ 24 unsigned int rotation; 25 unsigned int zpos; 26 bool manually_updated; 27 }; 28 29 #define to_omap_crtc(x) container_of(x, struct omap_crtc, base) 30 31 struct omap_crtc { 32 struct drm_crtc base; 33 34 const char *name; 35 struct omap_drm_pipeline *pipe; 36 enum omap_channel channel; 37 38 struct videomode vm; 39 40 bool ignore_digit_sync_lost; 41 42 bool enabled; 43 bool pending; 44 wait_queue_head_t pending_wait; 45 struct drm_pending_vblank_event *event; 46 struct delayed_work update_work; 47 48 void (*framedone_handler)(void *); 49 void *framedone_handler_data; 50 }; 51 52 /* ----------------------------------------------------------------------------- 53 * Helper Functions 54 */ 55 56 struct videomode *omap_crtc_timings(struct drm_crtc *crtc) 57 { 58 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 59 return &omap_crtc->vm; 60 } 61 62 enum omap_channel omap_crtc_channel(struct drm_crtc *crtc) 63 { 64 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 65 return omap_crtc->channel; 66 } 67 68 static bool omap_crtc_is_pending(struct drm_crtc *crtc) 69 { 70 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 71 unsigned long flags; 72 bool pending; 73 74 spin_lock_irqsave(&crtc->dev->event_lock, flags); 75 pending = omap_crtc->pending; 76 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 77 78 return pending; 79 } 80 81 int omap_crtc_wait_pending(struct drm_crtc *crtc) 82 { 83 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 84 85 /* 86 * Timeout is set to a "sufficiently" high value, which should cover 87 * a single frame refresh even on slower displays. 88 */ 89 return wait_event_timeout(omap_crtc->pending_wait, 90 !omap_crtc_is_pending(crtc), 91 msecs_to_jiffies(250)); 92 } 93 94 /* ----------------------------------------------------------------------------- 95 * DSS Manager Functions 96 */ 97 98 /* 99 * Manager-ops, callbacks from output when they need to configure 100 * the upstream part of the video pipe. 101 */ 102 103 static void omap_crtc_dss_start_update(struct omap_drm_private *priv, 104 enum omap_channel channel) 105 { 106 priv->dispc_ops->mgr_enable(priv->dispc, channel, true); 107 } 108 109 /* Called only from the encoder enable/disable and suspend/resume handlers. */ 110 static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable) 111 { 112 struct omap_crtc_state *omap_state = to_omap_crtc_state(crtc->state); 113 struct drm_device *dev = crtc->dev; 114 struct omap_drm_private *priv = dev->dev_private; 115 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 116 enum omap_channel channel = omap_crtc->channel; 117 struct omap_irq_wait *wait; 118 u32 framedone_irq, vsync_irq; 119 int ret; 120 121 if (WARN_ON(omap_crtc->enabled == enable)) 122 return; 123 124 if (omap_state->manually_updated) { 125 omap_irq_enable_framedone(crtc, enable); 126 omap_crtc->enabled = enable; 127 return; 128 } 129 130 if (omap_crtc->pipe->output->type == OMAP_DISPLAY_TYPE_HDMI) { 131 priv->dispc_ops->mgr_enable(priv->dispc, channel, enable); 132 omap_crtc->enabled = enable; 133 return; 134 } 135 136 if (omap_crtc->channel == OMAP_DSS_CHANNEL_DIGIT) { 137 /* 138 * Digit output produces some sync lost interrupts during the 139 * first frame when enabling, so we need to ignore those. 140 */ 141 omap_crtc->ignore_digit_sync_lost = true; 142 } 143 144 framedone_irq = priv->dispc_ops->mgr_get_framedone_irq(priv->dispc, 145 channel); 146 vsync_irq = priv->dispc_ops->mgr_get_vsync_irq(priv->dispc, channel); 147 148 if (enable) { 149 wait = omap_irq_wait_init(dev, vsync_irq, 1); 150 } else { 151 /* 152 * When we disable the digit output, we need to wait for 153 * FRAMEDONE to know that DISPC has finished with the output. 154 * 155 * OMAP2/3 does not have FRAMEDONE irq for digit output, and in 156 * that case we need to use vsync interrupt, and wait for both 157 * even and odd frames. 158 */ 159 160 if (framedone_irq) 161 wait = omap_irq_wait_init(dev, framedone_irq, 1); 162 else 163 wait = omap_irq_wait_init(dev, vsync_irq, 2); 164 } 165 166 priv->dispc_ops->mgr_enable(priv->dispc, channel, enable); 167 omap_crtc->enabled = enable; 168 169 ret = omap_irq_wait(dev, wait, msecs_to_jiffies(100)); 170 if (ret) { 171 dev_err(dev->dev, "%s: timeout waiting for %s\n", 172 omap_crtc->name, enable ? "enable" : "disable"); 173 } 174 175 if (omap_crtc->channel == OMAP_DSS_CHANNEL_DIGIT) { 176 omap_crtc->ignore_digit_sync_lost = false; 177 /* make sure the irq handler sees the value above */ 178 mb(); 179 } 180 } 181 182 183 static int omap_crtc_dss_enable(struct omap_drm_private *priv, 184 enum omap_channel channel) 185 { 186 struct drm_crtc *crtc = priv->channels[channel]->crtc; 187 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 188 189 priv->dispc_ops->mgr_set_timings(priv->dispc, omap_crtc->channel, 190 &omap_crtc->vm); 191 omap_crtc_set_enabled(&omap_crtc->base, true); 192 193 return 0; 194 } 195 196 static void omap_crtc_dss_disable(struct omap_drm_private *priv, 197 enum omap_channel channel) 198 { 199 struct drm_crtc *crtc = priv->channels[channel]->crtc; 200 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 201 202 omap_crtc_set_enabled(&omap_crtc->base, false); 203 } 204 205 static void omap_crtc_dss_set_timings(struct omap_drm_private *priv, 206 enum omap_channel channel, 207 const struct videomode *vm) 208 { 209 struct drm_crtc *crtc = priv->channels[channel]->crtc; 210 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 211 212 DBG("%s", omap_crtc->name); 213 omap_crtc->vm = *vm; 214 } 215 216 static void omap_crtc_dss_set_lcd_config(struct omap_drm_private *priv, 217 enum omap_channel channel, 218 const struct dss_lcd_mgr_config *config) 219 { 220 struct drm_crtc *crtc = priv->channels[channel]->crtc; 221 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 222 223 DBG("%s", omap_crtc->name); 224 priv->dispc_ops->mgr_set_lcd_config(priv->dispc, omap_crtc->channel, 225 config); 226 } 227 228 static int omap_crtc_dss_register_framedone( 229 struct omap_drm_private *priv, enum omap_channel channel, 230 void (*handler)(void *), void *data) 231 { 232 struct drm_crtc *crtc = priv->channels[channel]->crtc; 233 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 234 struct drm_device *dev = omap_crtc->base.dev; 235 236 if (omap_crtc->framedone_handler) 237 return -EBUSY; 238 239 dev_dbg(dev->dev, "register framedone %s", omap_crtc->name); 240 241 omap_crtc->framedone_handler = handler; 242 omap_crtc->framedone_handler_data = data; 243 244 return 0; 245 } 246 247 static void omap_crtc_dss_unregister_framedone( 248 struct omap_drm_private *priv, enum omap_channel channel, 249 void (*handler)(void *), void *data) 250 { 251 struct drm_crtc *crtc = priv->channels[channel]->crtc; 252 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 253 struct drm_device *dev = omap_crtc->base.dev; 254 255 dev_dbg(dev->dev, "unregister framedone %s", omap_crtc->name); 256 257 WARN_ON(omap_crtc->framedone_handler != handler); 258 WARN_ON(omap_crtc->framedone_handler_data != data); 259 260 omap_crtc->framedone_handler = NULL; 261 omap_crtc->framedone_handler_data = NULL; 262 } 263 264 static const struct dss_mgr_ops mgr_ops = { 265 .start_update = omap_crtc_dss_start_update, 266 .enable = omap_crtc_dss_enable, 267 .disable = omap_crtc_dss_disable, 268 .set_timings = omap_crtc_dss_set_timings, 269 .set_lcd_config = omap_crtc_dss_set_lcd_config, 270 .register_framedone_handler = omap_crtc_dss_register_framedone, 271 .unregister_framedone_handler = omap_crtc_dss_unregister_framedone, 272 }; 273 274 /* ----------------------------------------------------------------------------- 275 * Setup, Flush and Page Flip 276 */ 277 278 void omap_crtc_error_irq(struct drm_crtc *crtc, u32 irqstatus) 279 { 280 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 281 282 if (omap_crtc->ignore_digit_sync_lost) { 283 irqstatus &= ~DISPC_IRQ_SYNC_LOST_DIGIT; 284 if (!irqstatus) 285 return; 286 } 287 288 DRM_ERROR_RATELIMITED("%s: errors: %08x\n", omap_crtc->name, irqstatus); 289 } 290 291 void omap_crtc_vblank_irq(struct drm_crtc *crtc) 292 { 293 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 294 struct drm_device *dev = omap_crtc->base.dev; 295 struct omap_drm_private *priv = dev->dev_private; 296 bool pending; 297 298 spin_lock(&crtc->dev->event_lock); 299 /* 300 * If the dispc is busy we're racing the flush operation. Try again on 301 * the next vblank interrupt. 302 */ 303 if (priv->dispc_ops->mgr_go_busy(priv->dispc, omap_crtc->channel)) { 304 spin_unlock(&crtc->dev->event_lock); 305 return; 306 } 307 308 /* Send the vblank event if one has been requested. */ 309 if (omap_crtc->event) { 310 drm_crtc_send_vblank_event(crtc, omap_crtc->event); 311 omap_crtc->event = NULL; 312 } 313 314 pending = omap_crtc->pending; 315 omap_crtc->pending = false; 316 spin_unlock(&crtc->dev->event_lock); 317 318 if (pending) 319 drm_crtc_vblank_put(crtc); 320 321 /* Wake up omap_atomic_complete. */ 322 wake_up(&omap_crtc->pending_wait); 323 324 DBG("%s: apply done", omap_crtc->name); 325 } 326 327 void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus) 328 { 329 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 330 331 if (!omap_crtc->framedone_handler) 332 return; 333 334 omap_crtc->framedone_handler(omap_crtc->framedone_handler_data); 335 336 spin_lock(&crtc->dev->event_lock); 337 /* Send the vblank event if one has been requested. */ 338 if (omap_crtc->event) { 339 drm_crtc_send_vblank_event(crtc, omap_crtc->event); 340 omap_crtc->event = NULL; 341 } 342 omap_crtc->pending = false; 343 spin_unlock(&crtc->dev->event_lock); 344 345 /* Wake up omap_atomic_complete. */ 346 wake_up(&omap_crtc->pending_wait); 347 } 348 349 void omap_crtc_flush(struct drm_crtc *crtc) 350 { 351 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 352 struct omap_crtc_state *omap_state = to_omap_crtc_state(crtc->state); 353 354 if (!omap_state->manually_updated) 355 return; 356 357 if (!delayed_work_pending(&omap_crtc->update_work)) 358 schedule_delayed_work(&omap_crtc->update_work, 0); 359 } 360 361 static void omap_crtc_manual_display_update(struct work_struct *data) 362 { 363 struct omap_crtc *omap_crtc = 364 container_of(data, struct omap_crtc, update_work.work); 365 struct drm_display_mode *mode = &omap_crtc->pipe->crtc->mode; 366 struct omap_dss_device *dssdev = omap_crtc->pipe->output->next; 367 struct drm_device *dev = omap_crtc->base.dev; 368 const struct omap_dss_driver *dssdrv; 369 int ret; 370 371 if (!dssdev) { 372 dev_err_once(dev->dev, "missing display dssdev!"); 373 return; 374 } 375 376 dssdrv = dssdev->driver; 377 if (!dssdrv || !dssdrv->update) { 378 dev_err_once(dev->dev, "missing or incorrect dssdrv!"); 379 return; 380 } 381 382 if (dssdrv->sync) 383 dssdrv->sync(dssdev); 384 385 ret = dssdrv->update(dssdev, 0, 0, mode->hdisplay, mode->vdisplay); 386 if (ret < 0) { 387 spin_lock_irq(&dev->event_lock); 388 omap_crtc->pending = false; 389 spin_unlock_irq(&dev->event_lock); 390 wake_up(&omap_crtc->pending_wait); 391 } 392 } 393 394 static void omap_crtc_write_crtc_properties(struct drm_crtc *crtc) 395 { 396 struct omap_drm_private *priv = crtc->dev->dev_private; 397 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 398 struct omap_overlay_manager_info info; 399 400 memset(&info, 0, sizeof(info)); 401 402 info.default_color = 0x000000; 403 info.trans_enabled = false; 404 info.partial_alpha_enabled = false; 405 info.cpr_enable = false; 406 407 priv->dispc_ops->mgr_setup(priv->dispc, omap_crtc->channel, &info); 408 } 409 410 /* ----------------------------------------------------------------------------- 411 * CRTC Functions 412 */ 413 414 static void omap_crtc_destroy(struct drm_crtc *crtc) 415 { 416 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 417 418 DBG("%s", omap_crtc->name); 419 420 drm_crtc_cleanup(crtc); 421 422 kfree(omap_crtc); 423 } 424 425 static void omap_crtc_arm_event(struct drm_crtc *crtc) 426 { 427 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 428 429 WARN_ON(omap_crtc->pending); 430 omap_crtc->pending = true; 431 432 if (crtc->state->event) { 433 omap_crtc->event = crtc->state->event; 434 crtc->state->event = NULL; 435 } 436 } 437 438 static void omap_crtc_atomic_enable(struct drm_crtc *crtc, 439 struct drm_crtc_state *old_state) 440 { 441 struct omap_drm_private *priv = crtc->dev->dev_private; 442 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 443 struct omap_crtc_state *omap_state = to_omap_crtc_state(crtc->state); 444 int ret; 445 446 DBG("%s", omap_crtc->name); 447 448 priv->dispc_ops->runtime_get(priv->dispc); 449 450 /* manual updated display will not trigger vsync irq */ 451 if (omap_state->manually_updated) 452 return; 453 454 drm_crtc_vblank_on(crtc); 455 456 ret = drm_crtc_vblank_get(crtc); 457 WARN_ON(ret != 0); 458 459 spin_lock_irq(&crtc->dev->event_lock); 460 omap_crtc_arm_event(crtc); 461 spin_unlock_irq(&crtc->dev->event_lock); 462 } 463 464 static void omap_crtc_atomic_disable(struct drm_crtc *crtc, 465 struct drm_crtc_state *old_state) 466 { 467 struct omap_drm_private *priv = crtc->dev->dev_private; 468 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 469 struct drm_device *dev = crtc->dev; 470 471 DBG("%s", omap_crtc->name); 472 473 spin_lock_irq(&crtc->dev->event_lock); 474 if (crtc->state->event) { 475 drm_crtc_send_vblank_event(crtc, crtc->state->event); 476 crtc->state->event = NULL; 477 } 478 spin_unlock_irq(&crtc->dev->event_lock); 479 480 cancel_delayed_work(&omap_crtc->update_work); 481 482 if (!omap_crtc_wait_pending(crtc)) 483 dev_warn(dev->dev, "manual display update did not finish!"); 484 485 drm_crtc_vblank_off(crtc); 486 487 priv->dispc_ops->runtime_put(priv->dispc); 488 } 489 490 static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc, 491 const struct drm_display_mode *mode) 492 { 493 struct omap_drm_private *priv = crtc->dev->dev_private; 494 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 495 struct videomode vm = {0}; 496 int r; 497 498 drm_display_mode_to_videomode(mode, &vm); 499 500 /* 501 * DSI might not call this, since the supplied mode is not a 502 * valid DISPC mode. DSI will calculate and configure the 503 * proper DISPC mode later. 504 */ 505 if (omap_crtc->pipe->output->next == NULL || 506 omap_crtc->pipe->output->next->type != OMAP_DISPLAY_TYPE_DSI) { 507 r = priv->dispc_ops->mgr_check_timings(priv->dispc, 508 omap_crtc->channel, 509 &vm); 510 if (r) 511 return r; 512 } 513 514 /* Check for bandwidth limit */ 515 if (priv->max_bandwidth) { 516 /* 517 * Estimation for the bandwidth need of a given mode with one 518 * full screen plane: 519 * bandwidth = resolution * 32bpp * (pclk / (vtotal * htotal)) 520 * ^^ Refresh rate ^^ 521 * 522 * The interlaced mode is taken into account by using the 523 * pixelclock in the calculation. 524 * 525 * The equation is rearranged for 64bit arithmetic. 526 */ 527 uint64_t bandwidth = mode->clock * 1000; 528 unsigned int bpp = 4; 529 530 bandwidth = bandwidth * mode->hdisplay * mode->vdisplay * bpp; 531 bandwidth = div_u64(bandwidth, mode->htotal * mode->vtotal); 532 533 /* 534 * Reject modes which would need more bandwidth if used with one 535 * full resolution plane (most common use case). 536 */ 537 if (priv->max_bandwidth < bandwidth) 538 return MODE_BAD; 539 } 540 541 return MODE_OK; 542 } 543 544 static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc) 545 { 546 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 547 struct drm_display_mode *mode = &crtc->state->adjusted_mode; 548 549 DBG("%s: set mode: " DRM_MODE_FMT, 550 omap_crtc->name, DRM_MODE_ARG(mode)); 551 552 drm_display_mode_to_videomode(mode, &omap_crtc->vm); 553 } 554 555 static bool omap_crtc_is_manually_updated(struct drm_crtc *crtc) 556 { 557 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 558 struct omap_dss_device *display = omap_crtc->pipe->output->next; 559 560 if (!display) 561 return false; 562 563 if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) { 564 DBG("detected manually updated display!"); 565 return true; 566 } 567 568 return false; 569 } 570 571 static int omap_crtc_atomic_check(struct drm_crtc *crtc, 572 struct drm_crtc_state *state) 573 { 574 struct drm_plane_state *pri_state; 575 576 if (state->color_mgmt_changed && state->gamma_lut) { 577 unsigned int length = state->gamma_lut->length / 578 sizeof(struct drm_color_lut); 579 580 if (length < 2) 581 return -EINVAL; 582 } 583 584 pri_state = drm_atomic_get_new_plane_state(state->state, crtc->primary); 585 if (pri_state) { 586 struct omap_crtc_state *omap_crtc_state = 587 to_omap_crtc_state(state); 588 589 /* Mirror new values for zpos and rotation in omap_crtc_state */ 590 omap_crtc_state->zpos = pri_state->zpos; 591 omap_crtc_state->rotation = pri_state->rotation; 592 593 /* Check if this CRTC is for a manually updated display */ 594 omap_crtc_state->manually_updated = omap_crtc_is_manually_updated(crtc); 595 } 596 597 return 0; 598 } 599 600 static void omap_crtc_atomic_begin(struct drm_crtc *crtc, 601 struct drm_crtc_state *old_crtc_state) 602 { 603 } 604 605 static void omap_crtc_atomic_flush(struct drm_crtc *crtc, 606 struct drm_crtc_state *old_crtc_state) 607 { 608 struct omap_drm_private *priv = crtc->dev->dev_private; 609 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 610 struct omap_crtc_state *omap_crtc_state = to_omap_crtc_state(crtc->state); 611 int ret; 612 613 if (crtc->state->color_mgmt_changed) { 614 struct drm_color_lut *lut = NULL; 615 unsigned int length = 0; 616 617 if (crtc->state->gamma_lut) { 618 lut = (struct drm_color_lut *) 619 crtc->state->gamma_lut->data; 620 length = crtc->state->gamma_lut->length / 621 sizeof(*lut); 622 } 623 priv->dispc_ops->mgr_set_gamma(priv->dispc, omap_crtc->channel, 624 lut, length); 625 } 626 627 omap_crtc_write_crtc_properties(crtc); 628 629 /* Only flush the CRTC if it is currently enabled. */ 630 if (!omap_crtc->enabled) 631 return; 632 633 DBG("%s: GO", omap_crtc->name); 634 635 if (omap_crtc_state->manually_updated) { 636 /* send new image for page flips and modeset changes */ 637 spin_lock_irq(&crtc->dev->event_lock); 638 omap_crtc_flush(crtc); 639 omap_crtc_arm_event(crtc); 640 spin_unlock_irq(&crtc->dev->event_lock); 641 return; 642 } 643 644 ret = drm_crtc_vblank_get(crtc); 645 WARN_ON(ret != 0); 646 647 spin_lock_irq(&crtc->dev->event_lock); 648 priv->dispc_ops->mgr_go(priv->dispc, omap_crtc->channel); 649 omap_crtc_arm_event(crtc); 650 spin_unlock_irq(&crtc->dev->event_lock); 651 } 652 653 static int omap_crtc_atomic_set_property(struct drm_crtc *crtc, 654 struct drm_crtc_state *state, 655 struct drm_property *property, 656 u64 val) 657 { 658 struct omap_drm_private *priv = crtc->dev->dev_private; 659 struct drm_plane_state *plane_state; 660 661 /* 662 * Delegate property set to the primary plane. Get the plane state and 663 * set the property directly, the shadow copy will be assigned in the 664 * omap_crtc_atomic_check callback. This way updates to plane state will 665 * always be mirrored in the crtc state correctly. 666 */ 667 plane_state = drm_atomic_get_plane_state(state->state, crtc->primary); 668 if (IS_ERR(plane_state)) 669 return PTR_ERR(plane_state); 670 671 if (property == crtc->primary->rotation_property) 672 plane_state->rotation = val; 673 else if (property == priv->zorder_prop) 674 plane_state->zpos = val; 675 else 676 return -EINVAL; 677 678 return 0; 679 } 680 681 static int omap_crtc_atomic_get_property(struct drm_crtc *crtc, 682 const struct drm_crtc_state *state, 683 struct drm_property *property, 684 u64 *val) 685 { 686 struct omap_drm_private *priv = crtc->dev->dev_private; 687 struct omap_crtc_state *omap_state = to_omap_crtc_state(state); 688 689 if (property == crtc->primary->rotation_property) 690 *val = omap_state->rotation; 691 else if (property == priv->zorder_prop) 692 *val = omap_state->zpos; 693 else 694 return -EINVAL; 695 696 return 0; 697 } 698 699 static void omap_crtc_reset(struct drm_crtc *crtc) 700 { 701 struct omap_crtc_state *state; 702 703 if (crtc->state) 704 __drm_atomic_helper_crtc_destroy_state(crtc->state); 705 706 kfree(crtc->state); 707 708 state = kzalloc(sizeof(*state), GFP_KERNEL); 709 if (state) 710 __drm_atomic_helper_crtc_reset(crtc, &state->base); 711 } 712 713 static struct drm_crtc_state * 714 omap_crtc_duplicate_state(struct drm_crtc *crtc) 715 { 716 struct omap_crtc_state *state, *current_state; 717 718 if (WARN_ON(!crtc->state)) 719 return NULL; 720 721 current_state = to_omap_crtc_state(crtc->state); 722 723 state = kmalloc(sizeof(*state), GFP_KERNEL); 724 if (!state) 725 return NULL; 726 727 __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base); 728 729 state->zpos = current_state->zpos; 730 state->rotation = current_state->rotation; 731 state->manually_updated = current_state->manually_updated; 732 733 return &state->base; 734 } 735 736 static const struct drm_crtc_funcs omap_crtc_funcs = { 737 .reset = omap_crtc_reset, 738 .set_config = drm_atomic_helper_set_config, 739 .destroy = omap_crtc_destroy, 740 .page_flip = drm_atomic_helper_page_flip, 741 .gamma_set = drm_atomic_helper_legacy_gamma_set, 742 .atomic_duplicate_state = omap_crtc_duplicate_state, 743 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, 744 .atomic_set_property = omap_crtc_atomic_set_property, 745 .atomic_get_property = omap_crtc_atomic_get_property, 746 .enable_vblank = omap_irq_enable_vblank, 747 .disable_vblank = omap_irq_disable_vblank, 748 }; 749 750 static const struct drm_crtc_helper_funcs omap_crtc_helper_funcs = { 751 .mode_set_nofb = omap_crtc_mode_set_nofb, 752 .atomic_check = omap_crtc_atomic_check, 753 .atomic_begin = omap_crtc_atomic_begin, 754 .atomic_flush = omap_crtc_atomic_flush, 755 .atomic_enable = omap_crtc_atomic_enable, 756 .atomic_disable = omap_crtc_atomic_disable, 757 .mode_valid = omap_crtc_mode_valid, 758 }; 759 760 /* ----------------------------------------------------------------------------- 761 * Init and Cleanup 762 */ 763 764 static const char *channel_names[] = { 765 [OMAP_DSS_CHANNEL_LCD] = "lcd", 766 [OMAP_DSS_CHANNEL_DIGIT] = "tv", 767 [OMAP_DSS_CHANNEL_LCD2] = "lcd2", 768 [OMAP_DSS_CHANNEL_LCD3] = "lcd3", 769 }; 770 771 void omap_crtc_pre_init(struct omap_drm_private *priv) 772 { 773 dss_install_mgr_ops(priv->dss, &mgr_ops, priv); 774 } 775 776 void omap_crtc_pre_uninit(struct omap_drm_private *priv) 777 { 778 dss_uninstall_mgr_ops(priv->dss); 779 } 780 781 /* initialize crtc */ 782 struct drm_crtc *omap_crtc_init(struct drm_device *dev, 783 struct omap_drm_pipeline *pipe, 784 struct drm_plane *plane) 785 { 786 struct omap_drm_private *priv = dev->dev_private; 787 struct drm_crtc *crtc = NULL; 788 struct omap_crtc *omap_crtc; 789 enum omap_channel channel; 790 int ret; 791 792 channel = pipe->output->dispc_channel; 793 794 DBG("%s", channel_names[channel]); 795 796 omap_crtc = kzalloc(sizeof(*omap_crtc), GFP_KERNEL); 797 if (!omap_crtc) 798 return ERR_PTR(-ENOMEM); 799 800 crtc = &omap_crtc->base; 801 802 init_waitqueue_head(&omap_crtc->pending_wait); 803 804 omap_crtc->pipe = pipe; 805 omap_crtc->channel = channel; 806 omap_crtc->name = channel_names[channel]; 807 808 /* 809 * We want to refresh manually updated displays from dirty callback, 810 * which is called quite often (e.g. for each drawn line). This will 811 * be used to do the display update asynchronously to avoid blocking 812 * the rendering process and merges multiple dirty calls into one 813 * update if they arrive very fast. We also call this function for 814 * atomic display updates (e.g. for page flips), which means we do 815 * not need extra locking. Atomic updates should be synchronous, but 816 * need to wait for the framedone interrupt anyways. 817 */ 818 INIT_DELAYED_WORK(&omap_crtc->update_work, 819 omap_crtc_manual_display_update); 820 821 ret = drm_crtc_init_with_planes(dev, crtc, plane, NULL, 822 &omap_crtc_funcs, NULL); 823 if (ret < 0) { 824 dev_err(dev->dev, "%s(): could not init crtc for: %s\n", 825 __func__, pipe->output->name); 826 kfree(omap_crtc); 827 return ERR_PTR(ret); 828 } 829 830 drm_crtc_helper_add(crtc, &omap_crtc_helper_funcs); 831 832 /* The dispc API adapts to what ever size, but the HW supports 833 * 256 element gamma table for LCDs and 1024 element table for 834 * OMAP_DSS_CHANNEL_DIGIT. X server assumes 256 element gamma 835 * tables so lets use that. Size of HW gamma table can be 836 * extracted with dispc_mgr_gamma_size(). If it returns 0 837 * gamma table is not supported. 838 */ 839 if (priv->dispc_ops->mgr_gamma_size(priv->dispc, channel)) { 840 unsigned int gamma_lut_size = 256; 841 842 drm_crtc_enable_color_mgmt(crtc, 0, false, gamma_lut_size); 843 drm_mode_crtc_set_gamma_size(crtc, gamma_lut_size); 844 } 845 846 omap_plane_install_properties(crtc->primary, &crtc->base); 847 848 return crtc; 849 } 850