34#define MAX(a,b) (((a)>(b))?(a):(b))
35#define MIN(a,b) (((a)<(b))?(a):(b))
109 xenon_ata_wait_drq(dev);
113 for (i = 0; i <
size / 4; i++)
117 for (i = 0; i <
size / 16; ++i) {
118 *buf32++ = *reg_data;
119 *buf32++ = *reg_data;
120 *buf32++ = *reg_data;
121 *buf32++ = *reg_data;
137 xenon_ata_wait_drq(dev);
140 for (i = 0; i <
size / 4; i++)
170 ss =
MIN(s, 0x10000 - (b & 0xffff));
174 dev->
prds[i].
size_flags = __builtin_bswap32((ss & 0xffff) | (s > 0 ? 0 : 0x80000000));
180 printf(
"ATA DMA transfer too big\n");
210 printf(
"ATA DMA transfer error\n");
230 for (i = 0; i<
sizeof (
data); i += 2) {
231 data[i] = info[i + 1];
232 data[i + 1] = info[i];
236 strncpy(text,
data + 20, 20);
238 printf(
" * Serial: %s\n", text);
240 strncpy(dev->
rev,
data + 46, 8);
242 printf(
" * Firmware: %s\n", dev->
rev);
246 printf(
" * Model: %s\n", dev->
model);
250 printf(
" * #cylinders: %d\n", (
int) dev->
cylinders);
251 printf(
" * #heads: %d\n", (
int) dev->
heads);
252 printf(
" * #sectors: %d\n", (
int) dev->
size);
266 xenon_ata_wait_busy(dev);
271 unsigned int cylinder;
283 || head > dev->
heads) {
284 printf(
"sector %d can not be addressed "
285 "using CHS addressing", sector);
300 xenon_ata_setlba(dev, sector,
size);
302 0xE0 | ((sector >> 24) & 0x0F));
310 xenon_ata_setlba(dev, sector >> 24,
size >> 8);
312 xenon_ata_setlba(dev, sector,
size);
324xenon_ata_read_sectors(
sec_t start_sector,
sec_t sector_size,
void *buf) {
330 xenon_ata_setaddress(dev, start_sector, sector_size);
334 unsigned int sect = 0;
336 xenon_ata_wait_ready(dev);
337 for (sect = 0; sect < sector_size; sect++) {
339 asm volatile (
"sync");
340 printf(
"ATA read error\n");
345 asm volatile (
"sync");
349 xenon_ata_wait_ready(dev);
352 printf(
"ATA DMA read error\n");
353 asm volatile (
"sync");
356 asm volatile (
"sync");
363xenon_ata_write_sectors(
lba_t start_sector,
int sector_size,
const void *buf) {
370 xenon_ata_setaddress(dev, start_sector, sector_size);
374 xenon_ata_wait_ready(dev);
375 for (sect = 0; sect < sector_size; sect++) {
377 printf(
"ATA write error\n");
390 xenon_ata_wait_busy(dev);
395 xenon_ata_wait_ready(dev);
397 xenon_ata_pio_read(dev, info,
sizeof (info));
401 xenon_ata_dumpinfo(dev, info);
415 xenon_ata_wait_ready(dev);
417 xenon_ata_pio_write(dev, packet, 12);
422#define SK(sense)((sense>>16) & 0xFF)
423#define ASC(sense)((sense>>8) & 0xFF)
424#define ASCQ(sense)((sense>>0) & 0xFF)
428 char cdb[12] = {0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
431 memset(buf, 0,
sizeof (buf));
433 cdb[4] =
sizeof (buf);
435 xenon_atapi_packet(dev, cdb, 0);
436 xenon_ata_wait_ready(dev);
437 if (xenon_ata_pio_read(dev, buf,
sizeof (buf))) {
438 printf(
"ATAPI request sense failed\n");
442 return (buf[2] << 16) | (buf[12] << 8) | buf[13];
448 char cdb[12] = {0x12, 0x00, 0x00, 0x00, 0x24, 0xC0,
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
451 memset(buf, 0,
sizeof (buf));
453 xenon_atapi_packet(dev, cdb, 0);
454 xenon_ata_wait_ready(dev);
455 if (xenon_ata_pio_read(dev, buf,
sizeof (buf))) {
456 printf(
"ATAPI inquiry failed\n");
460 memcpy(dev->
model, &buf[8], 24);
461 dev->
model[24] =
'\0';
463 memcpy(dev->
rev, &buf[32], 4);
466 printf(
"ATAPI inquiry model: %s %s\n", dev->
model, dev->
rev);
476 memset(buf, 0,
sizeof (buf));
478 char cdb[12] = {0xE7, 0x48, 0x49, 0x54, 0x30, 0x90,
479 0x90, 0xd0, 0x01, 0x00, 0x00, 0x00};
481 xenon_atapi_packet(dev, cdb, 0);
482 xenon_ata_wait_ready(dev);
483 if (xenon_ata_pio_read(dev, buf,
sizeof (buf))) {
484 printf(
"DVD set mode b failed\n");
494 memset(buf, 0,
sizeof (buf));
496 char cdb[12] = {0xFF, 0x08, 0x05, 0x00, 0x05, 0x01,
497 0x03, 0x00, 0x04, 0x07, 0x00, 0x00};
499 xenon_atapi_packet(dev, cdb, 0);
500 xenon_ata_wait_ready(dev);
501 if (xenon_ata_pio_read(dev, buf,
sizeof (buf))) {
503 printf(
"DVD drive key read failed with sense: %06x\n", sense);
507 memcpy(dvdkey, buf, 0x10);
517 memset(buf, 0, 0x3A);
527 memset(buf + 0x0A, 0xFF, 0x10);
529 char cdb[12] = {0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
530 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00};
533 xenon_atapi_packet(dev, cdb, 0);
534 xenon_ata_wait_ready(dev);
535 if (xenon_ata_pio_write(dev, buf,
sizeof (buf))) {
537 printf(
" ! DVD drive key erase failed with sense: %06x\n", sense);
542 memcpy(buf + 0x0A, dvdkey, 0x10);
544 xenon_atapi_packet(dev, cdb, 0);
545 xenon_ata_wait_ready(dev);
546 if (xenon_ata_pio_write(dev, buf,
sizeof (buf))) {
548 printf(
"DVD drive key set failed with sense: %06x\n", sense);
556xenon_atapi_read_sectors(
sec_t start_sector,
sec_t sector_size,
void *buf) {
563 readcmd.lba = start_sector;
564 readcmd.length = sector_size;
568 xenon_ata_wait_ready(dev);
571 unsigned int sect = 0;
574 xenon_atapi_packet(dev, (
char *) &readcmd, 0);
575 xenon_ata_wait_ready(dev);
576 for (sect = 0; sect < sector_size; sect++) {
581 if (
SK(sense) == 0x02 &&
ASC(sense) == 0x3a) {
586 if ((
SK(sense) == 0x02 &&
ASC(sense) == 0x4) ||
SK(sense) == 0x6) {
587 if (!maxretries)
return -1;
593 printf(
"ATAPI read error\n");
600 xenon_atapi_packet(dev, (
char *) &readcmd, 1);
601 xenon_ata_wait_ready(dev);
607 if (
SK(sense) == 0x02 &&
ASC(sense) == 0x3a) {
612 if ((
SK(sense) == 0x02 &&
ASC(sense) == 0x4) ||
SK(sense) == 0x6) {
613 if (!maxretries)
return -1;
619 printf(
"ATAPI DMA read error\n");
631 xenon_ata_wait_busy(dev);
635 xenon_ata_wait_ready(dev);
639 return xenon_atapi_inquiry_model(dev);
649 if (bswap_16(info16[49]) & (1 << 9)) {
651 if (bswap_16(info16[83]) & (1 << 10))
659 dev->
size = __builtin_bswap32(*((
uint32_t *) & info16[60]));
661 dev->
size = __builtin_bswap32(*((
uint32_t *) & info16[100]));
665 dev->
heads = bswap_16(info16[3]);
668 xenon_ata_dumpinfo(dev, info);
682 xenon_ata_identify(dev);
692 printf(
"no ata device connected.\n");
711 printf(
"SATA device at %08lx\n", dev->
ioaddress);
716static int ata_ready = 0;
717static int atapi_ready = 0;
719static bool atapi_inserted() {
723static bool ata_startup(
void){
726static bool ata_inserted(
void) {
729static bool ata_readsectors(
sec_t sector,
sec_t numSectors,
void* buffer) {
730 if(xenon_ata_read_sectors(sector,numSectors,buffer))
734static bool atapi_readsectors(
sec_t sector,
sec_t numSectors,
void* buffer) {
735 if(xenon_atapi_read_sectors(sector,numSectors,buffer))
739static bool ata_writesectors(
sec_t sector,
sec_t numSectors,
const void* buffer){
740 if(xenon_ata_write_sectors(sector,numSectors,buffer))
745static bool ata_clearstatus(
void){
749static bool ata_shutdown(
void){
754static s32 ata_sectors(
void)
760static s32 atapi_sectors(
void)
792 *(
volatile uint32_t*)0xd0110060 = __builtin_bswap32(0x112400);
793 *(
volatile uint32_t*)0xd0110080 = __builtin_bswap32(0x407231BE);
794 *(
volatile uint32_t*)0xea001318 &= __builtin_bswap32(0xFFFFFFF0);
808 *(
volatile uint32_t*)0xd0108060 = __builtin_bswap32(0x112400);
809 *(
volatile uint32_t*)0xd0108080 = __builtin_bswap32(0x407231BE);
810 *(
volatile uint32_t*)0xea001218 &= __builtin_bswap32(0xFFFFFFF0);
struct xenon_ata_device ata
DISC_INTERFACE xenon_ata_ops
int xenon_ata_init1(struct xenon_ata_device *dev, uint32_t ioaddress, uint32_t ioaddress2)
void xenon_atapi_set_modeb(void)
DISC_INTERFACE xenon_atapi_ops
int xenon_atapi_set_dvd_key(unsigned char *dvdkey)
struct xenon_ata_device atapi
int xenon_atapi_request_sense(struct xenon_ata_device *dev)
int xenon_atapi_get_dvd_key_tsh943a(unsigned char *dvdkey)
#define XENON_ATA_REG_CYLLSB
#define XENON_ATA_REG_CYLMSB
#define XENON_ATA_REG_CMD
#define XENON_ATA_REG_ERROR
#define XENON_ATA_REG_STATUS
#define XENON_ATA_REG_DISK
#define XENON_ATA_REG_DATA
#define XENON_CDROM_SECTOR_SIZE
#define XENON_ATA_REG_LBAHIGH
#define XENON_ATA_REG_SECTORS
#define XENON_ATA_REG_LBALOW
#define XENON_ATA_REG_LBAMID
#define XENON_ATA_REG2_CONTROL
#define XENON_ATA_REG_SECTNUM
#define XENON_DISK_SECTOR_SIZE
@ XENON_ATA_CMD_IDENTIFY_DEVICE
@ XENON_ATA_CMD_WRITE_SECTORS_EXT
@ XENON_ATA_CMD_READ_SECTORS_EXT
@ XENON_ATA_CMD_IDENTIFY_PACKET_DEVICE
@ XENON_ATA_CMD_READ_DMA_EXT
@ XENON_ATA_DMA_TABLE_OFS
#define XENON_ATA_REG_FEATURES
#define FEATURE_XENON_ATA
bool(* FN_MEDIUM_STARTUP)(void)
bool(* FN_MEDIUM_CLEARSTATUS)(void)
#define FEATURE_MEDIUM_CANREAD
s32(* FN_MEDIUM_DEVSECTORS)(void)
bool(* FN_MEDIUM_SHUTDOWN)(void)
#define DISKIO_ERROR_NO_MEDIA
#define FEATURE_XENON_ATAPI
bool(* FN_MEDIUM_READSECTORS)(sec_t sector, sec_t numSectors, void *buffer)
bool(* FN_MEDIUM_WRITESECTORS)(sec_t sector, sec_t numSectors, const void *buffer)
#define FEATURE_MEDIUM_CANWRITE
bool(* FN_MEDIUM_ISINSERTED)(void)
void memdcbf(void *addr, int len)
void memdcbst(void *addr, int len)
void memdcbt(void *addr, int len)
unsigned int __mf_uintptr_t __attribute__((__mode__(__pointer__)))
FN_MEDIUM_DEVSECTORS sectors
uint16_t sectors_per_track
struct xenon_ata_dma_prd * prds
int32_t s32
32bit signed integer