brintos

brintos / linux-shallow public Read only

0
0
Text · 5.3 KiB · c4e6e92 Raw
166 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * VMware VMCI Driver4 *5 * Copyright (C) 2012 VMware, Inc. All rights reserved.6 */7 8#ifndef _VMCI_QUEUE_PAIR_H_9#define _VMCI_QUEUE_PAIR_H_10 11#include <linux/vmw_vmci_defs.h>12#include <linux/types.h>13 14#include "vmci_context.h"15 16/* Callback needed for correctly waiting on events. */17typedef int (*vmci_event_release_cb) (void *client_data);18 19/* Guest device port I/O. */20struct ppn_set {21	u64 num_produce_pages;22	u64 num_consume_pages;23	u64 *produce_ppns;24	u64 *consume_ppns;25	bool initialized;26};27 28/* VMCIqueue_pairAllocInfo */29struct vmci_qp_alloc_info {30	struct vmci_handle handle;31	u32 peer;32	u32 flags;33	u64 produce_size;34	u64 consume_size;35	u64 ppn_va;	/* Start VA of queue pair PPNs. */36	u64 num_ppns;37	s32 result;38	u32 version;39};40 41/* VMCIqueue_pairSetVAInfo */42struct vmci_qp_set_va_info {43	struct vmci_handle handle;44	u64 va;		/* Start VA of queue pair PPNs. */45	u64 num_ppns;46	u32 version;47	s32 result;48};49 50/*51 * For backwards compatibility, here is a version of the52 * VMCIqueue_pairPageFileInfo before host support end-points was added.53 * Note that the current version of that structure requires VMX to54 * pass down the VA of the mapped file.  Before host support was added55 * there was nothing of the sort.  So, when the driver sees the ioctl56 * with a parameter that is the sizeof57 * VMCIqueue_pairPageFileInfo_NoHostQP then it can infer that the version58 * of VMX running can't attach to host end points because it doesn't59 * provide the VA of the mapped files.60 *61 * The Linux driver doesn't get an indication of the size of the62 * structure passed down from user space.  So, to fix a long standing63 * but unfiled bug, the _pad field has been renamed to version.64 * Existing versions of VMX always initialize the PageFileInfo65 * structure so that _pad, er, version is set to 0.66 *67 * A version value of 1 indicates that the size of the structure has68 * been increased to include two UVA's: produce_uva and consume_uva.69 * These UVA's are of the mmap()'d queue contents backing files.70 *71 * In addition, if when VMX is sending down the72 * VMCIqueue_pairPageFileInfo structure it gets an error then it will73 * try again with the _NoHostQP version of the file to see if an older74 * VMCI kernel module is running.75 */76 77/* VMCIqueue_pairPageFileInfo */78struct vmci_qp_page_file_info {79	struct vmci_handle handle;80	u64 produce_page_file;	  /* User VA. */81	u64 consume_page_file;	  /* User VA. */82	u64 produce_page_file_size;  /* Size of the file name array. */83	u64 consume_page_file_size;  /* Size of the file name array. */84	s32 result;85	u32 version;	/* Was _pad. */86	u64 produce_va;	/* User VA of the mapped file. */87	u64 consume_va;	/* User VA of the mapped file. */88};89 90/* vmci queuepair detach info */91struct vmci_qp_dtch_info {92	struct vmci_handle handle;93	s32 result;94	u32 _pad;95};96 97/*98 * struct vmci_qp_page_store describes how the memory of a given queue pair99 * is backed. When the queue pair is between the host and a guest, the100 * page store consists of references to the guest pages. On vmkernel,101 * this is a list of PPNs, and on hosted, it is a user VA where the102 * queue pair is mapped into the VMX address space.103 */104struct vmci_qp_page_store {105	/* Reference to pages backing the queue pair. */106	u64 pages;107	/* Length of pageList/virtual address range (in pages). */108	u32 len;109};110 111/*112 * This data type contains the information about a queue.113 * There are two queues (hence, queue pairs) per transaction model between a114 * pair of end points, A & B.  One queue is used by end point A to transmit115 * commands and responses to B.  The other queue is used by B to transmit116 * commands and responses.117 *118 * struct vmci_queue_kern_if is a per-OS defined Queue structure.  It contains119 * either a direct pointer to the linear address of the buffer contents or a120 * pointer to structures which help the OS locate those data pages.  See121 * vmciKernelIf.c for each platform for its definition.122 */123struct vmci_queue {124	struct vmci_queue_header *q_header;125	struct vmci_queue_header *saved_header;126	struct vmci_queue_kern_if *kernel_if;127};128 129/*130 * Utility function that checks whether the fields of the page131 * store contain valid values.132 * Result:133 * true if the page store is wellformed. false otherwise.134 */135static inline bool136VMCI_QP_PAGESTORE_IS_WELLFORMED(struct vmci_qp_page_store *page_store)137{138	return page_store->len >= 2;139}140 141void vmci_qp_broker_exit(void);142int vmci_qp_broker_alloc(struct vmci_handle handle, u32 peer,143			 u32 flags, u32 priv_flags,144			 u64 produce_size, u64 consume_size,145			 struct vmci_qp_page_store *page_store,146			 struct vmci_ctx *context);147int vmci_qp_broker_set_page_store(struct vmci_handle handle,148				  u64 produce_uva, u64 consume_uva,149				  struct vmci_ctx *context);150int vmci_qp_broker_detach(struct vmci_handle handle, struct vmci_ctx *context);151 152void vmci_qp_guest_endpoints_exit(void);153 154int vmci_qp_alloc(struct vmci_handle *handle,155		  struct vmci_queue **produce_q, u64 produce_size,156		  struct vmci_queue **consume_q, u64 consume_size,157		  u32 peer, u32 flags, u32 priv_flags,158		  bool guest_endpoint, vmci_event_release_cb wakeup_cb,159		  void *client_data);160int vmci_qp_broker_map(struct vmci_handle handle,161		       struct vmci_ctx *context, u64 guest_mem);162int vmci_qp_broker_unmap(struct vmci_handle handle,163			 struct vmci_ctx *context, u32 gid);164 165#endif /* _VMCI_QUEUE_PAIR_H_ */166