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