Commit 16f62432c4985fa732c0c7dd63761b06f076a48f
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,7 +39,6 @@ | ||
| 39 | #define ldebug(...) | 39 | #define ldebug(...) |
| 40 | #endif | 40 | #endif |
| 41 | 41 | ||
| 42 | -#define MEM_REAL(addr) ((addr)+(uint32_t)(phys_ram_base)) | ||
| 43 | #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0]))) | 42 | #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0]))) |
| 44 | 43 | ||
| 45 | struct dma_regs { | 44 | struct dma_regs { |
| @@ -49,8 +48,8 @@ struct dma_regs { | @@ -49,8 +48,8 @@ struct dma_regs { | ||
| 49 | uint8_t page; | 48 | uint8_t page; |
| 50 | uint8_t dack; | 49 | uint8_t dack; |
| 51 | uint8_t eop; | 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 | #define ADDR 0 | 55 | #define ADDR 0 |
| @@ -284,40 +283,27 @@ static void channel_run (int ncont, int ichan) | @@ -284,40 +283,27 @@ static void channel_run (int ncont, int ichan) | ||
| 284 | { | 283 | { |
| 285 | struct dma_regs *r; | 284 | struct dma_regs *r; |
| 286 | int n; | 285 | int n; |
| 287 | - int irq; | ||
| 288 | - uint32_t addr; | 286 | + target_ulong addr; |
| 289 | /* int ai, dir; */ | 287 | /* int ai, dir; */ |
| 290 | 288 | ||
| 291 | r = dma_controllers[ncont].regs + ichan; | 289 | r = dma_controllers[ncont].regs + ichan; |
| 292 | /* ai = r->mode & 16; */ | 290 | /* ai = r->mode & 16; */ |
| 293 | /* dir = r->mode & 32 ? -1 : 1; */ | 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 | r->now[COUNT] = n; | 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 | void DMA_run (void) | 302 | void DMA_run (void) |
| 310 | { | 303 | { |
| 311 | - static int in_dma; | ||
| 312 | struct dma_cont *d; | 304 | struct dma_cont *d; |
| 313 | int icont, ichan; | 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 | d = dma_controllers; | 307 | d = dma_controllers; |
| 322 | 308 | ||
| 323 | for (icont = 0; icont < 2; icont++, d++) { | 309 | for (icont = 0; icont < 2; icont++, d++) { |
| @@ -330,12 +316,11 @@ void DMA_run (void) | @@ -330,12 +316,11 @@ void DMA_run (void) | ||
| 330 | channel_run (icont, ichan); | 316 | channel_run (icont, ichan); |
| 331 | } | 317 | } |
| 332 | } | 318 | } |
| 333 | - in_dma = 0; | ||
| 334 | } | 319 | } |
| 335 | 320 | ||
| 336 | void DMA_register_channel (int nchan, | 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 | struct dma_regs *r; | 325 | struct dma_regs *r; |
| 341 | int ichan, ncont; | 326 | int ichan, ncont; |
| @@ -344,8 +329,14 @@ void DMA_register_channel (int nchan, | @@ -344,8 +329,14 @@ void DMA_register_channel (int nchan, | ||
| 344 | ichan = nchan & 3; | 329 | ichan = nchan & 3; |
| 345 | 330 | ||
| 346 | r = dma_controllers[ncont].regs + ichan; | 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 | void DMA_init (void) | 342 | void DMA_init (void) |
vl.h
| @@ -24,8 +24,9 @@ | @@ -24,8 +24,9 @@ | ||
| 24 | #ifndef VL_H | 24 | #ifndef VL_H |
| 25 | #define VL_H | 25 | #define VL_H |
| 26 | 26 | ||
| 27 | +#include "cpu.h" | ||
| 28 | + | ||
| 27 | /* vl.c */ | 29 | /* vl.c */ |
| 28 | -struct CPUState; | ||
| 29 | extern int reset_requested; | 30 | extern int reset_requested; |
| 30 | extern int64_t ticks_per_sec; | 31 | extern int64_t ticks_per_sec; |
| 31 | 32 | ||
| @@ -128,17 +129,15 @@ int AUD_get_buffer_size (void); | @@ -128,17 +129,15 @@ int AUD_get_buffer_size (void); | ||
| 128 | void AUD_init (void); | 129 | void AUD_init (void); |
| 129 | 130 | ||
| 130 | /* dma.c */ | 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 | int DMA_get_channel_mode (int nchan); | 133 | int DMA_get_channel_mode (int nchan); |
| 135 | void DMA_hold_DREQ (int nchan); | 134 | void DMA_hold_DREQ (int nchan); |
| 136 | void DMA_release_DREQ (int nchan); | 135 | void DMA_release_DREQ (int nchan); |
| 136 | +void DMA_schedule(int nchan); | ||
| 137 | void DMA_run (void); | 137 | void DMA_run (void); |
| 138 | void DMA_init (void); | 138 | void DMA_init (void); |
| 139 | void DMA_register_channel (int nchan, | 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 | /* sb16.c */ | 142 | /* sb16.c */ |
| 144 | void SB16_run (void); | 143 | void SB16_run (void); |