OSDN Git Service

drm/i915/gt: Use caller provided forcewake for intel_mocs_init_engine
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 3 Jul 2019 15:52:23 +0000 (16:52 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 4 Jul 2019 13:42:38 +0000 (14:42 +0100)
During post-reset resume, we call intel_mocs_init_engine to reinitialise
the MOCS registers. Suprisingly, especially when enhanced by lockdep,
the acquisition of the forcewake lock around each register write takes a
substantial portion of the reset time. We don't need to use the
individual forcewake here as we can assume that the caller is holding a
blanket forcewake for the reset&resume and the resume is serialised.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190703155225.9501-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_mocs.c

index ae6cbf0..290a5e9 100644 (file)
@@ -346,6 +346,9 @@ void intel_mocs_init_engine(struct intel_engine_cs *engine)
        unsigned int index;
        u32 unused_value;
 
+       /* Called under a blanket forcewake */
+       assert_forcewakes_active(uncore, FORCEWAKE_ALL);
+
        if (!get_mocs_settings(gt, &table))
                return;
 
@@ -355,16 +358,16 @@ void intel_mocs_init_engine(struct intel_engine_cs *engine)
        for (index = 0; index < table.size; index++) {
                u32 value = get_entry_control(&table, index);
 
-               intel_uncore_write(uncore,
-                                  mocs_register(engine->id, index),
-                                  value);
+               intel_uncore_write_fw(uncore,
+                                     mocs_register(engine->id, index),
+                                     value);
        }
 
        /* All remaining entries are also unused */
        for (; index < table.n_entries; index++)
-               intel_uncore_write(uncore,
-                                  mocs_register(engine->id, index),
-                                  unused_value);
+               intel_uncore_write_fw(uncore,
+                                     mocs_register(engine->id, index),
+                                     unused_value);
 }
 
 /**