drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/mes_v12_0.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c- Extension
.c- Size
- 60220 bytes
- Lines
- 1942
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/firmware.hlinux/module.hamdgpu.hgfx_v12_0.hsoc15_common.hsoc21.hgc/gc_12_0_0_offset.hgc/gc_12_0_0_sh_mask.hgc/gc_11_0_0_default.hv12_structs.hmes_v12_api_def.h
Detected Declarations
function mes_v12_0_ring_set_wptrfunction mes_v12_0_ring_get_rptrfunction mes_v12_0_ring_get_wptrfunction mes_v12_0_submit_pkt_and_poll_completionfunction convert_to_mes_queue_typefunction convert_to_mes_priority_levelfunction mes_v12_0_add_hw_queuefunction mes_v12_0_remove_hw_queuefunction gfx_v12_0_request_gfx_index_mutexfunction mes_v12_0_reset_queue_mmiofunction mes_v12_0_map_legacy_queuefunction mes_v12_0_unmap_legacy_queuefunction mes_v12_0_suspend_gangfunction mes_v12_0_resume_gangfunction mes_v12_0_query_sched_statusfunction mes_v12_0_misc_opfunction mes_v12_0_set_hw_resources_1function mes_v12_0_set_hw_resourcesfunction mes_v12_0_init_aggregated_doorbellfunction mes_v12_0_enable_unmapped_doorbell_handlingfunction mes_v12_0_reset_hw_queuefunction mes_v12_0_detect_and_reset_hung_queuesfunction mes_v12_inv_tlb_convert_hub_idfunction mes_v12_0_inv_tlbs_pasidfunction mes_v12_0_allocate_ucode_bufferfunction mes_v12_0_allocate_ucode_data_bufferfunction mes_v12_0_free_ucode_buffersfunction mes_v12_0_enablefunction mes_v12_0_set_ucode_start_addrfunction mes_v12_0_load_microcodefunction mes_v12_0_allocate_eop_buffunction mes_v12_0_mqd_initfunction mes_v12_0_queue_init_registerfunction mes_v12_0_kiq_enable_queuefunction mes_v12_0_queue_initfunction mes_v12_0_ring_initfunction mes_v12_0_kiq_ring_initfunction mes_v12_0_mqd_sw_initfunction mes_v12_0_sw_initfunction mes_v12_0_sw_finifunction mes_v12_0_kiq_dequeue_schedfunction mes_v12_0_kiq_settingfunction mes_v12_0_kiq_hw_initfunction mes_v12_0_kiq_hw_finifunction mes_v12_0_hw_initfunction mes_v12_0_hw_finifunction mes_v12_0_suspendfunction mes_v12_0_resume
Annotated Snippet
if (req) {
if (val == tmp)
break;
} else {
tmp = REG_SET_FIELD(tmp, CP_GFX_INDEX_MUTEX,
REQUEST, 1);
/* unlocked or locked by firmware */
if (val != tmp)
break;
}
udelay(1);
}
if (i >= adev->usec_timeout)
return -EINVAL;
return 0;
}
static int mes_v12_0_reset_queue_mmio(struct amdgpu_mes *mes, uint32_t queue_type,
uint32_t me_id, uint32_t pipe_id,
uint32_t queue_id, uint32_t vmid)
{
struct amdgpu_device *adev = mes->adev;
uint32_t value, reg;
int i, r = 0;
amdgpu_gfx_rlc_enter_safe_mode(adev, 0);
if (queue_type == AMDGPU_RING_TYPE_GFX) {
dev_info(adev->dev, "reset gfx queue (%d:%d:%d: vmid:%d)\n",
me_id, pipe_id, queue_id, vmid);
mutex_lock(&adev->gfx.reset_sem_mutex);
gfx_v12_0_request_gfx_index_mutex(adev, true);
/* all se allow writes */
WREG32_SOC15(GC, 0, regGRBM_GFX_INDEX,
(uint32_t)(0x1 << GRBM_GFX_INDEX__SE_BROADCAST_WRITES__SHIFT));
value = REG_SET_FIELD(0, CP_VMID_RESET, RESET_REQUEST, 1 << vmid);
if (pipe_id == 0)
value = REG_SET_FIELD(value, CP_VMID_RESET, PIPE0_QUEUES, 1 << queue_id);
else
value = REG_SET_FIELD(value, CP_VMID_RESET, PIPE1_QUEUES, 1 << queue_id);
WREG32_SOC15(GC, 0, regCP_VMID_RESET, value);
gfx_v12_0_request_gfx_index_mutex(adev, false);
mutex_unlock(&adev->gfx.reset_sem_mutex);
mutex_lock(&adev->srbm_mutex);
soc21_grbm_select(adev, me_id, pipe_id, queue_id, 0);
/* wait till dequeue take effects */
for (i = 0; i < adev->usec_timeout; i++) {
if (!(RREG32_SOC15(GC, 0, regCP_GFX_HQD_ACTIVE) & 1))
break;
udelay(1);
}
if (i >= adev->usec_timeout) {
dev_err(adev->dev, "failed to wait on gfx hqd deactivate\n");
r = -ETIMEDOUT;
}
soc21_grbm_select(adev, 0, 0, 0, 0);
mutex_unlock(&adev->srbm_mutex);
} else if (queue_type == AMDGPU_RING_TYPE_COMPUTE) {
dev_info(adev->dev, "reset compute queue (%d:%d:%d)\n",
me_id, pipe_id, queue_id);
mutex_lock(&adev->srbm_mutex);
soc21_grbm_select(adev, me_id, pipe_id, queue_id, 0);
WREG32_SOC15(GC, 0, regCP_HQD_DEQUEUE_REQUEST, 0x2);
WREG32_SOC15(GC, 0, regSPI_COMPUTE_QUEUE_RESET, 0x1);
/* wait till dequeue take effects */
for (i = 0; i < adev->usec_timeout; i++) {
if (!(RREG32_SOC15(GC, 0, regCP_HQD_ACTIVE) & 1))
break;
udelay(1);
}
if (i >= adev->usec_timeout) {
dev_err(adev->dev, "failed to wait on hqd deactivate\n");
r = -ETIMEDOUT;
}
soc21_grbm_select(adev, 0, 0, 0, 0);
mutex_unlock(&adev->srbm_mutex);
} else if (queue_type == AMDGPU_RING_TYPE_SDMA) {
dev_info(adev->dev, "reset sdma queue (%d:%d:%d)\n",
me_id, pipe_id, queue_id);
switch (me_id) {
case 1:
reg = SOC15_REG_OFFSET(GC, 0, regSDMA1_QUEUE_RESET_REQ);
break;
Annotation
- Immediate include surface: `linux/firmware.h`, `linux/module.h`, `amdgpu.h`, `gfx_v12_0.h`, `soc15_common.h`, `soc21.h`, `gc/gc_12_0_0_offset.h`, `gc/gc_12_0_0_sh_mask.h`.
- Detected declarations: `function mes_v12_0_ring_set_wptr`, `function mes_v12_0_ring_get_rptr`, `function mes_v12_0_ring_get_wptr`, `function mes_v12_0_submit_pkt_and_poll_completion`, `function convert_to_mes_queue_type`, `function convert_to_mes_priority_level`, `function mes_v12_0_add_hw_queue`, `function mes_v12_0_remove_hw_queue`, `function gfx_v12_0_request_gfx_index_mutex`, `function mes_v12_0_reset_queue_mmio`.
- 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.