mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-23 05:56:14 -04:00
drm/i915/sseu: Don't try to store EU mask internally in UAPI format
Storing the EU mask internally in the same format the I915_QUERY topology queries use makes the final copy_to_user() a bit simpler, but makes the rest of the driver's SSEU more complicated and harder to follow. Let's switch to an internal representation that's more natural: Xe_HP platforms will be a simple array of u16 masks, whereas pre-Xe_HP platforms will be a two-dimensional array, indexed by [slice][subslice]. We'll convert to the uapi format only when the query uapi is called. v2: - Drop has_common_ss_eumask. We waste some space repeating identical EU masks for every single DSS, but the code is simpler without it. (Tvrtko) v3: - Mask down EUs passed to sseu_set_eus at the callsite rather than inside the function. (Tvrtko) - Eliminate sseu->eu_stride and calculate it when needed. (Tvrtko) Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Acked-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220601150725.521468-5-matthew.d.roper@intel.com
This commit is contained in:
@@ -35,6 +35,7 @@ static int fill_topology_info(const struct sseu_dev_info *sseu,
|
||||
{
|
||||
struct drm_i915_query_topology_info topo;
|
||||
u32 slice_length, subslice_length, eu_length, total_length;
|
||||
int eu_stride = GEN_SSEU_STRIDE(sseu->max_eus_per_subslice);
|
||||
int ret;
|
||||
|
||||
BUILD_BUG_ON(sizeof(u8) != sizeof(sseu->slice_mask));
|
||||
@@ -44,7 +45,7 @@ static int fill_topology_info(const struct sseu_dev_info *sseu,
|
||||
|
||||
slice_length = sizeof(sseu->slice_mask);
|
||||
subslice_length = sseu->max_slices * sseu->ss_stride;
|
||||
eu_length = sseu->max_slices * sseu->max_subslices * sseu->eu_stride;
|
||||
eu_length = sseu->max_slices * sseu->max_subslices * eu_stride;
|
||||
total_length = sizeof(topo) + slice_length + subslice_length +
|
||||
eu_length;
|
||||
|
||||
@@ -61,7 +62,7 @@ static int fill_topology_info(const struct sseu_dev_info *sseu,
|
||||
topo.subslice_offset = slice_length;
|
||||
topo.subslice_stride = sseu->ss_stride;
|
||||
topo.eu_offset = slice_length + subslice_length;
|
||||
topo.eu_stride = sseu->eu_stride;
|
||||
topo.eu_stride = eu_stride;
|
||||
|
||||
if (copy_to_user(u64_to_user_ptr(query_item->data_ptr),
|
||||
&topo, sizeof(topo)))
|
||||
@@ -76,10 +77,10 @@ static int fill_topology_info(const struct sseu_dev_info *sseu,
|
||||
subslice_mask, subslice_length))
|
||||
return -EFAULT;
|
||||
|
||||
if (copy_to_user(u64_to_user_ptr(query_item->data_ptr +
|
||||
sizeof(topo) +
|
||||
slice_length + subslice_length),
|
||||
sseu->eu_mask, eu_length))
|
||||
if (intel_sseu_copy_eumask_to_user(u64_to_user_ptr(query_item->data_ptr +
|
||||
sizeof(topo) +
|
||||
slice_length + subslice_length),
|
||||
sseu))
|
||||
return -EFAULT;
|
||||
|
||||
return total_length;
|
||||
|
||||
Reference in New Issue
Block a user