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