Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-next-fixes-2015-05-29' of git://anongit.freedesktop.org/drm-intel into drm-next

Fixes for 4.2. Nothing too serious (given that it's still pre merge
window). With that it's off for 2 weeks of vacation for me and taking care
of 4.2 fixes for Jani.

* tag 'drm-intel-next-fixes-2015-05-29' of git://anongit.freedesktop.org/drm-intel:
drm/i915: limit PPGTT size to 2GB in 32-bit platforms
drm/i915: Another fbdev hack to avoid PSR on fbcon.
drm/i915: Return the frontbuffer flip to enable intel_crtc_enable_planes.
drm/i915: disable IPS while getting the sink CRCs
drm/i915: Disable 12bpc hdmi for now
drm/i915: Adjust sideband locking a bit for CHV/VLV
drm/i915: s/dpio_lock/sb_lock/
drm/i915: Kill intel_flush_primary_plane()
drm/i915: Throw out WIP CHV power well definitions
drm/i915: Use the default 600ns LDO programming sequence delay
drm/i915: Remove unnecessary null check in execlists_context_unqueue
drm/i915: Use spinlocks for checking when to waitboost
drm/i915: Fix the confusing comment about the ioctl limits
Revert "drm/i915: Force clean compilation with -Werror"

+247 -297
-8
drivers/gpu/drm/i915/Kconfig
··· 71 71 option changes the default for that module option. 72 72 73 73 If in doubt, say "N". 74 - 75 - menu "DRM i915 Debugging" 76 - 77 - depends on DRM_I915 78 - 79 - source drivers/gpu/drm/i915/Kconfig.debug 80 - 81 - endmenu
-5
drivers/gpu/drm/i915/Kconfig.debug
··· 1 - config DRM_I915_WERROR 2 - bool "Force GCC to throw an error instead of a warning when compiling" 3 - default n 4 - ---help--- 5 - Add -Werror to the build flags for (and only for) i915.ko
-2
drivers/gpu/drm/i915/Makefile
··· 2 2 # Makefile for the drm device driver. This driver provides support for the 3 3 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. 4 4 5 - subdir-ccflags-$(CONFIG_DRM_I915_WERROR) := -Werror 6 - 7 5 # Please keep these build lists sorted! 8 6 9 7 # core driver code
+3 -14
drivers/gpu/drm/i915/i915_debugfs.c
··· 2300 2300 struct drm_device *dev = node->minor->dev; 2301 2301 struct drm_i915_private *dev_priv = dev->dev_private; 2302 2302 struct drm_file *file; 2303 - int ret; 2304 - 2305 - ret = mutex_lock_interruptible(&dev->struct_mutex); 2306 - if (ret) 2307 - return ret; 2308 - 2309 - ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock); 2310 - if (ret) 2311 - goto unlock; 2312 2303 2313 2304 seq_printf(m, "RPS enabled? %d\n", dev_priv->rps.enabled); 2314 2305 seq_printf(m, "GPU busy? %d\n", dev_priv->mm.busy); ··· 2310 2319 intel_gpu_freq(dev_priv, dev_priv->rps.min_freq_softlimit), 2311 2320 intel_gpu_freq(dev_priv, dev_priv->rps.max_freq_softlimit), 2312 2321 intel_gpu_freq(dev_priv, dev_priv->rps.max_freq)); 2322 + spin_lock(&dev_priv->rps.client_lock); 2313 2323 list_for_each_entry_reverse(file, &dev->filelist, lhead) { 2314 2324 struct drm_i915_file_private *file_priv = file->driver_priv; 2315 2325 struct task_struct *task; ··· 2331 2339 dev_priv->rps.mmioflips.boosts, 2332 2340 list_empty(&dev_priv->rps.mmioflips.link) ? "" : ", active"); 2333 2341 seq_printf(m, "Kernel boosts: %d\n", dev_priv->rps.boosts); 2342 + spin_unlock(&dev_priv->rps.client_lock); 2334 2343 2335 - mutex_unlock(&dev_priv->rps.hw_lock); 2336 - unlock: 2337 - mutex_unlock(&dev->struct_mutex); 2338 - 2339 - return ret; 2344 + return 0; 2340 2345 } 2341 2346 2342 2347 static int i915_llc(struct seq_file *m, void *data)
+1 -1
drivers/gpu/drm/i915/i915_dma.c
··· 814 814 spin_lock_init(&dev_priv->uncore.lock); 815 815 spin_lock_init(&dev_priv->mm.object_stat_lock); 816 816 spin_lock_init(&dev_priv->mmio_flip_lock); 817 - mutex_init(&dev_priv->dpio_lock); 817 + mutex_init(&dev_priv->sb_lock); 818 818 mutex_init(&dev_priv->modeset_restore_lock); 819 819 mutex_init(&dev_priv->csr_lock); 820 820
+9 -4
drivers/gpu/drm/i915/i915_drv.h
··· 1089 1089 int last_adj; 1090 1090 enum { LOW_POWER, BETWEEN, HIGH_POWER } power; 1091 1091 1092 + spinlock_t client_lock; 1093 + struct list_head clients; 1094 + bool client_boost; 1095 + 1092 1096 bool enabled; 1093 1097 struct delayed_work delayed_resume_work; 1094 - struct list_head clients; 1095 1098 unsigned boosts; 1096 1099 1097 1100 struct intel_rps_client semaphores, mmioflips; ··· 1104 1101 1105 1102 /* 1106 1103 * Protects RPS/RC6 register access and PCU communication. 1107 - * Must be taken after struct_mutex if nested. 1104 + * Must be taken after struct_mutex if nested. Note that 1105 + * this lock may be held for long periods of time when 1106 + * talking to hw - so only take it when talking to hw! 1108 1107 */ 1109 1108 struct mutex hw_lock; 1110 1109 }; ··· 1666 1661 /* To control wakeup latency, e.g. for irq-driven dp aux transfers. */ 1667 1662 struct pm_qos_request pm_qos; 1668 1663 1669 - /* DPIO indirect register protection */ 1670 - struct mutex dpio_lock; 1664 + /* Sideband mailbox protection */ 1665 + struct mutex sb_lock; 1671 1666 1672 1667 /** Cached value of IMR to avoid reads in updating the bitfield */ 1673 1668 union {
+2 -2
drivers/gpu/drm/i915/i915_gem.c
··· 5223 5223 spin_unlock(&file_priv->mm.lock); 5224 5224 5225 5225 if (!list_empty(&file_priv->rps.link)) { 5226 - mutex_lock(&to_i915(dev)->rps.hw_lock); 5226 + spin_lock(&to_i915(dev)->rps.client_lock); 5227 5227 list_del(&file_priv->rps.link); 5228 - mutex_unlock(&to_i915(dev)->rps.hw_lock); 5228 + spin_unlock(&to_i915(dev)->rps.client_lock); 5229 5229 } 5230 5230 } 5231 5231
+7
drivers/gpu/drm/i915/i915_gem_gtt.c
··· 952 952 953 953 ppgtt->base.start = 0; 954 954 ppgtt->base.total = 1ULL << 32; 955 + if (IS_ENABLED(CONFIG_X86_32)) 956 + /* While we have a proliferation of size_t variables 957 + * we cannot represent the full ppgtt size on 32bit, 958 + * so limit it to the same size as the GGTT (currently 959 + * 2GiB). 960 + */ 961 + ppgtt->base.total = to_i915(ppgtt->base.dev)->gtt.base.total; 955 962 ppgtt->base.cleanup = gen8_ppgtt_cleanup; 956 963 ppgtt->base.allocate_va_range = gen8_alloc_va_range; 957 964 ppgtt->base.insert_entries = gen8_ppgtt_insert_entries;
+13 -6
drivers/gpu/drm/i915/i915_irq.c
··· 1086 1086 { 1087 1087 struct drm_i915_private *dev_priv = 1088 1088 container_of(work, struct drm_i915_private, rps.work); 1089 + bool client_boost; 1090 + int new_delay, adj, min, max; 1089 1091 u32 pm_iir; 1090 - int new_delay, adj; 1091 1092 1092 1093 spin_lock_irq(&dev_priv->irq_lock); 1093 1094 /* Speed up work cancelation during disabling rps interrupts. */ ··· 1100 1099 dev_priv->rps.pm_iir = 0; 1101 1100 /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ 1102 1101 gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); 1102 + client_boost = dev_priv->rps.client_boost; 1103 + dev_priv->rps.client_boost = false; 1103 1104 spin_unlock_irq(&dev_priv->irq_lock); 1104 1105 1105 1106 /* Make sure we didn't queue anything we're not going to process. */ 1106 1107 WARN_ON(pm_iir & ~dev_priv->pm_rps_events); 1107 1108 1108 - if ((pm_iir & dev_priv->pm_rps_events) == 0) 1109 + if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost) 1109 1110 return; 1110 1111 1111 1112 mutex_lock(&dev_priv->rps.hw_lock); ··· 1116 1113 1117 1114 adj = dev_priv->rps.last_adj; 1118 1115 new_delay = dev_priv->rps.cur_freq; 1119 - if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) { 1116 + min = dev_priv->rps.min_freq_softlimit; 1117 + max = dev_priv->rps.max_freq_softlimit; 1118 + 1119 + if (client_boost) { 1120 + new_delay = dev_priv->rps.max_freq_softlimit; 1121 + adj = 0; 1122 + } else if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) { 1120 1123 if (adj > 0) 1121 1124 adj *= 2; 1122 1125 else /* CHV needs even encode values */ ··· 1158 1149 * interrupt 1159 1150 */ 1160 1151 new_delay += adj; 1161 - new_delay = clamp_t(int, new_delay, 1162 - dev_priv->rps.min_freq_softlimit, 1163 - dev_priv->rps.max_freq_softlimit); 1152 + new_delay = clamp_t(int, new_delay, min, max); 1164 1153 1165 1154 intel_set_rps(dev_priv->dev, new_delay); 1166 1155
+4 -4
drivers/gpu/drm/i915/i915_reg.h
··· 595 595 PUNIT_POWER_WELL_DPIO_RX0 = 10, 596 596 PUNIT_POWER_WELL_DPIO_RX1 = 11, 597 597 PUNIT_POWER_WELL_DPIO_CMN_D = 12, 598 - /* FIXME: guesswork below */ 599 - PUNIT_POWER_WELL_DPIO_TX_D_LANES_01 = 13, 600 - PUNIT_POWER_WELL_DPIO_TX_D_LANES_23 = 14, 601 - PUNIT_POWER_WELL_DPIO_RX2 = 15, 602 598 603 599 PUNIT_POWER_WELL_NUM, 604 600 }; ··· 2141 2145 #define DPIO_PHY_STATUS (VLV_DISPLAY_BASE + 0x6240) 2142 2146 #define DPLL_PORTD_READY_MASK (0xf) 2143 2147 #define DISPLAY_PHY_CONTROL (VLV_DISPLAY_BASE + 0x60100) 2148 + #define PHY_LDO_DELAY_0NS 0x0 2149 + #define PHY_LDO_DELAY_200NS 0x1 2150 + #define PHY_LDO_DELAY_600NS 0x2 2151 + #define PHY_LDO_SEQ_DELAY(delay, phy) ((delay) << (2*(phy)+23)) 2144 2152 #define PHY_CH_SU_PSR 0x1 2145 2153 #define PHY_CH_DEEP_PSR 0x7 2146 2154 #define PHY_CH_POWER_MODE(mode, phy, ch) ((mode) << (6*(phy)+3*(ch)+2))
+40 -43
drivers/gpu/drm/i915/intel_display.c
··· 1140 1140 u32 val; 1141 1141 bool cur_state; 1142 1142 1143 - mutex_lock(&dev_priv->dpio_lock); 1143 + mutex_lock(&dev_priv->sb_lock); 1144 1144 val = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL); 1145 - mutex_unlock(&dev_priv->dpio_lock); 1145 + mutex_unlock(&dev_priv->sb_lock); 1146 1146 1147 1147 cur_state = val & DSI_PLL_VCO_EN; 1148 1148 I915_STATE_WARN(cur_state != state, ··· 1661 1661 1662 1662 BUG_ON(!IS_CHERRYVIEW(dev_priv->dev)); 1663 1663 1664 - mutex_lock(&dev_priv->dpio_lock); 1664 + mutex_lock(&dev_priv->sb_lock); 1665 1665 1666 1666 /* Enable back the 10bit clock to display controller */ 1667 1667 tmp = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)); 1668 1668 tmp |= DPIO_DCLKP_EN; 1669 1669 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), tmp); 1670 + 1671 + mutex_unlock(&dev_priv->sb_lock); 1670 1672 1671 1673 /* 1672 1674 * Need to wait > 100ns between dclkp clock enable bit and PLL enable. ··· 1685 1683 /* not sure when this should be written */ 1686 1684 I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md); 1687 1685 POSTING_READ(DPLL_MD(pipe)); 1688 - 1689 - mutex_unlock(&dev_priv->dpio_lock); 1690 1686 } 1691 1687 1692 1688 static int intel_num_dvo_pipes(struct drm_device *dev) ··· 1826 1826 I915_WRITE(DPLL(pipe), val); 1827 1827 POSTING_READ(DPLL(pipe)); 1828 1828 1829 - mutex_lock(&dev_priv->dpio_lock); 1829 + mutex_lock(&dev_priv->sb_lock); 1830 1830 1831 1831 /* Disable 10bit clock to display controller */ 1832 1832 val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)); ··· 1844 1844 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val); 1845 1845 } 1846 1846 1847 - mutex_unlock(&dev_priv->dpio_lock); 1847 + mutex_unlock(&dev_priv->sb_lock); 1848 1848 } 1849 1849 1850 1850 void vlv_wait_port_ready(struct drm_i915_private *dev_priv, ··· 2208 2208 I915_WRITE(reg, val); 2209 2209 if ((val & PIPECONF_ENABLE) == 0) 2210 2210 intel_wait_for_pipe_off(crtc); 2211 - } 2212 - 2213 - /* 2214 - * Plane regs are double buffered, going from enabled->disabled needs a 2215 - * trigger in order to latch. The display address reg provides this. 2216 - */ 2217 - void intel_flush_primary_plane(struct drm_i915_private *dev_priv, 2218 - enum plane plane) 2219 - { 2220 - struct drm_device *dev = dev_priv->dev; 2221 - u32 reg = INTEL_INFO(dev)->gen >= 4 ? DSPSURF(plane) : DSPADDR(plane); 2222 - 2223 - I915_WRITE(reg, I915_READ(reg)); 2224 - POSTING_READ(reg); 2225 2211 } 2226 2212 2227 2213 /** ··· 3939 3953 u32 divsel, phaseinc, auxdiv, phasedir = 0; 3940 3954 u32 temp; 3941 3955 3942 - mutex_lock(&dev_priv->dpio_lock); 3956 + mutex_lock(&dev_priv->sb_lock); 3943 3957 3944 3958 /* It is necessary to ungate the pixclk gate prior to programming 3945 3959 * the divisors, and gate it back when it is done. ··· 4016 4030 4017 4031 I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE); 4018 4032 4019 - mutex_unlock(&dev_priv->dpio_lock); 4033 + mutex_unlock(&dev_priv->sb_lock); 4020 4034 } 4021 4035 4022 4036 static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, ··· 4828 4842 4829 4843 static void intel_crtc_enable_planes(struct drm_crtc *crtc) 4830 4844 { 4845 + struct drm_device *dev = crtc->dev; 4846 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4847 + int pipe = intel_crtc->pipe; 4848 + 4831 4849 intel_enable_primary_hw_plane(crtc->primary, crtc); 4832 4850 intel_enable_sprite_planes(crtc); 4833 4851 intel_crtc_update_cursor(crtc, true); 4834 4852 4835 4853 intel_post_enable_primary(crtc); 4854 + 4855 + /* 4856 + * FIXME: Once we grow proper nuclear flip support out of this we need 4857 + * to compute the mask of flip planes precisely. For the time being 4858 + * consider this a flip to a NULL plane. 4859 + */ 4860 + intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_ALL_MASK(pipe)); 4836 4861 } 4837 4862 4838 4863 static void intel_crtc_disable_planes(struct drm_crtc *crtc) ··· 5739 5742 int hpll_freq, vco_freq[] = { 800, 1600, 2000, 2400 }; 5740 5743 5741 5744 /* Obtain SKU information */ 5742 - mutex_lock(&dev_priv->dpio_lock); 5745 + mutex_lock(&dev_priv->sb_lock); 5743 5746 hpll_freq = vlv_cck_read(dev_priv, CCK_FUSE_REG) & 5744 5747 CCK_FUSE_HPLL_FREQ_MASK; 5745 - mutex_unlock(&dev_priv->dpio_lock); 5748 + mutex_unlock(&dev_priv->sb_lock); 5746 5749 5747 5750 return vco_freq[hpll_freq] * 1000; 5748 5751 } ··· 5791 5794 } 5792 5795 mutex_unlock(&dev_priv->rps.hw_lock); 5793 5796 5797 + mutex_lock(&dev_priv->sb_lock); 5798 + 5794 5799 if (cdclk == 400000) { 5795 5800 u32 divider; 5796 5801 5797 5802 divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1; 5798 5803 5799 - mutex_lock(&dev_priv->dpio_lock); 5800 5804 /* adjust cdclk divider */ 5801 5805 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL); 5802 5806 val &= ~DISPLAY_FREQUENCY_VALUES; ··· 5808 5810 DISPLAY_FREQUENCY_STATUS) == (divider << DISPLAY_FREQUENCY_STATUS_SHIFT), 5809 5811 50)) 5810 5812 DRM_ERROR("timed out waiting for CDclk change\n"); 5811 - mutex_unlock(&dev_priv->dpio_lock); 5812 5813 } 5813 5814 5814 - mutex_lock(&dev_priv->dpio_lock); 5815 5815 /* adjust self-refresh exit latency value */ 5816 5816 val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC); 5817 5817 val &= ~0x7f; ··· 5823 5827 else 5824 5828 val |= 3000 / 250; /* 3.0 usec */ 5825 5829 vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val); 5826 - mutex_unlock(&dev_priv->dpio_lock); 5830 + 5831 + mutex_unlock(&dev_priv->sb_lock); 5827 5832 5828 5833 vlv_update_cdclk(dev); 5829 5834 } ··· 6752 6755 if (dev_priv->hpll_freq == 0) 6753 6756 dev_priv->hpll_freq = valleyview_get_vco(dev_priv); 6754 6757 6755 - mutex_lock(&dev_priv->dpio_lock); 6758 + mutex_lock(&dev_priv->sb_lock); 6756 6759 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL); 6757 - mutex_unlock(&dev_priv->dpio_lock); 6760 + mutex_unlock(&dev_priv->sb_lock); 6758 6761 6759 6762 divider = val & DISPLAY_FREQUENCY_VALUES; 6760 6763 ··· 7096 7099 u32 bestn, bestm1, bestm2, bestp1, bestp2; 7097 7100 u32 coreclk, reg_val; 7098 7101 7099 - mutex_lock(&dev_priv->dpio_lock); 7102 + mutex_lock(&dev_priv->sb_lock); 7100 7103 7101 7104 bestn = pipe_config->dpll.n; 7102 7105 bestm1 = pipe_config->dpll.m1; ··· 7174 7177 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk); 7175 7178 7176 7179 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW11(pipe), 0x87871000); 7177 - mutex_unlock(&dev_priv->dpio_lock); 7180 + mutex_unlock(&dev_priv->sb_lock); 7178 7181 } 7179 7182 7180 7183 static void chv_update_pll(struct intel_crtc *crtc, ··· 7219 7222 I915_WRITE(dpll_reg, 7220 7223 pipe_config->dpll_hw_state.dpll & ~DPLL_VCO_ENABLE); 7221 7224 7222 - mutex_lock(&dev_priv->dpio_lock); 7225 + mutex_lock(&dev_priv->sb_lock); 7223 7226 7224 7227 /* p1 and p2 divider */ 7225 7228 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW13(port), ··· 7292 7295 vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW14(port)) | 7293 7296 DPIO_AFC_RECAL); 7294 7297 7295 - mutex_unlock(&dev_priv->dpio_lock); 7298 + mutex_unlock(&dev_priv->sb_lock); 7296 7299 } 7297 7300 7298 7301 /** ··· 7793 7796 if (!(pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)) 7794 7797 return; 7795 7798 7796 - mutex_lock(&dev_priv->dpio_lock); 7799 + mutex_lock(&dev_priv->sb_lock); 7797 7800 mdiv = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW3(pipe)); 7798 - mutex_unlock(&dev_priv->dpio_lock); 7801 + mutex_unlock(&dev_priv->sb_lock); 7799 7802 7800 7803 clock.m1 = (mdiv >> DPIO_M1DIV_SHIFT) & 7; 7801 7804 clock.m2 = mdiv & DPIO_M2DIV_MASK; ··· 7889 7892 u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2; 7890 7893 int refclk = 100000; 7891 7894 7892 - mutex_lock(&dev_priv->dpio_lock); 7895 + mutex_lock(&dev_priv->sb_lock); 7893 7896 cmn_dw13 = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW13(port)); 7894 7897 pll_dw0 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW0(port)); 7895 7898 pll_dw1 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW1(port)); 7896 7899 pll_dw2 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW2(port)); 7897 - mutex_unlock(&dev_priv->dpio_lock); 7900 + mutex_unlock(&dev_priv->sb_lock); 7898 7901 7899 7902 clock.m1 = (pll_dw1 & 0x7) == DPIO_CHV_M1_DIV_BY_2 ? 2 : 0; 7900 7903 clock.m2 = ((pll_dw0 & 0xff) << 22) | (pll_dw2 & 0x3fffff); ··· 8260 8263 with_fdi, "LP PCH doesn't have FDI\n")) 8261 8264 with_fdi = false; 8262 8265 8263 - mutex_lock(&dev_priv->dpio_lock); 8266 + mutex_lock(&dev_priv->sb_lock); 8264 8267 8265 8268 tmp = intel_sbi_read(dev_priv, SBI_SSCCTL, SBI_ICLK); 8266 8269 tmp &= ~SBI_SSCCTL_DISABLE; ··· 8286 8289 tmp |= SBI_GEN0_CFG_BUFFENABLE_DISABLE; 8287 8290 intel_sbi_write(dev_priv, reg, tmp, SBI_ICLK); 8288 8291 8289 - mutex_unlock(&dev_priv->dpio_lock); 8292 + mutex_unlock(&dev_priv->sb_lock); 8290 8293 } 8291 8294 8292 8295 /* Sequence to disable CLKOUT_DP */ ··· 8295 8298 struct drm_i915_private *dev_priv = dev->dev_private; 8296 8299 uint32_t reg, tmp; 8297 8300 8298 - mutex_lock(&dev_priv->dpio_lock); 8301 + mutex_lock(&dev_priv->sb_lock); 8299 8302 8300 8303 reg = (dev_priv->pch_id == INTEL_PCH_LPT_LP_DEVICE_ID_TYPE) ? 8301 8304 SBI_GEN0 : SBI_DBUFF0; ··· 8314 8317 intel_sbi_write(dev_priv, SBI_SSCCTL, tmp, SBI_ICLK); 8315 8318 } 8316 8319 8317 - mutex_unlock(&dev_priv->dpio_lock); 8320 + mutex_unlock(&dev_priv->sb_lock); 8318 8321 } 8319 8322 8320 8323 static void lpt_init_pch_refclk(struct drm_device *dev)
+59 -35
drivers/gpu/drm/i915/intel_dp.c
··· 2355 2355 2356 2356 intel_dp_link_down(intel_dp); 2357 2357 2358 - mutex_lock(&dev_priv->dpio_lock); 2358 + mutex_lock(&dev_priv->sb_lock); 2359 2359 2360 2360 /* Propagate soft reset to data lane reset */ 2361 2361 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch)); ··· 2374 2374 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET); 2375 2375 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val); 2376 2376 2377 - mutex_unlock(&dev_priv->dpio_lock); 2377 + mutex_unlock(&dev_priv->sb_lock); 2378 2378 } 2379 2379 2380 2380 static void ··· 2671 2671 int pipe = intel_crtc->pipe; 2672 2672 u32 val; 2673 2673 2674 - mutex_lock(&dev_priv->dpio_lock); 2674 + mutex_lock(&dev_priv->sb_lock); 2675 2675 2676 2676 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port)); 2677 2677 val = 0; ··· 2684 2684 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018); 2685 2685 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888); 2686 2686 2687 - mutex_unlock(&dev_priv->dpio_lock); 2687 + mutex_unlock(&dev_priv->sb_lock); 2688 2688 2689 2689 intel_enable_dp(encoder); 2690 2690 } ··· 2702 2702 intel_dp_prepare(encoder); 2703 2703 2704 2704 /* Program Tx lane resets to default */ 2705 - mutex_lock(&dev_priv->dpio_lock); 2705 + mutex_lock(&dev_priv->sb_lock); 2706 2706 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 2707 2707 DPIO_PCS_TX_LANE2_RESET | 2708 2708 DPIO_PCS_TX_LANE1_RESET); ··· 2716 2716 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00); 2717 2717 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500); 2718 2718 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000); 2719 - mutex_unlock(&dev_priv->dpio_lock); 2719 + mutex_unlock(&dev_priv->sb_lock); 2720 2720 } 2721 2721 2722 2722 static void chv_pre_enable_dp(struct intel_encoder *encoder) ··· 2732 2732 int data, i, stagger; 2733 2733 u32 val; 2734 2734 2735 - mutex_lock(&dev_priv->dpio_lock); 2735 + mutex_lock(&dev_priv->sb_lock); 2736 2736 2737 2737 /* allow hardware to manage TX FIFO reset source */ 2738 2738 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch)); ··· 2802 2802 DPIO_TX1_STAGGER_MULT(7) | 2803 2803 DPIO_TX2_STAGGER_MULT(5)); 2804 2804 2805 - mutex_unlock(&dev_priv->dpio_lock); 2805 + mutex_unlock(&dev_priv->sb_lock); 2806 2806 2807 2807 intel_enable_dp(encoder); 2808 2808 } ··· 2820 2820 2821 2821 intel_dp_prepare(encoder); 2822 2822 2823 - mutex_lock(&dev_priv->dpio_lock); 2823 + mutex_lock(&dev_priv->sb_lock); 2824 2824 2825 2825 /* program left/right clock distribution */ 2826 2826 if (pipe != PIPE_B) { ··· 2870 2870 val |= CHV_CMN_USEDCLKCHANNEL; 2871 2871 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val); 2872 2872 2873 - mutex_unlock(&dev_priv->dpio_lock); 2873 + mutex_unlock(&dev_priv->sb_lock); 2874 2874 } 2875 2875 2876 2876 /* ··· 3095 3095 return 0; 3096 3096 } 3097 3097 3098 - mutex_lock(&dev_priv->dpio_lock); 3098 + mutex_lock(&dev_priv->sb_lock); 3099 3099 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000); 3100 3100 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), demph_reg_value); 3101 3101 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port), ··· 3104 3104 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000); 3105 3105 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), preemph_reg_value); 3106 3106 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x80000000); 3107 - mutex_unlock(&dev_priv->dpio_lock); 3107 + mutex_unlock(&dev_priv->sb_lock); 3108 3108 3109 3109 return 0; 3110 3110 } ··· 3191 3191 return 0; 3192 3192 } 3193 3193 3194 - mutex_lock(&dev_priv->dpio_lock); 3194 + mutex_lock(&dev_priv->sb_lock); 3195 3195 3196 3196 /* Clear calc init */ 3197 3197 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch)); ··· 3278 3278 val |= DPIO_LRC_BYPASS; 3279 3279 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, val); 3280 3280 3281 - mutex_unlock(&dev_priv->dpio_lock); 3281 + mutex_unlock(&dev_priv->sb_lock); 3282 3282 3283 3283 return 0; 3284 3284 } ··· 4041 4041 u8 buf; 4042 4042 int test_crc_count; 4043 4043 int attempts = 6; 4044 + int ret = 0; 4044 4045 4045 - if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) 4046 - return -EIO; 4046 + hsw_disable_ips(intel_crtc); 4047 4047 4048 - if (!(buf & DP_TEST_CRC_SUPPORTED)) 4049 - return -ENOTTY; 4048 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) { 4049 + ret = -EIO; 4050 + goto out; 4051 + } 4050 4052 4051 - if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) 4052 - return -EIO; 4053 + if (!(buf & DP_TEST_CRC_SUPPORTED)) { 4054 + ret = -ENOTTY; 4055 + goto out; 4056 + } 4057 + 4058 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) { 4059 + ret = -EIO; 4060 + goto out; 4061 + } 4053 4062 4054 4063 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 4055 - buf | DP_TEST_SINK_START) < 0) 4056 - return -EIO; 4064 + buf | DP_TEST_SINK_START) < 0) { 4065 + ret = -EIO; 4066 + goto out; 4067 + } 4057 4068 4058 - if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) 4059 - return -EIO; 4069 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) { 4070 + ret = -EIO; 4071 + goto out; 4072 + } 4073 + 4060 4074 test_crc_count = buf & DP_TEST_COUNT_MASK; 4061 4075 4062 4076 do { 4063 4077 if (drm_dp_dpcd_readb(&intel_dp->aux, 4064 - DP_TEST_SINK_MISC, &buf) < 0) 4065 - return -EIO; 4078 + DP_TEST_SINK_MISC, &buf) < 0) { 4079 + ret = -EIO; 4080 + goto out; 4081 + } 4066 4082 intel_wait_for_vblank(dev, intel_crtc->pipe); 4067 4083 } while (--attempts && (buf & DP_TEST_COUNT_MASK) == test_crc_count); 4068 4084 4069 4085 if (attempts == 0) { 4070 4086 DRM_DEBUG_KMS("Panel is unable to calculate CRC after 6 vblanks\n"); 4071 - return -ETIMEDOUT; 4087 + ret = -ETIMEDOUT; 4088 + goto out; 4072 4089 } 4073 4090 4074 - if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0) 4075 - return -EIO; 4091 + if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0) { 4092 + ret = -EIO; 4093 + goto out; 4094 + } 4076 4095 4077 - if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) 4078 - return -EIO; 4096 + if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) { 4097 + ret = -EIO; 4098 + goto out; 4099 + } 4079 4100 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 4080 - buf & ~DP_TEST_SINK_START) < 0) 4081 - return -EIO; 4082 - 4083 - return 0; 4101 + buf & ~DP_TEST_SINK_START) < 0) { 4102 + ret = -EIO; 4103 + goto out; 4104 + } 4105 + out: 4106 + hsw_enable_ips(intel_crtc); 4107 + return ret; 4084 4108 } 4085 4109 4086 4110 static bool
-2
drivers/gpu/drm/i915/intel_drv.h
··· 1383 1383 1384 1384 /* intel_sprite.c */ 1385 1385 int intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane); 1386 - void intel_flush_primary_plane(struct drm_i915_private *dev_priv, 1387 - enum plane plane); 1388 1386 int intel_plane_restore(struct drm_plane *plane); 1389 1387 int intel_sprite_set_colorkey(struct drm_device *dev, void *data, 1390 1388 struct drm_file *file_priv);
+4 -4
drivers/gpu/drm/i915/intel_dsi.c
··· 239 239 240 240 static void band_gap_reset(struct drm_i915_private *dev_priv) 241 241 { 242 - mutex_lock(&dev_priv->dpio_lock); 242 + mutex_lock(&dev_priv->sb_lock); 243 243 244 244 vlv_flisdsi_write(dev_priv, 0x08, 0x0001); 245 245 vlv_flisdsi_write(dev_priv, 0x0F, 0x0005); ··· 248 248 vlv_flisdsi_write(dev_priv, 0x0F, 0x0000); 249 249 vlv_flisdsi_write(dev_priv, 0x08, 0x0000); 250 250 251 - mutex_unlock(&dev_priv->dpio_lock); 251 + mutex_unlock(&dev_priv->sb_lock); 252 252 } 253 253 254 254 static inline bool is_vid_mode(struct intel_dsi *intel_dsi) ··· 346 346 347 347 DRM_DEBUG_KMS("\n"); 348 348 349 - mutex_lock(&dev_priv->dpio_lock); 349 + mutex_lock(&dev_priv->sb_lock); 350 350 /* program rcomp for compliance, reduce from 50 ohms to 45 ohms 351 351 * needed everytime after power gate */ 352 352 vlv_flisdsi_write(dev_priv, 0x04, 0x0004); 353 - mutex_unlock(&dev_priv->dpio_lock); 353 + mutex_unlock(&dev_priv->sb_lock); 354 354 355 355 /* bandgap reset is needed after everytime we do power gate */ 356 356 band_gap_reset(dev_priv);
+2 -2
drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
··· 212 212 function = gtable[gpio].function_reg; 213 213 pad = gtable[gpio].pad_reg; 214 214 215 - mutex_lock(&dev_priv->dpio_lock); 215 + mutex_lock(&dev_priv->sb_lock); 216 216 if (!gtable[gpio].init) { 217 217 /* program the function */ 218 218 /* FIXME: remove constant below */ ··· 224 224 225 225 /* pull up/down */ 226 226 vlv_gpio_nc_write(dev_priv, pad, val); 227 - mutex_unlock(&dev_priv->dpio_lock); 227 + mutex_unlock(&dev_priv->sb_lock); 228 228 229 229 return data; 230 230 }
+7 -7
drivers/gpu/drm/i915/intel_dsi_pll.c
··· 244 244 245 245 DRM_DEBUG_KMS("\n"); 246 246 247 - mutex_lock(&dev_priv->dpio_lock); 247 + mutex_lock(&dev_priv->sb_lock); 248 248 249 249 vlv_configure_dsi_pll(encoder); 250 250 ··· 258 258 if (wait_for(vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL) & 259 259 DSI_PLL_LOCK, 20)) { 260 260 261 - mutex_unlock(&dev_priv->dpio_lock); 261 + mutex_unlock(&dev_priv->sb_lock); 262 262 DRM_ERROR("DSI PLL lock failed\n"); 263 263 return; 264 264 } 265 - mutex_unlock(&dev_priv->dpio_lock); 265 + mutex_unlock(&dev_priv->sb_lock); 266 266 267 267 DRM_DEBUG_KMS("DSI PLL locked\n"); 268 268 } ··· 274 274 275 275 DRM_DEBUG_KMS("\n"); 276 276 277 - mutex_lock(&dev_priv->dpio_lock); 277 + mutex_lock(&dev_priv->sb_lock); 278 278 279 279 tmp = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL); 280 280 tmp &= ~DSI_PLL_VCO_EN; 281 281 tmp |= DSI_PLL_LDO_GATE; 282 282 vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, tmp); 283 283 284 - mutex_unlock(&dev_priv->dpio_lock); 284 + mutex_unlock(&dev_priv->sb_lock); 285 285 } 286 286 287 287 static void assert_bpp_mismatch(int pixel_format, int pipe_bpp) ··· 319 319 320 320 DRM_DEBUG_KMS("\n"); 321 321 322 - mutex_lock(&dev_priv->dpio_lock); 322 + mutex_lock(&dev_priv->sb_lock); 323 323 pll_ctl = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL); 324 324 pll_div = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_DIVIDER); 325 - mutex_unlock(&dev_priv->dpio_lock); 325 + mutex_unlock(&dev_priv->sb_lock); 326 326 327 327 /* mask out other bits and extract the P1 divisor */ 328 328 pll_ctl &= DSI_PLL_P1_POST_DIV_MASK;
+27 -1
drivers/gpu/drm/i915/intel_fbdev.c
··· 96 96 return ret; 97 97 } 98 98 99 + static int intel_fbdev_pan_display(struct fb_var_screeninfo *var, 100 + struct fb_info *info) 101 + { 102 + struct drm_fb_helper *fb_helper = info->par; 103 + struct intel_fbdev *ifbdev = 104 + container_of(fb_helper, struct intel_fbdev, helper); 105 + 106 + int ret; 107 + ret = drm_fb_helper_pan_display(var, info); 108 + 109 + if (ret == 0) { 110 + /* 111 + * FIXME: fbdev presumes that all callbacks also work from 112 + * atomic contexts and relies on that for emergency oops 113 + * printing. KMS totally doesn't do that and the locking here is 114 + * by far not the only place this goes wrong. Ignore this for 115 + * now until we solve this for real. 116 + */ 117 + mutex_lock(&fb_helper->dev->struct_mutex); 118 + intel_fb_obj_invalidate(ifbdev->fb->obj, NULL, ORIGIN_GTT); 119 + mutex_unlock(&fb_helper->dev->struct_mutex); 120 + } 121 + 122 + return ret; 123 + } 124 + 99 125 static struct fb_ops intelfb_ops = { 100 126 .owner = THIS_MODULE, 101 127 .fb_check_var = drm_fb_helper_check_var, ··· 129 103 .fb_fillrect = cfb_fillrect, 130 104 .fb_copyarea = cfb_copyarea, 131 105 .fb_imageblit = cfb_imageblit, 132 - .fb_pan_display = drm_fb_helper_pan_display, 106 + .fb_pan_display = intel_fbdev_pan_display, 133 107 .fb_blank = intel_fbdev_blank, 134 108 .fb_setcmap = drm_fb_helper_setcmap, 135 109 .fb_debug_enter = drm_fb_helper_debug_enter,
+14 -13
drivers/gpu/drm/i915/intel_hdmi.c
··· 1036 1036 */ 1037 1037 if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink && 1038 1038 clock_12bpc <= portclock_limit && 1039 - hdmi_12bpc_possible(pipe_config)) { 1039 + hdmi_12bpc_possible(pipe_config) && 1040 + 0 /* FIXME 12bpc support totally broken */) { 1040 1041 DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n"); 1041 1042 desired_bpp = 12*3; 1042 1043 ··· 1294 1293 u32 val; 1295 1294 1296 1295 /* Enable clock channels for this port */ 1297 - mutex_lock(&dev_priv->dpio_lock); 1296 + mutex_lock(&dev_priv->sb_lock); 1298 1297 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port)); 1299 1298 val = 0; 1300 1299 if (pipe) ··· 1317 1316 /* Program lane clock */ 1318 1317 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018); 1319 1318 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888); 1320 - mutex_unlock(&dev_priv->dpio_lock); 1319 + mutex_unlock(&dev_priv->sb_lock); 1321 1320 1322 1321 intel_hdmi->set_infoframes(&encoder->base, 1323 1322 intel_crtc->config->has_hdmi_sink, ··· 1341 1340 intel_hdmi_prepare(encoder); 1342 1341 1343 1342 /* Program Tx lane resets to default */ 1344 - mutex_lock(&dev_priv->dpio_lock); 1343 + mutex_lock(&dev_priv->sb_lock); 1345 1344 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 1346 1345 DPIO_PCS_TX_LANE2_RESET | 1347 1346 DPIO_PCS_TX_LANE1_RESET); ··· 1358 1357 1359 1358 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000); 1360 1359 vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN); 1361 - mutex_unlock(&dev_priv->dpio_lock); 1360 + mutex_unlock(&dev_priv->sb_lock); 1362 1361 } 1363 1362 1364 1363 static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder) ··· 1374 1373 1375 1374 intel_hdmi_prepare(encoder); 1376 1375 1377 - mutex_lock(&dev_priv->dpio_lock); 1376 + mutex_lock(&dev_priv->sb_lock); 1378 1377 1379 1378 /* program left/right clock distribution */ 1380 1379 if (pipe != PIPE_B) { ··· 1424 1423 val |= CHV_CMN_USEDCLKCHANNEL; 1425 1424 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val); 1426 1425 1427 - mutex_unlock(&dev_priv->dpio_lock); 1426 + mutex_unlock(&dev_priv->sb_lock); 1428 1427 } 1429 1428 1430 1429 static void vlv_hdmi_post_disable(struct intel_encoder *encoder) ··· 1437 1436 int pipe = intel_crtc->pipe; 1438 1437 1439 1438 /* Reset lanes to avoid HDMI flicker (VLV w/a) */ 1440 - mutex_lock(&dev_priv->dpio_lock); 1439 + mutex_lock(&dev_priv->sb_lock); 1441 1440 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000); 1442 1441 vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060); 1443 - mutex_unlock(&dev_priv->dpio_lock); 1442 + mutex_unlock(&dev_priv->sb_lock); 1444 1443 } 1445 1444 1446 1445 static void chv_hdmi_post_disable(struct intel_encoder *encoder) ··· 1454 1453 enum pipe pipe = intel_crtc->pipe; 1455 1454 u32 val; 1456 1455 1457 - mutex_lock(&dev_priv->dpio_lock); 1456 + mutex_lock(&dev_priv->sb_lock); 1458 1457 1459 1458 /* Propagate soft reset to data lane reset */ 1460 1459 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch)); ··· 1473 1472 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET); 1474 1473 vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val); 1475 1474 1476 - mutex_unlock(&dev_priv->dpio_lock); 1475 + mutex_unlock(&dev_priv->sb_lock); 1477 1476 } 1478 1477 1479 1478 static void chv_hdmi_pre_enable(struct intel_encoder *encoder) ··· 1491 1490 int data, i, stagger; 1492 1491 u32 val; 1493 1492 1494 - mutex_lock(&dev_priv->dpio_lock); 1493 + mutex_lock(&dev_priv->sb_lock); 1495 1494 1496 1495 /* allow hardware to manage TX FIFO reset source */ 1497 1496 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch)); ··· 1634 1633 val |= DPIO_LRC_BYPASS; 1635 1634 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, val); 1636 1635 1637 - mutex_unlock(&dev_priv->dpio_lock); 1636 + mutex_unlock(&dev_priv->sb_lock); 1638 1637 1639 1638 intel_hdmi->set_infoframes(&encoder->base, 1640 1639 intel_crtc->config->has_hdmi_sink,
+1 -1
drivers/gpu/drm/i915/intel_lrc.c
··· 427 427 * WaIdleLiteRestore: make sure we never cause a lite 428 428 * restore with HEAD==TAIL 429 429 */ 430 - if (req0 && req0->elsp_submitted) { 430 + if (req0->elsp_submitted) { 431 431 /* 432 432 * Apply the wa NOOPS to prevent ring:HEAD == req:TAIL 433 433 * as we resubmit the request. See gen8_emit_request()
+26 -15
drivers/gpu/drm/i915/intel_pm.c
··· 4143 4143 dev_priv->rps.last_adj = 0; 4144 4144 I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); 4145 4145 } 4146 + mutex_unlock(&dev_priv->rps.hw_lock); 4146 4147 4148 + spin_lock(&dev_priv->rps.client_lock); 4147 4149 while (!list_empty(&dev_priv->rps.clients)) 4148 4150 list_del_init(dev_priv->rps.clients.next); 4149 - mutex_unlock(&dev_priv->rps.hw_lock); 4151 + spin_unlock(&dev_priv->rps.client_lock); 4150 4152 } 4151 4153 4152 4154 void gen6_rps_boost(struct drm_i915_private *dev_priv, 4153 4155 struct intel_rps_client *rps, 4154 4156 unsigned long submitted) 4155 4157 { 4156 - u32 val; 4158 + /* This is intentionally racy! We peek at the state here, then 4159 + * validate inside the RPS worker. 4160 + */ 4161 + if (!(dev_priv->mm.busy && 4162 + dev_priv->rps.enabled && 4163 + dev_priv->rps.cur_freq < dev_priv->rps.max_freq_softlimit)) 4164 + return; 4157 4165 4158 4166 /* Force a RPS boost (and don't count it against the client) if 4159 4167 * the GPU is severely congested. ··· 4169 4161 if (rps && time_after(jiffies, submitted + DRM_I915_THROTTLE_JIFFIES)) 4170 4162 rps = NULL; 4171 4163 4172 - mutex_lock(&dev_priv->rps.hw_lock); 4173 - val = dev_priv->rps.max_freq_softlimit; 4174 - if (dev_priv->rps.enabled && 4175 - dev_priv->mm.busy && 4176 - dev_priv->rps.cur_freq < val && 4177 - (rps == NULL || list_empty(&rps->link))) { 4178 - intel_set_rps(dev_priv->dev, val); 4179 - dev_priv->rps.last_adj = 0; 4164 + spin_lock(&dev_priv->rps.client_lock); 4165 + if (rps == NULL || list_empty(&rps->link)) { 4166 + spin_lock_irq(&dev_priv->irq_lock); 4167 + if (dev_priv->rps.interrupts_enabled) { 4168 + dev_priv->rps.client_boost = true; 4169 + queue_work(dev_priv->wq, &dev_priv->rps.work); 4170 + } 4171 + spin_unlock_irq(&dev_priv->irq_lock); 4180 4172 4181 4173 if (rps != NULL) { 4182 4174 list_add(&rps->link, &dev_priv->rps.clients); ··· 4184 4176 } else 4185 4177 dev_priv->rps.boosts++; 4186 4178 } 4187 - mutex_unlock(&dev_priv->rps.hw_lock); 4179 + spin_unlock(&dev_priv->rps.client_lock); 4188 4180 } 4189 4181 4190 4182 void intel_set_rps(struct drm_device *dev, u8 val) ··· 4964 4956 4965 4957 mutex_lock(&dev_priv->rps.hw_lock); 4966 4958 4967 - mutex_lock(&dev_priv->dpio_lock); 4959 + mutex_lock(&dev_priv->sb_lock); 4968 4960 val = vlv_cck_read(dev_priv, CCK_FUSE_REG); 4969 - mutex_unlock(&dev_priv->dpio_lock); 4961 + mutex_unlock(&dev_priv->sb_lock); 4970 4962 4971 4963 switch ((val >> 2) & 0x7) { 4972 4964 case 0: ··· 5886 5878 static void g4x_disable_trickle_feed(struct drm_device *dev) 5887 5879 { 5888 5880 struct drm_i915_private *dev_priv = dev->dev_private; 5889 - int pipe; 5881 + enum pipe pipe; 5890 5882 5891 5883 for_each_pipe(dev_priv, pipe) { 5892 5884 I915_WRITE(DSPCNTR(pipe), 5893 5885 I915_READ(DSPCNTR(pipe)) | 5894 5886 DISPPLANE_TRICKLE_FEED_DISABLE); 5895 - intel_flush_primary_plane(dev_priv, pipe); 5887 + 5888 + I915_WRITE(DSPSURF(pipe), I915_READ(DSPSURF(pipe))); 5889 + POSTING_READ(DSPSURF(pipe)); 5896 5890 } 5897 5891 } 5898 5892 ··· 6923 6913 struct drm_i915_private *dev_priv = dev->dev_private; 6924 6914 6925 6915 mutex_init(&dev_priv->rps.hw_lock); 6916 + spin_lock_init(&dev_priv->rps.client_lock); 6926 6917 6927 6918 INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, 6928 6919 intel_gen6_powersave_work);
+6 -94
drivers/gpu/drm/i915/intel_runtime_pm.c
··· 1233 1233 BIT(POWER_DOMAIN_AUX_C) | \ 1234 1234 BIT(POWER_DOMAIN_INIT)) 1235 1235 1236 - #define CHV_PIPE_A_POWER_DOMAINS ( \ 1237 - BIT(POWER_DOMAIN_PIPE_A) | \ 1238 - BIT(POWER_DOMAIN_INIT)) 1239 - 1240 - #define CHV_PIPE_B_POWER_DOMAINS ( \ 1241 - BIT(POWER_DOMAIN_PIPE_B) | \ 1242 - BIT(POWER_DOMAIN_INIT)) 1243 - 1244 - #define CHV_PIPE_C_POWER_DOMAINS ( \ 1245 - BIT(POWER_DOMAIN_PIPE_C) | \ 1246 - BIT(POWER_DOMAIN_INIT)) 1247 - 1248 1236 #define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \ 1249 1237 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 1250 1238 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ ··· 1244 1256 1245 1257 #define CHV_DPIO_CMN_D_POWER_DOMAINS ( \ 1246 1258 BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 1247 - BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 1248 - BIT(POWER_DOMAIN_AUX_D) | \ 1249 - BIT(POWER_DOMAIN_INIT)) 1250 - 1251 - #define CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS ( \ 1252 - BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 1253 - BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 1254 - BIT(POWER_DOMAIN_AUX_D) | \ 1255 - BIT(POWER_DOMAIN_INIT)) 1256 - 1257 - #define CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS ( \ 1258 1259 BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ 1259 1260 BIT(POWER_DOMAIN_AUX_D) | \ 1260 1261 BIT(POWER_DOMAIN_INIT)) ··· 1405 1428 .domains = VLV_ALWAYS_ON_POWER_DOMAINS, 1406 1429 .ops = &i9xx_always_on_power_well_ops, 1407 1430 }, 1408 - #if 0 1409 1431 { 1410 1432 .name = "display", 1411 - .domains = VLV_DISPLAY_POWER_DOMAINS, 1412 - .data = PUNIT_POWER_WELL_DISP2D, 1413 - .ops = &vlv_display_power_well_ops, 1414 - }, 1415 - #endif 1416 - { 1417 - .name = "pipe-a", 1418 1433 /* 1419 - * FIXME: pipe A power well seems to be the new disp2d well. 1420 - * At least all registers seem to be housed there. Figure 1421 - * out if this a a temporary situation in pre-production 1422 - * hardware or a permanent state of affairs. 1434 + * Pipe A power well is the new disp2d well. Pipe B and C 1435 + * power wells don't actually exist. Pipe A power well is 1436 + * required for any pipe to work. 1423 1437 */ 1424 - .domains = CHV_PIPE_A_POWER_DOMAINS | VLV_DISPLAY_POWER_DOMAINS, 1438 + .domains = VLV_DISPLAY_POWER_DOMAINS, 1425 1439 .data = PIPE_A, 1426 1440 .ops = &chv_pipe_power_well_ops, 1427 1441 }, 1428 - #if 0 1429 - { 1430 - .name = "pipe-b", 1431 - .domains = CHV_PIPE_B_POWER_DOMAINS, 1432 - .data = PIPE_B, 1433 - .ops = &chv_pipe_power_well_ops, 1434 - }, 1435 - { 1436 - .name = "pipe-c", 1437 - .domains = CHV_PIPE_C_POWER_DOMAINS, 1438 - .data = PIPE_C, 1439 - .ops = &chv_pipe_power_well_ops, 1440 - }, 1441 - #endif 1442 1442 { 1443 1443 .name = "dpio-common-bc", 1444 1444 .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS, ··· 1428 1474 .data = PUNIT_POWER_WELL_DPIO_CMN_D, 1429 1475 .ops = &chv_dpio_cmn_power_well_ops, 1430 1476 }, 1431 - #if 0 1432 - { 1433 - .name = "dpio-tx-b-01", 1434 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 1435 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS, 1436 - .ops = &vlv_dpio_power_well_ops, 1437 - .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01, 1438 - }, 1439 - { 1440 - .name = "dpio-tx-b-23", 1441 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 1442 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS, 1443 - .ops = &vlv_dpio_power_well_ops, 1444 - .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23, 1445 - }, 1446 - { 1447 - .name = "dpio-tx-c-01", 1448 - .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1449 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1450 - .ops = &vlv_dpio_power_well_ops, 1451 - .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01, 1452 - }, 1453 - { 1454 - .name = "dpio-tx-c-23", 1455 - .domains = VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1456 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1457 - .ops = &vlv_dpio_power_well_ops, 1458 - .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, 1459 - }, 1460 - { 1461 - .name = "dpio-tx-d-01", 1462 - .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS | 1463 - CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS, 1464 - .ops = &vlv_dpio_power_well_ops, 1465 - .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_01, 1466 - }, 1467 - { 1468 - .name = "dpio-tx-d-23", 1469 - .domains = CHV_DPIO_TX_D_LANES_01_POWER_DOMAINS | 1470 - CHV_DPIO_TX_D_LANES_23_POWER_DOMAINS, 1471 - .ops = &vlv_dpio_power_well_ops, 1472 - .data = PUNIT_POWER_WELL_DPIO_TX_D_LANES_23, 1473 - }, 1474 - #endif 1475 1477 }; 1476 1478 1477 1479 static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv, ··· 1634 1724 * value. 1635 1725 */ 1636 1726 dev_priv->chv_phy_control = 1727 + PHY_LDO_SEQ_DELAY(PHY_LDO_DELAY_600NS, DPIO_PHY0) | 1728 + PHY_LDO_SEQ_DELAY(PHY_LDO_DELAY_600NS, DPIO_PHY1) | 1637 1729 PHY_CH_POWER_MODE(PHY_CH_SU_PSR, DPIO_PHY0, DPIO_CH0) | 1638 1730 PHY_CH_POWER_MODE(PHY_CH_SU_PSR, DPIO_PHY0, DPIO_CH1) | 1639 1731 PHY_CH_POWER_MODE(PHY_CH_SU_PSR, DPIO_PHY1, DPIO_CH0);
+9 -9
drivers/gpu/drm/i915/intel_sideband.c
··· 49 49 (port << IOSF_PORT_SHIFT) | (be << IOSF_BYTE_ENABLES_SHIFT) | 50 50 (bar << IOSF_BAR_SHIFT); 51 51 52 - WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock)); 52 + WARN_ON(!mutex_is_locked(&dev_priv->sb_lock)); 53 53 54 54 if (wait_for((I915_READ(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY) == 0, 5)) { 55 55 DRM_DEBUG_DRIVER("IOSF sideband idle wait (%s) timed out\n", ··· 81 81 82 82 WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); 83 83 84 - mutex_lock(&dev_priv->dpio_lock); 84 + mutex_lock(&dev_priv->sb_lock); 85 85 vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_PUNIT, 86 86 SB_CRRDDA_NP, addr, &val); 87 - mutex_unlock(&dev_priv->dpio_lock); 87 + mutex_unlock(&dev_priv->sb_lock); 88 88 89 89 return val; 90 90 } ··· 93 93 { 94 94 WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); 95 95 96 - mutex_lock(&dev_priv->dpio_lock); 96 + mutex_lock(&dev_priv->sb_lock); 97 97 vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_PUNIT, 98 98 SB_CRWRDA_NP, addr, &val); 99 - mutex_unlock(&dev_priv->dpio_lock); 99 + mutex_unlock(&dev_priv->sb_lock); 100 100 } 101 101 102 102 u32 vlv_bunit_read(struct drm_i915_private *dev_priv, u32 reg) ··· 121 121 122 122 WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); 123 123 124 - mutex_lock(&dev_priv->dpio_lock); 124 + mutex_lock(&dev_priv->sb_lock); 125 125 vlv_sideband_rw(dev_priv, PCI_DEVFN(0, 0), IOSF_PORT_NC, 126 126 SB_CRRDDA_NP, addr, &val); 127 - mutex_unlock(&dev_priv->dpio_lock); 127 + mutex_unlock(&dev_priv->sb_lock); 128 128 129 129 return val; 130 130 } ··· 213 213 enum intel_sbi_destination destination) 214 214 { 215 215 u32 value = 0; 216 - WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock)); 216 + WARN_ON(!mutex_is_locked(&dev_priv->sb_lock)); 217 217 218 218 if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_BUSY) == 0, 219 219 100)) { ··· 243 243 { 244 244 u32 tmp; 245 245 246 - WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock)); 246 + WARN_ON(!mutex_is_locked(&dev_priv->sb_lock)); 247 247 248 248 if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_BUSY) == 0, 249 249 100)) {
+7 -23
drivers/gpu/drm/i915/intel_sprite.c
··· 282 282 283 283 I915_WRITE(PLANE_CTL(pipe, plane), 0); 284 284 285 - /* Activate double buffered register update */ 286 285 I915_WRITE(PLANE_SURF(pipe, plane), 0); 287 286 POSTING_READ(PLANE_SURF(pipe, plane)); 288 287 ··· 338 339 struct drm_device *dev = dplane->dev; 339 340 struct drm_i915_private *dev_priv = dev->dev_private; 340 341 struct intel_plane *intel_plane = to_intel_plane(dplane); 341 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 342 342 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 343 343 int pipe = intel_plane->pipe; 344 344 int plane = intel_plane->plane; ··· 451 453 I915_WRITE(SPCNTR(pipe, plane), sprctl); 452 454 I915_WRITE(SPSURF(pipe, plane), i915_gem_obj_ggtt_offset(obj) + 453 455 sprsurf_offset); 454 - 455 - intel_flush_primary_plane(dev_priv, intel_crtc->plane); 456 + POSTING_READ(SPSURF(pipe, plane)); 456 457 } 457 458 458 459 static void ··· 460 463 struct drm_device *dev = dplane->dev; 461 464 struct drm_i915_private *dev_priv = dev->dev_private; 462 465 struct intel_plane *intel_plane = to_intel_plane(dplane); 463 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 464 466 int pipe = intel_plane->pipe; 465 467 int plane = intel_plane->plane; 466 468 467 469 I915_WRITE(SPCNTR(pipe, plane), 0); 468 470 469 - /* Activate double buffered register update */ 470 471 I915_WRITE(SPSURF(pipe, plane), 0); 471 - 472 - intel_flush_primary_plane(dev_priv, intel_crtc->plane); 472 + POSTING_READ(SPSURF(pipe, plane)); 473 473 474 474 intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false); 475 475 } 476 - 477 476 478 477 static void 479 478 ivb_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, ··· 482 489 struct drm_device *dev = plane->dev; 483 490 struct drm_i915_private *dev_priv = dev->dev_private; 484 491 struct intel_plane *intel_plane = to_intel_plane(plane); 485 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 486 492 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 487 493 enum pipe pipe = intel_plane->pipe; 488 494 u32 sprctl, sprscale = 0; ··· 591 599 I915_WRITE(SPRCTL(pipe), sprctl); 592 600 I915_WRITE(SPRSURF(pipe), 593 601 i915_gem_obj_ggtt_offset(obj) + sprsurf_offset); 594 - 595 - intel_flush_primary_plane(dev_priv, intel_crtc->plane); 602 + POSTING_READ(SPRSURF(pipe)); 596 603 } 597 604 598 605 static void ··· 600 609 struct drm_device *dev = plane->dev; 601 610 struct drm_i915_private *dev_priv = dev->dev_private; 602 611 struct intel_plane *intel_plane = to_intel_plane(plane); 603 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 604 612 int pipe = intel_plane->pipe; 605 613 606 614 I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE); 607 615 /* Can't leave the scaler enabled... */ 608 616 if (intel_plane->can_scale) 609 617 I915_WRITE(SPRSCALE(pipe), 0); 610 - /* Activate double buffered register update */ 611 - I915_WRITE(SPRSURF(pipe), 0); 612 618 613 - intel_flush_primary_plane(dev_priv, intel_crtc->plane); 619 + I915_WRITE(SPRSURF(pipe), 0); 620 + POSTING_READ(SPRSURF(pipe)); 614 621 } 615 622 616 623 static void ··· 622 633 struct drm_device *dev = plane->dev; 623 634 struct drm_i915_private *dev_priv = dev->dev_private; 624 635 struct intel_plane *intel_plane = to_intel_plane(plane); 625 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 626 636 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 627 637 int pipe = intel_plane->pipe; 628 638 unsigned long dvssurf_offset, linear_offset; ··· 718 730 I915_WRITE(DVSCNTR(pipe), dvscntr); 719 731 I915_WRITE(DVSSURF(pipe), 720 732 i915_gem_obj_ggtt_offset(obj) + dvssurf_offset); 721 - 722 - intel_flush_primary_plane(dev_priv, intel_crtc->plane); 733 + POSTING_READ(DVSSURF(pipe)); 723 734 } 724 735 725 736 static void ··· 727 740 struct drm_device *dev = plane->dev; 728 741 struct drm_i915_private *dev_priv = dev->dev_private; 729 742 struct intel_plane *intel_plane = to_intel_plane(plane); 730 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 731 743 int pipe = intel_plane->pipe; 732 744 733 745 I915_WRITE(DVSCNTR(pipe), 0); 734 746 /* Disable the scaler */ 735 747 I915_WRITE(DVSSCALE(pipe), 0); 736 748 737 - /* Flush double buffered register updates */ 738 749 I915_WRITE(DVSSURF(pipe), 0); 739 - 740 - intel_flush_primary_plane(dev_priv, intel_crtc->plane); 750 + POSTING_READ(DVSSURF(pipe)); 741 751 } 742 752 743 753 static int
+6 -2
include/uapi/drm/i915_drm.h
··· 171 171 #define I915_BOX_TEXTURE_LOAD 0x8 172 172 #define I915_BOX_LOST_CONTEXT 0x10 173 173 174 - /* I915 specific ioctls 175 - * The device specific ioctl range is 0x40 to 0x79. 174 + /* 175 + * i915 specific ioctls. 176 + * 177 + * The device specific ioctl range is [DRM_COMMAND_BASE, DRM_COMMAND_END) ie 178 + * [0x40, 0xa0) (a0 is excluded). The numbers below are defined as offset 179 + * against DRM_COMMAND_BASE and should be between [0x0, 0x60). 176 180 */ 177 181 #define DRM_I915_INIT 0x00 178 182 #define DRM_I915_FLUSH 0x01