if (!bo) {
drm_err(drm, "no bo for sa manager\n"); return;
}
drm_suballoc_manager_fini(&sa_manager->base);
if (sa_manager->is_iomem)
kvfree(sa_manager->cpu_ptr);
sa_manager->bo = NULL;
}
/** * __xe_sa_bo_manager_init() - Create and initialize the suballocator * @tile: the &xe_tile where allocate * @size: number of bytes to allocate * @guard: number of bytes to exclude from suballocations * @align: alignment for each suballocated chunk * * Prepares the suballocation manager for suballocations. * * Return: a pointer to the &xe_sa_manager or an ERR_PTR on failure.
*/ struct xe_sa_manager *__xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32 guard, u32 align)
{ struct xe_device *xe = tile_to_xe(tile); struct xe_sa_manager *sa_manager;
u32 managed_size; struct xe_bo *bo; int ret;
drm_suballoc_manager_init(&sa_manager->base, managed_size, align);
ret = drmm_add_action_or_reset(&xe->drm, xe_sa_bo_manager_fini,
sa_manager); if (ret) return ERR_PTR(ret);
return sa_manager;
}
/** * __xe_sa_bo_new() - Make a suballocation but use custom gfp flags. * @sa_manager: the &xe_sa_manager * @size: number of bytes we want to suballocate * @gfp: gfp flags used for memory allocation. Typically GFP_KERNEL. * * Try to make a suballocation of size @size. * * Return: a &drm_suballoc, or an ERR_PTR.
*/ struct drm_suballoc *__xe_sa_bo_new(struct xe_sa_manager *sa_manager, u32 size, gfp_t gfp)
{ /* * BB to large, return -ENOBUFS indicating user should split * array of binds into smaller chunks.
*/ if (size > sa_manager->base.size) return ERR_PTR(-ENOBUFS);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.