3232
3333#define VMW_FENCE_WRAP (1 << 24)
3434
35+ static u32 vmw_irqflag_fence_goal (struct vmw_private * vmw )
36+ {
37+ if ((vmw -> capabilities2 & SVGA_CAP2_EXTRA_REGS ) != 0 )
38+ return SVGA_IRQFLAG_REG_FENCE_GOAL ;
39+ else
40+ return SVGA_IRQFLAG_FENCE_GOAL ;
41+ }
42+
3543/**
3644 * vmw_thread_fn - Deferred (process context) irq handler
3745 *
@@ -96,7 +104,7 @@ static irqreturn_t vmw_irq_handler(int irq, void *arg)
96104 wake_up_all (& dev_priv -> fifo_queue );
97105
98106 if ((masked_status & (SVGA_IRQFLAG_ANY_FENCE |
99- SVGA_IRQFLAG_FENCE_GOAL )) &&
107+ vmw_irqflag_fence_goal ( dev_priv ) )) &&
100108 !test_and_set_bit (VMW_IRQTHREAD_FENCE , dev_priv -> irqthread_pending ))
101109 ret = IRQ_WAKE_THREAD ;
102110
@@ -137,8 +145,7 @@ bool vmw_seqno_passed(struct vmw_private *dev_priv,
137145 if (likely (dev_priv -> last_read_seqno - seqno < VMW_FENCE_WRAP ))
138146 return true;
139147
140- if (!(vmw_fifo_caps (dev_priv ) & SVGA_FIFO_CAP_FENCE ) &&
141- vmw_fifo_idle (dev_priv , seqno ))
148+ if (!vmw_has_fences (dev_priv ) && vmw_fifo_idle (dev_priv , seqno ))
142149 return true;
143150
144151 /**
@@ -160,6 +167,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv,
160167 unsigned long timeout )
161168{
162169 struct vmw_fifo_state * fifo_state = dev_priv -> fifo ;
170+ bool fifo_down = false;
163171
164172 uint32_t count = 0 ;
165173 uint32_t signal_seq ;
@@ -176,12 +184,14 @@ int vmw_fallback_wait(struct vmw_private *dev_priv,
176184 */
177185
178186 if (fifo_idle ) {
179- down_read (& fifo_state -> rwsem );
180187 if (dev_priv -> cman ) {
181188 ret = vmw_cmdbuf_idle (dev_priv -> cman , interruptible ,
182189 10 * HZ );
183190 if (ret )
184191 goto out_err ;
192+ } else if (fifo_state ) {
193+ down_read (& fifo_state -> rwsem );
194+ fifo_down = true;
185195 }
186196 }
187197
@@ -218,12 +228,12 @@ int vmw_fallback_wait(struct vmw_private *dev_priv,
218228 }
219229 }
220230 finish_wait (& dev_priv -> fence_queue , & __wait );
221- if (ret == 0 && fifo_idle )
231+ if (ret == 0 && fifo_idle && fifo_state )
222232 vmw_fence_write (dev_priv , signal_seq );
223233
224234 wake_up_all (& dev_priv -> fence_queue );
225235out_err :
226- if (fifo_idle )
236+ if (fifo_down )
227237 up_read (& fifo_state -> rwsem );
228238
229239 return ret ;
@@ -266,13 +276,13 @@ void vmw_seqno_waiter_remove(struct vmw_private *dev_priv)
266276
267277void vmw_goal_waiter_add (struct vmw_private * dev_priv )
268278{
269- vmw_generic_waiter_add (dev_priv , SVGA_IRQFLAG_FENCE_GOAL ,
279+ vmw_generic_waiter_add (dev_priv , vmw_irqflag_fence_goal ( dev_priv ) ,
270280 & dev_priv -> goal_queue_waiters );
271281}
272282
273283void vmw_goal_waiter_remove (struct vmw_private * dev_priv )
274284{
275- vmw_generic_waiter_remove (dev_priv , SVGA_IRQFLAG_FENCE_GOAL ,
285+ vmw_generic_waiter_remove (dev_priv , vmw_irqflag_fence_goal ( dev_priv ) ,
276286 & dev_priv -> goal_queue_waiters );
277287}
278288
0 commit comments