svn commit: r308868 - in projects/clang390-import: bin/dd sbin/nvmecontrol sys/boot/i386/libi386 sys/conf sys/dev/nvme sys/mips/atheros/ar531x sys/mips/broadcom sys/mips/conf sys/mips/include sys/m...
Dimitry Andric
dim at FreeBSD.org
Sat Nov 19 21:10:49 UTC 2016
Author: dim
Date: Sat Nov 19 21:10:46 2016
New Revision: 308868
URL: https://svnweb.freebsd.org/changeset/base/308868
Log:
Merge ^/head r308842 through r308867.
Added:
projects/clang390-import/sys/mips/conf/CANNA
- copied unchanged from r308867, head/sys/mips/conf/CANNA
projects/clang390-import/sys/mips/conf/CI20
- copied unchanged from r308867, head/sys/mips/conf/CI20
projects/clang390-import/sys/mips/conf/JZ4780
- copied unchanged from r308867, head/sys/mips/conf/JZ4780
projects/clang390-import/sys/mips/conf/JZ4780.hints
- copied unchanged from r308867, head/sys/mips/conf/JZ4780.hints
projects/clang390-import/sys/mips/conf/X1000
- copied unchanged from r308867, head/sys/mips/conf/X1000
projects/clang390-import/sys/mips/conf/X1000.hints
- copied unchanged from r308867, head/sys/mips/conf/X1000.hints
projects/clang390-import/sys/mips/ingenic/
- copied from r308867, head/sys/mips/ingenic/
Modified:
projects/clang390-import/bin/dd/dd.c
projects/clang390-import/sbin/nvmecontrol/logpage.c
projects/clang390-import/sys/boot/i386/libi386/smbios.c
projects/clang390-import/sys/conf/files.mips
projects/clang390-import/sys/conf/options.mips
projects/clang390-import/sys/dev/nvme/nvme.h
projects/clang390-import/sys/mips/atheros/ar531x/files.ar5315
projects/clang390-import/sys/mips/broadcom/files.broadcom
projects/clang390-import/sys/mips/include/cache.h
projects/clang390-import/sys/mips/mediatek/files.mediatek
projects/clang390-import/sys/mips/mips/busdma_machdep.c
projects/clang390-import/sys/mips/mips/cache_mipsNN.c
projects/clang390-import/sys/mips/mips/exception.S
Directory Properties:
projects/clang390-import/ (props changed)
Modified: projects/clang390-import/bin/dd/dd.c
==============================================================================
--- projects/clang390-import/bin/dd/dd.c Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/bin/dd/dd.c Sat Nov 19 21:10:46 2016 (r308868)
@@ -48,13 +48,10 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/conf.h>
-#include <sys/capsicum.h>
#include <sys/disklabel.h>
#include <sys/filio.h>
-#include <sys/mtio.h>
#include <assert.h>
-#include <capsicum_helpers.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
@@ -95,10 +92,6 @@ main(int argc __unused, char *argv[])
jcl(argv);
setup();
- caph_cache_catpages();
- if (cap_enter() == -1 && errno != ENOSYS)
- err(1, "unable to enter capability mode");
-
(void)signal(SIGINFO, siginfo_handler);
(void)signal(SIGINT, terminate);
@@ -132,8 +125,6 @@ static void
setup(void)
{
u_int cnt;
- cap_rights_t rights;
- unsigned long cmds[] = { FIODTYPE, MTIOCTOP };
if (in.name == NULL) {
in.name = "stdin";
@@ -142,20 +133,13 @@ setup(void)
in.fd = open(in.name, O_RDONLY, 0);
if (in.fd == -1)
err(1, "%s", in.name);
- if (caph_limit_stdin() == -1)
- err(1, "unable to limit capability rights");
}
getfdtype(&in);
- cap_rights_init(&rights, CAP_READ, CAP_SEEK);
- if (cap_rights_limit(in.fd, &rights) == -1 && errno != ENOSYS)
- err(1, "unable to limit capability rights");
-
if (files_cnt > 1 && !(in.flags & ISTAPE))
errx(1, "files is not supported for non-tape devices");
- cap_rights_set(&rights, CAP_WRITE, CAP_FTRUNCATE, CAP_IOCTL);
if (out.name == NULL) {
/* No way to check for read access here. */
out.fd = STDOUT_FILENO;
@@ -172,27 +156,13 @@ setup(void)
if (out.fd == -1) {
out.fd = open(out.name, O_WRONLY | OFLAGS, DEFFILEMODE);
out.flags |= NOREAD;
- cap_rights_clear(&rights, CAP_READ);
}
if (out.fd == -1)
err(1, "%s", out.name);
- if (caph_limit_stdout() == -1)
- err(1, "unable to limit capability rights");
}
getfdtype(&out);
- if (cap_rights_limit(out.fd, &rights) == -1 && errno != ENOSYS)
- err(1, "unable to limit capability rights");
- if (cap_ioctls_limit(out.fd, cmds, nitems(cmds)) == -1 &&
- errno != ENOSYS)
- err(1, "unable to limit capability rights");
-
- if (in.fd != STDERR_FILENO && out.fd != STDERR_FILENO) {
- if (caph_limit_stderr() == -1)
- err(1, "unable to limit capability rights");
- }
-
/*
* Allocate space for the input and output buffers. If not doing
* record oriented I/O, only need a single buffer.
Modified: projects/clang390-import/sbin/nvmecontrol/logpage.c
==============================================================================
--- projects/clang390-import/sbin/nvmecontrol/logpage.c Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sbin/nvmecontrol/logpage.c Sat Nov 19 21:10:46 2016 (r308868)
@@ -42,6 +42,11 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <sys/endian.h>
+
+#if _BYTE_ORDER != _LITTLE_ENDIAN
+#error "Code only works on little endian machines"
+#endif
#include "nvmecontrol.h"
@@ -50,6 +55,65 @@ __FBSDID("$FreeBSD$");
typedef void (*print_fn_t)(void *buf, uint32_t size);
+struct kv_name
+{
+ uint32_t key;
+ const char *name;
+};
+
+static const char *
+kv_lookup(const struct kv_name *kv, size_t kv_count, uint32_t key)
+{
+ static char bad[32];
+ size_t i;
+
+ for (i = 0; i < kv_count; i++, kv++)
+ if (kv->key == key)
+ return kv->name;
+ snprintf(bad, sizeof(bad), "Attribute %#x", key);
+ return bad;
+}
+
+/*
+ * 128-bit integer augments to standard values
+ */
+#define UINT128_DIG 39
+typedef __uint128_t uint128_t;
+
+static inline uint128_t
+to128(void *p)
+{
+ return *(uint128_t *)p;
+}
+
+static char *
+uint128_to_str(uint128_t u, char *buf, size_t buflen)
+{
+ char *end = buf + buflen - 1;
+
+ *end-- = '\0';
+ if (u == 0)
+ *end-- = '0';
+ while (u && end >= buf) {
+ *end-- = u % 10 + '0';
+ u /= 10;
+ }
+ end++;
+ if (u != 0)
+ return NULL;
+
+ return end;
+}
+
+/* "fMissing" from endian.h */
+static __inline uint64_t
+le48dec(const void *pp)
+{
+ uint8_t const *p = (uint8_t const *)pp;
+
+ return (((uint64_t)le16dec(p + 4) << 32) | le32dec(p));
+}
+
static void *
get_log_buffer(uint32_t size)
{
@@ -63,7 +127,7 @@ get_log_buffer(uint32_t size)
}
void
-read_logpage(int fd, uint8_t log_page, int nsid, void *payload,
+read_logpage(int fd, uint8_t log_page, int nsid, void *payload,
uint32_t payload_size)
{
struct nvme_pt_command pt;
@@ -125,9 +189,18 @@ print_log_error(void *buf, uint32_t size
}
static void
+print_temp(uint16_t t)
+{
+ printf("%u K, %2.2f C, %3.2f F\n", t, (float)t - 273.15, (float)t * 9 / 5 - 459.67);
+}
+
+
+static void
print_log_health(void *buf, uint32_t size __unused)
{
struct nvme_health_information_page *health = buf;
+ char cbuf[UINT128_DIG + 1];
+ int i;
printf("SMART/Health Information Log\n");
printf("============================\n");
@@ -144,10 +217,8 @@ print_log_health(void *buf, uint32_t siz
health->critical_warning.bits.read_only);
printf(" Volatile memory backup: %d\n",
health->critical_warning.bits.volatile_memory_backup);
- printf("Temperature: %u K, %2.2f C, %3.2f F\n",
- health->temperature,
- (float)health->temperature - (float)273.15,
- ((float)health->temperature * (float)9/5) - (float)459.67);
+ printf("Temperature: ");
+ print_temp(health->temperature);
printf("Available spare: %u\n",
health->available_spare);
printf("Available spare threshold: %u\n",
@@ -155,40 +226,35 @@ print_log_health(void *buf, uint32_t siz
printf("Percentage used: %u\n",
health->percentage_used);
- /*
- * TODO: These are pretty ugly in hex. Is there a library that
- * will convert 128-bit unsigned values to decimal?
- */
- printf("Data units (512 byte) read: 0x%016jx%016jx\n",
- health->data_units_read[1],
- health->data_units_read[0]);
- printf("Data units (512 byte) written: 0x%016jx%016jx\n",
- health->data_units_written[1],
- health->data_units_written[0]);
- printf("Host read commands: 0x%016jx%016jx\n",
- health->host_read_commands[1],
- health->host_read_commands[0]);
- printf("Host write commands: 0x%016jx%016jx\n",
- health->host_write_commands[1],
- health->host_write_commands[0]);
- printf("Controller busy time (minutes): 0x%016jx%016jx\n",
- health->controller_busy_time[1],
- health->controller_busy_time[0]);
- printf("Power cycles: 0x%016jx%016jx\n",
- health->power_cycles[1],
- health->power_cycles[0]);
- printf("Power on hours: 0x%016jx%016jx\n",
- health->power_on_hours[1],
- health->power_on_hours[0]);
- printf("Unsafe shutdowns: 0x%016jx%016jx\n",
- health->unsafe_shutdowns[1],
- health->unsafe_shutdowns[0]);
- printf("Media errors: 0x%016jx%016jx\n",
- health->media_errors[1],
- health->media_errors[0]);
- printf("No. error info log entries: 0x%016jx%016jx\n",
- health->num_error_info_log_entries[1],
- health->num_error_info_log_entries[0]);
+ printf("Data units (512,000 byte) read: %s\n",
+ uint128_to_str(to128(health->data_units_read), cbuf, sizeof(cbuf)));
+ printf("Data units written: %s\n",
+ uint128_to_str(to128(health->data_units_written), cbuf, sizeof(cbuf)));
+ printf("Host read commands: %s\n",
+ uint128_to_str(to128(health->host_read_commands), cbuf, sizeof(cbuf)));
+ printf("Host write commands: %s\n",
+ uint128_to_str(to128(health->host_write_commands), cbuf, sizeof(cbuf)));
+ printf("Controller busy time (minutes): %s\n",
+ uint128_to_str(to128(health->controller_busy_time), cbuf, sizeof(cbuf)));
+ printf("Power cycles: %s\n",
+ uint128_to_str(to128(health->power_cycles), cbuf, sizeof(cbuf)));
+ printf("Power on hours: %s\n",
+ uint128_to_str(to128(health->power_on_hours), cbuf, sizeof(cbuf)));
+ printf("Unsafe shutdowns: %s\n",
+ uint128_to_str(to128(health->unsafe_shutdowns), cbuf, sizeof(cbuf)));
+ printf("Media errors: %s\n",
+ uint128_to_str(to128(health->media_errors), cbuf, sizeof(cbuf)));
+ printf("No. error info log entries: %s\n",
+ uint128_to_str(to128(health->num_error_info_log_entries), cbuf, sizeof(cbuf)));
+
+ printf("Warning Temp Composite Time: %d\n", health->warning_temp_time);
+ printf("Error Temp Composite Time: %d\n", health->error_temp_time);
+ for (i = 0; i < 7; i++) {
+ if (health->temp_sensor[i] == 0)
+ continue;
+ printf("Temperature Sensor %d: ", i + 1);
+ print_temp(health->temp_sensor[i]);
+ }
}
static void
@@ -220,14 +286,522 @@ print_log_firmware(void *buf, uint32_t s
}
}
+/*
+ * Intel specific log pages from
+ * http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/ssd-dc-p3700-spec.pdf
+ *
+ * Though the version as of this date has a typo for the size of log page 0xca,
+ * offset 147: it is only 1 byte, not 6.
+ */
+static void
+print_intel_temp_stats(void *buf, uint32_t size __unused)
+{
+ struct intel_log_temp_stats *temp = buf;
+
+ printf("Intel Temperature Log\n");
+ printf("=====================\n");
+
+ printf("Current: ");
+ print_temp(temp->current);
+ printf("Overtemp Last Flags %#jx\n", (uintmax_t)temp->overtemp_flag_last);
+ printf("Overtemp Lifetime Flags %#jx\n", (uintmax_t)temp->overtemp_flag_life);
+ printf("Max Temperature ");
+ print_temp(temp->max_temp);
+ printf("Min Temperature ");
+ print_temp(temp->min_temp);
+ printf("Max Operating Temperature ");
+ print_temp(temp->max_oper_temp);
+ printf("Min Operating Temperature ");
+ print_temp(temp->min_oper_temp);
+ printf("Estimated Temperature Offset: %ju C/K\n", (uintmax_t)temp->est_offset);
+}
+
+static void
+print_intel_add_smart(void *buf, uint32_t size __unused)
+{
+ uint8_t *walker = buf;
+ uint8_t *end = walker + 150;
+ const char *name;
+ uint64_t raw;
+ uint8_t normalized;
+
+ static struct kv_name kv[] =
+ {
+ { 0xab, "Program Fail Count" },
+ { 0xac, "Erase Fail Count" },
+ { 0xad, "Wear Leveling Count" },
+ { 0xb8, "End to End Error Count" },
+ { 0xc7, "CRC Error Count" },
+ { 0xe2, "Timed: Media Wear" },
+ { 0xe3, "Timed: Host Read %" },
+ { 0xe4, "Timed: Elapsed Time" },
+ { 0xea, "Thermal Throttle Status" },
+ { 0xf0, "Retry Buffer Overflows" },
+ { 0xf3, "PLL Lock Loss Count" },
+ { 0xf4, "NAND Bytes Written" },
+ { 0xf5, "Host Bytes Written" },
+ };
+
+ printf("Additional SMART Data Log\n");
+ printf("=========================\n");
+ /*
+ * walker[0] = Key
+ * walker[1,2] = reserved
+ * walker[3] = Normalized Value
+ * walker[4] = reserved
+ * walker[5..10] = Little Endian Raw value
+ * (or other represenations)
+ * walker[11] = reserved
+ */
+ while (walker < end) {
+ name = kv_lookup(kv, nitems(kv), *walker);
+ normalized = walker[3];
+ raw = le48dec(walker + 5);
+ switch (*walker){
+ case 0:
+ break;
+ case 0xad:
+ printf("%-32s: %3d min: %u max: %u ave: %u\n", name, normalized,
+ le16dec(walker + 5), le16dec(walker + 7), le16dec(walker + 9));
+ break;
+ case 0xe2:
+ printf("%-32s: %3d %.3f%%\n", name, normalized, raw / 1024.0);
+ break;
+ case 0xea:
+ printf("%-32s: %3d %d%% %d times\n", name, normalized, walker[5], le32dec(walker+6));
+ break;
+ default:
+ printf("%-32s: %3d %ju\n", name, normalized, (uintmax_t)raw);
+ break;
+ }
+ walker += 12;
+ }
+}
+
+/*
+ * HGST's 0xc1 page. This is a grab bag of additional data. Please see
+ * https://www.hgst.com/sites/default/files/resources/US_SN150_ProdManual.pdf
+ * https://www.hgst.com/sites/default/files/resources/US_SN100_ProdManual.pdf
+ * Appendix A for details
+ */
+
+typedef void (*subprint_fn_t)(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+
+struct subpage_print
+{
+ uint16_t key;
+ subprint_fn_t fn;
+};
+
+static void print_hgst_info_write_errors(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_read_errors(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_verify_errors(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_self_test(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_background_scan(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_erase_errors(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_erase_counts(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_temp_history(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_ssd_perf(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+static void print_hgst_info_firmware_load(void *buf, uint16_t subtype, uint8_t res, uint32_t size);
+
+static struct subpage_print hgst_subpage[] = {
+ { 0x02, print_hgst_info_write_errors },
+ { 0x03, print_hgst_info_read_errors },
+ { 0x05, print_hgst_info_verify_errors },
+ { 0x10, print_hgst_info_self_test },
+ { 0x15, print_hgst_info_background_scan },
+ { 0x30, print_hgst_info_erase_errors },
+ { 0x31, print_hgst_info_erase_counts },
+ { 0x32, print_hgst_info_temp_history },
+ { 0x37, print_hgst_info_ssd_perf },
+ { 0x38, print_hgst_info_firmware_load },
+};
+
+/* Print a subpage that is basically just key value pairs */
+static void
+print_hgst_info_subpage_gen(void *buf, uint16_t subtype __unused, uint32_t size,
+ const struct kv_name *kv, size_t kv_count)
+{
+ uint8_t *wsp, *esp;
+ uint16_t ptype;
+ uint8_t plen;
+ uint64_t param;
+ int i;
+
+ wsp = buf;
+ esp = wsp + size;
+ while (wsp < esp) {
+ ptype = le16dec(wsp);
+ wsp += 2;
+ wsp++; /* Flags, just ignore */
+ plen = *wsp++;
+ param = 0;
+ for (i = 0; i < plen; i++)
+ param |= (uint64_t)*wsp++ << (i * 8);
+ printf(" %-30s: %jd\n", kv_lookup(kv, kv_count, ptype), (uintmax_t)param);
+ }
+}
+
+static void
+print_hgst_info_write_errors(void *buf, uint16_t subtype, uint8_t res __unused, uint32_t size)
+{
+ static struct kv_name kv[] =
+ {
+ { 0x0000, "Corrected Without Delay" },
+ { 0x0001, "Corrected Maybe Delayed" },
+ { 0x0002, "Re-Writes" },
+ { 0x0003, "Errors Corrected" },
+ { 0x0004, "Correct Algorithm Used" },
+ { 0x0005, "Bytes Processed" },
+ { 0x0006, "Uncorrected Errors" },
+ { 0x8000, "Flash Write Commands" },
+ { 0x8001, "HGST Special" },
+ };
+
+ printf("Write Errors Subpage:\n");
+ print_hgst_info_subpage_gen(buf, subtype, size, kv, nitems(kv));
+}
+
+static void
+print_hgst_info_read_errors(void *buf, uint16_t subtype, uint8_t res __unused, uint32_t size)
+{
+ static struct kv_name kv[] =
+ {
+ { 0x0000, "Corrected Without Delay" },
+ { 0x0001, "Corrected Maybe Delayed" },
+ { 0x0002, "Re-Reads" },
+ { 0x0003, "Errors Corrected" },
+ { 0x0004, "Correct Algorithm Used" },
+ { 0x0005, "Bytes Processed" },
+ { 0x0006, "Uncorrected Errors" },
+ { 0x8000, "Flash Read Commands" },
+ { 0x8001, "XOR Recovered" },
+ { 0x8002, "Total Corrected Bits" },
+ };
+
+ printf("Read Errors Subpage:\n");
+ print_hgst_info_subpage_gen(buf, subtype, size, kv, nitems(kv));
+}
+
+static void
+print_hgst_info_verify_errors(void *buf, uint16_t subtype, uint8_t res __unused, uint32_t size)
+{
+ static struct kv_name kv[] =
+ {
+ { 0x0000, "Corrected Without Delay" },
+ { 0x0001, "Corrected Maybe Delayed" },
+ { 0x0002, "Re-Reads" },
+ { 0x0003, "Errors Corrected" },
+ { 0x0004, "Correct Algorithm Used" },
+ { 0x0005, "Bytes Processed" },
+ { 0x0006, "Uncorrected Errors" },
+ { 0x8000, "Commands Processed" },
+ };
+
+ printf("Verify Errors Subpage:\n");
+ print_hgst_info_subpage_gen(buf, subtype, size, kv, nitems(kv));
+}
+
+static void
+print_hgst_info_self_test(void *buf, uint16_t subtype __unused, uint8_t res __unused, uint32_t size)
+{
+ size_t i;
+ uint8_t *walker = buf;
+ uint16_t code, hrs;
+ uint32_t lba;
+
+ printf("Self Test Subpage:\n");
+ for (i = 0; i < size / 20; i++) { /* Each entry is 20 bytes */
+ code = le16dec(walker);
+ walker += 2;
+ walker++; /* Ignore fixed flags */
+ if (*walker == 0) /* Last entry is zero length */
+ break;
+ if (*walker++ != 0x10) {
+ printf("Bad length for self test report\n");
+ return;
+ }
+ printf(" %-30s: %d\n", "Recent Test", code);
+ printf(" %-28s: %#x\n", "Self-Test Results", *walker & 0xf);
+ printf(" %-28s: %#x\n", "Self-Test Code", (*walker >> 5) & 0x7);
+ walker++;
+ printf(" %-28s: %#x\n", "Self-Test Number", *walker++);
+ hrs = le16dec(walker);
+ walker += 2;
+ lba = le32dec(walker);
+ walker += 4;
+ printf(" %-28s: %u\n", "Total Power On Hrs", hrs);
+ printf(" %-28s: %#jx (%jd)\n", "LBA", (uintmax_t)lba, (uintmax_t)lba);
+ printf(" %-28s: %#x\n", "Sense Key", *walker++ & 0xf);
+ printf(" %-28s: %#x\n", "Additional Sense Code", *walker++);
+ printf(" %-28s: %#x\n", "Additional Sense Qualifier", *walker++);
+ printf(" %-28s: %#x\n", "Vendor Specific Detail", *walker++);
+ }
+}
+
+static void
+print_hgst_info_background_scan(void *buf, uint16_t subtype __unused, uint8_t res __unused, uint32_t size)
+{
+ uint8_t *walker = buf;
+ uint8_t status;
+ uint16_t code, nscan, progress;
+ uint32_t pom, nand;
+
+ printf("Background Media Scan Subpage:\n");
+ /* Decode the header */
+ code = le16dec(walker);
+ walker += 2;
+ walker++; /* Ignore fixed flags */
+ if (*walker++ != 0x10) {
+ printf("Bad length for background scan header\n");
+ return;
+ }
+ if (code != 0) {
+ printf("Expceted code 0, found code %#x\n", code);
+ return;
+ }
+ pom = le32dec(walker);
+ walker += 4;
+ walker++; /* Reserved */
+ status = *walker++;
+ nscan = le16dec(walker);
+ walker += 2;
+ progress = le16dec(walker);
+ walker += 2;
+ walker += 6; /* Reserved */
+ printf(" %-30s: %d\n", "Power On Minutes", pom);
+ printf(" %-30s: %x (%s)\n", "BMS Status", status,
+ status == 0 ? "idle" : (status == 1 ? "active" : (status == 8 ? "suspended" : "unknown")));
+ printf(" %-30s: %d\n", "Number of BMS", nscan);
+ printf(" %-30s: %d\n", "Progress Current BMS", progress);
+ /* Report retirements */
+ if (walker - (uint8_t *)buf != 20) {
+ printf("Coding error, offset not 20\n");
+ return;
+ }
+ size -= 20;
+ printf(" %-30s: %d\n", "BMS retirements", size / 0x18);
+ while (size > 0) {
+ code = le16dec(walker);
+ walker += 2;
+ walker++;
+ if (*walker++ != 0x14) {
+ printf("Bad length parameter\n");
+ return;
+ }
+ pom = le32dec(walker);
+ walker += 4;
+ /*
+ * Spec sheet says the following are hard coded, if true, just
+ * print the NAND retirement.
+ */
+ if (walker[0] == 0x41 &&
+ walker[1] == 0x0b &&
+ walker[2] == 0x01 &&
+ walker[3] == 0x00 &&
+ walker[4] == 0x00 &&
+ walker[5] == 0x00 &&
+ walker[6] == 0x00 &&
+ walker[7] == 0x00) {
+ walker += 8;
+ walker += 4; /* Skip reserved */
+ nand = le32dec(walker);
+ walker += 4;
+ printf(" %-30s: %d\n", "Retirement number", code);
+ printf(" %-28s: %#x\n", "NAND (C/T)BBBPPP", nand);
+ } else {
+ printf("Parameter %#x entry corrupt\n", code);
+ walker += 16;
+ }
+ }
+}
+
+static void
+print_hgst_info_erase_errors(void *buf, uint16_t subtype __unused, uint8_t res __unused, uint32_t size)
+{
+ static struct kv_name kv[] =
+ {
+ { 0x0000, "Corrected Without Delay" },
+ { 0x0001, "Corrected Maybe Delayed" },
+ { 0x0002, "Re-Erase" },
+ { 0x0003, "Errors Corrected" },
+ { 0x0004, "Correct Algorithm Used" },
+ { 0x0005, "Bytes Processed" },
+ { 0x0006, "Uncorrected Errors" },
+ { 0x8000, "Flash Erase Commands" },
+ { 0x8001, "Mfg Defect Count" },
+ { 0x8002, "Grown Defect Count" },
+ { 0x8003, "Erase Count -- User" },
+ { 0x8004, "Erase Count -- System" },
+ };
+
+ printf("Erase Errors Subpage:\n");
+ print_hgst_info_subpage_gen(buf, subtype, size, kv, nitems(kv));
+}
+
+static void
+print_hgst_info_erase_counts(void *buf, uint16_t subtype, uint8_t res __unused, uint32_t size)
+{
+ /* My drive doesn't export this -- so not coding up */
+ printf("XXX: Erase counts subpage: %p, %#x %d\n", buf, subtype, size);
+}
+
+static void
+print_hgst_info_temp_history(void *buf, uint16_t subtype __unused, uint8_t res __unused, uint32_t size __unused)
+{
+ uint8_t *walker = buf;
+ uint32_t min;
+
+ printf("Temperature History:\n");
+ printf(" %-30s: %d C\n", "Current Temperature", *walker++);
+ printf(" %-30s: %d C\n", "Reference Temperature", *walker++);
+ printf(" %-30s: %d C\n", "Maximum Temperature", *walker++);
+ printf(" %-30s: %d C\n", "Minimum Temperature", *walker++);
+ min = le32dec(walker);
+ walker += 4;
+ printf(" %-30s: %d:%02d:00\n", "Max Temperture Time", min / 60, min % 60);
+ min = le32dec(walker);
+ walker += 4;
+ printf(" %-30s: %d:%02d:00\n", "Over Temperture Duration", min / 60, min % 60);
+ min = le32dec(walker);
+ walker += 4;
+ printf(" %-30s: %d:%02d:00\n", "Min Temperture Time", min / 60, min % 60);
+}
+
+static void
+print_hgst_info_ssd_perf(void *buf, uint16_t subtype __unused, uint8_t res, uint32_t size __unused)
+{
+ uint8_t *walker = buf;
+ uint64_t val;
+
+ printf("SSD Performance Subpage Type %d:\n", res);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Read Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Read Blocks", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Cache Read Hits Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Cache Read Hits Blocks", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Read Commands Stalled", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Write Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Write Blocks", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Write Odd Start Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Write Odd End Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "Host Write Commands Stalled", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "NAND Read Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "NAND Read Blocks", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "NAND Write Commands", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "NAND Write Blocks", val);
+ val = le64dec(walker);
+ walker += 8;
+ printf(" %-30s: %ju\n", "NAND Read Before Writes", val);
+}
+
+static void
+print_hgst_info_firmware_load(void *buf, uint16_t subtype __unused, uint8_t res __unused, uint32_t size __unused)
+{
+ uint8_t *walker = buf;
+
+ printf("Firmware Load Subpage:\n");
+ printf(" %-30s: %d\n", "Firmware Downloads", le32dec(walker));
+}
+
+static void
+kv_indirect(void *buf, uint32_t subtype, uint8_t res, uint32_t size, struct subpage_print *sp, size_t nsp)
+{
+ size_t i;
+
+ for (i = 0; i < nsp; i++, sp++) {
+ if (sp->key == subtype) {
+ sp->fn(buf, subtype, res, size);
+ return;
+ }
+ }
+ printf("No handler for page type %x\n", subtype);
+}
+
+static void
+print_hgst_info_log(void *buf, uint32_t size __unused)
+{
+ uint8_t *walker, *end, *subpage;
+ int pages;
+ uint16_t len;
+ uint8_t subtype, res;
+
+ printf("HGST Extra Info Log\n");
+ printf("===================\n");
+
+ walker = buf;
+ pages = *walker++;
+ walker++;
+ len = le16dec(walker);
+ walker += 2;
+ end = walker + len; /* Length is exclusive of this header */
+
+ while (walker < end) {
+ subpage = walker + 4;
+ subtype = *walker++ & 0x3f; /* subtype */
+ res = *walker++; /* Reserved */
+ len = le16dec(walker);
+ walker += len + 2; /* Length, not incl header */
+ if (walker > end) {
+ printf("Ooops! Off the end of the list\n");
+ break;
+ }
+ kv_indirect(subpage, subtype, res, len, hgst_subpage, nitems(hgst_subpage));
+ }
+}
+
+/*
+ * Table of log page printer / sizing.
+ *
+ * This includes Intel specific pages that are widely implemented. Not
+ * sure how best to switch between different vendors.
+ */
static struct logpage_function {
uint8_t log_page;
- print_fn_t fn;
+ print_fn_t print_fn;
+ size_t size;
} logfuncs[] = {
- {NVME_LOG_ERROR, print_log_error },
- {NVME_LOG_HEALTH_INFORMATION, print_log_health },
- {NVME_LOG_FIRMWARE_SLOT, print_log_firmware },
- {0, NULL },
+ {NVME_LOG_ERROR, print_log_error,
+ 0},
+ {NVME_LOG_HEALTH_INFORMATION, print_log_health,
+ sizeof(struct nvme_health_information_page)},
+ {NVME_LOG_FIRMWARE_SLOT, print_log_firmware,
+ sizeof(struct nvme_firmware_page)},
+ {INTEL_LOG_TEMP_STATS, print_intel_temp_stats,
+ sizeof(struct intel_log_temp_stats)},
+ {INTEL_LOG_ADD_SMART, print_intel_add_smart,
+ DEFAULT_SIZE},
+ {HGST_INFO_LOG, print_hgst_info_log,
+ DEFAULT_SIZE},
+ {0, NULL,
+ 0},
};
static void
@@ -262,14 +836,6 @@ logpage(int argc, char *argv[])
"\"%s\" not valid log page id.\n",
optarg);
logpage_usage();
- /* TODO: Define valid log page id ranges in nvme.h? */
- } else if (log_page == 0 ||
- (log_page >= 0x04 && log_page <= 0x7F) ||
- (log_page >= 0x80 && log_page <= 0xBF)) {
- fprintf(stderr,
- "\"%s\" not valid log page id.\n",
- optarg);
- logpage_usage();
}
pageflag = true;
break;
@@ -316,6 +882,7 @@ logpage(int argc, char *argv[])
}
print_fn = print_hex;
+ size = DEFAULT_SIZE;
if (!hexflag) {
/*
* See if there is a pretty print function for the
@@ -325,30 +892,20 @@ logpage(int argc, char *argv[])
f = logfuncs;
while (f->log_page > 0) {
if (log_page == f->log_page) {
- print_fn = f->fn;
+ print_fn = f->print_fn;
+ size = f->size;
break;
}
f++;
}
}
- /* Read the log page */
- switch (log_page) {
- case NVME_LOG_ERROR:
+ if (log_page == NVME_LOG_ERROR) {
size = sizeof(struct nvme_error_information_entry);
size *= (cdata.elpe + 1);
- break;
- case NVME_LOG_HEALTH_INFORMATION:
- size = sizeof(struct nvme_health_information_page);
- break;
- case NVME_LOG_FIRMWARE_SLOT:
- size = sizeof(struct nvme_firmware_page);
- break;
- default:
- size = DEFAULT_SIZE;
- break;
}
+ /* Read the log page */
buf = get_log_buffer(size);
read_logpage(fd, log_page, nsid, buf, size);
print_fn(buf, size);
Modified: projects/clang390-import/sys/boot/i386/libi386/smbios.c
==============================================================================
--- projects/clang390-import/sys/boot/i386/libi386/smbios.c Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sys/boot/i386/libi386/smbios.c Sat Nov 19 21:10:46 2016 (r308868)
@@ -238,7 +238,8 @@ smbios_parse_table(const caddr_t addr)
smbios_setenv("smbios.system.serial", addr, 0x07);
smbios_setuuid("smbios.system.uuid", addr + 0x08, smbios.ver);
#endif
- if (smbios.major >= 2 && smbios.minor >= 4) {
+ if (smbios.major > 2 ||
+ (smbios.major == 2 && smbios.minor >= 4)) {
smbios_setenv("smbios.system.sku", addr, 0x19);
smbios_setenv("smbios.system.family", addr, 0x1a);
}
Modified: projects/clang390-import/sys/conf/files.mips
==============================================================================
--- projects/clang390-import/sys/conf/files.mips Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sys/conf/files.mips Sat Nov 19 21:10:46 2016 (r308868)
@@ -97,6 +97,13 @@ dev/hwpmc/hwpmc_mips74k.c optional hwpm
# ofw support
dev/ofw/ofwpci.c optional fdt pci
+# INTRNG support code
+kern/msi_if.m optional intrng
+kern/pic_if.m optional intrng
+kern/subr_intr.c optional intrng
+# INTRNG compatible MIPS32 interrupt controller
+mips/mips/mips_pic.c optional intrng
+
# DTrace
cddl/compat/opensolaris/kern/opensolaris_atomic.c optional zfs | dtrace compile-with "${CDDL_C}"
cddl/dev/dtrace/mips/dtrace_asm.S optional dtrace compile-with "${DTRACE_S}"
Modified: projects/clang390-import/sys/conf/options.mips
==============================================================================
--- projects/clang390-import/sys/conf/options.mips Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sys/conf/options.mips Sat Nov 19 21:10:46 2016 (r308868)
@@ -45,6 +45,7 @@ CPU_CNMIPS opt_global.h
CPU_RMI opt_global.h
CPU_NLM opt_global.h
CPU_BERI opt_global.h
+CPU_XBURST opt_global.h
CPU_MALTA opt_global.h
# which MACHINE_ARCH architecture
Modified: projects/clang390-import/sys/dev/nvme/nvme.h
==============================================================================
--- projects/clang390-import/sys/dev/nvme/nvme.h Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sys/dev/nvme/nvme.h Sat Nov 19 21:10:46 2016 (r308868)
@@ -663,9 +663,27 @@ enum nvme_log_page {
NVME_LOG_ERROR = 0x01,
NVME_LOG_HEALTH_INFORMATION = 0x02,
NVME_LOG_FIRMWARE_SLOT = 0x03,
- /* 0x04-0x7F - reserved */
+ NVME_LOG_CHANGED_NAMESPACE = 0x04,
+ NVME_LOG_COMMAND_EFFECT = 0x05,
+ /* 0x06-0x7F - reserved */
/* 0x80-0xBF - I/O command set specific */
+ NVME_LOG_RES_NOTIFICATION = 0x80,
/* 0xC0-0xFF - vendor specific */
+
+ /*
+ * The following are Intel Specific log pages, but they seem
+ * to be widely implemented.
+ */
+ INTEL_LOG_READ_LAT_LOG = 0xc1,
+ INTEL_LOG_WRITE_LAT_LOG = 0xc2,
+ INTEL_LOG_TEMP_STATS = 0xc5,
+ INTEL_LOG_ADD_SMART = 0xca,
+ INTEL_LOG_DRIVE_MKT_NAME = 0xdd,
+
+ /*
+ * HGST log page, with lots ofs sub pages.
+ */
+ HGST_INFO_LOG = 0xc1,
};
struct nvme_error_information_entry {
@@ -724,8 +742,11 @@ struct nvme_health_information_page {
uint64_t unsafe_shutdowns[2];
uint64_t media_errors[2];
uint64_t num_error_info_log_entries[2];
+ uint32_t warning_temp_time;
+ uint32_t error_temp_time;
+ uint16_t temp_sensor[8];
- uint8_t reserved2[320];
+ uint8_t reserved2[296];
} __packed __aligned(4);
struct nvme_firmware_page {
@@ -740,6 +761,19 @@ struct nvme_firmware_page {
uint8_t reserved2[448];
} __packed __aligned(4);
+struct intel_log_temp_stats
+{
+ uint64_t current;
+ uint64_t overtemp_flag_last;
+ uint64_t overtemp_flag_life;
+ uint64_t max_temp;
+ uint64_t min_temp;
+ uint64_t _rsvd[5];
+ uint64_t max_oper_temp;
+ uint64_t min_oper_temp;
+ uint64_t est_offset;
+} __packed __aligned(4);
+
#define NVME_TEST_MAX_THREADS 128
struct nvme_io_test {
Modified: projects/clang390-import/sys/mips/atheros/ar531x/files.ar5315
==============================================================================
--- projects/clang390-import/sys/mips/atheros/ar531x/files.ar5315 Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sys/mips/atheros/ar531x/files.ar5315 Sat Nov 19 21:10:46 2016 (r308868)
@@ -18,14 +18,5 @@ mips/mips/tick.c standard
dev/etherswitch/e6000sw/e6060sw.c optional etherswitch
-# Hack to reuse ARM intrng code
-kern/subr_intr.c optional intrng
-kern/msi_if.m optional intrng
-kern/pic_if.m optional intrng
-
-# Intrng compatible MIPS32 interrupt controller
-mips/mips/mips_pic.c optional intrng
-
# Non Intrng
mips/mips/intr_machdep.c optional !intrng
-
Modified: projects/clang390-import/sys/mips/broadcom/files.broadcom
==============================================================================
--- projects/clang390-import/sys/mips/broadcom/files.broadcom Sat Nov 19 21:05:17 2016 (r308867)
+++ projects/clang390-import/sys/mips/broadcom/files.broadcom Sat Nov 19 21:10:46 2016 (r308868)
@@ -9,11 +9,6 @@ mips/broadcom/bcm_bmips.c optional siba
mips/broadcom/bcm_mips74k.c optional bcma_nexus bcma
mips/broadcom/bcm_pmu.c standard
mips/mips/tick.c standard
-mips/mips/mips_pic.c standard
-kern/subr_intr.c standard
-kern/pic_if.m standard
-
-kern/msi_if.m optional intrng
mips/broadcom/uart_cpu_chipc.c optional uart
mips/broadcom/uart_bus_chipc.c optional uart
Copied: projects/clang390-import/sys/mips/conf/CANNA (from r308867, head/sys/mips/conf/CANNA)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/clang390-import/sys/mips/conf/CANNA Sat Nov 19 21:10:46 2016 (r308868, copy of r308867, head/sys/mips/conf/CANNA)
@@ -0,0 +1,29 @@
+# CANNA -- Kernel config for Ingenic CANNA board
+#
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list