summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVishnuvardhan Prodduturi <vproddut@codeaurora.org>2014-04-14 18:24:58 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:29:07 -0700
commitb501f7f5390d25bc752932b75d1551f16bfa4459 (patch)
tree75ede3a800d2a1a5fd2a3094c1e0d416ddceb82c
parent7dd979a28fc73ec1b0baf2233ed4cbb7450c8111 (diff)
msm: mdss: Add support for MDP MISR for msm8916.
MISR register configuration has moved to individual blocks in msm8916. Address the same by properly taking care of Register offsets. Change-Id: I7cf1c1c38e85db3b2a5ab8d5cb66ae54db7ae6e0 Signed-off-by: Vishnuvardhan Prodduturi <vproddut@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_debug.c57
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_hwio.h7
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_video.c8
4 files changed, 67 insertions, 7 deletions
diff --git a/drivers/video/fbdev/msm/mdss_debug.c b/drivers/video/fbdev/msm/mdss_debug.c
index b0738f834c46..be050f3ab121 100644
--- a/drivers/video/fbdev/msm/mdss_debug.c
+++ b/drivers/video/fbdev/msm/mdss_debug.c
@@ -597,21 +597,58 @@ static struct mdss_mdp_misr_map {
},
};
-static inline struct mdss_mdp_misr_map *mdss_misr_get_map(u32 block_id)
+static inline struct mdss_mdp_misr_map *mdss_misr_get_map(u32 block_id,
+ struct mdss_mdp_ctl *ctl, struct mdss_data_type *mdata)
{
struct mdss_mdp_misr_map *map;
+ struct mdss_mdp_mixer *mixer;
+ char *ctrl_reg = NULL, *value_reg = NULL;
+ char *intf_base = NULL;
if (block_id > DISPLAY_MISR_MDP) {
pr_err("MISR Block id (%d) out of range\n", block_id);
return NULL;
}
+ if (mdata->mdp_rev >= MDSS_MDP_HW_REV_106) {
+ /* Use updated MDP Interface MISR Block address offset */
+ if (block_id == DISPLAY_MISR_MDP) {
+ if (ctl) {
+ mixer = mdss_mdp_mixer_get(ctl,
+ MDSS_MDP_MIXER_MUX_DEFAULT);
+ ctrl_reg = mdata->mixer_wb[mixer->num].base +
+ MDSS_MDP_LAYER_MIXER_MISR_CTRL;
+ value_reg = mdata->mixer_wb[mixer->num].base +
+ MDSS_MDP_LAYER_MIXER_MISR_SIGNATURE;
+ }
+ } else {
+ if (block_id <= DISPLAY_MISR_HDMI) {
+ intf_base = (char *)mdss_mdp_get_intf_base_addr(
+ mdata, block_id);
+ ctrl_reg = intf_base + MDSS_MDP_INTF_MISR_CTRL;
+ value_reg = intf_base +
+ MDSS_MDP_INTF_MISR_SIGNATURE;
+ }
+ /* For msm8916, additional offset of 0x10 is required */
+ if (mdata->mdp_rev == MDSS_MDP_HW_REV_106) {
+ ctrl_reg += 0x10;
+ value_reg += 0x10;
+ }
+ }
+ mdss_mdp_misr_table[block_id].ctrl_reg = (u32)(ctrl_reg -
+ mdata->mdp_base);
+ mdss_mdp_misr_table[block_id].value_reg = (u32)(value_reg -
+ mdata->mdp_base);
+ }
+
map = mdss_mdp_misr_table + block_id;
if ((map->ctrl_reg == 0) || (map->value_reg == 0)) {
pr_err("MISR Block id (%d) config not found\n", block_id);
return NULL;
}
+ pr_debug("MDP Module Offset of MISR_CTRL = 0x%d MISR SIG = 0x%d intf_base 0x%p\n",
+ map->ctrl_reg, map->value_reg, intf_base);
return map;
}
@@ -624,11 +661,13 @@ int mdss_misr_set(struct mdss_data_type *mdata,
u32 config = 0, val = 0;
u32 mixer_num = 0;
bool is_valid_wb_mixer = true;
- map = mdss_misr_get_map(req->block_id);
+
+ map = mdss_misr_get_map(req->block_id, ctl, mdata);
if (!map) {
pr_err("Invalid MISR Block=%d\n", req->block_id);
return -EINVAL;
}
+
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
if (req->block_id == DISPLAY_MISR_MDP) {
mixer = mdss_mdp_mixer_get(ctl, MDSS_MDP_MIXER_MUX_DEFAULT);
@@ -654,9 +693,10 @@ int mdss_misr_set(struct mdss_data_type *mdata,
is_valid_wb_mixer = false;
break;
}
- if (is_valid_wb_mixer)
- writel_relaxed(val,
- mdata->mdp_base + MDSS_MDP_LP_MISR_SEL);
+ if (is_valid_wb_mixer &&
+ (mdata->mdp_rev < MDSS_MDP_HW_REV_106))
+ writel_relaxed(val, (mdata->mdp_base +
+ MDSS_MDP_LP_MISR_SEL));
}
vsync_count = 0;
map->crc_op_mode = req->crc_op_mode;
@@ -691,15 +731,18 @@ int mdss_misr_get(struct mdss_data_type *mdata,
struct mdss_mdp_ctl *ctl)
{
struct mdss_mdp_misr_map *map;
+ struct mdss_mdp_mixer *mixer;
u32 status;
int ret = -1;
int i;
- map = mdss_misr_get_map(resp->block_id);
+ map = mdss_misr_get_map(resp->block_id, ctl, mdata);
if (!map) {
pr_err("Invalid MISR Block=%d\n", resp->block_id);
return -EINVAL;
}
+ mixer = mdss_mdp_mixer_get(ctl, MDSS_MDP_MIXER_MUX_DEFAULT);
+
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
switch (map->crc_op_mode) {
case MISR_OP_SFM:
@@ -765,7 +808,7 @@ void mdss_misr_crc_collect(struct mdss_data_type *mdata, int block_id)
u32 crc = 0x0BAD0BAD;
bool crc_stored = false;
- map = mdss_misr_get_map(block_id);
+ map = mdss_misr_get_map(block_id, NULL, mdata);
if (!map || (map->crc_op_mode != MISR_OP_BM))
return;
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index f3b880424917..a3100b9679f3 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -571,6 +571,8 @@ int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd,
int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata,
u32 *offsets, u32 count);
int mdss_mdp_video_start(struct mdss_mdp_ctl *ctl);
+void *mdss_mdp_get_intf_base_addr(struct mdss_data_type *mdata,
+ u32 interface_id);
int mdss_mdp_cmd_start(struct mdss_mdp_ctl *ctl);
int mdss_mdp_writeback_start(struct mdss_mdp_ctl *ctl);
int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
diff --git a/drivers/video/fbdev/msm/mdss_mdp_hwio.h b/drivers/video/fbdev/msm/mdss_mdp_hwio.h
index b65354d4a06f..b4e4b0870efa 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_hwio.h
+++ b/drivers/video/fbdev/msm/mdss_mdp_hwio.h
@@ -592,6 +592,13 @@ enum mdss_mdp_pingpong_index {
#define MDSS_MDP_LP_MISR_SEL_LMIX4_BLEND 0x10
#define MDSS_MDP_LP_MISR_SEL_LMIX4_GC 0x11
+#define MDSS_MDP_LAYER_MIXER_MISR_CTRL 0x380
+#define MDSS_MDP_LAYER_MIXER_MISR_SIGNATURE \
+ (MDSS_MDP_LAYER_MIXER_MISR_CTRL + 0x4)
+
+#define MDSS_MDP_INTF_MISR_CTRL 0x180
+#define MDSS_MDP_INTF_MISR_SIGNATURE (MDSS_MDP_INTF_MISR_CTRL + 0x4)
+
/* following offsets are with respect to MDP VBIF base */
#define MMSS_VBIF_XIN_HALT_CTRL0 0x200
#define MMSS_VBIF_XIN_HALT_CTRL1 0x204
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
index a76aa5cb6782..ec533ecce44f 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
@@ -849,3 +849,11 @@ int mdss_mdp_video_start(struct mdss_mdp_ctl *ctl)
return 0;
}
+
+void *mdss_mdp_get_intf_base_addr(struct mdss_data_type *mdata,
+ u32 interface_id)
+{
+ struct mdss_mdp_video_ctx *ctx;
+ ctx = ((struct mdss_mdp_video_ctx *) mdata->video_intf) + interface_id;
+ return (void *)(ctx->base);
+}