11 #include "irx_imports.h"
18 IRX_ID(
"cdvd_xatapi_driver", 2, 3);
85 vu16 r_spd_ata_nsector;
86 vu16 r_spd_ata_sector;
89 vu16 r_spd_ata_select;
90 vu16 r_spd_ata_status;
97 vu16 r_spd_ata_control;
108 vu16 r_spd_mwdma_mode;
109 vu16 r_spd_udma_mode;
112 #define USE_DEV5_SPEED_REGS() struct dev5_speed_regs_ *const dev5_speed_regs = (void *)0xBF410000
141 vu16 r_fpga_spckmode;
144 vu16 r_fpga_revision;
147 #define USE_DEV5_FPGA_REGS() struct dev5_fpga_regs_ *const dev5_fpga_regs = (void *)0xBF414000
149 static int xatapi_dev_devctl(
150 const iop_file_t *f,
const char *name,
int cmd,
void *args,
unsigned int arglen,
void *buf,
unsigned int buflen);
151 static void speed_init(
void);
152 static void speed_device_init(
void);
153 static void do_hex_dump(
void *ptr,
int len);
154 static void ata_pio_mode(
int mode);
155 static void ata_multiword_dma_mode(
int mode);
156 static void ata_ultra_dma_mode(
int mode);
157 static void AtaEjectIntrHandle(
void);
158 static int sceCdAtapiExecCmd_local(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
unsigned int pkt_len,
int proto);
159 static int sceCdAtapiExecCmd(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
int pkt_len,
int proto);
160 static void DmaRun_spck(
char *buf,
unsigned int secsize);
161 static int sceCdAtapiWaitResult_local(
void);
162 static void atapi_device_set_transfer_mode_outer(
int device);
163 static void ata_device_set_transfer_mode_outer(
int device);
164 static void sceAtapiInit(
int device);
165 static void sceAtInterInit(
void);
166 static int create_event_flags(
void);
167 static void FpgaLayer1On(
void);
168 static void FpgaLayer1Off(
void);
169 static void FpgaLayer2Off(
void);
170 static void FpgaXfrenOn(
void);
171 static void FpgaXfrenOff(
void);
172 static void FpgaSpckmodeOn(
void);
173 static void FpgaSpckmodeOff(
void);
174 static void FpgaXfdir(
int dir);
175 static int FpgaGetRevision(
void);
176 static int do_fpga_check_spckcnt(
void);
177 static void FpgaCheckWriteBuffer(
void);
178 static void FpgaCheckWriteBuffer2(
void);
179 static void FpgaClearBuffer(
void);
180 static int Mpeg2CheckPadding(
char *buf,
unsigned int bufsize,
int *retptr,
int *pesscramblingpackptr);
181 static int Mpeg2CheckScramble(
char *buf,
unsigned int bufsize);
185 static int g_devctl_retonly_unset;
186 static vu16 *
const g_dev9_reg_1460 = (
void *)0xBF801460;
187 static vu16 *
const g_dev9_reg_power = (
void *)0xBF80146C;
189 static int (*p_dev5_intr_cb)(
int flag);
192 IOMANX_RETURN_VALUE_IMPL(0);
194 IOMANX_RETURN_VALUE_IMPL(
EIO);
197 IOMANX_RETURN_VALUE(0), IOMANX_RETURN_VALUE(0), 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(
EIO), IOMANX_RETURN_VALUE(
EIO),
202 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE_S64(
EIO), (
void *)&xatapi_dev_devctl,
203 IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO), IOMANX_RETURN_VALUE(
EIO),
207 static int g_reset_scrambling_pack;
209 static int g_pes_scrambling_control_pack;
211 static int g_dma_mode_value;
213 static int g_dma_speed_value;
215 static int g_should_wait_for_dma_flag;
217 static int g_is_wait_busy;
219 static int g_verbose_level;
221 static int g_ata_devinfo_init;
222 static int g_bf40200a_is_set_ptr;
223 static u32 *g_cd_sc_ffffffd9_ptr;
224 static int g_is_in_read_info;
225 static int g_io_event_flag;
226 static int g_adma_evfid;
227 static int g_acmd_evfid;
228 static int g_dma_lock_sema;
229 static void (*g_dev5_intr_cbs[16])(
int flag);
230 static void (*g_dev5_predma_cbs[4])(u32 bcr_in,
int dir);
231 static void (*g_dev5_postdma_cbs[4])(u32 bcr_in,
int dir);
232 static int g_atapi_event_flag;
235 static int ata_param[128];
236 static int g_atapi_xfer_buf[130];
238 static int do_atapi_cmd_inquiry_12h(s16 dev_nr)
246 for ( i = 0; retres && i < 16; i += 1 )
248 memset(pkt, 0,
sizeof(pkt));
250 pkt[4] =
sizeof(outbuf);
251 retres = sceCdAtapiExecCmd_local(dev_nr, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
254 retres = sceCdAtapiWaitResult_local();
257 VERBOSE_KPRINTF(1,
"Atapi Drive ATAPI_CMD_READ_EXT_INFO NG\n");
263 do_hex_dump(outbuf,
sizeof(outbuf));
264 return strncmp(&outbuf[32],
"BOOT", 4) ? 1 : 0;
267 static int do_atapi_request_test_unit_ready(s16 dev_nr,
int *errptr,
int *ctrlptr)
274 memset(pkt, 0,
sizeof(pkt));
276 retres = xatapi_7_sceCdAtapiExecCmd(dev_nr, 0, 0, 0, pkt,
sizeof(pkt), 1);
279 retres = xatapi_8_sceCdAtapiWaitResult();
280 *errptr = (u8)xatapi_11_sceAtaGetError();
281 *ctrlptr = (u8)xatapi_12_get_ata_control();
285 static int atapi_req_sense_get(s16 dev_nr,
int *retptr)
292 memset(pkt, 0,
sizeof(pkt));
294 pkt[4] =
sizeof(outbuf);
295 result = xatapi_7_sceCdAtapiExecCmd(dev_nr, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
298 result = xatapi_8_sceCdAtapiWaitResult();
301 *retptr = ((outbuf[2] & 0xF) << 16) | ((u8)outbuf[12] << 8) | (u8)outbuf[13];
306 static int atapi_exec_cmd_request_sense_03h_unused(s16 dev_nr,
int *retptr)
313 memset(pkt, 0,
sizeof(pkt));
315 pkt[4] =
sizeof(outbuf);
316 result = sceCdAtapiExecCmd_local(dev_nr, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
319 result = sceCdAtapiWaitResult_local();
322 *retptr = ((outbuf[2] & 0xF) << 16) | ((u8)outbuf[12] << 8) | (u8)outbuf[13];
328 static int do_start_stop_unit_1bh_unused(
void)
335 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
337 memset(pkt, 0,
sizeof(pkt));
341 retres = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
344 retres = sceCdAtapiWaitResult_local();
347 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT NG\n");
351 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT OK\n");
356 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
358 memset(pkt, 0,
sizeof(pkt));
362 retres = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
365 retres = sceCdAtapiWaitResult_local();
368 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start NG %d\n", i);
372 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start OK\n");
375 VERBOSE_KPRINTF(1,
" PS2 Eject On Atapi Unit Dummy Eject Ret %d\n", retres);
380 static int chgsys_callback_cb(
int *mediaptr,
int want_atapi)
391 VERBOSE_KPRINTF(1,
"Ps2 Drive Spindle -> Atapi \n");
393 for ( i = 0; i < 10 && retres && retres != -550; i += 1 )
395 memset(pkt, 0,
sizeof(pkt));
399 retres = sceCdAtapiExecCmd(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
402 retres = sceCdAtapiWaitResult_local();
405 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start NG %d\n", i);
409 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Start OK\n");
413 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle -> Ps2\n");
415 for ( i = 0; i < 16 && tryres1 && tryres1 != -550; i += 1 )
417 memset(pkt, 0,
sizeof(pkt));
421 tryres1 = sceCdAtapiExecCmd_local(0, outbuf1, 1,
sizeof(outbuf1), pkt,
sizeof(pkt), 2);
424 tryres1 = sceCdAtapiWaitResult_local();
427 VERBOSE_KPRINTF(1,
"Atapi Drive ATAPI_CMD_READ_EXT_INFO NG\n");
435 maskchk = (((u8)outbuf1[5] >> 1) ^ 1) & 1;
436 if ( (outbuf1[3] & 0x10) )
440 VERBOSE_KPRINTF(1,
"Atapi Drive Media found.\n");
441 memset(pkt, 0,
sizeof(pkt));
444 pkt[8] =
sizeof(outbuf);
446 !sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2) && !sceCdAtapiWaitResult_local() )
448 VERBOSE_KPRINTF(1,
"Atapi Drive Media DVD:%d.\n", outbuf[5] & 0x20);
449 *mediaptr = (outbuf[5] & 0x20) ? 3 : 2;
454 VERBOSE_KPRINTF(1,
"Atapi Drive No Media or Now checking.\n");
455 VERBOSE_KPRINTF(1,
"Atapi Drive No Media or No SpinUp.\n");
460 VERBOSE_KPRINTF(1,
"Atapi Drive Spin Up.\n");
462 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
464 memset(pkt, 0,
sizeof(pkt));
467 retres = sceCdAtapiExecCmd(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
470 retres = sceCdAtapiWaitResult_local();
473 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Stop NG\n");
477 VERBOSE_KPRINTF(1,
"Atapi Drive Spindle Stop OK\n");
481 VERBOSE_KPRINTF(1,
"Atapi Drive Not Spin Up.\n");
483 for ( i = 0; i < 16 && retres && retres != -550; i += 1 )
485 memset(pkt, 0,
sizeof(pkt));
489 retres = sceCdAtapiExecCmd(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
492 retres = sceCdAtapiWaitResult_local();
495 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT NG\n");
499 VERBOSE_KPRINTF(1,
"Atapi Drive EJECT OK\n");
507 static int sceCdAtapi_SC(
void)
513 memset(pkt, 0,
sizeof(pkt));
518 for ( i = 0; i < 10 && retres; i += 1 )
520 retres = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
521 if ( retres || (retres = sceCdAtapiWaitResult_local()) )
526 VERBOSE_KPRINTF(1,
"sceCdAtapi SC fail\n");
529 *g_cd_sc_ffffffd9_ptr = 0;
530 VERBOSE_KPRINTF(1,
"sceCdAtapi SC OK\n");
534 int xatapi_15_exec_f6_f9_scsi(
void)
542 memset(pkt, 0,
sizeof(pkt));
547 for ( i = 0; i < 4 && retres1; i += 1 )
549 retres1 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
550 if ( retres1 || (retres1 = sceCdAtapiWaitResult_local()) )
553 if ( retres1 && !(outbuf[4] & 0x80) )
555 memset(pkt, 0,
sizeof(pkt));
560 for ( i = 0; i < 10 && retres2; i += 1 )
562 retres2 = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
565 retres2 = sceCdAtapiWaitResult_local();
574 static int sceCdAtapi_BC(
void)
585 memset(pkt, 0,
sizeof(pkt));
589 pkt[8] =
sizeof(outbuf1);
590 for ( i = 0; i < 10 && retres1; i += 1 )
592 retres1 = sceCdAtapiExecCmd_local(0, outbuf1, 1,
sizeof(outbuf1), pkt,
sizeof(pkt), 2);
593 if ( retres1 || (retres1 = sceCdAtapiWaitResult_local()) )
597 if ( !retres1 || (outbuf1[4] & 0x80) )
601 memset(pkt, 0,
sizeof(pkt));
606 for ( i = 0; i < 10 && retres2; i += 1 )
608 retres2 = sceCdAtapiExecCmd_local(0, 0, 0, 0, pkt,
sizeof(pkt), 1);
611 retres2 = sceCdAtapiWaitResult_local();
622 memset(pkt, 0,
sizeof(pkt));
626 pkt[8] =
sizeof(outbuf);
627 for ( i = 0; i < 10 && retres3; i += 1 )
629 retres3 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
630 if ( retres3 || (retres3 = sceCdAtapiWaitResult_local()) )
633 if ( !retres3 && (outbuf[4] & 0x81) )
635 *g_cd_sc_ffffffd9_ptr = 1;
642 memset(pkt, 0,
sizeof(pkt));
646 pkt[8] =
sizeof(outbuf);
647 for ( i = 0; i < 10 && retres4; i += 1 )
649 retres4 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
650 if ( retres4 || (retres4 = sceCdAtapiWaitResult_local()) )
655 VERBOSE_KPRINTF(1,
"sceCdAtapi BC 0 fail\n");
661 if ( g_should_wait_for_dma_flag && !ReferEventFlagStatus(g_adma_evfid, &efinfo) && !efinfo.
currBits )
662 SetEventFlag(g_adma_evfid, 1);
663 SetEventFlag(g_acmd_evfid, 1);
665 for ( i = 0; i < 100 && !retres4; i += 1 )
668 if ( !retres4 || waresontmp )
674 VERBOSE_KPRINTF(0,
"sceCdAtapi BC 1 fail\n");
680 for ( i = 0; i < 100 && !retres4; i += 1 )
683 if ( !retres4 || waresontmp )
688 VERBOSE_KPRINTF(0,
"sceCdAtapi BC 2 fail\n");
692 if ( g_should_wait_for_dma_flag )
693 WaitEventFlag(g_adma_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
695 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
696 memset(pkt, 0,
sizeof(pkt));
699 pkt[8] =
sizeof(outbuf);
700 for ( i = 0; i < 10 && retres4; i += 1 )
702 retres4 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 3);
703 if ( retres4 || (retres4 = sceCdAtapiWaitResult_local()) )
708 VERBOSE_KPRINTF(1,
"sceCdAtapi BC 3 fail\n");
712 VERBOSE_KPRINTF(1,
"sceCdAtapi BC OK\n");
719 if ( g_should_wait_for_dma_flag )
720 WaitEventFlag(g_adma_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
721 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
729 memset(pkt, 0,
sizeof(pkt));
733 pkt[8] =
sizeof(outbuf);
734 for ( i = 0; i < 10 && retres5; i += 1 )
736 retres5 = sceCdAtapiExecCmd_local(0, outbuf, 1,
sizeof(outbuf), pkt,
sizeof(pkt), 2);
737 if ( retres5 || (retres5 = sceCdAtapiWaitResult_local()) )
742 *g_cd_sc_ffffffd9_ptr = (outbuf[4] & 0x81) ? 1 : 0;
747 static int atapi_spin_status_get(
int unused_arg1,
void *buf)
753 memset(pkt, 0,
sizeof(pkt));
757 result = xatapi_7_sceCdAtapiExecCmd(0, buf, 1, 6, pkt,
sizeof(pkt), 2);
758 return (!result) ? xatapi_8_sceCdAtapiWaitResult() : result;
761 static int atapi_check_if_drive_ready(
int check_nowait)
769 VERBOSE_KPRINTF(1,
"Atapi Drive Ready Call %d\n", check_nowait);
770 ata_control = xatapi_12_get_ata_control();
771 VERBOSE_KPRINTF(1,
"Atapi Drive Ready %04x\n", ata_control);
774 int req_test_unit_ready_tmp1;
776 req_test_unit_ready_tmp1 = -1;
777 while ( req_test_unit_ready_tmp1 < 0 )
779 char spinstatus_tmp[6];
781 while ( (ata_control & 0xC0) != 64 )
783 VERBOSE_KPRINTF(1,
"Drive Not Ready %04x\n", ata_control);
785 ata_control = xatapi_12_get_ata_control();
787 req_test_unit_ready_tmp1 = do_atapi_request_test_unit_ready(0, &drive_err, &unitreadyctrl);
788 if ( req_test_unit_ready_tmp1 < 0 )
790 if ( !atapi_req_sense_get(0, &senseret) )
792 VERBOSE_KPRINTF(1,
"ReqSense %08x\n", senseret);
793 if ( (senseret & 0xFFFFFF00) == 0x23A00 )
796 if ( !atapi_spin_status_get(0, spinstatus_tmp) )
798 VERBOSE_KPRINTF(1,
"Spin Status 3:%02x 5:%02x\n", (u8)spinstatus_tmp[3], (u8)spinstatus_tmp[5]);
799 if ( (spinstatus_tmp[3] & 2) || (spinstatus_tmp[3] & 0x80) )
802 VERBOSE_KPRINTF(1,
"Atapi Drive err %08x\n", drive_err);
806 return ((ata_control & 0xC0) == 64 && do_atapi_request_test_unit_ready(0, &drive_err, &unitreadyctrl) >= 0
812 static int atapi_sceFsDevctlBlkIO(s16 dev_nr,
void *buf, u32 lsn, u32 nsec, u32 secsize, sceFsRWTYPE rwtype)
823 VERBOSE_KPRINTF(1,
"dma %c %08x, nsec %d\n", (rwtype == sceFsREADING) ?
'r' :
'w', lsn, nsec);
824 for ( nsec_tmp = nsec; !retres1 && nsec_tmp; nsec_tmp -= seccnt )
826 seccnt = (nsec_tmp >= 0x21) ? 32 : nsec_tmp;
827 for ( i = 3; i < 3; i += 1 )
829 xatapi_9_sceCdSpdAtaDmaStart((rwtype == sceFsREADING) ? 0 : 1);
830 memset(pkt, 0,
sizeof(pkt));
831 pkt[0] = (rwtype == sceFsREADING) ? 0x28 : 0x2A;
832 pkt[2] = (lsn_tmp >> 24) & 0xFF;
833 pkt[3] = (lsn_tmp >> 16) & 0xFF;
834 pkt[4] = (lsn_tmp >> 8) & 0xFF;
835 pkt[5] = (lsn_tmp) & 0xFF;
837 retres1 = xatapi_7_sceCdAtapiExecCmd(dev_nr, buf, seccnt, secsize, pkt,
sizeof(pkt), 4);
840 xatapi_10_sceCdSpdAtaDmaEnd();
843 retres1 = xatapi_8_sceCdAtapiWaitResult();
844 xatapi_10_sceCdSpdAtaDmaEnd();
845 if ( retres1 != -510 )
851 buf = (
char *)buf + seccnt * secsize;
856 static void expbay_device_reset(
void)
858 if ( (*g_dev9_reg_power & 4) )
860 Kprintf(
"xatapi already Power On\n");
861 *g_dev9_reg_1460 |= 2;
864 Kprintf(
"xatapi Power On Start\n");
865 *g_dev9_reg_power = (*g_dev9_reg_power & ~5) | 4;
867 *g_dev9_reg_1460 |= 2;
868 *g_dev9_reg_power |= 1;
872 static int cd_atapi_intr_callback_cb(
int cbarg)
874 VERBOSE_KPRINTF(1,
"dev5 interrupt\n");
875 if ( p_dev5_intr_cb )
876 p_dev5_intr_cb(cbarg);
877 VERBOSE_KPRINTF(1,
"dev5 interrupt end\n");
881 static void speedRegisterIntrDispatchCb(
void *callback)
883 p_dev5_intr_cb = (int (*)(
int flag))callback;
886 static void sceDev5Init(
void)
888 VERBOSE_KPRINTF(1,
"dev5 atapi Init start\n");
889 sceCdSC(0xFFFFFFE5, (
int *)cd_atapi_intr_callback_cb);
892 VERBOSE_KPRINTF(1,
"dev5 atapi Init end\n");
895 static int atapi_eject_interrupt_handler(
int is_eject,
void *userdata)
902 VERBOSE_KPRINTF(1,
"Eject intr : media removal\n");
906 static int xatapi_do_init(
void)
908 int (*oldcb)(
int is_eject,
void *userdata);
913 if ( !create_event_flags() )
915 sceCdSC(0xFFFFFFD9, (
int *)&sc_tmp);
916 g_cd_sc_ffffffd9_ptr = sc_tmp;
917 sceCdSC(0xFFFFFFD7, (
int *)&sc_tmp);
918 g_bf40200a_is_set_ptr = (int)sc_tmp;
920 (
int (*)(
int is_eject,
void *userdata))atapi_eject_interrupt_handler, 0);
923 VERBOSE_KPRINTF(0,
"xatapi:sceCdGetMediumRemoval NG(%x) !!\n", traylock_ret);
928 VERBOSE_KPRINTF(0,
"xatapi:Tray locked !!\n");
932 VERBOSE_KPRINTF(0,
"xatapi:Tray lock\n");
936 VERBOSE_KPRINTF(0,
"xatapi:Tray lock NG(%x) !!\n", traylock_ret);
939 expbay_device_reset();
940 VERBOSE_KPRINTF(0,
"xatapi Dev5->Rainbow\n");
942 VERBOSE_KPRINTF(1,
"xatapi Dev5->Rainbow end\n");
943 VERBOSE_KPRINTF(1,
"sceDev5Init Call\n");
945 VERBOSE_KPRINTF(1,
"sceAtInterInit Call\n");
947 VERBOSE_KPRINTF(1,
"sceAtapiInit Call\n");
949 VERBOSE_KPRINTF(1,
"sceAtapiInit end\n");
950 sceCdSC(0xFFFFFFE1, (
int *)chgsys_callback_cb);
956 VERBOSE_KPRINTF(0,
"xatapi:Tray unlock NG(%x) !!\n", traylock_ret);
961 VERBOSE_KPRINTF(0,
"xatapi:Tray unlock\n");
968 int xatapi_2_terminate(
int with_quit)
974 sceCdSC(0xFFFFFFE1, &sc_tmp);
975 sceCdSC(0xFFFFFFE5, &sc_tmp);
976 sceCdSC(0xFFFFFFE0, &sc_tmp);
977 sceCdSC(0xFFFFFFDF, &sc_tmp);
978 sceCdSC(0xFFFFFFE4, &sc_tmp);
979 Kprintf(
"libxatapi_terminate\n");
983 static int xatapi_dev_devctl(
984 const iop_file_t *f,
const char *name,
int cmd,
void *args,
unsigned int arglen,
void *buf,
unsigned int buflen)
991 VERBOSE_KPRINTF(1,
"xatapi devctl: cmd:%08x arg:%d\n", cmd, *(u32 *)args);
992 if ( cmd == 0x439B && PollEventFlag(g_io_event_flag, 1, WEF_AND, &efbits) == KE_EVF_COND && *(u32 *)args == 1 )
997 WaitEventFlag(g_io_event_flag, 1, WEF_AND | WEF_CLEAR, &efbits);
998 if ( g_devctl_retonly_unset )
1000 SetEventFlag(g_io_event_flag, 1);
1009 switch ( *((u32 *)args + 1) )
1019 xatapi_7_sceCdAtapiExecCmd(f->
unit, buf, 1, buflen, (
char *)args + 8, *(u32 *)args, *((u32 *)args + 1));
1023 if ( *((u32 *)args + 250) )
1025 retres1 = xatapi_7_sceCdAtapiExecCmd(
1029 *((u32 *)args + 250),
1032 *((u32 *)args + 1));
1040 retres1 = xatapi_7_sceCdAtapiExecCmd(f->
unit, 0, 0, 0, (
char *)args + 8, *(u32 *)args, *((u32 *)args + 1));
1044 retres1 = xatapi_8_sceCdAtapiWaitResult();
1048 *(u32 *)buf = (u8)xatapi_11_sceAtaGetError();
1051 *(u32 *)buf = (u8)xatapi_12_get_ata_control();
1054 retres1 = sceCdAtapi_BC();
1059 retres1 = sceCdAtapi_SC();
1062 g_verbose_level = *(u32 *)args;
1065 g_reset_scrambling_pack = *(u32 *)args;
1066 if ( g_reset_scrambling_pack )
1068 g_pes_scrambling_control_pack = 0;
1072 VERBOSE_KPRINTF(1,
"pes scrambling control pack = %d\n", g_pes_scrambling_control_pack);
1076 DmaRun_spck((
char *)args, arglen);
1079 g_dma_mode_value = (*(u32 *)args & 0x40) ? 1 : 0;
1080 g_dma_speed_value = *(u32 *)args & 7;
1081 atapi_device_set_transfer_mode_outer(0);
1084 if ( buf && buflen >= 2 )
1085 *(u16 *)buf = FpgaGetRevision();
1087 Kprintf(
"CDIOC_ATAPI_GETFPGAREV:buffer NG\n");
1090 if ( buf && buflen >= 4 )
1091 *(u32 *)buf = 0x4121300;
1093 Kprintf(
"CDIOC_ATAPI_VERSION:buffer NG\n");
1096 if ( buf && buflen >= 4 )
1097 *(u32 *)buf = g_pes_scrambling_control_pack;
1099 Kprintf(
"CDIOC_ATAPI_GETPSCNT:buffer NG\n");
1102 *(u32 *)buf = atapi_check_if_drive_ready(*(u32 *)args);
1108 if ( bio_param->blksiz != 2048 )
1115 "sceFsDevctlBlkIO Lsn:%d nsec:%d buffer:%08x Type:%d\n",
1121 atapi_sceFsDevctlBlkIO(f->
unit, bio_param->addr, bio_param->lbn, bio_param->nblk, bio_param->blksiz, bio_param->type);
1126 Kprintf(
"Un-support devctl %08x\n", cmd);
1130 SetEventFlag(g_io_event_flag, 1);
1131 VERBOSE_KPRINTF(1,
"xatapi devctl: cmd:%08x End.\n", cmd);
1135 int _start(
int ac,
char **av)
1140 Kprintf(
"xatapi_init Call\n");
1142 g_dma_mode_value = 1;
1144 g_dma_speed_value = 2;
1145 if ( RegisterLibraryEntries(&_exp_xatapi) )
1146 return MODULE_NO_RESIDENT_END;
1148 if ( AddDrv(&ata_ioman_device) )
1151 return MODULE_NO_RESIDENT_END;
1153 return !xatapi_do_init() ? MODULE_NO_RESIDENT_END : MODULE_RESIDENT_END;
1156 static int expbay_get_has_power(
void)
1158 return *g_dev9_reg_power & 4;
1161 static void speedRegisterIntrCb(
int intr,
void *cb)
1163 g_dev5_intr_cbs[intr] = cb;
1166 static void speedRegisterPreDmaCb(
int ctrl,
void *cb)
1168 g_dev5_predma_cbs[ctrl] = cb;
1171 static void speedRegisterPostDmaCb(
int ctrl,
void *cb)
1173 g_dev5_postdma_cbs[ctrl] = cb;
1176 static int speed_intr_dispatch(
int flag)
1180 USE_DEV5_SPEED_REGS();
1184 AtaEjectIntrHandle();
1187 if ( (dev5_speed_regs->r_spd_intr_stat & 0x3EFC) )
1190 0,
"SL3 register access failed(%x:%x) !!\n", dev5_speed_regs->r_spd_intr_stat, dev5_speed_regs->r_spd_intr_mask);
1193 for ( i = 0; i < 3 && (u16)(dev5_speed_regs->r_spd_intr_stat & dev5_speed_regs->r_spd_intr_mask); i += 1 )
1195 for ( j = 0; j < (int)(
sizeof(g_dev5_intr_cbs) /
sizeof(g_dev5_intr_cbs[0])); j += 1 )
1199 && (((
int)(u16)(dev5_speed_regs->r_spd_intr_stat & dev5_speed_regs->r_spd_intr_mask) >> j) & 1) )
1200 g_dev5_intr_cbs[j](flag);
1206 static void speedIntrEnable(s16 mask)
1209 USE_DEV5_SPEED_REGS();
1212 dev5_speed_regs->r_spd_intr_mask &= ~mask;
1213 dev5_speed_regs->r_spd_intr_mask |= mask;
1217 static void speedIntrDisable(s16 mask)
1220 USE_DEV5_SPEED_REGS();
1223 dev5_speed_regs->r_spd_intr_mask &= ~mask;
1227 static int SpdDmaTransfer(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1230 USE_DEV5_SPEED_REGS();
1232 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1233 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1234 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1236 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1237 result = WaitSema(g_dma_lock_sema);
1240 dev5_speed_regs->r_spd_dma_ctrl = (dev5_speed_regs->r_spd_rev_1 >= 0x11) ? ((device & 1) | 6) : ((device & 3) | 4);
1241 if ( g_dev5_predma_cbs[device] )
1242 g_dev5_predma_cbs[device](bcr_in, dir);
1243 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1244 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1245 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1246 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1247 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1248 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1251 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1252 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1253 dmac_ch_get_madr(IOP_DMAC_CDVD),
1254 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1255 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1258 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1259 if ( g_dev5_postdma_cbs[device] )
1260 g_dev5_postdma_cbs[device](bcr_in, dir);
1261 VERBOSE_KPRINTF(1,
"SpdDmaTransfer End.\n");
1262 SignalSema(g_dma_lock_sema);
1266 static int SpdDmaTransfer_extrans_1(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1269 USE_DEV5_SPEED_REGS();
1271 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1272 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1273 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1275 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1276 result = WaitSema(g_dma_lock_sema);
1279 dev5_speed_regs->r_spd_dma_ctrl = (dev5_speed_regs->r_spd_rev_1 >= 0x11) ? ((device & 1) | 6) : ((device & 3) | 4);
1280 if ( g_dev5_predma_cbs[device] )
1281 g_dev5_predma_cbs[device](bcr_in, dir);
1282 speedIntrDisable(256);
1285 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1286 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1287 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1288 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1289 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1290 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1293 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1294 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1295 dmac_ch_get_madr(IOP_DMAC_CDVD),
1296 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1297 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1300 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1301 FpgaCheckWriteBuffer();
1304 speedIntrEnable(256);
1305 if ( g_dev5_postdma_cbs[device] )
1306 g_dev5_postdma_cbs[device](bcr_in, dir);
1307 VERBOSE_KPRINTF(1,
"SpdDmaTransfer_extrans End.\n");
1308 SignalSema(g_dma_lock_sema);
1312 static int SpdDmaTransfer_extrans_2(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1316 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1317 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1318 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1320 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1321 result = WaitSema(g_dma_lock_sema);
1324 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1325 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1326 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1327 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1328 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1329 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1332 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1333 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1334 dmac_ch_get_madr(IOP_DMAC_CDVD),
1335 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1336 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1339 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1340 VERBOSE_KPRINTF(1,
"SpdDmaTransfer_extrans End.\n");
1341 SignalSema(g_dma_lock_sema);
1345 static int SpdDmaTransfer_extrans_3(
unsigned int device,
void *buf, u32 bcr_in,
int dir)
1349 dmac_ch_set_chcr(IOP_DMAC_CDVD, 0);
1350 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1351 if ( device >= 2 && (!g_dev5_predma_cbs[device] || !g_dev5_postdma_cbs[device]) )
1353 VERBOSE_KPRINTF(1,
"Wait Intr\n");
1354 result = WaitSema(g_dma_lock_sema);
1359 VERBOSE_KPRINTF(1,
"DMA Ch3 Set.\n");
1360 VERBOSE_KPRINTF(1,
"Set MADR3:%08x Set BCR3:%08x\n", buf, bcr_in);
1361 dmac_ch_set_madr(IOP_DMAC_CDVD, (u32)buf);
1362 dmac_ch_set_bcr(IOP_DMAC_CDVD, bcr_in);
1363 dmac_ch_set_chcr(IOP_DMAC_CDVD, dir | 0x41000200);
1364 dmac_ch_get_chcr(IOP_DMAC_CDVD);
1367 "CHCR3:%08x MADR3:%08x BCR3:%08x\n",
1368 dmac_ch_get_chcr(IOP_DMAC_CDVD),
1369 dmac_ch_get_madr(IOP_DMAC_CDVD),
1370 dmac_ch_get_bcr(IOP_DMAC_CDVD));
1371 while ( (dmac_ch_get_chcr(IOP_DMAC_CDVD) & 0x1000000) )
1374 VERBOSE_KPRINTF(1,
"MADR3= %08x\n", dmac_ch_get_madr(IOP_DMAC_CDVD));
1375 FpgaCheckWriteBuffer2();
1378 VERBOSE_KPRINTF(1,
"SpdDmaTransfer_extrans End.\n");
1379 SignalSema(g_dma_lock_sema);
1383 static void speedLEDCtl(
int ctl)
1385 USE_DEV5_SPEED_REGS();
1388 dev5_speed_regs->r_spd_pio_data = !ctl;
1391 static void speed_init(
void)
1396 semaparam.attr = SA_THPRI;
1397 semaparam.initial = 1;
1399 semaparam.option = 0;
1400 g_dma_lock_sema = CreateSema(&semaparam);
1401 if ( g_dma_lock_sema <= 0 )
1403 speedIntrDisable(0xFFFF);
1404 speedRegisterIntrDispatchCb(speed_intr_dispatch);
1405 for ( i = 0; i < (int)(
sizeof(g_dev5_intr_cbs) /
sizeof(g_dev5_intr_cbs[0])); i += 1 )
1407 g_dev5_intr_cbs[i] = 0;
1409 for ( i = 0; i < (int)(
sizeof(g_dev5_predma_cbs) /
sizeof(g_dev5_predma_cbs[0])); i += 1 )
1411 g_dev5_predma_cbs[i] = 0;
1413 for ( i = 0; i < (int)(
sizeof(g_dev5_postdma_cbs) /
sizeof(g_dev5_postdma_cbs[0])); i += 1 )
1415 g_dev5_postdma_cbs[i] = 0;
1421 static void speed_device_init(
void)
1424 const char *revtypes[4];
1425 USE_DEV5_SPEED_REGS();
1427 revtypes[0] =
"unknown";
1429 revtypes[2] =
"ES1";
1430 revtypes[3] =
"ES2";
1431 switch ( dev5_speed_regs->r_spd_rev_1 )
1448 VERBOSE_KPRINTF(1,
"Speed chip: %s\n", revtypes[idx]);
1452 VERBOSE_KPRINTF(1,
"Speed chip: Rev %x\n", dev5_speed_regs->r_spd_rev_1);
1455 1,
"Speed version(rev3.rev8) = %04x.%04x\n", dev5_speed_regs->r_spd_rev_3, dev5_speed_regs->r_spd_rev_8);
1458 static void do_hex_dump(
void *ptr,
int len)
1465 if ( !g_verbose_level )
1469 Kprintf(
"Hex dump 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f");
1471 for ( i = 0; i < len; i += 256 )
1473 for ( j = 0; j < (((len - i) > 256) ? 256 : (len - i)); j += 1 )
1475 charbuf_offs = j & 0xF;
1476 if ( !charbuf_offs && j )
1479 Kprintf(
" %s\n%08x", charbuf, i + j);
1481 Kprintf(
" %02x", (u8)((
char *)ptr)[i + j]);
1482 charbuf[charbuf_offs] = (((
char *)ptr)[i + j] >= 0 && isgraph(((
char *)ptr)[i + j])) ? ((
char *)ptr)[i + j] :
'.';
1485 charbuf_offs = j & 0xF;
1486 for ( i = 0; (
unsigned int)i < (
unsigned int)((
sizeof(charbuf) - 1) - charbuf_offs); i += 1 )
1490 charbuf[charbuf_offs] = 0;
1491 Kprintf(
"%s\n", charbuf);
1494 static void ata_pre_dma_cb(
void)
1496 USE_DEV5_SPEED_REGS();
1498 VERBOSE_KPRINTF(1,
"ata_pre_dma_handler:old %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1499 dev5_speed_regs->r_spd_xfr_ctrl |= 0x80;
1500 VERBOSE_KPRINTF(1,
"ata_pre_dma_handler:new %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1503 static void ata_post_dma_cb(
void)
1505 USE_DEV5_SPEED_REGS();
1507 VERBOSE_KPRINTF(1,
"ata_post_dma_handler:old %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1508 dev5_speed_regs->r_spd_xfr_ctrl &= ~0x80;
1509 VERBOSE_KPRINTF(1,
"ata_post_dma_handler:new %x\n", dev5_speed_regs->r_spd_xfr_ctrl);
1517 void xatapi_9_sceCdSpdAtaDmaStart(
int dir)
1519 int spd_if_ctrl_manip_2;
1521 USE_DEV5_SPEED_REGS();
1524 WaitEventFlag(g_adma_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1525 g_should_wait_for_dma_flag = 1;
1526 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaStart Call %d :Read 0:Write 1\n", dir);
1527 dev5_speed_regs->r_spd_dbuf_stat = 3;
1528 spd_if_ctrl_manip_2 = (dev5_speed_regs->r_spd_if_ctrl & 1) | (dir ? 0x4C : 0x4E);
1529 dev5_speed_regs->r_spd_if_ctrl = spd_if_ctrl_manip_2;
1530 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaStart Write R_IF_CTR:%x\n", spd_if_ctrl_manip_2);
1531 dev5_speed_regs->r_spd_xfr_ctrl = dir | 6;
1534 "sceCdSpdAtaDmaStart R_IF_CTR:%x R_XFR_CTRL:%x\n",
1535 dev5_speed_regs->r_spd_if_ctrl,
1536 dev5_speed_regs->r_spd_xfr_ctrl);
1539 void xatapi_10_sceCdSpdAtaDmaEnd(
void)
1542 USE_DEV5_SPEED_REGS();
1544 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaEnd Call\n");
1545 if ( !g_should_wait_for_dma_flag )
1547 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaEnd No Start(flag)\n");
1550 if ( vReferEventFlagStatus(g_adma_evfid, &efinfo) || (efinfo.
currBits & 1) )
1552 VERBOSE_KPRINTF(1,
"sceCdSpdAtaDmaEnd No Start\n");
1553 g_should_wait_for_dma_flag = 0;
1556 dev5_speed_regs->r_spd_xfr_ctrl = 1;
1557 dev5_speed_regs->r_spd_if_ctrl &= ~0x4;
1558 dev5_speed_regs->r_spd_dbuf_stat = 3;
1559 dev5_speed_regs->r_spd_if_ctrl &= ~0x84;
1560 dev5_speed_regs->r_spd_if_ctrl |= 0x80;
1561 dev5_speed_regs->r_spd_if_ctrl &= ~0x84;
1563 if ( g_dma_mode_value )
1564 ata_ultra_dma_mode(g_dma_speed_value);
1566 ata_multiword_dma_mode(g_dma_speed_value);
1567 g_should_wait_for_dma_flag = 0;
1568 SetEventFlag(g_adma_evfid, 1);
1571 static void ata_pio_mode(
int mode)
1573 USE_DEV5_SPEED_REGS();
1575 VERBOSE_KPRINTF(1,
"SpdAtaSetPioTiming %d\n", mode);
1580 dev5_speed_regs->r_spd_pio_mode = 146;
1583 dev5_speed_regs->r_spd_pio_mode = 114;
1586 dev5_speed_regs->r_spd_pio_mode = 50;
1589 dev5_speed_regs->r_spd_pio_mode = 36;
1592 dev5_speed_regs->r_spd_pio_mode = 35;
1597 static void ata_multiword_dma_mode(
int mode)
1599 USE_DEV5_SPEED_REGS();
1601 VERBOSE_KPRINTF(1,
"SpdAtaSetMdmaTiming %d\n", mode);
1606 dev5_speed_regs->r_spd_mwdma_mode = 255;
1609 dev5_speed_regs->r_spd_mwdma_mode = 69;
1612 dev5_speed_regs->r_spd_mwdma_mode = 36;
1615 dev5_speed_regs->r_spd_if_ctrl = (dev5_speed_regs->r_spd_if_ctrl & ~0x49) | 0x48;
1618 static void ata_ultra_dma_mode(
int mode)
1620 USE_DEV5_SPEED_REGS();
1622 VERBOSE_KPRINTF(1,
"SpdAtaSetUdmaTiming %d\n", mode);
1627 dev5_speed_regs->r_spd_udma_mode = 167;
1630 dev5_speed_regs->r_spd_udma_mode = 133;
1633 dev5_speed_regs->r_spd_udma_mode = 99;
1636 dev5_speed_regs->r_spd_udma_mode = 98;
1639 dev5_speed_regs->r_spd_udma_mode = 97;
1642 dev5_speed_regs->r_spd_if_ctrl = dev5_speed_regs->r_spd_if_ctrl | 0x49;
1645 static int ata_intr_cb(
int flag)
1647 VERBOSE_KPRINTF(1,
"call AtaIntrHandle %d\n", flag);
1648 speedIntrDisable(3);
1649 iSetEventFlag(g_atapi_event_flag, 2);
1653 static void AtaEjectIntrHandle(
void)
1655 VERBOSE_KPRINTF(1,
"call AtaEjectIntrHandle\n");
1657 iSetEventFlag(g_atapi_event_flag, 4);
1660 static unsigned int AtaAlarmrHandle(
void *usrdat)
1664 VERBOSE_KPRINTF(1,
"call AtaAlarmrHandle\n");
1665 iSetEventFlag(g_atapi_event_flag, 1);
1669 int xatapi_14_set_speed_reg(
int regaddr, u16 regval)
1672 USE_DEV5_SPEED_REGS();
1674 if ( (
unsigned int)(regaddr - 64) < 0x1D )
1676 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1677 *(vu16 *)((
char *)&dev5_speed_regs->unv00 + regaddr) = regval;
1678 SetEventFlag(g_acmd_evfid, 1);
1683 int xatapi_13_get_speed_reg(
int regaddr)
1687 USE_DEV5_SPEED_REGS();
1689 if ( (
unsigned int)(regaddr - 64) >= 0x1D )
1691 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1692 tmpval = *(u16 *)((
char *)&dev5_speed_regs->unv00 + regaddr);
1693 SetEventFlag(g_acmd_evfid, 1);
1697 int xatapi_11_sceAtaGetError(
void)
1701 USE_DEV5_SPEED_REGS();
1703 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1704 r_spd_ata_error = dev5_speed_regs->r_spd_ata_error;
1705 SetEventFlag(g_acmd_evfid, 1);
1706 return r_spd_ata_error;
1709 int xatapi_12_get_ata_control(
void)
1711 u8 r_spd_ata_control;
1713 USE_DEV5_SPEED_REGS();
1715 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1716 r_spd_ata_control = dev5_speed_regs->r_spd_ata_control;
1717 SetEventFlag(g_acmd_evfid, 1);
1718 return r_spd_ata_control;
1721 static int sceAtaGetError(
void)
1723 USE_DEV5_SPEED_REGS();
1725 return (u8)dev5_speed_regs->r_spd_ata_error;
1728 static int ata_wait_busy1_busy(
void)
1731 USE_DEV5_SPEED_REGS();
1733 for ( i = 0; i < 0x50; i += 1 )
1735 if ( !(dev5_speed_regs->r_spd_ata_control & 0x80) )
1739 if ( !(u16)expbay_get_has_power() )
1741 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, power off.\n");
1744 if ( g_is_wait_busy )
1746 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, tray eject.\n");
1763 DelayThread(100000);
1766 DelayThread(1000000);
1770 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, timedout.\n", i / 0xA);
1774 static int ata_wait_busy2_busy(
void)
1777 USE_DEV5_SPEED_REGS();
1779 for ( i = 0; i < 55; i += 1 )
1781 if ( !(dev5_speed_regs->r_spd_ata_control & 0x80) )
1785 if ( !(u16)expbay_get_has_power() )
1787 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, power off.\n");
1790 if ( g_is_wait_busy )
1792 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, tray eject.\n");
1809 DelayThread(100000);
1812 DelayThread(1000000);
1816 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, timedout.\n", i / 0xA);
1820 static int ata_wait_bus_busy_busbusy(
void)
1823 USE_DEV5_SPEED_REGS();
1825 for ( i = 0; i < 80; i += 1 )
1827 if ( !(dev5_speed_regs->r_spd_ata_control & 0x88) )
1831 if ( !(u16)expbay_get_has_power() )
1833 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busy, power off.\n");
1836 if ( g_is_wait_busy )
1838 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busbusy, tray eject.\n");
1855 DelayThread(100000);
1858 DelayThread(1000000);
1862 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: wait busbusy, timedout.\n", i / 0xA);
1866 static int ata_device_select(
int device)
1869 USE_DEV5_SPEED_REGS();
1871 result = ata_wait_bus_busy_busbusy();
1876 if ( ((dev5_speed_regs->r_spd_ata_select >> 4) & 1) == device )
1880 dev5_speed_regs->r_spd_ata_select = (device ? 1 : 0) << 4;
1881 return ata_wait_bus_busy_busbusy();
1884 static int sceAtaExecCmd(
1885 void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command, u32 unk10)
1890 USE_DEV5_SPEED_REGS();
1892 ClearEventFlag(g_atapi_event_flag, 0);
1894 if ( !atad_devinfo[(select & 0x10) ? 1 : 0].exists )
1896 result = ata_device_select((select >> 4) & 1);
1901 if ( command == 142 || command == 176 )
1903 VERBOSE_KPRINTF(1,
"Not support Ata CMD\n");
1906 atad_cmd_state.type = unk10;
1909 atad_cmd_state.buf = buf;
1910 atad_cmd_state.blkcount = blkcount;
1912 !(dev5_speed_regs->r_spd_ata_control & 0x40)
1913 && ((command < 0x90 && command != 8) || (command >= 0xA2 || command < 0xA0)) )
1915 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: device not ready\n");
1918 switch ( atad_cmd_state.type )
1925 atad_cmd_state.dir = command != 0xC8;
1931 atad_cmd_state.dir = atad_cmd_state.type != 5;
1937 if ( atad_cmd_state.type != 9 )
1939 if ( using_timeout )
1941 USec2SysClock((command != 142 || feature != 244) ? 155000000 : 180000000, &sysclk);
1942 result = SetAlarm(&sysclk, AtaAlarmrHandle, 0);
1946 if ( atad_cmd_state.type == 1 )
1948 dev5_speed_regs->r_spd_ata_control = (!using_timeout) << 1;
1950 dev5_speed_regs->r_spd_ata_error = feature;
1951 dev5_speed_regs->r_spd_ata_nsector = nsector;
1952 dev5_speed_regs->r_spd_ata_sector = sector;
1953 dev5_speed_regs->r_spd_ata_lcyl = lcyl;
1954 dev5_speed_regs->r_spd_ata_hcyl = hcyl;
1955 dev5_speed_regs->r_spd_ata_select = select | 0x40;
1956 dev5_speed_regs->r_spd_ata_status = command;
1961 int xatapi_5_sceAtaExecCmd(
1962 void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command, u32 unk10)
1967 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
1968 retres = sceAtaExecCmd(buf, blkcount, feature, nsector, sector, lcyl, hcyl, select, command, unk10);
1971 SetEventFlag(g_acmd_evfid, 1);
1976 static int sceCdAtapiExecCmd_local(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
unsigned int pkt_len,
int proto)
1985 USE_DEV5_SPEED_REGS();
1988 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd Start. pkt_len %d proto %d\n", pkt_len, proto);
1989 do_hex_dump(pkt, 12);
1993 atad_cmd_state.type_atapi = proto;
1994 atad_cmd_state.buf_atapi = buf;
1995 atad_cmd_state.blkcount_atapi = nsec;
1996 atad_cmd_state.blksize_atapi = secsize;
2004 switch ( *(u8 *)pkt )
2019 atad_cmd_state.dir_atapi = 0;
2022 atad_cmd_state.dir_atapi = 1;
2032 atad_cmd_state.dir_atapi = atad_cmd_state.type_atapi != 5;
2039 !g_reset_scrambling_pack && atad_cmd_state.type_atapi == 4 && atad_cmd_state.dir_atapi == 1
2040 && Mpeg2CheckScramble(
2041 (
char *)atad_cmd_state.buf_atapi, atad_cmd_state.blkcount_atapi * atad_cmd_state.blksize_atapi) )
2043 VERBOSE_KPRINTF(0,
"illegal stream\n");
2046 if ( using_timeout )
2048 USec2SysClock(0x93D1CC0, &sysclk);
2049 result = SetAlarm(&sysclk, AtaAlarmrHandle, 0);
2053 if ( atad_cmd_state.type_atapi == 1 )
2055 dev5_speed_regs->r_spd_ata_control = (!using_timeout) << 1;
2056 result = sceAtaExecCmd(
2062 (u8)((atad_cmd_state.blkcount_atapi & 0xFF) * (atad_cmd_state.blksize_atapi & 0xFF)),
2063 (u8)((u16)((atad_cmd_state.blkcount_atapi & 0xFFFF) * (atad_cmd_state.blksize_atapi & 0xFFFF)) >> 8),
2070 if ( using_timeout )
2072 CancelAlarm(AtaAlarmrHandle, 0);
2077 while ( (ata_status_1 & 0x88) != 8 )
2082 ata_status_1 = dev5_speed_regs->r_spd_ata_status;
2083 ata_status_2 = dev5_speed_regs->r_spd_ata_status;
2084 VERBOSE_KPRINTF(1,
"Status 0x%02x BSY %x DRQ %x\n", ata_status_2, ata_status_1 & 0x80, ata_status_1 & 8);
2085 if ( g_is_wait_busy )
2087 if ( using_timeout )
2088 CancelAlarm(AtaAlarmrHandle, 0);
2089 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd Tray Eject while\n", ata_status_2);
2092 if ( !(u16)expbay_get_has_power() )
2094 if ( using_timeout )
2096 CancelAlarm(AtaAlarmrHandle, 0);
2101 if ( (ata_status_1 & 1) )
2103 VERBOSE_KPRINTF(1,
"iocmd err 0x%02x, 0x%02x\n", ata_status_1, sceAtaGetError());
2104 if ( using_timeout )
2106 CancelAlarm(AtaAlarmrHandle, 0);
2110 if ( !(ata_status_1 & 8) )
2112 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd_local ATA_NO_DREQ\n");
2114 for ( i = 0; i < (pkt_len >> 1); i += 1 )
2116 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd_local Packet %04x\n", ((u16 *)pkt)[i]);
2117 dev5_speed_regs->r_spd_ata_data = ((u16 *)pkt)[i];
2119 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd End. cmd %02x\n", *(u8 *)pkt);
2120 if ( g_is_wait_busy )
2122 if ( using_timeout )
2123 CancelAlarm(AtaAlarmrHandle, 0);
2124 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd Tray Eject last\n", pkt_len >> 1);
2127 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd OK\n");
2131 static int sceCdAtapiExecCmd(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
int pkt_len,
int proto)
2137 pkt_scsi_cmd_2 = *(u8 *)pkt;
2138 VERBOSE_KPRINTF(1,
"sceCdAtapiExecCmd %08x\n", pkt_scsi_cmd_2);
2141 !(pkt_scsi_cmd_2 == 0x1B || pkt_scsi_cmd_2 == 0x12 || !pkt_scsi_cmd_2 || pkt_scsi_cmd_2 == 3
2142 || *g_cd_sc_ffffffd9_ptr))
2143 && !g_is_in_read_info && !sceCdAtapi_BC() )
2145 ata_device_set_transfer_mode_outer(0);
2148 return sceCdAtapiExecCmd_local(n, buf, nsec, secsize, pkt, pkt_len, proto);
2151 int xatapi_7_sceCdAtapiExecCmd(s16 n,
void *buf,
int nsec,
int secsize,
void *pkt,
int pkt_len,
int proto)
2156 WaitEventFlag(g_acmd_evfid, 1, WEF_AND | WEF_CLEAR, &efbits);
2157 retres = sceCdAtapiExecCmd(n, buf, nsec, secsize, pkt, pkt_len, proto);
2160 SetEventFlag(g_acmd_evfid, 1);
2167 char r_spd_ata_status;
2168 USE_DEV5_SPEED_REGS();
2170 r_spd_ata_status = dev5_speed_regs->r_spd_ata_status;
2171 if ( (r_spd_ata_status & 1) )
2173 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATA PIO iocmd err 0x%02x, 0x%02x\n", r_spd_ata_status, sceAtaGetError());
2176 else if ( (r_spd_ata_status & 8) )
2180 switch ( cmd_state->type )
2184 for ( i = 0; i < 256; i += 1 )
2186 cmd_state->buf16[i] = dev5_speed_regs->r_spd_ata_data;
2188 cmd_state->buf16 += 256;
2193 for ( i = 0; i < 256; i += 1 )
2195 dev5_speed_regs->r_spd_ata_data = cmd_state->buf16[i];
2197 cmd_state->buf16 += 256;
2202 for ( i = 0; i < 256; i += 1 )
2204 dev5_speed_regs->r_spd_ata_data = cmd_state->buf16[i];
2206 cmd_state->buf16 += 256;
2207 for ( i = 0; i < 4; i += 1 )
2209 dev5_speed_regs->r_spd_ata_data = cmd_state->buf8[512 + i];
2211 cmd_state->buf8 += 4;
2231 USE_DEV5_SPEED_REGS();
2233 VERBOSE_KPRINTF(1,
"Pio trans %d\n", cmd_state->blkcount_atapi * cmd_state->blksize_atapi);
2234 result = ata_wait_busy1_busy();
2238 for ( blktotal = cmd_state->blkcount_atapi * cmd_state->blksize_atapi; result >= 0 && blktotal; blktotal -= lhcyl )
2240 char r_spd_ata_status;
2242 r_spd_ata_status = dev5_speed_regs->r_spd_ata_status;
2243 if ( (r_spd_ata_status & 1) )
2245 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATAPI PIO iocmd err 0x%02x, 0x%02x\n", r_spd_ata_status, sceAtaGetError());
2248 if ( !(r_spd_ata_status & 8) )
2251 lhcyl = (dev5_speed_regs->r_spd_ata_lcyl & 0xFF) | ((dev5_speed_regs->r_spd_ata_hcyl & 0xFF) << 8);
2252 VERBOSE_KPRINTF(1,
"ByteCount Trans byte %04x\n", lhcyl);
2253 switch ( cmd_state->type_atapi )
2257 VERBOSE_KPRINTF(1,
"IoRun_atapi input trans %d\n", cmd_state->blksize_atapi);
2258 for ( i = 0; i < (lhcyl >> 1); i += 1 )
2260 ((u16 *)((
char *)cmd_state->buf_atapi))[i] = dev5_speed_regs->r_spd_ata_data;
2263 *((u8 *)cmd_state->buf_atapi + 2 * i) = dev5_speed_regs->r_spd_ata_data;
2264 cmd_state->buf_atapi = (
char *)cmd_state->buf_atapi + lhcyl;
2269 VERBOSE_KPRINTF(1,
"IoRun_atapi output trans %d\n", cmd_state->blksize_atapi);
2270 for ( i = 0; i < (lhcyl >> 1); i += 1 )
2272 dev5_speed_regs->r_spd_ata_data = ((u16 *)cmd_state->buf_atapi)[i];
2275 dev5_speed_regs->r_spd_ata_data = *((u8 *)cmd_state->buf_atapi + 2 * i);
2276 cmd_state->buf_atapi = (
char *)cmd_state->buf_atapi + lhcyl;
2282 VERBOSE_KPRINTF(1,
"IoRun_atapi trans End\n");
2283 result = ata_wait_busy1_busy();
2288 static int atapi_transfer_wrapper(
char *buf,
unsigned int blkcount,
int dir)
2290 unsigned int blkcount_tmp;
2292 unsigned int dbuf_stat_mask;
2295 char spd_ata_status_tmp;
2298 USE_DEV5_SPEED_REGS();
2300 for ( blkcount_tmp = blkcount; blkcount_tmp; blkcount_tmp -= (flg ? dbuf_stat_mask : 0) )
2303 for ( i = 0; i < 20 && !dbuf_stat_mask; i += 1 )
2305 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2307 VERBOSE_KPRINTF(1,
"*SPD_RINTR_STAT %02x\n", dev5_speed_regs->r_spd_intr_stat);
2308 VERBOSE_KPRINTF(1,
"*R_DBUF_STAT %02x\n", dev5_speed_regs->r_spd_dbuf_stat);
2310 if ( !dbuf_stat_mask )
2313 VERBOSE_KPRINTF(1,
"Wait Event\n");
2314 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2315 VERBOSE_KPRINTF(1,
"Event come\n");
2318 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, ata timedout\n");
2323 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, Media Eject\n");
2326 if ( !(dev5_speed_regs->r_spd_intr_stat & 2) )
2328 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2330 spd_ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
2331 Error = sceAtaGetError();
2332 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", spd_ata_status_tmp, Error);
2333 return (!(Error & 0x80)) ? -503 : -510;
2335 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2340 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2345 if ( blkcount_tmp < dbuf_stat_mask )
2346 dbuf_stat_mask = blkcount_tmp;
2347 result = SpdDmaTransfer(0, buf, (dbuf_stat_mask << 18) | 0x20, dir);
2348 buf += dbuf_stat_mask << 9;
2356 static int DmaRun_atapi(
char *buf,
int blkcount,
int blksize,
int dir)
2358 unsigned int blkremainder;
2359 unsigned int blksectors;
2361 unsigned int dbuf_stat_mask;
2364 char spd_ata_status_tmp;
2365 unsigned int dbuf_stat_sectors;
2367 USE_DEV5_SPEED_REGS();
2369 VERBOSE_KPRINTF(1,
"DmaRun_atapi start\n");
2370 blkremainder = (blkcount * blksize) & 0x1FF;
2371 for ( blksectors = (
unsigned int)(blkcount * blksize) >> 9; blksectors; blksectors -= dbuf_stat_mask )
2374 for ( i = 0; i < 20 && !dbuf_stat_mask; i += 1 )
2376 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2378 if ( !dbuf_stat_mask )
2381 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2384 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, ata timedout\n");
2389 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, Media Eject\n");
2392 if ( (dev5_speed_regs->r_spd_intr_stat & 2) )
2394 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2398 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2400 spd_ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
2401 Error = sceAtaGetError();
2402 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", spd_ata_status_tmp, Error);
2403 return (!(Error & 0x80)) ? -503 : -510;
2405 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2409 if ( blksectors < dbuf_stat_mask )
2411 dbuf_stat_mask = blksectors;
2413 dbuf_stat_sectors = dbuf_stat_mask << 9;
2416 "DmaRun_atapi cnt %d nblk %d secsize %d bcr %08x\n",
2420 (dbuf_stat_sectors << 9) | 0x20);
2421 result = SpdDmaTransfer(0, buf, (dbuf_stat_sectors << 9) | 0x20, dir);
2422 buf += dbuf_stat_sectors;
2428 while ( !(dev5_speed_regs->r_spd_intr_stat & 1) )
2430 dev5_speed_regs->m_spd_unk36 += 512;
2431 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, dir);
2434 memcpy(g_atapi_xfer_buf, buf, blkremainder);
2435 result = SpdDmaTransfer(0, g_atapi_xfer_buf, 0x40020, dir);
2441 result = SpdDmaTransfer(0, g_atapi_xfer_buf, 0x40020, 0);
2444 memcpy(buf, g_atapi_xfer_buf, blkremainder);
2447 VERBOSE_KPRINTF(1,
"DmaRun_atapi End.\n");
2451 static int DmaRun_atapi_extrans1(
char *buf,
int blkcount,
int blksize,
int dir)
2453 unsigned int blksectors;
2456 unsigned int dbuf_stat_mask;
2459 char spd_ata_status_tmp;
2460 unsigned int dbuf_stat_sectors;
2462 USE_DEV5_SPEED_REGS();
2464 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans start\n");
2468 blkremainder = (blkcount * blksize) & 0x1FF;
2469 for ( blksectors = (
unsigned int)(blkcount * blksize) >> 9; blksectors; blksectors -= dbuf_stat_mask )
2472 for ( i = 0; i < 20 && !dbuf_stat_mask; i += 1 )
2474 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2476 if ( !dbuf_stat_mask )
2479 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2482 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, ata timedout\n");
2487 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, Media Eject\n");
2490 if ( (dev5_speed_regs->r_spd_intr_stat & 2) )
2492 dbuf_stat_mask = dev5_speed_regs->r_spd_dbuf_stat & 0x1F;
2496 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2498 spd_ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
2499 Error = sceAtaGetError();
2500 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", spd_ata_status_tmp, Error);
2501 return (!(Error & 0x80)) ? -503 : -510;
2503 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2507 if ( blksectors < dbuf_stat_mask )
2509 dbuf_stat_mask = blksectors;
2511 dbuf_stat_sectors = dbuf_stat_mask << 9;
2514 "DmaRun_atapi_extrans cnt %d nblk %d secsize %d bcr %08x\n",
2518 (dbuf_stat_sectors << 9) | 0x20);
2519 result = SpdDmaTransfer_extrans_1(0, buf, (dbuf_stat_sectors << 9) | 0x20, dir);
2520 buf += dbuf_stat_sectors;
2526 while ( !(dev5_speed_regs->r_spd_intr_stat & 1) )
2528 dev5_speed_regs->m_spd_unk36 += 512;
2529 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, dir);
2532 memcpy(g_atapi_xfer_buf, buf, blkremainder);
2533 result = SpdDmaTransfer_extrans_1(0, g_atapi_xfer_buf, 0x40020, dir);
2539 result = SpdDmaTransfer_extrans_1(0, g_atapi_xfer_buf, 0x40020, 0);
2542 memcpy(buf, g_atapi_xfer_buf, blkremainder);
2545 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans End.\n");
2549 static int DmaRun_atapi_extrans2(
char *buf,
int blkcount,
int blksize,
int dir)
2552 unsigned int blksectors;
2555 unsigned int fpga_spckcnt;
2560 USE_DEV5_SPEED_REGS();
2562 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans start\n");
2566 CancelAlarm(AtaAlarmrHandle, 0);
2567 USec2SysClock(0x989680, &sysclk);
2568 result = SetAlarm(&sysclk, AtaAlarmrHandle, 0);
2576 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2579 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, ata timedout\n");
2584 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, Media Eject\n");
2587 if ( (dev5_speed_regs->r_spd_intr_stat & 2) )
2591 if ( (dev5_speed_regs->r_spd_ata_control & 1) )
2593 Error = sceAtaGetError();
2595 1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", dev5_speed_regs->r_spd_ata_status, Error);
2596 return (!(Error & 0x80)) ? -503 : -510;
2598 VERBOSE_KPRINTF(1,
"DEV5 ATA: warning: ata intr without error.\n");
2600 dev5_speed_regs->r_spd_dma_ctrl = (dev5_speed_regs->r_spd_rev_1 >= 0x11) ? 6 : 4;
2604 blkremainder = (blkcount * blksize) & 0x1FF;
2606 for ( blksectors = (
unsigned int)(blkcount * blksize) >> 9; blksectors; blksectors -= fpga_spckcnt )
2608 unsigned int fpga_spckcnt_bytes;
2610 for ( i = 0;; i += 1 )
2612 fpga_spckcnt = do_fpga_check_spckcnt();
2613 if ( fpga_spckcnt >= 3 || fpga_spckcnt >= blksectors )
2626 PollEventFlag(g_atapi_event_flag, 5, WEF_OR | WEF_CLEAR, &efbits);
2629 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, ata timedout\n");
2633 if ( !(dev5_speed_regs->r_spd_intr_stat & 2) && (dev5_speed_regs->r_spd_ata_control & 1) )
2635 Error = sceAtaGetError();
2637 1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x, while DmaRun\n", dev5_speed_regs->r_spd_ata_status, Error);
2638 return (!(Error & 0x80)) ? -503 : -510;
2644 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun_atapi_extrans, Media Eject\n");
2651 if ( blksectors < fpga_spckcnt )
2653 fpga_spckcnt = blksectors;
2655 fpga_spckcnt_bytes = fpga_spckcnt << 9;
2658 "DmaRun_atapi_extrans cnt %d nblk %d secsize %d bcr %08x\n",
2662 (fpga_spckcnt_bytes << 9) | 0x20);
2663 extransres = SpdDmaTransfer_extrans_2(0, buf, (fpga_spckcnt_bytes << 9) | 0x20, dir);
2664 if ( extransres < 0 )
2666 buf += fpga_spckcnt_bytes;
2671 if ( extransres >= 0 && blkremainder )
2673 while ( !(dev5_speed_regs->r_spd_intr_stat & 1) )
2675 dev5_speed_regs->m_spd_unk36 += 512;
2676 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, dir);
2682 memcpy(g_atapi_xfer_buf, buf, blkremainder);
2683 extransres = SpdDmaTransfer_extrans_2(0, g_atapi_xfer_buf, 0x40020, dir);
2687 extransres = SpdDmaTransfer_extrans_2(0, g_atapi_xfer_buf, 0x40020, 0);
2688 if ( extransres >= 0 )
2690 memcpy(buf, g_atapi_xfer_buf, blkremainder);
2697 if ( extransres < 0 )
2701 VERBOSE_KPRINTF(1,
"DmaRun_atapi_extrans End.\n");
2705 static void DmaRun_spck(
char *buf,
unsigned int secsize)
2707 unsigned int secsize_sectors;
2708 unsigned int fpga_spckcnt;
2709 USE_DEV5_SPEED_REGS();
2711 VERBOSE_KPRINTF(1,
"DmaRun_spck start\n");
2716 for ( secsize_sectors = secsize >> 9; secsize_sectors; secsize_sectors -= fpga_spckcnt )
2718 unsigned int fpga_spckcnt_bytes;
2720 for ( fpga_spckcnt = 0; fpga_spckcnt < 4; fpga_spckcnt = do_fpga_check_spckcnt() )
2722 if ( secsize_sectors < fpga_spckcnt )
2724 fpga_spckcnt = secsize_sectors;
2726 fpga_spckcnt_bytes = fpga_spckcnt << 9;
2729 "DmaRun_spck cnt %d nblk %d secsize %d bcr %08x\n",
2733 (fpga_spckcnt_bytes << 9) | 0x20);
2734 if ( SpdDmaTransfer_extrans_3(0, buf, (fpga_spckcnt_bytes << 9) | 0x20, 1) < 0 )
2739 buf += fpga_spckcnt_bytes;
2741 if ( (secsize & 0x1FF) )
2743 dev5_speed_regs->m_spd_unk36 += 512;
2744 VERBOSE_KPRINTF(1,
"SpdDmaTransfer buf:%08x bcr:%d dir:%d\n", buf, 0x40020, 1);
2745 memcpy(g_atapi_xfer_buf, buf, secsize & 0x1FF);
2746 if ( SpdDmaTransfer_extrans_3(0, g_atapi_xfer_buf, 0x40020, 1) < 0 )
2752 VERBOSE_KPRINTF(1,
"DmaRun_spck End.\n");
2755 static int sceAtaWaitResult(
void)
2762 USE_DEV5_SPEED_REGS();
2766 switch ( atad_cmd_state.type )
2770 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2774 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout while non data command\n");
2779 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: DmaRun, Media Eject\n");
2786 res = atapi_transfer_wrapper((
char *)atad_cmd_state.buf, atad_cmd_state.blkcount, atad_cmd_state.dir);
2792 for ( i = 0; i < 100 && !intr_stat_msk; i += 1 )
2794 intr_stat_msk = dev5_speed_regs->r_spd_intr_stat & 1;
2796 if ( !intr_stat_msk )
2799 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2802 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2805 "DEV5 ATA: error: istat %x, ienable %x\n",
2806 dev5_speed_regs->r_spd_intr_stat,
2807 dev5_speed_regs->r_spd_intr_mask);
2812 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata eject, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2815 "DEV5 ATA: error: istat %x, ienable %x\n",
2816 dev5_speed_regs->r_spd_intr_stat,
2817 dev5_speed_regs->r_spd_intr_mask);
2826 res = ata_wait_busy1_busy();
2831 atad_cmd_state.blkcount -= 1;
2832 if ( atad_cmd_state.blkcount == 0xFFFFFFFF )
2837 res = ata_pio_transfer(&atad_cmd_state);
2849 status_tmp = dev5_speed_regs->r_spd_ata_status;
2850 if ( (status_tmp & 0x80) )
2852 res = ata_wait_busy1_busy();
2853 status_tmp = dev5_speed_regs->r_spd_ata_status;
2855 if ( (status_tmp & 1) )
2859 Error = sceAtaGetError();
2860 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd err 0x%02x, 0x%02x\n", status_tmp, Error);
2861 res = (Error & 0x80) ? -510 : -503;
2864 CancelAlarm(AtaAlarmrHandle, 0);
2868 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATA failed, %d\n", res);
2873 int xatapi_6_sceAtaWaitResult(
void)
2878 if ( vReferEventFlagStatus(g_acmd_evfid, &efinfo) || (efinfo.
currBits & 1) )
2880 VERBOSE_KPRINTF(1,
"sceCdAtapiWaitResult Call Error\n");
2883 restmp = sceAtaWaitResult();
2884 SetEventFlag(g_acmd_evfid, 1);
2888 static int sceCdAtapiWaitResult_local(
void)
2895 USE_DEV5_SPEED_REGS();
2898 switch ( atad_cmd_state.type_atapi )
2902 VERBOSE_KPRINTF(1,
"waitresult\n");
2903 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2907 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout while non data command\n");
2912 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata eject while non data command\n");
2918 VERBOSE_KPRINTF(1,
"waitresult dma\n");
2919 if ( !g_reset_scrambling_pack )
2922 (
char *)atad_cmd_state.buf_atapi,
2923 atad_cmd_state.blkcount_atapi,
2924 atad_cmd_state.blksize_atapi,
2925 atad_cmd_state.dir_atapi);
2927 else if ( atad_cmd_state.dir_atapi )
2932 blktotal1 = atad_cmd_state.blkcount_atapi * atad_cmd_state.blksize_atapi;
2933 for ( blkoffs = 0; blkoffs < blktotal1;
2934 blkoffs += atad_cmd_state.blkcount_atapi * atad_cmd_state.blksize_atapi )
2938 padres = Mpeg2CheckPadding(
2939 (
char *)atad_cmd_state.buf_atapi + blkoffs, blktotal1 - blkoffs, &padinfo, &g_pes_scrambling_control_pack);
2943 (
char *)atad_cmd_state.buf_atapi,
2944 atad_cmd_state.blkcount_atapi,
2945 atad_cmd_state.blksize_atapi,
2946 atad_cmd_state.dir_atapi);
2949 atad_cmd_state.blksize_atapi = 2048;
2950 atad_cmd_state.blkcount_atapi = padinfo;
2952 DmaRun_atapi_extrans1(
2953 (
char *)atad_cmd_state.buf_atapi + blkoffs, padinfo, 2048, atad_cmd_state.dir_atapi) :
2954 DmaRun_atapi((char *)atad_cmd_state.buf_atapi + blkoffs, padinfo, 2048, atad_cmd_state.dir_atapi);
2959 res = DmaRun_atapi_extrans2(
2960 (
char *)atad_cmd_state.buf_atapi, atad_cmd_state.blkcount_atapi, atad_cmd_state.blksize_atapi, 0);
2967 for ( i = 0; i < 100 && !intr_stat_msk; i += 1 )
2969 intr_stat_msk = dev5_speed_regs->r_spd_intr_stat & 1;
2971 if ( intr_stat_msk )
2975 VERBOSE_KPRINTF(1,
"ata command not finished yet\n");
2977 WaitEventFlag(g_atapi_event_flag, 7, WEF_OR | WEF_CLEAR, &efbits);
2980 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata timedout, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2983 "DEV5 ATA: error: istat %x, ienable %x\n",
2984 dev5_speed_regs->r_spd_intr_stat,
2985 dev5_speed_regs->r_spd_intr_mask);
2990 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ata eject, buffer stat %04x\n", dev5_speed_regs->r_spd_dbuf_stat);
2993 "DEV5 ATA: error: istat %x, ienable %x\n",
2994 dev5_speed_regs->r_spd_intr_stat,
2995 dev5_speed_regs->r_spd_intr_mask);
3000 res = IoRun_atapi(&atad_cmd_state);
3005 char ata_status_tmp;
3007 ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
3008 if ( (ata_status_tmp & 0x80) )
3010 res = ata_wait_busy1_busy();
3011 ata_status_tmp = dev5_speed_regs->r_spd_ata_status;
3013 if ( (ata_status_tmp & 1) )
3017 Error = sceAtaGetError();
3018 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: cmd status 0x%02x, error 0x%02x\n", ata_status_tmp, Error);
3019 res = (Error & 0x80) ? -510 : -503;
3022 CancelAlarm(AtaAlarmrHandle, 0);
3024 VERBOSE_KPRINTF(1,
"sceCdAtapiWaitResult_local() End.\n");
3027 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: ATA failed, %d\n", res);
3032 int xatapi_8_sceCdAtapiWaitResult(
void)
3037 if ( vReferEventFlagStatus(g_acmd_evfid, &efinfo) || (efinfo.
currBits & 1) )
3039 VERBOSE_KPRINTF(1,
"sceCdAtapiWaitResult Call Error\n");
3042 restmp = sceCdAtapiWaitResult_local();
3043 SetEventFlag(g_acmd_evfid, 1);
3047 static void ata_bus_reset_inner(
void)
3049 USE_DEV5_SPEED_REGS();
3051 dev5_speed_regs->r_spd_if_ctrl = 128;
3053 dev5_speed_regs->r_spd_if_ctrl = 0;
3054 dev5_speed_regs->r_spd_if_ctrl = 72;
3056 VERBOSE_KPRINTF(1,
"hard reset\n");
3059 static int ata_bus_reset(
void)
3061 USE_DEV5_SPEED_REGS();
3063 if ( !(dev5_speed_regs->r_spd_if_ctrl & 0x40) )
3064 ata_bus_reset_inner();
3065 return ata_wait_busy2_busy();
3068 int xatapi_4_sceAtaSoftReset(
void)
3070 USE_DEV5_SPEED_REGS();
3072 if ( (dev5_speed_regs->r_spd_ata_control & 0x80) )
3074 dev5_speed_regs->r_spd_ata_control = 6;
3076 dev5_speed_regs->r_spd_ata_control = 2;
3078 VERBOSE_KPRINTF(1,
"soft reset\n");
3079 return ata_wait_busy1_busy();
3083 static int sceAtaFlushCache(
int device)
3087 result = xatapi_5_sceAtaExecCmd(0, 1, 0, 0, 0, 0, 0, device << 4, 0xE7, 1);
3088 return result ? result : xatapi_6_sceAtaWaitResult();
3092 static int ata_device_identify(
int device,
void *
info)
3096 result = xatapi_5_sceAtaExecCmd(
info, 1, 0, 0, 0, 0, 0, device << 4, 0xEC, 2);
3097 return result ? result : xatapi_6_sceAtaWaitResult();
3100 static int ata_device_pkt_identify(
int device,
void *
info)
3104 result = xatapi_5_sceAtaExecCmd(
info, 1, 0, 0, 0, 0, 0, device << 4, 0xA1, 2);
3105 return result ? result : xatapi_6_sceAtaWaitResult();
3108 static int atapi_device_set_transfer_mode(
int device,
int type,
int mode)
3112 result = xatapi_5_sceAtaExecCmd(0, 1, 3, (u8)(mode | type), 0, 0, 0, device << 4, 0xEF, 1);
3115 result = xatapi_6_sceAtaWaitResult();
3124 ata_multiword_dma_mode(mode);
3127 ata_ultra_dma_mode(mode);
3135 static int ata_device_set_transfer_mode(
int device,
int type,
int mode)
3139 result = sceAtaExecCmd(0, 1, 3, (u8)(mode | type), 0, 0, 0, device << 4, 0xEF, 1);
3142 result = sceAtaWaitResult();
3151 ata_multiword_dma_mode(mode);
3154 ata_ultra_dma_mode(mode);
3164 char r_spd_ata_lcyl;
3166 USE_DEV5_SPEED_REGS();
3170 if ( (dev5_speed_regs->r_spd_ata_control & 0x88) )
3172 VERBOSE_KPRINTF(1,
"FindDev ATA_BUSY\n");
3175 r_spd_ata_lcyl = dev5_speed_regs->r_spd_ata_lcyl;
3176 r_spd_ata_hcyl = dev5_speed_regs->r_spd_ata_hcyl;
3177 if ( dev5_speed_regs->r_spd_ata_nsector != 1 || dev5_speed_regs->r_spd_ata_sector != 1 )
3179 VERBOSE_KPRINTF(1,
"FindDev ATA_NOT_CONNECT\n");
3183 if ( !r_spd_ata_lcyl && !r_spd_ata_hcyl )
3185 if ( r_spd_ata_lcyl == 20 && r_spd_ata_hcyl == 235 )
3187 dev5_speed_regs->r_spd_ata_lcyl = 85;
3188 dev5_speed_regs->r_spd_ata_hcyl = 170;
3191 if ( (dev5_speed_regs->r_spd_ata_lcyl & 0xFF) != 85 || (dev5_speed_regs->r_spd_ata_hcyl & 0xFF) != 170 )
3195 static void atapi_device_set_transfer_mode_outer(
int device)
3197 if ( g_dma_mode_value )
3199 VERBOSE_KPRINTF(0,
"UDMA_mode Mode%d\n", 2);
3200 while ( atapi_device_set_transfer_mode(device, 64, (u8)g_dma_speed_value) < 0 )
3202 DelayThread(2000000);
3207 VERBOSE_KPRINTF(0,
"MDMA_mode Mode%d\n", 2);
3208 while ( atapi_device_set_transfer_mode(device, 32, (u8)g_dma_speed_value) < 0 )
3210 DelayThread(2000000);
3215 static void ata_device_set_transfer_mode_outer(
int device)
3219 if ( g_dma_mode_value )
3221 VERBOSE_KPRINTF(0,
"UDMA_mode Mode%d\n", 2);
3222 for ( i = 0; i < 3 && ata_device_set_transfer_mode(device, 64, (u8)g_dma_speed_value); i += 1 )
3224 DelayThread(2000000);
3229 VERBOSE_KPRINTF(0,
"MDMA_mode Mode%d\n", 2);
3230 for ( i = 0; i < 3 && ata_device_set_transfer_mode(device, 32, (u8)g_dma_speed_value); i += 1 )
3232 DelayThread(2000000);
3240 USE_DEV5_SPEED_REGS();
3242 if ( xatapi_4_sceAtaSoftReset() )
3244 ata_device_probe(&devinfo[0]);
3245 if ( !devinfo[0].exists )
3247 VERBOSE_KPRINTF(1,
"DEV5 ATA: error: there is no device0\n");
3251 if ( ata_device_select(1) )
3254 if ( (dev5_speed_regs->r_spd_ata_control & 0xFF) )
3255 ata_device_probe(&devinfo[1]);
3259 g_is_in_read_info = 0;
3260 for ( i = 0; i < 2; i += 1 )
3262 if ( !devinfo[i].exists )
3266 if ( !devinfo[i].has_packet )
3268 devinfo[i].
exists = !ata_device_identify(i, ata_param);
3270 if ( devinfo[i].has_packet == 1 )
3271 devinfo[i].
exists = !ata_device_pkt_identify(i, ata_param);
3272 VERBOSE_KPRINTF(1,
"device%d connected, kind %d.\n", i, devinfo[i].has_packet);
3273 if ( !devinfo[i].exists || devinfo[i].has_packet != 1 )
3277 do_hex_dump(ata_param,
sizeof(ata_param));
3278 devinfo[i].
lba48 = !do_atapi_cmd_inquiry_12h(i);
3279 if ( devinfo[i].lba48 )
3281 g_is_in_read_info = 1;
3282 VERBOSE_KPRINTF(0,
"Atapi Program Aria Brokun.\n");
3285 atapi_device_set_transfer_mode_outer(i);
3289 static void sceAtapiInit(
int device)
3292 USE_DEV5_SPEED_REGS();
3295 if ( g_ata_devinfo_init )
3297 g_ata_devinfo_init = 1;
3302 resetval = ata_bus_reset();
3303 if ( resetval != -550 )
3309 dev5_speed_regs->r_spd_if_ctrl = 0;
3311 ata_init_devices(atad_devinfo);
3314 static void sceAtInterInit(
void)
3318 speedRegisterIntrCb(1, ata_intr_cb);
3319 speedRegisterIntrCb(0, ata_intr_cb);
3320 speedRegisterPreDmaCb(0, ata_pre_dma_cb);
3321 speedRegisterPostDmaCb(0, ata_post_dma_cb);
3322 if ( sceCdSC(0xFFFFFFDC, &sc_tmp) )
3323 speedIntrEnable(256);
3326 static int create_event_flags(
void)
3332 g_atapi_event_flag = CreateEventFlag(&efparam);
3333 if ( g_atapi_event_flag < 0 )
3338 g_acmd_evfid = CreateEventFlag(&efparam);
3339 if ( g_acmd_evfid >= 0 )
3342 g_adma_evfid = CreateEventFlag(&efparam);
3343 if ( g_adma_evfid >= 0 )
3346 g_io_event_flag = CreateEventFlag(&efparam);
3347 if ( g_io_event_flag >= 0 )
3349 sceCdSC(0xFFFFFFE0, &g_acmd_evfid);
3350 sceCdSC(0xFFFFFFDF, &g_adma_evfid);
3355 if ( g_atapi_event_flag >= 0 )
3356 DeleteEventFlag(g_atapi_event_flag);
3357 if ( g_acmd_evfid >= 0 )
3358 DeleteEventFlag(g_acmd_evfid);
3359 if ( g_adma_evfid >= 0 )
3360 DeleteEventFlag(g_adma_evfid);
3364 static void FpgaLayer1On(
void)
3366 USE_DEV5_FPGA_REGS();
3367 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER1 %x\n",
"FpgaLayer1On", dev5_fpga_regs->r_fpga_layer1);
3368 dev5_fpga_regs->r_fpga_layer1 &= ~1;
3369 dev5_fpga_regs->r_fpga_layer1 |= 1;
3370 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER1 %x\n",
"FpgaLayer1On", dev5_fpga_regs->r_fpga_layer1);
3373 static void FpgaLayer1Off(
void)
3375 USE_DEV5_FPGA_REGS();
3377 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER1 %x\n",
"FpgaLayer1Off", dev5_fpga_regs->r_fpga_layer1);
3378 dev5_fpga_regs->r_fpga_layer1 &= ~1;
3379 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER1 %x\n",
"FpgaLayer1Off", dev5_fpga_regs->r_fpga_layer1);
3383 static void FpgaLayer2On(
void)
3385 USE_DEV5_FPGA_REGS();
3387 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER2 %x\n",
"FpgaLayer2On", dev5_fpga_regs->r_fpga_layer2);
3388 dev5_fpga_regs->r_fpga_layer2 &= ~1;
3389 dev5_fpga_regs->r_fpga_layer2 |= 1;
3390 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER2 %x\n",
"FpgaLayer2On", dev5_fpga_regs->r_fpga_layer2);
3394 static void FpgaLayer2Off(
void)
3396 USE_DEV5_FPGA_REGS();
3398 VERBOSE_KPRINTF(1,
"%s():old:FPGA_LAYER2 %x\n",
"FpgaLayer2Off", dev5_fpga_regs->r_fpga_layer2);
3399 dev5_fpga_regs->r_fpga_layer2 &= ~1;
3400 VERBOSE_KPRINTF(1,
"%s():new:FPGA_LAYER2 %x\n",
"FpgaLayer2Off", dev5_fpga_regs->r_fpga_layer2);
3403 static void FpgaXfrenOn(
void)
3405 USE_DEV5_FPGA_REGS();
3407 VERBOSE_KPRINTF(1,
"%s():old:FPGA_XFREN %x\n",
"FpgaXfrenOn", dev5_fpga_regs->r_fpga_xfren);
3408 dev5_fpga_regs->r_fpga_xfren &= ~1;
3409 dev5_fpga_regs->r_fpga_xfren |= 1;
3410 VERBOSE_KPRINTF(1,
"%s():new:FPGA_XFREN %x\n",
"FpgaXfrenOn", dev5_fpga_regs->r_fpga_xfren);
3413 static void FpgaXfrenOff(
void)
3415 USE_DEV5_FPGA_REGS();
3417 VERBOSE_KPRINTF(1,
"%s():old:FPGA_XFREN %x\n",
"FpgaXfrenOff", dev5_fpga_regs->r_fpga_xfren);
3418 dev5_fpga_regs->r_fpga_xfren &= ~1;
3419 VERBOSE_KPRINTF(1,
"%s():new:FPGA_XFREN %x\n",
"FpgaXfrenOff", dev5_fpga_regs->r_fpga_xfren);
3422 static void FpgaSpckmodeOn(
void)
3424 USE_DEV5_FPGA_REGS();
3426 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOn", dev5_fpga_regs->r_fpga_spckmode);
3427 dev5_fpga_regs->r_fpga_spckmode &= ~1;
3428 dev5_fpga_regs->r_fpga_spckmode |= 1;
3429 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOn", dev5_fpga_regs->r_fpga_spckmode);
3432 static void FpgaSpckmodeOff(
void)
3434 USE_DEV5_FPGA_REGS();
3436 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOff", dev5_fpga_regs->r_fpga_spckmode);
3437 dev5_fpga_regs->r_fpga_spckmode &= ~1;
3438 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SPCKMODE %x\n",
"FpgaSpckmodeOff", dev5_fpga_regs->r_fpga_spckmode);
3441 static void FpgaXfdir(
int dir)
3443 USE_DEV5_FPGA_REGS();
3445 VERBOSE_KPRINTF(1,
"%s():old:FPGA_XFRDIR %x\n",
"FpgaXfrdir", dev5_fpga_regs->r_fpga_xfrdir);
3446 dev5_fpga_regs->r_fpga_xfrdir &= ~1;
3449 dev5_fpga_regs->r_fpga_xfrdir |= 1;
3451 VERBOSE_KPRINTF(1,
"%s():new:FPGA_XFRDIR %x\n",
"FpgaXfrdir", dev5_fpga_regs->r_fpga_xfrdir);
3454 static int FpgaGetRevision(
void)
3456 USE_DEV5_FPGA_REGS();
3458 VERBOSE_KPRINTF(1,
"%s():FPGA_REVISION %x\n",
"FpgaGetRevision", dev5_fpga_regs->r_fpga_revision);
3459 return (u16)dev5_fpga_regs->r_fpga_revision;
3463 static unsigned int do_fpga_add_unused8120(
void)
3465 USE_DEV5_FPGA_REGS();
3467 return (dev5_fpga_regs->r_fpga_sl3bufd + (
unsigned int)dev5_fpga_regs->r_fpga_exbufd) >> 7;
3471 static int do_fpga_check_spckcnt(
void)
3473 USE_DEV5_FPGA_REGS();
3475 return (u16)dev5_fpga_regs->r_fpga_spckcnt;
3478 static void FpgaCheckWriteBuffer(
void)
3481 USE_DEV5_FPGA_REGS();
3483 VERBOSE_KPRINTF(1,
"%s():in ...\n",
"FpgaCheckWriteBuffer");
3484 for ( i = 0; i < 10000 && (dev5_fpga_regs->r_fpga_exbufe || dev5_fpga_regs->r_fpga_sl3bufe); i += 1 )
3488 VERBOSE_KPRINTF(0,
"exbuf enc=%x, sl3buf enc=%x\n", dev5_fpga_regs->r_fpga_exbufe, dev5_fpga_regs->r_fpga_sl3bufe);
3490 VERBOSE_KPRINTF(1,
"%s():out ...\n",
"FpgaCheckWriteBuffer");
3493 static void FpgaCheckWriteBuffer2(
void)
3495 USE_DEV5_FPGA_REGS();
3497 VERBOSE_KPRINTF(1,
"%s():in ...\n",
"FpgaCheckWriteBuffer2");
3498 while ( dev5_fpga_regs->r_fpga_sl3bufd )
3500 VERBOSE_KPRINTF(1,
"%s():FPGA_SL3BUFD %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_sl3bufd);
3501 VERBOSE_KPRINTF(1,
"%s():FPGA_SL3BUFE %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_sl3bufe);
3502 VERBOSE_KPRINTF(1,
"%s():FPGA_EXBUFD %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_exbufd);
3503 VERBOSE_KPRINTF(1,
"%s():FPGA_EXBUFE %x\n",
"FpgaCheckWriteBuffer2", dev5_fpga_regs->r_fpga_exbufe);
3505 VERBOSE_KPRINTF(1,
"%s():out ...\n",
"FpgaCheckWriteBuffer2");
3508 static void FpgaClearBuffer(
void)
3510 USE_DEV5_FPGA_REGS();
3512 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SL3BUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufd);
3513 VERBOSE_KPRINTF(1,
"%s():old:FPGA_SL3BUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufe);
3514 VERBOSE_KPRINTF(1,
"%s():old:FPGA_EXBUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufd);
3515 VERBOSE_KPRINTF(1,
"%s():old:FPGA_EXBUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufe);
3516 dev5_fpga_regs->r_fpga_unk30 &= ~1;
3517 dev5_fpga_regs->r_fpga_unk30 |= 1;
3518 while ( (u16)(dev5_fpga_regs->r_fpga_exbufd) || dev5_fpga_regs->r_fpga_sl3bufd )
3520 while ( dev5_fpga_regs->r_fpga_exbufe || dev5_fpga_regs->r_fpga_sl3bufe )
3522 dev5_fpga_regs->r_fpga_unk30 &= ~1;
3523 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SL3BUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufd);
3524 VERBOSE_KPRINTF(1,
"%s():new:FPGA_SL3BUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_sl3bufe);
3525 VERBOSE_KPRINTF(1,
"%s():new:FPGA_EXBUFD %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufd);
3526 VERBOSE_KPRINTF(1,
"%s():new:FPGA_EXBUFE %x\n",
"FpgaClearBuffer", dev5_fpga_regs->r_fpga_exbufe);
3529 static int Mpeg2CheckPadding(
char *buf,
unsigned int bufsize,
int *retptr,
int *pesscramblingpackptr)
3533 const char *bufoffs2;
3537 VERBOSE_KPRINTF(1,
"%s():in\n",
"Mpeg2CheckPadding");
3538 if ( (bufsize & 0x7FF) )
3540 VERBOSE_KPRINTF(1,
"%s():Buffer size not aligne !!\n",
"Mpeg2CheckPadding");
3543 if ( !*buf && !buf[1] && buf[2] == 1 && (u8)buf[3] == 0xBA )
3545 for ( i = 0; (
unsigned int)i < (bufsize >> 11); i += 1 )
3547 bufoffs1 = &buf[i << 11];
3548 if ( *bufoffs1 || bufoffs1[1] || bufoffs1[2] != 1 || (u8)bufoffs1[3] != 0xBA )
3557 bufoffs2 = bufoffs1 + 14;
3558 if ( !bufoffs1[14] )
3560 if ( !bufoffs1[15] && bufoffs1[16] == 1 && (u8)bufoffs1[17] == 0xBB )
3561 bufoffs2 = bufoffs1 + 38;
3562 if ( !*bufoffs2 && !bufoffs2[1] && bufoffs2[2] == 1 && (u8)bufoffs2[3] != 0xBF && (bufoffs2[6] & 0x60) )
3564 *pesscramblingpackptr += 1;
3569 VERBOSE_KPRINTF(1,
"%s():out %d %s Pack\n",
"Mpeg2CheckPadding", i, bufchk ?
"RDI" :
"NULL");
3574 static int Mpeg2CheckScramble(
char *buf,
unsigned int bufsize)
3583 VERBOSE_KPRINTF(1,
"%s():in\n",
"Mpeg2CheckScramble");
3584 if ( (bufsize & 0x7FF) )
3586 VERBOSE_KPRINTF(1,
"%s():Buffer size not aligne !!\n",
"Mpeg2CheckScramble");
3589 for ( i = 0; i < (int)(bufsize >> 11); i += 1 )
3591 bufcur = buf + (i << 11);
3592 if ( !*bufcur && !bufcur[1] && bufcur[2] == 1 && (u8)bufcur[3] == 0xBA )
3594 bufbuf = bufcur + 14;
3597 if ( !bufcur[15] && bufcur[16] == 1 && (u8)bufcur[17] == 0xBB )
3598 bufbuf = bufcur + 38;
3599 if ( !*bufbuf && !bufbuf[1] && bufbuf[2] == 1 )
3601 buf3 = (u8)bufbuf[3];
3602 if ( (buf3 == 0xE0 || buf3 == 0xBD || buf3 == 0xC0 || buf3 == 0xD0) && (bufbuf[6] & 0x30) )
3604 restmp = 0xFFFFFFFF;
3611 VERBOSE_KPRINTF(1,
"%s():out\n",
"Mpeg2CheckScramble");