Skip to content

Commit f9915c3

Browse files
committed
Merge tag 'drm-misc-fixes-2025-08-21' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
A bunch of fixes for 6.17: - analogix_dp: devm_drm_bridge_alloc() error handling fix - gaudi: Memory deallocation fix - gpuvm: Documentation warning fix - hibmc: Various misc fixes - nouveau: Memory leak fixes, typos - panic: u64 division handling on 32 bits architecture fix - rockchip: Kconfig fix, register caching fix - rust: memory layout and safety fixes - tests: Endianness fixes Signed-off-by: Dave Airlie <[email protected]> From: Maxime Ripard <[email protected]> Link: https://lore.kernel.org/r/20250821-economic-dandelion-rooster-c57fa9@houat
2 parents dbb2c3a + 1a2cf17 commit f9915c3

File tree

24 files changed

+154
-59
lines changed

24 files changed

+154
-59
lines changed

MAINTAINERS

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8426,6 +8426,17 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
84268426
F: drivers/gpu/drm/scheduler/
84278427
F: include/drm/gpu_scheduler.h
84288428

8429+
DRM GPUVM
8430+
M: Danilo Krummrich <[email protected]>
8431+
R: Matthew Brost <[email protected]>
8432+
R: Thomas Hellström <[email protected]>
8433+
R: Alice Ryhl <[email protected]>
8434+
8435+
S: Supported
8436+
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
8437+
F: drivers/gpu/drm/drm_gpuvm.c
8438+
F: include/drm/drm_gpuvm.h
8439+
84298440
DRM LOG
84308441
M: Jocelyn Falempe <[email protected]>
84318442
M: Javier Martinez Canillas <[email protected]>
@@ -10655,7 +10666,8 @@ S: Maintained
1065510666
F: block/partitions/efi.*
1065610667

1065710668
HABANALABS PCI DRIVER
10658-
M: Yaron Avizrat <[email protected]>
10669+
M: Koby Elbaz <[email protected]>
10670+
M: Konstantin Sinyuk <[email protected]>
1065910671
1066010672
S: Supported
1066110673
C: irc://irc.oftc.net/dri-devel

drivers/accel/habanalabs/gaudi2/gaudi2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10437,7 +10437,7 @@ static int gaudi2_memset_device_memory(struct hl_device *hdev, u64 addr, u64 siz
1043710437
(u64 *)(lin_dma_pkts_arr), DEBUGFS_WRITE64);
1043810438
WREG32(sob_addr, 0);
1043910439

10440-
kfree(lin_dma_pkts_arr);
10440+
kvfree(lin_dma_pkts_arr);
1044110441

1044210442
return rc;
1044310443
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ bool amdgpu_dmabuf_is_xgmi_accessible(struct amdgpu_device *adev,
514514
return false;
515515

516516
if (drm_gem_is_imported(obj)) {
517-
struct dma_buf *dma_buf = obj->dma_buf;
517+
struct dma_buf *dma_buf = obj->import_attach->dmabuf;
518518

519519
if (dma_buf->ops != &amdgpu_dmabuf_ops)
520520
/* No XGMI with non AMD GPUs */

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ static int amdgpu_gem_object_open(struct drm_gem_object *obj,
317317
*/
318318
if (!vm->is_compute_context || !vm->process_info)
319319
return 0;
320-
if (!drm_gem_is_imported(obj) || !dma_buf_is_dynamic(obj->dma_buf))
320+
if (!drm_gem_is_imported(obj) ||
321+
!dma_buf_is_dynamic(obj->import_attach->dmabuf))
321322
return 0;
322323
mutex_lock_nested(&vm->process_info->lock, 1);
323324
if (!WARN_ON(!vm->process_info->eviction_fence)) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va,
12831283
struct drm_gem_object *obj = &bo->tbo.base;
12841284

12851285
if (drm_gem_is_imported(obj) && bo_va->is_xgmi) {
1286-
struct dma_buf *dma_buf = obj->dma_buf;
1286+
struct dma_buf *dma_buf = obj->import_attach->dmabuf;
12871287
struct drm_gem_object *gobj = dma_buf->priv;
12881288
struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
12891289

drivers/gpu/drm/bridge/analogix/analogix_dp_core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,8 +1474,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
14741474

14751475
dp = devm_drm_bridge_alloc(dev, struct analogix_dp_device, bridge,
14761476
&analogix_dp_bridge_funcs);
1477-
if (!dp)
1478-
return ERR_PTR(-ENOMEM);
1477+
if (IS_ERR(dp))
1478+
return ERR_CAST(dp);
14791479

14801480
dp->dev = &pdev->dev;
14811481
dp->dpms_mode = DRM_MODE_DPMS_OFF;

drivers/gpu/drm/drm_gpuvm.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2432,6 +2432,8 @@ static const struct drm_gpuvm_ops lock_ops = {
24322432
*
24332433
* The expected usage is:
24342434
*
2435+
* .. code-block:: c
2436+
*
24352437
* vm_bind {
24362438
* struct drm_exec exec;
24372439
*

drivers/gpu/drm/drm_panic_qr.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,26 @@ struct DecFifo {
381381
len: usize,
382382
}
383383

384+
// On arm32 architecture, dividing an `u64` by a constant will generate a call
385+
// to `__aeabi_uldivmod` which is not present in the kernel.
386+
// So use the multiply by inverse method for this architecture.
387+
fn div10(val: u64) -> u64 {
388+
if cfg!(target_arch = "arm") {
389+
let val_h = val >> 32;
390+
let val_l = val & 0xFFFFFFFF;
391+
let b_h: u64 = 0x66666666;
392+
let b_l: u64 = 0x66666667;
393+
394+
let tmp1 = val_h * b_l + ((val_l * b_l) >> 32);
395+
let tmp2 = val_l * b_h + (tmp1 & 0xffffffff);
396+
let tmp3 = val_h * b_h + (tmp1 >> 32) + (tmp2 >> 32);
397+
398+
tmp3 >> 2
399+
} else {
400+
val / 10
401+
}
402+
}
403+
384404
impl DecFifo {
385405
fn push(&mut self, data: u64, len: usize) {
386406
let mut chunk = data;
@@ -389,7 +409,7 @@ impl DecFifo {
389409
}
390410
for i in 0..len {
391411
self.decimals[i] = (chunk % 10) as u8;
392-
chunk /= 10;
412+
chunk = div10(chunk);
393413
}
394414
self.len += len;
395415
}

drivers/gpu/drm/hisilicon/hibmc/dp/dp_link.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,17 @@ static int hibmc_dp_link_downgrade_training_eq(struct hibmc_dp_dev *dp)
325325
return hibmc_dp_link_reduce_rate(dp);
326326
}
327327

328+
static void hibmc_dp_update_caps(struct hibmc_dp_dev *dp)
329+
{
330+
dp->link.cap.link_rate = dp->dpcd[DP_MAX_LINK_RATE];
331+
if (dp->link.cap.link_rate > DP_LINK_BW_8_1 || !dp->link.cap.link_rate)
332+
dp->link.cap.link_rate = DP_LINK_BW_8_1;
333+
334+
dp->link.cap.lanes = dp->dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK;
335+
if (dp->link.cap.lanes > HIBMC_DP_LANE_NUM_MAX)
336+
dp->link.cap.lanes = HIBMC_DP_LANE_NUM_MAX;
337+
}
338+
328339
int hibmc_dp_link_training(struct hibmc_dp_dev *dp)
329340
{
330341
struct hibmc_dp_link *link = &dp->link;
@@ -334,8 +345,7 @@ int hibmc_dp_link_training(struct hibmc_dp_dev *dp)
334345
if (ret)
335346
drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret);
336347

337-
dp->link.cap.link_rate = dp->dpcd[DP_MAX_LINK_RATE];
338-
dp->link.cap.lanes = 0x2;
348+
hibmc_dp_update_caps(dp);
339349

340350
ret = hibmc_dp_get_serdes_rate_cfg(dp);
341351
if (ret < 0)

drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
DEFINE_DRM_GEM_FOPS(hibmc_fops);
3434

35-
static const char *g_irqs_names_map[HIBMC_MAX_VECTORS] = { "vblank", "hpd" };
35+
static const char *g_irqs_names_map[HIBMC_MAX_VECTORS] = { "hibmc-vblank", "hibmc-hpd" };
3636

3737
static irqreturn_t hibmc_interrupt(int irq, void *arg)
3838
{
@@ -115,6 +115,8 @@ static const struct drm_mode_config_funcs hibmc_mode_funcs = {
115115
static int hibmc_kms_init(struct hibmc_drm_private *priv)
116116
{
117117
struct drm_device *dev = &priv->dev;
118+
struct drm_encoder *encoder;
119+
u32 clone_mask = 0;
118120
int ret;
119121

120122
ret = drmm_mode_config_init(dev);
@@ -154,6 +156,12 @@ static int hibmc_kms_init(struct hibmc_drm_private *priv)
154156
return ret;
155157
}
156158

159+
drm_for_each_encoder(encoder, dev)
160+
clone_mask |= drm_encoder_mask(encoder);
161+
162+
drm_for_each_encoder(encoder, dev)
163+
encoder->possible_clones = clone_mask;
164+
157165
return 0;
158166
}
159167

@@ -277,7 +285,6 @@ static void hibmc_unload(struct drm_device *dev)
277285
static int hibmc_msi_init(struct drm_device *dev)
278286
{
279287
struct pci_dev *pdev = to_pci_dev(dev->dev);
280-
char name[32] = {0};
281288
int valid_irq_num;
282289
int irq;
283290
int ret;
@@ -292,20 +299,17 @@ static int hibmc_msi_init(struct drm_device *dev)
292299
valid_irq_num = ret;
293300

294301
for (int i = 0; i < valid_irq_num; i++) {
295-
snprintf(name, ARRAY_SIZE(name) - 1, "%s-%s-%s",
296-
dev->driver->name, pci_name(pdev), g_irqs_names_map[i]);
297-
298302
irq = pci_irq_vector(pdev, i);
299303

300304
if (i)
301305
/* PCI devices require shared interrupts. */
302306
ret = devm_request_threaded_irq(&pdev->dev, irq,
303307
hibmc_dp_interrupt,
304308
hibmc_dp_hpd_isr,
305-
IRQF_SHARED, name, dev);
309+
IRQF_SHARED, g_irqs_names_map[i], dev);
306310
else
307311
ret = devm_request_irq(&pdev->dev, irq, hibmc_interrupt,
308-
IRQF_SHARED, name, dev);
312+
IRQF_SHARED, g_irqs_names_map[i], dev);
309313
if (ret) {
310314
drm_err(dev, "install irq failed: %d\n", ret);
311315
return ret;
@@ -323,13 +327,13 @@ static int hibmc_load(struct drm_device *dev)
323327

324328
ret = hibmc_hw_init(priv);
325329
if (ret)
326-
goto err;
330+
return ret;
327331

328332
ret = drmm_vram_helper_init(dev, pci_resource_start(pdev, 0),
329333
pci_resource_len(pdev, 0));
330334
if (ret) {
331335
drm_err(dev, "Error initializing VRAM MM; %d\n", ret);
332-
goto err;
336+
return ret;
333337
}
334338

335339
ret = hibmc_kms_init(priv);

0 commit comments

Comments
 (0)