lkml.org 
[lkml]   [2020]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 45/89] drm/vc4: crtc: Deal with different number of pixel per clock
    Date
    Some of the HDMI pixelvalves in vc5 output two pixels per clock cycle.
    Let's put the number of pixel output per clock cycle in the CRTC data and
    update the various calculations to reflect that.

    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    ---
    drivers/gpu/drm/vc4/vc4_crtc.c | 17 ++++++++++-------
    drivers/gpu/drm/vc4/vc4_drv.h | 3 +++
    2 files changed, 13 insertions(+), 7 deletions(-)

    diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
    index 0f8446e4a397..236a14190ebd 100644
    --- a/drivers/gpu/drm/vc4/vc4_crtc.c
    +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
    @@ -281,6 +281,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc)
    bool is_dsi = (vc4_encoder->type == VC4_ENCODER_TYPE_DSI0 ||
    vc4_encoder->type == VC4_ENCODER_TYPE_DSI1);
    u32 format = is_dsi ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24;
    + u8 ppc = vc4_crtc->data->pixels_per_clock;

    /* Reset the PV fifo. */
    CRTC_WRITE(PV_CONTROL, 0);
    @@ -288,17 +289,16 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc)
    CRTC_WRITE(PV_CONTROL, 0);

    CRTC_WRITE(PV_HORZA,
    - VC4_SET_FIELD((mode->htotal -
    - mode->hsync_end) * pixel_rep,
    + VC4_SET_FIELD((mode->htotal - mode->hsync_end) * pixel_rep / ppc,
    PV_HORZA_HBP) |
    - VC4_SET_FIELD((mode->hsync_end -
    - mode->hsync_start) * pixel_rep,
    + VC4_SET_FIELD((mode->hsync_end - mode->hsync_start) * pixel_rep / ppc,
    PV_HORZA_HSYNC));
    +
    CRTC_WRITE(PV_HORZB,
    - VC4_SET_FIELD((mode->hsync_start -
    - mode->hdisplay) * pixel_rep,
    + VC4_SET_FIELD((mode->hsync_start - mode->hdisplay) * pixel_rep / ppc,
    PV_HORZB_HFP) |
    - VC4_SET_FIELD(mode->hdisplay * pixel_rep, PV_HORZB_HACTIVE));
    + VC4_SET_FIELD(mode->hdisplay * pixel_rep / ppc,
    + PV_HORZB_HACTIVE));

    CRTC_WRITE(PV_VERTA,
    VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
    @@ -1037,6 +1037,7 @@ static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
    static const struct vc4_crtc_data bcm2835_pv0_data = {
    .hvs_channel = 0,
    .debugfs_name = "crtc0_regs",
    + .pixels_per_clock = 1,
    .encoder_types = {
    [PV_CONTROL_CLK_SELECT_DSI] = VC4_ENCODER_TYPE_DSI0,
    [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_DPI,
    @@ -1046,6 +1047,7 @@ static const struct vc4_crtc_data bcm2835_pv0_data = {
    static const struct vc4_crtc_data bcm2835_pv1_data = {
    .hvs_channel = 2,
    .debugfs_name = "crtc1_regs",
    + .pixels_per_clock = 1,
    .encoder_types = {
    [PV_CONTROL_CLK_SELECT_DSI] = VC4_ENCODER_TYPE_DSI1,
    [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_SMI,
    @@ -1055,6 +1057,7 @@ static const struct vc4_crtc_data bcm2835_pv1_data = {
    static const struct vc4_crtc_data bcm2835_pv2_data = {
    .hvs_channel = 1,
    .debugfs_name = "crtc2_regs",
    + .pixels_per_clock = 1,
    .encoder_types = {
    [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_HDMI,
    [PV_CONTROL_CLK_SELECT_VEC] = VC4_ENCODER_TYPE_VEC,
    diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
    index 0aa3a9e64ea0..0bf14c1dfe39 100644
    --- a/drivers/gpu/drm/vc4/vc4_drv.h
    +++ b/drivers/gpu/drm/vc4/vc4_drv.h
    @@ -451,6 +451,9 @@ struct vc4_crtc_data {
    /* Which channel of the HVS this pixelvalve sources from. */
    int hvs_channel;

    + /* Number of pixels output per clock period */
    + u8 pixels_per_clock;
    +
    enum vc4_encoder_type encoder_types[4];
    const char *debugfs_name;
    };
    --
    git-series 0.9.1
    \
     
     \ /
      Last update: 2020-02-24 10:40    [W:2.146 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site