1 /* 2 * Copyright © 2010 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: 24 * Li Peng <peng.li@intel.com> 25 */ 26 27 #include <drm/drmP.h> 28 #include <drm/drm.h> 29 #include "psb_intel_drv.h" 30 #include "psb_intel_reg.h" 31 #include "psb_drv.h" 32 33 #define HDMI_READ(reg) readl(hdmi_dev->regs + (reg)) 34 #define HDMI_WRITE(reg, val) writel(val, hdmi_dev->regs + (reg)) 35 36 #define HDMI_HCR 0x1000 37 #define HCR_ENABLE_HDCP (1 << 5) 38 #define HCR_ENABLE_AUDIO (1 << 2) 39 #define HCR_ENABLE_PIXEL (1 << 1) 40 #define HCR_ENABLE_TMDS (1 << 0) 41 42 #define HDMI_HICR 0x1004 43 #define HDMI_HSR 0x1008 44 #define HDMI_HISR 0x100C 45 #define HDMI_DETECT_HDP (1 << 0) 46 47 #define HDMI_VIDEO_REG 0x3000 48 #define HDMI_UNIT_EN (1 << 7) 49 #define HDMI_MODE_OUTPUT (1 << 0) 50 #define HDMI_HBLANK_A 0x3100 51 52 #define HDMI_AUDIO_CTRL 0x4000 53 #define HDMI_ENABLE_AUDIO (1 << 0) 54 55 #define PCH_HTOTAL_B 0x3100 56 #define PCH_HBLANK_B 0x3104 57 #define PCH_HSYNC_B 0x3108 58 #define PCH_VTOTAL_B 0x310C 59 #define PCH_VBLANK_B 0x3110 60 #define PCH_VSYNC_B 0x3114 61 #define PCH_PIPEBSRC 0x311C 62 63 #define PCH_PIPEB_DSL 0x3800 64 #define PCH_PIPEB_SLC 0x3804 65 #define PCH_PIPEBCONF 0x3808 66 #define PCH_PIPEBSTAT 0x3824 67 68 #define CDVO_DFT 0x5000 69 #define CDVO_SLEWRATE 0x5004 70 #define CDVO_STRENGTH 0x5008 71 #define CDVO_RCOMP 0x500C 72 73 #define DPLL_CTRL 0x6000 74 #define DPLL_PDIV_SHIFT 16 75 #define DPLL_PDIV_MASK (0xf << 16) 76 #define DPLL_PWRDN (1 << 4) 77 #define DPLL_RESET (1 << 3) 78 #define DPLL_FASTEN (1 << 2) 79 #define DPLL_ENSTAT (1 << 1) 80 #define DPLL_DITHEN (1 << 0) 81 82 #define DPLL_DIV_CTRL 0x6004 83 #define DPLL_CLKF_MASK 0xffffffc0 84 #define DPLL_CLKR_MASK (0x3f) 85 86 #define DPLL_CLK_ENABLE 0x6008 87 #define DPLL_EN_DISP (1 << 31) 88 #define DPLL_SEL_HDMI (1 << 8) 89 #define DPLL_EN_HDMI (1 << 1) 90 #define DPLL_EN_VGA (1 << 0) 91 92 #define DPLL_ADJUST 0x600C 93 #define DPLL_STATUS 0x6010 94 #define DPLL_UPDATE 0x6014 95 #define DPLL_DFT 0x6020 96 97 struct intel_range { 98 int min, max; 99 }; 100 101 struct oaktrail_hdmi_limit { 102 struct intel_range vco, np, nr, nf; 103 }; 104 105 struct oaktrail_hdmi_clock { 106 int np; 107 int nr; 108 int nf; 109 int dot; 110 }; 111 112 #define VCO_MIN 320000 113 #define VCO_MAX 1650000 114 #define NP_MIN 1 115 #define NP_MAX 15 116 #define NR_MIN 1 117 #define NR_MAX 64 118 #define NF_MIN 2 119 #define NF_MAX 4095 120 121 static const struct oaktrail_hdmi_limit oaktrail_hdmi_limit = { 122 .vco = { .min = VCO_MIN, .max = VCO_MAX }, 123 .np = { .min = NP_MIN, .max = NP_MAX }, 124 .nr = { .min = NR_MIN, .max = NR_MAX }, 125 .nf = { .min = NF_MIN, .max = NF_MAX }, 126 }; 127 128 static void oaktrail_hdmi_audio_enable(struct drm_device *dev) 129 { 130 struct drm_psb_private *dev_priv = dev->dev_private; 131 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 132 133 HDMI_WRITE(HDMI_HCR, 0x67); 134 HDMI_READ(HDMI_HCR); 135 136 HDMI_WRITE(0x51a8, 0x10); 137 HDMI_READ(0x51a8); 138 139 HDMI_WRITE(HDMI_AUDIO_CTRL, 0x1); 140 HDMI_READ(HDMI_AUDIO_CTRL); 141 } 142 143 static void oaktrail_hdmi_audio_disable(struct drm_device *dev) 144 { 145 struct drm_psb_private *dev_priv = dev->dev_private; 146 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 147 148 HDMI_WRITE(0x51a8, 0x0); 149 HDMI_READ(0x51a8); 150 151 HDMI_WRITE(HDMI_AUDIO_CTRL, 0x0); 152 HDMI_READ(HDMI_AUDIO_CTRL); 153 154 HDMI_WRITE(HDMI_HCR, 0x47); 155 HDMI_READ(HDMI_HCR); 156 } 157 158 static unsigned int htotal_calculate(struct drm_display_mode *mode) 159 { 160 u32 htotal, new_crtc_htotal; 161 162 htotal = (mode->crtc_hdisplay - 1) | ((mode->crtc_htotal - 1) << 16); 163 164 /* 165 * 1024 x 768 new_crtc_htotal = 0x1024; 166 * 1280 x 1024 new_crtc_htotal = 0x0c34; 167 */ 168 new_crtc_htotal = (mode->crtc_htotal - 1) * 200 * 1000 / mode->clock; 169 170 DRM_DEBUG_KMS("new crtc htotal 0x%4x\n", new_crtc_htotal); 171 return (mode->crtc_hdisplay - 1) | (new_crtc_htotal << 16); 172 } 173 174 static void oaktrail_hdmi_find_dpll(struct drm_crtc *crtc, int target, 175 int refclk, struct oaktrail_hdmi_clock *best_clock) 176 { 177 int np_min, np_max, nr_min, nr_max; 178 int np, nr, nf; 179 180 np_min = DIV_ROUND_UP(oaktrail_hdmi_limit.vco.min, target * 10); 181 np_max = oaktrail_hdmi_limit.vco.max / (target * 10); 182 if (np_min < oaktrail_hdmi_limit.np.min) 183 np_min = oaktrail_hdmi_limit.np.min; 184 if (np_max > oaktrail_hdmi_limit.np.max) 185 np_max = oaktrail_hdmi_limit.np.max; 186 187 nr_min = DIV_ROUND_UP((refclk * 1000), (target * 10 * np_max)); 188 nr_max = DIV_ROUND_UP((refclk * 1000), (target * 10 * np_min)); 189 if (nr_min < oaktrail_hdmi_limit.nr.min) 190 nr_min = oaktrail_hdmi_limit.nr.min; 191 if (nr_max > oaktrail_hdmi_limit.nr.max) 192 nr_max = oaktrail_hdmi_limit.nr.max; 193 194 np = DIV_ROUND_UP((refclk * 1000), (target * 10 * nr_max)); 195 nr = DIV_ROUND_UP((refclk * 1000), (target * 10 * np)); 196 nf = DIV_ROUND_CLOSEST((target * 10 * np * nr), refclk); 197 DRM_DEBUG_KMS("np, nr, nf %d %d %d\n", np, nr, nf); 198 199 /* 200 * 1024 x 768 np = 1; nr = 0x26; nf = 0x0fd8000; 201 * 1280 x 1024 np = 1; nr = 0x17; nf = 0x1034000; 202 */ 203 best_clock->np = np; 204 best_clock->nr = nr - 1; 205 best_clock->nf = (nf << 14); 206 } 207 208 static void scu_busy_loop(void __iomem *scu_base) 209 { 210 u32 status = 0; 211 u32 loop_count = 0; 212 213 status = readl(scu_base + 0x04); 214 while (status & 1) { 215 udelay(1); /* scu processing time is in few u secods */ 216 status = readl(scu_base + 0x04); 217 loop_count++; 218 /* break if scu doesn't reset busy bit after huge retry */ 219 if (loop_count > 1000) { 220 DRM_DEBUG_KMS("SCU IPC timed out"); 221 return; 222 } 223 } 224 } 225 226 /* 227 * You don't want to know, you really really don't want to know.... 228 * 229 * This is magic. However it's safe magic because of the way the platform 230 * works and it is necessary magic. 231 */ 232 static void oaktrail_hdmi_reset(struct drm_device *dev) 233 { 234 void __iomem *base; 235 unsigned long scu_ipc_mmio = 0xff11c000UL; 236 int scu_len = 1024; 237 238 base = ioremap((resource_size_t)scu_ipc_mmio, scu_len); 239 if (base == NULL) { 240 DRM_ERROR("failed to map scu mmio\n"); 241 return; 242 } 243 244 /* scu ipc: assert hdmi controller reset */ 245 writel(0xff11d118, base + 0x0c); 246 writel(0x7fffffdf, base + 0x80); 247 writel(0x42005, base + 0x0); 248 scu_busy_loop(base); 249 250 /* scu ipc: de-assert hdmi controller reset */ 251 writel(0xff11d118, base + 0x0c); 252 writel(0x7fffffff, base + 0x80); 253 writel(0x42005, base + 0x0); 254 scu_busy_loop(base); 255 256 iounmap(base); 257 } 258 259 int oaktrail_crtc_hdmi_mode_set(struct drm_crtc *crtc, 260 struct drm_display_mode *mode, 261 struct drm_display_mode *adjusted_mode, 262 int x, int y, 263 struct drm_framebuffer *old_fb) 264 { 265 struct drm_device *dev = crtc->dev; 266 struct drm_psb_private *dev_priv = dev->dev_private; 267 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 268 int pipe = 1; 269 int htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; 270 int hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B; 271 int hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B; 272 int vtot_reg = (pipe == 0) ? VTOTAL_A : VTOTAL_B; 273 int vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B; 274 int vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B; 275 int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE; 276 int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS; 277 int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC; 278 int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF; 279 int refclk; 280 struct oaktrail_hdmi_clock clock; 281 u32 dspcntr, pipeconf, dpll, temp; 282 int dspcntr_reg = DSPBCNTR; 283 284 if (!gma_power_begin(dev, true)) 285 return 0; 286 287 /* Disable the VGA plane that we never use */ 288 REG_WRITE(VGACNTRL, VGA_DISP_DISABLE); 289 290 /* Disable dpll if necessary */ 291 dpll = REG_READ(DPLL_CTRL); 292 if ((dpll & DPLL_PWRDN) == 0) { 293 REG_WRITE(DPLL_CTRL, dpll | (DPLL_PWRDN | DPLL_RESET)); 294 REG_WRITE(DPLL_DIV_CTRL, 0x00000000); 295 REG_WRITE(DPLL_STATUS, 0x1); 296 } 297 udelay(150); 298 299 /* Reset controller */ 300 oaktrail_hdmi_reset(dev); 301 302 /* program and enable dpll */ 303 refclk = 25000; 304 oaktrail_hdmi_find_dpll(crtc, adjusted_mode->clock, refclk, &clock); 305 306 /* Set the DPLL */ 307 dpll = REG_READ(DPLL_CTRL); 308 dpll &= ~DPLL_PDIV_MASK; 309 dpll &= ~(DPLL_PWRDN | DPLL_RESET); 310 REG_WRITE(DPLL_CTRL, 0x00000008); 311 REG_WRITE(DPLL_DIV_CTRL, ((clock.nf << 6) | clock.nr)); 312 REG_WRITE(DPLL_ADJUST, ((clock.nf >> 14) - 1)); 313 REG_WRITE(DPLL_CTRL, (dpll | (clock.np << DPLL_PDIV_SHIFT) | DPLL_ENSTAT | DPLL_DITHEN)); 314 REG_WRITE(DPLL_UPDATE, 0x80000000); 315 REG_WRITE(DPLL_CLK_ENABLE, 0x80050102); 316 udelay(150); 317 318 /* configure HDMI */ 319 HDMI_WRITE(0x1004, 0x1fd); 320 HDMI_WRITE(0x2000, 0x1); 321 HDMI_WRITE(0x2008, 0x0); 322 HDMI_WRITE(0x3130, 0x8); 323 HDMI_WRITE(0x101c, 0x1800810); 324 325 temp = htotal_calculate(adjusted_mode); 326 REG_WRITE(htot_reg, temp); 327 REG_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) | ((adjusted_mode->crtc_hblank_end - 1) << 16)); 328 REG_WRITE(hsync_reg, (adjusted_mode->crtc_hsync_start - 1) | ((adjusted_mode->crtc_hsync_end - 1) << 16)); 329 REG_WRITE(vtot_reg, (adjusted_mode->crtc_vdisplay - 1) | ((adjusted_mode->crtc_vtotal - 1) << 16)); 330 REG_WRITE(vblank_reg, (adjusted_mode->crtc_vblank_start - 1) | ((adjusted_mode->crtc_vblank_end - 1) << 16)); 331 REG_WRITE(vsync_reg, (adjusted_mode->crtc_vsync_start - 1) | ((adjusted_mode->crtc_vsync_end - 1) << 16)); 332 REG_WRITE(pipesrc_reg, ((mode->crtc_hdisplay - 1) << 16) | (mode->crtc_vdisplay - 1)); 333 334 REG_WRITE(PCH_HTOTAL_B, (adjusted_mode->crtc_hdisplay - 1) | ((adjusted_mode->crtc_htotal - 1) << 16)); 335 REG_WRITE(PCH_HBLANK_B, (adjusted_mode->crtc_hblank_start - 1) | ((adjusted_mode->crtc_hblank_end - 1) << 16)); 336 REG_WRITE(PCH_HSYNC_B, (adjusted_mode->crtc_hsync_start - 1) | ((adjusted_mode->crtc_hsync_end - 1) << 16)); 337 REG_WRITE(PCH_VTOTAL_B, (adjusted_mode->crtc_vdisplay - 1) | ((adjusted_mode->crtc_vtotal - 1) << 16)); 338 REG_WRITE(PCH_VBLANK_B, (adjusted_mode->crtc_vblank_start - 1) | ((adjusted_mode->crtc_vblank_end - 1) << 16)); 339 REG_WRITE(PCH_VSYNC_B, (adjusted_mode->crtc_vsync_start - 1) | ((adjusted_mode->crtc_vsync_end - 1) << 16)); 340 REG_WRITE(PCH_PIPEBSRC, ((mode->crtc_hdisplay - 1) << 16) | (mode->crtc_vdisplay - 1)); 341 342 temp = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start; 343 HDMI_WRITE(HDMI_HBLANK_A, ((adjusted_mode->crtc_hdisplay - 1) << 16) | temp); 344 345 REG_WRITE(dspsize_reg, ((mode->vdisplay - 1) << 16) | (mode->hdisplay - 1)); 346 REG_WRITE(dsppos_reg, 0); 347 348 /* Flush the plane changes */ 349 { 350 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 351 crtc_funcs->mode_set_base(crtc, x, y, old_fb); 352 } 353 354 /* Set up the display plane register */ 355 dspcntr = REG_READ(dspcntr_reg); 356 dspcntr |= DISPPLANE_GAMMA_ENABLE; 357 dspcntr |= DISPPLANE_SEL_PIPE_B; 358 dspcntr |= DISPLAY_PLANE_ENABLE; 359 360 /* setup pipeconf */ 361 pipeconf = REG_READ(pipeconf_reg); 362 pipeconf |= PIPEACONF_ENABLE; 363 364 REG_WRITE(pipeconf_reg, pipeconf); 365 REG_READ(pipeconf_reg); 366 367 REG_WRITE(PCH_PIPEBCONF, pipeconf); 368 REG_READ(PCH_PIPEBCONF); 369 gma_wait_for_vblank(dev); 370 371 REG_WRITE(dspcntr_reg, dspcntr); 372 gma_wait_for_vblank(dev); 373 374 gma_power_end(dev); 375 376 return 0; 377 } 378 379 void oaktrail_crtc_hdmi_dpms(struct drm_crtc *crtc, int mode) 380 { 381 struct drm_device *dev = crtc->dev; 382 u32 temp; 383 384 DRM_DEBUG_KMS("%s %d\n", __func__, mode); 385 386 switch (mode) { 387 case DRM_MODE_DPMS_OFF: 388 REG_WRITE(VGACNTRL, 0x80000000); 389 390 /* Disable plane */ 391 temp = REG_READ(DSPBCNTR); 392 if ((temp & DISPLAY_PLANE_ENABLE) != 0) { 393 REG_WRITE(DSPBCNTR, temp & ~DISPLAY_PLANE_ENABLE); 394 REG_READ(DSPBCNTR); 395 /* Flush the plane changes */ 396 REG_WRITE(DSPBSURF, REG_READ(DSPBSURF)); 397 REG_READ(DSPBSURF); 398 } 399 400 /* Disable pipe B */ 401 temp = REG_READ(PIPEBCONF); 402 if ((temp & PIPEACONF_ENABLE) != 0) { 403 REG_WRITE(PIPEBCONF, temp & ~PIPEACONF_ENABLE); 404 REG_READ(PIPEBCONF); 405 } 406 407 /* Disable LNW Pipes, etc */ 408 temp = REG_READ(PCH_PIPEBCONF); 409 if ((temp & PIPEACONF_ENABLE) != 0) { 410 REG_WRITE(PCH_PIPEBCONF, temp & ~PIPEACONF_ENABLE); 411 REG_READ(PCH_PIPEBCONF); 412 } 413 414 /* wait for pipe off */ 415 udelay(150); 416 417 /* Disable dpll */ 418 temp = REG_READ(DPLL_CTRL); 419 if ((temp & DPLL_PWRDN) == 0) { 420 REG_WRITE(DPLL_CTRL, temp | (DPLL_PWRDN | DPLL_RESET)); 421 REG_WRITE(DPLL_STATUS, 0x1); 422 } 423 424 /* wait for dpll off */ 425 udelay(150); 426 427 break; 428 case DRM_MODE_DPMS_ON: 429 case DRM_MODE_DPMS_STANDBY: 430 case DRM_MODE_DPMS_SUSPEND: 431 /* Enable dpll */ 432 temp = REG_READ(DPLL_CTRL); 433 if ((temp & DPLL_PWRDN) != 0) { 434 REG_WRITE(DPLL_CTRL, temp & ~(DPLL_PWRDN | DPLL_RESET)); 435 temp = REG_READ(DPLL_CLK_ENABLE); 436 REG_WRITE(DPLL_CLK_ENABLE, temp | DPLL_EN_DISP | DPLL_SEL_HDMI | DPLL_EN_HDMI); 437 REG_READ(DPLL_CLK_ENABLE); 438 } 439 /* wait for dpll warm up */ 440 udelay(150); 441 442 /* Enable pipe B */ 443 temp = REG_READ(PIPEBCONF); 444 if ((temp & PIPEACONF_ENABLE) == 0) { 445 REG_WRITE(PIPEBCONF, temp | PIPEACONF_ENABLE); 446 REG_READ(PIPEBCONF); 447 } 448 449 /* Enable LNW Pipe B */ 450 temp = REG_READ(PCH_PIPEBCONF); 451 if ((temp & PIPEACONF_ENABLE) == 0) { 452 REG_WRITE(PCH_PIPEBCONF, temp | PIPEACONF_ENABLE); 453 REG_READ(PCH_PIPEBCONF); 454 } 455 456 gma_wait_for_vblank(dev); 457 458 /* Enable plane */ 459 temp = REG_READ(DSPBCNTR); 460 if ((temp & DISPLAY_PLANE_ENABLE) == 0) { 461 REG_WRITE(DSPBCNTR, temp | DISPLAY_PLANE_ENABLE); 462 /* Flush the plane changes */ 463 REG_WRITE(DSPBSURF, REG_READ(DSPBSURF)); 464 REG_READ(DSPBSURF); 465 } 466 467 gma_crtc_load_lut(crtc); 468 } 469 470 /* DSPARB */ 471 REG_WRITE(DSPARB, 0x00003fbf); 472 473 /* FW1 */ 474 REG_WRITE(0x70034, 0x3f880a0a); 475 476 /* FW2 */ 477 REG_WRITE(0x70038, 0x0b060808); 478 479 /* FW4 */ 480 REG_WRITE(0x70050, 0x08030404); 481 482 /* FW5 */ 483 REG_WRITE(0x70054, 0x04040404); 484 485 /* LNC Chicken Bits - Squawk! */ 486 REG_WRITE(0x70400, 0x4000); 487 488 return; 489 } 490 491 static void oaktrail_hdmi_dpms(struct drm_encoder *encoder, int mode) 492 { 493 static int dpms_mode = -1; 494 495 struct drm_device *dev = encoder->dev; 496 struct drm_psb_private *dev_priv = dev->dev_private; 497 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 498 u32 temp; 499 500 if (dpms_mode == mode) 501 return; 502 503 if (mode != DRM_MODE_DPMS_ON) 504 temp = 0x0; 505 else 506 temp = 0x99; 507 508 dpms_mode = mode; 509 HDMI_WRITE(HDMI_VIDEO_REG, temp); 510 } 511 512 static int oaktrail_hdmi_mode_valid(struct drm_connector *connector, 513 struct drm_display_mode *mode) 514 { 515 if (mode->clock > 165000) 516 return MODE_CLOCK_HIGH; 517 if (mode->clock < 20000) 518 return MODE_CLOCK_LOW; 519 520 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 521 return MODE_NO_DBLESCAN; 522 523 return MODE_OK; 524 } 525 526 static bool oaktrail_hdmi_mode_fixup(struct drm_encoder *encoder, 527 const struct drm_display_mode *mode, 528 struct drm_display_mode *adjusted_mode) 529 { 530 return true; 531 } 532 533 static enum drm_connector_status 534 oaktrail_hdmi_detect(struct drm_connector *connector, bool force) 535 { 536 enum drm_connector_status status; 537 struct drm_device *dev = connector->dev; 538 struct drm_psb_private *dev_priv = dev->dev_private; 539 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 540 u32 temp; 541 542 temp = HDMI_READ(HDMI_HSR); 543 DRM_DEBUG_KMS("HDMI_HSR %x\n", temp); 544 545 if ((temp & HDMI_DETECT_HDP) != 0) 546 status = connector_status_connected; 547 else 548 status = connector_status_disconnected; 549 550 return status; 551 } 552 553 static const unsigned char raw_edid[] = { 554 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x10, 0xac, 0x2f, 0xa0, 555 0x53, 0x55, 0x33, 0x30, 0x16, 0x13, 0x01, 0x03, 0x0e, 0x3a, 0x24, 0x78, 556 0xea, 0xe9, 0xf5, 0xac, 0x51, 0x30, 0xb4, 0x25, 0x11, 0x50, 0x54, 0xa5, 557 0x4b, 0x00, 0x81, 0x80, 0xa9, 0x40, 0x71, 0x4f, 0xb3, 0x00, 0x01, 0x01, 558 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x28, 0x3c, 0x80, 0xa0, 0x70, 0xb0, 559 0x23, 0x40, 0x30, 0x20, 0x36, 0x00, 0x46, 0x6c, 0x21, 0x00, 0x00, 0x1a, 560 0x00, 0x00, 0x00, 0xff, 0x00, 0x47, 0x4e, 0x37, 0x32, 0x31, 0x39, 0x35, 561 0x52, 0x30, 0x33, 0x55, 0x53, 0x0a, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x44, 562 0x45, 0x4c, 0x4c, 0x20, 0x32, 0x37, 0x30, 0x39, 0x57, 0x0a, 0x20, 0x20, 563 0x00, 0x00, 0x00, 0xfd, 0x00, 0x38, 0x4c, 0x1e, 0x53, 0x11, 0x00, 0x0a, 564 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x8d 565 }; 566 567 static int oaktrail_hdmi_get_modes(struct drm_connector *connector) 568 { 569 struct i2c_adapter *i2c_adap; 570 struct edid *edid; 571 int ret = 0; 572 573 /* 574 * FIXME: We need to figure this lot out. In theory we can 575 * read the EDID somehow but I've yet to find working reference 576 * code. 577 */ 578 i2c_adap = i2c_get_adapter(3); 579 if (i2c_adap == NULL) { 580 DRM_ERROR("No ddc adapter available!\n"); 581 edid = (struct edid *)raw_edid; 582 } else { 583 edid = (struct edid *)raw_edid; 584 /* FIXME ? edid = drm_get_edid(connector, i2c_adap); */ 585 } 586 587 if (edid) { 588 drm_mode_connector_update_edid_property(connector, edid); 589 ret = drm_add_edid_modes(connector, edid); 590 } 591 return ret; 592 } 593 594 static void oaktrail_hdmi_mode_set(struct drm_encoder *encoder, 595 struct drm_display_mode *mode, 596 struct drm_display_mode *adjusted_mode) 597 { 598 struct drm_device *dev = encoder->dev; 599 600 oaktrail_hdmi_audio_enable(dev); 601 return; 602 } 603 604 static void oaktrail_hdmi_destroy(struct drm_connector *connector) 605 { 606 return; 607 } 608 609 static const struct drm_encoder_helper_funcs oaktrail_hdmi_helper_funcs = { 610 .dpms = oaktrail_hdmi_dpms, 611 .mode_fixup = oaktrail_hdmi_mode_fixup, 612 .prepare = gma_encoder_prepare, 613 .mode_set = oaktrail_hdmi_mode_set, 614 .commit = gma_encoder_commit, 615 }; 616 617 static const struct drm_connector_helper_funcs 618 oaktrail_hdmi_connector_helper_funcs = { 619 .get_modes = oaktrail_hdmi_get_modes, 620 .mode_valid = oaktrail_hdmi_mode_valid, 621 .best_encoder = gma_best_encoder, 622 }; 623 624 static const struct drm_connector_funcs oaktrail_hdmi_connector_funcs = { 625 .dpms = drm_helper_connector_dpms, 626 .detect = oaktrail_hdmi_detect, 627 .fill_modes = drm_helper_probe_single_connector_modes, 628 .destroy = oaktrail_hdmi_destroy, 629 }; 630 631 static void oaktrail_hdmi_enc_destroy(struct drm_encoder *encoder) 632 { 633 drm_encoder_cleanup(encoder); 634 } 635 636 static const struct drm_encoder_funcs oaktrail_hdmi_enc_funcs = { 637 .destroy = oaktrail_hdmi_enc_destroy, 638 }; 639 640 void oaktrail_hdmi_init(struct drm_device *dev, 641 struct psb_intel_mode_device *mode_dev) 642 { 643 struct gma_encoder *gma_encoder; 644 struct gma_connector *gma_connector; 645 struct drm_connector *connector; 646 struct drm_encoder *encoder; 647 648 gma_encoder = kzalloc(sizeof(struct gma_encoder), GFP_KERNEL); 649 if (!gma_encoder) 650 return; 651 652 gma_connector = kzalloc(sizeof(struct gma_connector), GFP_KERNEL); 653 if (!gma_connector) 654 goto failed_connector; 655 656 connector = &gma_connector->base; 657 encoder = &gma_encoder->base; 658 drm_connector_init(dev, connector, 659 &oaktrail_hdmi_connector_funcs, 660 DRM_MODE_CONNECTOR_DVID); 661 662 drm_encoder_init(dev, encoder, 663 &oaktrail_hdmi_enc_funcs, 664 DRM_MODE_ENCODER_TMDS); 665 666 gma_connector_attach_encoder(gma_connector, gma_encoder); 667 668 gma_encoder->type = INTEL_OUTPUT_HDMI; 669 drm_encoder_helper_add(encoder, &oaktrail_hdmi_helper_funcs); 670 drm_connector_helper_add(connector, &oaktrail_hdmi_connector_helper_funcs); 671 672 connector->display_info.subpixel_order = SubPixelHorizontalRGB; 673 connector->interlace_allowed = false; 674 connector->doublescan_allowed = false; 675 drm_sysfs_connector_add(connector); 676 dev_info(dev->dev, "HDMI initialised.\n"); 677 678 return; 679 680 failed_connector: 681 kfree(gma_encoder); 682 } 683 684 static DEFINE_PCI_DEVICE_TABLE(hdmi_ids) = { 685 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080d) }, 686 { 0 } 687 }; 688 689 void oaktrail_hdmi_setup(struct drm_device *dev) 690 { 691 struct drm_psb_private *dev_priv = dev->dev_private; 692 struct pci_dev *pdev; 693 struct oaktrail_hdmi_dev *hdmi_dev; 694 int ret; 695 696 pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x080d, NULL); 697 if (!pdev) 698 return; 699 700 hdmi_dev = kzalloc(sizeof(struct oaktrail_hdmi_dev), GFP_KERNEL); 701 if (!hdmi_dev) { 702 dev_err(dev->dev, "failed to allocate memory\n"); 703 goto out; 704 } 705 706 707 ret = pci_enable_device(pdev); 708 if (ret) { 709 dev_err(dev->dev, "failed to enable hdmi controller\n"); 710 goto free; 711 } 712 713 hdmi_dev->mmio = pci_resource_start(pdev, 0); 714 hdmi_dev->mmio_len = pci_resource_len(pdev, 0); 715 hdmi_dev->regs = ioremap(hdmi_dev->mmio, hdmi_dev->mmio_len); 716 if (!hdmi_dev->regs) { 717 dev_err(dev->dev, "failed to map hdmi mmio\n"); 718 goto free; 719 } 720 721 hdmi_dev->dev = pdev; 722 pci_set_drvdata(pdev, hdmi_dev); 723 724 /* Initialize i2c controller */ 725 ret = oaktrail_hdmi_i2c_init(hdmi_dev->dev); 726 if (ret) 727 dev_err(dev->dev, "HDMI I2C initialization failed\n"); 728 729 dev_priv->hdmi_priv = hdmi_dev; 730 oaktrail_hdmi_audio_disable(dev); 731 732 dev_info(dev->dev, "HDMI hardware present.\n"); 733 734 return; 735 736 free: 737 kfree(hdmi_dev); 738 out: 739 return; 740 } 741 742 void oaktrail_hdmi_teardown(struct drm_device *dev) 743 { 744 struct drm_psb_private *dev_priv = dev->dev_private; 745 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 746 struct pci_dev *pdev; 747 748 if (hdmi_dev) { 749 pdev = hdmi_dev->dev; 750 pci_set_drvdata(pdev, NULL); 751 oaktrail_hdmi_i2c_exit(pdev); 752 iounmap(hdmi_dev->regs); 753 kfree(hdmi_dev); 754 pci_dev_put(pdev); 755 } 756 } 757 758 /* save HDMI register state */ 759 void oaktrail_hdmi_save(struct drm_device *dev) 760 { 761 struct drm_psb_private *dev_priv = dev->dev_private; 762 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 763 struct psb_state *regs = &dev_priv->regs.psb; 764 struct psb_pipe *pipeb = &dev_priv->regs.pipe[1]; 765 int i; 766 767 /* dpll */ 768 hdmi_dev->saveDPLL_CTRL = PSB_RVDC32(DPLL_CTRL); 769 hdmi_dev->saveDPLL_DIV_CTRL = PSB_RVDC32(DPLL_DIV_CTRL); 770 hdmi_dev->saveDPLL_ADJUST = PSB_RVDC32(DPLL_ADJUST); 771 hdmi_dev->saveDPLL_UPDATE = PSB_RVDC32(DPLL_UPDATE); 772 hdmi_dev->saveDPLL_CLK_ENABLE = PSB_RVDC32(DPLL_CLK_ENABLE); 773 774 /* pipe B */ 775 pipeb->conf = PSB_RVDC32(PIPEBCONF); 776 pipeb->src = PSB_RVDC32(PIPEBSRC); 777 pipeb->htotal = PSB_RVDC32(HTOTAL_B); 778 pipeb->hblank = PSB_RVDC32(HBLANK_B); 779 pipeb->hsync = PSB_RVDC32(HSYNC_B); 780 pipeb->vtotal = PSB_RVDC32(VTOTAL_B); 781 pipeb->vblank = PSB_RVDC32(VBLANK_B); 782 pipeb->vsync = PSB_RVDC32(VSYNC_B); 783 784 hdmi_dev->savePCH_PIPEBCONF = PSB_RVDC32(PCH_PIPEBCONF); 785 hdmi_dev->savePCH_PIPEBSRC = PSB_RVDC32(PCH_PIPEBSRC); 786 hdmi_dev->savePCH_HTOTAL_B = PSB_RVDC32(PCH_HTOTAL_B); 787 hdmi_dev->savePCH_HBLANK_B = PSB_RVDC32(PCH_HBLANK_B); 788 hdmi_dev->savePCH_HSYNC_B = PSB_RVDC32(PCH_HSYNC_B); 789 hdmi_dev->savePCH_VTOTAL_B = PSB_RVDC32(PCH_VTOTAL_B); 790 hdmi_dev->savePCH_VBLANK_B = PSB_RVDC32(PCH_VBLANK_B); 791 hdmi_dev->savePCH_VSYNC_B = PSB_RVDC32(PCH_VSYNC_B); 792 793 /* plane */ 794 pipeb->cntr = PSB_RVDC32(DSPBCNTR); 795 pipeb->stride = PSB_RVDC32(DSPBSTRIDE); 796 pipeb->addr = PSB_RVDC32(DSPBBASE); 797 pipeb->surf = PSB_RVDC32(DSPBSURF); 798 pipeb->linoff = PSB_RVDC32(DSPBLINOFF); 799 pipeb->tileoff = PSB_RVDC32(DSPBTILEOFF); 800 801 /* cursor B */ 802 regs->saveDSPBCURSOR_CTRL = PSB_RVDC32(CURBCNTR); 803 regs->saveDSPBCURSOR_BASE = PSB_RVDC32(CURBBASE); 804 regs->saveDSPBCURSOR_POS = PSB_RVDC32(CURBPOS); 805 806 /* save palette */ 807 for (i = 0; i < 256; i++) 808 pipeb->palette[i] = PSB_RVDC32(PALETTE_B + (i << 2)); 809 } 810 811 /* restore HDMI register state */ 812 void oaktrail_hdmi_restore(struct drm_device *dev) 813 { 814 struct drm_psb_private *dev_priv = dev->dev_private; 815 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 816 struct psb_state *regs = &dev_priv->regs.psb; 817 struct psb_pipe *pipeb = &dev_priv->regs.pipe[1]; 818 int i; 819 820 /* dpll */ 821 PSB_WVDC32(hdmi_dev->saveDPLL_CTRL, DPLL_CTRL); 822 PSB_WVDC32(hdmi_dev->saveDPLL_DIV_CTRL, DPLL_DIV_CTRL); 823 PSB_WVDC32(hdmi_dev->saveDPLL_ADJUST, DPLL_ADJUST); 824 PSB_WVDC32(hdmi_dev->saveDPLL_UPDATE, DPLL_UPDATE); 825 PSB_WVDC32(hdmi_dev->saveDPLL_CLK_ENABLE, DPLL_CLK_ENABLE); 826 DRM_UDELAY(150); 827 828 /* pipe */ 829 PSB_WVDC32(pipeb->src, PIPEBSRC); 830 PSB_WVDC32(pipeb->htotal, HTOTAL_B); 831 PSB_WVDC32(pipeb->hblank, HBLANK_B); 832 PSB_WVDC32(pipeb->hsync, HSYNC_B); 833 PSB_WVDC32(pipeb->vtotal, VTOTAL_B); 834 PSB_WVDC32(pipeb->vblank, VBLANK_B); 835 PSB_WVDC32(pipeb->vsync, VSYNC_B); 836 837 PSB_WVDC32(hdmi_dev->savePCH_PIPEBSRC, PCH_PIPEBSRC); 838 PSB_WVDC32(hdmi_dev->savePCH_HTOTAL_B, PCH_HTOTAL_B); 839 PSB_WVDC32(hdmi_dev->savePCH_HBLANK_B, PCH_HBLANK_B); 840 PSB_WVDC32(hdmi_dev->savePCH_HSYNC_B, PCH_HSYNC_B); 841 PSB_WVDC32(hdmi_dev->savePCH_VTOTAL_B, PCH_VTOTAL_B); 842 PSB_WVDC32(hdmi_dev->savePCH_VBLANK_B, PCH_VBLANK_B); 843 PSB_WVDC32(hdmi_dev->savePCH_VSYNC_B, PCH_VSYNC_B); 844 845 PSB_WVDC32(pipeb->conf, PIPEBCONF); 846 PSB_WVDC32(hdmi_dev->savePCH_PIPEBCONF, PCH_PIPEBCONF); 847 848 /* plane */ 849 PSB_WVDC32(pipeb->linoff, DSPBLINOFF); 850 PSB_WVDC32(pipeb->stride, DSPBSTRIDE); 851 PSB_WVDC32(pipeb->tileoff, DSPBTILEOFF); 852 PSB_WVDC32(pipeb->cntr, DSPBCNTR); 853 PSB_WVDC32(pipeb->surf, DSPBSURF); 854 855 /* cursor B */ 856 PSB_WVDC32(regs->saveDSPBCURSOR_CTRL, CURBCNTR); 857 PSB_WVDC32(regs->saveDSPBCURSOR_POS, CURBPOS); 858 PSB_WVDC32(regs->saveDSPBCURSOR_BASE, CURBBASE); 859 860 /* restore palette */ 861 for (i = 0; i < 256; i++) 862 PSB_WVDC32(pipeb->palette[i], PALETTE_B + (i << 2)); 863 } 864