Home | History | Annotate | Download | only in bios

Lines Matching refs:ata

62 // NOTES for ATA/ATAPI driver (cbbochs@free.fr)
64 // - supports up to 4 ATA interfaces
71 // - CD-ROM booting is only available if ATA/ATAPI Driver is available
92 // ATA driver
110 // ATA driver
187 # error The ATA/ATAPI Driver can only to be used with a 386+ cpu
190 # error ATA/ATAPI Driver can only be used if EBDA is available
193 # error El-Torito Boot can only be use if ATA/ATAPI Driver is available
658 Bit8u type; // Detected type of ata (ata/atapi/none/unknown)
674 // ATA channels info
677 // ATA devices info
680 // map between (bios hd id - 0x80) and ata channels
683 // map between (bios cd id - 0xE0) and ata channels
716 // I made the ata and cdemu structs begin at 0x121 in the EBDA seg
728 // ATA Driver data
729 ata_t ata;
917 // ATA / ATAPI driver
2236 // Start of ATA/ATAPI Driver
2239 // Global defines -- ATA register and register bits.
2255 #define ATA_CB_ER_ICRC 0x80 // ATA Ultra DMA bad CRC
2256 #define ATA_CB_ER_BBK 0x80 // ATA bad block
2257 #define ATA_CB_ER_UNC 0x40 // ATA uncorrected error
2258 #define ATA_CB_ER_MC 0x20 // ATA media change
2259 #define ATA_CB_ER_IDNF 0x10 // ATA id not found
2260 #define ATA_CB_ER_MCR 0x08 // ATA media change request
2261 #define ATA_CB_ER_ABRT 0x04 // ATA command aborted
2262 #define ATA_CB_ER_NTK0 0x02 // ATA track 0 not found
2263 #define ATA_CB_ER_NDAM 0x01 // ATA address mark not found
2292 #define ATA_CB_STAT_ERR 0x01 // error (ATA)
2300 // Most mandtory and optional ATA commands (from ATA-3),
2377 // ATA/ATAPI driver : initialization
2386 write_byte(ebda_seg,&EbdaData->ata.channels[channel].iface,ATA_IFACE_NONE);
2387 write_word(ebda_seg,&EbdaData->ata.channels[channel].iobase1,0x0);
2388 write_word(ebda_seg,&EbdaData->ata.channels[channel].iobase2,0x0);
2389 write_byte(ebda_seg,&EbdaData->ata.channels[channel].irq,0);
2394 write_byte(ebda_seg,&EbdaData->ata.devices[device].type,ATA_TYPE_NONE);
2395 write_byte(ebda_seg,&EbdaData->ata.devices[device].device,ATA_DEVICE_NONE);
2396 write_byte(ebda_seg,&EbdaData->ata.devices[device].removable,0);
2397 write_byte(ebda_seg,&EbdaData->ata.devices[device].lock,0);
2398 write_byte(ebda_seg,&EbdaData->ata.devices[device].mode,ATA_MODE_NONE);
2399 write_word(ebda_seg,&EbdaData->ata.devices[device].blksize,0);
2400 write_byte(ebda_seg,&EbdaData->ata.devices[device].translation,ATA_TRANSLATION_NONE);
2401 write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.heads,0);
2402 write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.cylinders,0);
2403 write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.spt,0);
2404 write_word(ebda_seg,&EbdaData->ata.devices[device].pchs.heads,0);
2405 write_word(ebda_seg,&EbdaData->ata.devices[device].pchs.cylinders,0);
2406 write_word(ebda_seg,&EbdaData->ata.devices[device].pchs.spt,0);
2408 write_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_low,0L);
2409 write_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_high,0L);
2414 write_byte(ebda_seg,&EbdaData->ata.hdidmap[device],BX_MAX_ATA_DEVICES);
2415 write_byte(ebda_seg,&EbdaData->ata.cdidmap[device],BX_MAX_ATA_DEVICES);
2418 write_byte(ebda_seg,&EbdaData->ata.hdcount,0);
2419 write_byte(ebda_seg,&EbdaData->ata.cdcount,0);
2475 // ATA/ATAPI driver : device detection
2485 write_byte(ebda_seg,&EbdaData->ata.channels[0].iface,ATA_IFACE_ISA);
2486 write_word(ebda_seg,&EbdaData->ata.channels[0].iobase1,0x1f0);
2487 write_word(ebda_seg,&EbdaData->ata.channels[0].iobase2,0x3f0);
2488 write_byte(ebda_seg,&EbdaData->ata.channels[0].irq,14);
2491 write_byte(ebda_seg,&EbdaData->ata.channels[1].iface,ATA_IFACE_ISA);
2492 write_word(ebda_seg,&EbdaData->ata.channels[1].iobase1,0x170);
2493 write_word(ebda_seg,&EbdaData->ata.channels[1].iobase2,0x370);
2494 write_byte(ebda_seg,&EbdaData->ata.channels[1].irq,15);
2497 write_byte(ebda_seg,&EbdaData->ata.channels[2].iface,ATA_IFACE_ISA);
2498 write_word(ebda_seg,&EbdaData->ata.channels[2].iobase1,0x1e8);
2499 write_word(ebda_seg,&EbdaData->ata.channels[2].iobase2,0x3e0);
2500 write_byte(ebda_seg,&EbdaData->ata.channels[2].irq,12);
2503 write_byte(ebda_seg,&EbdaData->ata.channels[3].iface,ATA_IFACE_ISA);
2504 write_word(ebda_seg,&EbdaData->ata.channels[3].iobase1,0x168);
2505 write_word(ebda_seg,&EbdaData->ata.channels[3].iobase2,0x360);
2506 write_byte(ebda_seg,&EbdaData->ata.channels[3].irq,11);
2509 #error Please fill the ATA interface informations
2523 iobase1 =read_word(ebda_seg,&EbdaData->ata.channels[channel].iobase1);
2524 iobase2 =read_word(ebda_seg,&EbdaData->ata.channels[channel].iobase2);
2543 write_byte(ebda_seg,&EbdaData->ata.devices[device].type,ATA_TYPE_UNKNOWN);
2548 // check for ATA or ATAPI
2558 write_byte(ebda_seg,&EbdaData->ata.devices[device].type,ATA_TYPE_ATAPI);
2560 write_byte(ebda_seg,&EbdaData->ata.devices[device].type,ATA_TYPE_ATA);
2562 write_byte(ebda_seg,&EbdaData->ata.devices[device].type,ATA_TYPE_NONE);
2567 type=read_byte(ebda_seg,&EbdaData->ata.devices[device].type);
2569 // Now we send a IDENTIFY command to ATA device
2576 write_byte(ebda_seg,&EbdaData->ata.devices[device].device,ATA_DEVICE_HD);
2577 write_byte(ebda_seg,&EbdaData->ata.devices[device].mode, ATA_MODE_PIO16);
2580 BX_PANIC("ata-detect: Failed to detect ATA device\n");
2598 write_byte(ebda_seg,&EbdaData->ata.devices[device].device,ATA_DEVICE_HD);
2599 write_byte(ebda_seg,&EbdaData->ata.devices[device].removable, removable);
2600 write_byte(ebda_seg,&EbdaData->ata.devices[device].mode, mode);
2601 write_word(ebda_seg,&EbdaData->ata.devices[device].blksize, blksize);
2602 write_word(ebda_seg,&EbdaData->ata.devices[device].pchs.heads, heads);
2603 write_word(ebda_seg,&EbdaData->ata.devices[device].pchs.cylinders, cylinders);
2604 write_word(ebda_seg,&EbdaData->ata.devices[device].pchs.spt, spt);
2605 write_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_low, sectors_low);
2606 write_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_high, sectors_high);
2607 BX_INFO("ata%d-%d: PCHS=%u/%d/%d translation=", channel, slave,cylinders, heads, spt);
2613 write_byte(ebda_seg,&EbdaData->ata.devices[device].translation, translation);
2665 write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.heads, heads);
2666 write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.cylinders, cylinders);
2667 write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.spt, spt);
2670 write_byte(ebda_seg,&EbdaData->ata.hdidmap[hdcount], device);
2681 write_byte(ebda_seg,&EbdaData->ata.devices[device].device,ATA_DEVICE_CDROM);
2682 write_byte(ebda_seg,&EbdaData->ata.devices[device].mode, ATA_MODE_PIO16);
2685 BX_PANIC("ata-detect: Failed to detect ATAPI device\n");
2692 write_byte(ebda_seg,&EbdaData->ata.devices[device].device, type);
2693 write_byte(ebda_seg,&EbdaData->ata.devices[device].removable, removable);
2694 write_byte(ebda_seg,&EbdaData->ata.devices[device].mode, mode);
2695 write_word(ebda_seg,&EbdaData->ata.devices[device].blksize, blksize);
2698 write_byte(ebda_seg,&EbdaData->ata.cdidmap[cdcount], device);
2709 sizeinmb = (read_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_high) << 21)
2710 | (read_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_low) >> 11);
2712 // Read ATA/ATAPI version
2743 printf("ata%d %s: ",channel,slave?" slave":"master");
2746 printf(" ATA-%d Hard-Disk (%4u MBytes)\n", version, (Bit16u)sizeinmb);
2748 printf(" ATA-%d Hard-Disk (%4u GBytes)\n", version, (Bit16u)(sizeinmb>>10));
2751 printf("ata%d %s: ",channel,slave?" slave":"master");
2753 if(read_byte(ebda_seg,&EbdaData->ata.devices[device].device)==ATA_DEVICE_CDROM)
2759 printf("ata%d %s: Unknown device\n",channel,slave?" slave":"master");
2766 write_byte(ebda_seg,&EbdaData->ata.hdcount, hdcount);
2767 write_byte(ebda_seg,&EbdaData->ata.cdcount, cdcount);
2779 // ATA/ATAPI driver : software reset
2781 // ATA-3
2796 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
2797 iobase2 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase2);
2810 type=read_byte(ebda_seg,&EbdaData->ata.devices[device].type);
2820 if (type == ATA_TYPE_ATA) //ATA
2835 // ATA/ATAPI driver : execute a non data command
2842 // ATA/ATAPI driver : execute a data-in command
2865 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
2866 iobase2 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase2);
2867 mode = read_byte(ebda_seg, &EbdaData->ata.devices[device].mode);
2868 blksize = 0x200; // was = read_word(ebda_seg, &EbdaData->ata.devices[device].blksize);
2873 write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
2874 write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
2944 mov dx, _ata_cmd_data_in.iobase1 + 2[bp] ;; ATA data read port
2966 write_word(ebda_seg, &EbdaData->ata.trsfsectors,current);
2993 // ATA/ATAPI driver : execute a data-out command
3016 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
3017 iobase2 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase2);
3018 mode = read_byte(ebda_seg, &EbdaData->ata.devices[device].mode);
3019 blksize = 0x200; // was = read_word(ebda_seg, &EbdaData->ata.devices[device].blksize);
3024 write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
3025 write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
3095 mov dx, _ata_cmd_data_out.iobase1 + 2[bp] ;; ATA data write port
3119 write_word(ebda_seg, &EbdaData->ata.trsfsectors,current);
3145 // ATA/ATAPI driver : execute a packet command
3181 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
3182 iobase2 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase2);
3183 mode = read_byte(ebda_seg, &EbdaData->ata.devices[device].mode);
3191 write_word(ebda_seg, &EbdaData->ata.trsfsectors,0);
3192 write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L);
3234 mov dx, _ata_cmd_packet.iobase1 + 2[bp] ;; ATA data write port
3334 mov dx, _ata_cmd_packet.iobase1 + 2[bp] ;; ATA data read port
3405 write_dword(ebda_seg, &EbdaData->ata.trsfbytes,transfer);
3422 // End of ATA/ATAPI Driver
3426 // Start of ATA/ATAPI generic functions
3464 if (read_byte(ebda_seg,&EbdaData->ata.devices[device].type) != ATA_TYPE_ATAPI) {
3514 write_dword(ebda_seg,&EbdaData->ata.devices[device].blksize, block_len);
3524 if (sectors != read_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_low))
3526 write_dword(ebda_seg,&EbdaData->ata.devices[device].sectors_low, sectors);
3539 if (read_byte(ebda_seg,&EbdaData->ata.devices[device].type) != ATA_TYPE_ATAPI)
3542 if (read_byte(ebda_seg,&EbdaData->ata.devices[device].device) != ATA_DEVICE_CDROM)
3549 // End of ATA/ATAPI generic functions
3722 write_byte(ebda_seg, &EbdaData->ata.hdcount, read_byte(ebda_seg, &EbdaData->ata.hdcount) + 1);
5233 // Get the ata channel
5234 device=read_byte(ebda_seg,&EbdaData->ata.hdidmap[GET_ELDL()-0x80]);
5276 nlc = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.cylinders);
5277 nlh = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.heads);
5278 nlspt = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.spt);
5289 nph = read_word(ebda_seg, &EbdaData->ata.devices[device].pchs.heads);
5290 npspt = read_word(ebda_seg, &EbdaData->ata.devices[device].pchs.spt);
5305 SET_AL(read_word(ebda_seg, &EbdaData->ata.trsfsectors));
5325 nlc = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.cylinders);
5326 nlh = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.heads);
5327 nlspt = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.spt);
5328 count = read_byte(ebda_seg, &EbdaData->ata.hdcount);
5346 status = inb(read_word(ebda_seg, &EbdaData->ata.channels[device/2].iobase1) + ATA_CB_STAT);
5359 nlc = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.cylinders);
5360 nlh = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.heads);
5361 nlspt = read_word(ebda_seg, &EbdaData->ata.devices[device].lchs.spt);
5390 if (lba_high > read_dword(ebda_seg, &EbdaData->ata.devices[device].sectors_high) ) {
5397 if (lba_high == read_dword(ebda_seg, &EbdaData->ata.devices[device].sectors_high)
5398 && lba_low >= read_dword(ebda_seg, &EbdaData->ata.devices[device].sectors_low) ) {
5413 count=read_word(ebda_seg, &EbdaData->ata.trsfsectors);
5446 npc = read_word(ebda_seg, &EbdaData->ata.devices[device].pchs.cylinders);
5447 nph = read_word(ebda_seg, &EbdaData->ata.devices[device].pchs.heads);
5448 npspt = read_word(ebda_seg, &EbdaData->ata.devices[device].pchs.spt);
5449 lba_low = read_dword(ebda_seg, &EbdaData->ata.devices[device].sectors_low);
5450 lba_high = read_dword(ebda_seg, &EbdaData->ata.devices[device].sectors_high);
5451 blksize = read_word(ebda_seg, &EbdaData->ata.devices[device].blksize);
5479 write_word(DS, SI+(Bit16u)&Int13DPT->dpte_offset, &EbdaData->ata.dpte);
5483 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
5484 iobase2 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase2);
5485 irq = read_byte(ebda_seg, &EbdaData->ata.channels[channel].irq);
5486 mode = read_byte(ebda_seg, &EbdaData->ata.devices[device].mode);
5487 translation = read_byte(ebda_seg, &EbdaData->ata.devices[device].translation);
5495 write_word(ebda_seg, &EbdaData->ata.dpte.iobase1, iobase1);
5496 write_word(ebda_seg, &EbdaData->ata.dpte.iobase2, iobase2 + ATA_CB_DC);
5497 write_byte(ebda_seg, &EbdaData->ata.dpte.prefix, (0xe | (device % 2))<<4 );
5498 write_byte(ebda_seg, &EbdaData->ata.dpte.unused, 0xcb );
5499 write_byte(ebda_seg, &EbdaData->ata.dpte.irq, irq );
5500 write_byte(ebda_seg, &EbdaData->ata.dpte.blkcount, 1 );
5501 write_byte(ebda_seg, &EbdaData->ata.dpte.dma, 0 );
5502 write_byte(ebda_seg, &EbdaData->ata.dpte.pio, 0 );
5503 write_word(ebda_seg, &EbdaData->ata.dpte.options, options);
5504 write_word(ebda_seg, &EbdaData->ata.dpte.reserved, 0);
5506 write_byte(ebda_seg, &EbdaData->ata.dpte.revision, 0x11);
5508 write_byte(ebda_seg, &EbdaData->ata.dpte.revision, 0x10);
5511 for (i=0; i<15; i++) checksum+=read_byte(ebda_seg, ((Bit8u*)(&EbdaData->ata.dpte)) + i);
5513 write_byte(ebda_seg, &EbdaData->ata.dpte.checksum, checksum);
5522 iface = read_byte(ebda_seg, &EbdaData->ata.channels[channel].iface);
5523 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
5640 // Get the ata channel
5641 device=read_byte(ebda_seg,&EbdaData->ata.cdidmap[GET_ELDL()-0xE0]);
5725 count = (Bit16u)(read_dword(ebda_seg, &EbdaData->ata.trsfbytes) >> 11);
5740 locks = read_byte(ebda_seg, &EbdaData->ata.devices[device].lock);
5749 write_byte(ebda_seg, &EbdaData->ata.devices[device].lock, ++locks);
5758 write_byte(ebda_seg, &EbdaData->ata.devices[device].lock, --locks);
5769 locks = read_byte(ebda_seg, &EbdaData->ata.devices[device].lock);
5811 blksize = read_word(ebda_seg, &EbdaData->ata.devices[device].blksize);
5831 write_word(DS, SI+(Bit16u)&Int13DPT->dpte_offset, &EbdaData->ata.dpte);
5835 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
5836 iobase2 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase2);
5837 irq = read_byte(ebda_seg, &EbdaData->ata.channels[channel].irq);
5838 mode = read_byte(ebda_seg, &EbdaData->ata.devices[device].mode);
5846 write_word(ebda_seg, &EbdaData->ata.dpte.iobase1, iobase1);
5847 write_word(ebda_seg, &EbdaData->ata.dpte.iobase2, iobase2 + ATA_CB_DC);
5848 write_byte(ebda_seg, &EbdaData->ata.dpte.prefix, (0xe | (device % 2))<<4 );
5849 write_byte(ebda_seg, &EbdaData->ata.dpte.unused, 0xcb );
5850 write_byte(ebda_seg, &EbdaData->ata.dpte.irq, irq );
5851 write_byte(ebda_seg, &EbdaData->ata.dpte.blkcount, 1 );
5852 write_byte(ebda_seg, &EbdaData->ata.dpte.dma, 0 );
5853 write_byte(ebda_seg, &EbdaData->ata.dpte.pio, 0 );
5854 write_word(ebda_seg, &EbdaData->ata.dpte.options, options);
5855 write_word(ebda_seg, &EbdaData->ata.dpte.reserved, 0);
5856 write_byte(ebda_seg, &EbdaData->ata.dpte.revision, 0x11);
5859 for (i=0; i<15; i++) checksum+=read_byte(ebda_seg, ((Bit8u*)(&EbdaData->ata.dpte)) + i);
5861 write_byte(ebda_seg, &EbdaData->ata.dpte.checksum, checksum);
5870 iface = read_byte(ebda_seg, &EbdaData->ata.channels[channel].iface);
5871 iobase1 = read_word(ebda_seg, &EbdaData->ata.channels[channel].iobase1);
10640 ;; ATA/ATAPI driver setup