mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 01:51:39 +00:00
Merge tag 'drm-misc-fixes-2017-06-02' of git://anongit.freedesktop.org/git/drm-misc into drm-fixes
Core Changes: - Grab locks in drm_atomic_helper_resume() (Daniel) - Fix oops when unplugging USB device (expand cleanup in drm_unplug_dev) (Hans) Driver Changes: - rockchip: Don't output 10-bit format to 8-bit encoders (Mark) Cc: Mark yao <mark.yao@rock-chips.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Hans de Goede <hdegoede@redhat.com> * tag 'drm-misc-fixes-2017-06-02' of git://anongit.freedesktop.org/git/drm-misc: drm: Fix oops + Xserver hang when unplugging USB drm devices drm: Fix locking in drm_atomic_helper_resume drm/rockchip: Correct vop out_mode configure
This commit is contained in:
commit
e5b4ab1ffb
7 changed files with 32 additions and 20 deletions
|
@ -508,6 +508,8 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
|
||||||
bool has_connectors =
|
bool has_connectors =
|
||||||
!!new_crtc_state->connector_mask;
|
!!new_crtc_state->connector_mask;
|
||||||
|
|
||||||
|
WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
|
||||||
|
|
||||||
if (!drm_mode_equal(&old_crtc_state->mode, &new_crtc_state->mode)) {
|
if (!drm_mode_equal(&old_crtc_state->mode, &new_crtc_state->mode)) {
|
||||||
DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
|
DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
|
||||||
crtc->base.id, crtc->name);
|
crtc->base.id, crtc->name);
|
||||||
|
@ -551,6 +553,8 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
|
||||||
for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
|
for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
|
||||||
const struct drm_connector_helper_funcs *funcs = connector->helper_private;
|
const struct drm_connector_helper_funcs *funcs = connector->helper_private;
|
||||||
|
|
||||||
|
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This only sets crtc->connectors_changed for routing changes,
|
* This only sets crtc->connectors_changed for routing changes,
|
||||||
* drivers must set crtc->connectors_changed themselves when
|
* drivers must set crtc->connectors_changed themselves when
|
||||||
|
@ -650,6 +654,8 @@ drm_atomic_helper_check_planes(struct drm_device *dev,
|
||||||
for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
|
for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
|
||||||
const struct drm_plane_helper_funcs *funcs;
|
const struct drm_plane_helper_funcs *funcs;
|
||||||
|
|
||||||
|
WARN_ON(!drm_modeset_is_locked(&plane->mutex));
|
||||||
|
|
||||||
funcs = plane->helper_private;
|
funcs = plane->helper_private;
|
||||||
|
|
||||||
drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
|
drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
|
||||||
|
@ -2663,7 +2669,12 @@ int drm_atomic_helper_resume(struct drm_device *dev,
|
||||||
|
|
||||||
drm_modeset_acquire_init(&ctx, 0);
|
drm_modeset_acquire_init(&ctx, 0);
|
||||||
while (1) {
|
while (1) {
|
||||||
|
err = drm_modeset_lock_all_ctx(dev, &ctx);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
|
err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
|
||||||
|
out:
|
||||||
if (err != -EDEADLK)
|
if (err != -EDEADLK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -358,7 +358,12 @@ EXPORT_SYMBOL(drm_put_dev);
|
||||||
void drm_unplug_dev(struct drm_device *dev)
|
void drm_unplug_dev(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
/* for a USB device */
|
/* for a USB device */
|
||||||
drm_dev_unregister(dev);
|
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
|
drm_modeset_unregister_all(dev);
|
||||||
|
|
||||||
|
drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
|
||||||
|
drm_minor_unregister(dev, DRM_MINOR_RENDER);
|
||||||
|
drm_minor_unregister(dev, DRM_MINOR_CONTROL);
|
||||||
|
|
||||||
mutex_lock(&drm_global_mutex);
|
mutex_lock(&drm_global_mutex);
|
||||||
|
|
||||||
|
|
|
@ -245,8 +245,6 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
|
||||||
struct drm_connector_state *conn_state)
|
struct drm_connector_state *conn_state)
|
||||||
{
|
{
|
||||||
struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
|
struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
|
||||||
struct rockchip_dp_device *dp = to_dp(encoder);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The hardware IC designed that VOP must output the RGB10 video
|
* The hardware IC designed that VOP must output the RGB10 video
|
||||||
|
@ -258,16 +256,6 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
|
||||||
|
|
||||||
s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
|
s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
|
||||||
s->output_type = DRM_MODE_CONNECTOR_eDP;
|
s->output_type = DRM_MODE_CONNECTOR_eDP;
|
||||||
if (dp->data->chip_type == RK3399_EDP) {
|
|
||||||
/*
|
|
||||||
* For RK3399, VOP Lit must code the out mode to RGB888,
|
|
||||||
* VOP Big must code the out mode to RGB10.
|
|
||||||
*/
|
|
||||||
ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node,
|
|
||||||
encoder);
|
|
||||||
if (ret > 0)
|
|
||||||
s->output_mode = ROCKCHIP_OUT_MODE_P888;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -615,7 +615,6 @@ static void cdn_dp_encoder_enable(struct drm_encoder *encoder)
|
||||||
{
|
{
|
||||||
struct cdn_dp_device *dp = encoder_to_dp(encoder);
|
struct cdn_dp_device *dp = encoder_to_dp(encoder);
|
||||||
int ret, val;
|
int ret, val;
|
||||||
struct rockchip_crtc_state *state;
|
|
||||||
|
|
||||||
ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder);
|
ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -625,14 +624,10 @@ static void cdn_dp_encoder_enable(struct drm_encoder *encoder)
|
||||||
|
|
||||||
DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n",
|
DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n",
|
||||||
(ret) ? "LIT" : "BIG");
|
(ret) ? "LIT" : "BIG");
|
||||||
state = to_rockchip_crtc_state(encoder->crtc->state);
|
if (ret)
|
||||||
if (ret) {
|
|
||||||
val = DP_SEL_VOP_LIT | (DP_SEL_VOP_LIT << 16);
|
val = DP_SEL_VOP_LIT | (DP_SEL_VOP_LIT << 16);
|
||||||
state->output_mode = ROCKCHIP_OUT_MODE_P888;
|
else
|
||||||
} else {
|
|
||||||
val = DP_SEL_VOP_LIT << 16;
|
val = DP_SEL_VOP_LIT << 16;
|
||||||
state->output_mode = ROCKCHIP_OUT_MODE_AAAA;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val);
|
ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -875,6 +875,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||||
static void vop_crtc_enable(struct drm_crtc *crtc)
|
static void vop_crtc_enable(struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct vop *vop = to_vop(crtc);
|
struct vop *vop = to_vop(crtc);
|
||||||
|
const struct vop_data *vop_data = vop->data;
|
||||||
struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
|
struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
|
||||||
struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
|
struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
|
||||||
u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
|
u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
|
||||||
|
@ -967,6 +968,13 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
|
||||||
DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n",
|
DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n",
|
||||||
s->output_type);
|
s->output_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if vop is not support RGB10 output, need force RGB10 to RGB888.
|
||||||
|
*/
|
||||||
|
if (s->output_mode == ROCKCHIP_OUT_MODE_AAAA &&
|
||||||
|
!(vop_data->feature & VOP_FEATURE_OUTPUT_RGB10))
|
||||||
|
s->output_mode = ROCKCHIP_OUT_MODE_P888;
|
||||||
VOP_CTRL_SET(vop, out_mode, s->output_mode);
|
VOP_CTRL_SET(vop, out_mode, s->output_mode);
|
||||||
|
|
||||||
VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
|
VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
|
||||||
|
|
|
@ -142,6 +142,9 @@ struct vop_data {
|
||||||
const struct vop_intr *intr;
|
const struct vop_intr *intr;
|
||||||
const struct vop_win_data *win;
|
const struct vop_win_data *win;
|
||||||
unsigned int win_size;
|
unsigned int win_size;
|
||||||
|
|
||||||
|
#define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
|
||||||
|
u64 feature;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* interrupt define */
|
/* interrupt define */
|
||||||
|
|
|
@ -275,6 +275,7 @@ static const struct vop_intr rk3288_vop_intr = {
|
||||||
static const struct vop_data rk3288_vop = {
|
static const struct vop_data rk3288_vop = {
|
||||||
.init_table = rk3288_init_reg_table,
|
.init_table = rk3288_init_reg_table,
|
||||||
.table_size = ARRAY_SIZE(rk3288_init_reg_table),
|
.table_size = ARRAY_SIZE(rk3288_init_reg_table),
|
||||||
|
.feature = VOP_FEATURE_OUTPUT_RGB10,
|
||||||
.intr = &rk3288_vop_intr,
|
.intr = &rk3288_vop_intr,
|
||||||
.ctrl = &rk3288_ctrl_data,
|
.ctrl = &rk3288_ctrl_data,
|
||||||
.win = rk3288_vop_win_data,
|
.win = rk3288_vop_win_data,
|
||||||
|
@ -343,6 +344,7 @@ static const struct vop_reg_data rk3399_init_reg_table[] = {
|
||||||
static const struct vop_data rk3399_vop_big = {
|
static const struct vop_data rk3399_vop_big = {
|
||||||
.init_table = rk3399_init_reg_table,
|
.init_table = rk3399_init_reg_table,
|
||||||
.table_size = ARRAY_SIZE(rk3399_init_reg_table),
|
.table_size = ARRAY_SIZE(rk3399_init_reg_table),
|
||||||
|
.feature = VOP_FEATURE_OUTPUT_RGB10,
|
||||||
.intr = &rk3399_vop_intr,
|
.intr = &rk3399_vop_intr,
|
||||||
.ctrl = &rk3399_ctrl_data,
|
.ctrl = &rk3399_ctrl_data,
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue