/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ /* * Copyright (c) 2014 Raspberry Pi (Trading) Ltd. All rights reserved. * Copyright (c) 2010-2012 Broadcom. All rights reserved. */ #ifndef VCHIQ_ARM_H #define VCHIQ_ARM_H #include #include #include #include #include "vchiq_core.h" #include "vchiq_debugfs.h" enum USE_TYPE_E { USE_TYPE_SERVICE, USE_TYPE_VCHIQ }; struct vchiq_arm_state { /* Keepalive-related data */ struct task_struct *ka_thread; struct completion ka_evt; atomic_t ka_use_count; atomic_t ka_use_ack_count; atomic_t ka_release_count; rwlock_t susp_res_lock; struct vchiq_state *state; /* Global use count for videocore. ** This is equal to the sum of the use counts for all services. When ** this hits zero the videocore suspend procedure will be initiated. */ int videocore_use_count; /* Use count to track requests from videocore peer. ** This use count is not associated with a service, so needs to be ** tracked separately with the state. */ int peer_use_count; /* Flag to indicate that the first vchiq connect has made it through. ** This means that both sides should be fully ready, and we should ** be able to suspend after this point. */ int first_connect; }; struct vchiq_drvdata { const unsigned int cache_line_size; struct rpi_firmware *fw; }; extern int vchiq_arm_log_level; extern int vchiq_susp_log_level; int vchiq_platform_init(struct platform_device *pdev, struct vchiq_state *state); extern struct vchiq_state * vchiq_get_state(void); extern enum vchiq_status vchiq_arm_init_state(struct vchiq_state *state, struct vchiq_arm_state *arm_state); extern void vchiq_check_suspend(struct vchiq_state *state); enum vchiq_status vchiq_use_service(unsigned int handle); extern enum vchiq_status vchiq_release_service(unsigned int handle); extern enum vchiq_status vchiq_check_service(struct vchiq_service *service); extern void vchiq_dump_platform_use_state(struct vchiq_state *state); extern void vchiq_dump_service_use_state(struct vchiq_state *state); extern struct vchiq_arm_state* vchiq_platform_get_arm_state(struct vchiq_state *state); extern enum vchiq_status vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service, enum USE_TYPE_E use_type); extern enum vchiq_status vchiq_release_internal(struct vchiq_state *state, struct vchiq_service *service); extern struct vchiq_debugfs_node * vchiq_instance_get_debugfs_node(struct vchiq_instance *instance); extern int vchiq_instance_get_use_count(struct vchiq_instance *instance); extern int vchiq_instance_get_pid(struct vchiq_instance *instance); extern int vchiq_instance_get_trace(struct vchiq_instance *instance); extern void vchiq_instance_set_trace(struct vchiq_instance *instance, int trace); #endif /* VCHIQ_ARM_H */