11#include "irx_imports.h"
17IRX_ID(
"cdvd_xatapi_driver", 2, 3);
84 vu16 r_spd_ata_nsector;
85 vu16 r_spd_ata_sector;
88 vu16 r_spd_ata_select;
89 vu16 r_spd_ata_status;
96 vu16 r_spd_ata_control;
107 vu16 r_spd_mwdma_mode;
108 vu16 r_spd_udma_mode;
111#define USE_DEV5_SPEED_REGS() struct dev5_speed_regs_ *const dev5_speed_regs = (void *)0xBF410000
140 vu16 r_fpga_spckmode;
143 vu16 r_fpga_revision;
146#define USE_DEV5_FPGA_REGS() struct dev5_fpga_regs_ *const dev5_fpga_regs = (void *)0xBF414000
148static int xatapi_dev_devctl(
149 const iop_file_t *f,
const char *name,
int cmd,
void *args,
unsigned int arglen,
void *buf,
unsigned int buflen);
150static void speed_init(
void);
151static void speed_device_init(
void);
152static void do_hex_dump(
void *ptr,
int len);
153static void ata_pio_mode(
int mode);
154static void ata_multiword_dma_mode(
int mode);
155static void ata_ultra_dma_mode(
int mode);
156static void AtaEjectIntrHandle(
void);
157static int sceCdAtapiExecCmd_local(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
unsigned int pkt_len,
int proto);
158static int sceCdAtapiExecCmd(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
int pkt_len,
int proto);
159static void DmaRun_spck(
char *buf,
unsigned int secsize);
160static int sceCdAtapiWaitResult_local(
void);
161static void atapi_device_set_transfer_mode_outer(
int device);
162static void ata_device_set_transfer_mode_outer(
int device);
163static void sceAtapiInit(
int device);
164static void sceAtInterInit(
void);
165static int create_event_flags(
void);
166static void FpgaLayer1On(
void);
167static void FpgaLayer1Off(
void);
168static void FpgaLayer2Off(
void);
169static void FpgaXfrenOn(
void);
170static void FpgaXfrenOff(
void);
171static void FpgaSpckmodeOn(
void);
172static void FpgaSpckmodeOff(
void);
173static void FpgaXfdir(
int dir);
174static int FpgaGetRevision(
void);
175static int do_fpga_check_spckcnt(
void);
176static void FpgaCheckWriteBuffer(
void);
177static void FpgaCheckWriteBuffer2(
void);
178static void FpgaClearBuffer(
void);
179static int Mpeg2CheckPadding(
char *buf,
unsigned int bufsize,
int *retptr,
int *pesscramblingpackptr);
180static int Mpeg2CheckScramble(
char *buf,
unsigned int bufsize);
184static int g_devctl_retonly_unset;
185static vu16 *
const g_dev9_reg_1460 = (
void *)0xBF801460;
186static vu16 *
const g_dev9_reg_power = (
void *)0xBF80146C;
188static int (*p_dev5_intr_cb)(
int flag);
191IOMANX_RETURN_VALUE_IMPL(0);
193IOMANX_RETURN_VALUE_IMPL(
EIO);
196 IOMANX_RETURN_VALUE(0), IOMANX_RETURN_VALUE(0), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
197 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
198 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
199 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
200 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
201 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE_S64(
EIO), (
void *)&xatapi_dev_devctl,
202 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
206static int g_reset_scrambling_pack;
208static int g_pes_scrambling_control_pack;
210static int g_dma_mode_value;
212static int g_dma_speed_value;
214static int g_should_wait_for_dma_flag;
216static int g_is_wait_busy;
218static int g_verbose_level;
220static int g_ata_devinfo_init;
221static int g_bf40200a_is_set_ptr;
222static u32 *g_cd_sc_ffffffd9_ptr;
223static int g_is_in_read_info;
224static int g_io_event_flag;
225static int g_adma_evfid;
226static int g_acmd_evfid;
227static int g_dma_lock_sema;
228static void (*g_dev5_intr_cbs[16])(
int flag);
229static void (*g_dev5_predma_cbs[4])(u32 bcr_in,
int dir);
230static void (*g_dev5_postdma_cbs[4])(u32 bcr_in,
int dir);
231static int g_atapi_event_flag;
234static int ata_param[128];
235static int g_atapi_xfer_buf[130];
237static int do_atapi_cmd_inquiry_12h(s16 dev_nr)
245 for ( i = 0; retres && i < 16; i += 1 )
247 memset(pkt, 0,
sizeof(pkt));
249 pkt[4] =
sizeof(outbuf);
250 retres = sceCdAtapiExecCmd_local(dev_nr, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
253 retres = sceCdAtapiWaitResult_local();
256 VERBOSE_KPRINTF(1,
"Atapi Drive ATAPI_CMD_READ_EXT_INFO NG\n");
262 do_hex_dump(outbuf,
sizeof(outbuf));
263 return strncmp(&outbuf[32],
"BOOT", 4) ? 1 : 0;
266static int do_atapi_request_test_unit_ready(s16 dev_nr,
int *errptr,
int *ctrlptr)
273 memset(pkt, 0,
sizeof(pkt));
275 retres = xatapi_7_sceCdAtapiExecCmd(dev_nr, 0, 0, 0, pkt,
sizeof(pkt), 1);
278 retres = xatapi_8_sceCdAtapiWaitResult();
279 *errptr = (u8)xatapi_11_sceAtaGetError();
280 *ctrlptr = (u8)xatapi_12_get_ata_control();
284static int atapi_req_sense_get(s16 dev_nr,
int *retptr)
291 memset(pkt, 0,
sizeof(pkt));
293 pkt[4] =
sizeof(outbuf);
294 result = xatapi_7_sceCdAtapiExecCmd(dev_nr, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
297 result = xatapi_8_sceCdAtapiWaitResult();
300 *retptr = ((outbuf[2] & 0xF) << 16) | ((u8)outbuf[12] << 8) | (u8)outbuf[13];
305static int atapi_exec_cmd_request_sense_03h_unused(s16 dev_nr,
int *retptr)
312 memset(pkt, 0,
sizeof(pkt));
314 pkt[4] =
sizeof(outbuf);
315 result = sceCdAtapiExecCmd_local(dev_nr, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
318 result = sceCdAtapiWaitResult_local();
321 *retptr = ((outbuf[2] & 0xF) << 16) | ((u8)outbuf[12] << 8) | (u8)outbuf[13];
327static int do_start_stop_unit_1bh_unused(
void)
334 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
336 memset(pkt, 0,
sizeof(pkt));
340 retres = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
343 retres = sceCdAtapiWaitResult_local();
346 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT NG\n");
350 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT OK\n");
355 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
357 memset(pkt, 0,
sizeof(pkt));
361 retres = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
364 retres = sceCdAtapiWaitResult_local();
367 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start NG %d\n", i);
371 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start OK\n");
374 VERBOSE_KPRINTF(1,
" PS2 Eject On Atapi Unit Dummy Eject Ret %d\n", retres);
379static int chgsys_callback_cb(
int *mediaptr,
int want_atapi)
390 VERBOSE_KPRINTF(1,
"Ps2 Drive Spindle -> Atapi \n");
392 for ( i = 0; i < 10 && retres && retres != -550; i += 1 )
394 memset(pkt, 0,
sizeof(pkt));
398 retres = sceCdAtapiExecCmd(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
401 retres = sceCdAtapiWaitResult_local();
404 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start NG %d\n", i);
408 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start OK\n");
412 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle -> Ps2\n");
414 for ( i = 0; i < 16 && tryres1 && tryres1 != -550; i += 1 )
416 memset(pkt, 0,
sizeof(pkt));
420 tryres1 = sceCdAtapiExecCmd_local(0, outbuf1, 1,
sizeof(outbuf1), pkt,
sizeof(pkt), 2);
423 tryres1 = sceCdAtapiWaitResult_local();
426 VERBOSE_KPRINTF(1,
"Atapi Drive ATAPI_CMD_READ_EXT_INFO NG\n");
434 maskchk = (((u8)outbuf1[5] >> 1) ^ 1) & 1;
435 if ( (outbuf1[3] & 0x10) )
439 VERBOSE_KPRINTF(1,
"Atapi Drive Media found.\n");
440 memset(pkt, 0,
sizeof(pkt));
443 pkt[8] =
sizeof(outbuf);
445 !sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2) && !sceCdAtapiWaitResult_local() )
447 VERBOSE_KPRINTF(1,
"Atapi Drive Media DVD:%d.\n", outbuf[5] & 0x20);
448 *mediaptr = (outbuf[5] & 0x20) ? 3 : 2;
453 VERBOSE_KPRINTF(1,
"Atapi Drive No Media or Now checking.\n");
454 VERBOSE_KPRINTF(1,
"Atapi Drive No Media or No SpinUp.\n");
459 VERBOSE_KPRINTF(1,
"Atapi Drive Spin Up.\n");
461 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
463 memset(pkt, 0,
sizeof(pkt));
466 retres = sceCdAtapiExecCmd(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
469 retres = sceCdAtapiWaitResult_local();
472 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Stop NG\n");
476 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Stop OK\n");
480 VERBOSE_KPRINTF(1,
"Atapi Drive Not Spin Up.\n");
482 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
484 memset(pkt, 0,
sizeof(pkt));
488 retres = sceCdAtapiExecCmd(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
491 retres = sceCdAtapiWaitResult_local();
494 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT NG\n");
498 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT OK\n");
506static int sceCdAtapi_SC(
void)
512 memset(pkt, 0,
sizeof(pkt));
517 for ( i = 0; i < 10 && retres; i += 1 )
519 retres = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
520 if ( retres || (retres = sceCdAtapiWaitResult_local()) )
525 VERBOSE_KPRINTF(1,
"sceCdAtapi SC fail\n");
528 *g_cd_sc_ffffffd9_ptr = 0;
529 VERBOSE_KPRINTF(1,
"sceCdAtapi SC OK\n");
533int xatapi_15_exec_f6_f9_scsi(
void)
541 memset(pkt, 0,
sizeof(pkt));
546 for ( i = 0; i < 4 && retres1; i += 1 )
548 retres1 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
549 if ( retres1 || (retres1 = sceCdAtapiWaitResult_local()) )
552 if ( retres1 && !(outbuf[4] & 0x80) )
554 memset(pkt, 0,
sizeof(pkt));
559 for ( i = 0; i < 10 && retres2; i += 1 )
561 retres2 = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
564 retres2 = sceCdAtapiWaitResult_local();
573static int sceCdAtapi_BC(
void)
584 memset(pkt, 0,
sizeof(pkt));
588 pkt[8] =
sizeof(outbuf1);
589 for ( i = 0; i < 10 && retres1; i += 1 )
591 retres1 = sceCdAtapiExecCmd_local(0, outbuf1, 1,
sizeof(outbuf1), pkt,
sizeof(pkt), 2);
592 if ( retres1 || (retres1 = sceCdAtapiWaitResult_local()) )
596 if ( !retres1 || (outbuf1[4] & 0x80) )
600 memset(pkt, 0,
sizeof(pkt));
605 for ( i = 0; i < 10 && retres2; i += 1 )
607 retres2 = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
610 retres2 = sceCdAtapiWaitResult_local();
621 memset(pkt, 0,
sizeof(pkt));
625 pkt[8] =
sizeof(outbuf);
626 for ( i = 0; i < 10 && retres3; i += 1 )
628 retres3 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
629 if ( retres3 || (retres3 = sceCdAtapiWaitResult_local()) )
632 if ( !retres3 && (outbuf[4] & 0x81) )
634 *g_cd_sc_ffffffd9_ptr = 1;
641 memset(pkt, 0,
sizeof(pkt));
645 pkt[8] =
sizeof(outbuf);
646 for ( i = 0; i < 10 && retres4; i += 1 )
648 retres4 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
649 if ( retres4 || (retres4 = sceCdAtapiWaitResult_local()) )
654 VERBOSE_KPRINTF(1,
"sceCdAtapi BC 0 fail\n");
660 if ( g_should_wait_for_dma_flag && !ReferEventFlagStatus(g_adma_evfid, &efinfo) && !efinfo.
currBits )
661 SetEventFlag(g_adma_evfid, 1);
662 SetEventFlag(g_acmd_evfid, 1);
664 for ( i = 0; i < 100 && !retres4; i += 1 )
667 if ( !retres4 || waresontmp )
673 VERBOSE_KPRINTF(0,
"sceCdAtapi BC 1 fail\n");
679 for ( i = 0; i < 100 && !retres4; i += 1 )
682 if ( !retres4 || waresontmp )
687 VERBOSE_KPRINTF(0,
"sceCdAtapi BC 2 fail\n");
691 if ( g_should_wait_for_dma_flag )
692 WaitEventFlag(g_adma_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
694 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
695 memset(pkt, 0,
sizeof(pkt));
698 pkt[8] =
sizeof(outbuf);
699 for ( i = 0; i < 10 && retres4; i += 1 )
701 retres4 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 3);
702 if ( retres4 || (retres4 = sceCdAtapiWaitResult_local()) )
707 VERBOSE_KPRINTF(1,
"sceCdAtapi BC 3 fail\n");
711 VERBOSE_KPRINTF(1,
"sceCdAtapi BC OK\n");
718 if ( g_should_wait_for_dma_flag )
719 WaitEventFlag(g_adma_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
720 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
728 memset(pkt, 0,
sizeof(pkt));
732 pkt[8] =
sizeof(outbuf);
733 for ( i = 0; i < 10 && retres5; i += 1 )
735 retres5 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
736 if ( retres5 || (retres5 = sceCdAtapiWaitResult_local()) )
741 *g_cd_sc_ffffffd9_ptr = (outbuf[4] & 0x81) ? 1 : 0;
746static int atapi_spin_status_get(
int unused_arg1,
void *buf)
752 memset(pkt, 0,
sizeof(pkt));
756 result = xatapi_7_sceCdAtapiExecCmd(0, buf, 1, 6, pkt,
sizeof(pkt), 2);
757 return (!result) ? xatapi_8_sceCdAtapiWaitResult() : result;
760static int atapi_check_if_drive_ready(
int check_nowait)
768 VERBOSE_KPRINTF(1,
"Atapi Drive Ready Call %d\n", check_nowait);
769 ata_control = xatapi_12_get_ata_control();
770 VERBOSE_KPRINTF(1,
"Atapi Drive Ready %04x\n", ata_control);
773 int req_test_unit_ready_tmp1;
775 req_test_unit_ready_tmp1 = -1;
776 while ( req_test_unit_ready_tmp1 < 0 )
778 char spinstatus_tmp[6];
780 while ( (ata_control & 0xC0) != 64 )
782 VERBOSE_KPRINTF(1,
"Drive Not Ready %04x\n", ata_control);
784 ata_control = xatapi_12_get_ata_control();
786 req_test_unit_ready_tmp1 = do_atapi_request_test_unit_ready(0, &drive_err, &unitreadyctrl);
787 if ( req_test_unit_ready_tmp1 < 0 )
789 if ( !atapi_req_sense_get(0, &senseret) )
791 VERBOSE_KPRINTF(1,
"ReqSense %08x\n", senseret);
792 if ( (senseret & 0xFFFFFF00) == 0x23A00 )
795 if ( !atapi_spin_status_get(0, spinstatus_tmp) )
797 VERBOSE_KPRINTF(1,
"Spin Status 3:%02x 5:%02x\n", (u8)spinstatus_tmp[3], (u8)spinstatus_tmp[5]);
798 if ( (spinstatus_tmp[3] & 2) || (spinstatus_tmp[3] & 0x80) )
801 VERBOSE_KPRINTF(1,
"Atapi Drive err %08x\n", drive_err);
805 return ((ata_control & 0xC0) == 64 && do_atapi_request_test_unit_ready(0, &drive_err, &unitreadyctrl) >= 0
811static int sceFsDevctlBlkIO(s16 dev_nr,
void *buf,
void *rwbuf,
unsigned int nsec,
int secsize,
int rwtype)
814 unsigned int nsec_tmp;
820 rwbuf_tmp = (
char *)rwbuf;
822 VERBOSE_KPRINTF(1,
"dma %c %08x, nsec %d\n", rwtype ?
'w' :
'r', rwbuf, nsec);
823 for ( nsec_tmp = nsec; !retres1 && nsec_tmp; nsec_tmp -= seccnt )
825 seccnt = (nsec_tmp >= 0x21) ? 32 : nsec_tmp;
826 for ( i = 3; i < 3; i += 1 )
828 xatapi_9_sceCdSpdAtaDmaStart(rwtype);
829 memset(pkt, 0,
sizeof(pkt));
830 pkt[0] = (!rwtype) ? 0x28 : 0x2A;
831 pkt[2] = ((uiptr)rwbuf_tmp >> 24) & 0xFF;
832 pkt[3] = ((uiptr)rwbuf_tmp >> 16) & 0xFF;
833 pkt[4] = ((uiptr)rwbuf_tmp >> 8) & 0xFF;
834 pkt[5] = ((uiptr)rwbuf_tmp) & 0xFF;
836 retres1 = xatapi_7_sceCdAtapiExecCmd(dev_nr, buf, seccnt, secsize, pkt,
sizeof(pkt), 4);
839 xatapi_10_sceCdSpdAtaDmaEnd();
842 retres1 = xatapi_8_sceCdAtapiWaitResult();
843 xatapi_10_sceCdSpdAtaDmaEnd();
844 if ( retres1 != -510 )
850 buf = (
char *)buf + seccnt * secsize;
855static void expbay_device_reset(
void)
857 if ( (*g_dev9_reg_power & 4) )
859 Kprintf(
"xatapi already Power On\n");
860 *g_dev9_reg_1460 |= 2;
863 Kprintf(
"xatapi Power On Start\n");
864 *g_dev9_reg_power = (*g_dev9_reg_power & ~5) | 4;
866 *g_dev9_reg_1460 |= 2;
867 *g_dev9_reg_power |= 1;
871static int cd_atapi_intr_callback_cb(
int cbarg)
873 VERBOSE_KPRINTF(1,
"dev5 interrupt\n");
874 if ( p_dev5_intr_cb )
875 p_dev5_intr_cb(cbarg);
876 VERBOSE_KPRINTF(1,
"dev5 interrupt end\n");
880static void speedRegisterIntrDispatchCb(
void *callback)
882 p_dev5_intr_cb = (int (*)(
int flag))callback;
885static void sceDev5Init(
void)
887 VERBOSE_KPRINTF(1,
"dev5 atapi Init start\n");
888 sceCdSC(0xFFFFFFE5, (
int *)cd_atapi_intr_callback_cb);
891 VERBOSE_KPRINTF(1,
"dev5 atapi Init end\n");
894static int atapi_eject_interrupt_handler(
int is_eject,
void *userdata)
901 VERBOSE_KPRINTF(1,
"Eject intr : media removal\n");
905static int xatapi_do_init(
void)
907 int (*oldcb)(
int is_eject,
void *userdata);
912 if ( !create_event_flags() )
914 sceCdSC(0xFFFFFFD9, (
int *)&sc_tmp);
915 g_cd_sc_ffffffd9_ptr = sc_tmp;
916 sceCdSC(0xFFFFFFD7, (
int *)&sc_tmp);
917 g_bf40200a_is_set_ptr = (int)sc_tmp;
919 (
int (*)(
int is_eject,
void *userdata))atapi_eject_interrupt_handler, 0);
922 VERBOSE_KPRINTF(0,
"xatapi:sceCdGetMediumRemoval NG(%x) !!\n", traylock_ret);
927 VERBOSE_KPRINTF(0,
"xatapi:Tray locked !!\n");
931 VERBOSE_KPRINTF(0,
"xatapi:Tray lock\n");
935 VERBOSE_KPRINTF(0,
"xatapi:Tray lock NG(%x) !!\n", traylock_ret);
938 expbay_device_reset();
939 VERBOSE_KPRINTF(0,
"xatapi Dev5->Rainbow\n");
941 VERBOSE_KPRINTF(1,
"xatapi Dev5->Rainbow end\n");
942 VERBOSE_KPRINTF(1,
"sceDev5Init Call\n");
944 VERBOSE_KPRINTF(1,
"sceAtInterInit Call\n");
946 VERBOSE_KPRINTF(1,
"sceAtapiInit Call\n");
948 VERBOSE_KPRINTF(1,
"sceAtapiInit end\n");
949 sceCdSC(0xFFFFFFE1, (
int *)chgsys_callback_cb);
955 VERBOSE_KPRINTF(0,
"xatapi:Tray unlock NG(%x) !!\n", traylock_ret);
960 VERBOSE_KPRINTF(0,
"xatapi:Tray unlock\n");
967int xatapi_2_terminate(
int with_quit)
973 sceCdSC(0xFFFFFFE1, &sc_tmp);
974 sceCdSC(0xFFFFFFE5, &sc_tmp);
975 sceCdSC(0xFFFFFFE0, &sc_tmp);
976 sceCdSC(0xFFFFFFDF, &sc_tmp);
977 sceCdSC(0xFFFFFFE4, &sc_tmp);
978 Kprintf(
"libxatapi_terminate\n");
982static int xatapi_dev_devctl(
983 const iop_file_t *f,
const char *name,
int cmd,
void *args,
unsigned int arglen,
void *buf,
unsigned int buflen)
990 VERBOSE_KPRINTF(1,
"xatapi devctl: cmd:%08x arg:%d\n", cmd, *(u32 *)args);
991 if ( cmd == 0x439B && PollEventFlag(g_io_event_flag, 1, WEF_AND, &efbits) == KE_EVF_COND && *(u32 *)args == 1 )
996 WaitEventFlag(g_io_event_flag, 1, WEF_AND | WEF_CLEAR, &efbits);
997 if ( g_devctl_retonly_unset )
999 SetEventFlag(g_io_event_flag, 1);
1008 switch ( *((u32 *)args + 1) )
1018 xatapi_7_sceCdAtapiExecCmd(f->
unit, buf, 1, buflen, (
char *)args + 8, *(u32 *)args, *((u32 *)args + 1));
1022 if ( *((u32 *)args + 250) )
1024 retres1 = xatapi_7_sceCdAtapiExecCmd(
1028 *((u32 *)args + 250),
1031 *((u32 *)args + 1));
1039 retres1 = xatapi_7_sceCdAtapiExecCmd(f->
unit, 0, 0, 0, (
char *)args + 8, *(u32 *)args, *((u32 *)args + 1));
1043 retres1 = xatapi_8_sceCdAtapiWaitResult();
1047 *(u32 *)buf = (u8)xatapi_11_sceAtaGetError();
1050 *(u32 *)buf = (u8)xatapi_12_get_ata_control();
1053 retres1 = sceCdAtapi_BC();
1058 retres1 = sceCdAtapi_SC();
1061 g_verbose_level = *(u32 *)args;
1064 g_reset_scrambling_pack = *(u32 *)args;
1065 if ( g_reset_scrambling_pack )
1067 g_pes_scrambling_control_pack = 0;
1071 VERBOSE_KPRINTF(1,
"pes scrambling control pack = %d\n", g_pes_scrambling_control_pack);
1075 DmaRun_spck((
char *)args, arglen);
1078 g_dma_mode_value = (*(u32 *)args & 0x40) ? 1 : 0;
1079 g_dma_speed_value = *(u32 *)args & 7;
1080 atapi_device_set_transfer_mode_outer(0);
1083 if ( buf && buflen >= 2 )
1084 *(u16 *)buf = FpgaGetRevision();
1086 Kprintf(
"CDIOC_ATAPI_GETFPGAREV:buffer NG\n");
1089 if ( buf && buflen >= 4 )
1090 *(u32 *)buf = 0x4121300;
1092 Kprintf(
"CDIOC_ATAPI_VERSION:buffer NG\n");
1095 if ( buf && buflen >= 4 )
1096 *(u32 *)buf = g_pes_scrambling_control_pack;
1098 Kprintf(
"CDIOC_ATAPI_GETPSCNT:buffer NG\n");
1101 *(u32 *)buf = atapi_check_if_drive_ready(*(u32 *)args);
1104 if ( *((u32 *)args + 3) != 2048 )
1111 "sceFsDevctlBlkIO Lsn:%d nsec:%d buffer:%08x Type:%d\n",
1115 *((u32 *)args + 4));
1117 sceFsDevctlBlkIO(f->
unit, *((
void **)args + 2), *(
void **)args, *((u32 *)args + 1), 2048, *((u32 *)args + 4));
1120 Kprintf(
"Un-support devctl %08x\n", cmd);
1124 SetEventFlag(g_io_event_flag, 1);
1125 VERBOSE_KPRINTF(1,
"xatapi devctl: cmd:%08x End.\n", cmd);
1129int _start(
int ac,
char **av)
1134 Kprintf(
"xatapi_init Call\n");
1136 g_dma_mode_value = 1;
1138 g_dma_speed_value = 2;
1139 if ( RegisterLibraryEntries(&_exp_xatapi) )
1140 return MODULE_NO_RESIDENT_END;
1142 if ( AddDrv(&ata_ioman_device) )
1145 return MODULE_NO_RESIDENT_END;
1147 return !xatapi_do_init() ? MODULE_NO_RESIDENT_END : MODULE_RESIDENT_END;
1150static int expbay_get_has_power(
void)
1152 return *g_dev9_reg_power & 4;
1155static void speedRegisterIntrCb(
int intr,
void *cb)
1157 g_dev5_intr_cbs[intr] = cb;
1160static void speedRegisterPreDmaCb(
int ctrl,
void *cb)
1162 g_dev5_predma_cbs[ctrl] = cb;
1165static void speedRegisterPostDmaCb(
int ctrl,
void *cb)
1167 g_dev5_postdma_cbs[ctrl] = cb;
1170static int speed_intr_dispatch(
int flag)
1174 USE_DEV5_SPEED_REGS();
1178 AtaEjectIntrHandle();
1181 if ( (dev5_speed_regs->r_spd_intr_stat & 0x3EFC) )
1184 0,
"SL3 register access failed(%x:%x) !!\n", dev5_speed_regs->r_spd_intr_stat, dev5_speed_regs->r_spd_intr_mask);
1187 for ( i = 0; i < 3 && (u16)(dev5_speed_regs->r_spd_intr_stat & dev5_speed_regs->r_spd_intr_mask); i += 1 )
1189 for ( j = 0; j < (int)(
sizeof(g_dev5_intr_cbs) /
sizeof(g_dev5_intr_cbs[0])); j += 1 )
1193 && (((
int)(u16)(dev5_speed_regs->r_spd_intr_stat & dev5_speed_regs->r_spd_intr_mask) >> j) & 1) )
1194 g_dev5_intr_cbs[j](flag);
1200static void speedIntrEnable(s16 mask)
1203 USE_DEV5_SPEED_REGS();
1206 dev5_speed_regs->r_spd_intr_mask &= ~mask;
1207 dev5_speed_regs->r_spd_intr_mask |= mask;
1211static void speedIntrDisable(s16 mask)
1214 USE_DEV5_SPEED_REGS();
1217 dev5_speed_regs->r_spd_intr_mask &= ~mask;
1221static int SpdDmaTransfer(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1224 USE_DEV5_SPEED_REGS();
1226 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1227 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1228 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1230 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1231 result = WaitSema(g_dma_lock_sema);
1234 dev5_speed_regs->r_spd_dma_ctrl = (dev5_speed_regs->r_spd_rev_1 >= 0x11) ? ((device & 1) | 6) : ((device & 3) | 4);
1235 if ( g_dev5_predma_cbs[device] )
1236 g_dev5_predma_cbs[device](bcr_in, dir);
1237 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1238 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1239 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1240 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1241 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1242 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1245 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1246 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1247 dmac_ch_get_madr(IOP_DMAC_CDVD),
1248 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1249 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1252 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1253 if ( g_dev5_postdma_cbs[device] )
1254 g_dev5_postdma_cbs[device](bcr_in, dir);
1255 VERBOSE_KPRINTF(1,
"SpdDmaTransfer End.\n");
1256 SignalSema(g_dma_lock_sema);
1260static int SpdDmaTransfer_extrans_1(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1263 USE_DEV5_SPEED_REGS();
1265 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1266 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1267 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1269 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1270 result = WaitSema(g_dma_lock_sema);
1273 dev5_speed_regs->r_spd_dma_ctrl = (dev5_speed_regs->r_spd_rev_1 >= 0x11) ? ((device & 1) | 6) : ((device & 3) | 4);
1274 if ( g_dev5_predma_cbs[device] )
1275 g_dev5_predma_cbs[device](bcr_in, dir);
1276 speedIntrDisable(256);
1279 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1280 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1281 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1282 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1283 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1284 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1287 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1288 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1289 dmac_ch_get_madr(IOP_DMAC_CDVD),
1290 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1291 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1294 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1295 FpgaCheckWriteBuffer();
1298 speedIntrEnable(256);
1299 if ( g_dev5_postdma_cbs[device] )
1300 g_dev5_postdma_cbs[device](bcr_in, dir);
1301 VERBOSE_KPRINTF(1,
"SpdDmaTransfer_extrans End.\n");
1302 SignalSema(g_dma_lock_sema);
1306static int SpdDmaTransfer_extrans_2(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1310 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1311 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1312 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1314 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1315 result = WaitSema(g_dma_lock_sema);
1318 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1319 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1320 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1321 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1322 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1323 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1326 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1327 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1328 dmac_ch_get_madr(IOP_DMAC_CDVD),
1329 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1330 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1333 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1334 VERBOSE_KPRINTF(1,
"SpdDmaTransfer_extrans End.\n");
1335 SignalSema(g_dma_lock_sema);
1339static int SpdDmaTransfer_extrans_3(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1343 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1344 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1345 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1347 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1348 result = WaitSema(g_dma_lock_sema);
1353 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1354 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1355 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1356 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1357 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1358 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1361 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1362 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1363 dmac_ch_get_madr(IOP_DMAC_CDVD),
1364 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1365 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1368 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1369 FpgaCheckWriteBuffer2();
1372 VERBOSE_KPRINTF(1,
"SpdDmaTransfer_extrans End.\n");
1373 SignalSema(g_dma_lock_sema);
1377static void speedLEDCtl(
int ctl)
1379 USE_DEV5_SPEED_REGS();
1382 dev5_speed_regs->r_spd_pio_data = !ctl;
1385static void speed_init(
void)
1390 semaparam.attr = SA_THPRI;
1391 semaparam.initial = 1;
1393 semaparam.option = 0;
1394 g_dma_lock_sema = CreateSema(&semaparam);
1395 if ( g_dma_lock_sema <= 0 )
1397 speedIntrDisable(0xFFFF);
1398 speedRegisterIntrDispatchCb(speed_intr_dispatch);
1399 for ( i = 0; i < (int)(
sizeof(g_dev5_intr_cbs) /
sizeof(g_dev5_intr_cbs[0])); i += 1 )
1401 g_dev5_intr_cbs[i] = 0;
1403 for ( i = 0; i < (int)(
sizeof(g_dev5_predma_cbs) /
sizeof(g_dev5_predma_cbs[0])); i += 1 )
1405 g_dev5_predma_cbs[i] = 0;
1407 for ( i = 0; i < (int)(
sizeof(g_dev5_postdma_cbs) /
sizeof(g_dev5_postdma_cbs[0])); i += 1 )
1409 g_dev5_postdma_cbs[i] = 0;
1415static void speed_device_init(
void)
1418 const char *revtypes[4];
1419 USE_DEV5_SPEED_REGS();
1421 revtypes[0] =
"unknown";
1423 revtypes[2] =
"ES1";
1424 revtypes[3] =
"ES2";
1425 switch ( dev5_speed_regs->r_spd_rev_1 )
1442 VERBOSE_KPRINTF(1,
"Speed chip: %s\n", revtypes[idx]);
1446 VERBOSE_KPRINTF(1,
"Speed chip: Rev %x\n", dev5_speed_regs->r_spd_rev_1);
1449 1,
"Speed version(rev3.rev8) = %04x.%04x\n", dev5_speed_regs->r_spd_rev_3, dev5_speed_regs->r_spd_rev_8);
1452static void do_hex_dump(
void *ptr,
int len)
1459 if ( !g_verbose_level )
1463 Kprintf(
"Hex dump 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f");
1465 for ( i = 0; i < len; i += 256 )
1467 for ( j = 0; j < (((len - i) > 256) ? 256 : (len - i)); j += 1 )
1469 charbuf_offs = j & 0xF;
1470 if ( !charbuf_offs && j )
1473 Kprintf(
" %s\n%08x", charbuf, i + j);
1475 Kprintf(
" %02x", (u8)((
char *)ptr)[i + j]);
1476 charbuf[charbuf_offs] = (((
char *)ptr)[i + j] >= 0 && isgraph(((
char *)ptr)[i + j])) ? ((
char *)ptr)[i + j] :
'.';
1479 charbuf_offs = j & 0xF;
1480 for ( i = 0; (
unsigned int)i < (
unsigned int)((
sizeof(charbuf) - 1) - charbuf_offs); i += 1 )
1484 charbuf[charbuf_offs] = 0;
1485 Kprintf(
"%s\n", charbuf);
1488static void ata_pre_dma_cb(
void)
1490 USE_DEV5_SPEED_REGS();
1492 VERBOSE_KPRINTF(1,
"ata_pre_dma_handler:old %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1493 dev5_speed_regs->r_spd_xfr_ctrl |= 0x80;
1494 VERBOSE_KPRINTF(1,
"ata_pre_dma_handler:new %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1497static void ata_post_dma_cb(
void)
1499 USE_DEV5_SPEED_REGS();
1501 VERBOSE_KPRINTF(1,
"ata_post_dma_handler:old %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1502 dev5_speed_regs->r_spd_xfr_ctrl &= ~0x80;
1503 VERBOSE_KPRINTF(1,
"ata_post_dma_handler:new %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1511void xatapi_9_sceCdSpdAtaDmaStart(
int dir)
1513 int spd_if_ctrl_manip_2;
1515 USE_DEV5_SPEED_REGS();
1518 WaitEventFlag(g_adma_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1519 g_should_wait_for_dma_flag = 1;
1520 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaStart Call %d :Read 0:Write 1\n", dir);
1521 dev5_speed_regs->r_spd_dbuf_stat = 3;
1522 spd_if_ctrl_manip_2 = (dev5_speed_regs->r_spd_if_ctrl & 1) | (dir ? 0x4C : 0x4E);
1523 dev5_speed_regs->r_spd_if_ctrl = spd_if_ctrl_manip_2;
1524 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaStart Write R_IF_CTR:%x\n", spd_if_ctrl_manip_2);
1525 dev5_speed_regs->r_spd_xfr_ctrl = dir | 6;
1528 "sceCdSpdAtaDmaStart R_IF_CTR:%x R_XFR_CTRL:%x\n",
1529 dev5_speed_regs->r_spd_if_ctrl,
1530 dev5_speed_regs->r_spd_xfr_ctrl);
1533void xatapi_10_sceCdSpdAtaDmaEnd(
void)
1536 USE_DEV5_SPEED_REGS();
1538 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaEnd Call\n");
1539 if ( !g_should_wait_for_dma_flag )
1541 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaEnd No Start(flag)\n");
1544 if ( vReferEventFlagStatus(g_adma_evfid, &efinfo) || (efinfo.
currBits & 1) )
1546 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaEnd No Start\n");
1547 g_should_wait_for_dma_flag = 0;
1550 dev5_speed_regs->r_spd_xfr_ctrl = 1;
1551 dev5_speed_regs->r_spd_if_ctrl &= ~0x4;
1552 dev5_speed_regs->r_spd_dbuf_stat = 3;
1553 dev5_speed_regs->r_spd_if_ctrl &= ~0x84;
1554 dev5_speed_regs->r_spd_if_ctrl |= 0x80;
1555 dev5_speed_regs->r_spd_if_ctrl &= ~0x84;
1557 if ( g_dma_mode_value )
1558 ata_ultra_dma_mode(g_dma_speed_value);
1560 ata_multiword_dma_mode(g_dma_speed_value);
1561 g_should_wait_for_dma_flag = 0;
1562 SetEventFlag(g_adma_evfid, 1);
1565static void ata_pio_mode(
int mode)
1567 USE_DEV5_SPEED_REGS();
1569 VERBOSE_KPRINTF(1,
"SpdAtaSetPioTiming %d\n", mode);
1574 dev5_speed_regs->r_spd_pio_mode = 146;
1577 dev5_speed_regs->r_spd_pio_mode = 114;
1580 dev5_speed_regs->r_spd_pio_mode = 50;
1583 dev5_speed_regs->r_spd_pio_mode = 36;
1586 dev5_speed_regs->r_spd_pio_mode = 35;
1591static void ata_multiword_dma_mode(
int mode)
1593 USE_DEV5_SPEED_REGS();
1595 VERBOSE_KPRINTF(1,
"SpdAtaSetMdmaTiming %d\n", mode);
1600 dev5_speed_regs->r_spd_mwdma_mode = 255;
1603 dev5_speed_regs->r_spd_mwdma_mode = 69;
1606 dev5_speed_regs->r_spd_mwdma_mode = 36;
1609 dev5_speed_regs->r_spd_if_ctrl = (dev5_speed_regs->r_spd_if_ctrl & ~0x49) | 0x48;
1612static void ata_ultra_dma_mode(
int mode)
1614 USE_DEV5_SPEED_REGS();
1616 VERBOSE_KPRINTF(1,
"SpdAtaSetUdmaTiming %d\n", mode);
1621 dev5_speed_regs->r_spd_udma_mode = 167;
1624 dev5_speed_regs->r_spd_udma_mode = 133;
1627 dev5_speed_regs->r_spd_udma_mode = 99;
1630 dev5_speed_regs->r_spd_udma_mode = 98;
1633 dev5_speed_regs->r_spd_udma_mode = 97;
1636 dev5_speed_regs->r_spd_if_ctrl = dev5_speed_regs->r_spd_if_ctrl | 0x49;
1639static int ata_intr_cb(
int flag)
1641 VERBOSE_KPRINTF(1,
"call AtaIntrHandle %d\n", flag);
1642 speedIntrDisable(3);
1643 iSetEventFlag(g_atapi_event_flag, 2);
1647static void AtaEjectIntrHandle(
void)
1649 VERBOSE_KPRINTF(1,
"call AtaEjectIntrHandle\n");
1651 iSetEventFlag(g_atapi_event_flag, 4);
1654static unsigned int AtaAlarmrHandle(
void *usrdat)
1658 VERBOSE_KPRINTF(1,
"call AtaAlarmrHandle\n");
1659 iSetEventFlag(g_atapi_event_flag, 1);
1663int xatapi_14_set_speed_reg(
int regaddr, u16 regval)
1666 USE_DEV5_SPEED_REGS();
1668 if ( (
unsigned int)(regaddr - 64) < 0x1D )
1670 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1671 *(vu16 *)((
char *)&dev5_speed_regs->unv00 + regaddr) = regval;
1672 SetEventFlag(g_acmd_evfid, 1);
1677int xatapi_13_get_speed_reg(
int regaddr)
1681 USE_DEV5_SPEED_REGS();
1683 if ( (
unsigned int)(regaddr - 64) >= 0x1D )
1685 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1686 tmpval = *(u16 *)((
char *)&dev5_speed_regs->unv00 + regaddr);
1687 SetEventFlag(g_acmd_evfid, 1);
1691int xatapi_11_sceAtaGetError(
void)
1695 USE_DEV5_SPEED_REGS();
1697 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1698 r_spd_ata_error = dev5_speed_regs->r_spd_ata_error;
1699 SetEventFlag(g_acmd_evfid, 1);
1700 return r_spd_ata_error;
1703int xatapi_12_get_ata_control(
void)
1705 u8 r_spd_ata_control;
1707 USE_DEV5_SPEED_REGS();
1709 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1710 r_spd_ata_control = dev5_speed_regs->r_spd_ata_control;
1711 SetEventFlag(g_acmd_evfid, 1);
1712 return r_spd_ata_control;
1715static int sceAtaGetError(
void)
1717 USE_DEV5_SPEED_REGS();
1719 return (u8)dev5_speed_regs->r_spd_ata_error;
1722static int ata_wait_busy1_busy(
void)
1725 USE_DEV5_SPEED_REGS();
1727 for ( i = 0; i < 0x50; i += 1 )
1729 if ( !(dev5_speed_regs->r_spd_ata_control & 0x80) )
1733 if ( !(u16)expbay_get_has_power() )
1735 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, power off.\n");
1738 if ( g_is_wait_busy )
1740 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, tray eject.\n");
1757 DelayThread(100000);
1760 DelayThread(1000000);
1764 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, timedout.\n", i / 0xA);
1768static int ata_wait_busy2_busy(
void)
1771 USE_DEV5_SPEED_REGS();
1773 for ( i = 0; i < 55; i += 1 )
1775 if ( !(dev5_speed_regs->r_spd_ata_control & 0x80) )
1779 if ( !(u16)expbay_get_has_power() )
1781 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, power off.\n");
1784 if ( g_is_wait_busy )
1786 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, tray eject.\n");
1803 DelayThread(100000);
1806 DelayThread(1000000);
1810 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, timedout.\n", i / 0xA);
1814static int ata_wait_bus_busy_busbusy(
void)
1817 USE_DEV5_SPEED_REGS();
1819 for ( i = 0; i < 80; i += 1 )
1821 if ( !(dev5_speed_regs->r_spd_ata_control & 0x88) )
1825 if ( !(u16)expbay_get_has_power() )
1827 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, power off.\n");
1830 if ( g_is_wait_busy )
1832 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busbusy, tray eject.\n");
1849 DelayThread(100000);
1852 DelayThread(1000000);
1856 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busbusy, timedout.\n", i / 0xA);
1860static int ata_device_select(
int device)
1863 USE_DEV5_SPEED_REGS();
1865 result = ata_wait_bus_busy_busbusy();
1870 if ( ((dev5_speed_regs->r_spd_ata_select >> 4) & 1) == device )
1874 dev5_speed_regs->r_spd_ata_select = (device ? 1 : 0) << 4;
1875 return ata_wait_bus_busy_busbusy();
1878static int sceAtaExecCmd(
1879 void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command, u32 unk10)
1884 USE_DEV5_SPEED_REGS();
1886 ClearEventFlag(g_atapi_event_flag, 0);
1888 if ( !atad_devinfo[(select & 0x10) ? 1 : 0].exists )
1890 result = ata_device_select((select >> 4) & 1);
1895 if ( command == 142 || command == 176 )
1897 VERBOSE_KPRINTF(1,
"Not support Ata CMD\n");
1900 atad_cmd_state.type = unk10;
1903 atad_cmd_state.buf = buf;
1904 atad_cmd_state.blkcount = blkcount;
1906 !(dev5_speed_regs->r_spd_ata_control & 0x40)
1907 && ((command < 0x90 && command != 8) || (command >= 0xA2 || command < 0xA0)) )
1909 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: device not ready\n");
1912 switch ( atad_cmd_state.type )
1919 atad_cmd_state.dir = command != 0xC8;
1925 atad_cmd_state.dir = atad_cmd_state.type != 5;
1931 if ( atad_cmd_state.type != 9 )
1933 if ( using_timeout )
1935 USec2SysClock((command != 142 || feature != 244) ? 155000000 : 180000000, &sysclk);
1936 result = SetAlarm(&sysclk, AtaAlarmrHandle, 0);
1940 if ( atad_cmd_state.type == 1 )
1942 dev5_speed_regs->r_spd_ata_control = (!using_timeout) << 1;
1944 dev5_speed_regs->r_spd_ata_error = feature;
1945 dev5_speed_regs->r_spd_ata_nsector = nsector;
1946 dev5_speed_regs->r_spd_ata_sector = sector;
1947 dev5_speed_regs->r_spd_ata_lcyl = lcyl;
1948 dev5_speed_regs->r_spd_ata_hcyl = hcyl;
1949 dev5_speed_regs->r_spd_ata_select = select | 0x40;
1950 dev5_speed_regs->r_spd_ata_status = command;
1955int xatapi_5_sceAtaExecCmd(
1956 void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command, u32 unk10)
1961 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1962 retres = sceAtaExecCmd(buf, blkcount, feature, nsector, sector, lcyl, hcyl, select, command, unk10);
1965 SetEventFlag(g_acmd_evfid, 1);
1970static int sceCdAtapiExecCmd_local(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
unsigned int pkt_len,
int proto)
1979 USE_DEV5_SPEED_REGS();
1982 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd Start. pkt_len %d proto %d\n", pkt_len, proto);
1983 do_hex_dump(pkt, 12);
1987 atad_cmd_state.type_atapi = proto;
1988 atad_cmd_state.buf_atapi = buf;
1989 atad_cmd_state.blkcount_atapi = nsec;
1990 atad_cmd_state.blksize_atapi = secsize;
1998 switch ( *(u8 *)pkt )
2013 atad_cmd_state.dir_atapi = 0;
2016 atad_cmd_state.dir_atapi = 1;
2026 atad_cmd_state.dir_atapi = atad_cmd_state.type_atapi != 5;
2033 !g_reset_scrambling_pack && atad_cmd_state.type_atapi == 4 && atad_cmd_state.dir_atapi == 1
2034 && Mpeg2CheckScramble(
2035 (
char *)atad_cmd_state.buf_atapi, atad_cmd_state.blkcount_atapi * atad_cmd_state.blksize_atapi) )
2037 VERBOSE_KPRINTF(0,
"illegal stream\n");
2040 if ( using_timeout )
2042 USec2SysClock(0x93D1CC0, &sysclk);
2043 result = SetAlarm(&sysclk, AtaAlarmrHandle, 0);
2047 if ( atad_cmd_state.type_atapi == 1 )
2049 dev5_speed_regs->r_spd_ata_control = (!using_timeout) << 1;
2050 result = sceAtaExecCmd(
2056 (u8)((atad_cmd_state.blkcount_atapi & 0xFF) * (atad_cmd_state.blksize_atapi & 0xFF)),
2057 (u8)((u16)((atad_cmd_state.blkcount_atapi & 0xFFFF) * (atad_cmd_state.blksize_atapi & 0xFFFF)) >> 8),
2064 if ( using_timeout )
2066 CancelAlarm(AtaAlarmrHandle, 0);
2071 while ( (ata_status_1 & 0x88) != 8 )
2076 ata_status_1 = dev5_speed_regs->r_spd_ata_status;
2077 ata_status_2 = dev5_speed_regs->r_spd_ata_status;
2078 VERBOSE_KPRINTF(1,
"Status 0x%02x BSY %x DRQ %x\n", ata_status_2, ata_status_1 & 0x80, ata_status_1 & 8);
2079 if ( g_is_wait_busy )
2081 if ( using_timeout )
2082 CancelAlarm(AtaAlarmrHandle, 0);
2083 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd Tray Eject while\n", ata_status_2);
2086 if ( !(u16)expbay_get_has_power() )
2088 if ( using_timeout )
2090 CancelAlarm(AtaAlarmrHandle, 0);
2095 if ( (ata_status_1 & 1) )
2097 VERBOSE_KPRINTF(1,
"iocmd err 0x%02x, 0x%02x\n", ata_status_1, sceAtaGetError());
2098 if ( using_timeout )
2100 CancelAlarm(AtaAlarmrHandle, 0);
2104 if ( !(ata_status_1 & 8) )
2106 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd_local ATA_NO_DREQ\n");
2108 for ( i = 0; i < (pkt_len >> 1); i += 1 )
2110 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd_local Packet %04x\n", ((u16 *)pkt)[i]);
2111 dev5_speed_regs->r_spd_ata_data = ((u16 *)pkt)[i];
2113 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd End. cmd %02x\n", *(u8 *)pkt);
2114 if ( g_is_wait_busy )
2116 if ( using_timeout )
2117 CancelAlarm(AtaAlarmrHandle, 0);
2118 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd Tray Eject last\n", pkt_len >> 1);
2121 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd OK\n");
2125static int sceCdAtapiExecCmd(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
int pkt_len,
int proto)
2131 pkt_scsi_cmd_2 = *(u8 *)pkt;
2132 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd %08x\n", pkt_scsi_cmd_2);
2135 !(pkt_scsi_cmd_2 == 0x1B || pkt_scsi_cmd_2 == 0x12 || !pkt_scsi_cmd_2 || pkt_scsi_cmd_2 == 3
2136 || *g_cd_sc_ffffffd9_ptr))
2137 && !g_is_in_read_info && !sceCdAtapi_BC() )
2139 ata_device_set_transfer_mode_outer(0);
2142 return sceCdAtapiExecCmd_local(n, buf, nsec, secsize, pkt, pkt_len, proto);
2145int xatapi_7_sceCdAtapiExecCmd(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
int pkt_len,
int proto)
2150 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
2151 retres = sceCdAtapiExecCmd(n, buf, nsec, secsize, pkt, pkt_len, proto);
2154 SetEventFlag(g_acmd_evfid, 1);
2161 char r_spd_ata_status;
2162 USE_DEV5_SPEED_REGS();
2164 r_spd_ata_status = dev5_speed_regs->r_spd_ata_status;
2165 if ( (r_spd_ata_status & 1) )
2167 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATA PIO iocmd err 0x%02x, 0x%02x\n", r_spd_ata_status, sceAtaGetError());
2170 else if ( (r_spd_ata_status & 8) )
2174 switch ( cmd_state->type )
2178 for ( i = 0; i < 256; i += 1 )
2180 cmd_state->buf16[i] = dev5_speed_regs->r_spd_ata_data;
2182 cmd_state->buf16 += 256;
2187 for ( i = 0; i < 256; i += 1 )
2189 dev5_speed_regs->r_spd_ata_data = cmd_state->buf16[i];
2191 cmd_state->buf16 += 256;
2196 for ( i = 0; i < 256; i += 1 )
2198 dev5_speed_regs->r_spd_ata_data = cmd_state->buf16[i];
2200 cmd_state->buf16 += 256;
2201 for ( i = 0; i < 4; i += 1 )
2203 dev5_speed_regs->r_spd_ata_data = cmd_state->buf8[512 + i];
2205 cmd_state->buf8 += 4;
2225 USE_DEV5_SPEED_REGS();
2227 VERBOSE_KPRINTF(1,
"Pio trans %d\n", cmd_state->blkcount_atapi * cmd_state->blksize_atapi);
2228 result = ata_wait_busy1_busy();
2232 for ( blktotal = cmd_state->blkcount_atapi * cmd_state->blksize_atapi; result >= 0 && blktotal; blktotal -= lhcyl )
2234 char r_spd_ata_status;
2236 r_spd_ata_status = dev5_speed_regs->r_spd_ata_status;
2237 if ( (r_spd_ata_status & 1) )
2239 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATAPI PIO iocmd err 0x%02x, 0x%02x\n", r_spd_ata_status, sceAtaGetError());
2242 if ( !(r_spd_ata_status & 8) )
2245 lhcyl = (dev5_speed_regs->r_spd_ata_lcyl & 0xFF) | ((dev5_speed_regs->r_spd_ata_hcyl & 0xFF) << 8);
2246 VERBOSE_KPRINTF(1,
"ByteCount Trans byte %04x\n", lhcyl);
2247 switch ( cmd_state->type_atapi )
2251 VERBOSE_KPRINTF(1,
"IoRun_atapi input trans %d\n", cmd_state->blksize_atapi);
2252 for ( i = 0; i < (lhcyl >> 1); i += 1 )
2254 ((u16 *)((
char *)cmd_state->buf_atapi))[i] = dev5_speed_regs->r_spd_ata_data;
2257 *((u8 *)cmd_state->buf_atapi + 2 * i) = dev5_speed_regs->r_spd_ata_data;
2258 cmd_state->buf_atapi = (
char *)cmd_state->buf_atapi + lhcyl;
2263 VERBOSE_KPRINTF(1,
"IoRun_atapi output trans %d\n", cmd_state->blksize_atapi);
2264 for ( i = 0; i < (lhcyl >> 1); i += 1 )
2266 dev5_speed_regs->r_spd_ata_data = ((u16 *)cmd_state->buf_atapi)[i];
2269 dev5_speed_regs->r_spd_ata_data = *((u8 *)cmd_state->buf_atapi + 2 * i);
2270 cmd_state->buf_atapi = (
char *)cmd_state->buf_atapi + lhcyl;
2276 VERBOSE_KPRINTF(1,
"IoRun_atapi trans End\n");
2277 result = ata_wait_busy1_busy();
2282static int atapi_transfer_wrapper(
char *buf,
unsigned int blkcount,
int dir)
2284 unsigned int blkcount_tmp;
2286 unsigned int dbuf_stat_mask;
2289 char spd_ata_status_tmp;
2292 USE_DEV5_SPEED_REGS();
2294 for ( blkcount_tmp = blkcount; blkcount_tmp; blkcount_tmp -= (flg ? dbuf_stat_mask : 0) )
2297 for ( i = 0; i < 20 && !dbuf_stat_mask; i += 1 )
2299 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2301 VERBOSE_KPRINTF(1,
"*SPD_RINTR_STAT %02x\n", dev5_speed_regs->r_spd_intr_stat);
2302 VERBOSE_KPRINTF(1,
"*R_DBUF_STAT %02x\n", dev5_speed_regs->r_spd_dbuf_stat);
2304 if ( !dbuf_stat_mask )
2307 VERBOSE_KPRINTF(1,
"Wait Event\n");
2308 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2309 VERBOSE_KPRINTF(1,
"Event come\n");
2312 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, ata timedout\n");
2317 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, Media Eject\n");
2320 if ( !(dev5_speed_regs->r_spd_intr_stat & 2) )
2322 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2324 spd_ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
2325 Error = sceAtaGetError();
2326 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", spd_ata_status_tmp, Error);
2327 return (!(Error & 0x80)) ? -503 : -510;
2329 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2334 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2339 if ( blkcount_tmp < dbuf_stat_mask )
2340 dbuf_stat_mask = blkcount_tmp;
2341 result = SpdDmaTransfer(0, buf, (dbuf_stat_mask << 18) | 0x20, dir);
2342 buf += dbuf_stat_mask << 9;
2350static int DmaRun_atapi(
char *buf,
int blkcount,
int blksize,
int dir)
2352 unsigned int blkremainder;
2353 unsigned int blksectors;
2355 unsigned int dbuf_stat_mask;
2358 char spd_ata_status_tmp;
2359 unsigned int dbuf_stat_sectors;
2361 USE_DEV5_SPEED_REGS();
2363 VERBOSE_KPRINTF(1,
"DmaRun_atapi start\n");
2364 blkremainder = (blkcount * blksize) & 0x1FF;
2365 for ( blksectors = (
unsigned int)(blkcount * blksize) >> 9; blksectors; blksectors -= dbuf_stat_mask )
2368 for ( i = 0; i < 20 && !dbuf_stat_mask; i += 1 )
2370 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2372 if ( !dbuf_stat_mask )
2375 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2378 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, ata timedout\n");
2383 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, Media Eject\n");
2386 if ( (dev5_speed_regs->r_spd_intr_stat & 2) )
2388 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2392 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2394 spd_ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
2395 Error = sceAtaGetError();
2396 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", spd_ata_status_tmp, Error);
2397 return (!(Error & 0x80)) ? -503 : -510;
2399 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2403 if ( blksectors < dbuf_stat_mask )
2405 dbuf_stat_mask = blksectors;
2407 dbuf_stat_sectors = dbuf_stat_mask << 9;
2410 "DmaRun_atapi cnt %d nblk %d secsize %d bcr %08x\n",
2414 (dbuf_stat_sectors << 9) | 0x20);
2415 result = SpdDmaTransfer(0, buf, (dbuf_stat_sectors << 9) | 0x20, dir);
2416 buf += dbuf_stat_sectors;
2422 while ( !(dev5_speed_regs->r_spd_intr_stat & 1) )
2424 dev5_speed_regs->m_spd_unk36 += 512;
2425 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, dir);
2428 memcpy(g_atapi_xfer_buf, buf, blkremainder);
2429 result = SpdDmaTransfer(0, g_atapi_xfer_buf, 0x40020, dir);
2435 result = SpdDmaTransfer(0, g_atapi_xfer_buf, 0x40020, 0);
2438 memcpy(buf, g_atapi_xfer_buf, blkremainder);
2441 VERBOSE_KPRINTF(1,
"DmaRun_atapi End.\n");
2445static int DmaRun_atapi_extrans1(
char *buf,
int blkcount,
int blksize,
int dir)
2447 unsigned int blksectors;
2450 unsigned int dbuf_stat_mask;
2453 char spd_ata_status_tmp;
2454 unsigned int dbuf_stat_sectors;
2456 USE_DEV5_SPEED_REGS();
2458 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans start\n");
2462 blkremainder = (blkcount * blksize) & 0x1FF;
2463 for ( blksectors = (
unsigned int)(blkcount * blksize) >> 9; blksectors; blksectors -= dbuf_stat_mask )
2466 for ( i = 0; i < 20 && !dbuf_stat_mask; i += 1 )
2468 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2470 if ( !dbuf_stat_mask )
2473 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2476 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, ata timedout\n");
2481 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, Media Eject\n");
2484 if ( (dev5_speed_regs->r_spd_intr_stat & 2) )
2486 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2490 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2492 spd_ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
2493 Error = sceAtaGetError();
2494 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", spd_ata_status_tmp, Error);
2495 return (!(Error & 0x80)) ? -503 : -510;
2497 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2501 if ( blksectors < dbuf_stat_mask )
2503 dbuf_stat_mask = blksectors;
2505 dbuf_stat_sectors = dbuf_stat_mask << 9;
2508 "DmaRun_atapi_extrans cnt %d nblk %d secsize %d bcr %08x\n",
2512 (dbuf_stat_sectors << 9) | 0x20);
2513 result = SpdDmaTransfer_extrans_1(0, buf, (dbuf_stat_sectors << 9) | 0x20, dir);
2514 buf += dbuf_stat_sectors;
2520 while ( !(dev5_speed_regs->r_spd_intr_stat & 1) )
2522 dev5_speed_regs->m_spd_unk36 += 512;
2523 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, dir);
2526 memcpy(g_atapi_xfer_buf, buf, blkremainder);
2527 result = SpdDmaTransfer_extrans_1(0, g_atapi_xfer_buf, 0x40020, dir);
2533 result = SpdDmaTransfer_extrans_1(0, g_atapi_xfer_buf, 0x40020, 0);
2536 memcpy(buf, g_atapi_xfer_buf, blkremainder);
2539 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans End.\n");
2543static int DmaRun_atapi_extrans2(
char *buf,
int blkcount,
int blksize,
int dir)
2546 unsigned int blksectors;
2549 unsigned int fpga_spckcnt;
2554 USE_DEV5_SPEED_REGS();
2556 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans start\n");
2560 CancelAlarm(AtaAlarmrHandle, 0);
2561 USec2SysClock(0x989680, &sysclk);
2562 result = SetAlarm(&sysclk, AtaAlarmrHandle, 0);
2570 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2573 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, ata timedout\n");
2578 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, Media Eject\n");
2581 if ( (dev5_speed_regs->r_spd_intr_stat & 2) )
2585 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2587 Error = sceAtaGetError();
2589 1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", dev5_speed_regs->r_spd_ata_status, Error);
2590 return (!(Error & 0x80)) ? -503 : -510;
2592 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2594 dev5_speed_regs->r_spd_dma_ctrl = (dev5_speed_regs->r_spd_rev_1 >= 0x11) ? 6 : 4;
2598 blkremainder = (blkcount * blksize) & 0x1FF;
2600 for ( blksectors = (
unsigned int)(blkcount * blksize) >> 9; blksectors; blksectors -= fpga_spckcnt )
2602 unsigned int fpga_spckcnt_bytes;
2604 for ( i = 0;; i += 1 )
2606 fpga_spckcnt = do_fpga_check_spckcnt();
2607 if ( fpga_spckcnt >= 3 || fpga_spckcnt >= blksectors )
2620 PollEventFlag(g_atapi_event_flag, 5, WEF_OR | WEF_CLEAR, &efbits);
2623 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, ata timedout\n");
2627 if ( !(dev5_speed_regs->r_spd_intr_stat & 2) && (dev5_speed_regs->r_spd_ata_control & 1) )
2629 Error = sceAtaGetError();
2631 1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", dev5_speed_regs->r_spd_ata_status, Error);
2632 return (!(Error & 0x80)) ? -503 : -510;
2638 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, Media Eject\n");
2645 if ( blksectors < fpga_spckcnt )
2647 fpga_spckcnt = blksectors;
2649 fpga_spckcnt_bytes = fpga_spckcnt << 9;
2652 "DmaRun_atapi_extrans cnt %d nblk %d secsize %d bcr %08x\n",
2656 (fpga_spckcnt_bytes << 9) | 0x20);
2657 extransres = SpdDmaTransfer_extrans_2(0, buf, (fpga_spckcnt_bytes << 9) | 0x20, dir);
2658 if ( extransres < 0 )
2660 buf += fpga_spckcnt_bytes;
2665 if ( extransres >= 0 && blkremainder )
2667 while ( !(dev5_speed_regs->r_spd_intr_stat & 1) )
2669 dev5_speed_regs->m_spd_unk36 += 512;
2670 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, dir);
2676 memcpy(g_atapi_xfer_buf, buf, blkremainder);
2677 extransres = SpdDmaTransfer_extrans_2(0, g_atapi_xfer_buf, 0x40020, dir);
2681 extransres = SpdDmaTransfer_extrans_2(0, g_atapi_xfer_buf, 0x40020, 0);
2682 if ( extransres >= 0 )
2684 memcpy(buf, g_atapi_xfer_buf, blkremainder);
2691 if ( extransres < 0 )
2695 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans End.\n");
2699static void DmaRun_spck(
char *buf,
unsigned int secsize)
2701 unsigned int secsize_sectors;
2702 unsigned int fpga_spckcnt;
2703 USE_DEV5_SPEED_REGS();
2705 VERBOSE_KPRINTF(1,
"DmaRun_spck start\n");
2710 for ( secsize_sectors = secsize >> 9; secsize_sectors; secsize_sectors -= fpga_spckcnt )
2712 unsigned int fpga_spckcnt_bytes;
2714 for ( fpga_spckcnt = 0; fpga_spckcnt < 4; fpga_spckcnt = do_fpga_check_spckcnt() )
2716 if ( secsize_sectors < fpga_spckcnt )
2718 fpga_spckcnt = secsize_sectors;
2720 fpga_spckcnt_bytes = fpga_spckcnt << 9;
2723 "DmaRun_spck cnt %d nblk %d secsize %d bcr %08x\n",
2727 (fpga_spckcnt_bytes << 9) | 0x20);
2728 if ( SpdDmaTransfer_extrans_3(0, buf, (fpga_spckcnt_bytes << 9) | 0x20, 1) < 0 )
2733 buf += fpga_spckcnt_bytes;
2735 if ( (secsize & 0x1FF) )
2737 dev5_speed_regs->m_spd_unk36 += 512;
2738 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, 1);
2739 memcpy(g_atapi_xfer_buf, buf, secsize & 0x1FF);
2740 if ( SpdDmaTransfer_extrans_3(0, g_atapi_xfer_buf, 0x40020, 1) < 0 )
2746 VERBOSE_KPRINTF(1,
"DmaRun_spck End.\n");
2749static int sceAtaWaitResult(
void)
2756 USE_DEV5_SPEED_REGS();
2760 switch ( atad_cmd_state.type )
2764 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2768 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout while non data command\n");
2773 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, Media Eject\n");
2780 res = atapi_transfer_wrapper((
char *)atad_cmd_state.buf, atad_cmd_state.blkcount, atad_cmd_state.dir);
2786 for ( i = 0; i < 100 && !intr_stat_msk; i += 1 )
2788 intr_stat_msk = dev5_speed_regs->r_spd_intr_stat & 1;
2790 if ( !intr_stat_msk )
2793 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2796 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2799 "DEV5 ATA: error: istat %x, ienable %x\n",
2800 dev5_speed_regs->r_spd_intr_stat,
2801 dev5_speed_regs->r_spd_intr_mask);
2806 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata eject, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2809 "DEV5 ATA: error: istat %x, ienable %x\n",
2810 dev5_speed_regs->r_spd_intr_stat,
2811 dev5_speed_regs->r_spd_intr_mask);
2820 res = ata_wait_busy1_busy();
2825 atad_cmd_state.blkcount -= 1;
2826 if ( atad_cmd_state.blkcount == 0xFFFFFFFF )
2831 res = ata_pio_transfer(&atad_cmd_state);
2843 status_tmp = dev5_speed_regs->r_spd_ata_status;
2844 if ( (status_tmp & 0x80) )
2846 res = ata_wait_busy1_busy();
2847 status_tmp = dev5_speed_regs->r_spd_ata_status;
2849 if ( (status_tmp & 1) )
2853 Error = sceAtaGetError();
2854 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x\n", status_tmp, Error);
2855 res = (Error & 0x80) ? -510 : -503;
2858 CancelAlarm(AtaAlarmrHandle, 0);
2862 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATA failed, %d\n", res);
2867int xatapi_6_sceAtaWaitResult(
void)
2872 if ( vReferEventFlagStatus(g_acmd_evfid, &efinfo) || (efinfo.
currBits & 1) )
2874 VERBOSE_KPRINTF(1,
"sceCdAtapiWaitResult Call Error\n");
2877 restmp = sceAtaWaitResult();
2878 SetEventFlag(g_acmd_evfid, 1);
2882static int sceCdAtapiWaitResult_local(
void)
2889 USE_DEV5_SPEED_REGS();
2892 switch ( atad_cmd_state.type_atapi )
2896 VERBOSE_KPRINTF(1,
"waitresult\n");
2897 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2901 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout while non data command\n");
2906 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata eject while non data command\n");
2912 VERBOSE_KPRINTF(1,
"waitresult dma\n");
2913 if ( !g_reset_scrambling_pack )
2916 (
char *)atad_cmd_state.buf_atapi,
2917 atad_cmd_state.blkcount_atapi,
2918 atad_cmd_state.blksize_atapi,
2919 atad_cmd_state.dir_atapi);
2921 else if ( atad_cmd_state.dir_atapi )
2926 blktotal1 = atad_cmd_state.blkcount_atapi * atad_cmd_state.blksize_atapi;
2927 for ( blkoffs = 0; blkoffs < blktotal1;
2928 blkoffs += atad_cmd_state.blkcount_atapi * atad_cmd_state.blksize_atapi )
2932 padres = Mpeg2CheckPadding(
2933 (
char *)atad_cmd_state.buf_atapi + blkoffs, blktotal1 - blkoffs, &padinfo, &g_pes_scrambling_control_pack);
2937 (
char *)atad_cmd_state.buf_atapi,
2938 atad_cmd_state.blkcount_atapi,
2939 atad_cmd_state.blksize_atapi,
2940 atad_cmd_state.dir_atapi);
2943 atad_cmd_state.blksize_atapi = 2048;
2944 atad_cmd_state.blkcount_atapi = padinfo;
2946 DmaRun_atapi_extrans1(
2947 (
char *)atad_cmd_state.buf_atapi + blkoffs, padinfo, 2048, atad_cmd_state.dir_atapi) :
2948 DmaRun_atapi((char *)atad_cmd_state.buf_atapi + blkoffs, padinfo, 2048, atad_cmd_state.dir_atapi);
2953 res = DmaRun_atapi_extrans2(
2954 (
char *)atad_cmd_state.buf_atapi, atad_cmd_state.blkcount_atapi, atad_cmd_state.blksize_atapi, 0);
2961 for ( i = 0; i < 100 && !intr_stat_msk; i += 1 )
2963 intr_stat_msk = dev5_speed_regs->r_spd_intr_stat & 1;
2965 if ( intr_stat_msk )
2969 VERBOSE_KPRINTF(1,
"ata command not finished yet\n");
2971 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2974 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2977 "DEV5 ATA: error: istat %x, ienable %x\n",
2978 dev5_speed_regs->r_spd_intr_stat,
2979 dev5_speed_regs->r_spd_intr_mask);
2984 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata eject, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2987 "DEV5 ATA: error: istat %x, ienable %x\n",
2988 dev5_speed_regs->r_spd_intr_stat,
2989 dev5_speed_regs->r_spd_intr_mask);
2994 res = IoRun_atapi(&atad_cmd_state);
2999 char ata_status_tmp;
3001 ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
3002 if ( (ata_status_tmp & 0x80) )
3004 res = ata_wait_busy1_busy();
3005 ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
3007 if ( (ata_status_tmp & 1) )
3011 Error = sceAtaGetError();
3012 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd status 0x%02x, error 0x%02x\n", ata_status_tmp, Error);
3013 res = (Error & 0x80) ? -510 : -503;
3016 CancelAlarm(AtaAlarmrHandle, 0);
3018 VERBOSE_KPRINTF(1,
"sceCdAtapiWaitResult_local() End.\n");
3021 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATA failed, %d\n", res);
3026int xatapi_8_sceCdAtapiWaitResult(
void)
3031 if ( vReferEventFlagStatus(g_acmd_evfid, &efinfo) || (efinfo.
currBits & 1) )
3033 VERBOSE_KPRINTF(1,
"sceCdAtapiWaitResult Call Error\n");
3036 restmp = sceCdAtapiWaitResult_local();
3037 SetEventFlag(g_acmd_evfid, 1);
3041static void ata_bus_reset_inner(
void)
3043 USE_DEV5_SPEED_REGS();
3045 dev5_speed_regs->r_spd_if_ctrl = 128;
3047 dev5_speed_regs->r_spd_if_ctrl = 0;
3048 dev5_speed_regs->r_spd_if_ctrl = 72;
3050 VERBOSE_KPRINTF(1,
"hard reset\n");
3053static int ata_bus_reset(
void)
3055 USE_DEV5_SPEED_REGS();
3057 if ( !(dev5_speed_regs->r_spd_if_ctrl & 0x40) )
3058 ata_bus_reset_inner();
3059 return ata_wait_busy2_busy();
3062int xatapi_4_sceAtaSoftReset(
void)
3064 USE_DEV5_SPEED_REGS();
3066 if ( (dev5_speed_regs->r_spd_ata_control & 0x80) )
3068 dev5_speed_regs->r_spd_ata_control = 6;
3070 dev5_speed_regs->r_spd_ata_control = 2;
3072 VERBOSE_KPRINTF(1,
"soft reset\n");
3073 return ata_wait_busy1_busy();
3077static int sceAtaFlushCache(
int device)
3081 result = xatapi_5_sceAtaExecCmd(0, 1, 0, 0, 0, 0, 0, device << 4, 0xE7, 1);
3082 return result ? result : xatapi_6_sceAtaWaitResult();
3086static int ata_device_identify(
int device,
void *
info)
3090 result = xatapi_5_sceAtaExecCmd(
info, 1, 0, 0, 0, 0, 0, device << 4, 0xEC, 2);
3091 return result ? result : xatapi_6_sceAtaWaitResult();
3094static int ata_device_pkt_identify(
int device,
void *
info)
3098 result = xatapi_5_sceAtaExecCmd(
info, 1, 0, 0, 0, 0, 0, device << 4, 0xA1, 2);
3099 return result ? result : xatapi_6_sceAtaWaitResult();
3102static int atapi_device_set_transfer_mode(
int device,
int type,
int mode)
3106 result = xatapi_5_sceAtaExecCmd(0, 1, 3, (u8)(mode | type), 0, 0, 0, device << 4, 0xEF, 1);
3109 result = xatapi_6_sceAtaWaitResult();
3118 ata_multiword_dma_mode(mode);
3121 ata_ultra_dma_mode(mode);
3129static int ata_device_set_transfer_mode(
int device,
int type,
int mode)
3133 result = sceAtaExecCmd(0, 1, 3, (u8)(mode | type), 0, 0, 0, device << 4, 0xEF, 1);
3136 result = sceAtaWaitResult();
3145 ata_multiword_dma_mode(mode);
3148 ata_ultra_dma_mode(mode);
3158 char r_spd_ata_lcyl;
3160 USE_DEV5_SPEED_REGS();
3164 if ( (dev5_speed_regs->r_spd_ata_control & 0x88) )
3166 VERBOSE_KPRINTF(1,
"FindDev ATA_BUSY\n");
3169 r_spd_ata_lcyl = dev5_speed_regs->r_spd_ata_lcyl;
3170 r_spd_ata_hcyl = dev5_speed_regs->r_spd_ata_hcyl;
3171 if ( dev5_speed_regs->r_spd_ata_nsector != 1 || dev5_speed_regs->r_spd_ata_sector != 1 )
3173 VERBOSE_KPRINTF(1,
"FindDev ATA_NOT_CONNECT\n");
3177 if ( !r_spd_ata_lcyl && !r_spd_ata_hcyl )
3179 if ( r_spd_ata_lcyl == 20 && r_spd_ata_hcyl == 235 )
3181 dev5_speed_regs->r_spd_ata_lcyl = 85;
3182 dev5_speed_regs->r_spd_ata_hcyl = 170;
3185 if ( (dev5_speed_regs->r_spd_ata_lcyl & 0xFF) != 85 || (dev5_speed_regs->r_spd_ata_hcyl & 0xFF) != 170 )
3189static void atapi_device_set_transfer_mode_outer(
int device)
3191 if ( g_dma_mode_value )
3193 VERBOSE_KPRINTF(0,
"UDMA_mode Mode%d\n", 2);
3194 while ( atapi_device_set_transfer_mode(device, 64, (u8)g_dma_speed_value) < 0 )
3196 DelayThread(2000000);
3201 VERBOSE_KPRINTF(0,
"MDMA_mode Mode%d\n", 2);
3202 while ( atapi_device_set_transfer_mode(device, 32, (u8)g_dma_speed_value) < 0 )
3204 DelayThread(2000000);
3209static void ata_device_set_transfer_mode_outer(
int device)
3213 if ( g_dma_mode_value )
3215 VERBOSE_KPRINTF(0,
"UDMA_mode Mode%d\n", 2);
3216 for ( i = 0; i < 3 && ata_device_set_transfer_mode(device, 64, (u8)g_dma_speed_value); i += 1 )
3218 DelayThread(2000000);
3223 VERBOSE_KPRINTF(0,
"MDMA_mode Mode%d\n", 2);
3224 for ( i = 0; i < 3 && ata_device_set_transfer_mode(device, 32, (u8)g_dma_speed_value); i += 1 )
3226 DelayThread(2000000);
3234 USE_DEV5_SPEED_REGS();
3236 if ( xatapi_4_sceAtaSoftReset() )
3238 ata_device_probe(&devinfo[0]);
3239 if ( !devinfo[0].exists )
3241 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: there is no device0\n");
3245 if ( ata_device_select(1) )
3248 if ( (dev5_speed_regs->r_spd_ata_control & 0xFF) )
3249 ata_device_probe(&devinfo[1]);
3253 g_is_in_read_info = 0;
3254 for ( i = 0; i < 2; i += 1 )
3256 if ( !devinfo[i].exists )
3260 if ( !devinfo[i].has_packet )
3262 devinfo[i].
exists = !ata_device_identify(i, ata_param);
3264 if ( devinfo[i].has_packet == 1 )
3265 devinfo[i].
exists = !ata_device_pkt_identify(i, ata_param);
3266 VERBOSE_KPRINTF(1,
"device%d connected, kind %d.\n", i, devinfo[i].has_packet);
3267 if ( !devinfo[i].exists || devinfo[i].has_packet != 1 )
3271 do_hex_dump(ata_param,
sizeof(ata_param));
3272 devinfo[i].
lba48 = !do_atapi_cmd_inquiry_12h(i);
3273 if ( devinfo[i].lba48 )
3275 g_is_in_read_info = 1;
3276 VERBOSE_KPRINTF(0,
"Atapi Program Aria Brokun.\n");
3279 atapi_device_set_transfer_mode_outer(i);
3283static void sceAtapiInit(
int device)
3286 USE_DEV5_SPEED_REGS();
3289 if ( g_ata_devinfo_init )
3291 g_ata_devinfo_init = 1;
3296 resetval = ata_bus_reset();
3297 if ( resetval != -550 )
3303 dev5_speed_regs->r_spd_if_ctrl = 0;
3305 ata_init_devices(atad_devinfo);
3308static void sceAtInterInit(
void)
3312 speedRegisterIntrCb(1, ata_intr_cb);
3313 speedRegisterIntrCb(0, ata_intr_cb);
3314 speedRegisterPreDmaCb(0, ata_pre_dma_cb);
3315 speedRegisterPostDmaCb(0, ata_post_dma_cb);
3316 if ( sceCdSC(0xFFFFFFDC, &sc_tmp) )
3317 speedIntrEnable(256);
3320static int create_event_flags(
void)
3326 g_atapi_event_flag = CreateEventFlag(&efparam);
3327 if ( g_atapi_event_flag < 0 )
3332 g_acmd_evfid = CreateEventFlag(&efparam);
3333 if ( g_acmd_evfid >= 0 )
3336 g_adma_evfid = CreateEventFlag(&efparam);
3337 if ( g_adma_evfid >= 0 )
3340 g_io_event_flag = CreateEventFlag(&efparam);
3341 if ( g_io_event_flag >= 0 )
3343 sceCdSC(0xFFFFFFE0, &g_acmd_evfid);
3344 sceCdSC(0xFFFFFFDF, &g_adma_evfid);
3349 if ( g_atapi_event_flag >= 0 )
3350 DeleteEventFlag(g_atapi_event_flag);
3351 if ( g_acmd_evfid >= 0 )
3352 DeleteEventFlag(g_acmd_evfid);
3353 if ( g_adma_evfid >= 0 )
3354 DeleteEventFlag(g_adma_evfid);
3358static void FpgaLayer1On(
void)
3360 USE_DEV5_FPGA_REGS();
3361 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER1 %x\n",
"FpgaLayer1On", dev5_fpga_regs->r_fpga_layer1);
3362 dev5_fpga_regs->r_fpga_layer1 &= ~1;
3363 dev5_fpga_regs->r_fpga_layer1 |= 1;
3364 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER1 %x\n",
"FpgaLayer1On", dev5_fpga_regs->r_fpga_layer1);
3367static void FpgaLayer1Off(
void)
3369 USE_DEV5_FPGA_REGS();
3371 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER1 %x\n",
"FpgaLayer1Off", dev5_fpga_regs->r_fpga_layer1);
3372 dev5_fpga_regs->r_fpga_layer1 &= ~1;
3373 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER1 %x\n",
"FpgaLayer1Off", dev5_fpga_regs->r_fpga_layer1);
3377static void FpgaLayer2On(
void)
3379 USE_DEV5_FPGA_REGS();
3381 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER2 %x\n",
"FpgaLayer2On", dev5_fpga_regs->r_fpga_layer2);
3382 dev5_fpga_regs->r_fpga_layer2 &= ~1;
3383 dev5_fpga_regs->r_fpga_layer2 |= 1;
3384 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER2 %x\n",
"FpgaLayer2On", dev5_fpga_regs->r_fpga_layer2);
3388static void FpgaLayer2Off(
void)
3390 USE_DEV5_FPGA_REGS();
3392 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER2 %x\n",
"FpgaLayer2Off", dev5_fpga_regs->r_fpga_layer2);
3393 dev5_fpga_regs->r_fpga_layer2 &= ~1;
3394 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER2 %x\n",
"FpgaLayer2Off", dev5_fpga_regs->r_fpga_layer2);
3397static void FpgaXfrenOn(
void)
3399 USE_DEV5_FPGA_REGS();
3401 VERBOSE_KPRINTF(1,
"%s():old:FPGA_XFREN %x\n",
"FpgaXfrenOn", dev5_fpga_regs->r_fpga_xfren);
3402 dev5_fpga_regs->r_fpga_xfren &= ~1;
3403 dev5_fpga_regs->r_fpga_xfren |= 1;
3404 VERBOSE_KPRINTF(1,
"%s():new:FPGA_XFREN %x\n",
"FpgaXfrenOn", dev5_fpga_regs->r_fpga_xfren);
3407static void FpgaXfrenOff(
void)
3409 USE_DEV5_FPGA_REGS();
3411 VERBOSE_KPRINTF(1,
"%s():old:FPGA_XFREN %x\n",
"FpgaXfrenOff", dev5_fpga_regs->r_fpga_xfren);
3412 dev5_fpga_regs->r_fpga_xfren &= ~1;
3413 VERBOSE_KPRINTF(1,
"%s():new:FPGA_XFREN %x\n",
"FpgaXfrenOff", dev5_fpga_regs->r_fpga_xfren);
3416static void FpgaSpckmodeOn(
void)
3418 USE_DEV5_FPGA_REGS();
3420 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOn", dev5_fpga_regs->r_fpga_spckmode);
3421 dev5_fpga_regs->r_fpga_spckmode &= ~1;
3422 dev5_fpga_regs->r_fpga_spckmode |= 1;
3423 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOn", dev5_fpga_regs->r_fpga_spckmode);
3426static void FpgaSpckmodeOff(
void)
3428 USE_DEV5_FPGA_REGS();
3430 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOff", dev5_fpga_regs->r_fpga_spckmode);
3431 dev5_fpga_regs->r_fpga_spckmode &= ~1;
3432 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOff", dev5_fpga_regs->r_fpga_spckmode);
3435static void FpgaXfdir(
int dir)
3437 USE_DEV5_FPGA_REGS();
3439 VERBOSE_KPRINTF(1,
"%s():old:FPGA_XFRDIR %x\n",
"FpgaXfrdir", dev5_fpga_regs->r_fpga_xfrdir);
3440 dev5_fpga_regs->r_fpga_xfrdir &= ~1;
3443 dev5_fpga_regs->r_fpga_xfrdir |= 1;
3445 VERBOSE_KPRINTF(1,
"%s():new:FPGA_XFRDIR %x\n",
"FpgaXfrdir", dev5_fpga_regs->r_fpga_xfrdir);
3448static int FpgaGetRevision(
void)
3450 USE_DEV5_FPGA_REGS();
3452 VERBOSE_KPRINTF(1,
"%s():FPGA_REVISION %x\n",
"FpgaGetRevision", dev5_fpga_regs->r_fpga_revision);
3453 return (u16)dev5_fpga_regs->r_fpga_revision;
3457static unsigned int do_fpga_add_unused8120(
void)
3459 USE_DEV5_FPGA_REGS();
3461 return (dev5_fpga_regs->r_fpga_sl3bufd + (
unsigned int)dev5_fpga_regs->r_fpga_exbufd) >> 7;
3465static int do_fpga_check_spckcnt(
void)
3467 USE_DEV5_FPGA_REGS();
3469 return (u16)dev5_fpga_regs->r_fpga_spckcnt;
3472static void FpgaCheckWriteBuffer(
void)
3475 USE_DEV5_FPGA_REGS();
3477 VERBOSE_KPRINTF(1,
"%s():in ...\n",
"FpgaCheckWriteBuffer");
3478 for ( i = 0; i < 10000 && (dev5_fpga_regs->r_fpga_exbufe || dev5_fpga_regs->r_fpga_sl3bufe); i += 1 )
3482 VERBOSE_KPRINTF(0,
"exbuf enc=%x, sl3buf enc=%x\n", dev5_fpga_regs->r_fpga_exbufe, dev5_fpga_regs->r_fpga_sl3bufe);
3484 VERBOSE_KPRINTF(1,
"%s():out ...\n",
"FpgaCheckWriteBuffer");
3487static void FpgaCheckWriteBuffer2(
void)
3489 USE_DEV5_FPGA_REGS();
3491 VERBOSE_KPRINTF(1,
"%s():in ...\n",
"FpgaCheckWriteBuffer2");
3492 while ( dev5_fpga_regs->r_fpga_sl3bufd )
3494 VERBOSE_KPRINTF(1,
"%s():FPGA_SL3BUFD %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_sl3bufd);
3495 VERBOSE_KPRINTF(1,
"%s():FPGA_SL3BUFE %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_sl3bufe);
3496 VERBOSE_KPRINTF(1,
"%s():FPGA_EXBUFD %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_exbufd);
3497 VERBOSE_KPRINTF(1,
"%s():FPGA_EXBUFE %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_exbufe);
3499 VERBOSE_KPRINTF(1,
"%s():out ...\n",
"FpgaCheckWriteBuffer2");
3502static void FpgaClearBuffer(
void)
3504 USE_DEV5_FPGA_REGS();
3506 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SL3BUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufd);
3507 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SL3BUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufe);
3508 VERBOSE_KPRINTF(1,
"%s():old:FPGA_EXBUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufd);
3509 VERBOSE_KPRINTF(1,
"%s():old:FPGA_EXBUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufe);
3510 dev5_fpga_regs->r_fpga_unk30 &= ~1;
3511 dev5_fpga_regs->r_fpga_unk30 |= 1;
3512 while ( (u16)(dev5_fpga_regs->r_fpga_exbufd) || dev5_fpga_regs->r_fpga_sl3bufd )
3514 while ( dev5_fpga_regs->r_fpga_exbufe || dev5_fpga_regs->r_fpga_sl3bufe )
3516 dev5_fpga_regs->r_fpga_unk30 &= ~1;
3517 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SL3BUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufd);
3518 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SL3BUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufe);
3519 VERBOSE_KPRINTF(1,
"%s():new:FPGA_EXBUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufd);
3520 VERBOSE_KPRINTF(1,
"%s():new:FPGA_EXBUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufe);
3523static int Mpeg2CheckPadding(
char *buf,
unsigned int bufsize,
int *retptr,
int *pesscramblingpackptr)
3527 const char *bufoffs2;
3531 VERBOSE_KPRINTF(1,
"%s():in\n",
"Mpeg2CheckPadding");
3532 if ( (bufsize & 0x7FF) )
3534 VERBOSE_KPRINTF(1,
"%s():Buffer size not aligne !!\n",
"Mpeg2CheckPadding");
3537 if ( !*buf && !buf[1] && buf[2] == 1 && (u8)buf[3] == 0xBA )
3539 for ( i = 0; (
unsigned int)i < (bufsize >> 11); i += 1 )
3541 bufoffs1 = &buf[i << 11];
3542 if ( *bufoffs1 || bufoffs1[1] || bufoffs1[2] != 1 || (u8)bufoffs1[3] != 0xBA )
3551 bufoffs2 = bufoffs1 + 14;
3552 if ( !bufoffs1[14] )
3554 if ( !bufoffs1[15] && bufoffs1[16] == 1 && (u8)bufoffs1[17] == 0xBB )
3555 bufoffs2 = bufoffs1 + 38;
3556 if ( !*bufoffs2 && !bufoffs2[1] && bufoffs2[2] == 1 && (u8)bufoffs2[3] != 0xBF && (bufoffs2[6] & 0x60) )
3558 *pesscramblingpackptr += 1;
3563 VERBOSE_KPRINTF(1,
"%s():out %d %s Pack\n",
"Mpeg2CheckPadding", i, bufchk ?
"RDI" :
"NULL");
3568static int Mpeg2CheckScramble(
char *buf,
unsigned int bufsize)
3577 VERBOSE_KPRINTF(1,
"%s():in\n",
"Mpeg2CheckScramble");
3578 if ( (bufsize & 0x7FF) )
3580 VERBOSE_KPRINTF(1,
"%s():Buffer size not aligne !!\n",
"Mpeg2CheckScramble");
3583 for ( i = 0; i < (int)(bufsize >> 11); i += 1 )
3585 bufcur = buf + (i << 11);
3586 if ( !*bufcur && !bufcur[1] && bufcur[2] == 1 && (u8)bufcur[3] == 0xBA )
3588 bufbuf = bufcur + 14;
3591 if ( !bufcur[15] && bufcur[16] == 1 && (u8)bufcur[17] == 0xBB )
3592 bufbuf = bufcur + 38;
3593 if ( !*bufbuf && !bufbuf[1] && bufbuf[2] == 1 )
3595 buf3 = (u8)bufbuf[3];
3596 if ( (buf3 == 0xE0 || buf3 == 0xBD || buf3 == 0xC0 || buf3 == 0xD0) && (bufbuf[6] & 0x30) )
3598 restmp = 0xFFFFFFFF;
3605 VERBOSE_KPRINTF(1,
"%s():out\n",
"Mpeg2CheckScramble");
void * sceCdSetAtapiEjectCallback(int(*cb)(int reason, void *userdata), void *userdata)
int CpuResumeIntr(int state)
int QueryIntrContext(void)
int CpuSuspendIntr(int *state)
int cdvdman_169_dragon2atapi(u8 *outbuf, u32 *status)
int sceCdGetMediumRemoval(u32 *result1, u32 *result2)
int sceCdSetMediumRemoval(u8 arg1, u32 *result)
int sceCdChgSys(u32 arg1)
int sceCdBuzzerCtl(u32 *result)
int cdvdman_167_atapi2dragon(u8 *inbuf, u32 *status)