mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
- SRIOV related fixes (Wajdeczko, Mohanram)
- Fix leak and double-free (Lin) - Multi-cast register fixes (Gustavo) - Multi-queue fix (Niranjana) -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmoPazEACgkQ+mJfZA7r E8r5gwf/TypGltHME1VraMkYmNkykoR2B/cFkrLo5HjMrNVnAQm9ZXSIi4EJKeuP 77w/gBu0H/FvB9nDrXM9arefHVWsNMeRM+eQAoXOKkhPBrmeqKaj05qDvFmkjv2e ZJFKzSU0k7+/AaIwpSKb4IktEZf8N8fonAszX8MGZ7yYkyP8TSKwqVYBYhto2m9r OLLWTO/tzhSz+l4Xmy3OkvVYBSj23QgZjv+jFzUmM1Xq4dEaxCuqqCQEyDQ0/Wbv E2rqdRS5GRHpnhhh/D4bDYejcYyVgcfXVGxXUP0CHUmBCB8Yu4H+fLdT4h6kqu2j jkryh/W8pHvNYVIFsLDsrPdHOoiTug== =RL0p -----END PGP SIGNATURE----- Merge tag 'drm-xe-fixes-2026-05-21' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes - SRIOV related fixes (Wajdeczko, Mohanram) - Fix leak and double-free (Lin) - Multi-cast register fixes (Gustavo) - Multi-queue fix (Niranjana) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patch.msgid.link/ag9rR5VwCdkA0lzI@intel.com
This commit is contained in:
commit
84335a9985
|
|
@ -152,10 +152,11 @@
|
|||
|
||||
#define XEHPG_INSTDONE_GEOM_SVGUNIT XE_REG_MCR(0x666c)
|
||||
|
||||
#define CACHE_MODE_1 XE_REG(0x7004, XE_REG_OPTION_MASKED)
|
||||
#define CACHE_MODE_1 XE_REG_MCR(0x7004, XE_REG_OPTION_MASKED)
|
||||
#define MSAA_OPTIMIZATION_REDUC_DISABLE REG_BIT(11)
|
||||
|
||||
#define COMMON_SLICE_CHICKEN1 XE_REG(0x7010, XE_REG_OPTION_MASKED)
|
||||
#define XEHP_COMMON_SLICE_CHICKEN1 XE_REG_MCR(0x7010, XE_REG_OPTION_MASKED)
|
||||
#define DISABLE_BOTTOM_CLIP_RECTANGLE_TEST REG_BIT(14)
|
||||
|
||||
#define HIZ_CHICKEN XE_REG(0x7018, XE_REG_OPTION_MASKED)
|
||||
|
|
@ -178,6 +179,7 @@
|
|||
#define XEHPG_SC_INSTDONE_EXTRA2 XE_REG_MCR(0x7108)
|
||||
|
||||
#define COMMON_SLICE_CHICKEN4 XE_REG(0x7300, XE_REG_OPTION_MASKED)
|
||||
#define XEHP_COMMON_SLICE_CHICKEN4 XE_REG_MCR(0x7300, XE_REG_OPTION_MASKED)
|
||||
#define SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE REG_BIT(12)
|
||||
#define DISABLE_TDC_LOAD_BALANCING_CALC REG_BIT(6)
|
||||
#define HW_FILTERING REG_BIT(5)
|
||||
|
|
|
|||
|
|
@ -482,8 +482,7 @@ int xe_gsc_init_post_hwconfig(struct xe_gsc *gsc)
|
|||
EXEC_QUEUE_FLAG_PERMANENT, 0);
|
||||
if (IS_ERR(q)) {
|
||||
xe_gt_err(gt, "Failed to create queue for GSC submission\n");
|
||||
err = PTR_ERR(q);
|
||||
goto out_bo;
|
||||
return PTR_ERR(q);
|
||||
}
|
||||
|
||||
wq = alloc_ordered_workqueue("gsc-ordered-wq", 0);
|
||||
|
|
@ -506,8 +505,6 @@ int xe_gsc_init_post_hwconfig(struct xe_gsc *gsc)
|
|||
|
||||
out_q:
|
||||
xe_exec_queue_put(q);
|
||||
out_bo:
|
||||
xe_bo_unpin_map_no_vm(bo);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -114,8 +114,10 @@ int xe_gt_sriov_pf_monitor_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32
|
|||
* VFs with no events are not printed.
|
||||
*
|
||||
* This function can only be called on PF.
|
||||
*
|
||||
* Return: always 0
|
||||
*/
|
||||
void xe_gt_sriov_pf_monitor_print_events(struct xe_gt *gt, struct drm_printer *p)
|
||||
int xe_gt_sriov_pf_monitor_print_events(struct xe_gt *gt, struct drm_printer *p)
|
||||
{
|
||||
unsigned int n, total_vfs = xe_gt_sriov_pf_get_totalvfs(gt);
|
||||
const struct xe_gt_sriov_monitor *data;
|
||||
|
|
@ -144,4 +146,6 @@ void xe_gt_sriov_pf_monitor_print_events(struct xe_gt *gt, struct drm_printer *p
|
|||
#undef __format
|
||||
#undef __value
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ struct drm_printer;
|
|||
struct xe_gt;
|
||||
|
||||
void xe_gt_sriov_pf_monitor_flr(struct xe_gt *gt, u32 vfid);
|
||||
void xe_gt_sriov_pf_monitor_print_events(struct xe_gt *gt, struct drm_printer *p);
|
||||
int xe_gt_sriov_pf_monitor_print_events(struct xe_gt *gt, struct drm_printer *p);
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
int xe_gt_sriov_pf_monitor_process_guc2pf(struct xe_gt *gt, const u32 *msg, u32 len);
|
||||
|
|
|
|||
|
|
@ -1137,13 +1137,15 @@ void xe_gt_sriov_vf_write32(struct xe_gt *gt, struct xe_reg reg, u32 val)
|
|||
}
|
||||
|
||||
/**
|
||||
* xe_gt_sriov_vf_print_config - Print VF self config.
|
||||
* xe_gt_sriov_vf_print_config() - Print VF self config.
|
||||
* @gt: the &xe_gt
|
||||
* @p: the &drm_printer
|
||||
*
|
||||
* This function is for VF use only.
|
||||
*
|
||||
* Return: always 0.
|
||||
*/
|
||||
void xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct drm_printer *p)
|
||||
int xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct drm_printer *p)
|
||||
{
|
||||
struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
|
||||
struct xe_device *xe = gt_to_xe(gt);
|
||||
|
|
@ -1170,16 +1172,20 @@ void xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct drm_printer *p)
|
|||
|
||||
drm_printf(p, "GuC contexts:\t%u\n", config->num_ctxs);
|
||||
drm_printf(p, "GuC doorbells:\t%u\n", config->num_dbs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_gt_sriov_vf_print_runtime - Print VF's runtime regs received from PF.
|
||||
* xe_gt_sriov_vf_print_runtime() - Print VF's runtime regs received from PF.
|
||||
* @gt: the &xe_gt
|
||||
* @p: the &drm_printer
|
||||
*
|
||||
* This function is for VF use only.
|
||||
*
|
||||
* Return: always 0.
|
||||
*/
|
||||
void xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct drm_printer *p)
|
||||
int xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct drm_printer *p)
|
||||
{
|
||||
struct vf_runtime_reg *vf_regs = gt->sriov.vf.runtime.regs;
|
||||
unsigned int size = gt->sriov.vf.runtime.num_regs;
|
||||
|
|
@ -1188,16 +1194,20 @@ void xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct drm_printer *p)
|
|||
|
||||
for (; size--; vf_regs++)
|
||||
drm_printf(p, "%#x = %#x\n", vf_regs->offset, vf_regs->value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_gt_sriov_vf_print_version - Print VF ABI versions.
|
||||
* xe_gt_sriov_vf_print_version() - Print VF ABI versions.
|
||||
* @gt: the &xe_gt
|
||||
* @p: the &drm_printer
|
||||
*
|
||||
* This function is for VF use only.
|
||||
*
|
||||
* Return: always 0.
|
||||
*/
|
||||
void xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct drm_printer *p)
|
||||
int xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct drm_printer *p)
|
||||
{
|
||||
struct xe_device *xe = gt_to_xe(gt);
|
||||
struct xe_uc_fw_version *guc_version = >->sriov.vf.guc_version;
|
||||
|
|
@ -1227,6 +1237,8 @@ void xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct drm_printer *p)
|
|||
GUC_RELAY_VERSION_LATEST_MAJOR, GUC_RELAY_VERSION_LATEST_MINOR);
|
||||
drm_printf(p, "\thandshake:\t%u.%u\n",
|
||||
pf_version->major, pf_version->minor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool vf_post_migration_shutdown(struct xe_gt *gt)
|
||||
|
|
|
|||
|
|
@ -35,9 +35,9 @@ bool xe_gt_sriov_vf_sched_groups_enabled(struct xe_gt *gt);
|
|||
u32 xe_gt_sriov_vf_read32(struct xe_gt *gt, struct xe_reg reg);
|
||||
void xe_gt_sriov_vf_write32(struct xe_gt *gt, struct xe_reg reg, u32 val);
|
||||
|
||||
void xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct drm_printer *p);
|
||||
void xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct drm_printer *p);
|
||||
void xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct drm_printer *p);
|
||||
int xe_gt_sriov_vf_print_config(struct xe_gt *gt, struct drm_printer *p);
|
||||
int xe_gt_sriov_vf_print_runtime(struct xe_gt *gt, struct drm_printer *p);
|
||||
int xe_gt_sriov_vf_print_version(struct xe_gt *gt, struct drm_printer *p);
|
||||
|
||||
int xe_gt_sriov_vf_wait_valid_ggtt(struct xe_gt *gt);
|
||||
int xe_vf_migration_fixups_complete_count(struct xe_gt *gt);
|
||||
|
|
|
|||
|
|
@ -1673,6 +1673,14 @@ static void guc_exec_queue_fini(struct xe_exec_queue *q)
|
|||
struct xe_guc_exec_queue *ge = q->guc;
|
||||
struct xe_guc *guc = exec_queue_to_guc(q);
|
||||
|
||||
if (xe_exec_queue_is_multi_queue_secondary(q)) {
|
||||
struct xe_exec_queue_group *group = q->multi_queue.group;
|
||||
|
||||
mutex_lock(&group->list_lock);
|
||||
list_del(&q->multi_queue.link);
|
||||
mutex_unlock(&group->list_lock);
|
||||
}
|
||||
|
||||
release_guc_id(guc, q);
|
||||
xe_sched_entity_fini(&ge->entity);
|
||||
xe_sched_fini(&ge->sched);
|
||||
|
|
@ -1694,14 +1702,6 @@ static void __guc_exec_queue_destroy_async(struct work_struct *w)
|
|||
guard(xe_pm_runtime)(guc_to_xe(guc));
|
||||
trace_xe_exec_queue_destroy(q);
|
||||
|
||||
if (xe_exec_queue_is_multi_queue_secondary(q)) {
|
||||
struct xe_exec_queue_group *group = q->multi_queue.group;
|
||||
|
||||
mutex_lock(&group->list_lock);
|
||||
list_del(&q->multi_queue.link);
|
||||
mutex_unlock(&group->list_lock);
|
||||
}
|
||||
|
||||
/* Confirm no work left behind accessing device structures */
|
||||
cancel_delayed_work_sync(&ge->sched.base.work_tdr);
|
||||
|
||||
|
|
|
|||
|
|
@ -427,13 +427,25 @@ static bool memirq_received(struct xe_memirq *memirq, struct iosys_map *vector,
|
|||
return __memirq_received(memirq, vector, offset, name, true);
|
||||
}
|
||||
|
||||
static void memirq_assume_received(struct xe_memirq *memirq, const char *source,
|
||||
u16 offset, const char *status)
|
||||
{
|
||||
memirq_debug(memirq, "ASSUME %s %s(%u)\n", source, status, offset);
|
||||
}
|
||||
|
||||
static void memirq_dispatch_engine(struct xe_memirq *memirq, struct iosys_map *status,
|
||||
struct xe_hw_engine *hwe)
|
||||
{
|
||||
memirq_debug(memirq, "STATUS %s %*ph\n", hwe->name, 16, status->vaddr);
|
||||
|
||||
if (memirq_received(memirq, status, ilog2(GT_MI_USER_INTERRUPT), hwe->name))
|
||||
xe_hw_engine_handle_irq(hwe, GT_MI_USER_INTERRUPT);
|
||||
/*
|
||||
* The programming note says to assume that GT_MI_USER_INTERRUPT is always
|
||||
* set. Check and clear related status byte just for a debug.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEMIRQ) &&
|
||||
!memirq_received(memirq, status, ilog2(GT_MI_USER_INTERRUPT), hwe->name))
|
||||
memirq_assume_received(memirq, hwe->name, ilog2(GT_MI_USER_INTERRUPT), "USER");
|
||||
xe_hw_engine_handle_irq(hwe, GT_MI_USER_INTERRUPT);
|
||||
}
|
||||
|
||||
static void memirq_dispatch_guc(struct xe_memirq *memirq, struct iosys_map *status,
|
||||
|
|
@ -443,8 +455,14 @@ static void memirq_dispatch_guc(struct xe_memirq *memirq, struct iosys_map *stat
|
|||
|
||||
memirq_debug(memirq, "STATUS %s %*ph\n", name, 16, status->vaddr);
|
||||
|
||||
if (memirq_received(memirq, status, ilog2(GUC_INTR_GUC2HOST), name))
|
||||
xe_guc_irq_handler(guc, GUC_INTR_GUC2HOST);
|
||||
/*
|
||||
* The programming note says to assume that GUC_INTR_GUC2HOST is always
|
||||
* set. Check and clear related status byte just for a debug.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEMIRQ) &&
|
||||
!memirq_received(memirq, status, ilog2(GUC_INTR_GUC2HOST), name))
|
||||
memirq_assume_received(memirq, name, ilog2(GUC_INTR_GUC2HOST), "GUC2HOST");
|
||||
xe_guc_irq_handler(guc, GUC_INTR_GUC2HOST);
|
||||
|
||||
/*
|
||||
* This is a software interrupt that must be cleared after it's consumed
|
||||
|
|
|
|||
|
|
@ -2032,8 +2032,10 @@ int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *f
|
|||
if (XE_IOCTL_DBG(oa->xe, !param.exec_q))
|
||||
return -ENOENT;
|
||||
|
||||
if (XE_IOCTL_DBG(oa->xe, param.exec_q->width > 1))
|
||||
return -EOPNOTSUPP;
|
||||
if (XE_IOCTL_DBG(oa->xe, param.exec_q->width > 1)) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto err_exec_q;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ static const struct xe_rtp_entry_sr engine_tunings[] = {
|
|||
static const struct xe_rtp_entry_sr lrc_tunings[] = {
|
||||
{ XE_RTP_NAME("Tuning: Windower HW Filtering"),
|
||||
XE_RTP_RULES(GRAPHICS_VERSION_RANGE(3000, 3599), ENGINE_CLASS(RENDER)),
|
||||
XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN4, HW_FILTERING))
|
||||
XE_RTP_ACTIONS(SET(XEHP_COMMON_SLICE_CHICKEN4, HW_FILTERING))
|
||||
},
|
||||
|
||||
/* DG2 */
|
||||
|
|
|
|||
|
|
@ -651,7 +651,7 @@ static const struct xe_rtp_entry_sr lrc_was[] = {
|
|||
},
|
||||
{ XE_RTP_NAME("18033852989"),
|
||||
XE_RTP_RULES(GRAPHICS_VERSION_RANGE(2001, 2004), ENGINE_CLASS(RENDER)),
|
||||
XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN1, DISABLE_BOTTOM_CLIP_RECTANGLE_TEST))
|
||||
XE_RTP_ACTIONS(SET(XEHP_COMMON_SLICE_CHICKEN1, DISABLE_BOTTOM_CLIP_RECTANGLE_TEST))
|
||||
},
|
||||
{ XE_RTP_NAME("15016589081"),
|
||||
XE_RTP_RULES(GRAPHICS_VERSION_RANGE(2001, 2004), ENGINE_CLASS(RENDER)),
|
||||
|
|
@ -754,7 +754,7 @@ static const struct xe_rtp_entry_sr lrc_was[] = {
|
|||
},
|
||||
{ XE_RTP_NAME("22021007897"),
|
||||
XE_RTP_RULES(GRAPHICS_VERSION_RANGE(2001, 2002), ENGINE_CLASS(RENDER)),
|
||||
XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN4, SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE))
|
||||
XE_RTP_ACTIONS(SET(XEHP_COMMON_SLICE_CHICKEN4, SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE))
|
||||
},
|
||||
|
||||
/* Xe3_LPG */
|
||||
|
|
@ -770,7 +770,7 @@ static const struct xe_rtp_entry_sr lrc_was[] = {
|
|||
},
|
||||
{ XE_RTP_NAME("22021007897"),
|
||||
XE_RTP_RULES(GRAPHICS_VERSION_RANGE(3000, 3005), ENGINE_CLASS(RENDER)),
|
||||
XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN4, SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE))
|
||||
XE_RTP_ACTIONS(SET(XEHP_COMMON_SLICE_CHICKEN4, SBE_PUSH_CONSTANT_BEHIND_FIX_ENABLE))
|
||||
},
|
||||
{ XE_RTP_NAME("14024681466"),
|
||||
XE_RTP_RULES(GRAPHICS_VERSION_RANGE(3000, 3005), ENGINE_CLASS(RENDER)),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user