1d4ab3470SDennis Dalessandro /* 2d4ab3470SDennis Dalessandro * 3d4ab3470SDennis Dalessandro * This file is provided under a dual BSD/GPLv2 license. When using or 4d4ab3470SDennis Dalessandro * redistributing this file, you may do so under either license. 5d4ab3470SDennis Dalessandro * 6d4ab3470SDennis Dalessandro * GPL LICENSE SUMMARY 7d4ab3470SDennis Dalessandro * 8d4ab3470SDennis Dalessandro * Copyright(c) 2015 Intel Corporation. 9d4ab3470SDennis Dalessandro * 10d4ab3470SDennis Dalessandro * This program is free software; you can redistribute it and/or modify 11d4ab3470SDennis Dalessandro * it under the terms of version 2 of the GNU General Public License as 12d4ab3470SDennis Dalessandro * published by the Free Software Foundation. 13d4ab3470SDennis Dalessandro * 14d4ab3470SDennis Dalessandro * This program is distributed in the hope that it will be useful, but 15d4ab3470SDennis Dalessandro * WITHOUT ANY WARRANTY; without even the implied warranty of 16d4ab3470SDennis Dalessandro * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17d4ab3470SDennis Dalessandro * General Public License for more details. 18d4ab3470SDennis Dalessandro * 19d4ab3470SDennis Dalessandro * BSD LICENSE 20d4ab3470SDennis Dalessandro * 21d4ab3470SDennis Dalessandro * Copyright(c) 2015 Intel Corporation. 22d4ab3470SDennis Dalessandro * 23d4ab3470SDennis Dalessandro * Redistribution and use in source and binary forms, with or without 24d4ab3470SDennis Dalessandro * modification, are permitted provided that the following conditions 25d4ab3470SDennis Dalessandro * are met: 26d4ab3470SDennis Dalessandro * 27d4ab3470SDennis Dalessandro * - Redistributions of source code must retain the above copyright 28d4ab3470SDennis Dalessandro * notice, this list of conditions and the following disclaimer. 29d4ab3470SDennis Dalessandro * - Redistributions in binary form must reproduce the above copyright 30d4ab3470SDennis Dalessandro * notice, this list of conditions and the following disclaimer in 31d4ab3470SDennis Dalessandro * the documentation and/or other materials provided with the 32d4ab3470SDennis Dalessandro * distribution. 33d4ab3470SDennis Dalessandro * - Neither the name of Intel Corporation nor the names of its 34d4ab3470SDennis Dalessandro * contributors may be used to endorse or promote products derived 35d4ab3470SDennis Dalessandro * from this software without specific prior written permission. 36d4ab3470SDennis Dalessandro * 37d4ab3470SDennis Dalessandro * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 38d4ab3470SDennis Dalessandro * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 39d4ab3470SDennis Dalessandro * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 40d4ab3470SDennis Dalessandro * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 41d4ab3470SDennis Dalessandro * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 42d4ab3470SDennis Dalessandro * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 43d4ab3470SDennis Dalessandro * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 44d4ab3470SDennis Dalessandro * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 45d4ab3470SDennis Dalessandro * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 46d4ab3470SDennis Dalessandro * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 47d4ab3470SDennis Dalessandro * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 48d4ab3470SDennis Dalessandro * 49d4ab3470SDennis Dalessandro */ 50d4ab3470SDennis Dalessandro 51d4ab3470SDennis Dalessandro /* 52d4ab3470SDennis Dalessandro * This file contains defines, structures, etc. that are used 53d4ab3470SDennis Dalessandro * to communicate between kernel and user code. 54d4ab3470SDennis Dalessandro */ 55d4ab3470SDennis Dalessandro 56d4ab3470SDennis Dalessandro #ifndef _LINUX__HFI1_USER_H 57d4ab3470SDennis Dalessandro #define _LINUX__HFI1_USER_H 58d4ab3470SDennis Dalessandro 59d4ab3470SDennis Dalessandro #include <linux/types.h> 60d4ab3470SDennis Dalessandro 61d4ab3470SDennis Dalessandro /* 62d4ab3470SDennis Dalessandro * This version number is given to the driver by the user code during 63d4ab3470SDennis Dalessandro * initialization in the spu_userversion field of hfi1_user_info, so 64d4ab3470SDennis Dalessandro * the driver can check for compatibility with user code. 65d4ab3470SDennis Dalessandro * 66d4ab3470SDennis Dalessandro * The major version changes when data structures change in an incompatible 67d4ab3470SDennis Dalessandro * way. The driver must be the same for initialization to succeed. 68d4ab3470SDennis Dalessandro */ 69*380fb942SDennis Dalessandro #define HFI1_USER_SWMAJOR 6 70d4ab3470SDennis Dalessandro 71d4ab3470SDennis Dalessandro /* 72d4ab3470SDennis Dalessandro * Minor version differences are always compatible 73d4ab3470SDennis Dalessandro * a within a major version, however if user software is larger 74d4ab3470SDennis Dalessandro * than driver software, some new features and/or structure fields 75d4ab3470SDennis Dalessandro * may not be implemented; the user code must deal with this if it 76d4ab3470SDennis Dalessandro * cares, or it must abort after initialization reports the difference. 77d4ab3470SDennis Dalessandro */ 780eb62659SDennis Dalessandro #define HFI1_USER_SWMINOR 1 79d4ab3470SDennis Dalessandro 80d4ab3470SDennis Dalessandro /* 818d970cf9SDennis Dalessandro * We will encode the major/minor inside a single 32bit version number. 828d970cf9SDennis Dalessandro */ 838d970cf9SDennis Dalessandro #define HFI1_SWMAJOR_SHIFT 16 848d970cf9SDennis Dalessandro 858d970cf9SDennis Dalessandro /* 86d4ab3470SDennis Dalessandro * Set of HW and driver capability/feature bits. 87d4ab3470SDennis Dalessandro * These bit values are used to configure enabled/disabled HW and 88d4ab3470SDennis Dalessandro * driver features. The same set of bits are communicated to user 89d4ab3470SDennis Dalessandro * space. 90d4ab3470SDennis Dalessandro */ 91d4ab3470SDennis Dalessandro #define HFI1_CAP_DMA_RTAIL (1UL << 0) /* Use DMA'ed RTail value */ 92d4ab3470SDennis Dalessandro #define HFI1_CAP_SDMA (1UL << 1) /* Enable SDMA support */ 93d4ab3470SDennis Dalessandro #define HFI1_CAP_SDMA_AHG (1UL << 2) /* Enable SDMA AHG support */ 94d4ab3470SDennis Dalessandro #define HFI1_CAP_EXTENDED_PSN (1UL << 3) /* Enable Extended PSN support */ 95d4ab3470SDennis Dalessandro #define HFI1_CAP_HDRSUPP (1UL << 4) /* Enable Header Suppression */ 963c2f85b8SEaswar Hariharan /* 1UL << 5 unused */ 97d4ab3470SDennis Dalessandro #define HFI1_CAP_USE_SDMA_HEAD (1UL << 6) /* DMA Hdr Q tail vs. use CSR */ 98d4ab3470SDennis Dalessandro #define HFI1_CAP_MULTI_PKT_EGR (1UL << 7) /* Enable multi-packet Egr buffs*/ 99d4ab3470SDennis Dalessandro #define HFI1_CAP_NODROP_RHQ_FULL (1UL << 8) /* Don't drop on Hdr Q full */ 100d4ab3470SDennis Dalessandro #define HFI1_CAP_NODROP_EGR_FULL (1UL << 9) /* Don't drop on EGR buffs full */ 101462075a6SMitko Haralanov #define HFI1_CAP_TID_UNMAP (1UL << 10) /* Disable Expected TID caching */ 102d4ab3470SDennis Dalessandro #define HFI1_CAP_PRINT_UNIMPL (1UL << 11) /* Show for unimplemented feats */ 103d4ab3470SDennis Dalessandro #define HFI1_CAP_ALLOW_PERM_JKEY (1UL << 12) /* Allow use of permissive JKEY */ 104d4ab3470SDennis Dalessandro #define HFI1_CAP_NO_INTEGRITY (1UL << 13) /* Enable ctxt integrity checks */ 105d4ab3470SDennis Dalessandro #define HFI1_CAP_PKEY_CHECK (1UL << 14) /* Enable ctxt PKey checking */ 106d4ab3470SDennis Dalessandro #define HFI1_CAP_STATIC_RATE_CTRL (1UL << 15) /* Allow PBC.StaticRateControl */ 1073c2f85b8SEaswar Hariharan /* 1UL << 16 unused */ 108d4ab3470SDennis Dalessandro #define HFI1_CAP_SDMA_HEAD_CHECK (1UL << 17) /* SDMA head checking */ 109d4ab3470SDennis Dalessandro #define HFI1_CAP_EARLY_CREDIT_RETURN (1UL << 18) /* early credit return */ 110d4ab3470SDennis Dalessandro 111d4ab3470SDennis Dalessandro #define HFI1_RCVHDR_ENTSIZE_2 (1UL << 0) 112d4ab3470SDennis Dalessandro #define HFI1_RCVHDR_ENTSIZE_16 (1UL << 1) 113d4ab3470SDennis Dalessandro #define HFI1_RCVDHR_ENTSIZE_32 (1UL << 2) 114d4ab3470SDennis Dalessandro 115d4ab3470SDennis Dalessandro /* User commands. */ 116d4ab3470SDennis Dalessandro #define HFI1_CMD_ASSIGN_CTXT 1 /* allocate HFI and context */ 117d4ab3470SDennis Dalessandro #define HFI1_CMD_CTXT_INFO 2 /* find out what resources we got */ 118d4ab3470SDennis Dalessandro #define HFI1_CMD_USER_INFO 3 /* set up userspace */ 119d4ab3470SDennis Dalessandro #define HFI1_CMD_TID_UPDATE 4 /* update expected TID entries */ 120d4ab3470SDennis Dalessandro #define HFI1_CMD_TID_FREE 5 /* free expected TID entries */ 121d4ab3470SDennis Dalessandro #define HFI1_CMD_CREDIT_UPD 6 /* force an update of PIO credit */ 122d4ab3470SDennis Dalessandro 123d4ab3470SDennis Dalessandro #define HFI1_CMD_RECV_CTRL 8 /* control receipt of packets */ 124d4ab3470SDennis Dalessandro #define HFI1_CMD_POLL_TYPE 9 /* set the kind of polling we want */ 125d4ab3470SDennis Dalessandro #define HFI1_CMD_ACK_EVENT 10 /* ack & clear user status bits */ 126d4ab3470SDennis Dalessandro #define HFI1_CMD_SET_PKEY 11 /* set context's pkey */ 127d4ab3470SDennis Dalessandro #define HFI1_CMD_CTXT_RESET 12 /* reset context's HW send context */ 128955ad36dSMitko Haralanov #define HFI1_CMD_TID_INVAL_READ 13 /* read TID cache invalidations */ 1298d970cf9SDennis Dalessandro #define HFI1_CMD_GET_VERS 14 /* get the version of the user cdev */ 1308d970cf9SDennis Dalessandro 1318d970cf9SDennis Dalessandro /* 1328d970cf9SDennis Dalessandro * User IOCTLs can not go above 128 if they do then see common.h and change the 1338d970cf9SDennis Dalessandro * base for the snoop ioctl 1348d970cf9SDennis Dalessandro */ 1358d970cf9SDennis Dalessandro #define IB_IOCTL_MAGIC 0x1b /* See Documentation/ioctl/ioctl-number.txt */ 1368d970cf9SDennis Dalessandro 1378d970cf9SDennis Dalessandro /* 1388d970cf9SDennis Dalessandro * Make the ioctls occupy the last 0xf0-0xff portion of the IB range 1398d970cf9SDennis Dalessandro */ 1408d970cf9SDennis Dalessandro #define __NUM(cmd) (HFI1_CMD_##cmd + 0xe0) 1418d970cf9SDennis Dalessandro 1428d970cf9SDennis Dalessandro struct hfi1_cmd; 1438d970cf9SDennis Dalessandro #define HFI1_IOCTL_ASSIGN_CTXT \ 1448d970cf9SDennis Dalessandro _IOWR(IB_IOCTL_MAGIC, __NUM(ASSIGN_CTXT), struct hfi1_user_info) 1458d970cf9SDennis Dalessandro #define HFI1_IOCTL_CTXT_INFO \ 1468d970cf9SDennis Dalessandro _IOW(IB_IOCTL_MAGIC, __NUM(CTXT_INFO), struct hfi1_ctxt_info) 1478d970cf9SDennis Dalessandro #define HFI1_IOCTL_USER_INFO \ 1488d970cf9SDennis Dalessandro _IOW(IB_IOCTL_MAGIC, __NUM(USER_INFO), struct hfi1_base_info) 1498d970cf9SDennis Dalessandro #define HFI1_IOCTL_TID_UPDATE \ 1508d970cf9SDennis Dalessandro _IOWR(IB_IOCTL_MAGIC, __NUM(TID_UPDATE), struct hfi1_tid_info) 1518d970cf9SDennis Dalessandro #define HFI1_IOCTL_TID_FREE \ 1528d970cf9SDennis Dalessandro _IOWR(IB_IOCTL_MAGIC, __NUM(TID_FREE), struct hfi1_tid_info) 1538d970cf9SDennis Dalessandro #define HFI1_IOCTL_CREDIT_UPD \ 1548d970cf9SDennis Dalessandro _IO(IB_IOCTL_MAGIC, __NUM(CREDIT_UPD)) 1558d970cf9SDennis Dalessandro #define HFI1_IOCTL_RECV_CTRL \ 1568d970cf9SDennis Dalessandro _IOW(IB_IOCTL_MAGIC, __NUM(RECV_CTRL), int) 1578d970cf9SDennis Dalessandro #define HFI1_IOCTL_POLL_TYPE \ 1588d970cf9SDennis Dalessandro _IOW(IB_IOCTL_MAGIC, __NUM(POLL_TYPE), int) 1598d970cf9SDennis Dalessandro #define HFI1_IOCTL_ACK_EVENT \ 1608d970cf9SDennis Dalessandro _IOW(IB_IOCTL_MAGIC, __NUM(ACK_EVENT), unsigned long) 1618d970cf9SDennis Dalessandro #define HFI1_IOCTL_SET_PKEY \ 1628d970cf9SDennis Dalessandro _IOW(IB_IOCTL_MAGIC, __NUM(SET_PKEY), __u16) 1638d970cf9SDennis Dalessandro #define HFI1_IOCTL_CTXT_RESET \ 1648d970cf9SDennis Dalessandro _IO(IB_IOCTL_MAGIC, __NUM(CTXT_RESET)) 1658d970cf9SDennis Dalessandro #define HFI1_IOCTL_TID_INVAL_READ \ 1668d970cf9SDennis Dalessandro _IOWR(IB_IOCTL_MAGIC, __NUM(TID_INVAL_READ), struct hfi1_tid_info) 1678d970cf9SDennis Dalessandro #define HFI1_IOCTL_GET_VERS \ 1688d970cf9SDennis Dalessandro _IOR(IB_IOCTL_MAGIC, __NUM(GET_VERS), int) 169d4ab3470SDennis Dalessandro 170d4ab3470SDennis Dalessandro #define _HFI1_EVENT_FROZEN_BIT 0 171d4ab3470SDennis Dalessandro #define _HFI1_EVENT_LINKDOWN_BIT 1 172d4ab3470SDennis Dalessandro #define _HFI1_EVENT_LID_CHANGE_BIT 2 173d4ab3470SDennis Dalessandro #define _HFI1_EVENT_LMC_CHANGE_BIT 3 174d4ab3470SDennis Dalessandro #define _HFI1_EVENT_SL2VL_CHANGE_BIT 4 175955ad36dSMitko Haralanov #define _HFI1_EVENT_TID_MMU_NOTIFY_BIT 5 176955ad36dSMitko Haralanov #define _HFI1_MAX_EVENT_BIT _HFI1_EVENT_TID_MMU_NOTIFY_BIT 177d4ab3470SDennis Dalessandro 178d4ab3470SDennis Dalessandro #define HFI1_EVENT_FROZEN (1UL << _HFI1_EVENT_FROZEN_BIT) 1793bd4dce1SMitko Haralanov #define HFI1_EVENT_LINKDOWN (1UL << _HFI1_EVENT_LINKDOWN_BIT) 1803bd4dce1SMitko Haralanov #define HFI1_EVENT_LID_CHANGE (1UL << _HFI1_EVENT_LID_CHANGE_BIT) 1813bd4dce1SMitko Haralanov #define HFI1_EVENT_LMC_CHANGE (1UL << _HFI1_EVENT_LMC_CHANGE_BIT) 1823bd4dce1SMitko Haralanov #define HFI1_EVENT_SL2VL_CHANGE (1UL << _HFI1_EVENT_SL2VL_CHANGE_BIT) 183955ad36dSMitko Haralanov #define HFI1_EVENT_TID_MMU_NOTIFY (1UL << _HFI1_EVENT_TID_MMU_NOTIFY_BIT) 184d4ab3470SDennis Dalessandro 185d4ab3470SDennis Dalessandro /* 186d4ab3470SDennis Dalessandro * These are the status bits readable (in ASCII form, 64bit value) 187d4ab3470SDennis Dalessandro * from the "status" sysfs file. For binary compatibility, values 188d4ab3470SDennis Dalessandro * must remain as is; removed states can be reused for different 189d4ab3470SDennis Dalessandro * purposes. 190d4ab3470SDennis Dalessandro */ 191d4ab3470SDennis Dalessandro #define HFI1_STATUS_INITTED 0x1 /* basic initialization done */ 192d4ab3470SDennis Dalessandro /* Chip has been found and initialized */ 193d4ab3470SDennis Dalessandro #define HFI1_STATUS_CHIP_PRESENT 0x20 194d4ab3470SDennis Dalessandro /* IB link is at ACTIVE, usable for data traffic */ 195d4ab3470SDennis Dalessandro #define HFI1_STATUS_IB_READY 0x40 196d4ab3470SDennis Dalessandro /* link is configured, LID, MTU, etc. have been set */ 197d4ab3470SDennis Dalessandro #define HFI1_STATUS_IB_CONF 0x80 198d4ab3470SDennis Dalessandro /* A Fatal hardware error has occurred. */ 199d4ab3470SDennis Dalessandro #define HFI1_STATUS_HWERROR 0x200 200d4ab3470SDennis Dalessandro 201d4ab3470SDennis Dalessandro /* 202d4ab3470SDennis Dalessandro * Number of supported shared contexts. 203d4ab3470SDennis Dalessandro * This is the maximum number of software contexts that can share 204d4ab3470SDennis Dalessandro * a hardware send/receive context. 205d4ab3470SDennis Dalessandro */ 206d4ab3470SDennis Dalessandro #define HFI1_MAX_SHARED_CTXTS 8 207d4ab3470SDennis Dalessandro 208d4ab3470SDennis Dalessandro /* 209d4ab3470SDennis Dalessandro * Poll types 210d4ab3470SDennis Dalessandro */ 211d4ab3470SDennis Dalessandro #define HFI1_POLL_TYPE_ANYRCV 0x0 212d4ab3470SDennis Dalessandro #define HFI1_POLL_TYPE_URGENT 0x1 213d4ab3470SDennis Dalessandro 214d4ab3470SDennis Dalessandro /* 215d4ab3470SDennis Dalessandro * This structure is passed to the driver to tell it where 216d4ab3470SDennis Dalessandro * user code buffers are, sizes, etc. The offsets and sizes of the 217d4ab3470SDennis Dalessandro * fields must remain unchanged, for binary compatibility. It can 218d4ab3470SDennis Dalessandro * be extended, if userversion is changed so user code can tell, if needed 219d4ab3470SDennis Dalessandro */ 220d4ab3470SDennis Dalessandro struct hfi1_user_info { 221d4ab3470SDennis Dalessandro /* 222d4ab3470SDennis Dalessandro * version of user software, to detect compatibility issues. 223d4ab3470SDennis Dalessandro * Should be set to HFI1_USER_SWVERSION. 224d4ab3470SDennis Dalessandro */ 225d4ab3470SDennis Dalessandro __u32 userversion; 2260eb62659SDennis Dalessandro __u32 pad; 227d4ab3470SDennis Dalessandro /* 228d4ab3470SDennis Dalessandro * If two or more processes wish to share a context, each process 229d4ab3470SDennis Dalessandro * must set the subcontext_cnt and subcontext_id to the same 230d4ab3470SDennis Dalessandro * values. The only restriction on the subcontext_id is that 231d4ab3470SDennis Dalessandro * it be unique for a given node. 232d4ab3470SDennis Dalessandro */ 233d4ab3470SDennis Dalessandro __u16 subctxt_cnt; 234d4ab3470SDennis Dalessandro __u16 subctxt_id; 235d4ab3470SDennis Dalessandro /* 128bit UUID passed in by PSM. */ 236d4ab3470SDennis Dalessandro __u8 uuid[16]; 237d4ab3470SDennis Dalessandro }; 238d4ab3470SDennis Dalessandro 239d4ab3470SDennis Dalessandro struct hfi1_ctxt_info { 240d4ab3470SDennis Dalessandro __u64 runtime_flags; /* chip/drv runtime flags (HFI1_CAP_*) */ 241d4ab3470SDennis Dalessandro __u32 rcvegr_size; /* size of each eager buffer */ 242d4ab3470SDennis Dalessandro __u16 num_active; /* number of active units */ 243d4ab3470SDennis Dalessandro __u16 unit; /* unit (chip) assigned to caller */ 244d4ab3470SDennis Dalessandro __u16 ctxt; /* ctxt on unit assigned to caller */ 245d4ab3470SDennis Dalessandro __u16 subctxt; /* subctxt on unit assigned to caller */ 246d4ab3470SDennis Dalessandro __u16 rcvtids; /* number of Rcv TIDs for this context */ 247d4ab3470SDennis Dalessandro __u16 credits; /* number of PIO credits for this context */ 248d4ab3470SDennis Dalessandro __u16 numa_node; /* NUMA node of the assigned device */ 249d4ab3470SDennis Dalessandro __u16 rec_cpu; /* cpu # for affinity (0xffff if none) */ 250d4ab3470SDennis Dalessandro __u16 send_ctxt; /* send context in use by this user context */ 251d4ab3470SDennis Dalessandro __u16 egrtids; /* number of RcvArray entries for Eager Rcvs */ 252d4ab3470SDennis Dalessandro __u16 rcvhdrq_cnt; /* number of RcvHdrQ entries */ 253d4ab3470SDennis Dalessandro __u16 rcvhdrq_entsize; /* size (in bytes) for each RcvHdrQ entry */ 254d4ab3470SDennis Dalessandro __u16 sdma_ring_size; /* number of entries in SDMA request ring */ 255d4ab3470SDennis Dalessandro }; 256d4ab3470SDennis Dalessandro 257d4ab3470SDennis Dalessandro struct hfi1_tid_info { 258d4ab3470SDennis Dalessandro /* virtual address of first page in transfer */ 259d4ab3470SDennis Dalessandro __u64 vaddr; 260d4ab3470SDennis Dalessandro /* pointer to tid array. this array is big enough */ 261d4ab3470SDennis Dalessandro __u64 tidlist; 262d4ab3470SDennis Dalessandro /* number of tids programmed by this request */ 263d4ab3470SDennis Dalessandro __u32 tidcnt; 264d4ab3470SDennis Dalessandro /* length of transfer buffer programmed by this request */ 265d4ab3470SDennis Dalessandro __u32 length; 266d4ab3470SDennis Dalessandro }; 267d4ab3470SDennis Dalessandro 268d4ab3470SDennis Dalessandro enum hfi1_sdma_comp_state { 269d4ab3470SDennis Dalessandro FREE = 0, 270d4ab3470SDennis Dalessandro QUEUED, 271d4ab3470SDennis Dalessandro COMPLETE, 272d4ab3470SDennis Dalessandro ERROR 273d4ab3470SDennis Dalessandro }; 274d4ab3470SDennis Dalessandro 275d4ab3470SDennis Dalessandro /* 276d4ab3470SDennis Dalessandro * SDMA completion ring entry 277d4ab3470SDennis Dalessandro */ 278d4ab3470SDennis Dalessandro struct hfi1_sdma_comp_entry { 279d4ab3470SDennis Dalessandro __u32 status; 280d4ab3470SDennis Dalessandro __u32 errcode; 281d4ab3470SDennis Dalessandro }; 282d4ab3470SDennis Dalessandro 283d4ab3470SDennis Dalessandro /* 284d4ab3470SDennis Dalessandro * Device status and notifications from driver to user-space. 285d4ab3470SDennis Dalessandro */ 286d4ab3470SDennis Dalessandro struct hfi1_status { 287d4ab3470SDennis Dalessandro __u64 dev; /* device/hw status bits */ 288d4ab3470SDennis Dalessandro __u64 port; /* port state and status bits */ 289d4ab3470SDennis Dalessandro char freezemsg[0]; 290d4ab3470SDennis Dalessandro }; 291d4ab3470SDennis Dalessandro 292d4ab3470SDennis Dalessandro /* 293d4ab3470SDennis Dalessandro * This structure is returned by the driver immediately after 294d4ab3470SDennis Dalessandro * open to get implementation-specific info, and info specific to this 295d4ab3470SDennis Dalessandro * instance. 296d4ab3470SDennis Dalessandro * 297d4ab3470SDennis Dalessandro * This struct must have explicit pad fields where type sizes 298d4ab3470SDennis Dalessandro * may result in different alignments between 32 and 64 bit 299d4ab3470SDennis Dalessandro * programs, since the 64 bit * bit kernel requires the user code 300d4ab3470SDennis Dalessandro * to have matching offsets 301d4ab3470SDennis Dalessandro */ 302d4ab3470SDennis Dalessandro struct hfi1_base_info { 303d4ab3470SDennis Dalessandro /* version of hardware, for feature checking. */ 304d4ab3470SDennis Dalessandro __u32 hw_version; 305d4ab3470SDennis Dalessandro /* version of software, for feature checking. */ 306d4ab3470SDennis Dalessandro __u32 sw_version; 307d4ab3470SDennis Dalessandro /* Job key */ 308d4ab3470SDennis Dalessandro __u16 jkey; 309d4ab3470SDennis Dalessandro __u16 padding1; 310d4ab3470SDennis Dalessandro /* 311d4ab3470SDennis Dalessandro * The special QP (queue pair) value that identifies PSM 312d4ab3470SDennis Dalessandro * protocol packet from standard IB packets. 313d4ab3470SDennis Dalessandro */ 314d4ab3470SDennis Dalessandro __u32 bthqp; 315d4ab3470SDennis Dalessandro /* PIO credit return address, */ 316d4ab3470SDennis Dalessandro __u64 sc_credits_addr; 317d4ab3470SDennis Dalessandro /* 318d4ab3470SDennis Dalessandro * Base address of write-only pio buffers for this process. 319d4ab3470SDennis Dalessandro * Each buffer has sendpio_credits*64 bytes. 320d4ab3470SDennis Dalessandro */ 321d4ab3470SDennis Dalessandro __u64 pio_bufbase_sop; 322d4ab3470SDennis Dalessandro /* 323d4ab3470SDennis Dalessandro * Base address of write-only pio buffers for this process. 324d4ab3470SDennis Dalessandro * Each buffer has sendpio_credits*64 bytes. 325d4ab3470SDennis Dalessandro */ 326d4ab3470SDennis Dalessandro __u64 pio_bufbase; 327d4ab3470SDennis Dalessandro /* address where receive buffer queue is mapped into */ 328d4ab3470SDennis Dalessandro __u64 rcvhdr_bufbase; 329d4ab3470SDennis Dalessandro /* base address of Eager receive buffers. */ 330d4ab3470SDennis Dalessandro __u64 rcvegr_bufbase; 331d4ab3470SDennis Dalessandro /* base address of SDMA completion ring */ 332d4ab3470SDennis Dalessandro __u64 sdma_comp_bufbase; 333d4ab3470SDennis Dalessandro /* 334d4ab3470SDennis Dalessandro * User register base for init code, not to be used directly by 335d4ab3470SDennis Dalessandro * protocol or applications. Always maps real chip register space. 336d4ab3470SDennis Dalessandro * the register addresses are: 337d4ab3470SDennis Dalessandro * ur_rcvhdrhead, ur_rcvhdrtail, ur_rcvegrhead, ur_rcvegrtail, 338d4ab3470SDennis Dalessandro * ur_rcvtidflow 339d4ab3470SDennis Dalessandro */ 340d4ab3470SDennis Dalessandro __u64 user_regbase; 341d4ab3470SDennis Dalessandro /* notification events */ 342d4ab3470SDennis Dalessandro __u64 events_bufbase; 343d4ab3470SDennis Dalessandro /* status page */ 344d4ab3470SDennis Dalessandro __u64 status_bufbase; 345d4ab3470SDennis Dalessandro /* rcvhdrtail update */ 346d4ab3470SDennis Dalessandro __u64 rcvhdrtail_base; 347d4ab3470SDennis Dalessandro /* 348d4ab3470SDennis Dalessandro * shared memory pages for subctxts if ctxt is shared; these cover 349d4ab3470SDennis Dalessandro * all the processes in the group sharing a single context. 350d4ab3470SDennis Dalessandro * all have enough space for the num_subcontexts value on this job. 351d4ab3470SDennis Dalessandro */ 352d4ab3470SDennis Dalessandro __u64 subctxt_uregbase; 353d4ab3470SDennis Dalessandro __u64 subctxt_rcvegrbuf; 354d4ab3470SDennis Dalessandro __u64 subctxt_rcvhdrbuf; 355d4ab3470SDennis Dalessandro }; 356d4ab3470SDennis Dalessandro 357d4ab3470SDennis Dalessandro enum sdma_req_opcode { 358d4ab3470SDennis Dalessandro EXPECTED = 0, 359d4ab3470SDennis Dalessandro EAGER 360d4ab3470SDennis Dalessandro }; 361d4ab3470SDennis Dalessandro 362d4ab3470SDennis Dalessandro #define HFI1_SDMA_REQ_VERSION_MASK 0xF 363d4ab3470SDennis Dalessandro #define HFI1_SDMA_REQ_VERSION_SHIFT 0x0 364d4ab3470SDennis Dalessandro #define HFI1_SDMA_REQ_OPCODE_MASK 0xF 365d4ab3470SDennis Dalessandro #define HFI1_SDMA_REQ_OPCODE_SHIFT 0x4 366d4ab3470SDennis Dalessandro #define HFI1_SDMA_REQ_IOVCNT_MASK 0xFF 367d4ab3470SDennis Dalessandro #define HFI1_SDMA_REQ_IOVCNT_SHIFT 0x8 368d4ab3470SDennis Dalessandro 369d4ab3470SDennis Dalessandro struct sdma_req_info { 370d4ab3470SDennis Dalessandro /* 371d4ab3470SDennis Dalessandro * bits 0-3 - version (currently unused) 372d4ab3470SDennis Dalessandro * bits 4-7 - opcode (enum sdma_req_opcode) 373d4ab3470SDennis Dalessandro * bits 8-15 - io vector count 374d4ab3470SDennis Dalessandro */ 375d4ab3470SDennis Dalessandro __u16 ctrl; 376d4ab3470SDennis Dalessandro /* 377d4ab3470SDennis Dalessandro * Number of fragments contained in this request. 378d4ab3470SDennis Dalessandro * User-space has already computed how many 379d4ab3470SDennis Dalessandro * fragment-sized packet the user buffer will be 380d4ab3470SDennis Dalessandro * split into. 381d4ab3470SDennis Dalessandro */ 382d4ab3470SDennis Dalessandro __u16 npkts; 383d4ab3470SDennis Dalessandro /* 384d4ab3470SDennis Dalessandro * Size of each fragment the user buffer will be 385d4ab3470SDennis Dalessandro * split into. 386d4ab3470SDennis Dalessandro */ 387d4ab3470SDennis Dalessandro __u16 fragsize; 388d4ab3470SDennis Dalessandro /* 389d4ab3470SDennis Dalessandro * Index of the slot in the SDMA completion ring 390d4ab3470SDennis Dalessandro * this request should be using. User-space is 391d4ab3470SDennis Dalessandro * in charge of managing its own ring. 392d4ab3470SDennis Dalessandro */ 393d4ab3470SDennis Dalessandro __u16 comp_idx; 394d4ab3470SDennis Dalessandro } __packed; 395d4ab3470SDennis Dalessandro 396d4ab3470SDennis Dalessandro /* 397d4ab3470SDennis Dalessandro * SW KDETH header. 398d4ab3470SDennis Dalessandro * swdata is SW defined portion. 399d4ab3470SDennis Dalessandro */ 400d4ab3470SDennis Dalessandro struct hfi1_kdeth_header { 401d4ab3470SDennis Dalessandro __le32 ver_tid_offset; 402d4ab3470SDennis Dalessandro __le16 jkey; 403d4ab3470SDennis Dalessandro __le16 hcrc; 404d4ab3470SDennis Dalessandro __le32 swdata[7]; 405d4ab3470SDennis Dalessandro } __packed; 406d4ab3470SDennis Dalessandro 407d4ab3470SDennis Dalessandro /* 408d4ab3470SDennis Dalessandro * Structure describing the headers that User space uses. The 409d4ab3470SDennis Dalessandro * structure above is a subset of this one. 410d4ab3470SDennis Dalessandro */ 411d4ab3470SDennis Dalessandro struct hfi1_pkt_header { 412d4ab3470SDennis Dalessandro __le16 pbc[4]; 413d4ab3470SDennis Dalessandro __be16 lrh[4]; 414d4ab3470SDennis Dalessandro __be32 bth[3]; 415d4ab3470SDennis Dalessandro struct hfi1_kdeth_header kdeth; 416d4ab3470SDennis Dalessandro } __packed; 417d4ab3470SDennis Dalessandro 418d4ab3470SDennis Dalessandro 419d4ab3470SDennis Dalessandro /* 420d4ab3470SDennis Dalessandro * The list of usermode accessible registers. 421d4ab3470SDennis Dalessandro */ 422d4ab3470SDennis Dalessandro enum hfi1_ureg { 423d4ab3470SDennis Dalessandro /* (RO) DMA RcvHdr to be used next. */ 424d4ab3470SDennis Dalessandro ur_rcvhdrtail = 0, 425d4ab3470SDennis Dalessandro /* (RW) RcvHdr entry to be processed next by host. */ 426d4ab3470SDennis Dalessandro ur_rcvhdrhead = 1, 427d4ab3470SDennis Dalessandro /* (RO) Index of next Eager index to use. */ 428d4ab3470SDennis Dalessandro ur_rcvegrindextail = 2, 429d4ab3470SDennis Dalessandro /* (RW) Eager TID to be processed next */ 430d4ab3470SDennis Dalessandro ur_rcvegrindexhead = 3, 431d4ab3470SDennis Dalessandro /* (RO) Receive Eager Offset Tail */ 432d4ab3470SDennis Dalessandro ur_rcvegroffsettail = 4, 433d4ab3470SDennis Dalessandro /* For internal use only; max register number. */ 434d4ab3470SDennis Dalessandro ur_maxreg, 435d4ab3470SDennis Dalessandro /* (RW) Receive TID flow table */ 436d4ab3470SDennis Dalessandro ur_rcvtidflowtable = 256 437d4ab3470SDennis Dalessandro }; 438d4ab3470SDennis Dalessandro 439d4ab3470SDennis Dalessandro #endif /* _LINIUX__HFI1_USER_H */ 440