Loading Documentation/devicetree/bindings/media/video/msm-sde-rotator.txt +2 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ Optional properties limits. - qcom,mdss-rot-vbif-qos-setting: This array is used to program vbif qos remapper register priority for rotator clients. - qcom,mdss-rot-vbif-memtype: Array of u32 vbif memory type settings for each xin port. - qcom,mdss-rot-cdp-setting: Integer array of size two, to indicate client driven prefetch is available or not. Index 0 represents if CDP is enabled for read and index 1, if CDP Loading Loading @@ -173,6 +174,7 @@ Example: /* VBIF QoS remapper settings*/ qcom,mdss-rot-vbif-qos-setting = <1 1 1 1>; qcom,mdss-rot-vbif-memtype = <3 3>; com,mdss-rot-cdp-setting = <1 1>; Loading arch/arm64/boot/dts/qcom/sdm845-sde.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -354,6 +354,7 @@ /* Offline rotator QoS setting */ qcom,mdss-rot-vbif-qos-setting = <3 3 3 3 3 3 3 3>; qcom,mdss-rot-vbif-memtype = <3 3>; qcom,mdss-rot-cdp-setting = <1 1>; qcom,mdss-rot-qos-lut = <0x0 0x0 0x0 0x0>; qcom,mdss-rot-danger-lut = <0x0 0x0>; Loading drivers/media/platform/msm/sde/rotator/sde_rotator_base.c +99 −1 Original line number Diff line number Diff line Loading @@ -283,6 +283,59 @@ void sde_mdp_set_ot_limit(struct sde_mdp_set_ot_params *params) return; } /* * sde_mdp_set_vbif_memtype - set memtype output for the given xin port * @mdata: pointer to global rotator data * @xin_id: xin identifier * @memtype: memtype output configuration * return: none */ static void sde_mdp_set_vbif_memtype(struct sde_rot_data_type *mdata, u32 xin_id, u32 memtype) { u32 reg_off; u32 bit_off; u32 reg_val; /* * Assume 4 bits per bit field, 8 fields per 32-bit register. */ if (xin_id >= 8) return; reg_off = MMSS_VBIF_NRT_VBIF_OUT_AXI_AMEMTYPE_CONF0; bit_off = (xin_id & 0x7) * 4; reg_val = SDE_VBIF_READ(mdata, reg_off); reg_val &= ~(0x7 << bit_off); reg_val |= (memtype & 0x7) << bit_off; SDE_VBIF_WRITE(mdata, reg_off, reg_val); } /* * sde_mdp_init_vbif - initialize static vbif configuration * return: 0 if success; error code otherwise */ int sde_mdp_init_vbif(void) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); int i; if (!mdata) return -EINVAL; if (mdata->vbif_memtype_count && mdata->vbif_memtype) { for (i = 0; i < mdata->vbif_memtype_count; i++) sde_mdp_set_vbif_memtype(mdata, i, mdata->vbif_memtype[i]); SDEROT_DBG("amemtype=0x%x\n", SDE_VBIF_READ(mdata, MMSS_VBIF_NRT_VBIF_OUT_AXI_AMEMTYPE_CONF0)); } return 0; } struct reg_bus_client *sde_reg_bus_vote_client_create(char *client_name) { struct reg_bus_client *client; Loading Loading @@ -398,6 +451,32 @@ static int sde_mdp_parse_dt_prop_len(struct platform_device *pdev, return len; } static void sde_mdp_parse_vbif_memtype(struct platform_device *pdev, struct sde_rot_data_type *mdata) { int rc; mdata->vbif_memtype_count = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-rot-vbif-memtype"); mdata->vbif_memtype = kzalloc(sizeof(u32) * mdata->vbif_memtype_count, GFP_KERNEL); if (!mdata->vbif_memtype) { mdata->vbif_memtype_count = 0; return; } rc = sde_mdp_parse_dt_handler(pdev, "qcom,mdss-rot-vbif-memtype", mdata->vbif_memtype, mdata->vbif_memtype_count); if (rc) { SDEROT_DBG("vbif memtype not found\n"); kfree(mdata->vbif_memtype); mdata->vbif_memtype = NULL; mdata->vbif_memtype_count = 0; return; } } static void sde_mdp_parse_vbif_qos(struct platform_device *pdev, struct sde_rot_data_type *mdata) { Loading @@ -409,14 +488,19 @@ static void sde_mdp_parse_vbif_qos(struct platform_device *pdev, "qcom,mdss-rot-vbif-qos-setting"); mdata->vbif_nrt_qos = kzalloc(sizeof(u32) * mdata->npriority_lvl, GFP_KERNEL); if (!mdata->vbif_nrt_qos) if (!mdata->vbif_nrt_qos) { mdata->npriority_lvl = 0; return; } rc = sde_mdp_parse_dt_handler(pdev, "qcom,mdss-rot-vbif-qos-setting", mdata->vbif_nrt_qos, mdata->npriority_lvl); if (rc) { SDEROT_DBG("vbif setting not found\n"); kfree(mdata->vbif_nrt_qos); mdata->vbif_nrt_qos = NULL; mdata->npriority_lvl = 0; return; } } Loading Loading @@ -579,6 +663,8 @@ static int sde_mdp_parse_dt_misc(struct platform_device *pdev, sde_mdp_parse_vbif_qos(pdev, mdata); sde_mdp_parse_vbif_memtype(pdev, mdata); sde_mdp_parse_rot_lut_setting(pdev, mdata); sde_mdp_parse_inline_rot_lut_setting(pdev, mdata); Loading @@ -588,6 +674,17 @@ static int sde_mdp_parse_dt_misc(struct platform_device *pdev, return 0; } static void sde_mdp_destroy_dt_misc(struct platform_device *pdev, struct sde_rot_data_type *mdata) { kfree(mdata->vbif_memtype); mdata->vbif_memtype = NULL; kfree(mdata->vbif_rt_qos); mdata->vbif_rt_qos = NULL; kfree(mdata->vbif_nrt_qos); mdata->vbif_nrt_qos = NULL; } #define MDP_REG_BUS_VECTOR_ENTRY(ab_val, ib_val) \ { \ .src = MSM_BUS_MASTER_AMPSS_M0, \ Loading Loading @@ -742,6 +839,7 @@ void sde_rotator_base_destroy(struct sde_rot_data_type *mdata) sde_rot_res = NULL; sde_mdp_bus_scale_unregister(mdata); sde_mdp_destroy_dt_misc(pdev, mdata); sde_rot_iounmap(&mdata->vbif_nrt_io); sde_rot_iounmap(&mdata->sde_io); devm_kfree(&pdev->dev, mdata); Loading drivers/media/platform/msm/sde/rotator/sde_rotator_base.h +5 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,9 @@ struct sde_rot_data_type { u32 *vbif_nrt_qos; u32 npriority_lvl; u32 vbif_memtype_count; u32 *vbif_memtype; int iommu_attached; int iommu_ref_cnt; Loading Loading @@ -271,6 +274,8 @@ u32 sde_mdp_get_ot_limit(u32 width, u32 height, u32 pixfmt, u32 fps, u32 is_rd); void sde_mdp_set_ot_limit(struct sde_mdp_set_ot_params *params); int sde_mdp_init_vbif(void); #define SDE_VBIF_WRITE(mdata, offset, value) \ (sde_reg_w(&mdata->vbif_nrt_io, offset, value, 0)) #define SDE_VBIF_READ(mdata, offset) \ Loading drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +2 −0 Original line number Diff line number Diff line Loading @@ -341,6 +341,8 @@ static int sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) if (!on) { mgr->minimum_bw_vote = 0; sde_rotator_update_perf(mgr); } else { sde_mdp_init_vbif(); } mgr->regulator_enable = on; Loading Loading
Documentation/devicetree/bindings/media/video/msm-sde-rotator.txt +2 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ Optional properties limits. - qcom,mdss-rot-vbif-qos-setting: This array is used to program vbif qos remapper register priority for rotator clients. - qcom,mdss-rot-vbif-memtype: Array of u32 vbif memory type settings for each xin port. - qcom,mdss-rot-cdp-setting: Integer array of size two, to indicate client driven prefetch is available or not. Index 0 represents if CDP is enabled for read and index 1, if CDP Loading Loading @@ -173,6 +174,7 @@ Example: /* VBIF QoS remapper settings*/ qcom,mdss-rot-vbif-qos-setting = <1 1 1 1>; qcom,mdss-rot-vbif-memtype = <3 3>; com,mdss-rot-cdp-setting = <1 1>; Loading
arch/arm64/boot/dts/qcom/sdm845-sde.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -354,6 +354,7 @@ /* Offline rotator QoS setting */ qcom,mdss-rot-vbif-qos-setting = <3 3 3 3 3 3 3 3>; qcom,mdss-rot-vbif-memtype = <3 3>; qcom,mdss-rot-cdp-setting = <1 1>; qcom,mdss-rot-qos-lut = <0x0 0x0 0x0 0x0>; qcom,mdss-rot-danger-lut = <0x0 0x0>; Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_base.c +99 −1 Original line number Diff line number Diff line Loading @@ -283,6 +283,59 @@ void sde_mdp_set_ot_limit(struct sde_mdp_set_ot_params *params) return; } /* * sde_mdp_set_vbif_memtype - set memtype output for the given xin port * @mdata: pointer to global rotator data * @xin_id: xin identifier * @memtype: memtype output configuration * return: none */ static void sde_mdp_set_vbif_memtype(struct sde_rot_data_type *mdata, u32 xin_id, u32 memtype) { u32 reg_off; u32 bit_off; u32 reg_val; /* * Assume 4 bits per bit field, 8 fields per 32-bit register. */ if (xin_id >= 8) return; reg_off = MMSS_VBIF_NRT_VBIF_OUT_AXI_AMEMTYPE_CONF0; bit_off = (xin_id & 0x7) * 4; reg_val = SDE_VBIF_READ(mdata, reg_off); reg_val &= ~(0x7 << bit_off); reg_val |= (memtype & 0x7) << bit_off; SDE_VBIF_WRITE(mdata, reg_off, reg_val); } /* * sde_mdp_init_vbif - initialize static vbif configuration * return: 0 if success; error code otherwise */ int sde_mdp_init_vbif(void) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); int i; if (!mdata) return -EINVAL; if (mdata->vbif_memtype_count && mdata->vbif_memtype) { for (i = 0; i < mdata->vbif_memtype_count; i++) sde_mdp_set_vbif_memtype(mdata, i, mdata->vbif_memtype[i]); SDEROT_DBG("amemtype=0x%x\n", SDE_VBIF_READ(mdata, MMSS_VBIF_NRT_VBIF_OUT_AXI_AMEMTYPE_CONF0)); } return 0; } struct reg_bus_client *sde_reg_bus_vote_client_create(char *client_name) { struct reg_bus_client *client; Loading Loading @@ -398,6 +451,32 @@ static int sde_mdp_parse_dt_prop_len(struct platform_device *pdev, return len; } static void sde_mdp_parse_vbif_memtype(struct platform_device *pdev, struct sde_rot_data_type *mdata) { int rc; mdata->vbif_memtype_count = sde_mdp_parse_dt_prop_len(pdev, "qcom,mdss-rot-vbif-memtype"); mdata->vbif_memtype = kzalloc(sizeof(u32) * mdata->vbif_memtype_count, GFP_KERNEL); if (!mdata->vbif_memtype) { mdata->vbif_memtype_count = 0; return; } rc = sde_mdp_parse_dt_handler(pdev, "qcom,mdss-rot-vbif-memtype", mdata->vbif_memtype, mdata->vbif_memtype_count); if (rc) { SDEROT_DBG("vbif memtype not found\n"); kfree(mdata->vbif_memtype); mdata->vbif_memtype = NULL; mdata->vbif_memtype_count = 0; return; } } static void sde_mdp_parse_vbif_qos(struct platform_device *pdev, struct sde_rot_data_type *mdata) { Loading @@ -409,14 +488,19 @@ static void sde_mdp_parse_vbif_qos(struct platform_device *pdev, "qcom,mdss-rot-vbif-qos-setting"); mdata->vbif_nrt_qos = kzalloc(sizeof(u32) * mdata->npriority_lvl, GFP_KERNEL); if (!mdata->vbif_nrt_qos) if (!mdata->vbif_nrt_qos) { mdata->npriority_lvl = 0; return; } rc = sde_mdp_parse_dt_handler(pdev, "qcom,mdss-rot-vbif-qos-setting", mdata->vbif_nrt_qos, mdata->npriority_lvl); if (rc) { SDEROT_DBG("vbif setting not found\n"); kfree(mdata->vbif_nrt_qos); mdata->vbif_nrt_qos = NULL; mdata->npriority_lvl = 0; return; } } Loading Loading @@ -579,6 +663,8 @@ static int sde_mdp_parse_dt_misc(struct platform_device *pdev, sde_mdp_parse_vbif_qos(pdev, mdata); sde_mdp_parse_vbif_memtype(pdev, mdata); sde_mdp_parse_rot_lut_setting(pdev, mdata); sde_mdp_parse_inline_rot_lut_setting(pdev, mdata); Loading @@ -588,6 +674,17 @@ static int sde_mdp_parse_dt_misc(struct platform_device *pdev, return 0; } static void sde_mdp_destroy_dt_misc(struct platform_device *pdev, struct sde_rot_data_type *mdata) { kfree(mdata->vbif_memtype); mdata->vbif_memtype = NULL; kfree(mdata->vbif_rt_qos); mdata->vbif_rt_qos = NULL; kfree(mdata->vbif_nrt_qos); mdata->vbif_nrt_qos = NULL; } #define MDP_REG_BUS_VECTOR_ENTRY(ab_val, ib_val) \ { \ .src = MSM_BUS_MASTER_AMPSS_M0, \ Loading Loading @@ -742,6 +839,7 @@ void sde_rotator_base_destroy(struct sde_rot_data_type *mdata) sde_rot_res = NULL; sde_mdp_bus_scale_unregister(mdata); sde_mdp_destroy_dt_misc(pdev, mdata); sde_rot_iounmap(&mdata->vbif_nrt_io); sde_rot_iounmap(&mdata->sde_io); devm_kfree(&pdev->dev, mdata); Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_base.h +5 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,9 @@ struct sde_rot_data_type { u32 *vbif_nrt_qos; u32 npriority_lvl; u32 vbif_memtype_count; u32 *vbif_memtype; int iommu_attached; int iommu_ref_cnt; Loading Loading @@ -271,6 +274,8 @@ u32 sde_mdp_get_ot_limit(u32 width, u32 height, u32 pixfmt, u32 fps, u32 is_rd); void sde_mdp_set_ot_limit(struct sde_mdp_set_ot_params *params); int sde_mdp_init_vbif(void); #define SDE_VBIF_WRITE(mdata, offset, value) \ (sde_reg_w(&mdata->vbif_nrt_io, offset, value, 0)) #define SDE_VBIF_READ(mdata, offset) \ Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +2 −0 Original line number Diff line number Diff line Loading @@ -341,6 +341,8 @@ static int sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on) if (!on) { mgr->minimum_bw_vote = 0; sde_rotator_update_perf(mgr); } else { sde_mdp_init_vbif(); } mgr->regulator_enable = on; Loading