Commit f9e92e973f4a383a73363ff795a4562c3c6a7c71

Authored by bellard
1 parent 8dc75d75

use physical memory access functions for DMA


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@649 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 34 additions and 41 deletions
hw/fdc.c
@@ -26,7 +26,6 @@ @@ -26,7 +26,6 @@
26 #include <string.h> 26 #include <string.h>
27 #include <inttypes.h> 27 #include <inttypes.h>
28 28
29 -#include "cpu.h"  
30 #include "vl.h" 29 #include "vl.h"
31 30
32 /********************************************************/ 31 /********************************************************/
@@ -218,8 +217,7 @@ static void fd_reset (fdrive_t *drv) @@ -218,8 +217,7 @@ static void fd_reset (fdrive_t *drv)
218 217
219 static void fdctrl_reset (int do_irq); 218 static void fdctrl_reset (int do_irq);
220 static void fdctrl_reset_fifo (void); 219 static void fdctrl_reset_fifo (void);
221 -static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq);  
222 -static int fdctrl_misc_handler (int duknwo); 220 +static int fdctrl_transfer_handler (void *opaque, target_ulong addr, int size);
223 static void fdctrl_raise_irq (uint8_t status); 221 static void fdctrl_raise_irq (uint8_t status);
224 222
225 static uint32_t fdctrl_read_statusB (CPUState *env, uint32_t reg); 223 static uint32_t fdctrl_read_statusB (CPUState *env, uint32_t reg);
@@ -310,8 +308,7 @@ void fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, uint32_t base, @@ -310,8 +308,7 @@ void fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, uint32_t base,
310 fdctrl.config = 0x40; /* Implicit seek, polling & FIFO enabled */ 308 fdctrl.config = 0x40; /* Implicit seek, polling & FIFO enabled */
311 if (fdctrl.dma_chann != -1) { 309 if (fdctrl.dma_chann != -1) {
312 fdctrl.dma_en = 1; 310 fdctrl.dma_en = 1;
313 - DMA_register_channel(dma_chann, &fdctrl_transfer_handler,  
314 - &fdctrl_misc_handler); 311 + DMA_register_channel(dma_chann, fdctrl_transfer_handler, &fdctrl);
315 } else { 312 } else {
316 fdctrl.dma_en = 0; 313 fdctrl.dma_en = 0;
317 } 314 }
@@ -721,6 +718,7 @@ static void fdctrl_start_transfer (int direction) @@ -721,6 +718,7 @@ static void fdctrl_start_transfer (int direction)
721 * recall us... 718 * recall us...
722 */ 719 */
723 DMA_hold_DREQ(fdctrl.dma_chann); 720 DMA_hold_DREQ(fdctrl.dma_chann);
  721 + DMA_schedule(fdctrl.dma_chann);
724 return; 722 return;
725 } 723 }
726 } 724 }
@@ -749,12 +747,13 @@ static void fdctrl_start_transfer_del (int direction) @@ -749,12 +747,13 @@ static void fdctrl_start_transfer_del (int direction)
749 } 747 }
750 748
751 /* handlers for DMA transfers */ 749 /* handlers for DMA transfers */
752 -static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq) 750 +/* XXX: the partial transfer logic seems to be broken */
  751 +static int fdctrl_transfer_handler (void *opaque, target_ulong addr, int size)
753 { 752 {
754 fdrive_t *cur_drv, *drv0, *drv1; 753 fdrive_t *cur_drv, *drv0, *drv1;
755 - void *orig;  
756 int len; 754 int len;
757 uint8_t status0 = 0x00, status1 = 0x00, status2 = 0x00; 755 uint8_t status0 = 0x00, status1 = 0x00, status2 = 0x00;
  756 + uint8_t tmpbuf[FD_SECTOR_LEN];
758 757
759 fdctrl_reset_irq(); 758 fdctrl_reset_irq();
760 if (!(fdctrl.state & FD_CTRL_BUSY)) { 759 if (!(fdctrl.state & FD_CTRL_BUSY)) {
@@ -764,8 +763,6 @@ static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq) @@ -764,8 +763,6 @@ static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq)
764 drv0 = &fdctrl.drives[fdctrl.bootsel]; 763 drv0 = &fdctrl.drives[fdctrl.bootsel];
765 drv1 = &fdctrl.drives[1 - fdctrl.bootsel]; 764 drv1 = &fdctrl.drives[1 - fdctrl.bootsel];
766 cur_drv = fdctrl.cur_drv == 0 ? drv0 : drv1; 765 cur_drv = fdctrl.cur_drv == 0 ? drv0 : drv1;
767 -// *irq = fdctrl.irq_lvl;  
768 - *irq = -1;  
769 if (fdctrl.data_dir == FD_DIR_SCANE || fdctrl.data_dir == FD_DIR_SCANL || 766 if (fdctrl.data_dir == FD_DIR_SCANE || fdctrl.data_dir == FD_DIR_SCANL ||
770 fdctrl.data_dir == FD_DIR_SCANH) 767 fdctrl.data_dir == FD_DIR_SCANH)
771 status2 = 0x04; 768 status2 = 0x04;
@@ -779,35 +776,34 @@ static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq) @@ -779,35 +776,34 @@ static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq)
779 fdctrl.data_len, fdctrl.cur_drv, cur_drv->head, 776 fdctrl.data_len, fdctrl.cur_drv, cur_drv->head,
780 cur_drv->track, cur_drv->sect, fd_sector(cur_drv), 777 cur_drv->track, cur_drv->sect, fd_sector(cur_drv),
781 fd_sector(cur_drv) * 512); 778 fd_sector(cur_drv) * 512);
782 - if (len < FD_SECTOR_LEN) {  
783 - memset(&fdctrl.fifo[FD_SECTOR_LEN - len], 0,  
784 - FD_SECTOR_LEN - len - 1);  
785 - orig = fdctrl.fifo;  
786 - } else {  
787 - orig = (void *)(addr + fdctrl.data_pos);  
788 - }  
789 if (fdctrl.data_dir != FD_DIR_WRITE) { 779 if (fdctrl.data_dir != FD_DIR_WRITE) {
790 /* READ & SCAN commands */ 780 /* READ & SCAN commands */
791 if (cur_drv->bs == NULL) { 781 if (cur_drv->bs == NULL) {
792 fdctrl_stop_transfer(0x40, 0x00, 0x00); 782 fdctrl_stop_transfer(0x40, 0x00, 0x00);
793 goto transfer_error; 783 goto transfer_error;
794 } 784 }
795 -  
796 - if (bdrv_read(cur_drv->bs, fd_sector(cur_drv), orig, 1) < 0) { 785 + if (bdrv_read(cur_drv->bs, fd_sector(cur_drv), tmpbuf, 1) < 0) {
797 FLOPPY_DPRINTF("Floppy: error getting sector %d\n", 786 FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
798 fd_sector(cur_drv)); 787 fd_sector(cur_drv));
799 /* Sure, image size is too small... */ 788 /* Sure, image size is too small... */
800 - memset((void *)(addr + fdctrl.data_pos), 0, FD_SECTOR_LEN); 789 + memset(tmpbuf, 0, FD_SECTOR_LEN);
801 } 790 }
802 if (fdctrl.data_dir == FD_DIR_READ) { 791 if (fdctrl.data_dir == FD_DIR_READ) {
  792 + cpu_physical_memory_write(addr + fdctrl.data_pos,
  793 + tmpbuf, len);
803 if (len < FD_SECTOR_LEN) { 794 if (len < FD_SECTOR_LEN) {
804 - memcpy((void *)(addr + fdctrl.data_pos),  
805 - fdctrl.fifo, FD_SECTOR_LEN); 795 + memcpy(&fdctrl.fifo[0], tmpbuf + len, FD_SECTOR_LEN - len);
  796 + memset(&fdctrl.fifo[FD_SECTOR_LEN - len], 0, len);
806 } 797 }
807 } else { 798 } else {
808 int ret; 799 int ret;
809 - ret = memcmp((void *)(addr + fdctrl.data_pos),  
810 - fdctrl.fifo, FD_SECTOR_LEN); 800 + /* XXX: what to do if not enough data ? */
  801 + cpu_physical_memory_read(addr + fdctrl.data_pos,
  802 + fdctrl.fifo, len);
  803 + if (len < FD_SECTOR_LEN) {
  804 + memset(&fdctrl.fifo[len], 0, FD_SECTOR_LEN - len);
  805 + }
  806 + ret = memcmp(tmpbuf, fdctrl.fifo, FD_SECTOR_LEN);
811 if (ret == 0) { 807 if (ret == 0) {
812 status2 = 0x08; 808 status2 = 0x08;
813 goto end_transfer; 809 goto end_transfer;
@@ -820,8 +816,12 @@ static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq) @@ -820,8 +816,12 @@ static int fdctrl_transfer_handler (uint32_t addr, int size, int *irq)
820 } 816 }
821 } else { 817 } else {
822 /* WRITE commands */ 818 /* WRITE commands */
  819 + cpu_physical_memory_read(addr + fdctrl.data_pos, tmpbuf, len);
  820 + if (len < FD_SECTOR_LEN) {
  821 + memset(tmpbuf + len, 0, FD_SECTOR_LEN - len);
  822 + }
823 if (cur_drv->bs == NULL || 823 if (cur_drv->bs == NULL ||
824 - bdrv_write(cur_drv->bs, fd_sector(cur_drv), orig, 1) < 0) { 824 + bdrv_write(cur_drv->bs, fd_sector(cur_drv), tmpbuf, 1) < 0) {
825 FLOPPY_ERROR("writting sector %d\n", fd_sector(cur_drv)); 825 FLOPPY_ERROR("writting sector %d\n", fd_sector(cur_drv));
826 fdctrl_stop_transfer(0x60, 0x00, 0x00); 826 fdctrl_stop_transfer(0x60, 0x00, 0x00);
827 goto transfer_error; 827 goto transfer_error;
@@ -871,12 +871,6 @@ transfer_error: @@ -871,12 +871,6 @@ transfer_error:
871 return fdctrl.data_pos; 871 return fdctrl.data_pos;
872 } 872 }
873 873
874 -/* Unused... */  
875 -static int fdctrl_misc_handler (int duknwo)  
876 -{  
877 - return -1;  
878 -}  
879 -  
880 /* Data register : 0x05 */ 874 /* Data register : 0x05 */
881 static uint32_t fdctrl_read_data (CPUState *env, uint32_t reg) 875 static uint32_t fdctrl_read_data (CPUState *env, uint32_t reg)
882 { 876 {
hw/sb16.c
@@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
25 #include <stdlib.h> 25 #include <stdlib.h>
26 #include <inttypes.h> 26 #include <inttypes.h>
27 27
  28 +#include "cpu.h"
28 #include "vl.h" 29 #include "vl.h"
29 30
30 #define MIN(a, b) ((a)>(b)?(b):(a)) 31 #define MIN(a, b) ((a)>(b)?(b):(a))
@@ -569,6 +570,7 @@ void SB16_run (void) @@ -569,6 +570,7 @@ void SB16_run (void)
569 static int write_audio (uint32_t addr, int len, int size) 570 static int write_audio (uint32_t addr, int len, int size)
570 { 571 {
571 int temp, net; 572 int temp, net;
  573 + uint8_t tmpbuf[4096];
572 574
573 temp = size; 575 temp = size;
574 576
@@ -582,8 +584,10 @@ static int write_audio (uint32_t addr, int len, int size) @@ -582,8 +584,10 @@ static int write_audio (uint32_t addr, int len, int size)
582 left_till_end = len - dsp.dma_pos; 584 left_till_end = len - dsp.dma_pos;
583 585
584 to_copy = MIN (temp, left_till_end); 586 to_copy = MIN (temp, left_till_end);
585 -  
586 - copied = AUD_write ((void *) (addr + dsp.dma_pos), to_copy); 587 + if (to_copy > sizeof(tmpbuf))
  588 + to_copy = sizeof(tmpbuf);
  589 + cpu_physical_memory_read(addr + dsp.dma_pos, tmpbuf, to_copy);
  590 + copied = AUD_write (tmpbuf, to_copy);
587 591
588 temp -= copied; 592 temp -= copied;
589 dsp.dma_pos += copied; 593 dsp.dma_pos += copied;
@@ -601,7 +605,7 @@ static int write_audio (uint32_t addr, int len, int size) @@ -601,7 +605,7 @@ static int write_audio (uint32_t addr, int len, int size)
601 return net; 605 return net;
602 } 606 }
603 607
604 -static int SB_read_DMA (uint32_t addr, int size, int *_irq) 608 +static int SB_read_DMA (void *opaque, target_ulong addr, int size)
605 { 609 {
606 int free, till, copy, written; 610 int free, till, copy, written;
607 611
@@ -644,7 +648,7 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq) @@ -644,7 +648,7 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq)
644 mixer.regs[0x82] |= mixer.regs[0x80]; 648 mixer.regs[0x82] |= mixer.regs[0x80];
645 if (0 == noirq) { 649 if (0 == noirq) {
646 ldebug ("request irq\n"); 650 ldebug ("request irq\n");
647 - *_irq = sb.irq; 651 + pic_set_irq(sb.irq, 1);
648 } 652 }
649 653
650 if (0 == dsp.dma_auto) { 654 if (0 == dsp.dma_auto) {
@@ -663,11 +667,6 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq) @@ -663,11 +667,6 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq)
663 return dsp.dma_pos; 667 return dsp.dma_pos;
664 } 668 }
665 669
666 -static int dma_misc_handler (int moo)  
667 -{  
668 - return -1;  
669 -}  
670 -  
671 static int magic_of_irq (int irq) 670 static int magic_of_irq (int irq)
672 { 671 {
673 switch (irq) { 672 switch (irq) {
@@ -731,6 +730,6 @@ void SB16_init (void) @@ -731,6 +730,6 @@ void SB16_init (void)
731 register_ioport_read (sb.port + 0x5, 1, mixer_read, 1); 730 register_ioport_read (sb.port + 0x5, 1, mixer_read, 1);
732 register_ioport_write (sb.port + 0x5, 1, mixer_write_datab, 1); 731 register_ioport_write (sb.port + 0x5, 1, mixer_write_datab, 1);
733 732
734 - DMA_register_channel (sb.hdma, SB_read_DMA, dma_misc_handler);  
735 - DMA_register_channel (sb.dma, SB_read_DMA, dma_misc_handler); 733 + DMA_register_channel (sb.hdma, SB_read_DMA, NULL);
  734 + DMA_register_channel (sb.dma, SB_read_DMA, NULL);
736 } 735 }