843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifndef _SYS_XDB_H
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define _SYS_XDB_H
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern "C" {
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_DBG_ALL 0xf
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_DBG_IO 0x1
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_DBG_INFO 0x2
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_DBPRINT(lvl, fmt) { if (xdb_debug & lvl) cmn_err fmt; }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Info of the exported blk device
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_DEV_RO (1 << 0) /* backend and frontend are read-only */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_DEV_BE_LOFI (1 << 1) /* backend device is a lofi device */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_DEV_BE_RMB (1 << 2) /* backend device is removable */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_DEV_BE_CD (1 << 3) /* backend device is cdrom */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_DEV_FE_CD (1 << 4) /* frontend device is cdrom */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_IS_RO(vdp) ((vdp)->xs_type & XDB_DEV_RO)
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_IS_BE_LOFI(vdp) ((vdp)->xs_type & XDB_DEV_BE_LOFI)
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_IS_BE_RMB(vdp) ((vdp)->xs_type & XDB_DEV_BE_RMB)
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_IS_BE_CD(vdp) ((vdp)->xs_type & XDB_DEV_BE_CD)
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz#define XDB_IS_FE_CD(vdp) ((vdp)->xs_type & XDB_DEV_FE_CD)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Other handy macrosx
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_MINOR2INST(m) (int)(m)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_INST2MINOR(i) (minor_t)(i)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_INST2SOFTS(instance) \
843e19887f64dde75055cf8842fc4db2171eff45johnlev ((xdb_t *)ddi_get_soft_state(xdb_statep, (instance)))
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#define XDB_MAX_IO_PAGES(v) ((v)->xs_nentry * BLKIF_MAX_SEGMENTS_PER_REQUEST)
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* get kva of a mapped-in page coresponding to (xreq-index, seg) pair */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_IOPAGE_VA(_pagebase, _xreqidx, _seg) \
843e19887f64dde75055cf8842fc4db2171eff45johnlev ((_pagebase) + ((_xreqidx) \
843e19887f64dde75055cf8842fc4db2171eff45johnlev * BLKIF_MAX_SEGMENTS_PER_REQUEST \
843e19887f64dde75055cf8842fc4db2171eff45johnlev + (_seg)) * PAGESIZE)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_XREQ2BP(xreq) (&(xreq)->xr_buf)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XDB_BP2XREQ(bp) \
843e19887f64dde75055cf8842fc4db2171eff45johnlev ((xdb_request_t *)((char *)(bp) - offsetof(xdb_request_t, xr_buf)))
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* describe one blkif segment */
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef struct xdb_seg {
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t fs; /* start sector # within this page (segment) */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t ls; /* end sector # within this page (segment) */
843e19887f64dde75055cf8842fc4db2171eff45johnlev} xdb_seg_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef struct xdb xdb_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* one blkif_request_t matches one xdb_request_t */
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef struct xdb_request {
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* buf associated with this I/O request */
843e19887f64dde75055cf8842fc4db2171eff45johnlev buf_t xr_buf;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* softstate instance associated with this I/O request */
843e19887f64dde75055cf8842fc4db2171eff45johnlev xdb_t *xr_vdp;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* the next segment we're going to process */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int xr_curseg;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* index of this xdb_request_t in vdp->xs_req */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int xr_idx;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* next index for a statical linked list */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int xr_next;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* 'id' copied from blkif_request_t */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t xr_id;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* 'operation' copied from blkif_request_t */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t xr_op;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* how many pages(segments) in this I/O request */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t xr_buf_pages;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* all segments of this I/O request */
843e19887f64dde75055cf8842fc4db2171eff45johnlev xdb_seg_t xr_segs[BLKIF_MAX_SEGMENTS_PER_REQUEST];
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* all grant table handles used in this I/O request */
843e19887f64dde75055cf8842fc4db2171eff45johnlev grant_handle_t xr_page_hdls[BLKIF_MAX_SEGMENTS_PER_REQUEST];
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct page xr_plist[BLKIF_MAX_SEGMENTS_PER_REQUEST];
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct page *xr_pplist[BLKIF_MAX_SEGMENTS_PER_REQUEST];
843e19887f64dde75055cf8842fc4db2171eff45johnlev} xdb_request_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Soft state data structure for each backend vbd */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstruct xdb {
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* devinfo node pointer of this xdb */
843e19887f64dde75055cf8842fc4db2171eff45johnlev dev_info_t *xs_dip;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* coresponding frontend domain id */
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t xs_peer;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* read-only, removable, cdrom? */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint32_t xs_type;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* # of total sectors */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t xs_sectors;
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China /* sector size if existed */
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China uint_t xs_sec_size;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* blkif I/O request ring buffer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev xendev_ring_t *xs_ring;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* handle to access the ring buffer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_acc_handle_t xs_ring_hdl;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ldi_ident_t xs_ldi_li;
843e19887f64dde75055cf8842fc4db2171eff45johnlev ldi_handle_t xs_ldi_hdl;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* base kva for mapped-in I/O page from frontend domain */
843e19887f64dde75055cf8842fc4db2171eff45johnlev caddr_t xs_iopage_va;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* mutex lock for I/O related code path */
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmutex_t xs_iomutex;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * mutex lock for event handling related code path
843e19887f64dde75055cf8842fc4db2171eff45johnlev * need to be grabbed before xs_iomutex
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmutex_t xs_cbmutex;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* # of on-going I/O buf in backend domain */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint_t xs_ionum;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* task thread for pushing buf to underlying target driver */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_taskq_t *xs_iotaskq;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* cv used in I/O code path, protected by xs_iomutex */
843e19887f64dde75055cf8842fc4db2171eff45johnlev kcondvar_t xs_iocv;
843e19887f64dde75055cf8842fc4db2171eff45johnlev kcondvar_t xs_ionumcv;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * head and tail of linked list for I/O bufs need to be pushed to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * underlying target driver
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev buf_t *xs_f_iobuf;
843e19887f64dde75055cf8842fc4db2171eff45johnlev buf_t *xs_l_iobuf;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* head of free list of xdb_request_t */
843e19887f64dde75055cf8842fc4db2171eff45johnlev int xs_free_req;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* pre-allocated xdb_request_t pool */
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab xdb_request_t *xs_req;
843e19887f64dde75055cf8842fc4db2171eff45johnlev kstat_t *xs_kstats;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t xs_stat_req_reads;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t xs_stat_req_writes;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t xs_stat_req_barriers;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t xs_stat_req_flushes;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab enum blkif_protocol xs_blk_protocol;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab size_t xs_nentry;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab size_t xs_entrysize;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz /* Protected by xs_cbmutex */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz boolean_t xs_hp_connected; /* hot plug scripts have run */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz boolean_t xs_fe_initialised; /* frontend is initialized */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz char *xs_lofi_path;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz char *xs_params_path;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz struct xenbus_watch *xs_watch_params;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz struct xenbus_watch *xs_watch_media_req;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz ddi_taskq_t *xs_watch_taskq;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz int xs_watch_taskq_count;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz /* Protected by xs_cbmutex and xs_iomutex */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz boolean_t xs_if_connected; /* connected to frontend */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz /* Protected by xs_iomutex */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz boolean_t xs_send_buf;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab uint64_t *page_addrs; /* for debug aid */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* DEBUG */
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* _SYS_XDB_H */