Skip to content

Commit be48306

Browse files
committed
Merge tag 'drm-misc-fixes-2023-08-17' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
One EPROBE_DEFER handling fix for the JDI LT070ME05000, a timing fix for the AUO G121EAN01 panel, an integer overflow and a memory leak fixes for the qaic accel, a use-after-free fix for nouveau and a revert for an alleged fix in EDID parsing. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <mripard@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/3olqt33em5uhxzjbqghwcwnvmw73h7bxkbdxookmnkecymd4vc@7ogm6gewpprq
2 parents dd64d8a + 50b6f2c commit be48306

File tree

7 files changed

+63
-76
lines changed

7 files changed

+63
-76
lines changed

drivers/accel/qaic/qaic_control.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -392,18 +392,31 @@ static int find_and_map_user_pages(struct qaic_device *qdev,
392392
struct qaic_manage_trans_dma_xfer *in_trans,
393393
struct ioctl_resources *resources, struct dma_xfer *xfer)
394394
{
395+
u64 xfer_start_addr, remaining, end, total;
395396
unsigned long need_pages;
396397
struct page **page_list;
397398
unsigned long nr_pages;
398399
struct sg_table *sgt;
399-
u64 xfer_start_addr;
400400
int ret;
401401
int i;
402402

403-
xfer_start_addr = in_trans->addr + resources->xferred_dma_size;
403+
if (check_add_overflow(in_trans->addr, resources->xferred_dma_size, &xfer_start_addr))
404+
return -EINVAL;
404405

405-
need_pages = DIV_ROUND_UP(in_trans->size + offset_in_page(xfer_start_addr) -
406-
resources->xferred_dma_size, PAGE_SIZE);
406+
if (in_trans->size < resources->xferred_dma_size)
407+
return -EINVAL;
408+
remaining = in_trans->size - resources->xferred_dma_size;
409+
if (remaining == 0)
410+
return 0;
411+
412+
if (check_add_overflow(xfer_start_addr, remaining, &end))
413+
return -EINVAL;
414+
415+
total = remaining + offset_in_page(xfer_start_addr);
416+
if (total >= SIZE_MAX)
417+
return -EINVAL;
418+
419+
need_pages = DIV_ROUND_UP(total, PAGE_SIZE);
407420

408421
nr_pages = need_pages;
409422

@@ -435,7 +448,7 @@ static int find_and_map_user_pages(struct qaic_device *qdev,
435448

436449
ret = sg_alloc_table_from_pages(sgt, page_list, nr_pages,
437450
offset_in_page(xfer_start_addr),
438-
in_trans->size - resources->xferred_dma_size, GFP_KERNEL);
451+
remaining, GFP_KERNEL);
439452
if (ret) {
440453
ret = -ENOMEM;
441454
goto free_sgt;
@@ -566,9 +579,6 @@ static int encode_dma(struct qaic_device *qdev, void *trans, struct wrapper_list
566579
QAIC_MANAGE_EXT_MSG_LENGTH)
567580
return -ENOMEM;
568581

569-
if (in_trans->addr + in_trans->size < in_trans->addr || !in_trans->size)
570-
return -EINVAL;
571-
572582
xfer = kmalloc(sizeof(*xfer), GFP_KERNEL);
573583
if (!xfer)
574584
return -ENOMEM;

drivers/accel/qaic/qaic_data.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,7 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
10211021
bo->dbc = dbc;
10221022
srcu_read_unlock(&dbc->ch_lock, rcu_id);
10231023
drm_gem_object_put(obj);
1024+
kfree(slice_ent);
10241025
srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
10251026
srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);
10261027

drivers/gpu/drm/drm_edid.c

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3456,6 +3456,10 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connecto
34563456
connector->base.id, connector->name);
34573457
return NULL;
34583458
}
3459+
if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) {
3460+
drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Composite sync not supported\n",
3461+
connector->base.id, connector->name);
3462+
}
34593463

34603464
/* it is incorrect if hsync/vsync width is zero */
34613465
if (!hsync_pulse_width || !vsync_pulse_width) {
@@ -3502,27 +3506,10 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connecto
35023506
if (info->quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
35033507
mode->flags |= DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC;
35043508
} else {
3505-
switch (pt->misc & DRM_EDID_PT_SYNC_MASK) {
3506-
case DRM_EDID_PT_ANALOG_CSYNC:
3507-
case DRM_EDID_PT_BIPOLAR_ANALOG_CSYNC:
3508-
drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Analog composite sync!\n",
3509-
connector->base.id, connector->name);
3510-
mode->flags |= DRM_MODE_FLAG_CSYNC | DRM_MODE_FLAG_NCSYNC;
3511-
break;
3512-
case DRM_EDID_PT_DIGITAL_CSYNC:
3513-
drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Digital composite sync!\n",
3514-
connector->base.id, connector->name);
3515-
mode->flags |= DRM_MODE_FLAG_CSYNC;
3516-
mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3517-
DRM_MODE_FLAG_PCSYNC : DRM_MODE_FLAG_NCSYNC;
3518-
break;
3519-
case DRM_EDID_PT_DIGITAL_SEPARATE_SYNC:
3520-
mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3521-
DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
3522-
mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
3523-
DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
3524-
break;
3525-
}
3509+
mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
3510+
DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
3511+
mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
3512+
DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
35263513
}
35273514

35283515
set_size:

drivers/gpu/drm/nouveau/nouveau_connector.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,8 +1408,7 @@ nouveau_connector_create(struct drm_device *dev,
14081408
ret = nvif_conn_ctor(&disp->disp, nv_connector->base.name, nv_connector->index,
14091409
&nv_connector->conn);
14101410
if (ret) {
1411-
kfree(nv_connector);
1412-
return ERR_PTR(ret);
1411+
goto drm_conn_err;
14131412
}
14141413

14151414
ret = nvif_conn_event_ctor(&nv_connector->conn, "kmsHotplug",
@@ -1426,8 +1425,7 @@ nouveau_connector_create(struct drm_device *dev,
14261425
if (ret) {
14271426
nvif_event_dtor(&nv_connector->hpd);
14281427
nvif_conn_dtor(&nv_connector->conn);
1429-
kfree(nv_connector);
1430-
return ERR_PTR(ret);
1428+
goto drm_conn_err;
14311429
}
14321430
}
14331431
}
@@ -1475,4 +1473,9 @@ nouveau_connector_create(struct drm_device *dev,
14751473

14761474
drm_connector_register(connector);
14771475
return connector;
1476+
1477+
drm_conn_err:
1478+
drm_connector_cleanup(connector);
1479+
kfree(nv_connector);
1480+
return ERR_PTR(ret);
14781481
}

drivers/gpu/drm/panel/panel-jdi-lt070me05000.c

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -404,38 +404,30 @@ static int jdi_panel_add(struct jdi_panel *jdi)
404404

405405
ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(jdi->supplies),
406406
jdi->supplies);
407-
if (ret < 0) {
408-
dev_err(dev, "failed to init regulator, ret=%d\n", ret);
409-
return ret;
410-
}
407+
if (ret < 0)
408+
return dev_err_probe(dev, ret,
409+
"failed to init regulator, ret=%d\n", ret);
411410

412411
jdi->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
413412
if (IS_ERR(jdi->enable_gpio)) {
414-
ret = PTR_ERR(jdi->enable_gpio);
415-
dev_err(dev, "cannot get enable-gpio %d\n", ret);
416-
return ret;
413+
return dev_err_probe(dev, PTR_ERR(jdi->enable_gpio),
414+
"cannot get enable-gpio %d\n", ret);
417415
}
418416

419417
jdi->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
420-
if (IS_ERR(jdi->reset_gpio)) {
421-
ret = PTR_ERR(jdi->reset_gpio);
422-
dev_err(dev, "cannot get reset-gpios %d\n", ret);
423-
return ret;
424-
}
418+
if (IS_ERR(jdi->reset_gpio))
419+
return dev_err_probe(dev, PTR_ERR(jdi->reset_gpio),
420+
"cannot get reset-gpios %d\n", ret);
425421

426422
jdi->dcdc_en_gpio = devm_gpiod_get(dev, "dcdc-en", GPIOD_OUT_LOW);
427-
if (IS_ERR(jdi->dcdc_en_gpio)) {
428-
ret = PTR_ERR(jdi->dcdc_en_gpio);
429-
dev_err(dev, "cannot get dcdc-en-gpio %d\n", ret);
430-
return ret;
431-
}
423+
if (IS_ERR(jdi->dcdc_en_gpio))
424+
return dev_err_probe(dev, PTR_ERR(jdi->dcdc_en_gpio),
425+
"cannot get dcdc-en-gpio %d\n", ret);
432426

433427
jdi->backlight = drm_panel_create_dsi_backlight(jdi->dsi);
434-
if (IS_ERR(jdi->backlight)) {
435-
ret = PTR_ERR(jdi->backlight);
436-
dev_err(dev, "failed to register backlight %d\n", ret);
437-
return ret;
438-
}
428+
if (IS_ERR(jdi->backlight))
429+
return dev_err_probe(dev, PTR_ERR(jdi->backlight),
430+
"failed to register backlight %d\n", ret);
439431

440432
drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
441433
DRM_MODE_CONNECTOR_DSI);

drivers/gpu/drm/panel/panel-simple.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -999,21 +999,21 @@ static const struct panel_desc auo_g104sn02 = {
999999
.connector_type = DRM_MODE_CONNECTOR_LVDS,
10001000
};
10011001

1002-
static const struct drm_display_mode auo_g121ean01_mode = {
1003-
.clock = 66700,
1004-
.hdisplay = 1280,
1005-
.hsync_start = 1280 + 58,
1006-
.hsync_end = 1280 + 58 + 8,
1007-
.htotal = 1280 + 58 + 8 + 70,
1008-
.vdisplay = 800,
1009-
.vsync_start = 800 + 6,
1010-
.vsync_end = 800 + 6 + 4,
1011-
.vtotal = 800 + 6 + 4 + 10,
1002+
static const struct display_timing auo_g121ean01_timing = {
1003+
.pixelclock = { 60000000, 74400000, 90000000 },
1004+
.hactive = { 1280, 1280, 1280 },
1005+
.hfront_porch = { 20, 50, 100 },
1006+
.hback_porch = { 20, 50, 100 },
1007+
.hsync_len = { 30, 100, 200 },
1008+
.vactive = { 800, 800, 800 },
1009+
.vfront_porch = { 2, 10, 25 },
1010+
.vback_porch = { 2, 10, 25 },
1011+
.vsync_len = { 4, 18, 50 },
10121012
};
10131013

10141014
static const struct panel_desc auo_g121ean01 = {
1015-
.modes = &auo_g121ean01_mode,
1016-
.num_modes = 1,
1015+
.timings = &auo_g121ean01_timing,
1016+
.num_timings = 1,
10171017
.bpc = 8,
10181018
.size = {
10191019
.width = 261,

include/drm/drm_edid.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,9 @@ struct std_timing {
6161
u8 vfreq_aspect;
6262
} __attribute__((packed));
6363

64-
#define DRM_EDID_PT_SYNC_MASK (3 << 3)
65-
# define DRM_EDID_PT_ANALOG_CSYNC (0 << 3)
66-
# define DRM_EDID_PT_BIPOLAR_ANALOG_CSYNC (1 << 3)
67-
# define DRM_EDID_PT_DIGITAL_CSYNC (2 << 3)
68-
# define DRM_EDID_PT_CSYNC_ON_RGB (1 << 1) /* analog csync only */
69-
# define DRM_EDID_PT_CSYNC_SERRATE (1 << 2)
70-
# define DRM_EDID_PT_DIGITAL_SEPARATE_SYNC (3 << 3)
71-
# define DRM_EDID_PT_HSYNC_POSITIVE (1 << 1) /* also digital csync */
72-
# define DRM_EDID_PT_VSYNC_POSITIVE (1 << 2)
64+
#define DRM_EDID_PT_HSYNC_POSITIVE (1 << 1)
65+
#define DRM_EDID_PT_VSYNC_POSITIVE (1 << 2)
66+
#define DRM_EDID_PT_SEPARATE_SYNC (3 << 3)
7367
#define DRM_EDID_PT_STEREO (1 << 5)
7468
#define DRM_EDID_PT_INTERLACED (1 << 7)
7569

0 commit comments

Comments
 (0)