[PATCH 2/3] drm/amdgpu/gmc: add a flag to disable AGP
Christian König
ckoenig.leichtzumerken at gmail.com
Thu Sep 21 07:53:37 UTC 2023
Am 20.09.23 um 19:58 schrieb Alex Deucher:
> Allows the driver to disable the AGP aperture when
> it's not needed. Program AGP explictly for all asics,
> but set the flag to align with previous behavior. No
> functional change.
>
> v2: rework patch
> v3: fix broken rebase
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 2 ++
> drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 6 ++++--
> drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 6 ++++--
> drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 6 ++++--
> drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 3 ++-
> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
> 9 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index c7793db6d098..fc1a585d05bf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -315,7 +315,7 @@ void amdgpu_gmc_agp_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc)
> const uint64_t sixteen_gb_mask = ~(sixteen_gb - 1);
> u64 size_af, size_bf;
>
> - if (amdgpu_sriov_vf(adev)) {
> + if (mc->disable_agp) {
> mc->agp_start = 0xffffffffffff;
> mc->agp_end = 0x0;
> mc->agp_size = 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> index fdc25cd559b6..d3b014b84fa9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> @@ -333,6 +333,8 @@ struct amdgpu_gmc {
> u64 MC_VM_MX_L1_TLB_CNTL;
>
> u64 noretry_flags;
> +
> + bool disable_agp;
I would still rather have adev->gmc.agp_start and adev->gmc.agp_end and
initialized to valid default values and then never call
amdgpu_gmc_agp_location().
This here basically just tells the function to not do anything, so we
could rather not call it in the first place.
Regards,
Christian.
> };
>
> #define amdgpu_gmc_flush_gpu_tlb(adev, vmid, vmhub, type) ((adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid), (vmhub), (type)))
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> index e582073b57c8..2923007847bf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> @@ -842,6 +842,8 @@ static int gmc_v10_0_mc_init(struct amdgpu_device *adev)
> adev->gmc.gart_size = (u64)amdgpu_gart_size << 20;
> }
>
> + if (amdgpu_sriov_vf(adev))
> + adev->gmc.disable_agp = true;
> gmc_v10_0_vram_gtt_location(adev, &adev->gmc);
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
> index 69f65e9c4f93..28dc08fe542b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
> @@ -741,6 +741,8 @@ static int gmc_v11_0_mc_init(struct amdgpu_device *adev)
> else
> adev->gmc.gart_size = (u64)amdgpu_gart_size << 20;
>
> + if (amdgpu_sriov_vf(adev))
> + adev->gmc.disable_agp = true;
> gmc_v11_0_vram_gtt_location(adev, &adev->gmc);
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> index 07579fa26fa3..a65118926ed7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> @@ -213,6 +213,7 @@ static void gmc_v6_0_vram_gtt_location(struct amdgpu_device *adev,
>
> amdgpu_gmc_vram_location(adev, mc, base);
> amdgpu_gmc_gart_location(adev, mc);
> + amdgpu_gmc_agp_location(adev, mc);
> }
>
> static void gmc_v6_0_mc_program(struct amdgpu_device *adev)
> @@ -253,8 +254,8 @@ static void gmc_v6_0_mc_program(struct amdgpu_device *adev)
> WREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
> adev->mem_scratch.gpu_addr >> 12);
> WREG32(mmMC_VM_AGP_BASE, 0);
> - WREG32(mmMC_VM_AGP_TOP, 0);
> - WREG32(mmMC_VM_AGP_BOT, 0x0FFFFFFF);
> + WREG32(mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 22);
> + WREG32(mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 22);
>
> if (gmc_v6_0_wait_for_idle((void *)adev))
> dev_warn(adev->dev, "Wait for MC idle timedout !\n");
> @@ -339,6 +340,7 @@ static int gmc_v6_0_mc_init(struct amdgpu_device *adev)
> }
>
> adev->gmc.gart_size += adev->pm.smu_prv_buffer_size;
> + adev->gmc.disable_agp = true;
> gmc_v6_0_vram_gtt_location(adev, &adev->gmc);
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> index e77e5593e1ab..680c7bc58c85 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> @@ -241,6 +241,7 @@ static void gmc_v7_0_vram_gtt_location(struct amdgpu_device *adev,
>
> amdgpu_gmc_vram_location(adev, mc, base);
> amdgpu_gmc_gart_location(adev, mc);
> + amdgpu_gmc_agp_location(adev, mc);
> }
>
> /**
> @@ -288,8 +289,8 @@ static void gmc_v7_0_mc_program(struct amdgpu_device *adev)
> WREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
> adev->mem_scratch.gpu_addr >> 12);
> WREG32(mmMC_VM_AGP_BASE, 0);
> - WREG32(mmMC_VM_AGP_TOP, 0);
> - WREG32(mmMC_VM_AGP_BOT, 0x0FFFFFFF);
> + WREG32(mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 22);
> + WREG32(mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 22);
> if (gmc_v7_0_wait_for_idle((void *)adev))
> dev_warn(adev->dev, "Wait for MC idle timedout !\n");
>
> @@ -406,6 +407,7 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
> }
>
> adev->gmc.gart_size += adev->pm.smu_prv_buffer_size;
> + adev->gmc.disable_agp = true;
> gmc_v7_0_vram_gtt_location(adev, &adev->gmc);
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> index 6acf649469dd..1576d22c8197 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> @@ -415,6 +415,7 @@ static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
>
> amdgpu_gmc_vram_location(adev, mc, base);
> amdgpu_gmc_gart_location(adev, mc);
> + amdgpu_gmc_agp_location(adev, mc);
> }
>
> /**
> @@ -473,8 +474,8 @@ static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
> }
>
> WREG32(mmMC_VM_AGP_BASE, 0);
> - WREG32(mmMC_VM_AGP_TOP, 0);
> - WREG32(mmMC_VM_AGP_BOT, 0x0FFFFFFF);
> + WREG32(mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 22);
> + WREG32(mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 22);
> if (gmc_v8_0_wait_for_idle((void *)adev))
> dev_warn(adev->dev, "Wait for MC idle timedout !\n");
>
> @@ -596,6 +597,7 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
> }
>
> adev->gmc.gart_size += adev->pm.smu_prv_buffer_size;
> + adev->gmc.disable_agp = true;
> gmc_v8_0_vram_gtt_location(adev, &adev->gmc);
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index 2936a0fb7527..83a4e293ec4b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -1788,7 +1788,8 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
> }
>
> adev->gmc.gart_size += adev->pm.smu_prv_buffer_size;
> -
> + if (amdgpu_sriov_vf(adev))
> + adev->gmc.disable_agp = true;
> gmc_v9_0_vram_gtt_location(adev, &adev->gmc);
>
> return 0;
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 2e4a8bdbf50e..c2cb4b4cd2d7 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -1255,7 +1255,7 @@ static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_
> agp_top = adev->gmc.agp_end >> 24;
>
> /* AGP aperture is disabled */
> - if (agp_bot == agp_top) {
> + if (agp_bot > agp_top) {
> logical_addr_low = adev->gmc.fb_start >> 18;
> if (adev->apu_flags & AMD_APU_IS_RAVEN2)
> /*
More information about the amd-gfx
mailing list