drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c- Extension
.c- Size
- 73037 bytes
- Lines
- 2336
- 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.hamdgpu.hamdgpu_vcn.hamdgpu_pm.hamdgpu_cs.hsoc15.hsoc15d.hsoc15_hw_ip.hvcn_v2_0.hmmsch_v4_0.hvcn_v4_0.hvcn/vcn_4_0_0_offset.hvcn/vcn_4_0_0_sh_mask.hivsrcid/vcn/irqsrcs_vcn_4_0.hdrm/drm_drv.h
Detected Declarations
function vcn_v4_0_early_initfunction vcn_v4_0_fw_shared_initfunction vcn_v4_0_sw_initfunction vcn_v4_0_sw_finifunction vcn_v4_0_hw_initfunction vcn_v4_0_hw_finifunction vcn_v4_0_suspendfunction vcn_v4_0_resumefunction vcn_v4_0_mc_resumefunction vcn_v4_0_mc_resume_dpg_modefunction vcn_v4_0_disable_static_power_gatingfunction vcn_v4_0_enable_static_power_gatingfunction vcn_v4_0_disable_clock_gatingfunction vcn_v4_0_disable_clock_gating_dpg_modefunction vcn_v4_0_enable_clock_gatingfunction vcn_v4_0_enable_rasfunction vcn_v4_0_start_dpg_modefunction vcn_v4_0_startfunction vcn_v4_0_init_ring_metadatafunction vcn_v4_0_start_sriovfunction vcn_v4_0_stop_dpg_modefunction vcn_v4_0_stopfunction vcn_v4_0_pause_dpg_modefunction vcn_v4_0_unified_ring_get_rptrfunction vcn_v4_0_unified_ring_get_wptrfunction vcn_v4_0_unified_ring_set_wptrfunction vcn_v4_0_limit_schedfunction vcn_v4_0_dec_msgfunction vcn_v4_0_enc_find_ib_paramfunction vcn_v4_0_ring_patch_cs_in_placefunction vcn_v4_0_ring_resetfunction vcn_v4_0_set_unified_ring_funcsfunction vcn_v4_0_is_idlefunction vcn_v4_0_wait_for_idlefunction vcn_v4_0_set_clockgating_statefunction vcn_v4_0_set_pg_statefunction vcn_v4_0_set_ras_interrupt_statefunction vcn_v4_0_process_interruptfunction vcn_v4_0_set_irq_funcsfunction vcn_v4_0_query_poison_by_instancefunction vcn_v4_0_query_ras_poison_statusfunction vcn_v4_0_set_ras_funcs
Annotated Snippet
if (amdgpu_vcn_is_disabled_vcn(adev, VCN_ENCODE_RING, i)) {
adev->vcn.harvest_config |= 1 << i;
dev_info(adev->dev, "VCN%d is disabled by hypervisor\n", i);
}
}
}
for (i = 0; i < adev->vcn.num_vcn_inst; ++i)
/* re-use enc ring as unified ring */
adev->vcn.inst[i].num_enc_rings = 1;
vcn_v4_0_set_unified_ring_funcs(adev);
vcn_v4_0_set_irq_funcs(adev);
vcn_v4_0_set_ras_funcs(adev);
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
adev->vcn.inst[i].set_pg_state = vcn_v4_0_set_pg_state;
r = amdgpu_vcn_early_init(adev, i);
if (r)
return r;
}
return 0;
}
static int vcn_v4_0_fw_shared_init(struct amdgpu_device *adev, int inst_idx)
{
struct amdgpu_vcn4_fw_shared *fw_shared;
fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr;
fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE);
fw_shared->sq.is_enabled = 1;
fw_shared->present_flag_0 |= cpu_to_le32(AMDGPU_VCN_SMU_DPM_INTERFACE_FLAG);
fw_shared->smu_dpm_interface.smu_interface_type = (adev->flags & AMD_IS_APU) ?
AMDGPU_VCN_SMU_DPM_INTERFACE_APU : AMDGPU_VCN_SMU_DPM_INTERFACE_DGPU;
if (amdgpu_ip_version(adev, VCN_HWIP, 0) ==
IP_VERSION(4, 0, 2)) {
fw_shared->present_flag_0 |= AMDGPU_FW_SHARED_FLAG_0_DRM_KEY_INJECT;
fw_shared->drm_key_wa.method =
AMDGPU_DRM_KEY_INJECT_WORKAROUND_VCNFW_ASD_HANDSHAKING;
}
if (amdgpu_vcnfw_log)
amdgpu_vcn_fwlog_init(&adev->vcn.inst[inst_idx]);
return 0;
}
/**
* vcn_v4_0_sw_init - sw init for VCN block
*
* @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
*
* Load firmware and sw initialization
*/
static int vcn_v4_0_sw_init(struct amdgpu_ip_block *ip_block)
{
struct amdgpu_ring *ring;
struct amdgpu_device *adev = ip_block->adev;
int i, r;
for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
if (adev->vcn.harvest_config & (1 << i))
continue;
r = amdgpu_vcn_sw_init(adev, i);
if (r)
return r;
amdgpu_vcn_setup_ucode(adev, i);
r = amdgpu_vcn_resume(adev, i);
if (r)
return r;
/* Init instance 0 sched_score to 1, so it's scheduled after other instances */
if (i == 0)
atomic_set(&adev->vcn.inst[i].sched_score, 1);
else
atomic_set(&adev->vcn.inst[i].sched_score, 0);
/* VCN UNIFIED TRAP */
r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_vcns[i],
VCN_4_0__SRCID__UVD_ENC_GENERAL_PURPOSE, &adev->vcn.inst[i].irq);
if (r)
return r;
Annotation
- Immediate include surface: `linux/firmware.h`, `amdgpu.h`, `amdgpu_vcn.h`, `amdgpu_pm.h`, `amdgpu_cs.h`, `soc15.h`, `soc15d.h`, `soc15_hw_ip.h`.
- Detected declarations: `function vcn_v4_0_early_init`, `function vcn_v4_0_fw_shared_init`, `function vcn_v4_0_sw_init`, `function vcn_v4_0_sw_fini`, `function vcn_v4_0_hw_init`, `function vcn_v4_0_hw_fini`, `function vcn_v4_0_suspend`, `function vcn_v4_0_resume`, `function vcn_v4_0_mc_resume`, `function vcn_v4_0_mc_resume_dpg_mode`.
- 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.