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

map_rom.c (3159B)


      1/*
      2 * Common code to handle map devices which are simple ROM
      3 * (C) 2000 Red Hat. GPL'd.
      4 */
      5
      6#include <linux/module.h>
      7#include <linux/types.h>
      8#include <linux/kernel.h>
      9#include <asm/io.h>
     10#include <asm/byteorder.h>
     11#include <linux/errno.h>
     12#include <linux/slab.h>
     13#include <linux/init.h>
     14#include <linux/of.h>
     15#include <linux/mtd/mtd.h>
     16#include <linux/mtd/map.h>
     17
     18static int maprom_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
     19static int maprom_write (struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
     20static void maprom_nop (struct mtd_info *);
     21static struct mtd_info *map_rom_probe(struct map_info *map);
     22static int maprom_erase (struct mtd_info *mtd, struct erase_info *info);
     23static int maprom_point (struct mtd_info *mtd, loff_t from, size_t len,
     24			 size_t *retlen, void **virt, resource_size_t *phys);
     25static int maprom_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
     26
     27
     28static struct mtd_chip_driver maprom_chipdrv = {
     29	.probe	= map_rom_probe,
     30	.name	= "map_rom",
     31	.module	= THIS_MODULE
     32};
     33
     34static unsigned int default_erasesize(struct map_info *map)
     35{
     36	const __be32 *erase_size = NULL;
     37
     38	erase_size = of_get_property(map->device_node, "erase-size", NULL);
     39
     40	return !erase_size ? map->size : be32_to_cpu(*erase_size);
     41}
     42
     43static struct mtd_info *map_rom_probe(struct map_info *map)
     44{
     45	struct mtd_info *mtd;
     46
     47	mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
     48	if (!mtd)
     49		return NULL;
     50
     51	map->fldrv = &maprom_chipdrv;
     52	mtd->priv = map;
     53	mtd->name = map->name;
     54	mtd->type = MTD_ROM;
     55	mtd->size = map->size;
     56	mtd->_point = maprom_point;
     57	mtd->_unpoint = maprom_unpoint;
     58	mtd->_read = maprom_read;
     59	mtd->_write = maprom_write;
     60	mtd->_sync = maprom_nop;
     61	mtd->_erase = maprom_erase;
     62	mtd->flags = MTD_CAP_ROM;
     63	mtd->erasesize = default_erasesize(map);
     64	mtd->writesize = 1;
     65	mtd->writebufsize = 1;
     66
     67	__module_get(THIS_MODULE);
     68	return mtd;
     69}
     70
     71
     72static int maprom_point(struct mtd_info *mtd, loff_t from, size_t len,
     73			size_t *retlen, void **virt, resource_size_t *phys)
     74{
     75	struct map_info *map = mtd->priv;
     76
     77	if (!map->virt)
     78		return -EINVAL;
     79	*virt = map->virt + from;
     80	if (phys)
     81		*phys = map->phys + from;
     82	*retlen = len;
     83	return 0;
     84}
     85
     86static int maprom_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
     87{
     88	return 0;
     89}
     90
     91static int maprom_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
     92{
     93	struct map_info *map = mtd->priv;
     94
     95	map_copy_from(map, buf, from, len);
     96	*retlen = len;
     97	return 0;
     98}
     99
    100static void maprom_nop(struct mtd_info *mtd)
    101{
    102	/* Nothing to see here */
    103}
    104
    105static int maprom_write (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)
    106{
    107	return -EROFS;
    108}
    109
    110static int maprom_erase (struct mtd_info *mtd, struct erase_info *info)
    111{
    112	/* We do our best 8) */
    113	return -EROFS;
    114}
    115
    116static int __init map_rom_init(void)
    117{
    118	register_mtd_chip_driver(&maprom_chipdrv);
    119	return 0;
    120}
    121
    122static void __exit map_rom_exit(void)
    123{
    124	unregister_mtd_chip_driver(&maprom_chipdrv);
    125}
    126
    127module_init(map_rom_init);
    128module_exit(map_rom_exit);
    129
    130MODULE_LICENSE("GPL");
    131MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
    132MODULE_DESCRIPTION("MTD chip driver for ROM chips");