Deleted Added
full compact
ata-dma.c (71335) ata-dma.c (72106)
1/*-
2 * Copyright (c) 1998,1999,2000,2001 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 1998,1999,2000,2001 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 71335 2001-01-21 16:13:03Z sos $
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 72106 2001-02-06 16:44:25Z sos $
29 */
30
31#include "pci.h"
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/bio.h>
35#include <sys/malloc.h>
36#include <sys/bus.h>
37#include <sys/disk.h>
38#include <sys/devicestat.h>
39#include <vm/vm.h>
40#include <vm/pmap.h>
41#if NPCI > 0
42#include <pci/pcivar.h>
43#endif
44#include <machine/bus.h>
29 */
30
31#include "pci.h"
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/bio.h>
35#include <sys/malloc.h>
36#include <sys/bus.h>
37#include <sys/disk.h>
38#include <sys/devicestat.h>
39#include <vm/vm.h>
40#include <vm/pmap.h>
41#if NPCI > 0
42#include <pci/pcivar.h>
43#endif
44#include <machine/bus.h>
45#include <sys/rman.h>
45#include <dev/ata/ata-all.h>
46
47#if NPCI > 0
48
49/* prototypes */
50static void cyrix_timing(struct ata_softc *, int, int);
51static void promise_timing(struct ata_softc *, int, int);
52static void hpt_timing(struct ata_softc *, int, int);

--- 26 unchanged lines hidden (view full) ---

79{
80 device_t parent = device_get_parent(scp->dev);
81 int devno = (scp->channel << 1) + ATA_DEV(device);
82 int error;
83
84 /* set our most pessimistic default mode */
85 scp->mode[ATA_DEV(device)] = ATA_PIO;
86
46#include <dev/ata/ata-all.h>
47
48#if NPCI > 0
49
50/* prototypes */
51static void cyrix_timing(struct ata_softc *, int, int);
52static void promise_timing(struct ata_softc *, int, int);
53static void hpt_timing(struct ata_softc *, int, int);

--- 26 unchanged lines hidden (view full) ---

80{
81 device_t parent = device_get_parent(scp->dev);
82 int devno = (scp->channel << 1) + ATA_DEV(device);
83 int error;
84
85 /* set our most pessimistic default mode */
86 scp->mode[ATA_DEV(device)] = ATA_PIO;
87
87 if (!scp->bmaddr)
88 if (!scp->r_bmio)
88 return;
89
90 /* if simplex controller, only allow DMA on primary channel */
91 if (scp->channel == 1) {
89 return;
90
91 /* if simplex controller, only allow DMA on primary channel */
92 if (scp->channel == 1) {
92 outb(scp->bmaddr + ATA_BMSTAT_PORT, inb(scp->bmaddr + ATA_BMSTAT_PORT) &
93 (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE));
94 if (inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_DMA_SIMPLEX) {
93 ATA_OUTB(scp->r_bmio, ATA_BMSTAT_PORT,
94 ATA_INB(scp->r_bmio, ATA_BMSTAT_PORT) &
95 (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE));
96 if (ATA_INB(scp->r_bmio, ATA_BMSTAT_PORT) & ATA_BMSTAT_DMA_SIMPLEX) {
95 ata_printf(scp, device, "simplex device, DMA on primary only\n");
96 return;
97 }
98 }
99
100 /* DMA engine address alignment is usually 1 word (2 bytes) */
101 scp->alignment = 0x1;
102

--- 715 unchanged lines hidden (view full) ---

818 /* better not try generic DMA on ATAPI devices it almost never works */
819 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
820 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
821 break;
822
823 /* if controller says its setup for DMA take the easy way out */
824 /* the downside is we dont know what DMA mode we are in */
825 if ((udmamode >= 0 || wdmamode > 1) &&
97 ata_printf(scp, device, "simplex device, DMA on primary only\n");
98 return;
99 }
100 }
101
102 /* DMA engine address alignment is usually 1 word (2 bytes) */
103 scp->alignment = 0x1;
104

--- 715 unchanged lines hidden (view full) ---

820 /* better not try generic DMA on ATAPI devices it almost never works */
821 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
822 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
823 break;
824
825 /* if controller says its setup for DMA take the easy way out */
826 /* the downside is we dont know what DMA mode we are in */
827 if ((udmamode >= 0 || wdmamode > 1) &&
826 (inb(scp->bmaddr + ATA_BMSTAT_PORT) &
828 (ATA_INB(scp->r_bmio, ATA_BMSTAT_PORT) &
827 ((device==ATA_MASTER) ?
828 ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) {
829 scp->mode[ATA_DEV(device)] = ATA_DMA;
830 return;
831 }
832
833 /* well, we have no support for this, but try anyways */
829 ((device==ATA_MASTER) ?
830 ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) {
831 scp->mode[ATA_DEV(device)] = ATA_DMA;
832 return;
833 }
834
835 /* well, we have no support for this, but try anyways */
834 if ((wdmamode >= 2 && apiomode >= 4) && scp->bmaddr) {
836 if ((wdmamode >= 2 && apiomode >= 4) && scp->r_bmio) {
835 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
836 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
837 if (bootverbose)
838 ata_printf(scp, device,
839 "%s setting WDMA2 on generic chip\n",
840 (error) ? "failed" : "success");
841 if (!error) {
842 scp->mode[ATA_DEV(device)] = ATA_WDMA2;

--- 55 unchanged lines hidden (view full) ---

898 return 0;
899}
900
901void
902ata_dmastart(struct ata_softc *scp, int device,
903 struct ata_dmaentry *dmatab, int dir)
904{
905 scp->flags |= ATA_DMA_ACTIVE;
837 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
838 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
839 if (bootverbose)
840 ata_printf(scp, device,
841 "%s setting WDMA2 on generic chip\n",
842 (error) ? "failed" : "success");
843 if (!error) {
844 scp->mode[ATA_DEV(device)] = ATA_WDMA2;

--- 55 unchanged lines hidden (view full) ---

900 return 0;
901}
902
903void
904ata_dmastart(struct ata_softc *scp, int device,
905 struct ata_dmaentry *dmatab, int dir)
906{
907 scp->flags |= ATA_DMA_ACTIVE;
906 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab));
907 outb(scp->bmaddr + ATA_BMCMD_PORT, dir ? ATA_BMCMD_WRITE_READ : 0);
908 outb(scp->bmaddr + ATA_BMSTAT_PORT,
909 (inb(scp->bmaddr + ATA_BMSTAT_PORT) |
908 ATA_OUTL(scp->r_bmio, ATA_BMDTP_PORT, vtophys(dmatab));
909 ATA_OUTB(scp->r_bmio, ATA_BMCMD_PORT, dir ? ATA_BMCMD_WRITE_READ : 0);
910 ATA_OUTB(scp->r_bmio, ATA_BMSTAT_PORT,
911 (ATA_INB(scp->r_bmio, ATA_BMSTAT_PORT) |
910 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
912 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
911 outb(scp->bmaddr + ATA_BMCMD_PORT,
912 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
913 ATA_OUTB(scp->r_bmio, ATA_BMCMD_PORT,
914 ATA_INB(scp->r_bmio, ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
913}
914
915int
916ata_dmadone(struct ata_softc *scp)
917{
915}
916
917int
918ata_dmadone(struct ata_softc *scp)
919{
918 outb(scp->bmaddr + ATA_BMCMD_PORT,
919 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
920 int error;
921
922 ATA_OUTB(scp->r_bmio, ATA_BMCMD_PORT,
923 ATA_INB(scp->r_bmio, ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
920 scp->flags &= ~ATA_DMA_ACTIVE;
924 scp->flags &= ~ATA_DMA_ACTIVE;
921 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
925 error = ATA_INB(scp->r_bmio, ATA_BMSTAT_PORT);
926 ATA_OUTB(scp->r_bmio, ATA_BMSTAT_PORT,
927 error | ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR);
928 return error & ATA_BMSTAT_MASK;
922}
923
924int
925ata_dmastatus(struct ata_softc *scp)
926{
929}
930
931int
932ata_dmastatus(struct ata_softc *scp)
933{
927 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
934 return ATA_INB(scp->r_bmio, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
928}
929
930static void
931cyrix_timing(struct ata_softc *scp, int devno, int mode)
932{
933 u_int32_t reg20 = 0x0000e132;
934 u_int32_t reg24 = 0x00017771;
935
936 switch (mode) {
937 case ATA_PIO0: reg20 = 0x0000e132; break;
938 case ATA_PIO1: reg20 = 0x00018121; break;
939 case ATA_PIO2: reg20 = 0x00024020; break;
940 case ATA_PIO3: reg20 = 0x00032010; break;
941 case ATA_PIO4: reg20 = 0x00040010; break;
942 case ATA_WDMA2: reg24 = 0x00002020; break;
943 case ATA_UDMA2: reg24 = 0x00911030; break;
944 }
935}
936
937static void
938cyrix_timing(struct ata_softc *scp, int devno, int mode)
939{
940 u_int32_t reg20 = 0x0000e132;
941 u_int32_t reg24 = 0x00017771;
942
943 switch (mode) {
944 case ATA_PIO0: reg20 = 0x0000e132; break;
945 case ATA_PIO1: reg20 = 0x00018121; break;
946 case ATA_PIO2: reg20 = 0x00024020; break;
947 case ATA_PIO3: reg20 = 0x00032010; break;
948 case ATA_PIO4: reg20 = 0x00040010; break;
949 case ATA_WDMA2: reg24 = 0x00002020; break;
950 case ATA_UDMA2: reg24 = 0x00911030; break;
951 }
945 outl(scp->bmaddr + (devno << 3) + 0x20, reg20);
946 outl(scp->bmaddr + (devno << 3) + 0x24, reg24);
952 ATA_OUTL(scp->r_bmio, (devno << 3) + 0x20, reg20);
953 ATA_OUTL(scp->r_bmio, (devno << 3) + 0x24, reg24);
947}
948
949static void
950promise_timing(struct ata_softc *scp, int devno, int mode)
951{
952 u_int32_t timing = 0;
953 struct promise_timing {
954 u_int8_t pa:4;

--- 161 unchanged lines hidden ---
954}
955
956static void
957promise_timing(struct ata_softc *scp, int devno, int mode)
958{
959 u_int32_t timing = 0;
960 struct promise_timing {
961 u_int8_t pa:4;

--- 161 unchanged lines hidden ---