aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-11 13:30:15 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-23 01:05:18 -0400
commitf0355c4a9eaf4cb803930d9fe6a26fb46846e576 (patch)
tree9a32f240cf153eb976e240202738166996742e81
parent109fc2adec3adf1a8c84533b2828da7016bf2abd (diff)
drm/i915: Add locking to psr code
It's not really optional to have locking ... The ugly part is how much locking the psr work needs since it has to recheck everything. Which is way too much. But we need to ditch the psr work in it's current form anyway and implement proper frontbuffer tracking. The other nasty bit that had to go was the delayed work cancle in psr_exit. Which means a bunch of races just became a bit more likely, but mea culpa. v2: Fixup HAS_PSR checks, resulting in uninitialized mutex issues. Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c38
2 files changed, 32 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d8115c3cc7a3..faa27d0044f8 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -660,6 +660,7 @@ struct i915_drrs {
660 660
661struct intel_dp; 661struct intel_dp;
662struct i915_psr { 662struct i915_psr {
663 struct mutex lock;
663 bool sink_support; 664 bool sink_support;
664 bool source_ok; 665 bool source_ok;
665 struct intel_dp *enabled; 666 struct intel_dp *enabled;
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index fd92a813865b..3a3bb0904515 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1767,6 +1767,11 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
1767 struct drm_i915_gem_object *obj = intel_fb_obj(crtc->primary->fb); 1767 struct drm_i915_gem_object *obj = intel_fb_obj(crtc->primary->fb);
1768 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; 1768 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
1769 1769
1770 lockdep_assert_held(&dev_priv->psr.lock);
1771 lockdep_assert_held(&dev->struct_mutex);
1772 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
1773 WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
1774
1770 dev_priv->psr.source_ok = false; 1775 dev_priv->psr.source_ok = false;
1771 1776
1772 if (!HAS_PSR(dev)) { 1777 if (!HAS_PSR(dev)) {
@@ -1836,6 +1841,7 @@ static void intel_edp_psr_do_enable(struct intel_dp *intel_dp)
1836 1841
1837 WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE); 1842 WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE);
1838 WARN_ON(dev_priv->psr.active); 1843 WARN_ON(dev_priv->psr.active);
1844 lockdep_assert_held(&dev_priv->psr.lock);
1839 1845
1840 /* Enable PSR on the panel */ 1846 /* Enable PSR on the panel */
1841 intel_edp_psr_enable_sink(intel_dp); 1847 intel_edp_psr_enable_sink(intel_dp);
@@ -1862,8 +1868,10 @@ void intel_edp_psr_enable(struct intel_dp *intel_dp)
1862 return; 1868 return;
1863 } 1869 }
1864 1870
1871 mutex_lock(&dev_priv->psr.lock);
1865 if (dev_priv->psr.enabled) { 1872 if (dev_priv->psr.enabled) {
1866 DRM_DEBUG_KMS("PSR already in use\n"); 1873 DRM_DEBUG_KMS("PSR already in use\n");
1874 mutex_unlock(&dev_priv->psr.lock);
1867 return; 1875 return;
1868 } 1876 }
1869 1877
@@ -1872,6 +1880,7 @@ void intel_edp_psr_enable(struct intel_dp *intel_dp)
1872 1880
1873 if (intel_edp_psr_match_conditions(intel_dp)) 1881 if (intel_edp_psr_match_conditions(intel_dp))
1874 intel_edp_psr_do_enable(intel_dp); 1882 intel_edp_psr_do_enable(intel_dp);
1883 mutex_unlock(&dev_priv->psr.lock);
1875} 1884}
1876 1885
1877void intel_edp_psr_disable(struct intel_dp *intel_dp) 1886void intel_edp_psr_disable(struct intel_dp *intel_dp)
@@ -1879,9 +1888,15 @@ void intel_edp_psr_disable(struct intel_dp *intel_dp)
1879 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1888 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1880 struct drm_i915_private *dev_priv = dev->dev_private; 1889 struct drm_i915_private *dev_priv = dev->dev_private;
1881 1890
1882 if (!dev_priv->psr.enabled) 1891 if (!HAS_PSR(dev))
1883 return; 1892 return;
1884 1893
1894 mutex_lock(&dev_priv->psr.lock);
1895 if (!dev_priv->psr.enabled) {
1896 mutex_unlock(&dev_priv->psr.lock);
1897 return;
1898 }
1899
1885 if (dev_priv->psr.active) { 1900 if (dev_priv->psr.active) {
1886 I915_WRITE(EDP_PSR_CTL(dev), 1901 I915_WRITE(EDP_PSR_CTL(dev),
1887 I915_READ(EDP_PSR_CTL(dev)) & ~EDP_PSR_ENABLE); 1902 I915_READ(EDP_PSR_CTL(dev)) & ~EDP_PSR_ENABLE);
@@ -1897,19 +1912,30 @@ void intel_edp_psr_disable(struct intel_dp *intel_dp)
1897 } 1912 }
1898 1913
1899 dev_priv->psr.enabled = NULL; 1914 dev_priv->psr.enabled = NULL;
1915 mutex_unlock(&dev_priv->psr.lock);
1900} 1916}
1901 1917
1902static void intel_edp_psr_work(struct work_struct *work) 1918static void intel_edp_psr_work(struct work_struct *work)
1903{ 1919{
1904 struct drm_i915_private *dev_priv = 1920 struct drm_i915_private *dev_priv =
1905 container_of(work, typeof(*dev_priv), psr.work.work); 1921 container_of(work, typeof(*dev_priv), psr.work.work);
1922 struct drm_device *dev = dev_priv->dev;
1906 struct intel_dp *intel_dp = dev_priv->psr.enabled; 1923 struct intel_dp *intel_dp = dev_priv->psr.enabled;
1907 1924
1925 drm_modeset_lock_all(dev);
1926 mutex_lock(&dev->struct_mutex);
1927 mutex_lock(&dev_priv->psr.lock);
1928 intel_dp = dev_priv->psr.enabled;
1929
1908 if (!intel_dp) 1930 if (!intel_dp)
1909 return; 1931 goto unlock;
1910 1932
1911 if (intel_edp_psr_match_conditions(intel_dp)) 1933 if (intel_edp_psr_match_conditions(intel_dp))
1912 intel_edp_psr_do_enable(intel_dp); 1934 intel_edp_psr_do_enable(intel_dp);
1935unlock:
1936 mutex_unlock(&dev_priv->psr.lock);
1937 mutex_unlock(&dev->struct_mutex);
1938 drm_modeset_unlock_all(dev);
1913} 1939}
1914 1940
1915void intel_edp_psr_exit(struct drm_device *dev) 1941void intel_edp_psr_exit(struct drm_device *dev)
@@ -1922,8 +1948,7 @@ void intel_edp_psr_exit(struct drm_device *dev)
1922 if (!dev_priv->psr.enabled) 1948 if (!dev_priv->psr.enabled)
1923 return; 1949 return;
1924 1950
1925 cancel_delayed_work_sync(&dev_priv->psr.work); 1951 mutex_lock(&dev_priv->psr.lock);
1926
1927 if (dev_priv->psr.active) { 1952 if (dev_priv->psr.active) {
1928 u32 val = I915_READ(EDP_PSR_CTL(dev)); 1953 u32 val = I915_READ(EDP_PSR_CTL(dev));
1929 1954
@@ -1936,16 +1961,15 @@ void intel_edp_psr_exit(struct drm_device *dev)
1936 1961
1937 schedule_delayed_work(&dev_priv->psr.work, 1962 schedule_delayed_work(&dev_priv->psr.work,
1938 msecs_to_jiffies(100)); 1963 msecs_to_jiffies(100));
1964 mutex_unlock(&dev_priv->psr.lock);
1939} 1965}
1940 1966
1941void intel_edp_psr_init(struct drm_device *dev) 1967void intel_edp_psr_init(struct drm_device *dev)
1942{ 1968{
1943 struct drm_i915_private *dev_priv = dev->dev_private; 1969 struct drm_i915_private *dev_priv = dev->dev_private;
1944 1970
1945 if (!HAS_PSR(dev))
1946 return;
1947
1948 INIT_DELAYED_WORK(&dev_priv->psr.work, intel_edp_psr_work); 1971 INIT_DELAYED_WORK(&dev_priv->psr.work, intel_edp_psr_work);
1972 mutex_init(&dev_priv->psr.lock);
1949} 1973}
1950 1974
1951static void intel_disable_dp(struct intel_encoder *encoder) 1975static void intel_disable_dp(struct intel_encoder *encoder)