xref: /freebsd-src/sys/dev/vmware/vmci/vmci_resource.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
163a93856SMark Peek /*-
2*3eeb7511SMark 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 /* VMCI Resource Access Control API. */
863a93856SMark Peek 
963a93856SMark Peek #ifndef _VMCI_RESOURCE_H_
1063a93856SMark Peek #define _VMCI_RESOURCE_H_
1163a93856SMark Peek 
1263a93856SMark Peek #include "vmci_defs.h"
1363a93856SMark Peek #include "vmci_hashtable.h"
1463a93856SMark Peek #include "vmci_kernel_if.h"
1563a93856SMark Peek 
1663a93856SMark Peek #define RESOURCE_CONTAINER(ptr, type, member)				\
1763a93856SMark Peek 	((type *)((char *)(ptr) - offsetof(type, member)))
1863a93856SMark Peek 
1963a93856SMark Peek typedef void(*vmci_resource_free_cb)(void *resource);
2063a93856SMark Peek 
2163a93856SMark Peek typedef enum {
2263a93856SMark Peek 	VMCI_RESOURCE_TYPE_ANY,
2363a93856SMark Peek 	VMCI_RESOURCE_TYPE_API,
2463a93856SMark Peek 	VMCI_RESOURCE_TYPE_GROUP,
2563a93856SMark Peek 	VMCI_RESOURCE_TYPE_DATAGRAM,
2663a93856SMark Peek 	VMCI_RESOURCE_TYPE_DOORBELL,
2763a93856SMark Peek } vmci_resource_type;
2863a93856SMark Peek 
2963a93856SMark Peek struct vmci_resource {
3063a93856SMark Peek 	struct vmci_hash_entry	hash_entry;
3163a93856SMark Peek 	vmci_resource_type	type;
3263a93856SMark Peek 	/* Callback to free container object when refCount is 0. */
3363a93856SMark Peek 	vmci_resource_free_cb	container_free_cb;
3463a93856SMark Peek 	/* Container object reference. */
3563a93856SMark Peek 	void			*container_object;
3663a93856SMark Peek };
3763a93856SMark Peek 
3863a93856SMark Peek int	vmci_resource_init(void);
3963a93856SMark Peek void	vmci_resource_exit(void);
4063a93856SMark Peek void	vmci_resource_sync(void);
4163a93856SMark Peek 
4263a93856SMark Peek vmci_id	vmci_resource_get_id(vmci_id context_id);
4363a93856SMark Peek 
4463a93856SMark Peek int	vmci_resource_add(struct vmci_resource *resource,
4563a93856SMark Peek 	    vmci_resource_type resource_type,
4663a93856SMark Peek 	    struct vmci_handle resource_handle,
4763a93856SMark Peek 	    vmci_resource_free_cb container_free_cb, void *container_object);
4863a93856SMark Peek void	vmci_resource_remove(struct vmci_handle resource_handle,
4963a93856SMark Peek 	    vmci_resource_type resource_type);
5063a93856SMark Peek struct	vmci_resource *vmci_resource_get(struct vmci_handle resource_handle,
5163a93856SMark Peek 	    vmci_resource_type resource_type);
5263a93856SMark Peek void	vmci_resource_hold(struct vmci_resource *resource);
5363a93856SMark Peek int	vmci_resource_release(struct vmci_resource *resource);
5463a93856SMark Peek struct	vmci_handle vmci_resource_handle(struct vmci_resource *resource);
5563a93856SMark Peek 
5663a93856SMark Peek #endif /* !_VMCI_RESOURCE_H_ */
57