xref: /openbmc/linux/include/soc/tegra/bpmp.h (revision 4f6cce39)
1 /*
2  * Copyright (c) 2016, NVIDIA CORPORATION.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  */
13 
14 #ifndef __SOC_TEGRA_BPMP_H
15 #define __SOC_TEGRA_BPMP_H
16 
17 #include <linux/mailbox_client.h>
18 #include <linux/reset-controller.h>
19 #include <linux/semaphore.h>
20 #include <linux/types.h>
21 
22 #include <soc/tegra/bpmp-abi.h>
23 
24 struct tegra_bpmp_clk;
25 
26 struct tegra_bpmp_soc {
27 	struct {
28 		struct {
29 			unsigned int offset;
30 			unsigned int count;
31 			unsigned int timeout;
32 		} cpu_tx, thread, cpu_rx;
33 	} channels;
34 	unsigned int num_resets;
35 };
36 
37 struct tegra_bpmp_mb_data {
38 	u32 code;
39 	u32 flags;
40 	u8 data[MSG_DATA_MIN_SZ];
41 } __packed;
42 
43 struct tegra_bpmp_channel {
44 	struct tegra_bpmp *bpmp;
45 	struct tegra_bpmp_mb_data *ib;
46 	struct tegra_bpmp_mb_data *ob;
47 	struct completion completion;
48 	struct tegra_ivc *ivc;
49 };
50 
51 typedef void (*tegra_bpmp_mrq_handler_t)(unsigned int mrq,
52 					 struct tegra_bpmp_channel *channel,
53 					 void *data);
54 
55 struct tegra_bpmp_mrq {
56 	struct list_head list;
57 	unsigned int mrq;
58 	tegra_bpmp_mrq_handler_t handler;
59 	void *data;
60 };
61 
62 struct tegra_bpmp {
63 	const struct tegra_bpmp_soc *soc;
64 	struct device *dev;
65 
66 	struct {
67 		struct gen_pool *pool;
68 		dma_addr_t phys;
69 		void *virt;
70 	} tx, rx;
71 
72 	struct {
73 		struct mbox_client client;
74 		struct mbox_chan *channel;
75 	} mbox;
76 
77 	struct tegra_bpmp_channel *channels;
78 	unsigned int num_channels;
79 
80 	struct {
81 		unsigned long *allocated;
82 		unsigned long *busy;
83 		unsigned int count;
84 		struct semaphore lock;
85 	} threaded;
86 
87 	struct list_head mrqs;
88 	spinlock_t lock;
89 
90 	struct tegra_bpmp_clk **clocks;
91 	unsigned int num_clocks;
92 
93 	struct reset_controller_dev rstc;
94 };
95 
96 struct tegra_bpmp *tegra_bpmp_get(struct device *dev);
97 void tegra_bpmp_put(struct tegra_bpmp *bpmp);
98 
99 struct tegra_bpmp_message {
100 	unsigned int mrq;
101 
102 	struct {
103 		const void *data;
104 		size_t size;
105 	} tx;
106 
107 	struct {
108 		void *data;
109 		size_t size;
110 	} rx;
111 };
112 
113 int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
114 			       struct tegra_bpmp_message *msg);
115 int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
116 			struct tegra_bpmp_message *msg);
117 
118 int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
119 			   tegra_bpmp_mrq_handler_t handler, void *data);
120 void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
121 			 void *data);
122 
123 #if IS_ENABLED(CONFIG_CLK_TEGRA_BPMP)
124 int tegra_bpmp_init_clocks(struct tegra_bpmp *bpmp);
125 #else
126 static inline int tegra_bpmp_init_clocks(struct tegra_bpmp *bpmp)
127 {
128 	return 0;
129 }
130 #endif
131 
132 #if IS_ENABLED(CONFIG_RESET_TEGRA_BPMP)
133 int tegra_bpmp_init_resets(struct tegra_bpmp *bpmp);
134 #else
135 static inline int tegra_bpmp_init_resets(struct tegra_bpmp *bpmp)
136 {
137 	return 0;
138 }
139 #endif
140 
141 #endif /* __SOC_TEGRA_BPMP_H */
142