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

pcmcia.c (2561B)


      1/*
      2** asm-m68k/pcmcia.c -- Amiga Linux PCMCIA support
      3**                      most information was found by disassembling card.resource
      4**                      I'm still looking for an official doc !
      5**
      6** Copyright 1997 by Alain Malek
      7**
      8** This file is subject to the terms and conditions of the GNU General Public
      9** License.  See the file COPYING in the main directory of this archive
     10** for more details.
     11**
     12** Created: 12/10/97 by Alain Malek
     13*/
     14
     15#include <linux/types.h>
     16#include <linux/jiffies.h>
     17#include <linux/timer.h>
     18#include <linux/module.h>
     19
     20#include <asm/amigayle.h>
     21#include <asm/amipcmcia.h>
     22
     23/* gayle config byte for program voltage and access speed */
     24static unsigned char cfg_byte = GAYLE_CFG_0V|GAYLE_CFG_150NS;
     25
     26void pcmcia_reset(void)
     27{
     28	unsigned long reset_start_time = jiffies;
     29	unsigned char b;
     30
     31	gayle_reset = 0x00;
     32	while (time_before(jiffies, reset_start_time + 1*HZ/100));
     33	b = gayle_reset;
     34}
     35EXPORT_SYMBOL(pcmcia_reset);
     36
     37
     38/* copy a tuple, including tuple header. return nb bytes copied */
     39/* be careful as this may trigger a GAYLE_IRQ_WR interrupt ! */
     40
     41int pcmcia_copy_tuple(unsigned char tuple_id, void *tuple, int max_len)
     42{
     43	unsigned char id, *dest;
     44	int cnt, pos, len;
     45
     46	dest = tuple;
     47	pos = 0;
     48
     49	id = gayle_attribute[pos];
     50
     51	while((id != CISTPL_END) && (pos < 0x10000)) {
     52		len = (int)gayle_attribute[pos+2] + 2;
     53		if (id == tuple_id) {
     54			len = (len > max_len)?max_len:len;
     55			for (cnt = 0; cnt < len; cnt++) {
     56				*dest++ = gayle_attribute[pos+(cnt<<1)];
     57			}
     58
     59			return len;
     60		}
     61		pos += len<<1;
     62		id = gayle_attribute[pos];
     63	}
     64
     65	return 0;
     66}
     67EXPORT_SYMBOL(pcmcia_copy_tuple);
     68
     69void pcmcia_program_voltage(int voltage)
     70{
     71	unsigned char v;
     72
     73	switch (voltage) {
     74	case PCMCIA_0V:
     75		v = GAYLE_CFG_0V;
     76		break;
     77	case PCMCIA_5V:
     78		v = GAYLE_CFG_5V;
     79		break;
     80	case PCMCIA_12V:
     81		v = GAYLE_CFG_12V;
     82		break;
     83	default:
     84		v = GAYLE_CFG_0V;
     85	}
     86
     87	cfg_byte = (cfg_byte & 0xfc) | v;
     88	gayle.config = cfg_byte;
     89
     90}
     91EXPORT_SYMBOL(pcmcia_program_voltage);
     92
     93void pcmcia_access_speed(int speed)
     94{
     95	unsigned char s;
     96
     97	if (speed <= PCMCIA_SPEED_100NS)
     98		s = GAYLE_CFG_100NS;
     99	else if (speed <= PCMCIA_SPEED_150NS)
    100		s = GAYLE_CFG_150NS;
    101	else if (speed <= PCMCIA_SPEED_250NS)
    102		s = GAYLE_CFG_250NS;
    103	else
    104		s = GAYLE_CFG_720NS;
    105
    106	cfg_byte = (cfg_byte & 0xf3) | s;
    107	gayle.config = cfg_byte;
    108}
    109EXPORT_SYMBOL(pcmcia_access_speed);
    110
    111void pcmcia_write_enable(void)
    112{
    113	gayle.cardstatus = GAYLE_CS_WR|GAYLE_CS_DA;
    114}
    115EXPORT_SYMBOL(pcmcia_write_enable);
    116
    117void pcmcia_write_disable(void)
    118{
    119	gayle.cardstatus = 0;
    120}
    121EXPORT_SYMBOL(pcmcia_write_disable);
    122