xref: /openbmc/linux/drivers/xen/gntdev-common.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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