6198 Let's EOL cachefs
[illumos-gate.git] / usr / src / uts / common / sys / sservice.h
blob3c41a4395540a59df943d28d2cb88323fa6c7d16
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SSERVICE_H
27 #define _SSERVICE_H
29 #pragma ident "%Z%%M% %I% %E% SMI"
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
35 typedef int(f_tt)(int, ...); /* for lint - cc -v quieting */
38 * identifiers for all SS functions implemented
40 #define SS_GetAdapter 0
41 #define SS_GetPage 1
42 #define SS_GetSocket 2
43 #define SS_GetStatus 3
44 #define SS_GetWindow 4
45 #define SS_InquireAdapter 5
46 #define SS_InquireSocket 6
47 #define SS_InquireWindow 7
48 #define SS_ResetSocket 8
49 #define SS_SetPage 9
50 #define SS_SetAdapter 10
51 #define SS_SetSocket 11
52 #define SS_SetWindow 12
53 #define SS_SetIRQHandler 13
54 #define SS_ClearIRQHandler 14
55 #define CSGetActiveDip 98
56 #define CSInitDev 99
57 #define CSRegister 100
58 #define CSCISInit 101
59 #define CSUnregister 102
62 * XXX
64 #define CISGetAddress 103
65 #define CISSetAddress 104
66 #define CSCardRemoved 105
67 #define CSGetCookiesAndDip 106
70 * returns a la Socket Services
73 #define SUCCESS 0x00
74 #define BAD_ADAPTER 0x01
75 #define BAD_ATTRIBUTE 0x02
76 #define BAD_BASE 0x03
77 #define BAD_EDC 0x04
78 #define BAD_IRQ 0x06
79 #define BAD_OFFSET 0x07
80 #define BAD_PAGE 0x08
81 #define READ_FAILURE 0x09
82 #define BAD_SIZE 0x0a
83 #define BAD_SOCKET 0x0b
84 #define BAD_TYPE 0x0d
85 #define BAD_VCC 0x0e
86 #define BAD_VPP 0x0f
87 #define BAD_WINDOW 0x11
88 #define WRITE_FAILURE 0x12
89 #define NO_CARD 0x14
90 #define BAD_FUNCTION 0x15
91 #define BAD_MODE 0x16
92 #define BAD_SPEED 0x17
93 #define BUSY 0x18
94 #define NO_RESOURCE 0x20
96 /* events for callback */
97 /* card related events */
98 #define PCE_CARD_REMOVAL 0 /* card removed */
99 #define PCE_CARD_INSERT 1 /* card inserted */
100 #define PCE_CARD_READY 2 /* ready state changed */
101 #define PCE_CARD_BATTERY_WARN 3 /* battery is getting low */
102 #define PCE_CARD_BATTERY_DEAD 4 /* battery is dead */
103 #define PCE_CARD_STATUS_CHANGE 5 /* card status change for I/O card */
104 #define PCE_CARD_WRITE_PROTECT 6 /* card write protect status change */
105 #define PCE_CARD_RESET 7 /* client requested reset complete */
106 #define PCE_CARD_UNLOCK 8 /* lock has been unlocked (opt) */
107 #define PCE_CLIENT_INFO 9 /* someone wants client information */
108 #define PCE_EJECTION_COMPLETE 10 /* Motor has finished ejecting card */
109 #define PCE_EJECTION_REQUEST 11 /* request to eject card */
110 #define PCE_ERASE_COMPLETE 12 /* a Flash Erase request completed */
111 #define PCE_EXCLUSIVE_COMPLETE 13
112 #define PCE_EXCLUSIVE_REQUEST 14
113 #define PCE_INSERTION_COMPLETE 15
114 #define PCE_INSERTION_REQUEST 16
115 #define PCE_REGISTRATION_COMPLETE 17
116 #define PCE_RESET_COMPLETE 18
117 #define PCE_RESET_PHYSICAL 19
118 #define PCE_RESET_REQUEST 20
119 #define PCE_TIMER_EXPIRED 21
121 /* added for SPARC CPR support */
122 #define PCE_PM_RESUME 22
123 #define PCE_PM_SUSPEND 23
125 /* added for dynamic nexus registration */
126 #define PCE_SS_INIT_STATE 24 /* SS init state */
127 #define PCE_ADD_SOCKET 25 /* add a new socket */
128 #define PCE_DROP_SOCKET 26 /* drop an existing socket */
130 #define PCE_DEV_IDENT 30 /* The nexus has identified the device */
131 #define PCE_INIT_DEV 31 /* asking for a device */
133 #define PCE_E2M(event) (1 << (event))
135 /* event callback uses an indirect call -- make it look like a function */
136 #define CS_EVENT(event, socket, arg) (*pcmcia_cs_event) (event, socket, arg)
138 /* values for "socket number" field for PCE_SS_INIT_STATE event */
139 #define PCE_SS_STATE_INIT 0x0001 /* SS ready for callbacks */
140 #define PCE_SS_STATE_DEINIT 0x0002 /* SS not ready for callbacks */
143 * The following structure is to support CSRegister
145 typedef struct csregister {
146 uint32_t cs_magic; /* magic number */
147 uint32_t cs_version; /* CS version number */
148 /* CS entry point */
149 int (*cs_card_services)(int, ...);
150 /* CS event entry point */
151 f_tt *cs_event;
152 } csregister_t;
154 /* GetAdapter(get_adapter_t) */
156 typedef struct get_adapter {
157 unsigned state; /* adapter hardware state */
158 irq_t SCRouting; /* status change IRQ routing */
159 } get_adapter_t;
161 /* IRQ definitions */
162 #define IRQ_ENABLE 0x8000
164 /* GetPage(get_page_t) */
166 typedef struct get_page {
167 unsigned window; /* window number */
168 unsigned page; /* page number within window */
169 unsigned state; /* page state: */
171 * PS_ATTRIBUTE
172 * PS_COMMON
173 * PS_IO (for DoRight?)
174 * PS_ENABLED
175 * PS_WP
177 off_t offset; /* PC card's memory offset */
178 } get_page_t;
181 * PS flags
184 #define PS_ATTRIBUTE 0x01
185 #define PS_ENABLED 0x02
186 #define PS_WP 0x04
187 #define PS_IO 0x08 /* needed? for DoRight */
189 /* GetSocket(get_socket_t) */
191 typedef struct get_socket {
192 unsigned socket; /* socket number */
193 unsigned SCIntMask; /* status change interrupt mask */
194 unsigned VccLevel; /* VCC voltage in 1/10 volt */
195 unsigned Vpp1Level; /* VPP1 voltage in 1/10 volt */
196 unsigned Vpp2Level; /* VPP2 voltage in 1/10 volt */
197 unsigned state; /* latched status change signals */
198 unsigned CtlInd; /* controls and indicators */
199 irq_t IRQRouting; /* I/O IRQ routing */
200 unsigned IFType; /* memory-only or memory & I/O */
201 } get_socket_t;
203 /* GetStatus(get_ss_status_t) */
205 typedef struct get_ss_status {
206 unsigned socket; /* socket number */
207 unsigned CardState; /* real-time card state */
208 unsigned SocketState; /* latched status change signals */
209 unsigned CtlInd; /* controls and indicators */
210 irq_t IRQRouting; /* I/O IRQ routing */
211 unsigned IFType; /* memory-only or memory & I/O */
212 } get_ss_status_t;
215 * Socket specific flags and capabilities
218 #define SBM_WP 0x01
219 #define SBM_LOCKED 0x02
220 #define SBM_EJECT 0x04
221 #define SBM_INSERT 0x08
222 #define SBM_BVD1 0x10
223 #define SBM_BVD2 0x20
224 #define SBM_RDYBSY 0x40
225 #define SBM_CD 0x80
227 /* capabilities only */
228 #define SBM_LOCK 0x10
229 #define SBM_BATT 0x20
230 #define SBM_BUSY 0x40
231 #define SBM_XID 0x80
233 /* GetWindow(get_window_t) */
234 typedef uint32_t speed_t; /* memory speed in nanoseconds */
236 typedef struct get_window {
237 unsigned window; /* window number */
238 unsigned socket; /* socket this window is assigned to */
239 unsigned size; /* size in bytes */
240 unsigned state; /* current state of window hardware */
241 uint_t speed; /* speed in nanoseconds */
242 uint_t base;
243 ddi_acc_handle_t handle; /* base addr in host space */
244 } get_window_t;
247 * window flags (state and capabilities)
249 #define WS_IO 0x01
250 #define WS_ENABLED 0x02
251 #define WS_16BIT 0x04
252 #define WS_PAGED 0x80
253 #define WS_EISA 0x10
254 #define WS_CENABLE 0x20
255 #define WS_EXACT_MAPIN 0x40 /* map exactly what's asked for */
257 /* Inquire Adapter(inquire_adapter_t) */
259 typedef struct inquire_adapter {
260 unsigned NumSockets; /* number of sockets */
261 unsigned NumWindows; /* number of windows */
262 unsigned NumEDCs; /* number of EDCs */
264 unsigned AdpCaps; /* adapter power capabilities */
265 irq_t ActiveHigh; /* active high status change IRQ */
266 irq_t ActiveLow; /* active low status change IRQ */
267 int NumPower; /* number of power entries */
268 struct power_entry {
269 unsigned PowerLevel; /* voltage in 1/10 volt */
270 unsigned ValidSignals; /* voltage is valid for: */
272 * VCC
273 * VPP1
274 * VPP2
275 * if none are set, this is end
276 * of list
278 } *power_entry;
279 int NumInterrupts; /* number of interrupts supportable */
280 struct intr_entry {
281 int pri;
282 int intr;
283 } *AvailInterrupts; /* array of intrs, one per intr */
284 uint_t ResourceFlags; /* resource allocation requirements */
285 } inquire_adapter_t;
287 #define VCC 0x80
288 #define VPP1 0x40
289 #define VPP2 0x20
290 #define V_MASK (VCC|VPP1|VPP2)
292 #define RES_OWN_IRQ 0x0001 /* adapter owns own IRQ resources */
293 #define RES_OWN_IO 0x0002 /* adapter owns own I/O resources */
294 #define RES_OWN_MEM 0x0004 /* adapter owns own memory resources */
295 #define RES_IRQ_NEXUS 0x0008 /* adapter/nexus must multiplex IRQs */
296 #define RES_IRQ_SHAREABLE 0x0010 /* IRQ can be shared */
298 /* InquireSocket(inquire_socket_t) */
300 typedef struct inquire_socket {
301 unsigned socket; /* socket number */
302 unsigned SCIntCaps; /* status change interrupt events */
303 unsigned SCRptCaps; /* reportable status change events */
304 unsigned CtlIndCaps; /* controls and indicators */
305 unsigned SocketCaps; /* socket capabilities */
306 irq_t ActiveHigh; /* active high status change IRQ */
307 irq_t ActiveLow; /* active low status change IRQ */
308 } inquire_socket_t;
310 /* InquireWindow(inquire_window_t) */
312 typedef struct memwin_char {
313 unsigned MemWndCaps; /* memory window characteristcs */
314 baseaddr_t FirstByte; /* first byte in host space */
315 baseaddr_t LastByte; /* last byte in host space */
316 unsigned MinSize; /* minimum window size */
317 unsigned MaxSize; /* maximum window size */
318 unsigned ReqGran; /* window size constraints */
319 unsigned ReqBase; /* base address alignment boundry */
320 unsigned ReqOffset; /* offset alignment boundry */
321 unsigned Slowest; /* slowest speed in nanoseconds */
322 unsigned Fastest; /* fastest speed in nanoseconds */
323 } mem_win_char_t;
325 typedef struct iowin_char {
326 unsigned IOWndCaps; /* I/O window characteristcs */
327 baseaddr_t FirstByte; /* first byte in host space */
328 baseaddr_t LastByte; /* last byte in host space */
329 unsigned MinSize; /* minimum window size */
330 unsigned MaxSize; /* maximum window size */
331 unsigned ReqGran; /* window size constraints */
332 unsigned AddrLines; /* number of address lines decoded */
333 unsigned EISASlot; /* EISA I/O address decoding */
334 } iowin_char_t;
336 typedef struct inquire_window {
337 unsigned window; /* window number */
338 unsigned WndCaps; /* window capabilities */
339 socket_enum_t Sockets; /* window<->socket assignment mask */
340 /* note that we always declare both forms */
341 mem_win_char_t mem_win_char;
342 iowin_char_t iowin_char;
343 } inquire_window_t;
346 /* interface definitions */
347 #define IF_CARDBUS 0x00 /* CardBus interface */
348 #define IF_IO 0x01 /* IO + memory */
349 #define IF_MEMORY 0x02 /* memory only */
350 #define IF_TYPE_MASK 0x03
352 #define DREQ_MASK 0x0c
353 #define DREQ_NONE 0x00
354 #define DREQ_SPKR 0x04
355 #define DREQ_IOIS16 0x08
356 #define DREQ_INPACK 0x0c
358 #define DMA_CHAN_MASK 0xf0
359 #define DMA_GET_CHAN(x) (((x) >> 4) & 0xF)
360 #define DMA_SET_CHAN(x, y) (((x) & 0xF) | ((y) & ~DMA_CHAN_MASK))
362 #define IF_CB 0x04
363 #define IF_DMA 0x08
364 #define IF_VSKEY 0x10
365 #define IF_33VC 0x20
366 #define IF_XXVCC 0x40
369 #define PC_PAGESIZE 0x4000 /* 16K page size */
371 /* window capabilities */
372 /* generic */
373 #define WC_IO 0x0004
374 #define WC_WAIT 0x0080
375 #define WC_COMMON 0x0001
376 #define WC_ATTRIBUTE 0x0002
377 /* I/O and memory */
378 #define WC_BASE 0x0001
379 #define WC_SIZE 0x0002
380 #define WC_WENABLE 0x0004
381 #define WC_8BIT 0x0008
382 #define WC_16BIT 0x0010
383 #define WC_BALIGN 0x0020
384 #define WC_POW2 0x0040
385 /* memory only */
386 #define WC_CALIGN 0x0080
387 #define WC_PAVAIL 0x0100
388 #define WC_PSHARED 0x0200
389 #define WC_PENABLE 0x0400
390 #define WC_WP 0x0800
391 /* I/O only */
392 #define WC_INPACK 0x0080
393 #define WC_EISA 0x0100
394 #define WC_CENABLE 0x0200
395 /* Solaris/SPARC */
396 #define WC_IO_RANGE_PER_WINDOW 0x8000 /* I/O range unique for each window */
398 /* SetPage(set_page_t *) */
399 typedef struct set_page {
400 unsigned window; /* window number */
401 unsigned page; /* page number */
402 unsigned state; /* page state */
403 off_t offset; /* offset in PC card space */
404 } set_page_t;
406 /* SetSocket(set_socket_t) */
408 typedef struct set_socket {
409 unsigned socket; /* socket number */
410 unsigned SCIntMask; /* status change enables */
411 unsigned Vcontrol; /* power control flags */
412 unsigned VccLevel; /* Vcc power index level */
413 unsigned Vpp1Level; /* Vpp1 power index level */
414 unsigned Vpp2Level; /* Vpp2 power index level */
415 unsigned State;
416 unsigned CtlInd; /* control and indicator bits */
417 irq_t IREQRouting; /* I/O IRQ routing */
418 unsigned IFType; /* interface type (mem/IO) */
419 } set_socket_t;
421 #define VCTL_CISREAD 0x01 /* controlled by Vcc/Vpp sense pins */
422 #define VCTL_OVERRIDE 0x02 /* 16-bit cards, ignore the sense pins */
424 /* SetIRQHandler(set_irq_handler_t) */
426 typedef struct set_irq_handler {
427 unsigned socket; /* associate with a socket for now */
428 unsigned irq;
429 unsigned handler_id; /* ID of this client's handler */
430 f_tt *handler; /* client IO IRQ handler entry point */
431 void *arg1; /* arg to call client handler with */
432 void *arg2; /* arg to call client handler with */
433 ddi_iblock_cookie_t *iblk_cookie; /* iblk cookie pointer */
434 ddi_idevice_cookie_t *idev_cookie; /* idev cookie pointer */
435 } set_irq_handler_t;
437 #define IRQ_ANY 0x0
439 /* interrupt priority levels */
440 #define PRIORITY_LOW 0x00
441 #define PRIORITY_HIGH 0x10
443 /* ClearIRQHandler(clear_irq_handler_t) */
445 typedef struct clear_irq_handler {
446 unsigned socket;
447 unsigned handler_id; /* client handler ID to remove */
448 f_tt *handler; /* client IO IRQ handler entry point */
449 } clear_irq_handler_t;
451 /* SetWindow(set_window_t) */
453 typedef struct set_window {
454 unsigned window; /* window number */
455 unsigned socket; /* socket number */
456 unsigned WindowSize; /* window size in bytes */
457 unsigned state; /* window state */
458 unsigned speed; /* window speed, nanoseconds */
459 uint_t base;
460 ddi_acc_handle_t handle; /* base addr in host space */
461 dev_info_t *child; /* child's dip */
462 ddi_device_acc_attr_t attr;
463 } set_window_t;
465 /* CSInitDev */
466 typedef
467 struct ss_make_device_node {
468 uint32_t flags; /* operation flags */
469 dev_info_t *dip; /* dip for this client */
470 char *name; /* device node path and name */
471 char *slot; /* slot name string */
472 char *busaddr; /* bus addr name string */
473 int spec_type; /* dev special type (block/char) */
474 int minor_num; /* device node minor number */
475 char *node_type; /* device node type */
476 } ss_make_device_node_t;
478 #define SS_CSINITDEV_CREATE_DEVICE 0x01 /* create device node */
479 #define SS_CSINITDEV_REMOVE_DEVICE 0x02 /* remove device node */
480 #define SS_CSINITDEV_USE_SLOT 0x04 /* use slot name from caller */
481 #define SS_CSINITDEV_USE_BUSADDR 0x08 /* use bus addr from caller */
482 #define SS_CSINITDEV_MORE_DEVICES 0x10 /* send PCE_INIT_DEV */
483 #define SS_CSINITDEV_SEND_DEV_EVENT 0x10 /* send PCE_INIT_DEV */
486 * csss_adapter_info_t - provides additional per-socket adapter info
488 typedef struct csss_adapter_info_t {
489 char name[MODMAXNAMELEN]; /* adapter name */
490 int major; /* adapter major number */
491 int minor; /* adapter minor number */
492 int number; /* canonical adapter number */
493 int num_sockets; /* # sockets on this adapter */
494 int first_socket; /* first socket # on this adapter */
495 } csss_adapter_info_t;
497 /* CSGetCookiesAndDip */
498 typedef struct get_cookies_and_dip_t {
499 unsigned socket; /* socket number */
500 dev_info_t *dip; /* adapter instance dip */
501 ddi_iblock_cookie_t *iblock; /* for event handler */
502 ddi_idevice_cookie_t *idevice; /* for event handler */
503 csss_adapter_info_t adapter_info; /* adapter info for socket */
504 } get_cookies_and_dip_t;
506 /* ResetSocket */
507 #define RESET_MODE_FULL 0 /* Reset to SocketServices Specification */
508 #define RESET_MODE_CARD_ONLY 1 /* only reset the card itself */
510 /* union of all exported functions functions */
511 typedef
512 union sservice {
513 get_adapter_t get_adapter;
514 get_page_t get_page;
515 get_socket_t get_socket;
516 get_window_t get_window;
517 get_ss_status_t get_ss_status;
518 inquire_adapter_t inquire_adapter;
519 inquire_socket_t inquire_socket;
520 inquire_window_t inquire_window;
521 set_page_t set_page;
522 set_socket_t set_socket;
523 set_irq_handler_t set_irq_handler;
524 set_window_t set_window;
525 get_cookies_and_dip_t get_cookies;
526 ss_make_device_node_t make_device;
527 } sservice_t;
529 /* event manager structures */
530 struct pcm_make_dev {
531 int socket;
532 int flags;
533 int op;
534 dev_t dev;
535 int type;
536 char driver[MODMAXNAMELEN];
537 char path[MAXPATHLEN];
540 #define PCM_EVENT_MORE 0x0001 /* more events of this type coming */
542 #ifdef _KERNEL
544 #include <sys/sunndi.h>
547 * prototypes for nexi
550 int pcmcia_attach(dev_info_t *, struct pcmcia_adapter_nexus_private *);
551 int pcmcia_ctlops(dev_info_t *, dev_info_t *, ddi_ctl_enum_t, void *, void *);
552 int pcmcia_prop_op(dev_t, dev_info_t *, dev_info_t *, ddi_prop_op_t,
553 int, char *, caddr_t, int *);
554 int pcmcia_intr_ops(dev_info_t *dip, dev_info_t *rdip, ddi_intr_op_t intr_op,
555 ddi_intr_handle_impl_t *hdlp, void *result);
557 int pcmcia_open(dev_t *, int, int, cred_t *);
558 int pcmcia_close(dev_t, int, int, cred_t *);
559 int pcmcia_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
560 int pcmcia_power(dev_info_t *, int, int);
561 void pcmcia_begin_resume(dev_info_t *);
562 void pcmcia_wait_insert(dev_info_t *);
565 /* resource allocation functions and structure */
566 typedef struct ra_return {
567 uint_t ra_addr_hi;
568 uint_t ra_addr_lo;
569 uint_t ra_len;
570 } ra_return_t;
572 int pcmcia_alloc_mem(dev_info_t *, ndi_ra_request_t *, ra_return_t *,
573 dev_info_t **);
574 int pcmcia_alloc_io(dev_info_t *, ndi_ra_request_t *, ra_return_t *,
575 dev_info_t **);
576 int pcmcia_free_mem(dev_info_t *, ra_return_t *);
577 int pcmcia_free_io(dev_info_t *, ra_return_t *);
578 int pcmcia_map_reg(dev_info_t *, dev_info_t *, ra_return_t *,
579 uint32_t, caddr_t *, ddi_acc_handle_t *,
580 ddi_device_acc_attr_t *, uint32_t);
581 int pcmcia_bus_map(dev_info_t *, dev_info_t *, ddi_map_req_t *,
582 off_t, off_t, caddr_t *);
584 #endif /* _KERNEL */
586 #ifdef __cplusplus
588 #endif
590 #endif /* _SSERVICE_H */