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

eisa_eeprom.c (2097B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* 
      3 *    EISA "eeprom" support routines
      4 *
      5 *    Copyright (C) 2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org>
      6 */
      7
      8#include <linux/module.h>
      9#include <linux/init.h>
     10#include <linux/kernel.h>
     11#include <linux/miscdevice.h>
     12#include <linux/slab.h>
     13#include <linux/fs.h>
     14#include <asm/io.h>
     15#include <linux/uaccess.h>
     16#include <asm/eisa_eeprom.h>
     17
     18#define 	EISA_EEPROM_MINOR 241
     19
     20static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin)
     21{
     22	return fixed_size_llseek(file, offset, origin, HPEE_MAX_LENGTH);
     23}
     24
     25static ssize_t eisa_eeprom_read(struct file * file,
     26			      char __user *buf, size_t count, loff_t *ppos )
     27{
     28	unsigned char *tmp;
     29	ssize_t ret;
     30	int i;
     31	
     32	if (*ppos < 0 || *ppos >= HPEE_MAX_LENGTH)
     33		return 0;
     34	
     35	count = *ppos + count < HPEE_MAX_LENGTH ? count : HPEE_MAX_LENGTH - *ppos;
     36	tmp = kmalloc(count, GFP_KERNEL);
     37	if (tmp) {
     38		for (i = 0; i < count; i++)
     39			tmp[i] = readb(eisa_eeprom_addr+(*ppos)++);
     40
     41		if (copy_to_user (buf, tmp, count))
     42			ret = -EFAULT;
     43		else
     44			ret = count;
     45		kfree (tmp);
     46	} else
     47		ret = -ENOMEM;
     48	
     49	return ret;
     50}
     51
     52static int eisa_eeprom_open(struct inode *inode, struct file *file)
     53{
     54	if (file->f_mode & FMODE_WRITE)
     55		return -EINVAL;
     56   
     57	return 0;
     58}
     59
     60static int eisa_eeprom_release(struct inode *inode, struct file *file)
     61{
     62	return 0;
     63}
     64
     65/*
     66 *	The various file operations we support.
     67 */
     68static const struct file_operations eisa_eeprom_fops = {
     69	.owner =	THIS_MODULE,
     70	.llseek =	eisa_eeprom_llseek,
     71	.read =		eisa_eeprom_read,
     72	.open =		eisa_eeprom_open,
     73	.release =	eisa_eeprom_release,
     74};
     75
     76static struct miscdevice eisa_eeprom_dev = {
     77	EISA_EEPROM_MINOR,
     78	"eisa_eeprom",
     79	&eisa_eeprom_fops
     80};
     81
     82static int __init eisa_eeprom_init(void)
     83{
     84	int retval;
     85
     86	if (!eisa_eeprom_addr)
     87		return -ENODEV;
     88
     89	retval = misc_register(&eisa_eeprom_dev);
     90	if (retval < 0) {
     91		printk(KERN_ERR "EISA EEPROM: cannot register misc device.\n");
     92		return retval;
     93	}
     94
     95	printk(KERN_INFO "EISA EEPROM at 0x%px\n", eisa_eeprom_addr);
     96	return 0;
     97}
     98
     99MODULE_LICENSE("GPL");
    100
    101module_init(eisa_eeprom_init);