100 lines
2.8 KiB
C
100 lines
2.8 KiB
C
|
/*
|
||
|
* Copyright (c) 2013-2018, NVIDIA CORPORATION. All rights reserved.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify it
|
||
|
* under the terms and conditions of the GNU General Public License,
|
||
|
* version 2, as published by the Free Software Foundation.
|
||
|
*
|
||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||
|
* more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#ifndef _DRIVERS_BPMP_H
|
||
|
#define _DRIVERS_BPMP_H
|
||
|
|
||
|
#include <linux/debugfs.h>
|
||
|
#include <linux/kernel.h>
|
||
|
#include <linux/platform_device.h>
|
||
|
#include <soc/tegra/bpmp_abi.h>
|
||
|
#include <soc/tegra/tegra_bpmp.h>
|
||
|
|
||
|
#define NR_MAX_CHANNELS 14
|
||
|
|
||
|
#define DO_ACK (1 << 0)
|
||
|
#define RING_DOORBELL (1 << 1)
|
||
|
|
||
|
struct channel_cfg {
|
||
|
unsigned int channel_mask;
|
||
|
unsigned int per_cpu_ch_0;
|
||
|
unsigned int per_cpu_ch_cnt;
|
||
|
unsigned int thread_ch_0;
|
||
|
unsigned int thread_ch_cnt;
|
||
|
unsigned int ib_ch_0;
|
||
|
unsigned int ib_ch_cnt;
|
||
|
};
|
||
|
|
||
|
struct fops_entry {
|
||
|
char *name;
|
||
|
const struct file_operations *fops;
|
||
|
mode_t mode;
|
||
|
};
|
||
|
|
||
|
struct mb_data {
|
||
|
int32_t code;
|
||
|
int32_t flags;
|
||
|
u8 data[MSG_DATA_MIN_SZ];
|
||
|
} __packed;
|
||
|
|
||
|
struct channel_data {
|
||
|
struct mb_data *ib;
|
||
|
struct mb_data *ob;
|
||
|
};
|
||
|
|
||
|
struct mail_ops {
|
||
|
int (*init_prepare)(void);
|
||
|
int (*init_irq)(unsigned int cnt);
|
||
|
int (*connect)(const struct channel_cfg *cfg,
|
||
|
const struct mail_ops *ops,
|
||
|
struct device_node *of_node);
|
||
|
void (*resume)(void);
|
||
|
void (*suspend)(void);
|
||
|
|
||
|
struct ivc *(*ivc_obj)(int ch);
|
||
|
|
||
|
bool (*master_free)(const struct mail_ops *ops, int ch);
|
||
|
void (*free_master)(const struct mail_ops *ops, int ch);
|
||
|
bool (*master_acked)(const struct mail_ops *ops, int ch);
|
||
|
void (*signal_slave)(const struct mail_ops *ops, int ch);
|
||
|
bool (*slave_signalled)(const struct mail_ops *ops, int ch);
|
||
|
void (*ring_doorbell)(int ch);
|
||
|
void (*return_data)(const struct mail_ops *ops, int ch,
|
||
|
int code, void *data, int sz);
|
||
|
};
|
||
|
|
||
|
extern const struct mail_ops t210_mail_ops;
|
||
|
extern const struct mail_ops t186_native_mail_ops;
|
||
|
extern const struct mail_ops t186_hv_mail_ops;
|
||
|
|
||
|
extern struct channel_data channel_area[NR_MAX_CHANNELS];
|
||
|
extern char firmware_tag[sizeof(struct mrq_query_fw_tag_response)];
|
||
|
|
||
|
struct dentry *bpmp_init_debug(struct platform_device *pdev);
|
||
|
int bpmp_init_cpuidle_debug(struct dentry *root);
|
||
|
int bpmp_mail_init(const struct channel_cfg *cfg,
|
||
|
const struct mail_ops *ops, struct device_node *of_node);
|
||
|
int __bpmp_do_ping(void);
|
||
|
int bpmp_create_attrs(const struct fops_entry *fent, struct dentry *parent,
|
||
|
void *data);
|
||
|
int bpmp_mailman_init(void);
|
||
|
void bpmp_handle_mail(int mrq, int ch);
|
||
|
void tegra_bpmp_resume(void);
|
||
|
int tegra_bpmp_suspend(void);
|
||
|
void bpmp_handle_irq(unsigned int chidx);
|
||
|
|
||
|
#endif
|