Lines Matching +full:port +full:- +full:1
5 * SPDX-License-Identifier: GPL-2.0+
40 static struct sata_port port[CONFIG_SYS_SATA_MAX_DEVICE]; variable
44 while (words--) { in output_data()
45 __raw_writew (*sect_buf++, (void *)ioaddr->data_addr); in output_data()
51 while (words--) { in input_data()
52 *sect_buf++ = __raw_readw ((void *)ioaddr->data_addr); in input_data()
61 port[num].dev_mask = 1; in sata_bus_softreset()
63 port[num].ctl_reg = 0x08; /*Default value of control reg */ in sata_bus_softreset()
64 writeb (port[num].ctl_reg, port[num].ioaddr.ctl_addr); in sata_bus_softreset()
66 writeb (port[num].ctl_reg | ATA_SRST, port[num].ioaddr.ctl_addr); in sata_bus_softreset()
68 writeb (port[num].ctl_reg, port[num].ioaddr.ctl_addr); in sata_bus_softreset()
79 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 300, 0); in sata_bus_softreset()
82 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 3, 0); in sata_bus_softreset()
91 status = sata_chk_status (&port[num].ioaddr, 0); in sata_bus_softreset()
97 port[num].dev_mask = 0; in sata_bus_softreset()
98 return 1; in sata_bus_softreset()
111 if (!(port[num].dev_mask & 0x01)) { in sata_identify()
112 printf ("dev%d is not present on port#%d\n", dev, num); in sata_identify()
116 debug ("port=%d dev=%d\n", num, dev); in sata_identify()
120 writeb (cmd, port[num].ioaddr.command_addr); in sata_identify()
121 readb (port[num].ioaddr.altstatus_addr); in sata_identify()
124 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 1000, 0); in sata_identify()
127 port[num].dev_mask &= ~0x01; in sata_identify()
131 input_data (&port[num].ioaddr, iobuf, ATA_SECTOR_WORDS); in sata_identify()
147 port[num].dev_mask &= ~0x01; in sata_identify()
157 /* TODO - atm we asume harddisk ie not removable */ in sata_identify()
164 if (iobuf[83] & (1 << 10)) { in sata_identify()
165 sata_dev_desc[devno].lba48 = 1; in sata_identify()
181 if (!(port[num].dev_mask & 0x01)) { in set_Feature_cmd()
182 debug ("dev%d is not present on port#%d\n", dev, num); in set_Feature_cmd()
186 writeb (SETFEATURES_XFER, port[num].ioaddr.feature_addr); in set_Feature_cmd()
187 writeb (XFER_PIO_4, port[num].ioaddr.nsect_addr); in set_Feature_cmd()
188 writeb (0, port[num].ioaddr.lbal_addr); in set_Feature_cmd()
189 writeb (0, port[num].ioaddr.lbam_addr); in set_Feature_cmd()
190 writeb (0, port[num].ioaddr.lbah_addr); in set_Feature_cmd()
192 writeb (ATA_DEVICE_OBS, port[num].ioaddr.device_addr); in set_Feature_cmd()
193 writeb (ATA_CMD_SET_FEATURES, port[num].ioaddr.command_addr); in set_Feature_cmd()
198 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 5000, 0); in set_Feature_cmd()
201 port[num].dev_mask &= ~0x01; in set_Feature_cmd()
211 if (!(port[num].dev_mask & 0x01)) { in sil3114_spin_down()
213 return 1; in sil3114_spin_down()
223 return 1; in sil3114_spin_down()
226 if (!((status = sata_chk_status (&port[num].ioaddr, 0)) & ATA_DRDY)) { in sil3114_spin_down()
228 return 1; in sil3114_spin_down()
231 writeb (0x00, port[num].ioaddr.feature_addr); in sil3114_spin_down()
233 writeb (0x00, port[num].ioaddr.nsect_addr); in sil3114_spin_down()
234 writeb (0x00, port[num].ioaddr.lbal_addr); in sil3114_spin_down()
235 writeb (0x00, port[num].ioaddr.lbam_addr); in sil3114_spin_down()
236 writeb (0x00, port[num].ioaddr.lbah_addr); in sil3114_spin_down()
238 writeb (ATA_DEVICE_OBS, port[num].ioaddr.device_addr); in sil3114_spin_down()
239 writeb (ATA_CMD_STANDBY, port[num].ioaddr.command_addr); in sil3114_spin_down()
241 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 30000, 0); in sil3114_spin_down()
245 port[num].dev_mask &= ~0x01; in sil3114_spin_down()
246 return 1; in sil3114_spin_down()
257 if (!(port[num].dev_mask & 0x01)) { in sil3114_spin_up()
259 return 1; in sil3114_spin_up()
265 return 1; in sil3114_spin_up()
272 if (!((status = sata_chk_status (&port[num].ioaddr, 0)) & ATA_DRDY)) { in sil3114_spin_up()
274 return 1; in sil3114_spin_up()
279 writeb (0x00, port[num].ioaddr.feature_addr); in sil3114_spin_up()
281 writeb (0x00, port[num].ioaddr.nsect_addr); in sil3114_spin_up()
282 writeb (0x00, port[num].ioaddr.lbal_addr); in sil3114_spin_up()
283 writeb (0x00, port[num].ioaddr.lbam_addr); in sil3114_spin_up()
284 writeb (0x00, port[num].ioaddr.lbah_addr); in sil3114_spin_up()
286 writeb (ATA_DEVICE_OBS, port[num].ioaddr.device_addr); in sil3114_spin_up()
287 writeb (ATA_CMD_IDLE, port[num].ioaddr.command_addr); in sil3114_spin_up()
289 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 30000, 0); in sil3114_spin_up()
293 port[num].dev_mask &= ~0x01; in sil3114_spin_up()
294 return 1; in sil3114_spin_up()
305 return 1; in sil3114_spin_up()
312 * 0x00 - Device stand by
313 * 0x01 - Operation failed
314 * 0x80 - Device idle
315 * 0xff - Device active
321 if (!(port[num].dev_mask & 0x01)) { in check_power_mode()
323 return 1; in check_power_mode()
326 if (!(sata_chk_status (&port[num].ioaddr, 0) & ATA_DRDY)) { in check_power_mode()
328 return 1; in check_power_mode()
331 writeb (0, port[num].ioaddr.feature_addr); in check_power_mode()
332 writeb (0, port[num].ioaddr.nsect_addr); in check_power_mode()
333 writeb (0, port[num].ioaddr.lbal_addr); in check_power_mode()
334 writeb (0, port[num].ioaddr.lbam_addr); in check_power_mode()
335 writeb (0, port[num].ioaddr.lbah_addr); in check_power_mode()
337 writeb (ATA_DEVICE_OBS, port[num].ioaddr.device_addr); in check_power_mode()
338 writeb (ATA_CMD_CHK_POWER, port[num].ioaddr.command_addr); in check_power_mode()
340 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 5000, 0); in check_power_mode()
345 port[num].dev_mask &= ~0x01; in check_power_mode()
346 return 1; in check_power_mode()
348 res = readb (port[num].ioaddr.nsect_addr); in check_power_mode()
356 ioport->data_addr = ioport->cmd_addr + ATA_REG_DATA; in sata_port()
357 ioport->error_addr = ioport->cmd_addr + ATA_REG_ERR; in sata_port()
358 ioport->feature_addr = ioport->cmd_addr + ATA_REG_FEATURE; in sata_port()
359 ioport->nsect_addr = ioport->cmd_addr + ATA_REG_NSECT; in sata_port()
360 ioport->lbal_addr = ioport->cmd_addr + ATA_REG_LBAL; in sata_port()
361 ioport->lbam_addr = ioport->cmd_addr + ATA_REG_LBAM; in sata_port()
362 ioport->lbah_addr = ioport->cmd_addr + ATA_REG_LBAH; in sata_port()
363 ioport->device_addr = ioport->cmd_addr + ATA_REG_DEVICE; in sata_port()
364 ioport->status_addr = ioport->cmd_addr + ATA_REG_STATUS; in sata_port()
365 ioport->command_addr = ioport->cmd_addr + ATA_REG_CMD; in sata_port()
371 u32 port = iobase[5]; in wait_for_irq() local
374 port += VND_TF_CNST_CH0; in wait_for_irq()
376 case 1: in wait_for_irq()
377 port += VND_TF_CNST_CH1; in wait_for_irq()
380 port += VND_TF_CNST_CH2; in wait_for_irq()
383 port += VND_TF_CNST_CH3; in wait_for_irq()
386 return 1; in wait_for_irq()
390 if (readl (port) & VND_TF_CNST_INTST) { in wait_for_irq()
394 max--; in wait_for_irq()
410 max--; in sata_busy_wait()
419 return readb (ioaddr->status_addr); in sata_chk_status()
421 return readb (ioaddr->altstatus_addr); in sata_chk_status()
445 if (!(sata_chk_status (&port[device].ioaddr, 0) & ATA_DRDY)) { in do_one_read()
454 writeb (0, port[device].ioaddr.nsect_addr); in do_one_read()
455 writeb ((blknr >> 24) & 0xFF, port[device].ioaddr.lbal_addr); in do_one_read()
456 writeb ((blknr >> 32) & 0xFF, port[device].ioaddr.lbam_addr); in do_one_read()
457 writeb ((blknr >> 40) & 0xFF, port[device].ioaddr.lbah_addr); in do_one_read()
460 writeb (blkcnt, port[device].ioaddr.nsect_addr); in do_one_read()
461 writeb (((blknr) >> 0) & 0xFF, port[device].ioaddr.lbal_addr); in do_one_read()
462 writeb ((blknr >> 8) & 0xFF, port[device].ioaddr.lbam_addr); in do_one_read()
463 writeb ((blknr >> 16) & 0xFF, port[device].ioaddr.lbah_addr); in do_one_read()
467 writeb (ATA_LBA, port[device].ioaddr.device_addr); in do_one_read()
468 writeb (ATA_CMD_PIO_READ_EXT, port[device].ioaddr.command_addr); in do_one_read()
473 port[device].ioaddr.device_addr); in do_one_read()
474 writeb (ATA_CMD_PIO_READ, port[device].ioaddr.command_addr); in do_one_read()
477 status = sata_busy_wait (&port[device].ioaddr, ATA_BUSY, 10000, 1); in do_one_read()
483 err = readb (port[device].ioaddr.error_addr); in do_one_read()
488 while (blkcnt--) { in do_one_read()
495 status = sata_chk_status (&port[device].ioaddr, 0); in do_one_read()
498 readb (port[device].ioaddr.error_addr)); in do_one_read()
502 input_data (&port[device].ioaddr, buff, ATA_SECTOR_WORDS); in do_one_read()
521 printf ("Drive doesn't support 48-bit addressing\n"); in sata_read()
525 lba48 = 1; in sata_read()
543 blkcnt -= sread; in sata_read()
562 printf ("Drive doesn't support 48-bit addressing\n"); in sata_write()
566 lba48 = 1; in sata_write()
569 /*Port Number */ in sata_write()
572 while (blkcnt-- > 0) { in sata_write()
573 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 500, 0); in sata_write()
575 printf ("ata%u failed to respond\n", port[num].port_no); in sata_write()
581 writeb (0, port[num].ioaddr.nsect_addr); in sata_write()
583 port[num].ioaddr.lbal_addr); in sata_write()
585 port[num].ioaddr.lbam_addr); in sata_write()
587 port[num].ioaddr.lbah_addr); in sata_write()
590 writeb (1, port[num].ioaddr.nsect_addr); in sata_write()
591 writeb ((blknr >> 0) & 0xFF, port[num].ioaddr.lbal_addr); in sata_write()
592 writeb ((blknr >> 8) & 0xFF, port[num].ioaddr.lbam_addr); in sata_write()
593 writeb ((blknr >> 16) & 0xFF, port[num].ioaddr.lbah_addr); in sata_write()
596 writeb (ATA_LBA, port[num].ioaddr.device_addr); in sata_write()
597 writeb (ATA_CMD_PIO_WRITE_EXT, port[num].ioaddr.command_addr); in sata_write()
602 port[num].ioaddr.device_addr); in sata_write()
603 writeb (ATA_CMD_PIO_WRITE, port[num].ioaddr.command_addr); in sata_write()
608 status = sata_busy_wait (&port[num].ioaddr, ATA_BUSY, 4000, 0); in sata_write()
615 output_data (&port[num].ioaddr, buffer, ATA_SECTOR_WORDS); in sata_write()
616 readb (port[num].ioaddr.altstatus_addr); in sata_write()
637 static int res = 1; in init_sata()
647 init_done = 1; in init_sata()
649 if ((devno = pci_find_device (SIL_VEND_ID, SIL3114_DEVICE_ID, 0)) == -1) { in init_sata()
650 res = 1; in init_sata()
656 pci_read_config_dword (devno, PCI_BASE_ADDRESS_1, &iobase[1]); in init_sata()
662 if ((iobase[0] == 0xFFFFFFFF) || (iobase[1] == 0xFFFFFFFF) || in init_sata()
666 res = 1; in init_sata()
672 iobase[1] &= 0xfffffff8; in init_sata()
682 cls++; /* cls = (line_size/8)+1 */ in init_sata()
710 /* Check if device is connected to port */
713 u32 port = iobase[5]; in sata_bus_probe() local
717 port += VND_SSTATUS_CH0; in sata_bus_probe()
719 case 1: in sata_bus_probe()
720 port += VND_SSTATUS_CH1; in sata_bus_probe()
723 port += VND_SSTATUS_CH2; in sata_bus_probe()
726 port += VND_SSTATUS_CH3; in sata_bus_probe()
731 val = readl (port); in sata_bus_probe()
733 return 1; in sata_bus_probe()
741 u32 port = iobase[5]; in sata_phy_reset() local
745 port += VND_SCONTROL_CH0; in sata_phy_reset()
747 case 1: in sata_phy_reset()
748 port += VND_SCONTROL_CH1; in sata_phy_reset()
751 port += VND_SCONTROL_CH2; in sata_phy_reset()
754 port += VND_SCONTROL_CH3; in sata_phy_reset()
759 val = readl (port); in sata_phy_reset()
760 writel (val | SATA_SC_DET_RST, port); in sata_phy_reset()
762 writel (val & ~SATA_SC_DET_RST, port); in sata_phy_reset()
771 port[0].port_no = 0; in scan_sata()
772 port[0].ioaddr.cmd_addr = iobase[5] + VND_TF0_CH0; in scan_sata()
773 port[0].ioaddr.altstatus_addr = port[0].ioaddr.ctl_addr = in scan_sata()
775 port[0].ioaddr.bmdma_addr = iobase[5] + VND_BMDMA_CH0; in scan_sata()
777 #if (CONFIG_SYS_SATA_MAX_DEVICE >= 1) in scan_sata()
778 case 1: in scan_sata()
779 port[1].port_no = 0; in scan_sata()
780 port[1].ioaddr.cmd_addr = iobase[5] + VND_TF0_CH1; in scan_sata()
781 port[1].ioaddr.altstatus_addr = port[1].ioaddr.ctl_addr = in scan_sata()
783 port[1].ioaddr.bmdma_addr = iobase[5] + VND_BMDMA_CH1; in scan_sata()
787 port[2].port_no = 0; in scan_sata()
788 port[2].ioaddr.cmd_addr = iobase[5] + VND_TF0_CH2; in scan_sata()
789 port[2].ioaddr.altstatus_addr = port[2].ioaddr.ctl_addr = in scan_sata()
791 port[2].ioaddr.bmdma_addr = iobase[5] + VND_BMDMA_CH2; in scan_sata()
795 port[3].port_no = 0; in scan_sata()
796 port[3].ioaddr.cmd_addr = iobase[5] + VND_TF0_CH3; in scan_sata()
797 port[3].ioaddr.altstatus_addr = port[3].ioaddr.ctl_addr = in scan_sata()
799 port[3].ioaddr.bmdma_addr = iobase[5] + VND_BMDMA_CH3; in scan_sata()
803 printf ("Tried to scan unknown port: ata%d\n", dev); in scan_sata()
804 return 1; in scan_sata()
808 sata_port (&port[dev].ioaddr); in scan_sata()
812 port[dev].port_state = 0; in scan_sata()
813 debug ("SATA#%d port is not present\n", dev); in scan_sata()
815 debug ("SATA#%d port is present\n", dev); in scan_sata()
820 port[dev].port_state = 0; in scan_sata()
822 port[dev].port_state = 1; in scan_sata()
825 port[dev].port_state = 1; in scan_sata()
828 if (port[dev].port_state == 1) { in scan_sata()