Commit c941ffc3 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2022-11-02-1' of...

Merge tag 'drm-misc-fixes-2022-11-02-1' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

drm-misc-fixes for v6.1-rc4:
- Small fixes to make rockchip work better.
- Fix imx Kconfig.
- Small fix to imx' mode_valid.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/5476ef52-f91a-c2bc-f4b2-d338216d1e11@linux.intel.com
parents 30a0b95b fc007fb8
...@@ -807,6 +807,38 @@ static bool is_listed_fourcc(const uint32_t *fourccs, size_t nfourccs, uint32_t ...@@ -807,6 +807,38 @@ static bool is_listed_fourcc(const uint32_t *fourccs, size_t nfourccs, uint32_t
return false; return false;
} }
static const uint32_t conv_from_xrgb8888[] = {
DRM_FORMAT_XRGB8888,
DRM_FORMAT_ARGB8888,
DRM_FORMAT_XRGB2101010,
DRM_FORMAT_ARGB2101010,
DRM_FORMAT_RGB565,
DRM_FORMAT_RGB888,
};
static const uint32_t conv_from_rgb565_888[] = {
DRM_FORMAT_XRGB8888,
DRM_FORMAT_ARGB8888,
};
static bool is_conversion_supported(uint32_t from, uint32_t to)
{
switch (from) {
case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_ARGB8888:
return is_listed_fourcc(conv_from_xrgb8888, ARRAY_SIZE(conv_from_xrgb8888), to);
case DRM_FORMAT_RGB565:
case DRM_FORMAT_RGB888:
return is_listed_fourcc(conv_from_rgb565_888, ARRAY_SIZE(conv_from_rgb565_888), to);
case DRM_FORMAT_XRGB2101010:
return to == DRM_FORMAT_ARGB2101010;
case DRM_FORMAT_ARGB2101010:
return to == DRM_FORMAT_XRGB2101010;
default:
return false;
}
}
/** /**
* drm_fb_build_fourcc_list - Filters a list of supported color formats against * drm_fb_build_fourcc_list - Filters a list of supported color formats against
* the device's native formats * the device's native formats
...@@ -827,7 +859,9 @@ static bool is_listed_fourcc(const uint32_t *fourccs, size_t nfourccs, uint32_t ...@@ -827,7 +859,9 @@ static bool is_listed_fourcc(const uint32_t *fourccs, size_t nfourccs, uint32_t
* be handed over to drm_universal_plane_init() et al. Native formats * be handed over to drm_universal_plane_init() et al. Native formats
* will go before emulated formats. Other heuristics might be applied * will go before emulated formats. Other heuristics might be applied
* to optimize the order. Formats near the beginning of the list are * to optimize the order. Formats near the beginning of the list are
* usually preferred over formats near the end of the list. * usually preferred over formats near the end of the list. Formats
* without conversion helpers will be skipped. New drivers should only
* pass in XRGB8888 and avoid exposing additional emulated formats.
* *
* Returns: * Returns:
* The number of color-formats 4CC codes returned in @fourccs_out. * The number of color-formats 4CC codes returned in @fourccs_out.
...@@ -839,7 +873,7 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev, ...@@ -839,7 +873,7 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev,
{ {
u32 *fourccs = fourccs_out; u32 *fourccs = fourccs_out;
const u32 *fourccs_end = fourccs_out + nfourccs_out; const u32 *fourccs_end = fourccs_out + nfourccs_out;
bool found_native = false; uint32_t native_format = 0;
size_t i; size_t i;
/* /*
...@@ -858,26 +892,18 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev, ...@@ -858,26 +892,18 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev,
drm_dbg_kms(dev, "adding native format %p4cc\n", &fourcc); drm_dbg_kms(dev, "adding native format %p4cc\n", &fourcc);
if (!found_native) /*
found_native = is_listed_fourcc(driver_fourccs, driver_nfourccs, fourcc); * There should only be one native format with the current API.
* This API needs to be refactored to correctly support arbitrary
* sets of native formats, since it needs to report which native
* format to use for each emulated format.
*/
if (!native_format)
native_format = fourcc;
*fourccs = fourcc; *fourccs = fourcc;
++fourccs; ++fourccs;
} }
/*
* The plane's atomic_update helper converts the framebuffer's color format
* to a native format when copying to device memory.
*
* If there is not a single format supported by both, device and
* driver, the native formats are likely not supported by the conversion
* helpers. Therefore *only* support the native formats and add a
* conversion helper ASAP.
*/
if (!found_native) {
drm_warn(dev, "Format conversion helpers required to add extra formats.\n");
goto out;
}
/* /*
* The extra formats, emulated by the driver, go second. * The extra formats, emulated by the driver, go second.
*/ */
...@@ -890,6 +916,9 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev, ...@@ -890,6 +916,9 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev,
} else if (fourccs == fourccs_end) { } else if (fourccs == fourccs_end) {
drm_warn(dev, "Ignoring emulated format %p4cc\n", &fourcc); drm_warn(dev, "Ignoring emulated format %p4cc\n", &fourcc);
continue; /* end of available output buffer */ continue; /* end of available output buffer */
} else if (!is_conversion_supported(fourcc, native_format)) {
drm_dbg_kms(dev, "Unsupported emulated format %p4cc\n", &fourcc);
continue; /* format is not supported for conversion */
} }
drm_dbg_kms(dev, "adding emulated format %p4cc\n", &fourcc); drm_dbg_kms(dev, "adding emulated format %p4cc\n", &fourcc);
...@@ -898,7 +927,6 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev, ...@@ -898,7 +927,6 @@ size_t drm_fb_build_fourcc_list(struct drm_device *dev,
++fourccs; ++fourccs;
} }
out:
return fourccs - fourccs_out; return fourccs - fourccs_out;
} }
EXPORT_SYMBOL(drm_fb_build_fourcc_list); EXPORT_SYMBOL(drm_fb_build_fourcc_list);
...@@ -4,7 +4,6 @@ config DRM_IMX ...@@ -4,7 +4,6 @@ config DRM_IMX
select DRM_KMS_HELPER select DRM_KMS_HELPER
select VIDEOMODE_HELPERS select VIDEOMODE_HELPERS
select DRM_GEM_DMA_HELPER select DRM_GEM_DMA_HELPER
select DRM_KMS_HELPER
depends on DRM && (ARCH_MXC || ARCH_MULTIPLATFORM || COMPILE_TEST) depends on DRM && (ARCH_MXC || ARCH_MULTIPLATFORM || COMPILE_TEST)
depends on IMX_IPUV3_CORE depends on IMX_IPUV3_CORE
help help
......
...@@ -218,8 +218,9 @@ static int imx_tve_connector_get_modes(struct drm_connector *connector) ...@@ -218,8 +218,9 @@ static int imx_tve_connector_get_modes(struct drm_connector *connector)
return ret; return ret;
} }
static int imx_tve_connector_mode_valid(struct drm_connector *connector, static enum drm_mode_status
struct drm_display_mode *mode) imx_tve_connector_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode)
{ {
struct imx_tve *tve = con_to_tve(connector); struct imx_tve *tve = con_to_tve(connector);
unsigned long rate; unsigned long rate;
......
...@@ -752,7 +752,7 @@ static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi) ...@@ -752,7 +752,7 @@ static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)
static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi, static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,
int mux) int mux)
{ {
if (dsi->cdata->lcdsel_grf_reg < 0) if (dsi->cdata->lcdsel_grf_reg)
regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg, regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big); mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
} }
...@@ -1051,23 +1051,31 @@ static int dw_mipi_dsi_rockchip_host_attach(void *priv_data, ...@@ -1051,23 +1051,31 @@ static int dw_mipi_dsi_rockchip_host_attach(void *priv_data,
if (ret) { if (ret) {
DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n", DRM_DEV_ERROR(dsi->dev, "Failed to register component: %d\n",
ret); ret);
return ret; goto out;
} }
second = dw_mipi_dsi_rockchip_find_second(dsi); second = dw_mipi_dsi_rockchip_find_second(dsi);
if (IS_ERR(second)) if (IS_ERR(second)) {
return PTR_ERR(second); ret = PTR_ERR(second);
goto out;
}
if (second) { if (second) {
ret = component_add(second, &dw_mipi_dsi_rockchip_ops); ret = component_add(second, &dw_mipi_dsi_rockchip_ops);
if (ret) { if (ret) {
DRM_DEV_ERROR(second, DRM_DEV_ERROR(second,
"Failed to register component: %d\n", "Failed to register component: %d\n",
ret); ret);
return ret; goto out;
} }
} }
return 0; return 0;
out:
mutex_lock(&dsi->usage_mutex);
dsi->usage_mode = DW_DSI_USAGE_IDLE;
mutex_unlock(&dsi->usage_mutex);
return ret;
} }
static int dw_mipi_dsi_rockchip_host_detach(void *priv_data, static int dw_mipi_dsi_rockchip_host_detach(void *priv_data,
...@@ -1635,7 +1643,6 @@ static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = { ...@@ -1635,7 +1643,6 @@ static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = { static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = {
{ {
.reg = 0xfe060000, .reg = 0xfe060000,
.lcdsel_grf_reg = -1,
.lanecfg1_grf_reg = RK3568_GRF_VO_CON2, .lanecfg1_grf_reg = RK3568_GRF_VO_CON2,
.lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI0_SKEWCALHS | .lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI0_SKEWCALHS |
RK3568_DSI0_FORCETXSTOPMODE | RK3568_DSI0_FORCETXSTOPMODE |
...@@ -1645,7 +1652,6 @@ static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = { ...@@ -1645,7 +1652,6 @@ static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = {
}, },
{ {
.reg = 0xfe070000, .reg = 0xfe070000,
.lcdsel_grf_reg = -1,
.lanecfg1_grf_reg = RK3568_GRF_VO_CON3, .lanecfg1_grf_reg = RK3568_GRF_VO_CON3,
.lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI1_SKEWCALHS | .lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI1_SKEWCALHS |
RK3568_DSI1_FORCETXSTOPMODE | RK3568_DSI1_FORCETXSTOPMODE |
...@@ -1681,5 +1687,11 @@ struct platform_driver dw_mipi_dsi_rockchip_driver = { ...@@ -1681,5 +1687,11 @@ struct platform_driver dw_mipi_dsi_rockchip_driver = {
.of_match_table = dw_mipi_dsi_rockchip_dt_ids, .of_match_table = dw_mipi_dsi_rockchip_dt_ids,
.pm = &dw_mipi_dsi_rockchip_pm_ops, .pm = &dw_mipi_dsi_rockchip_pm_ops,
.name = "dw-mipi-dsi-rockchip", .name = "dw-mipi-dsi-rockchip",
/*
* For dual-DSI display, one DSI pokes at the other DSI's
* drvdata in dw_mipi_dsi_rockchip_find_second(). This is not
* safe for asynchronous probe.
*/
.probe_type = PROBE_FORCE_SYNCHRONOUS,
}, },
}; };
...@@ -565,7 +565,8 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, ...@@ -565,7 +565,8 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
ret = rockchip_hdmi_parse_dt(hdmi); ret = rockchip_hdmi_parse_dt(hdmi);
if (ret) { if (ret) {
DRM_DEV_ERROR(hdmi->dev, "Unable to parse OF data\n"); if (ret != -EPROBE_DEFER)
DRM_DEV_ERROR(hdmi->dev, "Unable to parse OF data\n");
return ret; return ret;
} }
......
...@@ -364,9 +364,12 @@ rockchip_gem_create_with_handle(struct drm_file *file_priv, ...@@ -364,9 +364,12 @@ rockchip_gem_create_with_handle(struct drm_file *file_priv,
{ {
struct rockchip_gem_object *rk_obj; struct rockchip_gem_object *rk_obj;
struct drm_gem_object *obj; struct drm_gem_object *obj;
bool is_framebuffer;
int ret; int ret;
rk_obj = rockchip_gem_create_object(drm, size, false); is_framebuffer = drm->fb_helper && file_priv == drm->fb_helper->client.file;
rk_obj = rockchip_gem_create_object(drm, size, is_framebuffer);
if (IS_ERR(rk_obj)) if (IS_ERR(rk_obj))
return ERR_CAST(rk_obj); return ERR_CAST(rk_obj);
......
...@@ -877,10 +877,14 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc, ...@@ -877,10 +877,14 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,
{ {
struct vop2_video_port *vp = to_vop2_video_port(crtc); struct vop2_video_port *vp = to_vop2_video_port(crtc);
struct vop2 *vop2 = vp->vop2; struct vop2 *vop2 = vp->vop2;
struct drm_crtc_state *old_crtc_state;
int ret; int ret;
vop2_lock(vop2); vop2_lock(vop2);
old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);
drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, false);
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
/* /*
...@@ -996,13 +1000,15 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, ...@@ -996,13 +1000,15 @@ static int vop2_plane_atomic_check(struct drm_plane *plane,
static void vop2_plane_atomic_disable(struct drm_plane *plane, static void vop2_plane_atomic_disable(struct drm_plane *plane,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
struct drm_plane_state *old_pstate = drm_atomic_get_old_plane_state(state, plane); struct drm_plane_state *old_pstate = NULL;
struct vop2_win *win = to_vop2_win(plane); struct vop2_win *win = to_vop2_win(plane);
struct vop2 *vop2 = win->vop2; struct vop2 *vop2 = win->vop2;
drm_dbg(vop2->drm, "%s disable\n", win->data->name); drm_dbg(vop2->drm, "%s disable\n", win->data->name);
if (!old_pstate->crtc) if (state)
old_pstate = drm_atomic_get_old_plane_state(state, plane);
if (old_pstate && !old_pstate->crtc)
return; return;
vop2_win_disable(win); vop2_win_disable(win);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment