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