summaryrefslogtreecommitdiff
path: root/firmware/export/ata.h
diff options
context:
space:
mode:
authorCástor Muñoz <cmvidal@gmail.com>2014-12-09 19:38:47 +0100
committerCástor Muñoz <cmvidal@gmail.com>2015-10-07 06:15:04 +0200
commitd20185ac96c4b50ed4de7098a101a31f2b140b82 (patch)
tree087c7d3f0160864a47bd02dbeb46371c8de01cf8 /firmware/export/ata.h
parent32b455851103dea48444243352efdfd693cd3b6b (diff)
iPod Classic: reads HDD S.M.A.R.T. data
Adds ata_read_smart() function to storage ATA driver, current SMART data can be displayed and optionally written to hard disk using System->Debug menu. Change-Id: Ie8817bb311d5d956df2f0fbfaf554e2d53e89a93
Diffstat (limited to 'firmware/export/ata.h')
-rw-r--r--firmware/export/ata.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/firmware/export/ata.h b/firmware/export/ata.h
index 0bcb144e63..6f0d0b699f 100644
--- a/firmware/export/ata.h
+++ b/firmware/export/ata.h
@@ -25,6 +25,107 @@
#include "config.h" /* for HAVE_MULTIVOLUME or not */
#include "mv.h" /* for IF_MV() and friends */
+#ifdef HAVE_ATA_SMART
+/* S.M.A.R.T. headers from smartmontools-5.42 */
+#define NUMBER_ATA_SMART_ATTRIBUTES 30
+
+struct ata_smart_attribute {
+ unsigned char id;
+ /* meaning of flag bits: see MACROS just below */
+ /* WARNING: MISALIGNED! */
+ unsigned short flags;
+ unsigned char current;
+ unsigned char worst;
+ unsigned char raw[6];
+ unsigned char reserv;
+} __attribute__((packed));
+
+/* MACROS to interpret the flags bits in the previous structure. */
+/* These have not been implemented using bitflags and a union, to make */
+/* it portable across bit/little endian and different platforms. */
+
+/* 0: Prefailure bit */
+
+/* From SFF 8035i Revision 2 page 19: Bit 0 (pre-failure/advisory bit) */
+/* - If the value of this bit equals zero, an attribute value less */
+/* than or equal to its corresponding attribute threshold indicates an */
+/* advisory condition where the usage or age of the device has */
+/* exceeded its intended design life period. If the value of this bit */
+/* equals one, an attribute value less than or equal to its */
+/* corresponding attribute threshold indicates a prefailure condition */
+/* where imminent loss of data is being predicted. */
+#define ATTRIBUTE_FLAGS_PREFAILURE(x) (x & 0x01)
+
+/* 1: Online bit */
+
+/* From SFF 8035i Revision 2 page 19: Bit 1 (on-line data collection */
+/* bit) - If the value of this bit equals zero, then the attribute */
+/* value is updated only during off-line data collection */
+/* activities. If the value of this bit equals one, then the attribute */
+/* value is updated during normal operation of the device or during */
+/* both normal operation and off-line testing. */
+#define ATTRIBUTE_FLAGS_ONLINE(x) (x & 0x02)
+
+/* The following are (probably) IBM's, Maxtors and Quantum's definitions for the */
+/* vendor-specific bits: */
+/* 2: Performance type bit */
+#define ATTRIBUTE_FLAGS_PERFORMANCE(x) (x & 0x04)
+
+/* 3: Errorrate type bit */
+#define ATTRIBUTE_FLAGS_ERRORRATE(x) (x & 0x08)
+
+/* 4: Eventcount bit */
+#define ATTRIBUTE_FLAGS_EVENTCOUNT(x) (x & 0x10)
+
+/* 5: Selfpereserving bit */
+#define ATTRIBUTE_FLAGS_SELFPRESERVING(x) (x & 0x20)
+
+/* 6-15: Reserved for future use */
+#define ATTRIBUTE_FLAGS_OTHER(x) ((x) & 0xffc0)
+
+struct ata_smart_values
+{
+ unsigned short int revnumber;
+ struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES];
+ unsigned char offline_data_collection_status;
+ unsigned char self_test_exec_status;
+ unsigned short int total_time_to_complete_off_line;
+ unsigned char vendor_specific_366;
+ unsigned char offline_data_collection_capability;
+ unsigned short int smart_capability;
+ unsigned char errorlog_capability;
+ unsigned char vendor_specific_371;
+ unsigned char short_test_completion_time;
+ unsigned char extend_test_completion_time;
+ unsigned char conveyance_test_completion_time;
+ unsigned char reserved_375_385[11];
+ unsigned char vendor_specific_386_510[125];
+ unsigned char chksum;
+} __attribute__((packed));
+
+/* Raw attribute value print formats */
+enum ata_attr_raw_format
+{
+ RAWFMT_DEFAULT,
+ RAWFMT_RAW8,
+ RAWFMT_RAW16,
+ RAWFMT_RAW48,
+ RAWFMT_HEX48,
+ RAWFMT_RAW64,
+ RAWFMT_HEX64,
+ RAWFMT_RAW16_OPT_RAW16,
+ RAWFMT_RAW16_OPT_AVG16,
+ RAWFMT_RAW24_DIV_RAW24,
+ RAWFMT_RAW24_DIV_RAW32,
+ RAWFMT_SEC2HOUR,
+ RAWFMT_MIN2HOUR,
+ RAWFMT_HALFMIN2HOUR,
+ RAWFMT_MSEC24_HOUR32,
+ RAWFMT_TEMPMINMAX,
+ RAWFMT_TEMP10X,
+};
+#endif /* HAVE_ATA_SMART */
+
struct storage_info;
void ata_enable(bool on);
@@ -69,4 +170,9 @@ int ata_spinup_time(void); /* ticks */
int ata_get_dma_mode(void);
#endif /* HAVE_ATA_DMA */
+#ifdef HAVE_ATA_SMART
+/* Returns current S.M.A.R.T. data */
+void* ata_read_smart(void);
+#endif
+
#endif /* __ATA_H__ */