Loading drivers/video/msm/mdss/mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_DMA_BI_DIR, MDSS_QUIRK_MIN_BUS_VOTE, MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_NEED_SECURE_MAP, MDSS_QUIRK_MAX, }; Loading drivers/video/msm/mdss/mdss_mdp.c +7 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ #define RES_UHD (3840*2160) struct mdss_data_type *mdss_res; static u32 mem_protect_sd_ctrl_id; static int mdss_fb_mem_get_iommu_domain(void) { Loading Loading @@ -1403,6 +1404,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) /* clock gating feature is enabled by default */ mdata->enable_gate = true; mdata->pixel_ram_size = 0; mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL_FLAT; mdss_mdp_hw_rev_debug_caps_init(mdata); Loading Loading @@ -1472,6 +1474,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->pixel_ram_size = 40 * 1024; mdata->apply_post_scale_bytes = false; mdata->hflip_buffer_reused = false; mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL; set_bit(MDSS_QOS_OVERHEAD_FACTOR, mdata->mdss_qos_map); set_bit(MDSS_QOS_CDP, mdata->mdss_qos_map); set_bit(MDSS_QOS_PER_PIPE_LUT, mdata->mdss_qos_map); Loading @@ -1481,6 +1484,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map); mdss_set_quirk(mdata, MDSS_QUIRK_DMA_BI_DIR); mdss_set_quirk(mdata, MDSS_QUIRK_MIN_BUS_VOTE); mdss_set_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP); break; case MDSS_MDP_HW_REV_115: mdata->max_target_zorder = 4; /* excluding base layer */ Loading @@ -1492,6 +1496,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->hflip_buffer_reused = false; /* disable ECG for 28nm PHY platform */ mdata->enable_gate = false; mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL; set_bit(MDSS_QOS_CDP, 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); Loading @@ -1501,6 +1506,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map); mdss_set_quirk(mdata, MDSS_QUIRK_DMA_BI_DIR); mdss_set_quirk(mdata, MDSS_QUIRK_MIN_BUS_VOTE); mdss_set_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP); break; case MDSS_MDP_HW_REV_300: case MDSS_MDP_HW_REV_301: Loading Loading @@ -4501,7 +4507,7 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable) &request, sizeof(request), &resp, sizeof(resp)); } else { ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, MEM_PROTECT_SD_CTRL_FLAT), &desc); mem_protect_sd_ctrl_id), &desc); resp = desc.ret[0]; } Loading drivers/video/msm/mdss/mdss_mdp.h +14 −0 Original line number Diff line number Diff line Loading @@ -1297,6 +1297,20 @@ static inline bool mdss_mdp_is_lineptr_supported(struct mdss_mdp_ctl *ctl) && (pinfo->te.tear_check_en)) ? true : false); } static inline bool mdss_mdp_is_map_needed(struct mdss_data_type *mdata, struct mdss_mdp_img_data *data) { u32 is_secure_ui = data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION; /* * For ULT Targets we need SMMU Map, to issue map call for secure Display. */ if (is_secure_ui && !mdss_has_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP)) return false; return true; } irqreturn_t mdss_mdp_isr(int irq, void *ptr); void mdss_mdp_irq_clear(struct mdss_data_type *mdata, u32 intr_type, u32 intf_num); Loading drivers/video/msm/mdss/mdss_mdp_util.c +80 −72 Original line number Diff line number Diff line Loading @@ -1237,6 +1237,10 @@ static int mdss_mdp_put_img(struct mdss_mdp_img_data *data, bool rotator, /* * skip memory unmapping - secure display uses physical * address which does not require buffer unmapping * * For LT targets in secure display usecase, srcp_dma_buf will * be filled due to map call which will be unmapped above. * */ pr_debug("skip memory unmapping for secure display content\n"); } else { Loading @@ -1257,6 +1261,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img, u32 domain; dma_addr_t *start; struct ion_client *iclient = mdss_get_ionclient(); struct mdss_data_type *mdata = mdss_mdp_get_mdata(); start = &data->addr; len = &data->len; Loading @@ -1280,8 +1285,8 @@ static int mdss_mdp_get_img(struct msmfb_data *img, pr_err("invalid FB_MAJOR\n"); ret = -1; } } else if (iclient && !(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) { } else if (iclient) { if (mdss_mdp_is_map_needed(mdata, data)) { data->srcp_dma_buf = dma_buf_get(img->memory_id); if (IS_ERR(data->srcp_dma_buf)) { pr_err("error on ion_import_fd\n"); Loading @@ -1289,11 +1294,12 @@ static int mdss_mdp_get_img(struct msmfb_data *img, data->srcp_dma_buf = NULL; return ret; } domain = mdss_smmu_get_domain_type(data->flags, rotator); domain = mdss_smmu_get_domain_type(data->flags, rotator); data->srcp_attachment = mdss_smmu_dma_buf_attach(data->srcp_dma_buf, dev, domain); mdss_smmu_dma_buf_attach(data->srcp_dma_buf, dev, domain); if (IS_ERR(data->srcp_attachment)) { ret = PTR_ERR(data->srcp_attachment); goto err_put; Loading @@ -1312,15 +1318,15 @@ static int mdss_mdp_get_img(struct msmfb_data *img, data->mapped = false; data->skip_detach = false; /* return early, mapping will be done later */ return 0; } else if (iclient && (data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) { ret = 0; goto done; } else { struct ion_handle *ihandle = NULL; struct sg_table *sg_ptr = NULL; do { ihandle = ion_import_dma_buf(iclient, img->memory_id); ihandle = ion_import_dma_buf(iclient, img->memory_id); if (IS_ERR_OR_NULL(ihandle)) { ret = -EINVAL; pr_err("ion import buffer failed\n"); Loading Loading @@ -1357,7 +1363,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img, ion_free(iclient, ihandle); return ret; } } if (!*start) { pr_err("start address is zero!\n"); mdss_mdp_put_img(data, rotator, dir); Loading @@ -1380,6 +1386,7 @@ err_detach: dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment); err_put: dma_buf_put(data->srcp_dma_buf); done: return ret; } Loading @@ -1388,13 +1395,14 @@ static int mdss_mdp_map_buffer(struct mdss_mdp_img_data *data, bool rotator, { int ret = -EINVAL; int domain; struct mdss_data_type *mdata = mdss_mdp_get_mdata(); if (data->addr && data->len) return 0; if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { if (mdss_res->mdss_util->iommu_attached() && !(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) { (mdss_mdp_is_map_needed(mdata, data))) { domain = mdss_smmu_get_domain_type(data->flags, rotator); data->dir = dir; Loading Loading
drivers/video/msm/mdss/mdss.h +1 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_DMA_BI_DIR, MDSS_QUIRK_MIN_BUS_VOTE, MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_NEED_SECURE_MAP, MDSS_QUIRK_MAX, }; Loading
drivers/video/msm/mdss/mdss_mdp.c +7 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ #define RES_UHD (3840*2160) struct mdss_data_type *mdss_res; static u32 mem_protect_sd_ctrl_id; static int mdss_fb_mem_get_iommu_domain(void) { Loading Loading @@ -1403,6 +1404,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) /* clock gating feature is enabled by default */ mdata->enable_gate = true; mdata->pixel_ram_size = 0; mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL_FLAT; mdss_mdp_hw_rev_debug_caps_init(mdata); Loading Loading @@ -1472,6 +1474,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->pixel_ram_size = 40 * 1024; mdata->apply_post_scale_bytes = false; mdata->hflip_buffer_reused = false; mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL; set_bit(MDSS_QOS_OVERHEAD_FACTOR, mdata->mdss_qos_map); set_bit(MDSS_QOS_CDP, mdata->mdss_qos_map); set_bit(MDSS_QOS_PER_PIPE_LUT, mdata->mdss_qos_map); Loading @@ -1481,6 +1484,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map); mdss_set_quirk(mdata, MDSS_QUIRK_DMA_BI_DIR); mdss_set_quirk(mdata, MDSS_QUIRK_MIN_BUS_VOTE); mdss_set_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP); break; case MDSS_MDP_HW_REV_115: mdata->max_target_zorder = 4; /* excluding base layer */ Loading @@ -1492,6 +1496,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdata->hflip_buffer_reused = false; /* disable ECG for 28nm PHY platform */ mdata->enable_gate = false; mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL; set_bit(MDSS_QOS_CDP, 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); Loading @@ -1501,6 +1506,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) set_bit(MDSS_QOS_OTLIM, mdata->mdss_qos_map); mdss_set_quirk(mdata, MDSS_QUIRK_DMA_BI_DIR); mdss_set_quirk(mdata, MDSS_QUIRK_MIN_BUS_VOTE); mdss_set_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP); break; case MDSS_MDP_HW_REV_300: case MDSS_MDP_HW_REV_301: Loading Loading @@ -4501,7 +4507,7 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable) &request, sizeof(request), &resp, sizeof(resp)); } else { ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, MEM_PROTECT_SD_CTRL_FLAT), &desc); mem_protect_sd_ctrl_id), &desc); resp = desc.ret[0]; } Loading
drivers/video/msm/mdss/mdss_mdp.h +14 −0 Original line number Diff line number Diff line Loading @@ -1297,6 +1297,20 @@ static inline bool mdss_mdp_is_lineptr_supported(struct mdss_mdp_ctl *ctl) && (pinfo->te.tear_check_en)) ? true : false); } static inline bool mdss_mdp_is_map_needed(struct mdss_data_type *mdata, struct mdss_mdp_img_data *data) { u32 is_secure_ui = data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION; /* * For ULT Targets we need SMMU Map, to issue map call for secure Display. */ if (is_secure_ui && !mdss_has_quirk(mdata, MDSS_QUIRK_NEED_SECURE_MAP)) return false; return true; } irqreturn_t mdss_mdp_isr(int irq, void *ptr); void mdss_mdp_irq_clear(struct mdss_data_type *mdata, u32 intr_type, u32 intf_num); Loading
drivers/video/msm/mdss/mdss_mdp_util.c +80 −72 Original line number Diff line number Diff line Loading @@ -1237,6 +1237,10 @@ static int mdss_mdp_put_img(struct mdss_mdp_img_data *data, bool rotator, /* * skip memory unmapping - secure display uses physical * address which does not require buffer unmapping * * For LT targets in secure display usecase, srcp_dma_buf will * be filled due to map call which will be unmapped above. * */ pr_debug("skip memory unmapping for secure display content\n"); } else { Loading @@ -1257,6 +1261,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img, u32 domain; dma_addr_t *start; struct ion_client *iclient = mdss_get_ionclient(); struct mdss_data_type *mdata = mdss_mdp_get_mdata(); start = &data->addr; len = &data->len; Loading @@ -1280,8 +1285,8 @@ static int mdss_mdp_get_img(struct msmfb_data *img, pr_err("invalid FB_MAJOR\n"); ret = -1; } } else if (iclient && !(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) { } else if (iclient) { if (mdss_mdp_is_map_needed(mdata, data)) { data->srcp_dma_buf = dma_buf_get(img->memory_id); if (IS_ERR(data->srcp_dma_buf)) { pr_err("error on ion_import_fd\n"); Loading @@ -1289,11 +1294,12 @@ static int mdss_mdp_get_img(struct msmfb_data *img, data->srcp_dma_buf = NULL; return ret; } domain = mdss_smmu_get_domain_type(data->flags, rotator); domain = mdss_smmu_get_domain_type(data->flags, rotator); data->srcp_attachment = mdss_smmu_dma_buf_attach(data->srcp_dma_buf, dev, domain); mdss_smmu_dma_buf_attach(data->srcp_dma_buf, dev, domain); if (IS_ERR(data->srcp_attachment)) { ret = PTR_ERR(data->srcp_attachment); goto err_put; Loading @@ -1312,15 +1318,15 @@ static int mdss_mdp_get_img(struct msmfb_data *img, data->mapped = false; data->skip_detach = false; /* return early, mapping will be done later */ return 0; } else if (iclient && (data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) { ret = 0; goto done; } else { struct ion_handle *ihandle = NULL; struct sg_table *sg_ptr = NULL; do { ihandle = ion_import_dma_buf(iclient, img->memory_id); ihandle = ion_import_dma_buf(iclient, img->memory_id); if (IS_ERR_OR_NULL(ihandle)) { ret = -EINVAL; pr_err("ion import buffer failed\n"); Loading Loading @@ -1357,7 +1363,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img, ion_free(iclient, ihandle); return ret; } } if (!*start) { pr_err("start address is zero!\n"); mdss_mdp_put_img(data, rotator, dir); Loading @@ -1380,6 +1386,7 @@ err_detach: dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment); err_put: dma_buf_put(data->srcp_dma_buf); done: return ret; } Loading @@ -1388,13 +1395,14 @@ static int mdss_mdp_map_buffer(struct mdss_mdp_img_data *data, bool rotator, { int ret = -EINVAL; int domain; struct mdss_data_type *mdata = mdss_mdp_get_mdata(); if (data->addr && data->len) return 0; if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { if (mdss_res->mdss_util->iommu_attached() && !(data->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)) { (mdss_mdp_is_map_needed(mdata, data))) { domain = mdss_smmu_get_domain_type(data->flags, rotator); data->dir = dir; Loading