PS2SDK
PS2 Homebrew Libraries
ps2atad.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Copyright (c) 2003 Marcus R. Brown <mrbrown@0xd6.org>
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
22 #include <types.h>
23 #include <defs.h>
24 #include <irx.h>
25 #include <loadcore.h>
26 #include <thbase.h>
27 #include <thevent.h>
28 #include <stdio.h>
29 #include <sysclib.h>
30 #ifdef ATA_USE_DEV9
31 #include <dev9.h>
32 #endif
33 #ifdef ATA_USE_AIFDEV9
34 #include <aifdev9.h>
35 #endif
36 #include <atad.h>
37 #ifdef ATA_ENABLE_BDM
38 #include <bdm.h>
39 #include <errno.h>
40 #endif
41 
42 #ifdef ATA_USE_DEV9
43 #include <speedregs.h>
44 #endif
45 #include <atahw.h>
46 
47 #define MODNAME "atad"
48 // TODO: last sdk 3.1.0 has ATAD module version 2.9 with significant changes.
49 // Check what was changed, and maybe port changes.
50 // CRC32: C2337807
51 IRX_ID(MODNAME, 2, 7);
52 
53 #define M_PRINTF(format, args...) \
54  printf(MODNAME ": " format, ##args)
55 
56 #define BANNER "ATA device driver %s - Copyright (c) 2003 Marcus R. Brown\n"
57 #define VERSION "v1.2"
58 
59 #define ATA_XFER_MODE_PIO 0x08
60 #ifdef ATA_MWDMA_MODES
61 #define ATA_XFER_MODE_MDMA 0x20
62 #endif
63 #define ATA_XFER_MODE_UDMA 0x40
64 
65 #define ATA_EV_TIMEOUT 1
66 #define ATA_EV_COMPLETE 2
67 
68 static int ata_devinfo_init = 0;
69 static int ata_evflg = -1;
70 
71 // Workarounds
72 static u8 ata_dvrp_workaround = 0; // Please read the comments in _start().
73 #ifdef ATA_USE_DEV9
74 #ifdef ATA_GAMESTAR_WORKAROUND
75 static u8 ata_gamestar_workaround = 0;
76 #endif
77 #endif
78 
79 /* Local device info kept for drives 0 and 1. */
80 static ata_devinfo_t atad_devinfo[2];
81 
82 /* Data returned from DEVICE IDENTIFY is kept here. Also, this is used by the
83  security commands to set and unlock the password. */
84 static u16 ata_param[256];
85 
86 /* ATA command info. */
87 typedef struct _ata_cmd_info
88 {
89  u8 command;
90  u8 type;
92 
93 static const ata_cmd_info_t ata_cmd_table[] = {
94  {ATA_C_NOP, 1},
95  {ATA_C_CFA_REQUEST_EXTENDED_ERROR_CODE, 1},
96  {ATA_C_DEVICE_RESET, 5},
97  {ATA_C_READ_SECTOR, 2},
98  {ATA_C_READ_SECTOR_EXT, 0x82},
99  {ATA_C_READ_DMA_EXT, 0x84},
100  {ATA_C_READ_NATIVE_MAX_ADDRESS_EXT, 0x81},
101  {ATA_C_READ_MULTIPLE_EXT, 0x82},
102  {ATA_C_WRITE_SECTOR, 3},
103  {ATA_C_WRITE_LONG, 8},
104  {ATA_C_WRITE_SECTOR_EXT, 0x83},
105  {ATA_C_WRITE_DMA_EXT, 0x84},
106  {ATA_C_SET_MAX_ADDRESS_EXT, 0x81},
107  {ATA_C_CFA_WRITE_SECTORS_WITHOUT_ERASE, 3},
108  {ATA_C_WRITE_MULTIPLE_EXT, 0x83},
109  {ATA_C_READ_VERIFY_SECTOR, 1},
110  {ATA_C_READ_VERIFY_SECTOR_EXT, 0x81},
111  {ATA_C_SEEK, 1},
112  {ATA_C_CFA_TRANSLATE_SECTOR, 2},
113  {ATA_C_SCE_SECURITY_CONTROL, 7},
114  {ATA_C_EXECUTE_DEVICE_DIAGNOSTIC, 6},
115  {ATA_C_INITIALIZE_DEVICE_PARAMETERS, 1},
116  {ATA_C_DOWNLOAD_MICROCODE, 3},
117  {ATA_C_IDENTIFY_PACKET_DEVICE, 2},
118  {ATA_C_SMART, 7},
119  {ATA_C_CFA_ERASE_SECTORS, 1},
120  {ATA_C_READ_MULTIPLE, 2},
121  {ATA_C_WRITE_MULTIPLE, 3},
122  {ATA_C_SET_MULTIPLE_MODE, 1},
123  {ATA_C_READ_DMA, 4},
124  {ATA_C_WRITE_DMA, 4},
125  {ATA_C_CFA_WRITE_MULTIPLE_WITHOUT_ERASE, 3},
126  {ATA_C_GET_MEDIA_STATUS, 1},
127  {ATA_C_MEDIA_LOCK, 1},
128  {ATA_C_MEDIA_UNLOCK, 1},
129  {ATA_C_STANDBY_IMMEDIATE, 1},
130  {ATA_C_IDLE_IMMEDIATE, 1},
131  {ATA_C_STANDBY, 1},
132  {ATA_C_IDLE, 1},
133  {ATA_C_READ_BUFFER, 2},
134  {ATA_C_CHECK_POWER_MODE, 1},
135  {ATA_C_SLEEP, 1},
136  {ATA_C_FLUSH_CACHE, 1},
137  {ATA_C_WRITE_BUFFER, 3},
138  {ATA_C_FLUSH_CACHE_EXT, 1},
139  {ATA_C_IDENTIFY_DEVICE, 2},
140  {ATA_C_MEDIA_EJECT, 1},
141  {ATA_C_SET_FEATURES, 1},
142  {ATA_C_SECURITY_SET_PASSWORD, 3},
143  {ATA_C_SECURITY_UNLOCK, 3},
144  {ATA_C_SECURITY_ERASE_PREPARE, 1},
145  {ATA_C_SECURITY_ERASE_UNIT, 3},
146  {ATA_C_SECURITY_FREEZE_LOCK, 1},
147  {ATA_C_SECURITY_DISABLE_PASSWORD, 3},
148  {ATA_C_READ_NATIVE_MAX_ADDRESS, 1},
149  {ATA_C_SET_MAX_ADDRESS, 1}};
150 #define ATA_CMD_TABLE_SIZE (sizeof ata_cmd_table / sizeof(ata_cmd_info_t))
151 
152 static const ata_cmd_info_t sec_ctrl_cmd_table[] = {
153  {ATA_SCE_IDENTIFY_DRIVE, 2},
154  {ATA_SCE_SECURITY_ERASE_PREPARE, 1},
155  {ATA_SCE_SECURITY_ERASE_UNIT, 1},
156  {ATA_SCE_SECURITY_FREEZE_LOCK, 1},
157  {ATA_SCE_SECURITY_SET_PASSWORD, 3},
158  {ATA_SCE_SECURITY_UNLOCK, 3},
159  {ATA_SCE_SECURITY_WRITE_ID, 3},
160  {ATA_SCE_SECURITY_READ_ID, 2}};
161 #define SEC_CTRL_CMD_TABLE_SIZE (sizeof sec_ctrl_cmd_table / sizeof(ata_cmd_info_t))
162 
163 static const ata_cmd_info_t smart_cmd_table[] = {
164  {ATA_S_SMART_READ_DATA, 2},
165  {ATA_S_SMART_ENABLE_DISABLE_AUTOSAVE, 1},
166  {ATA_S_SMART_SAVE_ATTRIBUTE_VALUES, 1},
167  {ATA_S_SMART_EXECUTE_OFF_LINE, 1},
168  {ATA_S_SMART_READ_LOG, 2},
169  {ATA_S_SMART_WRITE_LOG, 3},
170  {ATA_S_SMART_ENABLE_OPERATIONS, 1},
171  {ATA_S_SMART_DISABLE_OPERATIONS, 1},
172  {ATA_S_SMART_RETURN_STATUS, 1}};
173 #define SMART_CMD_TABLE_SIZE (sizeof smart_cmd_table / sizeof(ata_cmd_info_t))
174 
175 /* This is the state info tracked between sceAtaExecCmd() and sceAtaWaitResult(). */
176 typedef struct _ata_cmd_state
177 {
178  s32 type; /* The ata_cmd_info_t type field. */
179  union
180  {
181  void *buf;
182  u8 *buf8;
183  u16 *buf16;
184  };
185  u32 blkcount; /* The number of 512-byte blocks (sectors) to transfer. */
186  s32 dir; /* DMA direction: 0 - to RAM, 1 - from RAM. */
188 
189 static ata_cmd_state_t atad_cmd_state;
190 
191 #ifdef ATA_ENABLE_BDM
192 #define NUM_DEVICES 2
193 #define ATA_BD_SECTOR_SIZE 512
194 static struct block_device g_ata_bd[NUM_DEVICES];
195 #endif
196 
197 #ifdef ATA_USE_DEV9
198 static int ata_intr_cb(int flag);
199 #endif
200 #ifdef ATA_USE_AIFDEV9
201 static int ata_intr_cb(void);
202 #endif
203 static unsigned int ata_alarm_cb(void *unused);
204 
205 #ifdef ATA_USE_AIFDEV9
206 static void aif_tune_drive(int unit, int mode);
207 #endif
208 
209 #ifdef ATA_USE_DEV9
210 static void ata_set_dir(int dir);
211 
212 static void ata_pio_mode(int mode);
213 #ifdef ATA_MWDMA_MODES
214 static void ata_multiword_dma_mode(int mode);
215 #endif
216 static void ata_ultra_dma_mode(int mode);
217 #endif
218 static void ata_shutdown_cb(void);
219 
220 int ata_device_sector_io64(int device, void *buf, u64 lba, u32 nsectors, int dir);
221 
222 #ifdef ATA_ENABLE_BDM
223 static int ata_bd_read(struct block_device *bd, u64 sector, void *buffer, u16 count);
224 static int ata_bd_write(struct block_device *bd, u64 sector, const void *buffer, u16 count);
225 static void ata_bd_flush(struct block_device *bd);
226 static int ata_bd_stop(struct block_device *bd);
227 #endif
228 
229 extern struct irx_export_table _exp_atad;
230 
231 #ifdef ATA_USE_DEV9
232 // In v1.04, DMA was enabled in ata_set_dir() instead.
233 static void ata_pre_dma_cb(int bcr, int dir)
234 {
235  USE_SPD_REGS;
236 
237  (void)bcr;
238  (void)dir;
239 
240  SPD_REG16(SPD_R_XFR_CTRL) |= 0x80;
241 }
242 
243 static void ata_post_dma_cb(int bcr, int dir)
244 {
245  USE_SPD_REGS;
246 
247  (void)bcr;
248  (void)dir;
249 
250  SPD_REG16(SPD_R_XFR_CTRL) &= ~0x80;
251 }
252 #endif
253 
254 static int ata_create_event_flag(void)
255 {
257 
258  event.attr = EA_SINGLE; // In v1.04, EA_MULTI was specified.
259  event.bits = 0;
260  return CreateEventFlag(&event);
261 }
262 
263 int _start(int argc, char *argv[])
264 {
265 #ifdef ATA_USE_DEV9
266  USE_SPD_REGS;
267 #endif
268 #ifdef ATA_USE_AIFDEV9
269  USE_AIF_REGS;
270 #endif
271  int res;
272 
273  (void)argc;
274  (void)argv;
275 
276  printf(BANNER, VERSION);
277 
278  res = MODULE_NO_RESIDENT_END;
279 
280 #ifdef ATA_USE_DEV9
281  if (!(SPD_REG16(SPD_R_REV_3) & SPD_CAPS_ATA) || !(SPD_REG16(SPD_R_REV_8) & 0x02)) {
282  M_PRINTF("HDD is not connected, exiting.\n");
283  goto out;
284  }
285 
286  /* The PSX (Not the PlayStation or PSOne, but a PS2 with a DVR unit) has got an extra processor (Fujitsu MB91302A, aka the "DVRP") that seems to be emulating the console's PS2 ATA interface.
287  The stock disks of all PSX units are definitely 48-bit LBA compliant because of their capacities, but the DVRP's emulation seems to have a design problem:
288  1. It indicates that 48-bit LBA is supported.
289  2. The 48-bit LBA capacity fields show the true capacity of the disk.
290  3. Accesses to beyond the 28-bit LBA capacity (Which is 40.000GB by default) will result in I/O errors.
291  4. (For some PSX units like the DESR-7500): Double-writes to the ATA registers seem to cause the ATA interface to stall.
292 
293  The problem is obviously in the DVRP's firmware, but we currently have no way to fix these bugs because the DVRP is even more heavily secured that the IOP.
294  In the eyes of Sony, there isn't a problem because none of their retail PlayStation 2 software ever supported 48-bit LBA.
295 
296  The workaround here is to return the 28-bit LBA as the total size and only use 48-bit LBA commands when required. */
297  ata_dvrp_workaround = (SPD_REG16(SPD_R_REV_3) & SPD_CAPS_DVR) ? 1 : 0;
298 #endif
299 
300 #ifdef ATA_USE_AIFDEV9
301  if (!aifIsDetected()) {
302  M_PRINTF("AIF HDD: controller not found.\n");
303  goto out;
304  }
305  aif_regs[AIF_ATA_TCFG] = 0; // Clear ATA timing configuration.
306 #endif
307 
308 #ifdef ATA_USE_DEV9
309 #ifdef ATA_GAMESTAR_WORKAROUND
310  /* Some compatible adaptors may malfunction if transfers are not done according to the old ps2atad design.
311  Official adaptors appear to have a 0x0001 set for this register, but not compatibles.
312  While official I/O to this register are 8-bit, some compatibles have a 0x01 for the lower 8-bits,
313  but the upper 8-bits contain some random value. Hence perform a 16-bit read instead. */
314  ata_gamestar_workaround = (SPD_REG16(0x20) != 1) ? 1 : 0;
315  if (ata_gamestar_workaround) {
316  M_PRINTF("Compatible adaptor detected.\n");
317  /* Reportedly, some compatible adapters output more than SPD_CAPS_SMAP | SPD_CAPS_ATA | SPD_CAPS_UART in the SPD_R_REV_3 register. */
318  /* https://github.com/regttycomit/PS2_CXD9731_HDD_ADAPTOR/blob/7a6d058019f932eb701ced3bddca6c7eda498b50/hdl/chip.v#L506 */
319  ata_dvrp_workaround = 0;
320  }
321 #endif
322 #endif
323 
324  if ((ata_evflg = ata_create_event_flag()) < 0) {
325  M_PRINTF("Couldn't create event flag, exiting.\n");
326  goto out;
327  }
328 
329 #ifdef ATA_USE_DEV9
330  /* In v1.04, PIO mode 0 was set here. In late versions, it is set in ata_init_devices(). */
331  SpdRegisterIntrHandler(1, &ata_intr_cb);
332  SpdRegisterIntrHandler(0, &ata_intr_cb);
333 #ifdef ATA_GAMESTAR_WORKAROUND
334  if (!ata_gamestar_workaround) {
335 #endif
336  dev9RegisterPreDmaCb(0, &ata_pre_dma_cb);
337  dev9RegisterPostDmaCb(0, &ata_post_dma_cb);
338 #ifdef ATA_GAMESTAR_WORKAROUND
339  }
340 #endif
341  /* Register this at the last position, as it should be the last thing done before shutdown. */
342  Dev9RegisterPowerOffHandler(15, &ata_shutdown_cb);
343 #endif
344 
345 #ifdef ATA_USE_AIFDEV9
346  aifRegisterIntrCb(AIF_INUM_ATA0, &ata_intr_cb);
347  aifRegisterShutdownCb(AIF_INUM_ATA0, &ata_shutdown_cb);
348 
349  M_PRINTF("AIF HDD initialized.\n");
350 #endif
351 
352 #ifdef ATA_ENABLE_BDM
353  {
354  int i;
355 
356  for (i = 0; i < NUM_DEVICES; ++i) {
357  g_ata_bd[i].priv = (void *)&atad_devinfo[i];
358  g_ata_bd[i].name = "ata";
359  g_ata_bd[i].path = "ata";
360  g_ata_bd[i].devNr = i;
361  g_ata_bd[i].parNr = 0;
362  g_ata_bd[i].parId = 0x00;
363  g_ata_bd[i].sectorSize = 512;
364  g_ata_bd[i].sectorOffset = 0;
365  g_ata_bd[i].sectorCount = 0;
366 
367  g_ata_bd[i].read = ata_bd_read;
368  g_ata_bd[i].write = ata_bd_write;
369  g_ata_bd[i].flush = ata_bd_flush;
370  g_ata_bd[i].stop = ata_bd_stop;
371  }
372  }
373 
374  sceAtaInit(0);
375  sceAtaInit(1);
376 #endif
377 
378  if (RegisterLibraryEntries(&_exp_atad) != 0) {
379  M_PRINTF("Library is already registered, exiting.\n");
380  goto out;
381  }
382 
383  res = MODULE_RESIDENT_END;
384  M_PRINTF("Driver loaded.\n");
385 out:
386  return res;
387 }
388 
389 int _exit(void) { return MODULE_RESIDENT_END; }
390 
391 #ifdef ATA_USE_DEV9
392 static int ata_intr_cb(int flag)
393 {
394  if (flag == 1) { /* New card, invalidate device info. */
395  memset(atad_devinfo, 0, sizeof atad_devinfo);
396  } else {
397  SpdIntrDisable(SPD_INTR_ATA);
398  iSetEventFlag(ata_evflg, ATA_EV_COMPLETE);
399  }
400 
401  return 1;
402 }
403 #endif
404 
405 #ifdef ATA_USE_AIFDEV9
406 static int ata_intr_cb(void)
407 {
408  aifIntrDisable(AIF_INTR_ATA0);
409  iSetEventFlag(ata_evflg, ATA_EV_COMPLETE);
410 
411  return 1;
412 }
413 #endif
414 
415 static unsigned int ata_alarm_cb(void *unused)
416 {
417  (void)unused;
418 
419  iSetEventFlag(ata_evflg, ATA_EV_TIMEOUT);
420  return 0;
421 }
422 
423 /* Export 8 */
424 int sceAtaGetError(void)
425 {
426 #ifdef ATA_USE_DEV9
427  USE_ATA_REGS;
428 #endif
429 #ifdef ATA_USE_AIFDEV9
430  USE_AIF_ATA_REGS;
431 #endif
432  return ata_hwport->r_error & 0xff;
433 }
434 
435 #define ATA_WAIT_BUSY 0x80
436 #define ATA_WAIT_BUSBUSY 0x88
437 
438 #define ata_wait_busy() gen_ata_wait_busy(ATA_WAIT_BUSY)
439 #define ata_wait_bus_busy() gen_ata_wait_busy(ATA_WAIT_BUSBUSY)
440 
441 /* 0x80 for busy, 0x88 for bus busy.
442  In the original ATAD, the busy and bus-busy functions were separate, but similar. */
443 static int gen_ata_wait_busy(int bits)
444 {
445 #ifdef ATA_USE_DEV9
446  USE_ATA_REGS;
447 #endif
448 #ifdef ATA_USE_AIFDEV9
449  USE_AIF_ATA_REGS;
450 #endif
451  int i, delay;
452 
453  for (i = 0; i < 80; i++) {
454  int didx;
455 
456  if (!(ata_hwport->r_control & bits))
457  return 0;
458 
459  didx = i / 10;
460  switch (didx) {
461  case 0:
462  continue;
463  case 1:
464  delay = 100;
465  break;
466  case 2:
467  delay = 1000;
468  break;
469  case 3:
470  delay = 10000;
471  break;
472  case 4:
473  delay = 100000;
474  break;
475  default:
476  delay = 1000000;
477  }
478 
479  DelayThread(delay);
480  }
481 
482  M_PRINTF("Timeout while waiting on busy (0x%02x).\n", bits);
483  return ATA_RES_ERR_TIMEOUT;
484 }
485 
486 static int ata_device_select(int device)
487 {
488 #ifdef ATA_USE_DEV9
489  USE_ATA_REGS;
490 #endif
491 #ifdef ATA_USE_AIFDEV9
492  USE_AIF_ATA_REGS;
493 #endif
494  int res;
495 
496  if ((res = ata_wait_bus_busy()) < 0)
497  return res;
498 
499  /* If the device was already selected, nothing to do. */
500  if (((ata_hwport->r_select >> 4) & 1) == device)
501  return 0;
502 
503  /* Select the device. */
504  ata_hwport->r_select = (device & 1) << 4;
505  (void)(ata_hwport->r_control);
506  (void)(ata_hwport->r_control); // Only done once in v1.04.
507 
508  return ata_wait_bus_busy();
509 }
510 
511 static int g_atad_search_command = 0;
512 static int g_atad_search_type = 0;
513 
514 /* Export 20 */
515 int ata_set_command_type(int command, int type)
516 {
517  g_atad_search_command = command;
518  g_atad_search_type = type;
519 
520  return 0;
521 }
522 
523 /* Export 6 */
524 /*
525  28-bit LBA:
526  sector (7:0) -> LBA (7:0)
527  lcyl (7:0) -> LBA (15:8)
528  hcyl (7:0) -> LBA (23:16)
529  device (3:0) -> LBA (27:24)
530 
531  48-bit LBA just involves writing the upper 24 bits in the format above into each respective register on the first write pass, before writing the lower 24 bits in the 2nd write pass. The LBA bits within the device field are not used in either write pass.
532 */
533 int sceAtaExecCmd(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector, u16 lcyl, u16 hcyl, u16 select, u16 command)
534 {
535 #ifdef ATA_USE_DEV9
536  USE_ATA_REGS;
537 #endif
538 #ifdef ATA_USE_AIFDEV9
539  USE_AIF_ATA_REGS;
540 #endif
541  iop_sys_clock_t cmd_timeout;
542  const ata_cmd_info_t *cmd_table;
543  int i, res, type, cmd_table_size;
544  int using_timeout, device = (select >> 4) & 1;
545  u8 searchcmd;
546 
547  ClearEventFlag(ata_evflg, 0);
548 
549  if (!atad_devinfo[device].exists)
550  return ATA_RES_ERR_NODEV;
551 
552  if ((res = ata_device_select(device)) != 0)
553  return res;
554 
555  /* For the SCE and SMART commands, we need to search on the subcommand
556  specified in the feature register. */
557  if (command == ATA_C_SCE_SECURITY_CONTROL) {
558  cmd_table = sec_ctrl_cmd_table;
559  cmd_table_size = SEC_CTRL_CMD_TABLE_SIZE;
560  searchcmd = (u8)feature;
561  } else if (command == ATA_C_SMART) {
562  cmd_table = smart_cmd_table;
563  cmd_table_size = SMART_CMD_TABLE_SIZE;
564  searchcmd = (u8)feature;
565  } else {
566  cmd_table = ata_cmd_table;
567  cmd_table_size = ATA_CMD_TABLE_SIZE;
568  searchcmd = (u8)command;
569  }
570 
571  type = 0;
572  for (i = 0; i < cmd_table_size; i++) {
573  if (searchcmd == cmd_table[i].command) {
574  type = cmd_table[i].type;
575  break;
576  }
577  }
578 
579  // Unofficial: allow overriding the command type if not handled in table
580  if (!type && searchcmd == g_atad_search_command)
581  type = g_atad_search_type;
582 
583  if (!(atad_cmd_state.type = type & 0x7F)) // Non-SONY: ignore the 48-bit LBA flag.
584  return ATA_RES_ERR_CMD;
585 
586  atad_cmd_state.buf = buf;
587  atad_cmd_state.blkcount = blkcount;
588 
589  /* Check that the device is ready if this the appropiate command. */
590  if (!(ata_hwport->r_control & 0x40)) {
591  switch (command) {
592  case ATA_C_DEVICE_RESET:
593  case ATA_C_EXECUTE_DEVICE_DIAGNOSTIC:
594  case ATA_C_INITIALIZE_DEVICE_PARAMETERS:
595  case ATA_C_PACKET:
596  case ATA_C_IDENTIFY_PACKET_DEVICE:
597  break;
598  default:
599  M_PRINTF("Error: Device %d is not ready.\n", device);
600  return ATA_RES_ERR_NOTREADY;
601  }
602  }
603 
604  /* Does this command need a timeout? */
605  using_timeout = 0;
606  switch (type & 0x7F) { // Non-SONY: ignore the 48-bit LBA flag.
607  case 1:
608  case 6:
609  using_timeout = 1;
610  break;
611  case 4:
612  atad_cmd_state.dir = (command != ATA_C_READ_DMA && command != ATA_C_READ_DMA_EXT);
613  using_timeout = 1;
614  break;
615  }
616 
617  if (using_timeout) {
618  cmd_timeout.lo = 0x41eb0000;
619  cmd_timeout.hi = 0;
620 
621  /* SECURITY ERASE UNIT needs a bit more time. */
622  if (command == ATA_C_SCE_SECURITY_CONTROL && feature == ATA_SCE_SECURITY_ERASE_UNIT)
623  USec2SysClock(180000000, &cmd_timeout);
624 
625  if ((res = SetAlarm(&cmd_timeout, &ata_alarm_cb, NULL)) < 0)
626  return res;
627  }
628 
629  /* Enable the command completion interrupt. */
630  if ((type & 0x7F) == 1) {
631 #ifdef ATA_USE_DEV9
632  SpdIntrEnable(SPD_INTR_ATA0);
633 #endif
634 #ifdef ATA_USE_AIFDEV9
635  aifIntrEnable(AIF_INTR_ATA0);
636 #endif
637  }
638 
639  /* Finally! We send off the ATA command with arguments. */
640  ata_hwport->r_control = (using_timeout == 0) << 1;
641 
642  if (type & 0x80) { // For the sake of achieving improved performance, write the registers twice only if required! This is also required for compatibility with the buggy firmware of certain PSX units.
643  /* 48-bit LBA requires writing to the address registers twice,
644  24 bits of the LBA address is written each time.
645  Writing to registers twice does not affect 28-bit LBA since
646  only the latest data stored in address registers is used. */
647  ata_hwport->r_feature = (feature >> 8) & 0xff;
648  ata_hwport->r_nsector = (nsector >> 8) & 0xff;
649  ata_hwport->r_sector = (sector >> 8) & 0xff;
650  ata_hwport->r_lcyl = (lcyl >> 8) & 0xff;
651  ata_hwport->r_hcyl = (hcyl >> 8) & 0xff;
652  }
653 
654  ata_hwport->r_feature = feature & 0xff;
655  ata_hwport->r_nsector = nsector & 0xff;
656  ata_hwport->r_sector = sector & 0xff;
657  ata_hwport->r_lcyl = lcyl & 0xff;
658  ata_hwport->r_hcyl = hcyl & 0xff;
659  ata_hwport->r_select = (select | ATA_SEL_LBA) & 0xff; // In v1.04, LBA was enabled in the sceAtaDmaTransfer function.
660  ata_hwport->r_command = command & 0xff;
661 
662 #ifdef ATA_USE_DEV9
663  /* Turn on the LED. */
664  SpdSetLED(1);
665 #endif
666 
667  return 0;
668 }
669 
670 /* Do a PIO transfer, to or from the device. */
671 static int ata_pio_transfer(ata_cmd_state_t *cmd_state)
672 {
673 #ifdef ATA_USE_DEV9
674  USE_ATA_REGS;
675 #endif
676 #ifdef ATA_USE_AIFDEV9
677  USE_AIF_ATA_REGS;
678 #endif
679  u16 *buf16;
680  int i, type;
681  u16 status = ata_hwport->r_status & 0xff;
682 
683  if (status & ATA_STAT_ERR) {
684  M_PRINTF("Error: PIO cmd error: status 0x%02x, error 0x%02x.\n", status, sceAtaGetError());
685  return ATA_RES_ERR_IO;
686  }
687 
688  /* DRQ must be set (data request). */
689  if (!(status & ATA_STAT_DRQ))
690  return ATA_RES_ERR_NODATA;
691 
692  type = cmd_state->type;
693 
694  if (type == 3 || type == 8) {
695  /* PIO data out */
696  buf16 = cmd_state->buf16;
697  for (i = 0; i < 256; i++) {
698  ata_hwport->r_data = *buf16;
699  cmd_state->buf16 = ++buf16;
700  }
701  if (cmd_state->type == 8) {
702  u8 *buf8;
703 
704  buf8 = cmd_state->buf8;
705  for (i = 0; i < 4; i++) {
706  ata_hwport->r_data = *buf8;
707  cmd_state->buf8 = ++buf8;
708  }
709  }
710  } else if (type == 2) {
711  /* PIO data in */
712  buf16 = cmd_state->buf16;
713  for (i = 0; i < 256; i++) {
714  *buf16 = ata_hwport->r_data;
715  cmd_state->buf16 = ++buf16;
716  }
717  }
718 
719  return 0;
720 }
721 
722 #ifdef ATA_USE_DEV9
723 /* Complete a DMA transfer, to or from the device. */
724 static int ata_dma_complete(void *buf, u32 blkcount, int dir)
725 {
726  USE_ATA_REGS;
727  USE_SPD_REGS;
728  u32 bits, count, nbytes;
729  int i, res;
730  u16 dma_stat;
731 
732  while (blkcount) {
733  for (i = 0; i < 20; i++)
734  if ((dma_stat = SPD_REG16(0x38) & 0x1f))
735  goto next_transfer;
736 
737  if (dma_stat)
738  goto next_transfer;
739 
740  SpdIntrEnable(SPD_INTR_ATA);
741  /* Wait for the previous transfer to complete or a timeout. */
742  WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits);
743 
744  if (bits & ATA_EV_TIMEOUT) { /* Timeout. */
745  M_PRINTF("Error: DMA timeout.\n");
746  return ATA_RES_ERR_TIMEOUT;
747  }
748  /* No DMA completion bit? Spurious interrupt. */
749  if (!(SPD_REG16(SPD_R_INTR_STAT) & 0x02)) {
750  if (ata_hwport->r_control & 0x01) {
751  M_PRINTF("Error: Command error while doing DMA.\n");
752  M_PRINTF("Error: Command error status 0x%02x, error 0x%02x.\n", ata_hwport->r_status, sceAtaGetError());
753  /* In v1.04, there was no check for ICRC. */
754  return ((sceAtaGetError() & ATA_ERR_ICRC) ? ATA_RES_ERR_ICRC : ATA_RES_ERR_IO);
755  } else {
756  M_PRINTF("Warning: Got command interrupt, but not an error.\n");
757  continue;
758  }
759  }
760 
761  dma_stat = SPD_REG16(0x38) & 0x1f;
762 
763  next_transfer:
764  count = (blkcount < dma_stat) ? blkcount : dma_stat;
765  nbytes = count * 512;
766  if ((res = SpdDmaTransfer(0, buf, (nbytes << 9) | 32, dir)) < 0)
767  return res;
768 
769  buf = (void *)((u8 *)buf + nbytes);
770  blkcount -= count;
771  }
772 
773  return 0;
774 }
775 #endif
776 
777 /* Export 7 */
778 int sceAtaWaitResult(void)
779 {
780 #ifdef ATA_USE_DEV9
781  USE_SPD_REGS;
782  USE_ATA_REGS;
783 #endif
784 #ifdef ATA_USE_AIFDEV9
785  USE_AIF_ATA_REGS;
786 #endif
787  ata_cmd_state_t *cmd_state = &atad_cmd_state;
788  u32 bits;
789  int res = 0, type = cmd_state->type;
790  u16 stat;
791 
792  if (type == 1 || type == 6) { /* Non-data commands. */
793  WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits);
794  if (bits & ATA_EV_TIMEOUT) { /* Timeout. */
795  M_PRINTF("Error: ATA timeout on a non-data command.\n");
796  return ATA_RES_ERR_TIMEOUT;
797  }
798  } else if (type == 4) { /* DMA. */
799 #ifdef ATA_USE_DEV9
800  int i;
801 
802  if ((res = ata_dma_complete(cmd_state->buf, cmd_state->blkcount,
803  cmd_state->dir)) < 0)
804  goto finish;
805 
806  for (i = 0; i < 100; i++)
807  if ((stat = SPD_REG16(SPD_R_INTR_STAT) & 0x01))
808  break;
809  if (!stat) {
810  SpdIntrEnable(SPD_INTR_ATA0);
811  WaitEventFlag(ata_evflg, ATA_EV_TIMEOUT | ATA_EV_COMPLETE, WEF_CLEAR | WEF_OR, &bits);
812  if (bits & ATA_EV_TIMEOUT) {
813  M_PRINTF("Error: ATA timeout on DMA completion, buffer stat %04x\n", SPD_REG16(0x38));
814  M_PRINTF("Error: istat %x, ienable %x\n", SPD_REG16(SPD_R_INTR_STAT), SPD_REG16(SPD_R_INTR_MASK));
815  res = ATA_RES_ERR_TIMEOUT;
816  }
817  }
818 #endif
819 #ifdef ATA_USE_AIFDEV9
820  res = -1;
821 #endif
822  } else { /* PIO transfers. */
823  stat = ata_hwport->r_control;
824  if ((res = ata_wait_busy()) < 0)
825  goto finish;
826 
827  /* Transfer each PIO data block. */
828  while ((int)(--cmd_state->blkcount) != -1) {
829  if ((res = ata_pio_transfer(cmd_state)) < 0)
830  goto finish;
831  if ((res = ata_wait_busy()) < 0)
832  goto finish;
833  }
834  }
835 
836  if (res)
837  goto finish;
838 
839  /* Wait until the device isn't busy. */
840  if (ata_hwport->r_status & ATA_STAT_BUSY)
841  res = ata_wait_busy();
842  if ((stat = ata_hwport->r_status) & ATA_STAT_ERR) {
843  M_PRINTF("Error: Command error: status 0x%02x, error 0x%02x.\n", stat, sceAtaGetError());
844  /* In v1.04, there was no check for ICRC. */
845  res = (sceAtaGetError() & ATA_ERR_ICRC) ? ATA_RES_ERR_ICRC : ATA_RES_ERR_IO;
846  }
847 
848 finish:
849  /* The command has completed (with an error or not), so clean things up. */
850  CancelAlarm(&ata_alarm_cb, NULL);
851 #ifdef ATA_USE_DEV9
852  /* Turn off the LED. */
853  SpdSetLED(0);
854 #endif
855 
856  if (res)
857  M_PRINTF("error: ATA failed, %d\n", res);
858 
859  return res;
860 }
861 
862 /* Reset the ATA controller/bus. */
863 static int ata_bus_reset(void)
864 {
865 #ifdef ATA_USE_DEV9
866  USE_SPD_REGS;
867  SPD_REG16(SPD_R_IF_CTRL) = SPD_IF_ATA_RESET;
868  DelayThread(100);
869  SPD_REG16(SPD_R_IF_CTRL) = 0; // Not present in v1.04.
870  SPD_REG16(SPD_R_IF_CTRL) = 0x48;
871  DelayThread(3000);
872 #endif
873  return ata_wait_busy();
874 }
875 
876 /* Export 5 */
877 int sceAtaSoftReset(void)
878 {
879 #ifdef ATA_USE_DEV9
880  USE_ATA_REGS;
881 #endif
882 #ifdef ATA_USE_AIFDEV9
883  USE_AIF_ATA_REGS;
884 #endif
885 
886  if (ata_hwport->r_control & 0x80)
887  return ATA_RES_ERR_NOTREADY;
888 
889  /* Disables device interrupt assertion and asserts SRST. */
890  ata_hwport->r_control = 6;
891  DelayThread(100);
892 
893  /* Disable ATA interrupts. */
894  ata_hwport->r_control = 2;
895  DelayThread(3000);
896 
897  return ata_wait_busy();
898 }
899 
900 /* Export 17 */
901 int sceAtaFlushCache(int device)
902 {
903  int res;
904 
905  if (!(res = sceAtaExecCmd(NULL, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, (atad_devinfo[device].lba48 && !ata_dvrp_workaround) ? ATA_C_FLUSH_CACHE_EXT : ATA_C_FLUSH_CACHE)))
906  res = sceAtaWaitResult();
907 
908  return res;
909 }
910 
911 /* Export 13 */
912 int sceAtaIdle(int device, int period)
913 {
914  int res;
915 
916  if (!(res = sceAtaExecCmd(NULL, 1, 0, period & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDLE)))
917  res = sceAtaWaitResult();
918 
919  return res;
920 }
921 
922 static int ata_device_identify(int device, void *info)
923 {
924  int res;
925 
926  if (!(res = sceAtaExecCmd(info, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDENTIFY_DEVICE)))
927  res = sceAtaWaitResult();
928 
929  return res;
930 }
931 
932 static int ata_device_pkt_identify(int device, void *info)
933 {
934  int res;
935 
936  res = sceAtaExecCmd(info, 1, 0, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_IDENTIFY_PACKET_DEVICE);
937  if (!res)
938  return sceAtaWaitResult();
939  return res;
940 }
941 
942 /* Export 14 */
943 int sceAtaGetSceId(int device, void *data)
944 {
945  int res;
946 
947  if (!(res = sceAtaExecCmd(data, 1, ATA_SCE_IDENTIFY_DRIVE, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)))
948  res = sceAtaWaitResult();
949 
950  return res;
951 }
952 
953 static int ata_device_smart_enable(int device)
954 {
955  int res;
956 
957  if (!(res = sceAtaExecCmd(NULL, 1, ATA_S_SMART_ENABLE_OPERATIONS, 0, 0, 0x4f, 0xc2, (device << 4) & 0xffff, ATA_C_SMART)))
958  res = sceAtaWaitResult();
959 
960  return res;
961 }
962 
963 /* Export 16 */
964 int sceAtaSmartSaveAttr(int device)
965 {
966  int res;
967 
968  if (!(res = sceAtaExecCmd(NULL, 1, ATA_S_SMART_SAVE_ATTRIBUTE_VALUES, 0, 0, 0x4f, 0xc2, (device << 4) & 0xffff, ATA_C_SMART)))
969  res = sceAtaWaitResult();
970 
971  return res;
972 }
973 
974 /* Export 15 */
975 int sceAtaSmartReturnStatus(int device)
976 {
977  USE_ATA_REGS;
978  int res;
979 
980  res = sceAtaExecCmd(NULL, 1, ATA_S_SMART_RETURN_STATUS, 0, 0, 0x4f, 0xc2, (device << 4) & 0xffff, ATA_C_SMART);
981  if (res)
982  return res;
983 
984  res = sceAtaWaitResult();
985  if (res)
986  return res;
987 
988  /* Check to see if the report exceeded the threshold. */
989  if (((ata_hwport->r_lcyl & 0xFF) != 0x4f) || ((ata_hwport->r_hcyl & 0xFF) != 0xc2)) {
990  M_PRINTF("Error: SMART report exceeded threshold.\n");
991  return 1;
992  }
993 
994  return 0;
995 }
996 
997 /* Set features - set transfer mode. */
998 static int ata_device_set_transfer_mode(int device, int type, int mode)
999 {
1000  int res;
1001 
1002  res = sceAtaExecCmd(NULL, 1, 3, (type | mode) & 0xff, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SET_FEATURES);
1003  if (res)
1004  return res;
1005 
1006  res = sceAtaWaitResult();
1007  if (res)
1008  return res;
1009 
1010  switch (type) {
1011 #ifdef ATA_USE_DEV9
1012 #ifdef ATA_MWDMA_MODES
1013  case ATA_XFER_MODE_MDMA:
1014  ata_multiword_dma_mode(mode);
1015  break;
1016 #endif
1017  case ATA_XFER_MODE_UDMA:
1018  ata_ultra_dma_mode(mode);
1019  break;
1020  case ATA_XFER_MODE_PIO:
1021  ata_pio_mode(mode);
1022  break;
1023 #endif
1024 #ifdef ATA_USE_AIFDEV9
1025  case ATA_XFER_MODE_PIO:
1026  aif_tune_drive(0, mode);
1027  break;
1028 #endif
1029  }
1030 
1031  return 0;
1032 }
1033 
1034 /* Export 9 */
1035 /* Note: this can only support DMA modes, due to the commands issued. */
1036 int sceAtaDmaTransfer(int device, void *buf, u32 lba, u32 nsectors, int dir)
1037 {
1038  return ata_device_sector_io64(device, buf, (u64)lba, nsectors, dir);
1039 }
1040 
1041 int ata_device_sector_io64(int device, void *buf, u64 lba, u32 nsectors, int dir)
1042 {
1043  USE_SPD_REGS;
1044  int res = 0, retries;
1045  u16 sector, lcyl, hcyl, select, command, len;
1046  u32 chunk;
1047 
1048  while (res == 0 && nsectors > 0) {
1049 
1050  if (atad_devinfo[device].lba48 && (ata_dvrp_workaround ? (lba >= atad_devinfo[device].total_sectors) : 1)) {
1051  /* Setup for 48-bit LBA. */
1052  chunk = (nsectors > 65536) ? 65536 : nsectors;
1053  len = (u16)chunk; /* 0 means 65536 in the LBA48 sector count register. */
1054 
1055  /* Combine bits 24-31 and bits 0-7 of lba into sector. */
1056  sector = ((lba >> 16) & 0xff00) | (lba & 0xff);
1057  lcyl = ((lba >> 24) & 0xff00) | ((lba >> 8) & 0xff);
1058  hcyl = ((lba >> 32) & 0xff00) | ((lba >> 16) & 0xff);
1059 
1060  /* In v1.04, LBA was enabled here. */
1061  select = (device << 4) & 0xffff;
1062  command = (dir == 1) ? ATA_C_WRITE_DMA_EXT : ATA_C_READ_DMA_EXT;
1063  } else {
1064  /* Setup for 28-bit LBA. */
1065  chunk = (nsectors > 256) ? 256 : nsectors;
1066  len = (u16)chunk;
1067  sector = lba & 0xff;
1068  lcyl = (lba >> 8) & 0xff;
1069  hcyl = (lba >> 16) & 0xff;
1070 
1071  /* In v1.04, LBA was enabled here. */
1072  select = ((device << 4) | ((lba >> 24) & 0xf)) & 0xffff;
1073  command = (dir == 1) ? ATA_C_WRITE_DMA : ATA_C_READ_DMA;
1074  }
1075 
1076  for (retries = 3; retries > 0; retries--) {
1077 #ifdef ATA_USE_DEV9
1078 #ifdef ATA_GAMESTAR_WORKAROUND
1079  /* Due to the retry loop, put this call (for the GameStar workaround) here instead of the old location. */
1080  if (ata_gamestar_workaround)
1081  ata_set_dir(dir);
1082 #endif
1083 #endif
1084 
1085  if ((res = sceAtaExecCmd(buf, chunk, 0, len, sector, lcyl, hcyl, select, command)) != 0)
1086  break;
1087 
1088 #ifdef ATA_USE_DEV9
1089 #ifdef ATA_GAMESTAR_WORKAROUND
1090  if (!ata_gamestar_workaround)
1091  ata_set_dir(dir);
1092 #else
1093  /* Set up (part of) the transfer here. In v1.04, this was called at the top of the outer loop. */
1094  ata_set_dir(dir);
1095 #endif
1096 #endif
1097 
1098  res = sceAtaWaitResult();
1099 
1100  /* In v1.04, this was not done. Neither was there a mechanism to retry if a non-permanent error occurs. */
1101  SPD_REG16(SPD_R_IF_CTRL) &= ~SPD_IF_DMA_ENABLE;
1102 
1103  if (res != ATA_RES_ERR_ICRC)
1104  break;
1105  }
1106 
1107  buf = (void *)((u8 *)buf + chunk * 512);
1108  lba += chunk;
1109  nsectors -= chunk;
1110  }
1111 
1112  return res;
1113 }
1114 
1115 static void ata_get_security_status(int device, ata_devinfo_t *devinfo, u16 *param)
1116 {
1117  if (ata_device_identify(device, param) == 0)
1118  devinfo[device].security_status = param[ATA_ID_SECURITY_STATUS];
1119 }
1120 
1121 /* Export 10 */
1122 int sceAtaSecuritySetPassword(int device, void *password)
1123 {
1124  ata_devinfo_t *devinfo = atad_devinfo;
1125  u16 *param = ata_param;
1126  int res;
1127 
1128  if (devinfo[device].security_status & ATA_F_SEC_ENABLED)
1129  return 0;
1130 
1131  memset(param, 0, 512);
1132  memcpy(param + 1, password, 32);
1133 
1134  res = sceAtaExecCmd(param, 1, ATA_SCE_SECURITY_SET_PASSWORD, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL);
1135  if (res == 0)
1136  res = sceAtaWaitResult();
1137 
1138  ata_get_security_status(device, devinfo, param);
1139  return res;
1140 }
1141 
1142 /* Export 11 */
1143 int sceAtaSecurityUnLock(int device, void *password)
1144 {
1145  ata_devinfo_t *devinfo = atad_devinfo;
1146  u16 *param = ata_param;
1147  int res;
1148 
1149  if (!(devinfo[device].security_status & ATA_F_SEC_LOCKED))
1150  return 0;
1151 
1152  memset(param, 0, 512);
1153  memcpy(param + 1, password, 32);
1154 
1155  if ((res = sceAtaExecCmd(param, 1, ATA_SCE_SECURITY_UNLOCK, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)) != 0)
1156  return res;
1157  if ((res = sceAtaWaitResult()) != 0)
1158  return res;
1159 
1160  /* Check to see if the drive was actually unlocked. */
1161  ata_get_security_status(device, devinfo, param);
1162  if (devinfo[device].security_status & ATA_F_SEC_LOCKED)
1163  return ATA_RES_ERR_LOCKED;
1164 
1165  return 0;
1166 }
1167 
1168 /* Export 12 */
1169 int sceAtaSecurityEraseUnit(int device)
1170 {
1171  ata_devinfo_t *devinfo = atad_devinfo;
1172  int res;
1173 
1174  if (!(devinfo[device].security_status & ATA_F_SEC_ENABLED) || !(devinfo[device].security_status & ATA_F_SEC_LOCKED))
1175  return 0;
1176 
1177  /* First send the mandatory ERASE PREPARE command. */
1178  if ((res = sceAtaExecCmd(NULL, 1, ATA_SCE_SECURITY_ERASE_PREPARE, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)) != 0)
1179  goto finish;
1180  if ((res = sceAtaWaitResult()) != 0)
1181  goto finish;
1182 
1183  if ((res = sceAtaExecCmd(NULL, 1, ATA_SCE_SECURITY_ERASE_UNIT, 0, 0, 0, 0, (device << 4) & 0xffff, ATA_C_SCE_SECURITY_CONTROL)) == 0)
1184  res = sceAtaWaitResult();
1185 
1186 finish:
1187  ata_get_security_status(device, devinfo, NULL);
1188  return res;
1189 }
1190 
1191 static void ata_device_probe(ata_devinfo_t *devinfo)
1192 {
1193 #ifdef ATA_USE_DEV9
1194  USE_ATA_REGS;
1195 #endif
1196 #ifdef ATA_USE_AIFDEV9
1197  USE_AIF_ATA_REGS;
1198 #endif
1199  u16 nsector, sector, lcyl, hcyl;
1200 
1201  devinfo->exists = 0;
1202  devinfo->has_packet = 2;
1203 
1204  if (ata_hwport->r_control & 0x88)
1205  return;
1206 
1207  nsector = ata_hwport->r_nsector & 0xff;
1208  sector = ata_hwport->r_sector & 0xff;
1209  lcyl = ata_hwport->r_lcyl & 0xff;
1210  hcyl = ata_hwport->r_hcyl & 0xff;
1211  (void)ata_hwport->r_select;
1212 
1213  if ((nsector != 1) || (sector != 1))
1214  return;
1215  devinfo->exists = 1;
1216 
1217  if ((lcyl == 0x00) && (hcyl == 0x00))
1218  devinfo->has_packet = 0;
1219  else if ((lcyl == 0x14) && (hcyl == 0xeb))
1220  devinfo->has_packet = 1;
1221 
1222  /* Seems to be for ensuring that there is a device connected.
1223  Not sure why this has to be done, but is present in v2.4. */
1224  ata_hwport->r_lcyl = 0x55;
1225  ata_hwport->r_hcyl = 0xaa;
1226  lcyl = ata_hwport->r_lcyl & 0xff;
1227  hcyl = ata_hwport->r_hcyl & 0xff;
1228 
1229  if ((lcyl != 0x55) || (hcyl != 0xaa))
1230  devinfo->exists = 0;
1231 }
1232 
1233 static int ata_init_devices(ata_devinfo_t *devinfo)
1234 {
1235 #ifdef ATA_USE_DEV9
1236  USE_ATA_REGS;
1237 #endif
1238 #ifdef ATA_USE_AIFDEV9
1239  USE_AIF_ATA_REGS;
1240 #endif
1241  int i, res;
1242  u32 total_sectors_nonlba48, total_sectors_lba48;
1243 
1244  /* Probe devices */
1245  if (!ata_dvrp_workaround) {
1246  for (i = 0; i < 2; i++) {
1247  if ((res = sceAtaSoftReset()) != 0)
1248  return res;
1249 
1250  ata_device_select(i);
1251  if (ata_hwport->r_control & 0xff)
1252  ata_device_probe(&devinfo[i]);
1253  else
1254  devinfo[i].exists = 0;
1255  }
1256  } else {
1257  if ((res = sceAtaSoftReset()) != 0)
1258  return res;
1259 
1260  ata_device_probe(&devinfo[0]);
1261  }
1262 
1263  if (!devinfo[0].exists) {
1264  M_PRINTF("Error: Unable to detect HDD 0.\n");
1265  devinfo[1].exists = 0;
1266  return ATA_RES_ERR_NODEV; // Returns 0 in v1.04.
1267  }
1268 
1269  if (ata_dvrp_workaround) {
1270  /* If there is a device 1, grab it's info too. */
1271  if ((res = ata_device_select(1)) != 0)
1272  return res;
1273  if (ata_hwport->r_control & 0xff)
1274  ata_device_probe(&devinfo[1]);
1275  else
1276  devinfo[1].exists = 0;
1277  }
1278 
1279 #ifdef ATA_USE_DEV9
1280  ata_pio_mode(0); // PIO mode is set here, in late ATAD versions.
1281 #endif
1282 
1283  for (i = 0; i < 2; i++) {
1284  if (!devinfo[i].exists)
1285  continue;
1286 
1287  /* Send the IDENTIFY DEVICE command. if it doesn't succeed
1288  devinfo is disabled. */
1289  if (!devinfo[i].has_packet) {
1290  res = ata_device_identify(i, ata_param);
1291  devinfo[i].exists = (res == 0);
1292  } else if (devinfo[i].has_packet == 1) {
1293  /* If it's a packet device, send the IDENTIFY PACKET
1294  DEVICE command. */
1295  res = ata_device_pkt_identify(i, ata_param);
1296  devinfo[i].exists = (res == 0);
1297  }
1298  /* Otherwise, do nothing if has_packet = 2. */
1299 
1300  /* This next section is HDD-specific: if no device or it's a
1301  packet (ATAPI) device, we're done. */
1302  if (!devinfo[i].exists || devinfo[i].has_packet)
1303  continue;
1304 
1305  /* This section is to detect whether the HDD supports 48-bit LBA
1306  (IDENITFY DEVICE bit 10 word 83) and get the total sectors from
1307  either words(61:60) for 28-bit or words(103:100) for 48-bit. */
1308  devinfo[i].lba48 = (ata_param[ATA_ID_COMMAND_SETS_SUPPORTED] & 0x0400) != 0;
1309 
1310  /* Save the total sector counts before we overwrite ata_param with the value of Sony identify drive command. */
1311  total_sectors_nonlba48 = (ata_param[ATA_ID_SECTOTAL_HI] << 16) | ata_param[ATA_ID_SECTOTAL_LO];
1312  if (ata_param[ATA_ID_48BIT_SECTOTAL_HI]) {
1313  total_sectors_lba48 = 0xffffffff;
1314  } else {
1315  total_sectors_lba48 = (ata_param[ATA_ID_48BIT_SECTOTAL_MI] << 16) | ata_param[ATA_ID_48BIT_SECTOTAL_LO];
1316  }
1317 
1318  devinfo[i].security_status = ata_param[ATA_ID_SECURITY_STATUS];
1319 
1320 #ifdef ATA_USE_DEV9
1321  u8 maxUDMA = 4;
1322 #ifdef ATA_ENABLE_MAXUDMA
1323  maxUDMA = 6;
1324 #endif
1325 
1326  /* Ultra DMA mode 4. */
1327  u8 udmaMode = 4;
1328  /* Check the highest UDMA mode supported */
1329  for (int j = maxUDMA; j >= 0; j--) {
1330  /* Check if the current UDMA mode is supported, store it and exit from the loop. */
1331  if (((ata_param[ATA_ID_UDMA_CONTROL] & 0xFF) & (1 << j)) != 0) {
1332  udmaMode = j;
1333  break;
1334  }
1335  }
1336  ata_device_set_transfer_mode(i, ATA_XFER_MODE_UDMA, udmaMode);
1337 #endif
1338 #ifdef ATA_USE_AIFDEV9
1339  /* PIO mode 4. */
1340  ata_device_set_transfer_mode(i, ATA_XFER_MODE_PIO, 4);
1341 #endif
1342  ata_device_smart_enable(i);
1343  /* Set standby timer to 21min 15s. */
1344  sceAtaIdle(i, 0xff);
1345 
1346  if (devinfo[i].lba48) {
1347  /* If this device is emulated through the DVRP, use the non-48-bit LBA size. */
1348  if (ata_dvrp_workaround) {
1349  devinfo[i].total_sectors = total_sectors_nonlba48;
1350  /* Check for "PS2LBA48" magic in reserved words 121-124 */
1351  /* PS2 area size is still stored in the 28-bit LBA size */
1352  if (ata_param[121] == 0x4456 &&
1353  ata_param[122] == 0x524c &&
1354  ata_param[123] == 0x4241 &&
1355  ata_param[124] == 0x3438) {
1356  M_PRINTF("LBA48-capable DVRP firmware detected, disabling the workaround\n");
1357  ata_dvrp_workaround = 0;
1358  devinfo[i].total_sectors_lba48 = total_sectors_nonlba48;
1359  } else {
1360  devinfo[i].total_sectors_lba48 = total_sectors_lba48;
1361  }
1362  } else {
1363  devinfo[i].total_sectors = total_sectors_lba48;
1364  devinfo[i].total_sectors_lba48 = total_sectors_lba48;
1365  }
1366  } else {
1367  devinfo[i].total_sectors = total_sectors_nonlba48;
1368  devinfo[i].total_sectors_lba48 = total_sectors_nonlba48;
1369  }
1370 
1371  /* Call the proprietary identify command. */
1372 #ifdef ATA_SCE_AUTH_HDD
1373  if (sceAtaGetSceId(i, ata_param) != 0) {
1374  M_PRINTF("error: This is not SCE genuine HDD.\n");
1375  memset(&devinfo[i], 0, sizeof(devinfo[i]));
1376  }
1377 #endif
1378 
1379 #ifdef ATA_ENABLE_BDM
1380  g_ata_bd[i].sectorCount = devinfo[i].total_sectors_lba48;
1381  bdm_connect_bd(&g_ata_bd[i]);
1382 #endif
1383  }
1384  return 0;
1385 }
1386 
1387 /* Export 4 */
1388 ata_devinfo_t *sceAtaInit(int device)
1389 {
1390  if (!ata_devinfo_init) {
1391  ata_devinfo_init = 1;
1392  if (ata_bus_reset() || ata_init_devices(atad_devinfo))
1393  return NULL;
1394  }
1395 
1396  return &atad_devinfo[device];
1397 }
1398 
1399 #ifdef ATA_USE_DEV9
1400 static void ata_set_dir(int dir)
1401 {
1402  USE_SPD_REGS;
1403  u16 val;
1404 
1405  SPD_REG16(0x38) = 3;
1406  val = SPD_REG16(SPD_R_IF_CTRL) & 1;
1407  val |= (dir == ATA_DIR_WRITE) ? 0x4c : 0x4e;
1408  SPD_REG16(SPD_R_IF_CTRL) = val;
1409 #ifdef ATA_GAMESTAR_WORKAROUND
1410  SPD_REG16(SPD_R_XFR_CTRL) = dir | (ata_gamestar_workaround ? 0x86 : 0x6);
1411 #else
1412  SPD_REG16(SPD_R_XFR_CTRL) = dir | 0x6; // In v1.04, DMA was enabled here (0x86 instead of 0x6)
1413 #endif
1414 }
1415 
1416 static void ata_pio_mode(int mode)
1417 {
1418  USE_SPD_REGS;
1419  (void)mode;
1420 #ifdef ATA_ALL_PIO_MODES
1421  u16 val;
1422 
1423  switch (mode) {
1424  case 1:
1425  val = 0x72;
1426  break;
1427  case 2:
1428  val = 0x32;
1429  break;
1430  case 3:
1431  val = 0x24;
1432  break;
1433  case 4:
1434  val = 0x23;
1435  break;
1436  default:
1437  val = 0x92;
1438  }
1439 
1440  SPD_REG16(SPD_R_PIO_MODE) = val;
1441 #else
1442  /* In the late ATAD versions, PIO mode 0 is always used if PIO mode is utilized. */
1443  SPD_REG16(SPD_R_PIO_MODE) = 0x92;
1444 #endif
1445 }
1446 
1447 #ifdef ATA_MWDMA_MODES
1448 static void ata_multiword_dma_mode(int mode)
1449 {
1450  USE_SPD_REGS;
1451  u16 val;
1452 
1453  switch (mode) {
1454  case 1:
1455  val = 0x45;
1456  break;
1457  case 2:
1458  val = 0x24;
1459  break;
1460  default:
1461  val = 0xff;
1462  }
1463 
1464  SPD_REG16(SPD_R_MWDMA_MODE) = val;
1465  SPD_REG16(SPD_R_IF_CTRL) = (SPD_REG16(SPD_R_IF_CTRL) & 0xfffe) | 0x48;
1466 }
1467 #endif
1468 
1469 static void ata_ultra_dma_mode(int mode)
1470 {
1471  USE_SPD_REGS;
1472  u16 val;
1473 
1474  switch (mode) {
1475  case 1:
1476  val = 0x85;
1477  break;
1478  case 2:
1479  val = 0x63;
1480  break;
1481  case 3:
1482  val = 0x62;
1483  break;
1484  case 4:
1485  val = 0x61;
1486  break;
1487  default:
1488  val = 0xa7;
1489  }
1490 
1491  SPD_REG16(SPD_R_UDMA_MODE) = val;
1492  SPD_REG16(SPD_R_IF_CTRL) |= 0x49;
1493 }
1494 #endif
1495 
1496 #ifdef ATA_USE_AIFDEV9
1497 static void aif_tune_drive(int unit, int mode)
1498 {
1499  USE_AIF_REGS;
1500  unsigned int use_iordy, value;
1501 
1502  use_iordy = 1;
1503  value = (use_iordy << 3) | mode;
1504  M_PRINTF("AIF HDD: tune unit%d, mode=%u\n", unit, value);
1505 
1506  switch (unit) {
1507  case 0:
1508  aif_regs[AIF_ATA_TCFG] = (aif_regs[AIF_ATA_TCFG] & 0xf0) + value;
1509  break;
1510  case 1:
1511  aif_regs[AIF_ATA_TCFG] = (aif_regs[AIF_ATA_TCFG] & 0x0f) + (value << 4);
1512  break;
1513  }
1514 }
1515 #endif
1516 
1517 /* Export 18 */
1518 int sceAtaIdleImmediate(int device)
1519 {
1520  int res;
1521 
1522  if (!(res = sceAtaExecCmd(NULL, 1, 0, 0, 0, 0, 0, (device << 4) & 0xFFFF, ATA_C_IDLE_IMMEDIATE)))
1523  res = sceAtaWaitResult();
1524 
1525  return res;
1526 }
1527 
1528 static int ata_device_standby_immediate(int device)
1529 {
1530  int res;
1531 
1532  if (!(res = sceAtaExecCmd(NULL, 1, 0, 0, 0, 0, 0, (device << 4) & 0xFFFF, ATA_C_STANDBY_IMMEDIATE)))
1533  res = sceAtaWaitResult();
1534 
1535  return res;
1536 }
1537 
1538 static void ata_shutdown_cb(void)
1539 {
1540  int i;
1541 
1542  for (i = 0; i < 2; i++) {
1543  if (atad_devinfo[i].exists)
1544  ata_device_standby_immediate(i);
1545  }
1546 }
1547 
1548 #ifdef ATA_ENABLE_BDM
1549 //
1550 // Block device interface
1551 //
1552 static int ata_bd_read(struct block_device *bd, u64 sector, void *buffer, u16 count)
1553 {
1554  if (ata_device_sector_io64(bd->devNr, buffer, sector, count, ATA_DIR_READ) != 0) {
1555  return -EIO;
1556  }
1557 
1558  return count;
1559 }
1560 
1561 static int ata_bd_write(struct block_device *bd, u64 sector, const void *buffer, u16 count)
1562 {
1563  if (ata_device_sector_io64(bd->devNr, (void *)buffer, sector, count, ATA_DIR_WRITE) != 0) {
1564  return -EIO;
1565  }
1566 
1567  return count;
1568 }
1569 
1570 static void ata_bd_flush(struct block_device *bd)
1571 {
1572  sceAtaFlushCache(bd->devNr);
1573 }
1574 
1575 static int ata_bd_stop(struct block_device *bd)
1576 {
1577  ata_device_standby_immediate(bd->devNr);
1578 
1579  return 0;
1580 }
1581 #endif
bdm.h
speedregs.h
thbase.h
_ata_devinfo::has_packet
s32 has_packet
Definition: xatapi.c:43
_ata_devinfo
Definition: xatapi.c:40
sysclib.h
s_info
Definition: xprintf.c:78
atad.h
_ata_cmd_state
Definition: xatapi.c:22
event
Definition: thcommon.h:71
EIO
#define EIO
Definition: errno.h:29
loadcore.h
count
u32 count
start sector of fragmented bd/file
Definition: usbhdfsd-common.h:3
_ata_devinfo::security_status
u32 security_status
Definition: xatapi.c:45
_ata_devinfo::exists
s32 exists
Definition: xatapi.c:42
_ata_cmd_info
Definition: ps2atad.c:87
irx.h
irx_export_table
Definition: irx.h:90
stdio.h
_ata_devinfo::total_sectors
u32 total_sectors
Definition: xatapi.c:44
atahw.h
dev9.h
_ata_devinfo::total_sectors_lba48
u32 total_sectors_lba48
Definition: atad.h:39
defs.h
_ata_devinfo::lba48
u32 lba48
Definition: xatapi.c:46
iop_event_t
Definition: thevent.h:37
block_device
Definition: bdm.h:21
EA_SINGLE
#define EA_SINGLE
Definition: thevent.h:33
thevent.h
_iop_sys_clock
Definition: thbase.h:87
errno.h