cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ibmvscsi_tgt.h (10639B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*******************************************************************************
      3 * IBM Virtual SCSI Target Driver
      4 * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
      5 *			   Santiago Leon (santil@us.ibm.com) IBM Corp.
      6 *			   Linda Xie (lxie@us.ibm.com) IBM Corp.
      7 *
      8 * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>
      9 * Copyright (C) 2010 Nicholas A. Bellinger <nab@kernel.org>
     10 * Copyright (C) 2016 Bryant G. Ly <bryantly@linux.vnet.ibm.com> IBM Corp.
     11 *
     12 * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
     13 * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com>
     14 *
     15 ****************************************************************************/
     16
     17#ifndef __H_IBMVSCSI_TGT
     18#define __H_IBMVSCSI_TGT
     19
     20#include <linux/interrupt.h>
     21#include "libsrp.h"
     22
     23#define SYS_ID_NAME_LEN		64
     24#define PARTITION_NAMELEN	96
     25#define IBMVSCSIS_NAMELEN       32
     26
     27#define MSG_HI  0
     28#define MSG_LOW 1
     29
     30#define MAX_CMD_Q_PAGES       4
     31#define CRQ_PER_PAGE          (PAGE_SIZE / sizeof(struct viosrp_crq))
     32/* in terms of number of elements */
     33#define DEFAULT_CMD_Q_SIZE    CRQ_PER_PAGE
     34#define MAX_CMD_Q_SIZE        (DEFAULT_CMD_Q_SIZE * MAX_CMD_Q_PAGES)
     35
     36#define SRP_VIOLATION           0x102  /* general error code */
     37
     38/*
     39 * SRP buffer formats defined as of 16.a supported by this driver.
     40 */
     41#define SUPPORTED_FORMATS  ((SRP_DATA_DESC_DIRECT << 1) | \
     42			    (SRP_DATA_DESC_INDIRECT << 1))
     43
     44#define SCSI_LUN_ADDR_METHOD_FLAT	1
     45
     46struct dma_window {
     47	u32 liobn;	/* Unique per vdevice */
     48	u64 tce_base;	/* Physical location of the TCE table */
     49	u64 tce_size;	/* Size of the TCE table in bytes */
     50};
     51
     52struct target_dds {
     53	u64 unit_id;                /* 64 bit will force alignment */
     54#define NUM_DMA_WINDOWS 2
     55#define LOCAL  0
     56#define REMOTE 1
     57	struct dma_window  window[NUM_DMA_WINDOWS];
     58
     59	/* root node property "ibm,partition-no" */
     60	uint partition_num;
     61	char partition_name[PARTITION_NAMELEN];
     62};
     63
     64#define MAX_NUM_PORTS        1
     65#define MAX_H_COPY_RDMA      (128 * 1024)
     66
     67#define MAX_EYE   64
     68
     69/* Return codes */
     70#define ADAPT_SUCCESS            0L
     71/* choose error codes that do not conflict with PHYP */
     72#define ERROR                   -40L
     73
     74struct format_code {
     75	u8 reserved;
     76	u8 buffers;
     77};
     78
     79struct client_info {
     80#define SRP_VERSION "16.a"
     81	char srp_version[8];
     82	/* root node property ibm,partition-name */
     83	char partition_name[PARTITION_NAMELEN];
     84	/* root node property ibm,partition-no */
     85	u32 partition_number;
     86	/* initially 1 */
     87	u32 mad_version;
     88	u32 os_type;
     89};
     90
     91/*
     92 * Changing this constant changes the number of seconds to wait before
     93 * considering the client will never service its queue again.
     94 */
     95#define SECONDS_TO_CONSIDER_FAILED 30
     96/*
     97 * These constants set the polling period used to determine if the client
     98 * has freed at least one element in the response queue.
     99 */
    100#define WAIT_SECONDS 1
    101#define WAIT_NANO_SECONDS 5000
    102#define MAX_TIMER_POPS ((1000000 / WAIT_NANO_SECONDS) * \
    103			SECONDS_TO_CONSIDER_FAILED)
    104/*
    105 * general purpose timer control block
    106 * which can be used for multiple functions
    107 */
    108struct timer_cb {
    109	struct hrtimer timer;
    110	/*
    111	 * how long has it been since the client
    112	 * serviced the queue. The variable is incrmented
    113	 * in the service_wait_q routine and cleared
    114	 * in send messages
    115	 */
    116	int timer_pops;
    117	/* the timer is started */
    118	bool started;
    119};
    120
    121struct cmd_queue {
    122	/* kva */
    123	struct viosrp_crq *base_addr;
    124	dma_addr_t crq_token;
    125	/* used to maintain index */
    126	uint mask;
    127	/* current element */
    128	uint index;
    129	int size;
    130};
    131
    132#define SCSOLNT_RESP_SHIFT	1
    133#define UCSOLNT_RESP_SHIFT	2
    134
    135#define SCSOLNT         BIT(SCSOLNT_RESP_SHIFT)
    136#define UCSOLNT         BIT(UCSOLNT_RESP_SHIFT)
    137
    138enum cmd_type {
    139	SCSI_CDB	= 0x01,
    140	TASK_MANAGEMENT	= 0x02,
    141	/* MAD or addressed to port 0 */
    142	ADAPTER_MAD	= 0x04,
    143	UNSET_TYPE	= 0x08,
    144};
    145
    146struct iu_rsp {
    147	u8 format;
    148	u8 sol_not;
    149	u16 len;
    150	/* tag is just to help client identify cmd, so don't translate be/le */
    151	u64 tag;
    152};
    153
    154struct ibmvscsis_cmd {
    155	struct list_head list;
    156	/* Used for TCM Core operations */
    157	struct se_cmd se_cmd;
    158	struct iu_entry *iue;
    159	struct iu_rsp rsp;
    160	struct work_struct work;
    161	struct scsi_info *adapter;
    162	struct ibmvscsis_cmd *abort_cmd;
    163	/* Sense buffer that will be mapped into outgoing status */
    164	unsigned char sense_buf[TRANSPORT_SENSE_BUFFER];
    165	u64 init_time;
    166#define CMD_FAST_FAIL	BIT(0)
    167#define DELAY_SEND	BIT(1)
    168	u32 flags;
    169	char type;
    170};
    171
    172struct ibmvscsis_nexus {
    173	struct se_session *se_sess;
    174};
    175
    176struct ibmvscsis_tport {
    177	/* SCSI protocol the tport is providing */
    178	u8 tport_proto_id;
    179	/* ASCII formatted WWPN for SRP Target port */
    180	char tport_name[IBMVSCSIS_NAMELEN];
    181	/* Returned by ibmvscsis_make_tport() */
    182	struct se_wwn tport_wwn;
    183	/* Returned by ibmvscsis_make_tpg() */
    184	struct se_portal_group se_tpg;
    185	/* ibmvscsis port target portal group tag for TCM */
    186	u16 tport_tpgt;
    187	/* Pointer to TCM session for I_T Nexus */
    188	struct ibmvscsis_nexus *ibmv_nexus;
    189	bool enabled;
    190	bool releasing;
    191};
    192
    193struct scsi_info {
    194	struct list_head list;
    195	char eye[MAX_EYE];
    196
    197	/* commands waiting for space on repsonse queue */
    198	struct list_head waiting_rsp;
    199#define NO_QUEUE                    0x00
    200#define WAIT_ENABLED                0X01
    201#define WAIT_CONNECTION             0x04
    202	/* have established a connection */
    203#define CONNECTED                   0x08
    204	/* at least one port is processing SRP IU */
    205#define SRP_PROCESSING              0x10
    206	/* remove request received */
    207#define UNCONFIGURING               0x20
    208	/* disconnect by letting adapter go idle, no error */
    209#define WAIT_IDLE                   0x40
    210	/* disconnecting to clear an error */
    211#define ERR_DISCONNECT              0x80
    212	/* disconnect to clear error state, then come back up */
    213#define ERR_DISCONNECT_RECONNECT    0x100
    214	/* disconnected after clearing an error */
    215#define ERR_DISCONNECTED            0x200
    216	/* A series of errors caused unexpected errors */
    217#define UNDEFINED                   0x400
    218	u16  state;
    219	int fast_fail;
    220	struct target_dds dds;
    221	char *cmd_pool;
    222	/* list of free commands */
    223	struct list_head free_cmd;
    224	/* command elements ready for scheduler */
    225	struct list_head schedule_q;
    226	/* commands sent to TCM */
    227	struct list_head active_q;
    228	caddr_t *map_buf;
    229	/* ioba of map buffer */
    230	dma_addr_t map_ioba;
    231	/* allowable number of outstanding SRP requests */
    232	int request_limit;
    233	/* extra credit */
    234	int credit;
    235	/* outstanding transactions against credit limit */
    236	int debit;
    237
    238	/* allow only one outstanding mad request */
    239#define PROCESSING_MAD                0x00002
    240	/* Waiting to go idle */
    241#define WAIT_FOR_IDLE		      0x00004
    242	/* H_REG_CRQ called */
    243#define CRQ_CLOSED                    0x00010
    244	/* detected that client has failed */
    245#define CLIENT_FAILED                 0x00040
    246	/* detected that transport event occurred */
    247#define TRANS_EVENT                   0x00080
    248	/* don't attempt to send anything to the client */
    249#define RESPONSE_Q_DOWN               0x00100
    250	/* request made to schedule disconnect handler */
    251#define SCHEDULE_DISCONNECT           0x00400
    252	/* disconnect handler is scheduled */
    253#define DISCONNECT_SCHEDULED          0x00800
    254	/* remove function is sleeping */
    255#define CFG_SLEEPING                  0x01000
    256	/* Register for Prepare for Suspend Transport Events */
    257#define PREP_FOR_SUSPEND_ENABLED      0x02000
    258	/* Prepare for Suspend event sent */
    259#define PREP_FOR_SUSPEND_PENDING      0x04000
    260	/* Resume from Suspend event sent */
    261#define PREP_FOR_SUSPEND_ABORTED      0x08000
    262	/* Prepare for Suspend event overwrote another CRQ entry */
    263#define PREP_FOR_SUSPEND_OVERWRITE    0x10000
    264	u32 flags;
    265	/* adapter lock */
    266	spinlock_t intr_lock;
    267	/* information needed to manage command queue */
    268	struct cmd_queue cmd_q;
    269	/* used in hcall to copy response back into srp buffer */
    270	u64  empty_iu_id;
    271	/* used in crq, to tag what iu the response is for */
    272	u64  empty_iu_tag;
    273	uint new_state;
    274	uint resume_state;
    275	/* control block for the response queue timer */
    276	struct timer_cb rsp_q_timer;
    277	/* keep last client to enable proper accounting */
    278	struct client_info client_data;
    279	/* what can this client do */
    280	u32 client_cap;
    281	/*
    282	 * The following two fields capture state and flag changes that
    283	 * can occur when the lock is given up.  In the orginal design,
    284	 * the lock was held during calls into phyp;
    285	 * however, phyp did not meet PAPR architecture.  This is
    286	 * a work around.
    287	 */
    288	u16  phyp_acr_state;
    289	u32 phyp_acr_flags;
    290
    291	struct workqueue_struct *work_q;
    292	struct completion wait_idle;
    293	struct completion unconfig;
    294	struct device dev;
    295	struct vio_dev *dma_dev;
    296	struct srp_target target;
    297	struct ibmvscsis_tport tport;
    298	struct tasklet_struct work_task;
    299	struct work_struct proc_work;
    300};
    301
    302/*
    303 * Provide a constant that allows software to detect the adapter is
    304 * disconnecting from the client from one of several states.
    305 */
    306#define IS_DISCONNECTING (UNCONFIGURING | ERR_DISCONNECT_RECONNECT | \
    307			  ERR_DISCONNECT)
    308
    309/*
    310 * Provide a constant that can be used with interrupt handling that
    311 * essentially lets the interrupt handler know that all requests should
    312 * be thrown out,
    313 */
    314#define DONT_PROCESS_STATE (IS_DISCONNECTING | UNDEFINED | \
    315			    ERR_DISCONNECTED  | WAIT_IDLE)
    316
    317/*
    318 * If any of these flag bits are set then do not allow the interrupt
    319 * handler to schedule the off level handler.
    320 */
    321#define BLOCK (DISCONNECT_SCHEDULED)
    322
    323/* State and transition events that stop the interrupt handler */
    324#define TARGET_STOP(VSCSI) (long)(((VSCSI)->state & DONT_PROCESS_STATE) | \
    325				  ((VSCSI)->flags & BLOCK))
    326
    327#define PREP_FOR_SUSPEND_FLAGS  (PREP_FOR_SUSPEND_ENABLED | \
    328				 PREP_FOR_SUSPEND_PENDING | \
    329				 PREP_FOR_SUSPEND_ABORTED | \
    330				 PREP_FOR_SUSPEND_OVERWRITE)
    331
    332/* flag bit that are not reset during disconnect */
    333#define PRESERVE_FLAG_FIELDS (PREP_FOR_SUSPEND_FLAGS)
    334
    335#define vio_iu(IUE) ((union viosrp_iu *)((IUE)->sbuf->buf))
    336
    337#define READ_CMD(cdb)	(((cdb)[0] & 0x1F) == 8)
    338#define WRITE_CMD(cdb)	(((cdb)[0] & 0x1F) == 0xA)
    339
    340#ifndef H_GET_PARTNER_INFO
    341#define H_GET_PARTNER_INFO              0x0000000000000008LL
    342#endif
    343#ifndef H_ENABLE_PREPARE_FOR_SUSPEND
    344#define H_ENABLE_PREPARE_FOR_SUSPEND    0x000000000000001DLL
    345#endif
    346#ifndef H_READY_FOR_SUSPEND
    347#define H_READY_FOR_SUSPEND             0x000000000000001ELL
    348#endif
    349
    350
    351#define h_copy_rdma(l, sa, sb, da, db) \
    352		plpar_hcall_norets(H_COPY_RDMA, l, sa, sb, da, db)
    353#define h_vioctl(u, o, a, u1, u2, u3, u4) \
    354		plpar_hcall_norets(H_VIOCTL, u, o, a, u1, u2)
    355#define h_reg_crq(ua, tok, sz) \
    356		plpar_hcall_norets(H_REG_CRQ, ua, tok, sz)
    357#define h_free_crq(ua) \
    358		plpar_hcall_norets(H_FREE_CRQ, ua)
    359#define h_send_crq(ua, d1, d2) \
    360		plpar_hcall_norets(H_SEND_CRQ, ua, d1, d2)
    361
    362#endif