Lines Matching refs: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()
185 wa->dma.length = len; in ccp_init_dm_workarea()
187 wa->dma.dir = dir; in ccp_init_dm_workarea()
192 static int ccp_set_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset, in ccp_set_dm_area() argument
196 WARN_ON(!wa->address); in ccp_set_dm_area()
198 if (len > (wa->length - wa_offset)) in ccp_set_dm_area()
201 scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len, in ccp_set_dm_area()
206 static void ccp_get_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset, in ccp_get_dm_area() argument
210 WARN_ON(!wa->address); in ccp_get_dm_area()
212 scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len, in ccp_get_dm_area()
216 static int ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa, in ccp_reverse_set_dm_area() argument
225 rc = ccp_set_dm_area(wa, wa_offset, sg, sg_offset, len); in ccp_reverse_set_dm_area()
229 p = wa->address + wa_offset; in ccp_reverse_set_dm_area()
241 static void ccp_reverse_get_dm_area(struct ccp_dm_workarea *wa, in ccp_reverse_get_dm_area() argument
249 p = wa->address + wa_offset; in ccp_reverse_get_dm_area()
259 ccp_get_dm_area(wa, wa_offset, sg, sg_offset, len); in ccp_reverse_get_dm_area()
427 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_to_from_sb() argument
443 op.dst.u.dma.address = wa->dma.address; in ccp_copy_to_from_sb()
444 op.dst.u.dma.length = wa->length; in ccp_copy_to_from_sb()
447 op.src.u.dma.address = wa->dma.address; in ccp_copy_to_from_sb()
448 op.src.u.dma.length = wa->length; in ccp_copy_to_from_sb()
459 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_to_sb() argument
462 return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, false); in ccp_copy_to_sb()
466 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_from_sb() argument
469 return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, true); in ccp_copy_from_sb()