History

drm/rockchip: Don't use atomic constructs for psr

Instead of using timer and spinlocks, use delayed_work and mutexes for rockchip psr. This allows us to make blocking calls when enabling/disabling psr (which is sort of important given we're talking over dpcd to the display).

Sean Paul committed 8 years ago

Commit 60beecc1 parent 7f3c1913 files · +31 −41Browse files

Unified · Split

3 files
  1. drivers/gpu/drm/rockchip/rockchip_drm_drv.c +1 −1
  2. drivers/gpu/drm/rockchip/rockchip_drm_drv.h +1 −1
  3. drivers/gpu/drm/rockchip/rockchip_drm_psr.c +29 −39
drivers/gpu/drm/rockchip/rockchip_drm_drv.c+1−1
@@ -134,7 +134,7 @@ static int rockchip_drm_bind(struct device *dev) · 133 unmodified lines
134134 drm_dev->dev_private = private;
135135
136136 INIT_LIST_HEAD(&private->psr_list);
137− spin_lock_init(&private->psr_list_lock);
137+ mutex_init(&private->psr_list_lock);
138138
139139 ret = rockchip_drm_init_iommu(drm_dev);
140140 if (ret)
drivers/gpu/drm/rockchip/rockchip_drm_drv.h+1−1
@@ -55,7 +55,7 @@ struct rockchip_drm_private { · 54 unmodified lines
5555 struct mutex mm_lock;
5656 struct drm_mm mm;
5757 struct list_head psr_list;
58− spinlock_t psr_list_lock;
58+ struct mutex psr_list_lock;
5959 };
6060
6161 int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
drivers/gpu/drm/rockchip/rockchip_drm_psr.c+29−39
@@ -18,7 +18,7 @@ · 17 unmodified lines
1818 #include "rockchip_drm_drv.h"
1919 #include "rockchip_drm_psr.h"
2020
21−#define PSR_FLUSH_TIMEOUT msecs_to_jiffies(100)
21+#define PSR_FLUSH_TIMEOUT_MS 100
2222
2323 enum psr_state {
2424 PSR_FLUSH,
@@ -30,11 +30,11 @@ struct psr_drv { · 5 unmodified lines
3030 struct list_head list;
3131 struct drm_encoder *encoder;
3232
33− spinlock_t lock;
33+ struct mutex lock;
3434 bool active;
3535 enum psr_state state;
3636
37− struct timer_list flush_timer;
37+ struct delayed_work flush_work;
3838
3939 void (*set)(struct drm_encoder *encoder, bool enable);
4040 };
@@ -43,9 +43,8 @@ static struct psr_drv *find_psr_by_crtc(struct drm_crtc *crtc) · 2 unmodified lines
4343 {
4444 struct rockchip_drm_private *drm_drv = crtc->dev->dev_private;
4545 struct psr_drv *psr;
46− unsigned long flags;
4746
48− spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
47+ mutex_lock(&drm_drv->psr_list_lock);
4948 list_for_each_entry(psr, &drm_drv->psr_list, list) {
5049 if (psr->encoder->crtc == crtc)
5150 goto out;
@@ -53,7 +52,7 @@ static struct psr_drv *find_psr_by_crtc(struct drm_crtc *crtc) · 1 unmodified line
5352 psr = ERR_PTR(-ENODEV);
5453
5554 out:
56− spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
55+ mutex_unlock(&drm_drv->psr_list_lock);
5756 return psr;
5857 }
5958
@@ -61,9 +60,8 @@ static struct psr_drv *find_psr_by_encoder(struct drm_encoder *encoder) · 1 unmodified line
6160 {
6261 struct rockchip_drm_private *drm_drv = encoder->dev->dev_private;
6362 struct psr_drv *psr;
64− unsigned long flags;
6563
66− spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
64+ mutex_lock(&drm_drv->psr_list_lock);
6765 list_for_each_entry(psr, &drm_drv->psr_list, list) {
6866 if (psr->encoder == encoder)
6967 goto out;
@@ -71,7 +69,7 @@ static struct psr_drv *find_psr_by_encoder(struct drm_encoder *encoder) · 1 unmodified line
7169 psr = ERR_PTR(-ENODEV);
7270
7371 out:
74− spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
72+ mutex_unlock(&drm_drv->psr_list_lock);
7573 return psr;
7674 }
7775
@@ -112,23 +110,21 @@ static void psr_set_state_locked(struct psr_drv *psr, enum psr_state state) · 34 unmodified lines
112110
113111 static void psr_set_state(struct psr_drv *psr, enum psr_state state)
114112 {
115− unsigned long flags;
116−
117− spin_lock_irqsave(&psr->lock, flags);
113+ mutex_lock(&psr->lock);
118114 psr_set_state_locked(psr, state);
119− spin_unlock_irqrestore(&psr->lock, flags);
115+ mutex_unlock(&psr->lock);
120116 }
121117
122−static void psr_flush_handler(struct timer_list *t)
118+static void psr_flush_handler(struct work_struct *work)
123119 {
124− struct psr_drv *psr = from_timer(psr, t, flush_timer);
125− unsigned long flags;
120+ struct psr_drv *psr = container_of(to_delayed_work(work),
121+ struct psr_drv, flush_work);
126122
127123 /* If the state has changed since we initiated the flush, do nothing */
128− spin_lock_irqsave(&psr->lock, flags);
124+ mutex_lock(&psr->lock);
129125 if (psr->state == PSR_FLUSH)
130126 psr_set_state_locked(psr, PSR_ENABLE);
131− spin_unlock_irqrestore(&psr->lock, flags);
127+ mutex_unlock(&psr->lock);
132128 }
133129
134130 /**
@@ -141,14 +137,13 @@ static void psr_flush_handler(struct timer_list *t) · 6 unmodified lines
141137 int rockchip_drm_psr_activate(struct drm_encoder *encoder)
142138 {
143139 struct psr_drv *psr = find_psr_by_encoder(encoder);
144− unsigned long flags;
145140
146141 if (IS_ERR(psr))
147142 return PTR_ERR(psr);
148143
149− spin_lock_irqsave(&psr->lock, flags);
144+ mutex_lock(&psr->lock);
150145 psr->active = true;
151− spin_unlock_irqrestore(&psr->lock, flags);
146+ mutex_unlock(&psr->lock);
152147
153148 return 0;
154149 }
@@ -164,15 +159,14 @@ EXPORT_SYMBOL(rockchip_drm_psr_activate); · 9 unmodified lines
164159 int rockchip_drm_psr_deactivate(struct drm_encoder *encoder)
165160 {
166161 struct psr_drv *psr = find_psr_by_encoder(encoder);
167− unsigned long flags;
168162
169163 if (IS_ERR(psr))
170164 return PTR_ERR(psr);
171165
172− spin_lock_irqsave(&psr->lock, flags);
166+ mutex_lock(&psr->lock);
173167 psr->active = false;
174− spin_unlock_irqrestore(&psr->lock, flags);
175− del_timer_sync(&psr->flush_timer);
168+ mutex_unlock(&psr->lock);
169+ cancel_delayed_work_sync(&psr->flush_work);
176170
177171 return 0;
178172 }
@@ -180,9 +174,8 @@ EXPORT_SYMBOL(rockchip_drm_psr_deactivate); · 1 unmodified line
180174
181175 static void rockchip_drm_do_flush(struct psr_drv *psr)
182176 {
183− mod_timer(&psr->flush_timer,
184− round_jiffies_up(jiffies + PSR_FLUSH_TIMEOUT));
185177 psr_set_state(psr, PSR_FLUSH);
178+ mod_delayed_work(system_wq, &psr->flush_work, PSR_FLUSH_TIMEOUT_MS);
186179 }
187180
188181 /**
@@ -219,12 +212,11 @@ void rockchip_drm_psr_flush_all(struct drm_device *dev) · 30 unmodified lines
219212 {
220213 struct rockchip_drm_private *drm_drv = dev->dev_private;
221214 struct psr_drv *psr;
222− unsigned long flags;
223215
224− spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
216+ mutex_lock(&drm_drv->psr_list_lock);
225217 list_for_each_entry(psr, &drm_drv->psr_list, list)
226218 rockchip_drm_do_flush(psr);
227− spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
219+ mutex_unlock(&drm_drv->psr_list_lock);
228220 }
229221 EXPORT_SYMBOL(rockchip_drm_psr_flush_all);
230222
@@ -241,7 +233,6 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder, · 10 unmodified lines
241233 {
242234 struct rockchip_drm_private *drm_drv = encoder->dev->dev_private;
243235 struct psr_drv *psr;
244− unsigned long flags;
245236
246237 if (!encoder || !psr_set)
247238 return -EINVAL;
@@ -250,17 +241,17 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder, · 2 unmodified lines
250241 if (!psr)
251242 return -ENOMEM;
252243
253− timer_setup(&psr->flush_timer, psr_flush_handler, 0);
254− spin_lock_init(&psr->lock);
244+ INIT_DELAYED_WORK(&psr->flush_work, psr_flush_handler);
245+ mutex_init(&psr->lock);
255246
256247 psr->active = true;
257248 psr->state = PSR_DISABLE;
258249 psr->encoder = encoder;
259250 psr->set = psr_set;
260251
261− spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
252+ mutex_lock(&drm_drv->psr_list_lock);
262253 list_add_tail(&psr->list, &drm_drv->psr_list);
263− spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
254+ mutex_unlock(&drm_drv->psr_list_lock);
264255
265256 return 0;
266257 }
@@ -278,16 +269,15 @@ void rockchip_drm_psr_unregister(struct drm_encoder *encoder) · 11 unmodified lines
278269 {
279270 struct rockchip_drm_private *drm_drv = encoder->dev->dev_private;
280271 struct psr_drv *psr, *n;
281− unsigned long flags;
282272
283− spin_lock_irqsave(&drm_drv->psr_list_lock, flags);
273+ mutex_lock(&drm_drv->psr_list_lock);
284274 list_for_each_entry_safe(psr, n, &drm_drv->psr_list, list) {
285275 if (psr->encoder == encoder) {
286− del_timer(&psr->flush_timer);
276+ cancel_delayed_work_sync(&psr->flush_work);
287277 list_del(&psr->list);
288278 kfree(psr);
289279 }
290280 }
291− spin_unlock_irqrestore(&drm_drv->psr_list_lock, flags);
281+ mutex_unlock(&drm_drv->psr_list_lock);
292282 }
293283 EXPORT_SYMBOL(rockchip_drm_psr_unregister);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t