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

sd.h (7942B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _SCSI_DISK_H
      3#define _SCSI_DISK_H
      4
      5/*
      6 * More than enough for everybody ;)  The huge number of majors
      7 * is a leftover from 16bit dev_t days, we don't really need that
      8 * much numberspace.
      9 */
     10#define SD_MAJORS	16
     11
     12/*
     13 * Time out in seconds for disks and Magneto-opticals (which are slower).
     14 */
     15#define SD_TIMEOUT		(30 * HZ)
     16#define SD_MOD_TIMEOUT		(75 * HZ)
     17/*
     18 * Flush timeout is a multiplier over the standard device timeout which is
     19 * user modifiable via sysfs but initially set to SD_TIMEOUT
     20 */
     21#define SD_FLUSH_TIMEOUT_MULTIPLIER	2
     22#define SD_WRITE_SAME_TIMEOUT	(120 * HZ)
     23
     24/*
     25 * Number of allowed retries
     26 */
     27#define SD_MAX_RETRIES		5
     28#define SD_PASSTHROUGH_RETRIES	1
     29#define SD_MAX_MEDIUM_TIMEOUTS	2
     30
     31/*
     32 * Size of the initial data buffer for mode and read capacity data
     33 */
     34#define SD_BUF_SIZE		512
     35
     36/*
     37 * Number of sectors at the end of the device to avoid multi-sector
     38 * accesses to in the case of last_sector_bug
     39 */
     40#define SD_LAST_BUGGY_SECTORS	8
     41
     42enum {
     43	SD_EXT_CDB_SIZE = 32,	/* Extended CDB size */
     44	SD_MEMPOOL_SIZE = 2,	/* CDB pool size */
     45};
     46
     47enum {
     48	SD_DEF_XFER_BLOCKS = 0xffff,
     49	SD_MAX_XFER_BLOCKS = 0xffffffff,
     50	SD_MAX_WS10_BLOCKS = 0xffff,
     51	SD_MAX_WS16_BLOCKS = 0x7fffff,
     52};
     53
     54enum {
     55	SD_LBP_FULL = 0,	/* Full logical block provisioning */
     56	SD_LBP_UNMAP,		/* Use UNMAP command */
     57	SD_LBP_WS16,		/* Use WRITE SAME(16) with UNMAP bit */
     58	SD_LBP_WS10,		/* Use WRITE SAME(10) with UNMAP bit */
     59	SD_LBP_ZERO,		/* Use WRITE SAME(10) with zero payload */
     60	SD_LBP_DISABLE,		/* Discard disabled due to failed cmd */
     61};
     62
     63enum {
     64	SD_ZERO_WRITE = 0,	/* Use WRITE(10/16) command */
     65	SD_ZERO_WS,		/* Use WRITE SAME(10/16) command */
     66	SD_ZERO_WS16_UNMAP,	/* Use WRITE SAME(16) with UNMAP */
     67	SD_ZERO_WS10_UNMAP,	/* Use WRITE SAME(10) with UNMAP */
     68};
     69
     70/**
     71 * struct zoned_disk_info - Specific properties of a ZBC SCSI device.
     72 * @nr_zones: number of zones.
     73 * @zone_blocks: number of logical blocks per zone.
     74 *
     75 * This data structure holds the ZBC SCSI device properties that are retrieved
     76 * twice: a first time before the gendisk capacity is known and a second time
     77 * after the gendisk capacity is known.
     78 */
     79struct zoned_disk_info {
     80	u32		nr_zones;
     81	u32		zone_blocks;
     82};
     83
     84struct scsi_disk {
     85	struct scsi_device *device;
     86
     87	/*
     88	 * disk_dev is used to show attributes in /sys/class/scsi_disk/,
     89	 * but otherwise not really needed.  Do not use for refcounting.
     90	 */
     91	struct device	disk_dev;
     92	struct gendisk	*disk;
     93	struct opal_dev *opal_dev;
     94#ifdef CONFIG_BLK_DEV_ZONED
     95	/* Updated during revalidation before the gendisk capacity is known. */
     96	struct zoned_disk_info	early_zone_info;
     97	/* Updated during revalidation after the gendisk capacity is known. */
     98	struct zoned_disk_info	zone_info;
     99	u32		zones_optimal_open;
    100	u32		zones_optimal_nonseq;
    101	u32		zones_max_open;
    102	/*
    103	 * Either zero or a power of two. If not zero it means that the offset
    104	 * between zone starting LBAs is constant.
    105	 */
    106	u32		zone_starting_lba_gran;
    107	u32		*zones_wp_offset;
    108	spinlock_t	zones_wp_offset_lock;
    109	u32		*rev_wp_offset;
    110	struct mutex	rev_mutex;
    111	struct work_struct zone_wp_offset_work;
    112	char		*zone_wp_update_buf;
    113#endif
    114	atomic_t	openers;
    115	sector_t	capacity;	/* size in logical blocks */
    116	int		max_retries;
    117	u32		min_xfer_blocks;
    118	u32		max_xfer_blocks;
    119	u32		opt_xfer_blocks;
    120	u32		max_ws_blocks;
    121	u32		max_unmap_blocks;
    122	u32		unmap_granularity;
    123	u32		unmap_alignment;
    124	u32		index;
    125	unsigned int	physical_block_size;
    126	unsigned int	max_medium_access_timeouts;
    127	unsigned int	medium_access_timed_out;
    128	u8		media_present;
    129	u8		write_prot;
    130	u8		protection_type;/* Data Integrity Field */
    131	u8		provisioning_mode;
    132	u8		zeroing_mode;
    133	u8		nr_actuators;		/* Number of actuators */
    134	unsigned	ATO : 1;	/* state of disk ATO bit */
    135	unsigned	cache_override : 1; /* temp override of WCE,RCD */
    136	unsigned	WCE : 1;	/* state of disk WCE bit */
    137	unsigned	RCD : 1;	/* state of disk RCD bit, unused */
    138	unsigned	DPOFUA : 1;	/* state of disk DPOFUA bit */
    139	unsigned	first_scan : 1;
    140	unsigned	lbpme : 1;
    141	unsigned	lbprz : 1;
    142	unsigned	lbpu : 1;
    143	unsigned	lbpws : 1;
    144	unsigned	lbpws10 : 1;
    145	unsigned	lbpvpd : 1;
    146	unsigned	ws10 : 1;
    147	unsigned	ws16 : 1;
    148	unsigned	rc_basis: 2;
    149	unsigned	zoned: 2;
    150	unsigned	urswrz : 1;
    151	unsigned	security : 1;
    152	unsigned	ignore_medium_access_errors : 1;
    153};
    154#define to_scsi_disk(obj) container_of(obj, struct scsi_disk, disk_dev)
    155
    156static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
    157{
    158	return disk->private_data;
    159}
    160
    161#define sd_printk(prefix, sdsk, fmt, a...)				\
    162        (sdsk)->disk ?							\
    163	      sdev_prefix_printk(prefix, (sdsk)->device,		\
    164				 (sdsk)->disk->disk_name, fmt, ##a) :	\
    165	      sdev_printk(prefix, (sdsk)->device, fmt, ##a)
    166
    167#define sd_first_printk(prefix, sdsk, fmt, a...)			\
    168	do {								\
    169		if ((sdsk)->first_scan)					\
    170			sd_printk(prefix, sdsk, fmt, ##a);		\
    171	} while (0)
    172
    173static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
    174{
    175	switch (scmd->cmnd[0]) {
    176	case READ_6:
    177	case READ_10:
    178	case READ_12:
    179	case READ_16:
    180	case SYNCHRONIZE_CACHE:
    181	case VERIFY:
    182	case VERIFY_12:
    183	case VERIFY_16:
    184	case WRITE_6:
    185	case WRITE_10:
    186	case WRITE_12:
    187	case WRITE_16:
    188	case WRITE_SAME:
    189	case WRITE_SAME_16:
    190	case UNMAP:
    191		return 1;
    192	case VARIABLE_LENGTH_CMD:
    193		switch (scmd->cmnd[9]) {
    194		case READ_32:
    195		case VERIFY_32:
    196		case WRITE_32:
    197		case WRITE_SAME_32:
    198			return 1;
    199		}
    200	}
    201
    202	return 0;
    203}
    204
    205static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks)
    206{
    207	return blocks << (ilog2(sdev->sector_size) - 9);
    208}
    209
    210static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks)
    211{
    212	return blocks * sdev->sector_size;
    213}
    214
    215static inline sector_t bytes_to_logical(struct scsi_device *sdev, unsigned int bytes)
    216{
    217	return bytes >> ilog2(sdev->sector_size);
    218}
    219
    220static inline sector_t sectors_to_logical(struct scsi_device *sdev, sector_t sector)
    221{
    222	return sector >> (ilog2(sdev->sector_size) - 9);
    223}
    224
    225#ifdef CONFIG_BLK_DEV_INTEGRITY
    226
    227extern void sd_dif_config_host(struct scsi_disk *);
    228
    229#else /* CONFIG_BLK_DEV_INTEGRITY */
    230
    231static inline void sd_dif_config_host(struct scsi_disk *disk)
    232{
    233}
    234
    235#endif /* CONFIG_BLK_DEV_INTEGRITY */
    236
    237static inline int sd_is_zoned(struct scsi_disk *sdkp)
    238{
    239	return sdkp->zoned == 1 || sdkp->device->type == TYPE_ZBC;
    240}
    241
    242#ifdef CONFIG_BLK_DEV_ZONED
    243
    244void sd_zbc_free_zone_info(struct scsi_disk *sdkp);
    245int sd_zbc_read_zones(struct scsi_disk *sdkp, u8 buf[SD_BUF_SIZE]);
    246int sd_zbc_revalidate_zones(struct scsi_disk *sdkp);
    247blk_status_t sd_zbc_setup_zone_mgmt_cmnd(struct scsi_cmnd *cmd,
    248					 unsigned char op, bool all);
    249unsigned int sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
    250			     struct scsi_sense_hdr *sshdr);
    251int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
    252		unsigned int nr_zones, report_zones_cb cb, void *data);
    253
    254blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
    255				        unsigned int nr_blocks);
    256
    257#else /* CONFIG_BLK_DEV_ZONED */
    258
    259static inline void sd_zbc_free_zone_info(struct scsi_disk *sdkp) {}
    260
    261static inline int sd_zbc_read_zones(struct scsi_disk *sdkp, u8 buf[SD_BUF_SIZE])
    262{
    263	return 0;
    264}
    265
    266static inline int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
    267{
    268	return 0;
    269}
    270
    271static inline blk_status_t sd_zbc_setup_zone_mgmt_cmnd(struct scsi_cmnd *cmd,
    272						       unsigned char op,
    273						       bool all)
    274{
    275	return BLK_STS_TARGET;
    276}
    277
    278static inline unsigned int sd_zbc_complete(struct scsi_cmnd *cmd,
    279			unsigned int good_bytes, struct scsi_sense_hdr *sshdr)
    280{
    281	return good_bytes;
    282}
    283
    284static inline blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd,
    285						      sector_t *lba,
    286						      unsigned int nr_blocks)
    287{
    288	return BLK_STS_TARGET;
    289}
    290
    291#define sd_zbc_report_zones NULL
    292
    293#endif /* CONFIG_BLK_DEV_ZONED */
    294
    295void sd_print_sense_hdr(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr);
    296void sd_print_result(const struct scsi_disk *sdkp, const char *msg, int result);
    297
    298#endif /* _SCSI_DISK_H */