1 /* $NetBSD: sifbios.h,v 1.6 2016/07/18 22:17:10 maya Exp $ */ 2 3 /*- 4 * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by UCHIYAMA Yasushi. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * PlayStation 2 SIF BIOS Version 2.0 define. 34 */ 35 36 #include <mips/cpuregs.h> 37 38 /* SIF BIOS uses SIFDMA_BASE as emulated IOP physical memory base */ 39 #define SIFDMA_BASE MIPS_PHYS_TO_KSEG1(0x1c000000) 40 #define EEKV_TO_IOPPHYS(a) ((u_int32_t)(a) - SIFDMA_BASE) 41 #define IOPPHYS_TO_EEKV(a) ((u_int32_t)(a) + SIFDMA_BASE) 42 43 void sifbios_init(void); 44 45 /* 46 * System 47 */ 48 int sifbios_getver(void); 49 void sifbios_halt(int); 50 void sifbios_setdve(int); 51 void sifbios_putchar(int); 52 int sifbios_getchar(void); 53 54 /* 55 * SIFDMA 56 */ 57 struct sifdma_transfer { 58 vaddr_t src; /* (EE) 16byte align */ 59 vaddr_t dst; /* (IOP) 4byte align */ 60 vsize_t sz; /* multiple of 16 */ 61 u_int32_t mode; 62 #define SIFDMA_MODE_NOINTR 0x0 63 #define SIFDMA_MODE_INTR_SENDER 0x2 64 #define SIFDMA_MODE_INTR_RECEIVER 0x4 65 }; 66 typedef int sifdma_id_t; 67 68 int sifdma_init(void); 69 void sifdma_exit(void); 70 sifdma_id_t sifdma_queue(struct sifdma_transfer *, int); 71 int sifdma_stat(sifdma_id_t); 72 void sifdma_reset(void); 73 74 /* 75 * SIFCMD 76 */ 77 typedef u_int32_t sifcmd_sw_t; 78 typedef void (*sifcmd_callback_t)(void *, void *); 79 struct sifcmd_callback_holder { 80 sifcmd_callback_t func; 81 void *arg; 82 } __attribute__((__packed__, __aligned__(4))); 83 84 int sifcmd_init(void); 85 void sifcmd_exit(void); 86 sifdma_id_t sifcmd_queue(sifcmd_sw_t, vaddr_t, size_t, vaddr_t, vaddr_t, 87 vsize_t); 88 int sifcmd_intr(void *); 89 void sifcmd_establish(sifcmd_sw_t, struct sifcmd_callback_holder *); 90 void sifcmd_disestablish(sifcmd_sw_t); 91 struct sifcmd_callback_holder *sifcmd_handler_init( 92 struct sifcmd_callback_holder *, int); 93 94 /* 95 * SIFRPC 96 */ 97 #define SIFRPC_NOWAIT 1 98 #define SIFRPC_NOCACHEFLUSH 2 99 100 #define SIFRPC_ERROR_GETPACKET 1 101 #define SIFRPC_ERROR_SENDPACKET 2 102 103 /* RPC identifier */ 104 typedef u_int32_t sifrpc_id_t; 105 /* service # */ 106 typedef u_int32_t sifrpc_callno_t; 107 /* server service function */ 108 typedef void *(*sifrpc_rpcfunc_t)(sifrpc_callno_t, void *, size_t); 109 /* callback when RPC service done. */ 110 typedef void (*sifrpc_endfunc_t)(void *); 111 112 /* sifrpc common header */ 113 struct sifrpc_header { 114 paddr_t packet_paddr; 115 u_int32_t packet_id; 116 void *wait_channel; 117 u_int32_t call_mode; 118 } __attribute__((__packed__, __aligned__(4))); 119 120 /* receive RPC call */ 121 struct sifrpc_receive { 122 struct sifrpc_header hdr; 123 void *src; 124 void *dst; 125 size_t sz; 126 sifrpc_endfunc_t end_callback; 127 void *end_callback_arg; 128 } __attribute__((__packed__, __aligned__(4))); 129 130 /* client */ 131 struct sifrpc_server; 132 133 struct sifrpc_client { 134 struct sifrpc_header hdr; 135 u_int32_t command; 136 void *buf; 137 void *cbuf; 138 sifrpc_endfunc_t end_callback; 139 void *end_callback_arg; 140 struct sifrpc_server *server; 141 } __attribute__((__packed__, __aligned__(4))); 142 143 /* server */ 144 struct sifrpc_server_queue; 145 146 struct sifrpc_server { 147 u_int32_t command; 148 sifrpc_rpcfunc_t service_func; 149 void *buf; 150 size_t buf_sz; 151 void *cbuf; 152 size_t cbuf_sz; 153 struct sifrpc_client *client; 154 void *paddr; 155 sifrpc_callno_t callno; 156 void *recv; 157 size_t recv_sz; 158 int recv_mode; 159 u_int32_t rid; 160 struct sifrpc_server *link; 161 struct sifrpc_server *next; 162 struct sifrpc_server_receive_queue *head; 163 } __attribute__((__packed__, __aligned__(4))); 164 165 /* server request queue */ 166 struct sifrpc_server_system { 167 int active; 168 struct sifrpc_server *link; 169 struct sifrpc_server *head; 170 struct sifrpc_server *last; 171 struct sifrpc_server *next; 172 void *wait_channel; 173 sifrpc_endfunc_t end_callback; 174 void *end_callback_arg; 175 } __attribute__((__packed__, __aligned__(4))); 176 177 int sifrpc_init(void); 178 void sifrpc_exit(void); 179 /* 180 * Server side 181 */ 182 /* register/unregister receive queue to RPC system */ 183 void sifrpc_establish(struct sifrpc_server_system *, sifrpc_endfunc_t, 184 void *); 185 void sifrpc_disestablish(struct sifrpc_server_system *); 186 /* queue access */ 187 struct sifrpc_server *sifrpc_dequeue(struct sifrpc_server_system *); 188 189 /* register/unregister service function to receive queue */ 190 void sifrpc_register_service(struct sifrpc_server_system *, 191 struct sifrpc_server *, sifrpc_id_t, sifrpc_rpcfunc_t, void *, 192 sifrpc_rpcfunc_t, void *); 193 void sifrpc_unregister_service(struct sifrpc_server_system *, 194 struct sifrpc_server *); 195 /* execute service */ 196 void sifrpc_dispatch_service(struct sifrpc_server *); 197 198 /* 199 * Client side 200 */ 201 int sifrpc_bind(struct sifrpc_client *, sifrpc_id_t, u_int32_t, 202 sifrpc_endfunc_t, void *); 203 int sifrpc_call(struct sifrpc_client *, sifrpc_callno_t, u_int32_t, 204 void *, size_t, void *, size_t, sifrpc_endfunc_t, void *); 205 206 /* simple transfer API */ 207 int sifrpc_receive_buffer(struct sifrpc_receive *, void *, void *, size_t, 208 u_int32_t, sifrpc_endfunc_t, void *); 209 210 /* check DMA state */ 211 int sifrpc_stat(struct sifrpc_header *); 212 213 /* 214 * IOP memory management 215 */ 216 int iopmem_init(void); 217 paddr_t iopmem_alloc(psize_t); 218 int iopmem_free(paddr_t); 219 220