diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2007-11-04 22:05:49 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2008-01-23 05:24:09 -0500 |
commit | ae8d4ee7ff429136c8b482c3b38ed994c021d3fc (patch) | |
tree | bf45047ab8a4f5325c6b752be02313d3112eded0 /include/linux | |
parent | ffe188dd83e84119516688c822388c8f30a54877 (diff) |
libata: Disable ATA8-ACS proposed Trusted Computing features by default
Historically word 48 in the identify data was used to mean 32bit I/O
was supported for VLB IDE etc. ATA8 reassigns this word to the Trusted
Computing Group, where it is used for TCG features. This means that
an ATA8 TCG drive is going to trigger 32bit I/O on some systems which
will be funny.
Anyway we need to sort this out ready for ATA8 so:
- Reorder the ata.h header a bit so the ata_version function occurs early
in it
- Make dword_io check the ATA version
- Add an ATA8 version checking TCG presence test
While we are at it the current drafts have a flaw where it may not be
possible to disable TCG features at boot (and opt out of the trusted
model) as TCG intends because it relies on presence of a different
optional feature (DCS). Handle this in software by refusing the TCG
commands if libata.allow_tpm is not set. (We must make it possible
as some environments such as proprietary VDR devices will doubtless
want to use it to lock up content)
Finally as with CPRM print a warning so that the user knows they may
not be able to full access and use the device.
Signed-off-by: Alan Cox <alan@redhat.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/ata.h | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index e672e80202a..3fbe6d7784a 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -379,7 +379,6 @@ struct ata_taskfile { | |||
379 | #define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) | 379 | #define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) |
380 | #define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1) | 380 | #define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1) |
381 | #define ata_id_removeable(id) ((id)[0] & (1 << 7)) | 381 | #define ata_id_removeable(id) ((id)[0] & (1 << 7)) |
382 | #define ata_id_has_dword_io(id) ((id)[48] & (1 << 0)) | ||
383 | #define ata_id_has_atapi_AN(id) \ | 382 | #define ata_id_has_atapi_AN(id) \ |
384 | ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ | 383 | ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ |
385 | ((id)[78] & (1 << 5)) ) | 384 | ((id)[78] & (1 << 5)) ) |
@@ -415,6 +414,7 @@ static inline bool ata_id_has_dipm(const u16 *id) | |||
415 | return val & (1 << 3); | 414 | return val & (1 << 3); |
416 | } | 415 | } |
417 | 416 | ||
417 | |||
418 | static inline int ata_id_has_fua(const u16 *id) | 418 | static inline int ata_id_has_fua(const u16 *id) |
419 | { | 419 | { |
420 | if ((id[84] & 0xC000) != 0x4000) | 420 | if ((id[84] & 0xC000) != 0x4000) |
@@ -519,6 +519,26 @@ static inline int ata_id_is_sata(const u16 *id) | |||
519 | return ata_id_major_version(id) >= 5 && id[93] == 0; | 519 | return ata_id_major_version(id) >= 5 && id[93] == 0; |
520 | } | 520 | } |
521 | 521 | ||
522 | static inline int ata_id_has_tpm(const u16 *id) | ||
523 | { | ||
524 | /* The TPM bits are only valid on ATA8 */ | ||
525 | if (ata_id_major_version(id) < 8) | ||
526 | return 0; | ||
527 | if ((id[48] & 0xC000) != 0x4000) | ||
528 | return 0; | ||
529 | return id[48] & (1 << 0); | ||
530 | } | ||
531 | |||
532 | static inline int ata_id_has_dword_io(const u16 *id) | ||
533 | { | ||
534 | /* ATA 8 reuses this flag for "trusted" computing */ | ||
535 | if (ata_id_major_version(id) > 7) | ||
536 | return 0; | ||
537 | if (id[48] & (1 << 0)) | ||
538 | return 1; | ||
539 | return 0; | ||
540 | } | ||
541 | |||
522 | static inline int ata_id_current_chs_valid(const u16 *id) | 542 | static inline int ata_id_current_chs_valid(const u16 *id) |
523 | { | 543 | { |
524 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 544 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command |