diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 9a5b252784a1..d73367cab4f3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | |||
@@ -146,6 +146,8 @@ void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc) | |||
146 | { | 146 | { |
147 | const uint64_t four_gb = 0x100000000ULL; | 147 | const uint64_t four_gb = 0x100000000ULL; |
148 | u64 size_af, size_bf; | 148 | u64 size_af, size_bf; |
149 | /*To avoid the hole, limit the max mc address to AMDGPU_GMC_HOLE_START*/ | ||
150 | u64 max_mc_address = min(adev->gmc.mc_mask, AMDGPU_GMC_HOLE_START - 1); | ||
149 | 151 | ||
150 | mc->gart_size += adev->pm.smu_prv_buffer_size; | 152 | mc->gart_size += adev->pm.smu_prv_buffer_size; |
151 | 153 | ||
@@ -153,7 +155,7 @@ void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc) | |||
153 | * the GART base on a 4GB boundary as well. | 155 | * the GART base on a 4GB boundary as well. |
154 | */ | 156 | */ |
155 | size_bf = mc->fb_start; | 157 | size_bf = mc->fb_start; |
156 | size_af = adev->gmc.mc_mask + 1 - ALIGN(mc->fb_end + 1, four_gb); | 158 | size_af = max_mc_address + 1 - ALIGN(mc->fb_end + 1, four_gb); |
157 | 159 | ||
158 | if (mc->gart_size > max(size_bf, size_af)) { | 160 | if (mc->gart_size > max(size_bf, size_af)) { |
159 | dev_warn(adev->dev, "limiting GART\n"); | 161 | dev_warn(adev->dev, "limiting GART\n"); |
@@ -164,7 +166,7 @@ void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc) | |||
164 | (size_af < mc->gart_size)) | 166 | (size_af < mc->gart_size)) |
165 | mc->gart_start = 0; | 167 | mc->gart_start = 0; |
166 | else | 168 | else |
167 | mc->gart_start = mc->mc_mask - mc->gart_size + 1; | 169 | mc->gart_start = max_mc_address - mc->gart_size + 1; |
168 | 170 | ||
169 | mc->gart_start &= ~(four_gb - 1); | 171 | mc->gart_start &= ~(four_gb - 1); |
170 | mc->gart_end = mc->gart_start + mc->gart_size - 1; | 172 | mc->gart_end = mc->gart_start + mc->gart_size - 1; |
@@ -200,16 +202,13 @@ void amdgpu_gmc_agp_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc) | |||
200 | } | 202 | } |
201 | 203 | ||
202 | if (size_bf > size_af) { | 204 | if (size_bf > size_af) { |
203 | mc->agp_start = mc->fb_start > mc->gart_start ? | 205 | mc->agp_start = (mc->fb_start - size_bf) & sixteen_gb_mask; |
204 | mc->gart_end + 1 : 0; | ||
205 | mc->agp_size = size_bf; | 206 | mc->agp_size = size_bf; |
206 | } else { | 207 | } else { |
207 | mc->agp_start = (mc->fb_start > mc->gart_start ? | 208 | mc->agp_start = ALIGN(mc->fb_end + 1, sixteen_gb); |
208 | mc->fb_end : mc->gart_end) + 1, | ||
209 | mc->agp_size = size_af; | 209 | mc->agp_size = size_af; |
210 | } | 210 | } |
211 | 211 | ||
212 | mc->agp_start = ALIGN(mc->agp_start, sixteen_gb); | ||
213 | mc->agp_end = mc->agp_start + mc->agp_size - 1; | 212 | mc->agp_end = mc->agp_start + mc->agp_size - 1; |
214 | dev_info(adev->dev, "AGP: %lluM 0x%016llX - 0x%016llX\n", | 213 | dev_info(adev->dev, "AGP: %lluM 0x%016llX - 0x%016llX\n", |
215 | mc->agp_size >> 20, mc->agp_start, mc->agp_end); | 214 | mc->agp_size >> 20, mc->agp_start, mc->agp_end); |