1a1d2a633SQiang Yu /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2a1d2a633SQiang Yu /* Copyright 2017-2019 Qiang Yu <yuq825@gmail.com> */ 3a1d2a633SQiang Yu 4a1d2a633SQiang Yu #ifndef __LIMA_VM_H__ 5a1d2a633SQiang Yu #define __LIMA_VM_H__ 6a1d2a633SQiang Yu 7a1d2a633SQiang Yu #include <drm/drm_mm.h> 8a1d2a633SQiang Yu #include <linux/kref.h> 9a1d2a633SQiang Yu 10a1d2a633SQiang Yu #define LIMA_PAGE_SIZE 4096 11a1d2a633SQiang Yu #define LIMA_PAGE_MASK (LIMA_PAGE_SIZE - 1) 12a1d2a633SQiang Yu #define LIMA_PAGE_ENT_NUM (LIMA_PAGE_SIZE / sizeof(u32)) 13a1d2a633SQiang Yu 14a1d2a633SQiang Yu #define LIMA_VM_NUM_PT_PER_BT_SHIFT 3 15a1d2a633SQiang Yu #define LIMA_VM_NUM_PT_PER_BT (1 << LIMA_VM_NUM_PT_PER_BT_SHIFT) 16a1d2a633SQiang Yu #define LIMA_VM_NUM_BT (LIMA_PAGE_ENT_NUM >> LIMA_VM_NUM_PT_PER_BT_SHIFT) 17a1d2a633SQiang Yu 18adbb48bcSKrzysztof Kozlowski #define LIMA_VA_RESERVE_START 0x0FFF00000ULL 19a1d2a633SQiang Yu #define LIMA_VA_RESERVE_DLBU LIMA_VA_RESERVE_START 20adbb48bcSKrzysztof Kozlowski #define LIMA_VA_RESERVE_END 0x100000000ULL 21a1d2a633SQiang Yu 22a1d2a633SQiang Yu struct lima_device; 23a1d2a633SQiang Yu 24a1d2a633SQiang Yu struct lima_vm_page { 25a1d2a633SQiang Yu u32 *cpu; 26a1d2a633SQiang Yu dma_addr_t dma; 27a1d2a633SQiang Yu }; 28a1d2a633SQiang Yu 29a1d2a633SQiang Yu struct lima_vm { 30a1d2a633SQiang Yu struct mutex lock; 31a1d2a633SQiang Yu struct kref refcount; 32a1d2a633SQiang Yu 33a1d2a633SQiang Yu struct drm_mm mm; 34a1d2a633SQiang Yu 35a1d2a633SQiang Yu struct lima_device *dev; 36a1d2a633SQiang Yu 37a1d2a633SQiang Yu struct lima_vm_page pd; 38a1d2a633SQiang Yu struct lima_vm_page bts[LIMA_VM_NUM_BT]; 39a1d2a633SQiang Yu }; 40a1d2a633SQiang Yu 41a1d2a633SQiang Yu int lima_vm_bo_add(struct lima_vm *vm, struct lima_bo *bo, bool create); 42a1d2a633SQiang Yu void lima_vm_bo_del(struct lima_vm *vm, struct lima_bo *bo); 43a1d2a633SQiang Yu 44a1d2a633SQiang Yu u32 lima_vm_get_va(struct lima_vm *vm, struct lima_bo *bo); 45a1d2a633SQiang Yu 46a1d2a633SQiang Yu struct lima_vm *lima_vm_create(struct lima_device *dev); 47a1d2a633SQiang Yu void lima_vm_release(struct kref *kref); 48a1d2a633SQiang Yu lima_vm_get(struct lima_vm * vm)49a1d2a633SQiang Yustatic inline struct lima_vm *lima_vm_get(struct lima_vm *vm) 50a1d2a633SQiang Yu { 51a1d2a633SQiang Yu kref_get(&vm->refcount); 52a1d2a633SQiang Yu return vm; 53a1d2a633SQiang Yu } 54a1d2a633SQiang Yu lima_vm_put(struct lima_vm * vm)55a1d2a633SQiang Yustatic inline void lima_vm_put(struct lima_vm *vm) 56a1d2a633SQiang Yu { 57*24943269SQiang Yu if (vm) 58a1d2a633SQiang Yu kref_put(&vm->refcount, lima_vm_release); 59a1d2a633SQiang Yu } 60a1d2a633SQiang Yu 61a1d2a633SQiang Yu void lima_vm_print(struct lima_vm *vm); 62dc76cb7aSQiang Yu int lima_vm_map_bo(struct lima_vm *vm, struct lima_bo *bo, int pageoff); 63a1d2a633SQiang Yu 64a1d2a633SQiang Yu #endif 65