The whole point of the previous fixes has been to change the CCS hardware configuration to generate only one stream available to the compute users. We did this by changing the info.engine_mask that is set during device probe, reset during the detection of the fused engines, and finally reset again when choosing the CCS mode. We can't use the engine_mask variable anymore, as with the current configuration, it imposes only one CCS no matter what the hardware configuration is. Before changing the engine_mask for the third time, save it and use it for calculating the CCS mode. After the previous changes, the user reported a performance drop to around 1/4. We have tested that the compute operations, with the current patch, have improved by the same factor. Fixes:6db31251bb
("drm/i915/gt: Enable only one CCS for compute workload") Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com> Cc: Chris Wilson <chris.p.wilson@linux.intel.com> Cc: Gnattu OC <gnattuoc@me.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Matt Roper <matthew.d.roper@intel.com> Tested-by: Jian Ye <jian.ye@intel.com> Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com> Tested-by: Gnattu OC <gnattuoc@me.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240517090616.242529-1-andi.shyti@linux.intel.com (cherry picked from commita09d2327a9
) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
39 lines
838 B
C
39 lines
838 B
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright © 2024 Intel Corporation
|
|
*/
|
|
|
|
#include "i915_drv.h"
|
|
#include "intel_gt.h"
|
|
#include "intel_gt_ccs_mode.h"
|
|
#include "intel_gt_regs.h"
|
|
|
|
unsigned int intel_gt_apply_ccs_mode(struct intel_gt *gt)
|
|
{
|
|
int cslice;
|
|
u32 mode = 0;
|
|
int first_ccs = __ffs(CCS_MASK(gt));
|
|
|
|
if (!IS_DG2(gt->i915))
|
|
return 0;
|
|
|
|
/* Build the value for the fixed CCS load balancing */
|
|
for (cslice = 0; cslice < I915_MAX_CCS; cslice++) {
|
|
if (gt->ccs.cslices & BIT(cslice))
|
|
/*
|
|
* If available, assign the cslice
|
|
* to the first available engine...
|
|
*/
|
|
mode |= XEHP_CCS_MODE_CSLICE(cslice, first_ccs);
|
|
|
|
else
|
|
/*
|
|
* ... otherwise, mark the cslice as
|
|
* unavailable if no CCS dispatches here
|
|
*/
|
|
mode |= XEHP_CCS_MODE_CSLICE(cslice,
|
|
XEHP_CCS_MODE_CSLICE_MASK);
|
|
}
|
|
|
|
return mode;
|
|
}
|