162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci * IBM Virtual SCSI Target Driver
462306a36Sopenharmony_ci * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
562306a36Sopenharmony_ci *			   Santiago Leon (santil@us.ibm.com) IBM Corp.
662306a36Sopenharmony_ci *			   Linda Xie (lxie@us.ibm.com) IBM Corp.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>
962306a36Sopenharmony_ci * Copyright (C) 2010 Nicholas A. Bellinger <nab@kernel.org>
1062306a36Sopenharmony_ci * Copyright (C) 2016 Bryant G. Ly <bryantly@linux.vnet.ibm.com> IBM Corp.
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
1362306a36Sopenharmony_ci * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com>
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci ****************************************************************************/
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifndef __H_IBMVSCSI_TGT
1862306a36Sopenharmony_ci#define __H_IBMVSCSI_TGT
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <linux/interrupt.h>
2162306a36Sopenharmony_ci#include "libsrp.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define SYS_ID_NAME_LEN		64
2462306a36Sopenharmony_ci#define PARTITION_NAMELEN	96
2562306a36Sopenharmony_ci#define IBMVSCSIS_NAMELEN       32
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define MSG_HI  0
2862306a36Sopenharmony_ci#define MSG_LOW 1
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define MAX_CMD_Q_PAGES       4
3162306a36Sopenharmony_ci#define CRQ_PER_PAGE          (PAGE_SIZE / sizeof(struct viosrp_crq))
3262306a36Sopenharmony_ci/* in terms of number of elements */
3362306a36Sopenharmony_ci#define DEFAULT_CMD_Q_SIZE    CRQ_PER_PAGE
3462306a36Sopenharmony_ci#define MAX_CMD_Q_SIZE        (DEFAULT_CMD_Q_SIZE * MAX_CMD_Q_PAGES)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define SRP_VIOLATION           0x102  /* general error code */
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/*
3962306a36Sopenharmony_ci * SRP buffer formats defined as of 16.a supported by this driver.
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_ci#define SUPPORTED_FORMATS  ((SRP_DATA_DESC_DIRECT << 1) | \
4262306a36Sopenharmony_ci			    (SRP_DATA_DESC_INDIRECT << 1))
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define SCSI_LUN_ADDR_METHOD_FLAT	1
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistruct dma_window {
4762306a36Sopenharmony_ci	u32 liobn;	/* Unique per vdevice */
4862306a36Sopenharmony_ci	u64 tce_base;	/* Physical location of the TCE table */
4962306a36Sopenharmony_ci	u64 tce_size;	/* Size of the TCE table in bytes */
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct target_dds {
5362306a36Sopenharmony_ci	u64 unit_id;                /* 64 bit will force alignment */
5462306a36Sopenharmony_ci#define NUM_DMA_WINDOWS 2
5562306a36Sopenharmony_ci#define LOCAL  0
5662306a36Sopenharmony_ci#define REMOTE 1
5762306a36Sopenharmony_ci	struct dma_window  window[NUM_DMA_WINDOWS];
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/* root node property "ibm,partition-no" */
6062306a36Sopenharmony_ci	uint partition_num;
6162306a36Sopenharmony_ci	char partition_name[PARTITION_NAMELEN];
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define MAX_NUM_PORTS        1
6562306a36Sopenharmony_ci#define MAX_H_COPY_RDMA      (128 * 1024)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define MAX_EYE   64
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* Return codes */
7062306a36Sopenharmony_ci#define ADAPT_SUCCESS            0L
7162306a36Sopenharmony_ci/* choose error codes that do not conflict with PHYP */
7262306a36Sopenharmony_ci#define ERROR                   -40L
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistruct format_code {
7562306a36Sopenharmony_ci	u8 reserved;
7662306a36Sopenharmony_ci	u8 buffers;
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct client_info {
8062306a36Sopenharmony_ci#define SRP_VERSION "16.a"
8162306a36Sopenharmony_ci	char srp_version[8];
8262306a36Sopenharmony_ci	/* root node property ibm,partition-name */
8362306a36Sopenharmony_ci	char partition_name[PARTITION_NAMELEN];
8462306a36Sopenharmony_ci	/* root node property ibm,partition-no */
8562306a36Sopenharmony_ci	u32 partition_number;
8662306a36Sopenharmony_ci	/* initially 1 */
8762306a36Sopenharmony_ci	u32 mad_version;
8862306a36Sopenharmony_ci	u32 os_type;
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/*
9262306a36Sopenharmony_ci * Changing this constant changes the number of seconds to wait before
9362306a36Sopenharmony_ci * considering the client will never service its queue again.
9462306a36Sopenharmony_ci */
9562306a36Sopenharmony_ci#define SECONDS_TO_CONSIDER_FAILED 30
9662306a36Sopenharmony_ci/*
9762306a36Sopenharmony_ci * These constants set the polling period used to determine if the client
9862306a36Sopenharmony_ci * has freed at least one element in the response queue.
9962306a36Sopenharmony_ci */
10062306a36Sopenharmony_ci#define WAIT_SECONDS 1
10162306a36Sopenharmony_ci#define WAIT_NANO_SECONDS 5000
10262306a36Sopenharmony_ci#define MAX_TIMER_POPS ((1000000 / WAIT_NANO_SECONDS) * \
10362306a36Sopenharmony_ci			SECONDS_TO_CONSIDER_FAILED)
10462306a36Sopenharmony_ci/*
10562306a36Sopenharmony_ci * general purpose timer control block
10662306a36Sopenharmony_ci * which can be used for multiple functions
10762306a36Sopenharmony_ci */
10862306a36Sopenharmony_cistruct timer_cb {
10962306a36Sopenharmony_ci	struct hrtimer timer;
11062306a36Sopenharmony_ci	/*
11162306a36Sopenharmony_ci	 * how long has it been since the client
11262306a36Sopenharmony_ci	 * serviced the queue. The variable is incrmented
11362306a36Sopenharmony_ci	 * in the service_wait_q routine and cleared
11462306a36Sopenharmony_ci	 * in send messages
11562306a36Sopenharmony_ci	 */
11662306a36Sopenharmony_ci	int timer_pops;
11762306a36Sopenharmony_ci	/* the timer is started */
11862306a36Sopenharmony_ci	bool started;
11962306a36Sopenharmony_ci};
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cistruct cmd_queue {
12262306a36Sopenharmony_ci	/* kva */
12362306a36Sopenharmony_ci	struct viosrp_crq *base_addr;
12462306a36Sopenharmony_ci	dma_addr_t crq_token;
12562306a36Sopenharmony_ci	/* used to maintain index */
12662306a36Sopenharmony_ci	uint mask;
12762306a36Sopenharmony_ci	/* current element */
12862306a36Sopenharmony_ci	uint index;
12962306a36Sopenharmony_ci	int size;
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#define SCSOLNT_RESP_SHIFT	1
13362306a36Sopenharmony_ci#define UCSOLNT_RESP_SHIFT	2
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define SCSOLNT         BIT(SCSOLNT_RESP_SHIFT)
13662306a36Sopenharmony_ci#define UCSOLNT         BIT(UCSOLNT_RESP_SHIFT)
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cienum cmd_type {
13962306a36Sopenharmony_ci	SCSI_CDB	= 0x01,
14062306a36Sopenharmony_ci	TASK_MANAGEMENT	= 0x02,
14162306a36Sopenharmony_ci	/* MAD or addressed to port 0 */
14262306a36Sopenharmony_ci	ADAPTER_MAD	= 0x04,
14362306a36Sopenharmony_ci	UNSET_TYPE	= 0x08,
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistruct iu_rsp {
14762306a36Sopenharmony_ci	u8 format;
14862306a36Sopenharmony_ci	u8 sol_not;
14962306a36Sopenharmony_ci	u16 len;
15062306a36Sopenharmony_ci	/* tag is just to help client identify cmd, so don't translate be/le */
15162306a36Sopenharmony_ci	u64 tag;
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistruct ibmvscsis_cmd {
15562306a36Sopenharmony_ci	struct list_head list;
15662306a36Sopenharmony_ci	/* Used for TCM Core operations */
15762306a36Sopenharmony_ci	struct se_cmd se_cmd;
15862306a36Sopenharmony_ci	struct iu_entry *iue;
15962306a36Sopenharmony_ci	struct iu_rsp rsp;
16062306a36Sopenharmony_ci	struct work_struct work;
16162306a36Sopenharmony_ci	struct scsi_info *adapter;
16262306a36Sopenharmony_ci	struct ibmvscsis_cmd *abort_cmd;
16362306a36Sopenharmony_ci	/* Sense buffer that will be mapped into outgoing status */
16462306a36Sopenharmony_ci	unsigned char sense_buf[TRANSPORT_SENSE_BUFFER];
16562306a36Sopenharmony_ci	u64 init_time;
16662306a36Sopenharmony_ci#define CMD_FAST_FAIL	BIT(0)
16762306a36Sopenharmony_ci#define DELAY_SEND	BIT(1)
16862306a36Sopenharmony_ci	u32 flags;
16962306a36Sopenharmony_ci	char type;
17062306a36Sopenharmony_ci};
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cistruct ibmvscsis_nexus {
17362306a36Sopenharmony_ci	struct se_session *se_sess;
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistruct ibmvscsis_tport {
17762306a36Sopenharmony_ci	/* SCSI protocol the tport is providing */
17862306a36Sopenharmony_ci	u8 tport_proto_id;
17962306a36Sopenharmony_ci	/* ASCII formatted WWPN for SRP Target port */
18062306a36Sopenharmony_ci	char tport_name[IBMVSCSIS_NAMELEN];
18162306a36Sopenharmony_ci	/* Returned by ibmvscsis_make_tport() */
18262306a36Sopenharmony_ci	struct se_wwn tport_wwn;
18362306a36Sopenharmony_ci	/* Returned by ibmvscsis_make_tpg() */
18462306a36Sopenharmony_ci	struct se_portal_group se_tpg;
18562306a36Sopenharmony_ci	/* ibmvscsis port target portal group tag for TCM */
18662306a36Sopenharmony_ci	u16 tport_tpgt;
18762306a36Sopenharmony_ci	/* Pointer to TCM session for I_T Nexus */
18862306a36Sopenharmony_ci	struct ibmvscsis_nexus *ibmv_nexus;
18962306a36Sopenharmony_ci	bool enabled;
19062306a36Sopenharmony_ci	bool releasing;
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cistruct scsi_info {
19462306a36Sopenharmony_ci	struct list_head list;
19562306a36Sopenharmony_ci	char eye[MAX_EYE];
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	/* commands waiting for space on repsonse queue */
19862306a36Sopenharmony_ci	struct list_head waiting_rsp;
19962306a36Sopenharmony_ci#define NO_QUEUE                    0x00
20062306a36Sopenharmony_ci#define WAIT_ENABLED                0X01
20162306a36Sopenharmony_ci#define WAIT_CONNECTION             0x04
20262306a36Sopenharmony_ci	/* have established a connection */
20362306a36Sopenharmony_ci#define CONNECTED                   0x08
20462306a36Sopenharmony_ci	/* at least one port is processing SRP IU */
20562306a36Sopenharmony_ci#define SRP_PROCESSING              0x10
20662306a36Sopenharmony_ci	/* remove request received */
20762306a36Sopenharmony_ci#define UNCONFIGURING               0x20
20862306a36Sopenharmony_ci	/* disconnect by letting adapter go idle, no error */
20962306a36Sopenharmony_ci#define WAIT_IDLE                   0x40
21062306a36Sopenharmony_ci	/* disconnecting to clear an error */
21162306a36Sopenharmony_ci#define ERR_DISCONNECT              0x80
21262306a36Sopenharmony_ci	/* disconnect to clear error state, then come back up */
21362306a36Sopenharmony_ci#define ERR_DISCONNECT_RECONNECT    0x100
21462306a36Sopenharmony_ci	/* disconnected after clearing an error */
21562306a36Sopenharmony_ci#define ERR_DISCONNECTED            0x200
21662306a36Sopenharmony_ci	/* A series of errors caused unexpected errors */
21762306a36Sopenharmony_ci#define UNDEFINED                   0x400
21862306a36Sopenharmony_ci	u16  state;
21962306a36Sopenharmony_ci	int fast_fail;
22062306a36Sopenharmony_ci	struct target_dds dds;
22162306a36Sopenharmony_ci	char *cmd_pool;
22262306a36Sopenharmony_ci	/* list of free commands */
22362306a36Sopenharmony_ci	struct list_head free_cmd;
22462306a36Sopenharmony_ci	/* command elements ready for scheduler */
22562306a36Sopenharmony_ci	struct list_head schedule_q;
22662306a36Sopenharmony_ci	/* commands sent to TCM */
22762306a36Sopenharmony_ci	struct list_head active_q;
22862306a36Sopenharmony_ci	caddr_t *map_buf;
22962306a36Sopenharmony_ci	/* ioba of map buffer */
23062306a36Sopenharmony_ci	dma_addr_t map_ioba;
23162306a36Sopenharmony_ci	/* allowable number of outstanding SRP requests */
23262306a36Sopenharmony_ci	int request_limit;
23362306a36Sopenharmony_ci	/* extra credit */
23462306a36Sopenharmony_ci	int credit;
23562306a36Sopenharmony_ci	/* outstanding transactions against credit limit */
23662306a36Sopenharmony_ci	int debit;
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	/* allow only one outstanding mad request */
23962306a36Sopenharmony_ci#define PROCESSING_MAD                0x00002
24062306a36Sopenharmony_ci	/* Waiting to go idle */
24162306a36Sopenharmony_ci#define WAIT_FOR_IDLE		      0x00004
24262306a36Sopenharmony_ci	/* H_REG_CRQ called */
24362306a36Sopenharmony_ci#define CRQ_CLOSED                    0x00010
24462306a36Sopenharmony_ci	/* detected that client has failed */
24562306a36Sopenharmony_ci#define CLIENT_FAILED                 0x00040
24662306a36Sopenharmony_ci	/* detected that transport event occurred */
24762306a36Sopenharmony_ci#define TRANS_EVENT                   0x00080
24862306a36Sopenharmony_ci	/* don't attempt to send anything to the client */
24962306a36Sopenharmony_ci#define RESPONSE_Q_DOWN               0x00100
25062306a36Sopenharmony_ci	/* request made to schedule disconnect handler */
25162306a36Sopenharmony_ci#define SCHEDULE_DISCONNECT           0x00400
25262306a36Sopenharmony_ci	/* disconnect handler is scheduled */
25362306a36Sopenharmony_ci#define DISCONNECT_SCHEDULED          0x00800
25462306a36Sopenharmony_ci	/* remove function is sleeping */
25562306a36Sopenharmony_ci#define CFG_SLEEPING                  0x01000
25662306a36Sopenharmony_ci	/* Register for Prepare for Suspend Transport Events */
25762306a36Sopenharmony_ci#define PREP_FOR_SUSPEND_ENABLED      0x02000
25862306a36Sopenharmony_ci	/* Prepare for Suspend event sent */
25962306a36Sopenharmony_ci#define PREP_FOR_SUSPEND_PENDING      0x04000
26062306a36Sopenharmony_ci	/* Resume from Suspend event sent */
26162306a36Sopenharmony_ci#define PREP_FOR_SUSPEND_ABORTED      0x08000
26262306a36Sopenharmony_ci	/* Prepare for Suspend event overwrote another CRQ entry */
26362306a36Sopenharmony_ci#define PREP_FOR_SUSPEND_OVERWRITE    0x10000
26462306a36Sopenharmony_ci	u32 flags;
26562306a36Sopenharmony_ci	/* adapter lock */
26662306a36Sopenharmony_ci	spinlock_t intr_lock;
26762306a36Sopenharmony_ci	/* information needed to manage command queue */
26862306a36Sopenharmony_ci	struct cmd_queue cmd_q;
26962306a36Sopenharmony_ci	/* used in hcall to copy response back into srp buffer */
27062306a36Sopenharmony_ci	u64  empty_iu_id;
27162306a36Sopenharmony_ci	/* used in crq, to tag what iu the response is for */
27262306a36Sopenharmony_ci	u64  empty_iu_tag;
27362306a36Sopenharmony_ci	uint new_state;
27462306a36Sopenharmony_ci	uint resume_state;
27562306a36Sopenharmony_ci	/* control block for the response queue timer */
27662306a36Sopenharmony_ci	struct timer_cb rsp_q_timer;
27762306a36Sopenharmony_ci	/* keep last client to enable proper accounting */
27862306a36Sopenharmony_ci	struct client_info client_data;
27962306a36Sopenharmony_ci	/* what can this client do */
28062306a36Sopenharmony_ci	u32 client_cap;
28162306a36Sopenharmony_ci	/*
28262306a36Sopenharmony_ci	 * The following two fields capture state and flag changes that
28362306a36Sopenharmony_ci	 * can occur when the lock is given up.  In the orginal design,
28462306a36Sopenharmony_ci	 * the lock was held during calls into phyp;
28562306a36Sopenharmony_ci	 * however, phyp did not meet PAPR architecture.  This is
28662306a36Sopenharmony_ci	 * a work around.
28762306a36Sopenharmony_ci	 */
28862306a36Sopenharmony_ci	u16  phyp_acr_state;
28962306a36Sopenharmony_ci	u32 phyp_acr_flags;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	struct workqueue_struct *work_q;
29262306a36Sopenharmony_ci	struct completion wait_idle;
29362306a36Sopenharmony_ci	struct completion unconfig;
29462306a36Sopenharmony_ci	struct device dev;
29562306a36Sopenharmony_ci	struct vio_dev *dma_dev;
29662306a36Sopenharmony_ci	struct srp_target target;
29762306a36Sopenharmony_ci	struct ibmvscsis_tport tport;
29862306a36Sopenharmony_ci	struct tasklet_struct work_task;
29962306a36Sopenharmony_ci	struct work_struct proc_work;
30062306a36Sopenharmony_ci};
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci/*
30362306a36Sopenharmony_ci * Provide a constant that allows software to detect the adapter is
30462306a36Sopenharmony_ci * disconnecting from the client from one of several states.
30562306a36Sopenharmony_ci */
30662306a36Sopenharmony_ci#define IS_DISCONNECTING (UNCONFIGURING | ERR_DISCONNECT_RECONNECT | \
30762306a36Sopenharmony_ci			  ERR_DISCONNECT)
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci/*
31062306a36Sopenharmony_ci * Provide a constant that can be used with interrupt handling that
31162306a36Sopenharmony_ci * essentially lets the interrupt handler know that all requests should
31262306a36Sopenharmony_ci * be thrown out,
31362306a36Sopenharmony_ci */
31462306a36Sopenharmony_ci#define DONT_PROCESS_STATE (IS_DISCONNECTING | UNDEFINED | \
31562306a36Sopenharmony_ci			    ERR_DISCONNECTED  | WAIT_IDLE)
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci/*
31862306a36Sopenharmony_ci * If any of these flag bits are set then do not allow the interrupt
31962306a36Sopenharmony_ci * handler to schedule the off level handler.
32062306a36Sopenharmony_ci */
32162306a36Sopenharmony_ci#define BLOCK (DISCONNECT_SCHEDULED)
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci/* State and transition events that stop the interrupt handler */
32462306a36Sopenharmony_ci#define TARGET_STOP(VSCSI) (long)(((VSCSI)->state & DONT_PROCESS_STATE) | \
32562306a36Sopenharmony_ci				  ((VSCSI)->flags & BLOCK))
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci#define PREP_FOR_SUSPEND_FLAGS  (PREP_FOR_SUSPEND_ENABLED | \
32862306a36Sopenharmony_ci				 PREP_FOR_SUSPEND_PENDING | \
32962306a36Sopenharmony_ci				 PREP_FOR_SUSPEND_ABORTED | \
33062306a36Sopenharmony_ci				 PREP_FOR_SUSPEND_OVERWRITE)
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci/* flag bit that are not reset during disconnect */
33362306a36Sopenharmony_ci#define PRESERVE_FLAG_FIELDS (PREP_FOR_SUSPEND_FLAGS)
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci#define vio_iu(IUE) ((union viosrp_iu *)((IUE)->sbuf->buf))
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci#define READ_CMD(cdb)	(((cdb)[0] & 0x1F) == 8)
33862306a36Sopenharmony_ci#define WRITE_CMD(cdb)	(((cdb)[0] & 0x1F) == 0xA)
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci#ifndef H_GET_PARTNER_INFO
34162306a36Sopenharmony_ci#define H_GET_PARTNER_INFO              0x0000000000000008LL
34262306a36Sopenharmony_ci#endif
34362306a36Sopenharmony_ci#ifndef H_ENABLE_PREPARE_FOR_SUSPEND
34462306a36Sopenharmony_ci#define H_ENABLE_PREPARE_FOR_SUSPEND    0x000000000000001DLL
34562306a36Sopenharmony_ci#endif
34662306a36Sopenharmony_ci#ifndef H_READY_FOR_SUSPEND
34762306a36Sopenharmony_ci#define H_READY_FOR_SUSPEND             0x000000000000001ELL
34862306a36Sopenharmony_ci#endif
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci#define h_copy_rdma(l, sa, sb, da, db) \
35262306a36Sopenharmony_ci		plpar_hcall_norets(H_COPY_RDMA, l, sa, sb, da, db)
35362306a36Sopenharmony_ci#define h_vioctl(u, o, a, u1, u2, u3, u4) \
35462306a36Sopenharmony_ci		plpar_hcall_norets(H_VIOCTL, u, o, a, u1, u2)
35562306a36Sopenharmony_ci#define h_reg_crq(ua, tok, sz) \
35662306a36Sopenharmony_ci		plpar_hcall_norets(H_REG_CRQ, ua, tok, sz)
35762306a36Sopenharmony_ci#define h_free_crq(ua) \
35862306a36Sopenharmony_ci		plpar_hcall_norets(H_FREE_CRQ, ua)
35962306a36Sopenharmony_ci#define h_send_crq(ua, d1, d2) \
36062306a36Sopenharmony_ci		plpar_hcall_norets(H_SEND_CRQ, ua, d1, d2)
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci#endif
363