drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/vmm.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/vmm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/vmm.c- Extension
.c- Size
- 5383 bytes
- Lines
- 192
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
subdev/mmu/vmm.hnvhw/drf.hnvrm/vmm.h
Detected Declarations
function filesfunction r535_mmu_vaspace_newfunction r535_mmu_promote_vmmfunction r535_mmu_dtorfunction r535_mmu_new
Annotated Snippet
if (!IS_ERR(ctrl)) {
ctrl->hVASpace = vmm->rm.object.handle;
WARN_ON(nvkm_gsp_rm_ctrl_wr(&vmm->rm.device.object, ctrl));
}
vmm->rm.external = false;
}
nvkm_gsp_rm_free(&vmm->rm.object);
nvkm_gsp_device_dtor(&vmm->rm.device);
nvkm_gsp_client_dtor(&vmm->rm.client);
nvkm_vmm_put(vmm, &vmm->rm.rsvd);
}
int
r535_mmu_vaspace_new(struct nvkm_vmm *vmm, u32 handle, bool external)
{
NV_VASPACE_ALLOCATION_PARAMETERS *args;
int ret;
ret = nvkm_gsp_client_device_ctor(vmm->mmu->subdev.device->gsp,
&vmm->rm.client, &vmm->rm.device);
if (ret)
return ret;
args = nvkm_gsp_rm_alloc_get(&vmm->rm.device.object, handle, FERMI_VASPACE_A,
sizeof(*args), &vmm->rm.object);
if (IS_ERR(args))
return PTR_ERR(args);
args->index = NV_VASPACE_ALLOCATION_INDEX_GPU_NEW;
if (external)
args->flags = NV_VASPACE_ALLOCATION_FLAGS_IS_EXTERNALLY_OWNED;
ret = nvkm_gsp_rm_alloc_wr(&vmm->rm.object, args);
if (ret)
return ret;
if (!external) {
NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS *ctrl;
u8 page_shift = 29; /* 512MiB */
const u64 page_size = BIT_ULL(page_shift);
const struct nvkm_vmm_page *page;
const struct nvkm_vmm_desc *desc;
struct nvkm_vmm_pt *pd = vmm->pd;
for (page = vmm->func->page; page->shift; page++) {
if (page->shift == page_shift)
break;
}
if (WARN_ON(!page->shift))
return -EINVAL;
mutex_lock(&vmm->mutex.vmm);
ret = nvkm_vmm_get_locked(vmm, true, false, false, page_shift, 32, page_size,
&vmm->rm.rsvd);
mutex_unlock(&vmm->mutex.vmm);
if (ret)
return ret;
/* Some parts of RM expect the server-reserved area to be in a specific location. */
if (WARN_ON(vmm->rm.rsvd->addr != SPLIT_VAS_SERVER_RM_MANAGED_VA_START ||
vmm->rm.rsvd->size != SPLIT_VAS_SERVER_RM_MANAGED_VA_SIZE))
return -EINVAL;
ctrl = nvkm_gsp_rm_ctrl_get(&vmm->rm.object,
NV90F1_CTRL_CMD_VASPACE_COPY_SERVER_RESERVED_PDES,
sizeof(*ctrl));
if (IS_ERR(ctrl))
return PTR_ERR(ctrl);
ctrl->pageSize = page_size;
ctrl->virtAddrLo = vmm->rm.rsvd->addr;
ctrl->virtAddrHi = vmm->rm.rsvd->addr + vmm->rm.rsvd->size - 1;
for (desc = page->desc; desc->bits; desc++) {
ctrl->numLevelsToCopy++;
page_shift += desc->bits;
}
desc--;
for (int i = 0; i < ctrl->numLevelsToCopy; i++, desc--) {
page_shift -= desc->bits;
ctrl->levels[i].physAddress = pd->pt[0]->addr;
ctrl->levels[i].size = BIT_ULL(desc->bits) * desc->size;
ctrl->levels[i].aperture = 1;
Annotation
- Immediate include surface: `subdev/mmu/vmm.h`, `nvhw/drf.h`, `nvrm/vmm.h`.
- Detected declarations: `function files`, `function r535_mmu_vaspace_new`, `function r535_mmu_promote_vmm`, `function r535_mmu_dtor`, `function r535_mmu_new`.
- 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.