aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2018-06-19 17:11:56 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-09-10 23:47:34 -0400
commit6fdd68b14a943ead1d0ce1c0c7023cd2dbfde4c2 (patch)
tree921555fbb9f3274f1984c9de9fd6b10fe0e567a2
parentbf0a60b78b61a7b31bb22e60cc7b2e7fc538d38f (diff)
drm/amdgpu/gmc9: Adjust GART and AGP location with xgmi offset (v2)
On hives with xgmi enabled, the fb_location aperture is a size which defines the total framebuffer size of all nodes in the hive. Each GPU in the hive has the same view via the fb_location aperture. GPU0 starts at offset (0 * segment size), GPU1 starts at offset (1 * segment size), etc. For access to local vram on each GPU, we need to take this offset into account. This including on setting up GPUVM page table and GART table v2: squash in "drm/amdgpu: Init correct fb region for none XGMI configuration" Acked-by: Huang Rui <ray.huang@amd.com> Acked-by: Slava Abramov <slava.abramov@amd.com> Signed-off-by: Shaoyun Liu <Shaoyun.Liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Acked-by: Huang Rui <ray.huang@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c7
5 files changed, 39 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index 6acdeebabfc0..ae4467113240 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -121,6 +121,11 @@ void amdgpu_gmc_vram_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc,
121 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; 121 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
122 if (limit && limit < mc->real_vram_size) 122 if (limit && limit < mc->real_vram_size)
123 mc->real_vram_size = limit; 123 mc->real_vram_size = limit;
124
125 if (mc->xgmi.num_physical_nodes == 0) {
126 mc->fb_start = mc->vram_start;
127 mc->fb_end = mc->vram_end;
128 }
124 dev_info(adev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n", 129 dev_info(adev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
125 mc->mc_vram_size >> 20, mc->vram_start, 130 mc->mc_vram_size >> 20, mc->vram_start,
126 mc->vram_end, mc->real_vram_size >> 20); 131 mc->vram_end, mc->real_vram_size >> 20);
@@ -147,8 +152,8 @@ void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc)
147 /* VCE doesn't like it when BOs cross a 4GB segment, so align 152 /* VCE doesn't like it when BOs cross a 4GB segment, so align
148 * the GART base on a 4GB boundary as well. 153 * the GART base on a 4GB boundary as well.
149 */ 154 */
150 size_bf = mc->vram_start; 155 size_bf = mc->fb_start;
151 size_af = adev->gmc.mc_mask + 1 - ALIGN(mc->vram_end + 1, four_gb); 156 size_af = adev->gmc.mc_mask + 1 - ALIGN(mc->fb_end + 1, four_gb);
152 157
153 if (mc->gart_size > max(size_bf, size_af)) { 158 if (mc->gart_size > max(size_bf, size_af)) {
154 dev_warn(adev->dev, "limiting GART\n"); 159 dev_warn(adev->dev, "limiting GART\n");
@@ -184,23 +189,23 @@ void amdgpu_gmc_agp_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc)
184 const uint64_t sixteen_gb_mask = ~(sixteen_gb - 1); 189 const uint64_t sixteen_gb_mask = ~(sixteen_gb - 1);
185 u64 size_af, size_bf; 190 u64 size_af, size_bf;
186 191
187 if (mc->vram_start > mc->gart_start) { 192 if (mc->fb_start > mc->gart_start) {
188 size_bf = (mc->vram_start & sixteen_gb_mask) - 193 size_bf = (mc->fb_start & sixteen_gb_mask) -
189 ALIGN(mc->gart_end + 1, sixteen_gb); 194 ALIGN(mc->gart_end + 1, sixteen_gb);
190 size_af = mc->mc_mask + 1 - ALIGN(mc->vram_end + 1, sixteen_gb); 195 size_af = mc->mc_mask + 1 - ALIGN(mc->fb_end + 1, sixteen_gb);
191 } else { 196 } else {
192 size_bf = mc->vram_start & sixteen_gb_mask; 197 size_bf = mc->fb_start & sixteen_gb_mask;
193 size_af = (mc->gart_start & sixteen_gb_mask) - 198 size_af = (mc->gart_start & sixteen_gb_mask) -
194 ALIGN(mc->vram_end + 1, sixteen_gb); 199 ALIGN(mc->fb_end + 1, sixteen_gb);
195 } 200 }
196 201
197 if (size_bf > size_af) { 202 if (size_bf > size_af) {
198 mc->agp_start = mc->vram_start > mc->gart_start ? 203 mc->agp_start = mc->fb_start > mc->gart_start ?
199 mc->gart_end + 1 : 0; 204 mc->gart_end + 1 : 0;
200 mc->agp_size = size_bf; 205 mc->agp_size = size_bf;
201 } else { 206 } else {
202 mc->agp_start = (mc->vram_start > mc->gart_start ? 207 mc->agp_start = (mc->fb_start > mc->gart_start ?
203 mc->vram_end : mc->gart_end) + 1, 208 mc->fb_end : mc->gart_end) + 1,
204 mc->agp_size = size_af; 209 mc->agp_size = size_af;
205 } 210 }
206 211
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
index a929a55b30c2..b00b5165969b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
@@ -114,6 +114,14 @@ struct amdgpu_gmc {
114 u64 gart_end; 114 u64 gart_end;
115 u64 vram_start; 115 u64 vram_start;
116 u64 vram_end; 116 u64 vram_end;
117 /* FB region , it's same as local vram region in single GPU, in XGMI
118 * configuration, this region covers all GPUs in the same hive ,
119 * each GPU in the hive has the same view of this FB region .
120 * GPU0's vram starts at offset (0 * segment size) ,
121 * GPU1 starts at offset (1 * segment size), etc.
122 */
123 u64 fb_start;
124 u64 fb_end;
117 unsigned vram_width; 125 unsigned vram_width;
118 u64 real_vram_size; 126 u64 real_vram_size;
119 int vram_mtrr; 127 int vram_mtrr;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c
index d4170cb41055..5e9ab8eb214a 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.c
@@ -44,6 +44,9 @@ int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev)
44 REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, PF_LFB_REGION); 44 REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, PF_LFB_REGION);
45 if (adev->gmc.xgmi.physical_node_id > 3) 45 if (adev->gmc.xgmi.physical_node_id > 3)
46 return -EINVAL; 46 return -EINVAL;
47 adev->gmc.xgmi.node_segment_size = REG_GET_FIELD(
48 RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_SIZE),
49 MC_VM_XGMI_LFB_SIZE, PF_LFB_SIZE) << 24;
47 } 50 }
48 51
49 return 0; 52 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 e9b5a1300657..b1c848937e42 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -771,12 +771,18 @@ static void gmc_v9_0_vram_gtt_location(struct amdgpu_device *adev,
771 u64 base = 0; 771 u64 base = 0;
772 if (!amdgpu_sriov_vf(adev)) 772 if (!amdgpu_sriov_vf(adev))
773 base = mmhub_v1_0_get_fb_location(adev); 773 base = mmhub_v1_0_get_fb_location(adev);
774 /* add the xgmi offset of the physical node */
775 base += adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size;
774 amdgpu_gmc_vram_location(adev, &adev->gmc, base); 776 amdgpu_gmc_vram_location(adev, &adev->gmc, base);
775 amdgpu_gmc_gart_location(adev, mc); 777 amdgpu_gmc_gart_location(adev, mc);
776 if (!amdgpu_sriov_vf(adev)) 778 if (!amdgpu_sriov_vf(adev))
777 amdgpu_gmc_agp_location(adev, mc); 779 amdgpu_gmc_agp_location(adev, mc);
778 /* base offset of vram pages */ 780 /* base offset of vram pages */
779 adev->vm_manager.vram_base_offset = gfxhub_v1_0_get_mc_fb_offset(adev); 781 adev->vm_manager.vram_base_offset = gfxhub_v1_0_get_mc_fb_offset(adev);
782
783 /* XXX: add the xgmi offset of the physical node? */
784 adev->vm_manager.vram_base_offset +=
785 adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size;
780} 786}
781 787
782/** 788/**
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
index 73d7c075dd33..0e09549d1db8 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
@@ -38,10 +38,17 @@
38u64 mmhub_v1_0_get_fb_location(struct amdgpu_device *adev) 38u64 mmhub_v1_0_get_fb_location(struct amdgpu_device *adev)
39{ 39{
40 u64 base = RREG32_SOC15(MMHUB, 0, mmMC_VM_FB_LOCATION_BASE); 40 u64 base = RREG32_SOC15(MMHUB, 0, mmMC_VM_FB_LOCATION_BASE);
41 u64 top = RREG32_SOC15(MMHUB, 0, mmMC_VM_FB_LOCATION_TOP);
41 42
42 base &= MC_VM_FB_LOCATION_BASE__FB_BASE_MASK; 43 base &= MC_VM_FB_LOCATION_BASE__FB_BASE_MASK;
43 base <<= 24; 44 base <<= 24;
44 45
46 top &= MC_VM_FB_LOCATION_TOP__FB_TOP_MASK;
47 top <<= 24;
48
49 adev->gmc.fb_start = base;
50 adev->gmc.fb_end = top;
51
45 return base; 52 return base;
46} 53}
47 54