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