Skip to content

Commit 0a71553

Browse files
committed
Merge tag 'drm-fixes-2023-01-06' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Daniel Vetter: "Still not much, but more than last week. Dave should be back next week from the beaching. drivers: - i915-gvt fixes - amdgpu/kfd fixes - panfrost bo refcounting fix - meson afbc corruption fix - imx plane width fix core: - drm/sched fixes - drm/mm kunit test fix - dma-buf export error handling fixes" * tag 'drm-fixes-2023-01-06' of git://anongit.freedesktop.org/drm/drm: Revert "drm/amd/display: Enable Freesync Video Mode by default" drm/i915/gvt: fix double free bug in split_2MB_gtt_entry drm/i915/gvt: use atomic operations to change the vGPU status drm/i915/gvt: fix vgpu debugfs clean in remove drm/i915/gvt: fix gvt debugfs destroy drm/i915: unpin on error in intel_vgpu_shadow_mm_pin() drm/amd/display: Uninitialized variables causing 4k60 UCLK to stay at DPM1 and not DPM0 drm/amdkfd: Fix kernel warning during topology setup drm/scheduler: Fix lockup in drm_sched_entity_kill() drm/imx: ipuv3-plane: Fix overlay plane width drm/scheduler: Fix lockup in drm_sched_entity_kill() drm/virtio: Fix memory leak in virtio_gpu_object_create() drm/meson: Reduce the FIFO lines held when AFBC is not used drm/tests: reduce drm_mm_test stack usage drm/panfrost: Fix GEM handle creation ref-counting drm/plane-helper: Add the missing declaration of drm_atomic_state dma-buf: fix dma_buf_export init order v2
2 parents 1382999 + 5193326 commit 0a71553

27 files changed

+204
-153
lines changed

drivers/dma-buf/dma-buf-sysfs-stats.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,11 @@ void dma_buf_uninit_sysfs_statistics(void)
168168
kset_unregister(dma_buf_stats_kset);
169169
}
170170

171-
int dma_buf_stats_setup(struct dma_buf *dmabuf)
171+
int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file)
172172
{
173173
struct dma_buf_sysfs_entry *sysfs_entry;
174174
int ret;
175175

176-
if (!dmabuf || !dmabuf->file)
177-
return -EINVAL;
178-
179176
if (!dmabuf->exp_name) {
180177
pr_err("exporter name must not be empty if stats needed\n");
181178
return -EINVAL;
@@ -192,7 +189,7 @@ int dma_buf_stats_setup(struct dma_buf *dmabuf)
192189

193190
/* create the directory for buffer stats */
194191
ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_ktype, NULL,
195-
"%lu", file_inode(dmabuf->file)->i_ino);
192+
"%lu", file_inode(file)->i_ino);
196193
if (ret)
197194
goto err_sysfs_dmabuf;
198195

drivers/dma-buf/dma-buf-sysfs-stats.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
int dma_buf_init_sysfs_statistics(void);
1414
void dma_buf_uninit_sysfs_statistics(void);
1515

16-
int dma_buf_stats_setup(struct dma_buf *dmabuf);
16+
int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file);
1717

1818
void dma_buf_stats_teardown(struct dma_buf *dmabuf);
1919
#else
@@ -25,7 +25,7 @@ static inline int dma_buf_init_sysfs_statistics(void)
2525

2626
static inline void dma_buf_uninit_sysfs_statistics(void) {}
2727

28-
static inline int dma_buf_stats_setup(struct dma_buf *dmabuf)
28+
static inline int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file)
2929
{
3030
return 0;
3131
}

drivers/dma-buf/dma-buf.c

Lines changed: 38 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,11 @@ static int dma_buf_file_release(struct inode *inode, struct file *file)
9595
return -EINVAL;
9696

9797
dmabuf = file->private_data;
98-
99-
mutex_lock(&db_list.lock);
100-
list_del(&dmabuf->list_node);
101-
mutex_unlock(&db_list.lock);
98+
if (dmabuf) {
99+
mutex_lock(&db_list.lock);
100+
list_del(&dmabuf->list_node);
101+
mutex_unlock(&db_list.lock);
102+
}
102103

103104
return 0;
104105
}
@@ -528,17 +529,17 @@ static inline int is_dma_buf_file(struct file *file)
528529
return file->f_op == &dma_buf_fops;
529530
}
530531

531-
static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
532+
static struct file *dma_buf_getfile(size_t size, int flags)
532533
{
533534
static atomic64_t dmabuf_inode = ATOMIC64_INIT(0);
534-
struct file *file;
535535
struct inode *inode = alloc_anon_inode(dma_buf_mnt->mnt_sb);
536+
struct file *file;
536537

537538
if (IS_ERR(inode))
538539
return ERR_CAST(inode);
539540

540-
inode->i_size = dmabuf->size;
541-
inode_set_bytes(inode, dmabuf->size);
541+
inode->i_size = size;
542+
inode_set_bytes(inode, size);
542543

543544
/*
544545
* The ->i_ino acquired from get_next_ino() is not unique thus
@@ -552,8 +553,6 @@ static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
552553
flags, &dma_buf_fops);
553554
if (IS_ERR(file))
554555
goto err_alloc_file;
555-
file->private_data = dmabuf;
556-
file->f_path.dentry->d_fsdata = dmabuf;
557556

558557
return file;
559558

@@ -619,19 +618,11 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
619618
size_t alloc_size = sizeof(struct dma_buf);
620619
int ret;
621620

622-
if (!exp_info->resv)
623-
alloc_size += sizeof(struct dma_resv);
624-
else
625-
/* prevent &dma_buf[1] == dma_buf->resv */
626-
alloc_size += 1;
627-
628-
if (WARN_ON(!exp_info->priv
629-
|| !exp_info->ops
630-
|| !exp_info->ops->map_dma_buf
631-
|| !exp_info->ops->unmap_dma_buf
632-
|| !exp_info->ops->release)) {
621+
if (WARN_ON(!exp_info->priv || !exp_info->ops
622+
|| !exp_info->ops->map_dma_buf
623+
|| !exp_info->ops->unmap_dma_buf
624+
|| !exp_info->ops->release))
633625
return ERR_PTR(-EINVAL);
634-
}
635626

636627
if (WARN_ON(exp_info->ops->cache_sgt_mapping &&
637628
(exp_info->ops->pin || exp_info->ops->unpin)))
@@ -643,10 +634,21 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
643634
if (!try_module_get(exp_info->owner))
644635
return ERR_PTR(-ENOENT);
645636

637+
file = dma_buf_getfile(exp_info->size, exp_info->flags);
638+
if (IS_ERR(file)) {
639+
ret = PTR_ERR(file);
640+
goto err_module;
641+
}
642+
643+
if (!exp_info->resv)
644+
alloc_size += sizeof(struct dma_resv);
645+
else
646+
/* prevent &dma_buf[1] == dma_buf->resv */
647+
alloc_size += 1;
646648
dmabuf = kzalloc(alloc_size, GFP_KERNEL);
647649
if (!dmabuf) {
648650
ret = -ENOMEM;
649-
goto err_module;
651+
goto err_file;
650652
}
651653

652654
dmabuf->priv = exp_info->priv;
@@ -658,43 +660,35 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
658660
init_waitqueue_head(&dmabuf->poll);
659661
dmabuf->cb_in.poll = dmabuf->cb_out.poll = &dmabuf->poll;
660662
dmabuf->cb_in.active = dmabuf->cb_out.active = 0;
663+
INIT_LIST_HEAD(&dmabuf->attachments);
661664

662665
if (!resv) {
663-
resv = (struct dma_resv *)&dmabuf[1];
664-
dma_resv_init(resv);
666+
dmabuf->resv = (struct dma_resv *)&dmabuf[1];
667+
dma_resv_init(dmabuf->resv);
668+
} else {
669+
dmabuf->resv = resv;
665670
}
666-
dmabuf->resv = resv;
667671

668-
file = dma_buf_getfile(dmabuf, exp_info->flags);
669-
if (IS_ERR(file)) {
670-
ret = PTR_ERR(file);
672+
ret = dma_buf_stats_setup(dmabuf, file);
673+
if (ret)
671674
goto err_dmabuf;
672-
}
673675

676+
file->private_data = dmabuf;
677+
file->f_path.dentry->d_fsdata = dmabuf;
674678
dmabuf->file = file;
675679

676-
INIT_LIST_HEAD(&dmabuf->attachments);
677-
678680
mutex_lock(&db_list.lock);
679681
list_add(&dmabuf->list_node, &db_list.head);
680682
mutex_unlock(&db_list.lock);
681683

682-
ret = dma_buf_stats_setup(dmabuf);
683-
if (ret)
684-
goto err_sysfs;
685-
686684
return dmabuf;
687685

688-
err_sysfs:
689-
/*
690-
* Set file->f_path.dentry->d_fsdata to NULL so that when
691-
* dma_buf_release() gets invoked by dentry_ops, it exits
692-
* early before calling the release() dma_buf op.
693-
*/
694-
file->f_path.dentry->d_fsdata = NULL;
695-
fput(file);
696686
err_dmabuf:
687+
if (!resv)
688+
dma_resv_fini(dmabuf->resv);
697689
kfree(dmabuf);
690+
err_file:
691+
fput(file);
698692
err_module:
699693
module_put(exp_info->owner);
700694
return ERR_PTR(ret);

drivers/gpu/drm/amd/amdgpu/amdgpu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ extern int amdgpu_emu_mode;
195195
extern uint amdgpu_smu_memory_pool_size;
196196
extern int amdgpu_smu_pptable_id;
197197
extern uint amdgpu_dc_feature_mask;
198+
extern uint amdgpu_freesync_vid_mode;
198199
extern uint amdgpu_dc_debug_mask;
199200
extern uint amdgpu_dc_visual_confirm;
200201
extern uint amdgpu_dm_abm_level;

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ int amdgpu_mes_kiq;
181181
int amdgpu_noretry = -1;
182182
int amdgpu_force_asic_type = -1;
183183
int amdgpu_tmz = -1; /* auto */
184+
uint amdgpu_freesync_vid_mode;
184185
int amdgpu_reset_method = -1; /* auto */
185186
int amdgpu_num_kcq = -1;
186187
int amdgpu_smartshift_bias;
@@ -879,6 +880,32 @@ module_param_named(backlight, amdgpu_backlight, bint, 0444);
879880
MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)");
880881
module_param_named(tmz, amdgpu_tmz, int, 0444);
881882

883+
/**
884+
* DOC: freesync_video (uint)
885+
* Enable the optimization to adjust front porch timing to achieve seamless
886+
* mode change experience when setting a freesync supported mode for which full
887+
* modeset is not needed.
888+
*
889+
* The Display Core will add a set of modes derived from the base FreeSync
890+
* video mode into the corresponding connector's mode list based on commonly
891+
* used refresh rates and VRR range of the connected display, when users enable
892+
* this feature. From the userspace perspective, they can see a seamless mode
893+
* change experience when the change between different refresh rates under the
894+
* same resolution. Additionally, userspace applications such as Video playback
895+
* can read this modeset list and change the refresh rate based on the video
896+
* frame rate. Finally, the userspace can also derive an appropriate mode for a
897+
* particular refresh rate based on the FreeSync Mode and add it to the
898+
* connector's mode list.
899+
*
900+
* Note: This is an experimental feature.
901+
*
902+
* The default value: 0 (off).
903+
*/
904+
MODULE_PARM_DESC(
905+
freesync_video,
906+
"Enable freesync modesetting optimization feature (0 = off (default), 1 = on)");
907+
module_param_named(freesync_video, amdgpu_freesync_vid_mode, uint, 0444);
908+
882909
/**
883910
* DOC: reset_method (int)
884911
* GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev,
801801

802802
p2plink->attr.name = "properties";
803803
p2plink->attr.mode = KFD_SYSFS_FILE_MODE;
804-
sysfs_attr_init(&iolink->attr);
804+
sysfs_attr_init(&p2plink->attr);
805805
ret = sysfs_create_file(p2plink->kobj, &p2plink->attr);
806806
if (ret < 0)
807807
return ret;

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5835,7 +5835,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
58355835
*/
58365836
DRM_DEBUG_DRIVER("No preferred mode found\n");
58375837
} else {
5838-
recalculate_timing = is_freesync_video_mode(&mode, aconnector);
5838+
recalculate_timing = amdgpu_freesync_vid_mode &&
5839+
is_freesync_video_mode(&mode, aconnector);
58395840
if (recalculate_timing) {
58405841
freesync_mode = get_highest_refresh_rate_mode(aconnector, false);
58415842
drm_mode_copy(&saved_mode, &mode);
@@ -6986,7 +6987,7 @@ static void amdgpu_dm_connector_add_freesync_modes(struct drm_connector *connect
69866987
struct amdgpu_dm_connector *amdgpu_dm_connector =
69876988
to_amdgpu_dm_connector(connector);
69886989

6989-
if (!edid)
6990+
if (!(amdgpu_freesync_vid_mode && edid))
69906991
return;
69916992

69926993
if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10)
@@ -8850,7 +8851,8 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
88508851
* TODO: Refactor this function to allow this check to work
88518852
* in all conditions.
88528853
*/
8853-
if (dm_new_crtc_state->stream &&
8854+
if (amdgpu_freesync_vid_mode &&
8855+
dm_new_crtc_state->stream &&
88548856
is_timing_unchanged_for_freesync(new_crtc_state, old_crtc_state))
88558857
goto skip_modeset;
88568858

@@ -8885,7 +8887,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
88858887
if (!dm_old_crtc_state->stream)
88868888
goto skip_modeset;
88878889

8888-
if (dm_new_crtc_state->stream &&
8890+
if (amdgpu_freesync_vid_mode && dm_new_crtc_state->stream &&
88898891
is_timing_unchanged_for_freesync(new_crtc_state,
88908892
old_crtc_state)) {
88918893
new_crtc_state->mode_changed = false;
@@ -8897,7 +8899,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
88978899
set_freesync_fixed_config(dm_new_crtc_state);
88988900

88998901
goto skip_modeset;
8900-
} else if (aconnector &&
8902+
} else if (amdgpu_freesync_vid_mode && aconnector &&
89018903
is_freesync_video_mode(&new_crtc_state->mode,
89028904
aconnector)) {
89038905
struct drm_display_mode *high_mode;

drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6257,12 +6257,12 @@ bool dml32_CalculateDETSwathFillLatencyHiding(unsigned int NumberOfActiveSurface
62576257
double SwathSizePerSurfaceC[DC__NUM_DPP__MAX];
62586258
bool NotEnoughDETSwathFillLatencyHiding = false;
62596259

6260-
/* calculate sum of single swath size for all pipes in bytes*/
6260+
/* calculate sum of single swath size for all pipes in bytes */
62616261
for (k = 0; k < NumberOfActiveSurfaces; k++) {
6262-
SwathSizePerSurfaceY[k] += SwathHeightY[k] * SwathWidthY[k] * BytePerPixelInDETY[k] * NumOfDPP[k];
6262+
SwathSizePerSurfaceY[k] = SwathHeightY[k] * SwathWidthY[k] * BytePerPixelInDETY[k] * NumOfDPP[k];
62636263

62646264
if (SwathHeightC[k] != 0)
6265-
SwathSizePerSurfaceC[k] += SwathHeightC[k] * SwathWidthC[k] * BytePerPixelInDETC[k] * NumOfDPP[k];
6265+
SwathSizePerSurfaceC[k] = SwathHeightC[k] * SwathWidthC[k] * BytePerPixelInDETC[k] * NumOfDPP[k];
62666266
else
62676267
SwathSizePerSurfaceC[k] = 0;
62686268

drivers/gpu/drm/i915/gvt/debugfs.c

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,22 @@ DEFINE_SIMPLE_ATTRIBUTE(vgpu_scan_nonprivbb_fops,
151151
vgpu_scan_nonprivbb_get, vgpu_scan_nonprivbb_set,
152152
"0x%llx\n");
153153

154+
static int vgpu_status_get(void *data, u64 *val)
155+
{
156+
struct intel_vgpu *vgpu = (struct intel_vgpu *)data;
157+
158+
*val = 0;
159+
160+
if (test_bit(INTEL_VGPU_STATUS_ATTACHED, vgpu->status))
161+
*val |= (1 << INTEL_VGPU_STATUS_ATTACHED);
162+
if (test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status))
163+
*val |= (1 << INTEL_VGPU_STATUS_ACTIVE);
164+
165+
return 0;
166+
}
167+
168+
DEFINE_SIMPLE_ATTRIBUTE(vgpu_status_fops, vgpu_status_get, NULL, "0x%llx\n");
169+
154170
/**
155171
* intel_gvt_debugfs_add_vgpu - register debugfs entries for a vGPU
156172
* @vgpu: a vGPU
@@ -162,11 +178,12 @@ void intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu)
162178
snprintf(name, 16, "vgpu%d", vgpu->id);
163179
vgpu->debugfs = debugfs_create_dir(name, vgpu->gvt->debugfs_root);
164180

165-
debugfs_create_bool("active", 0444, vgpu->debugfs, &vgpu->active);
166181
debugfs_create_file("mmio_diff", 0444, vgpu->debugfs, vgpu,
167182
&vgpu_mmio_diff_fops);
168183
debugfs_create_file("scan_nonprivbb", 0644, vgpu->debugfs, vgpu,
169184
&vgpu_scan_nonprivbb_fops);
185+
debugfs_create_file("status", 0644, vgpu->debugfs, vgpu,
186+
&vgpu_status_fops);
170187
}
171188

172189
/**
@@ -175,8 +192,13 @@ void intel_gvt_debugfs_add_vgpu(struct intel_vgpu *vgpu)
175192
*/
176193
void intel_gvt_debugfs_remove_vgpu(struct intel_vgpu *vgpu)
177194
{
178-
debugfs_remove_recursive(vgpu->debugfs);
179-
vgpu->debugfs = NULL;
195+
struct intel_gvt *gvt = vgpu->gvt;
196+
struct drm_minor *minor = gvt->gt->i915->drm.primary;
197+
198+
if (minor->debugfs_root && gvt->debugfs_root) {
199+
debugfs_remove_recursive(vgpu->debugfs);
200+
vgpu->debugfs = NULL;
201+
}
180202
}
181203

182204
/**
@@ -199,6 +221,10 @@ void intel_gvt_debugfs_init(struct intel_gvt *gvt)
199221
*/
200222
void intel_gvt_debugfs_clean(struct intel_gvt *gvt)
201223
{
202-
debugfs_remove_recursive(gvt->debugfs_root);
203-
gvt->debugfs_root = NULL;
224+
struct drm_minor *minor = gvt->gt->i915->drm.primary;
225+
226+
if (minor->debugfs_root) {
227+
debugfs_remove_recursive(gvt->debugfs_root);
228+
gvt->debugfs_root = NULL;
229+
}
204230
}

drivers/gpu/drm/i915/gvt/dmabuf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ static void dmabuf_gem_object_free(struct kref *kref)
134134
struct list_head *pos;
135135
struct intel_vgpu_dmabuf_obj *dmabuf_obj;
136136

137-
if (vgpu && vgpu->active && !list_empty(&vgpu->dmabuf_obj_list_head)) {
137+
if (vgpu && test_bit(INTEL_VGPU_STATUS_ACTIVE, vgpu->status) &&
138+
!list_empty(&vgpu->dmabuf_obj_list_head)) {
138139
list_for_each(pos, &vgpu->dmabuf_obj_list_head) {
139140
dmabuf_obj = list_entry(pos, struct intel_vgpu_dmabuf_obj, list);
140141
if (dmabuf_obj == obj) {

0 commit comments

Comments
 (0)