Commit 16f62432c4985fa732c0c7dd63761b06f076a48f

Authored by bellard
1 parent 8b1f24b0

DMA API change


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@646 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 23 additions and 33 deletions
hw/dma.c
... ... @@ -39,7 +39,6 @@
39 39 #define ldebug(...)
40 40 #endif
41 41  
42   -#define MEM_REAL(addr) ((addr)+(uint32_t)(phys_ram_base))
43 42 #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
44 43  
45 44 struct dma_regs {
... ... @@ -49,8 +48,8 @@ struct dma_regs {
49 48 uint8_t page;
50 49 uint8_t dack;
51 50 uint8_t eop;
52   - DMA_read_handler read_handler;
53   - DMA_misc_handler misc_handler;
  51 + DMA_transfer_handler transfer_handler;
  52 + void *opaque;
54 53 };
55 54  
56 55 #define ADDR 0
... ... @@ -284,40 +283,27 @@ static void channel_run (int ncont, int ichan)
284 283 {
285 284 struct dma_regs *r;
286 285 int n;
287   - int irq;
288   - uint32_t addr;
  286 + target_ulong addr;
289 287 /* int ai, dir; */
290 288  
291 289 r = dma_controllers[ncont].regs + ichan;
292 290 /* ai = r->mode & 16; */
293 291 /* dir = r->mode & 32 ? -1 : 1; */
294 292  
295   - addr = MEM_REAL ((r->page << 16) | r->now[ADDR]);
296   -
297   - irq = -1;
298   - n = r->read_handler (addr, (r->base[COUNT] << ncont) + (1 << ncont), &irq);
  293 + addr = (r->page << 16) | r->now[ADDR];
  294 + n = r->transfer_handler (r->opaque, addr,
  295 + (r->base[COUNT] << ncont) + (1 << ncont));
299 296 r->now[COUNT] = n;
300 297  
301   - ldebug ("dma_pos %d irq %d size %d\n",
302   - n, irq, (r->base[1] << ncont) + (1 << ncont));
303   -
304   - if (-1 != irq) {
305   - pic_set_irq (irq, 1);
306   - }
  298 + ldebug ("dma_pos %d size %d\n",
  299 + n, (r->base[1] << ncont) + (1 << ncont));
307 300 }
308 301  
309 302 void DMA_run (void)
310 303 {
311   - static int in_dma;
312 304 struct dma_cont *d;
313 305 int icont, ichan;
314 306  
315   - if (in_dma) {
316   - log ("attempt to re-enter dma\n");
317   - return;
318   - }
319   -
320   - in_dma = 1;
321 307 d = dma_controllers;
322 308  
323 309 for (icont = 0; icont < 2; icont++, d++) {
... ... @@ -330,12 +316,11 @@ void DMA_run (void)
330 316 channel_run (icont, ichan);
331 317 }
332 318 }
333   - in_dma = 0;
334 319 }
335 320  
336 321 void DMA_register_channel (int nchan,
337   - DMA_read_handler read_handler,
338   - DMA_misc_handler misc_handler)
  322 + DMA_transfer_handler transfer_handler,
  323 + void *opaque)
339 324 {
340 325 struct dma_regs *r;
341 326 int ichan, ncont;
... ... @@ -344,8 +329,14 @@ void DMA_register_channel (int nchan,
344 329 ichan = nchan & 3;
345 330  
346 331 r = dma_controllers[ncont].regs + ichan;
347   - r->read_handler = read_handler;
348   - r->misc_handler = misc_handler;
  332 + r->transfer_handler = transfer_handler;
  333 + r->opaque = opaque;
  334 +}
  335 +
  336 +/* request the emulator to transfer a new DMA memory block ASAP */
  337 +void DMA_schedule(int nchan)
  338 +{
  339 + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
349 340 }
350 341  
351 342 void DMA_init (void)
... ...
... ... @@ -24,8 +24,9 @@
24 24 #ifndef VL_H
25 25 #define VL_H
26 26  
  27 +#include "cpu.h"
  28 +
27 29 /* vl.c */
28   -struct CPUState;
29 30 extern int reset_requested;
30 31 extern int64_t ticks_per_sec;
31 32  
... ... @@ -128,17 +129,15 @@ int AUD_get_buffer_size (void);
128 129 void AUD_init (void);
129 130  
130 131 /* dma.c */
131   -typedef int (*DMA_read_handler) (uint32_t addr, int size, int *irq);
132   -typedef int (*DMA_misc_handler) (int);
133   -
  132 +typedef int (*DMA_transfer_handler) (void *opaque, target_ulong addr, int size);
134 133 int DMA_get_channel_mode (int nchan);
135 134 void DMA_hold_DREQ (int nchan);
136 135 void DMA_release_DREQ (int nchan);
  136 +void DMA_schedule(int nchan);
137 137 void DMA_run (void);
138 138 void DMA_init (void);
139 139 void DMA_register_channel (int nchan,
140   - DMA_read_handler read_handler,
141   - DMA_misc_handler misc_handler);
  140 + DMA_transfer_handler transfer_handler, void *opaque);
142 141  
143 142 /* sb16.c */
144 143 void SB16_run (void);
... ...