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

sata_promise.h (3138B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *  sata_promise.h - Promise SATA common definitions and inline funcs
      4 *
      5 *  Copyright 2003-2004 Red Hat, Inc.
      6 *
      7 *  libata documentation is available via 'make {ps|pdf}docs',
      8 *  as Documentation/driver-api/libata.rst
      9 */
     10
     11#ifndef __SATA_PROMISE_H__
     12#define __SATA_PROMISE_H__
     13
     14#include <linux/ata.h>
     15
     16enum pdc_packet_bits {
     17	PDC_PKT_READ		= (1 << 2),
     18	PDC_PKT_NODATA		= (1 << 3),
     19
     20	PDC_PKT_SIZEMASK	= (1 << 7) | (1 << 6) | (1 << 5),
     21	PDC_PKT_CLEAR_BSY	= (1 << 4),
     22	PDC_PKT_WAIT_DRDY	= (1 << 3) | (1 << 4),
     23	PDC_LAST_REG		= (1 << 3),
     24
     25	PDC_REG_DEVCTL		= (1 << 3) | (1 << 2) | (1 << 1),
     26};
     27
     28static inline unsigned int pdc_pkt_header(struct ata_taskfile *tf,
     29					  dma_addr_t sg_table,
     30					  unsigned int devno, u8 *buf)
     31{
     32	u8 dev_reg;
     33	__le32 *buf32 = (__le32 *) buf;
     34
     35	/* set control bits (byte 0), zero delay seq id (byte 3),
     36	 * and seq id (byte 2)
     37	 */
     38	switch (tf->protocol) {
     39	case ATA_PROT_DMA:
     40		if (!(tf->flags & ATA_TFLAG_WRITE))
     41			buf32[0] = cpu_to_le32(PDC_PKT_READ);
     42		else
     43			buf32[0] = 0;
     44		break;
     45
     46	case ATA_PROT_NODATA:
     47		buf32[0] = cpu_to_le32(PDC_PKT_NODATA);
     48		break;
     49
     50	default:
     51		BUG();
     52		break;
     53	}
     54
     55	buf32[1] = cpu_to_le32(sg_table);	/* S/G table addr */
     56	buf32[2] = 0;				/* no next-packet */
     57
     58	if (devno == 0)
     59		dev_reg = ATA_DEVICE_OBS;
     60	else
     61		dev_reg = ATA_DEVICE_OBS | ATA_DEV1;
     62
     63	/* select device */
     64	buf[12] = (1 << 5) | PDC_PKT_CLEAR_BSY | ATA_REG_DEVICE;
     65	buf[13] = dev_reg;
     66
     67	/* device control register */
     68	buf[14] = (1 << 5) | PDC_REG_DEVCTL;
     69	buf[15] = tf->ctl;
     70
     71	return 16; 	/* offset of next byte */
     72}
     73
     74static inline unsigned int pdc_pkt_footer(struct ata_taskfile *tf, u8 *buf,
     75				  unsigned int i)
     76{
     77	if (tf->flags & ATA_TFLAG_DEVICE) {
     78		buf[i++] = (1 << 5) | ATA_REG_DEVICE;
     79		buf[i++] = tf->device;
     80	}
     81
     82	/* and finally the command itself; also includes end-of-pkt marker */
     83	buf[i++] = (1 << 5) | PDC_LAST_REG | ATA_REG_CMD;
     84	buf[i++] = tf->command;
     85
     86	return i;
     87}
     88
     89static inline unsigned int pdc_prep_lba28(struct ata_taskfile *tf, u8 *buf, unsigned int i)
     90{
     91	/* the "(1 << 5)" should be read "(count << 5)" */
     92
     93	/* ATA command block registers */
     94	buf[i++] = (1 << 5) | ATA_REG_FEATURE;
     95	buf[i++] = tf->feature;
     96
     97	buf[i++] = (1 << 5) | ATA_REG_NSECT;
     98	buf[i++] = tf->nsect;
     99
    100	buf[i++] = (1 << 5) | ATA_REG_LBAL;
    101	buf[i++] = tf->lbal;
    102
    103	buf[i++] = (1 << 5) | ATA_REG_LBAM;
    104	buf[i++] = tf->lbam;
    105
    106	buf[i++] = (1 << 5) | ATA_REG_LBAH;
    107	buf[i++] = tf->lbah;
    108
    109	return i;
    110}
    111
    112static inline unsigned int pdc_prep_lba48(struct ata_taskfile *tf, u8 *buf, unsigned int i)
    113{
    114	/* the "(2 << 5)" should be read "(count << 5)" */
    115
    116	/* ATA command block registers */
    117	buf[i++] = (2 << 5) | ATA_REG_FEATURE;
    118	buf[i++] = tf->hob_feature;
    119	buf[i++] = tf->feature;
    120
    121	buf[i++] = (2 << 5) | ATA_REG_NSECT;
    122	buf[i++] = tf->hob_nsect;
    123	buf[i++] = tf->nsect;
    124
    125	buf[i++] = (2 << 5) | ATA_REG_LBAL;
    126	buf[i++] = tf->hob_lbal;
    127	buf[i++] = tf->lbal;
    128
    129	buf[i++] = (2 << 5) | ATA_REG_LBAM;
    130	buf[i++] = tf->hob_lbam;
    131	buf[i++] = tf->lbam;
    132
    133	buf[i++] = (2 << 5) | ATA_REG_LBAH;
    134	buf[i++] = tf->hob_lbah;
    135	buf[i++] = tf->lbah;
    136
    137	return i;
    138}
    139
    140
    141#endif /* __SATA_PROMISE_H__ */