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

internal.h (8764B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Register map access API internal header
      4 *
      5 * Copyright 2011 Wolfson Microelectronics plc
      6 *
      7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
      8 */
      9
     10#ifndef _REGMAP_INTERNAL_H
     11#define _REGMAP_INTERNAL_H
     12
     13#include <linux/device.h>
     14#include <linux/regmap.h>
     15#include <linux/fs.h>
     16#include <linux/list.h>
     17#include <linux/wait.h>
     18
     19struct regmap;
     20struct regcache_ops;
     21
     22struct regmap_debugfs_off_cache {
     23	struct list_head list;
     24	off_t min;
     25	off_t max;
     26	unsigned int base_reg;
     27	unsigned int max_reg;
     28};
     29
     30struct regmap_format {
     31	size_t buf_size;
     32	size_t reg_bytes;
     33	size_t pad_bytes;
     34	size_t reg_downshift;
     35	size_t val_bytes;
     36	void (*format_write)(struct regmap *map,
     37			     unsigned int reg, unsigned int val);
     38	void (*format_reg)(void *buf, unsigned int reg, unsigned int shift);
     39	void (*format_val)(void *buf, unsigned int val, unsigned int shift);
     40	unsigned int (*parse_val)(const void *buf);
     41	void (*parse_inplace)(void *buf);
     42};
     43
     44struct regmap_async {
     45	struct list_head list;
     46	struct regmap *map;
     47	void *work_buf;
     48};
     49
     50struct regmap {
     51	union {
     52		struct mutex mutex;
     53		struct {
     54			spinlock_t spinlock;
     55			unsigned long spinlock_flags;
     56		};
     57		struct {
     58			raw_spinlock_t raw_spinlock;
     59			unsigned long raw_spinlock_flags;
     60		};
     61	};
     62	regmap_lock lock;
     63	regmap_unlock unlock;
     64	void *lock_arg; /* This is passed to lock/unlock functions */
     65	gfp_t alloc_flags;
     66	unsigned int reg_base;
     67
     68	struct device *dev; /* Device we do I/O on */
     69	void *work_buf;     /* Scratch buffer used to format I/O */
     70	struct regmap_format format;  /* Buffer format */
     71	const struct regmap_bus *bus;
     72	void *bus_context;
     73	const char *name;
     74
     75	bool async;
     76	spinlock_t async_lock;
     77	wait_queue_head_t async_waitq;
     78	struct list_head async_list;
     79	struct list_head async_free;
     80	int async_ret;
     81
     82#ifdef CONFIG_DEBUG_FS
     83	bool debugfs_disable;
     84	struct dentry *debugfs;
     85	const char *debugfs_name;
     86
     87	unsigned int debugfs_reg_len;
     88	unsigned int debugfs_val_len;
     89	unsigned int debugfs_tot_len;
     90
     91	struct list_head debugfs_off_cache;
     92	struct mutex cache_lock;
     93#endif
     94
     95	unsigned int max_register;
     96	bool (*writeable_reg)(struct device *dev, unsigned int reg);
     97	bool (*readable_reg)(struct device *dev, unsigned int reg);
     98	bool (*volatile_reg)(struct device *dev, unsigned int reg);
     99	bool (*precious_reg)(struct device *dev, unsigned int reg);
    100	bool (*writeable_noinc_reg)(struct device *dev, unsigned int reg);
    101	bool (*readable_noinc_reg)(struct device *dev, unsigned int reg);
    102	const struct regmap_access_table *wr_table;
    103	const struct regmap_access_table *rd_table;
    104	const struct regmap_access_table *volatile_table;
    105	const struct regmap_access_table *precious_table;
    106	const struct regmap_access_table *wr_noinc_table;
    107	const struct regmap_access_table *rd_noinc_table;
    108
    109	int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
    110	int (*reg_write)(void *context, unsigned int reg, unsigned int val);
    111	int (*reg_update_bits)(void *context, unsigned int reg,
    112			       unsigned int mask, unsigned int val);
    113	/* Bulk read/write */
    114	int (*read)(void *context, const void *reg_buf, size_t reg_size,
    115		    void *val_buf, size_t val_size);
    116	int (*write)(void *context, const void *data, size_t count);
    117
    118	bool defer_caching;
    119
    120	unsigned long read_flag_mask;
    121	unsigned long write_flag_mask;
    122
    123	/* number of bits to (left) shift the reg value when formatting*/
    124	int reg_shift;
    125	int reg_stride;
    126	int reg_stride_order;
    127
    128	/* regcache specific members */
    129	const struct regcache_ops *cache_ops;
    130	enum regcache_type cache_type;
    131
    132	/* number of bytes in reg_defaults_raw */
    133	unsigned int cache_size_raw;
    134	/* number of bytes per word in reg_defaults_raw */
    135	unsigned int cache_word_size;
    136	/* number of entries in reg_defaults */
    137	unsigned int num_reg_defaults;
    138	/* number of entries in reg_defaults_raw */
    139	unsigned int num_reg_defaults_raw;
    140
    141	/* if set, only the cache is modified not the HW */
    142	bool cache_only;
    143	/* if set, only the HW is modified not the cache */
    144	bool cache_bypass;
    145	/* if set, remember to free reg_defaults_raw */
    146	bool cache_free;
    147
    148	struct reg_default *reg_defaults;
    149	const void *reg_defaults_raw;
    150	void *cache;
    151	/* if set, the cache contains newer data than the HW */
    152	bool cache_dirty;
    153	/* if set, the HW registers are known to match map->reg_defaults */
    154	bool no_sync_defaults;
    155
    156	struct reg_sequence *patch;
    157	int patch_regs;
    158
    159	/* if set, converts bulk read to single read */
    160	bool use_single_read;
    161	/* if set, converts bulk write to single write */
    162	bool use_single_write;
    163	/* if set, the device supports multi write mode */
    164	bool can_multi_write;
    165
    166	/* if set, raw reads/writes are limited to this size */
    167	size_t max_raw_read;
    168	size_t max_raw_write;
    169
    170	struct rb_root range_tree;
    171	void *selector_work_buf;	/* Scratch buffer used for selector */
    172
    173	struct hwspinlock *hwlock;
    174
    175	/* if set, the regmap core can sleep */
    176	bool can_sleep;
    177};
    178
    179struct regcache_ops {
    180	const char *name;
    181	enum regcache_type type;
    182	int (*init)(struct regmap *map);
    183	int (*exit)(struct regmap *map);
    184#ifdef CONFIG_DEBUG_FS
    185	void (*debugfs_init)(struct regmap *map);
    186#endif
    187	int (*read)(struct regmap *map, unsigned int reg, unsigned int *value);
    188	int (*write)(struct regmap *map, unsigned int reg, unsigned int value);
    189	int (*sync)(struct regmap *map, unsigned int min, unsigned int max);
    190	int (*drop)(struct regmap *map, unsigned int min, unsigned int max);
    191};
    192
    193bool regmap_cached(struct regmap *map, unsigned int reg);
    194bool regmap_writeable(struct regmap *map, unsigned int reg);
    195bool regmap_readable(struct regmap *map, unsigned int reg);
    196bool regmap_volatile(struct regmap *map, unsigned int reg);
    197bool regmap_precious(struct regmap *map, unsigned int reg);
    198bool regmap_writeable_noinc(struct regmap *map, unsigned int reg);
    199bool regmap_readable_noinc(struct regmap *map, unsigned int reg);
    200
    201int _regmap_write(struct regmap *map, unsigned int reg,
    202		  unsigned int val);
    203
    204struct regmap_range_node {
    205	struct rb_node node;
    206	const char *name;
    207	struct regmap *map;
    208
    209	unsigned int range_min;
    210	unsigned int range_max;
    211
    212	unsigned int selector_reg;
    213	unsigned int selector_mask;
    214	int selector_shift;
    215
    216	unsigned int window_start;
    217	unsigned int window_len;
    218};
    219
    220struct regmap_field {
    221	struct regmap *regmap;
    222	unsigned int mask;
    223	/* lsb */
    224	unsigned int shift;
    225	unsigned int reg;
    226
    227	unsigned int id_size;
    228	unsigned int id_offset;
    229};
    230
    231#ifdef CONFIG_DEBUG_FS
    232extern void regmap_debugfs_initcall(void);
    233extern void regmap_debugfs_init(struct regmap *map);
    234extern void regmap_debugfs_exit(struct regmap *map);
    235
    236static inline void regmap_debugfs_disable(struct regmap *map)
    237{
    238	map->debugfs_disable = true;
    239}
    240
    241#else
    242static inline void regmap_debugfs_initcall(void) { }
    243static inline void regmap_debugfs_init(struct regmap *map) { }
    244static inline void regmap_debugfs_exit(struct regmap *map) { }
    245static inline void regmap_debugfs_disable(struct regmap *map) { }
    246#endif
    247
    248/* regcache core declarations */
    249int regcache_init(struct regmap *map, const struct regmap_config *config);
    250void regcache_exit(struct regmap *map);
    251int regcache_read(struct regmap *map,
    252		       unsigned int reg, unsigned int *value);
    253int regcache_write(struct regmap *map,
    254			unsigned int reg, unsigned int value);
    255int regcache_sync(struct regmap *map);
    256int regcache_sync_block(struct regmap *map, void *block,
    257			unsigned long *cache_present,
    258			unsigned int block_base, unsigned int start,
    259			unsigned int end);
    260
    261static inline const void *regcache_get_val_addr(struct regmap *map,
    262						const void *base,
    263						unsigned int idx)
    264{
    265	return base + (map->cache_word_size * idx);
    266}
    267
    268unsigned int regcache_get_val(struct regmap *map, const void *base,
    269			      unsigned int idx);
    270bool regcache_set_val(struct regmap *map, void *base, unsigned int idx,
    271		      unsigned int val);
    272int regcache_lookup_reg(struct regmap *map, unsigned int reg);
    273
    274int _regmap_raw_write(struct regmap *map, unsigned int reg,
    275		      const void *val, size_t val_len, bool noinc);
    276
    277void regmap_async_complete_cb(struct regmap_async *async, int ret);
    278
    279enum regmap_endian regmap_get_val_endian(struct device *dev,
    280					 const struct regmap_bus *bus,
    281					 const struct regmap_config *config);
    282
    283extern struct regcache_ops regcache_rbtree_ops;
    284extern struct regcache_ops regcache_lzo_ops;
    285extern struct regcache_ops regcache_flat_ops;
    286
    287static inline const char *regmap_name(const struct regmap *map)
    288{
    289	if (map->dev)
    290		return dev_name(map->dev);
    291
    292	return map->name;
    293}
    294
    295static inline unsigned int regmap_get_offset(const struct regmap *map,
    296					     unsigned int index)
    297{
    298	if (map->reg_stride_order >= 0)
    299		return index << map->reg_stride_order;
    300	else
    301		return index * map->reg_stride;
    302}
    303
    304static inline unsigned int regcache_get_index_by_order(const struct regmap *map,
    305						       unsigned int reg)
    306{
    307	return reg >> map->reg_stride_order;
    308}
    309
    310#endif