diff options
29 files changed, 2577 insertions, 1733 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 3601466c5502..d659f36419af 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -326,21 +326,21 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) | |||
326 | struct intel_crtc *crtc; | 326 | struct intel_crtc *crtc; |
327 | 327 | ||
328 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) { | 328 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) { |
329 | const char *pipe = crtc->pipe ? "B" : "A"; | 329 | const char pipe = pipe_name(crtc->pipe); |
330 | const char *plane = crtc->plane ? "B" : "A"; | 330 | const char plane = plane_name(crtc->plane); |
331 | struct intel_unpin_work *work; | 331 | struct intel_unpin_work *work; |
332 | 332 | ||
333 | spin_lock_irqsave(&dev->event_lock, flags); | 333 | spin_lock_irqsave(&dev->event_lock, flags); |
334 | work = crtc->unpin_work; | 334 | work = crtc->unpin_work; |
335 | if (work == NULL) { | 335 | if (work == NULL) { |
336 | seq_printf(m, "No flip due on pipe %s (plane %s)\n", | 336 | seq_printf(m, "No flip due on pipe %c (plane %c)\n", |
337 | pipe, plane); | 337 | pipe, plane); |
338 | } else { | 338 | } else { |
339 | if (!work->pending) { | 339 | if (!work->pending) { |
340 | seq_printf(m, "Flip queued on pipe %s (plane %s)\n", | 340 | seq_printf(m, "Flip queued on pipe %c (plane %c)\n", |
341 | pipe, plane); | 341 | pipe, plane); |
342 | } else { | 342 | } else { |
343 | seq_printf(m, "Flip pending (waiting for vsync) on pipe %s (plane %s)\n", | 343 | seq_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n", |
344 | pipe, plane); | 344 | pipe, plane); |
345 | } | 345 | } |
346 | if (work->enable_stall_check) | 346 | if (work->enable_stall_check) |
@@ -458,7 +458,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data) | |||
458 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 458 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
459 | struct drm_device *dev = node->minor->dev; | 459 | struct drm_device *dev = node->minor->dev; |
460 | drm_i915_private_t *dev_priv = dev->dev_private; | 460 | drm_i915_private_t *dev_priv = dev->dev_private; |
461 | int ret, i; | 461 | int ret, i, pipe; |
462 | 462 | ||
463 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 463 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
464 | if (ret) | 464 | if (ret) |
@@ -471,10 +471,10 @@ static int i915_interrupt_info(struct seq_file *m, void *data) | |||
471 | I915_READ(IIR)); | 471 | I915_READ(IIR)); |
472 | seq_printf(m, "Interrupt mask: %08x\n", | 472 | seq_printf(m, "Interrupt mask: %08x\n", |
473 | I915_READ(IMR)); | 473 | I915_READ(IMR)); |
474 | seq_printf(m, "Pipe A stat: %08x\n", | 474 | for_each_pipe(pipe) |
475 | I915_READ(PIPEASTAT)); | 475 | seq_printf(m, "Pipe %c stat: %08x\n", |
476 | seq_printf(m, "Pipe B stat: %08x\n", | 476 | pipe_name(pipe), |
477 | I915_READ(PIPEBSTAT)); | 477 | I915_READ(PIPESTAT(pipe))); |
478 | } else { | 478 | } else { |
479 | seq_printf(m, "North Display Interrupt enable: %08x\n", | 479 | seq_printf(m, "North Display Interrupt enable: %08x\n", |
480 | I915_READ(DEIER)); | 480 | I915_READ(DEIER)); |
@@ -544,11 +544,11 @@ static int i915_hws_info(struct seq_file *m, void *data) | |||
544 | struct drm_device *dev = node->minor->dev; | 544 | struct drm_device *dev = node->minor->dev; |
545 | drm_i915_private_t *dev_priv = dev->dev_private; | 545 | drm_i915_private_t *dev_priv = dev->dev_private; |
546 | struct intel_ring_buffer *ring; | 546 | struct intel_ring_buffer *ring; |
547 | volatile u32 *hws; | 547 | const volatile u32 __iomem *hws; |
548 | int i; | 548 | int i; |
549 | 549 | ||
550 | ring = &dev_priv->ring[(uintptr_t)node->info_ent->data]; | 550 | ring = &dev_priv->ring[(uintptr_t)node->info_ent->data]; |
551 | hws = (volatile u32 *)ring->status_page.page_addr; | 551 | hws = (volatile u32 __iomem *)ring->status_page.page_addr; |
552 | if (hws == NULL) | 552 | if (hws == NULL) |
553 | return 0; | 553 | return 0; |
554 | 554 | ||
@@ -615,7 +615,7 @@ static int i915_ringbuffer_data(struct seq_file *m, void *data) | |||
615 | if (!ring->obj) { | 615 | if (!ring->obj) { |
616 | seq_printf(m, "No ringbuffer setup\n"); | 616 | seq_printf(m, "No ringbuffer setup\n"); |
617 | } else { | 617 | } else { |
618 | u8 *virt = ring->virtual_start; | 618 | const u8 __iomem *virt = ring->virtual_start; |
619 | uint32_t off; | 619 | uint32_t off; |
620 | 620 | ||
621 | for (off = 0; off < ring->size; off += 4) { | 621 | for (off = 0; off < ring->size; off += 4) { |
@@ -805,15 +805,20 @@ static int i915_error_state(struct seq_file *m, void *unused) | |||
805 | } | 805 | } |
806 | } | 806 | } |
807 | 807 | ||
808 | if (error->ringbuffer) { | 808 | for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++) { |
809 | struct drm_i915_error_object *obj = error->ringbuffer; | 809 | if (error->ringbuffer[i]) { |
810 | 810 | struct drm_i915_error_object *obj = error->ringbuffer[i]; | |
811 | seq_printf(m, "--- ringbuffer = 0x%08x\n", obj->gtt_offset); | 811 | seq_printf(m, "%s --- ringbuffer = 0x%08x\n", |
812 | offset = 0; | 812 | dev_priv->ring[i].name, |
813 | for (page = 0; page < obj->page_count; page++) { | 813 | obj->gtt_offset); |
814 | for (elt = 0; elt < PAGE_SIZE/4; elt++) { | 814 | offset = 0; |
815 | seq_printf(m, "%08x : %08x\n", offset, obj->pages[page][elt]); | 815 | for (page = 0; page < obj->page_count; page++) { |
816 | offset += 4; | 816 | for (elt = 0; elt < PAGE_SIZE/4; elt++) { |
817 | seq_printf(m, "%08x : %08x\n", | ||
818 | offset, | ||
819 | obj->pages[page][elt]); | ||
820 | offset += 4; | ||
821 | } | ||
817 | } | 822 | } |
818 | } | 823 | } |
819 | } | 824 | } |
@@ -862,19 +867,44 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
862 | u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); | 867 | u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); |
863 | u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS); | 868 | u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS); |
864 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); | 869 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); |
870 | u32 rpstat; | ||
871 | u32 rpupei, rpcurup, rpprevup; | ||
872 | u32 rpdownei, rpcurdown, rpprevdown; | ||
865 | int max_freq; | 873 | int max_freq; |
866 | 874 | ||
867 | /* RPSTAT1 is in the GT power well */ | 875 | /* RPSTAT1 is in the GT power well */ |
868 | __gen6_force_wake_get(dev_priv); | 876 | __gen6_force_wake_get(dev_priv); |
869 | 877 | ||
878 | rpstat = I915_READ(GEN6_RPSTAT1); | ||
879 | rpupei = I915_READ(GEN6_RP_CUR_UP_EI); | ||
880 | rpcurup = I915_READ(GEN6_RP_CUR_UP); | ||
881 | rpprevup = I915_READ(GEN6_RP_PREV_UP); | ||
882 | rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI); | ||
883 | rpcurdown = I915_READ(GEN6_RP_CUR_DOWN); | ||
884 | rpprevdown = I915_READ(GEN6_RP_PREV_DOWN); | ||
885 | |||
870 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); | 886 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); |
871 | seq_printf(m, "RPSTAT1: 0x%08x\n", I915_READ(GEN6_RPSTAT1)); | 887 | seq_printf(m, "RPSTAT1: 0x%08x\n", rpstat); |
872 | seq_printf(m, "Render p-state ratio: %d\n", | 888 | seq_printf(m, "Render p-state ratio: %d\n", |
873 | (gt_perf_status & 0xff00) >> 8); | 889 | (gt_perf_status & 0xff00) >> 8); |
874 | seq_printf(m, "Render p-state VID: %d\n", | 890 | seq_printf(m, "Render p-state VID: %d\n", |
875 | gt_perf_status & 0xff); | 891 | gt_perf_status & 0xff); |
876 | seq_printf(m, "Render p-state limit: %d\n", | 892 | seq_printf(m, "Render p-state limit: %d\n", |
877 | rp_state_limits & 0xff); | 893 | rp_state_limits & 0xff); |
894 | seq_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >> | ||
895 | GEN6_CAGF_SHIFT) * 100); | ||
896 | seq_printf(m, "RP CUR UP EI: %dus\n", rpupei & | ||
897 | GEN6_CURICONT_MASK); | ||
898 | seq_printf(m, "RP CUR UP: %dus\n", rpcurup & | ||
899 | GEN6_CURBSYTAVG_MASK); | ||
900 | seq_printf(m, "RP PREV UP: %dus\n", rpprevup & | ||
901 | GEN6_CURBSYTAVG_MASK); | ||
902 | seq_printf(m, "RP CUR DOWN EI: %dus\n", rpdownei & | ||
903 | GEN6_CURIAVG_MASK); | ||
904 | seq_printf(m, "RP CUR DOWN: %dus\n", rpcurdown & | ||
905 | GEN6_CURBSYTAVG_MASK); | ||
906 | seq_printf(m, "RP PREV DOWN: %dus\n", rpprevdown & | ||
907 | GEN6_CURBSYTAVG_MASK); | ||
878 | 908 | ||
879 | max_freq = (rp_state_cap & 0xff0000) >> 16; | 909 | max_freq = (rp_state_cap & 0xff0000) >> 16; |
880 | seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", | 910 | seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", |
@@ -1259,7 +1289,7 @@ static int i915_wedged_create(struct dentry *root, struct drm_minor *minor) | |||
1259 | } | 1289 | } |
1260 | 1290 | ||
1261 | static struct drm_info_list i915_debugfs_list[] = { | 1291 | static struct drm_info_list i915_debugfs_list[] = { |
1262 | {"i915_capabilities", i915_capabilities, 0, 0}, | 1292 | {"i915_capabilities", i915_capabilities, 0}, |
1263 | {"i915_gem_objects", i915_gem_object_info, 0}, | 1293 | {"i915_gem_objects", i915_gem_object_info, 0}, |
1264 | {"i915_gem_gtt", i915_gem_gtt_info, 0}, | 1294 | {"i915_gem_gtt", i915_gem_gtt_info, 0}, |
1265 | {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, | 1295 | {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 17bd766f2081..ffa2196eb3b9 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -60,10 +60,11 @@ static int i915_init_phys_hws(struct drm_device *dev) | |||
60 | DRM_ERROR("Can not allocate hardware status page\n"); | 60 | DRM_ERROR("Can not allocate hardware status page\n"); |
61 | return -ENOMEM; | 61 | return -ENOMEM; |
62 | } | 62 | } |
63 | ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr; | 63 | ring->status_page.page_addr = |
64 | (void __force __iomem *)dev_priv->status_page_dmah->vaddr; | ||
64 | dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr; | 65 | dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr; |
65 | 66 | ||
66 | memset(ring->status_page.page_addr, 0, PAGE_SIZE); | 67 | memset_io(ring->status_page.page_addr, 0, PAGE_SIZE); |
67 | 68 | ||
68 | if (INTEL_INFO(dev)->gen >= 4) | 69 | if (INTEL_INFO(dev)->gen >= 4) |
69 | dev_priv->dma_status_page |= (dev_priv->dma_status_page >> 28) & | 70 | dev_priv->dma_status_page |= (dev_priv->dma_status_page >> 28) & |
@@ -859,8 +860,9 @@ static int i915_set_status_page(struct drm_device *dev, void *data, | |||
859 | " G33 hw status page\n"); | 860 | " G33 hw status page\n"); |
860 | return -ENOMEM; | 861 | return -ENOMEM; |
861 | } | 862 | } |
862 | ring->status_page.page_addr = dev_priv->hws_map.handle; | 863 | ring->status_page.page_addr = |
863 | memset(ring->status_page.page_addr, 0, PAGE_SIZE); | 864 | (void __force __iomem *)dev_priv->hws_map.handle; |
865 | memset_io(ring->status_page.page_addr, 0, PAGE_SIZE); | ||
864 | I915_WRITE(HWS_PGA, ring->status_page.gfx_addr); | 866 | I915_WRITE(HWS_PGA, ring->status_page.gfx_addr); |
865 | 867 | ||
866 | DRM_DEBUG_DRIVER("load hws HWS_PGA with gfx mem 0x%x\n", | 868 | DRM_DEBUG_DRIVER("load hws HWS_PGA with gfx mem 0x%x\n", |
@@ -2002,9 +2004,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
2002 | 2004 | ||
2003 | spin_lock_init(&dev_priv->irq_lock); | 2005 | spin_lock_init(&dev_priv->irq_lock); |
2004 | spin_lock_init(&dev_priv->error_lock); | 2006 | spin_lock_init(&dev_priv->error_lock); |
2005 | dev_priv->trace_irq_seqno = 0; | ||
2006 | 2007 | ||
2007 | ret = drm_vblank_init(dev, I915_NUM_PIPE); | 2008 | if (IS_MOBILE(dev) || !IS_GEN2(dev)) |
2009 | dev_priv->num_pipe = 2; | ||
2010 | else | ||
2011 | dev_priv->num_pipe = 1; | ||
2012 | |||
2013 | ret = drm_vblank_init(dev, dev_priv->num_pipe); | ||
2008 | if (ret) | 2014 | if (ret) |
2009 | goto out_gem_unload; | 2015 | goto out_gem_unload; |
2010 | 2016 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 0ad533f06af9..64fb21e4bd2d 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -55,7 +55,10 @@ module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); | |||
55 | unsigned int i915_panel_use_ssc = 1; | 55 | unsigned int i915_panel_use_ssc = 1; |
56 | module_param_named(lvds_use_ssc, i915_panel_use_ssc, int, 0600); | 56 | module_param_named(lvds_use_ssc, i915_panel_use_ssc, int, 0600); |
57 | 57 | ||
58 | bool i915_try_reset = true; | 58 | int i915_vbt_sdvo_panel_type = -1; |
59 | module_param_named(vbt_sdvo_panel_type, i915_vbt_sdvo_panel_type, int, 0600); | ||
60 | |||
61 | static bool i915_try_reset = true; | ||
59 | module_param_named(reset, i915_try_reset, bool, 0600); | 62 | module_param_named(reset, i915_try_reset, bool, 0600); |
60 | 63 | ||
61 | static struct drm_driver driver; | 64 | static struct drm_driver driver; |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 65dfe81d0035..92f4d33216cd 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #include "intel_ringbuffer.h" | 35 | #include "intel_ringbuffer.h" |
36 | #include <linux/io-mapping.h> | 36 | #include <linux/io-mapping.h> |
37 | #include <linux/i2c.h> | 37 | #include <linux/i2c.h> |
38 | #include <linux/pm_qos_params.h> | ||
38 | #include <drm/intel-gtt.h> | 39 | #include <drm/intel-gtt.h> |
39 | 40 | ||
40 | /* General customization: | 41 | /* General customization: |
@@ -49,17 +50,22 @@ | |||
49 | enum pipe { | 50 | enum pipe { |
50 | PIPE_A = 0, | 51 | PIPE_A = 0, |
51 | PIPE_B, | 52 | PIPE_B, |
53 | PIPE_C, | ||
54 | I915_MAX_PIPES | ||
52 | }; | 55 | }; |
56 | #define pipe_name(p) ((p) + 'A') | ||
53 | 57 | ||
54 | enum plane { | 58 | enum plane { |
55 | PLANE_A = 0, | 59 | PLANE_A = 0, |
56 | PLANE_B, | 60 | PLANE_B, |
61 | PLANE_C, | ||
57 | }; | 62 | }; |
58 | 63 | #define plane_name(p) ((p) + 'A') | |
59 | #define I915_NUM_PIPE 2 | ||
60 | 64 | ||
61 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) | 65 | #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) |
62 | 66 | ||
67 | #define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++) | ||
68 | |||
63 | /* Interface history: | 69 | /* Interface history: |
64 | * | 70 | * |
65 | * 1.1: Original. | 71 | * 1.1: Original. |
@@ -75,10 +81,7 @@ enum plane { | |||
75 | #define DRIVER_PATCHLEVEL 0 | 81 | #define DRIVER_PATCHLEVEL 0 |
76 | 82 | ||
77 | #define WATCH_COHERENCY 0 | 83 | #define WATCH_COHERENCY 0 |
78 | #define WATCH_EXEC 0 | ||
79 | #define WATCH_RELOC 0 | ||
80 | #define WATCH_LISTS 0 | 84 | #define WATCH_LISTS 0 |
81 | #define WATCH_PWRITE 0 | ||
82 | 85 | ||
83 | #define I915_GEM_PHYS_CURSOR_0 1 | 86 | #define I915_GEM_PHYS_CURSOR_0 1 |
84 | #define I915_GEM_PHYS_CURSOR_1 2 | 87 | #define I915_GEM_PHYS_CURSOR_1 2 |
@@ -111,6 +114,7 @@ struct intel_opregion { | |||
111 | struct opregion_swsci *swsci; | 114 | struct opregion_swsci *swsci; |
112 | struct opregion_asle *asle; | 115 | struct opregion_asle *asle; |
113 | void *vbt; | 116 | void *vbt; |
117 | u32 __iomem *lid_state; | ||
114 | }; | 118 | }; |
115 | #define OPREGION_SIZE (8*1024) | 119 | #define OPREGION_SIZE (8*1024) |
116 | 120 | ||
@@ -144,8 +148,7 @@ struct intel_display_error_state; | |||
144 | struct drm_i915_error_state { | 148 | struct drm_i915_error_state { |
145 | u32 eir; | 149 | u32 eir; |
146 | u32 pgtbl_er; | 150 | u32 pgtbl_er; |
147 | u32 pipeastat; | 151 | u32 pipestat[I915_MAX_PIPES]; |
148 | u32 pipebstat; | ||
149 | u32 ipeir; | 152 | u32 ipeir; |
150 | u32 ipehr; | 153 | u32 ipehr; |
151 | u32 instdone; | 154 | u32 instdone; |
@@ -172,7 +175,7 @@ struct drm_i915_error_state { | |||
172 | int page_count; | 175 | int page_count; |
173 | u32 gtt_offset; | 176 | u32 gtt_offset; |
174 | u32 *pages[0]; | 177 | u32 *pages[0]; |
175 | } *ringbuffer, *batchbuffer[I915_NUM_RINGS]; | 178 | } *ringbuffer[I915_NUM_RINGS], *batchbuffer[I915_NUM_RINGS]; |
176 | struct drm_i915_error_buffer { | 179 | struct drm_i915_error_buffer { |
177 | u32 size; | 180 | u32 size; |
178 | u32 name; | 181 | u32 name; |
@@ -200,9 +203,7 @@ struct drm_i915_display_funcs { | |||
200 | void (*disable_fbc)(struct drm_device *dev); | 203 | void (*disable_fbc)(struct drm_device *dev); |
201 | int (*get_display_clock_speed)(struct drm_device *dev); | 204 | int (*get_display_clock_speed)(struct drm_device *dev); |
202 | int (*get_fifo_size)(struct drm_device *dev, int plane); | 205 | int (*get_fifo_size)(struct drm_device *dev, int plane); |
203 | void (*update_wm)(struct drm_device *dev, int planea_clock, | 206 | void (*update_wm)(struct drm_device *dev); |
204 | int planeb_clock, int sr_hdisplay, int sr_htotal, | ||
205 | int pixel_size); | ||
206 | /* clock updates for mode set */ | 207 | /* clock updates for mode set */ |
207 | /* cursor updates */ | 208 | /* cursor updates */ |
208 | /* render clock increase/decrease */ | 209 | /* render clock increase/decrease */ |
@@ -289,7 +290,6 @@ typedef struct drm_i915_private { | |||
289 | int page_flipping; | 290 | int page_flipping; |
290 | 291 | ||
291 | atomic_t irq_received; | 292 | atomic_t irq_received; |
292 | u32 trace_irq_seqno; | ||
293 | 293 | ||
294 | /* protects the irq masks */ | 294 | /* protects the irq masks */ |
295 | spinlock_t irq_lock; | 295 | spinlock_t irq_lock; |
@@ -309,6 +309,10 @@ typedef struct drm_i915_private { | |||
309 | int vblank_pipe; | 309 | int vblank_pipe; |
310 | int num_pipe; | 310 | int num_pipe; |
311 | 311 | ||
312 | atomic_t vblank_enabled; | ||
313 | struct pm_qos_request_list vblank_pm_qos; | ||
314 | struct work_struct vblank_work; | ||
315 | |||
312 | /* For hangcheck timer */ | 316 | /* For hangcheck timer */ |
313 | #define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */ | 317 | #define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */ |
314 | struct timer_list hangcheck_timer; | 318 | struct timer_list hangcheck_timer; |
@@ -324,8 +328,6 @@ typedef struct drm_i915_private { | |||
324 | int cfb_plane; | 328 | int cfb_plane; |
325 | int cfb_y; | 329 | int cfb_y; |
326 | 330 | ||
327 | int irq_enabled; | ||
328 | |||
329 | struct intel_opregion opregion; | 331 | struct intel_opregion opregion; |
330 | 332 | ||
331 | /* overlay */ | 333 | /* overlay */ |
@@ -344,6 +346,7 @@ typedef struct drm_i915_private { | |||
344 | unsigned int lvds_vbt:1; | 346 | unsigned int lvds_vbt:1; |
345 | unsigned int int_crt_support:1; | 347 | unsigned int int_crt_support:1; |
346 | unsigned int lvds_use_ssc:1; | 348 | unsigned int lvds_use_ssc:1; |
349 | unsigned int display_clock_mode:1; | ||
347 | int lvds_ssc_freq; | 350 | int lvds_ssc_freq; |
348 | struct { | 351 | struct { |
349 | int rate; | 352 | int rate; |
@@ -652,6 +655,7 @@ typedef struct drm_i915_private { | |||
652 | unsigned int lvds_border_bits; | 655 | unsigned int lvds_border_bits; |
653 | /* Panel fitter placement and size for Ironlake+ */ | 656 | /* Panel fitter placement and size for Ironlake+ */ |
654 | u32 pch_pf_pos, pch_pf_size; | 657 | u32 pch_pf_pos, pch_pf_size; |
658 | int panel_t3, panel_t12; | ||
655 | 659 | ||
656 | struct drm_crtc *plane_to_crtc_mapping[2]; | 660 | struct drm_crtc *plane_to_crtc_mapping[2]; |
657 | struct drm_crtc *pipe_to_crtc_mapping[2]; | 661 | struct drm_crtc *pipe_to_crtc_mapping[2]; |
@@ -958,6 +962,7 @@ extern unsigned int i915_fbpercrtc; | |||
958 | extern unsigned int i915_powersave; | 962 | extern unsigned int i915_powersave; |
959 | extern unsigned int i915_lvds_downclock; | 963 | extern unsigned int i915_lvds_downclock; |
960 | extern unsigned int i915_panel_use_ssc; | 964 | extern unsigned int i915_panel_use_ssc; |
965 | extern int i915_vbt_sdvo_panel_type; | ||
961 | extern unsigned int i915_enable_rc6; | 966 | extern unsigned int i915_enable_rc6; |
962 | 967 | ||
963 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); | 968 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); |
@@ -997,8 +1002,6 @@ extern int i915_irq_emit(struct drm_device *dev, void *data, | |||
997 | struct drm_file *file_priv); | 1002 | struct drm_file *file_priv); |
998 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 1003 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
999 | struct drm_file *file_priv); | 1004 | struct drm_file *file_priv); |
1000 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno); | ||
1001 | extern void i915_enable_interrupt (struct drm_device *dev); | ||
1002 | 1005 | ||
1003 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); | 1006 | extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); |
1004 | extern void i915_driver_irq_preinstall(struct drm_device * dev); | 1007 | extern void i915_driver_irq_preinstall(struct drm_device * dev); |
@@ -1050,7 +1053,6 @@ extern void i915_mem_takedown(struct mem_block **heap); | |||
1050 | extern void i915_mem_release(struct drm_device * dev, | 1053 | extern void i915_mem_release(struct drm_device * dev, |
1051 | struct drm_file *file_priv, struct mem_block *heap); | 1054 | struct drm_file *file_priv, struct mem_block *heap); |
1052 | /* i915_gem.c */ | 1055 | /* i915_gem.c */ |
1053 | int i915_gem_check_is_wedged(struct drm_device *dev); | ||
1054 | int i915_gem_init_ioctl(struct drm_device *dev, void *data, | 1056 | int i915_gem_init_ioctl(struct drm_device *dev, void *data, |
1055 | struct drm_file *file_priv); | 1057 | struct drm_file *file_priv); |
1056 | int i915_gem_create_ioctl(struct drm_device *dev, void *data, | 1058 | int i915_gem_create_ioctl(struct drm_device *dev, void *data, |
@@ -1093,8 +1095,7 @@ int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, | |||
1093 | struct drm_file *file_priv); | 1095 | struct drm_file *file_priv); |
1094 | void i915_gem_load(struct drm_device *dev); | 1096 | void i915_gem_load(struct drm_device *dev); |
1095 | int i915_gem_init_object(struct drm_gem_object *obj); | 1097 | int i915_gem_init_object(struct drm_gem_object *obj); |
1096 | int __must_check i915_gem_flush_ring(struct drm_device *dev, | 1098 | int __must_check i915_gem_flush_ring(struct intel_ring_buffer *ring, |
1097 | struct intel_ring_buffer *ring, | ||
1098 | uint32_t invalidate_domains, | 1099 | uint32_t invalidate_domains, |
1099 | uint32_t flush_domains); | 1100 | uint32_t flush_domains); |
1100 | struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, | 1101 | struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, |
@@ -1125,10 +1126,9 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2) | |||
1125 | } | 1126 | } |
1126 | 1127 | ||
1127 | static inline u32 | 1128 | static inline u32 |
1128 | i915_gem_next_request_seqno(struct drm_device *dev, | 1129 | i915_gem_next_request_seqno(struct intel_ring_buffer *ring) |
1129 | struct intel_ring_buffer *ring) | ||
1130 | { | 1130 | { |
1131 | drm_i915_private_t *dev_priv = dev->dev_private; | 1131 | drm_i915_private_t *dev_priv = ring->dev->dev_private; |
1132 | return ring->outstanding_lazy_request = dev_priv->next_seqno; | 1132 | return ring->outstanding_lazy_request = dev_priv->next_seqno; |
1133 | } | 1133 | } |
1134 | 1134 | ||
@@ -1153,14 +1153,12 @@ void i915_gem_do_init(struct drm_device *dev, | |||
1153 | unsigned long end); | 1153 | unsigned long end); |
1154 | int __must_check i915_gpu_idle(struct drm_device *dev); | 1154 | int __must_check i915_gpu_idle(struct drm_device *dev); |
1155 | int __must_check i915_gem_idle(struct drm_device *dev); | 1155 | int __must_check i915_gem_idle(struct drm_device *dev); |
1156 | int __must_check i915_add_request(struct drm_device *dev, | 1156 | int __must_check i915_add_request(struct intel_ring_buffer *ring, |
1157 | struct drm_file *file_priv, | 1157 | struct drm_file *file, |
1158 | struct drm_i915_gem_request *request, | 1158 | struct drm_i915_gem_request *request); |
1159 | struct intel_ring_buffer *ring); | 1159 | int __must_check i915_wait_request(struct intel_ring_buffer *ring, |
1160 | int __must_check i915_do_wait_request(struct drm_device *dev, | 1160 | uint32_t seqno, |
1161 | uint32_t seqno, | 1161 | bool interruptible); |
1162 | bool interruptible, | ||
1163 | struct intel_ring_buffer *ring); | ||
1164 | int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); | 1162 | int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); |
1165 | int __must_check | 1163 | int __must_check |
1166 | i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, | 1164 | i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, |
@@ -1309,7 +1307,7 @@ extern void intel_display_print_error_state(struct seq_file *m, | |||
1309 | #define __i915_read(x, y) \ | 1307 | #define __i915_read(x, y) \ |
1310 | static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | 1308 | static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ |
1311 | u##x val = read##y(dev_priv->regs + reg); \ | 1309 | u##x val = read##y(dev_priv->regs + reg); \ |
1312 | trace_i915_reg_rw('R', reg, val, sizeof(val)); \ | 1310 | trace_i915_reg_rw(false, reg, val, sizeof(val)); \ |
1313 | return val; \ | 1311 | return val; \ |
1314 | } | 1312 | } |
1315 | __i915_read(8, b) | 1313 | __i915_read(8, b) |
@@ -1320,7 +1318,7 @@ __i915_read(64, q) | |||
1320 | 1318 | ||
1321 | #define __i915_write(x, y) \ | 1319 | #define __i915_write(x, y) \ |
1322 | static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ | 1320 | static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \ |
1323 | trace_i915_reg_rw('W', reg, val, sizeof(val)); \ | 1321 | trace_i915_reg_rw(true, reg, val, sizeof(val)); \ |
1324 | write##y(val, dev_priv->regs + reg); \ | 1322 | write##y(val, dev_priv->regs + reg); \ |
1325 | } | 1323 | } |
1326 | __i915_write(8, b) | 1324 | __i915_write(8, b) |
@@ -1369,46 +1367,4 @@ static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) | |||
1369 | return val; | 1367 | return val; |
1370 | } | 1368 | } |
1371 | 1369 | ||
1372 | static inline void | ||
1373 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) | ||
1374 | { | ||
1375 | /* Trace down the write operation before the real write */ | ||
1376 | trace_i915_reg_rw('W', reg, val, len); | ||
1377 | switch (len) { | ||
1378 | case 8: | ||
1379 | writeq(val, dev_priv->regs + reg); | ||
1380 | break; | ||
1381 | case 4: | ||
1382 | writel(val, dev_priv->regs + reg); | ||
1383 | break; | ||
1384 | case 2: | ||
1385 | writew(val, dev_priv->regs + reg); | ||
1386 | break; | ||
1387 | case 1: | ||
1388 | writeb(val, dev_priv->regs + reg); | ||
1389 | break; | ||
1390 | } | ||
1391 | } | ||
1392 | |||
1393 | /** | ||
1394 | * Reads a dword out of the status page, which is written to from the command | ||
1395 | * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or | ||
1396 | * MI_STORE_DATA_IMM. | ||
1397 | * | ||
1398 | * The following dwords have a reserved meaning: | ||
1399 | * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes. | ||
1400 | * 0x04: ring 0 head pointer | ||
1401 | * 0x05: ring 1 head pointer (915-class) | ||
1402 | * 0x06: ring 2 head pointer (915-class) | ||
1403 | * 0x10-0x1b: Context status DWords (GM45) | ||
1404 | * 0x1f: Last written status offset. (GM45) | ||
1405 | * | ||
1406 | * The area from dword 0x20 to 0x3ff is available for driver usage. | ||
1407 | */ | ||
1408 | #define READ_HWSP(dev_priv, reg) (((volatile u32 *)\ | ||
1409 | (LP_RING(dev_priv)->status_page.page_addr))[reg]) | ||
1410 | #define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) | ||
1411 | #define I915_GEM_HWS_INDEX 0x20 | ||
1412 | #define I915_BREADCRUMB_INDEX 0x21 | ||
1413 | |||
1414 | #endif | 1370 | #endif |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index cf4f74c7c6fb..a8768e2bbebc 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -75,8 +75,8 @@ static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv, | |||
75 | dev_priv->mm.object_memory -= size; | 75 | dev_priv->mm.object_memory -= size; |
76 | } | 76 | } |
77 | 77 | ||
78 | int | 78 | static int |
79 | i915_gem_check_is_wedged(struct drm_device *dev) | 79 | i915_gem_wait_for_error(struct drm_device *dev) |
80 | { | 80 | { |
81 | struct drm_i915_private *dev_priv = dev->dev_private; | 81 | struct drm_i915_private *dev_priv = dev->dev_private; |
82 | struct completion *x = &dev_priv->error_completion; | 82 | struct completion *x = &dev_priv->error_completion; |
@@ -90,27 +90,24 @@ i915_gem_check_is_wedged(struct drm_device *dev) | |||
90 | if (ret) | 90 | if (ret) |
91 | return ret; | 91 | return ret; |
92 | 92 | ||
93 | /* Success, we reset the GPU! */ | 93 | if (atomic_read(&dev_priv->mm.wedged)) { |
94 | if (!atomic_read(&dev_priv->mm.wedged)) | 94 | /* GPU is hung, bump the completion count to account for |
95 | return 0; | 95 | * the token we just consumed so that we never hit zero and |
96 | 96 | * end up waiting upon a subsequent completion event that | |
97 | /* GPU is hung, bump the completion count to account for | 97 | * will never happen. |
98 | * the token we just consumed so that we never hit zero and | 98 | */ |
99 | * end up waiting upon a subsequent completion event that | 99 | spin_lock_irqsave(&x->wait.lock, flags); |
100 | * will never happen. | 100 | x->done++; |
101 | */ | 101 | spin_unlock_irqrestore(&x->wait.lock, flags); |
102 | spin_lock_irqsave(&x->wait.lock, flags); | 102 | } |
103 | x->done++; | 103 | return 0; |
104 | spin_unlock_irqrestore(&x->wait.lock, flags); | ||
105 | return -EIO; | ||
106 | } | 104 | } |
107 | 105 | ||
108 | int i915_mutex_lock_interruptible(struct drm_device *dev) | 106 | int i915_mutex_lock_interruptible(struct drm_device *dev) |
109 | { | 107 | { |
110 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
111 | int ret; | 108 | int ret; |
112 | 109 | ||
113 | ret = i915_gem_check_is_wedged(dev); | 110 | ret = i915_gem_wait_for_error(dev); |
114 | if (ret) | 111 | if (ret) |
115 | return ret; | 112 | return ret; |
116 | 113 | ||
@@ -118,11 +115,6 @@ int i915_mutex_lock_interruptible(struct drm_device *dev) | |||
118 | if (ret) | 115 | if (ret) |
119 | return ret; | 116 | return ret; |
120 | 117 | ||
121 | if (atomic_read(&dev_priv->mm.wedged)) { | ||
122 | mutex_unlock(&dev->struct_mutex); | ||
123 | return -EAGAIN; | ||
124 | } | ||
125 | |||
126 | WARN_ON(i915_verify_lists(dev)); | 118 | WARN_ON(i915_verify_lists(dev)); |
127 | return 0; | 119 | return 0; |
128 | } | 120 | } |
@@ -526,6 +518,8 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, | |||
526 | goto out; | 518 | goto out; |
527 | } | 519 | } |
528 | 520 | ||
521 | trace_i915_gem_object_pread(obj, args->offset, args->size); | ||
522 | |||
529 | ret = i915_gem_object_set_cpu_read_domain_range(obj, | 523 | ret = i915_gem_object_set_cpu_read_domain_range(obj, |
530 | args->offset, | 524 | args->offset, |
531 | args->size); | 525 | args->size); |
@@ -967,6 +961,8 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, | |||
967 | goto out; | 961 | goto out; |
968 | } | 962 | } |
969 | 963 | ||
964 | trace_i915_gem_object_pwrite(obj, args->offset, args->size); | ||
965 | |||
970 | /* We can only do the GTT pwrite on untiled buffers, as otherwise | 966 | /* We can only do the GTT pwrite on untiled buffers, as otherwise |
971 | * it would end up going through the fenced access, and we'll get | 967 | * it would end up going through the fenced access, and we'll get |
972 | * different detiling behavior between reading and writing. | 968 | * different detiling behavior between reading and writing. |
@@ -1121,7 +1117,6 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, | |||
1121 | struct drm_i915_private *dev_priv = dev->dev_private; | 1117 | struct drm_i915_private *dev_priv = dev->dev_private; |
1122 | struct drm_i915_gem_mmap *args = data; | 1118 | struct drm_i915_gem_mmap *args = data; |
1123 | struct drm_gem_object *obj; | 1119 | struct drm_gem_object *obj; |
1124 | loff_t offset; | ||
1125 | unsigned long addr; | 1120 | unsigned long addr; |
1126 | 1121 | ||
1127 | if (!(dev->driver->driver_features & DRIVER_GEM)) | 1122 | if (!(dev->driver->driver_features & DRIVER_GEM)) |
@@ -1136,8 +1131,6 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, | |||
1136 | return -E2BIG; | 1131 | return -E2BIG; |
1137 | } | 1132 | } |
1138 | 1133 | ||
1139 | offset = args->offset; | ||
1140 | |||
1141 | down_write(¤t->mm->mmap_sem); | 1134 | down_write(¤t->mm->mmap_sem); |
1142 | addr = do_mmap(obj->filp, 0, args->size, | 1135 | addr = do_mmap(obj->filp, 0, args->size, |
1143 | PROT_READ | PROT_WRITE, MAP_SHARED, | 1136 | PROT_READ | PROT_WRITE, MAP_SHARED, |
@@ -1182,9 +1175,13 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1182 | page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >> | 1175 | page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >> |
1183 | PAGE_SHIFT; | 1176 | PAGE_SHIFT; |
1184 | 1177 | ||
1185 | /* Now bind it into the GTT if needed */ | 1178 | ret = i915_mutex_lock_interruptible(dev); |
1186 | mutex_lock(&dev->struct_mutex); | 1179 | if (ret) |
1180 | goto out; | ||
1181 | |||
1182 | trace_i915_gem_object_fault(obj, page_offset, true, write); | ||
1187 | 1183 | ||
1184 | /* Now bind it into the GTT if needed */ | ||
1188 | if (!obj->map_and_fenceable) { | 1185 | if (!obj->map_and_fenceable) { |
1189 | ret = i915_gem_object_unbind(obj); | 1186 | ret = i915_gem_object_unbind(obj); |
1190 | if (ret) | 1187 | if (ret) |
@@ -1219,12 +1216,21 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1219 | ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); | 1216 | ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); |
1220 | unlock: | 1217 | unlock: |
1221 | mutex_unlock(&dev->struct_mutex); | 1218 | mutex_unlock(&dev->struct_mutex); |
1222 | 1219 | out: | |
1223 | switch (ret) { | 1220 | switch (ret) { |
1221 | case -EIO: | ||
1224 | case -EAGAIN: | 1222 | case -EAGAIN: |
1223 | /* Give the error handler a chance to run and move the | ||
1224 | * objects off the GPU active list. Next time we service the | ||
1225 | * fault, we should be able to transition the page into the | ||
1226 | * GTT without touching the GPU (and so avoid further | ||
1227 | * EIO/EGAIN). If the GPU is wedged, then there is no issue | ||
1228 | * with coherency, just lost writes. | ||
1229 | */ | ||
1225 | set_need_resched(); | 1230 | set_need_resched(); |
1226 | case 0: | 1231 | case 0: |
1227 | case -ERESTARTSYS: | 1232 | case -ERESTARTSYS: |
1233 | case -EINTR: | ||
1228 | return VM_FAULT_NOPAGE; | 1234 | return VM_FAULT_NOPAGE; |
1229 | case -ENOMEM: | 1235 | case -ENOMEM: |
1230 | return VM_FAULT_OOM; | 1236 | return VM_FAULT_OOM; |
@@ -1669,9 +1675,8 @@ i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj) | |||
1669 | } | 1675 | } |
1670 | 1676 | ||
1671 | static void | 1677 | static void |
1672 | i915_gem_process_flushing_list(struct drm_device *dev, | 1678 | i915_gem_process_flushing_list(struct intel_ring_buffer *ring, |
1673 | uint32_t flush_domains, | 1679 | uint32_t flush_domains) |
1674 | struct intel_ring_buffer *ring) | ||
1675 | { | 1680 | { |
1676 | struct drm_i915_gem_object *obj, *next; | 1681 | struct drm_i915_gem_object *obj, *next; |
1677 | 1682 | ||
@@ -1684,7 +1689,7 @@ i915_gem_process_flushing_list(struct drm_device *dev, | |||
1684 | obj->base.write_domain = 0; | 1689 | obj->base.write_domain = 0; |
1685 | list_del_init(&obj->gpu_write_list); | 1690 | list_del_init(&obj->gpu_write_list); |
1686 | i915_gem_object_move_to_active(obj, ring, | 1691 | i915_gem_object_move_to_active(obj, ring, |
1687 | i915_gem_next_request_seqno(dev, ring)); | 1692 | i915_gem_next_request_seqno(ring)); |
1688 | 1693 | ||
1689 | trace_i915_gem_object_change_domain(obj, | 1694 | trace_i915_gem_object_change_domain(obj, |
1690 | obj->base.read_domains, | 1695 | obj->base.read_domains, |
@@ -1694,27 +1699,22 @@ i915_gem_process_flushing_list(struct drm_device *dev, | |||
1694 | } | 1699 | } |
1695 | 1700 | ||
1696 | int | 1701 | int |
1697 | i915_add_request(struct drm_device *dev, | 1702 | i915_add_request(struct intel_ring_buffer *ring, |
1698 | struct drm_file *file, | 1703 | struct drm_file *file, |
1699 | struct drm_i915_gem_request *request, | 1704 | struct drm_i915_gem_request *request) |
1700 | struct intel_ring_buffer *ring) | ||
1701 | { | 1705 | { |
1702 | drm_i915_private_t *dev_priv = dev->dev_private; | 1706 | drm_i915_private_t *dev_priv = ring->dev->dev_private; |
1703 | struct drm_i915_file_private *file_priv = NULL; | ||
1704 | uint32_t seqno; | 1707 | uint32_t seqno; |
1705 | int was_empty; | 1708 | int was_empty; |
1706 | int ret; | 1709 | int ret; |
1707 | 1710 | ||
1708 | BUG_ON(request == NULL); | 1711 | BUG_ON(request == NULL); |
1709 | 1712 | ||
1710 | if (file != NULL) | ||
1711 | file_priv = file->driver_priv; | ||
1712 | |||
1713 | ret = ring->add_request(ring, &seqno); | 1713 | ret = ring->add_request(ring, &seqno); |
1714 | if (ret) | 1714 | if (ret) |
1715 | return ret; | 1715 | return ret; |
1716 | 1716 | ||
1717 | ring->outstanding_lazy_request = false; | 1717 | trace_i915_gem_request_add(ring, seqno); |
1718 | 1718 | ||
1719 | request->seqno = seqno; | 1719 | request->seqno = seqno; |
1720 | request->ring = ring; | 1720 | request->ring = ring; |
@@ -1722,7 +1722,9 @@ i915_add_request(struct drm_device *dev, | |||
1722 | was_empty = list_empty(&ring->request_list); | 1722 | was_empty = list_empty(&ring->request_list); |
1723 | list_add_tail(&request->list, &ring->request_list); | 1723 | list_add_tail(&request->list, &ring->request_list); |
1724 | 1724 | ||
1725 | if (file_priv) { | 1725 | if (file) { |
1726 | struct drm_i915_file_private *file_priv = file->driver_priv; | ||
1727 | |||
1726 | spin_lock(&file_priv->mm.lock); | 1728 | spin_lock(&file_priv->mm.lock); |
1727 | request->file_priv = file_priv; | 1729 | request->file_priv = file_priv; |
1728 | list_add_tail(&request->client_list, | 1730 | list_add_tail(&request->client_list, |
@@ -1730,6 +1732,8 @@ i915_add_request(struct drm_device *dev, | |||
1730 | spin_unlock(&file_priv->mm.lock); | 1732 | spin_unlock(&file_priv->mm.lock); |
1731 | } | 1733 | } |
1732 | 1734 | ||
1735 | ring->outstanding_lazy_request = false; | ||
1736 | |||
1733 | if (!dev_priv->mm.suspended) { | 1737 | if (!dev_priv->mm.suspended) { |
1734 | mod_timer(&dev_priv->hangcheck_timer, | 1738 | mod_timer(&dev_priv->hangcheck_timer, |
1735 | jiffies + msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD)); | 1739 | jiffies + msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD)); |
@@ -1846,18 +1850,15 @@ void i915_gem_reset(struct drm_device *dev) | |||
1846 | * This function clears the request list as sequence numbers are passed. | 1850 | * This function clears the request list as sequence numbers are passed. |
1847 | */ | 1851 | */ |
1848 | static void | 1852 | static void |
1849 | i915_gem_retire_requests_ring(struct drm_device *dev, | 1853 | i915_gem_retire_requests_ring(struct intel_ring_buffer *ring) |
1850 | struct intel_ring_buffer *ring) | ||
1851 | { | 1854 | { |
1852 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
1853 | uint32_t seqno; | 1855 | uint32_t seqno; |
1854 | int i; | 1856 | int i; |
1855 | 1857 | ||
1856 | if (!ring->status_page.page_addr || | 1858 | if (list_empty(&ring->request_list)) |
1857 | list_empty(&ring->request_list)) | ||
1858 | return; | 1859 | return; |
1859 | 1860 | ||
1860 | WARN_ON(i915_verify_lists(dev)); | 1861 | WARN_ON(i915_verify_lists(ring->dev)); |
1861 | 1862 | ||
1862 | seqno = ring->get_seqno(ring); | 1863 | seqno = ring->get_seqno(ring); |
1863 | 1864 | ||
@@ -1875,7 +1876,7 @@ i915_gem_retire_requests_ring(struct drm_device *dev, | |||
1875 | if (!i915_seqno_passed(seqno, request->seqno)) | 1876 | if (!i915_seqno_passed(seqno, request->seqno)) |
1876 | break; | 1877 | break; |
1877 | 1878 | ||
1878 | trace_i915_gem_request_retire(dev, request->seqno); | 1879 | trace_i915_gem_request_retire(ring, request->seqno); |
1879 | 1880 | ||
1880 | list_del(&request->list); | 1881 | list_del(&request->list); |
1881 | i915_gem_request_remove_from_client(request); | 1882 | i915_gem_request_remove_from_client(request); |
@@ -1901,13 +1902,13 @@ i915_gem_retire_requests_ring(struct drm_device *dev, | |||
1901 | i915_gem_object_move_to_inactive(obj); | 1902 | i915_gem_object_move_to_inactive(obj); |
1902 | } | 1903 | } |
1903 | 1904 | ||
1904 | if (unlikely (dev_priv->trace_irq_seqno && | 1905 | if (unlikely(ring->trace_irq_seqno && |
1905 | i915_seqno_passed(dev_priv->trace_irq_seqno, seqno))) { | 1906 | i915_seqno_passed(seqno, ring->trace_irq_seqno))) { |
1906 | ring->irq_put(ring); | 1907 | ring->irq_put(ring); |
1907 | dev_priv->trace_irq_seqno = 0; | 1908 | ring->trace_irq_seqno = 0; |
1908 | } | 1909 | } |
1909 | 1910 | ||
1910 | WARN_ON(i915_verify_lists(dev)); | 1911 | WARN_ON(i915_verify_lists(ring->dev)); |
1911 | } | 1912 | } |
1912 | 1913 | ||
1913 | void | 1914 | void |
@@ -1931,7 +1932,7 @@ i915_gem_retire_requests(struct drm_device *dev) | |||
1931 | } | 1932 | } |
1932 | 1933 | ||
1933 | for (i = 0; i < I915_NUM_RINGS; i++) | 1934 | for (i = 0; i < I915_NUM_RINGS; i++) |
1934 | i915_gem_retire_requests_ring(dev, &dev_priv->ring[i]); | 1935 | i915_gem_retire_requests_ring(&dev_priv->ring[i]); |
1935 | } | 1936 | } |
1936 | 1937 | ||
1937 | static void | 1938 | static void |
@@ -1965,11 +1966,11 @@ i915_gem_retire_work_handler(struct work_struct *work) | |||
1965 | struct drm_i915_gem_request *request; | 1966 | struct drm_i915_gem_request *request; |
1966 | int ret; | 1967 | int ret; |
1967 | 1968 | ||
1968 | ret = i915_gem_flush_ring(dev, ring, 0, | 1969 | ret = i915_gem_flush_ring(ring, |
1969 | I915_GEM_GPU_DOMAINS); | 1970 | 0, I915_GEM_GPU_DOMAINS); |
1970 | request = kzalloc(sizeof(*request), GFP_KERNEL); | 1971 | request = kzalloc(sizeof(*request), GFP_KERNEL); |
1971 | if (ret || request == NULL || | 1972 | if (ret || request == NULL || |
1972 | i915_add_request(dev, NULL, request, ring)) | 1973 | i915_add_request(ring, NULL, request)) |
1973 | kfree(request); | 1974 | kfree(request); |
1974 | } | 1975 | } |
1975 | 1976 | ||
@@ -1982,18 +1983,33 @@ i915_gem_retire_work_handler(struct work_struct *work) | |||
1982 | mutex_unlock(&dev->struct_mutex); | 1983 | mutex_unlock(&dev->struct_mutex); |
1983 | } | 1984 | } |
1984 | 1985 | ||
1986 | /** | ||
1987 | * Waits for a sequence number to be signaled, and cleans up the | ||
1988 | * request and object lists appropriately for that event. | ||
1989 | */ | ||
1985 | int | 1990 | int |
1986 | i915_do_wait_request(struct drm_device *dev, uint32_t seqno, | 1991 | i915_wait_request(struct intel_ring_buffer *ring, |
1987 | bool interruptible, struct intel_ring_buffer *ring) | 1992 | uint32_t seqno, |
1993 | bool interruptible) | ||
1988 | { | 1994 | { |
1989 | drm_i915_private_t *dev_priv = dev->dev_private; | 1995 | drm_i915_private_t *dev_priv = ring->dev->dev_private; |
1990 | u32 ier; | 1996 | u32 ier; |
1991 | int ret = 0; | 1997 | int ret = 0; |
1992 | 1998 | ||
1993 | BUG_ON(seqno == 0); | 1999 | BUG_ON(seqno == 0); |
1994 | 2000 | ||
1995 | if (atomic_read(&dev_priv->mm.wedged)) | 2001 | if (atomic_read(&dev_priv->mm.wedged)) { |
1996 | return -EAGAIN; | 2002 | struct completion *x = &dev_priv->error_completion; |
2003 | bool recovery_complete; | ||
2004 | unsigned long flags; | ||
2005 | |||
2006 | /* Give the error handler a chance to run. */ | ||
2007 | spin_lock_irqsave(&x->wait.lock, flags); | ||
2008 | recovery_complete = x->done > 0; | ||
2009 | spin_unlock_irqrestore(&x->wait.lock, flags); | ||
2010 | |||
2011 | return recovery_complete ? -EIO : -EAGAIN; | ||
2012 | } | ||
1997 | 2013 | ||
1998 | if (seqno == ring->outstanding_lazy_request) { | 2014 | if (seqno == ring->outstanding_lazy_request) { |
1999 | struct drm_i915_gem_request *request; | 2015 | struct drm_i915_gem_request *request; |
@@ -2002,7 +2018,7 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno, | |||
2002 | if (request == NULL) | 2018 | if (request == NULL) |
2003 | return -ENOMEM; | 2019 | return -ENOMEM; |
2004 | 2020 | ||
2005 | ret = i915_add_request(dev, NULL, request, ring); | 2021 | ret = i915_add_request(ring, NULL, request); |
2006 | if (ret) { | 2022 | if (ret) { |
2007 | kfree(request); | 2023 | kfree(request); |
2008 | return ret; | 2024 | return ret; |
@@ -2012,18 +2028,18 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno, | |||
2012 | } | 2028 | } |
2013 | 2029 | ||
2014 | if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) { | 2030 | if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) { |
2015 | if (HAS_PCH_SPLIT(dev)) | 2031 | if (HAS_PCH_SPLIT(ring->dev)) |
2016 | ier = I915_READ(DEIER) | I915_READ(GTIER); | 2032 | ier = I915_READ(DEIER) | I915_READ(GTIER); |
2017 | else | 2033 | else |
2018 | ier = I915_READ(IER); | 2034 | ier = I915_READ(IER); |
2019 | if (!ier) { | 2035 | if (!ier) { |
2020 | DRM_ERROR("something (likely vbetool) disabled " | 2036 | DRM_ERROR("something (likely vbetool) disabled " |
2021 | "interrupts, re-enabling\n"); | 2037 | "interrupts, re-enabling\n"); |
2022 | i915_driver_irq_preinstall(dev); | 2038 | i915_driver_irq_preinstall(ring->dev); |
2023 | i915_driver_irq_postinstall(dev); | 2039 | i915_driver_irq_postinstall(ring->dev); |
2024 | } | 2040 | } |
2025 | 2041 | ||
2026 | trace_i915_gem_request_wait_begin(dev, seqno); | 2042 | trace_i915_gem_request_wait_begin(ring, seqno); |
2027 | 2043 | ||
2028 | ring->waiting_seqno = seqno; | 2044 | ring->waiting_seqno = seqno; |
2029 | if (ring->irq_get(ring)) { | 2045 | if (ring->irq_get(ring)) { |
@@ -2043,7 +2059,7 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno, | |||
2043 | ret = -EBUSY; | 2059 | ret = -EBUSY; |
2044 | ring->waiting_seqno = 0; | 2060 | ring->waiting_seqno = 0; |
2045 | 2061 | ||
2046 | trace_i915_gem_request_wait_end(dev, seqno); | 2062 | trace_i915_gem_request_wait_end(ring, seqno); |
2047 | } | 2063 | } |
2048 | if (atomic_read(&dev_priv->mm.wedged)) | 2064 | if (atomic_read(&dev_priv->mm.wedged)) |
2049 | ret = -EAGAIN; | 2065 | ret = -EAGAIN; |
@@ -2059,23 +2075,12 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno, | |||
2059 | * a separate wait queue to handle that. | 2075 | * a separate wait queue to handle that. |
2060 | */ | 2076 | */ |
2061 | if (ret == 0) | 2077 | if (ret == 0) |
2062 | i915_gem_retire_requests_ring(dev, ring); | 2078 | i915_gem_retire_requests_ring(ring); |
2063 | 2079 | ||
2064 | return ret; | 2080 | return ret; |
2065 | } | 2081 | } |
2066 | 2082 | ||
2067 | /** | 2083 | /** |
2068 | * Waits for a sequence number to be signaled, and cleans up the | ||
2069 | * request and object lists appropriately for that event. | ||
2070 | */ | ||
2071 | static int | ||
2072 | i915_wait_request(struct drm_device *dev, uint32_t seqno, | ||
2073 | struct intel_ring_buffer *ring) | ||
2074 | { | ||
2075 | return i915_do_wait_request(dev, seqno, 1, ring); | ||
2076 | } | ||
2077 | |||
2078 | /** | ||
2079 | * Ensures that all rendering to the object has completed and the object is | 2084 | * Ensures that all rendering to the object has completed and the object is |
2080 | * safe to unbind from the GTT or access from the CPU. | 2085 | * safe to unbind from the GTT or access from the CPU. |
2081 | */ | 2086 | */ |
@@ -2083,7 +2088,6 @@ int | |||
2083 | i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj, | 2088 | i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj, |
2084 | bool interruptible) | 2089 | bool interruptible) |
2085 | { | 2090 | { |
2086 | struct drm_device *dev = obj->base.dev; | ||
2087 | int ret; | 2091 | int ret; |
2088 | 2092 | ||
2089 | /* This function only exists to support waiting for existing rendering, | 2093 | /* This function only exists to support waiting for existing rendering, |
@@ -2095,10 +2099,9 @@ i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj, | |||
2095 | * it. | 2099 | * it. |
2096 | */ | 2100 | */ |
2097 | if (obj->active) { | 2101 | if (obj->active) { |
2098 | ret = i915_do_wait_request(dev, | 2102 | ret = i915_wait_request(obj->ring, |
2099 | obj->last_rendering_seqno, | 2103 | obj->last_rendering_seqno, |
2100 | interruptible, | 2104 | interruptible); |
2101 | obj->ring); | ||
2102 | if (ret) | 2105 | if (ret) |
2103 | return ret; | 2106 | return ret; |
2104 | } | 2107 | } |
@@ -2148,6 +2151,8 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj) | |||
2148 | if (ret == -ERESTARTSYS) | 2151 | if (ret == -ERESTARTSYS) |
2149 | return ret; | 2152 | return ret; |
2150 | 2153 | ||
2154 | trace_i915_gem_object_unbind(obj); | ||
2155 | |||
2151 | i915_gem_gtt_unbind_object(obj); | 2156 | i915_gem_gtt_unbind_object(obj); |
2152 | i915_gem_object_put_pages_gtt(obj); | 2157 | i915_gem_object_put_pages_gtt(obj); |
2153 | 2158 | ||
@@ -2163,29 +2168,27 @@ i915_gem_object_unbind(struct drm_i915_gem_object *obj) | |||
2163 | if (i915_gem_object_is_purgeable(obj)) | 2168 | if (i915_gem_object_is_purgeable(obj)) |
2164 | i915_gem_object_truncate(obj); | 2169 | i915_gem_object_truncate(obj); |
2165 | 2170 | ||
2166 | trace_i915_gem_object_unbind(obj); | ||
2167 | |||
2168 | return ret; | 2171 | return ret; |
2169 | } | 2172 | } |
2170 | 2173 | ||
2171 | int | 2174 | int |
2172 | i915_gem_flush_ring(struct drm_device *dev, | 2175 | i915_gem_flush_ring(struct intel_ring_buffer *ring, |
2173 | struct intel_ring_buffer *ring, | ||
2174 | uint32_t invalidate_domains, | 2176 | uint32_t invalidate_domains, |
2175 | uint32_t flush_domains) | 2177 | uint32_t flush_domains) |
2176 | { | 2178 | { |
2177 | int ret; | 2179 | int ret; |
2178 | 2180 | ||
2181 | trace_i915_gem_ring_flush(ring, invalidate_domains, flush_domains); | ||
2182 | |||
2179 | ret = ring->flush(ring, invalidate_domains, flush_domains); | 2183 | ret = ring->flush(ring, invalidate_domains, flush_domains); |
2180 | if (ret) | 2184 | if (ret) |
2181 | return ret; | 2185 | return ret; |
2182 | 2186 | ||
2183 | i915_gem_process_flushing_list(dev, flush_domains, ring); | 2187 | i915_gem_process_flushing_list(ring, flush_domains); |
2184 | return 0; | 2188 | return 0; |
2185 | } | 2189 | } |
2186 | 2190 | ||
2187 | static int i915_ring_idle(struct drm_device *dev, | 2191 | static int i915_ring_idle(struct intel_ring_buffer *ring) |
2188 | struct intel_ring_buffer *ring) | ||
2189 | { | 2192 | { |
2190 | int ret; | 2193 | int ret; |
2191 | 2194 | ||
@@ -2193,15 +2196,15 @@ static int i915_ring_idle(struct drm_device *dev, | |||
2193 | return 0; | 2196 | return 0; |
2194 | 2197 | ||
2195 | if (!list_empty(&ring->gpu_write_list)) { | 2198 | if (!list_empty(&ring->gpu_write_list)) { |
2196 | ret = i915_gem_flush_ring(dev, ring, | 2199 | ret = i915_gem_flush_ring(ring, |
2197 | I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS); | 2200 | I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS); |
2198 | if (ret) | 2201 | if (ret) |
2199 | return ret; | 2202 | return ret; |
2200 | } | 2203 | } |
2201 | 2204 | ||
2202 | return i915_wait_request(dev, | 2205 | return i915_wait_request(ring, |
2203 | i915_gem_next_request_seqno(dev, ring), | 2206 | i915_gem_next_request_seqno(ring), |
2204 | ring); | 2207 | true); |
2205 | } | 2208 | } |
2206 | 2209 | ||
2207 | int | 2210 | int |
@@ -2218,7 +2221,7 @@ i915_gpu_idle(struct drm_device *dev) | |||
2218 | 2221 | ||
2219 | /* Flush everything onto the inactive list. */ | 2222 | /* Flush everything onto the inactive list. */ |
2220 | for (i = 0; i < I915_NUM_RINGS; i++) { | 2223 | for (i = 0; i < I915_NUM_RINGS; i++) { |
2221 | ret = i915_ring_idle(dev, &dev_priv->ring[i]); | 2224 | ret = i915_ring_idle(&dev_priv->ring[i]); |
2222 | if (ret) | 2225 | if (ret) |
2223 | return ret; | 2226 | return ret; |
2224 | } | 2227 | } |
@@ -2409,8 +2412,7 @@ i915_gem_object_flush_fence(struct drm_i915_gem_object *obj, | |||
2409 | 2412 | ||
2410 | if (obj->fenced_gpu_access) { | 2413 | if (obj->fenced_gpu_access) { |
2411 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { | 2414 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { |
2412 | ret = i915_gem_flush_ring(obj->base.dev, | 2415 | ret = i915_gem_flush_ring(obj->last_fenced_ring, |
2413 | obj->last_fenced_ring, | ||
2414 | 0, obj->base.write_domain); | 2416 | 0, obj->base.write_domain); |
2415 | if (ret) | 2417 | if (ret) |
2416 | return ret; | 2418 | return ret; |
@@ -2422,10 +2424,10 @@ i915_gem_object_flush_fence(struct drm_i915_gem_object *obj, | |||
2422 | if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) { | 2424 | if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) { |
2423 | if (!ring_passed_seqno(obj->last_fenced_ring, | 2425 | if (!ring_passed_seqno(obj->last_fenced_ring, |
2424 | obj->last_fenced_seqno)) { | 2426 | obj->last_fenced_seqno)) { |
2425 | ret = i915_do_wait_request(obj->base.dev, | 2427 | ret = i915_wait_request(obj->last_fenced_ring, |
2426 | obj->last_fenced_seqno, | 2428 | obj->last_fenced_seqno, |
2427 | interruptible, | 2429 | interruptible); |
2428 | obj->last_fenced_ring); | 2430 | |
2429 | if (ret) | 2431 | if (ret) |
2430 | return ret; | 2432 | return ret; |
2431 | } | 2433 | } |
@@ -2551,10 +2553,9 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2551 | if (reg->setup_seqno) { | 2553 | if (reg->setup_seqno) { |
2552 | if (!ring_passed_seqno(obj->last_fenced_ring, | 2554 | if (!ring_passed_seqno(obj->last_fenced_ring, |
2553 | reg->setup_seqno)) { | 2555 | reg->setup_seqno)) { |
2554 | ret = i915_do_wait_request(obj->base.dev, | 2556 | ret = i915_wait_request(obj->last_fenced_ring, |
2555 | reg->setup_seqno, | 2557 | reg->setup_seqno, |
2556 | interruptible, | 2558 | interruptible); |
2557 | obj->last_fenced_ring); | ||
2558 | if (ret) | 2559 | if (ret) |
2559 | return ret; | 2560 | return ret; |
2560 | } | 2561 | } |
@@ -2571,7 +2572,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2571 | } else if (obj->tiling_changed) { | 2572 | } else if (obj->tiling_changed) { |
2572 | if (obj->fenced_gpu_access) { | 2573 | if (obj->fenced_gpu_access) { |
2573 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { | 2574 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { |
2574 | ret = i915_gem_flush_ring(obj->base.dev, obj->ring, | 2575 | ret = i915_gem_flush_ring(obj->ring, |
2575 | 0, obj->base.write_domain); | 2576 | 0, obj->base.write_domain); |
2576 | if (ret) | 2577 | if (ret) |
2577 | return ret; | 2578 | return ret; |
@@ -2588,7 +2589,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2588 | if (obj->tiling_changed) { | 2589 | if (obj->tiling_changed) { |
2589 | if (pipelined) { | 2590 | if (pipelined) { |
2590 | reg->setup_seqno = | 2591 | reg->setup_seqno = |
2591 | i915_gem_next_request_seqno(dev, pipelined); | 2592 | i915_gem_next_request_seqno(pipelined); |
2592 | obj->last_fenced_seqno = reg->setup_seqno; | 2593 | obj->last_fenced_seqno = reg->setup_seqno; |
2593 | obj->last_fenced_ring = pipelined; | 2594 | obj->last_fenced_ring = pipelined; |
2594 | } | 2595 | } |
@@ -2628,7 +2629,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2628 | old->fence_reg = I915_FENCE_REG_NONE; | 2629 | old->fence_reg = I915_FENCE_REG_NONE; |
2629 | old->last_fenced_ring = pipelined; | 2630 | old->last_fenced_ring = pipelined; |
2630 | old->last_fenced_seqno = | 2631 | old->last_fenced_seqno = |
2631 | pipelined ? i915_gem_next_request_seqno(dev, pipelined) : 0; | 2632 | pipelined ? i915_gem_next_request_seqno(pipelined) : 0; |
2632 | 2633 | ||
2633 | drm_gem_object_unreference(&old->base); | 2634 | drm_gem_object_unreference(&old->base); |
2634 | } else if (obj->last_fenced_seqno == 0) | 2635 | } else if (obj->last_fenced_seqno == 0) |
@@ -2640,7 +2641,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2640 | obj->last_fenced_ring = pipelined; | 2641 | obj->last_fenced_ring = pipelined; |
2641 | 2642 | ||
2642 | reg->setup_seqno = | 2643 | reg->setup_seqno = |
2643 | pipelined ? i915_gem_next_request_seqno(dev, pipelined) : 0; | 2644 | pipelined ? i915_gem_next_request_seqno(pipelined) : 0; |
2644 | obj->last_fenced_seqno = reg->setup_seqno; | 2645 | obj->last_fenced_seqno = reg->setup_seqno; |
2645 | 2646 | ||
2646 | update: | 2647 | update: |
@@ -2837,7 +2838,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj, | |||
2837 | 2838 | ||
2838 | obj->map_and_fenceable = mappable && fenceable; | 2839 | obj->map_and_fenceable = mappable && fenceable; |
2839 | 2840 | ||
2840 | trace_i915_gem_object_bind(obj, obj->gtt_offset, map_and_fenceable); | 2841 | trace_i915_gem_object_bind(obj, map_and_fenceable); |
2841 | return 0; | 2842 | return 0; |
2842 | } | 2843 | } |
2843 | 2844 | ||
@@ -2860,13 +2861,11 @@ i915_gem_clflush_object(struct drm_i915_gem_object *obj) | |||
2860 | static int | 2861 | static int |
2861 | i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj) | 2862 | i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj) |
2862 | { | 2863 | { |
2863 | struct drm_device *dev = obj->base.dev; | ||
2864 | |||
2865 | if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0) | 2864 | if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0) |
2866 | return 0; | 2865 | return 0; |
2867 | 2866 | ||
2868 | /* Queue the GPU write cache flushing we need. */ | 2867 | /* Queue the GPU write cache flushing we need. */ |
2869 | return i915_gem_flush_ring(dev, obj->ring, 0, obj->base.write_domain); | 2868 | return i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain); |
2870 | } | 2869 | } |
2871 | 2870 | ||
2872 | /** Flushes the GTT write domain for the object if it's dirty. */ | 2871 | /** Flushes the GTT write domain for the object if it's dirty. */ |
@@ -2933,6 +2932,9 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write) | |||
2933 | if (obj->gtt_space == NULL) | 2932 | if (obj->gtt_space == NULL) |
2934 | return -EINVAL; | 2933 | return -EINVAL; |
2935 | 2934 | ||
2935 | if (obj->base.write_domain == I915_GEM_DOMAIN_GTT) | ||
2936 | return 0; | ||
2937 | |||
2936 | ret = i915_gem_object_flush_gpu_write_domain(obj); | 2938 | ret = i915_gem_object_flush_gpu_write_domain(obj); |
2937 | if (ret) | 2939 | if (ret) |
2938 | return ret; | 2940 | return ret; |
@@ -3015,8 +3017,7 @@ i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj, | |||
3015 | return 0; | 3017 | return 0; |
3016 | 3018 | ||
3017 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { | 3019 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { |
3018 | ret = i915_gem_flush_ring(obj->base.dev, obj->ring, | 3020 | ret = i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain); |
3019 | 0, obj->base.write_domain); | ||
3020 | if (ret) | 3021 | if (ret) |
3021 | return ret; | 3022 | return ret; |
3022 | } | 3023 | } |
@@ -3036,6 +3037,9 @@ i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write) | |||
3036 | uint32_t old_write_domain, old_read_domains; | 3037 | uint32_t old_write_domain, old_read_domains; |
3037 | int ret; | 3038 | int ret; |
3038 | 3039 | ||
3040 | if (obj->base.write_domain == I915_GEM_DOMAIN_CPU) | ||
3041 | return 0; | ||
3042 | |||
3039 | ret = i915_gem_object_flush_gpu_write_domain(obj); | 3043 | ret = i915_gem_object_flush_gpu_write_domain(obj); |
3040 | if (ret) | 3044 | if (ret) |
3041 | return ret; | 3045 | return ret; |
@@ -3209,6 +3213,9 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file) | |||
3209 | u32 seqno = 0; | 3213 | u32 seqno = 0; |
3210 | int ret; | 3214 | int ret; |
3211 | 3215 | ||
3216 | if (atomic_read(&dev_priv->mm.wedged)) | ||
3217 | return -EIO; | ||
3218 | |||
3212 | spin_lock(&file_priv->mm.lock); | 3219 | spin_lock(&file_priv->mm.lock); |
3213 | list_for_each_entry(request, &file_priv->mm.request_list, client_list) { | 3220 | list_for_each_entry(request, &file_priv->mm.request_list, client_list) { |
3214 | if (time_after_eq(request->emitted_jiffies, recent_enough)) | 3221 | if (time_after_eq(request->emitted_jiffies, recent_enough)) |
@@ -3430,7 +3437,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
3430 | * flush earlier is beneficial. | 3437 | * flush earlier is beneficial. |
3431 | */ | 3438 | */ |
3432 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { | 3439 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { |
3433 | ret = i915_gem_flush_ring(dev, obj->ring, | 3440 | ret = i915_gem_flush_ring(obj->ring, |
3434 | 0, obj->base.write_domain); | 3441 | 0, obj->base.write_domain); |
3435 | } else if (obj->ring->outstanding_lazy_request == | 3442 | } else if (obj->ring->outstanding_lazy_request == |
3436 | obj->last_rendering_seqno) { | 3443 | obj->last_rendering_seqno) { |
@@ -3441,9 +3448,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
3441 | */ | 3448 | */ |
3442 | request = kzalloc(sizeof(*request), GFP_KERNEL); | 3449 | request = kzalloc(sizeof(*request), GFP_KERNEL); |
3443 | if (request) | 3450 | if (request) |
3444 | ret = i915_add_request(dev, | 3451 | ret = i915_add_request(obj->ring, NULL,request); |
3445 | NULL, request, | ||
3446 | obj->ring); | ||
3447 | else | 3452 | else |
3448 | ret = -ENOMEM; | 3453 | ret = -ENOMEM; |
3449 | } | 3454 | } |
@@ -3453,7 +3458,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
3453 | * are actually unmasked, and our working set ends up being | 3458 | * are actually unmasked, and our working set ends up being |
3454 | * larger than required. | 3459 | * larger than required. |
3455 | */ | 3460 | */ |
3456 | i915_gem_retire_requests_ring(dev, obj->ring); | 3461 | i915_gem_retire_requests_ring(obj->ring); |
3457 | 3462 | ||
3458 | args->busy = obj->active; | 3463 | args->busy = obj->active; |
3459 | } | 3464 | } |
@@ -3583,6 +3588,8 @@ static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj) | |||
3583 | kfree(obj->page_cpu_valid); | 3588 | kfree(obj->page_cpu_valid); |
3584 | kfree(obj->bit_17); | 3589 | kfree(obj->bit_17); |
3585 | kfree(obj); | 3590 | kfree(obj); |
3591 | |||
3592 | trace_i915_gem_object_destroy(obj); | ||
3586 | } | 3593 | } |
3587 | 3594 | ||
3588 | void i915_gem_free_object(struct drm_gem_object *gem_obj) | 3595 | void i915_gem_free_object(struct drm_gem_object *gem_obj) |
@@ -3590,8 +3597,6 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj) | |||
3590 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); | 3597 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); |
3591 | struct drm_device *dev = obj->base.dev; | 3598 | struct drm_device *dev = obj->base.dev; |
3592 | 3599 | ||
3593 | trace_i915_gem_object_destroy(obj); | ||
3594 | |||
3595 | while (obj->pin_count > 0) | 3600 | while (obj->pin_count > 0) |
3596 | i915_gem_object_unpin(obj); | 3601 | i915_gem_object_unpin(obj); |
3597 | 3602 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_debug.c b/drivers/gpu/drm/i915/i915_gem_debug.c index 29d014c48ca2..8da1899bd24f 100644 --- a/drivers/gpu/drm/i915/i915_gem_debug.c +++ b/drivers/gpu/drm/i915/i915_gem_debug.c | |||
@@ -134,51 +134,6 @@ i915_verify_lists(struct drm_device *dev) | |||
134 | } | 134 | } |
135 | #endif /* WATCH_INACTIVE */ | 135 | #endif /* WATCH_INACTIVE */ |
136 | 136 | ||
137 | |||
138 | #if WATCH_EXEC | WATCH_PWRITE | ||
139 | static void | ||
140 | i915_gem_dump_page(struct page *page, uint32_t start, uint32_t end, | ||
141 | uint32_t bias, uint32_t mark) | ||
142 | { | ||
143 | uint32_t *mem = kmap_atomic(page, KM_USER0); | ||
144 | int i; | ||
145 | for (i = start; i < end; i += 4) | ||
146 | DRM_INFO("%08x: %08x%s\n", | ||
147 | (int) (bias + i), mem[i / 4], | ||
148 | (bias + i == mark) ? " ********" : ""); | ||
149 | kunmap_atomic(mem, KM_USER0); | ||
150 | /* give syslog time to catch up */ | ||
151 | msleep(1); | ||
152 | } | ||
153 | |||
154 | void | ||
155 | i915_gem_dump_object(struct drm_i915_gem_object *obj, int len, | ||
156 | const char *where, uint32_t mark) | ||
157 | { | ||
158 | int page; | ||
159 | |||
160 | DRM_INFO("%s: object at offset %08x\n", where, obj->gtt_offset); | ||
161 | for (page = 0; page < (len + PAGE_SIZE-1) / PAGE_SIZE; page++) { | ||
162 | int page_len, chunk, chunk_len; | ||
163 | |||
164 | page_len = len - page * PAGE_SIZE; | ||
165 | if (page_len > PAGE_SIZE) | ||
166 | page_len = PAGE_SIZE; | ||
167 | |||
168 | for (chunk = 0; chunk < page_len; chunk += 128) { | ||
169 | chunk_len = page_len - chunk; | ||
170 | if (chunk_len > 128) | ||
171 | chunk_len = 128; | ||
172 | i915_gem_dump_page(obj->pages[page], | ||
173 | chunk, chunk + chunk_len, | ||
174 | obj->gtt_offset + | ||
175 | page * PAGE_SIZE, | ||
176 | mark); | ||
177 | } | ||
178 | } | ||
179 | } | ||
180 | #endif | ||
181 | |||
182 | #if WATCH_COHERENCY | 137 | #if WATCH_COHERENCY |
183 | void | 138 | void |
184 | i915_gem_object_check_coherency(struct drm_i915_gem_object *obj, int handle) | 139 | i915_gem_object_check_coherency(struct drm_i915_gem_object *obj, int handle) |
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index 3d39005540aa..da05a2692a75 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include "drm.h" | 30 | #include "drm.h" |
31 | #include "i915_drv.h" | 31 | #include "i915_drv.h" |
32 | #include "i915_drm.h" | 32 | #include "i915_drm.h" |
33 | #include "i915_trace.h" | ||
33 | 34 | ||
34 | static bool | 35 | static bool |
35 | mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind) | 36 | mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind) |
@@ -63,6 +64,8 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, | |||
63 | return 0; | 64 | return 0; |
64 | } | 65 | } |
65 | 66 | ||
67 | trace_i915_gem_evict(dev, min_size, alignment, mappable); | ||
68 | |||
66 | /* | 69 | /* |
67 | * The goal is to evict objects and amalgamate space in LRU order. | 70 | * The goal is to evict objects and amalgamate space in LRU order. |
68 | * The oldest idle objects reside on the inactive list, which is in | 71 | * The oldest idle objects reside on the inactive list, which is in |
@@ -189,6 +192,8 @@ i915_gem_evict_everything(struct drm_device *dev, bool purgeable_only) | |||
189 | if (lists_empty) | 192 | if (lists_empty) |
190 | return -ENOSPC; | 193 | return -ENOSPC; |
191 | 194 | ||
195 | trace_i915_gem_evict_everything(dev, purgeable_only); | ||
196 | |||
192 | /* Flush everything (on to the inactive lists) and evict */ | 197 | /* Flush everything (on to the inactive lists) and evict */ |
193 | ret = i915_gpu_idle(dev); | 198 | ret = i915_gpu_idle(dev); |
194 | if (ret) | 199 | if (ret) |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index d2f445e825f2..84fa24e6cca8 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -282,21 +282,6 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, | |||
282 | 282 | ||
283 | target_offset = to_intel_bo(target_obj)->gtt_offset; | 283 | target_offset = to_intel_bo(target_obj)->gtt_offset; |
284 | 284 | ||
285 | #if WATCH_RELOC | ||
286 | DRM_INFO("%s: obj %p offset %08x target %d " | ||
287 | "read %08x write %08x gtt %08x " | ||
288 | "presumed %08x delta %08x\n", | ||
289 | __func__, | ||
290 | obj, | ||
291 | (int) reloc->offset, | ||
292 | (int) reloc->target_handle, | ||
293 | (int) reloc->read_domains, | ||
294 | (int) reloc->write_domain, | ||
295 | (int) target_offset, | ||
296 | (int) reloc->presumed_offset, | ||
297 | reloc->delta); | ||
298 | #endif | ||
299 | |||
300 | /* The target buffer should have appeared before us in the | 285 | /* The target buffer should have appeared before us in the |
301 | * exec_object list, so it should have a GTT space bound by now. | 286 | * exec_object list, so it should have a GTT space bound by now. |
302 | */ | 287 | */ |
@@ -690,8 +675,6 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, | |||
690 | /* reacquire the objects */ | 675 | /* reacquire the objects */ |
691 | eb_reset(eb); | 676 | eb_reset(eb); |
692 | for (i = 0; i < count; i++) { | 677 | for (i = 0; i < count; i++) { |
693 | struct drm_i915_gem_object *obj; | ||
694 | |||
695 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, | 678 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, |
696 | exec[i].handle)); | 679 | exec[i].handle)); |
697 | if (obj == NULL) { | 680 | if (obj == NULL) { |
@@ -749,8 +732,7 @@ i915_gem_execbuffer_flush(struct drm_device *dev, | |||
749 | if ((flush_domains | invalidate_domains) & I915_GEM_GPU_DOMAINS) { | 732 | if ((flush_domains | invalidate_domains) & I915_GEM_GPU_DOMAINS) { |
750 | for (i = 0; i < I915_NUM_RINGS; i++) | 733 | for (i = 0; i < I915_NUM_RINGS; i++) |
751 | if (flush_rings & (1 << i)) { | 734 | if (flush_rings & (1 << i)) { |
752 | ret = i915_gem_flush_ring(dev, | 735 | ret = i915_gem_flush_ring(&dev_priv->ring[i], |
753 | &dev_priv->ring[i], | ||
754 | invalidate_domains, | 736 | invalidate_domains, |
755 | flush_domains); | 737 | flush_domains); |
756 | if (ret) | 738 | if (ret) |
@@ -789,7 +771,7 @@ i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, | |||
789 | if (request == NULL) | 771 | if (request == NULL) |
790 | return -ENOMEM; | 772 | return -ENOMEM; |
791 | 773 | ||
792 | ret = i915_add_request(obj->base.dev, NULL, request, from); | 774 | ret = i915_add_request(from, NULL, request); |
793 | if (ret) { | 775 | if (ret) { |
794 | kfree(request); | 776 | kfree(request); |
795 | return ret; | 777 | return ret; |
@@ -817,12 +799,6 @@ i915_gem_execbuffer_move_to_gpu(struct intel_ring_buffer *ring, | |||
817 | i915_gem_object_set_to_gpu_domain(obj, ring, &cd); | 799 | i915_gem_object_set_to_gpu_domain(obj, ring, &cd); |
818 | 800 | ||
819 | if (cd.invalidate_domains | cd.flush_domains) { | 801 | if (cd.invalidate_domains | cd.flush_domains) { |
820 | #if WATCH_EXEC | ||
821 | DRM_INFO("%s: invalidate_domains %08x flush_domains %08x\n", | ||
822 | __func__, | ||
823 | cd.invalidate_domains, | ||
824 | cd.flush_domains); | ||
825 | #endif | ||
826 | ret = i915_gem_execbuffer_flush(ring->dev, | 802 | ret = i915_gem_execbuffer_flush(ring->dev, |
827 | cd.invalidate_domains, | 803 | cd.invalidate_domains, |
828 | cd.flush_domains, | 804 | cd.flush_domains, |
@@ -926,6 +902,10 @@ i915_gem_execbuffer_move_to_active(struct list_head *objects, | |||
926 | struct drm_i915_gem_object *obj; | 902 | struct drm_i915_gem_object *obj; |
927 | 903 | ||
928 | list_for_each_entry(obj, objects, exec_list) { | 904 | list_for_each_entry(obj, objects, exec_list) { |
905 | u32 old_read = obj->base.read_domains; | ||
906 | u32 old_write = obj->base.write_domain; | ||
907 | |||
908 | |||
929 | obj->base.read_domains = obj->base.pending_read_domains; | 909 | obj->base.read_domains = obj->base.pending_read_domains; |
930 | obj->base.write_domain = obj->base.pending_write_domain; | 910 | obj->base.write_domain = obj->base.pending_write_domain; |
931 | obj->fenced_gpu_access = obj->pending_fenced_gpu_access; | 911 | obj->fenced_gpu_access = obj->pending_fenced_gpu_access; |
@@ -939,9 +919,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *objects, | |||
939 | intel_mark_busy(ring->dev, obj); | 919 | intel_mark_busy(ring->dev, obj); |
940 | } | 920 | } |
941 | 921 | ||
942 | trace_i915_gem_object_change_domain(obj, | 922 | trace_i915_gem_object_change_domain(obj, old_read, old_write); |
943 | obj->base.read_domains, | ||
944 | obj->base.write_domain); | ||
945 | } | 923 | } |
946 | } | 924 | } |
947 | 925 | ||
@@ -963,14 +941,14 @@ i915_gem_execbuffer_retire_commands(struct drm_device *dev, | |||
963 | if (INTEL_INFO(dev)->gen >= 4) | 941 | if (INTEL_INFO(dev)->gen >= 4) |
964 | invalidate |= I915_GEM_DOMAIN_SAMPLER; | 942 | invalidate |= I915_GEM_DOMAIN_SAMPLER; |
965 | if (ring->flush(ring, invalidate, 0)) { | 943 | if (ring->flush(ring, invalidate, 0)) { |
966 | i915_gem_next_request_seqno(dev, ring); | 944 | i915_gem_next_request_seqno(ring); |
967 | return; | 945 | return; |
968 | } | 946 | } |
969 | 947 | ||
970 | /* Add a breadcrumb for the completion of the batch buffer */ | 948 | /* Add a breadcrumb for the completion of the batch buffer */ |
971 | request = kzalloc(sizeof(*request), GFP_KERNEL); | 949 | request = kzalloc(sizeof(*request), GFP_KERNEL); |
972 | if (request == NULL || i915_add_request(dev, file, request, ring)) { | 950 | if (request == NULL || i915_add_request(ring, file, request)) { |
973 | i915_gem_next_request_seqno(dev, ring); | 951 | i915_gem_next_request_seqno(ring); |
974 | kfree(request); | 952 | kfree(request); |
975 | } | 953 | } |
976 | } | 954 | } |
@@ -1000,10 +978,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
1000 | if (ret) | 978 | if (ret) |
1001 | return ret; | 979 | return ret; |
1002 | 980 | ||
1003 | #if WATCH_EXEC | ||
1004 | DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", | ||
1005 | (int) args->buffers_ptr, args->buffer_count, args->batch_len); | ||
1006 | #endif | ||
1007 | switch (args->flags & I915_EXEC_RING_MASK) { | 981 | switch (args->flags & I915_EXEC_RING_MASK) { |
1008 | case I915_EXEC_DEFAULT: | 982 | case I915_EXEC_DEFAULT: |
1009 | case I915_EXEC_RENDER: | 983 | case I915_EXEC_RENDER: |
@@ -1174,7 +1148,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
1174 | if (ret) | 1148 | if (ret) |
1175 | goto err; | 1149 | goto err; |
1176 | 1150 | ||
1177 | seqno = i915_gem_next_request_seqno(dev, ring); | 1151 | seqno = i915_gem_next_request_seqno(ring); |
1178 | for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++) { | 1152 | for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++) { |
1179 | if (seqno < ring->sync_seqno[i]) { | 1153 | if (seqno < ring->sync_seqno[i]) { |
1180 | /* The GPU can not handle its semaphore value wrapping, | 1154 | /* The GPU can not handle its semaphore value wrapping, |
@@ -1189,6 +1163,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | |||
1189 | } | 1163 | } |
1190 | } | 1164 | } |
1191 | 1165 | ||
1166 | trace_i915_gem_ring_dispatch(ring, seqno); | ||
1167 | |||
1192 | exec_start = batch_obj->gtt_offset + args->batch_start_offset; | 1168 | exec_start = batch_obj->gtt_offset + args->batch_start_offset; |
1193 | exec_len = args->batch_len; | 1169 | exec_len = args->batch_len; |
1194 | if (cliprects) { | 1170 | if (cliprects) { |
@@ -1245,11 +1221,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, | |||
1245 | struct drm_i915_gem_exec_object2 *exec2_list = NULL; | 1221 | struct drm_i915_gem_exec_object2 *exec2_list = NULL; |
1246 | int ret, i; | 1222 | int ret, i; |
1247 | 1223 | ||
1248 | #if WATCH_EXEC | ||
1249 | DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", | ||
1250 | (int) args->buffers_ptr, args->buffer_count, args->batch_len); | ||
1251 | #endif | ||
1252 | |||
1253 | if (args->buffer_count < 1) { | 1224 | if (args->buffer_count < 1) { |
1254 | DRM_ERROR("execbuf with %d buffers\n", args->buffer_count); | 1225 | DRM_ERROR("execbuf with %d buffers\n", args->buffer_count); |
1255 | return -EINVAL; | 1226 | return -EINVAL; |
@@ -1330,11 +1301,6 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data, | |||
1330 | struct drm_i915_gem_exec_object2 *exec2_list = NULL; | 1301 | struct drm_i915_gem_exec_object2 *exec2_list = NULL; |
1331 | int ret; | 1302 | int ret; |
1332 | 1303 | ||
1333 | #if WATCH_EXEC | ||
1334 | DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", | ||
1335 | (int) args->buffers_ptr, args->buffer_count, args->batch_len); | ||
1336 | #endif | ||
1337 | |||
1338 | if (args->buffer_count < 1) { | 1304 | if (args->buffer_count < 1) { |
1339 | DRM_ERROR("execbuf2 with %d buffers\n", args->buffer_count); | 1305 | DRM_ERROR("execbuf2 with %d buffers\n", args->buffer_count); |
1340 | return -EINVAL; | 1306 | return -EINVAL; |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 22a32b9932c5..a093d67b94e2 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
@@ -284,11 +284,6 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, | |||
284 | struct drm_i915_gem_set_tiling *args = data; | 284 | struct drm_i915_gem_set_tiling *args = data; |
285 | drm_i915_private_t *dev_priv = dev->dev_private; | 285 | drm_i915_private_t *dev_priv = dev->dev_private; |
286 | struct drm_i915_gem_object *obj; | 286 | struct drm_i915_gem_object *obj; |
287 | int ret; | ||
288 | |||
289 | ret = i915_gem_check_is_wedged(dev); | ||
290 | if (ret) | ||
291 | return ret; | ||
292 | 287 | ||
293 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); | 288 | obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle)); |
294 | if (obj == NULL) | 289 | if (obj == NULL) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 8a9e08bf1cf7..346dd85cbbd3 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -85,21 +85,11 @@ ironlake_disable_display_irq(drm_i915_private_t *dev_priv, u32 mask) | |||
85 | } | 85 | } |
86 | } | 86 | } |
87 | 87 | ||
88 | static inline u32 | ||
89 | i915_pipestat(int pipe) | ||
90 | { | ||
91 | if (pipe == 0) | ||
92 | return PIPEASTAT; | ||
93 | if (pipe == 1) | ||
94 | return PIPEBSTAT; | ||
95 | BUG(); | ||
96 | } | ||
97 | |||
98 | void | 88 | void |
99 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | 89 | i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) |
100 | { | 90 | { |
101 | if ((dev_priv->pipestat[pipe] & mask) != mask) { | 91 | if ((dev_priv->pipestat[pipe] & mask) != mask) { |
102 | u32 reg = i915_pipestat(pipe); | 92 | u32 reg = PIPESTAT(pipe); |
103 | 93 | ||
104 | dev_priv->pipestat[pipe] |= mask; | 94 | dev_priv->pipestat[pipe] |= mask; |
105 | /* Enable the interrupt, clear any pending status */ | 95 | /* Enable the interrupt, clear any pending status */ |
@@ -112,7 +102,7 @@ void | |||
112 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) | 102 | i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) |
113 | { | 103 | { |
114 | if ((dev_priv->pipestat[pipe] & mask) != 0) { | 104 | if ((dev_priv->pipestat[pipe] & mask) != 0) { |
115 | u32 reg = i915_pipestat(pipe); | 105 | u32 reg = PIPESTAT(pipe); |
116 | 106 | ||
117 | dev_priv->pipestat[pipe] &= ~mask; | 107 | dev_priv->pipestat[pipe] &= ~mask; |
118 | I915_WRITE(reg, dev_priv->pipestat[pipe]); | 108 | I915_WRITE(reg, dev_priv->pipestat[pipe]); |
@@ -171,12 +161,12 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) | |||
171 | 161 | ||
172 | if (!i915_pipe_enabled(dev, pipe)) { | 162 | if (!i915_pipe_enabled(dev, pipe)) { |
173 | DRM_DEBUG_DRIVER("trying to get vblank count for disabled " | 163 | DRM_DEBUG_DRIVER("trying to get vblank count for disabled " |
174 | "pipe %d\n", pipe); | 164 | "pipe %c\n", pipe_name(pipe)); |
175 | return 0; | 165 | return 0; |
176 | } | 166 | } |
177 | 167 | ||
178 | high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH; | 168 | high_frame = PIPEFRAME(pipe); |
179 | low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL; | 169 | low_frame = PIPEFRAMEPIXEL(pipe); |
180 | 170 | ||
181 | /* | 171 | /* |
182 | * High & low register fields aren't synchronized, so make sure | 172 | * High & low register fields aren't synchronized, so make sure |
@@ -197,11 +187,11 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) | |||
197 | u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) | 187 | u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) |
198 | { | 188 | { |
199 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 189 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
200 | int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45; | 190 | int reg = PIPE_FRMCOUNT_GM45(pipe); |
201 | 191 | ||
202 | if (!i915_pipe_enabled(dev, pipe)) { | 192 | if (!i915_pipe_enabled(dev, pipe)) { |
203 | DRM_DEBUG_DRIVER("trying to get vblank count for disabled " | 193 | DRM_DEBUG_DRIVER("trying to get vblank count for disabled " |
204 | "pipe %d\n", pipe); | 194 | "pipe %c\n", pipe_name(pipe)); |
205 | return 0; | 195 | return 0; |
206 | } | 196 | } |
207 | 197 | ||
@@ -219,7 +209,7 @@ int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, | |||
219 | 209 | ||
220 | if (!i915_pipe_enabled(dev, pipe)) { | 210 | if (!i915_pipe_enabled(dev, pipe)) { |
221 | DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled " | 211 | DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled " |
222 | "pipe %d\n", pipe); | 212 | "pipe %c\n", pipe_name(pipe)); |
223 | return 0; | 213 | return 0; |
224 | } | 214 | } |
225 | 215 | ||
@@ -367,7 +357,7 @@ static void notify_ring(struct drm_device *dev, | |||
367 | return; | 357 | return; |
368 | 358 | ||
369 | seqno = ring->get_seqno(ring); | 359 | seqno = ring->get_seqno(ring); |
370 | trace_i915_gem_request_complete(dev, seqno); | 360 | trace_i915_gem_request_complete(ring, seqno); |
371 | 361 | ||
372 | ring->irq_seqno = seqno; | 362 | ring->irq_seqno = seqno; |
373 | wake_up_all(&ring->irq_queue); | 363 | wake_up_all(&ring->irq_queue); |
@@ -419,6 +409,7 @@ static void pch_irq_handler(struct drm_device *dev) | |||
419 | { | 409 | { |
420 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 410 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
421 | u32 pch_iir; | 411 | u32 pch_iir; |
412 | int pipe; | ||
422 | 413 | ||
423 | pch_iir = I915_READ(SDEIIR); | 414 | pch_iir = I915_READ(SDEIIR); |
424 | 415 | ||
@@ -439,13 +430,11 @@ static void pch_irq_handler(struct drm_device *dev) | |||
439 | if (pch_iir & SDE_POISON) | 430 | if (pch_iir & SDE_POISON) |
440 | DRM_ERROR("PCH poison interrupt\n"); | 431 | DRM_ERROR("PCH poison interrupt\n"); |
441 | 432 | ||
442 | if (pch_iir & SDE_FDI_MASK) { | 433 | if (pch_iir & SDE_FDI_MASK) |
443 | u32 fdia, fdib; | 434 | for_each_pipe(pipe) |
444 | 435 | DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n", | |
445 | fdia = I915_READ(FDI_RXA_IIR); | 436 | pipe_name(pipe), |
446 | fdib = I915_READ(FDI_RXB_IIR); | 437 | I915_READ(FDI_RX_IIR(pipe))); |
447 | DRM_DEBUG_DRIVER("PCH FDI RX interrupt; FDI RXA IIR: 0x%08x, FDI RXB IIR: 0x%08x\n", fdia, fdib); | ||
448 | } | ||
449 | 438 | ||
450 | if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE)) | 439 | if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE)) |
451 | DRM_DEBUG_DRIVER("PCH transcoder CRC done interrupt\n"); | 440 | DRM_DEBUG_DRIVER("PCH transcoder CRC done interrupt\n"); |
@@ -650,9 +639,14 @@ static void | |||
650 | i915_error_state_free(struct drm_device *dev, | 639 | i915_error_state_free(struct drm_device *dev, |
651 | struct drm_i915_error_state *error) | 640 | struct drm_i915_error_state *error) |
652 | { | 641 | { |
653 | i915_error_object_free(error->batchbuffer[0]); | 642 | int i; |
654 | i915_error_object_free(error->batchbuffer[1]); | 643 | |
655 | i915_error_object_free(error->ringbuffer); | 644 | for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++) |
645 | i915_error_object_free(error->batchbuffer[i]); | ||
646 | |||
647 | for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++) | ||
648 | i915_error_object_free(error->ringbuffer[i]); | ||
649 | |||
656 | kfree(error->active_bo); | 650 | kfree(error->active_bo); |
657 | kfree(error->overlay); | 651 | kfree(error->overlay); |
658 | kfree(error); | 652 | kfree(error); |
@@ -767,7 +761,7 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
767 | struct drm_i915_gem_object *obj; | 761 | struct drm_i915_gem_object *obj; |
768 | struct drm_i915_error_state *error; | 762 | struct drm_i915_error_state *error; |
769 | unsigned long flags; | 763 | unsigned long flags; |
770 | int i; | 764 | int i, pipe; |
771 | 765 | ||
772 | spin_lock_irqsave(&dev_priv->error_lock, flags); | 766 | spin_lock_irqsave(&dev_priv->error_lock, flags); |
773 | error = dev_priv->first_error; | 767 | error = dev_priv->first_error; |
@@ -775,19 +769,21 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
775 | if (error) | 769 | if (error) |
776 | return; | 770 | return; |
777 | 771 | ||
772 | /* Account for pipe specific data like PIPE*STAT */ | ||
778 | error = kmalloc(sizeof(*error), GFP_ATOMIC); | 773 | error = kmalloc(sizeof(*error), GFP_ATOMIC); |
779 | if (!error) { | 774 | if (!error) { |
780 | DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); | 775 | DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); |
781 | return; | 776 | return; |
782 | } | 777 | } |
783 | 778 | ||
784 | DRM_DEBUG_DRIVER("generating error event\n"); | 779 | DRM_INFO("capturing error event; look for more information in /debug/dri/%d/i915_error_state\n", |
780 | dev->primary->index); | ||
785 | 781 | ||
786 | error->seqno = dev_priv->ring[RCS].get_seqno(&dev_priv->ring[RCS]); | 782 | error->seqno = dev_priv->ring[RCS].get_seqno(&dev_priv->ring[RCS]); |
787 | error->eir = I915_READ(EIR); | 783 | error->eir = I915_READ(EIR); |
788 | error->pgtbl_er = I915_READ(PGTBL_ER); | 784 | error->pgtbl_er = I915_READ(PGTBL_ER); |
789 | error->pipeastat = I915_READ(PIPEASTAT); | 785 | for_each_pipe(pipe) |
790 | error->pipebstat = I915_READ(PIPEBSTAT); | 786 | error->pipestat[pipe] = I915_READ(PIPESTAT(pipe)); |
791 | error->instpm = I915_READ(INSTPM); | 787 | error->instpm = I915_READ(INSTPM); |
792 | error->error = 0; | 788 | error->error = 0; |
793 | if (INTEL_INFO(dev)->gen >= 6) { | 789 | if (INTEL_INFO(dev)->gen >= 6) { |
@@ -826,15 +822,16 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
826 | } | 822 | } |
827 | i915_gem_record_fences(dev, error); | 823 | i915_gem_record_fences(dev, error); |
828 | 824 | ||
829 | /* Record the active batchbuffers */ | 825 | /* Record the active batch and ring buffers */ |
830 | for (i = 0; i < I915_NUM_RINGS; i++) | 826 | for (i = 0; i < I915_NUM_RINGS; i++) { |
831 | error->batchbuffer[i] = | 827 | error->batchbuffer[i] = |
832 | i915_error_first_batchbuffer(dev_priv, | 828 | i915_error_first_batchbuffer(dev_priv, |
833 | &dev_priv->ring[i]); | 829 | &dev_priv->ring[i]); |
834 | 830 | ||
835 | /* Record the ringbuffer */ | 831 | error->ringbuffer[i] = |
836 | error->ringbuffer = i915_error_object_create(dev_priv, | 832 | i915_error_object_create(dev_priv, |
837 | dev_priv->ring[RCS].obj); | 833 | dev_priv->ring[i].obj); |
834 | } | ||
838 | 835 | ||
839 | /* Record buffers on the active and pinned lists. */ | 836 | /* Record buffers on the active and pinned lists. */ |
840 | error->active_bo = NULL; | 837 | error->active_bo = NULL; |
@@ -907,6 +904,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev) | |||
907 | { | 904 | { |
908 | struct drm_i915_private *dev_priv = dev->dev_private; | 905 | struct drm_i915_private *dev_priv = dev->dev_private; |
909 | u32 eir = I915_READ(EIR); | 906 | u32 eir = I915_READ(EIR); |
907 | int pipe; | ||
910 | 908 | ||
911 | if (!eir) | 909 | if (!eir) |
912 | return; | 910 | return; |
@@ -955,14 +953,10 @@ static void i915_report_and_clear_eir(struct drm_device *dev) | |||
955 | } | 953 | } |
956 | 954 | ||
957 | if (eir & I915_ERROR_MEMORY_REFRESH) { | 955 | if (eir & I915_ERROR_MEMORY_REFRESH) { |
958 | u32 pipea_stats = I915_READ(PIPEASTAT); | 956 | printk(KERN_ERR "memory refresh error:\n"); |
959 | u32 pipeb_stats = I915_READ(PIPEBSTAT); | 957 | for_each_pipe(pipe) |
960 | 958 | printk(KERN_ERR "pipe %c stat: 0x%08x\n", | |
961 | printk(KERN_ERR "memory refresh error\n"); | 959 | pipe_name(pipe), I915_READ(PIPESTAT(pipe))); |
962 | printk(KERN_ERR "PIPEASTAT: 0x%08x\n", | ||
963 | pipea_stats); | ||
964 | printk(KERN_ERR "PIPEBSTAT: 0x%08x\n", | ||
965 | pipeb_stats); | ||
966 | /* pipestat has already been acked */ | 960 | /* pipestat has already been acked */ |
967 | } | 961 | } |
968 | if (eir & I915_ERROR_INSTRUCTION) { | 962 | if (eir & I915_ERROR_INSTRUCTION) { |
@@ -1076,10 +1070,10 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) | |||
1076 | /* Potential stall - if we see that the flip has happened, assume a missed interrupt */ | 1070 | /* Potential stall - if we see that the flip has happened, assume a missed interrupt */ |
1077 | obj = work->pending_flip_obj; | 1071 | obj = work->pending_flip_obj; |
1078 | if (INTEL_INFO(dev)->gen >= 4) { | 1072 | if (INTEL_INFO(dev)->gen >= 4) { |
1079 | int dspsurf = intel_crtc->plane == 0 ? DSPASURF : DSPBSURF; | 1073 | int dspsurf = DSPSURF(intel_crtc->plane); |
1080 | stall_detected = I915_READ(dspsurf) == obj->gtt_offset; | 1074 | stall_detected = I915_READ(dspsurf) == obj->gtt_offset; |
1081 | } else { | 1075 | } else { |
1082 | int dspaddr = intel_crtc->plane == 0 ? DSPAADDR : DSPBADDR; | 1076 | int dspaddr = DSPADDR(intel_crtc->plane); |
1083 | stall_detected = I915_READ(dspaddr) == (obj->gtt_offset + | 1077 | stall_detected = I915_READ(dspaddr) == (obj->gtt_offset + |
1084 | crtc->y * crtc->fb->pitch + | 1078 | crtc->y * crtc->fb->pitch + |
1085 | crtc->x * crtc->fb->bits_per_pixel/8); | 1079 | crtc->x * crtc->fb->bits_per_pixel/8); |
@@ -1099,12 +1093,13 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
1099 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1093 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1100 | struct drm_i915_master_private *master_priv; | 1094 | struct drm_i915_master_private *master_priv; |
1101 | u32 iir, new_iir; | 1095 | u32 iir, new_iir; |
1102 | u32 pipea_stats, pipeb_stats; | 1096 | u32 pipe_stats[I915_MAX_PIPES]; |
1103 | u32 vblank_status; | 1097 | u32 vblank_status; |
1104 | int vblank = 0; | 1098 | int vblank = 0; |
1105 | unsigned long irqflags; | 1099 | unsigned long irqflags; |
1106 | int irq_received; | 1100 | int irq_received; |
1107 | int ret = IRQ_NONE; | 1101 | int ret = IRQ_NONE, pipe; |
1102 | bool blc_event = false; | ||
1108 | 1103 | ||
1109 | atomic_inc(&dev_priv->irq_received); | 1104 | atomic_inc(&dev_priv->irq_received); |
1110 | 1105 | ||
@@ -1127,27 +1122,23 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
1127 | * interrupts (for non-MSI). | 1122 | * interrupts (for non-MSI). |
1128 | */ | 1123 | */ |
1129 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 1124 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
1130 | pipea_stats = I915_READ(PIPEASTAT); | ||
1131 | pipeb_stats = I915_READ(PIPEBSTAT); | ||
1132 | |||
1133 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) | 1125 | if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
1134 | i915_handle_error(dev, false); | 1126 | i915_handle_error(dev, false); |
1135 | 1127 | ||
1136 | /* | 1128 | for_each_pipe(pipe) { |
1137 | * Clear the PIPE(A|B)STAT regs before the IIR | 1129 | int reg = PIPESTAT(pipe); |
1138 | */ | 1130 | pipe_stats[pipe] = I915_READ(reg); |
1139 | if (pipea_stats & 0x8000ffff) { | 1131 | |
1140 | if (pipea_stats & PIPE_FIFO_UNDERRUN_STATUS) | 1132 | /* |
1141 | DRM_DEBUG_DRIVER("pipe a underrun\n"); | 1133 | * Clear the PIPE*STAT regs before the IIR |
1142 | I915_WRITE(PIPEASTAT, pipea_stats); | 1134 | */ |
1143 | irq_received = 1; | 1135 | if (pipe_stats[pipe] & 0x8000ffff) { |
1144 | } | 1136 | if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS) |
1145 | 1137 | DRM_DEBUG_DRIVER("pipe %c underrun\n", | |
1146 | if (pipeb_stats & 0x8000ffff) { | 1138 | pipe_name(pipe)); |
1147 | if (pipeb_stats & PIPE_FIFO_UNDERRUN_STATUS) | 1139 | I915_WRITE(reg, pipe_stats[pipe]); |
1148 | DRM_DEBUG_DRIVER("pipe b underrun\n"); | 1140 | irq_received = 1; |
1149 | I915_WRITE(PIPEBSTAT, pipeb_stats); | 1141 | } |
1150 | irq_received = 1; | ||
1151 | } | 1142 | } |
1152 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | 1143 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
1153 | 1144 | ||
@@ -1198,27 +1189,22 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) | |||
1198 | intel_finish_page_flip_plane(dev, 1); | 1189 | intel_finish_page_flip_plane(dev, 1); |
1199 | } | 1190 | } |
1200 | 1191 | ||
1201 | if (pipea_stats & vblank_status && | 1192 | for_each_pipe(pipe) { |
1202 | drm_handle_vblank(dev, 0)) { | 1193 | if (pipe_stats[pipe] & vblank_status && |
1203 | vblank++; | 1194 | drm_handle_vblank(dev, pipe)) { |
1204 | if (!dev_priv->flip_pending_is_done) { | 1195 | vblank++; |
1205 | i915_pageflip_stall_check(dev, 0); | 1196 | if (!dev_priv->flip_pending_is_done) { |
1206 | intel_finish_page_flip(dev, 0); | 1197 | i915_pageflip_stall_check(dev, pipe); |
1198 | intel_finish_page_flip(dev, pipe); | ||
1199 | } | ||
1207 | } | 1200 | } |
1208 | } | ||
1209 | 1201 | ||
1210 | if (pipeb_stats & vblank_status && | 1202 | if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) |
1211 | drm_handle_vblank(dev, 1)) { | 1203 | blc_event = true; |
1212 | vblank++; | ||
1213 | if (!dev_priv->flip_pending_is_done) { | ||
1214 | i915_pageflip_stall_check(dev, 1); | ||
1215 | intel_finish_page_flip(dev, 1); | ||
1216 | } | ||
1217 | } | 1204 | } |
1218 | 1205 | ||
1219 | if ((pipea_stats & PIPE_LEGACY_BLC_EVENT_STATUS) || | 1206 | |
1220 | (pipeb_stats & PIPE_LEGACY_BLC_EVENT_STATUS) || | 1207 | if (blc_event || (iir & I915_ASLE_INTERRUPT)) |
1221 | (iir & I915_ASLE_INTERRUPT)) | ||
1222 | intel_opregion_asle_intr(dev); | 1208 | intel_opregion_asle_intr(dev); |
1223 | 1209 | ||
1224 | /* With MSI, interrupts are only generated when iir | 1210 | /* With MSI, interrupts are only generated when iir |
@@ -1268,16 +1254,6 @@ static int i915_emit_irq(struct drm_device * dev) | |||
1268 | return dev_priv->counter; | 1254 | return dev_priv->counter; |
1269 | } | 1255 | } |
1270 | 1256 | ||
1271 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno) | ||
1272 | { | ||
1273 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | ||
1274 | struct intel_ring_buffer *ring = LP_RING(dev_priv); | ||
1275 | |||
1276 | if (dev_priv->trace_irq_seqno == 0 && | ||
1277 | ring->irq_get(ring)) | ||
1278 | dev_priv->trace_irq_seqno = seqno; | ||
1279 | } | ||
1280 | |||
1281 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) | 1257 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) |
1282 | { | 1258 | { |
1283 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1259 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
@@ -1356,6 +1332,22 @@ int i915_irq_wait(struct drm_device *dev, void *data, | |||
1356 | return i915_wait_irq(dev, irqwait->irq_seq); | 1332 | return i915_wait_irq(dev, irqwait->irq_seq); |
1357 | } | 1333 | } |
1358 | 1334 | ||
1335 | static void i915_vblank_work_func(struct work_struct *work) | ||
1336 | { | ||
1337 | drm_i915_private_t *dev_priv = | ||
1338 | container_of(work, drm_i915_private_t, vblank_work); | ||
1339 | |||
1340 | if (atomic_read(&dev_priv->vblank_enabled)) { | ||
1341 | if (!dev_priv->vblank_pm_qos.pm_qos_class) | ||
1342 | pm_qos_add_request(&dev_priv->vblank_pm_qos, | ||
1343 | PM_QOS_CPU_DMA_LATENCY, | ||
1344 | 15); //>=20 won't work | ||
1345 | } else { | ||
1346 | if (dev_priv->vblank_pm_qos.pm_qos_class) | ||
1347 | pm_qos_remove_request(&dev_priv->vblank_pm_qos); | ||
1348 | } | ||
1349 | } | ||
1350 | |||
1359 | /* Called from drm generic code, passed 'crtc' which | 1351 | /* Called from drm generic code, passed 'crtc' which |
1360 | * we use as a pipe index | 1352 | * we use as a pipe index |
1361 | */ | 1353 | */ |
@@ -1378,6 +1370,16 @@ int i915_enable_vblank(struct drm_device *dev, int pipe) | |||
1378 | i915_enable_pipestat(dev_priv, pipe, | 1370 | i915_enable_pipestat(dev_priv, pipe, |
1379 | PIPE_VBLANK_INTERRUPT_ENABLE); | 1371 | PIPE_VBLANK_INTERRUPT_ENABLE); |
1380 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | 1372 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
1373 | |||
1374 | /* gen3 platforms have an issue with vsync interrupts not reaching | ||
1375 | * cpu during deep c-state sleep (>C1), so we need to install a | ||
1376 | * PM QoS handle to prevent C-state starvation of the GPU. | ||
1377 | */ | ||
1378 | if (dev_priv->info->gen == 3 && !dev_priv->info->is_g33) { | ||
1379 | atomic_inc(&dev_priv->vblank_enabled); | ||
1380 | queue_work(dev_priv->wq, &dev_priv->vblank_work); | ||
1381 | } | ||
1382 | |||
1381 | return 0; | 1383 | return 0; |
1382 | } | 1384 | } |
1383 | 1385 | ||
@@ -1389,6 +1391,11 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) | |||
1389 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1391 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1390 | unsigned long irqflags; | 1392 | unsigned long irqflags; |
1391 | 1393 | ||
1394 | if (dev_priv->info->gen == 3 && !dev_priv->info->is_g33) { | ||
1395 | atomic_dec(&dev_priv->vblank_enabled); | ||
1396 | queue_work(dev_priv->wq, &dev_priv->vblank_work); | ||
1397 | } | ||
1398 | |||
1392 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | 1399 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); |
1393 | if (HAS_PCH_SPLIT(dev)) | 1400 | if (HAS_PCH_SPLIT(dev)) |
1394 | ironlake_disable_display_irq(dev_priv, (pipe == 0) ? | 1401 | ironlake_disable_display_irq(dev_priv, (pipe == 0) ? |
@@ -1400,16 +1407,6 @@ void i915_disable_vblank(struct drm_device *dev, int pipe) | |||
1400 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | 1407 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); |
1401 | } | 1408 | } |
1402 | 1409 | ||
1403 | void i915_enable_interrupt (struct drm_device *dev) | ||
1404 | { | ||
1405 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1406 | |||
1407 | if (!HAS_PCH_SPLIT(dev)) | ||
1408 | intel_opregion_enable_asle(dev); | ||
1409 | dev_priv->irq_enabled = 1; | ||
1410 | } | ||
1411 | |||
1412 | |||
1413 | /* Set the vblank monitor pipe | 1410 | /* Set the vblank monitor pipe |
1414 | */ | 1411 | */ |
1415 | int i915_vblank_pipe_set(struct drm_device *dev, void *data, | 1412 | int i915_vblank_pipe_set(struct drm_device *dev, void *data, |
@@ -1618,6 +1615,7 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | |||
1618 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; | 1615 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; |
1619 | u32 render_irqs; | 1616 | u32 render_irqs; |
1620 | u32 hotplug_mask; | 1617 | u32 hotplug_mask; |
1618 | int pipe; | ||
1621 | 1619 | ||
1622 | dev_priv->irq_mask = ~display_mask; | 1620 | dev_priv->irq_mask = ~display_mask; |
1623 | 1621 | ||
@@ -1646,12 +1644,16 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | |||
1646 | POSTING_READ(GTIER); | 1644 | POSTING_READ(GTIER); |
1647 | 1645 | ||
1648 | if (HAS_PCH_CPT(dev)) { | 1646 | if (HAS_PCH_CPT(dev)) { |
1649 | hotplug_mask = SDE_CRT_HOTPLUG_CPT | SDE_PORTB_HOTPLUG_CPT | | 1647 | hotplug_mask = (SDE_CRT_HOTPLUG_CPT | |
1650 | SDE_PORTC_HOTPLUG_CPT | SDE_PORTD_HOTPLUG_CPT ; | 1648 | SDE_PORTB_HOTPLUG_CPT | |
1649 | SDE_PORTC_HOTPLUG_CPT | | ||
1650 | SDE_PORTD_HOTPLUG_CPT); | ||
1651 | } else { | 1651 | } else { |
1652 | hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | | 1652 | hotplug_mask = (SDE_CRT_HOTPLUG | |
1653 | SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; | 1653 | SDE_PORTB_HOTPLUG | |
1654 | hotplug_mask |= SDE_AUX_MASK; | 1654 | SDE_PORTC_HOTPLUG | |
1655 | SDE_PORTD_HOTPLUG | | ||
1656 | SDE_AUX_MASK); | ||
1655 | } | 1657 | } |
1656 | 1658 | ||
1657 | dev_priv->pch_irq_mask = ~hotplug_mask; | 1659 | dev_priv->pch_irq_mask = ~hotplug_mask; |
@@ -1674,11 +1676,14 @@ static int ironlake_irq_postinstall(struct drm_device *dev) | |||
1674 | void i915_driver_irq_preinstall(struct drm_device * dev) | 1676 | void i915_driver_irq_preinstall(struct drm_device * dev) |
1675 | { | 1677 | { |
1676 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1678 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1679 | int pipe; | ||
1677 | 1680 | ||
1678 | atomic_set(&dev_priv->irq_received, 0); | 1681 | atomic_set(&dev_priv->irq_received, 0); |
1682 | atomic_set(&dev_priv->vblank_enabled, 0); | ||
1679 | 1683 | ||
1680 | INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); | 1684 | INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); |
1681 | INIT_WORK(&dev_priv->error_work, i915_error_work_func); | 1685 | INIT_WORK(&dev_priv->error_work, i915_error_work_func); |
1686 | INIT_WORK(&dev_priv->vblank_work, i915_vblank_work_func); | ||
1682 | 1687 | ||
1683 | if (HAS_PCH_SPLIT(dev)) { | 1688 | if (HAS_PCH_SPLIT(dev)) { |
1684 | ironlake_irq_preinstall(dev); | 1689 | ironlake_irq_preinstall(dev); |
@@ -1691,8 +1696,8 @@ void i915_driver_irq_preinstall(struct drm_device * dev) | |||
1691 | } | 1696 | } |
1692 | 1697 | ||
1693 | I915_WRITE(HWSTAM, 0xeffe); | 1698 | I915_WRITE(HWSTAM, 0xeffe); |
1694 | I915_WRITE(PIPEASTAT, 0); | 1699 | for_each_pipe(pipe) |
1695 | I915_WRITE(PIPEBSTAT, 0); | 1700 | I915_WRITE(PIPESTAT(pipe), 0); |
1696 | I915_WRITE(IMR, 0xffffffff); | 1701 | I915_WRITE(IMR, 0xffffffff); |
1697 | I915_WRITE(IER, 0x0); | 1702 | I915_WRITE(IER, 0x0); |
1698 | POSTING_READ(IER); | 1703 | POSTING_READ(IER); |
@@ -1804,6 +1809,7 @@ static void ironlake_irq_uninstall(struct drm_device *dev) | |||
1804 | void i915_driver_irq_uninstall(struct drm_device * dev) | 1809 | void i915_driver_irq_uninstall(struct drm_device * dev) |
1805 | { | 1810 | { |
1806 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 1811 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1812 | int pipe; | ||
1807 | 1813 | ||
1808 | if (!dev_priv) | 1814 | if (!dev_priv) |
1809 | return; | 1815 | return; |
@@ -1821,12 +1827,13 @@ void i915_driver_irq_uninstall(struct drm_device * dev) | |||
1821 | } | 1827 | } |
1822 | 1828 | ||
1823 | I915_WRITE(HWSTAM, 0xffffffff); | 1829 | I915_WRITE(HWSTAM, 0xffffffff); |
1824 | I915_WRITE(PIPEASTAT, 0); | 1830 | for_each_pipe(pipe) |
1825 | I915_WRITE(PIPEBSTAT, 0); | 1831 | I915_WRITE(PIPESTAT(pipe), 0); |
1826 | I915_WRITE(IMR, 0xffffffff); | 1832 | I915_WRITE(IMR, 0xffffffff); |
1827 | I915_WRITE(IER, 0x0); | 1833 | I915_WRITE(IER, 0x0); |
1828 | 1834 | ||
1829 | I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); | 1835 | for_each_pipe(pipe) |
1830 | I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); | 1836 | I915_WRITE(PIPESTAT(pipe), |
1837 | I915_READ(PIPESTAT(pipe)) & 0x8000ffff); | ||
1831 | I915_WRITE(IIR, I915_READ(IIR)); | 1838 | I915_WRITE(IIR, I915_READ(IIR)); |
1832 | } | 1839 | } |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 15d94c63918c..139d15234ffb 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -706,9 +706,9 @@ | |||
706 | #define VGA1_PD_P1_DIV_2 (1 << 13) | 706 | #define VGA1_PD_P1_DIV_2 (1 << 13) |
707 | #define VGA1_PD_P1_SHIFT 8 | 707 | #define VGA1_PD_P1_SHIFT 8 |
708 | #define VGA1_PD_P1_MASK (0x1f << 8) | 708 | #define VGA1_PD_P1_MASK (0x1f << 8) |
709 | #define DPLL_A 0x06014 | 709 | #define _DPLL_A 0x06014 |
710 | #define DPLL_B 0x06018 | 710 | #define _DPLL_B 0x06018 |
711 | #define DPLL(pipe) _PIPE(pipe, DPLL_A, DPLL_B) | 711 | #define DPLL(pipe) _PIPE(pipe, _DPLL_A, _DPLL_B) |
712 | #define DPLL_VCO_ENABLE (1 << 31) | 712 | #define DPLL_VCO_ENABLE (1 << 31) |
713 | #define DPLL_DVO_HIGH_SPEED (1 << 30) | 713 | #define DPLL_DVO_HIGH_SPEED (1 << 30) |
714 | #define DPLL_SYNCLOCK_ENABLE (1 << 29) | 714 | #define DPLL_SYNCLOCK_ENABLE (1 << 29) |
@@ -779,7 +779,7 @@ | |||
779 | #define SDVO_MULTIPLIER_MASK 0x000000ff | 779 | #define SDVO_MULTIPLIER_MASK 0x000000ff |
780 | #define SDVO_MULTIPLIER_SHIFT_HIRES 4 | 780 | #define SDVO_MULTIPLIER_SHIFT_HIRES 4 |
781 | #define SDVO_MULTIPLIER_SHIFT_VGA 0 | 781 | #define SDVO_MULTIPLIER_SHIFT_VGA 0 |
782 | #define DPLL_A_MD 0x0601c /* 965+ only */ | 782 | #define _DPLL_A_MD 0x0601c /* 965+ only */ |
783 | /* | 783 | /* |
784 | * UDI pixel divider, controlling how many pixels are stuffed into a packet. | 784 | * UDI pixel divider, controlling how many pixels are stuffed into a packet. |
785 | * | 785 | * |
@@ -816,14 +816,14 @@ | |||
816 | */ | 816 | */ |
817 | #define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f | 817 | #define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f |
818 | #define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0 | 818 | #define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0 |
819 | #define DPLL_B_MD 0x06020 /* 965+ only */ | 819 | #define _DPLL_B_MD 0x06020 /* 965+ only */ |
820 | #define DPLL_MD(pipe) _PIPE(pipe, DPLL_A_MD, DPLL_B_MD) | 820 | #define DPLL_MD(pipe) _PIPE(pipe, _DPLL_A_MD, _DPLL_B_MD) |
821 | #define FPA0 0x06040 | 821 | #define _FPA0 0x06040 |
822 | #define FPA1 0x06044 | 822 | #define _FPA1 0x06044 |
823 | #define FPB0 0x06048 | 823 | #define _FPB0 0x06048 |
824 | #define FPB1 0x0604c | 824 | #define _FPB1 0x0604c |
825 | #define FP0(pipe) _PIPE(pipe, FPA0, FPB0) | 825 | #define FP0(pipe) _PIPE(pipe, _FPA0, _FPB0) |
826 | #define FP1(pipe) _PIPE(pipe, FPA1, FPB1) | 826 | #define FP1(pipe) _PIPE(pipe, _FPA1, _FPB1) |
827 | #define FP_N_DIV_MASK 0x003f0000 | 827 | #define FP_N_DIV_MASK 0x003f0000 |
828 | #define FP_N_PINEVIEW_DIV_MASK 0x00ff0000 | 828 | #define FP_N_PINEVIEW_DIV_MASK 0x00ff0000 |
829 | #define FP_N_DIV_SHIFT 16 | 829 | #define FP_N_DIV_SHIFT 16 |
@@ -962,8 +962,9 @@ | |||
962 | * Palette regs | 962 | * Palette regs |
963 | */ | 963 | */ |
964 | 964 | ||
965 | #define PALETTE_A 0x0a000 | 965 | #define _PALETTE_A 0x0a000 |
966 | #define PALETTE_B 0x0a800 | 966 | #define _PALETTE_B 0x0a800 |
967 | #define PALETTE(pipe) _PIPE(pipe, _PALETTE_A, _PALETTE_B) | ||
967 | 968 | ||
968 | /* MCH MMIO space */ | 969 | /* MCH MMIO space */ |
969 | 970 | ||
@@ -1267,32 +1268,32 @@ | |||
1267 | */ | 1268 | */ |
1268 | 1269 | ||
1269 | /* Pipe A timing regs */ | 1270 | /* Pipe A timing regs */ |
1270 | #define HTOTAL_A 0x60000 | 1271 | #define _HTOTAL_A 0x60000 |
1271 | #define HBLANK_A 0x60004 | 1272 | #define _HBLANK_A 0x60004 |
1272 | #define HSYNC_A 0x60008 | 1273 | #define _HSYNC_A 0x60008 |
1273 | #define VTOTAL_A 0x6000c | 1274 | #define _VTOTAL_A 0x6000c |
1274 | #define VBLANK_A 0x60010 | 1275 | #define _VBLANK_A 0x60010 |
1275 | #define VSYNC_A 0x60014 | 1276 | #define _VSYNC_A 0x60014 |
1276 | #define PIPEASRC 0x6001c | 1277 | #define _PIPEASRC 0x6001c |
1277 | #define BCLRPAT_A 0x60020 | 1278 | #define _BCLRPAT_A 0x60020 |
1278 | 1279 | ||
1279 | /* Pipe B timing regs */ | 1280 | /* Pipe B timing regs */ |
1280 | #define HTOTAL_B 0x61000 | 1281 | #define _HTOTAL_B 0x61000 |
1281 | #define HBLANK_B 0x61004 | 1282 | #define _HBLANK_B 0x61004 |
1282 | #define HSYNC_B 0x61008 | 1283 | #define _HSYNC_B 0x61008 |
1283 | #define VTOTAL_B 0x6100c | 1284 | #define _VTOTAL_B 0x6100c |
1284 | #define VBLANK_B 0x61010 | 1285 | #define _VBLANK_B 0x61010 |
1285 | #define VSYNC_B 0x61014 | 1286 | #define _VSYNC_B 0x61014 |
1286 | #define PIPEBSRC 0x6101c | 1287 | #define _PIPEBSRC 0x6101c |
1287 | #define BCLRPAT_B 0x61020 | 1288 | #define _BCLRPAT_B 0x61020 |
1288 | 1289 | ||
1289 | #define HTOTAL(pipe) _PIPE(pipe, HTOTAL_A, HTOTAL_B) | 1290 | #define HTOTAL(pipe) _PIPE(pipe, _HTOTAL_A, _HTOTAL_B) |
1290 | #define HBLANK(pipe) _PIPE(pipe, HBLANK_A, HBLANK_B) | 1291 | #define HBLANK(pipe) _PIPE(pipe, _HBLANK_A, _HBLANK_B) |
1291 | #define HSYNC(pipe) _PIPE(pipe, HSYNC_A, HSYNC_B) | 1292 | #define HSYNC(pipe) _PIPE(pipe, _HSYNC_A, _HSYNC_B) |
1292 | #define VTOTAL(pipe) _PIPE(pipe, VTOTAL_A, VTOTAL_B) | 1293 | #define VTOTAL(pipe) _PIPE(pipe, _VTOTAL_A, _VTOTAL_B) |
1293 | #define VBLANK(pipe) _PIPE(pipe, VBLANK_A, VBLANK_B) | 1294 | #define VBLANK(pipe) _PIPE(pipe, _VBLANK_A, _VBLANK_B) |
1294 | #define VSYNC(pipe) _PIPE(pipe, VSYNC_A, VSYNC_B) | 1295 | #define VSYNC(pipe) _PIPE(pipe, _VSYNC_A, _VSYNC_B) |
1295 | #define BCLRPAT(pipe) _PIPE(pipe, BCLRPAT_A, BCLRPAT_B) | 1296 | #define BCLRPAT(pipe) _PIPE(pipe, _BCLRPAT_A, _BCLRPAT_B) |
1296 | 1297 | ||
1297 | /* VGA port control */ | 1298 | /* VGA port control */ |
1298 | #define ADPA 0x61100 | 1299 | #define ADPA 0x61100 |
@@ -1441,8 +1442,13 @@ | |||
1441 | #define LVDS_PORT_EN (1 << 31) | 1442 | #define LVDS_PORT_EN (1 << 31) |
1442 | /* Selects pipe B for LVDS data. Must be set on pre-965. */ | 1443 | /* Selects pipe B for LVDS data. Must be set on pre-965. */ |
1443 | #define LVDS_PIPEB_SELECT (1 << 30) | 1444 | #define LVDS_PIPEB_SELECT (1 << 30) |
1445 | #define LVDS_PIPE_MASK (1 << 30) | ||
1444 | /* LVDS dithering flag on 965/g4x platform */ | 1446 | /* LVDS dithering flag on 965/g4x platform */ |
1445 | #define LVDS_ENABLE_DITHER (1 << 25) | 1447 | #define LVDS_ENABLE_DITHER (1 << 25) |
1448 | /* LVDS sync polarity flags. Set to invert (i.e. negative) */ | ||
1449 | #define LVDS_VSYNC_POLARITY (1 << 21) | ||
1450 | #define LVDS_HSYNC_POLARITY (1 << 20) | ||
1451 | |||
1446 | /* Enable border for unscaled (or aspect-scaled) display */ | 1452 | /* Enable border for unscaled (or aspect-scaled) display */ |
1447 | #define LVDS_BORDER_ENABLE (1 << 15) | 1453 | #define LVDS_BORDER_ENABLE (1 << 15) |
1448 | /* | 1454 | /* |
@@ -1476,6 +1482,9 @@ | |||
1476 | #define LVDS_B0B3_POWER_DOWN (0 << 2) | 1482 | #define LVDS_B0B3_POWER_DOWN (0 << 2) |
1477 | #define LVDS_B0B3_POWER_UP (3 << 2) | 1483 | #define LVDS_B0B3_POWER_UP (3 << 2) |
1478 | 1484 | ||
1485 | #define LVDS_PIPE_ENABLED(V, P) \ | ||
1486 | (((V) & (LVDS_PIPE_MASK | LVDS_PORT_EN)) == ((P) << 30 | LVDS_PORT_EN)) | ||
1487 | |||
1479 | /* Video Data Island Packet control */ | 1488 | /* Video Data Island Packet control */ |
1480 | #define VIDEO_DIP_DATA 0x61178 | 1489 | #define VIDEO_DIP_DATA 0x61178 |
1481 | #define VIDEO_DIP_CTL 0x61170 | 1490 | #define VIDEO_DIP_CTL 0x61170 |
@@ -2064,6 +2073,10 @@ | |||
2064 | 2073 | ||
2065 | #define DP_PORT_EN (1 << 31) | 2074 | #define DP_PORT_EN (1 << 31) |
2066 | #define DP_PIPEB_SELECT (1 << 30) | 2075 | #define DP_PIPEB_SELECT (1 << 30) |
2076 | #define DP_PIPE_MASK (1 << 30) | ||
2077 | |||
2078 | #define DP_PIPE_ENABLED(V, P) \ | ||
2079 | (((V) & (DP_PIPE_MASK | DP_PORT_EN)) == ((P) << 30 | DP_PORT_EN)) | ||
2067 | 2080 | ||
2068 | /* Link training mode - select a suitable mode for each stage */ | 2081 | /* Link training mode - select a suitable mode for each stage */ |
2069 | #define DP_LINK_TRAIN_PAT_1 (0 << 28) | 2082 | #define DP_LINK_TRAIN_PAT_1 (0 << 28) |
@@ -2206,8 +2219,8 @@ | |||
2206 | * which is after the LUTs, so we want the bytes for our color format. | 2219 | * which is after the LUTs, so we want the bytes for our color format. |
2207 | * For our current usage, this is always 3, one byte for R, G and B. | 2220 | * For our current usage, this is always 3, one byte for R, G and B. |
2208 | */ | 2221 | */ |
2209 | #define PIPEA_GMCH_DATA_M 0x70050 | 2222 | #define _PIPEA_GMCH_DATA_M 0x70050 |
2210 | #define PIPEB_GMCH_DATA_M 0x71050 | 2223 | #define _PIPEB_GMCH_DATA_M 0x71050 |
2211 | 2224 | ||
2212 | /* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */ | 2225 | /* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */ |
2213 | #define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25) | 2226 | #define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25) |
@@ -2215,8 +2228,8 @@ | |||
2215 | 2228 | ||
2216 | #define PIPE_GMCH_DATA_M_MASK (0xffffff) | 2229 | #define PIPE_GMCH_DATA_M_MASK (0xffffff) |
2217 | 2230 | ||
2218 | #define PIPEA_GMCH_DATA_N 0x70054 | 2231 | #define _PIPEA_GMCH_DATA_N 0x70054 |
2219 | #define PIPEB_GMCH_DATA_N 0x71054 | 2232 | #define _PIPEB_GMCH_DATA_N 0x71054 |
2220 | #define PIPE_GMCH_DATA_N_MASK (0xffffff) | 2233 | #define PIPE_GMCH_DATA_N_MASK (0xffffff) |
2221 | 2234 | ||
2222 | /* | 2235 | /* |
@@ -2230,20 +2243,25 @@ | |||
2230 | * Attributes and VB-ID. | 2243 | * Attributes and VB-ID. |
2231 | */ | 2244 | */ |
2232 | 2245 | ||
2233 | #define PIPEA_DP_LINK_M 0x70060 | 2246 | #define _PIPEA_DP_LINK_M 0x70060 |
2234 | #define PIPEB_DP_LINK_M 0x71060 | 2247 | #define _PIPEB_DP_LINK_M 0x71060 |
2235 | #define PIPEA_DP_LINK_M_MASK (0xffffff) | 2248 | #define PIPEA_DP_LINK_M_MASK (0xffffff) |
2236 | 2249 | ||
2237 | #define PIPEA_DP_LINK_N 0x70064 | 2250 | #define _PIPEA_DP_LINK_N 0x70064 |
2238 | #define PIPEB_DP_LINK_N 0x71064 | 2251 | #define _PIPEB_DP_LINK_N 0x71064 |
2239 | #define PIPEA_DP_LINK_N_MASK (0xffffff) | 2252 | #define PIPEA_DP_LINK_N_MASK (0xffffff) |
2240 | 2253 | ||
2254 | #define PIPE_GMCH_DATA_M(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_M, _PIPEB_GMCH_DATA_M) | ||
2255 | #define PIPE_GMCH_DATA_N(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_N, _PIPEB_GMCH_DATA_N) | ||
2256 | #define PIPE_DP_LINK_M(pipe) _PIPE(pipe, _PIPEA_DP_LINK_M, _PIPEB_DP_LINK_M) | ||
2257 | #define PIPE_DP_LINK_N(pipe) _PIPE(pipe, _PIPEA_DP_LINK_N, _PIPEB_DP_LINK_N) | ||
2258 | |||
2241 | /* Display & cursor control */ | 2259 | /* Display & cursor control */ |
2242 | 2260 | ||
2243 | /* Pipe A */ | 2261 | /* Pipe A */ |
2244 | #define PIPEADSL 0x70000 | 2262 | #define _PIPEADSL 0x70000 |
2245 | #define DSL_LINEMASK 0x00000fff | 2263 | #define DSL_LINEMASK 0x00000fff |
2246 | #define PIPEACONF 0x70008 | 2264 | #define _PIPEACONF 0x70008 |
2247 | #define PIPECONF_ENABLE (1<<31) | 2265 | #define PIPECONF_ENABLE (1<<31) |
2248 | #define PIPECONF_DISABLE 0 | 2266 | #define PIPECONF_DISABLE 0 |
2249 | #define PIPECONF_DOUBLE_WIDE (1<<30) | 2267 | #define PIPECONF_DOUBLE_WIDE (1<<30) |
@@ -2269,7 +2287,7 @@ | |||
2269 | #define PIPECONF_DITHER_TYPE_ST1 (1<<2) | 2287 | #define PIPECONF_DITHER_TYPE_ST1 (1<<2) |
2270 | #define PIPECONF_DITHER_TYPE_ST2 (2<<2) | 2288 | #define PIPECONF_DITHER_TYPE_ST2 (2<<2) |
2271 | #define PIPECONF_DITHER_TYPE_TEMP (3<<2) | 2289 | #define PIPECONF_DITHER_TYPE_TEMP (3<<2) |
2272 | #define PIPEASTAT 0x70024 | 2290 | #define _PIPEASTAT 0x70024 |
2273 | #define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31) | 2291 | #define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31) |
2274 | #define PIPE_CRC_ERROR_ENABLE (1UL<<29) | 2292 | #define PIPE_CRC_ERROR_ENABLE (1UL<<29) |
2275 | #define PIPE_CRC_DONE_ENABLE (1UL<<28) | 2293 | #define PIPE_CRC_DONE_ENABLE (1UL<<28) |
@@ -2305,10 +2323,12 @@ | |||
2305 | #define PIPE_6BPC (2 << 5) | 2323 | #define PIPE_6BPC (2 << 5) |
2306 | #define PIPE_12BPC (3 << 5) | 2324 | #define PIPE_12BPC (3 << 5) |
2307 | 2325 | ||
2308 | #define PIPESRC(pipe) _PIPE(pipe, PIPEASRC, PIPEBSRC) | 2326 | #define PIPESRC(pipe) _PIPE(pipe, _PIPEASRC, _PIPEBSRC) |
2309 | #define PIPECONF(pipe) _PIPE(pipe, PIPEACONF, PIPEBCONF) | 2327 | #define PIPECONF(pipe) _PIPE(pipe, _PIPEACONF, _PIPEBCONF) |
2310 | #define PIPEDSL(pipe) _PIPE(pipe, PIPEADSL, PIPEBDSL) | 2328 | #define PIPEDSL(pipe) _PIPE(pipe, _PIPEADSL, _PIPEBDSL) |
2311 | #define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, PIPEAFRAMEPIXEL, PIPEBFRAMEPIXEL) | 2329 | #define PIPEFRAME(pipe) _PIPE(pipe, _PIPEAFRAMEHIGH, _PIPEBFRAMEHIGH) |
2330 | #define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL) | ||
2331 | #define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT) | ||
2312 | 2332 | ||
2313 | #define DSPARB 0x70030 | 2333 | #define DSPARB 0x70030 |
2314 | #define DSPARB_CSTART_MASK (0x7f << 7) | 2334 | #define DSPARB_CSTART_MASK (0x7f << 7) |
@@ -2470,20 +2490,21 @@ | |||
2470 | * } while (high1 != high2); | 2490 | * } while (high1 != high2); |
2471 | * frame = (high1 << 8) | low1; | 2491 | * frame = (high1 << 8) | low1; |
2472 | */ | 2492 | */ |
2473 | #define PIPEAFRAMEHIGH 0x70040 | 2493 | #define _PIPEAFRAMEHIGH 0x70040 |
2474 | #define PIPE_FRAME_HIGH_MASK 0x0000ffff | 2494 | #define PIPE_FRAME_HIGH_MASK 0x0000ffff |
2475 | #define PIPE_FRAME_HIGH_SHIFT 0 | 2495 | #define PIPE_FRAME_HIGH_SHIFT 0 |
2476 | #define PIPEAFRAMEPIXEL 0x70044 | 2496 | #define _PIPEAFRAMEPIXEL 0x70044 |
2477 | #define PIPE_FRAME_LOW_MASK 0xff000000 | 2497 | #define PIPE_FRAME_LOW_MASK 0xff000000 |
2478 | #define PIPE_FRAME_LOW_SHIFT 24 | 2498 | #define PIPE_FRAME_LOW_SHIFT 24 |
2479 | #define PIPE_PIXEL_MASK 0x00ffffff | 2499 | #define PIPE_PIXEL_MASK 0x00ffffff |
2480 | #define PIPE_PIXEL_SHIFT 0 | 2500 | #define PIPE_PIXEL_SHIFT 0 |
2481 | /* GM45+ just has to be different */ | 2501 | /* GM45+ just has to be different */ |
2482 | #define PIPEA_FRMCOUNT_GM45 0x70040 | 2502 | #define _PIPEA_FRMCOUNT_GM45 0x70040 |
2483 | #define PIPEA_FLIPCOUNT_GM45 0x70044 | 2503 | #define _PIPEA_FLIPCOUNT_GM45 0x70044 |
2504 | #define PIPE_FRMCOUNT_GM45(pipe) _PIPE(pipe, _PIPEA_FRMCOUNT_GM45, _PIPEB_FRMCOUNT_GM45) | ||
2484 | 2505 | ||
2485 | /* Cursor A & B regs */ | 2506 | /* Cursor A & B regs */ |
2486 | #define CURACNTR 0x70080 | 2507 | #define _CURACNTR 0x70080 |
2487 | /* Old style CUR*CNTR flags (desktop 8xx) */ | 2508 | /* Old style CUR*CNTR flags (desktop 8xx) */ |
2488 | #define CURSOR_ENABLE 0x80000000 | 2509 | #define CURSOR_ENABLE 0x80000000 |
2489 | #define CURSOR_GAMMA_ENABLE 0x40000000 | 2510 | #define CURSOR_GAMMA_ENABLE 0x40000000 |
@@ -2504,23 +2525,23 @@ | |||
2504 | #define MCURSOR_PIPE_A 0x00 | 2525 | #define MCURSOR_PIPE_A 0x00 |
2505 | #define MCURSOR_PIPE_B (1 << 28) | 2526 | #define MCURSOR_PIPE_B (1 << 28) |
2506 | #define MCURSOR_GAMMA_ENABLE (1 << 26) | 2527 | #define MCURSOR_GAMMA_ENABLE (1 << 26) |
2507 | #define CURABASE 0x70084 | 2528 | #define _CURABASE 0x70084 |
2508 | #define CURAPOS 0x70088 | 2529 | #define _CURAPOS 0x70088 |
2509 | #define CURSOR_POS_MASK 0x007FF | 2530 | #define CURSOR_POS_MASK 0x007FF |
2510 | #define CURSOR_POS_SIGN 0x8000 | 2531 | #define CURSOR_POS_SIGN 0x8000 |
2511 | #define CURSOR_X_SHIFT 0 | 2532 | #define CURSOR_X_SHIFT 0 |
2512 | #define CURSOR_Y_SHIFT 16 | 2533 | #define CURSOR_Y_SHIFT 16 |
2513 | #define CURSIZE 0x700a0 | 2534 | #define CURSIZE 0x700a0 |
2514 | #define CURBCNTR 0x700c0 | 2535 | #define _CURBCNTR 0x700c0 |
2515 | #define CURBBASE 0x700c4 | 2536 | #define _CURBBASE 0x700c4 |
2516 | #define CURBPOS 0x700c8 | 2537 | #define _CURBPOS 0x700c8 |
2517 | 2538 | ||
2518 | #define CURCNTR(pipe) _PIPE(pipe, CURACNTR, CURBCNTR) | 2539 | #define CURCNTR(pipe) _PIPE(pipe, _CURACNTR, _CURBCNTR) |
2519 | #define CURBASE(pipe) _PIPE(pipe, CURABASE, CURBBASE) | 2540 | #define CURBASE(pipe) _PIPE(pipe, _CURABASE, _CURBBASE) |
2520 | #define CURPOS(pipe) _PIPE(pipe, CURAPOS, CURBPOS) | 2541 | #define CURPOS(pipe) _PIPE(pipe, _CURAPOS, _CURBPOS) |
2521 | 2542 | ||
2522 | /* Display A control */ | 2543 | /* Display A control */ |
2523 | #define DSPACNTR 0x70180 | 2544 | #define _DSPACNTR 0x70180 |
2524 | #define DISPLAY_PLANE_ENABLE (1<<31) | 2545 | #define DISPLAY_PLANE_ENABLE (1<<31) |
2525 | #define DISPLAY_PLANE_DISABLE 0 | 2546 | #define DISPLAY_PLANE_DISABLE 0 |
2526 | #define DISPPLANE_GAMMA_ENABLE (1<<30) | 2547 | #define DISPPLANE_GAMMA_ENABLE (1<<30) |
@@ -2534,9 +2555,10 @@ | |||
2534 | #define DISPPLANE_32BPP_30BIT_NO_ALPHA (0xa<<26) | 2555 | #define DISPPLANE_32BPP_30BIT_NO_ALPHA (0xa<<26) |
2535 | #define DISPPLANE_STEREO_ENABLE (1<<25) | 2556 | #define DISPPLANE_STEREO_ENABLE (1<<25) |
2536 | #define DISPPLANE_STEREO_DISABLE 0 | 2557 | #define DISPPLANE_STEREO_DISABLE 0 |
2537 | #define DISPPLANE_SEL_PIPE_MASK (1<<24) | 2558 | #define DISPPLANE_SEL_PIPE_SHIFT 24 |
2559 | #define DISPPLANE_SEL_PIPE_MASK (3<<DISPPLANE_SEL_PIPE_SHIFT) | ||
2538 | #define DISPPLANE_SEL_PIPE_A 0 | 2560 | #define DISPPLANE_SEL_PIPE_A 0 |
2539 | #define DISPPLANE_SEL_PIPE_B (1<<24) | 2561 | #define DISPPLANE_SEL_PIPE_B (1<<DISPPLANE_SEL_PIPE_SHIFT) |
2540 | #define DISPPLANE_SRC_KEY_ENABLE (1<<22) | 2562 | #define DISPPLANE_SRC_KEY_ENABLE (1<<22) |
2541 | #define DISPPLANE_SRC_KEY_DISABLE 0 | 2563 | #define DISPPLANE_SRC_KEY_DISABLE 0 |
2542 | #define DISPPLANE_LINE_DOUBLE (1<<20) | 2564 | #define DISPPLANE_LINE_DOUBLE (1<<20) |
@@ -2545,20 +2567,20 @@ | |||
2545 | #define DISPPLANE_STEREO_POLARITY_SECOND (1<<18) | 2567 | #define DISPPLANE_STEREO_POLARITY_SECOND (1<<18) |
2546 | #define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* Ironlake */ | 2568 | #define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* Ironlake */ |
2547 | #define DISPPLANE_TILED (1<<10) | 2569 | #define DISPPLANE_TILED (1<<10) |
2548 | #define DSPAADDR 0x70184 | 2570 | #define _DSPAADDR 0x70184 |
2549 | #define DSPASTRIDE 0x70188 | 2571 | #define _DSPASTRIDE 0x70188 |
2550 | #define DSPAPOS 0x7018C /* reserved */ | 2572 | #define _DSPAPOS 0x7018C /* reserved */ |
2551 | #define DSPASIZE 0x70190 | 2573 | #define _DSPASIZE 0x70190 |
2552 | #define DSPASURF 0x7019C /* 965+ only */ | 2574 | #define _DSPASURF 0x7019C /* 965+ only */ |
2553 | #define DSPATILEOFF 0x701A4 /* 965+ only */ | 2575 | #define _DSPATILEOFF 0x701A4 /* 965+ only */ |
2554 | 2576 | ||
2555 | #define DSPCNTR(plane) _PIPE(plane, DSPACNTR, DSPBCNTR) | 2577 | #define DSPCNTR(plane) _PIPE(plane, _DSPACNTR, _DSPBCNTR) |
2556 | #define DSPADDR(plane) _PIPE(plane, DSPAADDR, DSPBADDR) | 2578 | #define DSPADDR(plane) _PIPE(plane, _DSPAADDR, _DSPBADDR) |
2557 | #define DSPSTRIDE(plane) _PIPE(plane, DSPASTRIDE, DSPBSTRIDE) | 2579 | #define DSPSTRIDE(plane) _PIPE(plane, _DSPASTRIDE, _DSPBSTRIDE) |
2558 | #define DSPPOS(plane) _PIPE(plane, DSPAPOS, DSPBPOS) | 2580 | #define DSPPOS(plane) _PIPE(plane, _DSPAPOS, _DSPBPOS) |
2559 | #define DSPSIZE(plane) _PIPE(plane, DSPASIZE, DSPBSIZE) | 2581 | #define DSPSIZE(plane) _PIPE(plane, _DSPASIZE, _DSPBSIZE) |
2560 | #define DSPSURF(plane) _PIPE(plane, DSPASURF, DSPBSURF) | 2582 | #define DSPSURF(plane) _PIPE(plane, _DSPASURF, _DSPBSURF) |
2561 | #define DSPTILEOFF(plane) _PIPE(plane, DSPATILEOFF, DSPBTILEOFF) | 2583 | #define DSPTILEOFF(plane) _PIPE(plane, _DSPATILEOFF, _DSPBTILEOFF) |
2562 | 2584 | ||
2563 | /* VBIOS flags */ | 2585 | /* VBIOS flags */ |
2564 | #define SWF00 0x71410 | 2586 | #define SWF00 0x71410 |
@@ -2576,27 +2598,27 @@ | |||
2576 | #define SWF32 0x7241c | 2598 | #define SWF32 0x7241c |
2577 | 2599 | ||
2578 | /* Pipe B */ | 2600 | /* Pipe B */ |
2579 | #define PIPEBDSL 0x71000 | 2601 | #define _PIPEBDSL 0x71000 |
2580 | #define PIPEBCONF 0x71008 | 2602 | #define _PIPEBCONF 0x71008 |
2581 | #define PIPEBSTAT 0x71024 | 2603 | #define _PIPEBSTAT 0x71024 |
2582 | #define PIPEBFRAMEHIGH 0x71040 | 2604 | #define _PIPEBFRAMEHIGH 0x71040 |
2583 | #define PIPEBFRAMEPIXEL 0x71044 | 2605 | #define _PIPEBFRAMEPIXEL 0x71044 |
2584 | #define PIPEB_FRMCOUNT_GM45 0x71040 | 2606 | #define _PIPEB_FRMCOUNT_GM45 0x71040 |
2585 | #define PIPEB_FLIPCOUNT_GM45 0x71044 | 2607 | #define _PIPEB_FLIPCOUNT_GM45 0x71044 |
2586 | 2608 | ||
2587 | 2609 | ||
2588 | /* Display B control */ | 2610 | /* Display B control */ |
2589 | #define DSPBCNTR 0x71180 | 2611 | #define _DSPBCNTR 0x71180 |
2590 | #define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15) | 2612 | #define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15) |
2591 | #define DISPPLANE_ALPHA_TRANS_DISABLE 0 | 2613 | #define DISPPLANE_ALPHA_TRANS_DISABLE 0 |
2592 | #define DISPPLANE_SPRITE_ABOVE_DISPLAY 0 | 2614 | #define DISPPLANE_SPRITE_ABOVE_DISPLAY 0 |
2593 | #define DISPPLANE_SPRITE_ABOVE_OVERLAY (1) | 2615 | #define DISPPLANE_SPRITE_ABOVE_OVERLAY (1) |
2594 | #define DSPBADDR 0x71184 | 2616 | #define _DSPBADDR 0x71184 |
2595 | #define DSPBSTRIDE 0x71188 | 2617 | #define _DSPBSTRIDE 0x71188 |
2596 | #define DSPBPOS 0x7118C | 2618 | #define _DSPBPOS 0x7118C |
2597 | #define DSPBSIZE 0x71190 | 2619 | #define _DSPBSIZE 0x71190 |
2598 | #define DSPBSURF 0x7119C | 2620 | #define _DSPBSURF 0x7119C |
2599 | #define DSPBTILEOFF 0x711A4 | 2621 | #define _DSPBTILEOFF 0x711A4 |
2600 | 2622 | ||
2601 | /* VBIOS regs */ | 2623 | /* VBIOS regs */ |
2602 | #define VGACNTRL 0x71400 | 2624 | #define VGACNTRL 0x71400 |
@@ -2650,68 +2672,80 @@ | |||
2650 | #define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff | 2672 | #define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff |
2651 | 2673 | ||
2652 | 2674 | ||
2653 | #define PIPEA_DATA_M1 0x60030 | 2675 | #define _PIPEA_DATA_M1 0x60030 |
2654 | #define TU_SIZE(x) (((x)-1) << 25) /* default size 64 */ | 2676 | #define TU_SIZE(x) (((x)-1) << 25) /* default size 64 */ |
2655 | #define TU_SIZE_MASK 0x7e000000 | 2677 | #define TU_SIZE_MASK 0x7e000000 |
2656 | #define PIPE_DATA_M1_OFFSET 0 | 2678 | #define PIPE_DATA_M1_OFFSET 0 |
2657 | #define PIPEA_DATA_N1 0x60034 | 2679 | #define _PIPEA_DATA_N1 0x60034 |
2658 | #define PIPE_DATA_N1_OFFSET 0 | 2680 | #define PIPE_DATA_N1_OFFSET 0 |
2659 | 2681 | ||
2660 | #define PIPEA_DATA_M2 0x60038 | 2682 | #define _PIPEA_DATA_M2 0x60038 |
2661 | #define PIPE_DATA_M2_OFFSET 0 | 2683 | #define PIPE_DATA_M2_OFFSET 0 |
2662 | #define PIPEA_DATA_N2 0x6003c | 2684 | #define _PIPEA_DATA_N2 0x6003c |
2663 | #define PIPE_DATA_N2_OFFSET 0 | 2685 | #define PIPE_DATA_N2_OFFSET 0 |
2664 | 2686 | ||
2665 | #define PIPEA_LINK_M1 0x60040 | 2687 | #define _PIPEA_LINK_M1 0x60040 |
2666 | #define PIPE_LINK_M1_OFFSET 0 | 2688 | #define PIPE_LINK_M1_OFFSET 0 |
2667 | #define PIPEA_LINK_N1 0x60044 | 2689 | #define _PIPEA_LINK_N1 0x60044 |
2668 | #define PIPE_LINK_N1_OFFSET 0 | 2690 | #define PIPE_LINK_N1_OFFSET 0 |
2669 | 2691 | ||
2670 | #define PIPEA_LINK_M2 0x60048 | 2692 | #define _PIPEA_LINK_M2 0x60048 |
2671 | #define PIPE_LINK_M2_OFFSET 0 | 2693 | #define PIPE_LINK_M2_OFFSET 0 |
2672 | #define PIPEA_LINK_N2 0x6004c | 2694 | #define _PIPEA_LINK_N2 0x6004c |
2673 | #define PIPE_LINK_N2_OFFSET 0 | 2695 | #define PIPE_LINK_N2_OFFSET 0 |
2674 | 2696 | ||
2675 | /* PIPEB timing regs are same start from 0x61000 */ | 2697 | /* PIPEB timing regs are same start from 0x61000 */ |
2676 | 2698 | ||
2677 | #define PIPEB_DATA_M1 0x61030 | 2699 | #define _PIPEB_DATA_M1 0x61030 |
2678 | #define PIPEB_DATA_N1 0x61034 | 2700 | #define _PIPEB_DATA_N1 0x61034 |
2679 | 2701 | ||
2680 | #define PIPEB_DATA_M2 0x61038 | 2702 | #define _PIPEB_DATA_M2 0x61038 |
2681 | #define PIPEB_DATA_N2 0x6103c | 2703 | #define _PIPEB_DATA_N2 0x6103c |
2682 | 2704 | ||
2683 | #define PIPEB_LINK_M1 0x61040 | 2705 | #define _PIPEB_LINK_M1 0x61040 |
2684 | #define PIPEB_LINK_N1 0x61044 | 2706 | #define _PIPEB_LINK_N1 0x61044 |
2685 | 2707 | ||
2686 | #define PIPEB_LINK_M2 0x61048 | 2708 | #define _PIPEB_LINK_M2 0x61048 |
2687 | #define PIPEB_LINK_N2 0x6104c | 2709 | #define _PIPEB_LINK_N2 0x6104c |
2688 | 2710 | ||
2689 | #define PIPE_DATA_M1(pipe) _PIPE(pipe, PIPEA_DATA_M1, PIPEB_DATA_M1) | 2711 | #define PIPE_DATA_M1(pipe) _PIPE(pipe, _PIPEA_DATA_M1, _PIPEB_DATA_M1) |
2690 | #define PIPE_DATA_N1(pipe) _PIPE(pipe, PIPEA_DATA_N1, PIPEB_DATA_N1) | 2712 | #define PIPE_DATA_N1(pipe) _PIPE(pipe, _PIPEA_DATA_N1, _PIPEB_DATA_N1) |
2691 | #define PIPE_DATA_M2(pipe) _PIPE(pipe, PIPEA_DATA_M2, PIPEB_DATA_M2) | 2713 | #define PIPE_DATA_M2(pipe) _PIPE(pipe, _PIPEA_DATA_M2, _PIPEB_DATA_M2) |
2692 | #define PIPE_DATA_N2(pipe) _PIPE(pipe, PIPEA_DATA_N2, PIPEB_DATA_N2) | 2714 | #define PIPE_DATA_N2(pipe) _PIPE(pipe, _PIPEA_DATA_N2, _PIPEB_DATA_N2) |
2693 | #define PIPE_LINK_M1(pipe) _PIPE(pipe, PIPEA_LINK_M1, PIPEB_LINK_M1) | 2715 | #define PIPE_LINK_M1(pipe) _PIPE(pipe, _PIPEA_LINK_M1, _PIPEB_LINK_M1) |
2694 | #define PIPE_LINK_N1(pipe) _PIPE(pipe, PIPEA_LINK_N1, PIPEB_LINK_N1) | 2716 | #define PIPE_LINK_N1(pipe) _PIPE(pipe, _PIPEA_LINK_N1, _PIPEB_LINK_N1) |
2695 | #define PIPE_LINK_M2(pipe) _PIPE(pipe, PIPEA_LINK_M2, PIPEB_LINK_M2) | 2717 | #define PIPE_LINK_M2(pipe) _PIPE(pipe, _PIPEA_LINK_M2, _PIPEB_LINK_M2) |
2696 | #define PIPE_LINK_N2(pipe) _PIPE(pipe, PIPEA_LINK_N2, PIPEB_LINK_N2) | 2718 | #define PIPE_LINK_N2(pipe) _PIPE(pipe, _PIPEA_LINK_N2, _PIPEB_LINK_N2) |
2697 | 2719 | ||
2698 | /* CPU panel fitter */ | 2720 | /* CPU panel fitter */ |
2699 | #define PFA_CTL_1 0x68080 | 2721 | /* IVB+ has 3 fitters, 0 is 7x5 capable, the other two only 3x3 */ |
2700 | #define PFB_CTL_1 0x68880 | 2722 | #define _PFA_CTL_1 0x68080 |
2723 | #define _PFB_CTL_1 0x68880 | ||
2701 | #define PF_ENABLE (1<<31) | 2724 | #define PF_ENABLE (1<<31) |
2702 | #define PF_FILTER_MASK (3<<23) | 2725 | #define PF_FILTER_MASK (3<<23) |
2703 | #define PF_FILTER_PROGRAMMED (0<<23) | 2726 | #define PF_FILTER_PROGRAMMED (0<<23) |
2704 | #define PF_FILTER_MED_3x3 (1<<23) | 2727 | #define PF_FILTER_MED_3x3 (1<<23) |
2705 | #define PF_FILTER_EDGE_ENHANCE (2<<23) | 2728 | #define PF_FILTER_EDGE_ENHANCE (2<<23) |
2706 | #define PF_FILTER_EDGE_SOFTEN (3<<23) | 2729 | #define PF_FILTER_EDGE_SOFTEN (3<<23) |
2707 | #define PFA_WIN_SZ 0x68074 | 2730 | #define _PFA_WIN_SZ 0x68074 |
2708 | #define PFB_WIN_SZ 0x68874 | 2731 | #define _PFB_WIN_SZ 0x68874 |
2709 | #define PFA_WIN_POS 0x68070 | 2732 | #define _PFA_WIN_POS 0x68070 |
2710 | #define PFB_WIN_POS 0x68870 | 2733 | #define _PFB_WIN_POS 0x68870 |
2734 | #define _PFA_VSCALE 0x68084 | ||
2735 | #define _PFB_VSCALE 0x68884 | ||
2736 | #define _PFA_HSCALE 0x68090 | ||
2737 | #define _PFB_HSCALE 0x68890 | ||
2738 | |||
2739 | #define PF_CTL(pipe) _PIPE(pipe, _PFA_CTL_1, _PFB_CTL_1) | ||
2740 | #define PF_WIN_SZ(pipe) _PIPE(pipe, _PFA_WIN_SZ, _PFB_WIN_SZ) | ||
2741 | #define PF_WIN_POS(pipe) _PIPE(pipe, _PFA_WIN_POS, _PFB_WIN_POS) | ||
2742 | #define PF_VSCALE(pipe) _PIPE(pipe, _PFA_VSCALE, _PFB_VSCALE) | ||
2743 | #define PF_HSCALE(pipe) _PIPE(pipe, _PFA_HSCALE, _PFB_HSCALE) | ||
2711 | 2744 | ||
2712 | /* legacy palette */ | 2745 | /* legacy palette */ |
2713 | #define LGC_PALETTE_A 0x4a000 | 2746 | #define _LGC_PALETTE_A 0x4a000 |
2714 | #define LGC_PALETTE_B 0x4a800 | 2747 | #define _LGC_PALETTE_B 0x4a800 |
2748 | #define LGC_PALETTE(pipe) _PIPE(pipe, _LGC_PALETTE_A, _LGC_PALETTE_B) | ||
2715 | 2749 | ||
2716 | /* interrupts */ | 2750 | /* interrupts */ |
2717 | #define DE_MASTER_IRQ_CONTROL (1 << 31) | 2751 | #define DE_MASTER_IRQ_CONTROL (1 << 31) |
@@ -2877,17 +2911,17 @@ | |||
2877 | #define PCH_GMBUS4 0xc5110 | 2911 | #define PCH_GMBUS4 0xc5110 |
2878 | #define PCH_GMBUS5 0xc5120 | 2912 | #define PCH_GMBUS5 0xc5120 |
2879 | 2913 | ||
2880 | #define PCH_DPLL_A 0xc6014 | 2914 | #define _PCH_DPLL_A 0xc6014 |
2881 | #define PCH_DPLL_B 0xc6018 | 2915 | #define _PCH_DPLL_B 0xc6018 |
2882 | #define PCH_DPLL(pipe) _PIPE(pipe, PCH_DPLL_A, PCH_DPLL_B) | 2916 | #define PCH_DPLL(pipe) _PIPE(pipe, _PCH_DPLL_A, _PCH_DPLL_B) |
2883 | 2917 | ||
2884 | #define PCH_FPA0 0xc6040 | 2918 | #define _PCH_FPA0 0xc6040 |
2885 | #define FP_CB_TUNE (0x3<<22) | 2919 | #define FP_CB_TUNE (0x3<<22) |
2886 | #define PCH_FPA1 0xc6044 | 2920 | #define _PCH_FPA1 0xc6044 |
2887 | #define PCH_FPB0 0xc6048 | 2921 | #define _PCH_FPB0 0xc6048 |
2888 | #define PCH_FPB1 0xc604c | 2922 | #define _PCH_FPB1 0xc604c |
2889 | #define PCH_FP0(pipe) _PIPE(pipe, PCH_FPA0, PCH_FPB0) | 2923 | #define PCH_FP0(pipe) _PIPE(pipe, _PCH_FPA0, _PCH_FPB0) |
2890 | #define PCH_FP1(pipe) _PIPE(pipe, PCH_FPA1, PCH_FPB1) | 2924 | #define PCH_FP1(pipe) _PIPE(pipe, _PCH_FPA1, _PCH_FPB1) |
2891 | 2925 | ||
2892 | #define PCH_DPLL_TEST 0xc606c | 2926 | #define PCH_DPLL_TEST 0xc606c |
2893 | 2927 | ||
@@ -2906,6 +2940,7 @@ | |||
2906 | #define DREF_NONSPREAD_SOURCE_MASK (3<<9) | 2940 | #define DREF_NONSPREAD_SOURCE_MASK (3<<9) |
2907 | #define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7) | 2941 | #define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7) |
2908 | #define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7) | 2942 | #define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7) |
2943 | #define DREF_SUPERSPREAD_SOURCE_MASK (3<<7) | ||
2909 | #define DREF_SSC4_DOWNSPREAD (0<<6) | 2944 | #define DREF_SSC4_DOWNSPREAD (0<<6) |
2910 | #define DREF_SSC4_CENTERSPREAD (1<<6) | 2945 | #define DREF_SSC4_CENTERSPREAD (1<<6) |
2911 | #define DREF_SSC1_DISABLE (0<<1) | 2946 | #define DREF_SSC1_DISABLE (0<<1) |
@@ -2938,60 +2973,69 @@ | |||
2938 | 2973 | ||
2939 | /* transcoder */ | 2974 | /* transcoder */ |
2940 | 2975 | ||
2941 | #define TRANS_HTOTAL_A 0xe0000 | 2976 | #define _TRANS_HTOTAL_A 0xe0000 |
2942 | #define TRANS_HTOTAL_SHIFT 16 | 2977 | #define TRANS_HTOTAL_SHIFT 16 |
2943 | #define TRANS_HACTIVE_SHIFT 0 | 2978 | #define TRANS_HACTIVE_SHIFT 0 |
2944 | #define TRANS_HBLANK_A 0xe0004 | 2979 | #define _TRANS_HBLANK_A 0xe0004 |
2945 | #define TRANS_HBLANK_END_SHIFT 16 | 2980 | #define TRANS_HBLANK_END_SHIFT 16 |
2946 | #define TRANS_HBLANK_START_SHIFT 0 | 2981 | #define TRANS_HBLANK_START_SHIFT 0 |
2947 | #define TRANS_HSYNC_A 0xe0008 | 2982 | #define _TRANS_HSYNC_A 0xe0008 |
2948 | #define TRANS_HSYNC_END_SHIFT 16 | 2983 | #define TRANS_HSYNC_END_SHIFT 16 |
2949 | #define TRANS_HSYNC_START_SHIFT 0 | 2984 | #define TRANS_HSYNC_START_SHIFT 0 |
2950 | #define TRANS_VTOTAL_A 0xe000c | 2985 | #define _TRANS_VTOTAL_A 0xe000c |
2951 | #define TRANS_VTOTAL_SHIFT 16 | 2986 | #define TRANS_VTOTAL_SHIFT 16 |
2952 | #define TRANS_VACTIVE_SHIFT 0 | 2987 | #define TRANS_VACTIVE_SHIFT 0 |
2953 | #define TRANS_VBLANK_A 0xe0010 | 2988 | #define _TRANS_VBLANK_A 0xe0010 |
2954 | #define TRANS_VBLANK_END_SHIFT 16 | 2989 | #define TRANS_VBLANK_END_SHIFT 16 |
2955 | #define TRANS_VBLANK_START_SHIFT 0 | 2990 | #define TRANS_VBLANK_START_SHIFT 0 |
2956 | #define TRANS_VSYNC_A 0xe0014 | 2991 | #define _TRANS_VSYNC_A 0xe0014 |
2957 | #define TRANS_VSYNC_END_SHIFT 16 | 2992 | #define TRANS_VSYNC_END_SHIFT 16 |
2958 | #define TRANS_VSYNC_START_SHIFT 0 | 2993 | #define TRANS_VSYNC_START_SHIFT 0 |
2959 | 2994 | ||
2960 | #define TRANSA_DATA_M1 0xe0030 | 2995 | #define _TRANSA_DATA_M1 0xe0030 |
2961 | #define TRANSA_DATA_N1 0xe0034 | 2996 | #define _TRANSA_DATA_N1 0xe0034 |
2962 | #define TRANSA_DATA_M2 0xe0038 | 2997 | #define _TRANSA_DATA_M2 0xe0038 |
2963 | #define TRANSA_DATA_N2 0xe003c | 2998 | #define _TRANSA_DATA_N2 0xe003c |
2964 | #define TRANSA_DP_LINK_M1 0xe0040 | 2999 | #define _TRANSA_DP_LINK_M1 0xe0040 |
2965 | #define TRANSA_DP_LINK_N1 0xe0044 | 3000 | #define _TRANSA_DP_LINK_N1 0xe0044 |
2966 | #define TRANSA_DP_LINK_M2 0xe0048 | 3001 | #define _TRANSA_DP_LINK_M2 0xe0048 |
2967 | #define TRANSA_DP_LINK_N2 0xe004c | 3002 | #define _TRANSA_DP_LINK_N2 0xe004c |
2968 | 3003 | ||
2969 | #define TRANS_HTOTAL_B 0xe1000 | 3004 | #define _TRANS_HTOTAL_B 0xe1000 |
2970 | #define TRANS_HBLANK_B 0xe1004 | 3005 | #define _TRANS_HBLANK_B 0xe1004 |
2971 | #define TRANS_HSYNC_B 0xe1008 | 3006 | #define _TRANS_HSYNC_B 0xe1008 |
2972 | #define TRANS_VTOTAL_B 0xe100c | 3007 | #define _TRANS_VTOTAL_B 0xe100c |
2973 | #define TRANS_VBLANK_B 0xe1010 | 3008 | #define _TRANS_VBLANK_B 0xe1010 |
2974 | #define TRANS_VSYNC_B 0xe1014 | 3009 | #define _TRANS_VSYNC_B 0xe1014 |
2975 | 3010 | ||
2976 | #define TRANS_HTOTAL(pipe) _PIPE(pipe, TRANS_HTOTAL_A, TRANS_HTOTAL_B) | 3011 | #define TRANS_HTOTAL(pipe) _PIPE(pipe, _TRANS_HTOTAL_A, _TRANS_HTOTAL_B) |
2977 | #define TRANS_HBLANK(pipe) _PIPE(pipe, TRANS_HBLANK_A, TRANS_HBLANK_B) | 3012 | #define TRANS_HBLANK(pipe) _PIPE(pipe, _TRANS_HBLANK_A, _TRANS_HBLANK_B) |
2978 | #define TRANS_HSYNC(pipe) _PIPE(pipe, TRANS_HSYNC_A, TRANS_HSYNC_B) | 3013 | #define TRANS_HSYNC(pipe) _PIPE(pipe, _TRANS_HSYNC_A, _TRANS_HSYNC_B) |
2979 | #define TRANS_VTOTAL(pipe) _PIPE(pipe, TRANS_VTOTAL_A, TRANS_VTOTAL_B) | 3014 | #define TRANS_VTOTAL(pipe) _PIPE(pipe, _TRANS_VTOTAL_A, _TRANS_VTOTAL_B) |
2980 | #define TRANS_VBLANK(pipe) _PIPE(pipe, TRANS_VBLANK_A, TRANS_VBLANK_B) | 3015 | #define TRANS_VBLANK(pipe) _PIPE(pipe, _TRANS_VBLANK_A, _TRANS_VBLANK_B) |
2981 | #define TRANS_VSYNC(pipe) _PIPE(pipe, TRANS_VSYNC_A, TRANS_VSYNC_B) | 3016 | #define TRANS_VSYNC(pipe) _PIPE(pipe, _TRANS_VSYNC_A, _TRANS_VSYNC_B) |
2982 | 3017 | ||
2983 | #define TRANSB_DATA_M1 0xe1030 | 3018 | #define _TRANSB_DATA_M1 0xe1030 |
2984 | #define TRANSB_DATA_N1 0xe1034 | 3019 | #define _TRANSB_DATA_N1 0xe1034 |
2985 | #define TRANSB_DATA_M2 0xe1038 | 3020 | #define _TRANSB_DATA_M2 0xe1038 |
2986 | #define TRANSB_DATA_N2 0xe103c | 3021 | #define _TRANSB_DATA_N2 0xe103c |
2987 | #define TRANSB_DP_LINK_M1 0xe1040 | 3022 | #define _TRANSB_DP_LINK_M1 0xe1040 |
2988 | #define TRANSB_DP_LINK_N1 0xe1044 | 3023 | #define _TRANSB_DP_LINK_N1 0xe1044 |
2989 | #define TRANSB_DP_LINK_M2 0xe1048 | 3024 | #define _TRANSB_DP_LINK_M2 0xe1048 |
2990 | #define TRANSB_DP_LINK_N2 0xe104c | 3025 | #define _TRANSB_DP_LINK_N2 0xe104c |
2991 | 3026 | ||
2992 | #define TRANSACONF 0xf0008 | 3027 | #define TRANSDATA_M1(pipe) _PIPE(pipe, _TRANSA_DATA_M1, _TRANSB_DATA_M1) |
2993 | #define TRANSBCONF 0xf1008 | 3028 | #define TRANSDATA_N1(pipe) _PIPE(pipe, _TRANSA_DATA_N1, _TRANSB_DATA_N1) |
2994 | #define TRANSCONF(plane) _PIPE(plane, TRANSACONF, TRANSBCONF) | 3029 | #define TRANSDATA_M2(pipe) _PIPE(pipe, _TRANSA_DATA_M2, _TRANSB_DATA_M2) |
3030 | #define TRANSDATA_N2(pipe) _PIPE(pipe, _TRANSA_DATA_N2, _TRANSB_DATA_N2) | ||
3031 | #define TRANSDPLINK_M1(pipe) _PIPE(pipe, _TRANSA_DP_LINK_M1, _TRANSB_DP_LINK_M1) | ||
3032 | #define TRANSDPLINK_N1(pipe) _PIPE(pipe, _TRANSA_DP_LINK_N1, _TRANSB_DP_LINK_N1) | ||
3033 | #define TRANSDPLINK_M2(pipe) _PIPE(pipe, _TRANSA_DP_LINK_M2, _TRANSB_DP_LINK_M2) | ||
3034 | #define TRANSDPLINK_N2(pipe) _PIPE(pipe, _TRANSA_DP_LINK_N2, _TRANSB_DP_LINK_N2) | ||
3035 | |||
3036 | #define _TRANSACONF 0xf0008 | ||
3037 | #define _TRANSBCONF 0xf1008 | ||
3038 | #define TRANSCONF(plane) _PIPE(plane, _TRANSACONF, _TRANSBCONF) | ||
2995 | #define TRANS_DISABLE (0<<31) | 3039 | #define TRANS_DISABLE (0<<31) |
2996 | #define TRANS_ENABLE (1<<31) | 3040 | #define TRANS_ENABLE (1<<31) |
2997 | #define TRANS_STATE_MASK (1<<30) | 3041 | #define TRANS_STATE_MASK (1<<30) |
@@ -3009,18 +3053,19 @@ | |||
3009 | #define TRANS_6BPC (2<<5) | 3053 | #define TRANS_6BPC (2<<5) |
3010 | #define TRANS_12BPC (3<<5) | 3054 | #define TRANS_12BPC (3<<5) |
3011 | 3055 | ||
3012 | #define FDI_RXA_CHICKEN 0xc200c | 3056 | #define _FDI_RXA_CHICKEN 0xc200c |
3013 | #define FDI_RXB_CHICKEN 0xc2010 | 3057 | #define _FDI_RXB_CHICKEN 0xc2010 |
3014 | #define FDI_RX_PHASE_SYNC_POINTER_ENABLE (1) | 3058 | #define FDI_RX_PHASE_SYNC_POINTER_OVR (1<<1) |
3015 | #define FDI_RX_CHICKEN(pipe) _PIPE(pipe, FDI_RXA_CHICKEN, FDI_RXB_CHICKEN) | 3059 | #define FDI_RX_PHASE_SYNC_POINTER_EN (1<<0) |
3060 | #define FDI_RX_CHICKEN(pipe) _PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN) | ||
3016 | 3061 | ||
3017 | #define SOUTH_DSPCLK_GATE_D 0xc2020 | 3062 | #define SOUTH_DSPCLK_GATE_D 0xc2020 |
3018 | #define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29) | 3063 | #define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29) |
3019 | 3064 | ||
3020 | /* CPU: FDI_TX */ | 3065 | /* CPU: FDI_TX */ |
3021 | #define FDI_TXA_CTL 0x60100 | 3066 | #define _FDI_TXA_CTL 0x60100 |
3022 | #define FDI_TXB_CTL 0x61100 | 3067 | #define _FDI_TXB_CTL 0x61100 |
3023 | #define FDI_TX_CTL(pipe) _PIPE(pipe, FDI_TXA_CTL, FDI_TXB_CTL) | 3068 | #define FDI_TX_CTL(pipe) _PIPE(pipe, _FDI_TXA_CTL, _FDI_TXB_CTL) |
3024 | #define FDI_TX_DISABLE (0<<31) | 3069 | #define FDI_TX_DISABLE (0<<31) |
3025 | #define FDI_TX_ENABLE (1<<31) | 3070 | #define FDI_TX_ENABLE (1<<31) |
3026 | #define FDI_LINK_TRAIN_PATTERN_1 (0<<28) | 3071 | #define FDI_LINK_TRAIN_PATTERN_1 (0<<28) |
@@ -3060,9 +3105,9 @@ | |||
3060 | #define FDI_SCRAMBLING_DISABLE (1<<7) | 3105 | #define FDI_SCRAMBLING_DISABLE (1<<7) |
3061 | 3106 | ||
3062 | /* FDI_RX, FDI_X is hard-wired to Transcoder_X */ | 3107 | /* FDI_RX, FDI_X is hard-wired to Transcoder_X */ |
3063 | #define FDI_RXA_CTL 0xf000c | 3108 | #define _FDI_RXA_CTL 0xf000c |
3064 | #define FDI_RXB_CTL 0xf100c | 3109 | #define _FDI_RXB_CTL 0xf100c |
3065 | #define FDI_RX_CTL(pipe) _PIPE(pipe, FDI_RXA_CTL, FDI_RXB_CTL) | 3110 | #define FDI_RX_CTL(pipe) _PIPE(pipe, _FDI_RXA_CTL, _FDI_RXB_CTL) |
3066 | #define FDI_RX_ENABLE (1<<31) | 3111 | #define FDI_RX_ENABLE (1<<31) |
3067 | /* train, dp width same as FDI_TX */ | 3112 | /* train, dp width same as FDI_TX */ |
3068 | #define FDI_DP_PORT_WIDTH_X8 (7<<19) | 3113 | #define FDI_DP_PORT_WIDTH_X8 (7<<19) |
@@ -3087,15 +3132,15 @@ | |||
3087 | #define FDI_LINK_TRAIN_NORMAL_CPT (3<<8) | 3132 | #define FDI_LINK_TRAIN_NORMAL_CPT (3<<8) |
3088 | #define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8) | 3133 | #define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8) |
3089 | 3134 | ||
3090 | #define FDI_RXA_MISC 0xf0010 | 3135 | #define _FDI_RXA_MISC 0xf0010 |
3091 | #define FDI_RXB_MISC 0xf1010 | 3136 | #define _FDI_RXB_MISC 0xf1010 |
3092 | #define FDI_RXA_TUSIZE1 0xf0030 | 3137 | #define _FDI_RXA_TUSIZE1 0xf0030 |
3093 | #define FDI_RXA_TUSIZE2 0xf0038 | 3138 | #define _FDI_RXA_TUSIZE2 0xf0038 |
3094 | #define FDI_RXB_TUSIZE1 0xf1030 | 3139 | #define _FDI_RXB_TUSIZE1 0xf1030 |
3095 | #define FDI_RXB_TUSIZE2 0xf1038 | 3140 | #define _FDI_RXB_TUSIZE2 0xf1038 |
3096 | #define FDI_RX_MISC(pipe) _PIPE(pipe, FDI_RXA_MISC, FDI_RXB_MISC) | 3141 | #define FDI_RX_MISC(pipe) _PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC) |
3097 | #define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, FDI_RXA_TUSIZE1, FDI_RXB_TUSIZE1) | 3142 | #define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE1, _FDI_RXB_TUSIZE1) |
3098 | #define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, FDI_RXA_TUSIZE2, FDI_RXB_TUSIZE2) | 3143 | #define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE2, _FDI_RXB_TUSIZE2) |
3099 | 3144 | ||
3100 | /* FDI_RX interrupt register format */ | 3145 | /* FDI_RX interrupt register format */ |
3101 | #define FDI_RX_INTER_LANE_ALIGN (1<<10) | 3146 | #define FDI_RX_INTER_LANE_ALIGN (1<<10) |
@@ -3110,12 +3155,12 @@ | |||
3110 | #define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1) | 3155 | #define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1) |
3111 | #define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0) | 3156 | #define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0) |
3112 | 3157 | ||
3113 | #define FDI_RXA_IIR 0xf0014 | 3158 | #define _FDI_RXA_IIR 0xf0014 |
3114 | #define FDI_RXA_IMR 0xf0018 | 3159 | #define _FDI_RXA_IMR 0xf0018 |
3115 | #define FDI_RXB_IIR 0xf1014 | 3160 | #define _FDI_RXB_IIR 0xf1014 |
3116 | #define FDI_RXB_IMR 0xf1018 | 3161 | #define _FDI_RXB_IMR 0xf1018 |
3117 | #define FDI_RX_IIR(pipe) _PIPE(pipe, FDI_RXA_IIR, FDI_RXB_IIR) | 3162 | #define FDI_RX_IIR(pipe) _PIPE(pipe, _FDI_RXA_IIR, _FDI_RXB_IIR) |
3118 | #define FDI_RX_IMR(pipe) _PIPE(pipe, FDI_RXA_IMR, FDI_RXB_IMR) | 3163 | #define FDI_RX_IMR(pipe) _PIPE(pipe, _FDI_RXA_IMR, _FDI_RXB_IMR) |
3119 | 3164 | ||
3120 | #define FDI_PLL_CTL_1 0xfe000 | 3165 | #define FDI_PLL_CTL_1 0xfe000 |
3121 | #define FDI_PLL_CTL_2 0xfe004 | 3166 | #define FDI_PLL_CTL_2 0xfe004 |
@@ -3145,11 +3190,15 @@ | |||
3145 | #define ADPA_CRT_HOTPLUG_VOLREF_475MV (1<<17) | 3190 | #define ADPA_CRT_HOTPLUG_VOLREF_475MV (1<<17) |
3146 | #define ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16) | 3191 | #define ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16) |
3147 | 3192 | ||
3193 | #define ADPA_PIPE_ENABLED(V, P) \ | ||
3194 | (((V) & (ADPA_TRANS_SELECT_MASK | ADPA_DAC_ENABLE)) == ((P) << 30 | ADPA_DAC_ENABLE)) | ||
3195 | |||
3148 | /* or SDVOB */ | 3196 | /* or SDVOB */ |
3149 | #define HDMIB 0xe1140 | 3197 | #define HDMIB 0xe1140 |
3150 | #define PORT_ENABLE (1 << 31) | 3198 | #define PORT_ENABLE (1 << 31) |
3151 | #define TRANSCODER_A (0) | 3199 | #define TRANSCODER_A (0) |
3152 | #define TRANSCODER_B (1 << 30) | 3200 | #define TRANSCODER_B (1 << 30) |
3201 | #define TRANSCODER_MASK (1 << 30) | ||
3153 | #define COLOR_FORMAT_8bpc (0) | 3202 | #define COLOR_FORMAT_8bpc (0) |
3154 | #define COLOR_FORMAT_12bpc (3 << 26) | 3203 | #define COLOR_FORMAT_12bpc (3 << 26) |
3155 | #define SDVOB_HOTPLUG_ENABLE (1 << 23) | 3204 | #define SDVOB_HOTPLUG_ENABLE (1 << 23) |
@@ -3165,6 +3214,9 @@ | |||
3165 | #define HSYNC_ACTIVE_HIGH (1 << 3) | 3214 | #define HSYNC_ACTIVE_HIGH (1 << 3) |
3166 | #define PORT_DETECTED (1 << 2) | 3215 | #define PORT_DETECTED (1 << 2) |
3167 | 3216 | ||
3217 | #define HDMI_PIPE_ENABLED(V, P) \ | ||
3218 | (((V) & (TRANSCODER_MASK | PORT_ENABLE)) == ((P) << 30 | PORT_ENABLE)) | ||
3219 | |||
3168 | /* PCH SDVOB multiplex with HDMIB */ | 3220 | /* PCH SDVOB multiplex with HDMIB */ |
3169 | #define PCH_SDVOB HDMIB | 3221 | #define PCH_SDVOB HDMIB |
3170 | 3222 | ||
@@ -3240,6 +3292,7 @@ | |||
3240 | #define TRANS_DP_PORT_SEL_B (0<<29) | 3292 | #define TRANS_DP_PORT_SEL_B (0<<29) |
3241 | #define TRANS_DP_PORT_SEL_C (1<<29) | 3293 | #define TRANS_DP_PORT_SEL_C (1<<29) |
3242 | #define TRANS_DP_PORT_SEL_D (2<<29) | 3294 | #define TRANS_DP_PORT_SEL_D (2<<29) |
3295 | #define TRANS_DP_PORT_SEL_NONE (3<<29) | ||
3243 | #define TRANS_DP_PORT_SEL_MASK (3<<29) | 3296 | #define TRANS_DP_PORT_SEL_MASK (3<<29) |
3244 | #define TRANS_DP_AUDIO_ONLY (1<<26) | 3297 | #define TRANS_DP_AUDIO_ONLY (1<<26) |
3245 | #define TRANS_DP_ENH_FRAMING (1<<18) | 3298 | #define TRANS_DP_ENH_FRAMING (1<<18) |
@@ -3288,15 +3341,28 @@ | |||
3288 | #define GEN6_RP_DOWN_TIMEOUT 0xA010 | 3341 | #define GEN6_RP_DOWN_TIMEOUT 0xA010 |
3289 | #define GEN6_RP_INTERRUPT_LIMITS 0xA014 | 3342 | #define GEN6_RP_INTERRUPT_LIMITS 0xA014 |
3290 | #define GEN6_RPSTAT1 0xA01C | 3343 | #define GEN6_RPSTAT1 0xA01C |
3344 | #define GEN6_CAGF_SHIFT 8 | ||
3345 | #define GEN6_CAGF_MASK (0x7f << GEN6_CAGF_SHIFT) | ||
3291 | #define GEN6_RP_CONTROL 0xA024 | 3346 | #define GEN6_RP_CONTROL 0xA024 |
3292 | #define GEN6_RP_MEDIA_TURBO (1<<11) | 3347 | #define GEN6_RP_MEDIA_TURBO (1<<11) |
3293 | #define GEN6_RP_USE_NORMAL_FREQ (1<<9) | 3348 | #define GEN6_RP_USE_NORMAL_FREQ (1<<9) |
3294 | #define GEN6_RP_MEDIA_IS_GFX (1<<8) | 3349 | #define GEN6_RP_MEDIA_IS_GFX (1<<8) |
3295 | #define GEN6_RP_ENABLE (1<<7) | 3350 | #define GEN6_RP_ENABLE (1<<7) |
3296 | #define GEN6_RP_UP_BUSY_MAX (0x2<<3) | 3351 | #define GEN6_RP_UP_IDLE_MIN (0x1<<3) |
3297 | #define GEN6_RP_DOWN_BUSY_MIN (0x2<<0) | 3352 | #define GEN6_RP_UP_BUSY_AVG (0x2<<3) |
3353 | #define GEN6_RP_UP_BUSY_CONT (0x4<<3) | ||
3354 | #define GEN6_RP_DOWN_IDLE_CONT (0x1<<0) | ||
3298 | #define GEN6_RP_UP_THRESHOLD 0xA02C | 3355 | #define GEN6_RP_UP_THRESHOLD 0xA02C |
3299 | #define GEN6_RP_DOWN_THRESHOLD 0xA030 | 3356 | #define GEN6_RP_DOWN_THRESHOLD 0xA030 |
3357 | #define GEN6_RP_CUR_UP_EI 0xA050 | ||
3358 | #define GEN6_CURICONT_MASK 0xffffff | ||
3359 | #define GEN6_RP_CUR_UP 0xA054 | ||
3360 | #define GEN6_CURBSYTAVG_MASK 0xffffff | ||
3361 | #define GEN6_RP_PREV_UP 0xA058 | ||
3362 | #define GEN6_RP_CUR_DOWN_EI 0xA05C | ||
3363 | #define GEN6_CURIAVG_MASK 0xffffff | ||
3364 | #define GEN6_RP_CUR_DOWN 0xA060 | ||
3365 | #define GEN6_RP_PREV_DOWN 0xA064 | ||
3300 | #define GEN6_RP_UP_EI 0xA068 | 3366 | #define GEN6_RP_UP_EI 0xA068 |
3301 | #define GEN6_RP_DOWN_EI 0xA06C | 3367 | #define GEN6_RP_DOWN_EI 0xA06C |
3302 | #define GEN6_RP_IDLE_HYSTERSIS 0xA070 | 3368 | #define GEN6_RP_IDLE_HYSTERSIS 0xA070 |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 0521ecf26017..da474153a0a2 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -34,11 +34,10 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) | |||
34 | struct drm_i915_private *dev_priv = dev->dev_private; | 34 | struct drm_i915_private *dev_priv = dev->dev_private; |
35 | u32 dpll_reg; | 35 | u32 dpll_reg; |
36 | 36 | ||
37 | if (HAS_PCH_SPLIT(dev)) { | 37 | if (HAS_PCH_SPLIT(dev)) |
38 | dpll_reg = (pipe == PIPE_A) ? PCH_DPLL_A: PCH_DPLL_B; | 38 | dpll_reg = (pipe == PIPE_A) ? _PCH_DPLL_A : _PCH_DPLL_B; |
39 | } else { | 39 | else |
40 | dpll_reg = (pipe == PIPE_A) ? DPLL_A: DPLL_B; | 40 | dpll_reg = (pipe == PIPE_A) ? _DPLL_A : _DPLL_B; |
41 | } | ||
42 | 41 | ||
43 | return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE); | 42 | return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE); |
44 | } | 43 | } |
@@ -46,7 +45,7 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) | |||
46 | static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | 45 | static void i915_save_palette(struct drm_device *dev, enum pipe pipe) |
47 | { | 46 | { |
48 | struct drm_i915_private *dev_priv = dev->dev_private; | 47 | struct drm_i915_private *dev_priv = dev->dev_private; |
49 | unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); | 48 | unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B); |
50 | u32 *array; | 49 | u32 *array; |
51 | int i; | 50 | int i; |
52 | 51 | ||
@@ -54,7 +53,7 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | |||
54 | return; | 53 | return; |
55 | 54 | ||
56 | if (HAS_PCH_SPLIT(dev)) | 55 | if (HAS_PCH_SPLIT(dev)) |
57 | reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; | 56 | reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B; |
58 | 57 | ||
59 | if (pipe == PIPE_A) | 58 | if (pipe == PIPE_A) |
60 | array = dev_priv->save_palette_a; | 59 | array = dev_priv->save_palette_a; |
@@ -68,7 +67,7 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | |||
68 | static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) | 67 | static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) |
69 | { | 68 | { |
70 | struct drm_i915_private *dev_priv = dev->dev_private; | 69 | struct drm_i915_private *dev_priv = dev->dev_private; |
71 | unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); | 70 | unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B); |
72 | u32 *array; | 71 | u32 *array; |
73 | int i; | 72 | int i; |
74 | 73 | ||
@@ -76,7 +75,7 @@ static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) | |||
76 | return; | 75 | return; |
77 | 76 | ||
78 | if (HAS_PCH_SPLIT(dev)) | 77 | if (HAS_PCH_SPLIT(dev)) |
79 | reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; | 78 | reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B; |
80 | 79 | ||
81 | if (pipe == PIPE_A) | 80 | if (pipe == PIPE_A) |
82 | array = dev_priv->save_palette_a; | 81 | array = dev_priv->save_palette_a; |
@@ -241,12 +240,12 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
241 | return; | 240 | return; |
242 | 241 | ||
243 | /* Cursor state */ | 242 | /* Cursor state */ |
244 | dev_priv->saveCURACNTR = I915_READ(CURACNTR); | 243 | dev_priv->saveCURACNTR = I915_READ(_CURACNTR); |
245 | dev_priv->saveCURAPOS = I915_READ(CURAPOS); | 244 | dev_priv->saveCURAPOS = I915_READ(_CURAPOS); |
246 | dev_priv->saveCURABASE = I915_READ(CURABASE); | 245 | dev_priv->saveCURABASE = I915_READ(_CURABASE); |
247 | dev_priv->saveCURBCNTR = I915_READ(CURBCNTR); | 246 | dev_priv->saveCURBCNTR = I915_READ(_CURBCNTR); |
248 | dev_priv->saveCURBPOS = I915_READ(CURBPOS); | 247 | dev_priv->saveCURBPOS = I915_READ(_CURBPOS); |
249 | dev_priv->saveCURBBASE = I915_READ(CURBBASE); | 248 | dev_priv->saveCURBBASE = I915_READ(_CURBBASE); |
250 | if (IS_GEN2(dev)) | 249 | if (IS_GEN2(dev)) |
251 | dev_priv->saveCURSIZE = I915_READ(CURSIZE); | 250 | dev_priv->saveCURSIZE = I915_READ(CURSIZE); |
252 | 251 | ||
@@ -256,118 +255,118 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
256 | } | 255 | } |
257 | 256 | ||
258 | /* Pipe & plane A info */ | 257 | /* Pipe & plane A info */ |
259 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); | 258 | dev_priv->savePIPEACONF = I915_READ(_PIPEACONF); |
260 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); | 259 | dev_priv->savePIPEASRC = I915_READ(_PIPEASRC); |
261 | if (HAS_PCH_SPLIT(dev)) { | 260 | if (HAS_PCH_SPLIT(dev)) { |
262 | dev_priv->saveFPA0 = I915_READ(PCH_FPA0); | 261 | dev_priv->saveFPA0 = I915_READ(_PCH_FPA0); |
263 | dev_priv->saveFPA1 = I915_READ(PCH_FPA1); | 262 | dev_priv->saveFPA1 = I915_READ(_PCH_FPA1); |
264 | dev_priv->saveDPLL_A = I915_READ(PCH_DPLL_A); | 263 | dev_priv->saveDPLL_A = I915_READ(_PCH_DPLL_A); |
265 | } else { | 264 | } else { |
266 | dev_priv->saveFPA0 = I915_READ(FPA0); | 265 | dev_priv->saveFPA0 = I915_READ(_FPA0); |
267 | dev_priv->saveFPA1 = I915_READ(FPA1); | 266 | dev_priv->saveFPA1 = I915_READ(_FPA1); |
268 | dev_priv->saveDPLL_A = I915_READ(DPLL_A); | 267 | dev_priv->saveDPLL_A = I915_READ(_DPLL_A); |
269 | } | 268 | } |
270 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) | 269 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) |
271 | dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); | 270 | dev_priv->saveDPLL_A_MD = I915_READ(_DPLL_A_MD); |
272 | dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); | 271 | dev_priv->saveHTOTAL_A = I915_READ(_HTOTAL_A); |
273 | dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); | 272 | dev_priv->saveHBLANK_A = I915_READ(_HBLANK_A); |
274 | dev_priv->saveHSYNC_A = I915_READ(HSYNC_A); | 273 | dev_priv->saveHSYNC_A = I915_READ(_HSYNC_A); |
275 | dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); | 274 | dev_priv->saveVTOTAL_A = I915_READ(_VTOTAL_A); |
276 | dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); | 275 | dev_priv->saveVBLANK_A = I915_READ(_VBLANK_A); |
277 | dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); | 276 | dev_priv->saveVSYNC_A = I915_READ(_VSYNC_A); |
278 | if (!HAS_PCH_SPLIT(dev)) | 277 | if (!HAS_PCH_SPLIT(dev)) |
279 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | 278 | dev_priv->saveBCLRPAT_A = I915_READ(_BCLRPAT_A); |
280 | 279 | ||
281 | if (HAS_PCH_SPLIT(dev)) { | 280 | if (HAS_PCH_SPLIT(dev)) { |
282 | dev_priv->savePIPEA_DATA_M1 = I915_READ(PIPEA_DATA_M1); | 281 | dev_priv->savePIPEA_DATA_M1 = I915_READ(_PIPEA_DATA_M1); |
283 | dev_priv->savePIPEA_DATA_N1 = I915_READ(PIPEA_DATA_N1); | 282 | dev_priv->savePIPEA_DATA_N1 = I915_READ(_PIPEA_DATA_N1); |
284 | dev_priv->savePIPEA_LINK_M1 = I915_READ(PIPEA_LINK_M1); | 283 | dev_priv->savePIPEA_LINK_M1 = I915_READ(_PIPEA_LINK_M1); |
285 | dev_priv->savePIPEA_LINK_N1 = I915_READ(PIPEA_LINK_N1); | 284 | dev_priv->savePIPEA_LINK_N1 = I915_READ(_PIPEA_LINK_N1); |
286 | 285 | ||
287 | dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL); | 286 | dev_priv->saveFDI_TXA_CTL = I915_READ(_FDI_TXA_CTL); |
288 | dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL); | 287 | dev_priv->saveFDI_RXA_CTL = I915_READ(_FDI_RXA_CTL); |
289 | 288 | ||
290 | dev_priv->savePFA_CTL_1 = I915_READ(PFA_CTL_1); | 289 | dev_priv->savePFA_CTL_1 = I915_READ(_PFA_CTL_1); |
291 | dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ); | 290 | dev_priv->savePFA_WIN_SZ = I915_READ(_PFA_WIN_SZ); |
292 | dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS); | 291 | dev_priv->savePFA_WIN_POS = I915_READ(_PFA_WIN_POS); |
293 | 292 | ||
294 | dev_priv->saveTRANSACONF = I915_READ(TRANSACONF); | 293 | dev_priv->saveTRANSACONF = I915_READ(_TRANSACONF); |
295 | dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A); | 294 | dev_priv->saveTRANS_HTOTAL_A = I915_READ(_TRANS_HTOTAL_A); |
296 | dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A); | 295 | dev_priv->saveTRANS_HBLANK_A = I915_READ(_TRANS_HBLANK_A); |
297 | dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A); | 296 | dev_priv->saveTRANS_HSYNC_A = I915_READ(_TRANS_HSYNC_A); |
298 | dev_priv->saveTRANS_VTOTAL_A = I915_READ(TRANS_VTOTAL_A); | 297 | dev_priv->saveTRANS_VTOTAL_A = I915_READ(_TRANS_VTOTAL_A); |
299 | dev_priv->saveTRANS_VBLANK_A = I915_READ(TRANS_VBLANK_A); | 298 | dev_priv->saveTRANS_VBLANK_A = I915_READ(_TRANS_VBLANK_A); |
300 | dev_priv->saveTRANS_VSYNC_A = I915_READ(TRANS_VSYNC_A); | 299 | dev_priv->saveTRANS_VSYNC_A = I915_READ(_TRANS_VSYNC_A); |
301 | } | 300 | } |
302 | 301 | ||
303 | dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); | 302 | dev_priv->saveDSPACNTR = I915_READ(_DSPACNTR); |
304 | dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); | 303 | dev_priv->saveDSPASTRIDE = I915_READ(_DSPASTRIDE); |
305 | dev_priv->saveDSPASIZE = I915_READ(DSPASIZE); | 304 | dev_priv->saveDSPASIZE = I915_READ(_DSPASIZE); |
306 | dev_priv->saveDSPAPOS = I915_READ(DSPAPOS); | 305 | dev_priv->saveDSPAPOS = I915_READ(_DSPAPOS); |
307 | dev_priv->saveDSPAADDR = I915_READ(DSPAADDR); | 306 | dev_priv->saveDSPAADDR = I915_READ(_DSPAADDR); |
308 | if (INTEL_INFO(dev)->gen >= 4) { | 307 | if (INTEL_INFO(dev)->gen >= 4) { |
309 | dev_priv->saveDSPASURF = I915_READ(DSPASURF); | 308 | dev_priv->saveDSPASURF = I915_READ(_DSPASURF); |
310 | dev_priv->saveDSPATILEOFF = I915_READ(DSPATILEOFF); | 309 | dev_priv->saveDSPATILEOFF = I915_READ(_DSPATILEOFF); |
311 | } | 310 | } |
312 | i915_save_palette(dev, PIPE_A); | 311 | i915_save_palette(dev, PIPE_A); |
313 | dev_priv->savePIPEASTAT = I915_READ(PIPEASTAT); | 312 | dev_priv->savePIPEASTAT = I915_READ(_PIPEASTAT); |
314 | 313 | ||
315 | /* Pipe & plane B info */ | 314 | /* Pipe & plane B info */ |
316 | dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); | 315 | dev_priv->savePIPEBCONF = I915_READ(_PIPEBCONF); |
317 | dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); | 316 | dev_priv->savePIPEBSRC = I915_READ(_PIPEBSRC); |
318 | if (HAS_PCH_SPLIT(dev)) { | 317 | if (HAS_PCH_SPLIT(dev)) { |
319 | dev_priv->saveFPB0 = I915_READ(PCH_FPB0); | 318 | dev_priv->saveFPB0 = I915_READ(_PCH_FPB0); |
320 | dev_priv->saveFPB1 = I915_READ(PCH_FPB1); | 319 | dev_priv->saveFPB1 = I915_READ(_PCH_FPB1); |
321 | dev_priv->saveDPLL_B = I915_READ(PCH_DPLL_B); | 320 | dev_priv->saveDPLL_B = I915_READ(_PCH_DPLL_B); |
322 | } else { | 321 | } else { |
323 | dev_priv->saveFPB0 = I915_READ(FPB0); | 322 | dev_priv->saveFPB0 = I915_READ(_FPB0); |
324 | dev_priv->saveFPB1 = I915_READ(FPB1); | 323 | dev_priv->saveFPB1 = I915_READ(_FPB1); |
325 | dev_priv->saveDPLL_B = I915_READ(DPLL_B); | 324 | dev_priv->saveDPLL_B = I915_READ(_DPLL_B); |
326 | } | 325 | } |
327 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) | 326 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) |
328 | dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); | 327 | dev_priv->saveDPLL_B_MD = I915_READ(_DPLL_B_MD); |
329 | dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); | 328 | dev_priv->saveHTOTAL_B = I915_READ(_HTOTAL_B); |
330 | dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); | 329 | dev_priv->saveHBLANK_B = I915_READ(_HBLANK_B); |
331 | dev_priv->saveHSYNC_B = I915_READ(HSYNC_B); | 330 | dev_priv->saveHSYNC_B = I915_READ(_HSYNC_B); |
332 | dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); | 331 | dev_priv->saveVTOTAL_B = I915_READ(_VTOTAL_B); |
333 | dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); | 332 | dev_priv->saveVBLANK_B = I915_READ(_VBLANK_B); |
334 | dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); | 333 | dev_priv->saveVSYNC_B = I915_READ(_VSYNC_B); |
335 | if (!HAS_PCH_SPLIT(dev)) | 334 | if (!HAS_PCH_SPLIT(dev)) |
336 | dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B); | 335 | dev_priv->saveBCLRPAT_B = I915_READ(_BCLRPAT_B); |
337 | 336 | ||
338 | if (HAS_PCH_SPLIT(dev)) { | 337 | if (HAS_PCH_SPLIT(dev)) { |
339 | dev_priv->savePIPEB_DATA_M1 = I915_READ(PIPEB_DATA_M1); | 338 | dev_priv->savePIPEB_DATA_M1 = I915_READ(_PIPEB_DATA_M1); |
340 | dev_priv->savePIPEB_DATA_N1 = I915_READ(PIPEB_DATA_N1); | 339 | dev_priv->savePIPEB_DATA_N1 = I915_READ(_PIPEB_DATA_N1); |
341 | dev_priv->savePIPEB_LINK_M1 = I915_READ(PIPEB_LINK_M1); | 340 | dev_priv->savePIPEB_LINK_M1 = I915_READ(_PIPEB_LINK_M1); |
342 | dev_priv->savePIPEB_LINK_N1 = I915_READ(PIPEB_LINK_N1); | 341 | dev_priv->savePIPEB_LINK_N1 = I915_READ(_PIPEB_LINK_N1); |
343 | 342 | ||
344 | dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL); | 343 | dev_priv->saveFDI_TXB_CTL = I915_READ(_FDI_TXB_CTL); |
345 | dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL); | 344 | dev_priv->saveFDI_RXB_CTL = I915_READ(_FDI_RXB_CTL); |
346 | 345 | ||
347 | dev_priv->savePFB_CTL_1 = I915_READ(PFB_CTL_1); | 346 | dev_priv->savePFB_CTL_1 = I915_READ(_PFB_CTL_1); |
348 | dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ); | 347 | dev_priv->savePFB_WIN_SZ = I915_READ(_PFB_WIN_SZ); |
349 | dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS); | 348 | dev_priv->savePFB_WIN_POS = I915_READ(_PFB_WIN_POS); |
350 | 349 | ||
351 | dev_priv->saveTRANSBCONF = I915_READ(TRANSBCONF); | 350 | dev_priv->saveTRANSBCONF = I915_READ(_TRANSBCONF); |
352 | dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B); | 351 | dev_priv->saveTRANS_HTOTAL_B = I915_READ(_TRANS_HTOTAL_B); |
353 | dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B); | 352 | dev_priv->saveTRANS_HBLANK_B = I915_READ(_TRANS_HBLANK_B); |
354 | dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B); | 353 | dev_priv->saveTRANS_HSYNC_B = I915_READ(_TRANS_HSYNC_B); |
355 | dev_priv->saveTRANS_VTOTAL_B = I915_READ(TRANS_VTOTAL_B); | 354 | dev_priv->saveTRANS_VTOTAL_B = I915_READ(_TRANS_VTOTAL_B); |
356 | dev_priv->saveTRANS_VBLANK_B = I915_READ(TRANS_VBLANK_B); | 355 | dev_priv->saveTRANS_VBLANK_B = I915_READ(_TRANS_VBLANK_B); |
357 | dev_priv->saveTRANS_VSYNC_B = I915_READ(TRANS_VSYNC_B); | 356 | dev_priv->saveTRANS_VSYNC_B = I915_READ(_TRANS_VSYNC_B); |
358 | } | 357 | } |
359 | 358 | ||
360 | dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); | 359 | dev_priv->saveDSPBCNTR = I915_READ(_DSPBCNTR); |
361 | dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); | 360 | dev_priv->saveDSPBSTRIDE = I915_READ(_DSPBSTRIDE); |
362 | dev_priv->saveDSPBSIZE = I915_READ(DSPBSIZE); | 361 | dev_priv->saveDSPBSIZE = I915_READ(_DSPBSIZE); |
363 | dev_priv->saveDSPBPOS = I915_READ(DSPBPOS); | 362 | dev_priv->saveDSPBPOS = I915_READ(_DSPBPOS); |
364 | dev_priv->saveDSPBADDR = I915_READ(DSPBADDR); | 363 | dev_priv->saveDSPBADDR = I915_READ(_DSPBADDR); |
365 | if (INTEL_INFO(dev)->gen >= 4) { | 364 | if (INTEL_INFO(dev)->gen >= 4) { |
366 | dev_priv->saveDSPBSURF = I915_READ(DSPBSURF); | 365 | dev_priv->saveDSPBSURF = I915_READ(_DSPBSURF); |
367 | dev_priv->saveDSPBTILEOFF = I915_READ(DSPBTILEOFF); | 366 | dev_priv->saveDSPBTILEOFF = I915_READ(_DSPBTILEOFF); |
368 | } | 367 | } |
369 | i915_save_palette(dev, PIPE_B); | 368 | i915_save_palette(dev, PIPE_B); |
370 | dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); | 369 | dev_priv->savePIPEBSTAT = I915_READ(_PIPEBSTAT); |
371 | 370 | ||
372 | /* Fences */ | 371 | /* Fences */ |
373 | switch (INTEL_INFO(dev)->gen) { | 372 | switch (INTEL_INFO(dev)->gen) { |
@@ -426,19 +425,19 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
426 | 425 | ||
427 | 426 | ||
428 | if (HAS_PCH_SPLIT(dev)) { | 427 | if (HAS_PCH_SPLIT(dev)) { |
429 | dpll_a_reg = PCH_DPLL_A; | 428 | dpll_a_reg = _PCH_DPLL_A; |
430 | dpll_b_reg = PCH_DPLL_B; | 429 | dpll_b_reg = _PCH_DPLL_B; |
431 | fpa0_reg = PCH_FPA0; | 430 | fpa0_reg = _PCH_FPA0; |
432 | fpb0_reg = PCH_FPB0; | 431 | fpb0_reg = _PCH_FPB0; |
433 | fpa1_reg = PCH_FPA1; | 432 | fpa1_reg = _PCH_FPA1; |
434 | fpb1_reg = PCH_FPB1; | 433 | fpb1_reg = _PCH_FPB1; |
435 | } else { | 434 | } else { |
436 | dpll_a_reg = DPLL_A; | 435 | dpll_a_reg = _DPLL_A; |
437 | dpll_b_reg = DPLL_B; | 436 | dpll_b_reg = _DPLL_B; |
438 | fpa0_reg = FPA0; | 437 | fpa0_reg = _FPA0; |
439 | fpb0_reg = FPB0; | 438 | fpb0_reg = _FPB0; |
440 | fpa1_reg = FPA1; | 439 | fpa1_reg = _FPA1; |
441 | fpb1_reg = FPB1; | 440 | fpb1_reg = _FPB1; |
442 | } | 441 | } |
443 | 442 | ||
444 | if (HAS_PCH_SPLIT(dev)) { | 443 | if (HAS_PCH_SPLIT(dev)) { |
@@ -461,60 +460,60 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
461 | POSTING_READ(dpll_a_reg); | 460 | POSTING_READ(dpll_a_reg); |
462 | udelay(150); | 461 | udelay(150); |
463 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { | 462 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { |
464 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); | 463 | I915_WRITE(_DPLL_A_MD, dev_priv->saveDPLL_A_MD); |
465 | POSTING_READ(DPLL_A_MD); | 464 | POSTING_READ(_DPLL_A_MD); |
466 | } | 465 | } |
467 | udelay(150); | 466 | udelay(150); |
468 | 467 | ||
469 | /* Restore mode */ | 468 | /* Restore mode */ |
470 | I915_WRITE(HTOTAL_A, dev_priv->saveHTOTAL_A); | 469 | I915_WRITE(_HTOTAL_A, dev_priv->saveHTOTAL_A); |
471 | I915_WRITE(HBLANK_A, dev_priv->saveHBLANK_A); | 470 | I915_WRITE(_HBLANK_A, dev_priv->saveHBLANK_A); |
472 | I915_WRITE(HSYNC_A, dev_priv->saveHSYNC_A); | 471 | I915_WRITE(_HSYNC_A, dev_priv->saveHSYNC_A); |
473 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); | 472 | I915_WRITE(_VTOTAL_A, dev_priv->saveVTOTAL_A); |
474 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); | 473 | I915_WRITE(_VBLANK_A, dev_priv->saveVBLANK_A); |
475 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); | 474 | I915_WRITE(_VSYNC_A, dev_priv->saveVSYNC_A); |
476 | if (!HAS_PCH_SPLIT(dev)) | 475 | if (!HAS_PCH_SPLIT(dev)) |
477 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | 476 | I915_WRITE(_BCLRPAT_A, dev_priv->saveBCLRPAT_A); |
478 | 477 | ||
479 | if (HAS_PCH_SPLIT(dev)) { | 478 | if (HAS_PCH_SPLIT(dev)) { |
480 | I915_WRITE(PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1); | 479 | I915_WRITE(_PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1); |
481 | I915_WRITE(PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1); | 480 | I915_WRITE(_PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1); |
482 | I915_WRITE(PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1); | 481 | I915_WRITE(_PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1); |
483 | I915_WRITE(PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1); | 482 | I915_WRITE(_PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1); |
484 | 483 | ||
485 | I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); | 484 | I915_WRITE(_FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); |
486 | I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); | 485 | I915_WRITE(_FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); |
487 | 486 | ||
488 | I915_WRITE(PFA_CTL_1, dev_priv->savePFA_CTL_1); | 487 | I915_WRITE(_PFA_CTL_1, dev_priv->savePFA_CTL_1); |
489 | I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); | 488 | I915_WRITE(_PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); |
490 | I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS); | 489 | I915_WRITE(_PFA_WIN_POS, dev_priv->savePFA_WIN_POS); |
491 | 490 | ||
492 | I915_WRITE(TRANSACONF, dev_priv->saveTRANSACONF); | 491 | I915_WRITE(_TRANSACONF, dev_priv->saveTRANSACONF); |
493 | I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); | 492 | I915_WRITE(_TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); |
494 | I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); | 493 | I915_WRITE(_TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); |
495 | I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); | 494 | I915_WRITE(_TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); |
496 | I915_WRITE(TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A); | 495 | I915_WRITE(_TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A); |
497 | I915_WRITE(TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A); | 496 | I915_WRITE(_TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A); |
498 | I915_WRITE(TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A); | 497 | I915_WRITE(_TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A); |
499 | } | 498 | } |
500 | 499 | ||
501 | /* Restore plane info */ | 500 | /* Restore plane info */ |
502 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); | 501 | I915_WRITE(_DSPASIZE, dev_priv->saveDSPASIZE); |
503 | I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS); | 502 | I915_WRITE(_DSPAPOS, dev_priv->saveDSPAPOS); |
504 | I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC); | 503 | I915_WRITE(_PIPEASRC, dev_priv->savePIPEASRC); |
505 | I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR); | 504 | I915_WRITE(_DSPAADDR, dev_priv->saveDSPAADDR); |
506 | I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE); | 505 | I915_WRITE(_DSPASTRIDE, dev_priv->saveDSPASTRIDE); |
507 | if (INTEL_INFO(dev)->gen >= 4) { | 506 | if (INTEL_INFO(dev)->gen >= 4) { |
508 | I915_WRITE(DSPASURF, dev_priv->saveDSPASURF); | 507 | I915_WRITE(_DSPASURF, dev_priv->saveDSPASURF); |
509 | I915_WRITE(DSPATILEOFF, dev_priv->saveDSPATILEOFF); | 508 | I915_WRITE(_DSPATILEOFF, dev_priv->saveDSPATILEOFF); |
510 | } | 509 | } |
511 | 510 | ||
512 | I915_WRITE(PIPEACONF, dev_priv->savePIPEACONF); | 511 | I915_WRITE(_PIPEACONF, dev_priv->savePIPEACONF); |
513 | 512 | ||
514 | i915_restore_palette(dev, PIPE_A); | 513 | i915_restore_palette(dev, PIPE_A); |
515 | /* Enable the plane */ | 514 | /* Enable the plane */ |
516 | I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR); | 515 | I915_WRITE(_DSPACNTR, dev_priv->saveDSPACNTR); |
517 | I915_WRITE(DSPAADDR, I915_READ(DSPAADDR)); | 516 | I915_WRITE(_DSPAADDR, I915_READ(_DSPAADDR)); |
518 | 517 | ||
519 | /* Pipe & plane B info */ | 518 | /* Pipe & plane B info */ |
520 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { | 519 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { |
@@ -530,68 +529,68 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
530 | POSTING_READ(dpll_b_reg); | 529 | POSTING_READ(dpll_b_reg); |
531 | udelay(150); | 530 | udelay(150); |
532 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { | 531 | if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { |
533 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); | 532 | I915_WRITE(_DPLL_B_MD, dev_priv->saveDPLL_B_MD); |
534 | POSTING_READ(DPLL_B_MD); | 533 | POSTING_READ(_DPLL_B_MD); |
535 | } | 534 | } |
536 | udelay(150); | 535 | udelay(150); |
537 | 536 | ||
538 | /* Restore mode */ | 537 | /* Restore mode */ |
539 | I915_WRITE(HTOTAL_B, dev_priv->saveHTOTAL_B); | 538 | I915_WRITE(_HTOTAL_B, dev_priv->saveHTOTAL_B); |
540 | I915_WRITE(HBLANK_B, dev_priv->saveHBLANK_B); | 539 | I915_WRITE(_HBLANK_B, dev_priv->saveHBLANK_B); |
541 | I915_WRITE(HSYNC_B, dev_priv->saveHSYNC_B); | 540 | I915_WRITE(_HSYNC_B, dev_priv->saveHSYNC_B); |
542 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); | 541 | I915_WRITE(_VTOTAL_B, dev_priv->saveVTOTAL_B); |
543 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); | 542 | I915_WRITE(_VBLANK_B, dev_priv->saveVBLANK_B); |
544 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); | 543 | I915_WRITE(_VSYNC_B, dev_priv->saveVSYNC_B); |
545 | if (!HAS_PCH_SPLIT(dev)) | 544 | if (!HAS_PCH_SPLIT(dev)) |
546 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | 545 | I915_WRITE(_BCLRPAT_B, dev_priv->saveBCLRPAT_B); |
547 | 546 | ||
548 | if (HAS_PCH_SPLIT(dev)) { | 547 | if (HAS_PCH_SPLIT(dev)) { |
549 | I915_WRITE(PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1); | 548 | I915_WRITE(_PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1); |
550 | I915_WRITE(PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1); | 549 | I915_WRITE(_PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1); |
551 | I915_WRITE(PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1); | 550 | I915_WRITE(_PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1); |
552 | I915_WRITE(PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1); | 551 | I915_WRITE(_PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1); |
553 | 552 | ||
554 | I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); | 553 | I915_WRITE(_FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); |
555 | I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); | 554 | I915_WRITE(_FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); |
556 | 555 | ||
557 | I915_WRITE(PFB_CTL_1, dev_priv->savePFB_CTL_1); | 556 | I915_WRITE(_PFB_CTL_1, dev_priv->savePFB_CTL_1); |
558 | I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); | 557 | I915_WRITE(_PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); |
559 | I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS); | 558 | I915_WRITE(_PFB_WIN_POS, dev_priv->savePFB_WIN_POS); |
560 | 559 | ||
561 | I915_WRITE(TRANSBCONF, dev_priv->saveTRANSBCONF); | 560 | I915_WRITE(_TRANSBCONF, dev_priv->saveTRANSBCONF); |
562 | I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); | 561 | I915_WRITE(_TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); |
563 | I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); | 562 | I915_WRITE(_TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); |
564 | I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); | 563 | I915_WRITE(_TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); |
565 | I915_WRITE(TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B); | 564 | I915_WRITE(_TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B); |
566 | I915_WRITE(TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B); | 565 | I915_WRITE(_TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B); |
567 | I915_WRITE(TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B); | 566 | I915_WRITE(_TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B); |
568 | } | 567 | } |
569 | 568 | ||
570 | /* Restore plane info */ | 569 | /* Restore plane info */ |
571 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); | 570 | I915_WRITE(_DSPBSIZE, dev_priv->saveDSPBSIZE); |
572 | I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS); | 571 | I915_WRITE(_DSPBPOS, dev_priv->saveDSPBPOS); |
573 | I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC); | 572 | I915_WRITE(_PIPEBSRC, dev_priv->savePIPEBSRC); |
574 | I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR); | 573 | I915_WRITE(_DSPBADDR, dev_priv->saveDSPBADDR); |
575 | I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); | 574 | I915_WRITE(_DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); |
576 | if (INTEL_INFO(dev)->gen >= 4) { | 575 | if (INTEL_INFO(dev)->gen >= 4) { |
577 | I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF); | 576 | I915_WRITE(_DSPBSURF, dev_priv->saveDSPBSURF); |
578 | I915_WRITE(DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); | 577 | I915_WRITE(_DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); |
579 | } | 578 | } |
580 | 579 | ||
581 | I915_WRITE(PIPEBCONF, dev_priv->savePIPEBCONF); | 580 | I915_WRITE(_PIPEBCONF, dev_priv->savePIPEBCONF); |
582 | 581 | ||
583 | i915_restore_palette(dev, PIPE_B); | 582 | i915_restore_palette(dev, PIPE_B); |
584 | /* Enable the plane */ | 583 | /* Enable the plane */ |
585 | I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR); | 584 | I915_WRITE(_DSPBCNTR, dev_priv->saveDSPBCNTR); |
586 | I915_WRITE(DSPBADDR, I915_READ(DSPBADDR)); | 585 | I915_WRITE(_DSPBADDR, I915_READ(_DSPBADDR)); |
587 | 586 | ||
588 | /* Cursor state */ | 587 | /* Cursor state */ |
589 | I915_WRITE(CURAPOS, dev_priv->saveCURAPOS); | 588 | I915_WRITE(_CURAPOS, dev_priv->saveCURAPOS); |
590 | I915_WRITE(CURACNTR, dev_priv->saveCURACNTR); | 589 | I915_WRITE(_CURACNTR, dev_priv->saveCURACNTR); |
591 | I915_WRITE(CURABASE, dev_priv->saveCURABASE); | 590 | I915_WRITE(_CURABASE, dev_priv->saveCURABASE); |
592 | I915_WRITE(CURBPOS, dev_priv->saveCURBPOS); | 591 | I915_WRITE(_CURBPOS, dev_priv->saveCURBPOS); |
593 | I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR); | 592 | I915_WRITE(_CURBCNTR, dev_priv->saveCURBCNTR); |
594 | I915_WRITE(CURBBASE, dev_priv->saveCURBBASE); | 593 | I915_WRITE(_CURBBASE, dev_priv->saveCURBBASE); |
595 | if (IS_GEN2(dev)) | 594 | if (IS_GEN2(dev)) |
596 | I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); | 595 | I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); |
597 | 596 | ||
@@ -653,14 +652,14 @@ void i915_save_display(struct drm_device *dev) | |||
653 | dev_priv->saveDP_B = I915_READ(DP_B); | 652 | dev_priv->saveDP_B = I915_READ(DP_B); |
654 | dev_priv->saveDP_C = I915_READ(DP_C); | 653 | dev_priv->saveDP_C = I915_READ(DP_C); |
655 | dev_priv->saveDP_D = I915_READ(DP_D); | 654 | dev_priv->saveDP_D = I915_READ(DP_D); |
656 | dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(PIPEA_GMCH_DATA_M); | 655 | dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(_PIPEA_GMCH_DATA_M); |
657 | dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(PIPEB_GMCH_DATA_M); | 656 | dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(_PIPEB_GMCH_DATA_M); |
658 | dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(PIPEA_GMCH_DATA_N); | 657 | dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(_PIPEA_GMCH_DATA_N); |
659 | dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(PIPEB_GMCH_DATA_N); | 658 | dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(_PIPEB_GMCH_DATA_N); |
660 | dev_priv->savePIPEA_DP_LINK_M = I915_READ(PIPEA_DP_LINK_M); | 659 | dev_priv->savePIPEA_DP_LINK_M = I915_READ(_PIPEA_DP_LINK_M); |
661 | dev_priv->savePIPEB_DP_LINK_M = I915_READ(PIPEB_DP_LINK_M); | 660 | dev_priv->savePIPEB_DP_LINK_M = I915_READ(_PIPEB_DP_LINK_M); |
662 | dev_priv->savePIPEA_DP_LINK_N = I915_READ(PIPEA_DP_LINK_N); | 661 | dev_priv->savePIPEA_DP_LINK_N = I915_READ(_PIPEA_DP_LINK_N); |
663 | dev_priv->savePIPEB_DP_LINK_N = I915_READ(PIPEB_DP_LINK_N); | 662 | dev_priv->savePIPEB_DP_LINK_N = I915_READ(_PIPEB_DP_LINK_N); |
664 | } | 663 | } |
665 | /* FIXME: save TV & SDVO state */ | 664 | /* FIXME: save TV & SDVO state */ |
666 | 665 | ||
@@ -699,14 +698,14 @@ void i915_restore_display(struct drm_device *dev) | |||
699 | 698 | ||
700 | /* Display port ratios (must be done before clock is set) */ | 699 | /* Display port ratios (must be done before clock is set) */ |
701 | if (SUPPORTS_INTEGRATED_DP(dev)) { | 700 | if (SUPPORTS_INTEGRATED_DP(dev)) { |
702 | I915_WRITE(PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); | 701 | I915_WRITE(_PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); |
703 | I915_WRITE(PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); | 702 | I915_WRITE(_PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); |
704 | I915_WRITE(PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); | 703 | I915_WRITE(_PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); |
705 | I915_WRITE(PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); | 704 | I915_WRITE(_PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); |
706 | I915_WRITE(PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); | 705 | I915_WRITE(_PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); |
707 | I915_WRITE(PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); | 706 | I915_WRITE(_PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); |
708 | I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); | 707 | I915_WRITE(_PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); |
709 | I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); | 708 | I915_WRITE(_PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); |
710 | } | 709 | } |
711 | 710 | ||
712 | /* This is only meaningful in non-KMS mode */ | 711 | /* This is only meaningful in non-KMS mode */ |
@@ -808,8 +807,8 @@ int i915_save_state(struct drm_device *dev) | |||
808 | dev_priv->saveDEIMR = I915_READ(DEIMR); | 807 | dev_priv->saveDEIMR = I915_READ(DEIMR); |
809 | dev_priv->saveGTIER = I915_READ(GTIER); | 808 | dev_priv->saveGTIER = I915_READ(GTIER); |
810 | dev_priv->saveGTIMR = I915_READ(GTIMR); | 809 | dev_priv->saveGTIMR = I915_READ(GTIMR); |
811 | dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR); | 810 | dev_priv->saveFDI_RXA_IMR = I915_READ(_FDI_RXA_IMR); |
812 | dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR); | 811 | dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR); |
813 | dev_priv->saveMCHBAR_RENDER_STANDBY = | 812 | dev_priv->saveMCHBAR_RENDER_STANDBY = |
814 | I915_READ(RSTDBYCTL); | 813 | I915_READ(RSTDBYCTL); |
815 | } else { | 814 | } else { |
@@ -857,11 +856,11 @@ int i915_restore_state(struct drm_device *dev) | |||
857 | I915_WRITE(DEIMR, dev_priv->saveDEIMR); | 856 | I915_WRITE(DEIMR, dev_priv->saveDEIMR); |
858 | I915_WRITE(GTIER, dev_priv->saveGTIER); | 857 | I915_WRITE(GTIER, dev_priv->saveGTIER); |
859 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); | 858 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); |
860 | I915_WRITE(FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); | 859 | I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); |
861 | I915_WRITE(FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); | 860 | I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); |
862 | } else { | 861 | } else { |
863 | I915_WRITE (IER, dev_priv->saveIER); | 862 | I915_WRITE(IER, dev_priv->saveIER); |
864 | I915_WRITE (IMR, dev_priv->saveIMR); | 863 | I915_WRITE(IMR, dev_priv->saveIMR); |
865 | } | 864 | } |
866 | 865 | ||
867 | /* Clock gating state */ | 866 | /* Clock gating state */ |
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index 7f0fc3ed61aa..d623fefbfaca 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #include <drm/drmP.h> | 8 | #include <drm/drmP.h> |
9 | #include "i915_drv.h" | 9 | #include "i915_drv.h" |
10 | #include "intel_ringbuffer.h" | ||
10 | 11 | ||
11 | #undef TRACE_SYSTEM | 12 | #undef TRACE_SYSTEM |
12 | #define TRACE_SYSTEM i915 | 13 | #define TRACE_SYSTEM i915 |
@@ -16,9 +17,7 @@ | |||
16 | /* object tracking */ | 17 | /* object tracking */ |
17 | 18 | ||
18 | TRACE_EVENT(i915_gem_object_create, | 19 | TRACE_EVENT(i915_gem_object_create, |
19 | |||
20 | TP_PROTO(struct drm_i915_gem_object *obj), | 20 | TP_PROTO(struct drm_i915_gem_object *obj), |
21 | |||
22 | TP_ARGS(obj), | 21 | TP_ARGS(obj), |
23 | 22 | ||
24 | TP_STRUCT__entry( | 23 | TP_STRUCT__entry( |
@@ -35,33 +34,51 @@ TRACE_EVENT(i915_gem_object_create, | |||
35 | ); | 34 | ); |
36 | 35 | ||
37 | TRACE_EVENT(i915_gem_object_bind, | 36 | TRACE_EVENT(i915_gem_object_bind, |
38 | 37 | TP_PROTO(struct drm_i915_gem_object *obj, bool mappable), | |
39 | TP_PROTO(struct drm_i915_gem_object *obj, u32 gtt_offset, bool mappable), | 38 | TP_ARGS(obj, mappable), |
40 | |||
41 | TP_ARGS(obj, gtt_offset, mappable), | ||
42 | 39 | ||
43 | TP_STRUCT__entry( | 40 | TP_STRUCT__entry( |
44 | __field(struct drm_i915_gem_object *, obj) | 41 | __field(struct drm_i915_gem_object *, obj) |
45 | __field(u32, gtt_offset) | 42 | __field(u32, offset) |
43 | __field(u32, size) | ||
46 | __field(bool, mappable) | 44 | __field(bool, mappable) |
47 | ), | 45 | ), |
48 | 46 | ||
49 | TP_fast_assign( | 47 | TP_fast_assign( |
50 | __entry->obj = obj; | 48 | __entry->obj = obj; |
51 | __entry->gtt_offset = gtt_offset; | 49 | __entry->offset = obj->gtt_space->start; |
50 | __entry->size = obj->gtt_space->size; | ||
52 | __entry->mappable = mappable; | 51 | __entry->mappable = mappable; |
53 | ), | 52 | ), |
54 | 53 | ||
55 | TP_printk("obj=%p, gtt_offset=%08x%s", | 54 | TP_printk("obj=%p, offset=%08x size=%x%s", |
56 | __entry->obj, __entry->gtt_offset, | 55 | __entry->obj, __entry->offset, __entry->size, |
57 | __entry->mappable ? ", mappable" : "") | 56 | __entry->mappable ? ", mappable" : "") |
58 | ); | 57 | ); |
59 | 58 | ||
60 | TRACE_EVENT(i915_gem_object_change_domain, | 59 | TRACE_EVENT(i915_gem_object_unbind, |
60 | TP_PROTO(struct drm_i915_gem_object *obj), | ||
61 | TP_ARGS(obj), | ||
62 | |||
63 | TP_STRUCT__entry( | ||
64 | __field(struct drm_i915_gem_object *, obj) | ||
65 | __field(u32, offset) | ||
66 | __field(u32, size) | ||
67 | ), | ||
61 | 68 | ||
62 | TP_PROTO(struct drm_i915_gem_object *obj, uint32_t old_read_domains, uint32_t old_write_domain), | 69 | TP_fast_assign( |
70 | __entry->obj = obj; | ||
71 | __entry->offset = obj->gtt_space->start; | ||
72 | __entry->size = obj->gtt_space->size; | ||
73 | ), | ||
63 | 74 | ||
64 | TP_ARGS(obj, old_read_domains, old_write_domain), | 75 | TP_printk("obj=%p, offset=%08x size=%x", |
76 | __entry->obj, __entry->offset, __entry->size) | ||
77 | ); | ||
78 | |||
79 | TRACE_EVENT(i915_gem_object_change_domain, | ||
80 | TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write), | ||
81 | TP_ARGS(obj, old_read, old_write), | ||
65 | 82 | ||
66 | TP_STRUCT__entry( | 83 | TP_STRUCT__entry( |
67 | __field(struct drm_i915_gem_object *, obj) | 84 | __field(struct drm_i915_gem_object *, obj) |
@@ -71,177 +88,264 @@ TRACE_EVENT(i915_gem_object_change_domain, | |||
71 | 88 | ||
72 | TP_fast_assign( | 89 | TP_fast_assign( |
73 | __entry->obj = obj; | 90 | __entry->obj = obj; |
74 | __entry->read_domains = obj->base.read_domains | (old_read_domains << 16); | 91 | __entry->read_domains = obj->base.read_domains | (old_read << 16); |
75 | __entry->write_domain = obj->base.write_domain | (old_write_domain << 16); | 92 | __entry->write_domain = obj->base.write_domain | (old_write << 16); |
76 | ), | 93 | ), |
77 | 94 | ||
78 | TP_printk("obj=%p, read=%04x, write=%04x", | 95 | TP_printk("obj=%p, read=%02x=>%02x, write=%02x=>%02x", |
79 | __entry->obj, | 96 | __entry->obj, |
80 | __entry->read_domains, __entry->write_domain) | 97 | __entry->read_domains >> 16, |
98 | __entry->read_domains & 0xffff, | ||
99 | __entry->write_domain >> 16, | ||
100 | __entry->write_domain & 0xffff) | ||
81 | ); | 101 | ); |
82 | 102 | ||
83 | DECLARE_EVENT_CLASS(i915_gem_object, | 103 | TRACE_EVENT(i915_gem_object_pwrite, |
104 | TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len), | ||
105 | TP_ARGS(obj, offset, len), | ||
84 | 106 | ||
85 | TP_PROTO(struct drm_i915_gem_object *obj), | 107 | TP_STRUCT__entry( |
108 | __field(struct drm_i915_gem_object *, obj) | ||
109 | __field(u32, offset) | ||
110 | __field(u32, len) | ||
111 | ), | ||
86 | 112 | ||
87 | TP_ARGS(obj), | 113 | TP_fast_assign( |
114 | __entry->obj = obj; | ||
115 | __entry->offset = offset; | ||
116 | __entry->len = len; | ||
117 | ), | ||
118 | |||
119 | TP_printk("obj=%p, offset=%u, len=%u", | ||
120 | __entry->obj, __entry->offset, __entry->len) | ||
121 | ); | ||
122 | |||
123 | TRACE_EVENT(i915_gem_object_pread, | ||
124 | TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len), | ||
125 | TP_ARGS(obj, offset, len), | ||
88 | 126 | ||
89 | TP_STRUCT__entry( | 127 | TP_STRUCT__entry( |
90 | __field(struct drm_i915_gem_object *, obj) | 128 | __field(struct drm_i915_gem_object *, obj) |
129 | __field(u32, offset) | ||
130 | __field(u32, len) | ||
91 | ), | 131 | ), |
92 | 132 | ||
93 | TP_fast_assign( | 133 | TP_fast_assign( |
94 | __entry->obj = obj; | 134 | __entry->obj = obj; |
135 | __entry->offset = offset; | ||
136 | __entry->len = len; | ||
95 | ), | 137 | ), |
96 | 138 | ||
97 | TP_printk("obj=%p", __entry->obj) | 139 | TP_printk("obj=%p, offset=%u, len=%u", |
140 | __entry->obj, __entry->offset, __entry->len) | ||
98 | ); | 141 | ); |
99 | 142 | ||
100 | DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush, | 143 | TRACE_EVENT(i915_gem_object_fault, |
144 | TP_PROTO(struct drm_i915_gem_object *obj, u32 index, bool gtt, bool write), | ||
145 | TP_ARGS(obj, index, gtt, write), | ||
146 | |||
147 | TP_STRUCT__entry( | ||
148 | __field(struct drm_i915_gem_object *, obj) | ||
149 | __field(u32, index) | ||
150 | __field(bool, gtt) | ||
151 | __field(bool, write) | ||
152 | ), | ||
153 | |||
154 | TP_fast_assign( | ||
155 | __entry->obj = obj; | ||
156 | __entry->index = index; | ||
157 | __entry->gtt = gtt; | ||
158 | __entry->write = write; | ||
159 | ), | ||
101 | 160 | ||
161 | TP_printk("obj=%p, %s index=%u %s", | ||
162 | __entry->obj, | ||
163 | __entry->gtt ? "GTT" : "CPU", | ||
164 | __entry->index, | ||
165 | __entry->write ? ", writable" : "") | ||
166 | ); | ||
167 | |||
168 | DECLARE_EVENT_CLASS(i915_gem_object, | ||
102 | TP_PROTO(struct drm_i915_gem_object *obj), | 169 | TP_PROTO(struct drm_i915_gem_object *obj), |
170 | TP_ARGS(obj), | ||
103 | 171 | ||
104 | TP_ARGS(obj) | 172 | TP_STRUCT__entry( |
173 | __field(struct drm_i915_gem_object *, obj) | ||
174 | ), | ||
175 | |||
176 | TP_fast_assign( | ||
177 | __entry->obj = obj; | ||
178 | ), | ||
179 | |||
180 | TP_printk("obj=%p", __entry->obj) | ||
105 | ); | 181 | ); |
106 | 182 | ||
107 | DEFINE_EVENT(i915_gem_object, i915_gem_object_unbind, | 183 | DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush, |
184 | TP_PROTO(struct drm_i915_gem_object *obj), | ||
185 | TP_ARGS(obj) | ||
186 | ); | ||
108 | 187 | ||
188 | DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy, | ||
109 | TP_PROTO(struct drm_i915_gem_object *obj), | 189 | TP_PROTO(struct drm_i915_gem_object *obj), |
110 | |||
111 | TP_ARGS(obj) | 190 | TP_ARGS(obj) |
112 | ); | 191 | ); |
113 | 192 | ||
114 | DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy, | 193 | TRACE_EVENT(i915_gem_evict, |
194 | TP_PROTO(struct drm_device *dev, u32 size, u32 align, bool mappable), | ||
195 | TP_ARGS(dev, size, align, mappable), | ||
115 | 196 | ||
116 | TP_PROTO(struct drm_i915_gem_object *obj), | 197 | TP_STRUCT__entry( |
198 | __field(u32, dev) | ||
199 | __field(u32, size) | ||
200 | __field(u32, align) | ||
201 | __field(bool, mappable) | ||
202 | ), | ||
117 | 203 | ||
118 | TP_ARGS(obj) | 204 | TP_fast_assign( |
205 | __entry->dev = dev->primary->index; | ||
206 | __entry->size = size; | ||
207 | __entry->align = align; | ||
208 | __entry->mappable = mappable; | ||
209 | ), | ||
210 | |||
211 | TP_printk("dev=%d, size=%d, align=%d %s", | ||
212 | __entry->dev, __entry->size, __entry->align, | ||
213 | __entry->mappable ? ", mappable" : "") | ||
119 | ); | 214 | ); |
120 | 215 | ||
121 | /* batch tracing */ | 216 | TRACE_EVENT(i915_gem_evict_everything, |
217 | TP_PROTO(struct drm_device *dev, bool purgeable), | ||
218 | TP_ARGS(dev, purgeable), | ||
122 | 219 | ||
123 | TRACE_EVENT(i915_gem_request_submit, | 220 | TP_STRUCT__entry( |
221 | __field(u32, dev) | ||
222 | __field(bool, purgeable) | ||
223 | ), | ||
224 | |||
225 | TP_fast_assign( | ||
226 | __entry->dev = dev->primary->index; | ||
227 | __entry->purgeable = purgeable; | ||
228 | ), | ||
124 | 229 | ||
125 | TP_PROTO(struct drm_device *dev, u32 seqno), | 230 | TP_printk("dev=%d%s", |
231 | __entry->dev, | ||
232 | __entry->purgeable ? ", purgeable only" : "") | ||
233 | ); | ||
126 | 234 | ||
127 | TP_ARGS(dev, seqno), | 235 | TRACE_EVENT(i915_gem_ring_dispatch, |
236 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | ||
237 | TP_ARGS(ring, seqno), | ||
128 | 238 | ||
129 | TP_STRUCT__entry( | 239 | TP_STRUCT__entry( |
130 | __field(u32, dev) | 240 | __field(u32, dev) |
241 | __field(u32, ring) | ||
131 | __field(u32, seqno) | 242 | __field(u32, seqno) |
132 | ), | 243 | ), |
133 | 244 | ||
134 | TP_fast_assign( | 245 | TP_fast_assign( |
135 | __entry->dev = dev->primary->index; | 246 | __entry->dev = ring->dev->primary->index; |
247 | __entry->ring = ring->id; | ||
136 | __entry->seqno = seqno; | 248 | __entry->seqno = seqno; |
137 | i915_trace_irq_get(dev, seqno); | 249 | i915_trace_irq_get(ring, seqno); |
138 | ), | 250 | ), |
139 | 251 | ||
140 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) | 252 | TP_printk("dev=%u, ring=%u, seqno=%u", |
253 | __entry->dev, __entry->ring, __entry->seqno) | ||
141 | ); | 254 | ); |
142 | 255 | ||
143 | TRACE_EVENT(i915_gem_request_flush, | 256 | TRACE_EVENT(i915_gem_ring_flush, |
144 | 257 | TP_PROTO(struct intel_ring_buffer *ring, u32 invalidate, u32 flush), | |
145 | TP_PROTO(struct drm_device *dev, u32 seqno, | 258 | TP_ARGS(ring, invalidate, flush), |
146 | u32 flush_domains, u32 invalidate_domains), | ||
147 | |||
148 | TP_ARGS(dev, seqno, flush_domains, invalidate_domains), | ||
149 | 259 | ||
150 | TP_STRUCT__entry( | 260 | TP_STRUCT__entry( |
151 | __field(u32, dev) | 261 | __field(u32, dev) |
152 | __field(u32, seqno) | 262 | __field(u32, ring) |
153 | __field(u32, flush_domains) | 263 | __field(u32, invalidate) |
154 | __field(u32, invalidate_domains) | 264 | __field(u32, flush) |
155 | ), | 265 | ), |
156 | 266 | ||
157 | TP_fast_assign( | 267 | TP_fast_assign( |
158 | __entry->dev = dev->primary->index; | 268 | __entry->dev = ring->dev->primary->index; |
159 | __entry->seqno = seqno; | 269 | __entry->ring = ring->id; |
160 | __entry->flush_domains = flush_domains; | 270 | __entry->invalidate = invalidate; |
161 | __entry->invalidate_domains = invalidate_domains; | 271 | __entry->flush = flush; |
162 | ), | 272 | ), |
163 | 273 | ||
164 | TP_printk("dev=%u, seqno=%u, flush=%04x, invalidate=%04x", | 274 | TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x", |
165 | __entry->dev, __entry->seqno, | 275 | __entry->dev, __entry->ring, |
166 | __entry->flush_domains, __entry->invalidate_domains) | 276 | __entry->invalidate, __entry->flush) |
167 | ); | 277 | ); |
168 | 278 | ||
169 | DECLARE_EVENT_CLASS(i915_gem_request, | 279 | DECLARE_EVENT_CLASS(i915_gem_request, |
170 | 280 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | |
171 | TP_PROTO(struct drm_device *dev, u32 seqno), | 281 | TP_ARGS(ring, seqno), |
172 | |||
173 | TP_ARGS(dev, seqno), | ||
174 | 282 | ||
175 | TP_STRUCT__entry( | 283 | TP_STRUCT__entry( |
176 | __field(u32, dev) | 284 | __field(u32, dev) |
285 | __field(u32, ring) | ||
177 | __field(u32, seqno) | 286 | __field(u32, seqno) |
178 | ), | 287 | ), |
179 | 288 | ||
180 | TP_fast_assign( | 289 | TP_fast_assign( |
181 | __entry->dev = dev->primary->index; | 290 | __entry->dev = ring->dev->primary->index; |
291 | __entry->ring = ring->id; | ||
182 | __entry->seqno = seqno; | 292 | __entry->seqno = seqno; |
183 | ), | 293 | ), |
184 | 294 | ||
185 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) | 295 | TP_printk("dev=%u, ring=%u, seqno=%u", |
296 | __entry->dev, __entry->ring, __entry->seqno) | ||
186 | ); | 297 | ); |
187 | 298 | ||
188 | DEFINE_EVENT(i915_gem_request, i915_gem_request_complete, | 299 | DEFINE_EVENT(i915_gem_request, i915_gem_request_add, |
189 | 300 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | |
190 | TP_PROTO(struct drm_device *dev, u32 seqno), | 301 | TP_ARGS(ring, seqno) |
302 | ); | ||
191 | 303 | ||
192 | TP_ARGS(dev, seqno) | 304 | DEFINE_EVENT(i915_gem_request, i915_gem_request_complete, |
305 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | ||
306 | TP_ARGS(ring, seqno) | ||
193 | ); | 307 | ); |
194 | 308 | ||
195 | DEFINE_EVENT(i915_gem_request, i915_gem_request_retire, | 309 | DEFINE_EVENT(i915_gem_request, i915_gem_request_retire, |
196 | 310 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | |
197 | TP_PROTO(struct drm_device *dev, u32 seqno), | 311 | TP_ARGS(ring, seqno) |
198 | |||
199 | TP_ARGS(dev, seqno) | ||
200 | ); | 312 | ); |
201 | 313 | ||
202 | DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_begin, | 314 | DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_begin, |
203 | 315 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | |
204 | TP_PROTO(struct drm_device *dev, u32 seqno), | 316 | TP_ARGS(ring, seqno) |
205 | |||
206 | TP_ARGS(dev, seqno) | ||
207 | ); | 317 | ); |
208 | 318 | ||
209 | DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end, | 319 | DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end, |
210 | 320 | TP_PROTO(struct intel_ring_buffer *ring, u32 seqno), | |
211 | TP_PROTO(struct drm_device *dev, u32 seqno), | 321 | TP_ARGS(ring, seqno) |
212 | |||
213 | TP_ARGS(dev, seqno) | ||
214 | ); | 322 | ); |
215 | 323 | ||
216 | DECLARE_EVENT_CLASS(i915_ring, | 324 | DECLARE_EVENT_CLASS(i915_ring, |
217 | 325 | TP_PROTO(struct intel_ring_buffer *ring), | |
218 | TP_PROTO(struct drm_device *dev), | 326 | TP_ARGS(ring), |
219 | |||
220 | TP_ARGS(dev), | ||
221 | 327 | ||
222 | TP_STRUCT__entry( | 328 | TP_STRUCT__entry( |
223 | __field(u32, dev) | 329 | __field(u32, dev) |
330 | __field(u32, ring) | ||
224 | ), | 331 | ), |
225 | 332 | ||
226 | TP_fast_assign( | 333 | TP_fast_assign( |
227 | __entry->dev = dev->primary->index; | 334 | __entry->dev = ring->dev->primary->index; |
335 | __entry->ring = ring->id; | ||
228 | ), | 336 | ), |
229 | 337 | ||
230 | TP_printk("dev=%u", __entry->dev) | 338 | TP_printk("dev=%u, ring=%u", __entry->dev, __entry->ring) |
231 | ); | 339 | ); |
232 | 340 | ||
233 | DEFINE_EVENT(i915_ring, i915_ring_wait_begin, | 341 | DEFINE_EVENT(i915_ring, i915_ring_wait_begin, |
234 | 342 | TP_PROTO(struct intel_ring_buffer *ring), | |
235 | TP_PROTO(struct drm_device *dev), | 343 | TP_ARGS(ring) |
236 | |||
237 | TP_ARGS(dev) | ||
238 | ); | 344 | ); |
239 | 345 | ||
240 | DEFINE_EVENT(i915_ring, i915_ring_wait_end, | 346 | DEFINE_EVENT(i915_ring, i915_ring_wait_end, |
241 | 347 | TP_PROTO(struct intel_ring_buffer *ring), | |
242 | TP_PROTO(struct drm_device *dev), | 348 | TP_ARGS(ring) |
243 | |||
244 | TP_ARGS(dev) | ||
245 | ); | 349 | ); |
246 | 350 | ||
247 | TRACE_EVENT(i915_flip_request, | 351 | TRACE_EVENT(i915_flip_request, |
@@ -281,26 +385,29 @@ TRACE_EVENT(i915_flip_complete, | |||
281 | ); | 385 | ); |
282 | 386 | ||
283 | TRACE_EVENT(i915_reg_rw, | 387 | TRACE_EVENT(i915_reg_rw, |
284 | TP_PROTO(int cmd, uint32_t reg, uint64_t val, int len), | 388 | TP_PROTO(bool write, u32 reg, u64 val, int len), |
285 | 389 | ||
286 | TP_ARGS(cmd, reg, val, len), | 390 | TP_ARGS(write, reg, val, len), |
287 | 391 | ||
288 | TP_STRUCT__entry( | 392 | TP_STRUCT__entry( |
289 | __field(int, cmd) | 393 | __field(u64, val) |
290 | __field(uint32_t, reg) | 394 | __field(u32, reg) |
291 | __field(uint64_t, val) | 395 | __field(u16, write) |
292 | __field(int, len) | 396 | __field(u16, len) |
293 | ), | 397 | ), |
294 | 398 | ||
295 | TP_fast_assign( | 399 | TP_fast_assign( |
296 | __entry->cmd = cmd; | 400 | __entry->val = (u64)val; |
297 | __entry->reg = reg; | 401 | __entry->reg = reg; |
298 | __entry->val = (uint64_t)val; | 402 | __entry->write = write; |
299 | __entry->len = len; | 403 | __entry->len = len; |
300 | ), | 404 | ), |
301 | 405 | ||
302 | TP_printk("cmd=%c, reg=0x%x, val=0x%llx, len=%d", | 406 | TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)", |
303 | __entry->cmd, __entry->reg, __entry->val, __entry->len) | 407 | __entry->write ? "write" : "read", |
408 | __entry->reg, __entry->len, | ||
409 | (u32)(__entry->val & 0xffffffff), | ||
410 | (u32)(__entry->val >> 32)) | ||
304 | ); | 411 | ); |
305 | 412 | ||
306 | #endif /* _I915_TRACE_H_ */ | 413 | #endif /* _I915_TRACE_H_ */ |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 0b44956c336b..48a0f03b60c3 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -226,29 +226,49 @@ static void | |||
226 | parse_sdvo_panel_data(struct drm_i915_private *dev_priv, | 226 | parse_sdvo_panel_data(struct drm_i915_private *dev_priv, |
227 | struct bdb_header *bdb) | 227 | struct bdb_header *bdb) |
228 | { | 228 | { |
229 | struct bdb_sdvo_lvds_options *sdvo_lvds_options; | ||
230 | struct lvds_dvo_timing *dvo_timing; | 229 | struct lvds_dvo_timing *dvo_timing; |
231 | struct drm_display_mode *panel_fixed_mode; | 230 | struct drm_display_mode *panel_fixed_mode; |
231 | int index; | ||
232 | 232 | ||
233 | sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); | 233 | index = i915_vbt_sdvo_panel_type; |
234 | if (!sdvo_lvds_options) | 234 | if (index == -1) { |
235 | return; | 235 | struct bdb_sdvo_lvds_options *sdvo_lvds_options; |
236 | |||
237 | sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); | ||
238 | if (!sdvo_lvds_options) | ||
239 | return; | ||
240 | |||
241 | index = sdvo_lvds_options->panel_type; | ||
242 | } | ||
236 | 243 | ||
237 | dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); | 244 | dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); |
238 | if (!dvo_timing) | 245 | if (!dvo_timing) |
239 | return; | 246 | return; |
240 | 247 | ||
241 | panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); | 248 | panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); |
242 | |||
243 | if (!panel_fixed_mode) | 249 | if (!panel_fixed_mode) |
244 | return; | 250 | return; |
245 | 251 | ||
246 | fill_detail_timing_data(panel_fixed_mode, | 252 | fill_detail_timing_data(panel_fixed_mode, dvo_timing + index); |
247 | dvo_timing + sdvo_lvds_options->panel_type); | ||
248 | 253 | ||
249 | dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode; | 254 | dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode; |
250 | 255 | ||
251 | return; | 256 | DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n"); |
257 | drm_mode_debug_printmodeline(panel_fixed_mode); | ||
258 | } | ||
259 | |||
260 | static int intel_bios_ssc_frequency(struct drm_device *dev, | ||
261 | bool alternate) | ||
262 | { | ||
263 | switch (INTEL_INFO(dev)->gen) { | ||
264 | case 2: | ||
265 | return alternate ? 66 : 48; | ||
266 | case 3: | ||
267 | case 4: | ||
268 | return alternate ? 100 : 96; | ||
269 | default: | ||
270 | return alternate ? 100 : 120; | ||
271 | } | ||
252 | } | 272 | } |
253 | 273 | ||
254 | static void | 274 | static void |
@@ -263,13 +283,9 @@ parse_general_features(struct drm_i915_private *dev_priv, | |||
263 | dev_priv->int_tv_support = general->int_tv_support; | 283 | dev_priv->int_tv_support = general->int_tv_support; |
264 | dev_priv->int_crt_support = general->int_crt_support; | 284 | dev_priv->int_crt_support = general->int_crt_support; |
265 | dev_priv->lvds_use_ssc = general->enable_ssc; | 285 | dev_priv->lvds_use_ssc = general->enable_ssc; |
266 | 286 | dev_priv->lvds_ssc_freq = | |
267 | if (IS_I85X(dev)) | 287 | intel_bios_ssc_frequency(dev, general->ssc_freq); |
268 | dev_priv->lvds_ssc_freq = general->ssc_freq ? 66 : 48; | 288 | dev_priv->display_clock_mode = general->display_clock_mode; |
269 | else if (IS_GEN5(dev) || IS_GEN6(dev)) | ||
270 | dev_priv->lvds_ssc_freq = general->ssc_freq ? 100 : 120; | ||
271 | else | ||
272 | dev_priv->lvds_ssc_freq = general->ssc_freq ? 100 : 96; | ||
273 | } | 289 | } |
274 | } | 290 | } |
275 | 291 | ||
@@ -553,6 +569,8 @@ parse_device_mapping(struct drm_i915_private *dev_priv, | |||
553 | static void | 569 | static void |
554 | init_vbt_defaults(struct drm_i915_private *dev_priv) | 570 | init_vbt_defaults(struct drm_i915_private *dev_priv) |
555 | { | 571 | { |
572 | struct drm_device *dev = dev_priv->dev; | ||
573 | |||
556 | dev_priv->crt_ddc_pin = GMBUS_PORT_VGADDC; | 574 | dev_priv->crt_ddc_pin = GMBUS_PORT_VGADDC; |
557 | 575 | ||
558 | /* LFP panel data */ | 576 | /* LFP panel data */ |
@@ -565,7 +583,11 @@ init_vbt_defaults(struct drm_i915_private *dev_priv) | |||
565 | /* general features */ | 583 | /* general features */ |
566 | dev_priv->int_tv_support = 1; | 584 | dev_priv->int_tv_support = 1; |
567 | dev_priv->int_crt_support = 1; | 585 | dev_priv->int_crt_support = 1; |
568 | dev_priv->lvds_use_ssc = 0; | 586 | |
587 | /* Default to using SSC */ | ||
588 | dev_priv->lvds_use_ssc = 1; | ||
589 | dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); | ||
590 | DRM_DEBUG("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); | ||
569 | 591 | ||
570 | /* eDP data */ | 592 | /* eDP data */ |
571 | dev_priv->edp.bpp = 18; | 593 | dev_priv->edp.bpp = 18; |
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h index 5f8e4edcbbb9..02b1b62415df 100644 --- a/drivers/gpu/drm/i915/intel_bios.h +++ b/drivers/gpu/drm/i915/intel_bios.h | |||
@@ -120,7 +120,9 @@ struct bdb_general_features { | |||
120 | u8 ssc_freq:1; | 120 | u8 ssc_freq:1; |
121 | u8 enable_lfp_on_override:1; | 121 | u8 enable_lfp_on_override:1; |
122 | u8 disable_ssc_ddt:1; | 122 | u8 disable_ssc_ddt:1; |
123 | u8 rsvd8:3; /* finish byte */ | 123 | u8 rsvd7:1; |
124 | u8 display_clock_mode:1; | ||
125 | u8 rsvd8:1; /* finish byte */ | ||
124 | 126 | ||
125 | /* bits 3 */ | 127 | /* bits 3 */ |
126 | u8 disable_smooth_vision:1; | 128 | u8 disable_smooth_vision:1; |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 8a77ff4a7237..8342259f3160 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -129,10 +129,7 @@ static void intel_crt_mode_set(struct drm_encoder *encoder, | |||
129 | u32 adpa, dpll_md; | 129 | u32 adpa, dpll_md; |
130 | u32 adpa_reg; | 130 | u32 adpa_reg; |
131 | 131 | ||
132 | if (intel_crtc->pipe == 0) | 132 | dpll_md_reg = DPLL_MD(intel_crtc->pipe); |
133 | dpll_md_reg = DPLL_A_MD; | ||
134 | else | ||
135 | dpll_md_reg = DPLL_B_MD; | ||
136 | 133 | ||
137 | if (HAS_PCH_SPLIT(dev)) | 134 | if (HAS_PCH_SPLIT(dev)) |
138 | adpa_reg = PCH_ADPA; | 135 | adpa_reg = PCH_ADPA; |
@@ -160,17 +157,16 @@ static void intel_crt_mode_set(struct drm_encoder *encoder, | |||
160 | adpa |= PORT_TRANS_A_SEL_CPT; | 157 | adpa |= PORT_TRANS_A_SEL_CPT; |
161 | else | 158 | else |
162 | adpa |= ADPA_PIPE_A_SELECT; | 159 | adpa |= ADPA_PIPE_A_SELECT; |
163 | if (!HAS_PCH_SPLIT(dev)) | ||
164 | I915_WRITE(BCLRPAT_A, 0); | ||
165 | } else { | 160 | } else { |
166 | if (HAS_PCH_CPT(dev)) | 161 | if (HAS_PCH_CPT(dev)) |
167 | adpa |= PORT_TRANS_B_SEL_CPT; | 162 | adpa |= PORT_TRANS_B_SEL_CPT; |
168 | else | 163 | else |
169 | adpa |= ADPA_PIPE_B_SELECT; | 164 | adpa |= ADPA_PIPE_B_SELECT; |
170 | if (!HAS_PCH_SPLIT(dev)) | ||
171 | I915_WRITE(BCLRPAT_B, 0); | ||
172 | } | 165 | } |
173 | 166 | ||
167 | if (!HAS_PCH_SPLIT(dev)) | ||
168 | I915_WRITE(BCLRPAT(intel_crtc->pipe), 0); | ||
169 | |||
174 | I915_WRITE(adpa_reg, adpa); | 170 | I915_WRITE(adpa_reg, adpa); |
175 | } | 171 | } |
176 | 172 | ||
@@ -353,21 +349,12 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_crt *crt) | |||
353 | 349 | ||
354 | DRM_DEBUG_KMS("starting load-detect on CRT\n"); | 350 | DRM_DEBUG_KMS("starting load-detect on CRT\n"); |
355 | 351 | ||
356 | if (pipe == 0) { | 352 | bclrpat_reg = BCLRPAT(pipe); |
357 | bclrpat_reg = BCLRPAT_A; | 353 | vtotal_reg = VTOTAL(pipe); |
358 | vtotal_reg = VTOTAL_A; | 354 | vblank_reg = VBLANK(pipe); |
359 | vblank_reg = VBLANK_A; | 355 | vsync_reg = VSYNC(pipe); |
360 | vsync_reg = VSYNC_A; | 356 | pipeconf_reg = PIPECONF(pipe); |
361 | pipeconf_reg = PIPEACONF; | 357 | pipe_dsl_reg = PIPEDSL(pipe); |
362 | pipe_dsl_reg = PIPEADSL; | ||
363 | } else { | ||
364 | bclrpat_reg = BCLRPAT_B; | ||
365 | vtotal_reg = VTOTAL_B; | ||
366 | vblank_reg = VBLANK_B; | ||
367 | vsync_reg = VSYNC_B; | ||
368 | pipeconf_reg = PIPEBCONF; | ||
369 | pipe_dsl_reg = PIPEBDSL; | ||
370 | } | ||
371 | 358 | ||
372 | save_bclrpat = I915_READ(bclrpat_reg); | 359 | save_bclrpat = I915_READ(bclrpat_reg); |
373 | save_vtotal = I915_READ(vtotal_reg); | 360 | save_vtotal = I915_READ(vtotal_reg); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index dcb821737f38..5e478338dc0a 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -989,7 +989,7 @@ intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
989 | void intel_wait_for_vblank(struct drm_device *dev, int pipe) | 989 | void intel_wait_for_vblank(struct drm_device *dev, int pipe) |
990 | { | 990 | { |
991 | struct drm_i915_private *dev_priv = dev->dev_private; | 991 | struct drm_i915_private *dev_priv = dev->dev_private; |
992 | int pipestat_reg = (pipe == 0 ? PIPEASTAT : PIPEBSTAT); | 992 | int pipestat_reg = PIPESTAT(pipe); |
993 | 993 | ||
994 | /* Clear existing vblank status. Note this will clear any other | 994 | /* Clear existing vblank status. Note this will clear any other |
995 | * sticky status fields as well. | 995 | * sticky status fields as well. |
@@ -1058,6 +1058,612 @@ void intel_wait_for_pipe_off(struct drm_device *dev, int pipe) | |||
1058 | } | 1058 | } |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | static const char *state_string(bool enabled) | ||
1062 | { | ||
1063 | return enabled ? "on" : "off"; | ||
1064 | } | ||
1065 | |||
1066 | /* Only for pre-ILK configs */ | ||
1067 | static void assert_pll(struct drm_i915_private *dev_priv, | ||
1068 | enum pipe pipe, bool state) | ||
1069 | { | ||
1070 | int reg; | ||
1071 | u32 val; | ||
1072 | bool cur_state; | ||
1073 | |||
1074 | reg = DPLL(pipe); | ||
1075 | val = I915_READ(reg); | ||
1076 | cur_state = !!(val & DPLL_VCO_ENABLE); | ||
1077 | WARN(cur_state != state, | ||
1078 | "PLL state assertion failure (expected %s, current %s)\n", | ||
1079 | state_string(state), state_string(cur_state)); | ||
1080 | } | ||
1081 | #define assert_pll_enabled(d, p) assert_pll(d, p, true) | ||
1082 | #define assert_pll_disabled(d, p) assert_pll(d, p, false) | ||
1083 | |||
1084 | /* For ILK+ */ | ||
1085 | static void assert_pch_pll(struct drm_i915_private *dev_priv, | ||
1086 | enum pipe pipe, bool state) | ||
1087 | { | ||
1088 | int reg; | ||
1089 | u32 val; | ||
1090 | bool cur_state; | ||
1091 | |||
1092 | reg = PCH_DPLL(pipe); | ||
1093 | val = I915_READ(reg); | ||
1094 | cur_state = !!(val & DPLL_VCO_ENABLE); | ||
1095 | WARN(cur_state != state, | ||
1096 | "PCH PLL state assertion failure (expected %s, current %s)\n", | ||
1097 | state_string(state), state_string(cur_state)); | ||
1098 | } | ||
1099 | #define assert_pch_pll_enabled(d, p) assert_pch_pll(d, p, true) | ||
1100 | #define assert_pch_pll_disabled(d, p) assert_pch_pll(d, p, false) | ||
1101 | |||
1102 | static void assert_fdi_tx(struct drm_i915_private *dev_priv, | ||
1103 | enum pipe pipe, bool state) | ||
1104 | { | ||
1105 | int reg; | ||
1106 | u32 val; | ||
1107 | bool cur_state; | ||
1108 | |||
1109 | reg = FDI_TX_CTL(pipe); | ||
1110 | val = I915_READ(reg); | ||
1111 | cur_state = !!(val & FDI_TX_ENABLE); | ||
1112 | WARN(cur_state != state, | ||
1113 | "FDI TX state assertion failure (expected %s, current %s)\n", | ||
1114 | state_string(state), state_string(cur_state)); | ||
1115 | } | ||
1116 | #define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true) | ||
1117 | #define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false) | ||
1118 | |||
1119 | static void assert_fdi_rx(struct drm_i915_private *dev_priv, | ||
1120 | enum pipe pipe, bool state) | ||
1121 | { | ||
1122 | int reg; | ||
1123 | u32 val; | ||
1124 | bool cur_state; | ||
1125 | |||
1126 | reg = FDI_RX_CTL(pipe); | ||
1127 | val = I915_READ(reg); | ||
1128 | cur_state = !!(val & FDI_RX_ENABLE); | ||
1129 | WARN(cur_state != state, | ||
1130 | "FDI RX state assertion failure (expected %s, current %s)\n", | ||
1131 | state_string(state), state_string(cur_state)); | ||
1132 | } | ||
1133 | #define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true) | ||
1134 | #define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false) | ||
1135 | |||
1136 | static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv, | ||
1137 | enum pipe pipe) | ||
1138 | { | ||
1139 | int reg; | ||
1140 | u32 val; | ||
1141 | |||
1142 | /* ILK FDI PLL is always enabled */ | ||
1143 | if (dev_priv->info->gen == 5) | ||
1144 | return; | ||
1145 | |||
1146 | reg = FDI_TX_CTL(pipe); | ||
1147 | val = I915_READ(reg); | ||
1148 | WARN(!(val & FDI_TX_PLL_ENABLE), "FDI TX PLL assertion failure, should be active but is disabled\n"); | ||
1149 | } | ||
1150 | |||
1151 | static void assert_fdi_rx_pll_enabled(struct drm_i915_private *dev_priv, | ||
1152 | enum pipe pipe) | ||
1153 | { | ||
1154 | int reg; | ||
1155 | u32 val; | ||
1156 | |||
1157 | reg = FDI_RX_CTL(pipe); | ||
1158 | val = I915_READ(reg); | ||
1159 | WARN(!(val & FDI_RX_PLL_ENABLE), "FDI RX PLL assertion failure, should be active but is disabled\n"); | ||
1160 | } | ||
1161 | |||
1162 | static void assert_panel_unlocked(struct drm_i915_private *dev_priv, | ||
1163 | enum pipe pipe) | ||
1164 | { | ||
1165 | int pp_reg, lvds_reg; | ||
1166 | u32 val; | ||
1167 | enum pipe panel_pipe = PIPE_A; | ||
1168 | bool locked = locked; | ||
1169 | |||
1170 | if (HAS_PCH_SPLIT(dev_priv->dev)) { | ||
1171 | pp_reg = PCH_PP_CONTROL; | ||
1172 | lvds_reg = PCH_LVDS; | ||
1173 | } else { | ||
1174 | pp_reg = PP_CONTROL; | ||
1175 | lvds_reg = LVDS; | ||
1176 | } | ||
1177 | |||
1178 | val = I915_READ(pp_reg); | ||
1179 | if (!(val & PANEL_POWER_ON) || | ||
1180 | ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS)) | ||
1181 | locked = false; | ||
1182 | |||
1183 | if (I915_READ(lvds_reg) & LVDS_PIPEB_SELECT) | ||
1184 | panel_pipe = PIPE_B; | ||
1185 | |||
1186 | WARN(panel_pipe == pipe && locked, | ||
1187 | "panel assertion failure, pipe %c regs locked\n", | ||
1188 | pipe_name(pipe)); | ||
1189 | } | ||
1190 | |||
1191 | static void assert_pipe(struct drm_i915_private *dev_priv, | ||
1192 | enum pipe pipe, bool state) | ||
1193 | { | ||
1194 | int reg; | ||
1195 | u32 val; | ||
1196 | bool cur_state; | ||
1197 | |||
1198 | reg = PIPECONF(pipe); | ||
1199 | val = I915_READ(reg); | ||
1200 | cur_state = !!(val & PIPECONF_ENABLE); | ||
1201 | WARN(cur_state != state, | ||
1202 | "pipe %c assertion failure (expected %s, current %s)\n", | ||
1203 | pipe_name(pipe), state_string(state), state_string(cur_state)); | ||
1204 | } | ||
1205 | #define assert_pipe_enabled(d, p) assert_pipe(d, p, true) | ||
1206 | #define assert_pipe_disabled(d, p) assert_pipe(d, p, false) | ||
1207 | |||
1208 | static void assert_plane_enabled(struct drm_i915_private *dev_priv, | ||
1209 | enum plane plane) | ||
1210 | { | ||
1211 | int reg; | ||
1212 | u32 val; | ||
1213 | |||
1214 | reg = DSPCNTR(plane); | ||
1215 | val = I915_READ(reg); | ||
1216 | WARN(!(val & DISPLAY_PLANE_ENABLE), | ||
1217 | "plane %c assertion failure, should be active but is disabled\n", | ||
1218 | plane_name(plane)); | ||
1219 | } | ||
1220 | |||
1221 | static void assert_planes_disabled(struct drm_i915_private *dev_priv, | ||
1222 | enum pipe pipe) | ||
1223 | { | ||
1224 | int reg, i; | ||
1225 | u32 val; | ||
1226 | int cur_pipe; | ||
1227 | |||
1228 | /* Planes are fixed to pipes on ILK+ */ | ||
1229 | if (HAS_PCH_SPLIT(dev_priv->dev)) | ||
1230 | return; | ||
1231 | |||
1232 | /* Need to check both planes against the pipe */ | ||
1233 | for (i = 0; i < 2; i++) { | ||
1234 | reg = DSPCNTR(i); | ||
1235 | val = I915_READ(reg); | ||
1236 | cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >> | ||
1237 | DISPPLANE_SEL_PIPE_SHIFT; | ||
1238 | WARN((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe, | ||
1239 | "plane %c assertion failure, should be off on pipe %c but is still active\n", | ||
1240 | plane_name(i), pipe_name(pipe)); | ||
1241 | } | ||
1242 | } | ||
1243 | |||
1244 | static void assert_pch_refclk_enabled(struct drm_i915_private *dev_priv) | ||
1245 | { | ||
1246 | u32 val; | ||
1247 | bool enabled; | ||
1248 | |||
1249 | val = I915_READ(PCH_DREF_CONTROL); | ||
1250 | enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK | | ||
1251 | DREF_SUPERSPREAD_SOURCE_MASK)); | ||
1252 | WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n"); | ||
1253 | } | ||
1254 | |||
1255 | static void assert_transcoder_disabled(struct drm_i915_private *dev_priv, | ||
1256 | enum pipe pipe) | ||
1257 | { | ||
1258 | int reg; | ||
1259 | u32 val; | ||
1260 | bool enabled; | ||
1261 | |||
1262 | reg = TRANSCONF(pipe); | ||
1263 | val = I915_READ(reg); | ||
1264 | enabled = !!(val & TRANS_ENABLE); | ||
1265 | WARN(enabled, | ||
1266 | "transcoder assertion failed, should be off on pipe %c but is still active\n", | ||
1267 | pipe_name(pipe)); | ||
1268 | } | ||
1269 | |||
1270 | static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, | ||
1271 | enum pipe pipe, int reg) | ||
1272 | { | ||
1273 | u32 val = I915_READ(reg); | ||
1274 | WARN(DP_PIPE_ENABLED(val, pipe), | ||
1275 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", | ||
1276 | reg, pipe_name(pipe)); | ||
1277 | } | ||
1278 | |||
1279 | static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, | ||
1280 | enum pipe pipe, int reg) | ||
1281 | { | ||
1282 | u32 val = I915_READ(reg); | ||
1283 | WARN(HDMI_PIPE_ENABLED(val, pipe), | ||
1284 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", | ||
1285 | reg, pipe_name(pipe)); | ||
1286 | } | ||
1287 | |||
1288 | static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv, | ||
1289 | enum pipe pipe) | ||
1290 | { | ||
1291 | int reg; | ||
1292 | u32 val; | ||
1293 | |||
1294 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B); | ||
1295 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C); | ||
1296 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D); | ||
1297 | |||
1298 | reg = PCH_ADPA; | ||
1299 | val = I915_READ(reg); | ||
1300 | WARN(ADPA_PIPE_ENABLED(val, pipe), | ||
1301 | "PCH VGA enabled on transcoder %c, should be disabled\n", | ||
1302 | pipe_name(pipe)); | ||
1303 | |||
1304 | reg = PCH_LVDS; | ||
1305 | val = I915_READ(reg); | ||
1306 | WARN(LVDS_PIPE_ENABLED(val, pipe), | ||
1307 | "PCH LVDS enabled on transcoder %c, should be disabled\n", | ||
1308 | pipe_name(pipe)); | ||
1309 | |||
1310 | assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB); | ||
1311 | assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC); | ||
1312 | assert_pch_hdmi_disabled(dev_priv, pipe, HDMID); | ||
1313 | } | ||
1314 | |||
1315 | /** | ||
1316 | * intel_enable_pll - enable a PLL | ||
1317 | * @dev_priv: i915 private structure | ||
1318 | * @pipe: pipe PLL to enable | ||
1319 | * | ||
1320 | * Enable @pipe's PLL so we can start pumping pixels from a plane. Check to | ||
1321 | * make sure the PLL reg is writable first though, since the panel write | ||
1322 | * protect mechanism may be enabled. | ||
1323 | * | ||
1324 | * Note! This is for pre-ILK only. | ||
1325 | */ | ||
1326 | static void intel_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) | ||
1327 | { | ||
1328 | int reg; | ||
1329 | u32 val; | ||
1330 | |||
1331 | /* No really, not for ILK+ */ | ||
1332 | BUG_ON(dev_priv->info->gen >= 5); | ||
1333 | |||
1334 | /* PLL is protected by panel, make sure we can write it */ | ||
1335 | if (IS_MOBILE(dev_priv->dev) && !IS_I830(dev_priv->dev)) | ||
1336 | assert_panel_unlocked(dev_priv, pipe); | ||
1337 | |||
1338 | reg = DPLL(pipe); | ||
1339 | val = I915_READ(reg); | ||
1340 | val |= DPLL_VCO_ENABLE; | ||
1341 | |||
1342 | /* We do this three times for luck */ | ||
1343 | I915_WRITE(reg, val); | ||
1344 | POSTING_READ(reg); | ||
1345 | udelay(150); /* wait for warmup */ | ||
1346 | I915_WRITE(reg, val); | ||
1347 | POSTING_READ(reg); | ||
1348 | udelay(150); /* wait for warmup */ | ||
1349 | I915_WRITE(reg, val); | ||
1350 | POSTING_READ(reg); | ||
1351 | udelay(150); /* wait for warmup */ | ||
1352 | } | ||
1353 | |||
1354 | /** | ||
1355 | * intel_disable_pll - disable a PLL | ||
1356 | * @dev_priv: i915 private structure | ||
1357 | * @pipe: pipe PLL to disable | ||
1358 | * | ||
1359 | * Disable the PLL for @pipe, making sure the pipe is off first. | ||
1360 | * | ||
1361 | * Note! This is for pre-ILK only. | ||
1362 | */ | ||
1363 | static void intel_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) | ||
1364 | { | ||
1365 | int reg; | ||
1366 | u32 val; | ||
1367 | |||
1368 | /* Don't disable pipe A or pipe A PLLs if needed */ | ||
1369 | if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE)) | ||
1370 | return; | ||
1371 | |||
1372 | /* Make sure the pipe isn't still relying on us */ | ||
1373 | assert_pipe_disabled(dev_priv, pipe); | ||
1374 | |||
1375 | reg = DPLL(pipe); | ||
1376 | val = I915_READ(reg); | ||
1377 | val &= ~DPLL_VCO_ENABLE; | ||
1378 | I915_WRITE(reg, val); | ||
1379 | POSTING_READ(reg); | ||
1380 | } | ||
1381 | |||
1382 | /** | ||
1383 | * intel_enable_pch_pll - enable PCH PLL | ||
1384 | * @dev_priv: i915 private structure | ||
1385 | * @pipe: pipe PLL to enable | ||
1386 | * | ||
1387 | * The PCH PLL needs to be enabled before the PCH transcoder, since it | ||
1388 | * drives the transcoder clock. | ||
1389 | */ | ||
1390 | static void intel_enable_pch_pll(struct drm_i915_private *dev_priv, | ||
1391 | enum pipe pipe) | ||
1392 | { | ||
1393 | int reg; | ||
1394 | u32 val; | ||
1395 | |||
1396 | /* PCH only available on ILK+ */ | ||
1397 | BUG_ON(dev_priv->info->gen < 5); | ||
1398 | |||
1399 | /* PCH refclock must be enabled first */ | ||
1400 | assert_pch_refclk_enabled(dev_priv); | ||
1401 | |||
1402 | reg = PCH_DPLL(pipe); | ||
1403 | val = I915_READ(reg); | ||
1404 | val |= DPLL_VCO_ENABLE; | ||
1405 | I915_WRITE(reg, val); | ||
1406 | POSTING_READ(reg); | ||
1407 | udelay(200); | ||
1408 | } | ||
1409 | |||
1410 | static void intel_disable_pch_pll(struct drm_i915_private *dev_priv, | ||
1411 | enum pipe pipe) | ||
1412 | { | ||
1413 | int reg; | ||
1414 | u32 val; | ||
1415 | |||
1416 | /* PCH only available on ILK+ */ | ||
1417 | BUG_ON(dev_priv->info->gen < 5); | ||
1418 | |||
1419 | /* Make sure transcoder isn't still depending on us */ | ||
1420 | assert_transcoder_disabled(dev_priv, pipe); | ||
1421 | |||
1422 | reg = PCH_DPLL(pipe); | ||
1423 | val = I915_READ(reg); | ||
1424 | val &= ~DPLL_VCO_ENABLE; | ||
1425 | I915_WRITE(reg, val); | ||
1426 | POSTING_READ(reg); | ||
1427 | udelay(200); | ||
1428 | } | ||
1429 | |||
1430 | static void intel_enable_transcoder(struct drm_i915_private *dev_priv, | ||
1431 | enum pipe pipe) | ||
1432 | { | ||
1433 | int reg; | ||
1434 | u32 val; | ||
1435 | |||
1436 | /* PCH only available on ILK+ */ | ||
1437 | BUG_ON(dev_priv->info->gen < 5); | ||
1438 | |||
1439 | /* Make sure PCH DPLL is enabled */ | ||
1440 | assert_pch_pll_enabled(dev_priv, pipe); | ||
1441 | |||
1442 | /* FDI must be feeding us bits for PCH ports */ | ||
1443 | assert_fdi_tx_enabled(dev_priv, pipe); | ||
1444 | assert_fdi_rx_enabled(dev_priv, pipe); | ||
1445 | |||
1446 | reg = TRANSCONF(pipe); | ||
1447 | val = I915_READ(reg); | ||
1448 | /* | ||
1449 | * make the BPC in transcoder be consistent with | ||
1450 | * that in pipeconf reg. | ||
1451 | */ | ||
1452 | val &= ~PIPE_BPC_MASK; | ||
1453 | val |= I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK; | ||
1454 | I915_WRITE(reg, val | TRANS_ENABLE); | ||
1455 | if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100)) | ||
1456 | DRM_ERROR("failed to enable transcoder %d\n", pipe); | ||
1457 | } | ||
1458 | |||
1459 | static void intel_disable_transcoder(struct drm_i915_private *dev_priv, | ||
1460 | enum pipe pipe) | ||
1461 | { | ||
1462 | int reg; | ||
1463 | u32 val; | ||
1464 | |||
1465 | /* FDI relies on the transcoder */ | ||
1466 | assert_fdi_tx_disabled(dev_priv, pipe); | ||
1467 | assert_fdi_rx_disabled(dev_priv, pipe); | ||
1468 | |||
1469 | /* Ports must be off as well */ | ||
1470 | assert_pch_ports_disabled(dev_priv, pipe); | ||
1471 | |||
1472 | reg = TRANSCONF(pipe); | ||
1473 | val = I915_READ(reg); | ||
1474 | val &= ~TRANS_ENABLE; | ||
1475 | I915_WRITE(reg, val); | ||
1476 | /* wait for PCH transcoder off, transcoder state */ | ||
1477 | if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50)) | ||
1478 | DRM_ERROR("failed to disable transcoder\n"); | ||
1479 | } | ||
1480 | |||
1481 | /** | ||
1482 | * intel_enable_pipe - enable a pipe, asserting requirements | ||
1483 | * @dev_priv: i915 private structure | ||
1484 | * @pipe: pipe to enable | ||
1485 | * @pch_port: on ILK+, is this pipe driving a PCH port or not | ||
1486 | * | ||
1487 | * Enable @pipe, making sure that various hardware specific requirements | ||
1488 | * are met, if applicable, e.g. PLL enabled, LVDS pairs enabled, etc. | ||
1489 | * | ||
1490 | * @pipe should be %PIPE_A or %PIPE_B. | ||
1491 | * | ||
1492 | * Will wait until the pipe is actually running (i.e. first vblank) before | ||
1493 | * returning. | ||
1494 | */ | ||
1495 | static void intel_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, | ||
1496 | bool pch_port) | ||
1497 | { | ||
1498 | int reg; | ||
1499 | u32 val; | ||
1500 | |||
1501 | /* | ||
1502 | * A pipe without a PLL won't actually be able to drive bits from | ||
1503 | * a plane. On ILK+ the pipe PLLs are integrated, so we don't | ||
1504 | * need the check. | ||
1505 | */ | ||
1506 | if (!HAS_PCH_SPLIT(dev_priv->dev)) | ||
1507 | assert_pll_enabled(dev_priv, pipe); | ||
1508 | else { | ||
1509 | if (pch_port) { | ||
1510 | /* if driving the PCH, we need FDI enabled */ | ||
1511 | assert_fdi_rx_pll_enabled(dev_priv, pipe); | ||
1512 | assert_fdi_tx_pll_enabled(dev_priv, pipe); | ||
1513 | } | ||
1514 | /* FIXME: assert CPU port conditions for SNB+ */ | ||
1515 | } | ||
1516 | |||
1517 | reg = PIPECONF(pipe); | ||
1518 | val = I915_READ(reg); | ||
1519 | val |= PIPECONF_ENABLE; | ||
1520 | I915_WRITE(reg, val); | ||
1521 | POSTING_READ(reg); | ||
1522 | intel_wait_for_vblank(dev_priv->dev, pipe); | ||
1523 | } | ||
1524 | |||
1525 | /** | ||
1526 | * intel_disable_pipe - disable a pipe, asserting requirements | ||
1527 | * @dev_priv: i915 private structure | ||
1528 | * @pipe: pipe to disable | ||
1529 | * | ||
1530 | * Disable @pipe, making sure that various hardware specific requirements | ||
1531 | * are met, if applicable, e.g. plane disabled, panel fitter off, etc. | ||
1532 | * | ||
1533 | * @pipe should be %PIPE_A or %PIPE_B. | ||
1534 | * | ||
1535 | * Will wait until the pipe has shut down before returning. | ||
1536 | */ | ||
1537 | static void intel_disable_pipe(struct drm_i915_private *dev_priv, | ||
1538 | enum pipe pipe) | ||
1539 | { | ||
1540 | int reg; | ||
1541 | u32 val; | ||
1542 | |||
1543 | /* | ||
1544 | * Make sure planes won't keep trying to pump pixels to us, | ||
1545 | * or we might hang the display. | ||
1546 | */ | ||
1547 | assert_planes_disabled(dev_priv, pipe); | ||
1548 | |||
1549 | /* Don't disable pipe A or pipe A PLLs if needed */ | ||
1550 | if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE)) | ||
1551 | return; | ||
1552 | |||
1553 | reg = PIPECONF(pipe); | ||
1554 | val = I915_READ(reg); | ||
1555 | val &= ~PIPECONF_ENABLE; | ||
1556 | I915_WRITE(reg, val); | ||
1557 | POSTING_READ(reg); | ||
1558 | intel_wait_for_pipe_off(dev_priv->dev, pipe); | ||
1559 | } | ||
1560 | |||
1561 | /** | ||
1562 | * intel_enable_plane - enable a display plane on a given pipe | ||
1563 | * @dev_priv: i915 private structure | ||
1564 | * @plane: plane to enable | ||
1565 | * @pipe: pipe being fed | ||
1566 | * | ||
1567 | * Enable @plane on @pipe, making sure that @pipe is running first. | ||
1568 | */ | ||
1569 | static void intel_enable_plane(struct drm_i915_private *dev_priv, | ||
1570 | enum plane plane, enum pipe pipe) | ||
1571 | { | ||
1572 | int reg; | ||
1573 | u32 val; | ||
1574 | |||
1575 | /* If the pipe isn't enabled, we can't pump pixels and may hang */ | ||
1576 | assert_pipe_enabled(dev_priv, pipe); | ||
1577 | |||
1578 | reg = DSPCNTR(plane); | ||
1579 | val = I915_READ(reg); | ||
1580 | val |= DISPLAY_PLANE_ENABLE; | ||
1581 | I915_WRITE(reg, val); | ||
1582 | POSTING_READ(reg); | ||
1583 | intel_wait_for_vblank(dev_priv->dev, pipe); | ||
1584 | } | ||
1585 | |||
1586 | /* | ||
1587 | * Plane regs are double buffered, going from enabled->disabled needs a | ||
1588 | * trigger in order to latch. The display address reg provides this. | ||
1589 | */ | ||
1590 | static void intel_flush_display_plane(struct drm_i915_private *dev_priv, | ||
1591 | enum plane plane) | ||
1592 | { | ||
1593 | u32 reg = DSPADDR(plane); | ||
1594 | I915_WRITE(reg, I915_READ(reg)); | ||
1595 | } | ||
1596 | |||
1597 | /** | ||
1598 | * intel_disable_plane - disable a display plane | ||
1599 | * @dev_priv: i915 private structure | ||
1600 | * @plane: plane to disable | ||
1601 | * @pipe: pipe consuming the data | ||
1602 | * | ||
1603 | * Disable @plane; should be an independent operation. | ||
1604 | */ | ||
1605 | static void intel_disable_plane(struct drm_i915_private *dev_priv, | ||
1606 | enum plane plane, enum pipe pipe) | ||
1607 | { | ||
1608 | int reg; | ||
1609 | u32 val; | ||
1610 | |||
1611 | reg = DSPCNTR(plane); | ||
1612 | val = I915_READ(reg); | ||
1613 | val &= ~DISPLAY_PLANE_ENABLE; | ||
1614 | I915_WRITE(reg, val); | ||
1615 | POSTING_READ(reg); | ||
1616 | intel_flush_display_plane(dev_priv, plane); | ||
1617 | intel_wait_for_vblank(dev_priv->dev, pipe); | ||
1618 | } | ||
1619 | |||
1620 | static void disable_pch_dp(struct drm_i915_private *dev_priv, | ||
1621 | enum pipe pipe, int reg) | ||
1622 | { | ||
1623 | u32 val = I915_READ(reg); | ||
1624 | if (DP_PIPE_ENABLED(val, pipe)) | ||
1625 | I915_WRITE(reg, val & ~DP_PORT_EN); | ||
1626 | } | ||
1627 | |||
1628 | static void disable_pch_hdmi(struct drm_i915_private *dev_priv, | ||
1629 | enum pipe pipe, int reg) | ||
1630 | { | ||
1631 | u32 val = I915_READ(reg); | ||
1632 | if (HDMI_PIPE_ENABLED(val, pipe)) | ||
1633 | I915_WRITE(reg, val & ~PORT_ENABLE); | ||
1634 | } | ||
1635 | |||
1636 | /* Disable any ports connected to this transcoder */ | ||
1637 | static void intel_disable_pch_ports(struct drm_i915_private *dev_priv, | ||
1638 | enum pipe pipe) | ||
1639 | { | ||
1640 | u32 reg, val; | ||
1641 | |||
1642 | val = I915_READ(PCH_PP_CONTROL); | ||
1643 | I915_WRITE(PCH_PP_CONTROL, val | PANEL_UNLOCK_REGS); | ||
1644 | |||
1645 | disable_pch_dp(dev_priv, pipe, PCH_DP_B); | ||
1646 | disable_pch_dp(dev_priv, pipe, PCH_DP_C); | ||
1647 | disable_pch_dp(dev_priv, pipe, PCH_DP_D); | ||
1648 | |||
1649 | reg = PCH_ADPA; | ||
1650 | val = I915_READ(reg); | ||
1651 | if (ADPA_PIPE_ENABLED(val, pipe)) | ||
1652 | I915_WRITE(reg, val & ~ADPA_DAC_ENABLE); | ||
1653 | |||
1654 | reg = PCH_LVDS; | ||
1655 | val = I915_READ(reg); | ||
1656 | if (LVDS_PIPE_ENABLED(val, pipe)) { | ||
1657 | I915_WRITE(reg, val & ~LVDS_PORT_EN); | ||
1658 | POSTING_READ(reg); | ||
1659 | udelay(100); | ||
1660 | } | ||
1661 | |||
1662 | disable_pch_hdmi(dev_priv, pipe, HDMIB); | ||
1663 | disable_pch_hdmi(dev_priv, pipe, HDMIC); | ||
1664 | disable_pch_hdmi(dev_priv, pipe, HDMID); | ||
1665 | } | ||
1666 | |||
1061 | static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | 1667 | static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval) |
1062 | { | 1668 | { |
1063 | struct drm_device *dev = crtc->dev; | 1669 | struct drm_device *dev = crtc->dev; |
@@ -1390,7 +1996,7 @@ static void intel_update_fbc(struct drm_device *dev) | |||
1390 | * - going to an unsupported config (interlace, pixel multiply, etc.) | 1996 | * - going to an unsupported config (interlace, pixel multiply, etc.) |
1391 | */ | 1997 | */ |
1392 | list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { | 1998 | list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { |
1393 | if (tmp_crtc->enabled) { | 1999 | if (tmp_crtc->enabled && tmp_crtc->fb) { |
1394 | if (crtc) { | 2000 | if (crtc) { |
1395 | DRM_DEBUG_KMS("more than one pipe active, disabling compression\n"); | 2001 | DRM_DEBUG_KMS("more than one pipe active, disabling compression\n"); |
1396 | dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; | 2002 | dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; |
@@ -1753,8 +2359,13 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc) | |||
1753 | struct drm_i915_private *dev_priv = dev->dev_private; | 2359 | struct drm_i915_private *dev_priv = dev->dev_private; |
1754 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 2360 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
1755 | int pipe = intel_crtc->pipe; | 2361 | int pipe = intel_crtc->pipe; |
2362 | int plane = intel_crtc->plane; | ||
1756 | u32 reg, temp, tries; | 2363 | u32 reg, temp, tries; |
1757 | 2364 | ||
2365 | /* FDI needs bits from pipe & plane first */ | ||
2366 | assert_pipe_enabled(dev_priv, pipe); | ||
2367 | assert_plane_enabled(dev_priv, plane); | ||
2368 | |||
1758 | /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit | 2369 | /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit |
1759 | for train result */ | 2370 | for train result */ |
1760 | reg = FDI_RX_IMR(pipe); | 2371 | reg = FDI_RX_IMR(pipe); |
@@ -1784,7 +2395,11 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc) | |||
1784 | udelay(150); | 2395 | udelay(150); |
1785 | 2396 | ||
1786 | /* Ironlake workaround, enable clock pointer after FDI enable*/ | 2397 | /* Ironlake workaround, enable clock pointer after FDI enable*/ |
1787 | I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_ENABLE); | 2398 | if (HAS_PCH_IBX(dev)) { |
2399 | I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR); | ||
2400 | I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR | | ||
2401 | FDI_RX_PHASE_SYNC_POINTER_EN); | ||
2402 | } | ||
1788 | 2403 | ||
1789 | reg = FDI_RX_IIR(pipe); | 2404 | reg = FDI_RX_IIR(pipe); |
1790 | for (tries = 0; tries < 5; tries++) { | 2405 | for (tries = 0; tries < 5; tries++) { |
@@ -1834,7 +2449,7 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc) | |||
1834 | 2449 | ||
1835 | } | 2450 | } |
1836 | 2451 | ||
1837 | static const int const snb_b_fdi_train_param [] = { | 2452 | static const int snb_b_fdi_train_param [] = { |
1838 | FDI_LINK_TRAIN_400MV_0DB_SNB_B, | 2453 | FDI_LINK_TRAIN_400MV_0DB_SNB_B, |
1839 | FDI_LINK_TRAIN_400MV_6DB_SNB_B, | 2454 | FDI_LINK_TRAIN_400MV_6DB_SNB_B, |
1840 | FDI_LINK_TRAIN_600MV_3_5DB_SNB_B, | 2455 | FDI_LINK_TRAIN_600MV_3_5DB_SNB_B, |
@@ -2003,12 +2618,60 @@ static void ironlake_fdi_enable(struct drm_crtc *crtc) | |||
2003 | } | 2618 | } |
2004 | } | 2619 | } |
2005 | 2620 | ||
2006 | static void intel_flush_display_plane(struct drm_device *dev, | 2621 | static void ironlake_fdi_disable(struct drm_crtc *crtc) |
2007 | int plane) | ||
2008 | { | 2622 | { |
2623 | struct drm_device *dev = crtc->dev; | ||
2009 | struct drm_i915_private *dev_priv = dev->dev_private; | 2624 | struct drm_i915_private *dev_priv = dev->dev_private; |
2010 | u32 reg = DSPADDR(plane); | 2625 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
2011 | I915_WRITE(reg, I915_READ(reg)); | 2626 | int pipe = intel_crtc->pipe; |
2627 | u32 reg, temp; | ||
2628 | |||
2629 | /* disable CPU FDI tx and PCH FDI rx */ | ||
2630 | reg = FDI_TX_CTL(pipe); | ||
2631 | temp = I915_READ(reg); | ||
2632 | I915_WRITE(reg, temp & ~FDI_TX_ENABLE); | ||
2633 | POSTING_READ(reg); | ||
2634 | |||
2635 | reg = FDI_RX_CTL(pipe); | ||
2636 | temp = I915_READ(reg); | ||
2637 | temp &= ~(0x7 << 16); | ||
2638 | temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; | ||
2639 | I915_WRITE(reg, temp & ~FDI_RX_ENABLE); | ||
2640 | |||
2641 | POSTING_READ(reg); | ||
2642 | udelay(100); | ||
2643 | |||
2644 | /* Ironlake workaround, disable clock pointer after downing FDI */ | ||
2645 | if (HAS_PCH_IBX(dev)) { | ||
2646 | I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR); | ||
2647 | I915_WRITE(FDI_RX_CHICKEN(pipe), | ||
2648 | I915_READ(FDI_RX_CHICKEN(pipe) & | ||
2649 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); | ||
2650 | } | ||
2651 | |||
2652 | /* still set train pattern 1 */ | ||
2653 | reg = FDI_TX_CTL(pipe); | ||
2654 | temp = I915_READ(reg); | ||
2655 | temp &= ~FDI_LINK_TRAIN_NONE; | ||
2656 | temp |= FDI_LINK_TRAIN_PATTERN_1; | ||
2657 | I915_WRITE(reg, temp); | ||
2658 | |||
2659 | reg = FDI_RX_CTL(pipe); | ||
2660 | temp = I915_READ(reg); | ||
2661 | if (HAS_PCH_CPT(dev)) { | ||
2662 | temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; | ||
2663 | temp |= FDI_LINK_TRAIN_PATTERN_1_CPT; | ||
2664 | } else { | ||
2665 | temp &= ~FDI_LINK_TRAIN_NONE; | ||
2666 | temp |= FDI_LINK_TRAIN_PATTERN_1; | ||
2667 | } | ||
2668 | /* BPC in FDI rx is consistent with that in PIPECONF */ | ||
2669 | temp &= ~(0x07 << 16); | ||
2670 | temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; | ||
2671 | I915_WRITE(reg, temp); | ||
2672 | |||
2673 | POSTING_READ(reg); | ||
2674 | udelay(100); | ||
2012 | } | 2675 | } |
2013 | 2676 | ||
2014 | /* | 2677 | /* |
@@ -2045,60 +2708,46 @@ static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) | |||
2045 | atomic_read(&obj->pending_flip) == 0); | 2708 | atomic_read(&obj->pending_flip) == 0); |
2046 | } | 2709 | } |
2047 | 2710 | ||
2048 | static void ironlake_crtc_enable(struct drm_crtc *crtc) | 2711 | static bool intel_crtc_driving_pch(struct drm_crtc *crtc) |
2049 | { | 2712 | { |
2050 | struct drm_device *dev = crtc->dev; | 2713 | struct drm_device *dev = crtc->dev; |
2051 | struct drm_i915_private *dev_priv = dev->dev_private; | 2714 | struct drm_mode_config *mode_config = &dev->mode_config; |
2052 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 2715 | struct intel_encoder *encoder; |
2053 | int pipe = intel_crtc->pipe; | ||
2054 | int plane = intel_crtc->plane; | ||
2055 | u32 reg, temp; | ||
2056 | |||
2057 | if (intel_crtc->active) | ||
2058 | return; | ||
2059 | |||
2060 | intel_crtc->active = true; | ||
2061 | intel_update_watermarks(dev); | ||
2062 | |||
2063 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | ||
2064 | temp = I915_READ(PCH_LVDS); | ||
2065 | if ((temp & LVDS_PORT_EN) == 0) | ||
2066 | I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN); | ||
2067 | } | ||
2068 | 2716 | ||
2069 | ironlake_fdi_enable(crtc); | 2717 | /* |
2718 | * If there's a non-PCH eDP on this crtc, it must be DP_A, and that | ||
2719 | * must be driven by its own crtc; no sharing is possible. | ||
2720 | */ | ||
2721 | list_for_each_entry(encoder, &mode_config->encoder_list, base.head) { | ||
2722 | if (encoder->base.crtc != crtc) | ||
2723 | continue; | ||
2070 | 2724 | ||
2071 | /* Enable panel fitting for LVDS */ | 2725 | switch (encoder->type) { |
2072 | if (dev_priv->pch_pf_size && | 2726 | case INTEL_OUTPUT_EDP: |
2073 | (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || HAS_eDP)) { | 2727 | if (!intel_encoder_is_pch_edp(&encoder->base)) |
2074 | /* Force use of hard-coded filter coefficients | 2728 | return false; |
2075 | * as some pre-programmed values are broken, | 2729 | continue; |
2076 | * e.g. x201. | 2730 | } |
2077 | */ | ||
2078 | I915_WRITE(pipe ? PFB_CTL_1 : PFA_CTL_1, | ||
2079 | PF_ENABLE | PF_FILTER_MED_3x3); | ||
2080 | I915_WRITE(pipe ? PFB_WIN_POS : PFA_WIN_POS, | ||
2081 | dev_priv->pch_pf_pos); | ||
2082 | I915_WRITE(pipe ? PFB_WIN_SZ : PFA_WIN_SZ, | ||
2083 | dev_priv->pch_pf_size); | ||
2084 | } | 2731 | } |
2085 | 2732 | ||
2086 | /* Enable CPU pipe */ | 2733 | return true; |
2087 | reg = PIPECONF(pipe); | 2734 | } |
2088 | temp = I915_READ(reg); | ||
2089 | if ((temp & PIPECONF_ENABLE) == 0) { | ||
2090 | I915_WRITE(reg, temp | PIPECONF_ENABLE); | ||
2091 | POSTING_READ(reg); | ||
2092 | intel_wait_for_vblank(dev, intel_crtc->pipe); | ||
2093 | } | ||
2094 | 2735 | ||
2095 | /* configure and enable CPU plane */ | 2736 | /* |
2096 | reg = DSPCNTR(plane); | 2737 | * Enable PCH resources required for PCH ports: |
2097 | temp = I915_READ(reg); | 2738 | * - PCH PLLs |
2098 | if ((temp & DISPLAY_PLANE_ENABLE) == 0) { | 2739 | * - FDI training & RX/TX |
2099 | I915_WRITE(reg, temp | DISPLAY_PLANE_ENABLE); | 2740 | * - update transcoder timings |
2100 | intel_flush_display_plane(dev, plane); | 2741 | * - DP transcoding bits |
2101 | } | 2742 | * - transcoder |
2743 | */ | ||
2744 | static void ironlake_pch_enable(struct drm_crtc *crtc) | ||
2745 | { | ||
2746 | struct drm_device *dev = crtc->dev; | ||
2747 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2748 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
2749 | int pipe = intel_crtc->pipe; | ||
2750 | u32 reg, temp; | ||
2102 | 2751 | ||
2103 | /* For PCH output, training FDI link */ | 2752 | /* For PCH output, training FDI link */ |
2104 | if (IS_GEN6(dev)) | 2753 | if (IS_GEN6(dev)) |
@@ -2106,14 +2755,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | |||
2106 | else | 2755 | else |
2107 | ironlake_fdi_link_train(crtc); | 2756 | ironlake_fdi_link_train(crtc); |
2108 | 2757 | ||
2109 | /* enable PCH DPLL */ | 2758 | intel_enable_pch_pll(dev_priv, pipe); |
2110 | reg = PCH_DPLL(pipe); | ||
2111 | temp = I915_READ(reg); | ||
2112 | if ((temp & DPLL_VCO_ENABLE) == 0) { | ||
2113 | I915_WRITE(reg, temp | DPLL_VCO_ENABLE); | ||
2114 | POSTING_READ(reg); | ||
2115 | udelay(200); | ||
2116 | } | ||
2117 | 2759 | ||
2118 | if (HAS_PCH_CPT(dev)) { | 2760 | if (HAS_PCH_CPT(dev)) { |
2119 | /* Be sure PCH DPLL SEL is set */ | 2761 | /* Be sure PCH DPLL SEL is set */ |
@@ -2125,7 +2767,8 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | |||
2125 | I915_WRITE(PCH_DPLL_SEL, temp); | 2767 | I915_WRITE(PCH_DPLL_SEL, temp); |
2126 | } | 2768 | } |
2127 | 2769 | ||
2128 | /* set transcoder timing */ | 2770 | /* set transcoder timing, panel must allow it */ |
2771 | assert_panel_unlocked(dev_priv, pipe); | ||
2129 | I915_WRITE(TRANS_HTOTAL(pipe), I915_READ(HTOTAL(pipe))); | 2772 | I915_WRITE(TRANS_HTOTAL(pipe), I915_READ(HTOTAL(pipe))); |
2130 | I915_WRITE(TRANS_HBLANK(pipe), I915_READ(HBLANK(pipe))); | 2773 | I915_WRITE(TRANS_HBLANK(pipe), I915_READ(HBLANK(pipe))); |
2131 | I915_WRITE(TRANS_HSYNC(pipe), I915_READ(HSYNC(pipe))); | 2774 | I915_WRITE(TRANS_HSYNC(pipe), I915_READ(HSYNC(pipe))); |
@@ -2172,18 +2815,55 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | |||
2172 | I915_WRITE(reg, temp); | 2815 | I915_WRITE(reg, temp); |
2173 | } | 2816 | } |
2174 | 2817 | ||
2175 | /* enable PCH transcoder */ | 2818 | intel_enable_transcoder(dev_priv, pipe); |
2176 | reg = TRANSCONF(pipe); | 2819 | } |
2177 | temp = I915_READ(reg); | 2820 | |
2178 | /* | 2821 | static void ironlake_crtc_enable(struct drm_crtc *crtc) |
2179 | * make the BPC in transcoder be consistent with | 2822 | { |
2180 | * that in pipeconf reg. | 2823 | struct drm_device *dev = crtc->dev; |
2181 | */ | 2824 | struct drm_i915_private *dev_priv = dev->dev_private; |
2182 | temp &= ~PIPE_BPC_MASK; | 2825 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
2183 | temp |= I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK; | 2826 | int pipe = intel_crtc->pipe; |
2184 | I915_WRITE(reg, temp | TRANS_ENABLE); | 2827 | int plane = intel_crtc->plane; |
2185 | if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100)) | 2828 | u32 temp; |
2186 | DRM_ERROR("failed to enable transcoder %d\n", pipe); | 2829 | bool is_pch_port; |
2830 | |||
2831 | if (intel_crtc->active) | ||
2832 | return; | ||
2833 | |||
2834 | intel_crtc->active = true; | ||
2835 | intel_update_watermarks(dev); | ||
2836 | |||
2837 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | ||
2838 | temp = I915_READ(PCH_LVDS); | ||
2839 | if ((temp & LVDS_PORT_EN) == 0) | ||
2840 | I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN); | ||
2841 | } | ||
2842 | |||
2843 | is_pch_port = intel_crtc_driving_pch(crtc); | ||
2844 | |||
2845 | if (is_pch_port) | ||
2846 | ironlake_fdi_enable(crtc); | ||
2847 | else | ||
2848 | ironlake_fdi_disable(crtc); | ||
2849 | |||
2850 | /* Enable panel fitting for LVDS */ | ||
2851 | if (dev_priv->pch_pf_size && | ||
2852 | (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || HAS_eDP)) { | ||
2853 | /* Force use of hard-coded filter coefficients | ||
2854 | * as some pre-programmed values are broken, | ||
2855 | * e.g. x201. | ||
2856 | */ | ||
2857 | I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); | ||
2858 | I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos); | ||
2859 | I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size); | ||
2860 | } | ||
2861 | |||
2862 | intel_enable_pipe(dev_priv, pipe, is_pch_port); | ||
2863 | intel_enable_plane(dev_priv, plane, pipe); | ||
2864 | |||
2865 | if (is_pch_port) | ||
2866 | ironlake_pch_enable(crtc); | ||
2187 | 2867 | ||
2188 | intel_crtc_load_lut(crtc); | 2868 | intel_crtc_load_lut(crtc); |
2189 | intel_update_fbc(dev); | 2869 | intel_update_fbc(dev); |
@@ -2206,116 +2886,58 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc) | |||
2206 | drm_vblank_off(dev, pipe); | 2886 | drm_vblank_off(dev, pipe); |
2207 | intel_crtc_update_cursor(crtc, false); | 2887 | intel_crtc_update_cursor(crtc, false); |
2208 | 2888 | ||
2209 | /* Disable display plane */ | 2889 | intel_disable_plane(dev_priv, plane, pipe); |
2210 | reg = DSPCNTR(plane); | ||
2211 | temp = I915_READ(reg); | ||
2212 | if (temp & DISPLAY_PLANE_ENABLE) { | ||
2213 | I915_WRITE(reg, temp & ~DISPLAY_PLANE_ENABLE); | ||
2214 | intel_flush_display_plane(dev, plane); | ||
2215 | } | ||
2216 | 2890 | ||
2217 | if (dev_priv->cfb_plane == plane && | 2891 | if (dev_priv->cfb_plane == plane && |
2218 | dev_priv->display.disable_fbc) | 2892 | dev_priv->display.disable_fbc) |
2219 | dev_priv->display.disable_fbc(dev); | 2893 | dev_priv->display.disable_fbc(dev); |
2220 | 2894 | ||
2221 | /* disable cpu pipe, disable after all planes disabled */ | 2895 | intel_disable_pipe(dev_priv, pipe); |
2222 | reg = PIPECONF(pipe); | ||
2223 | temp = I915_READ(reg); | ||
2224 | if (temp & PIPECONF_ENABLE) { | ||
2225 | I915_WRITE(reg, temp & ~PIPECONF_ENABLE); | ||
2226 | POSTING_READ(reg); | ||
2227 | /* wait for cpu pipe off, pipe state */ | ||
2228 | intel_wait_for_pipe_off(dev, intel_crtc->pipe); | ||
2229 | } | ||
2230 | 2896 | ||
2231 | /* Disable PF */ | 2897 | /* Disable PF */ |
2232 | I915_WRITE(pipe ? PFB_CTL_1 : PFA_CTL_1, 0); | 2898 | I915_WRITE(PF_CTL(pipe), 0); |
2233 | I915_WRITE(pipe ? PFB_WIN_SZ : PFA_WIN_SZ, 0); | 2899 | I915_WRITE(PF_WIN_SZ(pipe), 0); |
2234 | |||
2235 | /* disable CPU FDI tx and PCH FDI rx */ | ||
2236 | reg = FDI_TX_CTL(pipe); | ||
2237 | temp = I915_READ(reg); | ||
2238 | I915_WRITE(reg, temp & ~FDI_TX_ENABLE); | ||
2239 | POSTING_READ(reg); | ||
2240 | |||
2241 | reg = FDI_RX_CTL(pipe); | ||
2242 | temp = I915_READ(reg); | ||
2243 | temp &= ~(0x7 << 16); | ||
2244 | temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; | ||
2245 | I915_WRITE(reg, temp & ~FDI_RX_ENABLE); | ||
2246 | 2900 | ||
2247 | POSTING_READ(reg); | 2901 | ironlake_fdi_disable(crtc); |
2248 | udelay(100); | ||
2249 | 2902 | ||
2250 | /* Ironlake workaround, disable clock pointer after downing FDI */ | 2903 | /* This is a horrible layering violation; we should be doing this in |
2251 | if (HAS_PCH_IBX(dev)) | 2904 | * the connector/encoder ->prepare instead, but we don't always have |
2252 | I915_WRITE(FDI_RX_CHICKEN(pipe), | 2905 | * enough information there about the config to know whether it will |
2253 | I915_READ(FDI_RX_CHICKEN(pipe) & | 2906 | * actually be necessary or just cause undesired flicker. |
2254 | ~FDI_RX_PHASE_SYNC_POINTER_ENABLE)); | 2907 | */ |
2255 | 2908 | intel_disable_pch_ports(dev_priv, pipe); | |
2256 | /* still set train pattern 1 */ | ||
2257 | reg = FDI_TX_CTL(pipe); | ||
2258 | temp = I915_READ(reg); | ||
2259 | temp &= ~FDI_LINK_TRAIN_NONE; | ||
2260 | temp |= FDI_LINK_TRAIN_PATTERN_1; | ||
2261 | I915_WRITE(reg, temp); | ||
2262 | |||
2263 | reg = FDI_RX_CTL(pipe); | ||
2264 | temp = I915_READ(reg); | ||
2265 | if (HAS_PCH_CPT(dev)) { | ||
2266 | temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; | ||
2267 | temp |= FDI_LINK_TRAIN_PATTERN_1_CPT; | ||
2268 | } else { | ||
2269 | temp &= ~FDI_LINK_TRAIN_NONE; | ||
2270 | temp |= FDI_LINK_TRAIN_PATTERN_1; | ||
2271 | } | ||
2272 | /* BPC in FDI rx is consistent with that in PIPECONF */ | ||
2273 | temp &= ~(0x07 << 16); | ||
2274 | temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11; | ||
2275 | I915_WRITE(reg, temp); | ||
2276 | |||
2277 | POSTING_READ(reg); | ||
2278 | udelay(100); | ||
2279 | |||
2280 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | ||
2281 | temp = I915_READ(PCH_LVDS); | ||
2282 | if (temp & LVDS_PORT_EN) { | ||
2283 | I915_WRITE(PCH_LVDS, temp & ~LVDS_PORT_EN); | ||
2284 | POSTING_READ(PCH_LVDS); | ||
2285 | udelay(100); | ||
2286 | } | ||
2287 | } | ||
2288 | 2909 | ||
2289 | /* disable PCH transcoder */ | 2910 | intel_disable_transcoder(dev_priv, pipe); |
2290 | reg = TRANSCONF(plane); | ||
2291 | temp = I915_READ(reg); | ||
2292 | if (temp & TRANS_ENABLE) { | ||
2293 | I915_WRITE(reg, temp & ~TRANS_ENABLE); | ||
2294 | /* wait for PCH transcoder off, transcoder state */ | ||
2295 | if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50)) | ||
2296 | DRM_ERROR("failed to disable transcoder\n"); | ||
2297 | } | ||
2298 | 2911 | ||
2299 | if (HAS_PCH_CPT(dev)) { | 2912 | if (HAS_PCH_CPT(dev)) { |
2300 | /* disable TRANS_DP_CTL */ | 2913 | /* disable TRANS_DP_CTL */ |
2301 | reg = TRANS_DP_CTL(pipe); | 2914 | reg = TRANS_DP_CTL(pipe); |
2302 | temp = I915_READ(reg); | 2915 | temp = I915_READ(reg); |
2303 | temp &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK); | 2916 | temp &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK); |
2917 | temp |= TRANS_DP_PORT_SEL_NONE; | ||
2304 | I915_WRITE(reg, temp); | 2918 | I915_WRITE(reg, temp); |
2305 | 2919 | ||
2306 | /* disable DPLL_SEL */ | 2920 | /* disable DPLL_SEL */ |
2307 | temp = I915_READ(PCH_DPLL_SEL); | 2921 | temp = I915_READ(PCH_DPLL_SEL); |
2308 | if (pipe == 0) | 2922 | switch (pipe) { |
2309 | temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLB_SEL); | 2923 | case 0: |
2310 | else | 2924 | temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL); |
2925 | break; | ||
2926 | case 1: | ||
2311 | temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL); | 2927 | temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL); |
2928 | break; | ||
2929 | case 2: | ||
2930 | /* FIXME: manage transcoder PLLs? */ | ||
2931 | temp &= ~(TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL); | ||
2932 | break; | ||
2933 | default: | ||
2934 | BUG(); /* wtf */ | ||
2935 | } | ||
2312 | I915_WRITE(PCH_DPLL_SEL, temp); | 2936 | I915_WRITE(PCH_DPLL_SEL, temp); |
2313 | } | 2937 | } |
2314 | 2938 | ||
2315 | /* disable PCH DPLL */ | 2939 | /* disable PCH DPLL */ |
2316 | reg = PCH_DPLL(pipe); | 2940 | intel_disable_pch_pll(dev_priv, pipe); |
2317 | temp = I915_READ(reg); | ||
2318 | I915_WRITE(reg, temp & ~DPLL_VCO_ENABLE); | ||
2319 | 2941 | ||
2320 | /* Switch from PCDclk to Rawclk */ | 2942 | /* Switch from PCDclk to Rawclk */ |
2321 | reg = FDI_RX_CTL(pipe); | 2943 | reg = FDI_RX_CTL(pipe); |
@@ -2390,7 +3012,6 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc) | |||
2390 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 3012 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
2391 | int pipe = intel_crtc->pipe; | 3013 | int pipe = intel_crtc->pipe; |
2392 | int plane = intel_crtc->plane; | 3014 | int plane = intel_crtc->plane; |
2393 | u32 reg, temp; | ||
2394 | 3015 | ||
2395 | if (intel_crtc->active) | 3016 | if (intel_crtc->active) |
2396 | return; | 3017 | return; |
@@ -2398,42 +3019,9 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc) | |||
2398 | intel_crtc->active = true; | 3019 | intel_crtc->active = true; |
2399 | intel_update_watermarks(dev); | 3020 | intel_update_watermarks(dev); |
2400 | 3021 | ||
2401 | /* Enable the DPLL */ | 3022 | intel_enable_pll(dev_priv, pipe); |
2402 | reg = DPLL(pipe); | 3023 | intel_enable_pipe(dev_priv, pipe, false); |
2403 | temp = I915_READ(reg); | 3024 | intel_enable_plane(dev_priv, plane, pipe); |
2404 | if ((temp & DPLL_VCO_ENABLE) == 0) { | ||
2405 | I915_WRITE(reg, temp); | ||
2406 | |||
2407 | /* Wait for the clocks to stabilize. */ | ||
2408 | POSTING_READ(reg); | ||
2409 | udelay(150); | ||
2410 | |||
2411 | I915_WRITE(reg, temp | DPLL_VCO_ENABLE); | ||
2412 | |||
2413 | /* Wait for the clocks to stabilize. */ | ||
2414 | POSTING_READ(reg); | ||
2415 | udelay(150); | ||
2416 | |||
2417 | I915_WRITE(reg, temp | DPLL_VCO_ENABLE); | ||
2418 | |||
2419 | /* Wait for the clocks to stabilize. */ | ||
2420 | POSTING_READ(reg); | ||
2421 | udelay(150); | ||
2422 | } | ||
2423 | |||
2424 | /* Enable the pipe */ | ||
2425 | reg = PIPECONF(pipe); | ||
2426 | temp = I915_READ(reg); | ||
2427 | if ((temp & PIPECONF_ENABLE) == 0) | ||
2428 | I915_WRITE(reg, temp | PIPECONF_ENABLE); | ||
2429 | |||
2430 | /* Enable the plane */ | ||
2431 | reg = DSPCNTR(plane); | ||
2432 | temp = I915_READ(reg); | ||
2433 | if ((temp & DISPLAY_PLANE_ENABLE) == 0) { | ||
2434 | I915_WRITE(reg, temp | DISPLAY_PLANE_ENABLE); | ||
2435 | intel_flush_display_plane(dev, plane); | ||
2436 | } | ||
2437 | 3025 | ||
2438 | intel_crtc_load_lut(crtc); | 3026 | intel_crtc_load_lut(crtc); |
2439 | intel_update_fbc(dev); | 3027 | intel_update_fbc(dev); |
@@ -2450,7 +3038,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc) | |||
2450 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 3038 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
2451 | int pipe = intel_crtc->pipe; | 3039 | int pipe = intel_crtc->pipe; |
2452 | int plane = intel_crtc->plane; | 3040 | int plane = intel_crtc->plane; |
2453 | u32 reg, temp; | ||
2454 | 3041 | ||
2455 | if (!intel_crtc->active) | 3042 | if (!intel_crtc->active) |
2456 | return; | 3043 | return; |
@@ -2465,45 +3052,10 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc) | |||
2465 | dev_priv->display.disable_fbc) | 3052 | dev_priv->display.disable_fbc) |
2466 | dev_priv->display.disable_fbc(dev); | 3053 | dev_priv->display.disable_fbc(dev); |
2467 | 3054 | ||
2468 | /* Disable display plane */ | 3055 | intel_disable_plane(dev_priv, plane, pipe); |
2469 | reg = DSPCNTR(plane); | 3056 | intel_disable_pipe(dev_priv, pipe); |
2470 | temp = I915_READ(reg); | 3057 | intel_disable_pll(dev_priv, pipe); |
2471 | if (temp & DISPLAY_PLANE_ENABLE) { | ||
2472 | I915_WRITE(reg, temp & ~DISPLAY_PLANE_ENABLE); | ||
2473 | /* Flush the plane changes */ | ||
2474 | intel_flush_display_plane(dev, plane); | ||
2475 | |||
2476 | /* Wait for vblank for the disable to take effect */ | ||
2477 | if (IS_GEN2(dev)) | ||
2478 | intel_wait_for_vblank(dev, pipe); | ||
2479 | } | ||
2480 | |||
2481 | /* Don't disable pipe A or pipe A PLLs if needed */ | ||
2482 | if (pipe == 0 && (dev_priv->quirks & QUIRK_PIPEA_FORCE)) | ||
2483 | goto done; | ||
2484 | |||
2485 | /* Next, disable display pipes */ | ||
2486 | reg = PIPECONF(pipe); | ||
2487 | temp = I915_READ(reg); | ||
2488 | if (temp & PIPECONF_ENABLE) { | ||
2489 | I915_WRITE(reg, temp & ~PIPECONF_ENABLE); | ||
2490 | |||
2491 | /* Wait for the pipe to turn off */ | ||
2492 | POSTING_READ(reg); | ||
2493 | intel_wait_for_pipe_off(dev, pipe); | ||
2494 | } | ||
2495 | |||
2496 | reg = DPLL(pipe); | ||
2497 | temp = I915_READ(reg); | ||
2498 | if (temp & DPLL_VCO_ENABLE) { | ||
2499 | I915_WRITE(reg, temp & ~DPLL_VCO_ENABLE); | ||
2500 | 3058 | ||
2501 | /* Wait for the clocks to turn off. */ | ||
2502 | POSTING_READ(reg); | ||
2503 | udelay(150); | ||
2504 | } | ||
2505 | |||
2506 | done: | ||
2507 | intel_crtc->active = false; | 3059 | intel_crtc->active = false; |
2508 | intel_update_fbc(dev); | 3060 | intel_update_fbc(dev); |
2509 | intel_update_watermarks(dev); | 3061 | intel_update_watermarks(dev); |
@@ -2565,7 +3117,7 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
2565 | master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0; | 3117 | master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0; |
2566 | break; | 3118 | break; |
2567 | default: | 3119 | default: |
2568 | DRM_ERROR("Can't update pipe %d in SAREA\n", pipe); | 3120 | DRM_ERROR("Can't update pipe %c in SAREA\n", pipe_name(pipe)); |
2569 | break; | 3121 | break; |
2570 | } | 3122 | } |
2571 | } | 3123 | } |
@@ -2762,77 +3314,77 @@ struct intel_watermark_params { | |||
2762 | }; | 3314 | }; |
2763 | 3315 | ||
2764 | /* Pineview has different values for various configs */ | 3316 | /* Pineview has different values for various configs */ |
2765 | static struct intel_watermark_params pineview_display_wm = { | 3317 | static const struct intel_watermark_params pineview_display_wm = { |
2766 | PINEVIEW_DISPLAY_FIFO, | 3318 | PINEVIEW_DISPLAY_FIFO, |
2767 | PINEVIEW_MAX_WM, | 3319 | PINEVIEW_MAX_WM, |
2768 | PINEVIEW_DFT_WM, | 3320 | PINEVIEW_DFT_WM, |
2769 | PINEVIEW_GUARD_WM, | 3321 | PINEVIEW_GUARD_WM, |
2770 | PINEVIEW_FIFO_LINE_SIZE | 3322 | PINEVIEW_FIFO_LINE_SIZE |
2771 | }; | 3323 | }; |
2772 | static struct intel_watermark_params pineview_display_hplloff_wm = { | 3324 | static const struct intel_watermark_params pineview_display_hplloff_wm = { |
2773 | PINEVIEW_DISPLAY_FIFO, | 3325 | PINEVIEW_DISPLAY_FIFO, |
2774 | PINEVIEW_MAX_WM, | 3326 | PINEVIEW_MAX_WM, |
2775 | PINEVIEW_DFT_HPLLOFF_WM, | 3327 | PINEVIEW_DFT_HPLLOFF_WM, |
2776 | PINEVIEW_GUARD_WM, | 3328 | PINEVIEW_GUARD_WM, |
2777 | PINEVIEW_FIFO_LINE_SIZE | 3329 | PINEVIEW_FIFO_LINE_SIZE |
2778 | }; | 3330 | }; |
2779 | static struct intel_watermark_params pineview_cursor_wm = { | 3331 | static const struct intel_watermark_params pineview_cursor_wm = { |
2780 | PINEVIEW_CURSOR_FIFO, | 3332 | PINEVIEW_CURSOR_FIFO, |
2781 | PINEVIEW_CURSOR_MAX_WM, | 3333 | PINEVIEW_CURSOR_MAX_WM, |
2782 | PINEVIEW_CURSOR_DFT_WM, | 3334 | PINEVIEW_CURSOR_DFT_WM, |
2783 | PINEVIEW_CURSOR_GUARD_WM, | 3335 | PINEVIEW_CURSOR_GUARD_WM, |
2784 | PINEVIEW_FIFO_LINE_SIZE, | 3336 | PINEVIEW_FIFO_LINE_SIZE, |
2785 | }; | 3337 | }; |
2786 | static struct intel_watermark_params pineview_cursor_hplloff_wm = { | 3338 | static const struct intel_watermark_params pineview_cursor_hplloff_wm = { |
2787 | PINEVIEW_CURSOR_FIFO, | 3339 | PINEVIEW_CURSOR_FIFO, |
2788 | PINEVIEW_CURSOR_MAX_WM, | 3340 | PINEVIEW_CURSOR_MAX_WM, |
2789 | PINEVIEW_CURSOR_DFT_WM, | 3341 | PINEVIEW_CURSOR_DFT_WM, |
2790 | PINEVIEW_CURSOR_GUARD_WM, | 3342 | PINEVIEW_CURSOR_GUARD_WM, |
2791 | PINEVIEW_FIFO_LINE_SIZE | 3343 | PINEVIEW_FIFO_LINE_SIZE |
2792 | }; | 3344 | }; |
2793 | static struct intel_watermark_params g4x_wm_info = { | 3345 | static const struct intel_watermark_params g4x_wm_info = { |
2794 | G4X_FIFO_SIZE, | 3346 | G4X_FIFO_SIZE, |
2795 | G4X_MAX_WM, | 3347 | G4X_MAX_WM, |
2796 | G4X_MAX_WM, | 3348 | G4X_MAX_WM, |
2797 | 2, | 3349 | 2, |
2798 | G4X_FIFO_LINE_SIZE, | 3350 | G4X_FIFO_LINE_SIZE, |
2799 | }; | 3351 | }; |
2800 | static struct intel_watermark_params g4x_cursor_wm_info = { | 3352 | static const struct intel_watermark_params g4x_cursor_wm_info = { |
2801 | I965_CURSOR_FIFO, | 3353 | I965_CURSOR_FIFO, |
2802 | I965_CURSOR_MAX_WM, | 3354 | I965_CURSOR_MAX_WM, |
2803 | I965_CURSOR_DFT_WM, | 3355 | I965_CURSOR_DFT_WM, |
2804 | 2, | 3356 | 2, |
2805 | G4X_FIFO_LINE_SIZE, | 3357 | G4X_FIFO_LINE_SIZE, |
2806 | }; | 3358 | }; |
2807 | static struct intel_watermark_params i965_cursor_wm_info = { | 3359 | static const struct intel_watermark_params i965_cursor_wm_info = { |
2808 | I965_CURSOR_FIFO, | 3360 | I965_CURSOR_FIFO, |
2809 | I965_CURSOR_MAX_WM, | 3361 | I965_CURSOR_MAX_WM, |
2810 | I965_CURSOR_DFT_WM, | 3362 | I965_CURSOR_DFT_WM, |
2811 | 2, | 3363 | 2, |
2812 | I915_FIFO_LINE_SIZE, | 3364 | I915_FIFO_LINE_SIZE, |
2813 | }; | 3365 | }; |
2814 | static struct intel_watermark_params i945_wm_info = { | 3366 | static const struct intel_watermark_params i945_wm_info = { |
2815 | I945_FIFO_SIZE, | 3367 | I945_FIFO_SIZE, |
2816 | I915_MAX_WM, | 3368 | I915_MAX_WM, |
2817 | 1, | 3369 | 1, |
2818 | 2, | 3370 | 2, |
2819 | I915_FIFO_LINE_SIZE | 3371 | I915_FIFO_LINE_SIZE |
2820 | }; | 3372 | }; |
2821 | static struct intel_watermark_params i915_wm_info = { | 3373 | static const struct intel_watermark_params i915_wm_info = { |
2822 | I915_FIFO_SIZE, | 3374 | I915_FIFO_SIZE, |
2823 | I915_MAX_WM, | 3375 | I915_MAX_WM, |
2824 | 1, | 3376 | 1, |
2825 | 2, | 3377 | 2, |
2826 | I915_FIFO_LINE_SIZE | 3378 | I915_FIFO_LINE_SIZE |
2827 | }; | 3379 | }; |
2828 | static struct intel_watermark_params i855_wm_info = { | 3380 | static const struct intel_watermark_params i855_wm_info = { |
2829 | I855GM_FIFO_SIZE, | 3381 | I855GM_FIFO_SIZE, |
2830 | I915_MAX_WM, | 3382 | I915_MAX_WM, |
2831 | 1, | 3383 | 1, |
2832 | 2, | 3384 | 2, |
2833 | I830_FIFO_LINE_SIZE | 3385 | I830_FIFO_LINE_SIZE |
2834 | }; | 3386 | }; |
2835 | static struct intel_watermark_params i830_wm_info = { | 3387 | static const struct intel_watermark_params i830_wm_info = { |
2836 | I830_FIFO_SIZE, | 3388 | I830_FIFO_SIZE, |
2837 | I915_MAX_WM, | 3389 | I915_MAX_WM, |
2838 | 1, | 3390 | 1, |
@@ -2840,31 +3392,28 @@ static struct intel_watermark_params i830_wm_info = { | |||
2840 | I830_FIFO_LINE_SIZE | 3392 | I830_FIFO_LINE_SIZE |
2841 | }; | 3393 | }; |
2842 | 3394 | ||
2843 | static struct intel_watermark_params ironlake_display_wm_info = { | 3395 | static const struct intel_watermark_params ironlake_display_wm_info = { |
2844 | ILK_DISPLAY_FIFO, | 3396 | ILK_DISPLAY_FIFO, |
2845 | ILK_DISPLAY_MAXWM, | 3397 | ILK_DISPLAY_MAXWM, |
2846 | ILK_DISPLAY_DFTWM, | 3398 | ILK_DISPLAY_DFTWM, |
2847 | 2, | 3399 | 2, |
2848 | ILK_FIFO_LINE_SIZE | 3400 | ILK_FIFO_LINE_SIZE |
2849 | }; | 3401 | }; |
2850 | 3402 | static const struct intel_watermark_params ironlake_cursor_wm_info = { | |
2851 | static struct intel_watermark_params ironlake_cursor_wm_info = { | ||
2852 | ILK_CURSOR_FIFO, | 3403 | ILK_CURSOR_FIFO, |
2853 | ILK_CURSOR_MAXWM, | 3404 | ILK_CURSOR_MAXWM, |
2854 | ILK_CURSOR_DFTWM, | 3405 | ILK_CURSOR_DFTWM, |
2855 | 2, | 3406 | 2, |
2856 | ILK_FIFO_LINE_SIZE | 3407 | ILK_FIFO_LINE_SIZE |
2857 | }; | 3408 | }; |
2858 | 3409 | static const struct intel_watermark_params ironlake_display_srwm_info = { | |
2859 | static struct intel_watermark_params ironlake_display_srwm_info = { | ||
2860 | ILK_DISPLAY_SR_FIFO, | 3410 | ILK_DISPLAY_SR_FIFO, |
2861 | ILK_DISPLAY_MAX_SRWM, | 3411 | ILK_DISPLAY_MAX_SRWM, |
2862 | ILK_DISPLAY_DFT_SRWM, | 3412 | ILK_DISPLAY_DFT_SRWM, |
2863 | 2, | 3413 | 2, |
2864 | ILK_FIFO_LINE_SIZE | 3414 | ILK_FIFO_LINE_SIZE |
2865 | }; | 3415 | }; |
2866 | 3416 | static const struct intel_watermark_params ironlake_cursor_srwm_info = { | |
2867 | static struct intel_watermark_params ironlake_cursor_srwm_info = { | ||
2868 | ILK_CURSOR_SR_FIFO, | 3417 | ILK_CURSOR_SR_FIFO, |
2869 | ILK_CURSOR_MAX_SRWM, | 3418 | ILK_CURSOR_MAX_SRWM, |
2870 | ILK_CURSOR_DFT_SRWM, | 3419 | ILK_CURSOR_DFT_SRWM, |
@@ -2872,31 +3421,28 @@ static struct intel_watermark_params ironlake_cursor_srwm_info = { | |||
2872 | ILK_FIFO_LINE_SIZE | 3421 | ILK_FIFO_LINE_SIZE |
2873 | }; | 3422 | }; |
2874 | 3423 | ||
2875 | static struct intel_watermark_params sandybridge_display_wm_info = { | 3424 | static const struct intel_watermark_params sandybridge_display_wm_info = { |
2876 | SNB_DISPLAY_FIFO, | 3425 | SNB_DISPLAY_FIFO, |
2877 | SNB_DISPLAY_MAXWM, | 3426 | SNB_DISPLAY_MAXWM, |
2878 | SNB_DISPLAY_DFTWM, | 3427 | SNB_DISPLAY_DFTWM, |
2879 | 2, | 3428 | 2, |
2880 | SNB_FIFO_LINE_SIZE | 3429 | SNB_FIFO_LINE_SIZE |
2881 | }; | 3430 | }; |
2882 | 3431 | static const struct intel_watermark_params sandybridge_cursor_wm_info = { | |
2883 | static struct intel_watermark_params sandybridge_cursor_wm_info = { | ||
2884 | SNB_CURSOR_FIFO, | 3432 | SNB_CURSOR_FIFO, |
2885 | SNB_CURSOR_MAXWM, | 3433 | SNB_CURSOR_MAXWM, |
2886 | SNB_CURSOR_DFTWM, | 3434 | SNB_CURSOR_DFTWM, |
2887 | 2, | 3435 | 2, |
2888 | SNB_FIFO_LINE_SIZE | 3436 | SNB_FIFO_LINE_SIZE |
2889 | }; | 3437 | }; |
2890 | 3438 | static const struct intel_watermark_params sandybridge_display_srwm_info = { | |
2891 | static struct intel_watermark_params sandybridge_display_srwm_info = { | ||
2892 | SNB_DISPLAY_SR_FIFO, | 3439 | SNB_DISPLAY_SR_FIFO, |
2893 | SNB_DISPLAY_MAX_SRWM, | 3440 | SNB_DISPLAY_MAX_SRWM, |
2894 | SNB_DISPLAY_DFT_SRWM, | 3441 | SNB_DISPLAY_DFT_SRWM, |
2895 | 2, | 3442 | 2, |
2896 | SNB_FIFO_LINE_SIZE | 3443 | SNB_FIFO_LINE_SIZE |
2897 | }; | 3444 | }; |
2898 | 3445 | static const struct intel_watermark_params sandybridge_cursor_srwm_info = { | |
2899 | static struct intel_watermark_params sandybridge_cursor_srwm_info = { | ||
2900 | SNB_CURSOR_SR_FIFO, | 3446 | SNB_CURSOR_SR_FIFO, |
2901 | SNB_CURSOR_MAX_SRWM, | 3447 | SNB_CURSOR_MAX_SRWM, |
2902 | SNB_CURSOR_DFT_SRWM, | 3448 | SNB_CURSOR_DFT_SRWM, |
@@ -2924,7 +3470,8 @@ static struct intel_watermark_params sandybridge_cursor_srwm_info = { | |||
2924 | * will occur, and a display engine hang could result. | 3470 | * will occur, and a display engine hang could result. |
2925 | */ | 3471 | */ |
2926 | static unsigned long intel_calculate_wm(unsigned long clock_in_khz, | 3472 | static unsigned long intel_calculate_wm(unsigned long clock_in_khz, |
2927 | struct intel_watermark_params *wm, | 3473 | const struct intel_watermark_params *wm, |
3474 | int fifo_size, | ||
2928 | int pixel_size, | 3475 | int pixel_size, |
2929 | unsigned long latency_ns) | 3476 | unsigned long latency_ns) |
2930 | { | 3477 | { |
@@ -2942,7 +3489,7 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz, | |||
2942 | 3489 | ||
2943 | DRM_DEBUG_KMS("FIFO entries required for mode: %d\n", entries_required); | 3490 | DRM_DEBUG_KMS("FIFO entries required for mode: %d\n", entries_required); |
2944 | 3491 | ||
2945 | wm_size = wm->fifo_size - (entries_required + wm->guard_size); | 3492 | wm_size = fifo_size - (entries_required + wm->guard_size); |
2946 | 3493 | ||
2947 | DRM_DEBUG_KMS("FIFO watermark level: %d\n", wm_size); | 3494 | DRM_DEBUG_KMS("FIFO watermark level: %d\n", wm_size); |
2948 | 3495 | ||
@@ -3115,15 +3662,28 @@ static int i830_get_fifo_size(struct drm_device *dev, int plane) | |||
3115 | return size; | 3662 | return size; |
3116 | } | 3663 | } |
3117 | 3664 | ||
3118 | static void pineview_update_wm(struct drm_device *dev, int planea_clock, | 3665 | static struct drm_crtc *single_enabled_crtc(struct drm_device *dev) |
3119 | int planeb_clock, int sr_hdisplay, int unused, | 3666 | { |
3120 | int pixel_size) | 3667 | struct drm_crtc *crtc, *enabled = NULL; |
3668 | |||
3669 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
3670 | if (crtc->enabled && crtc->fb) { | ||
3671 | if (enabled) | ||
3672 | return NULL; | ||
3673 | enabled = crtc; | ||
3674 | } | ||
3675 | } | ||
3676 | |||
3677 | return enabled; | ||
3678 | } | ||
3679 | |||
3680 | static void pineview_update_wm(struct drm_device *dev) | ||
3121 | { | 3681 | { |
3122 | struct drm_i915_private *dev_priv = dev->dev_private; | 3682 | struct drm_i915_private *dev_priv = dev->dev_private; |
3683 | struct drm_crtc *crtc; | ||
3123 | const struct cxsr_latency *latency; | 3684 | const struct cxsr_latency *latency; |
3124 | u32 reg; | 3685 | u32 reg; |
3125 | unsigned long wm; | 3686 | unsigned long wm; |
3126 | int sr_clock; | ||
3127 | 3687 | ||
3128 | latency = intel_get_cxsr_latency(IS_PINEVIEW_G(dev), dev_priv->is_ddr3, | 3688 | latency = intel_get_cxsr_latency(IS_PINEVIEW_G(dev), dev_priv->is_ddr3, |
3129 | dev_priv->fsb_freq, dev_priv->mem_freq); | 3689 | dev_priv->fsb_freq, dev_priv->mem_freq); |
@@ -3133,11 +3693,14 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock, | |||
3133 | return; | 3693 | return; |
3134 | } | 3694 | } |
3135 | 3695 | ||
3136 | if (!planea_clock || !planeb_clock) { | 3696 | crtc = single_enabled_crtc(dev); |
3137 | sr_clock = planea_clock ? planea_clock : planeb_clock; | 3697 | if (crtc) { |
3698 | int clock = crtc->mode.clock; | ||
3699 | int pixel_size = crtc->fb->bits_per_pixel / 8; | ||
3138 | 3700 | ||
3139 | /* Display SR */ | 3701 | /* Display SR */ |
3140 | wm = intel_calculate_wm(sr_clock, &pineview_display_wm, | 3702 | wm = intel_calculate_wm(clock, &pineview_display_wm, |
3703 | pineview_display_wm.fifo_size, | ||
3141 | pixel_size, latency->display_sr); | 3704 | pixel_size, latency->display_sr); |
3142 | reg = I915_READ(DSPFW1); | 3705 | reg = I915_READ(DSPFW1); |
3143 | reg &= ~DSPFW_SR_MASK; | 3706 | reg &= ~DSPFW_SR_MASK; |
@@ -3146,7 +3709,8 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock, | |||
3146 | DRM_DEBUG_KMS("DSPFW1 register is %x\n", reg); | 3709 | DRM_DEBUG_KMS("DSPFW1 register is %x\n", reg); |
3147 | 3710 | ||
3148 | /* cursor SR */ | 3711 | /* cursor SR */ |
3149 | wm = intel_calculate_wm(sr_clock, &pineview_cursor_wm, | 3712 | wm = intel_calculate_wm(clock, &pineview_cursor_wm, |
3713 | pineview_display_wm.fifo_size, | ||
3150 | pixel_size, latency->cursor_sr); | 3714 | pixel_size, latency->cursor_sr); |
3151 | reg = I915_READ(DSPFW3); | 3715 | reg = I915_READ(DSPFW3); |
3152 | reg &= ~DSPFW_CURSOR_SR_MASK; | 3716 | reg &= ~DSPFW_CURSOR_SR_MASK; |
@@ -3154,7 +3718,8 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock, | |||
3154 | I915_WRITE(DSPFW3, reg); | 3718 | I915_WRITE(DSPFW3, reg); |
3155 | 3719 | ||
3156 | /* Display HPLL off SR */ | 3720 | /* Display HPLL off SR */ |
3157 | wm = intel_calculate_wm(sr_clock, &pineview_display_hplloff_wm, | 3721 | wm = intel_calculate_wm(clock, &pineview_display_hplloff_wm, |
3722 | pineview_display_hplloff_wm.fifo_size, | ||
3158 | pixel_size, latency->display_hpll_disable); | 3723 | pixel_size, latency->display_hpll_disable); |
3159 | reg = I915_READ(DSPFW3); | 3724 | reg = I915_READ(DSPFW3); |
3160 | reg &= ~DSPFW_HPLL_SR_MASK; | 3725 | reg &= ~DSPFW_HPLL_SR_MASK; |
@@ -3162,7 +3727,8 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock, | |||
3162 | I915_WRITE(DSPFW3, reg); | 3727 | I915_WRITE(DSPFW3, reg); |
3163 | 3728 | ||
3164 | /* cursor HPLL off SR */ | 3729 | /* cursor HPLL off SR */ |
3165 | wm = intel_calculate_wm(sr_clock, &pineview_cursor_hplloff_wm, | 3730 | wm = intel_calculate_wm(clock, &pineview_cursor_hplloff_wm, |
3731 | pineview_display_hplloff_wm.fifo_size, | ||
3166 | pixel_size, latency->cursor_hpll_disable); | 3732 | pixel_size, latency->cursor_hpll_disable); |
3167 | reg = I915_READ(DSPFW3); | 3733 | reg = I915_READ(DSPFW3); |
3168 | reg &= ~DSPFW_HPLL_CURSOR_MASK; | 3734 | reg &= ~DSPFW_HPLL_CURSOR_MASK; |
@@ -3180,125 +3746,229 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock, | |||
3180 | } | 3746 | } |
3181 | } | 3747 | } |
3182 | 3748 | ||
3183 | static void g4x_update_wm(struct drm_device *dev, int planea_clock, | 3749 | static bool g4x_compute_wm0(struct drm_device *dev, |
3184 | int planeb_clock, int sr_hdisplay, int sr_htotal, | 3750 | int plane, |
3185 | int pixel_size) | 3751 | const struct intel_watermark_params *display, |
3752 | int display_latency_ns, | ||
3753 | const struct intel_watermark_params *cursor, | ||
3754 | int cursor_latency_ns, | ||
3755 | int *plane_wm, | ||
3756 | int *cursor_wm) | ||
3186 | { | 3757 | { |
3187 | struct drm_i915_private *dev_priv = dev->dev_private; | 3758 | struct drm_crtc *crtc; |
3188 | int total_size, cacheline_size; | 3759 | int htotal, hdisplay, clock, pixel_size; |
3189 | int planea_wm, planeb_wm, cursora_wm, cursorb_wm, cursor_sr; | 3760 | int line_time_us, line_count; |
3190 | struct intel_watermark_params planea_params, planeb_params; | 3761 | int entries, tlb_miss; |
3191 | unsigned long line_time_us; | ||
3192 | int sr_clock, sr_entries = 0, entries_required; | ||
3193 | 3762 | ||
3194 | /* Create copies of the base settings for each pipe */ | 3763 | crtc = intel_get_crtc_for_plane(dev, plane); |
3195 | planea_params = planeb_params = g4x_wm_info; | 3764 | if (crtc->fb == NULL || !crtc->enabled) |
3765 | return false; | ||
3196 | 3766 | ||
3197 | /* Grab a couple of global values before we overwrite them */ | 3767 | htotal = crtc->mode.htotal; |
3198 | total_size = planea_params.fifo_size; | 3768 | hdisplay = crtc->mode.hdisplay; |
3199 | cacheline_size = planea_params.cacheline_size; | 3769 | clock = crtc->mode.clock; |
3770 | pixel_size = crtc->fb->bits_per_pixel / 8; | ||
3200 | 3771 | ||
3201 | /* | 3772 | /* Use the small buffer method to calculate plane watermark */ |
3202 | * Note: we need to make sure we don't overflow for various clock & | 3773 | entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000; |
3203 | * latency values. | 3774 | tlb_miss = display->fifo_size*display->cacheline_size - hdisplay * 8; |
3204 | * clocks go from a few thousand to several hundred thousand. | 3775 | if (tlb_miss > 0) |
3205 | * latency is usually a few thousand | 3776 | entries += tlb_miss; |
3206 | */ | 3777 | entries = DIV_ROUND_UP(entries, display->cacheline_size); |
3207 | entries_required = ((planea_clock / 1000) * pixel_size * latency_ns) / | 3778 | *plane_wm = entries + display->guard_size; |
3208 | 1000; | 3779 | if (*plane_wm > (int)display->max_wm) |
3209 | entries_required = DIV_ROUND_UP(entries_required, G4X_FIFO_LINE_SIZE); | 3780 | *plane_wm = display->max_wm; |
3210 | planea_wm = entries_required + planea_params.guard_size; | ||
3211 | 3781 | ||
3212 | entries_required = ((planeb_clock / 1000) * pixel_size * latency_ns) / | 3782 | /* Use the large buffer method to calculate cursor watermark */ |
3213 | 1000; | 3783 | line_time_us = ((htotal * 1000) / clock); |
3214 | entries_required = DIV_ROUND_UP(entries_required, G4X_FIFO_LINE_SIZE); | 3784 | line_count = (cursor_latency_ns / line_time_us + 1000) / 1000; |
3215 | planeb_wm = entries_required + planeb_params.guard_size; | 3785 | entries = line_count * 64 * pixel_size; |
3786 | tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8; | ||
3787 | if (tlb_miss > 0) | ||
3788 | entries += tlb_miss; | ||
3789 | entries = DIV_ROUND_UP(entries, cursor->cacheline_size); | ||
3790 | *cursor_wm = entries + cursor->guard_size; | ||
3791 | if (*cursor_wm > (int)cursor->max_wm) | ||
3792 | *cursor_wm = (int)cursor->max_wm; | ||
3793 | |||
3794 | return true; | ||
3795 | } | ||
3216 | 3796 | ||
3217 | cursora_wm = cursorb_wm = 16; | 3797 | /* |
3218 | cursor_sr = 32; | 3798 | * Check the wm result. |
3799 | * | ||
3800 | * If any calculated watermark values is larger than the maximum value that | ||
3801 | * can be programmed into the associated watermark register, that watermark | ||
3802 | * must be disabled. | ||
3803 | */ | ||
3804 | static bool g4x_check_srwm(struct drm_device *dev, | ||
3805 | int display_wm, int cursor_wm, | ||
3806 | const struct intel_watermark_params *display, | ||
3807 | const struct intel_watermark_params *cursor) | ||
3808 | { | ||
3809 | DRM_DEBUG_KMS("SR watermark: display plane %d, cursor %d\n", | ||
3810 | display_wm, cursor_wm); | ||
3219 | 3811 | ||
3220 | DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); | 3812 | if (display_wm > display->max_wm) { |
3813 | DRM_DEBUG_KMS("display watermark is too large(%d), disabling\n", | ||
3814 | display_wm, display->max_wm); | ||
3815 | return false; | ||
3816 | } | ||
3221 | 3817 | ||
3222 | /* Calc sr entries for one plane configs */ | 3818 | if (cursor_wm > cursor->max_wm) { |
3223 | if (sr_hdisplay && (!planea_clock || !planeb_clock)) { | 3819 | DRM_DEBUG_KMS("cursor watermark is too large(%d), disabling\n", |
3224 | /* self-refresh has much higher latency */ | 3820 | cursor_wm, cursor->max_wm); |
3225 | static const int sr_latency_ns = 12000; | 3821 | return false; |
3822 | } | ||
3226 | 3823 | ||
3227 | sr_clock = planea_clock ? planea_clock : planeb_clock; | 3824 | if (!(display_wm || cursor_wm)) { |
3228 | line_time_us = ((sr_htotal * 1000) / sr_clock); | 3825 | DRM_DEBUG_KMS("SR latency is 0, disabling\n"); |
3826 | return false; | ||
3827 | } | ||
3229 | 3828 | ||
3230 | /* Use ns/us then divide to preserve precision */ | 3829 | return true; |
3231 | sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 3830 | } |
3232 | pixel_size * sr_hdisplay; | ||
3233 | sr_entries = DIV_ROUND_UP(sr_entries, cacheline_size); | ||
3234 | |||
3235 | entries_required = (((sr_latency_ns / line_time_us) + | ||
3236 | 1000) / 1000) * pixel_size * 64; | ||
3237 | entries_required = DIV_ROUND_UP(entries_required, | ||
3238 | g4x_cursor_wm_info.cacheline_size); | ||
3239 | cursor_sr = entries_required + g4x_cursor_wm_info.guard_size; | ||
3240 | |||
3241 | if (cursor_sr > g4x_cursor_wm_info.max_wm) | ||
3242 | cursor_sr = g4x_cursor_wm_info.max_wm; | ||
3243 | DRM_DEBUG_KMS("self-refresh watermark: display plane %d " | ||
3244 | "cursor %d\n", sr_entries, cursor_sr); | ||
3245 | 3831 | ||
3246 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | 3832 | static bool g4x_compute_srwm(struct drm_device *dev, |
3247 | } else { | 3833 | int plane, |
3248 | /* Turn off self refresh if both pipes are enabled */ | 3834 | int latency_ns, |
3249 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | 3835 | const struct intel_watermark_params *display, |
3250 | & ~FW_BLC_SELF_EN); | 3836 | const struct intel_watermark_params *cursor, |
3837 | int *display_wm, int *cursor_wm) | ||
3838 | { | ||
3839 | struct drm_crtc *crtc; | ||
3840 | int hdisplay, htotal, pixel_size, clock; | ||
3841 | unsigned long line_time_us; | ||
3842 | int line_count, line_size; | ||
3843 | int small, large; | ||
3844 | int entries; | ||
3845 | |||
3846 | if (!latency_ns) { | ||
3847 | *display_wm = *cursor_wm = 0; | ||
3848 | return false; | ||
3251 | } | 3849 | } |
3252 | 3850 | ||
3253 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", | 3851 | crtc = intel_get_crtc_for_plane(dev, plane); |
3254 | planea_wm, planeb_wm, sr_entries); | 3852 | hdisplay = crtc->mode.hdisplay; |
3853 | htotal = crtc->mode.htotal; | ||
3854 | clock = crtc->mode.clock; | ||
3855 | pixel_size = crtc->fb->bits_per_pixel / 8; | ||
3856 | |||
3857 | line_time_us = (htotal * 1000) / clock; | ||
3858 | line_count = (latency_ns / line_time_us + 1000) / 1000; | ||
3859 | line_size = hdisplay * pixel_size; | ||
3255 | 3860 | ||
3256 | planea_wm &= 0x3f; | 3861 | /* Use the minimum of the small and large buffer method for primary */ |
3257 | planeb_wm &= 0x3f; | 3862 | small = ((clock * pixel_size / 1000) * latency_ns) / 1000; |
3863 | large = line_count * line_size; | ||
3258 | 3864 | ||
3259 | I915_WRITE(DSPFW1, (sr_entries << DSPFW_SR_SHIFT) | | 3865 | entries = DIV_ROUND_UP(min(small, large), display->cacheline_size); |
3866 | *display_wm = entries + display->guard_size; | ||
3867 | |||
3868 | /* calculate the self-refresh watermark for display cursor */ | ||
3869 | entries = line_count * pixel_size * 64; | ||
3870 | entries = DIV_ROUND_UP(entries, cursor->cacheline_size); | ||
3871 | *cursor_wm = entries + cursor->guard_size; | ||
3872 | |||
3873 | return g4x_check_srwm(dev, | ||
3874 | *display_wm, *cursor_wm, | ||
3875 | display, cursor); | ||
3876 | } | ||
3877 | |||
3878 | static inline bool single_plane_enabled(unsigned int mask) | ||
3879 | { | ||
3880 | return mask && (mask & -mask) == 0; | ||
3881 | } | ||
3882 | |||
3883 | static void g4x_update_wm(struct drm_device *dev) | ||
3884 | { | ||
3885 | static const int sr_latency_ns = 12000; | ||
3886 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3887 | int planea_wm, planeb_wm, cursora_wm, cursorb_wm; | ||
3888 | int plane_sr, cursor_sr; | ||
3889 | unsigned int enabled = 0; | ||
3890 | |||
3891 | if (g4x_compute_wm0(dev, 0, | ||
3892 | &g4x_wm_info, latency_ns, | ||
3893 | &g4x_cursor_wm_info, latency_ns, | ||
3894 | &planea_wm, &cursora_wm)) | ||
3895 | enabled |= 1; | ||
3896 | |||
3897 | if (g4x_compute_wm0(dev, 1, | ||
3898 | &g4x_wm_info, latency_ns, | ||
3899 | &g4x_cursor_wm_info, latency_ns, | ||
3900 | &planeb_wm, &cursorb_wm)) | ||
3901 | enabled |= 2; | ||
3902 | |||
3903 | plane_sr = cursor_sr = 0; | ||
3904 | if (single_plane_enabled(enabled) && | ||
3905 | g4x_compute_srwm(dev, ffs(enabled) - 1, | ||
3906 | sr_latency_ns, | ||
3907 | &g4x_wm_info, | ||
3908 | &g4x_cursor_wm_info, | ||
3909 | &plane_sr, &cursor_sr)) | ||
3910 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | ||
3911 | else | ||
3912 | I915_WRITE(FW_BLC_SELF, | ||
3913 | I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN); | ||
3914 | |||
3915 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n", | ||
3916 | planea_wm, cursora_wm, | ||
3917 | planeb_wm, cursorb_wm, | ||
3918 | plane_sr, cursor_sr); | ||
3919 | |||
3920 | I915_WRITE(DSPFW1, | ||
3921 | (plane_sr << DSPFW_SR_SHIFT) | | ||
3260 | (cursorb_wm << DSPFW_CURSORB_SHIFT) | | 3922 | (cursorb_wm << DSPFW_CURSORB_SHIFT) | |
3261 | (planeb_wm << DSPFW_PLANEB_SHIFT) | planea_wm); | 3923 | (planeb_wm << DSPFW_PLANEB_SHIFT) | |
3262 | I915_WRITE(DSPFW2, (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) | | 3924 | planea_wm); |
3925 | I915_WRITE(DSPFW2, | ||
3926 | (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) | | ||
3263 | (cursora_wm << DSPFW_CURSORA_SHIFT)); | 3927 | (cursora_wm << DSPFW_CURSORA_SHIFT)); |
3264 | /* HPLL off in SR has some issues on G4x... disable it */ | 3928 | /* HPLL off in SR has some issues on G4x... disable it */ |
3265 | I915_WRITE(DSPFW3, (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) | | 3929 | I915_WRITE(DSPFW3, |
3930 | (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) | | ||
3266 | (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); | 3931 | (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); |
3267 | } | 3932 | } |
3268 | 3933 | ||
3269 | static void i965_update_wm(struct drm_device *dev, int planea_clock, | 3934 | static void i965_update_wm(struct drm_device *dev) |
3270 | int planeb_clock, int sr_hdisplay, int sr_htotal, | ||
3271 | int pixel_size) | ||
3272 | { | 3935 | { |
3273 | struct drm_i915_private *dev_priv = dev->dev_private; | 3936 | struct drm_i915_private *dev_priv = dev->dev_private; |
3274 | unsigned long line_time_us; | 3937 | struct drm_crtc *crtc; |
3275 | int sr_clock, sr_entries, srwm = 1; | 3938 | int srwm = 1; |
3276 | int cursor_sr = 16; | 3939 | int cursor_sr = 16; |
3277 | 3940 | ||
3278 | /* Calc sr entries for one plane configs */ | 3941 | /* Calc sr entries for one plane configs */ |
3279 | if (sr_hdisplay && (!planea_clock || !planeb_clock)) { | 3942 | crtc = single_enabled_crtc(dev); |
3943 | if (crtc) { | ||
3280 | /* self-refresh has much higher latency */ | 3944 | /* self-refresh has much higher latency */ |
3281 | static const int sr_latency_ns = 12000; | 3945 | static const int sr_latency_ns = 12000; |
3946 | int clock = crtc->mode.clock; | ||
3947 | int htotal = crtc->mode.htotal; | ||
3948 | int hdisplay = crtc->mode.hdisplay; | ||
3949 | int pixel_size = crtc->fb->bits_per_pixel / 8; | ||
3950 | unsigned long line_time_us; | ||
3951 | int entries; | ||
3282 | 3952 | ||
3283 | sr_clock = planea_clock ? planea_clock : planeb_clock; | 3953 | line_time_us = ((htotal * 1000) / clock); |
3284 | line_time_us = ((sr_htotal * 1000) / sr_clock); | ||
3285 | 3954 | ||
3286 | /* Use ns/us then divide to preserve precision */ | 3955 | /* Use ns/us then divide to preserve precision */ |
3287 | sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 3956 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * |
3288 | pixel_size * sr_hdisplay; | 3957 | pixel_size * hdisplay; |
3289 | sr_entries = DIV_ROUND_UP(sr_entries, I915_FIFO_LINE_SIZE); | 3958 | entries = DIV_ROUND_UP(entries, I915_FIFO_LINE_SIZE); |
3290 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | 3959 | srwm = I965_FIFO_SIZE - entries; |
3291 | srwm = I965_FIFO_SIZE - sr_entries; | ||
3292 | if (srwm < 0) | 3960 | if (srwm < 0) |
3293 | srwm = 1; | 3961 | srwm = 1; |
3294 | srwm &= 0x1ff; | 3962 | srwm &= 0x1ff; |
3963 | DRM_DEBUG_KMS("self-refresh entries: %d, wm: %d\n", | ||
3964 | entries, srwm); | ||
3295 | 3965 | ||
3296 | sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 3966 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * |
3297 | pixel_size * 64; | 3967 | pixel_size * 64; |
3298 | sr_entries = DIV_ROUND_UP(sr_entries, | 3968 | entries = DIV_ROUND_UP(entries, |
3299 | i965_cursor_wm_info.cacheline_size); | 3969 | i965_cursor_wm_info.cacheline_size); |
3300 | cursor_sr = i965_cursor_wm_info.fifo_size - | 3970 | cursor_sr = i965_cursor_wm_info.fifo_size - |
3301 | (sr_entries + i965_cursor_wm_info.guard_size); | 3971 | (entries + i965_cursor_wm_info.guard_size); |
3302 | 3972 | ||
3303 | if (cursor_sr > i965_cursor_wm_info.max_wm) | 3973 | if (cursor_sr > i965_cursor_wm_info.max_wm) |
3304 | cursor_sr = i965_cursor_wm_info.max_wm; | 3974 | cursor_sr = i965_cursor_wm_info.max_wm; |
@@ -3319,46 +3989,56 @@ static void i965_update_wm(struct drm_device *dev, int planea_clock, | |||
3319 | srwm); | 3989 | srwm); |
3320 | 3990 | ||
3321 | /* 965 has limitations... */ | 3991 | /* 965 has limitations... */ |
3322 | I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) | (8 << 16) | (8 << 8) | | 3992 | I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) | |
3323 | (8 << 0)); | 3993 | (8 << 16) | (8 << 8) | (8 << 0)); |
3324 | I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); | 3994 | I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); |
3325 | /* update cursor SR watermark */ | 3995 | /* update cursor SR watermark */ |
3326 | I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); | 3996 | I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); |
3327 | } | 3997 | } |
3328 | 3998 | ||
3329 | static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | 3999 | static void i9xx_update_wm(struct drm_device *dev) |
3330 | int planeb_clock, int sr_hdisplay, int sr_htotal, | ||
3331 | int pixel_size) | ||
3332 | { | 4000 | { |
3333 | struct drm_i915_private *dev_priv = dev->dev_private; | 4001 | struct drm_i915_private *dev_priv = dev->dev_private; |
4002 | const struct intel_watermark_params *wm_info; | ||
3334 | uint32_t fwater_lo; | 4003 | uint32_t fwater_lo; |
3335 | uint32_t fwater_hi; | 4004 | uint32_t fwater_hi; |
3336 | int total_size, cacheline_size, cwm, srwm = 1; | 4005 | int cwm, srwm = 1; |
4006 | int fifo_size; | ||
3337 | int planea_wm, planeb_wm; | 4007 | int planea_wm, planeb_wm; |
3338 | struct intel_watermark_params planea_params, planeb_params; | 4008 | struct drm_crtc *crtc, *enabled = NULL; |
3339 | unsigned long line_time_us; | ||
3340 | int sr_clock, sr_entries = 0; | ||
3341 | 4009 | ||
3342 | /* Create copies of the base settings for each pipe */ | 4010 | if (IS_I945GM(dev)) |
3343 | if (IS_CRESTLINE(dev) || IS_I945GM(dev)) | 4011 | wm_info = &i945_wm_info; |
3344 | planea_params = planeb_params = i945_wm_info; | ||
3345 | else if (!IS_GEN2(dev)) | 4012 | else if (!IS_GEN2(dev)) |
3346 | planea_params = planeb_params = i915_wm_info; | 4013 | wm_info = &i915_wm_info; |
3347 | else | 4014 | else |
3348 | planea_params = planeb_params = i855_wm_info; | 4015 | wm_info = &i855_wm_info; |
3349 | 4016 | ||
3350 | /* Grab a couple of global values before we overwrite them */ | 4017 | fifo_size = dev_priv->display.get_fifo_size(dev, 0); |
3351 | total_size = planea_params.fifo_size; | 4018 | crtc = intel_get_crtc_for_plane(dev, 0); |
3352 | cacheline_size = planea_params.cacheline_size; | 4019 | if (crtc->enabled && crtc->fb) { |
3353 | 4020 | planea_wm = intel_calculate_wm(crtc->mode.clock, | |
3354 | /* Update per-plane FIFO sizes */ | 4021 | wm_info, fifo_size, |
3355 | planea_params.fifo_size = dev_priv->display.get_fifo_size(dev, 0); | 4022 | crtc->fb->bits_per_pixel / 8, |
3356 | planeb_params.fifo_size = dev_priv->display.get_fifo_size(dev, 1); | 4023 | latency_ns); |
4024 | enabled = crtc; | ||
4025 | } else | ||
4026 | planea_wm = fifo_size - wm_info->guard_size; | ||
4027 | |||
4028 | fifo_size = dev_priv->display.get_fifo_size(dev, 1); | ||
4029 | crtc = intel_get_crtc_for_plane(dev, 1); | ||
4030 | if (crtc->enabled && crtc->fb) { | ||
4031 | planeb_wm = intel_calculate_wm(crtc->mode.clock, | ||
4032 | wm_info, fifo_size, | ||
4033 | crtc->fb->bits_per_pixel / 8, | ||
4034 | latency_ns); | ||
4035 | if (enabled == NULL) | ||
4036 | enabled = crtc; | ||
4037 | else | ||
4038 | enabled = NULL; | ||
4039 | } else | ||
4040 | planeb_wm = fifo_size - wm_info->guard_size; | ||
3357 | 4041 | ||
3358 | planea_wm = intel_calculate_wm(planea_clock, &planea_params, | ||
3359 | pixel_size, latency_ns); | ||
3360 | planeb_wm = intel_calculate_wm(planeb_clock, &planeb_params, | ||
3361 | pixel_size, latency_ns); | ||
3362 | DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); | 4042 | DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); |
3363 | 4043 | ||
3364 | /* | 4044 | /* |
@@ -3366,39 +4046,39 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | |||
3366 | */ | 4046 | */ |
3367 | cwm = 2; | 4047 | cwm = 2; |
3368 | 4048 | ||
4049 | /* Play safe and disable self-refresh before adjusting watermarks. */ | ||
4050 | if (IS_I945G(dev) || IS_I945GM(dev)) | ||
4051 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | 0); | ||
4052 | else if (IS_I915GM(dev)) | ||
4053 | I915_WRITE(INSTPM, I915_READ(INSTPM) & ~INSTPM_SELF_EN); | ||
4054 | |||
3369 | /* Calc sr entries for one plane configs */ | 4055 | /* Calc sr entries for one plane configs */ |
3370 | if (HAS_FW_BLC(dev) && sr_hdisplay && | 4056 | if (HAS_FW_BLC(dev) && enabled) { |
3371 | (!planea_clock || !planeb_clock)) { | ||
3372 | /* self-refresh has much higher latency */ | 4057 | /* self-refresh has much higher latency */ |
3373 | static const int sr_latency_ns = 6000; | 4058 | static const int sr_latency_ns = 6000; |
4059 | int clock = enabled->mode.clock; | ||
4060 | int htotal = enabled->mode.htotal; | ||
4061 | int hdisplay = enabled->mode.hdisplay; | ||
4062 | int pixel_size = enabled->fb->bits_per_pixel / 8; | ||
4063 | unsigned long line_time_us; | ||
4064 | int entries; | ||
3374 | 4065 | ||
3375 | sr_clock = planea_clock ? planea_clock : planeb_clock; | 4066 | line_time_us = (htotal * 1000) / clock; |
3376 | line_time_us = ((sr_htotal * 1000) / sr_clock); | ||
3377 | 4067 | ||
3378 | /* Use ns/us then divide to preserve precision */ | 4068 | /* Use ns/us then divide to preserve precision */ |
3379 | sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 4069 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * |
3380 | pixel_size * sr_hdisplay; | 4070 | pixel_size * hdisplay; |
3381 | sr_entries = DIV_ROUND_UP(sr_entries, cacheline_size); | 4071 | entries = DIV_ROUND_UP(entries, wm_info->cacheline_size); |
3382 | DRM_DEBUG_KMS("self-refresh entries: %d\n", sr_entries); | 4072 | DRM_DEBUG_KMS("self-refresh entries: %d\n", entries); |
3383 | srwm = total_size - sr_entries; | 4073 | srwm = wm_info->fifo_size - entries; |
3384 | if (srwm < 0) | 4074 | if (srwm < 0) |
3385 | srwm = 1; | 4075 | srwm = 1; |
3386 | 4076 | ||
3387 | if (IS_I945G(dev) || IS_I945GM(dev)) | 4077 | if (IS_I945G(dev) || IS_I945GM(dev)) |
3388 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_FIFO_MASK | (srwm & 0xff)); | 4078 | I915_WRITE(FW_BLC_SELF, |
3389 | else if (IS_I915GM(dev)) { | 4079 | FW_BLC_SELF_FIFO_MASK | (srwm & 0xff)); |
3390 | /* 915M has a smaller SRWM field */ | 4080 | else if (IS_I915GM(dev)) |
3391 | I915_WRITE(FW_BLC_SELF, srwm & 0x3f); | 4081 | I915_WRITE(FW_BLC_SELF, srwm & 0x3f); |
3392 | I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN); | ||
3393 | } | ||
3394 | } else { | ||
3395 | /* Turn off self refresh if both pipes are enabled */ | ||
3396 | if (IS_I945G(dev) || IS_I945GM(dev)) { | ||
3397 | I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) | ||
3398 | & ~FW_BLC_SELF_EN); | ||
3399 | } else if (IS_I915GM(dev)) { | ||
3400 | I915_WRITE(INSTPM, I915_READ(INSTPM) & ~INSTPM_SELF_EN); | ||
3401 | } | ||
3402 | } | 4082 | } |
3403 | 4083 | ||
3404 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", | 4084 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", |
@@ -3413,19 +4093,36 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock, | |||
3413 | 4093 | ||
3414 | I915_WRITE(FW_BLC, fwater_lo); | 4094 | I915_WRITE(FW_BLC, fwater_lo); |
3415 | I915_WRITE(FW_BLC2, fwater_hi); | 4095 | I915_WRITE(FW_BLC2, fwater_hi); |
4096 | |||
4097 | if (HAS_FW_BLC(dev)) { | ||
4098 | if (enabled) { | ||
4099 | if (IS_I945G(dev) || IS_I945GM(dev)) | ||
4100 | I915_WRITE(FW_BLC_SELF, | ||
4101 | FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN); | ||
4102 | else if (IS_I915GM(dev)) | ||
4103 | I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN); | ||
4104 | DRM_DEBUG_KMS("memory self refresh enabled\n"); | ||
4105 | } else | ||
4106 | DRM_DEBUG_KMS("memory self refresh disabled\n"); | ||
4107 | } | ||
3416 | } | 4108 | } |
3417 | 4109 | ||
3418 | static void i830_update_wm(struct drm_device *dev, int planea_clock, int unused, | 4110 | static void i830_update_wm(struct drm_device *dev) |
3419 | int unused2, int unused3, int pixel_size) | ||
3420 | { | 4111 | { |
3421 | struct drm_i915_private *dev_priv = dev->dev_private; | 4112 | struct drm_i915_private *dev_priv = dev->dev_private; |
3422 | uint32_t fwater_lo = I915_READ(FW_BLC) & ~0xfff; | 4113 | struct drm_crtc *crtc; |
4114 | uint32_t fwater_lo; | ||
3423 | int planea_wm; | 4115 | int planea_wm; |
3424 | 4116 | ||
3425 | i830_wm_info.fifo_size = dev_priv->display.get_fifo_size(dev, 0); | 4117 | crtc = single_enabled_crtc(dev); |
4118 | if (crtc == NULL) | ||
4119 | return; | ||
3426 | 4120 | ||
3427 | planea_wm = intel_calculate_wm(planea_clock, &i830_wm_info, | 4121 | planea_wm = intel_calculate_wm(crtc->mode.clock, &i830_wm_info, |
3428 | pixel_size, latency_ns); | 4122 | dev_priv->display.get_fifo_size(dev, 0), |
4123 | crtc->fb->bits_per_pixel / 8, | ||
4124 | latency_ns); | ||
4125 | fwater_lo = I915_READ(FW_BLC) & ~0xfff; | ||
3429 | fwater_lo |= (3<<8) | planea_wm; | 4126 | fwater_lo |= (3<<8) | planea_wm; |
3430 | 4127 | ||
3431 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d\n", planea_wm); | 4128 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d\n", planea_wm); |
@@ -3534,15 +4231,15 @@ static bool ironlake_check_srwm(struct drm_device *dev, int level, | |||
3534 | /* | 4231 | /* |
3535 | * Compute watermark values of WM[1-3], | 4232 | * Compute watermark values of WM[1-3], |
3536 | */ | 4233 | */ |
3537 | static bool ironlake_compute_srwm(struct drm_device *dev, int level, | 4234 | static bool ironlake_compute_srwm(struct drm_device *dev, int level, int plane, |
3538 | int hdisplay, int htotal, | 4235 | int latency_ns, |
3539 | int pixel_size, int clock, int latency_ns, | ||
3540 | const struct intel_watermark_params *display, | 4236 | const struct intel_watermark_params *display, |
3541 | const struct intel_watermark_params *cursor, | 4237 | const struct intel_watermark_params *cursor, |
3542 | int *fbc_wm, int *display_wm, int *cursor_wm) | 4238 | int *fbc_wm, int *display_wm, int *cursor_wm) |
3543 | { | 4239 | { |
3544 | 4240 | struct drm_crtc *crtc; | |
3545 | unsigned long line_time_us; | 4241 | unsigned long line_time_us; |
4242 | int hdisplay, htotal, pixel_size, clock; | ||
3546 | int line_count, line_size; | 4243 | int line_count, line_size; |
3547 | int small, large; | 4244 | int small, large; |
3548 | int entries; | 4245 | int entries; |
@@ -3552,6 +4249,12 @@ static bool ironlake_compute_srwm(struct drm_device *dev, int level, | |||
3552 | return false; | 4249 | return false; |
3553 | } | 4250 | } |
3554 | 4251 | ||
4252 | crtc = intel_get_crtc_for_plane(dev, plane); | ||
4253 | hdisplay = crtc->mode.hdisplay; | ||
4254 | htotal = crtc->mode.htotal; | ||
4255 | clock = crtc->mode.clock; | ||
4256 | pixel_size = crtc->fb->bits_per_pixel / 8; | ||
4257 | |||
3555 | line_time_us = (htotal * 1000) / clock; | 4258 | line_time_us = (htotal * 1000) / clock; |
3556 | line_count = (latency_ns / line_time_us + 1000) / 1000; | 4259 | line_count = (latency_ns / line_time_us + 1000) / 1000; |
3557 | line_size = hdisplay * pixel_size; | 4260 | line_size = hdisplay * pixel_size; |
@@ -3579,14 +4282,11 @@ static bool ironlake_compute_srwm(struct drm_device *dev, int level, | |||
3579 | display, cursor); | 4282 | display, cursor); |
3580 | } | 4283 | } |
3581 | 4284 | ||
3582 | static void ironlake_update_wm(struct drm_device *dev, | 4285 | static void ironlake_update_wm(struct drm_device *dev) |
3583 | int planea_clock, int planeb_clock, | ||
3584 | int hdisplay, int htotal, | ||
3585 | int pixel_size) | ||
3586 | { | 4286 | { |
3587 | struct drm_i915_private *dev_priv = dev->dev_private; | 4287 | struct drm_i915_private *dev_priv = dev->dev_private; |
3588 | int fbc_wm, plane_wm, cursor_wm, enabled; | 4288 | int fbc_wm, plane_wm, cursor_wm; |
3589 | int clock; | 4289 | unsigned int enabled; |
3590 | 4290 | ||
3591 | enabled = 0; | 4291 | enabled = 0; |
3592 | if (ironlake_compute_wm0(dev, 0, | 4292 | if (ironlake_compute_wm0(dev, 0, |
@@ -3600,7 +4300,7 @@ static void ironlake_update_wm(struct drm_device *dev, | |||
3600 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" | 4300 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" |
3601 | " plane %d, " "cursor: %d\n", | 4301 | " plane %d, " "cursor: %d\n", |
3602 | plane_wm, cursor_wm); | 4302 | plane_wm, cursor_wm); |
3603 | enabled++; | 4303 | enabled |= 1; |
3604 | } | 4304 | } |
3605 | 4305 | ||
3606 | if (ironlake_compute_wm0(dev, 1, | 4306 | if (ironlake_compute_wm0(dev, 1, |
@@ -3614,7 +4314,7 @@ static void ironlake_update_wm(struct drm_device *dev, | |||
3614 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" | 4314 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" |
3615 | " plane %d, cursor: %d\n", | 4315 | " plane %d, cursor: %d\n", |
3616 | plane_wm, cursor_wm); | 4316 | plane_wm, cursor_wm); |
3617 | enabled++; | 4317 | enabled |= 2; |
3618 | } | 4318 | } |
3619 | 4319 | ||
3620 | /* | 4320 | /* |
@@ -3625,14 +4325,13 @@ static void ironlake_update_wm(struct drm_device *dev, | |||
3625 | I915_WRITE(WM2_LP_ILK, 0); | 4325 | I915_WRITE(WM2_LP_ILK, 0); |
3626 | I915_WRITE(WM1_LP_ILK, 0); | 4326 | I915_WRITE(WM1_LP_ILK, 0); |
3627 | 4327 | ||
3628 | if (enabled != 1) | 4328 | if (!single_plane_enabled(enabled)) |
3629 | return; | 4329 | return; |
3630 | 4330 | enabled = ffs(enabled) - 1; | |
3631 | clock = planea_clock ? planea_clock : planeb_clock; | ||
3632 | 4331 | ||
3633 | /* WM1 */ | 4332 | /* WM1 */ |
3634 | if (!ironlake_compute_srwm(dev, 1, hdisplay, htotal, pixel_size, | 4333 | if (!ironlake_compute_srwm(dev, 1, enabled, |
3635 | clock, ILK_READ_WM1_LATENCY() * 500, | 4334 | ILK_READ_WM1_LATENCY() * 500, |
3636 | &ironlake_display_srwm_info, | 4335 | &ironlake_display_srwm_info, |
3637 | &ironlake_cursor_srwm_info, | 4336 | &ironlake_cursor_srwm_info, |
3638 | &fbc_wm, &plane_wm, &cursor_wm)) | 4337 | &fbc_wm, &plane_wm, &cursor_wm)) |
@@ -3646,8 +4345,8 @@ static void ironlake_update_wm(struct drm_device *dev, | |||
3646 | cursor_wm); | 4345 | cursor_wm); |
3647 | 4346 | ||
3648 | /* WM2 */ | 4347 | /* WM2 */ |
3649 | if (!ironlake_compute_srwm(dev, 2, hdisplay, htotal, pixel_size, | 4348 | if (!ironlake_compute_srwm(dev, 2, enabled, |
3650 | clock, ILK_READ_WM2_LATENCY() * 500, | 4349 | ILK_READ_WM2_LATENCY() * 500, |
3651 | &ironlake_display_srwm_info, | 4350 | &ironlake_display_srwm_info, |
3652 | &ironlake_cursor_srwm_info, | 4351 | &ironlake_cursor_srwm_info, |
3653 | &fbc_wm, &plane_wm, &cursor_wm)) | 4352 | &fbc_wm, &plane_wm, &cursor_wm)) |
@@ -3666,15 +4365,12 @@ static void ironlake_update_wm(struct drm_device *dev, | |||
3666 | */ | 4365 | */ |
3667 | } | 4366 | } |
3668 | 4367 | ||
3669 | static void sandybridge_update_wm(struct drm_device *dev, | 4368 | static void sandybridge_update_wm(struct drm_device *dev) |
3670 | int planea_clock, int planeb_clock, | ||
3671 | int hdisplay, int htotal, | ||
3672 | int pixel_size) | ||
3673 | { | 4369 | { |
3674 | struct drm_i915_private *dev_priv = dev->dev_private; | 4370 | struct drm_i915_private *dev_priv = dev->dev_private; |
3675 | int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */ | 4371 | int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */ |
3676 | int fbc_wm, plane_wm, cursor_wm, enabled; | 4372 | int fbc_wm, plane_wm, cursor_wm; |
3677 | int clock; | 4373 | unsigned int enabled; |
3678 | 4374 | ||
3679 | enabled = 0; | 4375 | enabled = 0; |
3680 | if (ironlake_compute_wm0(dev, 0, | 4376 | if (ironlake_compute_wm0(dev, 0, |
@@ -3686,7 +4382,7 @@ static void sandybridge_update_wm(struct drm_device *dev, | |||
3686 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" | 4382 | DRM_DEBUG_KMS("FIFO watermarks For pipe A -" |
3687 | " plane %d, " "cursor: %d\n", | 4383 | " plane %d, " "cursor: %d\n", |
3688 | plane_wm, cursor_wm); | 4384 | plane_wm, cursor_wm); |
3689 | enabled++; | 4385 | enabled |= 1; |
3690 | } | 4386 | } |
3691 | 4387 | ||
3692 | if (ironlake_compute_wm0(dev, 1, | 4388 | if (ironlake_compute_wm0(dev, 1, |
@@ -3698,7 +4394,7 @@ static void sandybridge_update_wm(struct drm_device *dev, | |||
3698 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" | 4394 | DRM_DEBUG_KMS("FIFO watermarks For pipe B -" |
3699 | " plane %d, cursor: %d\n", | 4395 | " plane %d, cursor: %d\n", |
3700 | plane_wm, cursor_wm); | 4396 | plane_wm, cursor_wm); |
3701 | enabled++; | 4397 | enabled |= 2; |
3702 | } | 4398 | } |
3703 | 4399 | ||
3704 | /* | 4400 | /* |
@@ -3715,14 +4411,13 @@ static void sandybridge_update_wm(struct drm_device *dev, | |||
3715 | I915_WRITE(WM2_LP_ILK, 0); | 4411 | I915_WRITE(WM2_LP_ILK, 0); |
3716 | I915_WRITE(WM1_LP_ILK, 0); | 4412 | I915_WRITE(WM1_LP_ILK, 0); |
3717 | 4413 | ||
3718 | if (enabled != 1) | 4414 | if (!single_plane_enabled(enabled)) |
3719 | return; | 4415 | return; |
3720 | 4416 | enabled = ffs(enabled) - 1; | |
3721 | clock = planea_clock ? planea_clock : planeb_clock; | ||
3722 | 4417 | ||
3723 | /* WM1 */ | 4418 | /* WM1 */ |
3724 | if (!ironlake_compute_srwm(dev, 1, hdisplay, htotal, pixel_size, | 4419 | if (!ironlake_compute_srwm(dev, 1, enabled, |
3725 | clock, SNB_READ_WM1_LATENCY() * 500, | 4420 | SNB_READ_WM1_LATENCY() * 500, |
3726 | &sandybridge_display_srwm_info, | 4421 | &sandybridge_display_srwm_info, |
3727 | &sandybridge_cursor_srwm_info, | 4422 | &sandybridge_cursor_srwm_info, |
3728 | &fbc_wm, &plane_wm, &cursor_wm)) | 4423 | &fbc_wm, &plane_wm, &cursor_wm)) |
@@ -3736,9 +4431,8 @@ static void sandybridge_update_wm(struct drm_device *dev, | |||
3736 | cursor_wm); | 4431 | cursor_wm); |
3737 | 4432 | ||
3738 | /* WM2 */ | 4433 | /* WM2 */ |
3739 | if (!ironlake_compute_srwm(dev, 2, | 4434 | if (!ironlake_compute_srwm(dev, 2, enabled, |
3740 | hdisplay, htotal, pixel_size, | 4435 | SNB_READ_WM2_LATENCY() * 500, |
3741 | clock, SNB_READ_WM2_LATENCY() * 500, | ||
3742 | &sandybridge_display_srwm_info, | 4436 | &sandybridge_display_srwm_info, |
3743 | &sandybridge_cursor_srwm_info, | 4437 | &sandybridge_cursor_srwm_info, |
3744 | &fbc_wm, &plane_wm, &cursor_wm)) | 4438 | &fbc_wm, &plane_wm, &cursor_wm)) |
@@ -3752,9 +4446,8 @@ static void sandybridge_update_wm(struct drm_device *dev, | |||
3752 | cursor_wm); | 4446 | cursor_wm); |
3753 | 4447 | ||
3754 | /* WM3 */ | 4448 | /* WM3 */ |
3755 | if (!ironlake_compute_srwm(dev, 3, | 4449 | if (!ironlake_compute_srwm(dev, 3, enabled, |
3756 | hdisplay, htotal, pixel_size, | 4450 | SNB_READ_WM3_LATENCY() * 500, |
3757 | clock, SNB_READ_WM3_LATENCY() * 500, | ||
3758 | &sandybridge_display_srwm_info, | 4451 | &sandybridge_display_srwm_info, |
3759 | &sandybridge_cursor_srwm_info, | 4452 | &sandybridge_cursor_srwm_info, |
3760 | &fbc_wm, &plane_wm, &cursor_wm)) | 4453 | &fbc_wm, &plane_wm, &cursor_wm)) |
@@ -3803,49 +4496,89 @@ static void sandybridge_update_wm(struct drm_device *dev, | |||
3803 | static void intel_update_watermarks(struct drm_device *dev) | 4496 | static void intel_update_watermarks(struct drm_device *dev) |
3804 | { | 4497 | { |
3805 | struct drm_i915_private *dev_priv = dev->dev_private; | 4498 | struct drm_i915_private *dev_priv = dev->dev_private; |
4499 | |||
4500 | if (dev_priv->display.update_wm) | ||
4501 | dev_priv->display.update_wm(dev); | ||
4502 | } | ||
4503 | |||
4504 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | ||
4505 | { | ||
4506 | return dev_priv->lvds_use_ssc && i915_panel_use_ssc; | ||
4507 | } | ||
4508 | |||
4509 | static void intel_update_dref(struct drm_i915_private *dev_priv) | ||
4510 | { | ||
4511 | struct drm_device *dev = dev_priv->dev; | ||
4512 | struct drm_mode_config *mode_config = &dev->mode_config; | ||
4513 | struct intel_encoder *encoder; | ||
3806 | struct drm_crtc *crtc; | 4514 | struct drm_crtc *crtc; |
3807 | int sr_hdisplay = 0; | 4515 | u32 temp; |
3808 | unsigned long planea_clock = 0, planeb_clock = 0, sr_clock = 0; | 4516 | bool lvds_on = false, edp_on = false, pch_edp_on = false, other_on = false; |
3809 | int enabled = 0, pixel_size = 0; | ||
3810 | int sr_htotal = 0; | ||
3811 | 4517 | ||
3812 | if (!dev_priv->display.update_wm) | 4518 | list_for_each_entry(encoder, &mode_config->encoder_list, base.head) { |
3813 | return; | 4519 | crtc = encoder->base.crtc; |
3814 | 4520 | ||
3815 | /* Get the clock config from both planes */ | 4521 | if (!crtc || !crtc->enabled) |
3816 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 4522 | continue; |
3817 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 4523 | |
3818 | if (intel_crtc->active) { | 4524 | switch (encoder->type) { |
3819 | enabled++; | 4525 | case INTEL_OUTPUT_LVDS: |
3820 | if (intel_crtc->plane == 0) { | 4526 | lvds_on = true; |
3821 | DRM_DEBUG_KMS("plane A (pipe %d) clock: %d\n", | 4527 | break; |
3822 | intel_crtc->pipe, crtc->mode.clock); | 4528 | case INTEL_OUTPUT_EDP: |
3823 | planea_clock = crtc->mode.clock; | 4529 | edp_on = true; |
4530 | if (!pch_edp_on) | ||
4531 | pch_edp_on = intel_encoder_is_pch_edp(&encoder->base); | ||
4532 | break; | ||
4533 | default: | ||
4534 | other_on = true; | ||
4535 | break; | ||
4536 | } | ||
4537 | } | ||
4538 | |||
4539 | /*XXX BIOS treats 16:31 as a mask for 0:15 */ | ||
4540 | |||
4541 | temp = I915_READ(PCH_DREF_CONTROL); | ||
4542 | |||
4543 | /* First clear the current state for output switching */ | ||
4544 | temp &= ~DREF_SSC1_ENABLE; | ||
4545 | temp &= ~DREF_SSC4_ENABLE; | ||
4546 | temp &= ~DREF_SUPERSPREAD_SOURCE_MASK; | ||
4547 | temp &= ~DREF_NONSPREAD_SOURCE_MASK; | ||
4548 | temp &= ~DREF_SSC_SOURCE_MASK; | ||
4549 | temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; | ||
4550 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
4551 | |||
4552 | POSTING_READ(PCH_DREF_CONTROL); | ||
4553 | udelay(200); | ||
4554 | |||
4555 | if ((lvds_on || edp_on) && intel_panel_use_ssc(dev_priv)) { | ||
4556 | temp |= DREF_SSC_SOURCE_ENABLE; | ||
4557 | if (edp_on) { | ||
4558 | if (!pch_edp_on) { | ||
4559 | /* Enable CPU source on CPU attached eDP */ | ||
4560 | temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD; | ||
3824 | } else { | 4561 | } else { |
3825 | DRM_DEBUG_KMS("plane B (pipe %d) clock: %d\n", | 4562 | /* Enable SSC on PCH eDP if needed */ |
3826 | intel_crtc->pipe, crtc->mode.clock); | 4563 | temp |= DREF_SUPERSPREAD_SOURCE_ENABLE; |
3827 | planeb_clock = crtc->mode.clock; | ||
3828 | } | 4564 | } |
3829 | sr_hdisplay = crtc->mode.hdisplay; | 4565 | I915_WRITE(PCH_DREF_CONTROL, temp); |
3830 | sr_clock = crtc->mode.clock; | ||
3831 | sr_htotal = crtc->mode.htotal; | ||
3832 | if (crtc->fb) | ||
3833 | pixel_size = crtc->fb->bits_per_pixel / 8; | ||
3834 | else | ||
3835 | pixel_size = 4; /* by default */ | ||
3836 | } | 4566 | } |
4567 | if (!dev_priv->display_clock_mode) | ||
4568 | temp |= DREF_SSC1_ENABLE; | ||
3837 | } | 4569 | } |
3838 | 4570 | ||
3839 | if (enabled <= 0) | 4571 | if (other_on && dev_priv->display_clock_mode) |
3840 | return; | 4572 | temp |= DREF_NONSPREAD_CK505_ENABLE; |
3841 | 4573 | else if (other_on) { | |
3842 | dev_priv->display.update_wm(dev, planea_clock, planeb_clock, | 4574 | temp |= DREF_NONSPREAD_SOURCE_ENABLE; |
3843 | sr_hdisplay, sr_htotal, pixel_size); | 4575 | if (edp_on && !pch_edp_on) |
3844 | } | 4576 | temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD; |
4577 | } | ||
3845 | 4578 | ||
3846 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | 4579 | I915_WRITE(PCH_DREF_CONTROL, temp); |
3847 | { | 4580 | POSTING_READ(PCH_DREF_CONTROL); |
3848 | return dev_priv->lvds_use_ssc && i915_panel_use_ssc; | 4581 | udelay(200); |
3849 | } | 4582 | } |
3850 | 4583 | ||
3851 | static int intel_crtc_mode_set(struct drm_crtc *crtc, | 4584 | static int intel_crtc_mode_set(struct drm_crtc *crtc, |
@@ -3872,6 +4605,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
3872 | int ret; | 4605 | int ret; |
3873 | struct fdi_m_n m_n = {0}; | 4606 | struct fdi_m_n m_n = {0}; |
3874 | u32 reg, temp; | 4607 | u32 reg, temp; |
4608 | u32 lvds_sync = 0; | ||
3875 | int target_clock; | 4609 | int target_clock; |
3876 | 4610 | ||
3877 | drm_vblank_pre_modeset(dev, pipe); | 4611 | drm_vblank_pre_modeset(dev, pipe); |
@@ -4072,46 +4806,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4072 | * PCH B stepping, previous chipset stepping should be | 4806 | * PCH B stepping, previous chipset stepping should be |
4073 | * ignoring this setting. | 4807 | * ignoring this setting. |
4074 | */ | 4808 | */ |
4075 | if (HAS_PCH_SPLIT(dev)) { | 4809 | if (HAS_PCH_SPLIT(dev)) |
4076 | temp = I915_READ(PCH_DREF_CONTROL); | 4810 | intel_update_dref(dev_priv); |
4077 | /* Always enable nonspread source */ | ||
4078 | temp &= ~DREF_NONSPREAD_SOURCE_MASK; | ||
4079 | temp |= DREF_NONSPREAD_SOURCE_ENABLE; | ||
4080 | temp &= ~DREF_SSC_SOURCE_MASK; | ||
4081 | temp |= DREF_SSC_SOURCE_ENABLE; | ||
4082 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
4083 | |||
4084 | POSTING_READ(PCH_DREF_CONTROL); | ||
4085 | udelay(200); | ||
4086 | |||
4087 | if (has_edp_encoder) { | ||
4088 | if (intel_panel_use_ssc(dev_priv)) { | ||
4089 | temp |= DREF_SSC1_ENABLE; | ||
4090 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
4091 | |||
4092 | POSTING_READ(PCH_DREF_CONTROL); | ||
4093 | udelay(200); | ||
4094 | } | ||
4095 | temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; | ||
4096 | |||
4097 | /* Enable CPU source on CPU attached eDP */ | ||
4098 | if (!intel_encoder_is_pch_edp(&has_edp_encoder->base)) { | ||
4099 | if (intel_panel_use_ssc(dev_priv)) | ||
4100 | temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD; | ||
4101 | else | ||
4102 | temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD; | ||
4103 | } else { | ||
4104 | /* Enable SSC on PCH eDP if needed */ | ||
4105 | if (intel_panel_use_ssc(dev_priv)) { | ||
4106 | DRM_ERROR("enabling SSC on PCH\n"); | ||
4107 | temp |= DREF_SUPERSPREAD_SOURCE_ENABLE; | ||
4108 | } | ||
4109 | } | ||
4110 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
4111 | POSTING_READ(PCH_DREF_CONTROL); | ||
4112 | udelay(200); | ||
4113 | } | ||
4114 | } | ||
4115 | 4811 | ||
4116 | if (IS_PINEVIEW(dev)) { | 4812 | if (IS_PINEVIEW(dev)) { |
4117 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; | 4813 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; |
@@ -4243,9 +4939,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4243 | pipeconf &= ~PIPECONF_DOUBLE_WIDE; | 4939 | pipeconf &= ~PIPECONF_DOUBLE_WIDE; |
4244 | } | 4940 | } |
4245 | 4941 | ||
4246 | dspcntr |= DISPLAY_PLANE_ENABLE; | 4942 | if (!HAS_PCH_SPLIT(dev)) |
4247 | pipeconf |= PIPECONF_ENABLE; | 4943 | dpll |= DPLL_VCO_ENABLE; |
4248 | dpll |= DPLL_VCO_ENABLE; | ||
4249 | 4944 | ||
4250 | DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); | 4945 | DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); |
4251 | drm_mode_debug_printmodeline(mode); | 4946 | drm_mode_debug_printmodeline(mode); |
@@ -4271,10 +4966,20 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4271 | /* enable transcoder DPLL */ | 4966 | /* enable transcoder DPLL */ |
4272 | if (HAS_PCH_CPT(dev)) { | 4967 | if (HAS_PCH_CPT(dev)) { |
4273 | temp = I915_READ(PCH_DPLL_SEL); | 4968 | temp = I915_READ(PCH_DPLL_SEL); |
4274 | if (pipe == 0) | 4969 | switch (pipe) { |
4970 | case 0: | ||
4275 | temp |= TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL; | 4971 | temp |= TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL; |
4276 | else | 4972 | break; |
4973 | case 1: | ||
4277 | temp |= TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL; | 4974 | temp |= TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL; |
4975 | break; | ||
4976 | case 2: | ||
4977 | /* FIXME: manage transcoder PLLs? */ | ||
4978 | temp |= TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL; | ||
4979 | break; | ||
4980 | default: | ||
4981 | BUG(); | ||
4982 | } | ||
4278 | I915_WRITE(PCH_DPLL_SEL, temp); | 4983 | I915_WRITE(PCH_DPLL_SEL, temp); |
4279 | 4984 | ||
4280 | POSTING_READ(PCH_DPLL_SEL); | 4985 | POSTING_READ(PCH_DPLL_SEL); |
@@ -4324,6 +5029,22 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4324 | else | 5029 | else |
4325 | temp &= ~LVDS_ENABLE_DITHER; | 5030 | temp &= ~LVDS_ENABLE_DITHER; |
4326 | } | 5031 | } |
5032 | if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) | ||
5033 | lvds_sync |= LVDS_HSYNC_POLARITY; | ||
5034 | if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) | ||
5035 | lvds_sync |= LVDS_VSYNC_POLARITY; | ||
5036 | if ((temp & (LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY)) | ||
5037 | != lvds_sync) { | ||
5038 | char flags[2] = "-+"; | ||
5039 | DRM_INFO("Changing LVDS panel from " | ||
5040 | "(%chsync, %cvsync) to (%chsync, %cvsync)\n", | ||
5041 | flags[!(temp & LVDS_HSYNC_POLARITY)], | ||
5042 | flags[!(temp & LVDS_VSYNC_POLARITY)], | ||
5043 | flags[!(lvds_sync & LVDS_HSYNC_POLARITY)], | ||
5044 | flags[!(lvds_sync & LVDS_VSYNC_POLARITY)]); | ||
5045 | temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY); | ||
5046 | temp |= lvds_sync; | ||
5047 | } | ||
4327 | I915_WRITE(reg, temp); | 5048 | I915_WRITE(reg, temp); |
4328 | } | 5049 | } |
4329 | 5050 | ||
@@ -4341,17 +5062,10 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4341 | intel_dp_set_m_n(crtc, mode, adjusted_mode); | 5062 | intel_dp_set_m_n(crtc, mode, adjusted_mode); |
4342 | } else if (HAS_PCH_SPLIT(dev)) { | 5063 | } else if (HAS_PCH_SPLIT(dev)) { |
4343 | /* For non-DP output, clear any trans DP clock recovery setting.*/ | 5064 | /* For non-DP output, clear any trans DP clock recovery setting.*/ |
4344 | if (pipe == 0) { | 5065 | I915_WRITE(TRANSDATA_M1(pipe), 0); |
4345 | I915_WRITE(TRANSA_DATA_M1, 0); | 5066 | I915_WRITE(TRANSDATA_N1(pipe), 0); |
4346 | I915_WRITE(TRANSA_DATA_N1, 0); | 5067 | I915_WRITE(TRANSDPLINK_M1(pipe), 0); |
4347 | I915_WRITE(TRANSA_DP_LINK_M1, 0); | 5068 | I915_WRITE(TRANSDPLINK_N1(pipe), 0); |
4348 | I915_WRITE(TRANSA_DP_LINK_N1, 0); | ||
4349 | } else { | ||
4350 | I915_WRITE(TRANSB_DATA_M1, 0); | ||
4351 | I915_WRITE(TRANSB_DATA_N1, 0); | ||
4352 | I915_WRITE(TRANSB_DP_LINK_M1, 0); | ||
4353 | I915_WRITE(TRANSB_DP_LINK_N1, 0); | ||
4354 | } | ||
4355 | } | 5069 | } |
4356 | 5070 | ||
4357 | if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) { | 5071 | if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) { |
@@ -4454,6 +5168,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4454 | 5168 | ||
4455 | I915_WRITE(PIPECONF(pipe), pipeconf); | 5169 | I915_WRITE(PIPECONF(pipe), pipeconf); |
4456 | POSTING_READ(PIPECONF(pipe)); | 5170 | POSTING_READ(PIPECONF(pipe)); |
5171 | if (!HAS_PCH_SPLIT(dev)) | ||
5172 | intel_enable_pipe(dev_priv, pipe, false); | ||
4457 | 5173 | ||
4458 | intel_wait_for_vblank(dev, pipe); | 5174 | intel_wait_for_vblank(dev, pipe); |
4459 | 5175 | ||
@@ -4464,6 +5180,9 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
4464 | } | 5180 | } |
4465 | 5181 | ||
4466 | I915_WRITE(DSPCNTR(plane), dspcntr); | 5182 | I915_WRITE(DSPCNTR(plane), dspcntr); |
5183 | POSTING_READ(DSPCNTR(plane)); | ||
5184 | if (!HAS_PCH_SPLIT(dev)) | ||
5185 | intel_enable_plane(dev_priv, plane, pipe); | ||
4467 | 5186 | ||
4468 | ret = intel_pipe_set_base(crtc, x, y, old_fb); | 5187 | ret = intel_pipe_set_base(crtc, x, y, old_fb); |
4469 | 5188 | ||
@@ -4480,7 +5199,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc) | |||
4480 | struct drm_device *dev = crtc->dev; | 5199 | struct drm_device *dev = crtc->dev; |
4481 | struct drm_i915_private *dev_priv = dev->dev_private; | 5200 | struct drm_i915_private *dev_priv = dev->dev_private; |
4482 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5201 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
4483 | int palreg = (intel_crtc->pipe == 0) ? PALETTE_A : PALETTE_B; | 5202 | int palreg = PALETTE(intel_crtc->pipe); |
4484 | int i; | 5203 | int i; |
4485 | 5204 | ||
4486 | /* The clocks have to be on to load the palette. */ | 5205 | /* The clocks have to be on to load the palette. */ |
@@ -4489,8 +5208,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc) | |||
4489 | 5208 | ||
4490 | /* use legacy palette for Ironlake */ | 5209 | /* use legacy palette for Ironlake */ |
4491 | if (HAS_PCH_SPLIT(dev)) | 5210 | if (HAS_PCH_SPLIT(dev)) |
4492 | palreg = (intel_crtc->pipe == 0) ? LGC_PALETTE_A : | 5211 | palreg = LGC_PALETTE(intel_crtc->pipe); |
4493 | LGC_PALETTE_B; | ||
4494 | 5212 | ||
4495 | for (i = 0; i < 256; i++) { | 5213 | for (i = 0; i < 256; i++) { |
4496 | I915_WRITE(palreg + 4 * i, | 5214 | I915_WRITE(palreg + 4 * i, |
@@ -4511,12 +5229,12 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base) | |||
4511 | if (intel_crtc->cursor_visible == visible) | 5229 | if (intel_crtc->cursor_visible == visible) |
4512 | return; | 5230 | return; |
4513 | 5231 | ||
4514 | cntl = I915_READ(CURACNTR); | 5232 | cntl = I915_READ(_CURACNTR); |
4515 | if (visible) { | 5233 | if (visible) { |
4516 | /* On these chipsets we can only modify the base whilst | 5234 | /* On these chipsets we can only modify the base whilst |
4517 | * the cursor is disabled. | 5235 | * the cursor is disabled. |
4518 | */ | 5236 | */ |
4519 | I915_WRITE(CURABASE, base); | 5237 | I915_WRITE(_CURABASE, base); |
4520 | 5238 | ||
4521 | cntl &= ~(CURSOR_FORMAT_MASK); | 5239 | cntl &= ~(CURSOR_FORMAT_MASK); |
4522 | /* XXX width must be 64, stride 256 => 0x00 << 28 */ | 5240 | /* XXX width must be 64, stride 256 => 0x00 << 28 */ |
@@ -4525,7 +5243,7 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base) | |||
4525 | CURSOR_FORMAT_ARGB; | 5243 | CURSOR_FORMAT_ARGB; |
4526 | } else | 5244 | } else |
4527 | cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE); | 5245 | cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE); |
4528 | I915_WRITE(CURACNTR, cntl); | 5246 | I915_WRITE(_CURACNTR, cntl); |
4529 | 5247 | ||
4530 | intel_crtc->cursor_visible = visible; | 5248 | intel_crtc->cursor_visible = visible; |
4531 | } | 5249 | } |
@@ -4539,7 +5257,7 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base) | |||
4539 | bool visible = base != 0; | 5257 | bool visible = base != 0; |
4540 | 5258 | ||
4541 | if (intel_crtc->cursor_visible != visible) { | 5259 | if (intel_crtc->cursor_visible != visible) { |
4542 | uint32_t cntl = I915_READ(pipe == 0 ? CURACNTR : CURBCNTR); | 5260 | uint32_t cntl = CURCNTR(pipe); |
4543 | if (base) { | 5261 | if (base) { |
4544 | cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT); | 5262 | cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT); |
4545 | cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; | 5263 | cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; |
@@ -4548,12 +5266,12 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base) | |||
4548 | cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE); | 5266 | cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE); |
4549 | cntl |= CURSOR_MODE_DISABLE; | 5267 | cntl |= CURSOR_MODE_DISABLE; |
4550 | } | 5268 | } |
4551 | I915_WRITE(pipe == 0 ? CURACNTR : CURBCNTR, cntl); | 5269 | I915_WRITE(CURCNTR(pipe), cntl); |
4552 | 5270 | ||
4553 | intel_crtc->cursor_visible = visible; | 5271 | intel_crtc->cursor_visible = visible; |
4554 | } | 5272 | } |
4555 | /* and commit changes on next vblank */ | 5273 | /* and commit changes on next vblank */ |
4556 | I915_WRITE(pipe == 0 ? CURABASE : CURBBASE, base); | 5274 | I915_WRITE(CURBASE(pipe), base); |
4557 | } | 5275 | } |
4558 | 5276 | ||
4559 | /* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */ | 5277 | /* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */ |
@@ -4603,7 +5321,7 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc, | |||
4603 | if (!visible && !intel_crtc->cursor_visible) | 5321 | if (!visible && !intel_crtc->cursor_visible) |
4604 | return; | 5322 | return; |
4605 | 5323 | ||
4606 | I915_WRITE(pipe == 0 ? CURAPOS : CURBPOS, pos); | 5324 | I915_WRITE(CURPOS(pipe), pos); |
4607 | if (IS_845G(dev) || IS_I865G(dev)) | 5325 | if (IS_845G(dev) || IS_I865G(dev)) |
4608 | i845_update_cursor(crtc, base); | 5326 | i845_update_cursor(crtc, base); |
4609 | else | 5327 | else |
@@ -4909,14 +5627,14 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc) | |||
4909 | struct drm_i915_private *dev_priv = dev->dev_private; | 5627 | struct drm_i915_private *dev_priv = dev->dev_private; |
4910 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5628 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
4911 | int pipe = intel_crtc->pipe; | 5629 | int pipe = intel_crtc->pipe; |
4912 | u32 dpll = I915_READ((pipe == 0) ? DPLL_A : DPLL_B); | 5630 | u32 dpll = DPLL(pipe); |
4913 | u32 fp; | 5631 | u32 fp; |
4914 | intel_clock_t clock; | 5632 | intel_clock_t clock; |
4915 | 5633 | ||
4916 | if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) | 5634 | if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) |
4917 | fp = I915_READ((pipe == 0) ? FPA0 : FPB0); | 5635 | fp = FP0(pipe); |
4918 | else | 5636 | else |
4919 | fp = I915_READ((pipe == 0) ? FPA1 : FPB1); | 5637 | fp = FP1(pipe); |
4920 | 5638 | ||
4921 | clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; | 5639 | clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; |
4922 | if (IS_PINEVIEW(dev)) { | 5640 | if (IS_PINEVIEW(dev)) { |
@@ -4994,14 +5712,13 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc) | |||
4994 | struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, | 5712 | struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, |
4995 | struct drm_crtc *crtc) | 5713 | struct drm_crtc *crtc) |
4996 | { | 5714 | { |
4997 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4998 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5715 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
4999 | int pipe = intel_crtc->pipe; | 5716 | int pipe = intel_crtc->pipe; |
5000 | struct drm_display_mode *mode; | 5717 | struct drm_display_mode *mode; |
5001 | int htot = I915_READ((pipe == 0) ? HTOTAL_A : HTOTAL_B); | 5718 | int htot = HTOTAL(pipe); |
5002 | int hsync = I915_READ((pipe == 0) ? HSYNC_A : HSYNC_B); | 5719 | int hsync = HSYNC(pipe); |
5003 | int vtot = I915_READ((pipe == 0) ? VTOTAL_A : VTOTAL_B); | 5720 | int vtot = VTOTAL(pipe); |
5004 | int vsync = I915_READ((pipe == 0) ? VSYNC_A : VSYNC_B); | 5721 | int vsync = VSYNC(pipe); |
5005 | 5722 | ||
5006 | mode = kzalloc(sizeof(*mode), GFP_KERNEL); | 5723 | mode = kzalloc(sizeof(*mode), GFP_KERNEL); |
5007 | if (!mode) | 5724 | if (!mode) |
@@ -5110,7 +5827,7 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
5110 | drm_i915_private_t *dev_priv = dev->dev_private; | 5827 | drm_i915_private_t *dev_priv = dev->dev_private; |
5111 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5828 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
5112 | int pipe = intel_crtc->pipe; | 5829 | int pipe = intel_crtc->pipe; |
5113 | int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; | 5830 | int dpll_reg = DPLL(pipe); |
5114 | int dpll = I915_READ(dpll_reg); | 5831 | int dpll = I915_READ(dpll_reg); |
5115 | 5832 | ||
5116 | if (HAS_PCH_SPLIT(dev)) | 5833 | if (HAS_PCH_SPLIT(dev)) |
@@ -5158,7 +5875,6 @@ static void intel_idle_update(struct work_struct *work) | |||
5158 | struct drm_device *dev = dev_priv->dev; | 5875 | struct drm_device *dev = dev_priv->dev; |
5159 | struct drm_crtc *crtc; | 5876 | struct drm_crtc *crtc; |
5160 | struct intel_crtc *intel_crtc; | 5877 | struct intel_crtc *intel_crtc; |
5161 | int enabled = 0; | ||
5162 | 5878 | ||
5163 | if (!i915_powersave) | 5879 | if (!i915_powersave) |
5164 | return; | 5880 | return; |
@@ -5172,16 +5888,11 @@ static void intel_idle_update(struct work_struct *work) | |||
5172 | if (!crtc->fb) | 5888 | if (!crtc->fb) |
5173 | continue; | 5889 | continue; |
5174 | 5890 | ||
5175 | enabled++; | ||
5176 | intel_crtc = to_intel_crtc(crtc); | 5891 | intel_crtc = to_intel_crtc(crtc); |
5177 | if (!intel_crtc->busy) | 5892 | if (!intel_crtc->busy) |
5178 | intel_decrease_pllclock(crtc); | 5893 | intel_decrease_pllclock(crtc); |
5179 | } | 5894 | } |
5180 | 5895 | ||
5181 | if ((enabled == 1) && (IS_I945G(dev) || IS_I945GM(dev))) { | ||
5182 | DRM_DEBUG_DRIVER("enable memory self refresh on 945\n"); | ||
5183 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN); | ||
5184 | } | ||
5185 | 5896 | ||
5186 | mutex_unlock(&dev->struct_mutex); | 5897 | mutex_unlock(&dev->struct_mutex); |
5187 | } | 5898 | } |
@@ -5206,17 +5917,9 @@ void intel_mark_busy(struct drm_device *dev, struct drm_i915_gem_object *obj) | |||
5206 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 5917 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
5207 | return; | 5918 | return; |
5208 | 5919 | ||
5209 | if (!dev_priv->busy) { | 5920 | if (!dev_priv->busy) |
5210 | if (IS_I945G(dev) || IS_I945GM(dev)) { | ||
5211 | u32 fw_blc_self; | ||
5212 | |||
5213 | DRM_DEBUG_DRIVER("disable memory self refresh on 945\n"); | ||
5214 | fw_blc_self = I915_READ(FW_BLC_SELF); | ||
5215 | fw_blc_self &= ~FW_BLC_SELF_EN; | ||
5216 | I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK); | ||
5217 | } | ||
5218 | dev_priv->busy = true; | 5921 | dev_priv->busy = true; |
5219 | } else | 5922 | else |
5220 | mod_timer(&dev_priv->idle_timer, jiffies + | 5923 | mod_timer(&dev_priv->idle_timer, jiffies + |
5221 | msecs_to_jiffies(GPU_IDLE_TIMEOUT)); | 5924 | msecs_to_jiffies(GPU_IDLE_TIMEOUT)); |
5222 | 5925 | ||
@@ -5228,14 +5931,6 @@ void intel_mark_busy(struct drm_device *dev, struct drm_i915_gem_object *obj) | |||
5228 | intel_fb = to_intel_framebuffer(crtc->fb); | 5931 | intel_fb = to_intel_framebuffer(crtc->fb); |
5229 | if (intel_fb->obj == obj) { | 5932 | if (intel_fb->obj == obj) { |
5230 | if (!intel_crtc->busy) { | 5933 | if (!intel_crtc->busy) { |
5231 | if (IS_I945G(dev) || IS_I945GM(dev)) { | ||
5232 | u32 fw_blc_self; | ||
5233 | |||
5234 | DRM_DEBUG_DRIVER("disable memory self refresh on 945\n"); | ||
5235 | fw_blc_self = I915_READ(FW_BLC_SELF); | ||
5236 | fw_blc_self &= ~FW_BLC_SELF_EN; | ||
5237 | I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK); | ||
5238 | } | ||
5239 | /* Non-busy -> busy, upclock */ | 5934 | /* Non-busy -> busy, upclock */ |
5240 | intel_increase_pllclock(crtc); | 5935 | intel_increase_pllclock(crtc); |
5241 | intel_crtc->busy = true; | 5936 | intel_crtc->busy = true; |
@@ -5513,7 +6208,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
5513 | * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE; | 6208 | * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE; |
5514 | */ | 6209 | */ |
5515 | pf = 0; | 6210 | pf = 0; |
5516 | pipesrc = I915_READ(pipe == 0 ? PIPEASRC : PIPEBSRC) & 0x0fff0fff; | 6211 | pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff; |
5517 | OUT_RING(pf | pipesrc); | 6212 | OUT_RING(pf | pipesrc); |
5518 | break; | 6213 | break; |
5519 | 6214 | ||
@@ -5523,8 +6218,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
5523 | OUT_RING(fb->pitch | obj->tiling_mode); | 6218 | OUT_RING(fb->pitch | obj->tiling_mode); |
5524 | OUT_RING(obj->gtt_offset); | 6219 | OUT_RING(obj->gtt_offset); |
5525 | 6220 | ||
5526 | pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE; | 6221 | pf = I915_READ(PF_CTL(pipe)) & PF_ENABLE; |
5527 | pipesrc = I915_READ(pipe == 0 ? PIPEASRC : PIPEBSRC) & 0x0fff0fff; | 6222 | pipesrc = I915_READ(PIPESRC(pipe)) & 0x0fff0fff; |
5528 | OUT_RING(pf | pipesrc); | 6223 | OUT_RING(pf | pipesrc); |
5529 | break; | 6224 | break; |
5530 | } | 6225 | } |
@@ -5613,22 +6308,8 @@ static void intel_sanitize_modesetting(struct drm_device *dev, | |||
5613 | pipe = !pipe; | 6308 | pipe = !pipe; |
5614 | 6309 | ||
5615 | /* Disable the plane and wait for it to stop reading from the pipe. */ | 6310 | /* Disable the plane and wait for it to stop reading from the pipe. */ |
5616 | I915_WRITE(reg, val & ~DISPLAY_PLANE_ENABLE); | 6311 | intel_disable_plane(dev_priv, plane, pipe); |
5617 | intel_flush_display_plane(dev, plane); | 6312 | intel_disable_pipe(dev_priv, pipe); |
5618 | |||
5619 | if (IS_GEN2(dev)) | ||
5620 | intel_wait_for_vblank(dev, pipe); | ||
5621 | |||
5622 | if (pipe == 0 && (dev_priv->quirks & QUIRK_PIPEA_FORCE)) | ||
5623 | return; | ||
5624 | |||
5625 | /* Switch off the pipe. */ | ||
5626 | reg = PIPECONF(pipe); | ||
5627 | val = I915_READ(reg); | ||
5628 | if (val & PIPECONF_ENABLE) { | ||
5629 | I915_WRITE(reg, val & ~PIPECONF_ENABLE); | ||
5630 | intel_wait_for_pipe_off(dev, pipe); | ||
5631 | } | ||
5632 | } | 6313 | } |
5633 | 6314 | ||
5634 | static void intel_crtc_init(struct drm_device *dev, int pipe) | 6315 | static void intel_crtc_init(struct drm_device *dev, int pipe) |
@@ -6240,18 +6921,18 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
6240 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, | 6921 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, |
6241 | 18 << 24 | | 6922 | 18 << 24 | |
6242 | 6 << 16); | 6923 | 6 << 16); |
6243 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 90000); | 6924 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000); |
6244 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 100000); | 6925 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000); |
6245 | I915_WRITE(GEN6_RP_UP_EI, 100000); | 6926 | I915_WRITE(GEN6_RP_UP_EI, 100000); |
6246 | I915_WRITE(GEN6_RP_DOWN_EI, 300000); | 6927 | I915_WRITE(GEN6_RP_DOWN_EI, 5000000); |
6247 | I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); | 6928 | I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); |
6248 | I915_WRITE(GEN6_RP_CONTROL, | 6929 | I915_WRITE(GEN6_RP_CONTROL, |
6249 | GEN6_RP_MEDIA_TURBO | | 6930 | GEN6_RP_MEDIA_TURBO | |
6250 | GEN6_RP_USE_NORMAL_FREQ | | 6931 | GEN6_RP_USE_NORMAL_FREQ | |
6251 | GEN6_RP_MEDIA_IS_GFX | | 6932 | GEN6_RP_MEDIA_IS_GFX | |
6252 | GEN6_RP_ENABLE | | 6933 | GEN6_RP_ENABLE | |
6253 | GEN6_RP_UP_BUSY_MAX | | 6934 | GEN6_RP_UP_BUSY_AVG | |
6254 | GEN6_RP_DOWN_BUSY_MIN); | 6935 | GEN6_RP_DOWN_IDLE_CONT); |
6255 | 6936 | ||
6256 | if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, | 6937 | if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0, |
6257 | 500)) | 6938 | 500)) |
@@ -6307,6 +6988,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
6307 | void intel_enable_clock_gating(struct drm_device *dev) | 6988 | void intel_enable_clock_gating(struct drm_device *dev) |
6308 | { | 6989 | { |
6309 | struct drm_i915_private *dev_priv = dev->dev_private; | 6990 | struct drm_i915_private *dev_priv = dev->dev_private; |
6991 | int pipe; | ||
6310 | 6992 | ||
6311 | /* | 6993 | /* |
6312 | * Disable clock gating reported to work incorrectly according to the | 6994 | * Disable clock gating reported to work incorrectly according to the |
@@ -6416,12 +7098,10 @@ void intel_enable_clock_gating(struct drm_device *dev) | |||
6416 | ILK_DPARB_CLK_GATE | | 7098 | ILK_DPARB_CLK_GATE | |
6417 | ILK_DPFD_CLK_GATE); | 7099 | ILK_DPFD_CLK_GATE); |
6418 | 7100 | ||
6419 | I915_WRITE(DSPACNTR, | 7101 | for_each_pipe(pipe) |
6420 | I915_READ(DSPACNTR) | | 7102 | I915_WRITE(DSPCNTR(pipe), |
6421 | DISPPLANE_TRICKLE_FEED_DISABLE); | 7103 | I915_READ(DSPCNTR(pipe)) | |
6422 | I915_WRITE(DSPBCNTR, | 7104 | DISPPLANE_TRICKLE_FEED_DISABLE); |
6423 | I915_READ(DSPBCNTR) | | ||
6424 | DISPPLANE_TRICKLE_FEED_DISABLE); | ||
6425 | } | 7105 | } |
6426 | } else if (IS_G4X(dev)) { | 7106 | } else if (IS_G4X(dev)) { |
6427 | uint32_t dspclk_gate; | 7107 | uint32_t dspclk_gate; |
@@ -6776,10 +7456,6 @@ void intel_modeset_init(struct drm_device *dev) | |||
6776 | } | 7456 | } |
6777 | dev->mode_config.fb_base = dev->agp->base; | 7457 | dev->mode_config.fb_base = dev->agp->base; |
6778 | 7458 | ||
6779 | if (IS_MOBILE(dev) || !IS_GEN2(dev)) | ||
6780 | dev_priv->num_pipe = 2; | ||
6781 | else | ||
6782 | dev_priv->num_pipe = 1; | ||
6783 | DRM_DEBUG_KMS("%d display pipe%s available.\n", | 7459 | DRM_DEBUG_KMS("%d display pipe%s available.\n", |
6784 | dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : ""); | 7460 | dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : ""); |
6785 | 7461 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 51cb4e36997f..7ffb324b6a7d 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -685,6 +685,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
685 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 685 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
686 | int lane_count = 4, bpp = 24; | 686 | int lane_count = 4, bpp = 24; |
687 | struct intel_dp_m_n m_n; | 687 | struct intel_dp_m_n m_n; |
688 | int pipe = intel_crtc->pipe; | ||
688 | 689 | ||
689 | /* | 690 | /* |
690 | * Find the lane count in the intel_encoder private | 691 | * Find the lane count in the intel_encoder private |
@@ -715,39 +716,19 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
715 | mode->clock, adjusted_mode->clock, &m_n); | 716 | mode->clock, adjusted_mode->clock, &m_n); |
716 | 717 | ||
717 | if (HAS_PCH_SPLIT(dev)) { | 718 | if (HAS_PCH_SPLIT(dev)) { |
718 | if (intel_crtc->pipe == 0) { | 719 | I915_WRITE(TRANSDATA_M1(pipe), |
719 | I915_WRITE(TRANSA_DATA_M1, | 720 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | |
720 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | 721 | m_n.gmch_m); |
721 | m_n.gmch_m); | 722 | I915_WRITE(TRANSDATA_N1(pipe), m_n.gmch_n); |
722 | I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n); | 723 | I915_WRITE(TRANSDPLINK_M1(pipe), m_n.link_m); |
723 | I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m); | 724 | I915_WRITE(TRANSDPLINK_N1(pipe), m_n.link_n); |
724 | I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n); | ||
725 | } else { | ||
726 | I915_WRITE(TRANSB_DATA_M1, | ||
727 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | ||
728 | m_n.gmch_m); | ||
729 | I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n); | ||
730 | I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m); | ||
731 | I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n); | ||
732 | } | ||
733 | } else { | 725 | } else { |
734 | if (intel_crtc->pipe == 0) { | 726 | I915_WRITE(PIPE_GMCH_DATA_M(pipe), |
735 | I915_WRITE(PIPEA_GMCH_DATA_M, | 727 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | |
736 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | 728 | m_n.gmch_m); |
737 | m_n.gmch_m); | 729 | I915_WRITE(PIPE_GMCH_DATA_N(pipe), m_n.gmch_n); |
738 | I915_WRITE(PIPEA_GMCH_DATA_N, | 730 | I915_WRITE(PIPE_DP_LINK_M(pipe), m_n.link_m); |
739 | m_n.gmch_n); | 731 | I915_WRITE(PIPE_DP_LINK_N(pipe), m_n.link_n); |
740 | I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); | ||
741 | I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); | ||
742 | } else { | ||
743 | I915_WRITE(PIPEB_GMCH_DATA_M, | ||
744 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | ||
745 | m_n.gmch_m); | ||
746 | I915_WRITE(PIPEB_GMCH_DATA_N, | ||
747 | m_n.gmch_n); | ||
748 | I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); | ||
749 | I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); | ||
750 | } | ||
751 | } | 732 | } |
752 | } | 733 | } |
753 | 734 | ||
@@ -813,6 +794,40 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
813 | } | 794 | } |
814 | } | 795 | } |
815 | 796 | ||
797 | static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp) | ||
798 | { | ||
799 | struct drm_device *dev = intel_dp->base.base.dev; | ||
800 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
801 | u32 pp; | ||
802 | |||
803 | /* | ||
804 | * If the panel wasn't on, make sure there's not a currently | ||
805 | * active PP sequence before enabling AUX VDD. | ||
806 | */ | ||
807 | if (!(I915_READ(PCH_PP_STATUS) & PP_ON)) | ||
808 | msleep(dev_priv->panel_t3); | ||
809 | |||
810 | pp = I915_READ(PCH_PP_CONTROL); | ||
811 | pp |= EDP_FORCE_VDD; | ||
812 | I915_WRITE(PCH_PP_CONTROL, pp); | ||
813 | POSTING_READ(PCH_PP_CONTROL); | ||
814 | } | ||
815 | |||
816 | static void ironlake_edp_panel_vdd_off(struct intel_dp *intel_dp) | ||
817 | { | ||
818 | struct drm_device *dev = intel_dp->base.base.dev; | ||
819 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
820 | u32 pp; | ||
821 | |||
822 | pp = I915_READ(PCH_PP_CONTROL); | ||
823 | pp &= ~EDP_FORCE_VDD; | ||
824 | I915_WRITE(PCH_PP_CONTROL, pp); | ||
825 | POSTING_READ(PCH_PP_CONTROL); | ||
826 | |||
827 | /* Make sure sequencer is idle before allowing subsequent activity */ | ||
828 | msleep(dev_priv->panel_t12); | ||
829 | } | ||
830 | |||
816 | /* Returns true if the panel was already on when called */ | 831 | /* Returns true if the panel was already on when called */ |
817 | static bool ironlake_edp_panel_on (struct intel_dp *intel_dp) | 832 | static bool ironlake_edp_panel_on (struct intel_dp *intel_dp) |
818 | { | 833 | { |
@@ -834,11 +849,6 @@ static bool ironlake_edp_panel_on (struct intel_dp *intel_dp) | |||
834 | I915_WRITE(PCH_PP_CONTROL, pp); | 849 | I915_WRITE(PCH_PP_CONTROL, pp); |
835 | POSTING_READ(PCH_PP_CONTROL); | 850 | POSTING_READ(PCH_PP_CONTROL); |
836 | 851 | ||
837 | /* Ouch. We need to wait here for some panels, like Dell e6510 | ||
838 | * https://bugs.freedesktop.org/show_bug.cgi?id=29278i | ||
839 | */ | ||
840 | msleep(300); | ||
841 | |||
842 | if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on_mask, | 852 | if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on_mask, |
843 | 5000)) | 853 | 5000)) |
844 | DRM_ERROR("panel on wait timed out: 0x%08x\n", | 854 | DRM_ERROR("panel on wait timed out: 0x%08x\n", |
@@ -875,11 +885,6 @@ static void ironlake_edp_panel_off (struct drm_device *dev) | |||
875 | pp |= PANEL_POWER_RESET; /* restore panel reset bit */ | 885 | pp |= PANEL_POWER_RESET; /* restore panel reset bit */ |
876 | I915_WRITE(PCH_PP_CONTROL, pp); | 886 | I915_WRITE(PCH_PP_CONTROL, pp); |
877 | POSTING_READ(PCH_PP_CONTROL); | 887 | POSTING_READ(PCH_PP_CONTROL); |
878 | |||
879 | /* Ouch. We need to wait here for some panels, like Dell e6510 | ||
880 | * https://bugs.freedesktop.org/show_bug.cgi?id=29278i | ||
881 | */ | ||
882 | msleep(300); | ||
883 | } | 888 | } |
884 | 889 | ||
885 | static void ironlake_edp_backlight_on (struct drm_device *dev) | 890 | static void ironlake_edp_backlight_on (struct drm_device *dev) |
@@ -945,7 +950,7 @@ static void intel_dp_prepare(struct drm_encoder *encoder) | |||
945 | 950 | ||
946 | if (is_edp(intel_dp)) { | 951 | if (is_edp(intel_dp)) { |
947 | ironlake_edp_backlight_off(dev); | 952 | ironlake_edp_backlight_off(dev); |
948 | ironlake_edp_panel_on(intel_dp); | 953 | ironlake_edp_panel_off(dev); |
949 | if (!is_pch_edp(intel_dp)) | 954 | if (!is_pch_edp(intel_dp)) |
950 | ironlake_edp_pll_on(encoder); | 955 | ironlake_edp_pll_on(encoder); |
951 | else | 956 | else |
@@ -959,10 +964,15 @@ static void intel_dp_commit(struct drm_encoder *encoder) | |||
959 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); | 964 | struct intel_dp *intel_dp = enc_to_intel_dp(encoder); |
960 | struct drm_device *dev = encoder->dev; | 965 | struct drm_device *dev = encoder->dev; |
961 | 966 | ||
967 | if (is_edp(intel_dp)) | ||
968 | ironlake_edp_panel_vdd_on(intel_dp); | ||
969 | |||
962 | intel_dp_start_link_train(intel_dp); | 970 | intel_dp_start_link_train(intel_dp); |
963 | 971 | ||
964 | if (is_edp(intel_dp)) | 972 | if (is_edp(intel_dp)) { |
965 | ironlake_edp_panel_on(intel_dp); | 973 | ironlake_edp_panel_on(intel_dp); |
974 | ironlake_edp_panel_vdd_off(intel_dp); | ||
975 | } | ||
966 | 976 | ||
967 | intel_dp_complete_link_train(intel_dp); | 977 | intel_dp_complete_link_train(intel_dp); |
968 | 978 | ||
@@ -988,9 +998,13 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) | |||
988 | ironlake_edp_pll_off(encoder); | 998 | ironlake_edp_pll_off(encoder); |
989 | } else { | 999 | } else { |
990 | if (is_edp(intel_dp)) | 1000 | if (is_edp(intel_dp)) |
991 | ironlake_edp_panel_on(intel_dp); | 1001 | ironlake_edp_panel_vdd_on(intel_dp); |
992 | if (!(dp_reg & DP_PORT_EN)) { | 1002 | if (!(dp_reg & DP_PORT_EN)) { |
993 | intel_dp_start_link_train(intel_dp); | 1003 | intel_dp_start_link_train(intel_dp); |
1004 | if (is_edp(intel_dp)) { | ||
1005 | ironlake_edp_panel_on(intel_dp); | ||
1006 | ironlake_edp_panel_vdd_off(intel_dp); | ||
1007 | } | ||
994 | intel_dp_complete_link_train(intel_dp); | 1008 | intel_dp_complete_link_train(intel_dp); |
995 | } | 1009 | } |
996 | if (is_edp(intel_dp)) | 1010 | if (is_edp(intel_dp)) |
@@ -1508,9 +1522,13 @@ ironlake_dp_detect(struct intel_dp *intel_dp) | |||
1508 | { | 1522 | { |
1509 | enum drm_connector_status status; | 1523 | enum drm_connector_status status; |
1510 | 1524 | ||
1511 | /* Can't disconnect eDP */ | 1525 | /* Can't disconnect eDP, but you can close the lid... */ |
1512 | if (is_edp(intel_dp)) | 1526 | if (is_edp(intel_dp)) { |
1513 | return connector_status_connected; | 1527 | status = intel_panel_detect(intel_dp->base.base.dev); |
1528 | if (status == connector_status_unknown) | ||
1529 | status = connector_status_connected; | ||
1530 | return status; | ||
1531 | } | ||
1514 | 1532 | ||
1515 | status = connector_status_disconnected; | 1533 | status = connector_status_disconnected; |
1516 | if (intel_dp_aux_native_read(intel_dp, | 1534 | if (intel_dp_aux_native_read(intel_dp, |
@@ -1906,9 +1924,18 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
1906 | /* Cache some DPCD data in the eDP case */ | 1924 | /* Cache some DPCD data in the eDP case */ |
1907 | if (is_edp(intel_dp)) { | 1925 | if (is_edp(intel_dp)) { |
1908 | int ret; | 1926 | int ret; |
1909 | bool was_on; | 1927 | u32 pp_on, pp_div; |
1910 | 1928 | ||
1911 | was_on = ironlake_edp_panel_on(intel_dp); | 1929 | pp_on = I915_READ(PCH_PP_ON_DELAYS); |
1930 | pp_div = I915_READ(PCH_PP_DIVISOR); | ||
1931 | |||
1932 | /* Get T3 & T12 values (note: VESA not bspec terminology) */ | ||
1933 | dev_priv->panel_t3 = (pp_on & 0x1fff0000) >> 16; | ||
1934 | dev_priv->panel_t3 /= 10; /* t3 in 100us units */ | ||
1935 | dev_priv->panel_t12 = pp_div & 0xf; | ||
1936 | dev_priv->panel_t12 *= 100; /* t12 in 100ms units */ | ||
1937 | |||
1938 | ironlake_edp_panel_vdd_on(intel_dp); | ||
1912 | ret = intel_dp_aux_native_read(intel_dp, DP_DPCD_REV, | 1939 | ret = intel_dp_aux_native_read(intel_dp, DP_DPCD_REV, |
1913 | intel_dp->dpcd, | 1940 | intel_dp->dpcd, |
1914 | sizeof(intel_dp->dpcd)); | 1941 | sizeof(intel_dp->dpcd)); |
@@ -1919,8 +1946,7 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
1919 | } else { | 1946 | } else { |
1920 | DRM_ERROR("failed to retrieve link info\n"); | 1947 | DRM_ERROR("failed to retrieve link info\n"); |
1921 | } | 1948 | } |
1922 | if (!was_on) | 1949 | ironlake_edp_panel_vdd_off(intel_dp); |
1923 | ironlake_edp_panel_off(dev); | ||
1924 | } | 1950 | } |
1925 | 1951 | ||
1926 | intel_encoder->hot_plug = intel_dp_hot_plug; | 1952 | intel_encoder->hot_plug = intel_dp_hot_plug; |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 2c431049963c..aae4806203db 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -217,6 +217,13 @@ intel_get_crtc_for_pipe(struct drm_device *dev, int pipe) | |||
217 | return dev_priv->pipe_to_crtc_mapping[pipe]; | 217 | return dev_priv->pipe_to_crtc_mapping[pipe]; |
218 | } | 218 | } |
219 | 219 | ||
220 | static inline struct drm_crtc * | ||
221 | intel_get_crtc_for_plane(struct drm_device *dev, int plane) | ||
222 | { | ||
223 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
224 | return dev_priv->plane_to_crtc_mapping[plane]; | ||
225 | } | ||
226 | |||
220 | struct intel_unpin_work { | 227 | struct intel_unpin_work { |
221 | struct work_struct work; | 228 | struct work_struct work; |
222 | struct drm_device *dev; | 229 | struct drm_device *dev; |
@@ -260,6 +267,7 @@ extern void intel_panel_set_backlight(struct drm_device *dev, u32 level); | |||
260 | extern void intel_panel_setup_backlight(struct drm_device *dev); | 267 | extern void intel_panel_setup_backlight(struct drm_device *dev); |
261 | extern void intel_panel_enable_backlight(struct drm_device *dev); | 268 | extern void intel_panel_enable_backlight(struct drm_device *dev); |
262 | extern void intel_panel_disable_backlight(struct drm_device *dev); | 269 | extern void intel_panel_disable_backlight(struct drm_device *dev); |
270 | extern enum drm_connector_status intel_panel_detect(struct drm_device *dev); | ||
263 | 271 | ||
264 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); | 272 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); |
265 | extern void intel_encoder_prepare (struct drm_encoder *encoder); | 273 | extern void intel_encoder_prepare (struct drm_encoder *encoder); |
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index ea373283c93b..6eda1b51c636 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
@@ -178,7 +178,7 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder, | |||
178 | int pipe = intel_crtc->pipe; | 178 | int pipe = intel_crtc->pipe; |
179 | u32 dvo_val; | 179 | u32 dvo_val; |
180 | u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg; | 180 | u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg; |
181 | int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; | 181 | int dpll_reg = DPLL(pipe); |
182 | 182 | ||
183 | switch (dvo_reg) { | 183 | switch (dvo_reg) { |
184 | case DVOA: | 184 | case DVOA: |
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 58040f68ed7a..82d04c5899d2 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
@@ -384,7 +384,8 @@ int intel_setup_gmbus(struct drm_device *dev) | |||
384 | bus->reg0 = i | GMBUS_RATE_100KHZ; | 384 | bus->reg0 = i | GMBUS_RATE_100KHZ; |
385 | 385 | ||
386 | /* XXX force bit banging until GMBUS is fully debugged */ | 386 | /* XXX force bit banging until GMBUS is fully debugged */ |
387 | bus->force_bit = intel_gpio_create(dev_priv, i); | 387 | if (IS_GEN2(dev)) |
388 | bus->force_bit = intel_gpio_create(dev_priv, i); | ||
388 | } | 389 | } |
389 | 390 | ||
390 | intel_i2c_reset(dev_priv->dev); | 391 | intel_i2c_reset(dev_priv->dev); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index bcdba7bd5cfa..1a311ad01116 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -231,6 +231,7 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
231 | struct intel_lvds *intel_lvds = to_intel_lvds(encoder); | 231 | struct intel_lvds *intel_lvds = to_intel_lvds(encoder); |
232 | struct drm_encoder *tmp_encoder; | 232 | struct drm_encoder *tmp_encoder; |
233 | u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0; | 233 | u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0; |
234 | int pipe; | ||
234 | 235 | ||
235 | /* Should never happen!! */ | 236 | /* Should never happen!! */ |
236 | if (INTEL_INFO(dev)->gen < 4 && intel_crtc->pipe == 0) { | 237 | if (INTEL_INFO(dev)->gen < 4 && intel_crtc->pipe == 0) { |
@@ -277,8 +278,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
277 | * to register description and PRM. | 278 | * to register description and PRM. |
278 | * Change the value here to see the borders for debugging | 279 | * Change the value here to see the borders for debugging |
279 | */ | 280 | */ |
280 | I915_WRITE(BCLRPAT_A, 0); | 281 | for_each_pipe(pipe) |
281 | I915_WRITE(BCLRPAT_B, 0); | 282 | I915_WRITE(BCLRPAT(pipe), 0); |
282 | 283 | ||
283 | switch (intel_lvds->fitting_mode) { | 284 | switch (intel_lvds->fitting_mode) { |
284 | case DRM_MODE_SCALE_CENTER: | 285 | case DRM_MODE_SCALE_CENTER: |
@@ -474,6 +475,10 @@ intel_lvds_detect(struct drm_connector *connector, bool force) | |||
474 | struct drm_device *dev = connector->dev; | 475 | struct drm_device *dev = connector->dev; |
475 | enum drm_connector_status status = connector_status_connected; | 476 | enum drm_connector_status status = connector_status_connected; |
476 | 477 | ||
478 | status = intel_panel_detect(dev); | ||
479 | if (status != connector_status_unknown) | ||
480 | return status; | ||
481 | |||
477 | /* ACPI lid methods were generally unreliable in this generation, so | 482 | /* ACPI lid methods were generally unreliable in this generation, so |
478 | * don't even bother. | 483 | * don't even bother. |
479 | */ | 484 | */ |
@@ -496,7 +501,7 @@ static int intel_lvds_get_modes(struct drm_connector *connector) | |||
496 | return drm_add_edid_modes(connector, intel_lvds->edid); | 501 | return drm_add_edid_modes(connector, intel_lvds->edid); |
497 | 502 | ||
498 | mode = drm_mode_duplicate(dev, intel_lvds->fixed_mode); | 503 | mode = drm_mode_duplicate(dev, intel_lvds->fixed_mode); |
499 | if (mode == 0) | 504 | if (mode == NULL) |
500 | return 0; | 505 | return 0; |
501 | 506 | ||
502 | drm_mode_probed_add(connector, mode); | 507 | drm_mode_probed_add(connector, mode); |
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index 64fd64443ca6..9efccb95fd58 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c | |||
@@ -489,6 +489,8 @@ int intel_opregion_setup(struct drm_device *dev) | |||
489 | opregion->header = base; | 489 | opregion->header = base; |
490 | opregion->vbt = base + OPREGION_VBT_OFFSET; | 490 | opregion->vbt = base + OPREGION_VBT_OFFSET; |
491 | 491 | ||
492 | opregion->lid_state = base + 0x01ac; | ||
493 | |||
492 | mboxes = opregion->header->mboxes; | 494 | mboxes = opregion->header->mboxes; |
493 | if (mboxes & MBOX_ACPI) { | 495 | if (mboxes & MBOX_ACPI) { |
494 | DRM_DEBUG_DRIVER("Public ACPI methods supported\n"); | 496 | DRM_DEBUG_DRIVER("Public ACPI methods supported\n"); |
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index 3fbb98b948d6..29fb2174eaaa 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
@@ -221,16 +221,15 @@ static int intel_overlay_do_wait_request(struct intel_overlay *overlay, | |||
221 | int ret; | 221 | int ret; |
222 | 222 | ||
223 | BUG_ON(overlay->last_flip_req); | 223 | BUG_ON(overlay->last_flip_req); |
224 | ret = i915_add_request(dev, NULL, request, LP_RING(dev_priv)); | 224 | ret = i915_add_request(LP_RING(dev_priv), NULL, request); |
225 | if (ret) { | 225 | if (ret) { |
226 | kfree(request); | 226 | kfree(request); |
227 | return ret; | 227 | return ret; |
228 | } | 228 | } |
229 | overlay->last_flip_req = request->seqno; | 229 | overlay->last_flip_req = request->seqno; |
230 | overlay->flip_tail = tail; | 230 | overlay->flip_tail = tail; |
231 | ret = i915_do_wait_request(dev, | 231 | ret = i915_wait_request(LP_RING(dev_priv), |
232 | overlay->last_flip_req, true, | 232 | overlay->last_flip_req, true); |
233 | LP_RING(dev_priv)); | ||
234 | if (ret) | 233 | if (ret) |
235 | return ret; | 234 | return ret; |
236 | 235 | ||
@@ -256,7 +255,7 @@ i830_activate_pipe_a(struct drm_device *dev) | |||
256 | return 0; | 255 | return 0; |
257 | 256 | ||
258 | /* most i8xx have pipe a forced on, so don't trust dpms mode */ | 257 | /* most i8xx have pipe a forced on, so don't trust dpms mode */ |
259 | if (I915_READ(PIPEACONF) & PIPECONF_ENABLE) | 258 | if (I915_READ(_PIPEACONF) & PIPECONF_ENABLE) |
260 | return 0; | 259 | return 0; |
261 | 260 | ||
262 | crtc_funcs = crtc->base.helper_private; | 261 | crtc_funcs = crtc->base.helper_private; |
@@ -364,7 +363,7 @@ static int intel_overlay_continue(struct intel_overlay *overlay, | |||
364 | OUT_RING(flip_addr); | 363 | OUT_RING(flip_addr); |
365 | ADVANCE_LP_RING(); | 364 | ADVANCE_LP_RING(); |
366 | 365 | ||
367 | ret = i915_add_request(dev, NULL, request, LP_RING(dev_priv)); | 366 | ret = i915_add_request(LP_RING(dev_priv), NULL, request); |
368 | if (ret) { | 367 | if (ret) { |
369 | kfree(request); | 368 | kfree(request); |
370 | return ret; | 369 | return ret; |
@@ -453,8 +452,8 @@ static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay, | |||
453 | if (overlay->last_flip_req == 0) | 452 | if (overlay->last_flip_req == 0) |
454 | return 0; | 453 | return 0; |
455 | 454 | ||
456 | ret = i915_do_wait_request(dev, overlay->last_flip_req, | 455 | ret = i915_wait_request(LP_RING(dev_priv), |
457 | interruptible, LP_RING(dev_priv)); | 456 | overlay->last_flip_req, interruptible); |
458 | if (ret) | 457 | if (ret) |
459 | return ret; | 458 | return ret; |
460 | 459 | ||
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index c65992df458d..286995a9a84a 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -281,3 +281,17 @@ void intel_panel_setup_backlight(struct drm_device *dev) | |||
281 | dev_priv->backlight_level = intel_panel_get_backlight(dev); | 281 | dev_priv->backlight_level = intel_panel_get_backlight(dev); |
282 | dev_priv->backlight_enabled = dev_priv->backlight_level != 0; | 282 | dev_priv->backlight_enabled = dev_priv->backlight_level != 0; |
283 | } | 283 | } |
284 | |||
285 | enum drm_connector_status | ||
286 | intel_panel_detect(struct drm_device *dev) | ||
287 | { | ||
288 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
289 | |||
290 | /* Assume that the BIOS does not lie through the OpRegion... */ | ||
291 | if (dev_priv->opregion.lid_state) | ||
292 | return ioread32(dev_priv->opregion.lid_state) & 0x1 ? | ||
293 | connector_status_connected : | ||
294 | connector_status_disconnected; | ||
295 | |||
296 | return connector_status_unknown; | ||
297 | } | ||
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 445f27efe677..789c47801ba8 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -62,18 +62,9 @@ render_ring_flush(struct intel_ring_buffer *ring, | |||
62 | u32 flush_domains) | 62 | u32 flush_domains) |
63 | { | 63 | { |
64 | struct drm_device *dev = ring->dev; | 64 | struct drm_device *dev = ring->dev; |
65 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
66 | u32 cmd; | 65 | u32 cmd; |
67 | int ret; | 66 | int ret; |
68 | 67 | ||
69 | #if WATCH_EXEC | ||
70 | DRM_INFO("%s: invalidate %08x flush %08x\n", __func__, | ||
71 | invalidate_domains, flush_domains); | ||
72 | #endif | ||
73 | |||
74 | trace_i915_gem_request_flush(dev, dev_priv->next_seqno, | ||
75 | invalidate_domains, flush_domains); | ||
76 | |||
77 | if ((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) { | 68 | if ((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) { |
78 | /* | 69 | /* |
79 | * read/write caches: | 70 | * read/write caches: |
@@ -122,9 +113,6 @@ render_ring_flush(struct intel_ring_buffer *ring, | |||
122 | (IS_G4X(dev) || IS_GEN5(dev))) | 113 | (IS_G4X(dev) || IS_GEN5(dev))) |
123 | cmd |= MI_INVALIDATE_ISP; | 114 | cmd |= MI_INVALIDATE_ISP; |
124 | 115 | ||
125 | #if WATCH_EXEC | ||
126 | DRM_INFO("%s: queue flush %08x to ring\n", __func__, cmd); | ||
127 | #endif | ||
128 | ret = intel_ring_begin(ring, 2); | 116 | ret = intel_ring_begin(ring, 2); |
129 | if (ret) | 117 | if (ret) |
130 | return ret; | 118 | return ret; |
@@ -612,7 +600,6 @@ ring_add_request(struct intel_ring_buffer *ring, | |||
612 | intel_ring_emit(ring, MI_USER_INTERRUPT); | 600 | intel_ring_emit(ring, MI_USER_INTERRUPT); |
613 | intel_ring_advance(ring); | 601 | intel_ring_advance(ring); |
614 | 602 | ||
615 | DRM_DEBUG_DRIVER("%s %d\n", ring->name, seqno); | ||
616 | *result = seqno; | 603 | *result = seqno; |
617 | return 0; | 604 | return 0; |
618 | } | 605 | } |
@@ -715,11 +702,8 @@ render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, | |||
715 | u32 offset, u32 len) | 702 | u32 offset, u32 len) |
716 | { | 703 | { |
717 | struct drm_device *dev = ring->dev; | 704 | struct drm_device *dev = ring->dev; |
718 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
719 | int ret; | 705 | int ret; |
720 | 706 | ||
721 | trace_i915_gem_request_submit(dev, dev_priv->next_seqno + 1); | ||
722 | |||
723 | if (IS_I830(dev) || IS_845G(dev)) { | 707 | if (IS_I830(dev) || IS_845G(dev)) { |
724 | ret = intel_ring_begin(ring, 4); | 708 | ret = intel_ring_begin(ring, 4); |
725 | if (ret) | 709 | if (ret) |
@@ -894,6 +878,10 @@ void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring) | |||
894 | /* Disable the ring buffer. The ring must be idle at this point */ | 878 | /* Disable the ring buffer. The ring must be idle at this point */ |
895 | dev_priv = ring->dev->dev_private; | 879 | dev_priv = ring->dev->dev_private; |
896 | ret = intel_wait_ring_buffer(ring, ring->size - 8); | 880 | ret = intel_wait_ring_buffer(ring, ring->size - 8); |
881 | if (ret) | ||
882 | DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n", | ||
883 | ring->name, ret); | ||
884 | |||
897 | I915_WRITE_CTL(ring, 0); | 885 | I915_WRITE_CTL(ring, 0); |
898 | 886 | ||
899 | drm_core_ioremapfree(&ring->map, ring->dev); | 887 | drm_core_ioremapfree(&ring->map, ring->dev); |
@@ -950,13 +938,13 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | |||
950 | return 0; | 938 | return 0; |
951 | } | 939 | } |
952 | 940 | ||
953 | trace_i915_ring_wait_begin (dev); | 941 | trace_i915_ring_wait_begin(ring); |
954 | end = jiffies + 3 * HZ; | 942 | end = jiffies + 3 * HZ; |
955 | do { | 943 | do { |
956 | ring->head = I915_READ_HEAD(ring); | 944 | ring->head = I915_READ_HEAD(ring); |
957 | ring->space = ring_space(ring); | 945 | ring->space = ring_space(ring); |
958 | if (ring->space >= n) { | 946 | if (ring->space >= n) { |
959 | trace_i915_ring_wait_end(dev); | 947 | trace_i915_ring_wait_end(ring); |
960 | return 0; | 948 | return 0; |
961 | } | 949 | } |
962 | 950 | ||
@@ -970,16 +958,20 @@ int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n) | |||
970 | if (atomic_read(&dev_priv->mm.wedged)) | 958 | if (atomic_read(&dev_priv->mm.wedged)) |
971 | return -EAGAIN; | 959 | return -EAGAIN; |
972 | } while (!time_after(jiffies, end)); | 960 | } while (!time_after(jiffies, end)); |
973 | trace_i915_ring_wait_end (dev); | 961 | trace_i915_ring_wait_end(ring); |
974 | return -EBUSY; | 962 | return -EBUSY; |
975 | } | 963 | } |
976 | 964 | ||
977 | int intel_ring_begin(struct intel_ring_buffer *ring, | 965 | int intel_ring_begin(struct intel_ring_buffer *ring, |
978 | int num_dwords) | 966 | int num_dwords) |
979 | { | 967 | { |
968 | struct drm_i915_private *dev_priv = ring->dev->dev_private; | ||
980 | int n = 4*num_dwords; | 969 | int n = 4*num_dwords; |
981 | int ret; | 970 | int ret; |
982 | 971 | ||
972 | if (unlikely(atomic_read(&dev_priv->mm.wedged))) | ||
973 | return -EIO; | ||
974 | |||
983 | if (unlikely(ring->tail + n > ring->effective_size)) { | 975 | if (unlikely(ring->tail + n > ring->effective_size)) { |
984 | ret = intel_wrap_ring_buffer(ring); | 976 | ret = intel_wrap_ring_buffer(ring); |
985 | if (unlikely(ret)) | 977 | if (unlikely(ret)) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 6d6fde85a636..bd6a5fbfa929 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -43,7 +43,7 @@ struct intel_ring_buffer { | |||
43 | RING_BLT = 0x4, | 43 | RING_BLT = 0x4, |
44 | } id; | 44 | } id; |
45 | u32 mmio_base; | 45 | u32 mmio_base; |
46 | void *virtual_start; | 46 | void __iomem *virtual_start; |
47 | struct drm_device *dev; | 47 | struct drm_device *dev; |
48 | struct drm_i915_gem_object *obj; | 48 | struct drm_i915_gem_object *obj; |
49 | 49 | ||
@@ -58,6 +58,7 @@ struct intel_ring_buffer { | |||
58 | u32 irq_refcount; | 58 | u32 irq_refcount; |
59 | u32 irq_mask; | 59 | u32 irq_mask; |
60 | u32 irq_seqno; /* last seq seem at irq time */ | 60 | u32 irq_seqno; /* last seq seem at irq time */ |
61 | u32 trace_irq_seqno; | ||
61 | u32 waiting_seqno; | 62 | u32 waiting_seqno; |
62 | u32 sync_seqno[I915_NUM_RINGS-1]; | 63 | u32 sync_seqno[I915_NUM_RINGS-1]; |
63 | bool __must_check (*irq_get)(struct intel_ring_buffer *ring); | 64 | bool __must_check (*irq_get)(struct intel_ring_buffer *ring); |
@@ -141,6 +142,26 @@ intel_read_status_page(struct intel_ring_buffer *ring, | |||
141 | return ioread32(ring->status_page.page_addr + reg); | 142 | return ioread32(ring->status_page.page_addr + reg); |
142 | } | 143 | } |
143 | 144 | ||
145 | /** | ||
146 | * Reads a dword out of the status page, which is written to from the command | ||
147 | * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or | ||
148 | * MI_STORE_DATA_IMM. | ||
149 | * | ||
150 | * The following dwords have a reserved meaning: | ||
151 | * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes. | ||
152 | * 0x04: ring 0 head pointer | ||
153 | * 0x05: ring 1 head pointer (915-class) | ||
154 | * 0x06: ring 2 head pointer (915-class) | ||
155 | * 0x10-0x1b: Context status DWords (GM45) | ||
156 | * 0x1f: Last written status offset. (GM45) | ||
157 | * | ||
158 | * The area from dword 0x20 to 0x3ff is available for driver usage. | ||
159 | */ | ||
160 | #define READ_HWSP(dev_priv, reg) intel_read_status_page(LP_RING(dev_priv), reg) | ||
161 | #define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) | ||
162 | #define I915_GEM_HWS_INDEX 0x20 | ||
163 | #define I915_BREADCRUMB_INDEX 0x21 | ||
164 | |||
144 | void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring); | 165 | void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring); |
145 | int __must_check intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n); | 166 | int __must_check intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n); |
146 | int __must_check intel_ring_begin(struct intel_ring_buffer *ring, int n); | 167 | int __must_check intel_ring_begin(struct intel_ring_buffer *ring, int n); |
@@ -166,6 +187,12 @@ int intel_init_blt_ring_buffer(struct drm_device *dev); | |||
166 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); | 187 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); |
167 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); | 188 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); |
168 | 189 | ||
190 | static inline void i915_trace_irq_get(struct intel_ring_buffer *ring, u32 seqno) | ||
191 | { | ||
192 | if (ring->trace_irq_seqno == 0 && ring->irq_get(ring)) | ||
193 | ring->trace_irq_seqno = seqno; | ||
194 | } | ||
195 | |||
169 | /* DRI warts */ | 196 | /* DRI warts */ |
170 | int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size); | 197 | int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size); |
171 | 198 | ||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 7c50cdce84f0..19c817a2df0c 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -585,6 +585,7 @@ static bool intel_sdvo_get_trained_inputs(struct intel_sdvo *intel_sdvo, bool *i | |||
585 | { | 585 | { |
586 | struct intel_sdvo_get_trained_inputs_response response; | 586 | struct intel_sdvo_get_trained_inputs_response response; |
587 | 587 | ||
588 | BUILD_BUG_ON(sizeof(response) != 1); | ||
588 | if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_TRAINED_INPUTS, | 589 | if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_TRAINED_INPUTS, |
589 | &response, sizeof(response))) | 590 | &response, sizeof(response))) |
590 | return false; | 591 | return false; |
@@ -632,6 +633,7 @@ static bool intel_sdvo_get_input_pixel_clock_range(struct intel_sdvo *intel_sdvo | |||
632 | { | 633 | { |
633 | struct intel_sdvo_pixel_clock_range clocks; | 634 | struct intel_sdvo_pixel_clock_range clocks; |
634 | 635 | ||
636 | BUILD_BUG_ON(sizeof(clocks) != 4); | ||
635 | if (!intel_sdvo_get_value(intel_sdvo, | 637 | if (!intel_sdvo_get_value(intel_sdvo, |
636 | SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE, | 638 | SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE, |
637 | &clocks, sizeof(clocks))) | 639 | &clocks, sizeof(clocks))) |
@@ -699,6 +701,8 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo, | |||
699 | static bool intel_sdvo_get_preferred_input_timing(struct intel_sdvo *intel_sdvo, | 701 | static bool intel_sdvo_get_preferred_input_timing(struct intel_sdvo *intel_sdvo, |
700 | struct intel_sdvo_dtd *dtd) | 702 | struct intel_sdvo_dtd *dtd) |
701 | { | 703 | { |
704 | BUILD_BUG_ON(sizeof(dtd->part1) != 8); | ||
705 | BUILD_BUG_ON(sizeof(dtd->part2) != 8); | ||
702 | return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1, | 706 | return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1, |
703 | &dtd->part1, sizeof(dtd->part1)) && | 707 | &dtd->part1, sizeof(dtd->part1)) && |
704 | intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2, | 708 | intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2, |
@@ -796,6 +800,7 @@ static bool intel_sdvo_check_supp_encode(struct intel_sdvo *intel_sdvo) | |||
796 | { | 800 | { |
797 | struct intel_sdvo_encode encode; | 801 | struct intel_sdvo_encode encode; |
798 | 802 | ||
803 | BUILD_BUG_ON(sizeof(encode) != 2); | ||
799 | return intel_sdvo_get_value(intel_sdvo, | 804 | return intel_sdvo_get_value(intel_sdvo, |
800 | SDVO_CMD_GET_SUPP_ENCODE, | 805 | SDVO_CMD_GET_SUPP_ENCODE, |
801 | &encode, sizeof(encode)); | 806 | &encode, sizeof(encode)); |
@@ -1162,6 +1167,7 @@ static int intel_sdvo_mode_valid(struct drm_connector *connector, | |||
1162 | 1167 | ||
1163 | static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct intel_sdvo_caps *caps) | 1168 | static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct intel_sdvo_caps *caps) |
1164 | { | 1169 | { |
1170 | BUILD_BUG_ON(sizeof(*caps) != 8); | ||
1165 | if (!intel_sdvo_get_value(intel_sdvo, | 1171 | if (!intel_sdvo_get_value(intel_sdvo, |
1166 | SDVO_CMD_GET_DEVICE_CAPS, | 1172 | SDVO_CMD_GET_DEVICE_CAPS, |
1167 | caps, sizeof(*caps))) | 1173 | caps, sizeof(*caps))) |
@@ -1268,33 +1274,9 @@ void intel_sdvo_set_hotplug(struct drm_connector *connector, int on) | |||
1268 | static bool | 1274 | static bool |
1269 | intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo) | 1275 | intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo) |
1270 | { | 1276 | { |
1271 | int caps = 0; | 1277 | /* Is there more than one type of output? */ |
1272 | 1278 | int caps = intel_sdvo->caps.output_flags & 0xf; | |
1273 | if (intel_sdvo->caps.output_flags & | 1279 | return caps & -caps; |
1274 | (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) | ||
1275 | caps++; | ||
1276 | if (intel_sdvo->caps.output_flags & | ||
1277 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) | ||
1278 | caps++; | ||
1279 | if (intel_sdvo->caps.output_flags & | ||
1280 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID1)) | ||
1281 | caps++; | ||
1282 | if (intel_sdvo->caps.output_flags & | ||
1283 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) | ||
1284 | caps++; | ||
1285 | if (intel_sdvo->caps.output_flags & | ||
1286 | (SDVO_OUTPUT_YPRPB0 | SDVO_OUTPUT_YPRPB1)) | ||
1287 | caps++; | ||
1288 | |||
1289 | if (intel_sdvo->caps.output_flags & | ||
1290 | (SDVO_OUTPUT_SCART0 | SDVO_OUTPUT_SCART1)) | ||
1291 | caps++; | ||
1292 | |||
1293 | if (intel_sdvo->caps.output_flags & | ||
1294 | (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)) | ||
1295 | caps++; | ||
1296 | |||
1297 | return (caps > 1); | ||
1298 | } | 1280 | } |
1299 | 1281 | ||
1300 | static struct edid * | 1282 | static struct edid * |
@@ -2268,6 +2250,7 @@ static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo, | |||
2268 | if (!intel_sdvo_set_target_output(intel_sdvo, type)) | 2250 | if (!intel_sdvo_set_target_output(intel_sdvo, type)) |
2269 | return false; | 2251 | return false; |
2270 | 2252 | ||
2253 | BUILD_BUG_ON(sizeof(format) != 6); | ||
2271 | if (!intel_sdvo_get_value(intel_sdvo, | 2254 | if (!intel_sdvo_get_value(intel_sdvo, |
2272 | SDVO_CMD_GET_SUPPORTED_TV_FORMATS, | 2255 | SDVO_CMD_GET_SUPPORTED_TV_FORMATS, |
2273 | &format, sizeof(format))) | 2256 | &format, sizeof(format))) |
@@ -2474,6 +2457,8 @@ static bool intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo, | |||
2474 | uint16_t response; | 2457 | uint16_t response; |
2475 | } enhancements; | 2458 | } enhancements; |
2476 | 2459 | ||
2460 | BUILD_BUG_ON(sizeof(enhancements) != 2); | ||
2461 | |||
2477 | enhancements.response = 0; | 2462 | enhancements.response = 0; |
2478 | intel_sdvo_get_value(intel_sdvo, | 2463 | intel_sdvo_get_value(intel_sdvo, |
2479 | SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS, | 2464 | SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS, |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index fe4a53a50b83..4256b8ef3947 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
@@ -1006,6 +1006,7 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
1006 | const struct video_levels *video_levels; | 1006 | const struct video_levels *video_levels; |
1007 | const struct color_conversion *color_conversion; | 1007 | const struct color_conversion *color_conversion; |
1008 | bool burst_ena; | 1008 | bool burst_ena; |
1009 | int pipe = intel_crtc->pipe; | ||
1009 | 1010 | ||
1010 | if (!tv_mode) | 1011 | if (!tv_mode) |
1011 | return; /* can't happen (mode_prepare prevents this) */ | 1012 | return; /* can't happen (mode_prepare prevents this) */ |
@@ -1149,14 +1150,11 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
1149 | ((video_levels->black << TV_BLACK_LEVEL_SHIFT) | | 1150 | ((video_levels->black << TV_BLACK_LEVEL_SHIFT) | |
1150 | (video_levels->blank << TV_BLANK_LEVEL_SHIFT))); | 1151 | (video_levels->blank << TV_BLANK_LEVEL_SHIFT))); |
1151 | { | 1152 | { |
1152 | int pipeconf_reg = (intel_crtc->pipe == 0) ? | 1153 | int pipeconf_reg = PIPECONF(pipe); |
1153 | PIPEACONF : PIPEBCONF; | 1154 | int dspcntr_reg = DSPCNTR(pipe); |
1154 | int dspcntr_reg = (intel_crtc->plane == 0) ? | ||
1155 | DSPACNTR : DSPBCNTR; | ||
1156 | int pipeconf = I915_READ(pipeconf_reg); | 1155 | int pipeconf = I915_READ(pipeconf_reg); |
1157 | int dspcntr = I915_READ(dspcntr_reg); | 1156 | int dspcntr = I915_READ(dspcntr_reg); |
1158 | int dspbase_reg = (intel_crtc->plane == 0) ? | 1157 | int dspbase_reg = DSPADDR(pipe); |
1159 | DSPAADDR : DSPBADDR; | ||
1160 | int xpos = 0x0, ypos = 0x0; | 1158 | int xpos = 0x0, ypos = 0x0; |
1161 | unsigned int xsize, ysize; | 1159 | unsigned int xsize, ysize; |
1162 | /* Pipe must be off here */ | 1160 | /* Pipe must be off here */ |