#include <mips/cpuregs.h>
#define SIFDMA_BASE MIPS_PHYS_TO_KSEG1(0x1c000000)
#define EEKV_TO_IOPPHYS(a) ((u_int32_t)(a) - SIFDMA_BASE)
#define IOPPHYS_TO_EEKV(a) ((u_int32_t)(a) + SIFDMA_BASE)
void sifbios_init(void);
int sifbios_getver(void);
void sifbios_halt(int);
void sifbios_setdve(int);
void sifbios_putchar(int);
int sifbios_getchar(void);
struct sifdma_transfer {
vaddr_t src;
vaddr_t dst;
vsize_t sz;
u_int32_t mode;
#define SIFDMA_MODE_NOINTR 0x0
#define SIFDMA_MODE_INTR_SENDER 0x2
#define SIFDMA_MODE_INTR_RECEIVER 0x4
};
typedef int sifdma_id_t;
int sifdma_init(void);
void sifdma_exit(void);
sifdma_id_t sifdma_queue(struct sifdma_transfer *, int);
int sifdma_stat(sifdma_id_t);
void sifdma_reset(void);
typedef u_int32_t sifcmd_sw_t;
typedef void (*sifcmd_callback_t)(void *, void *);
struct sifcmd_callback_holder {
sifcmd_callback_t func;
void *arg;
} __attribute__((__packed__, __aligned__(4)));
int sifcmd_init(void);
void sifcmd_exit(void);
sifdma_id_t sifcmd_queue(sifcmd_sw_t, vaddr_t, size_t, vaddr_t, vaddr_t,
vsize_t);
int sifcmd_intr(void *);
void sifcmd_establish(sifcmd_sw_t, struct sifcmd_callback_holder *);
void sifcmd_disestablish(sifcmd_sw_t);
struct sifcmd_callback_holder *sifcmd_handler_init(
struct sifcmd_callback_holder *, int);
#define SIFRPC_NOWAIT 1
#define SIFRPC_NOCACHEFLUSH 2
#define SIFRPC_ERROR_GETPACKET 1
#define SIFRPC_ERROR_SENDPACKET 2
typedef u_int32_t sifrpc_id_t;
typedef u_int32_t sifrpc_callno_t;
typedef void *(*sifrpc_rpcfunc_t)(sifrpc_callno_t, void *, size_t);
typedef void (*sifrpc_endfunc_t)(void *);
struct sifrpc_header {
paddr_t packet_paddr;
u_int32_t packet_id;
void *wait_channel;
u_int32_t call_mode;
} __attribute__((__packed__, __aligned__(4)));
struct sifrpc_receive {
struct sifrpc_header hdr;
void *src;
void *dst;
size_t sz;
sifrpc_endfunc_t end_callback;
void *end_callback_arg;
} __attribute__((__packed__, __aligned__(4)));
struct sifrpc_server;
struct sifrpc_client {
struct sifrpc_header hdr;
u_int32_t command;
void *buf;
void *cbuf;
sifrpc_endfunc_t end_callback;
void *end_callback_arg;
struct sifrpc_server *server;
} __attribute__((__packed__, __aligned__(4)));
struct sifrpc_server_queue;
struct sifrpc_server {
u_int32_t command;
sifrpc_rpcfunc_t service_func;
void *buf;
size_t buf_sz;
void *cbuf;
size_t cbuf_sz;
struct sifrpc_client *client;
void *paddr;
sifrpc_callno_t callno;
void *recv;
size_t recv_sz;
int recv_mode;
u_int32_t rid;
struct sifrpc_server *link;
struct sifrpc_server *next;
struct sifrpc_server_receive_queue *head;
} __attribute__((__packed__, __aligned__(4)));
struct sifrpc_server_system {
int active;
struct sifrpc_server *link;
struct sifrpc_server *head;
struct sifrpc_server *last;
struct sifrpc_server *next;
void *wait_channel;
sifrpc_endfunc_t end_callback;
void *end_callback_arg;
} __attribute__((__packed__, __aligned__(4)));
int sifrpc_init(void);
void sifrpc_exit(void);
void sifrpc_establish(struct sifrpc_server_system *, sifrpc_endfunc_t,
void *);
void sifrpc_disestablish(struct sifrpc_server_system *);
struct sifrpc_server *sifrpc_dequeue(struct sifrpc_server_system *);
void sifrpc_register_service(struct sifrpc_server_system *,
struct sifrpc_server *, sifrpc_id_t, sifrpc_rpcfunc_t, void *,
sifrpc_rpcfunc_t, void *);
void sifrpc_unregister_service(struct sifrpc_server_system *,
struct sifrpc_server *);
void sifrpc_dispatch_service(struct sifrpc_server *);
int sifrpc_bind(struct sifrpc_client *, sifrpc_id_t, u_int32_t,
sifrpc_endfunc_t, void *);
int sifrpc_call(struct sifrpc_client *, sifrpc_callno_t, u_int32_t,
void *, size_t, void *, size_t, sifrpc_endfunc_t, void *);
int sifrpc_receive_buffer(struct sifrpc_receive *, void *, void *, size_t,
u_int32_t, sifrpc_endfunc_t, void *);
int sifrpc_stat(struct sifrpc_header *);
int iopmem_init(void);
paddr_t iopmem_alloc(psize_t);
int iopmem_free(paddr_t);