summaryrefslogtreecommitdiff
path: root/sys/dev/pci/nofnreg.h
blob: c206cadb6be6861dc2710d384a5194ac172f1579 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
/*	$OpenBSD: nofnreg.h,v 1.4 2002/05/16 15:10:30 jason Exp $	*/

/*
 * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Jason L. Wright
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#define	NOFN_BAR0_REGS		0x10		/* main register set */
#define	NOFN_BAR1		0x14		/* memory space 1 */
#define	NOFN_BAR2		0x18		/* memory space 2 */
#define	NOFN_BAR3_PK		0x1c		/* public key unit */

#define	NOFN_MIPS_PCI_BASE_0	0x0000		/* mips pci base address 0 */
#define	NOFN_MIPS_PCI_WIN_SZ_0	0x0008		/* mips pci window size 0 */
#define	NOFN_PCI_XLAT_0		0x0010		/* pci translation 0 */
#define	NOFN_MIPS_PCI_BASE_1	0x0018		/* mips pci base address 1 */
#define	NOFN_MIPS_PCI_WIN_SZ_1	0x0020		/* mips pci window size 1 */
#define	NOFN_PCI_XLAT_1		0x0028		/* pci translation 1 */
#define	NOFN_MIPS_SDRAM_BASE	0x0030		/* mips sdram base addr */
#define	NOFN_MIPS_SDRAM_SZ	0x0038		/* mips sdram size */
#define	NOFN_PCI_BARM0_SHADOW	0x0040		/* pci mbar0 shadow */
#define	NOFN_PCI_BARM1_SHADOW	0x0050		/* pci mbar1 shadow */
#define	NOFN_PCI_BARM_SZ	0x0060		/* size of memory window */
#define	NOFN_XPARNT_MEM_EN	0x0068		/* enable transparent mem */
#define	NOFN_PCI_BARR_SHADOW	0x0070		/* pci bar0 shadow, s/c regs */
#define	NOFN_MIPS_REG_BASE	0x0078		/* mips register base */
#define	NOFN_MAX_FREE_IDX	0x0080		/* maximum free index */
#define	NOFN_TRAP_IN_Q		0x0090		/* enqueue core desc */
#define	NOFN_OUT_CMPLT		0x00a0		/* output completion */
#define	NOFN_TRAP_OUT_Q		0x00a8		/* dequeue core desc */
#define	NOFN_CHOKE_CORE_IN_Q	0x00b0		/* choke core on input */
#define	NOFN_DONE_BITMAP	0x00b8		/* done bitmap */
#define	NOFN_HEAD_DESC_PTR	0x00c0		/* last core descriptor */
#define	NOFN_TAIL_DESC_PTR	0x00c8		/* next core descriptor */
#define	NOFN_RSLT_POST_ADR	0x00d0		/* result post address */
#define	NOFN_SM_CTX_BASE	0x00d8		/* small session ctx base */
#define	NOFN_DESC_BASE		0x00e8		/* core descriptor base */
#define	NOFN_LG_CTX_BASE	0x00e0		/* large context base */
#define	NOFN_SESSION_NUM_MASK	0x00f0		/* session number mask */
#define	NOFN_HOST_MBOX_0	0x00f8		/* host mailbox 0 */
#define	NOFN_REVID		0x0098		/* revision id */
#define	NOFN_HOST_SIGNAL	0x0100		/* host signal */
#define	NOFN_MIPS_MBOX_0	0x0108		/* mips mailbox 0 */
#define	NOFN_MIPS_SIGNAL	0x0110		/* mips signal */
#define	NOFN_SPINLOCK_0		0x0118		/* spinlock 0 */
#define	NOFN_SPINLOCK_1		0x0120		/* spinlock 1 */
#define	NOFN_PCI_INT		0x0130		/* generate a pci intr */
#define	NOFN_PCI_INT_STAT	0x0138		/* pci interrupt status */
#define	NOFN_PCI_INT_MASK	0x0140		/* pci interrupt mask */
#define	NOFN_MIPS_INT		0x0148		/* mips interrupt trigger */
#define	NOFN_MIPS_INT_STAT	0x0150		/* mips interrupt status */
#define	NOFN_SDRAM_CFG		0x0168		/* sdram configuration */
#define	NOFN_ENDIAN_CFG		0x0170		/* endian configuration */
#define	NOFN_EPT		0x0178		/* endian private xfer */
#define	NOFN_MIPS_RST		0x0180		/* mips reset */
#define	NOFN_EEPROM_DATA_0	0x0188		/* eeprom data 0 */
#define	NOFN_EEPROM_DATA_1	0x0190		/* eeprom data 1 */
#define	NOFN_EEPROM_DATA_2	0x0198		/* eeprom data 2 */
#define	NOFN_EEPROM_DATA_3	0x01a0		/* eeprom data 3 */
#define	NOFN_CHIP_CFG		0x01d8		/* chip configuration */
#define	NOFN_SCRATCH_0		0x01e0		/* scratch 0 */
#define	NOFN_SCRATCH_1		0x01e8		/* scratch 1 */
#define	NOFN_SCRATCH_2		0x01f0		/* scratch 2 */
#define	NOFN_SCRATCH_3		0x01f8		/* scratch 3 */
#define	NOFN_CMD_RING_CTL	0x0200		/* command ring control */
#define	NOFN_CMD_RING_BASE	0x0208		/* command ring base */
#define	NOFN_CMD_RING_LEN	0x0210		/* command ring length */
#define	NOFN_CMD_RING_HEAD	0x0218		/* command ring head */
#define	NOFN_CMD_RING_TAIL	0x0220		/* command ring tail */
#define	NOFN_DST_RING_CTL	0x0230		/* dest ring control */
#define	NOFN_DST_RING_BASE	0x0238		/* dest ring base */
#define	NOFN_DST_RING_LEN	0x0240		/* dest ring length */
#define	NOFN_DST_RING_HEAD	0x0248		/* dest ring head */
#define	NOFN_DST_RING_TAIL	0x0250		/* dest ring tail */
#define	NOFN_RSLT_RING_CTL	0x0258		/* result ring control */
#define	NOFN_RSLT_RING_BASE	0x0260		/* result ring base */
#define	NOFN_RSLT_RING_LEN	0x0268		/* result ring length */
#define	NOFN_RSLT_RING_HEAD	0x0270		/* result ring head */
#define	NOFN_RSLT_RING_TAIL	0x0278		/* result ring tail */
#define	NOFN_SRC_RING_CTL	0x0288		/* src ring control */
#define	NOFN_SRC_RING_BASE	0x0290		/* src ring base */
#define	NOFN_SRC_RING_LEN	0x0298		/* src ring len */
#define	NOFN_SRC_RING_HEAD	0x02a0		/* src ring head */
#define	NOFN_SRC_RING_TAIL	0x02a8		/* src ring tail */
#define	NOFN_FREE_RING_CTL	0x02b8		/* free ring control */
#define	NOFN_FREE_RING_BASE	0x02c0		/* free ring base */
#define	NOFN_FREE_RING_LEN	0x02c8		/* free ring len */
#define	NOFN_FREE_RING_HEAD	0x02d0		/* free ring head */
#define	NOFN_FREE_RING_TAIL	0x02d8		/* free ring tail */
#define	NOFN_ECC_TEST		0x02e0		/* ecc test */
#define	NOFN_ECC_SNGL_ADR	0x02e8		/* ecc singlebit error addr */
#define	NOFN_ECC_SNGL_ECC	0x02f0		/* ecc singlebit error bits */
#define	NOFN_ECC_SNGL_CNT	0x02f8		/* ecc singlebit error count */
#define	NOFN_ECC_MULTI_ADR	0x0300		/* ecc multibit error addr */
#define	NOFN_ECC_MULTI_ECC	0x0308		/* ecc multibit error bits */
#define	NOFN_ECC_MULTI_DATAL	0x0310		/* ecc multibit err data lo */
#define	NOFN_ECC_MULTI_DATAH	0x0318		/* ecc multibit err data hi */
#define	NOFN_MIPS_ERR_ADR	0x0320		/* mips parity error addr */
#define	NOFN_MIPS_ERR_DATA	0x0328		/* mips parity error data */
#define	NOFN_MIPS_ERR_PAR	0x0330		/* mips parity error bits */
#define	NOFN_MIPS_PAR_TEST	0x0338		/* mips parity test */
#define	NOFN_MIPS_MBOX_1	0x0340		/* mips mailbox 1 */
#define	NOFN_MIPS_MBOX_2	0x0348		/* mips mailbox 2 */
#define	NOFN_MIPS_MBOX_3	0x0350		/* mips mailbox 3 */
#define	NOFN_HOST_MBOX_1	0x0358		/* host mailbox 1 */
#define	NOFN_HOST_MBOX_2	0x0360		/* host mailbox 2 */
#define	NOFN_HOST_MBOX_3	0x0368		/* host mailbox 3 */
#define	NOFN_MIPS_INT_0_MASK	0x0400		/* mips intr mask 0 */
#define	NOFN_MIPS_INT_1_MASK	0x0408		/* mips intr mask 1 */
#define	NOFN_MIPS_INT_2_MASK	0x0410		/* mips intr mask 2 */
#define	NOFN_MIPS_PCI_RD_ERRADR	0x0418		/* failed read address */
#define	NOFN_MIPS_PCI_WR_ERRADR	0x0420		/* failed write address */
#define	NOFN_MIPS_EP0_LMT	0x0428		/* mips private limit */
#define	NOFN_PCI_INIT_ERR_ADR	0x0430		/* pci failure address */
#define	NOFN_ECC_SNGL_DATAL	0x0438		/* ecc singlebit err dat lo */
#define	NOFN_ECC_SNGL_DATAH	0x0440		/* ecc singlebit err dat hi */
#define	NOFN_GPDMA_DATA_0	0x0480		/* gpdma data 0 */
#define	NOFN_GPDMA_DATA_1	0x0488		/* gpdma data 1 */
#define	NOFN_GPDMA_DATA_2	0x0490		/* gpdma data 2 */
#define	NOFN_GPDMA_DATA_3	0x0498		/* gpdma data 3 */
#define	NOFN_GPDMA_DATA_4	0x04a0		/* gpdma data 4 */
#define	NOFN_GPDMA_DATA_5	0x04a8		/* gpdma data 5 */
#define	NOFN_GPDMA_DATA_6	0x04b0		/* gpdma data 6 */
#define	NOFN_GPDMA_DATA_7	0x04b8		/* gpdma data 7 */
#define	NOFN_GPDMA_DATA_8	0x04c0		/* gpdma data 8 */
#define	NOFN_GPDMA_DATA_9	0x04c8		/* gpdma data 9 */
#define	NOFN_GPDMA_DATA_10	0x04d0		/* gpdma data 10 */
#define	NOFN_GPDMA_DATA_11	0x04d8		/* gpdma data 11 */
#define	NOFN_GPDMA_DATA_12	0x04e0		/* gpdma data 12 */
#define	NOFN_GPDMA_DATA_13	0x04e8		/* gpdma data 13 */
#define	NOFN_GPDMA_DATA_14	0x04f0		/* gpdma data 14 */
#define	NOFN_GPDMA_DATA_15	0x04f8		/* gpdma data 15 */
#define	NOFN_GPDMA_CTL		0x0500		/* gpdma control */
#define	NOFN_GPDMA_ADR		0x0508		/* gpdma address */
#define	NOFN_MIPS_PK_BASE	0x0510		/* mips pk base address */
#define	NOFN_PCI_BAR3_SHADOW	0x0518		/* pci bar3 shadow */
#define	NOFN_AES_ROUNDS		0x0520		/* number of rounds in AES */
#define	NOFN_MIPS_INIT		0x0530		/* mips init */
#define	NOFN_MIPS_INIT_CTL	0x0528		/* mips init control */
#define	NOFN_UART_TX		0x0538		/* uart tx data */
#define	NOFN_UART_RX		0x0540		/* uart rx data */
#define	NOFN_UART_CLK_LOW	0x0548		/* uart clock, low bits */
#define	NOFN_UART_CLK_HIGH	0x0550		/* uart clock, high bits */
#define	NOFN_UART_STAT		0x0558		/* uart status */
#define	NOFN_MIPS_FLASH_BASE	0x0560		/* mips flash base addr */
#define	NOFN_MIPS_FLASH_SZ	0x0568		/* mips flash size */
#define	NOFN_MIPS_FLASH_XLATE	0x0570		/* mips address translation */
#define	NOFN_MIPS_SRAM_BASE	0x0578		/* mips sram base address */
#define	NOFN_MIPS_SRAM_SZ	0x0580		/* mips sram size */
#define	NOFN_MIPS_SRAM_XLATE	0x0588		/* mips sram xlate */
#define	NOFN_MIPS_MEM_LOCK	0x0590		/* mips memory lock */
#define	NOFN_MIPS_SDRAM2_BASE	0x0598		/* mips sdram2 base addr */
#define	NOFN_MIPS_SDRAM2_SZ	0x05a0		/* mips sdram2 size */
#define	NOFN_MIPS_EPO2_LMT	0x05a8		/* address boundary */

#define	REVID_7851_1		0x00140000	/* 7851, first silicon */
#define	REVID_7851_2		0x00140001	/* 7851, second silicon */
#define	REVID_7814_7854_1	0x00140002	/* 7814/7854, first silicon */
#define	REVID_8154_1		0x00180000	/* 8154, first silicon */
#define	REVID_8065_1		0x00160000	/* 8065, first silicon */
#define	REVID_8165_1		0x00170000	/* 8165, first silicon */

#define	PCIINTMASK_PK		0x80000000	/* pk processor idle */
#define	PCIINTMASK_RNGRDY	0x40000000	/* pk rng has 8 32bit words */
#define	PCIINTMASK_MIPSINT	0x00080000	/* mips interrupt */
#define	PCIINTMASK_ERR_OUT	0x00010000	/* err: outbound dma */
#define	PCIINTMASK_ERR_FREE	0x00008000	/* err: free descriptor */
#define	PCIINTMASK_ERR_DEST	0x00004000	/* err: dest descriptor */
#define	PCIINTMASK_ERR_RES	0x00002000	/* err: result cycle */
#define	PCIINTMASK_ERR_RESP	0x00001000	/* err: post address cycle */
#define	PCIINTMASK_DESCOVF	0x00000800	/* descriptor overflow */
#define	PCIINTMASK_RESDONE	0x00000400	/* result done */
#define	PCIINTMASK_DESTINV	0x00000200	/* destination invalidated */
#define	PCIINTMASK_POOLINV	0x00000100	/* free desc invalidated */
#define	PCIINTMASK_ERR_CMD	0x00000080	/* pci error fetching cmd */
#define	PCIINTMASK_ERR_SRC	0x00000040	/* pci error fetching src */
#define	PCIINTMASK_ERR_IN	0x00000020	/* pci error during input */
#define	PCIINTMASK_ERR_MULTI	0x00000010	/* multibit ecc error */
#define	PCIINTMASK_MIPSPAR	0x00000004	/* mips parity error */
#define	PCIINTMASK_MIPSPCI	0x00000002	/* write to pciint register */
#define	PCIINTMASK_FREE_E	0x00000001	/* free-pool empty */

#define	PCIINTSTAT_PK		0x80000000	/* pk processor idle */
#define	PCIINTSTAT_RNGRDY	0x40000000	/* pk rng has 8 32bit words */
#define	PCIINTSTAT_MIPSINT	0x00080000	/* mips interrupt */
#define	PCIINTSTAT_ERR_OUT	0x00010000	/* err: outbound dma */
#define	PCIINTSTAT_ERR_FREE	0x00008000	/* err: free descriptor */
#define	PCIINTSTAT_ERR_DEST	0x00004000	/* err: dest descriptor */
#define	PCIINTSTAT_ERR_RES	0x00002000	/* err: result cycle */
#define	PCIINTSTAT_ERR_RESP	0x00001000	/* err: post address cycle */
#define	PCIINTSTAT_DESCOVF	0x00000800	/* descriptor overflow */
#define	PCIINTSTAT_RESDONE	0x00000400	/* result done */
#define	PCIINTSTAT_DESTINV	0x00000200	/* destination invalidated */
#define	PCIINTSTAT_POOLINV	0x00000100	/* free desc invalidated */
#define	PCIINTSTAT_ERR_CMD	0x00000080	/* pci error fetching cmd */
#define	PCIINTSTAT_ERR_SRC	0x00000040	/* pci error fetching src */
#define	PCIINTSTAT_ERR_IN	0x00000020	/* pci error during input */
#define	PCIINTSTAT_ERR_MULTI	0x00000010	/* multibit ecc error */
#define	PCIINTSTAT_MIPSPAR	0x00000004	/* mips parity error */
#define	PCIINTSTAT_MIPSPCI	0x00000002	/* write to pciint register */
#define	PCIINTSTAT_FREE_E	0x00000001	/* free-pool empty */

#define	NOFN_PK_WIN_0	0x0000	/* big endian byte and words */
#define	NOFN_PK_WIN_1	0x2000	/* big endian byte, little endian words */
#define	NOFN_PK_WIN_2	0x4000	/* little endian byte and words */
#define	NOFN_PK_WIN_3	0x6000	/* little endian byte, big endian words */

#define	NOFN_PK_REGADDR(win,r,i)	\
    ((win) | (((r) & 0xf) << 7) | (((i) & 0x1f) << 2))

#define	NOFN_PK_LENADDR(r)	(0x1000 + ((r) << 2))
#define	NOFN_PK_LENMASK		0x000007ff	/* mask of length bits */

#define	NOFN_PK_RNGFIFO_BEGIN	0x1080
#define	NOFN_PK_RNGFIFO_END	0x10bc
#define	NOFN_PK_INSTR_BEGIN	0x1100
#define	NOFN_PK_INSTR_END	0x12fc

#define	NOFN_PK_CR		0x1fd4		/* command */
#define	NOFN_PK_SR		0x1fd8		/* status */
#define	NOFN_PK_IER		0x1fdc		/* interrupt enable */
#define	NOFN_PK_RNC		0x1fe0		/* random number config */
#define	NOFN_PK_CFG1		0x1fe4		/* config1 */
#define	NOFN_PK_CFG2		0x1fe8		/* config2 */
#define	NOFN_PK_CHIPID		0x1fec		/* chipid */
#define	NOFN_PK_SCR		0x1ff0		/* stack content */

#define	PK_CR_OFFSET_M		0x000001fc	/* instruction offset mask */
#define	PK_CR_OFFSET_S		2		/* instruction offset shift */

#define	PK_SR_DONE		0x00008000	/* proc is idle */
#define	PK_SR_RRDY		0x00004000	/* random number ready */
#define	PK_SR_UFLOW		0x00001000	/* random number underflow */
#define	PK_SR_CARRY		0x00000008	/* alu carry bit */

#define	PK_IER_DONE		0x00008000	/* intr when alu is idle */
#define	PK_IER_RRDY		0x00004000	/* intr when rng ready */

#define	PK_RNC_FST_SCALER	0x00000f00	/* first prescaler */
#define	PK_RNC_OUT_SCALER	0x00000080	/* output prescaler */

#define	PK_CFG1_RESET		0x00000001	/* reset pk unit */

#define	PK_CFG2_ALU_ENA		0x00000002	/* enable alu */
#define	PK_CFG2_RNG_ENA		0x00000001	/* enable rng */

/* alu registers are 1024 bits wide, but must be addressed by word. */
union nofn_pk_reg {
	u_int8_t b[128];
	u_int32_t w[32];
};

#define	PK_OP_DONE		0x80000000	/* end of program */
#define	PK_OPCODE_MASK		0x7c000000	/* opcode mask */
#define	PK_OPCODE_MODEXP	0x00000000	/*  modular exponentiation */
#define	PK_OPCODE_MODMUL	0x04000000	/*  modular multiplication */
#define	PK_OPCODE_MODRED	0x08000000	/*  modular reduction */
#define	PK_OPCODE_MODADD	0x0c000000	/*  modular addition */
#define	PK_OPCODE_MODSUB	0x10000000	/*  modular subtraction */
#define	PK_OPCODE_ADD		0x14000000	/*  addition */
#define	PK_OPCODE_SUB		0x18000000	/*  subtraction */
#define	PK_OPCODE_ADDC		0x1c000000	/*  addition with carry */
#define	PK_OPCODE_SUBC		0x20000000	/*  subtraction with carry */
#define	PK_OPCODE_MULT		0x24000000	/*  2048bit multiplication */
#define	PK_OPCODE_SR		0x28000000	/*  shift right */
#define	PK_OPCODE_SL		0x2c000000	/*  shift left */
#define	PK_OPCODE_INC		0x30000000	/*  increment */
#define	PK_OPCODE_DEC		0x34000000	/*  decrement */
#define	PK_OPCODE_TAG		0x38000000	/*  set length tag */
#define	PK_OPCODE_BRANCH	0x3c000000	/*  jump to insn */
#define	PK_OPCODE_CALL		0x40000000	/*  push addr and jump */
#define	PK_OPCODE_RETURN	0x44000000	/*  pop addr and return */

#define	PK_OP_RD_SHIFT		21
#define	PK_OP_RA_SHIFT		16
#define	PK_OP_RB_SHIFT		11
#define	PK_OP_RM_SHIFT		6
#define	PK_OP_R_MASK		0x1f
#define	PK_OP_LEN_MASK		0xffff

#define	NOFN_PK_INSTR(done,op,rd,ra,rb,rm) 		\
    ((done) | (op) |					\
     (((rd) & PK_OP_R_MASK) << PK_OP_RD_SHIFT) |	\
     (((ra) & PK_OP_R_MASK) << PK_OP_RA_SHIFT) |	\
     (((rb) & PK_OP_R_MASK) << PK_OP_RB_SHIFT) |	\
     (((rm) & PK_OP_R_MASK) << PK_OP_RM_SHIFT))

/* shift left, shift right, tag */
#define	NOFN_PK_INSTR2(done,op,rd,ra,len)		\
    ((done) | (op) |					\
     (((rd) & PK_OP_R_MASK) << PK_OP_RD_SHIFT) |	\
     (((ra) & PK_OP_R_MASK) << PK_OP_RA_SHIFT) |	\
     ((len) & PK_OP_LEN_MASK))