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