Lines Matching defs:wa

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