linux/include/soc/tegra/bpmp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (c) 2016, NVIDIA CORPORATION.  All rights reserved.
   4 */
   5
   6#ifndef __SOC_TEGRA_BPMP_H
   7#define __SOC_TEGRA_BPMP_H
   8
   9#include <linux/mailbox_client.h>
  10#include <linux/pm_domain.h>
  11#include <linux/reset-controller.h>
  12#include <linux/semaphore.h>
  13#include <linux/types.h>
  14
  15#include <soc/tegra/bpmp-abi.h>
  16
  17struct tegra_bpmp_clk;
  18struct tegra_bpmp_ops;
  19
  20struct tegra_bpmp_soc {
  21        struct {
  22                struct {
  23                        unsigned int offset;
  24                        unsigned int count;
  25                        unsigned int timeout;
  26                } cpu_tx, thread, cpu_rx;
  27        } channels;
  28
  29        const struct tegra_bpmp_ops *ops;
  30        unsigned int num_resets;
  31};
  32
  33struct tegra_bpmp_mb_data {
  34        u32 code;
  35        u32 flags;
  36        u8 data[MSG_DATA_MIN_SZ];
  37} __packed;
  38
  39struct tegra_bpmp_channel {
  40        struct tegra_bpmp *bpmp;
  41        struct tegra_bpmp_mb_data *ib;
  42        struct tegra_bpmp_mb_data *ob;
  43        struct completion completion;
  44        struct tegra_ivc *ivc;
  45        unsigned int index;
  46};
  47
  48typedef void (*tegra_bpmp_mrq_handler_t)(unsigned int mrq,
  49                                         struct tegra_bpmp_channel *channel,
  50                                         void *data);
  51
  52struct tegra_bpmp_mrq {
  53        struct list_head list;
  54        unsigned int mrq;
  55        tegra_bpmp_mrq_handler_t handler;
  56        void *data;
  57};
  58
  59struct tegra_bpmp {
  60        const struct tegra_bpmp_soc *soc;
  61        struct device *dev;
  62        void *priv;
  63
  64        struct {
  65                struct mbox_client client;
  66                struct mbox_chan *channel;
  67        } mbox;
  68
  69        spinlock_t atomic_tx_lock;
  70        struct tegra_bpmp_channel *tx_channel, *rx_channel, *threaded_channels;
  71
  72        struct {
  73                unsigned long *allocated;
  74                unsigned long *busy;
  75                unsigned int count;
  76                struct semaphore lock;
  77        } threaded;
  78
  79        struct list_head mrqs;
  80        spinlock_t lock;
  81
  82        struct tegra_bpmp_clk **clocks;
  83        unsigned int num_clocks;
  84
  85        struct reset_controller_dev rstc;
  86
  87        struct genpd_onecell_data genpd;
  88
  89#ifdef CONFIG_DEBUG_FS
  90        struct dentry *debugfs_mirror;
  91#endif
  92};
  93
  94struct tegra_bpmp_message {
  95        unsigned int mrq;
  96
  97        struct {
  98                const void *data;
  99                size_t size;
 100        } tx;
 101
 102        struct {
 103                void *data;
 104                size_t size;
 105                int ret;
 106        } rx;
 107};
 108
 109#if IS_ENABLED(CONFIG_TEGRA_BPMP)
 110struct tegra_bpmp *tegra_bpmp_get(struct device *dev);
 111void tegra_bpmp_put(struct tegra_bpmp *bpmp);
 112int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
 113                               struct tegra_bpmp_message *msg);
 114int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
 115                        struct tegra_bpmp_message *msg);
 116void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel, int code,
 117                           const void *data, size_t size);
 118
 119int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
 120                           tegra_bpmp_mrq_handler_t handler, void *data);
 121void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
 122                         void *data);
 123bool tegra_bpmp_mrq_is_supported(struct tegra_bpmp *bpmp, unsigned int mrq);
 124#else
 125static inline struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
 126{
 127        return ERR_PTR(-ENOTSUPP);
 128}
 129static inline void tegra_bpmp_put(struct tegra_bpmp *bpmp)
 130{
 131}
 132static inline int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
 133                                             struct tegra_bpmp_message *msg)
 134{
 135        return -ENOTSUPP;
 136}
 137static inline int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
 138                                      struct tegra_bpmp_message *msg)
 139{
 140        return -ENOTSUPP;
 141}
 142static inline void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel,
 143                                         int code, const void *data,
 144                                         size_t size)
 145{
 146}
 147
 148static inline int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp,
 149                                         unsigned int mrq,
 150                                         tegra_bpmp_mrq_handler_t handler,
 151                                         void *data)
 152{
 153        return -ENOTSUPP;
 154}
 155static inline void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp,
 156                                       unsigned int mrq, void *data)
 157{
 158}
 159
 160static inline bool tegra_bpmp_mrq_is_supported(struct tegra_bpmp *bpmp,
 161                                              unsigned int mrq)
 162{
 163        return false;
 164}
 165#endif
 166
 167void tegra_bpmp_handle_rx(struct tegra_bpmp *bpmp);
 168
 169#if IS_ENABLED(CONFIG_CLK_TEGRA_BPMP)
 170int tegra_bpmp_init_clocks(struct tegra_bpmp *bpmp);
 171#else
 172static 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)
 179int tegra_bpmp_init_resets(struct tegra_bpmp *bpmp);
 180#else
 181static 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)
 188int tegra_bpmp_init_powergates(struct tegra_bpmp *bpmp);
 189#else
 190static 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)
 197int tegra_bpmp_init_debugfs(struct tegra_bpmp *bpmp);
 198#else
 199static 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