drivers/gpu/drm/xe/xe_guc_pagefault.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/xe_guc_pagefault.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/xe/xe_guc_pagefault.c- Extension
.c- Size
- 3194 bytes
- Lines
- 104
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
abi/guc_actions_abi.hxe_guc.hxe_guc_ct.hxe_guc_pagefault.hxe_pagefault.hxe_pagefault_types.h
Detected Declarations
function guc_ack_faultfunction xe_guc_pagefault_handler
Annotated Snippet
// SPDX-License-Identifier: MIT
/*
* Copyright © 2025 Intel Corporation
*/
#include "abi/guc_actions_abi.h"
#include "xe_guc.h"
#include "xe_guc_ct.h"
#include "xe_guc_pagefault.h"
#include "xe_pagefault.h"
#include "xe_pagefault_types.h"
static void guc_ack_fault(struct xe_pagefault *pf, int err)
{
u32 vfid = FIELD_GET(PFD_VFID, pf->producer.msg[2]);
u32 prefetch = FIELD_GET(PFD_PREFETCH, pf->producer.msg[2]);
u32 engine_instance = FIELD_GET(PFD_ENG_INSTANCE, pf->producer.msg[0]);
u32 engine_class = FIELD_GET(PFD_ENG_CLASS, pf->producer.msg[0]);
u32 pdata = FIELD_GET(PFD_PDATA_LO, pf->producer.msg[0]) |
(FIELD_GET(PFD_PDATA_HI, pf->producer.msg[1]) <<
PFD_PDATA_HI_SHIFT);
u32 asid = FIELD_GET(PFD_ASID, pf->producer.msg[1]);
u32 action[] = {
XE_GUC_ACTION_PAGE_FAULT_RES_DESC,
FIELD_PREP(PFR_VALID, 1) |
FIELD_PREP(PFR_SUCCESS, !!err) |
FIELD_PREP(PFR_REPLY, PFR_ACCESS) |
FIELD_PREP(PFR_DESC_TYPE, FAULT_RESPONSE_DESC) |
FIELD_PREP(PFR_ASID, asid),
FIELD_PREP(PFR_VFID, vfid) |
FIELD_PREP(PFR_PREFETCH, err ? prefetch : 0) |
FIELD_PREP(PFR_ENG_INSTANCE, engine_instance) |
FIELD_PREP(PFR_ENG_CLASS, engine_class) |
FIELD_PREP(PFR_PDATA, pdata),
};
struct xe_guc *guc = pf->producer.private;
xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
}
static const struct xe_pagefault_ops guc_pagefault_ops = {
.ack_fault = guc_ack_fault,
};
/**
* xe_guc_pagefault_handler() - G2H page fault handler
* @guc: GuC object
* @msg: G2H message
* @len: Length of G2H message
*
* Parse GuC to host (G2H) message into a struct xe_pagefault and forward onto
* the Xe page fault layer.
*
* Return: 0 on success, errno on failure
*/
int xe_guc_pagefault_handler(struct xe_guc *guc, u32 *msg, u32 len)
{
struct xe_pagefault pf;
int i;
#define GUC_PF_MSG_LEN_DW \
(sizeof(struct xe_guc_pagefault_desc) / sizeof(u32))
BUILD_BUG_ON(GUC_PF_MSG_LEN_DW > XE_PAGEFAULT_PRODUCER_MSG_LEN_DW);
if (len != GUC_PF_MSG_LEN_DW)
return -EPROTO;
pf.gt = guc_to_gt(guc);
/*
* XXX: These values happen to match the enum in xe_pagefault_types.h.
* If that changes, we’ll need to remap them here.
*/
pf.consumer.page_addr = ((u64)FIELD_GET(PFD_VIRTUAL_ADDR_HI, msg[3])
<< PFD_VIRTUAL_ADDR_HI_SHIFT) |
(FIELD_GET(PFD_VIRTUAL_ADDR_LO, msg[2]) <<
PFD_VIRTUAL_ADDR_LO_SHIFT);
pf.consumer.asid = FIELD_GET(PFD_ASID, msg[1]);
pf.consumer.access_type = FIELD_GET(PFD_ACCESS_TYPE, msg[2]) |
(FIELD_GET(PFD_PREFETCH, msg[2]) ? XE_PAGEFAULT_ACCESS_PREFETCH : 0);
if (FIELD_GET(XE2_PFD_TRVA_FAULT, msg[0]))
pf.consumer.fault_type_level = XE_PAGEFAULT_TYPE_LEVEL_NACK;
else
pf.consumer.fault_type_level =
FIELD_PREP(XE_PAGEFAULT_LEVEL_MASK,
FIELD_GET(PFD_FAULT_LEVEL, msg[0])) |
FIELD_PREP(XE_PAGEFAULT_TYPE_MASK,
Annotation
- Immediate include surface: `abi/guc_actions_abi.h`, `xe_guc.h`, `xe_guc_ct.h`, `xe_guc_pagefault.h`, `xe_pagefault.h`, `xe_pagefault_types.h`.
- Detected declarations: `function guc_ack_fault`, `function xe_guc_pagefault_handler`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
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.