[PATCH 08/10] drm/xe/vf: Update LRC with memory based interrupts data
Matt Roper
matthew.d.roper at intel.com
Wed Dec 13 00:51:42 UTC 2023
On Tue, Dec 12, 2023 at 10:00:52PM +0100, Michal Wajdeczko wrote:
> When Memory Based Interrupts are used, the VF driver must provide
> in the LRC the references to the Source and Status Report Pages.
>
> Update the LRC according to the requirements.
>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
Reviewed-by: Matt Roper <matthew.d.roper at intel.com>
> ---
> drivers/gpu/drm/xe/xe_lrc.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
> index d6dfbd0bdc70..4101558f01ce 100644
> --- a/drivers/gpu/drm/xe/xe_lrc.c
> +++ b/drivers/gpu/drm/xe/xe_lrc.c
> @@ -21,6 +21,8 @@
> #include "xe_gt_printk.h"
> #include "xe_hw_fence.h"
> #include "xe_map.h"
> +#include "xe_memirq.h"
> +#include "xe_sriov.h"
> #include "xe_vm.h"
>
> #define CTX_VALID (1 << 0)
> @@ -534,6 +536,27 @@ static void set_context_control(u32 *regs, struct xe_hw_engine *hwe)
> /* TODO: Timestamp */
> }
>
> +static void set_memory_based_intr(u32 *regs, struct xe_hw_engine *hwe)
> +{
> + struct xe_memirq *memirq = >_to_tile(hwe->gt)->sriov.vf.memirq;
> + struct xe_device *xe = gt_to_xe(hwe->gt);
> +
> + if (!IS_SRIOV_VF(xe) || !xe_device_has_memirq(xe))
> + return;
> +
> + regs[CTX_LRM_INT_MASK_ENABLE] = MI_LOAD_REGISTER_MEM |
> + MI_LRI_LRM_CS_MMIO | MI_LRM_USE_GGTT;
> + regs[CTX_INT_MASK_ENABLE_REG] = RING_IMR(0).addr;
> + regs[CTX_INT_MASK_ENABLE_PTR] = xe_memirq_enable_ptr(memirq);
> +
> + regs[CTX_LRI_INT_REPORT_PTR] = MI_LOAD_REGISTER_IMM | MI_LRI_NUM_REGS(2) |
> + MI_LRI_LRM_CS_MMIO | MI_LRI_FORCE_POSTED;
> + regs[CTX_INT_STATUS_REPORT_REG] = RING_INT_STATUS_RPT_PTR(0).addr;
> + regs[CTX_INT_STATUS_REPORT_PTR] = xe_memirq_status_ptr(memirq);
> + regs[CTX_INT_SRC_REPORT_REG] = RING_INT_SRC_RPT_PTR(0).addr;
> + regs[CTX_INT_SRC_REPORT_PTR] = xe_memirq_source_ptr(memirq);
> +}
> +
> static int lrc_ring_mi_mode(struct xe_hw_engine *hwe)
> {
> struct xe_device *xe = gt_to_xe(hwe->gt);
> @@ -669,6 +692,7 @@ static void *empty_lrc_data(struct xe_hw_engine *hwe)
> regs = data + LRC_PPHWSP_SIZE;
> set_offsets(regs, reg_offsets(xe, hwe->class), hwe);
> set_context_control(regs, hwe);
> + set_memory_based_intr(regs, hwe);
> reset_stop_ring(regs, hwe);
>
> return data;
> --
> 2.25.1
>
--
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
More information about the Intel-xe
mailing list