@@ -1600,17 +1600,6 @@ static void virtual_xfer_breadcrumbs(struct virtual_engine *ve,
1600
1600
spin_unlock (& old -> breadcrumbs .irq_lock );
1601
1601
}
1602
1602
1603
- static struct i915_request *
1604
- last_active (const struct intel_engine_execlists * execlists )
1605
- {
1606
- struct i915_request * const * last = READ_ONCE (execlists -> active );
1607
-
1608
- while (* last && i915_request_completed (* last ))
1609
- last ++ ;
1610
-
1611
- return * last ;
1612
- }
1613
-
1614
1603
#define for_each_waiter (p__ , rq__ ) \
1615
1604
list_for_each_entry_lockless(p__, \
1616
1605
&(rq__)->sched.waiters_list, \
@@ -1740,11 +1729,9 @@ static void record_preemption(struct intel_engine_execlists *execlists)
1740
1729
(void )I915_SELFTEST_ONLY (execlists -> preempt_hang .count ++ );
1741
1730
}
1742
1731
1743
- static unsigned long active_preempt_timeout (struct intel_engine_cs * engine )
1732
+ static unsigned long active_preempt_timeout (struct intel_engine_cs * engine ,
1733
+ const struct i915_request * rq )
1744
1734
{
1745
- struct i915_request * rq ;
1746
-
1747
- rq = last_active (& engine -> execlists );
1748
1735
if (!rq )
1749
1736
return 0 ;
1750
1737
@@ -1755,13 +1742,14 @@ static unsigned long active_preempt_timeout(struct intel_engine_cs *engine)
1755
1742
return READ_ONCE (engine -> props .preempt_timeout_ms );
1756
1743
}
1757
1744
1758
- static void set_preempt_timeout (struct intel_engine_cs * engine )
1745
+ static void set_preempt_timeout (struct intel_engine_cs * engine ,
1746
+ const struct i915_request * rq )
1759
1747
{
1760
1748
if (!intel_engine_has_preempt_reset (engine ))
1761
1749
return ;
1762
1750
1763
1751
set_timer_ms (& engine -> execlists .preempt ,
1764
- active_preempt_timeout (engine ));
1752
+ active_preempt_timeout (engine , rq ));
1765
1753
}
1766
1754
1767
1755
static inline void clear_ports (struct i915_request * * ports , int count )
@@ -1774,6 +1762,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
1774
1762
struct intel_engine_execlists * const execlists = & engine -> execlists ;
1775
1763
struct i915_request * * port = execlists -> pending ;
1776
1764
struct i915_request * * const last_port = port + execlists -> port_mask ;
1765
+ struct i915_request * const * active ;
1777
1766
struct i915_request * last ;
1778
1767
struct rb_node * rb ;
1779
1768
bool submit = false;
@@ -1828,7 +1817,10 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
1828
1817
* i.e. we will retrigger preemption following the ack in case
1829
1818
* of trouble.
1830
1819
*/
1831
- last = last_active (execlists );
1820
+ active = READ_ONCE (execlists -> active );
1821
+ while ((last = * active ) && i915_request_completed (last ))
1822
+ active ++ ;
1823
+
1832
1824
if (last ) {
1833
1825
if (need_preempt (engine , last , rb )) {
1834
1826
ENGINE_TRACE (engine ,
@@ -2110,7 +2102,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
2110
2102
* Skip if we ended up with exactly the same set of requests,
2111
2103
* e.g. trying to timeslice a pair of ordered contexts
2112
2104
*/
2113
- if (!memcmp (execlists -> active , execlists -> pending ,
2105
+ if (!memcmp (active , execlists -> pending ,
2114
2106
(port - execlists -> pending + 1 ) * sizeof (* port ))) {
2115
2107
do
2116
2108
execlists_schedule_out (fetch_and_zero (port ));
@@ -2121,7 +2113,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
2121
2113
clear_ports (port + 1 , last_port - port );
2122
2114
2123
2115
execlists_submit_ports (engine );
2124
- set_preempt_timeout (engine );
2116
+ set_preempt_timeout (engine , * active );
2125
2117
} else {
2126
2118
skip_submit :
2127
2119
ring_set_paused (engine , 0 );
@@ -4008,26 +4000,6 @@ static int gen12_emit_flush_render(struct i915_request *request,
4008
4000
4009
4001
* cs ++ = preparser_disable (false);
4010
4002
intel_ring_advance (request , cs );
4011
-
4012
- /*
4013
- * Wa_1604544889:tgl
4014
- */
4015
- if (IS_TGL_REVID (request -> i915 , TGL_REVID_A0 , TGL_REVID_A0 )) {
4016
- flags = 0 ;
4017
- flags |= PIPE_CONTROL_CS_STALL ;
4018
- flags |= PIPE_CONTROL_HDC_PIPELINE_FLUSH ;
4019
-
4020
- flags |= PIPE_CONTROL_STORE_DATA_INDEX ;
4021
- flags |= PIPE_CONTROL_QW_WRITE ;
4022
-
4023
- cs = intel_ring_begin (request , 6 );
4024
- if (IS_ERR (cs ))
4025
- return PTR_ERR (cs );
4026
-
4027
- cs = gen8_emit_pipe_control (cs , flags ,
4028
- LRC_PPHWSP_SCRATCH_ADDR );
4029
- intel_ring_advance (request , cs );
4030
- }
4031
4003
}
4032
4004
4033
4005
return 0 ;
0 commit comments