1145eba1aSCai Huoqing /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2f48ad614SDennis Dalessandro /* 33d2a9d64SDennis Dalessandro * Copyright(c) 2020 Cornelis Networks, Inc. 4f48ad614SDennis Dalessandro * Copyright(c) 2016 Intel Corporation. 5f48ad614SDennis Dalessandro */ 6145eba1aSCai Huoqing 7f48ad614SDennis Dalessandro #ifndef _HFI1_MMU_RB_H 8f48ad614SDennis Dalessandro #define _HFI1_MMU_RB_H 9f48ad614SDennis Dalessandro 10f48ad614SDennis Dalessandro #include "hfi.h" 11f48ad614SDennis Dalessandro 12f48ad614SDennis Dalessandro struct mmu_rb_node { 13f48ad614SDennis Dalessandro unsigned long addr; 14f48ad614SDennis Dalessandro unsigned long len; 15f48ad614SDennis Dalessandro unsigned long __last; 16f48ad614SDennis Dalessandro struct rb_node node; 173d2a9d64SDennis Dalessandro struct mmu_rb_handler *handler; 1810345998SDean Luick struct list_head list; 19f48ad614SDennis Dalessandro }; 20f48ad614SDennis Dalessandro 21b85ced91SDean Luick /* 22b85ced91SDean Luick * NOTE: filter, insert, invalidate, and evict must not sleep. Only remove is 23b85ced91SDean Luick * allowed to sleep. 24b85ced91SDean Luick */ 25f48ad614SDennis Dalessandro struct mmu_rb_ops { 26862548daSIra Weiny bool (*filter)(struct mmu_rb_node *node, unsigned long addr, 27862548daSIra Weiny unsigned long len); 28e0b09ac5SDean Luick int (*insert)(void *ops_arg, struct mmu_rb_node *mnode); 29082b3532SDean Luick void (*remove)(void *ops_arg, struct mmu_rb_node *mnode); 30e0b09ac5SDean Luick int (*invalidate)(void *ops_arg, struct mmu_rb_node *node); 3110345998SDean Luick int (*evict)(void *ops_arg, struct mmu_rb_node *mnode, 3210345998SDean Luick void *evict_arg, bool *stop); 33f48ad614SDennis Dalessandro }; 34f48ad614SDennis Dalessandro 353d2a9d64SDennis Dalessandro struct mmu_rb_handler { 363d2a9d64SDennis Dalessandro struct mmu_notifier mn; 373d2a9d64SDennis Dalessandro struct rb_root_cached root; 383d2a9d64SDennis Dalessandro void *ops_arg; 393d2a9d64SDennis Dalessandro spinlock_t lock; /* protect the RB tree */ 403d2a9d64SDennis Dalessandro struct mmu_rb_ops *ops; 413d2a9d64SDennis Dalessandro struct list_head lru_list; 423d2a9d64SDennis Dalessandro struct work_struct del_work; 433d2a9d64SDennis Dalessandro struct list_head del_list; 443d2a9d64SDennis Dalessandro struct workqueue_struct *wq; 453d2a9d64SDennis Dalessandro }; 463d2a9d64SDennis Dalessandro 473d2a9d64SDennis Dalessandro int hfi1_mmu_rb_register(void *ops_arg, 48e0b09ac5SDean Luick struct mmu_rb_ops *ops, 49b85ced91SDean Luick struct workqueue_struct *wq, 50e0b09ac5SDean Luick struct mmu_rb_handler **handler); 51e0b09ac5SDean Luick void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler); 52e0b09ac5SDean Luick int hfi1_mmu_rb_insert(struct mmu_rb_handler *handler, 53e0b09ac5SDean Luick struct mmu_rb_node *mnode); 5410345998SDean Luick void hfi1_mmu_rb_evict(struct mmu_rb_handler *handler, void *evict_arg); 55*00cbce5cSPatrick Kelsey struct mmu_rb_node *hfi1_mmu_rb_get_first(struct mmu_rb_handler *handler, 56*00cbce5cSPatrick Kelsey unsigned long addr, 57*00cbce5cSPatrick Kelsey unsigned long len); 58f48ad614SDennis Dalessandro 59f48ad614SDennis Dalessandro #endif /* _HFI1_MMU_RB_H */ 60