drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c- Extension
.c- Size
- 59990 bytes
- Lines
- 1900
- 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
linux/delay.hlinux/firmware.hlinux/module.hlinux/pci.hamdgpu.hamdgpu_ucode.hamdgpu_trace.hgc/gc_11_0_0_offset.hgc/gc_11_0_0_sh_mask.hgc/gc_11_0_0_default.hhdp/hdp_6_0_0_offset.hivsrcid/gfx/irqsrcs_gfx_11_0_0.hsoc15_common.hsoc15.hsdma_v6_0_0_pkt_open.hnbio_v4_3.hsdma_common.hsdma_v6_0.hv11_structs.hmes_userqueue.hamdgpu_userq_fence.h
Detected Declarations
function sdma_v6_0_get_reg_offsetfunction sdma_v6_0_ring_init_cond_execfunction sdma_v6_0_ring_get_rptrfunction sdma_v6_0_ring_get_wptrfunction sdma_v6_0_ring_set_wptrfunction sdma_v6_0_ring_insert_nopfunction sdma_v6_0_ring_emit_ibfunction sdma_v6_0_ring_emit_mem_syncfunction sdma_v6_0_ring_emit_hdp_flushfunction sdma_v6_0_ring_emit_fencefunction sdma_v6_0_gfx_stopfunction sdma_v6_0_rlc_stopfunction sdma_v6_0_enablefunction sdma_v6_0_gfx_resume_instancefunction sdma_v6_0_gfx_resumefunction sdma_v6_0_rlc_resumefunction sdma_v6_0_load_microcodefunction sdma_v6_0_soft_resetfunction sdma_v6_0_check_soft_resetfunction sdma_v6_0_startfunction sdma_v6_0_mqd_initfunction sdma_v6_0_set_mqd_funcsfunction sdma_v6_0_ring_test_ringfunction sdma_v6_0_ring_test_ibfunction sdma_v6_0_vm_copy_ptefunction sdma_v6_0_vm_write_ptefunction sdma_v6_0_vm_set_pte_pdefunction sdma_v6_0_ring_pad_ibfunction completedfunction sdma_v6_0_ring_emit_vm_flushfunction sdma_v6_0_ring_emit_wregfunction sdma_v6_0_ring_emit_reg_waitfunction sdma_v6_0_ring_emit_reg_write_reg_waitfunction sdma_v6_0_set_ras_funcsfunction sdma_v6_0_get_csa_infofunction sdma_v6_0_early_initfunction sdma_v6_0_sw_initfunction sdma_v6_0_sw_finifunction sdma_v6_0_set_userq_trap_interruptsfunction sdma_v6_0_hw_initfunction sdma_v6_0_hw_finifunction sdma_v6_0_suspendfunction sdma_v6_0_resumefunction sdma_v6_0_is_idlefunction sdma_v6_0_wait_for_idlefunction sdma_v6_0_ring_preempt_ibfunction sdma_v6_0_reset_queuefunction sdma_v6_0_set_trap_irq_state
Annotated Snippet
switch (queue) {
case 0:
amdgpu_fence_process(&adev->sdma.instance[instances].ring);
break;
default:
break;
}
break;
}
return 0;
}
static int sdma_v6_0_process_fence_irq(struct amdgpu_device *adev,
struct amdgpu_irq_src *source,
struct amdgpu_iv_entry *entry)
{
u32 doorbell_offset = entry->src_data[0];
if (adev->enable_mes && doorbell_offset) {
doorbell_offset >>= SDMA0_QUEUE0_DOORBELL_OFFSET__OFFSET__SHIFT;
amdgpu_userq_process_fence_irq(adev, doorbell_offset);
}
return 0;
}
static int sdma_v6_0_process_illegal_inst_irq(struct amdgpu_device *adev,
struct amdgpu_irq_src *source,
struct amdgpu_iv_entry *entry)
{
return 0;
}
static int sdma_v6_0_set_clockgating_state(struct amdgpu_ip_block *ip_block,
enum amd_clockgating_state state)
{
return 0;
}
static int sdma_v6_0_set_powergating_state(struct amdgpu_ip_block *ip_block,
enum amd_powergating_state state)
{
return 0;
}
static void sdma_v6_0_get_clockgating_state(struct amdgpu_ip_block *ip_block, u64 *flags)
{
}
static void sdma_v6_0_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm_printer *p)
{
struct amdgpu_device *adev = ip_block->adev;
int i, j;
uint32_t reg_count = ARRAY_SIZE(sdma_reg_list_6_0);
uint32_t instance_offset;
if (!adev->sdma.ip_dump)
return;
drm_printf(p, "num_instances:%d\n", adev->sdma.num_instances);
for (i = 0; i < adev->sdma.num_instances; i++) {
instance_offset = i * reg_count;
drm_printf(p, "\nInstance:%d\n", i);
for (j = 0; j < reg_count; j++)
drm_printf(p, "%-50s \t 0x%08x\n", sdma_reg_list_6_0[j].reg_name,
adev->sdma.ip_dump[instance_offset + j]);
}
}
static void sdma_v6_0_dump_ip_state(struct amdgpu_ip_block *ip_block)
{
struct amdgpu_device *adev = ip_block->adev;
int i, j;
uint32_t instance_offset;
uint32_t reg_count = ARRAY_SIZE(sdma_reg_list_6_0);
if (!adev->sdma.ip_dump)
return;
amdgpu_gfx_off_ctrl(adev, false);
for (i = 0; i < adev->sdma.num_instances; i++) {
instance_offset = i * reg_count;
for (j = 0; j < reg_count; j++)
adev->sdma.ip_dump[instance_offset + j] =
RREG32(sdma_v6_0_get_reg_offset(adev, i,
sdma_reg_list_6_0[j].reg_offset));
}
amdgpu_gfx_off_ctrl(adev, true);
}
Annotation
- Immediate include surface: `linux/delay.h`, `linux/firmware.h`, `linux/module.h`, `linux/pci.h`, `amdgpu.h`, `amdgpu_ucode.h`, `amdgpu_trace.h`, `gc/gc_11_0_0_offset.h`.
- Detected declarations: `function sdma_v6_0_get_reg_offset`, `function sdma_v6_0_ring_init_cond_exec`, `function sdma_v6_0_ring_get_rptr`, `function sdma_v6_0_ring_get_wptr`, `function sdma_v6_0_ring_set_wptr`, `function sdma_v6_0_ring_insert_nop`, `function sdma_v6_0_ring_emit_ib`, `function sdma_v6_0_ring_emit_mem_sync`, `function sdma_v6_0_ring_emit_hdp_flush`, `function sdma_v6_0_ring_emit_fence`.
- 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.