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

regcache-flat.c (1793B)


      1// SPDX-License-Identifier: GPL-2.0
      2//
      3// Register cache access API - flat caching support
      4//
      5// Copyright 2012 Wolfson Microelectronics plc
      6//
      7// Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
      8
      9#include <linux/device.h>
     10#include <linux/seq_file.h>
     11#include <linux/slab.h>
     12
     13#include "internal.h"
     14
     15static inline unsigned int regcache_flat_get_index(const struct regmap *map,
     16						   unsigned int reg)
     17{
     18	return regcache_get_index_by_order(map, reg);
     19}
     20
     21static int regcache_flat_init(struct regmap *map)
     22{
     23	int i;
     24	unsigned int *cache;
     25
     26	if (!map || map->reg_stride_order < 0 || !map->max_register)
     27		return -EINVAL;
     28
     29	map->cache = kcalloc(regcache_flat_get_index(map, map->max_register)
     30			     + 1, sizeof(unsigned int), GFP_KERNEL);
     31	if (!map->cache)
     32		return -ENOMEM;
     33
     34	cache = map->cache;
     35
     36	for (i = 0; i < map->num_reg_defaults; i++) {
     37		unsigned int reg = map->reg_defaults[i].reg;
     38		unsigned int index = regcache_flat_get_index(map, reg);
     39
     40		cache[index] = map->reg_defaults[i].def;
     41	}
     42
     43	return 0;
     44}
     45
     46static int regcache_flat_exit(struct regmap *map)
     47{
     48	kfree(map->cache);
     49	map->cache = NULL;
     50
     51	return 0;
     52}
     53
     54static int regcache_flat_read(struct regmap *map,
     55			      unsigned int reg, unsigned int *value)
     56{
     57	unsigned int *cache = map->cache;
     58	unsigned int index = regcache_flat_get_index(map, reg);
     59
     60	*value = cache[index];
     61
     62	return 0;
     63}
     64
     65static int regcache_flat_write(struct regmap *map, unsigned int reg,
     66			       unsigned int value)
     67{
     68	unsigned int *cache = map->cache;
     69	unsigned int index = regcache_flat_get_index(map, reg);
     70
     71	cache[index] = value;
     72
     73	return 0;
     74}
     75
     76struct regcache_ops regcache_flat_ops = {
     77	.type = REGCACHE_FLAT,
     78	.name = "flat",
     79	.init = regcache_flat_init,
     80	.exit = regcache_flat_exit,
     81	.read = regcache_flat_read,
     82	.write = regcache_flat_write,
     83};