Lines Matching full:wa
64 static void ccp_sg_free(struct ccp_sg_workarea *wa) in ccp_sg_free() argument
66 if (wa->dma_count) in ccp_sg_free()
67 dma_unmap_sg(wa->dma_dev, wa->dma_sg_head, wa->nents, wa->dma_dir); in ccp_sg_free()
69 wa->dma_count = 0; in ccp_sg_free()
72 static int ccp_init_sg_workarea(struct ccp_sg_workarea *wa, struct device *dev, in ccp_init_sg_workarea() argument
76 memset(wa, 0, sizeof(*wa)); in ccp_init_sg_workarea()
78 wa->sg = sg; in ccp_init_sg_workarea()
82 wa->nents = sg_nents_for_len(sg, len); in ccp_init_sg_workarea()
83 if (wa->nents < 0) in ccp_init_sg_workarea()
84 return wa->nents; in ccp_init_sg_workarea()
86 wa->bytes_left = len; in ccp_init_sg_workarea()
87 wa->sg_used = 0; in ccp_init_sg_workarea()
95 wa->dma_sg = sg; in ccp_init_sg_workarea()
96 wa->dma_sg_head = sg; in ccp_init_sg_workarea()
97 wa->dma_dev = dev; in ccp_init_sg_workarea()
98 wa->dma_dir = dma_dir; in ccp_init_sg_workarea()
99 wa->dma_count = dma_map_sg(dev, sg, wa->nents, dma_dir); in ccp_init_sg_workarea()
100 if (!wa->dma_count) in ccp_init_sg_workarea()
106 static void ccp_update_sg_workarea(struct ccp_sg_workarea *wa, unsigned int len) in ccp_update_sg_workarea() argument
108 unsigned int nbytes = min_t(u64, len, wa->bytes_left); in ccp_update_sg_workarea()
111 if (!wa->sg) in ccp_update_sg_workarea()
114 wa->sg_used += nbytes; in ccp_update_sg_workarea()
115 wa->bytes_left -= nbytes; in ccp_update_sg_workarea()
116 if (wa->sg_used == sg_dma_len(wa->dma_sg)) { in ccp_update_sg_workarea()
118 wa->dma_sg = sg_next(wa->dma_sg); in ccp_update_sg_workarea()
127 sg_combined_len += wa->sg->length; in ccp_update_sg_workarea()
128 wa->sg = sg_next(wa->sg); in ccp_update_sg_workarea()
129 } while (wa->sg_used > sg_combined_len); in ccp_update_sg_workarea()
131 wa->sg_used = 0; in ccp_update_sg_workarea()
135 static void ccp_dm_free(struct ccp_dm_workarea *wa) in ccp_dm_free() argument
137 if (wa->length <= CCP_DMAPOOL_MAX_SIZE) { in ccp_dm_free()
138 if (wa->address) in ccp_dm_free()
139 dma_pool_free(wa->dma_pool, wa->address, in ccp_dm_free()
140 wa->dma.address); in ccp_dm_free()
142 if (wa->dma.address) in ccp_dm_free()
143 dma_unmap_single(wa->dev, wa->dma.address, wa->length, in ccp_dm_free()
144 wa->dma.dir); in ccp_dm_free()
145 kfree(wa->address); in ccp_dm_free()
148 wa->address = NULL; in ccp_dm_free()
149 wa->dma.address = 0; in ccp_dm_free()
152 static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa, in ccp_init_dm_workarea() argument
157 memset(wa, 0, sizeof(*wa)); in ccp_init_dm_workarea()
162 wa->dev = cmd_q->ccp->dev; in ccp_init_dm_workarea()
163 wa->length = len; in ccp_init_dm_workarea()
166 wa->dma_pool = cmd_q->dma_pool; in ccp_init_dm_workarea()
168 wa->address = dma_pool_zalloc(wa->dma_pool, GFP_KERNEL, in ccp_init_dm_workarea()
169 &wa->dma.address); in ccp_init_dm_workarea()
170 if (!wa->address) in ccp_init_dm_workarea()
173 wa->dma.length = CCP_DMAPOOL_MAX_SIZE; in ccp_init_dm_workarea()
176 wa->address = kzalloc(len, GFP_KERNEL); in ccp_init_dm_workarea()
177 if (!wa->address) in ccp_init_dm_workarea()
180 wa->dma.address = dma_map_single(wa->dev, wa->address, len, in ccp_init_dm_workarea()
182 if (dma_mapping_error(wa->dev, wa->dma.address)) { in ccp_init_dm_workarea()
183 kfree(wa->address); in ccp_init_dm_workarea()
184 wa->address = NULL; in ccp_init_dm_workarea()
188 wa->dma.length = len; in ccp_init_dm_workarea()
190 wa->dma.dir = dir; in ccp_init_dm_workarea()
195 static int ccp_set_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset, in ccp_set_dm_area() argument
199 WARN_ON(!wa->address); in ccp_set_dm_area()
201 if (len > (wa->length - wa_offset)) in ccp_set_dm_area()
204 scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len, in ccp_set_dm_area()
209 static void ccp_get_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset, in ccp_get_dm_area() argument
213 WARN_ON(!wa->address); in ccp_get_dm_area()
215 scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len, in ccp_get_dm_area()
219 static int ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa, in ccp_reverse_set_dm_area() argument
228 rc = ccp_set_dm_area(wa, wa_offset, sg, sg_offset, len); in ccp_reverse_set_dm_area()
232 p = wa->address + wa_offset; in ccp_reverse_set_dm_area()
244 static void ccp_reverse_get_dm_area(struct ccp_dm_workarea *wa, in ccp_reverse_get_dm_area() argument
252 p = wa->address + wa_offset; in ccp_reverse_get_dm_area()
262 ccp_get_dm_area(wa, wa_offset, sg, sg_offset, len); in ccp_reverse_get_dm_area()
430 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_to_from_sb() argument
446 op.dst.u.dma.address = wa->dma.address; in ccp_copy_to_from_sb()
447 op.dst.u.dma.length = wa->length; in ccp_copy_to_from_sb()
450 op.src.u.dma.address = wa->dma.address; in ccp_copy_to_from_sb()
451 op.src.u.dma.length = wa->length; in ccp_copy_to_from_sb()
462 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_to_sb() argument
465 return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, false); in ccp_copy_to_sb()
469 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_from_sb() argument
472 return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, true); in ccp_copy_from_sb()