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

nsp_cs.h (11899B)


      1/*=======================================================/
      2  Header file for nsp_cs.c
      3      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
      4
      5    Ver.1.0 : Cut unused lines.
      6    Ver 0.1 : Initial version.
      7
      8    This software may be used and distributed according to the terms of
      9    the GNU General Public License.
     10
     11=========================================================*/
     12
     13#ifndef  __nsp_cs__
     14#define  __nsp_cs__
     15
     16/* for debugging */
     17//#define NSP_DEBUG 9
     18
     19/*
     20#define static
     21#define inline
     22*/
     23
     24/************************************
     25 * Some useful macros...
     26 */
     27
     28/* SCSI initiator must be ID 7 */
     29#define NSP_INITIATOR_ID  7
     30
     31#define NSP_SELTIMEOUT 200
     32
     33/***************************************************************************
     34 * register definitions
     35 ***************************************************************************/
     36/*========================================================================
     37 * base register
     38 ========================================================================*/
     39#define	IRQCONTROL	0x00  /* R */
     40#  define IRQCONTROL_RESELECT_CLEAR     BIT(0)
     41#  define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1)
     42#  define IRQCONTROL_TIMER_CLEAR        BIT(2)
     43#  define IRQCONTROL_FIFO_CLEAR         BIT(3)
     44#  define IRQCONTROL_ALLMASK            0xff
     45#  define IRQCONTROL_ALLCLEAR           (IRQCONTROL_RESELECT_CLEAR     | \
     46					 IRQCONTROL_PHASE_CHANGE_CLEAR | \
     47					 IRQCONTROL_TIMER_CLEAR        | \
     48					 IRQCONTROL_FIFO_CLEAR          )
     49#  define IRQCONTROL_IRQDISABLE         0xf0
     50
     51#define	IRQSTATUS	0x00  /* W */
     52#  define IRQSTATUS_SCSI  BIT(0)
     53#  define IRQSTATUS_TIMER BIT(2)
     54#  define IRQSTATUS_FIFO  BIT(3)
     55#  define IRQSTATUS_MASK  0x0f
     56
     57#define	IFSELECT	0x01 /* W */
     58#  define IF_IFSEL    BIT(0)
     59#  define IF_REGSEL   BIT(2)
     60
     61#define	FIFOSTATUS	0x01 /* R */
     62#  define FIFOSTATUS_CHIP_REVISION_MASK 0x0f
     63#  define FIFOSTATUS_CHIP_ID_MASK       0x70
     64#  define FIFOSTATUS_FULL_EMPTY         BIT(7)
     65
     66#define	INDEXREG	0x02 /* R/W */
     67#define	DATAREG		0x03 /* R/W */
     68#define	FIFODATA	0x04 /* R/W */
     69#define	FIFODATA1	0x05 /* R/W */
     70#define	FIFODATA2	0x06 /* R/W */
     71#define	FIFODATA3	0x07 /* R/W */
     72
     73/*====================================================================
     74 * indexed register
     75 ====================================================================*/
     76#define EXTBUSCTRL	0x10 /* R/W,deleted */
     77
     78#define CLOCKDIV	0x11 /* R/W */
     79#  define CLOCK_40M 0x02
     80#  define CLOCK_20M 0x01
     81#  define FAST_20   BIT(2)
     82
     83#define TERMPWRCTRL	0x13 /* R/W */
     84#  define POWER_ON BIT(0)
     85
     86#define SCSIIRQMODE	0x15 /* R/W */
     87#  define SCSI_PHASE_CHANGE_EI BIT(0)
     88#  define RESELECT_EI          BIT(4)
     89#  define FIFO_IRQ_EI          BIT(5)
     90#  define SCSI_RESET_IRQ_EI    BIT(6)
     91
     92#define IRQPHASESENCE	0x16 /* R */
     93#  define LATCHED_MSG      BIT(0)
     94#  define LATCHED_IO       BIT(1)
     95#  define LATCHED_CD       BIT(2)
     96#  define LATCHED_BUS_FREE BIT(3)
     97#  define PHASE_CHANGE_IRQ BIT(4)
     98#  define RESELECT_IRQ     BIT(5)
     99#  define FIFO_IRQ         BIT(6)
    100#  define SCSI_RESET_IRQ   BIT(7)
    101
    102#define TIMERCOUNT	0x17 /* R/W */
    103
    104#define SCSIBUSCTRL	0x18 /* R/W */
    105#  define SCSI_SEL         BIT(0)
    106#  define SCSI_RST         BIT(1)
    107#  define SCSI_DATAOUT_ENB BIT(2)
    108#  define SCSI_ATN         BIT(3)
    109#  define SCSI_ACK         BIT(4)
    110#  define SCSI_BSY         BIT(5)
    111#  define AUTODIRECTION    BIT(6)
    112#  define ACKENB           BIT(7)
    113
    114#define SCSIBUSMON	0x19 /* R */
    115
    116#define SETARBIT	0x1A /* W */
    117#  define ARBIT_GO         BIT(0)
    118#  define ARBIT_FLAG_CLEAR BIT(1)
    119
    120#define ARBITSTATUS	0x1A /* R */
    121/*#  define ARBIT_GO        BIT(0)*/
    122#  define ARBIT_WIN        BIT(1)
    123#  define ARBIT_FAIL       BIT(2)
    124#  define RESELECT_FLAG    BIT(3)
    125
    126#define PARITYCTRL	0x1B  /* W */
    127#define PARITYSTATUS	0x1B  /* R */
    128
    129#define COMMANDCTRL	0x1C  /* W */
    130#  define CLEAR_COMMAND_POINTER BIT(0)
    131#  define AUTO_COMMAND_GO       BIT(1)
    132
    133#define RESELECTID	0x1C  /* R   */
    134#define COMMANDDATA	0x1D  /* R/W */
    135
    136#define POINTERCLR	0x1E  /*   W */
    137#  define POINTER_CLEAR      BIT(0)
    138#  define ACK_COUNTER_CLEAR  BIT(1)
    139#  define REQ_COUNTER_CLEAR  BIT(2)
    140#  define HOST_COUNTER_CLEAR BIT(3)
    141#  define READ_SOURCE        (BIT(4) | BIT(5))
    142#    define ACK_COUNTER        (0)
    143#    define REQ_COUNTER        (BIT(4))
    144#    define HOST_COUNTER       (BIT(5))
    145
    146#define TRANSFERCOUNT	0x1E  /* R   */
    147
    148#define TRANSFERMODE	0x20  /* R/W */
    149#  define MODE_MEM8   BIT(0)
    150#  define MODE_MEM32  BIT(1)
    151#  define MODE_ADR24  BIT(2)
    152#  define MODE_ADR32  BIT(3)
    153#  define MODE_IO8    BIT(4)
    154#  define MODE_IO32   BIT(5)
    155#  define TRANSFER_GO BIT(6)
    156#  define BRAIND      BIT(7)
    157
    158#define SYNCREG		0x21 /* R/W */
    159#  define SYNCREG_OFFSET_MASK  0x0f
    160#  define SYNCREG_PERIOD_MASK  0xf0
    161#  define SYNCREG_PERIOD_SHIFT 4
    162
    163#define SCSIDATALATCH	0x22 /*   W */
    164#define SCSIDATAIN	0x22 /* R   */
    165#define SCSIDATAWITHACK	0x23 /* R/W */
    166#define SCAMCONTROL	0x24 /*   W */
    167#define SCAMSTATUS	0x24 /* R   */
    168#define SCAMDATA	0x25 /* R/W */
    169
    170#define OTHERCONTROL	0x26 /* R/W */
    171#  define TPL_ROM_WRITE_EN BIT(0)
    172#  define TPWR_OUT         BIT(1)
    173#  define TPWR_SENSE       BIT(2)
    174#  define RA8_CONTROL      BIT(3)
    175
    176#define ACKWIDTH	0x27 /* R/W */
    177#define CLRTESTPNT	0x28 /*   W */
    178#define ACKCNTLD	0x29 /*   W */
    179#define REQCNTLD	0x2A /*   W */
    180#define HSTCNTLD	0x2B /*   W */
    181#define CHECKSUM	0x2C /* R/W */
    182
    183/************************************************************************
    184 * Input status bit definitions.
    185 ************************************************************************/
    186#define S_MESSAGE	BIT(0)    /* Message line from SCSI bus      */
    187#define S_IO		BIT(1)    /* Input/Output line from SCSI bus */
    188#define S_CD		BIT(2)    /* Command/Data line from SCSI bus */
    189#define S_BUSY		BIT(3)    /* Busy line from SCSI bus         */
    190#define S_ACK		BIT(4)    /* Acknowledge line from SCSI bus  */
    191#define S_REQUEST	BIT(5)    /* Request line from SCSI bus      */
    192#define S_SELECT	BIT(6)	  /*                                 */
    193#define S_ATN		BIT(7)	  /*                                 */
    194
    195/***********************************************************************
    196 * Useful Bus Monitor status combinations.
    197 ***********************************************************************/
    198#define BUSMON_SEL         S_SELECT
    199#define BUSMON_BSY         S_BUSY
    200#define BUSMON_REQ         S_REQUEST
    201#define BUSMON_IO          S_IO
    202#define BUSMON_ACK         S_ACK
    203#define BUSMON_BUS_FREE    0
    204#define BUSMON_COMMAND     ( S_BUSY | S_CD |                    S_REQUEST )
    205#define BUSMON_MESSAGE_IN  ( S_BUSY | S_CD | S_IO | S_MESSAGE | S_REQUEST )
    206#define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD |        S_MESSAGE | S_REQUEST )
    207#define BUSMON_DATA_IN     ( S_BUSY |        S_IO |             S_REQUEST )
    208#define BUSMON_DATA_OUT    ( S_BUSY |                           S_REQUEST )
    209#define BUSMON_STATUS      ( S_BUSY | S_CD | S_IO |             S_REQUEST )
    210#define BUSMON_SELECT      (                 S_IO |                        S_SELECT )
    211#define BUSMON_RESELECT    (                 S_IO |                        S_SELECT )
    212#define BUSMON_PHASE_MASK  (          S_CD | S_IO | S_MESSAGE |            S_SELECT )
    213
    214#define BUSPHASE_SELECT      ( BUSMON_SELECT      & BUSMON_PHASE_MASK )
    215#define BUSPHASE_COMMAND     ( BUSMON_COMMAND     & BUSMON_PHASE_MASK )
    216#define BUSPHASE_MESSAGE_IN  ( BUSMON_MESSAGE_IN  & BUSMON_PHASE_MASK )
    217#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK )
    218#define BUSPHASE_DATA_IN     ( BUSMON_DATA_IN     & BUSMON_PHASE_MASK )
    219#define BUSPHASE_DATA_OUT    ( BUSMON_DATA_OUT    & BUSMON_PHASE_MASK )
    220#define BUSPHASE_STATUS      ( BUSMON_STATUS      & BUSMON_PHASE_MASK )
    221
    222/*====================================================================*/
    223
    224typedef struct scsi_info_t {
    225	struct pcmcia_device	*p_dev;
    226	struct Scsi_Host      *host;
    227	int                    stop;
    228} scsi_info_t;
    229
    230
    231/* synchronous transfer negotiation data */
    232typedef struct _sync_data {
    233	unsigned int SyncNegotiation;
    234#define SYNC_NOT_YET 0
    235#define SYNC_OK      1
    236#define SYNC_NG      2
    237
    238	unsigned int  SyncPeriod;
    239	unsigned int  SyncOffset;
    240	unsigned char SyncRegister;
    241	unsigned char AckWidth;
    242} sync_data;
    243
    244typedef struct _nsp_hw_data {
    245	unsigned int  BaseAddress;
    246	unsigned int  NumAddress;
    247	unsigned int  IrqNumber;
    248
    249	unsigned long MmioAddress;
    250#define NSP_MMIO_OFFSET 0x0800
    251	unsigned long MmioLength;
    252
    253	unsigned char ScsiClockDiv;
    254
    255	unsigned char TransferMode;
    256
    257	int           TimerCount;
    258	int           SelectionTimeOut;
    259	struct scsi_cmnd *CurrentSC;
    260	//int           CurrnetTarget;
    261
    262	int           FifoCount;
    263
    264#define MSGBUF_SIZE 20
    265	unsigned char MsgBuffer[MSGBUF_SIZE];
    266	int MsgLen;
    267
    268#define N_TARGET 8
    269	sync_data     Sync[N_TARGET];
    270
    271	char nspinfo[110];     /* description */
    272	spinlock_t Lock;
    273
    274	scsi_info_t   *ScsiInfo; /* attach <-> detect glue */
    275
    276
    277#ifdef NSP_DEBUG
    278	int CmdId; /* Accepted command serial number.
    279		      Used for debugging.             */
    280#endif
    281} nsp_hw_data;
    282
    283/****************************************************************************
    284 *
    285 */
    286
    287/* Card service functions */
    288static void        nsp_cs_detach (struct pcmcia_device *p_dev);
    289static void        nsp_cs_release(struct pcmcia_device *link);
    290static int        nsp_cs_config (struct pcmcia_device *link);
    291
    292/* Linux SCSI subsystem specific functions */
    293static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);
    294static const  char      *nsp_info       (struct Scsi_Host *shpnt);
    295static        int        nsp_show_info  (struct seq_file *m,
    296	                                 struct Scsi_Host *host);
    297static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt);
    298
    299/* Error handler */
    300/*static int nsp_eh_abort       (struct scsi_cmnd *SCpnt);*/
    301/*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/
    302static int nsp_eh_bus_reset    (struct scsi_cmnd *SCpnt);
    303static int nsp_eh_host_reset   (struct scsi_cmnd *SCpnt);
    304static int nsp_bus_reset       (nsp_hw_data *data);
    305
    306/* */
    307static void nsphw_init           (nsp_hw_data *data);
    308static bool nsphw_start_selection(struct scsi_cmnd *SCpnt);
    309static void nsp_start_timer      (struct scsi_cmnd *SCpnt, int time);
    310static int  nsp_fifo_count       (struct scsi_cmnd *SCpnt);
    311static void nsp_pio_read         (struct scsi_cmnd *SCpnt);
    312static void nsp_pio_write        (struct scsi_cmnd *SCpnt);
    313static int  nsp_nexus            (struct scsi_cmnd *SCpnt);
    314static void nsp_scsi_done        (struct scsi_cmnd *SCpnt);
    315static int  nsp_analyze_sdtr     (struct scsi_cmnd *SCpnt);
    316static int  nsp_negate_signal    (struct scsi_cmnd *SCpnt,
    317				  unsigned char mask, char *str);
    318static int  nsp_expect_signal    (struct scsi_cmnd *SCpnt,
    319				  unsigned char current_phase,
    320				  unsigned char  mask);
    321static int  nsp_xfer             (struct scsi_cmnd *SCpnt, int phase);
    322static int  nsp_dataphase_bypass (struct scsi_cmnd *SCpnt);
    323static void nsp_reselected       (struct scsi_cmnd *SCpnt);
    324static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);
    325
    326/* Interrupt handler */
    327//static irqreturn_t nspintr(int irq, void *dev_id);
    328
    329/* Debug */
    330#ifdef NSP_DEBUG
    331static void show_command (struct scsi_cmnd *SCpnt);
    332static void show_phase   (struct scsi_cmnd *SCpnt);
    333static void show_busphase(unsigned char stat);
    334static void show_message (nsp_hw_data *data);
    335#else
    336# define show_command(ptr)   /* */
    337# define show_phase(SCpnt)   /* */
    338# define show_busphase(stat) /* */
    339# define show_message(data)  /* */
    340#endif
    341
    342/*
    343 * SCSI phase
    344 */
    345enum _scsi_phase {
    346	PH_UNDETERMINED ,
    347	PH_ARBSTART     ,
    348	PH_SELSTART     ,
    349	PH_SELECTED     ,
    350	PH_COMMAND      ,
    351	PH_DATA         ,
    352	PH_STATUS       ,
    353	PH_MSG_IN       ,
    354	PH_MSG_OUT      ,
    355	PH_DISCONNECT   ,
    356	PH_RESELECT     ,
    357	PH_ABORT        ,
    358	PH_RESET
    359};
    360
    361enum _data_in_out {
    362	IO_UNKNOWN,
    363	IO_IN,
    364	IO_OUT
    365};
    366
    367enum _burst_mode {
    368	BURST_IO8   = 0,
    369	BURST_IO32  = 1,
    370	BURST_MEM32 = 2,
    371};
    372
    373/* scatter-gather table */
    374#define BUFFER_ADDR(SCpnt) ((char *)(sg_virt(nsp_priv(SCpnt)->buffer)))
    375
    376#endif  /*__nsp_cs__*/
    377/* end */