All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2 v2] Split Documentation/rtc.txt
@ 2015-03-18 19:46 Prarit Bhargava
  2015-03-18 19:46 ` [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file Prarit Bhargava
  2015-03-18 19:46 ` [PATCH 2/2 v2] tools, update rtctest.c to verify passage of time Prarit Bhargava
  0 siblings, 2 replies; 14+ messages in thread
From: Prarit Bhargava @ 2015-03-18 19:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: Prarit Bhargava, corbet, rtc-linux, linux-doc, a.zummo,
	john.stultz, shuahkh

Documentation/rtc.txt is a combination of two files, a real documentation
file and a test program.  Splitting these up into two files is a good idea
for automated testing.  While testing on an AMD based system it was noticed
that the RTC was not behaving properly which lead to a possible bug in the
BIOS (the analysis of which is still ongoing).  rtctest.c returned a false
positive because it does not check the time between interrupts is what was
expected.  This patchset adds Documentation/rtc, splits the rtc.txt into two
files and updates the test to verify the passage of time.

[v2] this patchset was built on
git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git next
in order to get jstultz' latest tools/testing/selftests/timers/ changes.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: corbet@lwn.net
Cc: rtc-linux@googlegroups.com
Cc: linux-doc@vger.kernel.org
Cc: a.zummo@towertech.it
Cc: prarit@redhat.com
Cc: john.stultz@linaro.org
Cc: shuahkh@osg.samsung.com

Prarit Bhargava (2):
  Documentation, split up rtc.txt into documentation and test file
  tools, update rtctest.c to verify passage of time

 Documentation/rtc.txt                    | 264 +-----------------------------
 tools/testing/selftests/timers/Makefile  |   3 +-
 tools/testing/selftests/timers/rtctest.c | 271 +++++++++++++++++++++++++++++++
 3 files changed, 274 insertions(+), 264 deletions(-)
 create mode 100644 tools/testing/selftests/timers/rtctest.c

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-18 19:46 [PATCH 0/2 v2] Split Documentation/rtc.txt Prarit Bhargava
@ 2015-03-18 19:46 ` Prarit Bhargava
  2015-03-18 20:05   ` John Stultz
  2015-03-19 18:24   ` Shuah Khan
  2015-03-18 19:46 ` [PATCH 2/2 v2] tools, update rtctest.c to verify passage of time Prarit Bhargava
  1 sibling, 2 replies; 14+ messages in thread
From: Prarit Bhargava @ 2015-03-18 19:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: Prarit Bhargava, corbet, rtc-linux, linux-doc, a.zummo,
	john.stultz, shuahkh

This patch splits rtc.txt into two separate files, one for the
documentation itself, and the other for the rtctest.c file.  The rtctest
file is moved into the kernel tools/testing/selftests/timers directory.
This will make automated testing easier.  Note that the only difference in
the rtc.txt file is that the location of the rtctest.c file has changed.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: corbet@lwn.net
Cc: rtc-linux@googlegroups.com
Cc: linux-doc@vger.kernel.org
Cc: a.zummo@towertech.it
Cc: prarit@redhat.com
Cc: john.stultz@linaro.org
Cc: shuahkh@osg.samsung.com

---
 Documentation/rtc.txt                    | 264 +------------------------------
 tools/testing/selftests/timers/Makefile  |   3 +-
 tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
 3 files changed, 261 insertions(+), 264 deletions(-)
 create mode 100644 tools/testing/selftests/timers/rtctest.c

diff --git a/Documentation/rtc.txt b/Documentation/rtc.txt
index 596b60c..8446f1e 100644
--- a/Documentation/rtc.txt
+++ b/Documentation/rtc.txt
@@ -204,266 +204,4 @@ Some common examples:
 
     *	RTC_PIE_ON, RTC_PIE_OFF: These are also emulated by the generic code.
 
-If all else fails, check out the rtc-test.c driver!
-
-
--------------------- 8< ---------------- 8< -----------------------------
-
-/*
- *      Real Time Clock Driver Test/Example Program
- *
- *      Compile with:
- *		     gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest
- *
- *      Copyright (C) 1996, Paul Gortmaker.
- *
- *      Released under the GNU General Public License, version 2,
- *      included herein by reference.
- *
- */
-
-#include <stdio.h>
-#include <linux/rtc.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-
-
-/*
- * This expects the new RTC class driver framework, working with
- * clocks that will often not be clones of what the PC-AT had.
- * Use the command line to specify another RTC if you need one.
- */
-static const char default_rtc[] = "/dev/rtc0";
-
-
-int main(int argc, char **argv)
-{
-	int i, fd, retval, irqcount = 0;
-	unsigned long tmp, data;
-	struct rtc_time rtc_tm;
-	const char *rtc = default_rtc;
-
-	switch (argc) {
-	case 2:
-		rtc = argv[1];
-		/* FALLTHROUGH */
-	case 1:
-		break;
-	default:
-		fprintf(stderr, "usage:  rtctest [rtcdev]\n");
-		return 1;
-	}
-
-	fd = open(rtc, O_RDONLY);
-
-	if (fd ==  -1) {
-		perror(rtc);
-		exit(errno);
-	}
-
-	fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n");
-
-	/* Turn on update interrupts (one per second) */
-	retval = ioctl(fd, RTC_UIE_ON, 0);
-	if (retval == -1) {
-		if (errno == ENOTTY) {
-			fprintf(stderr,
-				"\n...Update IRQs not supported.\n");
-			goto test_READ;
-		}
-		perror("RTC_UIE_ON ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:",
-			rtc);
-	fflush(stderr);
-	for (i=1; i<6; i++) {
-		/* This read will block */
-		retval = read(fd, &data, sizeof(unsigned long));
-		if (retval == -1) {
-			perror("read");
-			exit(errno);
-		}
-		fprintf(stderr, " %d",i);
-		fflush(stderr);
-		irqcount++;
-	}
-
-	fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
-	fflush(stderr);
-	for (i=1; i<6; i++) {
-		struct timeval tv = {5, 0};     /* 5 second timeout on select */
-		fd_set readfds;
-
-		FD_ZERO(&readfds);
-		FD_SET(fd, &readfds);
-		/* The select will wait until an RTC interrupt happens. */
-		retval = select(fd+1, &readfds, NULL, NULL, &tv);
-		if (retval == -1) {
-		        perror("select");
-		        exit(errno);
-		}
-		/* This read won't block unlike the select-less case above. */
-		retval = read(fd, &data, sizeof(unsigned long));
-		if (retval == -1) {
-		        perror("read");
-		        exit(errno);
-		}
-		fprintf(stderr, " %d",i);
-		fflush(stderr);
-		irqcount++;
-	}
-
-	/* Turn off update interrupts */
-	retval = ioctl(fd, RTC_UIE_OFF, 0);
-	if (retval == -1) {
-		perror("RTC_UIE_OFF ioctl");
-		exit(errno);
-	}
-
-test_READ:
-	/* Read the RTC time/date */
-	retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
-	if (retval == -1) {
-		perror("RTC_RD_TIME ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
-		rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
-		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
-
-	/* Set the alarm to 5 sec in the future, and check for rollover */
-	rtc_tm.tm_sec += 5;
-	if (rtc_tm.tm_sec >= 60) {
-		rtc_tm.tm_sec %= 60;
-		rtc_tm.tm_min++;
-	}
-	if (rtc_tm.tm_min == 60) {
-		rtc_tm.tm_min = 0;
-		rtc_tm.tm_hour++;
-	}
-	if (rtc_tm.tm_hour == 24)
-		rtc_tm.tm_hour = 0;
-
-	retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
-	if (retval == -1) {
-		if (errno == ENOTTY) {
-			fprintf(stderr,
-				"\n...Alarm IRQs not supported.\n");
-			goto test_PIE;
-		}
-		perror("RTC_ALM_SET ioctl");
-		exit(errno);
-	}
-
-	/* Read the current alarm settings */
-	retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
-	if (retval == -1) {
-		perror("RTC_ALM_READ ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n",
-		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
-
-	/* Enable alarm interrupts */
-	retval = ioctl(fd, RTC_AIE_ON, 0);
-	if (retval == -1) {
-		perror("RTC_AIE_ON ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Waiting 5 seconds for alarm...");
-	fflush(stderr);
-	/* This blocks until the alarm ring causes an interrupt */
-	retval = read(fd, &data, sizeof(unsigned long));
-	if (retval == -1) {
-		perror("read");
-		exit(errno);
-	}
-	irqcount++;
-	fprintf(stderr, " okay. Alarm rang.\n");
-
-	/* Disable alarm interrupts */
-	retval = ioctl(fd, RTC_AIE_OFF, 0);
-	if (retval == -1) {
-		perror("RTC_AIE_OFF ioctl");
-		exit(errno);
-	}
-
-test_PIE:
-	/* Read periodic IRQ rate */
-	retval = ioctl(fd, RTC_IRQP_READ, &tmp);
-	if (retval == -1) {
-		/* not all RTCs support periodic IRQs */
-		if (errno == ENOTTY) {
-			fprintf(stderr, "\nNo periodic IRQ support\n");
-			goto done;
-		}
-		perror("RTC_IRQP_READ ioctl");
-		exit(errno);
-	}
-	fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
-
-	fprintf(stderr, "Counting 20 interrupts at:");
-	fflush(stderr);
-
-	/* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */
-	for (tmp=2; tmp<=64; tmp*=2) {
-
-		retval = ioctl(fd, RTC_IRQP_SET, tmp);
-		if (retval == -1) {
-			/* not all RTCs can change their periodic IRQ rate */
-			if (errno == ENOTTY) {
-				fprintf(stderr,
-					"\n...Periodic IRQ rate is fixed\n");
-				goto done;
-			}
-			perror("RTC_IRQP_SET ioctl");
-			exit(errno);
-		}
-
-		fprintf(stderr, "\n%ldHz:\t", tmp);
-		fflush(stderr);
-
-		/* Enable periodic interrupts */
-		retval = ioctl(fd, RTC_PIE_ON, 0);
-		if (retval == -1) {
-			perror("RTC_PIE_ON ioctl");
-			exit(errno);
-		}
-
-		for (i=1; i<21; i++) {
-			/* This blocks */
-			retval = read(fd, &data, sizeof(unsigned long));
-			if (retval == -1) {
-				perror("read");
-				exit(errno);
-			}
-			fprintf(stderr, " %d",i);
-			fflush(stderr);
-			irqcount++;
-		}
-
-		/* Disable periodic interrupts */
-		retval = ioctl(fd, RTC_PIE_OFF, 0);
-		if (retval == -1) {
-			perror("RTC_PIE_OFF ioctl");
-			exit(errno);
-		}
-	}
-
-done:
-	fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n");
-
-	close(fd);
-
-	return 0;
-}
+If all else fails, check out the tools/testing/selftests/timers/rtctest.c test!
diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 9da3498..419089b 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -5,7 +5,7 @@ LDFLAGS += -lrt -lpthread
 bins = posix_timers nanosleep inconsistency-check nsleep-lat raw_skew \
 	set-timer-lat threadtest mqueue-lat valid-adjtimex \
 	alarmtimer-suspend change_skew skew_consistency clocksource-switch \
-	leap-a-day leapcrash set-tai set-2038
+	leap-a-day leapcrash set-tai set-2038 rtctest
 
 all: ${bins}
 
@@ -20,6 +20,7 @@ run_tests: all
 	./inconsistency-check
 	./raw_skew
 	./threadtest -t 30 -n 8
+	./rtctest
 
 # these tests require escalated privledges
 # and may modify the system time or trigger
diff --git a/tools/testing/selftests/timers/rtctest.c b/tools/testing/selftests/timers/rtctest.c
new file mode 100644
index 0000000..1e06f46
--- /dev/null
+++ b/tools/testing/selftests/timers/rtctest.c
@@ -0,0 +1,258 @@
+/*
+ *      Real Time Clock Driver Test/Example Program
+ *
+ *      Compile with:
+ *		     gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest
+ *
+ *      Copyright (C) 1996, Paul Gortmaker.
+ *
+ *      Released under the GNU General Public License, version 2,
+ *      included herein by reference.
+ *
+ */
+
+#include <stdio.h>
+#include <linux/rtc.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+
+/*
+ * This expects the new RTC class driver framework, working with
+ * clocks that will often not be clones of what the PC-AT had.
+ * Use the command line to specify another RTC if you need one.
+ */
+static const char default_rtc[] = "/dev/rtc0";
+
+
+int main(int argc, char **argv)
+{
+	int i, fd, retval, irqcount = 0;
+	unsigned long tmp, data;
+	struct rtc_time rtc_tm;
+	const char *rtc = default_rtc;
+
+	switch (argc) {
+	case 2:
+		rtc = argv[1];
+		/* FALLTHROUGH */
+	case 1:
+		break;
+	default:
+		fprintf(stderr, "usage:  rtctest [rtcdev]\n");
+		return 1;
+	}
+
+	fd = open(rtc, O_RDONLY);
+
+	if (fd ==  -1) {
+		perror(rtc);
+		exit(errno);
+	}
+
+	fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n");
+
+	/* Turn on update interrupts (one per second) */
+	retval = ioctl(fd, RTC_UIE_ON, 0);
+	if (retval == -1) {
+		if (errno == ENOTTY) {
+			fprintf(stderr,
+				"\n...Update IRQs not supported.\n");
+			goto test_READ;
+		}
+		perror("RTC_UIE_ON ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:",
+			rtc);
+	fflush(stderr);
+	for (i=1; i<6; i++) {
+		/* This read will block */
+		retval = read(fd, &data, sizeof(unsigned long));
+		if (retval == -1) {
+			perror("read");
+			exit(errno);
+		}
+		fprintf(stderr, " %d",i);
+		fflush(stderr);
+		irqcount++;
+	}
+
+	fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
+	fflush(stderr);
+	for (i=1; i<6; i++) {
+		struct timeval tv = {5, 0};     /* 5 second timeout on select */
+		fd_set readfds;
+
+		FD_ZERO(&readfds);
+		FD_SET(fd, &readfds);
+		/* The select will wait until an RTC interrupt happens. */
+		retval = select(fd+1, &readfds, NULL, NULL, &tv);
+		if (retval == -1) {
+		        perror("select");
+		        exit(errno);
+		}
+		/* This read won't block unlike the select-less case above. */
+		retval = read(fd, &data, sizeof(unsigned long));
+		if (retval == -1) {
+		        perror("read");
+		        exit(errno);
+		}
+		fprintf(stderr, " %d",i);
+		fflush(stderr);
+		irqcount++;
+	}
+
+	/* Turn off update interrupts */
+	retval = ioctl(fd, RTC_UIE_OFF, 0);
+	if (retval == -1) {
+		perror("RTC_UIE_OFF ioctl");
+		exit(errno);
+	}
+
+test_READ:
+	/* Read the RTC time/date */
+	retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
+	if (retval == -1) {
+		perror("RTC_RD_TIME ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
+		rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
+		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+
+	/* Set the alarm to 5 sec in the future, and check for rollover */
+	rtc_tm.tm_sec += 5;
+	if (rtc_tm.tm_sec >= 60) {
+		rtc_tm.tm_sec %= 60;
+		rtc_tm.tm_min++;
+	}
+	if (rtc_tm.tm_min == 60) {
+		rtc_tm.tm_min = 0;
+		rtc_tm.tm_hour++;
+	}
+	if (rtc_tm.tm_hour == 24)
+		rtc_tm.tm_hour = 0;
+
+	retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
+	if (retval == -1) {
+		if (errno == ENOTTY) {
+			fprintf(stderr,
+				"\n...Alarm IRQs not supported.\n");
+			goto test_PIE;
+		}
+		perror("RTC_ALM_SET ioctl");
+		exit(errno);
+	}
+
+	/* Read the current alarm settings */
+	retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
+	if (retval == -1) {
+		perror("RTC_ALM_READ ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n",
+		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+
+	/* Enable alarm interrupts */
+	retval = ioctl(fd, RTC_AIE_ON, 0);
+	if (retval == -1) {
+		perror("RTC_AIE_ON ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Waiting 5 seconds for alarm...");
+	fflush(stderr);
+	/* This blocks until the alarm ring causes an interrupt */
+	retval = read(fd, &data, sizeof(unsigned long));
+	if (retval == -1) {
+		perror("read");
+		exit(errno);
+	}
+	irqcount++;
+	fprintf(stderr, " okay. Alarm rang.\n");
+
+	/* Disable alarm interrupts */
+	retval = ioctl(fd, RTC_AIE_OFF, 0);
+	if (retval == -1) {
+		perror("RTC_AIE_OFF ioctl");
+		exit(errno);
+	}
+
+test_PIE:
+	/* Read periodic IRQ rate */
+	retval = ioctl(fd, RTC_IRQP_READ, &tmp);
+	if (retval == -1) {
+		/* not all RTCs support periodic IRQs */
+		if (errno == ENOTTY) {
+			fprintf(stderr, "\nNo periodic IRQ support\n");
+			goto done;
+		}
+		perror("RTC_IRQP_READ ioctl");
+		exit(errno);
+	}
+	fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
+
+	fprintf(stderr, "Counting 20 interrupts at:");
+	fflush(stderr);
+
+	/* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */
+	for (tmp=2; tmp<=64; tmp*=2) {
+
+		retval = ioctl(fd, RTC_IRQP_SET, tmp);
+		if (retval == -1) {
+			/* not all RTCs can change their periodic IRQ rate */
+			if (errno == ENOTTY) {
+				fprintf(stderr,
+					"\n...Periodic IRQ rate is fixed\n");
+				goto done;
+			}
+			perror("RTC_IRQP_SET ioctl");
+			exit(errno);
+		}
+
+		fprintf(stderr, "\n%ldHz:\t", tmp);
+		fflush(stderr);
+
+		/* Enable periodic interrupts */
+		retval = ioctl(fd, RTC_PIE_ON, 0);
+		if (retval == -1) {
+			perror("RTC_PIE_ON ioctl");
+			exit(errno);
+		}
+
+		for (i=1; i<21; i++) {
+			/* This blocks */
+			retval = read(fd, &data, sizeof(unsigned long));
+			if (retval == -1) {
+				perror("read");
+				exit(errno);
+			}
+			fprintf(stderr, " %d",i);
+			fflush(stderr);
+			irqcount++;
+		}
+
+		/* Disable periodic interrupts */
+		retval = ioctl(fd, RTC_PIE_OFF, 0);
+		if (retval == -1) {
+			perror("RTC_PIE_OFF ioctl");
+			exit(errno);
+		}
+	}
+
+done:
+	fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n");
+
+	close(fd);
+
+	return 0;
+}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/2 v2] tools, update rtctest.c to verify passage of time
  2015-03-18 19:46 [PATCH 0/2 v2] Split Documentation/rtc.txt Prarit Bhargava
  2015-03-18 19:46 ` [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file Prarit Bhargava
@ 2015-03-18 19:46 ` Prarit Bhargava
  2015-03-18 20:08   ` John Stultz
  1 sibling, 1 reply; 14+ messages in thread
From: Prarit Bhargava @ 2015-03-18 19:46 UTC (permalink / raw)
  To: linux-kernel
  Cc: Prarit Bhargava, corbet, rtc-linux, linux-doc, a.zummo,
	john.stultz, shuahkh

rtctest.c checks to see if PIE is functioning by testing if 20 interrupts occur
at rates from 2HZ to 64HZ.  While this check is good, it does not check to
see if the correct amount of time has actually passed.  This misses
situations where the RTC may be operating at a higher or lower frequency
than expected.

This patch introduces a simple check to verify if the time passed is
less than 10% of what was programmed into the RTC.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: corbet@lwn.net
Cc: rtc-linux@googlegroups.com
Cc: linux-doc@vger.kernel.org
Cc: a.zummo@towertech.it
Cc: prarit@redhat.com
Cc: john.stultz@linaro.org
Cc: shuahkh@osg.samsung.com
---
 tools/testing/selftests/timers/rtctest.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/tools/testing/selftests/timers/rtctest.c b/tools/testing/selftests/timers/rtctest.c
index 1e06f46..d80ae85 100644
--- a/tools/testing/selftests/timers/rtctest.c
+++ b/tools/testing/selftests/timers/rtctest.c
@@ -36,6 +36,7 @@ int main(int argc, char **argv)
 	unsigned long tmp, data;
 	struct rtc_time rtc_tm;
 	const char *rtc = default_rtc;
+	struct timeval start, end, diff;
 
 	switch (argc) {
 	case 2:
@@ -230,12 +231,24 @@ test_PIE:
 		}
 
 		for (i=1; i<21; i++) {
+			gettimeofday(&start, NULL);
 			/* This blocks */
 			retval = read(fd, &data, sizeof(unsigned long));
 			if (retval == -1) {
 				perror("read");
 				exit(errno);
 			}
+			gettimeofday(&end, NULL);
+			timersub(&end, &start, &diff);
+			if (diff.tv_sec > 0 ||
+			    diff.tv_usec > ((1000000L / tmp) * 1.10)) {
+				fprintf(stderr, "\nPIE delta error: %ld.%06ld should be close to 0.%06ld\n",
+				       diff.tv_sec, diff.tv_usec,
+				       (1000000L / tmp));
+				fflush(stdout);
+				exit(-1);
+			}
+
 			fprintf(stderr, " %d",i);
 			fflush(stderr);
 			irqcount++;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-18 19:46 ` [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file Prarit Bhargava
@ 2015-03-18 20:05   ` John Stultz
  2015-03-19 18:24   ` Shuah Khan
  1 sibling, 0 replies; 14+ messages in thread
From: John Stultz @ 2015-03-18 20:05 UTC (permalink / raw)
  To: Prarit Bhargava
  Cc: lkml, Jon Corbet, rtc-linux, linux-doc, Alessandro Zummo, Shuah Khan

On Wed, Mar 18, 2015 at 12:46 PM, Prarit Bhargava <prarit@redhat.com> wrote:
> This patch splits rtc.txt into two separate files, one for the
> documentation itself, and the other for the rtctest.c file.  The rtctest
> file is moved into the kernel tools/testing/selftests/timers directory.
> This will make automated testing easier.  Note that the only difference in
> the rtc.txt file is that the location of the rtctest.c file has changed.
>
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> Cc: corbet@lwn.net
> Cc: rtc-linux@googlegroups.com
> Cc: linux-doc@vger.kernel.org
> Cc: a.zummo@towertech.it
> Cc: prarit@redhat.com
> Cc: john.stultz@linaro.org
> Cc: shuahkh@osg.samsung.com
>
> ---
>  Documentation/rtc.txt                    | 264 +------------------------------
>  tools/testing/selftests/timers/Makefile  |   3 +-
>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>  3 files changed, 261 insertions(+), 264 deletions(-)
>  create mode 100644 tools/testing/selftests/timers/rtctest.c

Acked-by: John Stultz <john.stultz@linaro.org>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/2 v2] tools, update rtctest.c to verify passage of time
  2015-03-18 19:46 ` [PATCH 2/2 v2] tools, update rtctest.c to verify passage of time Prarit Bhargava
@ 2015-03-18 20:08   ` John Stultz
  0 siblings, 0 replies; 14+ messages in thread
From: John Stultz @ 2015-03-18 20:08 UTC (permalink / raw)
  To: Prarit Bhargava
  Cc: lkml, Jon Corbet, rtc-linux, linux-doc, Alessandro Zummo, Shuah Khan

On Wed, Mar 18, 2015 at 12:46 PM, Prarit Bhargava <prarit@redhat.com> wrote:
> rtctest.c checks to see if PIE is functioning by testing if 20 interrupts occur
> at rates from 2HZ to 64HZ.  While this check is good, it does not check to
> see if the correct amount of time has actually passed.  This misses
> situations where the RTC may be operating at a higher or lower frequency
> than expected.
>
> This patch introduces a simple check to verify if the time passed is
> less than 10% of what was programmed into the RTC.
>
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> Cc: corbet@lwn.net
> Cc: rtc-linux@googlegroups.com
> Cc: linux-doc@vger.kernel.org
> Cc: a.zummo@towertech.it
> Cc: prarit@redhat.com
> Cc: john.stultz@linaro.org
> Cc: shuahkh@osg.samsung.com


Acked-by: John Stultz <john.stultz@linaro.org>

thanks
-john

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-18 19:46 ` [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file Prarit Bhargava
  2015-03-18 20:05   ` John Stultz
@ 2015-03-19 18:24   ` Shuah Khan
  2015-03-19 19:00     ` John Stultz
  2015-03-19 20:25     ` Jonathan Corbet
  1 sibling, 2 replies; 14+ messages in thread
From: Shuah Khan @ 2015-03-19 18:24 UTC (permalink / raw)
  To: corbet
  Cc: Prarit Bhargava, linux-kernel, rtc-linux, linux-doc, a.zummo,
	john.stultz, Shuah Khan

On 03/18/2015 01:46 PM, Prarit Bhargava wrote:
> This patch splits rtc.txt into two separate files, one for the
> documentation itself, and the other for the rtctest.c file.  The rtctest
> file is moved into the kernel tools/testing/selftests/timers directory.
> This will make automated testing easier.  Note that the only difference in
> the rtc.txt file is that the location of the rtctest.c file has changed.
> 
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> Cc: corbet@lwn.net
> Cc: rtc-linux@googlegroups.com
> Cc: linux-doc@vger.kernel.org
> Cc: a.zummo@towertech.it
> Cc: prarit@redhat.com
> Cc: john.stultz@linaro.org
> Cc: shuahkh@osg.samsung.com
> 
> ---
>  Documentation/rtc.txt                    | 264 +------------------------------
>  tools/testing/selftests/timers/Makefile  |   3 +-
>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>  3 files changed, 261 insertions(+), 264 deletions(-)
>  create mode 100644 tools/testing/selftests/timers/rtctest.c

Hi Jon,

Would you like to review the change and Ack it, so I can
take the change in my tree.

thanks,
-- Shuah


-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 18:24   ` Shuah Khan
@ 2015-03-19 19:00     ` John Stultz
  2015-03-19 19:25       ` Shuah Khan
  2015-03-19 20:25     ` Jonathan Corbet
  1 sibling, 1 reply; 14+ messages in thread
From: John Stultz @ 2015-03-19 19:00 UTC (permalink / raw)
  To: Shuah Khan
  Cc: Jon Corbet, Prarit Bhargava, lkml, rtc-linux, linux-doc,
	Alessandro Zummo

On Thu, Mar 19, 2015 at 11:24 AM, Shuah Khan <shuahkh@osg.samsung.com> wrote:
> On 03/18/2015 01:46 PM, Prarit Bhargava wrote:
>> This patch splits rtc.txt into two separate files, one for the
>> documentation itself, and the other for the rtctest.c file.  The rtctest
>> file is moved into the kernel tools/testing/selftests/timers directory.
>> This will make automated testing easier.  Note that the only difference in
>> the rtc.txt file is that the location of the rtctest.c file has changed.
>>
>> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
>> Cc: corbet@lwn.net
>> Cc: rtc-linux@googlegroups.com
>> Cc: linux-doc@vger.kernel.org
>> Cc: a.zummo@towertech.it
>> Cc: prarit@redhat.com
>> Cc: john.stultz@linaro.org
>> Cc: shuahkh@osg.samsung.com
>>
>> ---
>>  Documentation/rtc.txt                    | 264 +------------------------------
>>  tools/testing/selftests/timers/Makefile  |   3 +-
>>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>>  3 files changed, 261 insertions(+), 264 deletions(-)
>>  create mode 100644 tools/testing/selftests/timers/rtctest.c
>
> Hi Jon,
>
> Would you like to review the change and Ack it, so I can
> take the change in my tree.

So you should already have acks on both of these in your mail box, but
to save you time digging through:
  Acked-by: John Stultz <john.stultz@linaro.org>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 19:00     ` John Stultz
@ 2015-03-19 19:25       ` Shuah Khan
  0 siblings, 0 replies; 14+ messages in thread
From: Shuah Khan @ 2015-03-19 19:25 UTC (permalink / raw)
  To: John Stultz
  Cc: Jon Corbet, Prarit Bhargava, lkml, rtc-linux, linux-doc,
	Alessandro Zummo

On 03/19/2015 01:00 PM, John Stultz wrote:
> On Thu, Mar 19, 2015 at 11:24 AM, Shuah Khan <shuahkh@osg.samsung.com> wrote:
>> On 03/18/2015 01:46 PM, Prarit Bhargava wrote:
>>> This patch splits rtc.txt into two separate files, one for the
>>> documentation itself, and the other for the rtctest.c file.  The rtctest
>>> file is moved into the kernel tools/testing/selftests/timers directory.
>>> This will make automated testing easier.  Note that the only difference in
>>> the rtc.txt file is that the location of the rtctest.c file has changed.
>>>
>>> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
>>> Cc: corbet@lwn.net
>>> Cc: rtc-linux@googlegroups.com
>>> Cc: linux-doc@vger.kernel.org
>>> Cc: a.zummo@towertech.it
>>> Cc: prarit@redhat.com
>>> Cc: john.stultz@linaro.org
>>> Cc: shuahkh@osg.samsung.com
>>>
>>> ---
>>>  Documentation/rtc.txt                    | 264 +------------------------------
>>>  tools/testing/selftests/timers/Makefile  |   3 +-
>>>  tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
>>>  3 files changed, 261 insertions(+), 264 deletions(-)
>>>  create mode 100644 tools/testing/selftests/timers/rtctest.c
>>
>> Hi Jon,
>>
>> Would you like to review the change and Ack it, so I can
>> take the change in my tree.
> 
> So you should already have acks on both of these in your mail box, but
> to save you time digging through:
>   Acked-by: John Stultz <john.stultz@linaro.org>
> 

John,

Thanks I have yours. I looking to get an Ack from Jon Corbet for the
documentation change.

-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 18:24   ` Shuah Khan
  2015-03-19 19:00     ` John Stultz
@ 2015-03-19 20:25     ` Jonathan Corbet
  2015-03-19 20:27       ` Shuah Khan
  1 sibling, 1 reply; 14+ messages in thread
From: Jonathan Corbet @ 2015-03-19 20:25 UTC (permalink / raw)
  To: Shuah Khan
  Cc: Prarit Bhargava, linux-kernel, rtc-linux, linux-doc, a.zummo,
	john.stultz

On Thu, 19 Mar 2015 12:24:41 -0600
Shuah Khan <shuahkh@osg.samsung.com> wrote:

> Hi Jon,
> 
> Would you like to review the change and Ack it, so I can
> take the change in my tree.

I'd sure like to move more stuff out of the top-level Documentation/
directory, but that's no reason to hold this up. 

Acked-by: Jonathan Corbet <corbet@lwn.net>

I'll assume you're taking it from here.

Thanks,

jon

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 20:25     ` Jonathan Corbet
@ 2015-03-19 20:27       ` Shuah Khan
  2015-03-19 21:36         ` Shuah Khan
  0 siblings, 1 reply; 14+ messages in thread
From: Shuah Khan @ 2015-03-19 20:27 UTC (permalink / raw)
  To: Jonathan Corbet
  Cc: Prarit Bhargava, linux-kernel, rtc-linux, linux-doc, a.zummo,
	john.stultz, Shuah Khan

On 03/19/2015 02:25 PM, Jonathan Corbet wrote:
> On Thu, 19 Mar 2015 12:24:41 -0600
> Shuah Khan <shuahkh@osg.samsung.com> wrote:
> 
>> Hi Jon,
>>
>> Would you like to review the change and Ack it, so I can
>> take the change in my tree.
> 
> I'd sure like to move more stuff out of the top-level Documentation/
> directory, but that's no reason to hold this up. 
> 
> Acked-by: Jonathan Corbet <corbet@lwn.net>
> 
> I'll assume you're taking it from here.
> 
> Thanks,
> 


Thanks. Yes I will take these through kselftest tree.

-- Shuah


-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 20:27       ` Shuah Khan
@ 2015-03-19 21:36         ` Shuah Khan
  2015-03-20 10:51           ` Prarit Bhargava
  2015-03-23 20:32           ` Prarit Bhargava
  0 siblings, 2 replies; 14+ messages in thread
From: Shuah Khan @ 2015-03-19 21:36 UTC (permalink / raw)
  To: Prarit Bhargava
  Cc: Jonathan Corbet, linux-kernel, rtc-linux, linux-doc, a.zummo,
	john.stultz, Shuah Khan

On 03/19/2015 02:27 PM, Shuah Khan wrote:
> On 03/19/2015 02:25 PM, Jonathan Corbet wrote:
>> On Thu, 19 Mar 2015 12:24:41 -0600
>> Shuah Khan <shuahkh@osg.samsung.com> wrote:
>>
>>> Hi Jon,
>>>
>>> Would you like to review the change and Ack it, so I can
>>> take the change in my tree.
>>
>> I'd sure like to move more stuff out of the top-level Documentation/
>> directory, but that's no reason to hold this up. 
>>
>> Acked-by: Jonathan Corbet <corbet@lwn.net>
>>
>> I'll assume you're taking it from here.
>>
>> Thanks,
>>
> 

Hi Prarit,

Could you please rebase this patch on linux-kselftest next?
I applied a patch that adds timer tests to common logic for
run_tests and install. This patch changed timer Makefile and
your patch conflicts with it. It would be easier to rebase
than fix the conflict.

There is no need to rebase the second patch. Just this one.

thanks,
-- Shuah


-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 21:36         ` Shuah Khan
@ 2015-03-20 10:51           ` Prarit Bhargava
  2015-03-23 20:32           ` Prarit Bhargava
  1 sibling, 0 replies; 14+ messages in thread
From: Prarit Bhargava @ 2015-03-20 10:51 UTC (permalink / raw)
  To: Jonathan Corbet
  Cc: Shuah Khan, linux-kernel, rtc-linux, linux-doc, a.zummo, john.stultz



On 03/19/2015 05:36 PM, Shuah Khan wrote:
> On 03/19/2015 02:27 PM, Shuah Khan wrote:
>> On 03/19/2015 02:25 PM, Jonathan Corbet wrote:
>>> On Thu, 19 Mar 2015 12:24:41 -0600
>>> Shuah Khan <shuahkh@osg.samsung.com> wrote:
>>>
>>>> Hi Jon,
>>>>
>>>> Would you like to review the change and Ack it, so I can
>>>> take the change in my tree.
>>>
>>> I'd sure like to move more stuff out of the top-level Documentation/
>>> directory, but that's no reason to hold this up. 
>>>
>>> Acked-by: Jonathan Corbet <corbet@lwn.net>
>>>
>>> I'll assume you're taking it from here.
>>>
>>> Thanks,
>>>
>>
> 
> Hi Prarit,
> 
> Could you please rebase this patch on linux-kselftest next?
> I applied a patch that adds timer tests to common logic for
> run_tests and install. This patch changed timer Makefile and
> your patch conflicts with it. It would be easier to rebase
> than fix the conflict.
> 
> There is no need to rebase the second patch. Just this one.

Sure, no problem.

Jon Corbet -- since I need to respin, you mentioned earlier that you didn't want
the rtc.txt file in the Documentation/ directory.  Do you want me to also at the
same time move it to Documentation/timers/rtc.txt ?

P.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-19 21:36         ` Shuah Khan
  2015-03-20 10:51           ` Prarit Bhargava
@ 2015-03-23 20:32           ` Prarit Bhargava
  2015-03-25  4:25             ` Shuah Khan
  1 sibling, 1 reply; 14+ messages in thread
From: Prarit Bhargava @ 2015-03-23 20:32 UTC (permalink / raw)
  To: linux-kernel
  Cc: Prarit Bhargava, corbet, rtc-linux, linux-doc, a.zummo,
	john.stultz, shuahkh

This patch splits rtc.txt into two separate files, one for the
documentation itself, and the other for the rtctest.c file.  The rtctest
file is moved into the kernel tools/testing/selftests/timers directory.
This will make automated testing easier.  Note that the only difference in
the rtc.txt file is that the location of the rtctest.c file has changed.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: corbet@lwn.net
Cc: rtc-linux@googlegroups.com
Cc: linux-doc@vger.kernel.org
Cc: a.zummo@towertech.it
Cc: prarit@redhat.com
Cc: john.stultz@linaro.org
Cc: shuahkh@osg.samsung.com

[v2]: rebase
[v3]: rebase
---
 Documentation/rtc.txt                    | 264 +------------------------------
 tools/testing/selftests/timers/Makefile  |   2 +-
 tools/testing/selftests/timers/rtctest.c | 258 ++++++++++++++++++++++++++++++
 3 files changed, 260 insertions(+), 264 deletions(-)
 create mode 100644 tools/testing/selftests/timers/rtctest.c

diff --git a/Documentation/rtc.txt b/Documentation/rtc.txt
index 596b60c..8446f1e 100644
--- a/Documentation/rtc.txt
+++ b/Documentation/rtc.txt
@@ -204,266 +204,4 @@ Some common examples:
 
     *	RTC_PIE_ON, RTC_PIE_OFF: These are also emulated by the generic code.
 
-If all else fails, check out the rtc-test.c driver!
-
-
--------------------- 8< ---------------- 8< -----------------------------
-
-/*
- *      Real Time Clock Driver Test/Example Program
- *
- *      Compile with:
- *		     gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest
- *
- *      Copyright (C) 1996, Paul Gortmaker.
- *
- *      Released under the GNU General Public License, version 2,
- *      included herein by reference.
- *
- */
-
-#include <stdio.h>
-#include <linux/rtc.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-
-
-/*
- * This expects the new RTC class driver framework, working with
- * clocks that will often not be clones of what the PC-AT had.
- * Use the command line to specify another RTC if you need one.
- */
-static const char default_rtc[] = "/dev/rtc0";
-
-
-int main(int argc, char **argv)
-{
-	int i, fd, retval, irqcount = 0;
-	unsigned long tmp, data;
-	struct rtc_time rtc_tm;
-	const char *rtc = default_rtc;
-
-	switch (argc) {
-	case 2:
-		rtc = argv[1];
-		/* FALLTHROUGH */
-	case 1:
-		break;
-	default:
-		fprintf(stderr, "usage:  rtctest [rtcdev]\n");
-		return 1;
-	}
-
-	fd = open(rtc, O_RDONLY);
-
-	if (fd ==  -1) {
-		perror(rtc);
-		exit(errno);
-	}
-
-	fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n");
-
-	/* Turn on update interrupts (one per second) */
-	retval = ioctl(fd, RTC_UIE_ON, 0);
-	if (retval == -1) {
-		if (errno == ENOTTY) {
-			fprintf(stderr,
-				"\n...Update IRQs not supported.\n");
-			goto test_READ;
-		}
-		perror("RTC_UIE_ON ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:",
-			rtc);
-	fflush(stderr);
-	for (i=1; i<6; i++) {
-		/* This read will block */
-		retval = read(fd, &data, sizeof(unsigned long));
-		if (retval == -1) {
-			perror("read");
-			exit(errno);
-		}
-		fprintf(stderr, " %d",i);
-		fflush(stderr);
-		irqcount++;
-	}
-
-	fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
-	fflush(stderr);
-	for (i=1; i<6; i++) {
-		struct timeval tv = {5, 0};     /* 5 second timeout on select */
-		fd_set readfds;
-
-		FD_ZERO(&readfds);
-		FD_SET(fd, &readfds);
-		/* The select will wait until an RTC interrupt happens. */
-		retval = select(fd+1, &readfds, NULL, NULL, &tv);
-		if (retval == -1) {
-		        perror("select");
-		        exit(errno);
-		}
-		/* This read won't block unlike the select-less case above. */
-		retval = read(fd, &data, sizeof(unsigned long));
-		if (retval == -1) {
-		        perror("read");
-		        exit(errno);
-		}
-		fprintf(stderr, " %d",i);
-		fflush(stderr);
-		irqcount++;
-	}
-
-	/* Turn off update interrupts */
-	retval = ioctl(fd, RTC_UIE_OFF, 0);
-	if (retval == -1) {
-		perror("RTC_UIE_OFF ioctl");
-		exit(errno);
-	}
-
-test_READ:
-	/* Read the RTC time/date */
-	retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
-	if (retval == -1) {
-		perror("RTC_RD_TIME ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
-		rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
-		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
-
-	/* Set the alarm to 5 sec in the future, and check for rollover */
-	rtc_tm.tm_sec += 5;
-	if (rtc_tm.tm_sec >= 60) {
-		rtc_tm.tm_sec %= 60;
-		rtc_tm.tm_min++;
-	}
-	if (rtc_tm.tm_min == 60) {
-		rtc_tm.tm_min = 0;
-		rtc_tm.tm_hour++;
-	}
-	if (rtc_tm.tm_hour == 24)
-		rtc_tm.tm_hour = 0;
-
-	retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
-	if (retval == -1) {
-		if (errno == ENOTTY) {
-			fprintf(stderr,
-				"\n...Alarm IRQs not supported.\n");
-			goto test_PIE;
-		}
-		perror("RTC_ALM_SET ioctl");
-		exit(errno);
-	}
-
-	/* Read the current alarm settings */
-	retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
-	if (retval == -1) {
-		perror("RTC_ALM_READ ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n",
-		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
-
-	/* Enable alarm interrupts */
-	retval = ioctl(fd, RTC_AIE_ON, 0);
-	if (retval == -1) {
-		perror("RTC_AIE_ON ioctl");
-		exit(errno);
-	}
-
-	fprintf(stderr, "Waiting 5 seconds for alarm...");
-	fflush(stderr);
-	/* This blocks until the alarm ring causes an interrupt */
-	retval = read(fd, &data, sizeof(unsigned long));
-	if (retval == -1) {
-		perror("read");
-		exit(errno);
-	}
-	irqcount++;
-	fprintf(stderr, " okay. Alarm rang.\n");
-
-	/* Disable alarm interrupts */
-	retval = ioctl(fd, RTC_AIE_OFF, 0);
-	if (retval == -1) {
-		perror("RTC_AIE_OFF ioctl");
-		exit(errno);
-	}
-
-test_PIE:
-	/* Read periodic IRQ rate */
-	retval = ioctl(fd, RTC_IRQP_READ, &tmp);
-	if (retval == -1) {
-		/* not all RTCs support periodic IRQs */
-		if (errno == ENOTTY) {
-			fprintf(stderr, "\nNo periodic IRQ support\n");
-			goto done;
-		}
-		perror("RTC_IRQP_READ ioctl");
-		exit(errno);
-	}
-	fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
-
-	fprintf(stderr, "Counting 20 interrupts at:");
-	fflush(stderr);
-
-	/* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */
-	for (tmp=2; tmp<=64; tmp*=2) {
-
-		retval = ioctl(fd, RTC_IRQP_SET, tmp);
-		if (retval == -1) {
-			/* not all RTCs can change their periodic IRQ rate */
-			if (errno == ENOTTY) {
-				fprintf(stderr,
-					"\n...Periodic IRQ rate is fixed\n");
-				goto done;
-			}
-			perror("RTC_IRQP_SET ioctl");
-			exit(errno);
-		}
-
-		fprintf(stderr, "\n%ldHz:\t", tmp);
-		fflush(stderr);
-
-		/* Enable periodic interrupts */
-		retval = ioctl(fd, RTC_PIE_ON, 0);
-		if (retval == -1) {
-			perror("RTC_PIE_ON ioctl");
-			exit(errno);
-		}
-
-		for (i=1; i<21; i++) {
-			/* This blocks */
-			retval = read(fd, &data, sizeof(unsigned long));
-			if (retval == -1) {
-				perror("read");
-				exit(errno);
-			}
-			fprintf(stderr, " %d",i);
-			fflush(stderr);
-			irqcount++;
-		}
-
-		/* Disable periodic interrupts */
-		retval = ioctl(fd, RTC_PIE_OFF, 0);
-		if (retval == -1) {
-			perror("RTC_PIE_OFF ioctl");
-			exit(errno);
-		}
-	}
-
-done:
-	fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n");
-
-	close(fd);
-
-	return 0;
-}
+If all else fails, check out the tools/testing/selftests/timers/rtctest.c test!
diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 670aebd..89a3f44 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -6,7 +6,7 @@ LDFLAGS += -lrt -lpthread
 # these are all "safe" tests that don't modify
 # system time or require escalated privledges
 TEST_PROGS = posix_timers nanosleep nsleep-lat set-timer-lat mqueue-lat \
-	     inconsistency-check raw_skew threadtest
+	     inconsistency-check raw_skew threadtest rtctest
 
 TEST_PROGS_EXTENDED = alarmtimer-suspend valid-adjtimex change_skew \
 		      skew_consistency clocksource-switch leap-a-day \
diff --git a/tools/testing/selftests/timers/rtctest.c b/tools/testing/selftests/timers/rtctest.c
new file mode 100644
index 0000000..1e06f46
--- /dev/null
+++ b/tools/testing/selftests/timers/rtctest.c
@@ -0,0 +1,258 @@
+/*
+ *      Real Time Clock Driver Test/Example Program
+ *
+ *      Compile with:
+ *		     gcc -s -Wall -Wstrict-prototypes rtctest.c -o rtctest
+ *
+ *      Copyright (C) 1996, Paul Gortmaker.
+ *
+ *      Released under the GNU General Public License, version 2,
+ *      included herein by reference.
+ *
+ */
+
+#include <stdio.h>
+#include <linux/rtc.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+
+/*
+ * This expects the new RTC class driver framework, working with
+ * clocks that will often not be clones of what the PC-AT had.
+ * Use the command line to specify another RTC if you need one.
+ */
+static const char default_rtc[] = "/dev/rtc0";
+
+
+int main(int argc, char **argv)
+{
+	int i, fd, retval, irqcount = 0;
+	unsigned long tmp, data;
+	struct rtc_time rtc_tm;
+	const char *rtc = default_rtc;
+
+	switch (argc) {
+	case 2:
+		rtc = argv[1];
+		/* FALLTHROUGH */
+	case 1:
+		break;
+	default:
+		fprintf(stderr, "usage:  rtctest [rtcdev]\n");
+		return 1;
+	}
+
+	fd = open(rtc, O_RDONLY);
+
+	if (fd ==  -1) {
+		perror(rtc);
+		exit(errno);
+	}
+
+	fprintf(stderr, "\n\t\t\tRTC Driver Test Example.\n\n");
+
+	/* Turn on update interrupts (one per second) */
+	retval = ioctl(fd, RTC_UIE_ON, 0);
+	if (retval == -1) {
+		if (errno == ENOTTY) {
+			fprintf(stderr,
+				"\n...Update IRQs not supported.\n");
+			goto test_READ;
+		}
+		perror("RTC_UIE_ON ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Counting 5 update (1/sec) interrupts from reading %s:",
+			rtc);
+	fflush(stderr);
+	for (i=1; i<6; i++) {
+		/* This read will block */
+		retval = read(fd, &data, sizeof(unsigned long));
+		if (retval == -1) {
+			perror("read");
+			exit(errno);
+		}
+		fprintf(stderr, " %d",i);
+		fflush(stderr);
+		irqcount++;
+	}
+
+	fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
+	fflush(stderr);
+	for (i=1; i<6; i++) {
+		struct timeval tv = {5, 0};     /* 5 second timeout on select */
+		fd_set readfds;
+
+		FD_ZERO(&readfds);
+		FD_SET(fd, &readfds);
+		/* The select will wait until an RTC interrupt happens. */
+		retval = select(fd+1, &readfds, NULL, NULL, &tv);
+		if (retval == -1) {
+		        perror("select");
+		        exit(errno);
+		}
+		/* This read won't block unlike the select-less case above. */
+		retval = read(fd, &data, sizeof(unsigned long));
+		if (retval == -1) {
+		        perror("read");
+		        exit(errno);
+		}
+		fprintf(stderr, " %d",i);
+		fflush(stderr);
+		irqcount++;
+	}
+
+	/* Turn off update interrupts */
+	retval = ioctl(fd, RTC_UIE_OFF, 0);
+	if (retval == -1) {
+		perror("RTC_UIE_OFF ioctl");
+		exit(errno);
+	}
+
+test_READ:
+	/* Read the RTC time/date */
+	retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
+	if (retval == -1) {
+		perror("RTC_RD_TIME ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
+		rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,
+		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+
+	/* Set the alarm to 5 sec in the future, and check for rollover */
+	rtc_tm.tm_sec += 5;
+	if (rtc_tm.tm_sec >= 60) {
+		rtc_tm.tm_sec %= 60;
+		rtc_tm.tm_min++;
+	}
+	if (rtc_tm.tm_min == 60) {
+		rtc_tm.tm_min = 0;
+		rtc_tm.tm_hour++;
+	}
+	if (rtc_tm.tm_hour == 24)
+		rtc_tm.tm_hour = 0;
+
+	retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
+	if (retval == -1) {
+		if (errno == ENOTTY) {
+			fprintf(stderr,
+				"\n...Alarm IRQs not supported.\n");
+			goto test_PIE;
+		}
+		perror("RTC_ALM_SET ioctl");
+		exit(errno);
+	}
+
+	/* Read the current alarm settings */
+	retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
+	if (retval == -1) {
+		perror("RTC_ALM_READ ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Alarm time now set to %02d:%02d:%02d.\n",
+		rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+
+	/* Enable alarm interrupts */
+	retval = ioctl(fd, RTC_AIE_ON, 0);
+	if (retval == -1) {
+		perror("RTC_AIE_ON ioctl");
+		exit(errno);
+	}
+
+	fprintf(stderr, "Waiting 5 seconds for alarm...");
+	fflush(stderr);
+	/* This blocks until the alarm ring causes an interrupt */
+	retval = read(fd, &data, sizeof(unsigned long));
+	if (retval == -1) {
+		perror("read");
+		exit(errno);
+	}
+	irqcount++;
+	fprintf(stderr, " okay. Alarm rang.\n");
+
+	/* Disable alarm interrupts */
+	retval = ioctl(fd, RTC_AIE_OFF, 0);
+	if (retval == -1) {
+		perror("RTC_AIE_OFF ioctl");
+		exit(errno);
+	}
+
+test_PIE:
+	/* Read periodic IRQ rate */
+	retval = ioctl(fd, RTC_IRQP_READ, &tmp);
+	if (retval == -1) {
+		/* not all RTCs support periodic IRQs */
+		if (errno == ENOTTY) {
+			fprintf(stderr, "\nNo periodic IRQ support\n");
+			goto done;
+		}
+		perror("RTC_IRQP_READ ioctl");
+		exit(errno);
+	}
+	fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
+
+	fprintf(stderr, "Counting 20 interrupts at:");
+	fflush(stderr);
+
+	/* The frequencies 128Hz, 256Hz, ... 8192Hz are only allowed for root. */
+	for (tmp=2; tmp<=64; tmp*=2) {
+
+		retval = ioctl(fd, RTC_IRQP_SET, tmp);
+		if (retval == -1) {
+			/* not all RTCs can change their periodic IRQ rate */
+			if (errno == ENOTTY) {
+				fprintf(stderr,
+					"\n...Periodic IRQ rate is fixed\n");
+				goto done;
+			}
+			perror("RTC_IRQP_SET ioctl");
+			exit(errno);
+		}
+
+		fprintf(stderr, "\n%ldHz:\t", tmp);
+		fflush(stderr);
+
+		/* Enable periodic interrupts */
+		retval = ioctl(fd, RTC_PIE_ON, 0);
+		if (retval == -1) {
+			perror("RTC_PIE_ON ioctl");
+			exit(errno);
+		}
+
+		for (i=1; i<21; i++) {
+			/* This blocks */
+			retval = read(fd, &data, sizeof(unsigned long));
+			if (retval == -1) {
+				perror("read");
+				exit(errno);
+			}
+			fprintf(stderr, " %d",i);
+			fflush(stderr);
+			irqcount++;
+		}
+
+		/* Disable periodic interrupts */
+		retval = ioctl(fd, RTC_PIE_OFF, 0);
+		if (retval == -1) {
+			perror("RTC_PIE_OFF ioctl");
+			exit(errno);
+		}
+	}
+
+done:
+	fprintf(stderr, "\n\n\t\t\t *** Test complete ***\n");
+
+	close(fd);
+
+	return 0;
+}
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file
  2015-03-23 20:32           ` Prarit Bhargava
@ 2015-03-25  4:25             ` Shuah Khan
  0 siblings, 0 replies; 14+ messages in thread
From: Shuah Khan @ 2015-03-25  4:25 UTC (permalink / raw)
  To: Prarit Bhargava, linux-kernel
  Cc: corbet, rtc-linux, linux-doc, a.zummo, john.stultz

On 03/23/2015 02:32 PM, Prarit Bhargava wrote:
> This patch splits rtc.txt into two separate files, one for the
> documentation itself, and the other for the rtctest.c file.  The rtctest
> file is moved into the kernel tools/testing/selftests/timers directory.
> This will make automated testing easier.  Note that the only difference in
> the rtc.txt file is that the location of the rtctest.c file has changed.
> 
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> Cc: corbet@lwn.net
> Cc: rtc-linux@googlegroups.com
> Cc: linux-doc@vger.kernel.org
> Cc: a.zummo@towertech.it
> Cc: prarit@redhat.com
> Cc: john.stultz@linaro.org
> Cc: shuahkh@osg.samsung.com
> 

Applied this patch and 2/2 to linux-kselftest next for 4.1

thanks,
-- Shuah

-- 
Shuah Khan
Sr. Linux Kernel Developer
Open Source Innovation Group
Samsung Research America (Silicon Valley)
shuahkh@osg.samsung.com | (970) 217-8978

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2015-03-25  4:25 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-18 19:46 [PATCH 0/2 v2] Split Documentation/rtc.txt Prarit Bhargava
2015-03-18 19:46 ` [PATCH 1/2 v2] Documentation, split up rtc.txt into documentation and test file Prarit Bhargava
2015-03-18 20:05   ` John Stultz
2015-03-19 18:24   ` Shuah Khan
2015-03-19 19:00     ` John Stultz
2015-03-19 19:25       ` Shuah Khan
2015-03-19 20:25     ` Jonathan Corbet
2015-03-19 20:27       ` Shuah Khan
2015-03-19 21:36         ` Shuah Khan
2015-03-20 10:51           ` Prarit Bhargava
2015-03-23 20:32           ` Prarit Bhargava
2015-03-25  4:25             ` Shuah Khan
2015-03-18 19:46 ` [PATCH 2/2 v2] tools, update rtctest.c to verify passage of time Prarit Bhargava
2015-03-18 20:08   ` John Stultz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.