Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Nov 2016 21:10:46 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   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...
Message-ID:  <201611192110.uAJLAktp078482@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611192110.uAJLAktp078482>