Commit 8d914746 authored by Maxime Ripard's avatar Maxime Ripard

drm/vc4: Pass the atomic state to encoder hooks

We'll need to access the connector state in our encoder setup, so let's
just pass the whole DRM state to our private encoder hooks.
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-3-maxime@cerno.tech
parent ee6965c8
...@@ -403,7 +403,9 @@ static void require_hvs_enabled(struct drm_device *dev) ...@@ -403,7 +403,9 @@ static void require_hvs_enabled(struct drm_device *dev)
SCALER_DISPCTRL_ENABLE); SCALER_DISPCTRL_ENABLE);
} }
static int vc4_crtc_disable(struct drm_crtc *crtc, unsigned int channel) static int vc4_crtc_disable(struct drm_crtc *crtc,
struct drm_atomic_state *state,
unsigned int channel)
{ {
struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc); struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc);
struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder); struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
...@@ -435,13 +437,13 @@ static int vc4_crtc_disable(struct drm_crtc *crtc, unsigned int channel) ...@@ -435,13 +437,13 @@ static int vc4_crtc_disable(struct drm_crtc *crtc, unsigned int channel)
mdelay(20); mdelay(20);
if (vc4_encoder && vc4_encoder->post_crtc_disable) if (vc4_encoder && vc4_encoder->post_crtc_disable)
vc4_encoder->post_crtc_disable(encoder); vc4_encoder->post_crtc_disable(encoder, state);
vc4_crtc_pixelvalve_reset(crtc); vc4_crtc_pixelvalve_reset(crtc);
vc4_hvs_stop_channel(dev, channel); vc4_hvs_stop_channel(dev, channel);
if (vc4_encoder && vc4_encoder->post_crtc_powerdown) if (vc4_encoder && vc4_encoder->post_crtc_powerdown)
vc4_encoder->post_crtc_powerdown(encoder); vc4_encoder->post_crtc_powerdown(encoder, state);
return 0; return 0;
} }
...@@ -468,7 +470,7 @@ int vc4_crtc_disable_at_boot(struct drm_crtc *crtc) ...@@ -468,7 +470,7 @@ int vc4_crtc_disable_at_boot(struct drm_crtc *crtc)
if (channel < 0) if (channel < 0)
return 0; return 0;
return vc4_crtc_disable(crtc, channel); return vc4_crtc_disable(crtc, NULL, channel);
} }
static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
...@@ -484,7 +486,7 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc, ...@@ -484,7 +486,7 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
/* Disable vblank irq handling before crtc is disabled. */ /* Disable vblank irq handling before crtc is disabled. */
drm_crtc_vblank_off(crtc); drm_crtc_vblank_off(crtc);
vc4_crtc_disable(crtc, old_vc4_state->assigned_channel); vc4_crtc_disable(crtc, state, old_vc4_state->assigned_channel);
/* /*
* Make sure we issue a vblank event after disabling the CRTC if * Make sure we issue a vblank event after disabling the CRTC if
...@@ -518,14 +520,14 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc, ...@@ -518,14 +520,14 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
vc4_hvs_atomic_enable(crtc, state); vc4_hvs_atomic_enable(crtc, state);
if (vc4_encoder->pre_crtc_configure) if (vc4_encoder->pre_crtc_configure)
vc4_encoder->pre_crtc_configure(encoder); vc4_encoder->pre_crtc_configure(encoder, state);
vc4_crtc_config_pv(crtc); vc4_crtc_config_pv(crtc);
CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) | PV_CONTROL_EN); CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) | PV_CONTROL_EN);
if (vc4_encoder->pre_crtc_enable) if (vc4_encoder->pre_crtc_enable)
vc4_encoder->pre_crtc_enable(encoder); vc4_encoder->pre_crtc_enable(encoder, state);
/* When feeding the transposer block the pixelvalve is unneeded and /* When feeding the transposer block the pixelvalve is unneeded and
* should not be enabled. * should not be enabled.
...@@ -534,7 +536,7 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc, ...@@ -534,7 +536,7 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
CRTC_READ(PV_V_CONTROL) | PV_VCONTROL_VIDEN); CRTC_READ(PV_V_CONTROL) | PV_VCONTROL_VIDEN);
if (vc4_encoder->post_crtc_enable) if (vc4_encoder->post_crtc_enable)
vc4_encoder->post_crtc_enable(encoder); vc4_encoder->post_crtc_enable(encoder, state);
} }
static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc, static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc,
......
...@@ -441,12 +441,12 @@ struct vc4_encoder { ...@@ -441,12 +441,12 @@ struct vc4_encoder {
enum vc4_encoder_type type; enum vc4_encoder_type type;
u32 clock_select; u32 clock_select;
void (*pre_crtc_configure)(struct drm_encoder *encoder); void (*pre_crtc_configure)(struct drm_encoder *encoder, struct drm_atomic_state *state);
void (*pre_crtc_enable)(struct drm_encoder *encoder); void (*pre_crtc_enable)(struct drm_encoder *encoder, struct drm_atomic_state *state);
void (*post_crtc_enable)(struct drm_encoder *encoder); void (*post_crtc_enable)(struct drm_encoder *encoder, struct drm_atomic_state *state);
void (*post_crtc_disable)(struct drm_encoder *encoder); void (*post_crtc_disable)(struct drm_encoder *encoder, struct drm_atomic_state *state);
void (*post_crtc_powerdown)(struct drm_encoder *encoder); void (*post_crtc_powerdown)(struct drm_encoder *encoder, struct drm_atomic_state *state);
}; };
static inline struct vc4_encoder * static inline struct vc4_encoder *
......
...@@ -360,7 +360,8 @@ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder) ...@@ -360,7 +360,8 @@ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder)
vc4_hdmi_set_audio_infoframe(encoder); vc4_hdmi_set_audio_infoframe(encoder);
} }
static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder) static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder,
struct drm_atomic_state *state)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
...@@ -373,7 +374,8 @@ static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder) ...@@ -373,7 +374,8 @@ static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder)
HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_BLANKPIX); HDMI_READ(HDMI_VID_CTL) | VC4_HD_VID_CTL_BLANKPIX);
} }
static void vc4_hdmi_encoder_post_crtc_powerdown(struct drm_encoder *encoder) static void vc4_hdmi_encoder_post_crtc_powerdown(struct drm_encoder *encoder,
struct drm_atomic_state *state)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
int ret; int ret;
...@@ -587,7 +589,8 @@ static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi) ...@@ -587,7 +589,8 @@ static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi)
"VC4_HDMI_FIFO_CTL_RECENTER_DONE"); "VC4_HDMI_FIFO_CTL_RECENTER_DONE");
} }
static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder,
struct drm_atomic_state *state)
{ {
struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
...@@ -679,7 +682,8 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) ...@@ -679,7 +682,8 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder)
vc4_hdmi->variant->set_timings(vc4_hdmi, mode); vc4_hdmi->variant->set_timings(vc4_hdmi, mode);
} }
static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder) static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder,
struct drm_atomic_state *state)
{ {
struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
...@@ -701,7 +705,8 @@ static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder) ...@@ -701,7 +705,8 @@ static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder)
HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N); HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N);
} }
static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder) static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
struct drm_atomic_state *state)
{ {
struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
......
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