xref: /openbmc/linux/tools/testing/selftests/media_tests/media_device_test.c (revision 3eb66e91a25497065c5322b1268cbc3953642227)
1a4f0e38eSShuah Khan // SPDX-License-Identifier: GPL-2.0
2a4f0e38eSShuah Khan 
39d22f6e1SShuah Khan /*
4e9c0d44fSShuah Khan  * media_device_test.c - Media Controller Device ioctl loop Test
59d22f6e1SShuah Khan  *
69d22f6e1SShuah Khan  * Copyright (c) 2016 Shuah Khan <shuahkh@osg.samsung.com>
79d22f6e1SShuah Khan  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
89d22f6e1SShuah Khan  *
99d22f6e1SShuah Khan  */
109d22f6e1SShuah Khan 
119d22f6e1SShuah Khan /*
129d22f6e1SShuah Khan  * This file adds a test for Media Controller API.
139d22f6e1SShuah Khan  * This test should be run as root and should not be
149d22f6e1SShuah Khan  * included in the Kselftest run. This test should be
159d22f6e1SShuah Khan  * run when hardware and driver that makes use Media
169d22f6e1SShuah Khan  * Controller API are present in the system.
179d22f6e1SShuah Khan  *
189d22f6e1SShuah Khan  * This test opens user specified Media Device and calls
199d22f6e1SShuah Khan  * MEDIA_IOC_DEVICE_INFO ioctl in a loop once every 10
209d22f6e1SShuah Khan  * seconds.
219d22f6e1SShuah Khan  *
229d22f6e1SShuah Khan  * Usage:
236accd8e9SShuah Khan  *	sudo ./media_device_test -d /dev/mediaX
249d22f6e1SShuah Khan  *
259d22f6e1SShuah Khan  *	While test is running, remove the device and
269d22f6e1SShuah Khan  *	ensure there are no use after free errors and
279d22f6e1SShuah Khan  *	other Oops in the dmesg. Enable KaSan kernel
289d22f6e1SShuah Khan  *	config option for use-after-free error detection.
299d22f6e1SShuah Khan */
309d22f6e1SShuah Khan 
319d22f6e1SShuah Khan #include <stdio.h>
329d22f6e1SShuah Khan #include <unistd.h>
339d22f6e1SShuah Khan #include <stdlib.h>
349d22f6e1SShuah Khan #include <errno.h>
359d22f6e1SShuah Khan #include <string.h>
369d22f6e1SShuah Khan #include <fcntl.h>
379d22f6e1SShuah Khan #include <sys/ioctl.h>
389d22f6e1SShuah Khan #include <sys/stat.h>
39e9c0d44fSShuah Khan #include <time.h>
409d22f6e1SShuah Khan #include <linux/media.h>
419d22f6e1SShuah Khan 
42*11381286SShuah Khan (Samsung OSG) #include "../kselftest.h"
43*11381286SShuah Khan (Samsung OSG) 
main(int argc,char ** argv)449d22f6e1SShuah Khan int main(int argc, char **argv)
459d22f6e1SShuah Khan {
469d22f6e1SShuah Khan 	int opt;
479d22f6e1SShuah Khan 	char media_device[256];
48e9c0d44fSShuah Khan 	int count;
499d22f6e1SShuah Khan 	struct media_device_info mdi;
509d22f6e1SShuah Khan 	int ret;
519d22f6e1SShuah Khan 	int fd;
529d22f6e1SShuah Khan 
539d22f6e1SShuah Khan 	if (argc < 2) {
549d22f6e1SShuah Khan 		printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
559d22f6e1SShuah Khan 		exit(-1);
569d22f6e1SShuah Khan 	}
579d22f6e1SShuah Khan 
589d22f6e1SShuah Khan 	/* Process arguments */
599d22f6e1SShuah Khan 	while ((opt = getopt(argc, argv, "d:")) != -1) {
609d22f6e1SShuah Khan 		switch (opt) {
619d22f6e1SShuah Khan 		case 'd':
629d22f6e1SShuah Khan 			strncpy(media_device, optarg, sizeof(media_device) - 1);
639d22f6e1SShuah Khan 			media_device[sizeof(media_device)-1] = '\0';
649d22f6e1SShuah Khan 			break;
659d22f6e1SShuah Khan 		default:
669d22f6e1SShuah Khan 			printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
679d22f6e1SShuah Khan 			exit(-1);
689d22f6e1SShuah Khan 		}
699d22f6e1SShuah Khan 	}
709d22f6e1SShuah Khan 
71*11381286SShuah Khan (Samsung OSG) 	if (getuid() != 0)
72*11381286SShuah Khan (Samsung OSG) 		ksft_exit_skip("Please run the test as root - Exiting.\n");
739d22f6e1SShuah Khan 
74e9c0d44fSShuah Khan 	/* Generate random number of interations */
75e9c0d44fSShuah Khan 	srand((unsigned int) time(NULL));
76e9c0d44fSShuah Khan 	count = rand();
77e9c0d44fSShuah Khan 
789d22f6e1SShuah Khan 	/* Open Media device and keep it open */
799d22f6e1SShuah Khan 	fd = open(media_device, O_RDWR);
809d22f6e1SShuah Khan 	if (fd == -1) {
819d22f6e1SShuah Khan 		printf("Media Device open errno %s\n", strerror(errno));
829d22f6e1SShuah Khan 		exit(-1);
839d22f6e1SShuah Khan 	}
849d22f6e1SShuah Khan 
859d22f6e1SShuah Khan 	printf("\nNote:\n"
869d22f6e1SShuah Khan 	       "While test is running, remove the device and\n"
879d22f6e1SShuah Khan 	       "ensure there are no use after free errors and\n"
889d22f6e1SShuah Khan 	       "other Oops in the dmesg. Enable KaSan kernel\n"
899d22f6e1SShuah Khan 	       "config option for use-after-free error detection.\n\n");
909d22f6e1SShuah Khan 
9116378efaSColin Ian King 	printf("Running test for %d iterations\n", count);
92e9c0d44fSShuah Khan 
93e9c0d44fSShuah Khan 	while (count > 0) {
949d22f6e1SShuah Khan 		ret = ioctl(fd, MEDIA_IOC_DEVICE_INFO, &mdi);
959d22f6e1SShuah Khan 		if (ret < 0)
969d22f6e1SShuah Khan 			printf("Media Device Info errno %s\n", strerror(errno));
9736d3f7d8SShuah Khan 		else
98e9c0d44fSShuah Khan 			printf("Media device model %s driver %s - count %d\n",
99e9c0d44fSShuah Khan 				mdi.model, mdi.driver, count);
1009d22f6e1SShuah Khan 		sleep(10);
101e9c0d44fSShuah Khan 		count--;
1029d22f6e1SShuah Khan 	}
1039d22f6e1SShuah Khan }
104