drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c- Extension
.c- Size
- 69971 bytes
- Lines
- 2280
- 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.hdrm/drm_drv.hamdgpu.hamdgpu_vcn.hamdgpu_pm.hsoc15.hsoc15d.hsoc15_hw_ip.hvcn_v2_0.hvcn_v4_0_3.hmmsch_v4_0_3.hvcn/vcn_4_0_3_offset.hvcn/vcn_4_0_3_sh_mask.hivsrcid/vcn/irqsrcs_vcn_4_0.h
Detected Declarations
function vcn_v4_0_3_normalizn_reqdfunction vcn_v4_0_3_early_initfunction vcn_v4_0_3_is_psp_fw_reset_supportedfunction vcn_v4_0_3_late_initfunction vcn_v4_0_3_fw_shared_initfunction vcn_v4_0_3_sw_initfunction vcn_v4_0_3_sw_finifunction vcn_v4_0_3_hw_init_instfunction vcn_v4_0_3_hw_initfunction vcn_v4_0_3_hw_finifunction vcn_v4_0_3_suspendfunction vcn_v4_0_3_resumefunction vcn_v4_0_3_mc_resumefunction vcn_v4_0_3_mc_resume_dpg_modefunction vcn_v4_0_3_disable_clock_gatingfunction vcn_v4_0_3_disable_clock_gating_dpg_modefunction vcn_v4_0_3_enable_clock_gatingfunction vcn_v4_0_3_start_dpg_modefunction vcn_v4_0_3_start_sriovfunction vcn_v4_0_3_startfunction vcn_v4_0_3_stop_dpg_modefunction vcn_v4_0_3_stopfunction vcn_v4_0_3_pause_dpg_modefunction vcn_v4_0_3_unified_ring_get_rptrfunction vcn_v4_0_3_unified_ring_get_wptrfunction vcn_v4_0_3_enc_ring_emit_reg_waitfunction vcn_v4_0_3_enc_ring_emit_wregfunction vcn_v4_0_3_enc_ring_emit_vm_flushfunction vcn_v4_0_3_ring_emit_hdp_flushfunction vcn_v4_0_3_reset_jpeg_pre_helperfunction vcn_v4_0_3_reset_jpeg_post_helperfunction vcn_v4_0_3_ring_resetfunction vcn_v4_0_3_set_unified_ring_funcsfunction vcn_v4_0_3_is_idlefunction vcn_v4_0_3_wait_for_idlefunction vcn_v4_0_3_set_clockgating_statefunction vcn_v4_0_3_set_pg_statefunction vcn_v4_0_3_set_interrupt_statefunction vcn_v4_0_3_process_interruptfunction vcn_v4_0_3_set_ras_interrupt_statefunction vcn_v4_0_3_set_irq_funcsfunction vcn_v4_0_3_inst_query_ras_error_countfunction vcn_v4_0_3_query_ras_error_countfunction vcn_v4_0_3_inst_reset_ras_error_countfunction vcn_v4_0_3_reset_ras_error_countfunction vcn_v4_0_3_query_poison_by_instancefunction vcn_v4_0_3_query_poison_statusfunction vcn_v4_0_3_aca_bank_parser
Annotated Snippet
if (r) {
dev_err(adev->dev, "Failed to initialize vcn ras block!\n");
return r;
}
}
r = amdgpu_vcn_reg_dump_init(adev, vcn_reg_list_4_0_3, ARRAY_SIZE(vcn_reg_list_4_0_3));
if (r)
return r;
return amdgpu_vcn_sysfs_reset_mask_init(adev);
}
/**
* vcn_v4_0_3_sw_fini - sw fini for VCN block
*
* @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
*
* VCN suspend and free up sw allocation
*/
static int vcn_v4_0_3_sw_fini(struct amdgpu_ip_block *ip_block)
{
struct amdgpu_device *adev = ip_block->adev;
int i, r, idx;
if (drm_dev_enter(&adev->ddev, &idx)) {
for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
struct amdgpu_vcn4_fw_shared *fw_shared;
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
fw_shared->present_flag_0 = 0;
fw_shared->sq.is_enabled = cpu_to_le32(false);
}
drm_dev_exit(idx);
}
if (amdgpu_sriov_vf(adev))
amdgpu_virt_free_mm_table(adev);
for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
r = amdgpu_vcn_suspend(adev, i);
if (r)
return r;
}
amdgpu_vcn_sysfs_reset_mask_fini(adev);
for (i = 0; i < adev->vcn.num_vcn_inst; i++)
amdgpu_vcn_sw_fini(adev, i);
return 0;
}
static int vcn_v4_0_3_hw_init_inst(struct amdgpu_vcn_inst *vinst)
{
int vcn_inst;
struct amdgpu_device *adev = vinst->adev;
struct amdgpu_ring *ring;
int inst_idx = vinst->inst;
vcn_inst = GET_INST(VCN, inst_idx);
ring = &adev->vcn.inst[inst_idx].ring_enc[0];
if (ring->use_doorbell) {
adev->nbio.funcs->vcn_doorbell_range(adev, ring->use_doorbell,
(adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 9 * vcn_inst,
adev->vcn.inst[inst_idx].aid_id);
WREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL,
ring->doorbell_index << VCN_RB1_DB_CTRL__OFFSET__SHIFT |
VCN_RB1_DB_CTRL__EN_MASK);
/* Read DB_CTRL to flush the write DB_CTRL command. */
RREG32_SOC15(VCN, vcn_inst, regVCN_RB1_DB_CTRL);
}
return 0;
}
/**
* vcn_v4_0_3_hw_init - start and test VCN block
*
* @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
*
* Initialize the hardware, boot up the VCPU and do some testing
*/
static int vcn_v4_0_3_hw_init(struct amdgpu_ip_block *ip_block)
{
struct amdgpu_device *adev = ip_block->adev;
struct amdgpu_ring *ring;
struct amdgpu_vcn_inst *vinst;
Annotation
- Immediate include surface: `linux/firmware.h`, `drm/drm_drv.h`, `amdgpu.h`, `amdgpu_vcn.h`, `amdgpu_pm.h`, `soc15.h`, `soc15d.h`, `soc15_hw_ip.h`.
- Detected declarations: `function vcn_v4_0_3_normalizn_reqd`, `function vcn_v4_0_3_early_init`, `function vcn_v4_0_3_is_psp_fw_reset_supported`, `function vcn_v4_0_3_late_init`, `function vcn_v4_0_3_fw_shared_init`, `function vcn_v4_0_3_sw_init`, `function vcn_v4_0_3_sw_fini`, `function vcn_v4_0_3_hw_init_inst`, `function vcn_v4_0_3_hw_init`, `function vcn_v4_0_3_hw_fini`.
- 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.