Loading drivers/video/msm/mdss/mdp3.c +78 −38 Original line number Diff line number Diff line Loading @@ -163,6 +163,18 @@ void mdss_spi_panel_bl_ctrl_update(struct mdss_panel_data *pdata, u32 bl_level) } #endif static int mdp3_get_domain(u32 flags) { int domain; if (flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) domain = MDSS_IOMMU_DOMAIN_SECURE; else domain = MDSS_IOMMU_DOMAIN_UNSECURE; return domain; } static irqreturn_t mdp3_irq_handler(int irq, void *ptr) { int i = 0; Loading Loading @@ -1829,7 +1841,7 @@ out: int mdp3_put_img(struct mdp3_img_data *data, int client) { struct ion_client *iclient = mdp3_res->ion_client; int dom = (mdp3_res->domains + MDP3_IOMMU_DOMAIN_UNSECURE)->domain_idx; int dom = mdp3_get_domain(data->flags); int dir = DMA_BIDIRECTIONAL; if (data->flags & MDP_MEMORY_ID_TYPE_FB) { Loading @@ -1837,8 +1849,9 @@ int mdp3_put_img(struct mdp3_img_data *data, int client) fdput(data->srcp_f); memset(&data->srcp_f, 0, sizeof(struct fd)); } else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { pr_debug("ion hdl = %pK buf=0x%pa\n", data->srcp_dma_buf, &data->addr); pr_debug("ion hdl = %pK buf=0x%pa domain = %d\n", data->srcp_dma_buf, &data->addr, dom); if (!iclient) { pr_err("invalid ion client\n"); return -ENOMEM; Loading Loading @@ -1876,15 +1889,69 @@ int mdp3_put_img(struct mdp3_img_data *data, int client) return 0; } int mdp3_map_layer(struct mdp3_img_data *data, int client) { int ret = 0; int dom = mdp3_get_domain(data->flags); if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->tab_clone, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); } else { ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->srcp_table, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); } if (IS_ERR_VALUE(ret)) { pr_err("smmu map dma buf failed: (%d)\n", ret); goto err_unmap; } data->mapped = true; if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { data->addr += data->tab_clone->sgl->length; data->len -= data->tab_clone->sgl->length; } if (!ret && (data->offset < data->len)) { data->addr += data->offset; data->len -= data->offset; pr_debug("ihdl=%pK buf=0x%pa len=0x%lx domain = %d\n", data->srcp_dma_buf, &data->addr, data->len, dom); } else { mdp3_put_img(data, client); return -EINVAL; } return ret; err_unmap: dma_buf_unmap_attachment(data->srcp_attachment, data->srcp_table, mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL)); dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment); dma_buf_put(data->srcp_dma_buf); if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { vfree(data->tab_clone->sgl); kfree(data->tab_clone); } return ret; } int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) { struct fd f; int ret = -EINVAL; int ret = 0; int fb_num; struct ion_client *iclient = mdp3_res->ion_client; int dom = (mdp3_res->domains + MDP3_IOMMU_DOMAIN_UNSECURE)->domain_idx; int dom = mdp3_get_domain(data->flags); data->flags = img->flags; data->flags |= img->flags; data->offset = img->offset; if (img->flags & MDP_MEMORY_ID_TYPE_FB) { f = fdget(img->memory_id); Loading Loading @@ -1956,10 +2023,10 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) ret = PTR_ERR(data->tab_clone); goto clone_err; } ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->tab_clone, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); data->mapped = false; data->skip_detach = false; return ret; } else if (client == MDP3_CLIENT_SPI) { void *vaddr; Loading @@ -1979,25 +2046,10 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) data->addr = (dma_addr_t) vaddr; data->len -= img->offset; return 0; } else { ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->srcp_table, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); } if (IS_ERR_VALUE(ret)) { pr_err("smmu map dma buf failed: (%d)\n", ret); goto err_unmap; } data->mapped = true; data->skip_detach = false; } done: if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { data->addr += data->tab_clone->sgl->length; data->len -= data->tab_clone->sgl->length; } if (!ret && (img->offset < data->len)) { data->addr += img->offset; data->len -= img->offset; Loading @@ -2020,18 +2072,6 @@ err_detach: err_put: dma_buf_put(data->srcp_dma_buf); return ret; err_unmap: dma_buf_unmap_attachment(data->srcp_attachment, data->srcp_table, mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL)); dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment); dma_buf_put(data->srcp_dma_buf); if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { vfree(data->tab_clone->sgl); kfree(data->tab_clone); } return ret; } int mdp3_iommu_enable(int client) Loading drivers/video/msm/mdss/mdp3.h +1 −0 Original line number Diff line number Diff line Loading @@ -257,6 +257,7 @@ int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); int mdp3_put_img(struct mdp3_img_data *data, int client); int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client); int mdp3_map_layer(struct mdp3_img_data *data, int client); int mdp3_iommu_enable(int client); int mdp3_iommu_disable(int client); int mdp3_iommu_is_attached(void); Loading Loading
drivers/video/msm/mdss/mdp3.c +78 −38 Original line number Diff line number Diff line Loading @@ -163,6 +163,18 @@ void mdss_spi_panel_bl_ctrl_update(struct mdss_panel_data *pdata, u32 bl_level) } #endif static int mdp3_get_domain(u32 flags) { int domain; if (flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) domain = MDSS_IOMMU_DOMAIN_SECURE; else domain = MDSS_IOMMU_DOMAIN_UNSECURE; return domain; } static irqreturn_t mdp3_irq_handler(int irq, void *ptr) { int i = 0; Loading Loading @@ -1829,7 +1841,7 @@ out: int mdp3_put_img(struct mdp3_img_data *data, int client) { struct ion_client *iclient = mdp3_res->ion_client; int dom = (mdp3_res->domains + MDP3_IOMMU_DOMAIN_UNSECURE)->domain_idx; int dom = mdp3_get_domain(data->flags); int dir = DMA_BIDIRECTIONAL; if (data->flags & MDP_MEMORY_ID_TYPE_FB) { Loading @@ -1837,8 +1849,9 @@ int mdp3_put_img(struct mdp3_img_data *data, int client) fdput(data->srcp_f); memset(&data->srcp_f, 0, sizeof(struct fd)); } else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { pr_debug("ion hdl = %pK buf=0x%pa\n", data->srcp_dma_buf, &data->addr); pr_debug("ion hdl = %pK buf=0x%pa domain = %d\n", data->srcp_dma_buf, &data->addr, dom); if (!iclient) { pr_err("invalid ion client\n"); return -ENOMEM; Loading Loading @@ -1876,15 +1889,69 @@ int mdp3_put_img(struct mdp3_img_data *data, int client) return 0; } int mdp3_map_layer(struct mdp3_img_data *data, int client) { int ret = 0; int dom = mdp3_get_domain(data->flags); if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->tab_clone, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); } else { ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->srcp_table, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); } if (IS_ERR_VALUE(ret)) { pr_err("smmu map dma buf failed: (%d)\n", ret); goto err_unmap; } data->mapped = true; if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { data->addr += data->tab_clone->sgl->length; data->len -= data->tab_clone->sgl->length; } if (!ret && (data->offset < data->len)) { data->addr += data->offset; data->len -= data->offset; pr_debug("ihdl=%pK buf=0x%pa len=0x%lx domain = %d\n", data->srcp_dma_buf, &data->addr, data->len, dom); } else { mdp3_put_img(data, client); return -EINVAL; } return ret; err_unmap: dma_buf_unmap_attachment(data->srcp_attachment, data->srcp_table, mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL)); dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment); dma_buf_put(data->srcp_dma_buf); if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { vfree(data->tab_clone->sgl); kfree(data->tab_clone); } return ret; } int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) { struct fd f; int ret = -EINVAL; int ret = 0; int fb_num; struct ion_client *iclient = mdp3_res->ion_client; int dom = (mdp3_res->domains + MDP3_IOMMU_DOMAIN_UNSECURE)->domain_idx; int dom = mdp3_get_domain(data->flags); data->flags = img->flags; data->flags |= img->flags; data->offset = img->offset; if (img->flags & MDP_MEMORY_ID_TYPE_FB) { f = fdget(img->memory_id); Loading Loading @@ -1956,10 +2023,10 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) ret = PTR_ERR(data->tab_clone); goto clone_err; } ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->tab_clone, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); data->mapped = false; data->skip_detach = false; return ret; } else if (client == MDP3_CLIENT_SPI) { void *vaddr; Loading @@ -1979,25 +2046,10 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) data->addr = (dma_addr_t) vaddr; data->len -= img->offset; return 0; } else { ret = mdss_smmu_map_dma_buf(data->srcp_dma_buf, data->srcp_table, dom, &data->addr, &data->len, DMA_BIDIRECTIONAL); } if (IS_ERR_VALUE(ret)) { pr_err("smmu map dma buf failed: (%d)\n", ret); goto err_unmap; } data->mapped = true; data->skip_detach = false; } done: if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { data->addr += data->tab_clone->sgl->length; data->len -= data->tab_clone->sgl->length; } if (!ret && (img->offset < data->len)) { data->addr += img->offset; data->len -= img->offset; Loading @@ -2020,18 +2072,6 @@ err_detach: err_put: dma_buf_put(data->srcp_dma_buf); return ret; err_unmap: dma_buf_unmap_attachment(data->srcp_attachment, data->srcp_table, mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL)); dma_buf_detach(data->srcp_dma_buf, data->srcp_attachment); dma_buf_put(data->srcp_dma_buf); if (client == MDP3_CLIENT_PPP || client == MDP3_CLIENT_DMA_P) { vfree(data->tab_clone->sgl); kfree(data->tab_clone); } return ret; } int mdp3_iommu_enable(int client) Loading
drivers/video/msm/mdss/mdp3.h +1 −0 Original line number Diff line number Diff line Loading @@ -257,6 +257,7 @@ int mdp3_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota); int mdp3_put_img(struct mdp3_img_data *data, int client); int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client); int mdp3_map_layer(struct mdp3_img_data *data, int client); int mdp3_iommu_enable(int client); int mdp3_iommu_disable(int client); int mdp3_iommu_is_attached(void); Loading