cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bpmp.h (4491B)


      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 */