]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/block/ata_piix.c
Merge git://git.denx.de/u-boot-arm
[karo-tx-uboot.git] / drivers / block / ata_piix.c
1 /*
2  * Copyright (C) Procsys. All rights reserved.
3  * Author: Mushtaq Khan <mushtaq_k@procsys.com>
4  *                      <mushtaqk_921@yahoo.co.in>
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  *
8  * with the reference to ata_piix driver in kernel 2.4.32
9  */
10
11 /*
12  * This file contains SATA controller and SATA drive initialization functions
13  */
14
15 #include <common.h>
16 #include <asm/io.h>
17 #include <pci.h>
18 #include <command.h>
19 #include <config.h>
20 #include <asm/byteorder.h>
21 #include <part.h>
22 #include <ide.h>
23 #include <ata.h>
24 #include <sata.h>
25
26 #define DEBUG_SATA 0            /* For debug prints set DEBUG_SATA to 1 */
27
28 #define SATA_DECL
29 #define DRV_DECL                /* For file specific declarations */
30 #include "ata_piix.h"
31
32 /* Macros realted to PCI */
33 #define PCI_SATA_BUS    0x00
34 #define PCI_SATA_DEV    0x1f
35 #define PCI_SATA_FUNC   0x02
36
37 #define PCI_SATA_BASE1 0x10
38 #define PCI_SATA_BASE2 0x14
39 #define PCI_SATA_BASE3 0x18
40 #define PCI_SATA_BASE4 0x1c
41 #define PCI_SATA_BASE5 0x20
42 #define PCI_PMR         0x90
43 #define PCI_PI          0x09
44 #define PCI_PCS         0x92
45 #define PCI_DMA_CTL     0x48
46
47 #define PORT_PRESENT (1<<0)
48 #define PORT_ENABLED (1<<4)
49
50 u32 bdf;
51 u32 iobase1;            /* Primary cmd block */
52 u32 iobase2;            /* Primary ctl block */
53 u32 iobase3;            /* Sec cmd block */
54 u32 iobase4;            /* sec ctl block */
55 u32 iobase5;            /* BMDMA*/
56
57 int pci_sata_init(void)
58 {
59         u32 bus = PCI_SATA_BUS;
60         u32 dev = PCI_SATA_DEV;
61         u32 fun = PCI_SATA_FUNC;
62         u16 cmd = 0;
63         u8 lat = 0, pcibios_max_latency = 0xff;
64         u8 pmr; /* Port mapping reg */
65         u8 pi; /* Prgming Interface reg */
66
67         bdf = PCI_BDF(bus, dev, fun);
68         pci_read_config_dword(bdf, PCI_SATA_BASE1, &iobase1);
69         pci_read_config_dword(bdf, PCI_SATA_BASE2, &iobase2);
70         pci_read_config_dword(bdf, PCI_SATA_BASE3, &iobase3);
71         pci_read_config_dword(bdf, PCI_SATA_BASE4, &iobase4);
72         pci_read_config_dword(bdf, PCI_SATA_BASE5, &iobase5);
73
74         if ((iobase1 == 0xFFFFFFFF) || (iobase2 == 0xFFFFFFFF) ||
75             (iobase3 == 0xFFFFFFFF) || (iobase4 == 0xFFFFFFFF) ||
76             (iobase5 == 0xFFFFFFFF)) {
77                 /* ERROR */
78                 printf("error no base addr for SATA controller\n");
79                 return 1;
80         }
81
82         iobase1 &= 0xFFFFFFFE;
83         iobase2 &= 0xFFFFFFFE;
84         iobase3 &= 0xFFFFFFFE;
85         iobase4 &= 0xFFFFFFFE;
86         iobase5 &= 0xFFFFFFFE;
87
88         /* check for mode */
89         pci_read_config_byte(bdf, PCI_PMR, &pmr);
90         if (pmr > 1) {
91                 puts("combined mode not supported\n");
92                 return 1;
93         }
94
95         pci_read_config_byte(bdf, PCI_PI, &pi);
96         if ((pi & 0x05) != 0x05) {
97                 puts("Sata is in Legacy mode\n");
98                 return 1;
99         } else
100                 puts("sata is in Native mode\n");
101
102         /* MASTER CFG AND IO CFG */
103         pci_read_config_word(bdf, PCI_COMMAND, &cmd);
104         cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_IO;
105         pci_write_config_word(bdf, PCI_COMMAND, cmd);
106         pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
107
108         if (lat < 16)
109                 lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency;
110         else if (lat > pcibios_max_latency)
111                 lat = pcibios_max_latency;
112         pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
113
114         return 0;
115 }
116
117 int sata_bus_probe(int port_no)
118 {
119         int orig_mask, mask;
120         u16 pcs;
121
122         mask = (PORT_PRESENT << port_no);
123         pci_read_config_word(bdf, PCI_PCS, &pcs);
124         orig_mask = (int) pcs & 0xff;
125         if ((orig_mask & mask) != mask)
126                 return 0;
127         else
128                 return 1;
129 }
130
131 int init_sata(int dev)
132 {
133         static int done;
134         u8 i, rv = 0;
135
136         if (!done)
137                 done = 1;
138         else
139                 return 0;
140
141         rv = pci_sata_init();
142         if (rv == 1) {
143                 puts("pci initialization failed\n");
144                 return 1;
145         }
146
147         port[0].port_no = 0;
148         port[0].ioaddr.cmd_addr = iobase1;
149         port[0].ioaddr.altstatus_addr = port[0].ioaddr.ctl_addr =
150             iobase2 | ATA_PCI_CTL_OFS;
151         port[0].ioaddr.bmdma_addr = iobase5;
152
153         port[1].port_no = 1;
154         port[1].ioaddr.cmd_addr = iobase3;
155         port[1].ioaddr.altstatus_addr = port[1].ioaddr.ctl_addr =
156             iobase4 | ATA_PCI_CTL_OFS;
157         port[1].ioaddr.bmdma_addr = iobase5 + 0x8;
158
159         for (i = 0; i < CONFIG_SYS_SATA_MAXBUS; i++)
160                 sata_port(&port[i].ioaddr);
161
162         for (i = 0; i < CONFIG_SYS_SATA_MAXBUS; i++) {
163                 if (!(sata_bus_probe(i))) {
164                         port[i].port_state = 0;
165                         printf("SATA#%d port is not present\n", i);
166                 } else {
167                         printf("SATA#%d port is present\n", i);
168                         if (sata_bus_softreset(i))
169                                 port[i].port_state = 0;
170                         else
171                                 port[i].port_state = 1;
172                 }
173         }
174
175         for (i = 0; i < CONFIG_SYS_SATA_MAXBUS; i++) {
176                 u8 j, devno;
177
178                 if (port[i].port_state == 0)
179                         continue;
180                 for (j = 0; j < CONFIG_SYS_SATA_DEVS_PER_BUS; j++) {
181                         sata_identify(i, j);
182                         set_Feature_cmd(i, j);
183                         devno = i * CONFIG_SYS_SATA_DEVS_PER_BUS + j;
184                         if ((sata_dev_desc[devno].lba > 0) &&
185                             (sata_dev_desc[devno].blksz > 0)) {
186                                 dev_print(&sata_dev_desc[devno]);
187                                 /* initialize partition type */
188                                 init_part(&sata_dev_desc[devno]);
189                         }
190                 }
191         }
192         return 0;
193 }
194
195 static inline u8 sata_inb(unsigned long ioaddr)
196 {
197         return inb(ioaddr);
198 }
199
200 static inline void sata_outb(unsigned char val, unsigned long ioaddr)
201 {
202         outb(val, ioaddr);
203 }
204
205 static void output_data(struct sata_ioports *ioaddr, ulong * sect_buf,
206                 int words)
207 {
208         outsw(ioaddr->data_addr, sect_buf, words << 1);
209 }
210
211 static int input_data(struct sata_ioports *ioaddr, ulong * sect_buf, int words)
212 {
213         insw(ioaddr->data_addr, sect_buf, words << 1);
214         return 0;
215 }
216
217 static void sata_cpy(unsigned char *dst, unsigned char *src, unsigned int len)
218 {
219         unsigned char *end, *last;
220
221         last = dst;
222         end = src + len - 1;
223
224         /* reserve space for '\0' */
225         if (len < 2)
226                 goto OUT;
227
228         /* skip leading white space */
229         while ((*src) && (src < end) && (*src == ' '))
230                 ++src;
231
232         /* copy string, omitting trailing white space */
233         while ((*src) && (src < end)) {
234                 *dst++ = *src;
235                 if (*src++ != ' ')
236                         last = dst;
237         }
238 OUT:
239         *last = '\0';
240 }
241
242 int sata_bus_softreset(int num)
243 {
244         u8 dev = 0, status = 0, i;
245
246         port[num].dev_mask = 0;
247
248         for (i = 0; i < CONFIG_SYS_SATA_DEVS_PER_BUS; i++) {
249                 if (!(sata_devchk(&port[num].ioaddr, i))) {
250                         debug("dev_chk failed for dev#%d\n", i);
251                 } else {
252                         port[num].dev_mask |= (1 << i);
253                         debug("dev_chk passed for dev#%d\n", i);
254                 }
255         }
256
257         if (!(port[num].dev_mask)) {
258                 printf("no devices on port%d\n", num);
259                 return 1;
260         }
261
262         dev_select(&port[num].ioaddr, dev);
263
264         port[num].ctl_reg = 0x08;       /* Default value of control reg */
265         sata_outb(port[num].ctl_reg, port[num].ioaddr.ctl_addr);
266         udelay(10);
267         sata_outb(port[num].ctl_reg | ATA_SRST, port[num].ioaddr.ctl_addr);
268         udelay(10);
269         sata_outb(port[num].ctl_reg, port[num].ioaddr.ctl_addr);
270
271         /*
272          * spec mandates ">= 2ms" before checking status.
273          * We wait 150ms, because that was the magic delay used for
274          * ATAPI devices in Hale Landis's ATADRVR, for the period of time
275          * between when the ATA command register is written, and then
276          * status is checked.  Because waiting for "a while" before
277          * checking status is fine, post SRST, we perform this magic
278          * delay here as well.
279          */
280         mdelay(150);
281         status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 300);
282         while ((status & ATA_BUSY)) {
283                 mdelay(100);
284                 status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 3);
285         }
286
287         if (status & ATA_BUSY)
288                 printf("ata%u is slow to respond,plz be patient\n", num);
289
290         while ((status & ATA_BUSY)) {
291                 mdelay(100);
292                 status = sata_chk_status(&port[num].ioaddr);
293         }
294
295         if (status & ATA_BUSY) {
296                 printf("ata%u failed to respond : bus reset failed\n", num);
297                 return 1;
298         }
299         return 0;
300 }
301
302 void sata_identify(int num, int dev)
303 {
304         u8 cmd = 0, status = 0;
305         u8 devno = num * CONFIG_SYS_SATA_DEVS_PER_BUS + dev;
306         u16 iobuf[ATA_SECT_SIZE];
307         u64 n_sectors = 0;
308         u8 mask = 0;
309
310         memset(iobuf, 0, sizeof(iobuf));
311         hd_driveid_t *iop = (hd_driveid_t *) iobuf;
312
313         if (dev == 0)
314                 mask = 0x01;
315         else
316                 mask = 0x02;
317
318         if (!(port[num].dev_mask & mask)) {
319                 printf("dev%d is not present on port#%d\n", dev, num);
320                 return;
321         }
322
323         printf("port=%d dev=%d\n", num, dev);
324
325         dev_select(&port[num].ioaddr, dev);
326
327         status = 0;
328         cmd = ATA_CMD_IDENT;    /* Device Identify Command */
329         sata_outb(cmd, port[num].ioaddr.command_addr);
330         sata_inb(port[num].ioaddr.altstatus_addr);
331         udelay(10);
332
333         status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 1000);
334         if (status & ATA_ERR) {
335                 puts("\ndevice not responding\n");
336                 port[num].dev_mask &= ~mask;
337                 return;
338         }
339
340         input_data(&port[num].ioaddr, (ulong *) iobuf, ATA_SECTORWORDS);
341
342         debug("\nata%u: dev %u cfg 49:%04x 82:%04x 83:%04x 84:%04x85:%04x"
343                 "86:%04x" "87:%04x 88:%04x\n", num, dev, iobuf[49],
344                 iobuf[82], iobuf[83], iobuf[84], iobuf[85], iobuf[86],
345                 iobuf[87], iobuf[88]);
346
347         /* we require LBA and DMA support (bits 8 & 9 of word 49) */
348         if (!ata_id_has_dma(iobuf) || !ata_id_has_lba(iobuf))
349                 debug("ata%u: no dma/lba\n", num);
350         ata_dump_id(iobuf);
351
352         if (ata_id_has_lba48(iobuf))
353                 n_sectors = ata_id_u64(iobuf, 100);
354         else
355                 n_sectors = ata_id_u32(iobuf, 60);
356         debug("no. of sectors %u\n", ata_id_u64(iobuf, 100));
357         debug("no. of sectors %u\n", ata_id_u32(iobuf, 60));
358
359         if (n_sectors == 0) {
360                 port[num].dev_mask &= ~mask;
361                 return;
362         }
363
364         sata_cpy((unsigned char *)sata_dev_desc[devno].revision, iop->fw_rev,
365                   sizeof(sata_dev_desc[devno].revision));
366         sata_cpy((unsigned char *)sata_dev_desc[devno].vendor, iop->model,
367                   sizeof(sata_dev_desc[devno].vendor));
368         sata_cpy((unsigned char *)sata_dev_desc[devno].product, iop->serial_no,
369                   sizeof(sata_dev_desc[devno].product));
370         strswab(sata_dev_desc[devno].revision);
371         strswab(sata_dev_desc[devno].vendor);
372
373         if ((iop->config & 0x0080) == 0x0080)
374                 sata_dev_desc[devno].removable = 1;
375         else
376                 sata_dev_desc[devno].removable = 0;
377
378         sata_dev_desc[devno].lba = iop->lba_capacity;
379         debug("lba=0x%x", sata_dev_desc[devno].lba);
380
381 #ifdef CONFIG_LBA48
382         if (iop->command_set_2 & 0x0400) {
383                 sata_dev_desc[devno].lba48 = 1;
384                 lba = (unsigned long long) iop->lba48_capacity[0] |
385                     ((unsigned long long) iop->lba48_capacity[1] << 16) |
386                     ((unsigned long long) iop->lba48_capacity[2] << 32) |
387                     ((unsigned long long) iop->lba48_capacity[3] << 48);
388         } else {
389                 sata_dev_desc[devno].lba48 = 0;
390         }
391 #endif
392
393         /* assuming HD */
394         sata_dev_desc[devno].type = DEV_TYPE_HARDDISK;
395         sata_dev_desc[devno].blksz = ATA_BLOCKSIZE;
396         sata_dev_desc[devno].log2blksz = LOG2(sata_dev_desc[devno].blksz);
397         sata_dev_desc[devno].lun = 0;   /* just to fill something in... */
398 }
399
400 void set_Feature_cmd(int num, int dev)
401 {
402         u8 mask = 0x00, status = 0;
403
404         if (dev == 0)
405                 mask = 0x01;
406         else
407                 mask = 0x02;
408
409         if (!(port[num].dev_mask & mask)) {
410                 debug("dev%d is not present on port#%d\n", dev, num);
411                 return;
412         }
413
414         dev_select(&port[num].ioaddr, dev);
415
416         sata_outb(SETFEATURES_XFER, port[num].ioaddr.feature_addr);
417         sata_outb(XFER_PIO_4, port[num].ioaddr.nsect_addr);
418         sata_outb(0, port[num].ioaddr.lbal_addr);
419         sata_outb(0, port[num].ioaddr.lbam_addr);
420         sata_outb(0, port[num].ioaddr.lbah_addr);
421
422         sata_outb(ATA_DEVICE_OBS, port[num].ioaddr.device_addr);
423         sata_outb(ATA_CMD_SETF, port[num].ioaddr.command_addr);
424
425         udelay(50);
426         mdelay(150);
427
428         status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 5000);
429         if ((status & (ATA_STAT_BUSY | ATA_STAT_ERR))) {
430                 printf("Error  : status 0x%02x\n", status);
431                 port[num].dev_mask &= ~mask;
432         }
433 }
434
435 void sata_port(struct sata_ioports *ioport)
436 {
437         ioport->data_addr = ioport->cmd_addr + ATA_REG_DATA;
438         ioport->error_addr = ioport->cmd_addr + ATA_REG_ERR;
439         ioport->feature_addr = ioport->cmd_addr + ATA_REG_FEATURE;
440         ioport->nsect_addr = ioport->cmd_addr + ATA_REG_NSECT;
441         ioport->lbal_addr = ioport->cmd_addr + ATA_REG_LBAL;
442         ioport->lbam_addr = ioport->cmd_addr + ATA_REG_LBAM;
443         ioport->lbah_addr = ioport->cmd_addr + ATA_REG_LBAH;
444         ioport->device_addr = ioport->cmd_addr + ATA_REG_DEVICE;
445         ioport->status_addr = ioport->cmd_addr + ATA_REG_STATUS;
446         ioport->command_addr = ioport->cmd_addr + ATA_REG_CMD;
447 }
448
449 int sata_devchk(struct sata_ioports *ioaddr, int dev)
450 {
451         u8 nsect, lbal;
452
453         dev_select(ioaddr, dev);
454
455         sata_outb(0x55, ioaddr->nsect_addr);
456         sata_outb(0xaa, ioaddr->lbal_addr);
457
458         sata_outb(0xaa, ioaddr->nsect_addr);
459         sata_outb(0x55, ioaddr->lbal_addr);
460
461         sata_outb(0x55, ioaddr->nsect_addr);
462         sata_outb(0xaa, ioaddr->lbal_addr);
463
464         nsect = sata_inb(ioaddr->nsect_addr);
465         lbal = sata_inb(ioaddr->lbal_addr);
466
467         if ((nsect == 0x55) && (lbal == 0xaa))
468                 return 1;       /* we found a device */
469         else
470                 return 0;       /* nothing found */
471 }
472
473 void dev_select(struct sata_ioports *ioaddr, int dev)
474 {
475         u8 tmp = 0;
476
477         if (dev == 0)
478                 tmp = ATA_DEVICE_OBS;
479         else
480                 tmp = ATA_DEVICE_OBS | ATA_DEV1;
481
482         sata_outb(tmp, ioaddr->device_addr);
483         sata_inb(ioaddr->altstatus_addr);
484         udelay(5);
485 }
486
487 u8 sata_busy_wait(struct sata_ioports *ioaddr, int bits, unsigned int max)
488 {
489         u8 status;
490
491         do {
492                 udelay(1000);
493                 status = sata_chk_status(ioaddr);
494                 max--;
495         } while ((status & bits) && (max > 0));
496
497         return status;
498 }
499
500 u8 sata_chk_status(struct sata_ioports *ioaddr)
501 {
502         return sata_inb(ioaddr->status_addr);
503 }
504
505
506 ulong sata_read(int device, ulong blknr, lbaint_t blkcnt, void *buff)
507 {
508         ulong n = 0, *buffer = (ulong *)buff;
509         u8 dev = 0, num = 0, mask = 0, status = 0;
510
511 #ifdef CONFIG_LBA48
512         unsigned char lba48 = 0;
513
514         if (blknr & 0x0000fffff0000000) {
515                 if (!sata_dev_desc[devno].lba48) {
516                         printf("Drive doesn't support 48-bit addressing\n");
517                         return 0;
518                 }
519                 /* more than 28 bits used, use 48bit mode */
520                 lba48 = 1;
521         }
522 #endif
523         /* Port Number */
524         num = device / CONFIG_SYS_SATA_DEVS_PER_BUS;
525         /* dev on the port */
526         if (device >= CONFIG_SYS_SATA_DEVS_PER_BUS)
527                 dev = device - CONFIG_SYS_SATA_DEVS_PER_BUS;
528         else
529                 dev = device;
530
531         if (dev == 0)
532                 mask = 0x01;
533         else
534                 mask = 0x02;
535
536         if (!(port[num].dev_mask & mask)) {
537                 printf("dev%d is not present on port#%d\n", dev, num);
538                 return 0;
539         }
540
541         /* Select device */
542         dev_select(&port[num].ioaddr, dev);
543
544         status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 500);
545         if (status & ATA_BUSY) {
546                 printf("ata%u failed to respond\n", port[num].port_no);
547                 return n;
548         }
549         while (blkcnt-- > 0) {
550                 status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 500);
551                 if (status & ATA_BUSY) {
552                         printf("ata%u failed to respond\n", 0);
553                         return n;
554                 }
555 #ifdef CONFIG_LBA48
556                 if (lba48) {
557                         /* write high bits */
558                         sata_outb(0, port[num].ioaddr.nsect_addr);
559                         sata_outb((blknr >> 24) & 0xFF,
560                                    port[num].ioaddr.lbal_addr);
561                         sata_outb((blknr >> 32) & 0xFF,
562                                    port[num].ioaddr.lbam_addr);
563                         sata_outb((blknr >> 40) & 0xFF,
564                                    port[num].ioaddr.lbah_addr);
565                 }
566 #endif
567                 sata_outb(1, port[num].ioaddr.nsect_addr);
568                 sata_outb(((blknr) >> 0) & 0xFF,
569                            port[num].ioaddr.lbal_addr);
570                 sata_outb((blknr >> 8) & 0xFF, port[num].ioaddr.lbam_addr);
571                 sata_outb((blknr >> 16) & 0xFF, port[num].ioaddr.lbah_addr);
572
573 #ifdef CONFIG_LBA48
574                 if (lba48) {
575                         sata_outb(ATA_LBA, port[num].ioaddr.device_addr);
576                         sata_outb(ATA_CMD_READ_EXT,
577                                    port[num].ioaddr.command_addr);
578                 } else
579 #endif
580                 {
581                         sata_outb(ATA_LBA | ((blknr >> 24) & 0xF),
582                                    port[num].ioaddr.device_addr);
583                         sata_outb(ATA_CMD_READ,
584                                    port[num].ioaddr.command_addr);
585                 }
586
587                 mdelay(50);
588                 /* may take up to 4 sec */
589                 status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 4000);
590
591                 if ((status & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR))
592                     != ATA_STAT_DRQ) {
593                         u8 err = 0;
594
595                         printf("Error no DRQ dev %d blk %ld: sts 0x%02x\n",
596                                 device, (ulong) blknr, status);
597                         err = sata_inb(port[num].ioaddr.error_addr);
598                         printf("Error reg = 0x%x\n", err);
599                         return n;
600                 }
601                 input_data(&port[num].ioaddr, buffer, ATA_SECTORWORDS);
602                 sata_inb(port[num].ioaddr.altstatus_addr);
603                 udelay(50);
604
605                 ++n;
606                 ++blknr;
607                 buffer += ATA_SECTORWORDS;
608         }
609         return n;
610 }
611
612 ulong sata_write(int device, ulong blknr, lbaint_t blkcnt, const void *buff)
613 {
614         ulong n = 0, *buffer = (ulong *)buff;
615         unsigned char status = 0, num = 0, dev = 0, mask = 0;
616
617 #ifdef CONFIG_LBA48
618         unsigned char lba48 = 0;
619
620         if (blknr & 0x0000fffff0000000) {
621                 if (!sata_dev_desc[devno].lba48) {
622                         printf("Drive doesn't support 48-bit addressing\n");
623                         return 0;
624                 }
625                 /* more than 28 bits used, use 48bit mode */
626                 lba48 = 1;
627         }
628 #endif
629         /* Port Number */
630         num = device / CONFIG_SYS_SATA_DEVS_PER_BUS;
631         /* dev on the Port */
632         if (device >= CONFIG_SYS_SATA_DEVS_PER_BUS)
633                 dev = device - CONFIG_SYS_SATA_DEVS_PER_BUS;
634         else
635                 dev = device;
636
637         if (dev == 0)
638                 mask = 0x01;
639         else
640                 mask = 0x02;
641
642         /* Select device */
643         dev_select(&port[num].ioaddr, dev);
644
645         status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 500);
646         if (status & ATA_BUSY) {
647                 printf("ata%u failed to respond\n", port[num].port_no);
648                 return n;
649         }
650
651         while (blkcnt-- > 0) {
652                 status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 500);
653                 if (status & ATA_BUSY) {
654                         printf("ata%u failed to respond\n",
655                                 port[num].port_no);
656                         return n;
657                 }
658 #ifdef CONFIG_LBA48
659                 if (lba48) {
660                         /* write high bits */
661                         sata_outb(0, port[num].ioaddr.nsect_addr);
662                         sata_outb((blknr >> 24) & 0xFF,
663                                    port[num].ioaddr.lbal_addr);
664                         sata_outb((blknr >> 32) & 0xFF,
665                                    port[num].ioaddr.lbam_addr);
666                         sata_outb((blknr >> 40) & 0xFF,
667                                    port[num].ioaddr.lbah_addr);
668                 }
669 #endif
670                 sata_outb(1, port[num].ioaddr.nsect_addr);
671                 sata_outb((blknr >> 0) & 0xFF, port[num].ioaddr.lbal_addr);
672                 sata_outb((blknr >> 8) & 0xFF, port[num].ioaddr.lbam_addr);
673                 sata_outb((blknr >> 16) & 0xFF, port[num].ioaddr.lbah_addr);
674 #ifdef CONFIG_LBA48
675                 if (lba48) {
676                         sata_outb(ATA_LBA, port[num].ioaddr.device_addr);
677                         sata_outb(ATA_CMD_WRITE_EXT,
678                                    port[num].ioaddr.command_addr);
679                 } else
680 #endif
681                 {
682                         sata_outb(ATA_LBA | ((blknr >> 24) & 0xF),
683                                    port[num].ioaddr.device_addr);
684                         sata_outb(ATA_CMD_WRITE,
685                                    port[num].ioaddr.command_addr);
686                 }
687
688                 mdelay(50);
689                 /* may take up to 4 sec */
690                 status = sata_busy_wait(&port[num].ioaddr, ATA_BUSY, 4000);
691                 if ((status & (ATA_STAT_DRQ | ATA_STAT_BUSY | ATA_STAT_ERR))
692                     != ATA_STAT_DRQ) {
693                         printf("Error no DRQ dev %d blk %ld: sts 0x%02x\n",
694                                 device, (ulong) blknr, status);
695                         return n;
696                 }
697
698                 output_data(&port[num].ioaddr, buffer, ATA_SECTORWORDS);
699                 sata_inb(port[num].ioaddr.altstatus_addr);
700                 udelay(50);
701
702                 ++n;
703                 ++blknr;
704                 buffer += ATA_SECTORWORDS;
705         }
706         return n;
707 }
708
709 int scan_sata(int dev)
710 {
711         return 0;
712 }