gemini_ipm.h revision 1.1.6.2 1 1.1.6.2 skrll /* $NetBSD: gemini_ipm.h,v 1.1.6.2 2009/01/19 13:15:58 skrll Exp $ */
2 1.1.6.2 skrll
3 1.1.6.2 skrll #ifndef _GEMINI_IPM_H_
4 1.1.6.2 skrll #define _GEMINI_IPM_H_
5 1.1.6.2 skrll
6 1.1.6.2 skrll /*
7 1.1.6.2 skrll * generic/non-specific Messages
8 1.1.6.2 skrll */
9 1.1.6.2 skrll #define IPM_TAG_NONE 0
10 1.1.6.2 skrll #define IPM_TAG_GPN 1
11 1.1.6.2 skrll #define IPM_TAG_WDOG 2
12 1.1.6.2 skrll #define IPM_NTAGS (IPM_TAG_WDOG + 1) /* bump when you add new ones */
13 1.1.6.2 skrll
14 1.1.6.2 skrll typedef struct ipm_desc {
15 1.1.6.2 skrll uint8_t tag;
16 1.1.6.2 skrll uint8_t blob[15];
17 1.1.6.2 skrll } ipm_desc_t;
18 1.1.6.2 skrll
19 1.1.6.2 skrll
20 1.1.6.2 skrll /*
21 1.1.6.2 skrll * void *gemini_ipm_register(uint8_t tag, unsigned int ipl, size_t quota,
22 1.1.6.2 skrll * void (*consume)(void *arg, const void *desc),
23 1.1.6.2 skrll * void (*counter)(void *arg, size_t n),
24 1.1.6.2 skrll * void *arg);
25 1.1.6.2 skrll *
26 1.1.6.2 skrll * - register an IPM service, identified by 'tag'
27 1.1.6.2 skrll * - callback functions may be dispatched using softint at indicated 'ipl'
28 1.1.6.2 skrll * using softint_establish(), softint_disestablish()
29 1.1.6.2 skrll * for now they are called directly at IPL_NET
30 1.1.6.2 skrll * - reserve 'quota' descriptors; minimum is 1.
31 1.1.6.2 skrll * - 'consume' function is called for each message received
32 1.1.6.2 skrll * - 'counter' function is called to update count of
33 1.1.6.2 skrll * of completed produced (sent) descriptors since last update
34 1.1.6.2 skrll * - 'arg' is private to the service
35 1.1.6.2 skrll * - return value is an IPM handle ('ipmh') that can be used
36 1.1.6.2 skrll * e.g. to de-register
37 1.1.6.2 skrll * - if the 'tag' is already in use, or if 'quota' descriptors are not available,
38 1.1.6.2 skrll * then NULL is returned.
39 1.1.6.2 skrll */
40 1.1.6.2 skrll void *gemini_ipm_register(uint8_t, unsigned int, size_t,
41 1.1.6.2 skrll void (*)(void *, const void *),
42 1.1.6.2 skrll void (*)(void *, size_t),
43 1.1.6.2 skrll void *);
44 1.1.6.2 skrll
45 1.1.6.2 skrll /*
46 1.1.6.2 skrll * void gemini_ipm_deregister(void *ipmh);
47 1.1.6.2 skrll *
48 1.1.6.2 skrll * - tear down a service
49 1.1.6.2 skrll * - 'ipmh' is handle returned from priot call to gemini_ipm_register()
50 1.1.6.2 skrll */
51 1.1.6.2 skrll void gemini_ipm_deregister(void *);
52 1.1.6.2 skrll
53 1.1.6.2 skrll /*
54 1.1.6.2 skrll * void gemini_ipm_produce(const void *desc, unsigned size_t ndesc);
55 1.1.6.2 skrll *
56 1.1.6.2 skrll * - service produces (sends) 'ndesc' messages described by the array of
57 1.1.6.2 skrll * descriptors 'desc'.
58 1.1.6.2 skrll * - if not all messages can be sent due to lack of descriptor queue resources,
59 1.1.6.2 skrll * then the calling service has exceeded it's quota and the system will panic.
60 1.1.6.2 skrll * - after return the descriptors at 'desc' revert to the caller
61 1.1.6.2 skrll * caller can recycle or free as he likes.
62 1.1.6.2 skrll */
63 1.1.6.2 skrll int gemini_ipm_produce(const void *, size_t);
64 1.1.6.2 skrll
65 1.1.6.2 skrll /*
66 1.1.6.2 skrll * void gemini_ipm_copyin(void *dest, bus_addr_t ba, size_t len);
67 1.1.6.2 skrll *
68 1.1.6.2 skrll * - service copies in (receives) message 'len' bytes of data to be copied
69 1.1.6.2 skrll * from bus address 'ba' to virtual address 'dest'
70 1.1.6.2 skrll * - this function is meant to be called from the service's registered
71 1.1.6.2 skrll * 'consume' callback function
72 1.1.6.2 skrll */
73 1.1.6.2 skrll void gemini_ipm_copyin(void *, bus_addr_t, size_t);
74 1.1.6.2 skrll
75 1.1.6.2 skrll
76 1.1.6.2 skrll #endif /* _GEMINI_IPM_H_ */
77