diff --git a/common/include/atahw.h b/common/include/atahw.h index 9b2dc5fc02ff..45748d5eabef 100644 --- a/common/include/atahw.h +++ b/common/include/atahw.h @@ -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, @@ -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, @@ -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, @@ -228,6 +246,7 @@ 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, @@ -235,8 +254,15 @@ enum ATA_C_CODES { 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 { diff --git a/iop/dev9/atad/include/atad.h b/iop/dev9/atad/include/atad.h index e5a3d998d840..cdd503a9febc 100644 --- a/iop/dev9/atad/include/atad.h +++ b/iop/dev9/atad/include/atad.h @@ -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 @@ -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 diff --git a/iop/dev9/atad/src/exports.tab b/iop/dev9/atad/src/exports.tab index 8a9a5611c690..4464979f8cf9 100644 --- a/iop/dev9/atad/src/exports.tab +++ b/iop/dev9/atad/src/exports.tab @@ -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() {} diff --git a/iop/dev9/atad/src/ps2atad.c b/iop/dev9/atad/src/ps2atad.c index 757aa93b6487..fc841cf09576 100644 --- a/iop/dev9/atad/src/ps2atad.c +++ b/iop/dev9/atad/src/ps2atad.c @@ -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: @@ -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;