xref: /freebsd/sys/dev/vmware/vmci/vmci_kernel_if.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
163a93856SMark Peek /*-
23eeb7511SMark Peek  * Copyright (c) 2018 VMware, Inc.
363a93856SMark Peek  *
48c302b2eSMark Peek  * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0)
563a93856SMark Peek  */
663a93856SMark Peek 
763a93856SMark Peek /* This file defines helper functions */
863a93856SMark Peek 
963a93856SMark Peek #ifndef	_VMCI_KERNEL_IF_H_
1063a93856SMark Peek #define	_VMCI_KERNEL_IF_H_
1163a93856SMark Peek 
1263a93856SMark Peek #include <sys/param.h>
1363a93856SMark Peek #include <sys/lock.h>
1463a93856SMark Peek #include <sys/mutex.h>
1563a93856SMark Peek #include <sys/queue.h>
1663a93856SMark Peek #include <sys/sema.h>
1763a93856SMark Peek 
1863a93856SMark Peek #include "vmci_defs.h"
1963a93856SMark Peek 
2063a93856SMark Peek #define VMCI_MEMORY_NORMAL		0x0
2163a93856SMark Peek #define VMCI_MEMORY_ATOMIC		0x1
2263a93856SMark Peek 
2363a93856SMark Peek #define vmci_list(_l)			LIST_HEAD(, _l)
2463a93856SMark Peek #define vmci_list_item(_l)		LIST_ENTRY(_l)
2563a93856SMark Peek #define vmci_list_init(_l)		LIST_INIT(_l)
2663a93856SMark Peek #define vmci_list_empty(_l)		LIST_EMPTY(_l)
2763a93856SMark Peek #define vmci_list_first(_l)		LIST_FIRST(_l)
2863a93856SMark Peek #define vmci_list_next(e, f)		LIST_NEXT(e, f)
2963a93856SMark Peek #define vmci_list_insert(_l, _e, n)	LIST_INSERT_HEAD(_l, _e, n)
3063a93856SMark Peek #define vmci_list_remove(_e, n)		LIST_REMOVE(_e, n)
3163a93856SMark Peek #define vmci_list_scan(v, _l, n)	LIST_FOREACH(v, _l, n)
3263a93856SMark Peek #define vmci_list_scan_safe(_e, _l, n, t)				\
3363a93856SMark Peek 	LIST_FOREACH_SAFE(_e, _l, n, t)
3463a93856SMark Peek #define vmci_list_swap(_l1, _l2, t, f)	LIST_SWAP(_l1, _l2, t, f)
3563a93856SMark Peek 
3663a93856SMark Peek typedef unsigned short int vmci_io_port;
3763a93856SMark Peek typedef int vmci_io_handle;
3863a93856SMark Peek 
3963a93856SMark Peek void	vmci_read_port_bytes(vmci_io_handle handle, vmci_io_port port,
4063a93856SMark Peek 	    uint8_t *buffer, size_t buffer_length);
4163a93856SMark Peek 
4263a93856SMark Peek typedef struct mtx vmci_lock;
4363a93856SMark Peek int	vmci_init_lock(vmci_lock *lock, char *name);
4463a93856SMark Peek void	vmci_cleanup_lock(vmci_lock *lock);
4563a93856SMark Peek void	vmci_grab_lock(vmci_lock *lock);
4663a93856SMark Peek void	vmci_release_lock(vmci_lock *lock);
4763a93856SMark Peek void	vmci_grab_lock_bh(vmci_lock *lock);
4863a93856SMark Peek void	vmci_release_lock_bh(vmci_lock *lock);
49*0f14bcbeSMark Peek int	vmci_initialized_lock(vmci_lock *lock);
5063a93856SMark Peek 
5163a93856SMark Peek void	*vmci_alloc_kernel_mem(size_t size, int flags);
5263a93856SMark Peek void	vmci_free_kernel_mem(void *ptr, size_t size);
5363a93856SMark Peek 
5463a93856SMark Peek typedef struct sema vmci_event;
5563a93856SMark Peek typedef int (*vmci_event_release_cb)(void *client_data);
5663a93856SMark Peek void	vmci_create_event(vmci_event *event);
5763a93856SMark Peek void	vmci_destroy_event(vmci_event *event);
5863a93856SMark Peek void	vmci_signal_event(vmci_event *event);
5963a93856SMark Peek void	vmci_wait_on_event(vmci_event *event, vmci_event_release_cb release_cb,
6063a93856SMark Peek 	    void *client_data);
6163a93856SMark Peek bool	vmci_wait_on_event_interruptible(vmci_event *event,
6263a93856SMark Peek 	    vmci_event_release_cb release_cb, void *client_data);
6363a93856SMark Peek 
6463a93856SMark Peek typedef void (vmci_work_fn)(void *data);
6563a93856SMark Peek bool	vmci_can_schedule_delayed_work(void);
6663a93856SMark Peek int	vmci_schedule_delayed_work(vmci_work_fn *work_fn, void *data);
6763a93856SMark Peek void	vmci_delayed_work_cb(void *context, int data);
6863a93856SMark Peek 
6963a93856SMark Peek typedef struct mtx vmci_mutex;
7063a93856SMark Peek int	vmci_mutex_init(vmci_mutex *mutex, char *name);
7163a93856SMark Peek void	vmci_mutex_destroy(vmci_mutex *mutex);
7263a93856SMark Peek void	vmci_mutex_acquire(vmci_mutex *mutex);
7363a93856SMark Peek void	vmci_mutex_release(vmci_mutex *mutex);
74*0f14bcbeSMark Peek int	vmci_mutex_initialized(vmci_mutex *mutex);
7563a93856SMark Peek 
7663a93856SMark Peek void	*vmci_alloc_queue(uint64_t size, uint32_t flags);
7763a93856SMark Peek void	vmci_free_queue(void *q, uint64_t size);
7863a93856SMark Peek 
7963a93856SMark Peek typedef PPN *vmci_ppn_list;
8063a93856SMark Peek struct ppn_set {
8163a93856SMark Peek 	uint64_t	num_produce_pages;
8263a93856SMark Peek 	uint64_t	num_consume_pages;
8363a93856SMark Peek 	vmci_ppn_list	produce_ppns;
8463a93856SMark Peek 	vmci_ppn_list	consume_ppns;
8563a93856SMark Peek 	bool		initialized;
8663a93856SMark Peek };
8763a93856SMark Peek 
8863a93856SMark Peek int	vmci_alloc_ppn_set(void *produce_q, uint64_t num_produce_pages,
8963a93856SMark Peek 	    void *consume_q, uint64_t num_consume_pages,
9063a93856SMark Peek 	    struct ppn_set *ppn_set);
9163a93856SMark Peek void	vmci_free_ppn_set(struct ppn_set *ppn_set);
9263a93856SMark Peek int	vmci_populate_ppn_list(uint8_t *call_buf, const struct ppn_set *ppnset);
9363a93856SMark Peek 
9463a93856SMark Peek #endif /* !_VMCI_KERNEL_IF_H_ */
95