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/pm_domain.h> 19 #include <linux/reset-controller.h> 20 #include <linux/semaphore.h> 21 #include <linux/types.h> 22 23 #include <soc/tegra/bpmp-abi.h> 24 25 struct tegra_bpmp_clk; 26 27 struct tegra_bpmp_soc { 28 struct { 29 struct { 30 unsigned int offset; 31 unsigned int count; 32 unsigned int timeout; 33 } cpu_tx, thread, cpu_rx; 34 } channels; 35 unsigned int num_resets; 36 }; 37 38 struct tegra_bpmp_mb_data { 39 u32 code; 40 u32 flags; 41 u8 data[MSG_DATA_MIN_SZ]; 42 } __packed; 43 44 struct tegra_bpmp_channel { 45 struct tegra_bpmp *bpmp; 46 struct tegra_bpmp_mb_data *ib; 47 struct tegra_bpmp_mb_data *ob; 48 struct completion completion; 49 struct tegra_ivc *ivc; 50 }; 51 52 typedef void (*tegra_bpmp_mrq_handler_t)(unsigned int mrq, 53 struct tegra_bpmp_channel *channel, 54 void *data); 55 56 struct tegra_bpmp_mrq { 57 struct list_head list; 58 unsigned int mrq; 59 tegra_bpmp_mrq_handler_t handler; 60 void *data; 61 }; 62 63 struct tegra_bpmp { 64 const struct tegra_bpmp_soc *soc; 65 struct device *dev; 66 67 struct { 68 struct gen_pool *pool; 69 dma_addr_t phys; 70 void *virt; 71 } tx, rx; 72 73 struct { 74 struct mbox_client client; 75 struct mbox_chan *channel; 76 } mbox; 77 78 spinlock_t atomic_tx_lock; 79 struct tegra_bpmp_channel *tx_channel, *rx_channel, *threaded_channels; 80 81 struct { 82 unsigned long *allocated; 83 unsigned long *busy; 84 unsigned int count; 85 struct semaphore lock; 86 } threaded; 87 88 struct list_head mrqs; 89 spinlock_t lock; 90 91 struct tegra_bpmp_clk **clocks; 92 unsigned int num_clocks; 93 94 struct reset_controller_dev rstc; 95 96 struct genpd_onecell_data genpd; 97 98 #ifdef CONFIG_DEBUG_FS 99 struct dentry *debugfs_mirror; 100 #endif 101 }; 102 103 struct tegra_bpmp_message { 104 unsigned int mrq; 105 106 struct { 107 const void *data; 108 size_t size; 109 } tx; 110 111 struct { 112 void *data; 113 size_t size; 114 int ret; 115 } rx; 116 }; 117 118 #if IS_ENABLED(CONFIG_TEGRA_BPMP) 119 struct tegra_bpmp *tegra_bpmp_get(struct device *dev); 120 void tegra_bpmp_put(struct tegra_bpmp *bpmp); 121 int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp, 122 struct tegra_bpmp_message *msg); 123 int tegra_bpmp_transfer(struct tegra_bpmp *bpmp, 124 struct tegra_bpmp_message *msg); 125 void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel, int code, 126 const void *data, size_t size); 127 128 int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq, 129 tegra_bpmp_mrq_handler_t handler, void *data); 130 void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq, 131 void *data); 132 #else 133 static inline struct tegra_bpmp *tegra_bpmp_get(struct device *dev) 134 { 135 return ERR_PTR(-ENOTSUPP); 136 } 137 static inline void tegra_bpmp_put(struct tegra_bpmp *bpmp) 138 { 139 } 140 static inline int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp, 141 struct tegra_bpmp_message *msg) 142 { 143 return -ENOTSUPP; 144 } 145 static inline int tegra_bpmp_transfer(struct tegra_bpmp *bpmp, 146 struct tegra_bpmp_message *msg) 147 { 148 return -ENOTSUPP; 149 } 150 static inline void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel, 151 int code, const void *data, 152 size_t size) 153 { 154 } 155 156 static inline int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, 157 unsigned int mrq, 158 tegra_bpmp_mrq_handler_t handler, 159 void *data) 160 { 161 return -ENOTSUPP; 162 } 163 static inline void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, 164 unsigned int mrq, void *data) 165 { 166 } 167 #endif 168 169 #if IS_ENABLED(CONFIG_CLK_TEGRA_BPMP) 170 int tegra_bpmp_init_clocks(struct tegra_bpmp *bpmp); 171 #else 172 static inline int tegra_bpmp_init_clocks(struct tegra_bpmp *bpmp) 173 { 174 return 0; 175 } 176 #endif 177 178 #if IS_ENABLED(CONFIG_RESET_TEGRA_BPMP) 179 int tegra_bpmp_init_resets(struct tegra_bpmp *bpmp); 180 #else 181 static inline int tegra_bpmp_init_resets(struct tegra_bpmp *bpmp) 182 { 183 return 0; 184 } 185 #endif 186 187 #if IS_ENABLED(CONFIG_SOC_TEGRA_POWERGATE_BPMP) 188 int tegra_bpmp_init_powergates(struct tegra_bpmp *bpmp); 189 #else 190 static inline int tegra_bpmp_init_powergates(struct tegra_bpmp *bpmp) 191 { 192 return 0; 193 } 194 #endif 195 196 #if IS_ENABLED(CONFIG_DEBUG_FS) 197 int tegra_bpmp_init_debugfs(struct tegra_bpmp *bpmp); 198 #else 199 static inline int tegra_bpmp_init_debugfs(struct tegra_bpmp *bpmp) 200 { 201 return 0; 202 } 203 #endif 204 205 206 #endif /* __SOC_TEGRA_BPMP_H */ 207