/** * sg_alloc_table - Allocate and initialize an sg table * @table: The sg table header to use * @nents: Number of entries in sg list * @gfp_mask: GFP allocation mask * * Description: * Allocate and initialize an sg table. If @nents@ is larger than * SG_MAX_SINGLE_ALLOC a chained sg table will be setup. * **/ int sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask) { int ret; ret = __sg_alloc_table(table, nents, SG_MAX_SINGLE_ALLOC, gfp_mask, sg_kmalloc); if (unlikely(ret)) __sg_free_table(table, SG_MAX_SINGLE_ALLOC, sg_kfree); return ret; }
struct sg_table *nvhost_nvmap_pin(struct mem_mgr *mgr, struct mem_handle *handle) { int err = 0; dma_addr_t ret = 0; struct sg_table *sgt = kmalloc(sizeof(*sgt) + sizeof(*sgt->sgl), GFP_KERNEL); if (!sgt) return ERR_PTR(-ENOMEM); err = __sg_alloc_table(sgt, 1, 1, (gfp_t)(sgt+1), sg_kmalloc); if (err) return ERR_PTR(err); ret = nvmap_pin((struct nvmap_client *)mgr, (struct nvmap_handle_ref *)handle); if (IS_ERR_VALUE(ret)) { kfree(sgt); return ERR_PTR(ret); } sg_dma_address(sgt->sgl) = ret; return sgt; }