Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions common/include/atahw.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,22 @@ enum ATA_C_CODES {
ATA_C_RESTORE_ELEMENTS_AND_REBUILD = 0x7D,
ATA_C_SEEK_7EH = 0x7E,
ATA_C_SEEK_7FH = 0x7F,
ATA_C_VENDOR_SPECIFIC_80H = 0x80,
ATA_C_VENDOR_SPECIFIC_81H = 0x81,
ATA_C_VENDOR_SPECIFIC_82H = 0x82,
ATA_C_VENDOR_SPECIFIC_83H = 0x83,
ATA_C_VENDOR_SPECIFIC_84H = 0x84,
ATA_C_VENDOR_SPECIFIC_85H = 0x85,
ATA_C_VENDOR_SPECIFIC_86H = 0x86,
ATA_C_CFA_TRANSLATE_SECTOR = 0x87,
ATA_C_VENDOR_SPECIFIC_88H = 0x88,
ATA_C_VENDOR_SPECIFIC_89H = 0x89,
ATA_C_VENDOR_SPECIFIC_8AH = 0x8A,
ATA_C_VENDOR_SPECIFIC_8BH = 0x8B,
ATA_C_VENDOR_SPECIFIC_8CH = 0x8C,
ATA_C_VENDOR_SPECIFIC_8DH = 0x8D,
ATA_C_SCE_SECURITY_CONTROL = 0x8e,
ATA_C_VENDOR_SPECIFIC_8FH = 0x8F,
ATA_C_EXECUTE_DEVICE_DIAGNOSTIC = 0x90,
ATA_C_INITIALIZE_DEVICE_PARAMETERS = 0x91,
ATA_C_DOWNLOAD_MICROCODE = 0x92,
Expand All @@ -181,6 +195,7 @@ enum ATA_C_CODES {
ATA_C_IDLE_97H = 0x97,
ATA_C_CHECK_POWER_MODE_98H = 0x98,
ATA_C_SLEEP_99H = 0x99,
ATA_C_VENDOR_SPECIFIC_9AH = 0x9A,
ATA_C_ZAC_MANAGEMENT_OUT = 0x9F,
ATA_C_PACKET = 0xa0,
ATA_C_IDENTIFY_PACKET_DEVICE,
Expand All @@ -192,6 +207,9 @@ enum ATA_C_CODES {
ATA_C_NV_CACHE = 0xb6,
ATA_C_CFA_KEY_MANAGEMENT = 0xb9,
ATA_C_CFA_ERASE_SECTORS = 0xc0,
ATA_C_VENDOR_SPECIFIC_C1H = 0xC1,
ATA_C_VENDOR_SPECIFIC_C2H = 0xC2,
ATA_C_VENDOR_SPECIFIC_C3H = 0xC3,
ATA_C_READ_MULTIPLE = 0xc4,
ATA_C_WRITE_MULTIPLE,
ATA_C_SET_MULTIPLE_MODE,
Expand Down Expand Up @@ -228,15 +246,23 @@ enum ATA_C_CODES {

ATA_C_SET_FEATURES = 0xef,

ATA_C_VENDOR_SPECIFIC_F0H = 0xF0,
ATA_C_SECURITY_SET_PASSWORD = 0xf1,
ATA_C_SECURITY_UNLOCK,
ATA_C_SECURITY_ERASE_PREPARE,
ATA_C_SECURITY_ERASE_UNIT,
ATA_C_SECURITY_FREEZE_LOCK,
ATA_C_SECURITY_DISABLE_PASSWORD,

ATA_C_VENDOR_SPECIFIC_F7H = 0xF7,
ATA_C_READ_NATIVE_MAX_ADDRESS = 0xf8,
ATA_C_SET_MAX_ADDRESS,
ATA_C_VENDOR_SPECIFIC_FAH = 0xFA,
ATA_C_VENDOR_SPECIFIC_FBH = 0xFB,
ATA_C_VENDOR_SPECIFIC_FCH = 0xFC,
ATA_C_VENDOR_SPECIFIC_FDH = 0xFD,
ATA_C_VENDOR_SPECIFIC_FEH = 0xFE,
ATA_C_VENDOR_SPECIFIC_FFH = 0xFF,
};

enum ATA_SCE_SECURITY_CODES {
Expand Down
3 changes: 3 additions & 0 deletions iop/dev9/atad/include/atad.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ extern int sceAtaSmartSaveAttr(int device);
extern int sceAtaFlushCache(int device);
extern int sceAtaIdleImmediate(int device);

/* Unofficial APIs follow. */
extern int ata_device_sector_io64(int device, void *buf, u64 lba, u32 nsectors, int dir);
extern int ata_set_command_type(int command, int type);

#define atad_IMPORTS_start DECLARE_IMPORT_TABLE(atad, 1, 3)
#define atad_IMPORTS_end END_IMPORT_TABLE
Expand All @@ -93,6 +95,7 @@ extern int ata_device_sector_io64(int device, void *buf, u64 lba, u32 nsectors,
#define I_sceAtaFlushCache DECLARE_IMPORT(17, sceAtaFlushCache)
#define I_sceAtaIdleImmediate DECLARE_IMPORT(18, sceAtaIdleImmediate)
#define I_ata_device_sector_io64 DECLARE_IMPORT(19, ata_device_sector_io64)
#define I_ata_set_command_type DECLARE_IMPORT(20, ata_set_command_type)

// Backward-compatibility definitions
#define ata_get_devinfo sceAtaInit
Expand Down
1 change: 1 addition & 0 deletions iop/dev9/atad/src/exports.tab
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ DECLARE_EXPORT_TABLE(atad, 1, 3)
DECLARE_EXPORT(sceAtaFlushCache)
DECLARE_EXPORT(sceAtaIdleImmediate)
DECLARE_EXPORT(ata_device_sector_io64)
DECLARE_EXPORT(ata_set_command_type)
END_EXPORT_TABLE

void _retonly() {}
16 changes: 16 additions & 0 deletions iop/dev9/atad/src/ps2atad.c
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,18 @@ static int ata_device_select(int device)
return ata_wait_bus_busy();
}

static int g_atad_search_command = 0;
static int g_atad_search_type = 0;

/* Export 20 */
int ata_set_command_type(int command, int type)
{
g_atad_search_command = command;
g_atad_search_type = type;

return 0;
}

/* Export 6 */
/*
28-bit LBA:
Expand Down Expand Up @@ -563,6 +575,10 @@ int sceAtaExecCmd(void *buf, u32 blkcount, u16 feature, u16 nsector, u16 sector,
}
}

// Unofficial: allow overriding the command type if not handled in table
if (!type && searchcmd == g_atad_search_command)
type = g_atad_search_type;

if (!(atad_cmd_state.type = type & 0x7F)) // Non-SONY: ignore the 48-bit LBA flag.
return ATA_RES_ERR_CMD;

Expand Down
Loading