1/* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2/* 3 * Copyright 2011 Red Hat Inc. 4 * Copyright �� 2022 Intel Corporation 5 */ 6#ifndef _DRM_SUBALLOC_H_ 7#define _DRM_SUBALLOC_H_ 8 9#include <drm/drm_mm.h> 10 11#include <linux/dma-fence.h> 12#include <linux/types.h> 13 14#define DRM_SUBALLOC_MAX_QUEUES 32 15/** 16 * struct drm_suballoc_manager - fenced range allocations 17 * @wq: Wait queue for sleeping allocations on contention. 18 * @hole: Pointer to first hole node. 19 * @olist: List of allocated ranges. 20 * @flist: Array[fence context hash] of queues of fenced allocated ranges. 21 * @size: Size of the managed range. 22 * @align: Default alignment for the managed range. 23 */ 24struct drm_suballoc_manager { 25 wait_queue_head_t wq; 26 struct list_head *hole; 27 struct list_head olist; 28 struct list_head flist[DRM_SUBALLOC_MAX_QUEUES]; 29 size_t size; 30 size_t align; 31}; 32 33/** 34 * struct drm_suballoc - Sub-allocated range 35 * @olist: List link for list of allocated ranges. 36 * @flist: List linkk for the manager fenced allocated ranges queues. 37 * @manager: The drm_suballoc_manager. 38 * @soffset: Start offset. 39 * @eoffset: End offset + 1 so that @eoffset - @soffset = size. 40 * @dma_fence: The fence protecting the allocation. 41 */ 42struct drm_suballoc { 43 struct list_head olist; 44 struct list_head flist; 45 struct drm_suballoc_manager *manager; 46 size_t soffset; 47 size_t eoffset; 48 struct dma_fence *fence; 49}; 50 51void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager, 52 size_t size, size_t align); 53 54void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager); 55 56struct drm_suballoc * 57drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size, 58 gfp_t gfp, bool intr, size_t align); 59 60void drm_suballoc_free(struct drm_suballoc *sa, struct dma_fence *fence); 61 62/** 63 * drm_suballoc_soffset - Range start. 64 * @sa: The struct drm_suballoc. 65 * 66 * Return: The start of the allocated range. 67 */ 68static inline size_t drm_suballoc_soffset(struct drm_suballoc *sa) 69{ 70 return sa->soffset; 71} 72 73/** 74 * drm_suballoc_eoffset - Range end. 75 * @sa: The struct drm_suballoc. 76 * 77 * Return: The end of the allocated range + 1. 78 */ 79static inline size_t drm_suballoc_eoffset(struct drm_suballoc *sa) 80{ 81 return sa->eoffset; 82} 83 84/** 85 * drm_suballoc_size - Range size. 86 * @sa: The struct drm_suballoc. 87 * 88 * Return: The size of the allocated range. 89 */ 90static inline size_t drm_suballoc_size(struct drm_suballoc *sa) 91{ 92 return sa->eoffset - sa->soffset; 93} 94 95#ifdef CONFIG_DEBUG_FS 96void drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager, 97 struct drm_printer *p, 98 unsigned long long suballoc_base); 99#else 100static inline void 101drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager, 102 struct drm_printer *p, 103 unsigned long long suballoc_base) 104{ } 105 106#endif 107 108#endif /* _DRM_SUBALLOC_H_ */ 109