Loading arch/arm/boot/dts/qcom/msmcobalt-mdss.dtsi +5 −4 Original line number Diff line number Diff line Loading @@ -48,11 +48,12 @@ <0xff00>; qcom,mdss-mdp-reg-offset = <0x00001000>; qcom,max-bandwidth-low-kbps = <9600000>; qcom,max-bandwidth-high-kbps = <9600000>; qcom,max-bandwidth-per-pipe-kbps = <4500000>; qcom,max-bandwidth-low-kbps = <6700000>; qcom,max-bandwidth-high-kbps = <6700000>; qcom,max-bandwidth-per-pipe-kbps = <2400000>; qcom,max-clk-rate = <412500000>; qcom,mdss-default-ot-rd-limit = <32>; /* OT settings and bw for v1, revisit for v2 */ qcom,mdss-default-ot-rd-limit = <16>; qcom,mdss-default-ot-wr-limit = <16>; qcom,mdss-dram-channels = <2>; Loading drivers/video/msm/mdss/mdss.h +18 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,10 @@ struct mdss_prefill_data { u32 post_scaler_pixels; u32 pp_pixels; u32 fbc_lines; u32 ts_threshold; u32 ts_end; u32 ts_overhead; struct mult_factor ts_rate; struct simplified_prefill_factors prefill_factors; }; Loading Loading @@ -157,6 +161,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_MIN_BUS_VOTE, MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_NEED_SECURE_MAP, MDSS_QUIRK_SRC_SPLIT_ALWAYS, MDSS_QUIRK_MAX, }; Loading @@ -179,9 +184,21 @@ enum mdss_qos_settings { MDSS_QOS_PER_PIPE_LUT, MDSS_QOS_SIMPLIFIED_PREFILL, MDSS_QOS_VBLANK_PANIC_CTRL, MDSS_QOS_TS_PREFILL, MDSS_QOS_REMAPPER, MDSS_QOS_IB_NOCR, MDSS_QOS_MAX, }; enum mdss_mdp_pipe_type { MDSS_MDP_PIPE_TYPE_INVALID = -1, MDSS_MDP_PIPE_TYPE_VIG = 0, MDSS_MDP_PIPE_TYPE_RGB, MDSS_MDP_PIPE_TYPE_DMA, MDSS_MDP_PIPE_TYPE_CURSOR, MDSS_MDP_PIPE_TYPE_MAX, }; struct reg_bus_client { char name[MAX_CLIENT_NAME_LEN]; short usecase_ndx; Loading Loading @@ -385,6 +402,7 @@ struct mdss_data_type { struct mdss_hw_settings *hw_settings; int rects_per_sspp[MDSS_MDP_PIPE_TYPE_MAX]; struct mdss_mdp_pipe *vig_pipes; struct mdss_mdp_pipe *rgb_pipes; struct mdss_mdp_pipe *dma_pipes; Loading drivers/video/msm/mdss/mdss_mdp.c +34 −7 Original line number Diff line number Diff line Loading @@ -1680,6 +1680,14 @@ void mdss_mdp_init_default_prefill_factors(struct mdss_data_type *mdata) mdata->prefill_data.prefill_factors.fmt_linear_factor = 1; mdata->prefill_data.prefill_factors.scale_factor = 1; mdata->prefill_data.prefill_factors.xtra_ff_factor = 2; if (test_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map)) { mdata->prefill_data.ts_threshold = 25; mdata->prefill_data.ts_end = 8; mdata->prefill_data.ts_rate.numer = 1; mdata->prefill_data.ts_rate.denom = 4; mdata->prefill_data.ts_overhead = 2; } } static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) Loading Loading @@ -1804,15 +1812,20 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->per_pipe_ib_factor.denom = 5; mdata->apply_post_scale_bytes = false; mdata->hflip_buffer_reused = false; mdata->min_prefill_lines = 21; mdata->min_prefill_lines = 25; mdata->has_ubwc = true; mdata->pixel_ram_size = 50 * 1024; mdata->rects_per_sspp[MDSS_MDP_PIPE_TYPE_DMA] = 2; set_bit(MDSS_QOS_PER_PIPE_IB, mdata->mdss_qos_map); set_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map); set_bit(MDSS_QOS_OVERHEAD_FACTOR, mdata->mdss_qos_map); set_bit(MDSS_QOS_CDP, mdata->mdss_qos_map); set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map); set_bit(MDSS_QOS_PER_PIPE_LUT, mdata->mdss_qos_map); set_bit(MDSS_QOS_SIMPLIFIED_PREFILL, mdata->mdss_qos_map); set_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map); set_bit(MDSS_QOS_IB_NOCR, mdata->mdss_qos_map); set_bit(MDSS_CAPS_YUV_CONFIG, mdata->mdss_caps_map); set_bit(MDSS_CAPS_SCM_RESTORE_NOT_REQUIRED, mdata->mdss_caps_map); Loading @@ -1823,6 +1836,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdss_mdp_init_default_prefill_factors(mdata); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_RIGHT_ONLY_PU); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_2SLICE_PU_THRPUT); mdss_set_quirk(mdata, MDSS_QUIRK_SRC_SPLIT_ALWAYS); mdata->has_wb_ubwc = true; set_bit(MDSS_CAPS_10_BIT_SUPPORTED, mdata->mdss_caps_map); break; Loading Loading @@ -2186,14 +2200,14 @@ static void __update_sspp_info(struct mdss_mdp_pipe *pipe, (*cnt += scnprintf(buf + *cnt, len - *cnt, fmt, ##__VA_ARGS__)) for (i = 0; i < pipe_cnt; i++) { SPRINT("pipe_num:%d pipe_type:%s pipe_ndx:%d pipe_is_handoff:%d display_id:%d ", pipe->num, type, pipe->ndx, pipe->is_handed_off, mdss_mdp_get_display_id(pipe)); SPRINT("pipe_num:%d pipe_type:%s pipe_ndx:%d rects:%d pipe_is_handoff:%d display_id:%d ", pipe->num, type, pipe->ndx, pipe->multirect.max_rects, pipe->is_handed_off, mdss_mdp_get_display_id(pipe)); SPRINT("fmts_supported:"); for (j = 0; j < num_bytes && pipe; j++) SPRINT("%d,", pipe->supported_formats[j]); SPRINT("\n"); pipe++; pipe += pipe->multirect.max_rects; } #undef SPRINT } Loading Loading @@ -2278,6 +2292,13 @@ ssize_t mdss_mdp_show_capabilities(struct device *dev, mdata->prefill_data.prefill_factors.xtra_ff_factor); } if (test_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map)) { SPRINT("amortizable_threshold=%d\n", mdata->prefill_data.ts_threshold); SPRINT("system_overhead_lines=%d\n", mdata->prefill_data.ts_overhead); } if (mdata->props) SPRINT("props=%d\n", mdata->props); if (mdata->max_bw_low) Loading Loading @@ -2950,6 +2971,7 @@ static int mdss_mdp_parse_dt_pipe_helper(struct platform_device *pdev, struct mdss_mdp_pipe *pipe_list; char prop_name[64]; int i, cnt, rc; u32 rects_per_sspp; if (!out_plist) return -EINVAL; Loading @@ -2970,8 +2992,12 @@ static int mdss_mdp_parse_dt_pipe_helper(struct platform_device *pdev, return 0; } /* by default works in single rect mode unless otherwise noted */ rects_per_sspp = mdata->rects_per_sspp[ptype] ? : 1; pipe_list = devm_kzalloc(&pdev->dev, (sizeof(struct mdss_mdp_pipe) * cnt), GFP_KERNEL); (sizeof(struct mdss_mdp_pipe) * cnt * rects_per_sspp), GFP_KERNEL); if (!pipe_list) return -ENOMEM; Loading Loading @@ -3000,7 +3026,8 @@ static int mdss_mdp_parse_dt_pipe_helper(struct platform_device *pdev, goto parse_fail; rc = mdss_mdp_pipe_addr_setup(mdata, pipe_list, offsets, ftch_id, xin_id, ptype, pnums, cnt, priority_base); xin_id, ptype, pnums, cnt, rects_per_sspp, priority_base); if (rc) goto parse_fail; Loading drivers/video/msm/mdss/mdss_mdp.h +53 −13 Original line number Diff line number Diff line Loading @@ -114,14 +114,6 @@ enum mdss_mdp_mixer_mux { MDSS_MDP_MIXER_MUX_RIGHT, }; enum mdss_mdp_pipe_type { MDSS_MDP_PIPE_TYPE_INVALID, MDSS_MDP_PIPE_TYPE_VIG, MDSS_MDP_PIPE_TYPE_RGB, MDSS_MDP_PIPE_TYPE_DMA, MDSS_MDP_PIPE_TYPE_CURSOR, }; static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx) { u32 id; Loading Loading @@ -299,6 +291,7 @@ enum perf_calc_vote_mode { struct mdss_mdp_perf_params { u64 bw_overlap; u64 bw_overlap_nocr; u64 bw_writeback; u64 bw_prefill; u64 max_per_pipe_ib; Loading Loading @@ -650,6 +643,42 @@ struct mdss_mdp_shared_reg_ctrl { u32 bit_off; }; enum mdss_mdp_pipe_rect { MDSS_MDP_PIPE_RECT0, /* default */ MDSS_MDP_PIPE_RECT1, MDSS_MDP_PIPE_MAX_RECTS, }; /** * enum mdss_mdp_pipe_multirect_mode - pipe multirect mode * @MDSS_MDP_PIPE_MULTIRECT_NONE: pipe is not working in multirect mode * @MDSS_MDP_PIPE_MULTIRECT_PARALLEL: rectangles are being fetched at the * same time in time multiplexed fashion * @MDSS_MDP_PIPE_MULTIRECT_SERIAL: rectangles are fetched serially, where * one is only fetched after the other one * is complete */ enum mdss_mdp_pipe_multirect_mode { MDSS_MDP_PIPE_MULTIRECT_NONE, MDSS_MDP_PIPE_MULTIRECT_PARALLEL, MDSS_MDP_PIPE_MULTIRECT_SERIAL, }; /** * struct mdss_mdp_pipe_multirect_params - multirect info for layer or pipe * @num: rectangle being operated, default is RECT0 if pipe doesn't * support multirect * @mode: mode of multirect operation, default is NONE * @next: pointer to sibling pipe/layer which is also operating in * multirect mode */ struct mdss_mdp_pipe_multirect_params { enum mdss_mdp_pipe_rect num; /* RECT0 or RECT1 */ int max_rects; enum mdss_mdp_pipe_multirect_mode mode; void *next; /* pointer to next pipe or layer */ }; struct mdss_mdp_pipe { u32 num; u32 type; Loading Loading @@ -722,6 +751,8 @@ struct mdss_mdp_pipe { u32 frame_rate; u8 csc_coeff_set; u8 supported_formats[BITS_TO_BYTES(MDP_IMGTYPE_LIMIT1)]; struct mdss_mdp_pipe_multirect_params multirect; }; struct mdss_mdp_writeback_arg { Loading Loading @@ -1406,7 +1437,8 @@ int mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe, u32 flags); int mdss_mdp_overlay_setup_scaling(struct mdss_mdp_pipe *pipe); struct mdss_mdp_pipe *mdss_mdp_pipe_assign(struct mdss_data_type *mdata, struct mdss_mdp_mixer *mixer, u32 ndx); struct mdss_mdp_mixer *mixer, u32 ndx, enum mdss_mdp_pipe_rect rect_num); struct mdss_mdp_pipe *mdss_mdp_overlay_pipe_reuse( struct msm_fb_data_type *mfd, int pipe_ndx); void mdss_mdp_pipe_position_update(struct mdss_mdp_pipe *pipe, Loading Loading @@ -1452,9 +1484,16 @@ int mdss_mdp_perf_bw_check(struct mdss_mdp_ctl *ctl, struct mdss_mdp_pipe **right_plist, int right_cnt); int mdss_mdp_perf_bw_check_pipe(struct mdss_mdp_perf_params *perf, struct mdss_mdp_pipe *pipe); int mdss_mdp_get_pipe_overlap_bw(struct mdss_mdp_pipe *pipe, struct mdss_rect *roi, u64 *quota, u64 *quota_nocr, u32 flags); int mdss_mdp_get_panel_params(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer, u32 *fps, u32 *v_total, u32 *h_total, u32 *xres); int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params *perf, struct mdss_rect *roi, u32 flags); bool mdss_mdp_is_amortizable_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer, struct mdss_data_type *mdata); u32 mdss_mdp_calc_latency_buf_bytes(bool is_yuv, bool is_bwc, bool is_tile, u32 src_w, u32 bpp, bool use_latency_buf_percentage, u32 smp_bytes, bool is_ubwc, bool is_nv12, bool is_hflip); Loading Loading @@ -1561,12 +1600,12 @@ int mdss_mdp_pipe_handoff(struct mdss_mdp_pipe *pipe); int mdss_mdp_smp_handoff(struct mdss_data_type *mdata); struct mdss_mdp_pipe *mdss_mdp_pipe_alloc(struct mdss_mdp_mixer *mixer, u32 type, struct mdss_mdp_pipe *left_blend_pipe); struct mdss_mdp_pipe *mdss_mdp_pipe_get(struct mdss_data_type *mdata, u32 ndx); struct mdss_mdp_pipe *mdss_mdp_pipe_get(u32 ndx, enum mdss_mdp_pipe_rect rect_num); struct mdss_mdp_pipe *mdss_mdp_pipe_search(struct mdss_data_type *mdata, u32 ndx); u32 ndx, enum mdss_mdp_pipe_rect rect_num); int mdss_mdp_pipe_map(struct mdss_mdp_pipe *pipe); void mdss_mdp_pipe_unmap(struct mdss_mdp_pipe *pipe); struct mdss_mdp_pipe *mdss_mdp_pipe_alloc_dma(struct mdss_mdp_mixer *mixer); u32 mdss_mdp_smp_calc_num_blocks(struct mdss_mdp_pipe *pipe); u32 mdss_mdp_smp_get_size(struct mdss_mdp_pipe *pipe); Loading @@ -1576,7 +1615,8 @@ void mdss_mdp_smp_release(struct mdss_mdp_pipe *pipe); int mdss_mdp_pipe_addr_setup(struct mdss_data_type *mdata, struct mdss_mdp_pipe *head, u32 *offsets, u32 *ftch_id, u32 *xin_id, u32 type, const int *pnums, u32 len, u8 priority_base); u32 type, const int *pnums, u32 len, u32 rects_per_sspp, u8 priority_base); int mdss_mdp_mixer_addr_setup(struct mdss_data_type *mdata, u32 *mixer_offsets, u32 *dspp_offsets, u32 *pingpong_offsets, u32 type, u32 len); int mdss_mdp_ctl_addr_setup(struct mdss_data_type *mdata, u32 *ctl_offsets, Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +437 −163 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
arch/arm/boot/dts/qcom/msmcobalt-mdss.dtsi +5 −4 Original line number Diff line number Diff line Loading @@ -48,11 +48,12 @@ <0xff00>; qcom,mdss-mdp-reg-offset = <0x00001000>; qcom,max-bandwidth-low-kbps = <9600000>; qcom,max-bandwidth-high-kbps = <9600000>; qcom,max-bandwidth-per-pipe-kbps = <4500000>; qcom,max-bandwidth-low-kbps = <6700000>; qcom,max-bandwidth-high-kbps = <6700000>; qcom,max-bandwidth-per-pipe-kbps = <2400000>; qcom,max-clk-rate = <412500000>; qcom,mdss-default-ot-rd-limit = <32>; /* OT settings and bw for v1, revisit for v2 */ qcom,mdss-default-ot-rd-limit = <16>; qcom,mdss-default-ot-wr-limit = <16>; qcom,mdss-dram-channels = <2>; Loading
drivers/video/msm/mdss/mdss.h +18 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,10 @@ struct mdss_prefill_data { u32 post_scaler_pixels; u32 pp_pixels; u32 fbc_lines; u32 ts_threshold; u32 ts_end; u32 ts_overhead; struct mult_factor ts_rate; struct simplified_prefill_factors prefill_factors; }; Loading Loading @@ -157,6 +161,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_MIN_BUS_VOTE, MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_NEED_SECURE_MAP, MDSS_QUIRK_SRC_SPLIT_ALWAYS, MDSS_QUIRK_MAX, }; Loading @@ -179,9 +184,21 @@ enum mdss_qos_settings { MDSS_QOS_PER_PIPE_LUT, MDSS_QOS_SIMPLIFIED_PREFILL, MDSS_QOS_VBLANK_PANIC_CTRL, MDSS_QOS_TS_PREFILL, MDSS_QOS_REMAPPER, MDSS_QOS_IB_NOCR, MDSS_QOS_MAX, }; enum mdss_mdp_pipe_type { MDSS_MDP_PIPE_TYPE_INVALID = -1, MDSS_MDP_PIPE_TYPE_VIG = 0, MDSS_MDP_PIPE_TYPE_RGB, MDSS_MDP_PIPE_TYPE_DMA, MDSS_MDP_PIPE_TYPE_CURSOR, MDSS_MDP_PIPE_TYPE_MAX, }; struct reg_bus_client { char name[MAX_CLIENT_NAME_LEN]; short usecase_ndx; Loading Loading @@ -385,6 +402,7 @@ struct mdss_data_type { struct mdss_hw_settings *hw_settings; int rects_per_sspp[MDSS_MDP_PIPE_TYPE_MAX]; struct mdss_mdp_pipe *vig_pipes; struct mdss_mdp_pipe *rgb_pipes; struct mdss_mdp_pipe *dma_pipes; Loading
drivers/video/msm/mdss/mdss_mdp.c +34 −7 Original line number Diff line number Diff line Loading @@ -1680,6 +1680,14 @@ void mdss_mdp_init_default_prefill_factors(struct mdss_data_type *mdata) mdata->prefill_data.prefill_factors.fmt_linear_factor = 1; mdata->prefill_data.prefill_factors.scale_factor = 1; mdata->prefill_data.prefill_factors.xtra_ff_factor = 2; if (test_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map)) { mdata->prefill_data.ts_threshold = 25; mdata->prefill_data.ts_end = 8; mdata->prefill_data.ts_rate.numer = 1; mdata->prefill_data.ts_rate.denom = 4; mdata->prefill_data.ts_overhead = 2; } } static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) Loading Loading @@ -1804,15 +1812,20 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->per_pipe_ib_factor.denom = 5; mdata->apply_post_scale_bytes = false; mdata->hflip_buffer_reused = false; mdata->min_prefill_lines = 21; mdata->min_prefill_lines = 25; mdata->has_ubwc = true; mdata->pixel_ram_size = 50 * 1024; mdata->rects_per_sspp[MDSS_MDP_PIPE_TYPE_DMA] = 2; set_bit(MDSS_QOS_PER_PIPE_IB, mdata->mdss_qos_map); set_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map); set_bit(MDSS_QOS_OVERHEAD_FACTOR, mdata->mdss_qos_map); set_bit(MDSS_QOS_CDP, mdata->mdss_qos_map); set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map); set_bit(MDSS_QOS_PER_PIPE_LUT, mdata->mdss_qos_map); set_bit(MDSS_QOS_SIMPLIFIED_PREFILL, mdata->mdss_qos_map); set_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map); set_bit(MDSS_QOS_IB_NOCR, mdata->mdss_qos_map); set_bit(MDSS_CAPS_YUV_CONFIG, mdata->mdss_caps_map); set_bit(MDSS_CAPS_SCM_RESTORE_NOT_REQUIRED, mdata->mdss_caps_map); Loading @@ -1823,6 +1836,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdss_mdp_init_default_prefill_factors(mdata); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_RIGHT_ONLY_PU); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_2SLICE_PU_THRPUT); mdss_set_quirk(mdata, MDSS_QUIRK_SRC_SPLIT_ALWAYS); mdata->has_wb_ubwc = true; set_bit(MDSS_CAPS_10_BIT_SUPPORTED, mdata->mdss_caps_map); break; Loading Loading @@ -2186,14 +2200,14 @@ static void __update_sspp_info(struct mdss_mdp_pipe *pipe, (*cnt += scnprintf(buf + *cnt, len - *cnt, fmt, ##__VA_ARGS__)) for (i = 0; i < pipe_cnt; i++) { SPRINT("pipe_num:%d pipe_type:%s pipe_ndx:%d pipe_is_handoff:%d display_id:%d ", pipe->num, type, pipe->ndx, pipe->is_handed_off, mdss_mdp_get_display_id(pipe)); SPRINT("pipe_num:%d pipe_type:%s pipe_ndx:%d rects:%d pipe_is_handoff:%d display_id:%d ", pipe->num, type, pipe->ndx, pipe->multirect.max_rects, pipe->is_handed_off, mdss_mdp_get_display_id(pipe)); SPRINT("fmts_supported:"); for (j = 0; j < num_bytes && pipe; j++) SPRINT("%d,", pipe->supported_formats[j]); SPRINT("\n"); pipe++; pipe += pipe->multirect.max_rects; } #undef SPRINT } Loading Loading @@ -2278,6 +2292,13 @@ ssize_t mdss_mdp_show_capabilities(struct device *dev, mdata->prefill_data.prefill_factors.xtra_ff_factor); } if (test_bit(MDSS_QOS_TS_PREFILL, mdata->mdss_qos_map)) { SPRINT("amortizable_threshold=%d\n", mdata->prefill_data.ts_threshold); SPRINT("system_overhead_lines=%d\n", mdata->prefill_data.ts_overhead); } if (mdata->props) SPRINT("props=%d\n", mdata->props); if (mdata->max_bw_low) Loading Loading @@ -2950,6 +2971,7 @@ static int mdss_mdp_parse_dt_pipe_helper(struct platform_device *pdev, struct mdss_mdp_pipe *pipe_list; char prop_name[64]; int i, cnt, rc; u32 rects_per_sspp; if (!out_plist) return -EINVAL; Loading @@ -2970,8 +2992,12 @@ static int mdss_mdp_parse_dt_pipe_helper(struct platform_device *pdev, return 0; } /* by default works in single rect mode unless otherwise noted */ rects_per_sspp = mdata->rects_per_sspp[ptype] ? : 1; pipe_list = devm_kzalloc(&pdev->dev, (sizeof(struct mdss_mdp_pipe) * cnt), GFP_KERNEL); (sizeof(struct mdss_mdp_pipe) * cnt * rects_per_sspp), GFP_KERNEL); if (!pipe_list) return -ENOMEM; Loading Loading @@ -3000,7 +3026,8 @@ static int mdss_mdp_parse_dt_pipe_helper(struct platform_device *pdev, goto parse_fail; rc = mdss_mdp_pipe_addr_setup(mdata, pipe_list, offsets, ftch_id, xin_id, ptype, pnums, cnt, priority_base); xin_id, ptype, pnums, cnt, rects_per_sspp, priority_base); if (rc) goto parse_fail; Loading
drivers/video/msm/mdss/mdss_mdp.h +53 −13 Original line number Diff line number Diff line Loading @@ -114,14 +114,6 @@ enum mdss_mdp_mixer_mux { MDSS_MDP_MIXER_MUX_RIGHT, }; enum mdss_mdp_pipe_type { MDSS_MDP_PIPE_TYPE_INVALID, MDSS_MDP_PIPE_TYPE_VIG, MDSS_MDP_PIPE_TYPE_RGB, MDSS_MDP_PIPE_TYPE_DMA, MDSS_MDP_PIPE_TYPE_CURSOR, }; static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx) { u32 id; Loading Loading @@ -299,6 +291,7 @@ enum perf_calc_vote_mode { struct mdss_mdp_perf_params { u64 bw_overlap; u64 bw_overlap_nocr; u64 bw_writeback; u64 bw_prefill; u64 max_per_pipe_ib; Loading Loading @@ -650,6 +643,42 @@ struct mdss_mdp_shared_reg_ctrl { u32 bit_off; }; enum mdss_mdp_pipe_rect { MDSS_MDP_PIPE_RECT0, /* default */ MDSS_MDP_PIPE_RECT1, MDSS_MDP_PIPE_MAX_RECTS, }; /** * enum mdss_mdp_pipe_multirect_mode - pipe multirect mode * @MDSS_MDP_PIPE_MULTIRECT_NONE: pipe is not working in multirect mode * @MDSS_MDP_PIPE_MULTIRECT_PARALLEL: rectangles are being fetched at the * same time in time multiplexed fashion * @MDSS_MDP_PIPE_MULTIRECT_SERIAL: rectangles are fetched serially, where * one is only fetched after the other one * is complete */ enum mdss_mdp_pipe_multirect_mode { MDSS_MDP_PIPE_MULTIRECT_NONE, MDSS_MDP_PIPE_MULTIRECT_PARALLEL, MDSS_MDP_PIPE_MULTIRECT_SERIAL, }; /** * struct mdss_mdp_pipe_multirect_params - multirect info for layer or pipe * @num: rectangle being operated, default is RECT0 if pipe doesn't * support multirect * @mode: mode of multirect operation, default is NONE * @next: pointer to sibling pipe/layer which is also operating in * multirect mode */ struct mdss_mdp_pipe_multirect_params { enum mdss_mdp_pipe_rect num; /* RECT0 or RECT1 */ int max_rects; enum mdss_mdp_pipe_multirect_mode mode; void *next; /* pointer to next pipe or layer */ }; struct mdss_mdp_pipe { u32 num; u32 type; Loading Loading @@ -722,6 +751,8 @@ struct mdss_mdp_pipe { u32 frame_rate; u8 csc_coeff_set; u8 supported_formats[BITS_TO_BYTES(MDP_IMGTYPE_LIMIT1)]; struct mdss_mdp_pipe_multirect_params multirect; }; struct mdss_mdp_writeback_arg { Loading Loading @@ -1406,7 +1437,8 @@ int mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe, u32 flags); int mdss_mdp_overlay_setup_scaling(struct mdss_mdp_pipe *pipe); struct mdss_mdp_pipe *mdss_mdp_pipe_assign(struct mdss_data_type *mdata, struct mdss_mdp_mixer *mixer, u32 ndx); struct mdss_mdp_mixer *mixer, u32 ndx, enum mdss_mdp_pipe_rect rect_num); struct mdss_mdp_pipe *mdss_mdp_overlay_pipe_reuse( struct msm_fb_data_type *mfd, int pipe_ndx); void mdss_mdp_pipe_position_update(struct mdss_mdp_pipe *pipe, Loading Loading @@ -1452,9 +1484,16 @@ int mdss_mdp_perf_bw_check(struct mdss_mdp_ctl *ctl, struct mdss_mdp_pipe **right_plist, int right_cnt); int mdss_mdp_perf_bw_check_pipe(struct mdss_mdp_perf_params *perf, struct mdss_mdp_pipe *pipe); int mdss_mdp_get_pipe_overlap_bw(struct mdss_mdp_pipe *pipe, struct mdss_rect *roi, u64 *quota, u64 *quota_nocr, u32 flags); int mdss_mdp_get_panel_params(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer, u32 *fps, u32 *v_total, u32 *h_total, u32 *xres); int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params *perf, struct mdss_rect *roi, u32 flags); bool mdss_mdp_is_amortizable_pipe(struct mdss_mdp_pipe *pipe, struct mdss_mdp_mixer *mixer, struct mdss_data_type *mdata); u32 mdss_mdp_calc_latency_buf_bytes(bool is_yuv, bool is_bwc, bool is_tile, u32 src_w, u32 bpp, bool use_latency_buf_percentage, u32 smp_bytes, bool is_ubwc, bool is_nv12, bool is_hflip); Loading Loading @@ -1561,12 +1600,12 @@ int mdss_mdp_pipe_handoff(struct mdss_mdp_pipe *pipe); int mdss_mdp_smp_handoff(struct mdss_data_type *mdata); struct mdss_mdp_pipe *mdss_mdp_pipe_alloc(struct mdss_mdp_mixer *mixer, u32 type, struct mdss_mdp_pipe *left_blend_pipe); struct mdss_mdp_pipe *mdss_mdp_pipe_get(struct mdss_data_type *mdata, u32 ndx); struct mdss_mdp_pipe *mdss_mdp_pipe_get(u32 ndx, enum mdss_mdp_pipe_rect rect_num); struct mdss_mdp_pipe *mdss_mdp_pipe_search(struct mdss_data_type *mdata, u32 ndx); u32 ndx, enum mdss_mdp_pipe_rect rect_num); int mdss_mdp_pipe_map(struct mdss_mdp_pipe *pipe); void mdss_mdp_pipe_unmap(struct mdss_mdp_pipe *pipe); struct mdss_mdp_pipe *mdss_mdp_pipe_alloc_dma(struct mdss_mdp_mixer *mixer); u32 mdss_mdp_smp_calc_num_blocks(struct mdss_mdp_pipe *pipe); u32 mdss_mdp_smp_get_size(struct mdss_mdp_pipe *pipe); Loading @@ -1576,7 +1615,8 @@ void mdss_mdp_smp_release(struct mdss_mdp_pipe *pipe); int mdss_mdp_pipe_addr_setup(struct mdss_data_type *mdata, struct mdss_mdp_pipe *head, u32 *offsets, u32 *ftch_id, u32 *xin_id, u32 type, const int *pnums, u32 len, u8 priority_base); u32 type, const int *pnums, u32 len, u32 rects_per_sspp, u8 priority_base); int mdss_mdp_mixer_addr_setup(struct mdss_data_type *mdata, u32 *mixer_offsets, u32 *dspp_offsets, u32 *pingpong_offsets, u32 type, u32 len); int mdss_mdp_ctl_addr_setup(struct mdss_data_type *mdata, u32 *ctl_offsets, Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +437 −163 File changed.Preview size limit exceeded, changes collapsed. Show changes