diff options
author | Chandrabhanu Mahapatra <cmahapatra@ti.com> | 2012-09-24 02:38:27 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-09-25 09:41:11 -0400 |
commit | d557a9cf2f4f9286759cdd1937ce98641fa35583 (patch) | |
tree | 886415e0895ceb77e98af168bf905393f83fc03b /drivers/video | |
parent | 406f7b8baa8f92d88dac448a9dc0dbeb3e330874 (diff) |
OMAPDSS: DISPC: Add predecimation limit for TILER based rotations
In OMAP4 and OMAP5 when TILER 2D burst mode is used, a maximum of one line can
be skipped as per the respective TRMs. The MBlockStride OCP signal, which is
sum of ROWINC and image width in memory, is only 17 bits wide. In 2D mode TILER
supports 8192, 16384, 32768 and 65536 values of MBlockStride. In case when 2 or
more lines are skipped the ROWINC value exceeds 65536 resulting in OCP errors.
So, maximum vertical predecimation achievable is 2.
Signed-off-by: Chandrabhanu Mahapatra <cmahapatra@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/omap2/dss/dispc.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index e52c57789383..2137d2a2cc5d 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c | |||
@@ -2195,7 +2195,8 @@ static int dispc_ovl_calc_scaling(enum omap_plane plane, | |||
2195 | const struct omap_video_timings *mgr_timings, | 2195 | const struct omap_video_timings *mgr_timings, |
2196 | u16 width, u16 height, u16 out_width, u16 out_height, | 2196 | u16 width, u16 height, u16 out_width, u16 out_height, |
2197 | enum omap_color_mode color_mode, bool *five_taps, | 2197 | enum omap_color_mode color_mode, bool *five_taps, |
2198 | int *x_predecim, int *y_predecim, u16 pos_x) | 2198 | int *x_predecim, int *y_predecim, u16 pos_x, |
2199 | enum omap_dss_rotation_type rotation_type) | ||
2199 | { | 2200 | { |
2200 | struct omap_overlay *ovl = omap_dss_get_overlay(plane); | 2201 | struct omap_overlay *ovl = omap_dss_get_overlay(plane); |
2201 | const int maxdownscale = dss_feat_get_param_max(FEAT_PARAM_DOWNSCALE); | 2202 | const int maxdownscale = dss_feat_get_param_max(FEAT_PARAM_DOWNSCALE); |
@@ -2210,7 +2211,8 @@ static int dispc_ovl_calc_scaling(enum omap_plane plane, | |||
2210 | return -EINVAL; | 2211 | return -EINVAL; |
2211 | 2212 | ||
2212 | *x_predecim = max_decim_limit; | 2213 | *x_predecim = max_decim_limit; |
2213 | *y_predecim = max_decim_limit; | 2214 | *y_predecim = (rotation_type == OMAP_DSS_ROT_TILER && |
2215 | dss_has_feature(FEAT_BURST_2D)) ? 2 : max_decim_limit; | ||
2214 | 2216 | ||
2215 | if (color_mode == OMAP_DSS_COLOR_CLUT1 || | 2217 | if (color_mode == OMAP_DSS_COLOR_CLUT1 || |
2216 | color_mode == OMAP_DSS_COLOR_CLUT2 || | 2218 | color_mode == OMAP_DSS_COLOR_CLUT2 || |
@@ -2306,7 +2308,8 @@ int dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi, | |||
2306 | 2308 | ||
2307 | r = dispc_ovl_calc_scaling(plane, channel, mgr_timings, in_width, | 2309 | r = dispc_ovl_calc_scaling(plane, channel, mgr_timings, in_width, |
2308 | in_height, out_width, out_height, oi->color_mode, | 2310 | in_height, out_width, out_height, oi->color_mode, |
2309 | &five_taps, &x_predecim, &y_predecim, oi->pos_x); | 2311 | &five_taps, &x_predecim, &y_predecim, oi->pos_x, |
2312 | oi->rotation_type); | ||
2310 | if (r) | 2313 | if (r) |
2311 | return r; | 2314 | return r; |
2312 | 2315 | ||