Lines Matching refs:wa
63 static void ccp_sg_free(struct ccp_sg_workarea *wa) in ccp_sg_free() argument
65 if (wa->dma_count) in ccp_sg_free()
66 dma_unmap_sg(wa->dma_dev, wa->dma_sg, wa->nents, wa->dma_dir); in ccp_sg_free()
68 wa->dma_count = 0; in ccp_sg_free()
71 static int ccp_init_sg_workarea(struct ccp_sg_workarea *wa, struct device *dev, in ccp_init_sg_workarea() argument
75 memset(wa, 0, sizeof(*wa)); in ccp_init_sg_workarea()
77 wa->sg = sg; in ccp_init_sg_workarea()
81 wa->nents = sg_nents_for_len(sg, len); in ccp_init_sg_workarea()
82 if (wa->nents < 0) in ccp_init_sg_workarea()
83 return wa->nents; in ccp_init_sg_workarea()
85 wa->bytes_left = len; in ccp_init_sg_workarea()
86 wa->sg_used = 0; in ccp_init_sg_workarea()
94 wa->dma_sg = sg; in ccp_init_sg_workarea()
95 wa->dma_dev = dev; in ccp_init_sg_workarea()
96 wa->dma_dir = dma_dir; in ccp_init_sg_workarea()
97 wa->dma_count = dma_map_sg(dev, sg, wa->nents, dma_dir); in ccp_init_sg_workarea()
98 if (!wa->dma_count) in ccp_init_sg_workarea()
104 static void ccp_update_sg_workarea(struct ccp_sg_workarea *wa, unsigned int len) in ccp_update_sg_workarea() argument
106 unsigned int nbytes = min_t(u64, len, wa->bytes_left); in ccp_update_sg_workarea()
108 if (!wa->sg) in ccp_update_sg_workarea()
111 wa->sg_used += nbytes; in ccp_update_sg_workarea()
112 wa->bytes_left -= nbytes; in ccp_update_sg_workarea()
113 if (wa->sg_used == wa->sg->length) { in ccp_update_sg_workarea()
114 wa->sg = sg_next(wa->sg); in ccp_update_sg_workarea()
115 wa->sg_used = 0; in ccp_update_sg_workarea()
119 static void ccp_dm_free(struct ccp_dm_workarea *wa) in ccp_dm_free() argument
121 if (wa->length <= CCP_DMAPOOL_MAX_SIZE) { in ccp_dm_free()
122 if (wa->address) in ccp_dm_free()
123 dma_pool_free(wa->dma_pool, wa->address, in ccp_dm_free()
124 wa->dma.address); in ccp_dm_free()
126 if (wa->dma.address) in ccp_dm_free()
127 dma_unmap_single(wa->dev, wa->dma.address, wa->length, in ccp_dm_free()
128 wa->dma.dir); in ccp_dm_free()
129 kfree(wa->address); in ccp_dm_free()
132 wa->address = NULL; in ccp_dm_free()
133 wa->dma.address = 0; in ccp_dm_free()
136 static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa, in ccp_init_dm_workarea() argument
141 memset(wa, 0, sizeof(*wa)); in ccp_init_dm_workarea()
146 wa->dev = cmd_q->ccp->dev; in ccp_init_dm_workarea()
147 wa->length = len; in ccp_init_dm_workarea()
150 wa->dma_pool = cmd_q->dma_pool; in ccp_init_dm_workarea()
152 wa->address = dma_pool_zalloc(wa->dma_pool, GFP_KERNEL, in ccp_init_dm_workarea()
153 &wa->dma.address); in ccp_init_dm_workarea()
154 if (!wa->address) in ccp_init_dm_workarea()
157 wa->dma.length = CCP_DMAPOOL_MAX_SIZE; in ccp_init_dm_workarea()
160 wa->address = kzalloc(len, GFP_KERNEL); in ccp_init_dm_workarea()
161 if (!wa->address) in ccp_init_dm_workarea()
164 wa->dma.address = dma_map_single(wa->dev, wa->address, len, in ccp_init_dm_workarea()
166 if (dma_mapping_error(wa->dev, wa->dma.address)) in ccp_init_dm_workarea()
169 wa->dma.length = len; in ccp_init_dm_workarea()
171 wa->dma.dir = dir; in ccp_init_dm_workarea()
176 static int ccp_set_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset, in ccp_set_dm_area() argument
180 WARN_ON(!wa->address); in ccp_set_dm_area()
182 if (len > (wa->length - wa_offset)) in ccp_set_dm_area()
185 scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len, in ccp_set_dm_area()
190 static void ccp_get_dm_area(struct ccp_dm_workarea *wa, unsigned int wa_offset, in ccp_get_dm_area() argument
194 WARN_ON(!wa->address); in ccp_get_dm_area()
196 scatterwalk_map_and_copy(wa->address + wa_offset, sg, sg_offset, len, in ccp_get_dm_area()
200 static int ccp_reverse_set_dm_area(struct ccp_dm_workarea *wa, in ccp_reverse_set_dm_area() argument
209 rc = ccp_set_dm_area(wa, wa_offset, sg, sg_offset, len); in ccp_reverse_set_dm_area()
213 p = wa->address + wa_offset; in ccp_reverse_set_dm_area()
225 static void ccp_reverse_get_dm_area(struct ccp_dm_workarea *wa, in ccp_reverse_get_dm_area() argument
233 p = wa->address + wa_offset; in ccp_reverse_get_dm_area()
243 ccp_get_dm_area(wa, wa_offset, sg, sg_offset, len); in ccp_reverse_get_dm_area()
411 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_to_from_sb() argument
427 op.dst.u.dma.address = wa->dma.address; in ccp_copy_to_from_sb()
428 op.dst.u.dma.length = wa->length; in ccp_copy_to_from_sb()
431 op.src.u.dma.address = wa->dma.address; in ccp_copy_to_from_sb()
432 op.src.u.dma.length = wa->length; in ccp_copy_to_from_sb()
443 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_to_sb() argument
446 return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, false); in ccp_copy_to_sb()
450 struct ccp_dm_workarea *wa, u32 jobid, u32 sb, in ccp_copy_from_sb() argument
453 return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, true); in ccp_copy_from_sb()