Commit c1bb1145 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin

drm/i915: Store number of active engines in device info

Until now code was calling hweight32 to figure out the
number from device_info->ring_mask at runtime. Instead
we can cache it at engine init time and use directly.
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarDave Gordon <david.s.gordon@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1470842530-35854-1-git-send-email-tvrtko.ursulin@linux.intel.com
parent 17f298cf
...@@ -3226,7 +3226,7 @@ static int i915_semaphore_status(struct seq_file *m, void *unused) ...@@ -3226,7 +3226,7 @@ static int i915_semaphore_status(struct seq_file *m, void *unused)
struct drm_device *dev = node->minor->dev; struct drm_device *dev = node->minor->dev;
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct intel_engine_cs *engine; struct intel_engine_cs *engine;
int num_rings = hweight32(INTEL_INFO(dev)->ring_mask); int num_rings = INTEL_INFO(dev)->num_rings;
enum intel_engine_id id; enum intel_engine_id id;
int j, ret; int j, ret;
......
...@@ -793,6 +793,7 @@ struct intel_device_info { ...@@ -793,6 +793,7 @@ struct intel_device_info {
u8 gen; u8 gen;
u16 gen_mask; u16 gen_mask;
u8 ring_mask; /* Rings supported by the HW */ u8 ring_mask; /* Rings supported by the HW */
u8 num_rings;
DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG, SEP_SEMICOLON); DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG, SEP_SEMICOLON);
/* Register offsets for the various display pipes and transcoders */ /* Register offsets for the various display pipes and transcoders */
int pipe_offsets[I915_MAX_TRANSCODERS]; int pipe_offsets[I915_MAX_TRANSCODERS];
......
...@@ -568,7 +568,7 @@ mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags) ...@@ -568,7 +568,7 @@ mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags)
const int num_rings = const int num_rings =
/* Use an extended w/a on ivb+ if signalling from other rings */ /* Use an extended w/a on ivb+ if signalling from other rings */
i915.semaphores ? i915.semaphores ?
hweight32(INTEL_INFO(dev_priv)->ring_mask) - 1 : INTEL_INFO(dev_priv)->num_rings - 1 :
0; 0;
int len, ret; int len, ret;
......
...@@ -109,6 +109,7 @@ intel_engine_setup(struct drm_i915_private *dev_priv, ...@@ -109,6 +109,7 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
int intel_engines_init(struct drm_device *dev) int intel_engines_init(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct intel_device_info *device_info = mkwrite_device_info(dev_priv);
unsigned int mask = 0; unsigned int mask = 0;
int (*init)(struct intel_engine_cs *engine); int (*init)(struct intel_engine_cs *engine);
unsigned int i; unsigned int i;
...@@ -142,11 +143,10 @@ int intel_engines_init(struct drm_device *dev) ...@@ -142,11 +143,10 @@ int intel_engines_init(struct drm_device *dev)
* are added to the driver by a warning and disabling the forgotten * are added to the driver by a warning and disabling the forgotten
* engines. * engines.
*/ */
if (WARN_ON(mask != INTEL_INFO(dev_priv)->ring_mask)) { if (WARN_ON(mask != INTEL_INFO(dev_priv)->ring_mask))
struct intel_device_info *info = device_info->ring_mask = mask;
(struct intel_device_info *)&dev_priv->info;
info->ring_mask = mask; device_info->num_rings = hweight32(mask);
}
return 0; return 0;
......
...@@ -1317,7 +1317,7 @@ static int gen8_rcs_signal(struct drm_i915_gem_request *req) ...@@ -1317,7 +1317,7 @@ static int gen8_rcs_signal(struct drm_i915_gem_request *req)
enum intel_engine_id id; enum intel_engine_id id;
int ret, num_rings; int ret, num_rings;
num_rings = hweight32(INTEL_INFO(dev_priv)->ring_mask); num_rings = INTEL_INFO(dev_priv)->num_rings;
ret = intel_ring_begin(req, (num_rings-1) * 8); ret = intel_ring_begin(req, (num_rings-1) * 8);
if (ret) if (ret)
return ret; return ret;
...@@ -1354,7 +1354,7 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *req) ...@@ -1354,7 +1354,7 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *req)
enum intel_engine_id id; enum intel_engine_id id;
int ret, num_rings; int ret, num_rings;
num_rings = hweight32(INTEL_INFO(dev_priv)->ring_mask); num_rings = INTEL_INFO(dev_priv)->num_rings;
ret = intel_ring_begin(req, (num_rings-1) * 6); ret = intel_ring_begin(req, (num_rings-1) * 6);
if (ret) if (ret)
return ret; return ret;
...@@ -1389,7 +1389,7 @@ static int gen6_signal(struct drm_i915_gem_request *req) ...@@ -1389,7 +1389,7 @@ static int gen6_signal(struct drm_i915_gem_request *req)
enum intel_engine_id id; enum intel_engine_id id;
int ret, num_rings; int ret, num_rings;
num_rings = hweight32(INTEL_INFO(dev_priv)->ring_mask); num_rings = INTEL_INFO(dev_priv)->num_rings;
ret = intel_ring_begin(req, round_up((num_rings-1) * 3, 2)); ret = intel_ring_begin(req, round_up((num_rings-1) * 3, 2));
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment