msm: mdss: dynamically set the postproc offsets
MDP hardware consists of postprocessing hardware modules which are part of different layers. Offsets of the post processing block can change based on the MDP version. Moving these module offsets into device tree makes the driver agnostic of mdp version. This change adds support to parse the offsets from device Change-Id: I586c69d0f6217cda9bb7d4ce47aa563c827ea531 Signed-off-by: Ping Li <pingli@codeaurora.org>
This commit is contained in:
parent
0d3af8c670
commit
0db67521c1
3 changed files with 160 additions and 0 deletions
|
@ -451,6 +451,24 @@ Subnode properties:
|
|||
- qcom,mdss-idle-power-collapse-enabled: Boolean property that enables support
|
||||
for mdss power collapse in idle
|
||||
screen use cases with smart panels.
|
||||
- qcom,mdss-pp-offets: A node that lists the offsets of post processing blocks
|
||||
from base module.
|
||||
-- qcom,mdss-mdss-sspp-igc-lut-off: This 32 bit value provides the
|
||||
offset to the IGC lut rams from mdp_phys base.
|
||||
-- qcom,mdss-sspp-vig-pcc-off: This 32 bit value provides the offset
|
||||
to PCC block from the VIG pipe base address.
|
||||
-- qcom,mdss-sspp-rgb-pcc-off: This 32 bit value provides the offset
|
||||
to PCC block from the RGB pipe base address.
|
||||
-- qcom,mdss-sspp-dma-pcc-off: This 32 bit value provides the offset
|
||||
to PCC block from the DMA pipe base address.
|
||||
-- qcom,mdss-dspp-pcc-off: This 32 bit value provides the offset
|
||||
to PCC block from the DSPP pipe base address.
|
||||
-- qcom,mdss-lm-pgc-off: This 32 bit value provides the offset
|
||||
to PGC block from the layer mixer base address.
|
||||
-- qcom,mdss-dspp-gamut-off: This 32 bit value provides the offset
|
||||
to gamut block from DSPP base address.
|
||||
-- qcom,mdss-dspp-pgc-off: This 32 bit value provides the offset to
|
||||
PGC block from the DSPP base address.
|
||||
|
||||
Example:
|
||||
mdss_mdp: qcom,mdss_mdp@fd900000 {
|
||||
|
@ -592,5 +610,16 @@ Example:
|
|||
linux,contiguous-region = <&cont_splash_mem>;
|
||||
};
|
||||
};
|
||||
|
||||
qcom,mdss-pp-offsets {
|
||||
qcom,mdss-sspp-mdss-igc-lut-off = <0x3000>;
|
||||
qcom,mdss-sspp-vig-pcc-off = <0x1580>;
|
||||
qcom,mdss-sspp-rgb-pcc-off = <0x180>;
|
||||
qcom,mdss-sspp-dma-pcc-off = <0x180>;
|
||||
qcom,mdss-lm-pgc-off = <0x3C0>;
|
||||
qcom,mdss-dspp-gamut-off = <0x1600>;
|
||||
qcom,mdss-dspp-pcc-off = <0x1700>;
|
||||
qcom,mdss-dspp-pgc-off = <0x17C0>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -107,6 +107,17 @@ enum mdss_hw_index {
|
|||
MDSS_MAX_HW_BLK
|
||||
};
|
||||
|
||||
struct mdss_pp_block_off {
|
||||
u32 sspp_igc_lut_off;
|
||||
u32 vig_pcc_off;
|
||||
u32 rgb_pcc_off;
|
||||
u32 dma_pcc_off;
|
||||
u32 lm_pgc_off;
|
||||
u32 dspp_gamut_off;
|
||||
u32 dspp_pcc_off;
|
||||
u32 dspp_pgc_off;
|
||||
};
|
||||
|
||||
struct mdss_data_type {
|
||||
u32 mdp_rev;
|
||||
struct clk *mdp_clk[MDSS_MAX_CLK];
|
||||
|
@ -248,6 +259,7 @@ struct mdss_data_type {
|
|||
u64 ab_rt[MDSS_MAX_HW_BLK];
|
||||
u64 ab_nrt[MDSS_MAX_HW_BLK];
|
||||
u64 ib[MDSS_MAX_HW_BLK];
|
||||
struct mdss_pp_block_off pp_block_off;
|
||||
};
|
||||
extern struct mdss_data_type *mdss_res;
|
||||
|
||||
|
|
|
@ -2031,6 +2031,122 @@ int mdss_mdp_pp_resume(struct mdss_mdp_ctl *ctl, u32 dspp_num)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mdss_mdp_pp_dt_parse(struct device *dev)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
struct device_node *node;
|
||||
struct mdss_data_type *mdata;
|
||||
u32 prop_val;
|
||||
|
||||
mdata = mdss_mdp_get_mdata();
|
||||
if (dev && mdata) {
|
||||
/* initialize offsets to U32_MAX */
|
||||
memset(&mdata->pp_block_off, U8_MAX,
|
||||
sizeof(mdata->pp_block_off));
|
||||
node = of_get_child_by_name(dev->of_node,
|
||||
"qcom,mdss-pp-offsets");
|
||||
if (node) {
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-sspp-mdss-igc-lut-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-sspp-mdss-igc-lut-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.sspp_igc_lut_off =
|
||||
prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-sspp-vig-pcc-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-sspp-vig-pcc-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.vig_pcc_off = prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-sspp-rgb-pcc-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-sspp-rgb-pcc-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.rgb_pcc_off = prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-sspp-dma-pcc-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-sspp-dma-pcc-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.dma_pcc_off = prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-lm-pgc-off",
|
||||
&prop_val);
|
||||
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-lm-pgc-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.lm_pgc_off = prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-dspp-gamut-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-dspp-gamut-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.dspp_gamut_off = prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-dspp-pcc-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-dspp-pcc-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.dspp_pcc_off = prop_val;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32(node,
|
||||
"qcom,mdss-dspp-pgc-off",
|
||||
&prop_val);
|
||||
if (ret) {
|
||||
pr_err("read property %s failed ret %d\n",
|
||||
"qcom,mdss-dspp-pgc-off", ret);
|
||||
goto bail_out;
|
||||
} else {
|
||||
mdata->pp_block_off.dspp_pgc_off = prop_val;
|
||||
}
|
||||
} else {
|
||||
pr_debug("offsets are not supported\n");
|
||||
ret = 0;
|
||||
}
|
||||
} else {
|
||||
pr_err("invalid dev %p mdata %p\n", dev, mdata);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
bail_out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mdss_mdp_pp_init(struct device *dev)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
@ -2049,6 +2165,9 @@ int mdss_mdp_pp_init(struct device *dev)
|
|||
pr_err("%s mdss_pp_res allocation failed!\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
} else {
|
||||
if (mdss_mdp_pp_dt_parse(dev))
|
||||
pr_info("No PP info in device tree\n");
|
||||
|
||||
hist = devm_kzalloc(dev,
|
||||
sizeof(struct pp_hist_col_info) *
|
||||
mdata->nmixers_intf,
|
||||
|
|
Loading…
Add table
Reference in a new issue