xref: /freebsd/sys/xen/gnttab.h (revision 920ba15bf993776c4fbe5808f94e2384a52c56f2)
130d1eefeSKip Macy /******************************************************************************
230d1eefeSKip Macy  * gnttab.h
330d1eefeSKip Macy  *
430d1eefeSKip Macy  * Two sets of functionality:
530d1eefeSKip Macy  * 1. Granting foreign access to our memory reservation.
630d1eefeSKip Macy  * 2. Accessing others' memory reservations via grant references.
730d1eefeSKip Macy  * (i.e., mechanisms for both sender and recipient of grant references)
830d1eefeSKip Macy  *
930d1eefeSKip Macy  * Copyright (c) 2004-2005, K A Fraser
1030d1eefeSKip Macy  * Copyright (c) 2005, Christopher Clark
1130d1eefeSKip Macy  *
1230d1eefeSKip Macy  * This program is free software; you can redistribute it and/or
1330d1eefeSKip Macy  * modify it under the terms of the GNU General Public License version 2
1430d1eefeSKip Macy  * as published by the Free Software Foundation; or, when distributed
1530d1eefeSKip Macy  * separately from the Linux kernel or incorporated into other
1630d1eefeSKip Macy  * software packages, subject to the following license:
1730d1eefeSKip Macy  *
1830d1eefeSKip Macy  * Permission is hereby granted, free of charge, to any person obtaining a copy
1930d1eefeSKip Macy  * of this source file (the "Software"), to deal in the Software without
2030d1eefeSKip Macy  * restriction, including without limitation the rights to use, copy, modify,
2130d1eefeSKip Macy  * merge, publish, distribute, sublicense, and/or sell copies of the Software,
2230d1eefeSKip Macy  * and to permit persons to whom the Software is furnished to do so, subject to
2330d1eefeSKip Macy  * the following conditions:
2430d1eefeSKip Macy  *
2530d1eefeSKip Macy  * The above copyright notice and this permission notice shall be included in
2630d1eefeSKip Macy  * all copies or substantial portions of the Software.
2730d1eefeSKip Macy  *
2830d1eefeSKip Macy  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2930d1eefeSKip Macy  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3030d1eefeSKip Macy  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3130d1eefeSKip Macy  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3230d1eefeSKip Macy  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3330d1eefeSKip Macy  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
3430d1eefeSKip Macy  * IN THE SOFTWARE.
3530d1eefeSKip Macy  */
3630d1eefeSKip Macy 
3730d1eefeSKip Macy #ifndef __ASM_GNTTAB_H__
3830d1eefeSKip Macy 
3930d1eefeSKip Macy #include <machine/xen/hypervisor.h>
4030d1eefeSKip Macy #include <xen/interface/grant_table.h>
4130d1eefeSKip Macy #include <machine/xen/xen-os.h>
4230d1eefeSKip Macy #include <machine/xen/hypervisor.h>
4330d1eefeSKip Macy #include <machine/xen/features.h>
4430d1eefeSKip Macy 
4530d1eefeSKip Macy struct gnttab_free_callback {
4630d1eefeSKip Macy 	struct gnttab_free_callback *next;
4730d1eefeSKip Macy 	void (*fn)(void *);
4830d1eefeSKip Macy 	void *arg;
4930d1eefeSKip Macy 	uint16_t count;
5030d1eefeSKip Macy };
5130d1eefeSKip Macy 
5230d1eefeSKip Macy int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
53a972cc52SKip Macy 				int flags);
5430d1eefeSKip Macy 
5530d1eefeSKip Macy /*
5630d1eefeSKip Macy  * End access through the given grant reference, iff the grant entry is no
5730d1eefeSKip Macy  * longer in use.  Return 1 if the grant entry was freed, 0 if it is still in
5830d1eefeSKip Macy  * use.
5930d1eefeSKip Macy  */
60a972cc52SKip Macy int gnttab_end_foreign_access_ref(grant_ref_t ref);
6130d1eefeSKip Macy 
6230d1eefeSKip Macy /*
6330d1eefeSKip Macy  * Eventually end access through the given grant reference, and once that
6430d1eefeSKip Macy  * access has been ended, free the given page too.  Access will be ended
6530d1eefeSKip Macy  * immediately iff the grant entry is not in use, otherwise it will happen
6630d1eefeSKip Macy  * some time later.  page may be 0, in which case no freeing will occur.
6730d1eefeSKip Macy  */
68920ba15bSKip Macy void gnttab_end_foreign_access(grant_ref_t ref, void *page);
6930d1eefeSKip Macy 
7030d1eefeSKip Macy int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn);
7130d1eefeSKip Macy 
7230d1eefeSKip Macy unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref);
7330d1eefeSKip Macy unsigned long gnttab_end_foreign_transfer(grant_ref_t ref);
7430d1eefeSKip Macy 
7530d1eefeSKip Macy int gnttab_query_foreign_access(grant_ref_t ref);
7630d1eefeSKip Macy 
7730d1eefeSKip Macy /*
7830d1eefeSKip Macy  * operations on reserved batches of grant references
7930d1eefeSKip Macy  */
8030d1eefeSKip Macy int gnttab_alloc_grant_references(uint16_t count, grant_ref_t *pprivate_head);
8130d1eefeSKip Macy 
8230d1eefeSKip Macy void gnttab_free_grant_reference(grant_ref_t ref);
8330d1eefeSKip Macy 
8430d1eefeSKip Macy void gnttab_free_grant_references(grant_ref_t head);
8530d1eefeSKip Macy 
8630d1eefeSKip Macy int gnttab_empty_grant_references(const grant_ref_t *pprivate_head);
8730d1eefeSKip Macy 
8830d1eefeSKip Macy int gnttab_claim_grant_reference(grant_ref_t *pprivate_head);
8930d1eefeSKip Macy 
9030d1eefeSKip Macy void gnttab_release_grant_reference(grant_ref_t *private_head,
9130d1eefeSKip Macy 				    grant_ref_t release);
9230d1eefeSKip Macy 
9330d1eefeSKip Macy void gnttab_request_free_callback(struct gnttab_free_callback *callback,
9430d1eefeSKip Macy 				  void (*fn)(void *), void *arg, uint16_t count);
9530d1eefeSKip Macy void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
9630d1eefeSKip Macy 
9730d1eefeSKip Macy void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
98a972cc52SKip Macy 				     unsigned long frame, int flags);
9930d1eefeSKip Macy 
10030d1eefeSKip Macy void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
10130d1eefeSKip Macy 				       unsigned long pfn);
10230d1eefeSKip Macy 
10330d1eefeSKip Macy int gnttab_suspend(void);
10430d1eefeSKip Macy int gnttab_resume(void);
10530d1eefeSKip Macy 
10630d1eefeSKip Macy static inline void
10730d1eefeSKip Macy gnttab_set_map_op(struct gnttab_map_grant_ref *map, vm_paddr_t addr,
10830d1eefeSKip Macy 		  uint32_t flags, grant_ref_t ref, domid_t domid)
10930d1eefeSKip Macy {
11030d1eefeSKip Macy 	if (flags & GNTMAP_contains_pte)
11130d1eefeSKip Macy 		map->host_addr = addr;
11230d1eefeSKip Macy 	else if (xen_feature(XENFEAT_auto_translated_physmap))
11330d1eefeSKip Macy 		map->host_addr = vtophys(addr);
11430d1eefeSKip Macy 	else
11530d1eefeSKip Macy 		map->host_addr = addr;
11630d1eefeSKip Macy 
11730d1eefeSKip Macy 	map->flags = flags;
11830d1eefeSKip Macy 	map->ref = ref;
11930d1eefeSKip Macy 	map->dom = domid;
12030d1eefeSKip Macy }
12130d1eefeSKip Macy 
12230d1eefeSKip Macy static inline void
12330d1eefeSKip Macy gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, vm_paddr_t addr,
12430d1eefeSKip Macy 		    uint32_t flags, grant_handle_t handle)
12530d1eefeSKip Macy {
12630d1eefeSKip Macy 	if (flags & GNTMAP_contains_pte)
12730d1eefeSKip Macy 		unmap->host_addr = addr;
12830d1eefeSKip Macy 	else if (xen_feature(XENFEAT_auto_translated_physmap))
12930d1eefeSKip Macy 		unmap->host_addr = vtophys(addr);
13030d1eefeSKip Macy 	else
13130d1eefeSKip Macy 		unmap->host_addr = addr;
13230d1eefeSKip Macy 
13330d1eefeSKip Macy 	unmap->handle = handle;
13430d1eefeSKip Macy 	unmap->dev_bus_addr = 0;
13530d1eefeSKip Macy }
13630d1eefeSKip Macy 
137a972cc52SKip Macy static inline void
138920ba15bSKip Macy gnttab_set_replace_op(struct gnttab_unmap_and_replace *unmap, vm_paddr_t addr,
139920ba15bSKip Macy 		      vm_paddr_t new_addr, grant_handle_t handle)
140a972cc52SKip Macy {
141a972cc52SKip Macy 	if (xen_feature(XENFEAT_auto_translated_physmap)) {
142920ba15bSKip Macy 		unmap->host_addr = vtophys(addr);
143920ba15bSKip Macy 		unmap->new_addr = vtophys(new_addr);
144a972cc52SKip Macy 	} else {
145a972cc52SKip Macy 		unmap->host_addr = addr;
146a972cc52SKip Macy 		unmap->new_addr = new_addr;
147a972cc52SKip Macy 	}
148a972cc52SKip Macy 
149a972cc52SKip Macy 	unmap->handle = handle;
150a972cc52SKip Macy }
151a972cc52SKip Macy 
15230d1eefeSKip Macy #endif /* __ASM_GNTTAB_H__ */
153