11d314567SOleksandr Andrushchenko /* SPDX-License-Identifier: GPL-2.0 */ 21d314567SOleksandr Andrushchenko 31d314567SOleksandr Andrushchenko /* 41d314567SOleksandr Andrushchenko * Common functionality of grant device. 51d314567SOleksandr Andrushchenko * 61d314567SOleksandr Andrushchenko * Copyright (c) 2006-2007, D G Murray. 71d314567SOleksandr Andrushchenko * (c) 2009 Gerd Hoffmann <kraxel@redhat.com> 81d314567SOleksandr Andrushchenko * (c) 2018 Oleksandr Andrushchenko, EPAM Systems Inc. 91d314567SOleksandr Andrushchenko */ 101d314567SOleksandr Andrushchenko 111d314567SOleksandr Andrushchenko #ifndef _GNTDEV_COMMON_H 121d314567SOleksandr Andrushchenko #define _GNTDEV_COMMON_H 131d314567SOleksandr Andrushchenko 141d314567SOleksandr Andrushchenko #include <linux/mm.h> 151d314567SOleksandr Andrushchenko #include <linux/mman.h> 161d314567SOleksandr Andrushchenko #include <linux/mmu_notifier.h> 171d314567SOleksandr Andrushchenko #include <linux/types.h> 180102e4efSYan Yankovskyi #include <xen/interface/event_channel.h> 19dbe97cffSDemi Marie Obenour #include <xen/grant_table.h> 201d314567SOleksandr Andrushchenko 21932d6562SOleksandr Andrushchenko struct gntdev_dmabuf_priv; 22932d6562SOleksandr Andrushchenko 231d314567SOleksandr Andrushchenko struct gntdev_priv { 241d314567SOleksandr Andrushchenko /* Maps with visible offsets in the file descriptor. */ 251d314567SOleksandr Andrushchenko struct list_head maps; 261d314567SOleksandr Andrushchenko /* lock protects maps and freeable_maps. */ 271d314567SOleksandr Andrushchenko struct mutex lock; 281d314567SOleksandr Andrushchenko 291d314567SOleksandr Andrushchenko #ifdef CONFIG_XEN_GRANT_DMA_ALLOC 301d314567SOleksandr Andrushchenko /* Device for which DMA memory is allocated. */ 311d314567SOleksandr Andrushchenko struct device *dma_dev; 321d314567SOleksandr Andrushchenko #endif 33932d6562SOleksandr Andrushchenko 34932d6562SOleksandr Andrushchenko #ifdef CONFIG_XEN_GNTDEV_DMABUF 35932d6562SOleksandr Andrushchenko struct gntdev_dmabuf_priv *dmabuf_priv; 36932d6562SOleksandr Andrushchenko #endif 371d314567SOleksandr Andrushchenko }; 381d314567SOleksandr Andrushchenko 391d314567SOleksandr Andrushchenko struct gntdev_unmap_notify { 401d314567SOleksandr Andrushchenko int flags; 411d314567SOleksandr Andrushchenko /* Address relative to the start of the gntdev_grant_map. */ 421d314567SOleksandr Andrushchenko int addr; 430102e4efSYan Yankovskyi evtchn_port_t event; 441d314567SOleksandr Andrushchenko }; 451d314567SOleksandr Andrushchenko 461d314567SOleksandr Andrushchenko struct gntdev_grant_map { 47*5c13a4a0SM. Vefa Bicakci atomic_t in_use; 48d3eeb1d7SJason Gunthorpe struct mmu_interval_notifier notifier; 49*5c13a4a0SM. Vefa Bicakci bool notifier_init; 501d314567SOleksandr Andrushchenko struct list_head next; 511d314567SOleksandr Andrushchenko int index; 521d314567SOleksandr Andrushchenko int count; 531d314567SOleksandr Andrushchenko int flags; 541d314567SOleksandr Andrushchenko refcount_t users; 551d314567SOleksandr Andrushchenko struct gntdev_unmap_notify notify; 561d314567SOleksandr Andrushchenko struct ioctl_gntdev_grant_ref *grants; 571d314567SOleksandr Andrushchenko struct gnttab_map_grant_ref *map_ops; 581d314567SOleksandr Andrushchenko struct gnttab_unmap_grant_ref *unmap_ops; 591d314567SOleksandr Andrushchenko struct gnttab_map_grant_ref *kmap_ops; 601d314567SOleksandr Andrushchenko struct gnttab_unmap_grant_ref *kunmap_ops; 61dbe97cffSDemi Marie Obenour bool *being_removed; 621d314567SOleksandr Andrushchenko struct page **pages; 631d314567SOleksandr Andrushchenko unsigned long pages_vm_start; 641d314567SOleksandr Andrushchenko 651d314567SOleksandr Andrushchenko #ifdef CONFIG_XEN_GRANT_DMA_ALLOC 661d314567SOleksandr Andrushchenko /* 671d314567SOleksandr Andrushchenko * If dmabuf_vaddr is not NULL then this mapping is backed by DMA 681d314567SOleksandr Andrushchenko * capable memory. 691d314567SOleksandr Andrushchenko */ 701d314567SOleksandr Andrushchenko 711d314567SOleksandr Andrushchenko struct device *dma_dev; 721d314567SOleksandr Andrushchenko /* Flags used to create this DMA buffer: GNTDEV_DMA_FLAG_XXX. */ 731d314567SOleksandr Andrushchenko int dma_flags; 741d314567SOleksandr Andrushchenko void *dma_vaddr; 751d314567SOleksandr Andrushchenko dma_addr_t dma_bus_addr; 761d314567SOleksandr Andrushchenko /* Needed to avoid allocation in gnttab_dma_free_pages(). */ 771d314567SOleksandr Andrushchenko xen_pfn_t *frames; 781d314567SOleksandr Andrushchenko #endif 79dbe97cffSDemi Marie Obenour 80dbe97cffSDemi Marie Obenour /* Number of live grants */ 81dbe97cffSDemi Marie Obenour atomic_t live_grants; 82dbe97cffSDemi Marie Obenour /* Needed to avoid allocation in __unmap_grant_pages */ 83dbe97cffSDemi Marie Obenour struct gntab_unmap_queue_data unmap_data; 841d314567SOleksandr Andrushchenko }; 851d314567SOleksandr Andrushchenko 861d314567SOleksandr Andrushchenko struct gntdev_grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count, 871d314567SOleksandr Andrushchenko int dma_flags); 881d314567SOleksandr Andrushchenko 891d314567SOleksandr Andrushchenko void gntdev_add_map(struct gntdev_priv *priv, struct gntdev_grant_map *add); 901d314567SOleksandr Andrushchenko 911d314567SOleksandr Andrushchenko void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map); 921d314567SOleksandr Andrushchenko 933b06ac67SJuergen Gross bool gntdev_test_page_count(unsigned int count); 941d314567SOleksandr Andrushchenko 951d314567SOleksandr Andrushchenko int gntdev_map_grant_pages(struct gntdev_grant_map *map); 961d314567SOleksandr Andrushchenko 971d314567SOleksandr Andrushchenko #endif 98