Lines Matching refs:sgl

298 int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,  in genwqe_alloc_sync_sgl()  argument
304 sgl->fpage_offs = offset_in_page((unsigned long)user_addr); in genwqe_alloc_sync_sgl()
305 sgl->fpage_size = min_t(size_t, PAGE_SIZE-sgl->fpage_offs, user_size); in genwqe_alloc_sync_sgl()
306 sgl->nr_pages = DIV_ROUND_UP(sgl->fpage_offs + user_size, PAGE_SIZE); in genwqe_alloc_sync_sgl()
307 sgl->lpage_size = (user_size - sgl->fpage_size) % PAGE_SIZE; in genwqe_alloc_sync_sgl()
310 __func__, user_addr, user_size, sgl->nr_pages, in genwqe_alloc_sync_sgl()
311 sgl->fpage_offs, sgl->fpage_size, sgl->lpage_size); in genwqe_alloc_sync_sgl()
313 sgl->user_addr = user_addr; in genwqe_alloc_sync_sgl()
314 sgl->user_size = user_size; in genwqe_alloc_sync_sgl()
315 sgl->write = write; in genwqe_alloc_sync_sgl()
316 sgl->sgl_size = genwqe_sgl_size(sgl->nr_pages); in genwqe_alloc_sync_sgl()
318 if (get_order(sgl->sgl_size) > MAX_ORDER) { in genwqe_alloc_sync_sgl()
324 sgl->sgl = __genwqe_alloc_consistent(cd, sgl->sgl_size, in genwqe_alloc_sync_sgl()
325 &sgl->sgl_dma_addr); in genwqe_alloc_sync_sgl()
326 if (sgl->sgl == NULL) { in genwqe_alloc_sync_sgl()
333 if ((sgl->fpage_size != 0) && (sgl->fpage_size != PAGE_SIZE)) { in genwqe_alloc_sync_sgl()
334 sgl->fpage = __genwqe_alloc_consistent(cd, PAGE_SIZE, in genwqe_alloc_sync_sgl()
335 &sgl->fpage_dma_addr); in genwqe_alloc_sync_sgl()
336 if (sgl->fpage == NULL) in genwqe_alloc_sync_sgl()
340 if (copy_from_user(sgl->fpage + sgl->fpage_offs, in genwqe_alloc_sync_sgl()
341 user_addr, sgl->fpage_size)) { in genwqe_alloc_sync_sgl()
346 if (sgl->lpage_size != 0) { in genwqe_alloc_sync_sgl()
347 sgl->lpage = __genwqe_alloc_consistent(cd, PAGE_SIZE, in genwqe_alloc_sync_sgl()
348 &sgl->lpage_dma_addr); in genwqe_alloc_sync_sgl()
349 if (sgl->lpage == NULL) in genwqe_alloc_sync_sgl()
353 if (copy_from_user(sgl->lpage, user_addr + user_size - in genwqe_alloc_sync_sgl()
354 sgl->lpage_size, sgl->lpage_size)) { in genwqe_alloc_sync_sgl()
362 __genwqe_free_consistent(cd, PAGE_SIZE, sgl->lpage, in genwqe_alloc_sync_sgl()
363 sgl->lpage_dma_addr); in genwqe_alloc_sync_sgl()
364 sgl->lpage = NULL; in genwqe_alloc_sync_sgl()
365 sgl->lpage_dma_addr = 0; in genwqe_alloc_sync_sgl()
367 __genwqe_free_consistent(cd, PAGE_SIZE, sgl->fpage, in genwqe_alloc_sync_sgl()
368 sgl->fpage_dma_addr); in genwqe_alloc_sync_sgl()
369 sgl->fpage = NULL; in genwqe_alloc_sync_sgl()
370 sgl->fpage_dma_addr = 0; in genwqe_alloc_sync_sgl()
372 __genwqe_free_consistent(cd, sgl->sgl_size, sgl->sgl, in genwqe_alloc_sync_sgl()
373 sgl->sgl_dma_addr); in genwqe_alloc_sync_sgl()
374 sgl->sgl = NULL; in genwqe_alloc_sync_sgl()
375 sgl->sgl_dma_addr = 0; in genwqe_alloc_sync_sgl()
376 sgl->sgl_size = 0; in genwqe_alloc_sync_sgl()
380 int genwqe_setup_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, in genwqe_setup_sgl() argument
387 size_t size = sgl->user_size; in genwqe_setup_sgl()
390 map_offs = sgl->fpage_offs; /* offset in first page */ in genwqe_setup_sgl()
392 s = &sgl->sgl[0]; /* first set of 8 entries */ in genwqe_setup_sgl()
394 while (p < sgl->nr_pages) { in genwqe_setup_sgl()
400 s[j].target_addr = cpu_to_be64(sgl->sgl_dma_addr + dma_offs); in genwqe_setup_sgl()
409 if ((p == 0) && (sgl->fpage != NULL)) { in genwqe_setup_sgl()
410 daddr = sgl->fpage_dma_addr + map_offs; in genwqe_setup_sgl()
412 } else if ((p == sgl->nr_pages - 1) && in genwqe_setup_sgl()
413 (sgl->lpage != NULL)) { in genwqe_setup_sgl()
414 daddr = sgl->lpage_dma_addr; in genwqe_setup_sgl()
433 if (p == sgl->nr_pages) in genwqe_setup_sgl()
449 if (p == sgl->nr_pages) in genwqe_setup_sgl()
477 int genwqe_free_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl) in genwqe_free_sync_sgl() argument
484 if (sgl->fpage) { in genwqe_free_sync_sgl()
485 if (sgl->write) { in genwqe_free_sync_sgl()
486 res = copy_to_user(sgl->user_addr, in genwqe_free_sync_sgl()
487 sgl->fpage + sgl->fpage_offs, sgl->fpage_size); in genwqe_free_sync_sgl()
495 __genwqe_free_consistent(cd, PAGE_SIZE, sgl->fpage, in genwqe_free_sync_sgl()
496 sgl->fpage_dma_addr); in genwqe_free_sync_sgl()
497 sgl->fpage = NULL; in genwqe_free_sync_sgl()
498 sgl->fpage_dma_addr = 0; in genwqe_free_sync_sgl()
500 if (sgl->lpage) { in genwqe_free_sync_sgl()
501 if (sgl->write) { in genwqe_free_sync_sgl()
502 offset = sgl->user_size - sgl->lpage_size; in genwqe_free_sync_sgl()
503 res = copy_to_user(sgl->user_addr + offset, sgl->lpage, in genwqe_free_sync_sgl()
504 sgl->lpage_size); in genwqe_free_sync_sgl()
512 __genwqe_free_consistent(cd, PAGE_SIZE, sgl->lpage, in genwqe_free_sync_sgl()
513 sgl->lpage_dma_addr); in genwqe_free_sync_sgl()
514 sgl->lpage = NULL; in genwqe_free_sync_sgl()
515 sgl->lpage_dma_addr = 0; in genwqe_free_sync_sgl()
517 __genwqe_free_consistent(cd, sgl->sgl_size, sgl->sgl, in genwqe_free_sync_sgl()
518 sgl->sgl_dma_addr); in genwqe_free_sync_sgl()
520 sgl->sgl = NULL; in genwqe_free_sync_sgl()
521 sgl->sgl_dma_addr = 0x0; in genwqe_free_sync_sgl()
522 sgl->sgl_size = 0; in genwqe_free_sync_sgl()