diff options
| author | Keith Packard <keithp@keithp.com> | 2011-07-29 19:24:10 -0400 |
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-07-29 19:24:10 -0400 |
| commit | 9b546e571b94cacccf1091cc9cc0bd8a6a207a66 (patch) | |
| tree | fd50ef5eae6b8283e26926fa5d664f7e1cd88920 /drivers/gpu | |
| parent | 2c1756b12edc19fdd75c833699cb752e1bbb641e (diff) | |
| parent | cda2bb78c24de7674eafa3210314dc75bed344a6 (diff) | |
Merge branch 'drm-intel-fixes' into drm-intel-next
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 90 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_suspend.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 36 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 39 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 8 |
7 files changed, 193 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index e2662497d50f..5bf7bf57c641 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -1338,6 +1338,76 @@ static const struct file_operations i915_wedged_fops = { | |||
| 1338 | .llseek = default_llseek, | 1338 | .llseek = default_llseek, |
| 1339 | }; | 1339 | }; |
| 1340 | 1340 | ||
| 1341 | static int | ||
| 1342 | i915_max_freq_open(struct inode *inode, | ||
| 1343 | struct file *filp) | ||
| 1344 | { | ||
| 1345 | filp->private_data = inode->i_private; | ||
| 1346 | return 0; | ||
| 1347 | } | ||
| 1348 | |||
| 1349 | static ssize_t | ||
| 1350 | i915_max_freq_read(struct file *filp, | ||
| 1351 | char __user *ubuf, | ||
| 1352 | size_t max, | ||
| 1353 | loff_t *ppos) | ||
| 1354 | { | ||
| 1355 | struct drm_device *dev = filp->private_data; | ||
| 1356 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
| 1357 | char buf[80]; | ||
| 1358 | int len; | ||
| 1359 | |||
| 1360 | len = snprintf(buf, sizeof (buf), | ||
| 1361 | "max freq: %d\n", dev_priv->max_delay * 50); | ||
| 1362 | |||
| 1363 | if (len > sizeof (buf)) | ||
| 1364 | len = sizeof (buf); | ||
| 1365 | |||
| 1366 | return simple_read_from_buffer(ubuf, max, ppos, buf, len); | ||
| 1367 | } | ||
| 1368 | |||
| 1369 | static ssize_t | ||
| 1370 | i915_max_freq_write(struct file *filp, | ||
| 1371 | const char __user *ubuf, | ||
| 1372 | size_t cnt, | ||
| 1373 | loff_t *ppos) | ||
| 1374 | { | ||
| 1375 | struct drm_device *dev = filp->private_data; | ||
| 1376 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1377 | char buf[20]; | ||
| 1378 | int val = 1; | ||
| 1379 | |||
| 1380 | if (cnt > 0) { | ||
| 1381 | if (cnt > sizeof (buf) - 1) | ||
| 1382 | return -EINVAL; | ||
| 1383 | |||
| 1384 | if (copy_from_user(buf, ubuf, cnt)) | ||
| 1385 | return -EFAULT; | ||
| 1386 | buf[cnt] = 0; | ||
| 1387 | |||
| 1388 | val = simple_strtoul(buf, NULL, 0); | ||
| 1389 | } | ||
| 1390 | |||
| 1391 | DRM_DEBUG_DRIVER("Manually setting max freq to %d\n", val); | ||
| 1392 | |||
| 1393 | /* | ||
| 1394 | * Turbo will still be enabled, but won't go above the set value. | ||
| 1395 | */ | ||
| 1396 | dev_priv->max_delay = val / 50; | ||
| 1397 | |||
| 1398 | gen6_set_rps(dev, val / 50); | ||
| 1399 | |||
| 1400 | return cnt; | ||
| 1401 | } | ||
| 1402 | |||
| 1403 | static const struct file_operations i915_max_freq_fops = { | ||
| 1404 | .owner = THIS_MODULE, | ||
| 1405 | .open = i915_max_freq_open, | ||
| 1406 | .read = i915_max_freq_read, | ||
| 1407 | .write = i915_max_freq_write, | ||
| 1408 | .llseek = default_llseek, | ||
| 1409 | }; | ||
| 1410 | |||
| 1341 | /* As the drm_debugfs_init() routines are called before dev->dev_private is | 1411 | /* As the drm_debugfs_init() routines are called before dev->dev_private is |
| 1342 | * allocated we need to hook into the minor for release. */ | 1412 | * allocated we need to hook into the minor for release. */ |
| 1343 | static int | 1413 | static int |
| @@ -1437,6 +1507,21 @@ static int i915_forcewake_create(struct dentry *root, struct drm_minor *minor) | |||
| 1437 | return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); | 1507 | return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); |
| 1438 | } | 1508 | } |
| 1439 | 1509 | ||
| 1510 | static int i915_max_freq_create(struct dentry *root, struct drm_minor *minor) | ||
| 1511 | { | ||
| 1512 | struct drm_device *dev = minor->dev; | ||
| 1513 | struct dentry *ent; | ||
| 1514 | |||
| 1515 | ent = debugfs_create_file("i915_max_freq", | ||
| 1516 | S_IRUGO | S_IWUSR, | ||
| 1517 | root, dev, | ||
| 1518 | &i915_max_freq_fops); | ||
| 1519 | if (IS_ERR(ent)) | ||
| 1520 | return PTR_ERR(ent); | ||
| 1521 | |||
| 1522 | return drm_add_fake_info_node(minor, ent, &i915_max_freq_fops); | ||
| 1523 | } | ||
| 1524 | |||
| 1440 | static struct drm_info_list i915_debugfs_list[] = { | 1525 | static struct drm_info_list i915_debugfs_list[] = { |
| 1441 | {"i915_capabilities", i915_capabilities, 0}, | 1526 | {"i915_capabilities", i915_capabilities, 0}, |
| 1442 | {"i915_gem_objects", i915_gem_object_info, 0}, | 1527 | {"i915_gem_objects", i915_gem_object_info, 0}, |
| @@ -1490,6 +1575,9 @@ int i915_debugfs_init(struct drm_minor *minor) | |||
| 1490 | ret = i915_forcewake_create(minor->debugfs_root, minor); | 1575 | ret = i915_forcewake_create(minor->debugfs_root, minor); |
| 1491 | if (ret) | 1576 | if (ret) |
| 1492 | return ret; | 1577 | return ret; |
| 1578 | ret = i915_max_freq_create(minor->debugfs_root, minor); | ||
| 1579 | if (ret) | ||
| 1580 | return ret; | ||
| 1493 | 1581 | ||
| 1494 | return drm_debugfs_create_files(i915_debugfs_list, | 1582 | return drm_debugfs_create_files(i915_debugfs_list, |
| 1495 | I915_DEBUGFS_ENTRIES, | 1583 | I915_DEBUGFS_ENTRIES, |
| @@ -1504,6 +1592,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor) | |||
| 1504 | 1, minor); | 1592 | 1, minor); |
| 1505 | drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, | 1593 | drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, |
| 1506 | 1, minor); | 1594 | 1, minor); |
| 1595 | drm_debugfs_remove_files((struct drm_info_list *) &i915_max_freq_fops, | ||
| 1596 | 1, minor); | ||
| 1507 | } | 1597 | } |
| 1508 | 1598 | ||
| 1509 | #endif /* CONFIG_DEBUG_FS */ | 1599 | #endif /* CONFIG_DEBUG_FS */ |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6867e193d85e..feb4f164fd1b 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -544,6 +544,7 @@ typedef struct drm_i915_private { | |||
| 544 | u32 savePIPEB_LINK_M1; | 544 | u32 savePIPEB_LINK_M1; |
| 545 | u32 savePIPEB_LINK_N1; | 545 | u32 savePIPEB_LINK_N1; |
| 546 | u32 saveMCHBAR_RENDER_STANDBY; | 546 | u32 saveMCHBAR_RENDER_STANDBY; |
| 547 | u32 savePCH_PORT_HOTPLUG; | ||
| 547 | 548 | ||
| 548 | struct { | 549 | struct { |
| 549 | /** Bridge to intel-gtt-ko */ | 550 | /** Bridge to intel-gtt-ko */ |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index a900809baf2a..be67a596eee5 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3021,6 +3021,20 @@ | |||
| 3021 | #define _TRANSA_DP_LINK_M2 0xe0048 | 3021 | #define _TRANSA_DP_LINK_M2 0xe0048 |
| 3022 | #define _TRANSA_DP_LINK_N2 0xe004c | 3022 | #define _TRANSA_DP_LINK_N2 0xe004c |
| 3023 | 3023 | ||
| 3024 | /* Per-transcoder DIP controls */ | ||
| 3025 | |||
| 3026 | #define _VIDEO_DIP_CTL_A 0xe0200 | ||
| 3027 | #define _VIDEO_DIP_DATA_A 0xe0208 | ||
| 3028 | #define _VIDEO_DIP_GCP_A 0xe0210 | ||
| 3029 | |||
| 3030 | #define _VIDEO_DIP_CTL_B 0xe1200 | ||
| 3031 | #define _VIDEO_DIP_DATA_B 0xe1208 | ||
| 3032 | #define _VIDEO_DIP_GCP_B 0xe1210 | ||
| 3033 | |||
| 3034 | #define TVIDEO_DIP_CTL(pipe) _PIPE(pipe, _VIDEO_DIP_CTL_A, _VIDEO_DIP_CTL_B) | ||
| 3035 | #define TVIDEO_DIP_DATA(pipe) _PIPE(pipe, _VIDEO_DIP_DATA_A, _VIDEO_DIP_DATA_B) | ||
| 3036 | #define TVIDEO_DIP_GCP(pipe) _PIPE(pipe, _VIDEO_DIP_GCP_A, _VIDEO_DIP_GCP_B) | ||
| 3037 | |||
| 3024 | #define _TRANS_HTOTAL_B 0xe1000 | 3038 | #define _TRANS_HTOTAL_B 0xe1000 |
| 3025 | #define _TRANS_HBLANK_B 0xe1004 | 3039 | #define _TRANS_HBLANK_B 0xe1004 |
| 3026 | #define _TRANS_HSYNC_B 0xe1008 | 3040 | #define _TRANS_HSYNC_B 0xe1008 |
| @@ -3078,6 +3092,11 @@ | |||
| 3078 | #define TRANS_CHICKEN2(pipe) _PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2) | 3092 | #define TRANS_CHICKEN2(pipe) _PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2) |
| 3079 | #define TRANS_AUTOTRAIN_GEN_STALL_DIS (1<<31) | 3093 | #define TRANS_AUTOTRAIN_GEN_STALL_DIS (1<<31) |
| 3080 | 3094 | ||
| 3095 | #define SOUTH_CHICKEN1 0xc2000 | ||
| 3096 | #define FDIA_PHASE_SYNC_SHIFT_OVR 19 | ||
| 3097 | #define FDIA_PHASE_SYNC_SHIFT_EN 18 | ||
| 3098 | #define FDI_PHASE_SYNC_OVR(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_OVR - ((pipe) * 2))) | ||
| 3099 | #define FDI_PHASE_SYNC_EN(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_EN - ((pipe) * 2))) | ||
| 3081 | #define SOUTH_CHICKEN2 0xc2004 | 3100 | #define SOUTH_CHICKEN2 0xc2004 |
| 3082 | #define DPLS_EDP_PPS_FIX_DIS (1<<0) | 3101 | #define DPLS_EDP_PPS_FIX_DIS (1<<0) |
| 3083 | 3102 | ||
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 285758603ac8..87677d60d0df 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
| @@ -812,6 +812,7 @@ int i915_save_state(struct drm_device *dev) | |||
| 812 | dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR); | 812 | dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR); |
| 813 | dev_priv->saveMCHBAR_RENDER_STANDBY = | 813 | dev_priv->saveMCHBAR_RENDER_STANDBY = |
| 814 | I915_READ(RSTDBYCTL); | 814 | I915_READ(RSTDBYCTL); |
| 815 | dev_priv->savePCH_PORT_HOTPLUG = I915_READ(PCH_PORT_HOTPLUG); | ||
| 815 | } else { | 816 | } else { |
| 816 | dev_priv->saveIER = I915_READ(IER); | 817 | dev_priv->saveIER = I915_READ(IER); |
| 817 | dev_priv->saveIMR = I915_READ(IMR); | 818 | dev_priv->saveIMR = I915_READ(IMR); |
| @@ -863,6 +864,7 @@ int i915_restore_state(struct drm_device *dev) | |||
| 863 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); | 864 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); |
| 864 | I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); | 865 | I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); |
| 865 | I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); | 866 | I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); |
| 867 | I915_WRITE(PCH_PORT_HOTPLUG, dev_priv->savePCH_PORT_HOTPLUG); | ||
| 866 | } else { | 868 | } else { |
| 867 | I915_WRITE(IER, dev_priv->saveIER); | 869 | I915_WRITE(IER, dev_priv->saveIER); |
| 868 | I915_WRITE(IMR, dev_priv->saveIMR); | 870 | I915_WRITE(IMR, dev_priv->saveIMR); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index ce908ec02900..2bf5bb63fe41 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -2275,6 +2275,18 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) | |||
| 2275 | FDI_FE_ERRC_ENABLE); | 2275 | FDI_FE_ERRC_ENABLE); |
| 2276 | } | 2276 | } |
| 2277 | 2277 | ||
| 2278 | static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe) | ||
| 2279 | { | ||
| 2280 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2281 | u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
| 2282 | |||
| 2283 | flags |= FDI_PHASE_SYNC_OVR(pipe); | ||
| 2284 | I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */ | ||
| 2285 | flags |= FDI_PHASE_SYNC_EN(pipe); | ||
| 2286 | I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */ | ||
| 2287 | POSTING_READ(SOUTH_CHICKEN1); | ||
| 2288 | } | ||
| 2289 | |||
| 2278 | /* The FDI link training functions for ILK/Ibexpeak. */ | 2290 | /* The FDI link training functions for ILK/Ibexpeak. */ |
| 2279 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) | 2291 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) |
| 2280 | { | 2292 | { |
| @@ -2425,6 +2437,9 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc) | |||
| 2425 | POSTING_READ(reg); | 2437 | POSTING_READ(reg); |
| 2426 | udelay(150); | 2438 | udelay(150); |
| 2427 | 2439 | ||
| 2440 | if (HAS_PCH_CPT(dev)) | ||
| 2441 | cpt_phase_pointer_enable(dev, pipe); | ||
| 2442 | |||
| 2428 | for (i = 0; i < 4; i++ ) { | 2443 | for (i = 0; i < 4; i++ ) { |
| 2429 | reg = FDI_TX_CTL(pipe); | 2444 | reg = FDI_TX_CTL(pipe); |
| 2430 | temp = I915_READ(reg); | 2445 | temp = I915_READ(reg); |
| @@ -2541,6 +2556,9 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc) | |||
| 2541 | POSTING_READ(reg); | 2556 | POSTING_READ(reg); |
| 2542 | udelay(150); | 2557 | udelay(150); |
| 2543 | 2558 | ||
| 2559 | if (HAS_PCH_CPT(dev)) | ||
| 2560 | cpt_phase_pointer_enable(dev, pipe); | ||
| 2561 | |||
| 2544 | for (i = 0; i < 4; i++ ) { | 2562 | for (i = 0; i < 4; i++ ) { |
| 2545 | reg = FDI_TX_CTL(pipe); | 2563 | reg = FDI_TX_CTL(pipe); |
| 2546 | temp = I915_READ(reg); | 2564 | temp = I915_READ(reg); |
| @@ -2650,6 +2668,17 @@ static void ironlake_fdi_pll_enable(struct drm_crtc *crtc) | |||
| 2650 | } | 2668 | } |
| 2651 | } | 2669 | } |
| 2652 | 2670 | ||
| 2671 | static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe) | ||
| 2672 | { | ||
| 2673 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 2674 | u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
| 2675 | |||
| 2676 | flags &= ~(FDI_PHASE_SYNC_EN(pipe)); | ||
| 2677 | I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */ | ||
| 2678 | flags &= ~(FDI_PHASE_SYNC_OVR(pipe)); | ||
| 2679 | I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */ | ||
| 2680 | POSTING_READ(SOUTH_CHICKEN1); | ||
| 2681 | } | ||
| 2653 | static void ironlake_fdi_disable(struct drm_crtc *crtc) | 2682 | static void ironlake_fdi_disable(struct drm_crtc *crtc) |
| 2654 | { | 2683 | { |
| 2655 | struct drm_device *dev = crtc->dev; | 2684 | struct drm_device *dev = crtc->dev; |
| @@ -2679,6 +2708,8 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | |||
| 2679 | I915_WRITE(FDI_RX_CHICKEN(pipe), | 2708 | I915_WRITE(FDI_RX_CHICKEN(pipe), |
| 2680 | I915_READ(FDI_RX_CHICKEN(pipe) & | 2709 | I915_READ(FDI_RX_CHICKEN(pipe) & |
| 2681 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); | 2710 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); |
| 2711 | } else if (HAS_PCH_CPT(dev)) { | ||
| 2712 | cpt_phase_pointer_disable(dev, pipe); | ||
| 2682 | } | 2713 | } |
| 2683 | 2714 | ||
| 2684 | /* still set train pattern 1 */ | 2715 | /* still set train pattern 1 */ |
| @@ -5269,7 +5300,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
| 5269 | } else if (is_sdvo && is_tv) | 5300 | } else if (is_sdvo && is_tv) |
| 5270 | factor = 20; | 5301 | factor = 20; |
| 5271 | 5302 | ||
| 5272 | if (clock.m1 < factor * clock.n) | 5303 | if (clock.m < factor * clock.n) |
| 5273 | fp |= FP_CB_TUNE; | 5304 | fp |= FP_CB_TUNE; |
| 5274 | 5305 | ||
| 5275 | dpll = 0; | 5306 | dpll = 0; |
| @@ -8219,6 +8250,9 @@ struct intel_quirk intel_quirks[] = { | |||
| 8219 | 8250 | ||
| 8220 | /* Lenovo U160 cannot use SSC on LVDS */ | 8251 | /* Lenovo U160 cannot use SSC on LVDS */ |
| 8221 | { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, | 8252 | { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, |
| 8253 | |||
| 8254 | /* Sony Vaio Y cannot use SSC on LVDS */ | ||
| 8255 | { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable }, | ||
| 8222 | }; | 8256 | }; |
| 8223 | 8257 | ||
| 8224 | static void intel_init_quirks(struct drm_device *dev) | 8258 | static void intel_init_quirks(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 1ed8e6903915..105e2b892f3a 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -112,6 +112,40 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder) | |||
| 112 | VIDEO_DIP_ENABLE_AVI); | 112 | VIDEO_DIP_ENABLE_AVI); |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | static void intel_ironlake_hdmi_set_avi_infoframe(struct drm_encoder *encoder) | ||
| 116 | { | ||
| 117 | struct dip_infoframe avi_if = { | ||
| 118 | .type = DIP_TYPE_AVI, | ||
| 119 | .ver = DIP_VERSION_AVI, | ||
| 120 | .len = DIP_LEN_AVI, | ||
| 121 | }; | ||
| 122 | uint32_t *data = (uint32_t *)&avi_if; | ||
| 123 | struct drm_device *dev = encoder->dev; | ||
| 124 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 125 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); | ||
| 126 | struct drm_crtc *crtc = encoder->crtc; | ||
| 127 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 128 | int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); | ||
| 129 | unsigned i; | ||
| 130 | |||
| 131 | if (!intel_hdmi->has_hdmi_sink) | ||
| 132 | return; | ||
| 133 | |||
| 134 | intel_wait_for_vblank(dev, intel_crtc->pipe); | ||
| 135 | |||
| 136 | I915_WRITE(reg, VIDEO_DIP_SELECT_AVI); | ||
| 137 | |||
| 138 | intel_dip_infoframe_csum(&avi_if); | ||
| 139 | for (i = 0; i < sizeof(avi_if); i += 4) { | ||
| 140 | I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data); | ||
| 141 | data++; | ||
| 142 | } | ||
| 143 | |||
| 144 | I915_WRITE(reg, VIDEO_DIP_ENABLE | VIDEO_DIP_SELECT_AVI | | ||
| 145 | VIDEO_DIP_FREQ_VSYNC | (DIP_LEN_AVI << 8) | | ||
| 146 | VIDEO_DIP_ENABLE_AVI); | ||
| 147 | } | ||
| 148 | |||
| 115 | static void intel_hdmi_mode_set(struct drm_encoder *encoder, | 149 | static void intel_hdmi_mode_set(struct drm_encoder *encoder, |
| 116 | struct drm_display_mode *mode, | 150 | struct drm_display_mode *mode, |
| 117 | struct drm_display_mode *adjusted_mode) | 151 | struct drm_display_mode *adjusted_mode) |
| @@ -155,7 +189,10 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder, | |||
| 155 | I915_WRITE(intel_hdmi->sdvox_reg, sdvox); | 189 | I915_WRITE(intel_hdmi->sdvox_reg, sdvox); |
| 156 | POSTING_READ(intel_hdmi->sdvox_reg); | 190 | POSTING_READ(intel_hdmi->sdvox_reg); |
| 157 | 191 | ||
| 158 | intel_hdmi_set_avi_infoframe(encoder); | 192 | if (HAS_PCH_SPLIT(dev)) |
| 193 | intel_ironlake_hdmi_set_avi_infoframe(encoder); | ||
| 194 | else | ||
| 195 | intel_hdmi_set_avi_infoframe(encoder); | ||
| 159 | } | 196 | } |
| 160 | 197 | ||
| 161 | static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) | 198 | static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index b28f7bd9f88a..2e8ddfcba40c 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -690,6 +690,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 690 | }, | 690 | }, |
| 691 | { | 691 | { |
| 692 | .callback = intel_no_lvds_dmi_callback, | 692 | .callback = intel_no_lvds_dmi_callback, |
| 693 | .ident = "Dell OptiPlex FX170", | ||
| 694 | .matches = { | ||
| 695 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 696 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex FX170"), | ||
| 697 | }, | ||
| 698 | }, | ||
| 699 | { | ||
| 700 | .callback = intel_no_lvds_dmi_callback, | ||
| 693 | .ident = "AOpen Mini PC", | 701 | .ident = "AOpen Mini PC", |
| 694 | .matches = { | 702 | .matches = { |
| 695 | DMI_MATCH(DMI_SYS_VENDOR, "AOpen"), | 703 | DMI_MATCH(DMI_SYS_VENDOR, "AOpen"), |
