1a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang/*
2a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * VMware VMCI Driver
3a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang *
4a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * Copyright (C) 2012 VMware, Inc. All rights reserved.
5a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang *
6a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * This program is free software; you can redistribute it and/or modify it
7a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * under the terms of the GNU General Public License as published by the
8a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * Free Software Foundation version 2 and no later version.
9a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang *
10a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * This program is distributed in the hope that it will be useful, but
11a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * for more details.
14a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang */
15a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
16a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#ifndef _VMCI_DATAGRAM_H_
17a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#define _VMCI_DATAGRAM_H_
18a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
19a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#include <linux/types.h>
20a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#include <linux/list.h>
21a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
22a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#include "vmci_context.h"
23a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
24a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#define VMCI_MAX_DELAYED_DG_HOST_QUEUE_SIZE 256
25a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
26a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang/*
27a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * The struct vmci_datagram_queue_entry is a queue header for the in-kernel VMCI
28a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * datagram queues. It is allocated in non-paged memory, as the
29a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * content is accessed while holding a spinlock. The pending datagram
30a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * itself may be allocated from paged memory. We shadow the size of
31a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * the datagram in the non-paged queue entry as this size is used
32a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang * while holding the same spinlock as above.
33a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang */
34a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhangstruct vmci_datagram_queue_entry {
35a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang	struct list_head list_item;	/* For queuing. */
36a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang	size_t dg_size;		/* Size of datagram. */
37a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang	struct vmci_datagram *dg;	/* Pending datagram. */
38a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang};
39a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
40a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang/* VMCIDatagramSendRecvInfo */
41a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhangstruct vmci_datagram_snd_rcv_info {
42a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang	u64 addr;
43a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang	u32 len;
44a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang	s32 result;
45a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang};
46a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
47a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang/* Datagram API for non-public use. */
48a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhangint vmci_datagram_dispatch(u32 context_id, struct vmci_datagram *dg,
49a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang			   bool from_guest);
50a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhangint vmci_datagram_invoke_guest_handler(struct vmci_datagram *dg);
51a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang
52a110b7ebb9c674a2b591af2780dd512ad0198d50George Zhang#endif /* _VMCI_DATAGRAM_H_ */
53