drivers/gpu/drm/amd/amdgpu/mmhub_v4_2_0.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/amdgpu/mmhub_v4_2_0.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/amdgpu/mmhub_v4_2_0.c
Extension
.c
Size
31853 bytes
Lines
958
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (adev->gmc.pdb0_bo) {
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
				     (u32)(adev->gmc.fb_start >> 12));
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32,
				     (u32)(adev->gmc.fb_start >> 44));

			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32,
				     (u32)(adev->gmc.gart_end >> 12));
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32,
				     (u32)(adev->gmc.gart_end >> 44));
		} else {
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
				     (u32)(adev->gmc.gart_start >> 12));
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32,
				     (u32)(adev->gmc.gart_start >> 44));

			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32,
				     (u32)(adev->gmc.gart_end >> 12));
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32,
				     (u32)(adev->gmc.gart_end >> 44));
		}
	}
}

static void mmhub_v4_2_0_mid_init_system_aperture_regs(struct amdgpu_device *adev,
						       uint32_t mid_mask)
{
	uint64_t value;
	uint32_t tmp;
	int i;

	/*
	 * the new L1 policy will block SRIOV guest from writing
	 * these regs, and they will be programed at host.
	 * so skip programing these regs.
	 */
	if (amdgpu_sriov_vf(adev))
		return;

	for_each_inst(i, mid_mask) {
		if (adev->gmc.pdb0_bo) {
			/* Disable agp and system aperture
			 * when vmid0 page table is enabled */
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_FB_LOCATION_TOP_LO32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_FB_LOCATION_TOP_HI32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_FB_LOCATION_BASE_LO32,
				     0xFFFFFFFF);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_FB_LOCATION_BASE_HI32, 1);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_TOP_LO32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_TOP_HI32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_BOT_LO32,
				     0xFFFFFFFF);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_BOT_HI32, 1);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR_LO32,
				     0xFFFFFFFF);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR_HI32,
				     0x7F);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR_LO32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR_HI32, 0);
		} else {
			/* Program the AGP BAR */
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_BASE_LO32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_BASE_HI32, 0);
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_BOT_LO32,
				     lower_32_bits(adev->gmc.agp_start >> 24));
			WREG32_SOC15(MMHUB, GET_INST(MMHUB, i),
				     regMMMC_VM_AGP_BOT_HI32,

Annotation

Implementation Notes