1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2/*
3 * Copyright (c) 2014 Raspberry Pi (Trading) Ltd. All rights reserved.
4 * Copyright (c) 2010-2012 Broadcom. All rights reserved.
5 */
6
7#ifndef VCHIQ_ARM_H
8#define VCHIQ_ARM_H
9
10#include <linux/mutex.h>
11#include <linux/platform_device.h>
12#include <linux/semaphore.h>
13#include <linux/atomic.h>
14#include "vchiq_core.h"
15#include "vchiq_debugfs.h"
16
17/* Some per-instance constants */
18#define MAX_COMPLETIONS 128
19#define MAX_SERVICES 64
20#define MAX_ELEMENTS 8
21#define MSG_QUEUE_SIZE 128
22
23enum USE_TYPE_E {
24	USE_TYPE_SERVICE,
25	USE_TYPE_VCHIQ
26};
27
28struct user_service {
29	struct vchiq_service *service;
30	void __user *userdata;
31	struct vchiq_instance *instance;
32	char is_vchi;
33	char dequeue_pending;
34	char close_pending;
35	int message_available_pos;
36	int msg_insert;
37	int msg_remove;
38	struct completion insert_event;
39	struct completion remove_event;
40	struct completion close_event;
41	struct vchiq_header *msg_queue[MSG_QUEUE_SIZE];
42};
43
44struct bulk_waiter_node {
45	struct bulk_waiter bulk_waiter;
46	int pid;
47	struct list_head list;
48};
49
50struct vchiq_instance {
51	struct vchiq_state *state;
52	struct vchiq_completion_data_kernel completions[MAX_COMPLETIONS];
53	int completion_insert;
54	int completion_remove;
55	struct completion insert_event;
56	struct completion remove_event;
57	struct mutex completion_mutex;
58
59	int connected;
60	int closing;
61	int pid;
62	int mark;
63	int use_close_delivered;
64	int trace;
65
66	struct list_head bulk_waiter_list;
67	struct mutex bulk_waiter_list_mutex;
68
69	struct vchiq_debugfs_node debugfs_node;
70};
71
72extern spinlock_t msg_queue_spinlock;
73extern struct vchiq_state g_state;
74
75extern struct vchiq_state *
76vchiq_get_state(void);
77
78int
79vchiq_use_service(struct vchiq_instance *instance, unsigned int handle);
80
81extern int
82vchiq_release_service(struct vchiq_instance *instance, unsigned int handle);
83
84extern int
85vchiq_check_service(struct vchiq_service *service);
86
87extern void
88vchiq_dump_platform_use_state(struct vchiq_state *state);
89
90extern void
91vchiq_dump_service_use_state(struct vchiq_state *state);
92
93extern int
94vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service,
95		   enum USE_TYPE_E use_type);
96extern int
97vchiq_release_internal(struct vchiq_state *state,
98		       struct vchiq_service *service);
99
100extern struct vchiq_debugfs_node *
101vchiq_instance_get_debugfs_node(struct vchiq_instance *instance);
102
103extern int
104vchiq_instance_get_use_count(struct vchiq_instance *instance);
105
106extern int
107vchiq_instance_get_pid(struct vchiq_instance *instance);
108
109extern int
110vchiq_instance_get_trace(struct vchiq_instance *instance);
111
112extern void
113vchiq_instance_set_trace(struct vchiq_instance *instance, int trace);
114
115#if IS_ENABLED(CONFIG_VCHIQ_CDEV)
116
117extern void
118vchiq_deregister_chrdev(void);
119
120extern int
121vchiq_register_chrdev(struct device *parent);
122
123#else
124
125static inline void vchiq_deregister_chrdev(void) { }
126static inline int vchiq_register_chrdev(struct device *parent) { return 0; }
127
128#endif /* IS_ENABLED(CONFIG_VCHIQ_CDEV) */
129
130extern int
131service_callback(struct vchiq_instance *vchiq_instance, enum vchiq_reason reason,
132		 struct vchiq_header *header, unsigned int handle, void *bulk_userdata);
133
134extern void
135free_bulk_waiter(struct vchiq_instance *instance);
136
137#endif /* VCHIQ_ARM_H */
138