mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 19:13:47 +02:00
drm/xe: Implement xe_pagefault_reset
Squash any pending faults on the GT being reset by setting the GT field in struct xe_pagefault to NULL. v4: - Only do reset it page faults queues initialized (CI) Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com> Tested-by: Francois Dugast <francois.dugast@intel.com> Link: https://patch.msgid.link/20251031165416.2871503-4-matthew.brost@intel.com
This commit is contained in:
parent
1919d1687e
commit
79be336d1a
|
|
@ -49,6 +49,7 @@
|
|||
#include "xe_map.h"
|
||||
#include "xe_migrate.h"
|
||||
#include "xe_mmio.h"
|
||||
#include "xe_pagefault.h"
|
||||
#include "xe_pat.h"
|
||||
#include "xe_pm.h"
|
||||
#include "xe_mocs.h"
|
||||
|
|
@ -853,6 +854,7 @@ static void gt_reset_worker(struct work_struct *w)
|
|||
|
||||
xe_uc_gucrc_disable(>->uc);
|
||||
xe_uc_stop_prepare(>->uc);
|
||||
xe_pagefault_reset(gt_to_xe(gt), gt);
|
||||
xe_gt_pagefault_reset(gt);
|
||||
|
||||
xe_uc_stop(>->uc);
|
||||
|
|
|
|||
|
|
@ -129,6 +129,28 @@ int xe_pagefault_init(struct xe_device *xe)
|
|||
return err;
|
||||
}
|
||||
|
||||
static void xe_pagefault_queue_reset(struct xe_device *xe, struct xe_gt *gt,
|
||||
struct xe_pagefault_queue *pf_queue)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
/* Driver load failure guard / USM not enabled guard */
|
||||
if (!pf_queue->data)
|
||||
return;
|
||||
|
||||
/* Squash all pending faults on the GT */
|
||||
|
||||
spin_lock_irq(&pf_queue->lock);
|
||||
for (i = pf_queue->tail; i != pf_queue->head;
|
||||
i = (i + xe_pagefault_entry_size()) % pf_queue->size) {
|
||||
struct xe_pagefault *pf = pf_queue->data + i;
|
||||
|
||||
if (pf->gt == gt)
|
||||
pf->gt = NULL;
|
||||
}
|
||||
spin_unlock_irq(&pf_queue->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_pagefault_reset() - Page fault reset for a GT
|
||||
* @xe: xe device instance
|
||||
|
|
@ -139,7 +161,10 @@ int xe_pagefault_init(struct xe_device *xe)
|
|||
*/
|
||||
void xe_pagefault_reset(struct xe_device *xe, struct xe_gt *gt)
|
||||
{
|
||||
/* TODO - implement */
|
||||
int i;
|
||||
|
||||
for (i = 0; i < XE_PAGEFAULT_QUEUE_COUNT; ++i)
|
||||
xe_pagefault_queue_reset(xe, gt, xe->usm.pf_queue + i);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user