/* 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 <linux/mutex.h>
|
#include <linux/platform_device.h>
|
#include <linux/semaphore.h>
|
#include <linux/atomic.h>
|
#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 */
|