File Index
Files and directories
Sign in
FILE

iova_domain.h

File preview with syntax highlighting.

linux-6.19.14/drivers/vdpa/vdpa_user/iova_domain.h C
 1/* SPDX-License-Identifier: GPL-2.0-only */
 2/*
 3 * MMU-based software IOTLB.
 4 *
 5 * Copyright (C) 2020-2021 Bytedance Inc. and/or its affiliates. All rights reserved.
 6 *
 7 * Author: Xie Yongji <xieyongji@bytedance.com>
 8 *
 9 */
10
11#ifndef _VDUSE_IOVA_DOMAIN_H
12#define _VDUSE_IOVA_DOMAIN_H
13
14#include <linux/iova.h>
15#include <linux/dma-mapping.h>
16#include <linux/vhost_iotlb.h>
17
18#define IOVA_START_PFN 1
19
20#define BOUNCE_MAP_SHIFT	12
21#define BOUNCE_MAP_SIZE	(1 << BOUNCE_MAP_SHIFT)
22#define BOUNCE_MAP_MASK	(~(BOUNCE_MAP_SIZE - 1))
23#define BOUNCE_MAP_ALIGN(addr)	(((addr) + BOUNCE_MAP_SIZE - 1) & ~(BOUNCE_MAP_SIZE - 1))
24
25struct vduse_bounce_map {
26	struct page *bounce_page;
27	struct page *user_bounce_page;
28	u64 orig_phys;
29};
30
31struct vduse_iova_domain {
32	struct iova_domain stream_iovad;
33	struct iova_domain consistent_iovad;
34	struct vduse_bounce_map *bounce_maps;
35	size_t bounce_size;
36	unsigned long iova_limit;
37	int bounce_map;
38	struct vhost_iotlb *iotlb;
39	spinlock_t iotlb_lock;
40	struct file *file;
41	bool user_bounce_pages;
42	rwlock_t bounce_lock;
43};
44
45int vduse_domain_set_map(struct vduse_iova_domain *domain,
46			 struct vhost_iotlb *iotlb);
47
48void vduse_domain_clear_map(struct vduse_iova_domain *domain,
49			    struct vhost_iotlb *iotlb);
50
51void vduse_domain_sync_single_for_device(struct vduse_iova_domain *domain,
52				      dma_addr_t dma_addr, size_t size,
53				      enum dma_data_direction dir);
54
55void vduse_domain_sync_single_for_cpu(struct vduse_iova_domain *domain,
56				      dma_addr_t dma_addr, size_t size,
57				      enum dma_data_direction dir);
58
59dma_addr_t vduse_domain_map_page(struct vduse_iova_domain *domain,
60				 struct page *page, unsigned long offset,
61				 size_t size, enum dma_data_direction dir,
62				 unsigned long attrs);
63
64void vduse_domain_unmap_page(struct vduse_iova_domain *domain,
65			     dma_addr_t dma_addr, size_t size,
66			     enum dma_data_direction dir, unsigned long attrs);
67
68void *vduse_domain_alloc_coherent(struct vduse_iova_domain *domain,
69				  size_t size, dma_addr_t *dma_addr,
70				  gfp_t flag);
71
72void vduse_domain_free_coherent(struct vduse_iova_domain *domain, size_t size,
73				void *vaddr, dma_addr_t dma_addr,
74				unsigned long attrs);
75
76void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain);
77
78int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain,
79				       struct page **pages, int count);
80
81void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domain);
82
83void vduse_domain_destroy(struct vduse_iova_domain *domain);
84
85struct vduse_iova_domain *vduse_domain_create(unsigned long iova_limit,
86					      size_t bounce_size);
87
88int vduse_domain_init(void);
89
90void vduse_domain_exit(void);
91
92#endif /* _VDUSE_IOVA_DOMAIN_H */
~/ Read-only file preview.