Commit be48306f authored by Dave Airlie's avatar Dave Airlie
Browse files

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: default avatarDave Airlie <airlied@redhat.com>

From: Maxime Ripard <mripard@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/3olqt33em5uhxzjbqghwcwnvmw73h7bxkbdxookmnkecymd4vc@7ogm6gewpprq
parents dd64d8ae 50b6f2c8
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -392,18 +392,31 @@ static int find_and_map_user_pages(struct qaic_device *qdev,
				   struct qaic_manage_trans_dma_xfer *in_trans,
				   struct ioctl_resources *resources, struct dma_xfer *xfer)
{
	u64 xfer_start_addr, remaining, end, total;
	unsigned long need_pages;
	struct page **page_list;
	unsigned long nr_pages;
	struct sg_table *sgt;
	u64 xfer_start_addr;
	int ret;
	int i;

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

	if (in_trans->size < resources->xferred_dma_size)
		return -EINVAL;
	remaining = in_trans->size - resources->xferred_dma_size;
	if (remaining == 0)
		return 0;

	if (check_add_overflow(xfer_start_addr, remaining, &end))
		return -EINVAL;

	total = remaining + offset_in_page(xfer_start_addr);
	if (total >= SIZE_MAX)
		return -EINVAL;

	need_pages = DIV_ROUND_UP(in_trans->size + offset_in_page(xfer_start_addr) -
				  resources->xferred_dma_size, PAGE_SIZE);
	need_pages = DIV_ROUND_UP(total, PAGE_SIZE);

	nr_pages = need_pages;

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

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

	if (in_trans->addr + in_trans->size < in_trans->addr || !in_trans->size)
		return -EINVAL;

	xfer = kmalloc(sizeof(*xfer), GFP_KERNEL);
	if (!xfer)
		return -ENOMEM;
+1 −0
Original line number Diff line number Diff line
@@ -1021,6 +1021,7 @@ int qaic_attach_slice_bo_ioctl(struct drm_device *dev, void *data, struct drm_fi
	bo->dbc = dbc;
	srcu_read_unlock(&dbc->ch_lock, rcu_id);
	drm_gem_object_put(obj);
	kfree(slice_ent);
	srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id);
	srcu_read_unlock(&usr->qddev_lock, usr_rcu_id);

+8 −21
Original line number Diff line number Diff line
@@ -3456,6 +3456,10 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connecto
			    connector->base.id, connector->name);
		return NULL;
	}
	if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) {
		drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Composite sync not supported\n",
			    connector->base.id, connector->name);
	}

	/* it is incorrect if hsync/vsync width is zero */
	if (!hsync_pulse_width || !vsync_pulse_width) {
@@ -3502,27 +3506,10 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connecto
	if (info->quirks & EDID_QUIRK_DETAILED_SYNC_PP) {
		mode->flags |= DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC;
	} else {
		switch (pt->misc & DRM_EDID_PT_SYNC_MASK) {
		case DRM_EDID_PT_ANALOG_CSYNC:
		case DRM_EDID_PT_BIPOLAR_ANALOG_CSYNC:
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Analog composite sync!\n",
				    connector->base.id, connector->name);
			mode->flags |= DRM_MODE_FLAG_CSYNC | DRM_MODE_FLAG_NCSYNC;
			break;
		case DRM_EDID_PT_DIGITAL_CSYNC:
			drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Digital composite sync!\n",
				    connector->base.id, connector->name);
			mode->flags |= DRM_MODE_FLAG_CSYNC;
			mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
				DRM_MODE_FLAG_PCSYNC : DRM_MODE_FLAG_NCSYNC;
			break;
		case DRM_EDID_PT_DIGITAL_SEPARATE_SYNC:
		mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ?
			DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
		mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ?
			DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
			break;
		}
	}

set_size:
+7 −4
Original line number Diff line number Diff line
@@ -1408,8 +1408,7 @@ nouveau_connector_create(struct drm_device *dev,
		ret = nvif_conn_ctor(&disp->disp, nv_connector->base.name, nv_connector->index,
				     &nv_connector->conn);
		if (ret) {
			kfree(nv_connector);
			return ERR_PTR(ret);
			goto drm_conn_err;
		}

		ret = nvif_conn_event_ctor(&nv_connector->conn, "kmsHotplug",
@@ -1426,8 +1425,7 @@ nouveau_connector_create(struct drm_device *dev,
			if (ret) {
				nvif_event_dtor(&nv_connector->hpd);
				nvif_conn_dtor(&nv_connector->conn);
				kfree(nv_connector);
				return ERR_PTR(ret);
				goto drm_conn_err;
			}
		}
	}
@@ -1475,4 +1473,9 @@ nouveau_connector_create(struct drm_device *dev,

	drm_connector_register(connector);
	return connector;

drm_conn_err:
	drm_connector_cleanup(connector);
	kfree(nv_connector);
	return ERR_PTR(ret);
}
+14 −22
Original line number Diff line number Diff line
@@ -404,38 +404,30 @@ static int jdi_panel_add(struct jdi_panel *jdi)

	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(jdi->supplies),
				      jdi->supplies);
	if (ret < 0) {
		dev_err(dev, "failed to init regulator, ret=%d\n", ret);
		return ret;
	}
	if (ret < 0)
		return dev_err_probe(dev, ret,
				     "failed to init regulator, ret=%d\n", ret);

	jdi->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
	if (IS_ERR(jdi->enable_gpio)) {
		ret = PTR_ERR(jdi->enable_gpio);
		dev_err(dev, "cannot get enable-gpio %d\n", ret);
		return ret;
		return dev_err_probe(dev, PTR_ERR(jdi->enable_gpio),
				     "cannot get enable-gpio %d\n", ret);
	}

	jdi->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
	if (IS_ERR(jdi->reset_gpio)) {
		ret = PTR_ERR(jdi->reset_gpio);
		dev_err(dev, "cannot get reset-gpios %d\n", ret);
		return ret;
	}
	if (IS_ERR(jdi->reset_gpio))
		return dev_err_probe(dev, PTR_ERR(jdi->reset_gpio),
				     "cannot get reset-gpios %d\n", ret);

	jdi->dcdc_en_gpio = devm_gpiod_get(dev, "dcdc-en", GPIOD_OUT_LOW);
	if (IS_ERR(jdi->dcdc_en_gpio)) {
		ret = PTR_ERR(jdi->dcdc_en_gpio);
		dev_err(dev, "cannot get dcdc-en-gpio %d\n", ret);
		return ret;
	}
	if (IS_ERR(jdi->dcdc_en_gpio))
		return dev_err_probe(dev, PTR_ERR(jdi->dcdc_en_gpio),
				     "cannot get dcdc-en-gpio %d\n", ret);

	jdi->backlight = drm_panel_create_dsi_backlight(jdi->dsi);
	if (IS_ERR(jdi->backlight)) {
		ret = PTR_ERR(jdi->backlight);
		dev_err(dev, "failed to register backlight %d\n", ret);
		return ret;
	}
	if (IS_ERR(jdi->backlight))
		return dev_err_probe(dev, PTR_ERR(jdi->backlight),
				     "failed to register backlight %d\n", ret);

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