1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright © 2006-2007 Intel Corporation
6 * Eric Anholt <eric@anholt.net>
9 #include <linux/delay.h>
10 #include <linux/i2c.h>
11 #include <linux/pm_runtime.h>
13 #include <drm/drm_crtc.h>
14 #include <drm/drm_fourcc.h>
16 #include "framebuffer.h"
17 #include "gma_display.h"
18 #include "mdfld_dsi_output.h"
19 #include "mdfld_output.h"
20 #include "psb_intel_reg.h"
22 /* Hardcoded currently */
23 static int ksel = KSEL_CRYSTAL_19;
25 struct psb_intel_range_t {
30 struct psb_intel_range_t dot, m, p1;
40 #define COUNT_MAX 0x10000000
42 void mdfldWaitForPipeDisable(struct drm_device *dev, int pipe)
44 struct drm_psb_private *dev_priv = dev->dev_private;
45 const struct psb_offset *map = &dev_priv->regmap[pipe];
54 DRM_ERROR("Illegal Pipe Number.\n");
59 gma_wait_for_vblank(dev);
62 /* Wait for for the pipe disable to take effect. */
63 for (count = 0; count < COUNT_MAX; count++) {
64 temp = REG_READ(map->conf);
65 if ((temp & PIPEACONF_PIPE_STATE) == 0)
70 void mdfldWaitForPipeEnable(struct drm_device *dev, int pipe)
72 struct drm_psb_private *dev_priv = dev->dev_private;
73 const struct psb_offset *map = &dev_priv->regmap[pipe];
82 DRM_ERROR("Illegal Pipe Number.\n");
87 gma_wait_for_vblank(dev);
90 /* Wait for for the pipe enable to take effect. */
91 for (count = 0; count < COUNT_MAX; count++) {
92 temp = REG_READ(map->conf);
93 if (temp & PIPEACONF_PIPE_STATE)
99 * Return the pipe currently connected to the panel fitter,
100 * or -1 if the panel fitter is not present or not in use
102 static int psb_intel_panel_fitter_pipe(struct drm_device *dev)
106 pfit_control = REG_READ(PFIT_CONTROL);
108 /* See if the panel fitter is in use */
109 if ((pfit_control & PFIT_ENABLE) == 0)
112 /* 965 can place panel fitter on either pipe */
113 return (pfit_control >> 29) & 0x3;
116 static int check_fb(struct drm_framebuffer *fb)
121 switch (fb->format->cpp[0] * 8) {
128 DRM_ERROR("Unknown color depth\n");
133 static int mdfld__intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
134 struct drm_framebuffer *old_fb)
136 struct drm_device *dev = crtc->dev;
137 struct drm_psb_private *dev_priv = dev->dev_private;
138 struct drm_framebuffer *fb = crtc->primary->fb;
139 struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
140 int pipe = gma_crtc->pipe;
141 const struct psb_offset *map = &dev_priv->regmap[pipe];
142 unsigned long start, offset;
146 dev_dbg(dev->dev, "pipe = 0x%x.\n", pipe);
150 dev_dbg(dev->dev, "No FB bound\n");
159 DRM_ERROR("Illegal Pipe Number.\n");
163 if (!gma_power_begin(dev, true))
166 start = to_gtt_range(fb->obj[0])->offset;
167 offset = y * fb->pitches[0] + x * fb->format->cpp[0];
169 REG_WRITE(map->stride, fb->pitches[0]);
170 dspcntr = REG_READ(map->cntr);
171 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
173 switch (fb->format->cpp[0] * 8) {
175 dspcntr |= DISPPLANE_8BPP;
178 if (fb->format->depth == 15)
179 dspcntr |= DISPPLANE_15_16BPP;
181 dspcntr |= DISPPLANE_16BPP;
185 dspcntr |= DISPPLANE_32BPP_NO_ALPHA;
188 REG_WRITE(map->cntr, dspcntr);
190 dev_dbg(dev->dev, "Writing base %08lX %08lX %d %d\n",
191 start, offset, x, y);
192 REG_WRITE(map->linoff, offset);
193 REG_READ(map->linoff);
194 REG_WRITE(map->surf, start);
203 * Disable the pipe, plane and pll.
206 void mdfld_disable_crtc(struct drm_device *dev, int pipe)
208 struct drm_psb_private *dev_priv = dev->dev_private;
209 const struct psb_offset *map = &dev_priv->regmap[pipe];
212 dev_dbg(dev->dev, "pipe = %d\n", pipe);
216 mdfld_dsi_gen_fifo_ready(dev, MIPI_GEN_FIFO_STAT_REG(pipe),
217 HS_CTRL_FIFO_EMPTY | HS_DATA_FIFO_EMPTY);
219 /* Disable display plane */
220 temp = REG_READ(map->cntr);
221 if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
223 temp & ~DISPLAY_PLANE_ENABLE);
224 /* Flush the plane changes */
225 REG_WRITE(map->base, REG_READ(map->base));
229 /* FIXME_JLIU7 MDFLD_PO revisit */
231 /* Next, disable display pipes */
232 temp = REG_READ(map->conf);
233 if ((temp & PIPEACONF_ENABLE) != 0) {
234 temp &= ~PIPEACONF_ENABLE;
235 temp |= PIPECONF_PLANE_OFF | PIPECONF_CURSOR_OFF;
236 REG_WRITE(map->conf, temp);
239 /* Wait for for the pipe disable to take effect. */
240 mdfldWaitForPipeDisable(dev, pipe);
243 temp = REG_READ(map->dpll);
244 if (temp & DPLL_VCO_ENABLE) {
246 !((REG_READ(PIPEACONF) | REG_READ(PIPECCONF))
247 & PIPEACONF_ENABLE)) || pipe == 1) {
248 temp &= ~(DPLL_VCO_ENABLE);
249 REG_WRITE(map->dpll, temp);
251 /* Wait for the clocks to turn off. */
252 /* FIXME_MDFLD PO may need more delay */
255 if (!(temp & MDFLD_PWR_GATE_EN)) {
256 /* gating power of DPLL */
257 REG_WRITE(map->dpll, temp | MDFLD_PWR_GATE_EN);
258 /* FIXME_MDFLD PO - change 500 to 1 after PO */
267 * Sets the power management mode of the pipe and plane.
269 * This code should probably grow support for turning the cursor off and back
270 * on appropriately at the same time as we're turning the pipe off/on.
272 static void mdfld_crtc_dpms(struct drm_crtc *crtc, int mode)
274 struct drm_device *dev = crtc->dev;
275 struct drm_psb_private *dev_priv = dev->dev_private;
276 struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
277 int pipe = gma_crtc->pipe;
278 const struct psb_offset *map = &dev_priv->regmap[pipe];
279 u32 pipeconf = dev_priv->pipeconf[pipe];
283 dev_dbg(dev->dev, "mode = %d, pipe = %d\n", mode, pipe);
285 /* Note: Old code uses pipe a stat for pipe b but that appears
288 if (!gma_power_begin(dev, true))
291 /* XXX: When our outputs are all unaware of DPMS modes other than off
292 * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC.
295 case DRM_MODE_DPMS_ON:
296 case DRM_MODE_DPMS_STANDBY:
297 case DRM_MODE_DPMS_SUSPEND:
298 /* Enable the DPLL */
299 temp = REG_READ(map->dpll);
301 if ((temp & DPLL_VCO_ENABLE) == 0) {
302 /* When ungating power of DPLL, needs to wait 0.5us
303 before enable the VCO */
304 if (temp & MDFLD_PWR_GATE_EN) {
305 temp &= ~MDFLD_PWR_GATE_EN;
306 REG_WRITE(map->dpll, temp);
307 /* FIXME_MDFLD PO - change 500 to 1 after PO */
311 REG_WRITE(map->dpll, temp);
313 /* FIXME_MDFLD PO - change 500 to 1 after PO */
316 REG_WRITE(map->dpll, temp | DPLL_VCO_ENABLE);
320 * wait for DSI PLL to lock
321 * NOTE: only need to poll status of pipe 0 and pipe 1,
322 * since both MIPI pipes share the same PLL.
324 while ((pipe != 2) && (timeout < 20000) &&
325 !(REG_READ(map->conf) & PIPECONF_DSIPLL_LOCK)) {
331 /* Enable the plane */
332 temp = REG_READ(map->cntr);
333 if ((temp & DISPLAY_PLANE_ENABLE) == 0) {
335 temp | DISPLAY_PLANE_ENABLE);
336 /* Flush the plane changes */
337 REG_WRITE(map->base, REG_READ(map->base));
340 /* Enable the pipe */
341 temp = REG_READ(map->conf);
342 if ((temp & PIPEACONF_ENABLE) == 0) {
343 REG_WRITE(map->conf, pipeconf);
345 /* Wait for for the pipe enable to take effect. */
346 mdfldWaitForPipeEnable(dev, pipe);
349 /*workaround for sighting 3741701 Random X blank display*/
350 /*perform w/a in video mode only on pipe A or C*/
351 if (pipe == 0 || pipe == 2) {
352 REG_WRITE(map->status, REG_READ(map->status));
354 if (PIPE_VBLANK_STATUS & REG_READ(map->status))
355 dev_dbg(dev->dev, "OK");
357 dev_dbg(dev->dev, "STUCK!!!!");
358 /*shutdown controller*/
359 temp = REG_READ(map->cntr);
361 temp & ~DISPLAY_PLANE_ENABLE);
362 REG_WRITE(map->base, REG_READ(map->base));
363 /*mdfld_dsi_dpi_shut_down(dev, pipe);*/
364 REG_WRITE(0xb048, 1);
366 temp = REG_READ(map->conf);
367 temp &= ~PIPEACONF_ENABLE;
368 REG_WRITE(map->conf, temp);
369 msleep(100); /*wait for pipe disable*/
370 REG_WRITE(MIPI_DEVICE_READY_REG(pipe), 0);
372 REG_WRITE(0xb004, REG_READ(0xb004));
373 /* try to bring the controller back up again*/
374 REG_WRITE(MIPI_DEVICE_READY_REG(pipe), 1);
375 temp = REG_READ(map->cntr);
377 temp | DISPLAY_PLANE_ENABLE);
378 REG_WRITE(map->base, REG_READ(map->base));
379 /*mdfld_dsi_dpi_turn_on(dev, pipe);*/
380 REG_WRITE(0xb048, 2);
382 temp = REG_READ(map->conf);
383 temp |= PIPEACONF_ENABLE;
384 REG_WRITE(map->conf, temp);
388 gma_crtc_load_lut(crtc);
390 /* Give the overlay scaler a chance to enable
391 if it's on this pipe */
392 /* psb_intel_crtc_dpms_video(crtc, true); TODO */
395 case DRM_MODE_DPMS_OFF:
396 /* Give the overlay scaler a chance to disable
397 * if it's on this pipe */
398 /* psb_intel_crtc_dpms_video(crtc, FALSE); TODO */
400 mdfld_dsi_gen_fifo_ready(dev,
401 MIPI_GEN_FIFO_STAT_REG(pipe),
402 HS_CTRL_FIFO_EMPTY | HS_DATA_FIFO_EMPTY);
404 /* Disable the VGA plane that we never use */
405 REG_WRITE(VGACNTRL, VGA_DISP_DISABLE);
407 /* Disable display plane */
408 temp = REG_READ(map->cntr);
409 if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
411 temp & ~DISPLAY_PLANE_ENABLE);
412 /* Flush the plane changes */
413 REG_WRITE(map->base, REG_READ(map->base));
417 /* Next, disable display pipes */
418 temp = REG_READ(map->conf);
419 if ((temp & PIPEACONF_ENABLE) != 0) {
420 temp &= ~PIPEACONF_ENABLE;
421 temp |= PIPECONF_PLANE_OFF | PIPECONF_CURSOR_OFF;
422 REG_WRITE(map->conf, temp);
425 /* Wait for for the pipe disable to take effect. */
426 mdfldWaitForPipeDisable(dev, pipe);
429 temp = REG_READ(map->dpll);
430 if (temp & DPLL_VCO_ENABLE) {
431 if ((pipe != 1 && !((REG_READ(PIPEACONF)
432 | REG_READ(PIPECCONF)) & PIPEACONF_ENABLE))
434 temp &= ~(DPLL_VCO_ENABLE);
435 REG_WRITE(map->dpll, temp);
437 /* Wait for the clocks to turn off. */
438 /* FIXME_MDFLD PO may need more delay */
448 #define MDFLD_LIMT_DPLL_19 0
449 #define MDFLD_LIMT_DPLL_25 1
450 #define MDFLD_LIMT_DPLL_83 2
451 #define MDFLD_LIMT_DPLL_100 3
452 #define MDFLD_LIMT_DSIPLL_19 4
453 #define MDFLD_LIMT_DSIPLL_25 5
454 #define MDFLD_LIMT_DSIPLL_83 6
455 #define MDFLD_LIMT_DSIPLL_100 7
457 #define MDFLD_DOT_MIN 19750
458 #define MDFLD_DOT_MAX 120000
459 #define MDFLD_DPLL_M_MIN_19 113
460 #define MDFLD_DPLL_M_MAX_19 155
461 #define MDFLD_DPLL_P1_MIN_19 2
462 #define MDFLD_DPLL_P1_MAX_19 10
463 #define MDFLD_DPLL_M_MIN_25 101
464 #define MDFLD_DPLL_M_MAX_25 130
465 #define MDFLD_DPLL_P1_MIN_25 2
466 #define MDFLD_DPLL_P1_MAX_25 10
467 #define MDFLD_DPLL_M_MIN_83 64
468 #define MDFLD_DPLL_M_MAX_83 64
469 #define MDFLD_DPLL_P1_MIN_83 2
470 #define MDFLD_DPLL_P1_MAX_83 2
471 #define MDFLD_DPLL_M_MIN_100 64
472 #define MDFLD_DPLL_M_MAX_100 64
473 #define MDFLD_DPLL_P1_MIN_100 2
474 #define MDFLD_DPLL_P1_MAX_100 2
475 #define MDFLD_DSIPLL_M_MIN_19 131
476 #define MDFLD_DSIPLL_M_MAX_19 175
477 #define MDFLD_DSIPLL_P1_MIN_19 3
478 #define MDFLD_DSIPLL_P1_MAX_19 8
479 #define MDFLD_DSIPLL_M_MIN_25 97
480 #define MDFLD_DSIPLL_M_MAX_25 140
481 #define MDFLD_DSIPLL_P1_MIN_25 3
482 #define MDFLD_DSIPLL_P1_MAX_25 9
483 #define MDFLD_DSIPLL_M_MIN_83 33
484 #define MDFLD_DSIPLL_M_MAX_83 92
485 #define MDFLD_DSIPLL_P1_MIN_83 2
486 #define MDFLD_DSIPLL_P1_MAX_83 3
487 #define MDFLD_DSIPLL_M_MIN_100 97
488 #define MDFLD_DSIPLL_M_MAX_100 140
489 #define MDFLD_DSIPLL_P1_MIN_100 3
490 #define MDFLD_DSIPLL_P1_MAX_100 9
492 static const struct mrst_limit_t mdfld_limits[] = {
493 { /* MDFLD_LIMT_DPLL_19 */
494 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
495 .m = {.min = MDFLD_DPLL_M_MIN_19, .max = MDFLD_DPLL_M_MAX_19},
496 .p1 = {.min = MDFLD_DPLL_P1_MIN_19, .max = MDFLD_DPLL_P1_MAX_19},
498 { /* MDFLD_LIMT_DPLL_25 */
499 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
500 .m = {.min = MDFLD_DPLL_M_MIN_25, .max = MDFLD_DPLL_M_MAX_25},
501 .p1 = {.min = MDFLD_DPLL_P1_MIN_25, .max = MDFLD_DPLL_P1_MAX_25},
503 { /* MDFLD_LIMT_DPLL_83 */
504 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
505 .m = {.min = MDFLD_DPLL_M_MIN_83, .max = MDFLD_DPLL_M_MAX_83},
506 .p1 = {.min = MDFLD_DPLL_P1_MIN_83, .max = MDFLD_DPLL_P1_MAX_83},
508 { /* MDFLD_LIMT_DPLL_100 */
509 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
510 .m = {.min = MDFLD_DPLL_M_MIN_100, .max = MDFLD_DPLL_M_MAX_100},
511 .p1 = {.min = MDFLD_DPLL_P1_MIN_100, .max = MDFLD_DPLL_P1_MAX_100},
513 { /* MDFLD_LIMT_DSIPLL_19 */
514 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
515 .m = {.min = MDFLD_DSIPLL_M_MIN_19, .max = MDFLD_DSIPLL_M_MAX_19},
516 .p1 = {.min = MDFLD_DSIPLL_P1_MIN_19, .max = MDFLD_DSIPLL_P1_MAX_19},
518 { /* MDFLD_LIMT_DSIPLL_25 */
519 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
520 .m = {.min = MDFLD_DSIPLL_M_MIN_25, .max = MDFLD_DSIPLL_M_MAX_25},
521 .p1 = {.min = MDFLD_DSIPLL_P1_MIN_25, .max = MDFLD_DSIPLL_P1_MAX_25},
523 { /* MDFLD_LIMT_DSIPLL_83 */
524 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
525 .m = {.min = MDFLD_DSIPLL_M_MIN_83, .max = MDFLD_DSIPLL_M_MAX_83},
526 .p1 = {.min = MDFLD_DSIPLL_P1_MIN_83, .max = MDFLD_DSIPLL_P1_MAX_83},
528 { /* MDFLD_LIMT_DSIPLL_100 */
529 .dot = {.min = MDFLD_DOT_MIN, .max = MDFLD_DOT_MAX},
530 .m = {.min = MDFLD_DSIPLL_M_MIN_100, .max = MDFLD_DSIPLL_M_MAX_100},
531 .p1 = {.min = MDFLD_DSIPLL_P1_MIN_100, .max = MDFLD_DSIPLL_P1_MAX_100},
535 #define MDFLD_M_MIN 21
536 #define MDFLD_M_MAX 180
537 static const u32 mdfld_m_converts[] = {
538 /* M configuration table from 9-bit LFSR table */
539 224, 368, 440, 220, 366, 439, 219, 365, 182, 347, /* 21 - 30 */
540 173, 342, 171, 85, 298, 149, 74, 37, 18, 265, /* 31 - 40 */
541 388, 194, 353, 432, 216, 108, 310, 155, 333, 166, /* 41 - 50 */
542 83, 41, 276, 138, 325, 162, 337, 168, 340, 170, /* 51 - 60 */
543 341, 426, 469, 234, 373, 442, 221, 110, 311, 411, /* 61 - 70 */
544 461, 486, 243, 377, 188, 350, 175, 343, 427, 213, /* 71 - 80 */
545 106, 53, 282, 397, 354, 227, 113, 56, 284, 142, /* 81 - 90 */
546 71, 35, 273, 136, 324, 418, 465, 488, 500, 506, /* 91 - 100 */
547 253, 126, 63, 287, 399, 455, 483, 241, 376, 444, /* 101 - 110 */
548 478, 495, 503, 251, 381, 446, 479, 239, 375, 443, /* 111 - 120 */
549 477, 238, 119, 315, 157, 78, 295, 147, 329, 420, /* 121 - 130 */
550 210, 105, 308, 154, 77, 38, 275, 137, 68, 290, /* 131 - 140 */
551 145, 328, 164, 82, 297, 404, 458, 485, 498, 249, /* 141 - 150 */
552 380, 190, 351, 431, 471, 235, 117, 314, 413, 206, /* 151 - 160 */
553 103, 51, 25, 12, 262, 387, 193, 96, 48, 280, /* 161 - 170 */
554 396, 198, 99, 305, 152, 76, 294, 403, 457, 228, /* 171 - 180 */
557 static const struct mrst_limit_t *mdfld_limit(struct drm_crtc *crtc)
559 const struct mrst_limit_t *limit = NULL;
560 struct drm_device *dev = crtc->dev;
561 struct drm_psb_private *dev_priv = dev->dev_private;
563 if (gma_pipe_has_type(crtc, INTEL_OUTPUT_MIPI)
564 || gma_pipe_has_type(crtc, INTEL_OUTPUT_MIPI2)) {
565 if ((ksel == KSEL_CRYSTAL_19) || (ksel == KSEL_BYPASS_19))
566 limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_19];
567 else if (ksel == KSEL_BYPASS_25)
568 limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_25];
569 else if ((ksel == KSEL_BYPASS_83_100) &&
570 (dev_priv->core_freq == 166))
571 limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_83];
572 else if ((ksel == KSEL_BYPASS_83_100) &&
573 (dev_priv->core_freq == 100 ||
574 dev_priv->core_freq == 200))
575 limit = &mdfld_limits[MDFLD_LIMT_DSIPLL_100];
576 } else if (gma_pipe_has_type(crtc, INTEL_OUTPUT_HDMI)) {
577 if ((ksel == KSEL_CRYSTAL_19) || (ksel == KSEL_BYPASS_19))
578 limit = &mdfld_limits[MDFLD_LIMT_DPLL_19];
579 else if (ksel == KSEL_BYPASS_25)
580 limit = &mdfld_limits[MDFLD_LIMT_DPLL_25];
581 else if ((ksel == KSEL_BYPASS_83_100) &&
582 (dev_priv->core_freq == 166))
583 limit = &mdfld_limits[MDFLD_LIMT_DPLL_83];
584 else if ((ksel == KSEL_BYPASS_83_100) &&
585 (dev_priv->core_freq == 100 ||
586 dev_priv->core_freq == 200))
587 limit = &mdfld_limits[MDFLD_LIMT_DPLL_100];
590 dev_dbg(dev->dev, "mdfld_limit Wrong display type.\n");
596 /** Derive the pixel clock for the given refclk and divisors for 8xx chips. */
597 static void mdfld_clock(int refclk, struct mrst_clock_t *clock)
599 clock->dot = (refclk * clock->m) / clock->p1;
603 * Returns a set of divisors for the desired target clock with the given refclk,
604 * or FALSE. Divisor values are the actual divisors for
607 mdfldFindBestPLL(struct drm_crtc *crtc, int target, int refclk,
608 struct mrst_clock_t *best_clock)
610 struct mrst_clock_t clock;
611 const struct mrst_limit_t *limit = mdfld_limit(crtc);
614 memset(best_clock, 0, sizeof(*best_clock));
616 for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) {
617 for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max;
621 mdfld_clock(refclk, &clock);
623 this_err = abs(clock.dot - target);
624 if (this_err < err) {
630 return err != target;
633 static int mdfld_crtc_mode_set(struct drm_crtc *crtc,
634 struct drm_display_mode *mode,
635 struct drm_display_mode *adjusted_mode,
637 struct drm_framebuffer *old_fb)
639 struct drm_device *dev = crtc->dev;
640 struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
641 struct drm_psb_private *dev_priv = dev->dev_private;
642 int pipe = gma_crtc->pipe;
643 const struct psb_offset *map = &dev_priv->regmap[pipe];
645 int clk_n = 0, clk_p2 = 0, clk_byte = 1, clk = 0, m_conv = 0,
647 struct mrst_clock_t clock;
649 u32 dpll = 0, fp = 0;
650 bool is_mipi = false, is_mipi2 = false, is_hdmi = false;
651 struct drm_mode_config *mode_config = &dev->mode_config;
652 struct gma_encoder *gma_encoder = NULL;
653 uint64_t scalingType = DRM_MODE_SCALE_FULLSCREEN;
654 struct drm_encoder *encoder;
655 struct drm_connector *connector;
659 dev_dbg(dev->dev, "pipe = 0x%x\n", pipe);
661 ret = check_fb(crtc->primary->fb);
665 dev_dbg(dev->dev, "adjusted_hdisplay = %d\n",
666 adjusted_mode->hdisplay);
667 dev_dbg(dev->dev, "adjusted_vdisplay = %d\n",
668 adjusted_mode->vdisplay);
669 dev_dbg(dev->dev, "adjusted_hsync_start = %d\n",
670 adjusted_mode->hsync_start);
671 dev_dbg(dev->dev, "adjusted_hsync_end = %d\n",
672 adjusted_mode->hsync_end);
673 dev_dbg(dev->dev, "adjusted_htotal = %d\n",
674 adjusted_mode->htotal);
675 dev_dbg(dev->dev, "adjusted_vsync_start = %d\n",
676 adjusted_mode->vsync_start);
677 dev_dbg(dev->dev, "adjusted_vsync_end = %d\n",
678 adjusted_mode->vsync_end);
679 dev_dbg(dev->dev, "adjusted_vtotal = %d\n",
680 adjusted_mode->vtotal);
681 dev_dbg(dev->dev, "adjusted_clock = %d\n",
682 adjusted_mode->clock);
683 dev_dbg(dev->dev, "hdisplay = %d\n",
685 dev_dbg(dev->dev, "vdisplay = %d\n",
688 if (!gma_power_begin(dev, true))
691 memcpy(&gma_crtc->saved_mode, mode,
692 sizeof(struct drm_display_mode));
693 memcpy(&gma_crtc->saved_adjusted_mode, adjusted_mode,
694 sizeof(struct drm_display_mode));
696 list_for_each_entry(connector, &mode_config->connector_list, head) {
697 encoder = connector->encoder;
701 if (encoder->crtc != crtc)
704 gma_encoder = gma_attached_encoder(connector);
706 switch (gma_encoder->type) {
707 case INTEL_OUTPUT_MIPI:
710 case INTEL_OUTPUT_MIPI2:
713 case INTEL_OUTPUT_HDMI:
719 /* Disable the VGA plane that we never use */
720 REG_WRITE(VGACNTRL, VGA_DISP_DISABLE);
722 /* Disable the panel fitter if it was on our pipe */
723 if (psb_intel_panel_fitter_pipe(dev) == pipe)
724 REG_WRITE(PFIT_CONTROL, 0);
726 /* pipesrc and dspsize control the size that is scaled from,
727 * which should always be the user's requested size.
730 /* FIXME: To make HDMI display with 864x480 (TPO), 480x864
731 * (PYR) or 480x854 (TMD), set the sprite width/height and
732 * souce image size registers with the adjusted mode for
737 * The defined sprite rectangle must always be completely
738 * contained within the displayable area of the screen image
741 REG_WRITE(map->size, ((min(mode->crtc_vdisplay, adjusted_mode->crtc_vdisplay) - 1) << 16)
742 | (min(mode->crtc_hdisplay, adjusted_mode->crtc_hdisplay) - 1));
743 /* Set the CRTC with encoder mode. */
744 REG_WRITE(map->src, ((mode->crtc_hdisplay - 1) << 16)
745 | (mode->crtc_vdisplay - 1));
748 ((mode->crtc_vdisplay - 1) << 16) |
749 (mode->crtc_hdisplay - 1));
751 ((mode->crtc_hdisplay - 1) << 16) |
752 (mode->crtc_vdisplay - 1));
755 REG_WRITE(map->pos, 0);
758 drm_object_property_get_value(&connector->base,
759 dev->mode_config.scaling_mode_property, &scalingType);
761 if (scalingType == DRM_MODE_SCALE_NO_SCALE) {
762 /* Medfield doesn't have register support for centering so we
763 * need to mess with the h/vblank and h/vsync start and ends
766 int offsetX = 0, offsetY = 0;
768 offsetX = (adjusted_mode->crtc_hdisplay -
769 mode->crtc_hdisplay) / 2;
770 offsetY = (adjusted_mode->crtc_vdisplay -
771 mode->crtc_vdisplay) / 2;
773 REG_WRITE(map->htotal, (mode->crtc_hdisplay - 1) |
774 ((adjusted_mode->crtc_htotal - 1) << 16));
775 REG_WRITE(map->vtotal, (mode->crtc_vdisplay - 1) |
776 ((adjusted_mode->crtc_vtotal - 1) << 16));
777 REG_WRITE(map->hblank, (adjusted_mode->crtc_hblank_start -
779 ((adjusted_mode->crtc_hblank_end - offsetX - 1) << 16));
780 REG_WRITE(map->hsync, (adjusted_mode->crtc_hsync_start -
782 ((adjusted_mode->crtc_hsync_end - offsetX - 1) << 16));
783 REG_WRITE(map->vblank, (adjusted_mode->crtc_vblank_start -
785 ((adjusted_mode->crtc_vblank_end - offsetY - 1) << 16));
786 REG_WRITE(map->vsync, (adjusted_mode->crtc_vsync_start -
788 ((adjusted_mode->crtc_vsync_end - offsetY - 1) << 16));
790 REG_WRITE(map->htotal, (adjusted_mode->crtc_hdisplay - 1) |
791 ((adjusted_mode->crtc_htotal - 1) << 16));
792 REG_WRITE(map->vtotal, (adjusted_mode->crtc_vdisplay - 1) |
793 ((adjusted_mode->crtc_vtotal - 1) << 16));
794 REG_WRITE(map->hblank, (adjusted_mode->crtc_hblank_start - 1) |
795 ((adjusted_mode->crtc_hblank_end - 1) << 16));
796 REG_WRITE(map->hsync, (adjusted_mode->crtc_hsync_start - 1) |
797 ((adjusted_mode->crtc_hsync_end - 1) << 16));
798 REG_WRITE(map->vblank, (adjusted_mode->crtc_vblank_start - 1) |
799 ((adjusted_mode->crtc_vblank_end - 1) << 16));
800 REG_WRITE(map->vsync, (adjusted_mode->crtc_vsync_start - 1) |
801 ((adjusted_mode->crtc_vsync_end - 1) << 16));
804 /* Flush the plane changes */
806 const struct drm_crtc_helper_funcs *crtc_funcs =
807 crtc->helper_private;
808 crtc_funcs->mode_set_base(crtc, x, y, old_fb);
812 dev_priv->pipeconf[pipe] = PIPEACONF_ENABLE; /* FIXME_JLIU7 REG_READ(pipeconf_reg); */
814 /* Set up the display plane register */
815 dev_priv->dspcntr[pipe] = REG_READ(map->cntr);
816 dev_priv->dspcntr[pipe] |= pipe << DISPPLANE_SEL_PIPE_POS;
817 dev_priv->dspcntr[pipe] |= DISPLAY_PLANE_ENABLE;
820 goto mrst_crtc_mode_set_exit;
821 clk = adjusted_mode->clock;
824 if ((ksel == KSEL_CRYSTAL_19) || (ksel == KSEL_BYPASS_19)) {
827 if (is_mipi || is_mipi2)
828 clk_n = 1, clk_p2 = 8;
830 clk_n = 1, clk_p2 = 10;
831 } else if (ksel == KSEL_BYPASS_25) {
834 if (is_mipi || is_mipi2)
835 clk_n = 1, clk_p2 = 8;
837 clk_n = 1, clk_p2 = 10;
838 } else if ((ksel == KSEL_BYPASS_83_100) &&
839 dev_priv->core_freq == 166) {
842 if (is_mipi || is_mipi2)
843 clk_n = 4, clk_p2 = 8;
845 clk_n = 4, clk_p2 = 10;
846 } else if ((ksel == KSEL_BYPASS_83_100) &&
847 (dev_priv->core_freq == 100 ||
848 dev_priv->core_freq == 200)) {
850 if (is_mipi || is_mipi2)
851 clk_n = 4, clk_p2 = 8;
853 clk_n = 4, clk_p2 = 10;
857 clk_byte = dev_priv->bpp / 8;
859 clk_byte = dev_priv->bpp2 / 8;
861 clk_tmp = clk * clk_n * clk_p2 * clk_byte;
863 dev_dbg(dev->dev, "clk = %d, clk_n = %d, clk_p2 = %d.\n",
865 dev_dbg(dev->dev, "adjusted_mode->clock = %d, clk_tmp = %d.\n",
866 adjusted_mode->clock, clk_tmp);
868 ok = mdfldFindBestPLL(crtc, clk_tmp, refclk, &clock);
872 ("mdfldFindBestPLL fail in mdfld_crtc_mode_set.\n");
874 m_conv = mdfld_m_converts[(clock.m - MDFLD_M_MIN)];
876 dev_dbg(dev->dev, "dot clock = %d,"
877 "m = %d, p1 = %d, m_conv = %d.\n",
882 dpll = REG_READ(map->dpll);
884 if (dpll & DPLL_VCO_ENABLE) {
885 dpll &= ~DPLL_VCO_ENABLE;
886 REG_WRITE(map->dpll, dpll);
889 /* FIXME jliu7 check the DPLL lock bit PIPEACONF[29] */
890 /* FIXME_MDFLD PO - change 500 to 1 after PO */
893 /* reset M1, N1 & P1 */
894 REG_WRITE(map->fp0, 0);
895 dpll &= ~MDFLD_P1_MASK;
896 REG_WRITE(map->dpll, dpll);
897 /* FIXME_MDFLD PO - change 500 to 1 after PO */
901 /* When ungating power of DPLL, needs to wait 0.5us before
903 if (dpll & MDFLD_PWR_GATE_EN) {
904 dpll &= ~MDFLD_PWR_GATE_EN;
905 REG_WRITE(map->dpll, dpll);
906 /* FIXME_MDFLD PO - change 500 to 1 after PO */
912 dpll |= MDFLD_VCO_SEL;
914 fp = (clk_n / 2) << 16;
917 /* compute bitmask from p1 value */
918 dpll |= (1 << (clock.p1 - 2)) << 17;
925 REG_WRITE(map->fp0, fp);
926 REG_WRITE(map->dpll, dpll);
927 /* FIXME_MDFLD PO - change 500 to 1 after PO */
930 dpll |= DPLL_VCO_ENABLE;
931 REG_WRITE(map->dpll, dpll);
934 /* wait for DSI PLL to lock */
935 while (timeout < 20000 &&
936 !(REG_READ(map->conf) & PIPECONF_DSIPLL_LOCK)) {
942 goto mrst_crtc_mode_set_exit;
944 dev_dbg(dev->dev, "is_mipi = 0x%x\n", is_mipi);
946 REG_WRITE(map->conf, dev_priv->pipeconf[pipe]);
949 /* Wait for for the pipe enable to take effect. */
950 REG_WRITE(map->cntr, dev_priv->dspcntr[pipe]);
951 gma_wait_for_vblank(dev);
953 mrst_crtc_mode_set_exit:
960 const struct drm_crtc_helper_funcs mdfld_helper_funcs = {
961 .dpms = mdfld_crtc_dpms,
962 .mode_set = mdfld_crtc_mode_set,
963 .mode_set_base = mdfld__intel_pipe_set_base,
964 .prepare = gma_crtc_prepare,
965 .commit = gma_crtc_commit,