drivers/gpu/drm/xe/xe_tlb_inval.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/xe_tlb_inval.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/xe/xe_tlb_inval.c- Extension
.c- Size
- 16804 bytes
- Lines
- 573
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
drm/drm_managed.hxe_device_types.hxe_force_wake.hxe_gt_stats.hxe_gt_types.hxe_guc_ct.hxe_guc_tlb_inval.hxe_mmio.hxe_pm.hxe_tlb_inval.hxe_trace.h
Detected Declarations
function hardwarefunction xe_tlb_inval_fence_signalfunction xe_tlb_inval_fence_signal_unlockedfunction xe_tlb_inval_fence_timeoutfunction tlb_inval_finifunction primelockdepfunction xe_gt_tlb_inval_init_earlyfunction xe_tlb_inval_resetfunction xe_tlb_inval_reset_timeoutfunction xe_tlb_inval_seqno_pastfunction xe_tlb_inval_fence_prepfunction xe_tlb_inval_allfunction xe_tlb_inval_ggttfunction xe_tlb_inval_rangefunction xe_tlb_inval_vmfunction xe_tlb_inval_done_handlerfunction list_for_each_entry_safefunction xe_inval_fence_get_driver_namefunction xe_inval_fence_get_timeline_namefunction xe_tlb_inval_fence_initfunction xe_tlb_inval_idlefunction xe_tlb_inval_batch_waitfunction xe_tlb_inval_range_tilemask_submitfunction for_each_tile
Annotated Snippet
// SPDX-License-Identifier: MIT
/*
* Copyright © 2023 Intel Corporation
*/
#include <drm/drm_managed.h>
#include "xe_device_types.h"
#include "xe_force_wake.h"
#include "xe_gt_stats.h"
#include "xe_gt_types.h"
#include "xe_guc_ct.h"
#include "xe_guc_tlb_inval.h"
#include "xe_mmio.h"
#include "xe_pm.h"
#include "xe_tlb_inval.h"
#include "xe_trace.h"
/**
* DOC: Xe TLB invalidation
*
* Xe TLB invalidation is implemented in two layers. The first is the frontend
* API, which provides an interface for TLB invalidations to the driver code.
* The frontend handles seqno assignment, synchronization (fences), and the
* timeout mechanism. The frontend is implemented via an embedded structure
* xe_tlb_inval that includes a set of ops hooking into the backend. The backend
* interacts with the hardware (or firmware) to perform the actual invalidation.
*/
#define FENCE_STACK_BIT DMA_FENCE_FLAG_USER_BITS
static void xe_tlb_inval_fence_fini(struct xe_tlb_inval_fence *fence)
{
if (WARN_ON_ONCE(!fence->tlb_inval))
return;
xe_pm_runtime_put(fence->tlb_inval->xe);
fence->tlb_inval = NULL; /* fini() should be called once */
}
static void
xe_tlb_inval_fence_signal(struct xe_tlb_inval_fence *fence)
{
struct xe_tlb_inval *tlb_inval = fence->tlb_inval;
bool stack = test_bit(FENCE_STACK_BIT, &fence->base.flags);
lockdep_assert_held(&fence->tlb_inval->pending_lock);
list_del(&fence->link);
if (list_empty(&tlb_inval->pending_fences))
cancel_delayed_work(&tlb_inval->fence_tdr);
trace_xe_tlb_inval_fence_signal(fence->tlb_inval->xe, fence);
xe_tlb_inval_fence_fini(fence);
dma_fence_signal(&fence->base);
if (!stack)
dma_fence_put(&fence->base);
}
static void
xe_tlb_inval_fence_signal_unlocked(struct xe_tlb_inval_fence *fence)
{
struct xe_tlb_inval *tlb_inval = fence->tlb_inval;
spin_lock_irq(&tlb_inval->pending_lock);
xe_tlb_inval_fence_signal(fence);
spin_unlock_irq(&tlb_inval->pending_lock);
}
static void xe_tlb_inval_fence_timeout(struct work_struct *work)
{
struct xe_tlb_inval *tlb_inval = container_of(work, struct xe_tlb_inval,
fence_tdr.work);
struct xe_device *xe = tlb_inval->xe;
struct xe_tlb_inval_fence *fence, *next;
long timeout_delay = tlb_inval->ops->timeout_delay(tlb_inval);
tlb_inval->ops->flush(tlb_inval);
spin_lock_irq(&tlb_inval->pending_lock);
list_for_each_entry_safe(fence, next,
&tlb_inval->pending_fences, link) {
s64 since_inval_ms = ktime_ms_delta(ktime_get(),
fence->inval_time);
if (msecs_to_jiffies(since_inval_ms) < timeout_delay)
break;
trace_xe_tlb_inval_fence_timeout(xe, fence);
drm_err(&xe->drm,
"TLB invalidation fence timeout, seqno=%d recv=%d",
Annotation
- Immediate include surface: `drm/drm_managed.h`, `xe_device_types.h`, `xe_force_wake.h`, `xe_gt_stats.h`, `xe_gt_types.h`, `xe_guc_ct.h`, `xe_guc_tlb_inval.h`, `xe_mmio.h`.
- Detected declarations: `function hardware`, `function xe_tlb_inval_fence_signal`, `function xe_tlb_inval_fence_signal_unlocked`, `function xe_tlb_inval_fence_timeout`, `function tlb_inval_fini`, `function primelockdep`, `function xe_gt_tlb_inval_init_early`, `function xe_tlb_inval_reset`, `function xe_tlb_inval_reset_timeout`, `function xe_tlb_inval_seqno_past`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.