ata-dma.c (50477) | ata-dma.c (51520) |
---|---|
1/*- 2 * Copyright (c) 1998,1999 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 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 50477 1999-08-28 01:08:13Z peter $ | 28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 51520 1999-09-21 19:50:40Z sos $ |
29 */ 30 31#include "ata.h" 32#include "pci.h" | 29 */ 30 31#include "ata.h" 32#include "pci.h" |
33#include "apm.h" 34 |
|
33#if NATA > 0 | 35#if NATA > 0 |
36 |
|
34#include <sys/param.h> 35#include <sys/systm.h> 36#include <sys/kernel.h> 37#include <sys/buf.h> 38#include <sys/malloc.h> 39#include <sys/bus.h> | 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> 40#include <sys/buf.h> 41#include <sys/malloc.h> 42#include <sys/bus.h> |
40#include <vm/vm.h> | 43#include <vm/vm.h> |
41#include <vm/pmap.h> 42#if NPCI > 0 43#include <pci/pcivar.h> 44#include <pci/pcireg.h> 45#endif | 44#include <vm/pmap.h> 45#if NPCI > 0 46#include <pci/pcivar.h> 47#include <pci/pcireg.h> 48#endif |
49#if NAPM > 0 50#include <machine/apm_bios.h> 51#endif |
|
46#include <dev/ata/ata-all.h> 47 48#ifdef __alpha__ 49#undef vtophys | 52#include <dev/ata/ata-all.h> 53 54#ifdef __alpha__ 55#undef vtophys |
50#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)va) | 56#define vtophys(va) alpha_XXX_dmamap((vm_offset_t)va) |
51#endif 52 53/* misc defines */ 54#define MIN(a,b) ((a)>(b)?(b):(a)) 55 56#if NPCI > 0 57 58int32_t 59ata_dmainit(struct ata_softc *scp, int32_t device, 60 int32_t apiomode, int32_t wdmamode, int32_t udmamode) 61{ 62 int32_t type, devno, error; 63 void *dmatab; 64 65 if (!scp->bmaddr) 66 return -1; | 57#endif 58 59/* misc defines */ 60#define MIN(a,b) ((a)>(b)?(b):(a)) 61 62#if NPCI > 0 63 64int32_t 65ata_dmainit(struct ata_softc *scp, int32_t device, 66 int32_t apiomode, int32_t wdmamode, int32_t udmamode) 67{ 68 int32_t type, devno, error; 69 void *dmatab; 70 71 if (!scp->bmaddr) 72 return -1; |
67#ifdef ATA_DEBUGDMA | 73#ifdef ATA_DMADEBUG |
68 printf("ata%d: dmainit: ioaddr=0x%x altioaddr=0x%x, bmaddr=0x%x\n", 69 scp->lun, scp->ioaddr, scp->altioaddr, scp->bmaddr); 70#endif 71 72 if (!(dmatab = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT))) | 74 printf("ata%d: dmainit: ioaddr=0x%x altioaddr=0x%x, bmaddr=0x%x\n", 75 scp->lun, scp->ioaddr, scp->altioaddr, scp->bmaddr); 76#endif 77 78 if (!(dmatab = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT))) |
73 return -1; | 79 return -1; |
74 75 if (((uintptr_t)dmatab >> PAGE_SHIFT) ^ 76 (((uintptr_t)dmatab + PAGE_SIZE - 1) >> PAGE_SHIFT)) { | 80 81 if (((uintptr_t)dmatab >> PAGE_SHIFT) ^ 82 (((uintptr_t)dmatab + PAGE_SIZE - 1) >> PAGE_SHIFT)) { |
77 printf("ata_dmainit: dmatab crosses page boundary, no DMA\n"); 78 free(dmatab, M_DEVBUF); 79 return -1; | 83 printf("ata_dmainit: dmatab crosses page boundary, no DMA\n"); 84 free(dmatab, M_DEVBUF); 85 return -1; |
80 } | 86 } |
81 scp->dmatab[device ? 1 : 0] = dmatab; | 87 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab; |
82 | 88 |
83 type = pci_get_devid(scp->dev); | 89 switch (type = pci_get_devid(scp->dev)) { |
84 | 90 |
85 switch(type) { 86 | |
87 case 0x71118086: /* Intel PIIX4 */ 88 if (udmamode >= 2) { | 91 case 0x71118086: /* Intel PIIX4 */ 92 if (udmamode >= 2) { |
89 int32_t mask48, new48; | 93 int32_t mask48, new48; |
90 | 94 |
91 printf("ata%d: %s: setting up UDMA2 mode on PIIX4 chip ", 92 scp->lun, (device) ? "slave" : "master"); | |
93 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 95 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
94 ATA_UDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 95 if (error) { 96 printf("failed\n"); | 96 ATA_UDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 97 if (bootverbose) 98 printf("ata%d: %s: %s setting up UDMA2 mode on PIIX4 chip\n", 99 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 100 (error) ? "failed" : "success"); 101 if (error) |
97 break; | 102 break; |
98 } 99 printf("OK\n"); 100 devno = (scp->unit << 1) + (device ? 1 : 0); | 103 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); |
101 mask48 = (1 << devno) + (3 << (16 + (devno << 2))); 102 new48 = (1 << devno) + (2 << (16 + (devno << 2))); | 104 mask48 = (1 << devno) + (3 << (16 + (devno << 2))); 105 new48 = (1 << devno) + (2 << (16 + (devno << 2))); |
103 pci_write_config(scp->dev, 0x48, | 106 pci_write_config(scp->dev, 0x48, |
104 (pci_read_config(scp->dev, 0x48, 4) & 105 ~mask48) | new48, 4); | 107 (pci_read_config(scp->dev, 0x48, 4) & 108 ~mask48) | new48, 4); |
109 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA33; |
|
106 return 0; 107 } 108 /* FALLTHROUGH */ 109 110 case 0x70108086: /* Intel PIIX3 */ 111 if (wdmamode >= 2 && apiomode >= 4) { 112 int32_t mask40, new40, mask44, new44; 113 114 /* if SITRE not set doit for both channels */ 115 if (!((pci_read_config(scp->dev, 0x40, 4)>>(scp->unit<<8))&0x4000)){ | 110 return 0; 111 } 112 /* FALLTHROUGH */ 113 114 case 0x70108086: /* Intel PIIX3 */ 115 if (wdmamode >= 2 && apiomode >= 4) { 116 int32_t mask40, new40, mask44, new44; 117 118 /* if SITRE not set doit for both channels */ 119 if (!((pci_read_config(scp->dev, 0x40, 4)>>(scp->unit<<8))&0x4000)){ |
116 new40 = pci_read_config(scp->dev, 0x40, 4); 117 new44 = pci_read_config(scp->dev, 0x44, 4); 118 if (!(new40 & 0x00004000)) { 119 new44 &= ~0x0000000f; 120 new44 |= ((new40&0x00003000)>>10)|((new40&0x00000300)>>8); 121 } 122 if (!(new40 & 0x40000000)) { 123 new44 &= ~0x000000f0; 124 new44 |= ((new40&0x30000000)>>22)|((new40&0x03000000)>>20); 125 } 126 new40 |= 0x40004000; 127 pci_write_config(scp->dev, 0x40, new40, 4); 128 pci_write_config(scp->dev, 0x44, new44, 4); | 120 new40 = pci_read_config(scp->dev, 0x40, 4); 121 new44 = pci_read_config(scp->dev, 0x44, 4); 122 if (!(new40 & 0x00004000)) { 123 new44 &= ~0x0000000f; 124 new44 |= ((new40&0x00003000)>>10)|((new40&0x00000300)>>8); 125 } 126 if (!(new40 & 0x40000000)) { 127 new44 &= ~0x000000f0; 128 new44 |= ((new40&0x30000000)>>22)|((new40&0x03000000)>>20); 129 } 130 new40 |= 0x40004000; 131 pci_write_config(scp->dev, 0x40, new40, 4); 132 pci_write_config(scp->dev, 0x44, new44, 4); |
129 } | 133 } |
130 printf("ata%d: %s: setting up WDMA2 mode on PIIX3/4 chip ", 131 scp->lun, (device) ? "slave" : "master"); | |
132 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 134 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
133 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 134 if (error) { 135 printf("failed\n"); | 135 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 136 if (bootverbose) 137 printf("ata%d: %s: %s setting up WDMA2 mode on PIIX4 chip\n", 138 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 139 (error) ? "failed" : "success"); 140 if (error) |
136 break; | 141 break; |
142 if (device == ATA_MASTER) { 143 mask40 = 0x0000330f; 144 new40 = 0x00002307; 145 mask44 = 0; 146 new44 = 0; 147 } else { 148 mask40 = 0x000000f0; 149 new40 = 0x00000070; 150 mask44 = 0x0000000f; 151 new44 = 0x0000000b; |
|
137 } | 152 } |
138 printf("OK\n"); 139 if (device == ATA_MASTER) { 140 mask40 = 0x0000330f; 141 new40 = 0x00002307; 142 mask44 = 0; 143 new44 = 0; 144 } else { 145 mask40 = 0x000000f0; 146 new40 = 0x00000070; 147 mask44 = 0x0000000f; 148 new44 = 0x0000000b; 149 } 150 if (scp->unit) { 151 mask40 <<= 16; 152 new40 <<= 16; 153 mask44 <<= 4; 154 new44 <<= 4; 155 } 156 pci_write_config(scp->dev, 0x40, 157 (pci_read_config(scp->dev, 0x40, 4) & 158 ~mask40) | new40, 4); 159 pci_write_config(scp->dev, 0x44, 160 (pci_read_config(scp->dev, 0x44, 4) & 161 ~mask44) | new44, 4); | 153 if (scp->unit) { 154 mask40 <<= 16; 155 new40 <<= 16; 156 mask44 <<= 4; 157 new44 <<= 4; 158 } 159 pci_write_config(scp->dev, 0x40, 160 (pci_read_config(scp->dev, 0x40, 4) & ~mask40) | 161 new40, 4); 162 pci_write_config(scp->dev, 0x44, 163 (pci_read_config(scp->dev, 0x44, 4) & ~mask44) | 164 new44, 4); 165 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_DMA; |
162 return 0; | 166 return 0; |
163 } | 167 } |
164 break; 165 166 case 0x12308086: /* Intel PIIX */ 167 /* probably not worth the trouble */ 168 break; 169 170 case 0x4d33105a: /* Promise Ultra/33 / FastTrack controllers */ 171 case 0x4d38105a: /* Promise Ultra/66 controllers */ | 168 break; 169 170 case 0x12308086: /* Intel PIIX */ 171 /* probably not worth the trouble */ 172 break; 173 174 case 0x4d33105a: /* Promise Ultra/33 / FastTrack controllers */ 175 case 0x4d38105a: /* Promise Ultra/66 controllers */ |
172 /* the promise seems to have trouble with DMA on ATAPI devices */ | 176 /* the Promise can only do DMA on ATA disks not on ATAPI devices */ |
173 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 174 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) 175 break; 176 | 177 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 178 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) 179 break; 180 |
177 devno = (scp->unit << 1) + (device ? 1 : 0); | 181 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); 182 if (udmamode >=4 && type == 0x4d38105a) { 183 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 184 ATA_UDMA4, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 185 if (bootverbose) 186 printf("ata%d: %s: %s setting up UDMA4 mode on Promise chip\n", 187 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 188 (error) ? "failed" : "success"); 189 if (error) 190 break; 191 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004117f3, 4); 192 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA66; 193 return 0; 194 } 195 |
178 if (udmamode >=2) { | 196 if (udmamode >=2) { |
179 printf("ata%d: %s: setting up UDMA2 mode on Promise chip ", 180 scp->lun, (device) ? "slave" : "master"); | |
181 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 197 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
182 ATA_UDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 183 if (error) { 184 printf("failed\n"); | 198 ATA_UDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 199 if (bootverbose) 200 printf("ata%d: %s: %s setting up UDMA2 mode on Promise chip\n", 201 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 202 (error) ? "failed" : "success"); 203 if (error) |
185 break; | 204 break; |
186 } 187 printf("OK\n"); | |
188 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4); | 205 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4); |
206 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA33; |
|
189 return 0; 190 } 191 else if (wdmamode >= 2 && apiomode >= 4) { | 207 return 0; 208 } 209 else if (wdmamode >= 2 && apiomode >= 4) { |
192 printf("ata%d: %s: setting up WDMA2 mode on Promise chip ", 193 scp->lun, (device) ? "slave" : "master"); | |
194 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 210 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
195 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 196 if (error) { 197 printf("failed\n"); | 211 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 212 if (bootverbose) 213 printf("ata%d: %s: %s setting up WDMA2 mode on Promise chip\n", 214 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 215 (error) ? "failed" : "success"); 216 if (error) |
198 break; | 217 break; |
199 } 200 printf("OK\n"); | |
201 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4); | 218 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4); |
219 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_DMA; |
|
202 return 0; | 220 return 0; |
203 } | 221 } |
204 else { | 222 else { |
205 printf("ata%d: %s: setting up PIO mode on Promise chip OK\n", 206 scp->lun, (device) ? "slave" : "master"); | 223 if (bootverbose) 224 printf("ata%d: %s: setting PIO mode on Promise chip\n", 225 scp->lun, (device == ATA_MASTER) ? "master" : "slave"); |
207 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4); 208 } 209 break; 210 211 case 0x522910b9: /* AcerLabs Aladdin IV/V */ | 226 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4); 227 } 228 break; 229 230 case 0x522910b9: /* AcerLabs Aladdin IV/V */ |
231 /* the Aladdin has to be setup specially for ATAPI devices */ 232 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 233 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) { 234 int8_t word53 = pci_read_config(scp->dev, 0x53, 1); 235 236 /* if needed set atapi fifo & dma */ 237 if ((udmamode >=2) || (wdmamode >= 2 && apiomode >= 4)) { 238 pci_write_config(scp->dev, 0x53, word53 | 0x03, 1); 239 scp->flags |= ATA_ATAPI_DMA_RO; 240 if (device == ATA_MASTER) 241 outb(scp->bmaddr + ATA_BMSTAT_PORT, 242 inb(scp->bmaddr + ATA_BMSTAT_PORT) | 243 ATA_BMSTAT_DMA_MASTER); 244 else 245 outb(scp->bmaddr + ATA_BMSTAT_PORT, 246 inb(scp->bmaddr + ATA_BMSTAT_PORT) | 247 ATA_BMSTAT_DMA_SLAVE); 248 } 249 else { 250 pci_write_config(scp->dev, 0x53, (word53 & ~0x01) | 0x02, 1); 251 } 252 } |
|
212 if (udmamode >=2) { 213 int32_t word54 = pci_read_config(scp->dev, 0x54, 4); 214 | 253 if (udmamode >=2) { 254 int32_t word54 = pci_read_config(scp->dev, 0x54, 4); 255 |
215 printf("ata%d: %s: setting up UDMA2 mode on Aladdin chip ", 216 scp->lun, (device) ? "slave" : "master"); | |
217 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 256 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
218 ATA_UDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 219 if (error) { 220 printf("failed\n"); | 257 ATA_UDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 258 if (bootverbose) 259 printf("ata%d: %s: %s setting up UDMA2 mode on Aladdin chip\n", 260 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 261 (error) ? "failed" : "success"); 262 if (error) |
221 break; | 263 break; |
222 } 223 printf("OK\n"); | |
224 word54 |= 0x5555; | 264 word54 |= 0x5555; |
225 word54 |= (0x0000000A << (16 + (scp->unit << 3) + (device << 2))); | 265 word54 |= (0x0a << (16 + (scp->unit << 3) + (device << 2))); |
226 pci_write_config(scp->dev, 0x54, word54, 4); | 266 pci_write_config(scp->dev, 0x54, word54, 4); |
267 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA33; |
|
227 return 0; 228 229 } 230 else if (wdmamode >= 2 && apiomode >= 4) { | 268 return 0; 269 270 } 271 else if (wdmamode >= 2 && apiomode >= 4) { |
231 printf("ata%d: %s: setting up WDMA2 mode on Aladdin chip ", 232 scp->lun, (device) ? "slave" : "master"); | |
233 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 272 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
234 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 235 if (error) { 236 printf("failed\n"); | 273 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 274 if (bootverbose) 275 printf("ata%d: %s: %s setting up WDMA2 mode on Aladdin chip\n", 276 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 277 (error) ? "failed" : "success"); 278 if (error) |
237 break; | 279 break; |
238 } 239 printf("OK\n"); | 280 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_DMA; |
240 return 0; 241 } 242 break; 243 244 default: /* well, we have no support for this, but try anyways */ | 281 return 0; 282 } 283 break; 284 285 default: /* well, we have no support for this, but try anyways */ |
245 if ((wdmamode >= 2 && apiomode >= 4) || udmamode >= 2) { 246 printf("ata%d: %s: setting up generic WDMA2 mode ", 247 scp->lun, (device) ? "slave" : "master"); | 286 if (((wdmamode >= 2 && apiomode >= 4) || udmamode >= 2) && 287 (inb(scp->bmaddr + ATA_BMSTAT_PORT) & 288 ((device == ATA_MASTER) ? 289 ATA_BMSTAT_DMA_SLAVE : ATA_BMSTAT_DMA_MASTER))) { |
248 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, | 290 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, |
249 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_WAIT_INTR); 250 if (error) { 251 printf("failed\n"); | 291 ATA_WDMA2, ATA_C_FEA_SETXFER, ATA_IGNORE_INTR); 292 if (bootverbose) 293 printf("ata%d: %s: %s setting up WDMA2 mode on generic chip\n", 294 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 295 (error) ? "failed" : "success"); 296 if (error) |
252 break; | 297 break; |
253 } 254 printf("OK\n"); | 298 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_DMA; |
255 return 0; 256 } 257 } 258 free(dmatab, M_DEVBUF); 259 return -1; 260} 261 262int32_t 263ata_dmasetup(struct ata_softc *scp, int32_t device, 264 int8_t *data, int32_t count, int32_t flags) 265{ 266 struct ata_dmaentry *dmatab; 267 u_int32_t dma_count, dma_base; 268 int32_t i = 0; 269 | 299 return 0; 300 } 301 } 302 free(dmatab, M_DEVBUF); 303 return -1; 304} 305 306int32_t 307ata_dmasetup(struct ata_softc *scp, int32_t device, 308 int8_t *data, int32_t count, int32_t flags) 309{ 310 struct ata_dmaentry *dmatab; 311 u_int32_t dma_count, dma_base; 312 int32_t i = 0; 313 |
270#ifdef ATA_DEBUGDMA | 314#ifdef ATA_DMADEBUG |
271 printf("ata%d: dmasetup\n", scp->lun); 272#endif 273 if (((uintptr_t)data & 1) || (count & 1)) 274 return -1; 275 276 if (!count) { | 315 printf("ata%d: dmasetup\n", scp->lun); 316#endif 317 if (((uintptr_t)data & 1) || (count & 1)) 318 return -1; 319 320 if (!count) { |
321#ifdef ATA_DMADEBUG |
|
277 printf("ata%d: zero length DMA transfer attempt on %s\n", | 322 printf("ata%d: zero length DMA transfer attempt on %s\n", |
278 scp->lun, (device ? "slave" : "master")); | 323 scp->lun, ((device == ATA_MASTER) ? "master" : "slave")); 324#endif |
279 return -1; 280 } 281 | 325 return -1; 326 } 327 |
282 dmatab = scp->dmatab[device ? 1 : 0]; | 328 dmatab = scp->dmatab[(device == ATA_MASTER) ? 0 : 1]; |
283 dma_base = vtophys(data); 284 dma_count = MIN(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK))); 285 data += dma_count; 286 count -= dma_count; 287 288 while (count) { 289 dmatab[i].base = dma_base; 290 dmatab[i].count = (dma_count & 0xffff); 291 i++; 292 if (i >= ATA_DMA_ENTRIES) { 293 printf("ata%d: too many segments in DMA table for %s\n", 294 scp->lun, (device ? "slave" : "master")); 295 return -1; 296 } 297 dma_base = vtophys(data); 298 dma_count = MIN(count, PAGE_SIZE); 299 data += MIN(count, PAGE_SIZE); 300 count -= MIN(count, PAGE_SIZE); 301 } | 329 dma_base = vtophys(data); 330 dma_count = MIN(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK))); 331 data += dma_count; 332 count -= dma_count; 333 334 while (count) { 335 dmatab[i].base = dma_base; 336 dmatab[i].count = (dma_count & 0xffff); 337 i++; 338 if (i >= ATA_DMA_ENTRIES) { 339 printf("ata%d: too many segments in DMA table for %s\n", 340 scp->lun, (device ? "slave" : "master")); 341 return -1; 342 } 343 dma_base = vtophys(data); 344 dma_count = MIN(count, PAGE_SIZE); 345 data += MIN(count, PAGE_SIZE); 346 count -= MIN(count, PAGE_SIZE); 347 } |
302#ifdef ATA_DEBUGDMA 303printf("ata_dmasetup: base=%08x count%08x\n", 304 dma_base, dma_count); | 348#ifdef ATA_DMADEBUG 349 printf("ata_dmasetup: base=%08x count%08x\n", dma_base, dma_count); |
305#endif 306 dmatab[i].base = dma_base; 307 dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT; 308 309 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab)); | 350#endif 351 dmatab[i].base = dma_base; 352 dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT; 353 354 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab)); |
310#ifdef ATA_DEBUGDMA 311printf("dmatab=%08x %08x\n", vtophys(dmatab), inl(scp->bmaddr+ATA_BMDTP_PORT)); | 355#ifdef ATA_DMADEBUG 356 printf("dmatab=%08x %08x\n", 357 vtophys(dmatab), inl(scp->bmaddr+ATA_BMDTP_PORT)); |
312#endif 313 outb(scp->bmaddr + ATA_BMCMD_PORT, flags ? ATA_BMCMD_WRITE_READ:0); 314 outb(scp->bmaddr + ATA_BMSTAT_PORT, (inb(scp->bmaddr + ATA_BMSTAT_PORT) | 315 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR))); 316 return 0; 317} 318 319void 320ata_dmastart(struct ata_softc *scp, int32_t device) 321{ | 358#endif 359 outb(scp->bmaddr + ATA_BMCMD_PORT, flags ? ATA_BMCMD_WRITE_READ:0); 360 outb(scp->bmaddr + ATA_BMSTAT_PORT, (inb(scp->bmaddr + ATA_BMSTAT_PORT) | 361 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR))); 362 return 0; 363} 364 365void 366ata_dmastart(struct ata_softc *scp, int32_t device) 367{ |
322#ifdef ATA_DEBUGDMA | 368#ifdef ATA_DMADEBUG |
323 printf("ata%d: dmastart\n", scp->lun); 324#endif 325 outb(scp->bmaddr + ATA_BMCMD_PORT, 326 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP); 327} 328 329int32_t 330ata_dmadone(struct ata_softc *scp, int32_t device) 331{ | 369 printf("ata%d: dmastart\n", scp->lun); 370#endif 371 outb(scp->bmaddr + ATA_BMCMD_PORT, 372 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP); 373} 374 375int32_t 376ata_dmadone(struct ata_softc *scp, int32_t device) 377{ |
332#ifdef ATA_DEBUGDMA | 378#ifdef ATA_DMADEBUG |
333 printf("ata%d: dmadone\n", scp->lun); 334#endif 335 outb(scp->bmaddr + ATA_BMCMD_PORT, 336 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP); 337 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 338} 339 340int32_t 341ata_dmastatus(struct ata_softc *scp, int32_t device) 342{ | 379 printf("ata%d: dmadone\n", scp->lun); 380#endif 381 outb(scp->bmaddr + ATA_BMCMD_PORT, 382 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP); 383 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 384} 385 386int32_t 387ata_dmastatus(struct ata_softc *scp, int32_t device) 388{ |
343#ifdef ATA_DEBUGDMA | 389#ifdef ATA_DMADEBUG |
344 printf("ata%d: dmastatus\n", scp->lun); 345#endif 346 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 347} 348 349#else /* NPCI > 0 */ 350 351int32_t 352ata_dmainit(struct ata_softc *scp, int32_t device, | 390 printf("ata%d: dmastatus\n", scp->lun); 391#endif 392 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 393} 394 395#else /* NPCI > 0 */ 396 397int32_t 398ata_dmainit(struct ata_softc *scp, int32_t device, |
353 int32_t piomode, int32_t wdmamode, int32_t udmamode) | 399 int32_t piomode, int32_t wdmamode, int32_t udmamode) |
354{ 355 return -1; 356} 357 358int32_t 359ata_dmasetup(struct ata_softc *scp, int32_t device, | 400{ 401 return -1; 402} 403 404int32_t 405ata_dmasetup(struct ata_softc *scp, int32_t device, |
360 int8_t *data, int32_t count, int32_t flags) | 406 int8_t *data, int32_t count, int32_t flags) |
361{ 362 return -1; 363} 364 365void 366ata_dmastart(struct ata_softc *scp, int32_t device) 367{ 368} --- 15 unchanged lines hidden --- | 407{ 408 return -1; 409} 410 411void 412ata_dmastart(struct ata_softc *scp, int32_t device) 413{ 414} --- 15 unchanged lines hidden --- |