From be9c1b75e49848c487f6a7d3b758a7a9f3a0efc2 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 23 Jan 2010 22:39:53 +0100 Subject: [PATCH] Decoding of the SATA HBA capability --- lib/header.h | 8 ++++++++ ls-caps.c | 25 ++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/header.h b/lib/header.h index 92d7d1e..63e975b 100644 --- a/lib/header.h +++ b/lib/header.h @@ -224,6 +224,8 @@ #define PCI_EXT_CAP_ID_ATS 0x0f /* Address Translation Service */ #define PCI_EXT_CAP_ID_SRIOV 0x10 /* Single Root I/O Virtualization */ +/*** Definitions of capabilities ***/ + /* Power Management Registers */ #define PCI_PM_CAP_VER_MASK 0x0007 /* Version (2=PM1.1) */ @@ -884,6 +886,12 @@ #define PCI_AF_STATUS 5 #define PCI_AF_STATUS_TP 0x01 +/* SATA Host Bus Adapter */ +#define PCI_SATA_HBA_BARS 4 +#define PCI_SATA_HBA_REG0 8 + +/*** Definitions of extended capabilities ***/ + /* Advanced Error Reporting */ #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ #define PCI_ERR_UNC_TRAIN 0x00000001 /* Undefined in PCIe rev1.1 & 2.0 spec */ diff --git a/ls-caps.c b/ls-caps.c index 5ca2cd4..cc47873 100644 --- a/ls-caps.c +++ b/ls-caps.c @@ -1164,6 +1164,29 @@ cap_af(struct device *d, int where) printf("\t\tAFStatus: TP%c\n", FLAG(reg, PCI_AF_STATUS_TP)); } +static void +cap_sata_hba(struct device *d, int where, int cap) +{ + u32 bars; + int bar; + + printf("SATA HBA v%d.%d", BITS(cap, 4, 4), BITS(cap, 0, 4)); + if (verbose < 2 || !config_fetch(d, where + PCI_SATA_HBA_BARS, 4)) + { + printf("\n"); + return; + } + + bars = get_conf_long(d, where + PCI_SATA_HBA_BARS); + bar = BITS(bars, 0, 4); + if (bar >= 4 && bar <= 9) + printf(" BAR%d Offset=%08x\n", bar - 4, BITS(bars, 4, 20)); + else if (bar == 15) + printf(" InCfgSpace\n"); + else + printf(" BAR??%d\n", bar); +} + void show_caps(struct device *d) { @@ -1253,7 +1276,7 @@ show_caps(struct device *d) cap_msix(d, where, cap); break; case PCI_CAP_ID_SATA: - printf("SATA HBA \n"); + cap_sata_hba(d, where, cap); break; case PCI_CAP_ID_AF: cap_af(d, where); -- 2.39.2