1 0 stevel /* 2 0 stevel * CDDL HEADER START 3 0 stevel * 4 0 stevel * The contents of this file are subject to the terms of the 5 2282 jb145095 * Common Development and Distribution License (the "License"). 6 2282 jb145095 * You may not use this file except in compliance with the License. 7 0 stevel * 8 0 stevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 0 stevel * or http://www.opensolaris.org/os/licensing. 10 0 stevel * See the License for the specific language governing permissions 11 0 stevel * and limitations under the License. 12 0 stevel * 13 0 stevel * When distributing Covered Code, include this CDDL HEADER in each 14 0 stevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 0 stevel * If applicable, add the following below this CDDL HEADER, with the 16 0 stevel * fields enclosed by brackets "[]" replaced with your own identifying 17 0 stevel * information: Portions Copyright [yyyy] [name of copyright owner] 18 0 stevel * 19 0 stevel * CDDL HEADER END 20 0 stevel */ 21 0 stevel /* 22 5974 jm22469 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 0 stevel * Use is subject to license terms. 24 0 stevel */ 25 0 stevel 26 0 stevel #ifndef _QCN_H 27 0 stevel #define _QCN_H 28 0 stevel 29 0 stevel #pragma ident "%Z%%M% %I% %E% SMI" 30 0 stevel 31 0 stevel #ifdef __cplusplus 32 0 stevel extern "C" { 33 0 stevel #endif 34 0 stevel 35 0 stevel /* 36 0 stevel * sun4v Console driver 37 0 stevel */ 38 0 stevel 39 0 stevel #include <sys/types.h> 40 0 stevel #include <sys/stream.h> 41 0 stevel #include <sys/tty.h> 42 0 stevel #include <sys/ddi.h> 43 0 stevel #include <sys/sunddi.h> 44 5974 jm22469 #include <sys/consdev.h> 45 0 stevel 46 0 stevel #define RINGBITS 8 /* # of bits in ring ptrs */ 47 0 stevel #define RINGSIZE (1<<RINGBITS) /* size of ring */ 48 0 stevel #define RINGMASK (RINGSIZE-1) 49 0 stevel 50 0 stevel #define RING_INIT(qsp) ((qsp)->qcn_rput = (qsp)->qcn_rget = 0) 51 0 stevel #define RING_CNT(qsp) (((qsp)->qcn_rput - (qsp)->qcn_rget) & RINGMASK) 52 0 stevel #define RING_POK(qsp, n) ((int)RING_CNT(qsp) < (int)(RINGSIZE-(n))) 53 0 stevel #define RING_PUT(qsp, c) \ 54 0 stevel ((qsp)->qcn_ring[(qsp)->qcn_rput++ & RINGMASK] = (uchar_t)(c)) 55 0 stevel #define RING_GET(qsp) ((qsp)->qcn_ring[(qsp)->qcn_rget++ & RINGMASK]) 56 2282 jb145095 #define RING_ADDR(qsp) (&((qsp)->qcn_ring[(qsp)->qcn_rget & RINGMASK])) 57 2282 jb145095 #define RING_POFF(qsp) ((qsp)->qcn_rput & RINGMASK) 58 2282 jb145095 #define RING_GOFF(qsp) ((qsp)->qcn_rget & RINGMASK) 59 2282 jb145095 #define RING_LEFT(qsp) (RING_POFF(qsp) >= RING_GOFF(qsp) ? (RINGSIZE) - \ 60 2282 jb145095 RING_POFF(qsp) : RING_GOFF(qsp) - RING_POFF(qsp)) 61 2282 jb145095 62 2282 jb145095 #define RING_UPD(qsp, n) ((qsp)->qcn_rput += (n)) 63 0 stevel 64 0 stevel /* 65 0 stevel * qcn driver's soft state structure 66 0 stevel */ 67 0 stevel typedef struct qcn { 68 0 stevel /* mutexes */ 69 0 stevel kmutex_t qcn_hi_lock; /* protects qcn_t (soft state) */ 70 0 stevel kmutex_t qcn_lock; /* protects output queue */ 71 0 stevel 72 0 stevel /* stream queues */ 73 0 stevel queue_t *qcn_writeq; /* stream write queue */ 74 0 stevel queue_t *qcn_readq; /* stream read queue */ 75 0 stevel 76 0 stevel /* dev info */ 77 0 stevel dev_info_t *qcn_dip; /* dev_info */ 78 0 stevel 79 0 stevel /* for handling IOCTL messages */ 80 0 stevel bufcall_id_t qcn_wbufcid; /* for console ioctl */ 81 0 stevel tty_common_t qcn_tty; /* for console ioctl */ 82 0 stevel 83 0 stevel /* for console output timeout */ 84 0 stevel time_t qcn_sc_active; /* last time (sec) SC was active */ 85 0 stevel uint_t qcn_polling; 86 0 stevel uchar_t qcn_rget; 87 0 stevel uchar_t qcn_rput; 88 2432 jb145095 89 2432 jb145095 /* the following is protected by atomic operations */ 90 2432 jb145095 volatile unsigned int qcn_soft_pend; 91 2432 jb145095 92 0 stevel ddi_softint_handle_t qcn_softint_hdl; 93 2282 jb145095 uchar_t *qcn_ring; 94 0 stevel ushort_t qcn_hangup; 95 0 stevel ddi_intr_handle_t *qcn_htable; /* For array of interrupts */ 96 0 stevel int qcn_intr_type; /* What type of interrupt */ 97 0 stevel int qcn_intr_cnt; /* # of intrs count returned */ 98 0 stevel size_t qcn_intr_size; /* Size of intr array */ 99 0 stevel uint_t qcn_intr_pri; /* Interrupt priority */ 100 0 stevel uint_t qcn_rbuf_overflow; 101 2282 jb145095 /* 102 2282 jb145095 * support for console read/write support 103 2282 jb145095 */ 104 2282 jb145095 int (*cons_transmit)(queue_t *, mblk_t *); 105 2282 jb145095 void (*cons_receive)(void); 106 2282 jb145095 char *cons_write_buffer; 107 2282 jb145095 uint64_t cons_write_buf_ra; 108 2282 jb145095 uint64_t cons_read_buf_ra; 109 5974 jm22469 110 5974 jm22469 /* 111 5974 jm22469 * support for polled io 112 5974 jm22469 */ 113 5974 jm22469 cons_polledio_t qcn_polledio; 114 5974 jm22469 boolean_t qcn_char_available; 115 5974 jm22469 uint8_t qcn_hold_char; 116 0 stevel } qcn_t; 117 2432 jb145095 118 2432 jb145095 /* Constants for qcn_soft_pend */ 119 2432 jb145095 #define QCN_SP_IDL 0 /* qcn_soft_pend is idle - do trigger */ 120 2432 jb145095 #define QCN_SP_DO 1 /* soft interrupt needs to be processed */ 121 2432 jb145095 #define QCN_SP_IP 2 /* in process, if interrupt, set DO, no trig */ 122 0 stevel 123 0 stevel /* Constants used by promif routines */ 124 0 stevel #define QCN_CLNT_STR "CON_CLNT" 125 0 stevel #define QCN_OBP_STR "CON_OBP" 126 0 stevel 127 0 stevel /* alternate break sequence */ 128 0 stevel extern void (*abort_seq_handler)(); 129 0 stevel 130 0 stevel extern struct mod_ops mod_driverops; 131 0 stevel 132 0 stevel #define QCN_TXINT_ENABLE 0x1 133 0 stevel #define QCN_RXINT_ENABLE 0x2 134 0 stevel 135 2282 jb145095 /* 136 2282 jb145095 * API major/minor definitions for console 137 2282 jb145095 * read/write support. 138 2282 jb145095 */ 139 2282 jb145095 140 2282 jb145095 #define QCN_API_MAJOR 1 141 2282 jb145095 #define QCN_API_MINOR 1 142 2282 jb145095 143 2282 jb145095 /* 144 2282 jb145095 * The buffer size must be a power of 2 or contig_mem_alloc will fail 145 2282 jb145095 */ 146 2282 jb145095 #define CONS_WR_BUF_SIZE 64 147 2282 jb145095 148 0 stevel #ifdef __cplusplus 149 0 stevel } 150 0 stevel #endif 151 0 stevel 152 0 stevel #endif /* _QCN_H */ 153