diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c b/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c index fea2c774..126f9633 100644 --- a/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a_tegra.c | |||
@@ -80,19 +80,18 @@ static int gk20a_tegra_secure_page_alloc(struct platform_device *pdev) | |||
80 | return 0; | 80 | return 0; |
81 | } | 81 | } |
82 | 82 | ||
83 | static void gk20a_tegra_secure_destroy(struct platform_device *pdev, | 83 | static void gk20a_tegra_secure_destroy(struct gk20a *g, |
84 | struct gr_ctx_buffer_desc *desc) | 84 | struct gr_ctx_buffer_desc *desc) |
85 | { | 85 | { |
86 | if (desc->sgt) { | 86 | DEFINE_DMA_ATTRS(attrs); |
87 | gk20a_free_sgtable(&desc->sgt); | ||
88 | desc->sgt = NULL; | ||
89 | } | ||
90 | 87 | ||
91 | if (desc->iova) { | 88 | if (desc->mem.sgt) { |
92 | dma_free_attrs(&tegra_vpr_dev, desc->size, | 89 | phys_addr_t pa = sg_phys(desc->mem.sgt->sgl); |
93 | (void *)(uintptr_t)desc->iova, | 90 | dma_free_attrs(&tegra_vpr_dev, desc->mem.size, |
94 | desc->iova, &desc->attrs); | 91 | (void *)(uintptr_t)pa, |
95 | desc->iova = 0; | 92 | pa, &attrs); |
93 | gk20a_free_sgtable(&desc->mem.sgt); | ||
94 | desc->mem.sgt = NULL; | ||
96 | } | 95 | } |
97 | } | 96 | } |
98 | 97 | ||
@@ -116,9 +115,7 @@ static int gk20a_tegra_secure_alloc(struct platform_device *pdev, | |||
116 | if (dma_mapping_error(&tegra_vpr_dev, iova)) | 115 | if (dma_mapping_error(&tegra_vpr_dev, iova)) |
117 | return -ENOMEM; | 116 | return -ENOMEM; |
118 | 117 | ||
119 | desc->iova = iova; | 118 | desc->mem.size = size; |
120 | desc->size = size; | ||
121 | desc->attrs = attrs; | ||
122 | desc->destroy = gk20a_tegra_secure_destroy; | 119 | desc->destroy = gk20a_tegra_secure_destroy; |
123 | 120 | ||
124 | sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); | 121 | sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); |
@@ -136,16 +133,15 @@ static int gk20a_tegra_secure_alloc(struct platform_device *pdev, | |||
136 | /* This bypasses SMMU for VPR during gmmu_map. */ | 133 | /* This bypasses SMMU for VPR during gmmu_map. */ |
137 | sg_dma_address(sgt->sgl) = 0; | 134 | sg_dma_address(sgt->sgl) = 0; |
138 | 135 | ||
139 | desc->sgt = sgt; | 136 | desc->mem.sgt = sgt; |
140 | 137 | ||
141 | return err; | 138 | return err; |
142 | 139 | ||
143 | fail_sgt: | 140 | fail_sgt: |
144 | kfree(sgt); | 141 | kfree(sgt); |
145 | fail: | 142 | fail: |
146 | dma_free_attrs(&tegra_vpr_dev, desc->size, | 143 | dma_free_attrs(&tegra_vpr_dev, desc->mem.size, |
147 | (void *)(uintptr_t)&desc->iova, | 144 | (void *)(uintptr_t)iova, iova, &attrs); |
148 | desc->iova, &desc->attrs); | ||
149 | return err; | 145 | return err; |
150 | } | 146 | } |
151 | 147 | ||