linux/include/soc/tegra/bpmp.h
<<
>>
Prefs
   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
  25struct tegra_bpmp_clk;
  26
  27struct 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
  38struct tegra_bpmp_mb_data {
  39        u32 code;
  40        u32 flags;
  41        u8 data[MSG_DATA_MIN_SZ];
  42} __packed;
  43
  44struct 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
  52typedef void (*tegra_bpmp_mrq_handler_t)(unsigned int mrq,
  53                                         struct tegra_bpmp_channel *channel,
  54                                         void *data);
  55
  56struct tegra_bpmp_mrq {
  57        struct list_head list;
  58        unsigned int mrq;
  59        tegra_bpmp_mrq_handler_t handler;
  60        void *data;
  61};
  62
  63struct 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
 103struct 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)
 119struct tegra_bpmp *tegra_bpmp_get(struct device *dev);
 120void tegra_bpmp_put(struct tegra_bpmp *bpmp);
 121int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
 122                               struct tegra_bpmp_message *msg);
 123int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
 124                        struct tegra_bpmp_message *msg);
 125void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel, int code,
 126                           const void *data, size_t size);
 127
 128int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
 129                           tegra_bpmp_mrq_handler_t handler, void *data);
 130void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
 131                         void *data);
 132#else
 133static inline struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
 134{
 135        return ERR_PTR(-ENOTSUPP);
 136}
 137static inline void tegra_bpmp_put(struct tegra_bpmp *bpmp)
 138{
 139}
 140static inline int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
 141                                             struct tegra_bpmp_message *msg)
 142{
 143        return -ENOTSUPP;
 144}
 145static inline int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
 146                                      struct tegra_bpmp_message *msg)
 147{
 148        return -ENOTSUPP;
 149}
 150static inline void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel,
 151                                         int code, const void *data,
 152                                         size_t size)
 153{
 154}
 155
 156static 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}
 163static 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)
 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