drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c- Extension
.c- Size
- 30391 bytes
- Lines
- 1135
- 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
linux/firmware.hlinux/pci.hdrm/drm_cache.hamdgpu.hamdgpu_atomfirmware.hgmc_v10_0.humc_v8_7.hathub/athub_2_0_0_sh_mask.hathub/athub_2_0_0_offset.hdcn/dcn_2_0_0_offset.hdcn/dcn_2_0_0_sh_mask.hoss/osssys_5_0_0_offset.hivsrcid/vmc/irqsrcs_vmc_1_0.hnavi10_enum.hsoc15.hsoc15d.hsoc15_common.hnbio_v2_3.hgfxhub_v2_0.hgfxhub_v2_1.hmmhub_v2_0.hmmhub_v2_3.hathub_v2_0.hathub_v2_1.h
Detected Declarations
function filesfunction gmc_v10_0_vm_fault_interrupt_statefunction gmc_v10_0_process_interruptfunction gmc_v10_0_set_irq_funcsfunction gmc_v10_0_use_invalidate_semaphorefunction gmc_v10_0_get_atc_vmid_pasid_mapping_infofunction gmc_v10_0_flush_gpu_tlbfunction gmc_v10_0_flush_gpu_tlb_pasidfunction gmc_v10_0_emit_flush_gpu_tlbfunction gmc_v10_0_emit_pasid_mappingfunction gmc_v10_0_get_vm_pdefunction gmc_v10_0_get_vm_ptefunction gmc_v10_0_get_vbios_fb_sizefunction gmc_v10_0_set_gmc_funcsfunction gmc_v10_0_set_umc_funcsfunction gmc_v10_0_set_mmhub_funcsfunction gmc_v10_0_set_gfxhub_funcsfunction gmc_v10_0_early_initfunction gmc_v10_0_late_initfunction gmc_v10_0_vram_gtt_locationfunction gmc_v10_0_mc_initfunction gmc_v10_0_gart_initfunction gmc_v10_0_sw_initfunction gmc_v10_0_gart_finifunction gmc_v10_0_sw_finifunction gmc_v10_0_init_golden_registersfunction gmc_v10_0_hw_initfunction gmc_v10_0_gart_disablefunction gmc_v10_0_hw_finifunction gmc_v10_0_suspendfunction gmc_v10_0_resumefunction gmc_v10_0_is_idlefunction gmc_v10_0_wait_for_idlefunction gmc_v10_0_set_clockgating_statefunction amdgpu_ip_versionfunction gmc_v10_0_get_clockgating_statefunction gmc_v10_0_set_powergating_state
Annotated Snippet
if (all_hub) {
for_each_set_bit(i, adev->vmhubs_mask,
AMDGPU_MAX_VMHUBS)
gmc_v10_0_flush_gpu_tlb(adev, vmid, i,
flush_type);
} else {
gmc_v10_0_flush_gpu_tlb(adev, vmid, AMDGPU_GFXHUB(0),
flush_type);
}
}
}
static uint64_t gmc_v10_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring,
unsigned int vmid, uint64_t pd_addr)
{
bool use_semaphore = gmc_v10_0_use_invalidate_semaphore(ring->adev, ring->vm_hub);
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->vm_hub];
uint32_t req = hub->vmhub_funcs->get_invalidate_req(vmid, 0);
unsigned int eng = ring->vm_inv_eng;
/*
* It may lose gpuvm invalidate acknowldege state across power-gating
* off cycle, add semaphore acquire before invalidation and semaphore
* release after invalidation to avoid entering power gated state
* to WA the Issue
*/
/* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */
if (use_semaphore)
/* a read return value of 1 means semaphore acuqire */
amdgpu_ring_emit_reg_wait(ring,
hub->vm_inv_eng0_sem +
hub->eng_distance * eng, 0x1, 0x1);
amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 +
(hub->ctx_addr_distance * vmid),
lower_32_bits(pd_addr));
amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 +
(hub->ctx_addr_distance * vmid),
upper_32_bits(pd_addr));
amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req +
hub->eng_distance * eng,
hub->vm_inv_eng0_ack +
hub->eng_distance * eng,
req, 1 << vmid);
/* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */
if (use_semaphore)
/*
* add semaphore release after invalidation,
* write with 0 means semaphore release
*/
amdgpu_ring_emit_wreg(ring, hub->vm_inv_eng0_sem +
hub->eng_distance * eng, 0);
return pd_addr;
}
static void gmc_v10_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned int vmid,
unsigned int pasid)
{
struct amdgpu_device *adev = ring->adev;
uint32_t reg;
if (ring->vm_hub == AMDGPU_GFXHUB(0))
reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT) + vmid;
else
reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT_MM) + vmid;
amdgpu_ring_emit_wreg(ring, reg, pasid);
}
/*
* PTE format on NAVI 10:
* 63:59 reserved
* 58 reserved and for sienna_cichlid is used for MALL noalloc
* 57 reserved
* 56 F
* 55 L
* 54 reserved
* 53:52 SW
* 51 T
* 50:48 mtype
* 47:12 4k physical page base address
* 11:7 fragment
* 6 write
* 5 read
* 4 exe
Annotation
- Immediate include surface: `linux/firmware.h`, `linux/pci.h`, `drm/drm_cache.h`, `amdgpu.h`, `amdgpu_atomfirmware.h`, `gmc_v10_0.h`, `umc_v8_7.h`, `athub/athub_2_0_0_sh_mask.h`.
- Detected declarations: `function files`, `function gmc_v10_0_vm_fault_interrupt_state`, `function gmc_v10_0_process_interrupt`, `function gmc_v10_0_set_irq_funcs`, `function gmc_v10_0_use_invalidate_semaphore`, `function gmc_v10_0_get_atc_vmid_pasid_mapping_info`, `function gmc_v10_0_flush_gpu_tlb`, `function gmc_v10_0_flush_gpu_tlb_pasid`, `function gmc_v10_0_emit_flush_gpu_tlb`, `function gmc_v10_0_emit_pasid_mapping`.
- 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.