Skip to content

Commit e61b2ad

Browse files
committed
Merge tag 'drm-fixes-2021-09-24' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Dave Airlie: "Quiet week this week, just some i915 and amd fixes, just getting ready for my all nighter maintainer summit! Summary: i915: - Fix ADL-P memory bandwidth parameters - Fix memory corruption due to a double free - Fix memory leak in DMC firmware handling amdgpu: - Update MAINTAINERS entry for powerplay - Fix empty macros - SI DPM fix amdkfd: - SVM fixes - DMA mapping fix" * tag 'drm-fixes-2021-09-24' of git://anongit.freedesktop.org/drm/drm: drm/amdkfd: fix svm_migrate_fini warning drm/amdkfd: handle svm migrate init error drm/amd/pm: Update intermediate power state for SI drm/amdkfd: fix dma mapping leaking warning drm/amdkfd: SVM map to gpus check vma boundary MAINTAINERS: fix up entry for AMD Powerplay drm/amd/display: fix empty debug macros drm/i915: Free all DMC payloads drm/i915: Move __i915_gem_free_object to ttm_bo_destroy drm/i915: Update memory bandwidth parameters
2 parents f9e3610 + ef88d7a commit e61b2ad

File tree

10 files changed

+57
-32
lines changed

10 files changed

+57
-32
lines changed

MAINTAINERS

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -977,12 +977,12 @@ L: [email protected]
977977
S: Maintained
978978
F: drivers/platform/x86/amd-pmc.*
979979

980-
AMD POWERPLAY
980+
AMD POWERPLAY AND SWSMU
981981
M: Evan Quan <[email protected]>
982982
983983
S: Supported
984984
T: git https://gitlab.freedesktop.org/agd5f/linux.git
985-
F: drivers/gpu/drm/amd/pm/powerplay/
985+
F: drivers/gpu/drm/amd/pm/
986986

987987
AMD PTDMA DRIVER
988988
M: Sanjay R Mehta <[email protected]>

drivers/gpu/drm/amd/amdkfd/kfd_device.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,6 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
971971
void kgd2kfd_device_exit(struct kfd_dev *kfd)
972972
{
973973
if (kfd->init_complete) {
974-
svm_migrate_fini((struct amdgpu_device *)kfd->kgd);
975974
device_queue_manager_uninit(kfd->dqm);
976975
kfd_interrupt_exit(kfd);
977976
kfd_topology_remove_device(kfd);

drivers/gpu/drm/amd/amdkfd/kfd_migrate.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -891,9 +891,16 @@ int svm_migrate_init(struct amdgpu_device *adev)
891891
pgmap->ops = &svm_migrate_pgmap_ops;
892892
pgmap->owner = SVM_ADEV_PGMAP_OWNER(adev);
893893
pgmap->flags = MIGRATE_VMA_SELECT_DEVICE_PRIVATE;
894+
895+
/* Device manager releases device-specific resources, memory region and
896+
* pgmap when driver disconnects from device.
897+
*/
894898
r = devm_memremap_pages(adev->dev, pgmap);
895899
if (IS_ERR(r)) {
896900
pr_err("failed to register HMM device memory\n");
901+
902+
/* Disable SVM support capability */
903+
pgmap->type = 0;
897904
devm_release_mem_region(adev->dev, res->start,
898905
res->end - res->start + 1);
899906
return PTR_ERR(r);
@@ -908,12 +915,3 @@ int svm_migrate_init(struct amdgpu_device *adev)
908915

909916
return 0;
910917
}
911-
912-
void svm_migrate_fini(struct amdgpu_device *adev)
913-
{
914-
struct dev_pagemap *pgmap = &adev->kfd.dev->pgmap;
915-
916-
devm_memunmap_pages(adev->dev, pgmap);
917-
devm_release_mem_region(adev->dev, pgmap->range.start,
918-
pgmap->range.end - pgmap->range.start + 1);
919-
}

drivers/gpu/drm/amd/amdkfd/kfd_migrate.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,13 @@ unsigned long
4747
svm_migrate_addr_to_pfn(struct amdgpu_device *adev, unsigned long addr);
4848

4949
int svm_migrate_init(struct amdgpu_device *adev);
50-
void svm_migrate_fini(struct amdgpu_device *adev);
5150

5251
#else
5352

5453
static inline int svm_migrate_init(struct amdgpu_device *adev)
5554
{
5655
return 0;
5756
}
58-
static inline void svm_migrate_fini(struct amdgpu_device *adev)
59-
{
60-
/* empty */
61-
}
6257

6358
#endif /* IS_ENABLED(CONFIG_HSA_AMD_SVM) */
6459

drivers/gpu/drm/amd/amdkfd/kfd_svm.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ static void svm_range_remove_notifier(struct svm_range *prange)
118118
mmu_interval_notifier_remove(&prange->notifier);
119119
}
120120

121+
static bool
122+
svm_is_valid_dma_mapping_addr(struct device *dev, dma_addr_t dma_addr)
123+
{
124+
return dma_addr && !dma_mapping_error(dev, dma_addr) &&
125+
!(dma_addr & SVM_RANGE_VRAM_DOMAIN);
126+
}
127+
121128
static int
122129
svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange,
123130
unsigned long offset, unsigned long npages,
@@ -139,8 +146,7 @@ svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange,
139146

140147
addr += offset;
141148
for (i = 0; i < npages; i++) {
142-
if (WARN_ONCE(addr[i] && !dma_mapping_error(dev, addr[i]),
143-
"leaking dma mapping\n"))
149+
if (svm_is_valid_dma_mapping_addr(dev, addr[i]))
144150
dma_unmap_page(dev, addr[i], PAGE_SIZE, dir);
145151

146152
page = hmm_pfn_to_page(hmm_pfns[i]);
@@ -209,7 +215,7 @@ void svm_range_dma_unmap(struct device *dev, dma_addr_t *dma_addr,
209215
return;
210216

211217
for (i = offset; i < offset + npages; i++) {
212-
if (!dma_addr[i] || dma_mapping_error(dev, dma_addr[i]))
218+
if (!svm_is_valid_dma_mapping_addr(dev, dma_addr[i]))
213219
continue;
214220
pr_debug("dma unmapping 0x%llx\n", dma_addr[i] >> PAGE_SHIFT);
215221
dma_unmap_page(dev, dma_addr[i], PAGE_SIZE, dir);
@@ -1165,7 +1171,7 @@ svm_range_map_to_gpu(struct amdgpu_device *adev, struct amdgpu_vm *vm,
11651171
unsigned long last_start;
11661172
int last_domain;
11671173
int r = 0;
1168-
int64_t i;
1174+
int64_t i, j;
11691175

11701176
last_start = prange->start + offset;
11711177

@@ -1178,7 +1184,11 @@ svm_range_map_to_gpu(struct amdgpu_device *adev, struct amdgpu_vm *vm,
11781184
for (i = offset; i < offset + npages; i++) {
11791185
last_domain = dma_addr[i] & SVM_RANGE_VRAM_DOMAIN;
11801186
dma_addr[i] &= ~SVM_RANGE_VRAM_DOMAIN;
1181-
if ((prange->start + i) < prange->last &&
1187+
1188+
/* Collect all pages in the same address range and memory domain
1189+
* that can be mapped with a single call to update mapping.
1190+
*/
1191+
if (i < offset + npages - 1 &&
11821192
last_domain == (dma_addr[i + 1] & SVM_RANGE_VRAM_DOMAIN))
11831193
continue;
11841194

@@ -1201,6 +1211,10 @@ svm_range_map_to_gpu(struct amdgpu_device *adev, struct amdgpu_vm *vm,
12011211
NULL, dma_addr,
12021212
&vm->last_update,
12031213
&table_freed);
1214+
1215+
for (j = last_start - prange->start; j <= i; j++)
1216+
dma_addr[j] |= last_domain;
1217+
12041218
if (r) {
12051219
pr_debug("failed %d to map to gpu 0x%lx\n", r, prange->start);
12061220
goto out;

drivers/gpu/drm/amd/display/dc/dce/dce_aux.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
#define DC_LOGGER \
4343
engine->ctx->logger
4444

45-
#define DC_TRACE_LEVEL_MESSAGE(...) /* do nothing */
45+
#define DC_TRACE_LEVEL_MESSAGE(...) do { } while (0)
4646
#define IS_DC_I2CAUX_LOGGING_ENABLED() (false)
4747
#define LOG_FLAG_Error_I2cAux LOG_ERROR
4848
#define LOG_FLAG_I2cAux_DceAux LOG_I2C_AUX
@@ -76,7 +76,7 @@ enum {
7676
#define DEFAULT_AUX_ENGINE_MULT 0
7777
#define DEFAULT_AUX_ENGINE_LENGTH 69
7878

79-
#define DC_TRACE_LEVEL_MESSAGE(...) /* do nothing */
79+
#define DC_TRACE_LEVEL_MESSAGE(...) do { } while (0)
8080

8181
static void release_engine(
8282
struct dce_aux *engine)

drivers/gpu/drm/amd/pm/powerplay/si_dpm.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6867,6 +6867,8 @@ static int si_dpm_enable(struct amdgpu_device *adev)
68676867
si_enable_auto_throttle_source(adev, AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
68686868
si_thermal_start_thermal_controller(adev);
68696869

6870+
ni_update_current_ps(adev, boot_ps);
6871+
68706872
return 0;
68716873
}
68726874

drivers/gpu/drm/i915/display/intel_bw.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,31 +222,42 @@ static int icl_sagv_max_dclk(const struct intel_qgv_info *qi)
222222

223223
struct intel_sa_info {
224224
u16 displayrtids;
225-
u8 deburst, deprogbwlimit;
225+
u8 deburst, deprogbwlimit, derating;
226226
};
227227

228228
static const struct intel_sa_info icl_sa_info = {
229229
.deburst = 8,
230230
.deprogbwlimit = 25, /* GB/s */
231231
.displayrtids = 128,
232+
.derating = 10,
232233
};
233234

234235
static const struct intel_sa_info tgl_sa_info = {
235236
.deburst = 16,
236237
.deprogbwlimit = 34, /* GB/s */
237238
.displayrtids = 256,
239+
.derating = 10,
238240
};
239241

240242
static const struct intel_sa_info rkl_sa_info = {
241243
.deburst = 16,
242244
.deprogbwlimit = 20, /* GB/s */
243245
.displayrtids = 128,
246+
.derating = 10,
244247
};
245248

246249
static const struct intel_sa_info adls_sa_info = {
247250
.deburst = 16,
248251
.deprogbwlimit = 38, /* GB/s */
249252
.displayrtids = 256,
253+
.derating = 10,
254+
};
255+
256+
static const struct intel_sa_info adlp_sa_info = {
257+
.deburst = 16,
258+
.deprogbwlimit = 38, /* GB/s */
259+
.displayrtids = 256,
260+
.derating = 20,
250261
};
251262

252263
static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel_sa_info *sa)
@@ -302,7 +313,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
302313
bw = icl_calc_bw(sp->dclk, clpchgroup * 32 * num_channels, ct);
303314

304315
bi->deratedbw[j] = min(maxdebw,
305-
bw * 9 / 10); /* 90% */
316+
bw * (100 - sa->derating) / 100);
306317

307318
drm_dbg_kms(&dev_priv->drm,
308319
"BW%d / QGV %d: num_planes=%d deratedbw=%u\n",
@@ -400,7 +411,9 @@ void intel_bw_init_hw(struct drm_i915_private *dev_priv)
400411

401412
if (IS_DG2(dev_priv))
402413
dg2_get_bw_info(dev_priv);
403-
else if (IS_ALDERLAKE_S(dev_priv) || IS_ALDERLAKE_P(dev_priv))
414+
else if (IS_ALDERLAKE_P(dev_priv))
415+
icl_get_bw_info(dev_priv, &adlp_sa_info);
416+
else if (IS_ALDERLAKE_S(dev_priv))
404417
icl_get_bw_info(dev_priv, &adls_sa_info);
405418
else if (IS_ROCKETLAKE(dev_priv))
406419
icl_get_bw_info(dev_priv, &rkl_sa_info);

drivers/gpu/drm/i915/display/intel_dmc.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,11 +805,14 @@ void intel_dmc_ucode_resume(struct drm_i915_private *dev_priv)
805805
*/
806806
void intel_dmc_ucode_fini(struct drm_i915_private *dev_priv)
807807
{
808+
int id;
809+
808810
if (!HAS_DMC(dev_priv))
809811
return;
810812

811813
intel_dmc_ucode_suspend(dev_priv);
812814
drm_WARN_ON(&dev_priv->drm, dev_priv->dmc.wakeref);
813815

814-
kfree(dev_priv->dmc.dmc_info[DMC_FW_MAIN].payload);
816+
for (id = 0; id < DMC_FW_MAX; id++)
817+
kfree(dev_priv->dmc.dmc_info[id].payload);
815818
}

drivers/gpu/drm/i915/gem/i915_gem_ttm.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -356,11 +356,8 @@ static void i915_ttm_delete_mem_notify(struct ttm_buffer_object *bo)
356356
{
357357
struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
358358

359-
if (likely(obj)) {
360-
/* This releases all gem object bindings to the backend. */
359+
if (likely(obj))
361360
i915_ttm_free_cached_io_st(obj);
362-
__i915_gem_free_object(obj);
363-
}
364361
}
365362

366363
static struct intel_memory_region *
@@ -875,8 +872,12 @@ void i915_ttm_bo_destroy(struct ttm_buffer_object *bo)
875872
{
876873
struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo);
877874

875+
/* This releases all gem object bindings to the backend. */
876+
__i915_gem_free_object(obj);
877+
878878
i915_gem_object_release_memory_region(obj);
879879
mutex_destroy(&obj->ttm.get_io_page.lock);
880+
880881
if (obj->ttm.created)
881882
call_rcu(&obj->rcu, __i915_gem_free_object_rcu);
882883
}

0 commit comments

Comments
 (0)