4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SYS_SBP2_BUS_H
28 #define _SYS_SBP2_BUS_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
33 * Serial Bus Protocol 2 (SBP-2) bus interface
36 #include <sys/sbp2/common.h>
45 SBP2_BUS_REV
= SBP2_BUS_REV_1
48 typedef struct sbp2_bus_buf
{
49 struct sbp2_bus_buf
*bb_next
; /* next in free list */
50 void *bb_hdl
; /* buffer handle */
51 void *bb_sbp2_priv
; /* SBP2 private data */
52 size_t bb_len
; /* buffer length */
53 int bb_flags
; /* flags */
54 int bb_dma_flags
; /* DDI_DMA_* flags */
55 caddr_t bb_kaddr
; /* kernel virtual address */
56 uint64_t bb_paddr
; /* physical address */
57 uint64_t bb_baddr
; /* bus address */
58 void (*bb_rq_cb
)(struct sbp2_bus_buf
*bb
, void *reqh
,
59 uint32_t *q
); /* quadlet read callback */
60 void (*bb_rb_cb
)(struct sbp2_bus_buf
*bb
, void *reqh
,
61 mblk_t
**bpp
, size_t len
); /* block read callback */
62 void (*bb_wq_cb
)(struct sbp2_bus_buf
*bb
, void *reqh
,
63 uint32_t q
); /* quadlet write callback */
64 void (*bb_wb_cb
)(struct sbp2_bus_buf
*bb
, void *reqh
,
65 mblk_t
**bpp
); /* block write callback */
68 _NOTE(SCHEME_PROTECTS_DATA("unique per call", sbp2_bus_buf
))
72 SBP2_BUS_BUF_DMA
= 0x01, /* DMA buffer */
73 SBP2_BUS_BUF_RD
= 0x02, /* read buffer */
74 SBP2_BUS_BUF_WR
= 0x04, /* write buffer */
75 SBP2_BUS_BUF_POSTED
= 0x08, /* posted buffer */
76 SBP2_BUS_BUF_RW
= (SBP2_BUS_BUF_RD
| SBP2_BUS_BUF_WR
),
77 SBP2_BUS_BUF_WR_POSTED
= (SBP2_BUS_BUF_WR
| SBP2_BUS_BUF_POSTED
)
80 /* buffer request error codes */
82 SBP2_BUS_BUF_SUCCESS
= 0,
83 SBP2_BUS_BUF_FAILURE
= -1, /* unspecified error */
84 SBP2_BUS_BUF_ELENGTH
= 1, /* wrong data length */
85 SBP2_BUS_BUF_EBUSY
= 2 /* device busy */
88 typedef struct sbp2_bus
{
91 /* static parameters */
92 uint64_t sb_csr_base
; /* CSR base address */
93 uint64_t sb_cfgrom_addr
; /* Config ROM address */
96 ddi_iblock_cookie_t (*sb_get_iblock_cookie
)(void *hdl
);
97 uint_t (*sb_get_node_id
)(void *hdl
);
98 int (*sb_alloc_buf
)(void *hdl
, sbp2_bus_buf_t
*buf
);
99 void (*sb_free_buf
)(void *hdl
, sbp2_bus_buf_t
*buf
);
100 int (*sb_sync_buf
)(void *hdl
, sbp2_bus_buf_t
*buf
,
101 off_t offset
, size_t length
, int type
);
102 void (*sb_buf_rd_done
)(void *hdl
, sbp2_bus_buf_t
*buf
,
103 void *reqh
, int error
);
104 void (*sb_buf_wr_done
)(void *hdl
, sbp2_bus_buf_t
*buf
,
105 void *reqh
, int error
);
107 int (*sb_alloc_cmd
)(void *hdl
, void **cmdp
, int flags
);
108 void (*sb_free_cmd
)(void *hdl
, void *cmd
);
109 int (*sb_rq
)(void *hdl
, void *cmd
, uint64_t addr
,
110 uint32_t *q
, int *berr
);
111 int (*sb_rb
)(void *hdl
, void *cmd
, uint64_t addr
,
112 mblk_t
**bpp
, int len
, int *err
);
113 int (*sb_wq
)(void *hdl
, void *cmd
, uint64_t addr
,
114 uint32_t q
, int *berr
);
115 int (*sb_wb
)(void *hdl
, void *cmd
, uint64_t addr
,
116 mblk_t
*bp
, int len
, int *berr
);
123 #endif /* _SYS_SBP2_BUS_H */