summaryrefslogtreecommitdiffstats
path: root/include/linux/tegra-hsp.h
blob: 84bcf48944b037428f2ac05367b9b1ea524c7fb6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
 * Copyright (c) 2014-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 _LINUX_TEGRA_HSP_H
#define _LINUX_TEGRA_HSP_H

#include <linux/types.h>

enum tegra_hsp_master {
	HSP_FIRST_MASTER = 1,

	/* secure */
	HSP_MASTER_SECURE_CCPLEX = HSP_FIRST_MASTER,
	HSP_MASTER_SECURE_DPMU,
	HSP_MASTER_SECURE_BPMP,
	HSP_MASTER_SECURE_SPE,
	HSP_MASTER_SECURE_SCE,
	HSP_MASTER_SECURE_DMA,
	HSP_MASTER_SECURE_TSECA,
	HSP_MASTER_SECURE_TSECB,
	HSP_MASTER_SECURE_JTAGM,
	HSP_MASTER_SECURE_CSITE,
	HSP_MASTER_SECURE_APE,

	/* non-secure */
	HSP_MASTER_CCPLEX = HSP_FIRST_MASTER + 16,
	HSP_MASTER_DPMU,
	HSP_MASTER_BPMP,
	HSP_MASTER_SPE,
	HSP_MASTER_SCE,
	HSP_MASTER_DMA,
	HSP_MASTER_TSECA,
	HSP_MASTER_TSECB,
	HSP_MASTER_JTAGM,
	HSP_MASTER_CSITE,
	HSP_MASTER_APE,

	HSP_LAST_MASTER = HSP_MASTER_APE,
};

enum tegra_hsp_doorbell {
	HSP_FIRST_DB = 0,
	HSP_DB_DPMU = HSP_FIRST_DB,
	HSP_DB_CCPLEX,
	HSP_DB_CCPLEX_TZ,
	HSP_DB_BPMP,
	HSP_DB_SPE,
	HSP_DB_SCE,
	HSP_DB_APE,
	HSP_LAST_DB = HSP_DB_APE,
	HSP_NR_DBS,
};

typedef void (*db_handler_t)(void *data);

int tegra_hsp_init(void);

int tegra_hsp_db_enable_master(enum tegra_hsp_master master);

int tegra_hsp_db_disable_master(enum tegra_hsp_master master);

int tegra_hsp_db_ring(enum tegra_hsp_doorbell dbell);

int tegra_hsp_db_can_ring(enum tegra_hsp_doorbell dbell);

int tegra_hsp_db_add_handler(int master, db_handler_t handler, void *data);

int tegra_hsp_db_del_handler(int master);

#define tegra_hsp_find_master(mask, master)	((mask) & (1 << (master)))

struct tegra_hsp_sm_pair;

typedef u32 (*tegra_hsp_sm_full_fn)(void *, u32);
typedef void (*tegra_hsp_sm_empty_fn)(void *, u32);

struct tegra_hsp_sm_pair *of_tegra_hsp_sm_pair_request(
	const struct device_node *np, u32 index,
	tegra_hsp_sm_full_fn, tegra_hsp_sm_empty_fn, void *);
struct tegra_hsp_sm_pair *of_tegra_hsp_sm_pair_by_name(
	struct device_node *np, char const *name,
	tegra_hsp_sm_full_fn, tegra_hsp_sm_empty_fn, void *);
void tegra_hsp_sm_pair_free(struct tegra_hsp_sm_pair *);
void tegra_hsp_sm_pair_write(struct tegra_hsp_sm_pair *, u32 value);
bool tegra_hsp_sm_pair_is_empty(const struct tegra_hsp_sm_pair *);

#endif