xref: /netbsd-src/sys/arch/arm/gemini/gemini_ipm.h (revision f0a7346d2148aa56c118f3e51cfffc26cebb09ce)
1*f0a7346dSsnj /*	$NetBSD: gemini_ipm.h,v 1.2 2014/10/18 08:33:24 snj Exp $	*/
241bfa2c4Scliff 
341bfa2c4Scliff #ifndef _GEMINI_IPM_H_
441bfa2c4Scliff #define _GEMINI_IPM_H_
541bfa2c4Scliff 
641bfa2c4Scliff /*
741bfa2c4Scliff  * generic/non-specific Messages
841bfa2c4Scliff  */
941bfa2c4Scliff #define IPM_TAG_NONE		0
1041bfa2c4Scliff #define IPM_TAG_GPN		1
1141bfa2c4Scliff #define IPM_TAG_WDOG		2
1241bfa2c4Scliff #define IPM_NTAGS		(IPM_TAG_WDOG + 1)	/* bump when you add new ones */
1341bfa2c4Scliff 
1441bfa2c4Scliff typedef struct ipm_desc {
1541bfa2c4Scliff 	uint8_t	tag;
1641bfa2c4Scliff 	uint8_t	blob[15];
1741bfa2c4Scliff } ipm_desc_t;
1841bfa2c4Scliff 
1941bfa2c4Scliff 
2041bfa2c4Scliff /*
2141bfa2c4Scliff  * void *gemini_ipm_register(uint8_t tag, unsigned int ipl, size_t quota,
2241bfa2c4Scliff  *	void (*consume)(void *arg, const void *desc),
2341bfa2c4Scliff  *	void (*counter)(void *arg, size_t n),
2441bfa2c4Scliff  *	void *arg);
2541bfa2c4Scliff  *
2641bfa2c4Scliff  * - register an IPM service, identified by 'tag'
2741bfa2c4Scliff  * - callback functions may be dispatched using softint at indicated 'ipl'
2841bfa2c4Scliff  *   using softint_establish(), softint_disestablish()
2941bfa2c4Scliff  *   for now they are called directly at IPL_NET
3041bfa2c4Scliff  * - reserve 'quota' descriptors; minimum is 1.
3141bfa2c4Scliff  * - 'consume' function is called for each message received
3241bfa2c4Scliff  * - 'counter' function is called to update count of
3341bfa2c4Scliff  *    of completed produced (sent) descriptors since last update
3441bfa2c4Scliff  * - 'arg' is private to the service
3541bfa2c4Scliff  * - return value is an IPM handle ('ipmh') that can be used
3641bfa2c4Scliff  *   e.g. to de-register
3741bfa2c4Scliff  * - if the 'tag' is already in use, or if 'quota' descriptors are not available,
3841bfa2c4Scliff  *   then NULL is returned.
3941bfa2c4Scliff  */
4041bfa2c4Scliff void *gemini_ipm_register(uint8_t, unsigned int, size_t,
4141bfa2c4Scliff 	void (*)(void *, const void *),
4241bfa2c4Scliff 	void (*)(void *, size_t),
4341bfa2c4Scliff 	void *);
4441bfa2c4Scliff 
4541bfa2c4Scliff /*
4641bfa2c4Scliff  * void gemini_ipm_deregister(void *ipmh);
4741bfa2c4Scliff  *
4841bfa2c4Scliff  * - tear down a service
4941bfa2c4Scliff  * - 'ipmh' is handle returned from priot call to gemini_ipm_register()
5041bfa2c4Scliff  */
5141bfa2c4Scliff void gemini_ipm_deregister(void *);
5241bfa2c4Scliff 
5341bfa2c4Scliff /*
5441bfa2c4Scliff  * void gemini_ipm_produce(const void *desc, unsigned size_t ndesc);
5541bfa2c4Scliff  *
5641bfa2c4Scliff  * - service produces (sends) 'ndesc' messages described by the array of
5741bfa2c4Scliff  *   descriptors 'desc'.
5841bfa2c4Scliff  * - if not all messages can be sent due to lack of descriptor queue resources,
59*f0a7346dSsnj  *   then the calling service has exceeded its quota and the system will panic.
6041bfa2c4Scliff  * - after return the descriptors at 'desc' revert to the caller
6141bfa2c4Scliff  *   caller can recycle or free as he likes.
6241bfa2c4Scliff  */
6341bfa2c4Scliff int gemini_ipm_produce(const void *, size_t);
6441bfa2c4Scliff 
6541bfa2c4Scliff /*
6641bfa2c4Scliff  * void gemini_ipm_copyin(void *dest, bus_addr_t ba, size_t len);
6741bfa2c4Scliff  *
6841bfa2c4Scliff  * - service copies in (receives) message 'len' bytes of data to be copied
6941bfa2c4Scliff  *   from bus address 'ba' to virtual address 'dest'
7041bfa2c4Scliff  * - this function is meant to be called from the service's registered
7141bfa2c4Scliff  *   'consume' callback function
7241bfa2c4Scliff  */
7341bfa2c4Scliff void gemini_ipm_copyin(void *, bus_addr_t, size_t);
7441bfa2c4Scliff 
7541bfa2c4Scliff 
7641bfa2c4Scliff #endif	/* _GEMINI_IPM_H_ */
77