11#include "acram_internal.h"
13static int ram_dma_xfer(
acDmaT dma,
int intr, acDmaOp op);
14static void ram_dma_done(
acDmaT dma);
15static void ram_dma_error(
acDmaT dma,
int intr, acDmaState state,
int result);
17static acUint32 Ram_limits[] = {0x2000000, 0x4000000, 0x4000000};
18static const acDmaOpsData ops_22 = {&ram_dma_xfer, &ram_dma_done, &ram_dma_error};
21static int ram_dma_xfer(
acDmaT dma,
int intr, acDmaOp op)
44 if ( dmatmp->addr < Ram_limits[v5] )
47 if ( (
unsigned int)i >= 3 )
54 output = dmatmp->addr & 1;
55 addr = dmatmp->addr - output;
58 v10 = Ram_limits[bank];
59 if ( addr + size >= v10 )
64 ramreg = (acRamReg)(v11 + 0xB4000000);
65 dmatmp->result = size;
67 *(acUint16 *)((size & 0x7FC) + v11 + 0xB4000000 + 0x20000) = size >> 11;
68 ioaddr = (
void *)(v11 + 0xB4000000 + 0x100000);
70 addr -= Ram_limits[bank - 1];
75 *(acRamReg)((
char *)ramreg + (addr & 0x7FC) + v16) = addr >> 11;
76 return op(dma, ioaddr, buf, size);
79static void ram_dma_done(
acDmaT dma)
91static void ram_dma_error(
acDmaT dma,
int intr, acDmaState state,
int result)
98 dmatmp->result = result;
107 Kprintf(
"acram:dma_error: state=%d ret=%d\n", state, result);
119 count = ram->r_count;
120 r_addr = ram->r_addr;
123 r_buf = (acUint8 *)ram->r_buf;
127 for ( ramc->buf = r_buf;
count > 0; ramc->buf = &buf[ret] )
132 dma = acDmaSetup(&ramc->dma, (
acDmaOpsData *)&ops_22, 7, 64, output);
133 CancelWakeupThread(0);
134 ret = acDmaRequest(dma);
146 ramc->addr = addr + ret;
151static void ram_thread(
void *arg)
164 qh = &argt->requestq;
165 thid = GetThreadId();
171 if ( qh != qh->q_next )
176 ret = ram_dma_request(argt, ram);
178 q_next = ram->r_chain.q_next;
179 q_prev = ram->r_chain.q_prev;
180 q_prev->q_next = q_next;
181 q_next->q_prev = q_prev;
183 r_done = ram->r_done;
185 r_done(ram, ram->r_arg, ret);
191 if ( thid != argt->thid )
200 ram->r_tmout = tmout;
207static int ram_request(
acRamT ram, acRamAddr addr,
void *buf,
int count,
int (*wakeup)(
int thid),
int out)
219 if ( (addr & 3) != 0 )
223 if ( ((uiptr)buf & 3) != 0 )
232 ram->r_count =
count;
233 ram->r_addr = addr | out;
238 if ( Ramc.requestq.q_next != &Ramc.requestq )
240 out_v8 = Ramc.requestq.q_prev;
241 ram->r_chain.q_next = &Ramc.requestq;
242 ram->r_chain.q_prev = out_v8;
243 out_v8->q_next = &ram->r_chain;
244 Ramc.requestq.q_prev = &ram->r_chain;
261int acRamRead(
acRamT ram, acRamAddr addr,
void *buf,
int count)
263 return ram_request(ram, addr, buf,
count, WakeupThread, 0);
266int acRamReadI(
acRamT ram, acRamAddr addr,
void *buf,
int count)
268 return ram_request(ram, addr, buf,
count, iWakeupThread, 0);
271int acRamWrite(
acRamT ram, acRamAddr addr,
void *buf,
int count)
273 return ram_request(ram, addr, buf,
count, WakeupThread, 1);
276int acRamWriteI(
acRamT ram, acRamAddr addr,
void *buf,
int count)
278 return ram_request(ram, addr, buf,
count, iWakeupThread, 1);
281static int ram_thread_init(
struct ram_softc *ramc,
int prio)
286 param.attr = 0x2000000;
287 param.thread = ram_thread;
288 param.priority = prio;
289 param.stacksize = 0x800;
291 th = CreateThread(¶m);
293 StartThread(th, ramc);
297static unsigned int ram_refresh(
void *arg)
302 return argt->refresh;
305int acRamModuleStart(
int argc,
char **argv)
320 if ( acRamModuleStatus() != 0 )
327 while ( index < argc )
336 value = strtol(opt_v7, &next, 0);
337 if ( next != opt_v7 )
345 *((
volatile acUint16 *)0xB2416012) = 0;
346 Ramc.requestq.q_prev = &Ramc.requestq;
347 Ramc.requestq.q_next = &Ramc.requestq;
356 if ( (*((
volatile acUint16 *)0xB241C000) & 0x1000) == 0 )
362 *((
volatile acUint16 *)0xB4640000) = 0;
363 ChangeThreadPriority(0, 123);
364 USec2SysClock(0x411Bu, &v16);
365 Ramc.refresh = v16.lo;
366 ret = SetAlarm(&v16, ram_refresh, &Ramc);
373 ret = ram_thread_init(&Ramc, prio);
376 CancelAlarm(ram_refresh, &Ramc);
385 printf(
"acram:module: %s: error %d\n", msg, ret);
394 if ( !acRamModuleStatus() )
397 *((
volatile acUint16 *)0xB2416010) = 0;
404 for ( i = 1000;; i = 1000000 )
409 ret = DeleteThread(thid);
412 printf(
"acram:term_thread: DELETE ret=%d\n", ret);
415 ret_v3 = CancelAlarm(ram_refresh, &Ramc);
421int acRamModuleRestart(
int argc,
char **argv)
429int acRamModuleStatus()
438 if ( Ramc.requestq.q_next == &Ramc.requestq )
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
u32 count
start sector of fragmented bd/file