162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ipr.h -- driver for IBM Power Linux RAID adapters
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Written By: Brian King <brking@us.ibm.com>, IBM Corporation
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2003, 2004 IBM Corporation
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Alan Cox <alan@lxorguk.ukuu.org.uk> - Removed several careless u32/dma_addr_t errors
1062306a36Sopenharmony_ci *				that broke 64bit platforms.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifndef _IPR_H
1462306a36Sopenharmony_ci#define _IPR_H
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <asm/unaligned.h>
1762306a36Sopenharmony_ci#include <linux/types.h>
1862306a36Sopenharmony_ci#include <linux/completion.h>
1962306a36Sopenharmony_ci#include <linux/list.h>
2062306a36Sopenharmony_ci#include <linux/kref.h>
2162306a36Sopenharmony_ci#include <linux/irq_poll.h>
2262306a36Sopenharmony_ci#include <scsi/scsi.h>
2362306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * Literals
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_ci#define IPR_DRIVER_VERSION "2.6.4"
2962306a36Sopenharmony_ci#define IPR_DRIVER_DATE "(March 14, 2017)"
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
3362306a36Sopenharmony_ci *	ops per device for devices not running tagged command queuing.
3462306a36Sopenharmony_ci *	This can be adjusted at runtime through sysfs device attributes.
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_ci#define IPR_MAX_CMD_PER_LUN				6
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/*
3962306a36Sopenharmony_ci * IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of
4062306a36Sopenharmony_ci *	ops the mid-layer can send to the adapter.
4162306a36Sopenharmony_ci */
4262306a36Sopenharmony_ci#define IPR_NUM_BASE_CMD_BLKS			(ioa_cfg->max_cmds)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_OBSIDIAN_E	0x0339
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_CROC_FPGA_E2          0x033D
4762306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_CROCODILE             0x034A
4862306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_RATTLESNAKE		0x04DA
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_2780	0x0264
5162306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_5702	0x0266
5262306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_5703	0x0278
5362306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_572E	0x028D
5462306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_573E	0x02D3
5562306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_573D	0x02D4
5662306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_571A	0x02C0
5762306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_571B	0x02BE
5862306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_571E	0x02BF
5962306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_571F	0x02D5
6062306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_572A	0x02C1
6162306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_572B	0x02C2
6262306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_572F	0x02C3
6362306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_574E	0x030A
6462306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_575B	0x030D
6562306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_575C	0x0338
6662306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B3	0x033A
6762306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B7	0x0360
6862306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B8	0x02C2
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B4    0x033B
7162306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B2    0x035F
7262306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57C0    0x0352
7362306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57C3    0x0353
7462306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57C4    0x0354
7562306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57C6    0x0357
7662306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57CC    0x035C
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B5    0x033C
7962306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57CE    0x035E
8062306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57B1    0x0355
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_574D    0x0356
8362306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57C8    0x035D
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57D5    0x03FB
8662306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57D6    0x03FC
8762306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57D7    0x03FF
8862306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57D8    0x03FE
8962306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57D9    0x046D
9062306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57DA    0x04CA
9162306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57EB    0x0474
9262306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57EC    0x0475
9362306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57ED    0x0499
9462306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57EE    0x049A
9562306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57EF    0x049B
9662306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_57F0    0x049C
9762306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_2CCA	0x04C7
9862306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_2CD2	0x04C8
9962306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_2CCD	0x04C9
10062306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_580A	0x04FC
10162306a36Sopenharmony_ci#define IPR_SUBS_DEV_ID_580B	0x04FB
10262306a36Sopenharmony_ci#define IPR_NAME				"ipr"
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/*
10562306a36Sopenharmony_ci * Return codes
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_ci#define IPR_RC_JOB_CONTINUE		1
10862306a36Sopenharmony_ci#define IPR_RC_JOB_RETURN		2
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/*
11162306a36Sopenharmony_ci * IOASCs
11262306a36Sopenharmony_ci */
11362306a36Sopenharmony_ci#define IPR_IOASC_NR_INIT_CMD_REQUIRED		0x02040200
11462306a36Sopenharmony_ci#define IPR_IOASC_NR_IOA_RESET_REQUIRED		0x02048000
11562306a36Sopenharmony_ci#define IPR_IOASC_SYNC_REQUIRED			0x023f0000
11662306a36Sopenharmony_ci#define IPR_IOASC_MED_DO_NOT_REALLOC		0x03110C00
11762306a36Sopenharmony_ci#define IPR_IOASC_HW_SEL_TIMEOUT			0x04050000
11862306a36Sopenharmony_ci#define IPR_IOASC_HW_DEV_BUS_STATUS			0x04448500
11962306a36Sopenharmony_ci#define	IPR_IOASC_IOASC_MASK			0xFFFFFF00
12062306a36Sopenharmony_ci#define	IPR_IOASC_SCSI_STATUS_MASK		0x000000FF
12162306a36Sopenharmony_ci#define IPR_IOASC_HW_CMD_FAILED			0x046E0000
12262306a36Sopenharmony_ci#define IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT	0x05240000
12362306a36Sopenharmony_ci#define IPR_IOASC_IR_RESOURCE_HANDLE		0x05250000
12462306a36Sopenharmony_ci#define IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA		0x05258100
12562306a36Sopenharmony_ci#define IPR_IOASA_IR_DUAL_IOA_DISABLED		0x052C8000
12662306a36Sopenharmony_ci#define IPR_IOASC_BUS_WAS_RESET			0x06290000
12762306a36Sopenharmony_ci#define IPR_IOASC_BUS_WAS_RESET_BY_OTHER		0x06298000
12862306a36Sopenharmony_ci#define IPR_IOASC_ABORTED_CMD_TERM_BY_HOST	0x0B5A0000
12962306a36Sopenharmony_ci#define IPR_IOASC_IR_NON_OPTIMIZED		0x05258200
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci#define IPR_FIRST_DRIVER_IOASC			0x10000000
13262306a36Sopenharmony_ci#define IPR_IOASC_IOA_WAS_RESET			0x10000001
13362306a36Sopenharmony_ci#define IPR_IOASC_PCI_ACCESS_ERROR			0x10000002
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci/* Driver data flags */
13662306a36Sopenharmony_ci#define IPR_USE_LONG_TRANSOP_TIMEOUT		0x00000001
13762306a36Sopenharmony_ci#define IPR_USE_PCI_WARM_RESET			0x00000002
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci#define IPR_DEFAULT_MAX_ERROR_DUMP			984
14062306a36Sopenharmony_ci#define IPR_NUM_LOG_HCAMS				2
14162306a36Sopenharmony_ci#define IPR_NUM_CFG_CHG_HCAMS				2
14262306a36Sopenharmony_ci#define IPR_NUM_HCAM_QUEUE				12
14362306a36Sopenharmony_ci#define IPR_NUM_HCAMS	(IPR_NUM_LOG_HCAMS + IPR_NUM_CFG_CHG_HCAMS)
14462306a36Sopenharmony_ci#define IPR_MAX_HCAMS	(IPR_NUM_HCAMS + IPR_NUM_HCAM_QUEUE)
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#define IPR_MAX_SIS64_TARGETS_PER_BUS			1024
14762306a36Sopenharmony_ci#define IPR_MAX_SIS64_LUNS_PER_TARGET			0xffffffff
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#define IPR_MAX_NUM_TARGETS_PER_BUS			256
15062306a36Sopenharmony_ci#define IPR_MAX_NUM_LUNS_PER_TARGET			256
15162306a36Sopenharmony_ci#define IPR_VSET_BUS					0xff
15262306a36Sopenharmony_ci#define IPR_IOA_BUS						0xff
15362306a36Sopenharmony_ci#define IPR_IOA_TARGET					0xff
15462306a36Sopenharmony_ci#define IPR_IOA_LUN						0xff
15562306a36Sopenharmony_ci#define IPR_MAX_NUM_BUSES				16
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#define IPR_NUM_RESET_RELOAD_RETRIES		3
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci/* We need resources for HCAMS, IOA reset, IOA bringdown, and ERP */
16062306a36Sopenharmony_ci#define IPR_NUM_INTERNAL_CMD_BLKS	(IPR_NUM_HCAMS + \
16162306a36Sopenharmony_ci                                     ((IPR_NUM_RESET_RELOAD_RETRIES + 1) * 2) + 4)
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci#define IPR_MAX_COMMANDS		100
16462306a36Sopenharmony_ci#define IPR_NUM_CMD_BLKS		(IPR_NUM_BASE_CMD_BLKS + \
16562306a36Sopenharmony_ci						IPR_NUM_INTERNAL_CMD_BLKS)
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci#define IPR_MAX_PHYSICAL_DEVS				192
16862306a36Sopenharmony_ci#define IPR_DEFAULT_SIS64_DEVS				1024
16962306a36Sopenharmony_ci#define IPR_MAX_SIS64_DEVS				4096
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#define IPR_MAX_SGLIST					64
17262306a36Sopenharmony_ci#define IPR_IOA_MAX_SECTORS				32767
17362306a36Sopenharmony_ci#define IPR_VSET_MAX_SECTORS				512
17462306a36Sopenharmony_ci#define IPR_MAX_CDB_LEN					16
17562306a36Sopenharmony_ci#define IPR_MAX_HRRQ_RETRIES				3
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci#define IPR_DEFAULT_BUS_WIDTH				16
17862306a36Sopenharmony_ci#define IPR_80MBs_SCSI_RATE		((80 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))
17962306a36Sopenharmony_ci#define IPR_U160_SCSI_RATE	((160 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))
18062306a36Sopenharmony_ci#define IPR_U320_SCSI_RATE	((320 * 10) / (IPR_DEFAULT_BUS_WIDTH / 8))
18162306a36Sopenharmony_ci#define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8))
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci#define IPR_IOA_RES_HANDLE				0xffffffff
18462306a36Sopenharmony_ci#define IPR_INVALID_RES_HANDLE			0
18562306a36Sopenharmony_ci#define IPR_IOA_RES_ADDR				0x00ffffff
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/*
18862306a36Sopenharmony_ci * Adapter Commands
18962306a36Sopenharmony_ci */
19062306a36Sopenharmony_ci#define IPR_CANCEL_REQUEST				0xC0
19162306a36Sopenharmony_ci#define	IPR_CANCEL_64BIT_IOARCB			0x01
19262306a36Sopenharmony_ci#define IPR_QUERY_RSRC_STATE				0xC2
19362306a36Sopenharmony_ci#define IPR_RESET_DEVICE				0xC3
19462306a36Sopenharmony_ci#define	IPR_RESET_TYPE_SELECT				0x80
19562306a36Sopenharmony_ci#define	IPR_LUN_RESET					0x40
19662306a36Sopenharmony_ci#define	IPR_TARGET_RESET					0x20
19762306a36Sopenharmony_ci#define	IPR_BUS_RESET					0x10
19862306a36Sopenharmony_ci#define IPR_ID_HOST_RR_Q				0xC4
19962306a36Sopenharmony_ci#define IPR_QUERY_IOA_CONFIG				0xC5
20062306a36Sopenharmony_ci#define IPR_CANCEL_ALL_REQUESTS			0xCE
20162306a36Sopenharmony_ci#define IPR_HOST_CONTROLLED_ASYNC			0xCF
20262306a36Sopenharmony_ci#define	IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE	0x01
20362306a36Sopenharmony_ci#define	IPR_HCAM_CDB_OP_CODE_LOG_DATA		0x02
20462306a36Sopenharmony_ci#define IPR_SET_SUPPORTED_DEVICES			0xFB
20562306a36Sopenharmony_ci#define IPR_SET_ALL_SUPPORTED_DEVICES			0x80
20662306a36Sopenharmony_ci#define IPR_IOA_SHUTDOWN				0xF7
20762306a36Sopenharmony_ci#define	IPR_WR_BUF_DOWNLOAD_AND_SAVE			0x05
20862306a36Sopenharmony_ci#define IPR_IOA_SERVICE_ACTION				0xD2
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci/* IOA Service Actions */
21162306a36Sopenharmony_ci#define IPR_IOA_SA_CHANGE_CACHE_PARAMS			0x14
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci/*
21462306a36Sopenharmony_ci * Timeouts
21562306a36Sopenharmony_ci */
21662306a36Sopenharmony_ci#define IPR_SHUTDOWN_TIMEOUT			(ipr_fastfail ? 60 * HZ : 10 * 60 * HZ)
21762306a36Sopenharmony_ci#define IPR_VSET_RW_TIMEOUT			(ipr_fastfail ? 30 * HZ : 2 * 60 * HZ)
21862306a36Sopenharmony_ci#define IPR_ABBREV_SHUTDOWN_TIMEOUT		(10 * HZ)
21962306a36Sopenharmony_ci#define IPR_DUAL_IOA_ABBR_SHUTDOWN_TO	(2 * 60 * HZ)
22062306a36Sopenharmony_ci#define IPR_DEVICE_RESET_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)
22162306a36Sopenharmony_ci#define IPR_CANCEL_TIMEOUT			(ipr_fastfail ? 10 * HZ : 30 * HZ)
22262306a36Sopenharmony_ci#define IPR_CANCEL_ALL_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)
22362306a36Sopenharmony_ci#define IPR_ABORT_TASK_TIMEOUT		(ipr_fastfail ? 10 * HZ : 30 * HZ)
22462306a36Sopenharmony_ci#define IPR_INTERNAL_TIMEOUT			(ipr_fastfail ? 10 * HZ : 30 * HZ)
22562306a36Sopenharmony_ci#define IPR_WRITE_BUFFER_TIMEOUT		(30 * 60 * HZ)
22662306a36Sopenharmony_ci#define IPR_SET_SUP_DEVICE_TIMEOUT		(2 * 60 * HZ)
22762306a36Sopenharmony_ci#define IPR_REQUEST_SENSE_TIMEOUT		(10 * HZ)
22862306a36Sopenharmony_ci#define IPR_OPERATIONAL_TIMEOUT		(5 * 60)
22962306a36Sopenharmony_ci#define IPR_LONG_OPERATIONAL_TIMEOUT	(12 * 60)
23062306a36Sopenharmony_ci#define IPR_WAIT_FOR_RESET_TIMEOUT		(2 * HZ)
23162306a36Sopenharmony_ci#define IPR_CHECK_FOR_RESET_TIMEOUT		(HZ / 10)
23262306a36Sopenharmony_ci#define IPR_WAIT_FOR_BIST_TIMEOUT		(2 * HZ)
23362306a36Sopenharmony_ci#define IPR_PCI_ERROR_RECOVERY_TIMEOUT	(120 * HZ)
23462306a36Sopenharmony_ci#define IPR_PCI_RESET_TIMEOUT			(HZ / 2)
23562306a36Sopenharmony_ci#define IPR_SIS32_DUMP_TIMEOUT			(15 * HZ)
23662306a36Sopenharmony_ci#define IPR_SIS64_DUMP_TIMEOUT			(40 * HZ)
23762306a36Sopenharmony_ci#define IPR_DUMP_DELAY_SECONDS			4
23862306a36Sopenharmony_ci#define IPR_DUMP_DELAY_TIMEOUT			(IPR_DUMP_DELAY_SECONDS * HZ)
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci/*
24162306a36Sopenharmony_ci * SCSI Literals
24262306a36Sopenharmony_ci */
24362306a36Sopenharmony_ci#define IPR_VENDOR_ID_LEN			8
24462306a36Sopenharmony_ci#define IPR_PROD_ID_LEN				16
24562306a36Sopenharmony_ci#define IPR_SERIAL_NUM_LEN			8
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci/*
24862306a36Sopenharmony_ci * Hardware literals
24962306a36Sopenharmony_ci */
25062306a36Sopenharmony_ci#define IPR_FMT2_MBX_ADDR_MASK				0x0fffffff
25162306a36Sopenharmony_ci#define IPR_FMT2_MBX_BAR_SEL_MASK			0xf0000000
25262306a36Sopenharmony_ci#define IPR_FMT2_MKR_BAR_SEL_SHIFT			28
25362306a36Sopenharmony_ci#define IPR_GET_FMT2_BAR_SEL(mbx) \
25462306a36Sopenharmony_ci(((mbx) & IPR_FMT2_MBX_BAR_SEL_MASK) >> IPR_FMT2_MKR_BAR_SEL_SHIFT)
25562306a36Sopenharmony_ci#define IPR_SDT_FMT2_BAR0_SEL				0x0
25662306a36Sopenharmony_ci#define IPR_SDT_FMT2_BAR1_SEL				0x1
25762306a36Sopenharmony_ci#define IPR_SDT_FMT2_BAR2_SEL				0x2
25862306a36Sopenharmony_ci#define IPR_SDT_FMT2_BAR3_SEL				0x3
25962306a36Sopenharmony_ci#define IPR_SDT_FMT2_BAR4_SEL				0x4
26062306a36Sopenharmony_ci#define IPR_SDT_FMT2_BAR5_SEL				0x5
26162306a36Sopenharmony_ci#define IPR_SDT_FMT2_EXP_ROM_SEL			0x8
26262306a36Sopenharmony_ci#define IPR_FMT2_SDT_READY_TO_USE			0xC4D4E3F2
26362306a36Sopenharmony_ci#define IPR_FMT3_SDT_READY_TO_USE			0xC4D4E3F3
26462306a36Sopenharmony_ci#define IPR_DOORBELL					0x82800000
26562306a36Sopenharmony_ci#define IPR_RUNTIME_RESET				0x40000000
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci#define IPR_IPL_INIT_MIN_STAGE_TIME			5
26862306a36Sopenharmony_ci#define IPR_IPL_INIT_DEFAULT_STAGE_TIME                 30
26962306a36Sopenharmony_ci#define IPR_IPL_INIT_STAGE_UNKNOWN			0x0
27062306a36Sopenharmony_ci#define IPR_IPL_INIT_STAGE_TRANSOP			0xB0000000
27162306a36Sopenharmony_ci#define IPR_IPL_INIT_STAGE_MASK				0xff000000
27262306a36Sopenharmony_ci#define IPR_IPL_INIT_STAGE_TIME_MASK			0x0000ffff
27362306a36Sopenharmony_ci#define IPR_PCII_IPL_STAGE_CHANGE			(0x80000000 >> 0)
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci#define IPR_PCII_MAILBOX_STABLE				(0x80000000 >> 4)
27662306a36Sopenharmony_ci#define IPR_WAIT_FOR_MAILBOX				(2 * HZ)
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci#define IPR_PCII_IOA_TRANS_TO_OPER			(0x80000000 >> 0)
27962306a36Sopenharmony_ci#define IPR_PCII_IOARCB_XFER_FAILED			(0x80000000 >> 3)
28062306a36Sopenharmony_ci#define IPR_PCII_IOA_UNIT_CHECKED			(0x80000000 >> 4)
28162306a36Sopenharmony_ci#define IPR_PCII_NO_HOST_RRQ				(0x80000000 >> 5)
28262306a36Sopenharmony_ci#define IPR_PCII_CRITICAL_OPERATION			(0x80000000 >> 6)
28362306a36Sopenharmony_ci#define IPR_PCII_IO_DEBUG_ACKNOWLEDGE		(0x80000000 >> 7)
28462306a36Sopenharmony_ci#define IPR_PCII_IOARRIN_LOST				(0x80000000 >> 27)
28562306a36Sopenharmony_ci#define IPR_PCII_MMIO_ERROR				(0x80000000 >> 28)
28662306a36Sopenharmony_ci#define IPR_PCII_PROC_ERR_STATE			(0x80000000 >> 29)
28762306a36Sopenharmony_ci#define IPR_PCII_HRRQ_UPDATED				(0x80000000 >> 30)
28862306a36Sopenharmony_ci#define IPR_PCII_CORE_ISSUED_RST_REQ		(0x80000000 >> 31)
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci#define IPR_PCII_ERROR_INTERRUPTS \
29162306a36Sopenharmony_ci(IPR_PCII_IOARCB_XFER_FAILED | IPR_PCII_IOA_UNIT_CHECKED | \
29262306a36Sopenharmony_ciIPR_PCII_NO_HOST_RRQ | IPR_PCII_IOARRIN_LOST | IPR_PCII_MMIO_ERROR)
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci#define IPR_PCII_OPER_INTERRUPTS \
29562306a36Sopenharmony_ci(IPR_PCII_ERROR_INTERRUPTS | IPR_PCII_HRRQ_UPDATED | IPR_PCII_IOA_TRANS_TO_OPER)
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci#define IPR_UPROCI_RESET_ALERT			(0x80000000 >> 7)
29862306a36Sopenharmony_ci#define IPR_UPROCI_IO_DEBUG_ALERT			(0x80000000 >> 9)
29962306a36Sopenharmony_ci#define IPR_UPROCI_SIS64_START_BIST			(0x80000000 >> 23)
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci#define IPR_LDUMP_MAX_LONG_ACK_DELAY_IN_USEC		200000	/* 200 ms */
30262306a36Sopenharmony_ci#define IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC		200000	/* 200 ms */
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci/*
30562306a36Sopenharmony_ci * Dump literals
30662306a36Sopenharmony_ci */
30762306a36Sopenharmony_ci#define IPR_FMT2_MAX_IOA_DUMP_SIZE			(4 * 1024 * 1024)
30862306a36Sopenharmony_ci#define IPR_FMT3_MAX_IOA_DUMP_SIZE			(80 * 1024 * 1024)
30962306a36Sopenharmony_ci#define IPR_FMT2_NUM_SDT_ENTRIES			511
31062306a36Sopenharmony_ci#define IPR_FMT3_NUM_SDT_ENTRIES			0xFFF
31162306a36Sopenharmony_ci#define IPR_FMT2_MAX_NUM_DUMP_PAGES	((IPR_FMT2_MAX_IOA_DUMP_SIZE / PAGE_SIZE) + 1)
31262306a36Sopenharmony_ci#define IPR_FMT3_MAX_NUM_DUMP_PAGES	((IPR_FMT3_MAX_IOA_DUMP_SIZE / PAGE_SIZE) + 1)
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci/*
31562306a36Sopenharmony_ci * Misc literals
31662306a36Sopenharmony_ci */
31762306a36Sopenharmony_ci#define IPR_NUM_IOADL_ENTRIES			IPR_MAX_SGLIST
31862306a36Sopenharmony_ci#define IPR_MAX_MSIX_VECTORS		0x10
31962306a36Sopenharmony_ci#define IPR_MAX_HRRQ_NUM		0x10
32062306a36Sopenharmony_ci#define IPR_INIT_HRRQ			0x0
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci/*
32362306a36Sopenharmony_ci * Adapter interface types
32462306a36Sopenharmony_ci */
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_cistruct ipr_res_addr {
32762306a36Sopenharmony_ci	u8 reserved;
32862306a36Sopenharmony_ci	u8 bus;
32962306a36Sopenharmony_ci	u8 target;
33062306a36Sopenharmony_ci	u8 lun;
33162306a36Sopenharmony_ci#define IPR_GET_PHYS_LOC(res_addr) \
33262306a36Sopenharmony_ci	(((res_addr).bus << 16) | ((res_addr).target << 8) | (res_addr).lun)
33362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_cistruct ipr_std_inq_vpids {
33662306a36Sopenharmony_ci	u8 vendor_id[IPR_VENDOR_ID_LEN];
33762306a36Sopenharmony_ci	u8 product_id[IPR_PROD_ID_LEN];
33862306a36Sopenharmony_ci}__attribute__((packed));
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_cistruct ipr_vpd {
34162306a36Sopenharmony_ci	struct ipr_std_inq_vpids vpids;
34262306a36Sopenharmony_ci	u8 sn[IPR_SERIAL_NUM_LEN];
34362306a36Sopenharmony_ci}__attribute__((packed));
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_cistruct ipr_ext_vpd {
34662306a36Sopenharmony_ci	struct ipr_vpd vpd;
34762306a36Sopenharmony_ci	__be32 wwid[2];
34862306a36Sopenharmony_ci}__attribute__((packed));
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cistruct ipr_ext_vpd64 {
35162306a36Sopenharmony_ci	struct ipr_vpd vpd;
35262306a36Sopenharmony_ci	__be32 wwid[4];
35362306a36Sopenharmony_ci}__attribute__((packed));
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_cistruct ipr_std_inq_data {
35662306a36Sopenharmony_ci	u8 peri_qual_dev_type;
35762306a36Sopenharmony_ci#define IPR_STD_INQ_PERI_QUAL(peri) ((peri) >> 5)
35862306a36Sopenharmony_ci#define IPR_STD_INQ_PERI_DEV_TYPE(peri) ((peri) & 0x1F)
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	u8 removeable_medium_rsvd;
36162306a36Sopenharmony_ci#define IPR_STD_INQ_REMOVEABLE_MEDIUM 0x80
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci#define IPR_IS_DASD_DEVICE(std_inq) \
36462306a36Sopenharmony_ci((IPR_STD_INQ_PERI_DEV_TYPE((std_inq).peri_qual_dev_type) == TYPE_DISK) && \
36562306a36Sopenharmony_ci!(((std_inq).removeable_medium_rsvd) & IPR_STD_INQ_REMOVEABLE_MEDIUM))
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci#define IPR_IS_SES_DEVICE(std_inq) \
36862306a36Sopenharmony_ci(IPR_STD_INQ_PERI_DEV_TYPE((std_inq).peri_qual_dev_type) == TYPE_ENCLOSURE)
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	u8 version;
37162306a36Sopenharmony_ci	u8 aen_naca_fmt;
37262306a36Sopenharmony_ci	u8 additional_len;
37362306a36Sopenharmony_ci	u8 sccs_rsvd;
37462306a36Sopenharmony_ci	u8 bq_enc_multi;
37562306a36Sopenharmony_ci	u8 sync_cmdq_flags;
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	struct ipr_std_inq_vpids vpids;
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	u8 ros_rsvd_ram_rsvd[4];
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci	u8 serial_num[IPR_SERIAL_NUM_LEN];
38262306a36Sopenharmony_ci}__attribute__ ((packed));
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci#define IPR_RES_TYPE_AF_DASD		0x00
38562306a36Sopenharmony_ci#define IPR_RES_TYPE_GENERIC_SCSI	0x01
38662306a36Sopenharmony_ci#define IPR_RES_TYPE_VOLUME_SET		0x02
38762306a36Sopenharmony_ci#define IPR_RES_TYPE_REMOTE_AF_DASD	0x03
38862306a36Sopenharmony_ci#define IPR_RES_TYPE_GENERIC_ATA	0x04
38962306a36Sopenharmony_ci#define IPR_RES_TYPE_ARRAY		0x05
39062306a36Sopenharmony_ci#define IPR_RES_TYPE_IOAFP		0xff
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_cistruct ipr_config_table_entry {
39362306a36Sopenharmony_ci	u8 proto;
39462306a36Sopenharmony_ci#define IPR_PROTO_SATA			0x02
39562306a36Sopenharmony_ci#define IPR_PROTO_SATA_ATAPI		0x03
39662306a36Sopenharmony_ci#define IPR_PROTO_SAS_STP		0x06
39762306a36Sopenharmony_ci#define IPR_PROTO_SAS_STP_ATAPI		0x07
39862306a36Sopenharmony_ci	u8 array_id;
39962306a36Sopenharmony_ci	u8 flags;
40062306a36Sopenharmony_ci#define IPR_IS_IOA_RESOURCE		0x80
40162306a36Sopenharmony_ci	u8 rsvd_subtype;
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci#define IPR_QUEUEING_MODEL(res)	((((res)->flags) & 0x70) >> 4)
40462306a36Sopenharmony_ci#define IPR_QUEUE_FROZEN_MODEL		0
40562306a36Sopenharmony_ci#define IPR_QUEUE_NACA_MODEL		1
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	struct ipr_res_addr res_addr;
40862306a36Sopenharmony_ci	__be32 res_handle;
40962306a36Sopenharmony_ci	__be32 lun_wwn[2];
41062306a36Sopenharmony_ci	struct ipr_std_inq_data std_inq_data;
41162306a36Sopenharmony_ci}__attribute__ ((packed, aligned (4)));
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_cistruct ipr_config_table_entry64 {
41462306a36Sopenharmony_ci	u8 res_type;
41562306a36Sopenharmony_ci	u8 proto;
41662306a36Sopenharmony_ci	u8 vset_num;
41762306a36Sopenharmony_ci	u8 array_id;
41862306a36Sopenharmony_ci	__be16 flags;
41962306a36Sopenharmony_ci	__be16 res_flags;
42062306a36Sopenharmony_ci#define IPR_QUEUEING_MODEL64(res) ((((res)->res_flags) & 0x7000) >> 12)
42162306a36Sopenharmony_ci	__be32 res_handle;
42262306a36Sopenharmony_ci	u8 dev_id_type;
42362306a36Sopenharmony_ci	u8 reserved[3];
42462306a36Sopenharmony_ci	__be64 dev_id;
42562306a36Sopenharmony_ci	__be64 lun;
42662306a36Sopenharmony_ci	__be64 lun_wwn[2];
42762306a36Sopenharmony_ci#define IPR_MAX_RES_PATH_LENGTH		48
42862306a36Sopenharmony_ci#define IPR_RES_PATH_BYTES		8
42962306a36Sopenharmony_ci	__be64 res_path;
43062306a36Sopenharmony_ci	struct ipr_std_inq_data std_inq_data;
43162306a36Sopenharmony_ci	u8 reserved2[4];
43262306a36Sopenharmony_ci	__be64 reserved3[2];
43362306a36Sopenharmony_ci	u8 reserved4[8];
43462306a36Sopenharmony_ci}__attribute__ ((packed, aligned (8)));
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_cistruct ipr_config_table_hdr {
43762306a36Sopenharmony_ci	u8 num_entries;
43862306a36Sopenharmony_ci	u8 flags;
43962306a36Sopenharmony_ci#define IPR_UCODE_DOWNLOAD_REQ	0x10
44062306a36Sopenharmony_ci	__be16 reserved;
44162306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_cistruct ipr_config_table_hdr64 {
44462306a36Sopenharmony_ci	__be16 num_entries;
44562306a36Sopenharmony_ci	__be16 reserved;
44662306a36Sopenharmony_ci	u8 flags;
44762306a36Sopenharmony_ci	u8 reserved2[11];
44862306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_cistruct ipr_config_table {
45162306a36Sopenharmony_ci	struct ipr_config_table_hdr hdr;
45262306a36Sopenharmony_ci	struct ipr_config_table_entry dev[];
45362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_cistruct ipr_config_table64 {
45662306a36Sopenharmony_ci	struct ipr_config_table_hdr64 hdr64;
45762306a36Sopenharmony_ci	struct ipr_config_table_entry64 dev[];
45862306a36Sopenharmony_ci}__attribute__((packed, aligned (8)));
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_cistruct ipr_config_table_entry_wrapper {
46162306a36Sopenharmony_ci	union {
46262306a36Sopenharmony_ci		struct ipr_config_table_entry *cfgte;
46362306a36Sopenharmony_ci		struct ipr_config_table_entry64 *cfgte64;
46462306a36Sopenharmony_ci	} u;
46562306a36Sopenharmony_ci};
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_cistruct ipr_hostrcb_cfg_ch_not {
46862306a36Sopenharmony_ci	union {
46962306a36Sopenharmony_ci		struct ipr_config_table_entry cfgte;
47062306a36Sopenharmony_ci		struct ipr_config_table_entry64 cfgte64;
47162306a36Sopenharmony_ci	} u;
47262306a36Sopenharmony_ci	u8 reserved[936];
47362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_cistruct ipr_supported_device {
47662306a36Sopenharmony_ci	__be16 data_length;
47762306a36Sopenharmony_ci	u8 reserved;
47862306a36Sopenharmony_ci	u8 num_records;
47962306a36Sopenharmony_ci	struct ipr_std_inq_vpids vpids;
48062306a36Sopenharmony_ci	u8 reserved2[16];
48162306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_cistruct ipr_hrr_queue {
48462306a36Sopenharmony_ci	struct ipr_ioa_cfg *ioa_cfg;
48562306a36Sopenharmony_ci	__be32 *host_rrq;
48662306a36Sopenharmony_ci	dma_addr_t host_rrq_dma;
48762306a36Sopenharmony_ci#define IPR_HRRQ_REQ_RESP_HANDLE_MASK	0xfffffffc
48862306a36Sopenharmony_ci#define IPR_HRRQ_RESP_BIT_SET		0x00000002
48962306a36Sopenharmony_ci#define IPR_HRRQ_TOGGLE_BIT		0x00000001
49062306a36Sopenharmony_ci#define IPR_HRRQ_REQ_RESP_HANDLE_SHIFT	2
49162306a36Sopenharmony_ci#define IPR_ID_HRRQ_SELE_ENABLE		0x02
49262306a36Sopenharmony_ci	volatile __be32 *hrrq_start;
49362306a36Sopenharmony_ci	volatile __be32 *hrrq_end;
49462306a36Sopenharmony_ci	volatile __be32 *hrrq_curr;
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	struct list_head hrrq_free_q;
49762306a36Sopenharmony_ci	struct list_head hrrq_pending_q;
49862306a36Sopenharmony_ci	spinlock_t _lock;
49962306a36Sopenharmony_ci	spinlock_t *lock;
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci	volatile u32 toggle_bit;
50262306a36Sopenharmony_ci	u32 size;
50362306a36Sopenharmony_ci	u32 min_cmd_id;
50462306a36Sopenharmony_ci	u32 max_cmd_id;
50562306a36Sopenharmony_ci	u8 allow_interrupts:1;
50662306a36Sopenharmony_ci	u8 ioa_is_dead:1;
50762306a36Sopenharmony_ci	u8 allow_cmds:1;
50862306a36Sopenharmony_ci	u8 removing_ioa:1;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	struct irq_poll iopoll;
51162306a36Sopenharmony_ci};
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci/* Command packet structure */
51462306a36Sopenharmony_cistruct ipr_cmd_pkt {
51562306a36Sopenharmony_ci	u8 reserved;		/* Reserved by IOA */
51662306a36Sopenharmony_ci	u8 hrrq_id;
51762306a36Sopenharmony_ci	u8 request_type;
51862306a36Sopenharmony_ci#define IPR_RQTYPE_SCSICDB		0x00
51962306a36Sopenharmony_ci#define IPR_RQTYPE_IOACMD		0x01
52062306a36Sopenharmony_ci#define IPR_RQTYPE_HCAM			0x02
52162306a36Sopenharmony_ci#define IPR_RQTYPE_PIPE			0x05
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci	u8 reserved2;
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_ci	u8 flags_hi;
52662306a36Sopenharmony_ci#define IPR_FLAGS_HI_WRITE_NOT_READ		0x80
52762306a36Sopenharmony_ci#define IPR_FLAGS_HI_NO_ULEN_CHK		0x20
52862306a36Sopenharmony_ci#define IPR_FLAGS_HI_SYNC_OVERRIDE		0x10
52962306a36Sopenharmony_ci#define IPR_FLAGS_HI_SYNC_COMPLETE		0x08
53062306a36Sopenharmony_ci#define IPR_FLAGS_HI_NO_LINK_DESC		0x04
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci	u8 flags_lo;
53362306a36Sopenharmony_ci#define IPR_FLAGS_LO_ALIGNED_BFR		0x20
53462306a36Sopenharmony_ci#define IPR_FLAGS_LO_DELAY_AFTER_RST		0x10
53562306a36Sopenharmony_ci#define IPR_FLAGS_LO_UNTAGGED_TASK		0x00
53662306a36Sopenharmony_ci#define IPR_FLAGS_LO_SIMPLE_TASK		0x02
53762306a36Sopenharmony_ci#define IPR_FLAGS_LO_ORDERED_TASK		0x04
53862306a36Sopenharmony_ci#define IPR_FLAGS_LO_HEAD_OF_Q_TASK		0x06
53962306a36Sopenharmony_ci#define IPR_FLAGS_LO_ACA_TASK			0x08
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci	u8 cdb[16];
54262306a36Sopenharmony_ci	__be16 timeout;
54362306a36Sopenharmony_ci}__attribute__ ((packed, aligned(4)));
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_cistruct ipr_ioadl_desc {
54662306a36Sopenharmony_ci	__be32 flags_and_data_len;
54762306a36Sopenharmony_ci#define IPR_IOADL_FLAGS_MASK		0xff000000
54862306a36Sopenharmony_ci#define IPR_IOADL_GET_FLAGS(x) (be32_to_cpu(x) & IPR_IOADL_FLAGS_MASK)
54962306a36Sopenharmony_ci#define IPR_IOADL_DATA_LEN_MASK		0x00ffffff
55062306a36Sopenharmony_ci#define IPR_IOADL_GET_DATA_LEN(x) (be32_to_cpu(x) & IPR_IOADL_DATA_LEN_MASK)
55162306a36Sopenharmony_ci#define IPR_IOADL_FLAGS_READ		0x48000000
55262306a36Sopenharmony_ci#define IPR_IOADL_FLAGS_READ_LAST	0x49000000
55362306a36Sopenharmony_ci#define IPR_IOADL_FLAGS_WRITE		0x68000000
55462306a36Sopenharmony_ci#define IPR_IOADL_FLAGS_WRITE_LAST	0x69000000
55562306a36Sopenharmony_ci#define IPR_IOADL_FLAGS_LAST		0x01000000
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci	__be32 address;
55862306a36Sopenharmony_ci}__attribute__((packed, aligned (8)));
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_cistruct ipr_ioadl64_desc {
56162306a36Sopenharmony_ci	__be32 flags;
56262306a36Sopenharmony_ci	__be32 data_len;
56362306a36Sopenharmony_ci	__be64 address;
56462306a36Sopenharmony_ci}__attribute__((packed, aligned (16)));
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_cistruct ipr_ioarcb_add_data {
56762306a36Sopenharmony_ci	union {
56862306a36Sopenharmony_ci		struct ipr_ioadl_desc ioadl[5];
56962306a36Sopenharmony_ci		__be32 add_cmd_parms[10];
57062306a36Sopenharmony_ci	} u;
57162306a36Sopenharmony_ci}__attribute__ ((packed, aligned (4)));
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_cistruct ipr_ioarcb_sis64_add_addr_ecb {
57462306a36Sopenharmony_ci	__be64 ioasa_host_pci_addr;
57562306a36Sopenharmony_ci	__be64 data_ioadl_addr;
57662306a36Sopenharmony_ci	__be64 reserved;
57762306a36Sopenharmony_ci	__be32 ext_control_buf[4];
57862306a36Sopenharmony_ci}__attribute__((packed, aligned (8)));
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci/* IOA Request Control Block    128 bytes  */
58162306a36Sopenharmony_cistruct ipr_ioarcb {
58262306a36Sopenharmony_ci	union {
58362306a36Sopenharmony_ci		__be32 ioarcb_host_pci_addr;
58462306a36Sopenharmony_ci		__be64 ioarcb_host_pci_addr64;
58562306a36Sopenharmony_ci	} a;
58662306a36Sopenharmony_ci	__be32 res_handle;
58762306a36Sopenharmony_ci	__be32 host_response_handle;
58862306a36Sopenharmony_ci	__be32 reserved1;
58962306a36Sopenharmony_ci	__be32 reserved2;
59062306a36Sopenharmony_ci	__be32 reserved3;
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	__be32 data_transfer_length;
59362306a36Sopenharmony_ci	__be32 read_data_transfer_length;
59462306a36Sopenharmony_ci	__be32 write_ioadl_addr;
59562306a36Sopenharmony_ci	__be32 ioadl_len;
59662306a36Sopenharmony_ci	__be32 read_ioadl_addr;
59762306a36Sopenharmony_ci	__be32 read_ioadl_len;
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	__be32 ioasa_host_pci_addr;
60062306a36Sopenharmony_ci	__be16 ioasa_len;
60162306a36Sopenharmony_ci	__be16 reserved4;
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci	struct ipr_cmd_pkt cmd_pkt;
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci	__be16 add_cmd_parms_offset;
60662306a36Sopenharmony_ci	__be16 add_cmd_parms_len;
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci	union {
60962306a36Sopenharmony_ci		struct ipr_ioarcb_add_data add_data;
61062306a36Sopenharmony_ci		struct ipr_ioarcb_sis64_add_addr_ecb sis64_addr_data;
61162306a36Sopenharmony_ci	} u;
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_cistruct ipr_ioasa_vset {
61662306a36Sopenharmony_ci	__be32 failing_lba_hi;
61762306a36Sopenharmony_ci	__be32 failing_lba_lo;
61862306a36Sopenharmony_ci	__be32 reserved;
61962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_cistruct ipr_ioasa_af_dasd {
62262306a36Sopenharmony_ci	__be32 failing_lba;
62362306a36Sopenharmony_ci	__be32 reserved[2];
62462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_cistruct ipr_ioasa_gpdd {
62762306a36Sopenharmony_ci	u8 end_state;
62862306a36Sopenharmony_ci	u8 bus_phase;
62962306a36Sopenharmony_ci	__be16 reserved;
63062306a36Sopenharmony_ci	__be32 ioa_data[2];
63162306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_cistruct ipr_auto_sense {
63462306a36Sopenharmony_ci	__be16 auto_sense_len;
63562306a36Sopenharmony_ci	__be16 ioa_data_len;
63662306a36Sopenharmony_ci	__be32 data[SCSI_SENSE_BUFFERSIZE/sizeof(__be32)];
63762306a36Sopenharmony_ci};
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_cistruct ipr_ioasa_hdr {
64062306a36Sopenharmony_ci	__be32 ioasc;
64162306a36Sopenharmony_ci#define IPR_IOASC_SENSE_KEY(ioasc) ((ioasc) >> 24)
64262306a36Sopenharmony_ci#define IPR_IOASC_SENSE_CODE(ioasc) (((ioasc) & 0x00ff0000) >> 16)
64362306a36Sopenharmony_ci#define IPR_IOASC_SENSE_QUAL(ioasc) (((ioasc) & 0x0000ff00) >> 8)
64462306a36Sopenharmony_ci#define IPR_IOASC_SENSE_STATUS(ioasc) ((ioasc) & 0x000000ff)
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci	__be16 ret_stat_len;	/* Length of the returned IOASA */
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	__be16 avail_stat_len;	/* Total Length of status available. */
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci	__be32 residual_data_len;	/* number of bytes in the host data */
65162306a36Sopenharmony_ci	/* buffers that were not used by the IOARCB command. */
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	__be32 ilid;
65462306a36Sopenharmony_ci#define IPR_NO_ILID			0
65562306a36Sopenharmony_ci#define IPR_DRIVER_ILID		0xffffffff
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	__be32 fd_ioasc;
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	__be32 fd_phys_locator;
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci	__be32 fd_res_handle;
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci	__be32 ioasc_specific;	/* status code specific field */
66462306a36Sopenharmony_ci#define IPR_ADDITIONAL_STATUS_FMT		0x80000000
66562306a36Sopenharmony_ci#define IPR_AUTOSENSE_VALID			0x40000000
66662306a36Sopenharmony_ci#define IPR_IOASC_SPECIFIC_MASK		0x00ffffff
66762306a36Sopenharmony_ci#define IPR_FIELD_POINTER_VALID		(0x80000000 >> 8)
66862306a36Sopenharmony_ci#define IPR_FIELD_POINTER_MASK		0x0000ffff
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_cistruct ipr_ioasa {
67362306a36Sopenharmony_ci	struct ipr_ioasa_hdr hdr;
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	union {
67662306a36Sopenharmony_ci		struct ipr_ioasa_vset vset;
67762306a36Sopenharmony_ci		struct ipr_ioasa_af_dasd dasd;
67862306a36Sopenharmony_ci		struct ipr_ioasa_gpdd gpdd;
67962306a36Sopenharmony_ci	} u;
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	struct ipr_auto_sense auto_sense;
68262306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_cistruct ipr_ioasa64 {
68562306a36Sopenharmony_ci	struct ipr_ioasa_hdr hdr;
68662306a36Sopenharmony_ci	u8 fd_res_path[8];
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_ci	union {
68962306a36Sopenharmony_ci		struct ipr_ioasa_vset vset;
69062306a36Sopenharmony_ci		struct ipr_ioasa_af_dasd dasd;
69162306a36Sopenharmony_ci		struct ipr_ioasa_gpdd gpdd;
69262306a36Sopenharmony_ci	} u;
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci	struct ipr_auto_sense auto_sense;
69562306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
69662306a36Sopenharmony_ci
69762306a36Sopenharmony_cistruct ipr_mode_parm_hdr {
69862306a36Sopenharmony_ci	u8 length;
69962306a36Sopenharmony_ci	u8 medium_type;
70062306a36Sopenharmony_ci	u8 device_spec_parms;
70162306a36Sopenharmony_ci	u8 block_desc_len;
70262306a36Sopenharmony_ci}__attribute__((packed));
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_cistruct ipr_mode_pages {
70562306a36Sopenharmony_ci	struct ipr_mode_parm_hdr hdr;
70662306a36Sopenharmony_ci	u8 data[255 - sizeof(struct ipr_mode_parm_hdr)];
70762306a36Sopenharmony_ci}__attribute__((packed));
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_cistruct ipr_mode_page_hdr {
71062306a36Sopenharmony_ci	u8 ps_page_code;
71162306a36Sopenharmony_ci#define IPR_MODE_PAGE_PS	0x80
71262306a36Sopenharmony_ci#define IPR_GET_MODE_PAGE_CODE(hdr) ((hdr)->ps_page_code & 0x3F)
71362306a36Sopenharmony_ci	u8 page_length;
71462306a36Sopenharmony_ci}__attribute__ ((packed));
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_cistruct ipr_dev_bus_entry {
71762306a36Sopenharmony_ci	struct ipr_res_addr res_addr;
71862306a36Sopenharmony_ci	u8 flags;
71962306a36Sopenharmony_ci#define IPR_SCSI_ATTR_ENABLE_QAS			0x80
72062306a36Sopenharmony_ci#define IPR_SCSI_ATTR_DISABLE_QAS			0x40
72162306a36Sopenharmony_ci#define IPR_SCSI_ATTR_QAS_MASK				0xC0
72262306a36Sopenharmony_ci#define IPR_SCSI_ATTR_ENABLE_TM				0x20
72362306a36Sopenharmony_ci#define IPR_SCSI_ATTR_NO_TERM_PWR			0x10
72462306a36Sopenharmony_ci#define IPR_SCSI_ATTR_TM_SUPPORTED			0x08
72562306a36Sopenharmony_ci#define IPR_SCSI_ATTR_LVD_TO_SE_NOT_ALLOWED	0x04
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci	u8 scsi_id;
72862306a36Sopenharmony_ci	u8 bus_width;
72962306a36Sopenharmony_ci	u8 extended_reset_delay;
73062306a36Sopenharmony_ci#define IPR_EXTENDED_RESET_DELAY	7
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_ci	__be32 max_xfer_rate;
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci	u8 spinup_delay;
73562306a36Sopenharmony_ci	u8 reserved3;
73662306a36Sopenharmony_ci	__be16 reserved4;
73762306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_cistruct ipr_mode_page28 {
74062306a36Sopenharmony_ci	struct ipr_mode_page_hdr hdr;
74162306a36Sopenharmony_ci	u8 num_entries;
74262306a36Sopenharmony_ci	u8 entry_length;
74362306a36Sopenharmony_ci	struct ipr_dev_bus_entry bus[];
74462306a36Sopenharmony_ci}__attribute__((packed));
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_cistruct ipr_mode_page24 {
74762306a36Sopenharmony_ci	struct ipr_mode_page_hdr hdr;
74862306a36Sopenharmony_ci	u8 flags;
74962306a36Sopenharmony_ci#define IPR_ENABLE_DUAL_IOA_AF 0x80
75062306a36Sopenharmony_ci}__attribute__((packed));
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_cistruct ipr_ioa_vpd {
75362306a36Sopenharmony_ci	struct ipr_std_inq_data std_inq_data;
75462306a36Sopenharmony_ci	u8 ascii_part_num[12];
75562306a36Sopenharmony_ci	u8 reserved[40];
75662306a36Sopenharmony_ci	u8 ascii_plant_code[4];
75762306a36Sopenharmony_ci}__attribute__((packed));
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_cistruct ipr_inquiry_page3 {
76062306a36Sopenharmony_ci	u8 peri_qual_dev_type;
76162306a36Sopenharmony_ci	u8 page_code;
76262306a36Sopenharmony_ci	u8 reserved1;
76362306a36Sopenharmony_ci	u8 page_length;
76462306a36Sopenharmony_ci	u8 ascii_len;
76562306a36Sopenharmony_ci	u8 reserved2[3];
76662306a36Sopenharmony_ci	u8 load_id[4];
76762306a36Sopenharmony_ci	u8 major_release;
76862306a36Sopenharmony_ci	u8 card_type;
76962306a36Sopenharmony_ci	u8 minor_release[2];
77062306a36Sopenharmony_ci	u8 ptf_number[4];
77162306a36Sopenharmony_ci	u8 patch_number[4];
77262306a36Sopenharmony_ci}__attribute__((packed));
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_cistruct ipr_inquiry_cap {
77562306a36Sopenharmony_ci	u8 peri_qual_dev_type;
77662306a36Sopenharmony_ci	u8 page_code;
77762306a36Sopenharmony_ci	u8 reserved1;
77862306a36Sopenharmony_ci	u8 page_length;
77962306a36Sopenharmony_ci	u8 ascii_len;
78062306a36Sopenharmony_ci	u8 reserved2;
78162306a36Sopenharmony_ci	u8 sis_version[2];
78262306a36Sopenharmony_ci	u8 cap;
78362306a36Sopenharmony_ci#define IPR_CAP_DUAL_IOA_RAID		0x80
78462306a36Sopenharmony_ci	u8 reserved3[15];
78562306a36Sopenharmony_ci}__attribute__((packed));
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci#define IPR_INQUIRY_PAGE0_ENTRIES 20
78862306a36Sopenharmony_cistruct ipr_inquiry_page0 {
78962306a36Sopenharmony_ci	u8 peri_qual_dev_type;
79062306a36Sopenharmony_ci	u8 page_code;
79162306a36Sopenharmony_ci	u8 reserved1;
79262306a36Sopenharmony_ci	u8 len;
79362306a36Sopenharmony_ci	u8 page[IPR_INQUIRY_PAGE0_ENTRIES];
79462306a36Sopenharmony_ci}__attribute__((packed));
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_cistruct ipr_inquiry_pageC4 {
79762306a36Sopenharmony_ci	u8 peri_qual_dev_type;
79862306a36Sopenharmony_ci	u8 page_code;
79962306a36Sopenharmony_ci	u8 reserved1;
80062306a36Sopenharmony_ci	u8 len;
80162306a36Sopenharmony_ci	u8 cache_cap[4];
80262306a36Sopenharmony_ci#define IPR_CAP_SYNC_CACHE		0x08
80362306a36Sopenharmony_ci	u8 reserved2[20];
80462306a36Sopenharmony_ci} __packed;
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_cistruct ipr_hostrcb_device_data_entry {
80762306a36Sopenharmony_ci	struct ipr_vpd vpd;
80862306a36Sopenharmony_ci	struct ipr_res_addr dev_res_addr;
80962306a36Sopenharmony_ci	struct ipr_vpd new_vpd;
81062306a36Sopenharmony_ci	struct ipr_vpd ioa_last_with_dev_vpd;
81162306a36Sopenharmony_ci	struct ipr_vpd cfc_last_with_dev_vpd;
81262306a36Sopenharmony_ci	__be32 ioa_data[5];
81362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_cistruct ipr_hostrcb_device_data_entry_enhanced {
81662306a36Sopenharmony_ci	struct ipr_ext_vpd vpd;
81762306a36Sopenharmony_ci	u8 ccin[4];
81862306a36Sopenharmony_ci	struct ipr_res_addr dev_res_addr;
81962306a36Sopenharmony_ci	struct ipr_ext_vpd new_vpd;
82062306a36Sopenharmony_ci	u8 new_ccin[4];
82162306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_last_with_dev_vpd;
82262306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_last_with_dev_vpd;
82362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_cistruct ipr_hostrcb64_device_data_entry_enhanced {
82662306a36Sopenharmony_ci	struct ipr_ext_vpd vpd;
82762306a36Sopenharmony_ci	u8 ccin[4];
82862306a36Sopenharmony_ci	u8 res_path[8];
82962306a36Sopenharmony_ci	struct ipr_ext_vpd new_vpd;
83062306a36Sopenharmony_ci	u8 new_ccin[4];
83162306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_last_with_dev_vpd;
83262306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_last_with_dev_vpd;
83362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_cistruct ipr_hostrcb_array_data_entry {
83662306a36Sopenharmony_ci	struct ipr_vpd vpd;
83762306a36Sopenharmony_ci	struct ipr_res_addr expected_dev_res_addr;
83862306a36Sopenharmony_ci	struct ipr_res_addr dev_res_addr;
83962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_cistruct ipr_hostrcb64_array_data_entry {
84262306a36Sopenharmony_ci	struct ipr_ext_vpd vpd;
84362306a36Sopenharmony_ci	u8 ccin[4];
84462306a36Sopenharmony_ci	u8 expected_res_path[8];
84562306a36Sopenharmony_ci	u8 res_path[8];
84662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_cistruct ipr_hostrcb_array_data_entry_enhanced {
84962306a36Sopenharmony_ci	struct ipr_ext_vpd vpd;
85062306a36Sopenharmony_ci	u8 ccin[4];
85162306a36Sopenharmony_ci	struct ipr_res_addr expected_dev_res_addr;
85262306a36Sopenharmony_ci	struct ipr_res_addr dev_res_addr;
85362306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_cistruct ipr_hostrcb_type_ff_error {
85662306a36Sopenharmony_ci	__be32 ioa_data[758];
85762306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_cistruct ipr_hostrcb_type_01_error {
86062306a36Sopenharmony_ci	__be32 seek_counter;
86162306a36Sopenharmony_ci	__be32 read_counter;
86262306a36Sopenharmony_ci	u8 sense_data[32];
86362306a36Sopenharmony_ci	__be32 ioa_data[236];
86462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_cistruct ipr_hostrcb_type_21_error {
86762306a36Sopenharmony_ci	__be32 wwn[4];
86862306a36Sopenharmony_ci	u8 res_path[8];
86962306a36Sopenharmony_ci	u8 primary_problem_desc[32];
87062306a36Sopenharmony_ci	u8 second_problem_desc[32];
87162306a36Sopenharmony_ci	__be32 sense_data[8];
87262306a36Sopenharmony_ci	__be32 cdb[4];
87362306a36Sopenharmony_ci	__be32 residual_trans_length;
87462306a36Sopenharmony_ci	__be32 length_of_error;
87562306a36Sopenharmony_ci	__be32 ioa_data[236];
87662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_cistruct ipr_hostrcb_type_02_error {
87962306a36Sopenharmony_ci	struct ipr_vpd ioa_vpd;
88062306a36Sopenharmony_ci	struct ipr_vpd cfc_vpd;
88162306a36Sopenharmony_ci	struct ipr_vpd ioa_last_attached_to_cfc_vpd;
88262306a36Sopenharmony_ci	struct ipr_vpd cfc_last_attached_to_ioa_vpd;
88362306a36Sopenharmony_ci	__be32 ioa_data[3];
88462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_cistruct ipr_hostrcb_type_12_error {
88762306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_vpd;
88862306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_vpd;
88962306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_last_attached_to_cfc_vpd;
89062306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_last_attached_to_ioa_vpd;
89162306a36Sopenharmony_ci	__be32 ioa_data[3];
89262306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_cistruct ipr_hostrcb_type_03_error {
89562306a36Sopenharmony_ci	struct ipr_vpd ioa_vpd;
89662306a36Sopenharmony_ci	struct ipr_vpd cfc_vpd;
89762306a36Sopenharmony_ci	__be32 errors_detected;
89862306a36Sopenharmony_ci	__be32 errors_logged;
89962306a36Sopenharmony_ci	u8 ioa_data[12];
90062306a36Sopenharmony_ci	struct ipr_hostrcb_device_data_entry dev[3];
90162306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_cistruct ipr_hostrcb_type_13_error {
90462306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_vpd;
90562306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_vpd;
90662306a36Sopenharmony_ci	__be32 errors_detected;
90762306a36Sopenharmony_ci	__be32 errors_logged;
90862306a36Sopenharmony_ci	struct ipr_hostrcb_device_data_entry_enhanced dev[3];
90962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_cistruct ipr_hostrcb_type_23_error {
91262306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_vpd;
91362306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_vpd;
91462306a36Sopenharmony_ci	__be32 errors_detected;
91562306a36Sopenharmony_ci	__be32 errors_logged;
91662306a36Sopenharmony_ci	struct ipr_hostrcb64_device_data_entry_enhanced dev[3];
91762306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_cistruct ipr_hostrcb_type_04_error {
92062306a36Sopenharmony_ci	struct ipr_vpd ioa_vpd;
92162306a36Sopenharmony_ci	struct ipr_vpd cfc_vpd;
92262306a36Sopenharmony_ci	u8 ioa_data[12];
92362306a36Sopenharmony_ci	struct ipr_hostrcb_array_data_entry array_member[10];
92462306a36Sopenharmony_ci	__be32 exposed_mode_adn;
92562306a36Sopenharmony_ci	__be32 array_id;
92662306a36Sopenharmony_ci	struct ipr_vpd incomp_dev_vpd;
92762306a36Sopenharmony_ci	__be32 ioa_data2;
92862306a36Sopenharmony_ci	struct ipr_hostrcb_array_data_entry array_member2[8];
92962306a36Sopenharmony_ci	struct ipr_res_addr last_func_vset_res_addr;
93062306a36Sopenharmony_ci	u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
93162306a36Sopenharmony_ci	u8 protection_level[8];
93262306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_cistruct ipr_hostrcb_type_14_error {
93562306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_vpd;
93662306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_vpd;
93762306a36Sopenharmony_ci	__be32 exposed_mode_adn;
93862306a36Sopenharmony_ci	__be32 array_id;
93962306a36Sopenharmony_ci	struct ipr_res_addr last_func_vset_res_addr;
94062306a36Sopenharmony_ci	u8 vset_serial_num[IPR_SERIAL_NUM_LEN];
94162306a36Sopenharmony_ci	u8 protection_level[8];
94262306a36Sopenharmony_ci	__be32 num_entries;
94362306a36Sopenharmony_ci	struct ipr_hostrcb_array_data_entry_enhanced array_member[18];
94462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_cistruct ipr_hostrcb_type_24_error {
94762306a36Sopenharmony_ci	struct ipr_ext_vpd ioa_vpd;
94862306a36Sopenharmony_ci	struct ipr_ext_vpd cfc_vpd;
94962306a36Sopenharmony_ci	u8 reserved[2];
95062306a36Sopenharmony_ci	u8 exposed_mode_adn;
95162306a36Sopenharmony_ci#define IPR_INVALID_ARRAY_DEV_NUM		0xff
95262306a36Sopenharmony_ci	u8 array_id;
95362306a36Sopenharmony_ci	u8 last_res_path[8];
95462306a36Sopenharmony_ci	u8 protection_level[8];
95562306a36Sopenharmony_ci	struct ipr_ext_vpd64 array_vpd;
95662306a36Sopenharmony_ci	u8 description[16];
95762306a36Sopenharmony_ci	u8 reserved2[3];
95862306a36Sopenharmony_ci	u8 num_entries;
95962306a36Sopenharmony_ci	struct ipr_hostrcb64_array_data_entry array_member[32];
96062306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_cistruct ipr_hostrcb_type_07_error {
96362306a36Sopenharmony_ci	u8 failure_reason[64];
96462306a36Sopenharmony_ci	struct ipr_vpd vpd;
96562306a36Sopenharmony_ci	__be32 data[222];
96662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
96762306a36Sopenharmony_ci
96862306a36Sopenharmony_cistruct ipr_hostrcb_type_17_error {
96962306a36Sopenharmony_ci	u8 failure_reason[64];
97062306a36Sopenharmony_ci	struct ipr_ext_vpd vpd;
97162306a36Sopenharmony_ci	__be32 data[476];
97262306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_cistruct ipr_hostrcb_config_element {
97562306a36Sopenharmony_ci	u8 type_status;
97662306a36Sopenharmony_ci#define IPR_PATH_CFG_TYPE_MASK	0xF0
97762306a36Sopenharmony_ci#define IPR_PATH_CFG_NOT_EXIST	0x00
97862306a36Sopenharmony_ci#define IPR_PATH_CFG_IOA_PORT		0x10
97962306a36Sopenharmony_ci#define IPR_PATH_CFG_EXP_PORT		0x20
98062306a36Sopenharmony_ci#define IPR_PATH_CFG_DEVICE_PORT	0x30
98162306a36Sopenharmony_ci#define IPR_PATH_CFG_DEVICE_LUN	0x40
98262306a36Sopenharmony_ci
98362306a36Sopenharmony_ci#define IPR_PATH_CFG_STATUS_MASK	0x0F
98462306a36Sopenharmony_ci#define IPR_PATH_CFG_NO_PROB		0x00
98562306a36Sopenharmony_ci#define IPR_PATH_CFG_DEGRADED		0x01
98662306a36Sopenharmony_ci#define IPR_PATH_CFG_FAILED		0x02
98762306a36Sopenharmony_ci#define IPR_PATH_CFG_SUSPECT		0x03
98862306a36Sopenharmony_ci#define IPR_PATH_NOT_DETECTED		0x04
98962306a36Sopenharmony_ci#define IPR_PATH_INCORRECT_CONN	0x05
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_ci	u8 cascaded_expander;
99262306a36Sopenharmony_ci	u8 phy;
99362306a36Sopenharmony_ci	u8 link_rate;
99462306a36Sopenharmony_ci#define IPR_PHY_LINK_RATE_MASK	0x0F
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	__be32 wwid[2];
99762306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_cistruct ipr_hostrcb64_config_element {
100062306a36Sopenharmony_ci	__be16 length;
100162306a36Sopenharmony_ci	u8 descriptor_id;
100262306a36Sopenharmony_ci#define IPR_DESCRIPTOR_MASK		0xC0
100362306a36Sopenharmony_ci#define IPR_DESCRIPTOR_SIS64		0x00
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci	u8 reserved;
100662306a36Sopenharmony_ci	u8 type_status;
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_ci	u8 reserved2[2];
100962306a36Sopenharmony_ci	u8 link_rate;
101062306a36Sopenharmony_ci
101162306a36Sopenharmony_ci	u8 res_path[8];
101262306a36Sopenharmony_ci	__be32 wwid[2];
101362306a36Sopenharmony_ci}__attribute__((packed, aligned (8)));
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_cistruct ipr_hostrcb_fabric_desc {
101662306a36Sopenharmony_ci	__be16 length;
101762306a36Sopenharmony_ci	u8 ioa_port;
101862306a36Sopenharmony_ci	u8 cascaded_expander;
101962306a36Sopenharmony_ci	u8 phy;
102062306a36Sopenharmony_ci	u8 path_state;
102162306a36Sopenharmony_ci#define IPR_PATH_ACTIVE_MASK		0xC0
102262306a36Sopenharmony_ci#define IPR_PATH_NO_INFO		0x00
102362306a36Sopenharmony_ci#define IPR_PATH_ACTIVE			0x40
102462306a36Sopenharmony_ci#define IPR_PATH_NOT_ACTIVE		0x80
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci#define IPR_PATH_STATE_MASK		0x0F
102762306a36Sopenharmony_ci#define IPR_PATH_STATE_NO_INFO	0x00
102862306a36Sopenharmony_ci#define IPR_PATH_HEALTHY		0x01
102962306a36Sopenharmony_ci#define IPR_PATH_DEGRADED		0x02
103062306a36Sopenharmony_ci#define IPR_PATH_FAILED			0x03
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci	__be16 num_entries;
103362306a36Sopenharmony_ci	struct ipr_hostrcb_config_element elem[1];
103462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_cistruct ipr_hostrcb64_fabric_desc {
103762306a36Sopenharmony_ci	__be16 length;
103862306a36Sopenharmony_ci	u8 descriptor_id;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	u8 reserved[2];
104162306a36Sopenharmony_ci	u8 path_state;
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_ci	u8 reserved2[2];
104462306a36Sopenharmony_ci	u8 res_path[8];
104562306a36Sopenharmony_ci	u8 reserved3[6];
104662306a36Sopenharmony_ci	__be16 num_entries;
104762306a36Sopenharmony_ci	struct ipr_hostrcb64_config_element elem[1];
104862306a36Sopenharmony_ci}__attribute__((packed, aligned (8)));
104962306a36Sopenharmony_ci
105062306a36Sopenharmony_ci#define for_each_hrrq(hrrq, ioa_cfg) \
105162306a36Sopenharmony_ci		for (hrrq = (ioa_cfg)->hrrq; \
105262306a36Sopenharmony_ci			hrrq < ((ioa_cfg)->hrrq + (ioa_cfg)->hrrq_num); hrrq++)
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci#define for_each_fabric_cfg(fabric, cfg) \
105562306a36Sopenharmony_ci		for (cfg = (fabric)->elem; \
105662306a36Sopenharmony_ci			cfg < ((fabric)->elem + be16_to_cpu((fabric)->num_entries)); \
105762306a36Sopenharmony_ci			cfg++)
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_cistruct ipr_hostrcb_type_20_error {
106062306a36Sopenharmony_ci	u8 failure_reason[64];
106162306a36Sopenharmony_ci	u8 reserved[3];
106262306a36Sopenharmony_ci	u8 num_entries;
106362306a36Sopenharmony_ci	struct ipr_hostrcb_fabric_desc desc[1];
106462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
106562306a36Sopenharmony_ci
106662306a36Sopenharmony_cistruct ipr_hostrcb_type_30_error {
106762306a36Sopenharmony_ci	u8 failure_reason[64];
106862306a36Sopenharmony_ci	u8 reserved[3];
106962306a36Sopenharmony_ci	u8 num_entries;
107062306a36Sopenharmony_ci	struct ipr_hostrcb64_fabric_desc desc[1];
107162306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_cistruct ipr_hostrcb_type_41_error {
107462306a36Sopenharmony_ci	u8 failure_reason[64];
107562306a36Sopenharmony_ci	 __be32 data[200];
107662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_cistruct ipr_hostrcb_error {
107962306a36Sopenharmony_ci	__be32 fd_ioasc;
108062306a36Sopenharmony_ci	struct ipr_res_addr fd_res_addr;
108162306a36Sopenharmony_ci	__be32 fd_res_handle;
108262306a36Sopenharmony_ci	__be32 prc;
108362306a36Sopenharmony_ci	union {
108462306a36Sopenharmony_ci		struct ipr_hostrcb_type_ff_error type_ff_error;
108562306a36Sopenharmony_ci		struct ipr_hostrcb_type_01_error type_01_error;
108662306a36Sopenharmony_ci		struct ipr_hostrcb_type_02_error type_02_error;
108762306a36Sopenharmony_ci		struct ipr_hostrcb_type_03_error type_03_error;
108862306a36Sopenharmony_ci		struct ipr_hostrcb_type_04_error type_04_error;
108962306a36Sopenharmony_ci		struct ipr_hostrcb_type_07_error type_07_error;
109062306a36Sopenharmony_ci		struct ipr_hostrcb_type_12_error type_12_error;
109162306a36Sopenharmony_ci		struct ipr_hostrcb_type_13_error type_13_error;
109262306a36Sopenharmony_ci		struct ipr_hostrcb_type_14_error type_14_error;
109362306a36Sopenharmony_ci		struct ipr_hostrcb_type_17_error type_17_error;
109462306a36Sopenharmony_ci		struct ipr_hostrcb_type_20_error type_20_error;
109562306a36Sopenharmony_ci	} u;
109662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
109762306a36Sopenharmony_ci
109862306a36Sopenharmony_cistruct ipr_hostrcb64_error {
109962306a36Sopenharmony_ci	__be32 fd_ioasc;
110062306a36Sopenharmony_ci	__be32 ioa_fw_level;
110162306a36Sopenharmony_ci	__be32 fd_res_handle;
110262306a36Sopenharmony_ci	__be32 prc;
110362306a36Sopenharmony_ci	__be64 fd_dev_id;
110462306a36Sopenharmony_ci	__be64 fd_lun;
110562306a36Sopenharmony_ci	u8 fd_res_path[8];
110662306a36Sopenharmony_ci	__be64 time_stamp;
110762306a36Sopenharmony_ci	u8 reserved[16];
110862306a36Sopenharmony_ci	union {
110962306a36Sopenharmony_ci		struct ipr_hostrcb_type_ff_error type_ff_error;
111062306a36Sopenharmony_ci		struct ipr_hostrcb_type_12_error type_12_error;
111162306a36Sopenharmony_ci		struct ipr_hostrcb_type_17_error type_17_error;
111262306a36Sopenharmony_ci		struct ipr_hostrcb_type_21_error type_21_error;
111362306a36Sopenharmony_ci		struct ipr_hostrcb_type_23_error type_23_error;
111462306a36Sopenharmony_ci		struct ipr_hostrcb_type_24_error type_24_error;
111562306a36Sopenharmony_ci		struct ipr_hostrcb_type_30_error type_30_error;
111662306a36Sopenharmony_ci		struct ipr_hostrcb_type_41_error type_41_error;
111762306a36Sopenharmony_ci	} u;
111862306a36Sopenharmony_ci}__attribute__((packed, aligned (8)));
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_cistruct ipr_hostrcb_raw {
112162306a36Sopenharmony_ci	__be32 data[sizeof(struct ipr_hostrcb_error)/sizeof(__be32)];
112262306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
112362306a36Sopenharmony_ci
112462306a36Sopenharmony_cistruct ipr_hcam {
112562306a36Sopenharmony_ci	u8 op_code;
112662306a36Sopenharmony_ci#define IPR_HOST_RCB_OP_CODE_CONFIG_CHANGE			0xE1
112762306a36Sopenharmony_ci#define IPR_HOST_RCB_OP_CODE_LOG_DATA				0xE2
112862306a36Sopenharmony_ci
112962306a36Sopenharmony_ci	u8 notify_type;
113062306a36Sopenharmony_ci#define IPR_HOST_RCB_NOTIF_TYPE_EXISTING_CHANGED	0x00
113162306a36Sopenharmony_ci#define IPR_HOST_RCB_NOTIF_TYPE_NEW_ENTRY			0x01
113262306a36Sopenharmony_ci#define IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY			0x02
113362306a36Sopenharmony_ci#define IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY		0x10
113462306a36Sopenharmony_ci#define IPR_HOST_RCB_NOTIF_TYPE_INFORMATION_ENTRY	0x11
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci	u8 notifications_lost;
113762306a36Sopenharmony_ci#define IPR_HOST_RCB_NO_NOTIFICATIONS_LOST			0
113862306a36Sopenharmony_ci#define IPR_HOST_RCB_NOTIFICATIONS_LOST				0x80
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_ci	u8 flags;
114162306a36Sopenharmony_ci#define IPR_HOSTRCB_INTERNAL_OPER	0x80
114262306a36Sopenharmony_ci#define IPR_HOSTRCB_ERR_RESP_SENT	0x40
114362306a36Sopenharmony_ci
114462306a36Sopenharmony_ci	u8 overlay_id;
114562306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_1				0x01
114662306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_2				0x02
114762306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_3				0x03
114862306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_4				0x04
114962306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_6				0x06
115062306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_7				0x07
115162306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_12				0x12
115262306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_13				0x13
115362306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_14				0x14
115462306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_16				0x16
115562306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_17				0x17
115662306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_20				0x20
115762306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_21				0x21
115862306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_23				0x23
115962306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_24				0x24
116062306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_26				0x26
116162306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_30				0x30
116262306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_41				0x41
116362306a36Sopenharmony_ci#define IPR_HOST_RCB_OVERLAY_ID_DEFAULT				0xFF
116462306a36Sopenharmony_ci
116562306a36Sopenharmony_ci	u8 reserved1[3];
116662306a36Sopenharmony_ci	__be32 ilid;
116762306a36Sopenharmony_ci	__be32 time_since_last_ioa_reset;
116862306a36Sopenharmony_ci	__be32 reserved2;
116962306a36Sopenharmony_ci	__be32 length;
117062306a36Sopenharmony_ci
117162306a36Sopenharmony_ci	union {
117262306a36Sopenharmony_ci		struct ipr_hostrcb_error error;
117362306a36Sopenharmony_ci		struct ipr_hostrcb64_error error64;
117462306a36Sopenharmony_ci		struct ipr_hostrcb_cfg_ch_not ccn;
117562306a36Sopenharmony_ci		struct ipr_hostrcb_raw raw;
117662306a36Sopenharmony_ci	} u;
117762306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_cistruct ipr_hostrcb {
118062306a36Sopenharmony_ci	struct ipr_hcam hcam;
118162306a36Sopenharmony_ci	dma_addr_t hostrcb_dma;
118262306a36Sopenharmony_ci	struct list_head queue;
118362306a36Sopenharmony_ci	struct ipr_ioa_cfg *ioa_cfg;
118462306a36Sopenharmony_ci	char rp_buffer[IPR_MAX_RES_PATH_LENGTH];
118562306a36Sopenharmony_ci};
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci/* IPR smart dump table structures */
118862306a36Sopenharmony_cistruct ipr_sdt_entry {
118962306a36Sopenharmony_ci	__be32 start_token;
119062306a36Sopenharmony_ci	__be32 end_token;
119162306a36Sopenharmony_ci	u8 reserved[4];
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	u8 flags;
119462306a36Sopenharmony_ci#define IPR_SDT_ENDIAN		0x80
119562306a36Sopenharmony_ci#define IPR_SDT_VALID_ENTRY	0x20
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci	u8 resv;
119862306a36Sopenharmony_ci	__be16 priority;
119962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_cistruct ipr_sdt_header {
120262306a36Sopenharmony_ci	__be32 state;
120362306a36Sopenharmony_ci	__be32 num_entries;
120462306a36Sopenharmony_ci	__be32 num_entries_used;
120562306a36Sopenharmony_ci	__be32 dump_size;
120662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_cistruct ipr_sdt {
120962306a36Sopenharmony_ci	struct ipr_sdt_header hdr;
121062306a36Sopenharmony_ci	struct ipr_sdt_entry entry[IPR_FMT3_NUM_SDT_ENTRIES];
121162306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
121262306a36Sopenharmony_ci
121362306a36Sopenharmony_cistruct ipr_uc_sdt {
121462306a36Sopenharmony_ci	struct ipr_sdt_header hdr;
121562306a36Sopenharmony_ci	struct ipr_sdt_entry entry[1];
121662306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_ci/*
121962306a36Sopenharmony_ci * Driver types
122062306a36Sopenharmony_ci */
122162306a36Sopenharmony_cistruct ipr_bus_attributes {
122262306a36Sopenharmony_ci	u8 bus;
122362306a36Sopenharmony_ci	u8 qas_enabled;
122462306a36Sopenharmony_ci	u8 bus_width;
122562306a36Sopenharmony_ci	u8 reserved;
122662306a36Sopenharmony_ci	u32 max_xfer_rate;
122762306a36Sopenharmony_ci};
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_cistruct ipr_resource_entry {
123062306a36Sopenharmony_ci	u8 needs_sync_complete:1;
123162306a36Sopenharmony_ci	u8 in_erp:1;
123262306a36Sopenharmony_ci	u8 add_to_ml:1;
123362306a36Sopenharmony_ci	u8 del_from_ml:1;
123462306a36Sopenharmony_ci	u8 resetting_device:1;
123562306a36Sopenharmony_ci	u8 reset_occurred:1;
123662306a36Sopenharmony_ci	u8 raw_mode:1;
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	u32 bus;		/* AKA channel */
123962306a36Sopenharmony_ci	u32 target;		/* AKA id */
124062306a36Sopenharmony_ci	u32 lun;
124162306a36Sopenharmony_ci#define IPR_ARRAY_VIRTUAL_BUS			0x1
124262306a36Sopenharmony_ci#define IPR_VSET_VIRTUAL_BUS			0x2
124362306a36Sopenharmony_ci#define IPR_IOAFP_VIRTUAL_BUS			0x3
124462306a36Sopenharmony_ci#define IPR_MAX_SIS64_BUSES			0x4
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci#define IPR_GET_RES_PHYS_LOC(res) \
124762306a36Sopenharmony_ci	(((res)->bus << 24) | ((res)->target << 8) | (res)->lun)
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci	u8 ata_class;
125062306a36Sopenharmony_ci	u8 type;
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_ci	u16 flags;
125362306a36Sopenharmony_ci	u16 res_flags;
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci	u8 qmodel;
125662306a36Sopenharmony_ci	struct ipr_std_inq_data std_inq_data;
125762306a36Sopenharmony_ci
125862306a36Sopenharmony_ci	__be32 res_handle;
125962306a36Sopenharmony_ci	__be64 dev_id;
126062306a36Sopenharmony_ci	u64 lun_wwn;
126162306a36Sopenharmony_ci	struct scsi_lun dev_lun;
126262306a36Sopenharmony_ci	u8 res_path[8];
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_ci	struct ipr_ioa_cfg *ioa_cfg;
126562306a36Sopenharmony_ci	struct scsi_device *sdev;
126662306a36Sopenharmony_ci	struct list_head queue;
126762306a36Sopenharmony_ci}; /* struct ipr_resource_entry */
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_cistruct ipr_resource_hdr {
127062306a36Sopenharmony_ci	u16 num_entries;
127162306a36Sopenharmony_ci	u16 reserved;
127262306a36Sopenharmony_ci};
127362306a36Sopenharmony_ci
127462306a36Sopenharmony_cistruct ipr_misc_cbs {
127562306a36Sopenharmony_ci	struct ipr_ioa_vpd ioa_vpd;
127662306a36Sopenharmony_ci	struct ipr_inquiry_page0 page0_data;
127762306a36Sopenharmony_ci	struct ipr_inquiry_page3 page3_data;
127862306a36Sopenharmony_ci	struct ipr_inquiry_cap cap;
127962306a36Sopenharmony_ci	struct ipr_inquiry_pageC4 pageC4_data;
128062306a36Sopenharmony_ci	struct ipr_mode_pages mode_pages;
128162306a36Sopenharmony_ci	struct ipr_supported_device supp_dev;
128262306a36Sopenharmony_ci};
128362306a36Sopenharmony_ci
128462306a36Sopenharmony_cistruct ipr_interrupt_offsets {
128562306a36Sopenharmony_ci	unsigned long set_interrupt_mask_reg;
128662306a36Sopenharmony_ci	unsigned long clr_interrupt_mask_reg;
128762306a36Sopenharmony_ci	unsigned long clr_interrupt_mask_reg32;
128862306a36Sopenharmony_ci	unsigned long sense_interrupt_mask_reg;
128962306a36Sopenharmony_ci	unsigned long sense_interrupt_mask_reg32;
129062306a36Sopenharmony_ci	unsigned long clr_interrupt_reg;
129162306a36Sopenharmony_ci	unsigned long clr_interrupt_reg32;
129262306a36Sopenharmony_ci
129362306a36Sopenharmony_ci	unsigned long sense_interrupt_reg;
129462306a36Sopenharmony_ci	unsigned long sense_interrupt_reg32;
129562306a36Sopenharmony_ci	unsigned long ioarrin_reg;
129662306a36Sopenharmony_ci	unsigned long sense_uproc_interrupt_reg;
129762306a36Sopenharmony_ci	unsigned long sense_uproc_interrupt_reg32;
129862306a36Sopenharmony_ci	unsigned long set_uproc_interrupt_reg;
129962306a36Sopenharmony_ci	unsigned long set_uproc_interrupt_reg32;
130062306a36Sopenharmony_ci	unsigned long clr_uproc_interrupt_reg;
130162306a36Sopenharmony_ci	unsigned long clr_uproc_interrupt_reg32;
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_ci	unsigned long init_feedback_reg;
130462306a36Sopenharmony_ci
130562306a36Sopenharmony_ci	unsigned long dump_addr_reg;
130662306a36Sopenharmony_ci	unsigned long dump_data_reg;
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci#define IPR_ENDIAN_SWAP_KEY		0x00080800
130962306a36Sopenharmony_ci	unsigned long endian_swap_reg;
131062306a36Sopenharmony_ci};
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_cistruct ipr_interrupts {
131362306a36Sopenharmony_ci	void __iomem *set_interrupt_mask_reg;
131462306a36Sopenharmony_ci	void __iomem *clr_interrupt_mask_reg;
131562306a36Sopenharmony_ci	void __iomem *clr_interrupt_mask_reg32;
131662306a36Sopenharmony_ci	void __iomem *sense_interrupt_mask_reg;
131762306a36Sopenharmony_ci	void __iomem *sense_interrupt_mask_reg32;
131862306a36Sopenharmony_ci	void __iomem *clr_interrupt_reg;
131962306a36Sopenharmony_ci	void __iomem *clr_interrupt_reg32;
132062306a36Sopenharmony_ci
132162306a36Sopenharmony_ci	void __iomem *sense_interrupt_reg;
132262306a36Sopenharmony_ci	void __iomem *sense_interrupt_reg32;
132362306a36Sopenharmony_ci	void __iomem *ioarrin_reg;
132462306a36Sopenharmony_ci	void __iomem *sense_uproc_interrupt_reg;
132562306a36Sopenharmony_ci	void __iomem *sense_uproc_interrupt_reg32;
132662306a36Sopenharmony_ci	void __iomem *set_uproc_interrupt_reg;
132762306a36Sopenharmony_ci	void __iomem *set_uproc_interrupt_reg32;
132862306a36Sopenharmony_ci	void __iomem *clr_uproc_interrupt_reg;
132962306a36Sopenharmony_ci	void __iomem *clr_uproc_interrupt_reg32;
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci	void __iomem *init_feedback_reg;
133262306a36Sopenharmony_ci
133362306a36Sopenharmony_ci	void __iomem *dump_addr_reg;
133462306a36Sopenharmony_ci	void __iomem *dump_data_reg;
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_ci	void __iomem *endian_swap_reg;
133762306a36Sopenharmony_ci};
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_cistruct ipr_chip_cfg_t {
134062306a36Sopenharmony_ci	u32 mailbox;
134162306a36Sopenharmony_ci	u16 max_cmds;
134262306a36Sopenharmony_ci	u8 cache_line_size;
134362306a36Sopenharmony_ci	u8 clear_isr;
134462306a36Sopenharmony_ci	u32 iopoll_weight;
134562306a36Sopenharmony_ci	struct ipr_interrupt_offsets regs;
134662306a36Sopenharmony_ci};
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_cistruct ipr_chip_t {
134962306a36Sopenharmony_ci	u16 vendor;
135062306a36Sopenharmony_ci	u16 device;
135162306a36Sopenharmony_ci	bool has_msi;
135262306a36Sopenharmony_ci	u16 sis_type;
135362306a36Sopenharmony_ci#define IPR_SIS32			0x00
135462306a36Sopenharmony_ci#define IPR_SIS64			0x01
135562306a36Sopenharmony_ci	u16 bist_method;
135662306a36Sopenharmony_ci#define IPR_PCI_CFG			0x00
135762306a36Sopenharmony_ci#define IPR_MMIO			0x01
135862306a36Sopenharmony_ci	const struct ipr_chip_cfg_t *cfg;
135962306a36Sopenharmony_ci};
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_cienum ipr_shutdown_type {
136262306a36Sopenharmony_ci	IPR_SHUTDOWN_NORMAL = 0x00,
136362306a36Sopenharmony_ci	IPR_SHUTDOWN_PREPARE_FOR_NORMAL = 0x40,
136462306a36Sopenharmony_ci	IPR_SHUTDOWN_ABBREV = 0x80,
136562306a36Sopenharmony_ci	IPR_SHUTDOWN_NONE = 0x100,
136662306a36Sopenharmony_ci	IPR_SHUTDOWN_QUIESCE = 0x101,
136762306a36Sopenharmony_ci};
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_cistruct ipr_trace_entry {
137062306a36Sopenharmony_ci	u32 time;
137162306a36Sopenharmony_ci
137262306a36Sopenharmony_ci	u8 op_code;
137362306a36Sopenharmony_ci	u8 ata_op_code;
137462306a36Sopenharmony_ci	u8 type;
137562306a36Sopenharmony_ci#define IPR_TRACE_START			0x00
137662306a36Sopenharmony_ci#define IPR_TRACE_FINISH		0xff
137762306a36Sopenharmony_ci	u8 cmd_index;
137862306a36Sopenharmony_ci
137962306a36Sopenharmony_ci	__be32 res_handle;
138062306a36Sopenharmony_ci	union {
138162306a36Sopenharmony_ci		u32 ioasc;
138262306a36Sopenharmony_ci		u32 add_data;
138362306a36Sopenharmony_ci		u32 res_addr;
138462306a36Sopenharmony_ci	} u;
138562306a36Sopenharmony_ci};
138662306a36Sopenharmony_ci
138762306a36Sopenharmony_cistruct ipr_sglist {
138862306a36Sopenharmony_ci	u32 order;
138962306a36Sopenharmony_ci	u32 num_sg;
139062306a36Sopenharmony_ci	u32 num_dma_sg;
139162306a36Sopenharmony_ci	u32 buffer_len;
139262306a36Sopenharmony_ci	struct scatterlist *scatterlist;
139362306a36Sopenharmony_ci};
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_cienum ipr_sdt_state {
139662306a36Sopenharmony_ci	INACTIVE,
139762306a36Sopenharmony_ci	WAIT_FOR_DUMP,
139862306a36Sopenharmony_ci	GET_DUMP,
139962306a36Sopenharmony_ci	READ_DUMP,
140062306a36Sopenharmony_ci	ABORT_DUMP,
140162306a36Sopenharmony_ci	DUMP_OBTAINED
140262306a36Sopenharmony_ci};
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci/* Per-controller data */
140562306a36Sopenharmony_cistruct ipr_ioa_cfg {
140662306a36Sopenharmony_ci	char eye_catcher[8];
140762306a36Sopenharmony_ci#define IPR_EYECATCHER			"iprcfg"
140862306a36Sopenharmony_ci
140962306a36Sopenharmony_ci	struct list_head queue;
141062306a36Sopenharmony_ci
141162306a36Sopenharmony_ci	u8 in_reset_reload:1;
141262306a36Sopenharmony_ci	u8 in_ioa_bringdown:1;
141362306a36Sopenharmony_ci	u8 ioa_unit_checked:1;
141462306a36Sopenharmony_ci	u8 dump_taken:1;
141562306a36Sopenharmony_ci	u8 scan_enabled:1;
141662306a36Sopenharmony_ci	u8 scan_done:1;
141762306a36Sopenharmony_ci	u8 needs_hard_reset:1;
141862306a36Sopenharmony_ci	u8 dual_raid:1;
141962306a36Sopenharmony_ci	u8 needs_warm_reset:1;
142062306a36Sopenharmony_ci	u8 msi_received:1;
142162306a36Sopenharmony_ci	u8 sis64:1;
142262306a36Sopenharmony_ci	u8 dump_timeout:1;
142362306a36Sopenharmony_ci	u8 cfg_locked:1;
142462306a36Sopenharmony_ci	u8 clear_isr:1;
142562306a36Sopenharmony_ci	u8 probe_done:1;
142662306a36Sopenharmony_ci	u8 scsi_unblock:1;
142762306a36Sopenharmony_ci	u8 scsi_blocked:1;
142862306a36Sopenharmony_ci
142962306a36Sopenharmony_ci	u8 revid;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	/*
143262306a36Sopenharmony_ci	 * Bitmaps for SIS64 generated target values
143362306a36Sopenharmony_ci	 */
143462306a36Sopenharmony_ci	unsigned long target_ids[BITS_TO_LONGS(IPR_MAX_SIS64_DEVS)];
143562306a36Sopenharmony_ci	unsigned long array_ids[BITS_TO_LONGS(IPR_MAX_SIS64_DEVS)];
143662306a36Sopenharmony_ci	unsigned long vset_ids[BITS_TO_LONGS(IPR_MAX_SIS64_DEVS)];
143762306a36Sopenharmony_ci
143862306a36Sopenharmony_ci	u16 type; /* CCIN of the card */
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_ci	u8 log_level;
144162306a36Sopenharmony_ci#define IPR_MAX_LOG_LEVEL			4
144262306a36Sopenharmony_ci#define IPR_DEFAULT_LOG_LEVEL		2
144362306a36Sopenharmony_ci#define IPR_DEBUG_LOG_LEVEL		3
144462306a36Sopenharmony_ci
144562306a36Sopenharmony_ci#define IPR_NUM_TRACE_INDEX_BITS	8
144662306a36Sopenharmony_ci#define IPR_NUM_TRACE_ENTRIES		(1 << IPR_NUM_TRACE_INDEX_BITS)
144762306a36Sopenharmony_ci#define IPR_TRACE_INDEX_MASK		(IPR_NUM_TRACE_ENTRIES - 1)
144862306a36Sopenharmony_ci#define IPR_TRACE_SIZE	(sizeof(struct ipr_trace_entry) * IPR_NUM_TRACE_ENTRIES)
144962306a36Sopenharmony_ci	char trace_start[8];
145062306a36Sopenharmony_ci#define IPR_TRACE_START_LABEL			"trace"
145162306a36Sopenharmony_ci	struct ipr_trace_entry *trace;
145262306a36Sopenharmony_ci	atomic_t trace_index;
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci	char cfg_table_start[8];
145562306a36Sopenharmony_ci#define IPR_CFG_TBL_START		"cfg"
145662306a36Sopenharmony_ci	union {
145762306a36Sopenharmony_ci		struct ipr_config_table *cfg_table;
145862306a36Sopenharmony_ci		struct ipr_config_table64 *cfg_table64;
145962306a36Sopenharmony_ci	} u;
146062306a36Sopenharmony_ci	dma_addr_t cfg_table_dma;
146162306a36Sopenharmony_ci	u32 cfg_table_size;
146262306a36Sopenharmony_ci	u32 max_devs_supported;
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	char resource_table_label[8];
146562306a36Sopenharmony_ci#define IPR_RES_TABLE_LABEL		"res_tbl"
146662306a36Sopenharmony_ci	struct ipr_resource_entry *res_entries;
146762306a36Sopenharmony_ci	struct list_head free_res_q;
146862306a36Sopenharmony_ci	struct list_head used_res_q;
146962306a36Sopenharmony_ci
147062306a36Sopenharmony_ci	char ipr_hcam_label[8];
147162306a36Sopenharmony_ci#define IPR_HCAM_LABEL			"hcams"
147262306a36Sopenharmony_ci	struct ipr_hostrcb *hostrcb[IPR_MAX_HCAMS];
147362306a36Sopenharmony_ci	dma_addr_t hostrcb_dma[IPR_MAX_HCAMS];
147462306a36Sopenharmony_ci	struct list_head hostrcb_free_q;
147562306a36Sopenharmony_ci	struct list_head hostrcb_pending_q;
147662306a36Sopenharmony_ci	struct list_head hostrcb_report_q;
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci	struct ipr_hrr_queue hrrq[IPR_MAX_HRRQ_NUM];
147962306a36Sopenharmony_ci	u32 hrrq_num;
148062306a36Sopenharmony_ci	atomic_t  hrrq_index;
148162306a36Sopenharmony_ci	u16 identify_hrrq_index;
148262306a36Sopenharmony_ci
148362306a36Sopenharmony_ci	struct ipr_bus_attributes bus_attr[IPR_MAX_NUM_BUSES];
148462306a36Sopenharmony_ci
148562306a36Sopenharmony_ci	unsigned int transop_timeout;
148662306a36Sopenharmony_ci	const struct ipr_chip_cfg_t *chip_cfg;
148762306a36Sopenharmony_ci	const struct ipr_chip_t *ipr_chip;
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci	void __iomem *hdw_dma_regs;	/* iomapped PCI memory space */
149062306a36Sopenharmony_ci	unsigned long hdw_dma_regs_pci;	/* raw PCI memory space */
149162306a36Sopenharmony_ci	void __iomem *ioa_mailbox;
149262306a36Sopenharmony_ci	struct ipr_interrupts regs;
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	u16 saved_pcix_cmd_reg;
149562306a36Sopenharmony_ci	u16 reset_retries;
149662306a36Sopenharmony_ci
149762306a36Sopenharmony_ci	u32 errors_logged;
149862306a36Sopenharmony_ci	u32 doorbell;
149962306a36Sopenharmony_ci
150062306a36Sopenharmony_ci	struct Scsi_Host *host;
150162306a36Sopenharmony_ci	struct pci_dev *pdev;
150262306a36Sopenharmony_ci	struct ipr_sglist *ucode_sglist;
150362306a36Sopenharmony_ci	u8 saved_mode_page_len;
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	struct work_struct work_q;
150662306a36Sopenharmony_ci	struct work_struct scsi_add_work_q;
150762306a36Sopenharmony_ci	struct workqueue_struct *reset_work_q;
150862306a36Sopenharmony_ci
150962306a36Sopenharmony_ci	wait_queue_head_t reset_wait_q;
151062306a36Sopenharmony_ci	wait_queue_head_t msi_wait_q;
151162306a36Sopenharmony_ci	wait_queue_head_t eeh_wait_q;
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci	struct ipr_dump *dump;
151462306a36Sopenharmony_ci	enum ipr_sdt_state sdt_state;
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci	struct ipr_misc_cbs *vpd_cbs;
151762306a36Sopenharmony_ci	dma_addr_t vpd_cbs_dma;
151862306a36Sopenharmony_ci
151962306a36Sopenharmony_ci	struct dma_pool *ipr_cmd_pool;
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	struct ipr_cmnd *reset_cmd;
152262306a36Sopenharmony_ci	int (*reset) (struct ipr_cmnd *);
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci	char ipr_cmd_label[8];
152562306a36Sopenharmony_ci#define IPR_CMD_LABEL		"ipr_cmd"
152662306a36Sopenharmony_ci	u32 max_cmds;
152762306a36Sopenharmony_ci	struct ipr_cmnd **ipr_cmnd_list;
152862306a36Sopenharmony_ci	dma_addr_t *ipr_cmnd_list_dma;
152962306a36Sopenharmony_ci
153062306a36Sopenharmony_ci	unsigned int nvectors;
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	struct {
153362306a36Sopenharmony_ci		char desc[22];
153462306a36Sopenharmony_ci	} vectors_info[IPR_MAX_MSIX_VECTORS];
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_ci	u32 iopoll_weight;
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci}; /* struct ipr_ioa_cfg */
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_cistruct ipr_cmnd {
154162306a36Sopenharmony_ci	struct ipr_ioarcb ioarcb;
154262306a36Sopenharmony_ci	union {
154362306a36Sopenharmony_ci		struct ipr_ioadl_desc ioadl[IPR_NUM_IOADL_ENTRIES];
154462306a36Sopenharmony_ci		struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
154562306a36Sopenharmony_ci	} i;
154662306a36Sopenharmony_ci	union {
154762306a36Sopenharmony_ci		struct ipr_ioasa ioasa;
154862306a36Sopenharmony_ci		struct ipr_ioasa64 ioasa64;
154962306a36Sopenharmony_ci	} s;
155062306a36Sopenharmony_ci	struct list_head queue;
155162306a36Sopenharmony_ci	struct scsi_cmnd *scsi_cmd;
155262306a36Sopenharmony_ci	struct completion completion;
155362306a36Sopenharmony_ci	struct timer_list timer;
155462306a36Sopenharmony_ci	struct work_struct work;
155562306a36Sopenharmony_ci	void (*fast_done) (struct ipr_cmnd *);
155662306a36Sopenharmony_ci	void (*done) (struct ipr_cmnd *);
155762306a36Sopenharmony_ci	int (*job_step) (struct ipr_cmnd *);
155862306a36Sopenharmony_ci	int (*job_step_failed) (struct ipr_cmnd *);
155962306a36Sopenharmony_ci	u16 cmd_index;
156062306a36Sopenharmony_ci	u8 sense_buffer[SCSI_SENSE_BUFFERSIZE];
156162306a36Sopenharmony_ci	dma_addr_t sense_buffer_dma;
156262306a36Sopenharmony_ci	unsigned short dma_use_sg;
156362306a36Sopenharmony_ci	dma_addr_t dma_addr;
156462306a36Sopenharmony_ci	struct ipr_cmnd *sibling;
156562306a36Sopenharmony_ci	union {
156662306a36Sopenharmony_ci		enum ipr_shutdown_type shutdown_type;
156762306a36Sopenharmony_ci		struct ipr_hostrcb *hostrcb;
156862306a36Sopenharmony_ci		unsigned long time_left;
156962306a36Sopenharmony_ci		unsigned long scratch;
157062306a36Sopenharmony_ci		struct ipr_resource_entry *res;
157162306a36Sopenharmony_ci		struct scsi_device *sdev;
157262306a36Sopenharmony_ci	} u;
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_ci	struct completion *eh_comp;
157562306a36Sopenharmony_ci	struct ipr_hrr_queue *hrrq;
157662306a36Sopenharmony_ci	struct ipr_ioa_cfg *ioa_cfg;
157762306a36Sopenharmony_ci};
157862306a36Sopenharmony_ci
157962306a36Sopenharmony_cistruct ipr_ses_table_entry {
158062306a36Sopenharmony_ci	char product_id[17];
158162306a36Sopenharmony_ci	char compare_product_id_byte[17];
158262306a36Sopenharmony_ci	u32 max_bus_speed_limit;	/* MB/sec limit for this backplane */
158362306a36Sopenharmony_ci};
158462306a36Sopenharmony_ci
158562306a36Sopenharmony_cistruct ipr_dump_header {
158662306a36Sopenharmony_ci	u32 eye_catcher;
158762306a36Sopenharmony_ci#define IPR_DUMP_EYE_CATCHER		0xC5D4E3F2
158862306a36Sopenharmony_ci	u32 len;
158962306a36Sopenharmony_ci	u32 num_entries;
159062306a36Sopenharmony_ci	u32 first_entry_offset;
159162306a36Sopenharmony_ci	u32 status;
159262306a36Sopenharmony_ci#define IPR_DUMP_STATUS_SUCCESS			0
159362306a36Sopenharmony_ci#define IPR_DUMP_STATUS_QUAL_SUCCESS		2
159462306a36Sopenharmony_ci#define IPR_DUMP_STATUS_FAILED			0xffffffff
159562306a36Sopenharmony_ci	u32 os;
159662306a36Sopenharmony_ci#define IPR_DUMP_OS_LINUX	0x4C4E5558
159762306a36Sopenharmony_ci	u32 driver_name;
159862306a36Sopenharmony_ci#define IPR_DUMP_DRIVER_NAME	0x49505232
159962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_cistruct ipr_dump_entry_header {
160262306a36Sopenharmony_ci	u32 eye_catcher;
160362306a36Sopenharmony_ci#define IPR_DUMP_EYE_CATCHER		0xC5D4E3F2
160462306a36Sopenharmony_ci	u32 len;
160562306a36Sopenharmony_ci	u32 num_elems;
160662306a36Sopenharmony_ci	u32 offset;
160762306a36Sopenharmony_ci	u32 data_type;
160862306a36Sopenharmony_ci#define IPR_DUMP_DATA_TYPE_ASCII	0x41534349
160962306a36Sopenharmony_ci#define IPR_DUMP_DATA_TYPE_BINARY	0x42494E41
161062306a36Sopenharmony_ci	u32 id;
161162306a36Sopenharmony_ci#define IPR_DUMP_IOA_DUMP_ID		0x494F4131
161262306a36Sopenharmony_ci#define IPR_DUMP_LOCATION_ID		0x4C4F4341
161362306a36Sopenharmony_ci#define IPR_DUMP_TRACE_ID		0x54524143
161462306a36Sopenharmony_ci#define IPR_DUMP_DRIVER_VERSION_ID	0x44525652
161562306a36Sopenharmony_ci#define IPR_DUMP_DRIVER_TYPE_ID	0x54595045
161662306a36Sopenharmony_ci#define IPR_DUMP_IOA_CTRL_BLK		0x494F4342
161762306a36Sopenharmony_ci#define IPR_DUMP_PEND_OPS		0x414F5053
161862306a36Sopenharmony_ci	u32 status;
161962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_cistruct ipr_dump_location_entry {
162262306a36Sopenharmony_ci	struct ipr_dump_entry_header hdr;
162362306a36Sopenharmony_ci	u8 location[20];
162462306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
162562306a36Sopenharmony_ci
162662306a36Sopenharmony_cistruct ipr_dump_trace_entry {
162762306a36Sopenharmony_ci	struct ipr_dump_entry_header hdr;
162862306a36Sopenharmony_ci	u32 trace[IPR_TRACE_SIZE / sizeof(u32)];
162962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_cistruct ipr_dump_version_entry {
163262306a36Sopenharmony_ci	struct ipr_dump_entry_header hdr;
163362306a36Sopenharmony_ci	u8 version[sizeof(IPR_DRIVER_VERSION)];
163462306a36Sopenharmony_ci};
163562306a36Sopenharmony_ci
163662306a36Sopenharmony_cistruct ipr_dump_ioa_type_entry {
163762306a36Sopenharmony_ci	struct ipr_dump_entry_header hdr;
163862306a36Sopenharmony_ci	u32 type;
163962306a36Sopenharmony_ci	u32 fw_version;
164062306a36Sopenharmony_ci};
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_cistruct ipr_driver_dump {
164362306a36Sopenharmony_ci	struct ipr_dump_header hdr;
164462306a36Sopenharmony_ci	struct ipr_dump_version_entry version_entry;
164562306a36Sopenharmony_ci	struct ipr_dump_location_entry location_entry;
164662306a36Sopenharmony_ci	struct ipr_dump_ioa_type_entry ioa_type_entry;
164762306a36Sopenharmony_ci	struct ipr_dump_trace_entry trace_entry;
164862306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
164962306a36Sopenharmony_ci
165062306a36Sopenharmony_cistruct ipr_ioa_dump {
165162306a36Sopenharmony_ci	struct ipr_dump_entry_header hdr;
165262306a36Sopenharmony_ci	struct ipr_sdt sdt;
165362306a36Sopenharmony_ci	__be32 **ioa_data;
165462306a36Sopenharmony_ci	u32 reserved;
165562306a36Sopenharmony_ci	u32 next_page_index;
165662306a36Sopenharmony_ci	u32 page_offset;
165762306a36Sopenharmony_ci	u32 format;
165862306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_cistruct ipr_dump {
166162306a36Sopenharmony_ci	struct kref kref;
166262306a36Sopenharmony_ci	struct ipr_ioa_cfg *ioa_cfg;
166362306a36Sopenharmony_ci	struct ipr_driver_dump driver_dump;
166462306a36Sopenharmony_ci	struct ipr_ioa_dump ioa_dump;
166562306a36Sopenharmony_ci};
166662306a36Sopenharmony_ci
166762306a36Sopenharmony_cistruct ipr_error_table_t {
166862306a36Sopenharmony_ci	u32 ioasc;
166962306a36Sopenharmony_ci	int log_ioasa;
167062306a36Sopenharmony_ci	int log_hcam;
167162306a36Sopenharmony_ci	char *error;
167262306a36Sopenharmony_ci};
167362306a36Sopenharmony_ci
167462306a36Sopenharmony_cistruct ipr_software_inq_lid_info {
167562306a36Sopenharmony_ci	__be32 load_id;
167662306a36Sopenharmony_ci	__be32 timestamp[3];
167762306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
167862306a36Sopenharmony_ci
167962306a36Sopenharmony_cistruct ipr_ucode_image_header {
168062306a36Sopenharmony_ci	__be32 header_length;
168162306a36Sopenharmony_ci	__be32 lid_table_offset;
168262306a36Sopenharmony_ci	u8 major_release;
168362306a36Sopenharmony_ci	u8 card_type;
168462306a36Sopenharmony_ci	u8 minor_release[2];
168562306a36Sopenharmony_ci	u8 reserved[20];
168662306a36Sopenharmony_ci	char eyecatcher[16];
168762306a36Sopenharmony_ci	__be32 num_lids;
168862306a36Sopenharmony_ci	struct ipr_software_inq_lid_info lid[1];
168962306a36Sopenharmony_ci}__attribute__((packed, aligned (4)));
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci/*
169262306a36Sopenharmony_ci * Macros
169362306a36Sopenharmony_ci */
169462306a36Sopenharmony_ci#define IPR_DBG_CMD(CMD) if (ipr_debug) { CMD; }
169562306a36Sopenharmony_ci
169662306a36Sopenharmony_ci#ifdef CONFIG_SCSI_IPR_TRACE
169762306a36Sopenharmony_ci#define ipr_create_trace_file(kobj, attr) sysfs_create_bin_file(kobj, attr)
169862306a36Sopenharmony_ci#define ipr_remove_trace_file(kobj, attr) sysfs_remove_bin_file(kobj, attr)
169962306a36Sopenharmony_ci#else
170062306a36Sopenharmony_ci#define ipr_create_trace_file(kobj, attr) 0
170162306a36Sopenharmony_ci#define ipr_remove_trace_file(kobj, attr) do { } while(0)
170262306a36Sopenharmony_ci#endif
170362306a36Sopenharmony_ci
170462306a36Sopenharmony_ci#ifdef CONFIG_SCSI_IPR_DUMP
170562306a36Sopenharmony_ci#define ipr_create_dump_file(kobj, attr) sysfs_create_bin_file(kobj, attr)
170662306a36Sopenharmony_ci#define ipr_remove_dump_file(kobj, attr) sysfs_remove_bin_file(kobj, attr)
170762306a36Sopenharmony_ci#else
170862306a36Sopenharmony_ci#define ipr_create_dump_file(kobj, attr) 0
170962306a36Sopenharmony_ci#define ipr_remove_dump_file(kobj, attr) do { } while(0)
171062306a36Sopenharmony_ci#endif
171162306a36Sopenharmony_ci
171262306a36Sopenharmony_ci/*
171362306a36Sopenharmony_ci * Error logging macros
171462306a36Sopenharmony_ci */
171562306a36Sopenharmony_ci#define ipr_err(...) printk(KERN_ERR IPR_NAME ": "__VA_ARGS__)
171662306a36Sopenharmony_ci#define ipr_info(...) printk(KERN_INFO IPR_NAME ": "__VA_ARGS__)
171762306a36Sopenharmony_ci#define ipr_dbg(...) IPR_DBG_CMD(printk(KERN_INFO IPR_NAME ": "__VA_ARGS__))
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_ci#define ipr_res_printk(level, ioa_cfg, bus, target, lun, fmt, ...) \
172062306a36Sopenharmony_ci	printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \
172162306a36Sopenharmony_ci		bus, target, lun, ##__VA_ARGS__)
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci#define ipr_res_err(ioa_cfg, res, fmt, ...) \
172462306a36Sopenharmony_ci	ipr_res_printk(KERN_ERR, ioa_cfg, (res)->bus, (res)->target, (res)->lun, fmt, ##__VA_ARGS__)
172562306a36Sopenharmony_ci
172662306a36Sopenharmony_ci#define ipr_ra_printk(level, ioa_cfg, ra, fmt, ...) \
172762306a36Sopenharmony_ci	printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \
172862306a36Sopenharmony_ci		(ra).bus, (ra).target, (ra).lun, ##__VA_ARGS__)
172962306a36Sopenharmony_ci
173062306a36Sopenharmony_ci#define ipr_ra_err(ioa_cfg, ra, fmt, ...) \
173162306a36Sopenharmony_ci	ipr_ra_printk(KERN_ERR, ioa_cfg, ra, fmt, ##__VA_ARGS__)
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_ci#define ipr_phys_res_err(ioa_cfg, res, fmt, ...)			\
173462306a36Sopenharmony_ci{									\
173562306a36Sopenharmony_ci	if ((res).bus >= IPR_MAX_NUM_BUSES) {				\
173662306a36Sopenharmony_ci		ipr_err(fmt": unknown\n", ##__VA_ARGS__);		\
173762306a36Sopenharmony_ci	} else {							\
173862306a36Sopenharmony_ci		ipr_err(fmt": %d:%d:%d:%d\n",				\
173962306a36Sopenharmony_ci			##__VA_ARGS__, (ioa_cfg)->host->host_no,	\
174062306a36Sopenharmony_ci			(res).bus, (res).target, (res).lun);		\
174162306a36Sopenharmony_ci	}								\
174262306a36Sopenharmony_ci}
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci#define ipr_hcam_err(hostrcb, fmt, ...)					\
174562306a36Sopenharmony_ci{									\
174662306a36Sopenharmony_ci	if (ipr_is_device(hostrcb)) {					\
174762306a36Sopenharmony_ci		if ((hostrcb)->ioa_cfg->sis64) {			\
174862306a36Sopenharmony_ci			printk(KERN_ERR IPR_NAME ": %s: " fmt, 		\
174962306a36Sopenharmony_ci				ipr_format_res_path(hostrcb->ioa_cfg,	\
175062306a36Sopenharmony_ci					hostrcb->hcam.u.error64.fd_res_path, \
175162306a36Sopenharmony_ci					hostrcb->rp_buffer,		\
175262306a36Sopenharmony_ci					sizeof(hostrcb->rp_buffer)),	\
175362306a36Sopenharmony_ci				__VA_ARGS__);				\
175462306a36Sopenharmony_ci		} else {						\
175562306a36Sopenharmony_ci			ipr_ra_err((hostrcb)->ioa_cfg,			\
175662306a36Sopenharmony_ci				(hostrcb)->hcam.u.error.fd_res_addr,	\
175762306a36Sopenharmony_ci				fmt, __VA_ARGS__);			\
175862306a36Sopenharmony_ci		}							\
175962306a36Sopenharmony_ci	} else {							\
176062306a36Sopenharmony_ci		dev_err(&(hostrcb)->ioa_cfg->pdev->dev, fmt, __VA_ARGS__); \
176162306a36Sopenharmony_ci	}								\
176262306a36Sopenharmony_ci}
176362306a36Sopenharmony_ci
176462306a36Sopenharmony_ci#define ipr_trace ipr_dbg("%s: %s: Line: %d\n",\
176562306a36Sopenharmony_ci	__FILE__, __func__, __LINE__)
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_ci#define ENTER IPR_DBG_CMD(printk(KERN_INFO IPR_NAME": Entering %s\n", __func__))
176862306a36Sopenharmony_ci#define LEAVE IPR_DBG_CMD(printk(KERN_INFO IPR_NAME": Leaving %s\n", __func__))
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci#define ipr_err_separator \
177162306a36Sopenharmony_ciipr_err("----------------------------------------------------------\n")
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci
177462306a36Sopenharmony_ci/*
177562306a36Sopenharmony_ci * Inlines
177662306a36Sopenharmony_ci */
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_ci/**
177962306a36Sopenharmony_ci * ipr_is_ioa_resource - Determine if a resource is the IOA
178062306a36Sopenharmony_ci * @res:	resource entry struct
178162306a36Sopenharmony_ci *
178262306a36Sopenharmony_ci * Return value:
178362306a36Sopenharmony_ci * 	1 if IOA / 0 if not IOA
178462306a36Sopenharmony_ci **/
178562306a36Sopenharmony_cistatic inline int ipr_is_ioa_resource(struct ipr_resource_entry *res)
178662306a36Sopenharmony_ci{
178762306a36Sopenharmony_ci	return res->type == IPR_RES_TYPE_IOAFP;
178862306a36Sopenharmony_ci}
178962306a36Sopenharmony_ci
179062306a36Sopenharmony_ci/**
179162306a36Sopenharmony_ci * ipr_is_af_dasd_device - Determine if a resource is an AF DASD
179262306a36Sopenharmony_ci * @res:	resource entry struct
179362306a36Sopenharmony_ci *
179462306a36Sopenharmony_ci * Return value:
179562306a36Sopenharmony_ci * 	1 if AF DASD / 0 if not AF DASD
179662306a36Sopenharmony_ci **/
179762306a36Sopenharmony_cistatic inline int ipr_is_af_dasd_device(struct ipr_resource_entry *res)
179862306a36Sopenharmony_ci{
179962306a36Sopenharmony_ci	return res->type == IPR_RES_TYPE_AF_DASD ||
180062306a36Sopenharmony_ci		res->type == IPR_RES_TYPE_REMOTE_AF_DASD;
180162306a36Sopenharmony_ci}
180262306a36Sopenharmony_ci
180362306a36Sopenharmony_ci/**
180462306a36Sopenharmony_ci * ipr_is_vset_device - Determine if a resource is a VSET
180562306a36Sopenharmony_ci * @res:	resource entry struct
180662306a36Sopenharmony_ci *
180762306a36Sopenharmony_ci * Return value:
180862306a36Sopenharmony_ci * 	1 if VSET / 0 if not VSET
180962306a36Sopenharmony_ci **/
181062306a36Sopenharmony_cistatic inline int ipr_is_vset_device(struct ipr_resource_entry *res)
181162306a36Sopenharmony_ci{
181262306a36Sopenharmony_ci	return res->type == IPR_RES_TYPE_VOLUME_SET;
181362306a36Sopenharmony_ci}
181462306a36Sopenharmony_ci
181562306a36Sopenharmony_ci/**
181662306a36Sopenharmony_ci * ipr_is_gscsi - Determine if a resource is a generic scsi resource
181762306a36Sopenharmony_ci * @res:	resource entry struct
181862306a36Sopenharmony_ci *
181962306a36Sopenharmony_ci * Return value:
182062306a36Sopenharmony_ci * 	1 if GSCSI / 0 if not GSCSI
182162306a36Sopenharmony_ci **/
182262306a36Sopenharmony_cistatic inline int ipr_is_gscsi(struct ipr_resource_entry *res)
182362306a36Sopenharmony_ci{
182462306a36Sopenharmony_ci	return res->type == IPR_RES_TYPE_GENERIC_SCSI;
182562306a36Sopenharmony_ci}
182662306a36Sopenharmony_ci
182762306a36Sopenharmony_ci/**
182862306a36Sopenharmony_ci * ipr_is_scsi_disk - Determine if a resource is a SCSI disk
182962306a36Sopenharmony_ci * @res:	resource entry struct
183062306a36Sopenharmony_ci *
183162306a36Sopenharmony_ci * Return value:
183262306a36Sopenharmony_ci * 	1 if SCSI disk / 0 if not SCSI disk
183362306a36Sopenharmony_ci **/
183462306a36Sopenharmony_cistatic inline int ipr_is_scsi_disk(struct ipr_resource_entry *res)
183562306a36Sopenharmony_ci{
183662306a36Sopenharmony_ci	if (ipr_is_af_dasd_device(res) ||
183762306a36Sopenharmony_ci	    (ipr_is_gscsi(res) && IPR_IS_DASD_DEVICE(res->std_inq_data)))
183862306a36Sopenharmony_ci		return 1;
183962306a36Sopenharmony_ci	else
184062306a36Sopenharmony_ci		return 0;
184162306a36Sopenharmony_ci}
184262306a36Sopenharmony_ci
184362306a36Sopenharmony_ci/**
184462306a36Sopenharmony_ci * ipr_is_gata - Determine if a resource is a generic ATA resource
184562306a36Sopenharmony_ci * @res:	resource entry struct
184662306a36Sopenharmony_ci *
184762306a36Sopenharmony_ci * Return value:
184862306a36Sopenharmony_ci * 	1 if GATA / 0 if not GATA
184962306a36Sopenharmony_ci **/
185062306a36Sopenharmony_cistatic inline int ipr_is_gata(struct ipr_resource_entry *res)
185162306a36Sopenharmony_ci{
185262306a36Sopenharmony_ci	return res->type == IPR_RES_TYPE_GENERIC_ATA;
185362306a36Sopenharmony_ci}
185462306a36Sopenharmony_ci
185562306a36Sopenharmony_ci/**
185662306a36Sopenharmony_ci * ipr_is_naca_model - Determine if a resource is using NACA queueing model
185762306a36Sopenharmony_ci * @res:	resource entry struct
185862306a36Sopenharmony_ci *
185962306a36Sopenharmony_ci * Return value:
186062306a36Sopenharmony_ci * 	1 if NACA queueing model / 0 if not NACA queueing model
186162306a36Sopenharmony_ci **/
186262306a36Sopenharmony_cistatic inline int ipr_is_naca_model(struct ipr_resource_entry *res)
186362306a36Sopenharmony_ci{
186462306a36Sopenharmony_ci	if (ipr_is_gscsi(res) && res->qmodel == IPR_QUEUE_NACA_MODEL)
186562306a36Sopenharmony_ci		return 1;
186662306a36Sopenharmony_ci	return 0;
186762306a36Sopenharmony_ci}
186862306a36Sopenharmony_ci
186962306a36Sopenharmony_ci/**
187062306a36Sopenharmony_ci * ipr_is_device - Determine if the hostrcb structure is related to a device
187162306a36Sopenharmony_ci * @hostrcb:	host resource control blocks struct
187262306a36Sopenharmony_ci *
187362306a36Sopenharmony_ci * Return value:
187462306a36Sopenharmony_ci * 	1 if AF / 0 if not AF
187562306a36Sopenharmony_ci **/
187662306a36Sopenharmony_cistatic inline int ipr_is_device(struct ipr_hostrcb *hostrcb)
187762306a36Sopenharmony_ci{
187862306a36Sopenharmony_ci	struct ipr_res_addr *res_addr;
187962306a36Sopenharmony_ci	u8 *res_path;
188062306a36Sopenharmony_ci
188162306a36Sopenharmony_ci	if (hostrcb->ioa_cfg->sis64) {
188262306a36Sopenharmony_ci		res_path = &hostrcb->hcam.u.error64.fd_res_path[0];
188362306a36Sopenharmony_ci		if ((res_path[0] == 0x00 || res_path[0] == 0x80 ||
188462306a36Sopenharmony_ci		    res_path[0] == 0x81) && res_path[2] != 0xFF)
188562306a36Sopenharmony_ci			return 1;
188662306a36Sopenharmony_ci	} else {
188762306a36Sopenharmony_ci		res_addr = &hostrcb->hcam.u.error.fd_res_addr;
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_ci		if ((res_addr->bus < IPR_MAX_NUM_BUSES) &&
189062306a36Sopenharmony_ci		    (res_addr->target < (IPR_MAX_NUM_TARGETS_PER_BUS - 1)))
189162306a36Sopenharmony_ci			return 1;
189262306a36Sopenharmony_ci	}
189362306a36Sopenharmony_ci	return 0;
189462306a36Sopenharmony_ci}
189562306a36Sopenharmony_ci
189662306a36Sopenharmony_ci/**
189762306a36Sopenharmony_ci * ipr_sdt_is_fmt2 - Determine if a SDT address is in format 2
189862306a36Sopenharmony_ci * @sdt_word:	SDT address
189962306a36Sopenharmony_ci *
190062306a36Sopenharmony_ci * Return value:
190162306a36Sopenharmony_ci * 	1 if format 2 / 0 if not
190262306a36Sopenharmony_ci **/
190362306a36Sopenharmony_cistatic inline int ipr_sdt_is_fmt2(u32 sdt_word)
190462306a36Sopenharmony_ci{
190562306a36Sopenharmony_ci	u32 bar_sel = IPR_GET_FMT2_BAR_SEL(sdt_word);
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci	switch (bar_sel) {
190862306a36Sopenharmony_ci	case IPR_SDT_FMT2_BAR0_SEL:
190962306a36Sopenharmony_ci	case IPR_SDT_FMT2_BAR1_SEL:
191062306a36Sopenharmony_ci	case IPR_SDT_FMT2_BAR2_SEL:
191162306a36Sopenharmony_ci	case IPR_SDT_FMT2_BAR3_SEL:
191262306a36Sopenharmony_ci	case IPR_SDT_FMT2_BAR4_SEL:
191362306a36Sopenharmony_ci	case IPR_SDT_FMT2_BAR5_SEL:
191462306a36Sopenharmony_ci	case IPR_SDT_FMT2_EXP_ROM_SEL:
191562306a36Sopenharmony_ci		return 1;
191662306a36Sopenharmony_ci	};
191762306a36Sopenharmony_ci
191862306a36Sopenharmony_ci	return 0;
191962306a36Sopenharmony_ci}
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_ci#ifndef writeq
192262306a36Sopenharmony_cistatic inline void writeq(u64 val, void __iomem *addr)
192362306a36Sopenharmony_ci{
192462306a36Sopenharmony_ci        writel(((u32) (val >> 32)), addr);
192562306a36Sopenharmony_ci        writel(((u32) (val)), (addr + 4));
192662306a36Sopenharmony_ci}
192762306a36Sopenharmony_ci#endif
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_ci#endif /* _IPR_H */
1930