Commit aa102d28 authored by Gaurav K Singh's avatar Gaurav K Singh Committed by Daniel Vetter

drm/i915: MIPI Timings related changes for dual link

hactive, hfp, hbp, hsync needs to be halved for dual link MIPI Panels.
Accordingly timing related mmio regs needs to be programmed for both MIPI Ports.

v2: Address review comments by Jani
    - Used a for loop instead of do-while loop

v3: Used for_each_dsi_port macro instead of for loop
Signed-off-by: default avatarGaurav K Singh <gaurav.k.singh@intel.com>
Signed-off-by: default avatarShobhit Kumar <shobhit.kumar@intel.com>
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 3770f0ee
...@@ -479,7 +479,7 @@ static void set_dsi_timings(struct drm_encoder *encoder, ...@@ -479,7 +479,7 @@ static void set_dsi_timings(struct drm_encoder *encoder,
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
enum port port = intel_dsi_pipe_to_port(intel_crtc->pipe); enum port port;
unsigned int bpp = intel_crtc->config.pipe_bpp; unsigned int bpp = intel_crtc->config.pipe_bpp;
unsigned int lane_count = intel_dsi->lane_count; unsigned int lane_count = intel_dsi->lane_count;
...@@ -490,6 +490,15 @@ static void set_dsi_timings(struct drm_encoder *encoder, ...@@ -490,6 +490,15 @@ static void set_dsi_timings(struct drm_encoder *encoder,
hsync = mode->hsync_end - mode->hsync_start; hsync = mode->hsync_end - mode->hsync_start;
hbp = mode->htotal - mode->hsync_end; hbp = mode->htotal - mode->hsync_end;
if (intel_dsi->dual_link) {
hactive /= 2;
if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK)
hactive += intel_dsi->pixel_overlap;
hfp /= 2;
hsync /= 2;
hbp /= 2;
}
vfp = mode->vsync_start - mode->vdisplay; vfp = mode->vsync_start - mode->vdisplay;
vsync = mode->vsync_end - mode->vsync_start; vsync = mode->vsync_end - mode->vsync_start;
vbp = mode->vtotal - mode->vsync_end; vbp = mode->vtotal - mode->vsync_end;
...@@ -502,18 +511,20 @@ static void set_dsi_timings(struct drm_encoder *encoder, ...@@ -502,18 +511,20 @@ static void set_dsi_timings(struct drm_encoder *encoder,
intel_dsi->burst_mode_ratio); intel_dsi->burst_mode_ratio);
hbp = txbyteclkhs(hbp, bpp, lane_count, intel_dsi->burst_mode_ratio); hbp = txbyteclkhs(hbp, bpp, lane_count, intel_dsi->burst_mode_ratio);
I915_WRITE(MIPI_HACTIVE_AREA_COUNT(port), hactive); for_each_dsi_port(port, intel_dsi->ports) {
I915_WRITE(MIPI_HFP_COUNT(port), hfp); I915_WRITE(MIPI_HACTIVE_AREA_COUNT(port), hactive);
I915_WRITE(MIPI_HFP_COUNT(port), hfp);
/* meaningful for video mode non-burst sync pulse mode only, can be zero
* for non-burst sync events and burst modes */ /* meaningful for video mode non-burst sync pulse mode only,
I915_WRITE(MIPI_HSYNC_PADDING_COUNT(port), hsync); * can be zero for non-burst sync events and burst modes */
I915_WRITE(MIPI_HBP_COUNT(port), hbp); I915_WRITE(MIPI_HSYNC_PADDING_COUNT(port), hsync);
I915_WRITE(MIPI_HBP_COUNT(port), hbp);
/* vertical values are in terms of lines */
I915_WRITE(MIPI_VFP_COUNT(port), vfp); /* vertical values are in terms of lines */
I915_WRITE(MIPI_VSYNC_PADDING_COUNT(port), vsync); I915_WRITE(MIPI_VFP_COUNT(port), vfp);
I915_WRITE(MIPI_VBP_COUNT(port), vbp); I915_WRITE(MIPI_VSYNC_PADDING_COUNT(port), vsync);
I915_WRITE(MIPI_VBP_COUNT(port), vbp);
}
} }
static void intel_dsi_prepare(struct intel_encoder *intel_encoder) static void intel_dsi_prepare(struct intel_encoder *intel_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