drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c- Extension
.c- Size
- 21196 bytes
- Lines
- 824
- 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/firmware.hamdgpu.hamdgpu_uvd.hcikd.huvd/uvd_4_2_d.huvd/uvd_4_2_sh_mask.hoss/oss_2_0_d.hoss/oss_2_0_sh_mask.hbif/bif_4_1_d.hsmu/smu_7_0_1_d.hsmu/smu_7_0_1_sh_mask.h
Detected Declarations
function uvd_v4_2_ring_get_rptrfunction uvd_v4_2_ring_get_wptrfunction uvd_v4_2_ring_set_wptrfunction uvd_v4_2_early_initfunction uvd_v4_2_sw_initfunction uvd_v4_2_sw_finifunction uvd_v4_2_hw_initfunction uvd_v4_2_hw_finifunction uvd_v4_2_prepare_suspendfunction uvd_v4_2_suspendfunction uvd_v4_2_resumefunction uvd_v4_2_startfunction uvd_v4_2_stopfunction uvd_v4_2_ring_emit_fencefunction uvd_v4_2_ring_test_ringfunction uvd_v4_2_ring_emit_ibfunction uvd_v4_2_ring_insert_nopfunction uvd_v4_2_mc_resumefunction uvd_v4_2_enable_mgcgfunction uvd_v4_2_set_dcmfunction uvd_v4_2_is_idlefunction uvd_v4_2_wait_for_idlefunction uvd_v4_2_soft_resetfunction uvd_v4_2_set_interrupt_statefunction uvd_v4_2_process_interruptfunction uvd_v4_2_set_clockgating_statefunction uvd_v4_2_set_powergating_statefunction uvd_v4_2_set_ring_funcsfunction uvd_v4_2_set_irq_funcs
Annotated Snippet
if (adev->pg_flags & AMD_PG_SUPPORT_UVD && !adev->pm.dpm_enabled) {
if (!(RREG32_SMC(ixCURRENT_PG_STATUS) &
CURRENT_PG_STATUS__UVD_PG_STATUS_MASK)) {
WREG32(mmUVD_PGFSM_CONFIG, (UVD_PGFSM_CONFIG__UVD_PGFSM_FSM_ADDR_MASK |
UVD_PGFSM_CONFIG__UVD_PGFSM_POWER_DOWN_MASK |
UVD_PGFSM_CONFIG__UVD_PGFSM_P1_SELECT_MASK));
mdelay(20);
}
}
return 0;
} else {
if (adev->pg_flags & AMD_PG_SUPPORT_UVD && !adev->pm.dpm_enabled) {
if (RREG32_SMC(ixCURRENT_PG_STATUS) &
CURRENT_PG_STATUS__UVD_PG_STATUS_MASK) {
WREG32(mmUVD_PGFSM_CONFIG, (UVD_PGFSM_CONFIG__UVD_PGFSM_FSM_ADDR_MASK |
UVD_PGFSM_CONFIG__UVD_PGFSM_POWER_UP_MASK |
UVD_PGFSM_CONFIG__UVD_PGFSM_P1_SELECT_MASK));
mdelay(30);
}
}
return uvd_v4_2_start(adev);
}
}
static const struct amd_ip_funcs uvd_v4_2_ip_funcs = {
.name = "uvd_v4_2",
.early_init = uvd_v4_2_early_init,
.sw_init = uvd_v4_2_sw_init,
.sw_fini = uvd_v4_2_sw_fini,
.hw_init = uvd_v4_2_hw_init,
.hw_fini = uvd_v4_2_hw_fini,
.prepare_suspend = uvd_v4_2_prepare_suspend,
.suspend = uvd_v4_2_suspend,
.resume = uvd_v4_2_resume,
.is_idle = uvd_v4_2_is_idle,
.wait_for_idle = uvd_v4_2_wait_for_idle,
.soft_reset = uvd_v4_2_soft_reset,
.set_clockgating_state = uvd_v4_2_set_clockgating_state,
.set_powergating_state = uvd_v4_2_set_powergating_state,
};
static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
.type = AMDGPU_RING_TYPE_UVD,
.align_mask = 0xf,
.support_64bit_ptrs = false,
.no_user_fence = true,
.get_rptr = uvd_v4_2_ring_get_rptr,
.get_wptr = uvd_v4_2_ring_get_wptr,
.set_wptr = uvd_v4_2_ring_set_wptr,
.parse_cs = amdgpu_uvd_ring_parse_cs,
.emit_frame_size =
14, /* uvd_v4_2_ring_emit_fence x1 no user fence */
.emit_ib_size = 4, /* uvd_v4_2_ring_emit_ib */
.emit_ib = uvd_v4_2_ring_emit_ib,
.emit_fence = uvd_v4_2_ring_emit_fence,
.test_ring = uvd_v4_2_ring_test_ring,
.test_ib = amdgpu_uvd_ring_test_ib,
.insert_nop = uvd_v4_2_ring_insert_nop,
.pad_ib = amdgpu_ring_generic_pad_ib,
.begin_use = amdgpu_uvd_ring_begin_use,
.end_use = amdgpu_uvd_ring_end_use,
};
static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev)
{
adev->uvd.inst->ring.funcs = &uvd_v4_2_ring_funcs;
}
static const struct amdgpu_irq_src_funcs uvd_v4_2_irq_funcs = {
.set = uvd_v4_2_set_interrupt_state,
.process = uvd_v4_2_process_interrupt,
};
static void uvd_v4_2_set_irq_funcs(struct amdgpu_device *adev)
{
adev->uvd.inst->irq.num_types = 1;
adev->uvd.inst->irq.funcs = &uvd_v4_2_irq_funcs;
}
const struct amdgpu_ip_block_version uvd_v4_2_ip_block =
{
.type = AMD_IP_BLOCK_TYPE_UVD,
.major = 4,
.minor = 2,
.rev = 0,
.funcs = &uvd_v4_2_ip_funcs,
};
Annotation
- Immediate include surface: `linux/firmware.h`, `amdgpu.h`, `amdgpu_uvd.h`, `cikd.h`, `uvd/uvd_4_2_d.h`, `uvd/uvd_4_2_sh_mask.h`, `oss/oss_2_0_d.h`, `oss/oss_2_0_sh_mask.h`.
- Detected declarations: `function uvd_v4_2_ring_get_rptr`, `function uvd_v4_2_ring_get_wptr`, `function uvd_v4_2_ring_set_wptr`, `function uvd_v4_2_early_init`, `function uvd_v4_2_sw_init`, `function uvd_v4_2_sw_fini`, `function uvd_v4_2_hw_init`, `function uvd_v4_2_hw_fini`, `function uvd_v4_2_prepare_suspend`, `function uvd_v4_2_suspend`.
- 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.