summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMin-wuk Lee <mlee@nvidia.com>2010-02-22 18:07:39 -0800
committerGary King <gking@nvidia.com>2010-02-24 14:29:29 -0800
commitb9976e304f288a37b3eb9894a89e9c49eb57ee1a (patch)
tree54442ceb0ea9837b6576814177345466da3d5490
parent925c037911e668c838b55ab26ad6ccb9e08acfc6 (diff)
procfs: add tegra bootarg directory tree
add a procfs directory to reflect tegra ATAGs to user-space, so that user-space components which require information originating from the bootloader(e.g., display parameters for seamless display transitions) can be supported. bug 645228 Change-Id: I3447d3e92e920042810b402b3efe8629b7f4da5e
-rwxr-xr-x[-rw-r--r--]fs/proc/Makefile1
-rw-r--r--fs/proc/tegra_bootarg.c180
2 files changed, 181 insertions, 0 deletions
diff --git a/fs/proc/Makefile b/fs/proc/Makefile
index 63d965193b22..80efda30fa3d 100644..100755
--- a/fs/proc/Makefile
+++ b/fs/proc/Makefile
@@ -18,6 +18,7 @@ proc-y += meminfo.o
proc-y += stat.o
proc-y += uptime.o
proc-y += version.o
+proc-$(CONFIG_ARCH_TEGRA) += tegra_bootarg.o
proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o
proc-$(CONFIG_NET) += proc_net.o
proc-$(CONFIG_PROC_KCORE) += kcore.o
diff --git a/fs/proc/tegra_bootarg.c b/fs/proc/tegra_bootarg.c
new file mode 100644
index 000000000000..286481210648
--- /dev/null
+++ b/fs/proc/tegra_bootarg.c
@@ -0,0 +1,180 @@
+/*
+ * fs/proc/tegra_bootarg.c
+ *
+ * A procfs to reflect tegra ATAGs to user-space
+ *
+ * Copyright (c) 2010, NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/proc_fs.h>
+#include <linux/sched.h>
+#include <asm/uaccess.h>
+#include <linux/tegra_devices.h>
+#include "nvos.h"
+#include "nvcommon.h"
+#include "nvassert.h"
+#include "nvbootargs.h"
+
+#define BOOT_ARGUMENTS "bootarg"
+#define MODULE_DISP "disp"
+
+#define DISP_CONTROLLER "Controller"
+#define DISP_DEV_INDEX "DisplayDeviceIndex"
+#define DISP_BENABLED "bEnabled"
+
+static struct proc_dir_entry *tegra_bootarg_dir;
+static struct proc_dir_entry *disp_dir;
+
+static struct proc_dir_entry *disp_arg_controller;
+static struct proc_dir_entry *disp_arg_dev_index;
+static struct proc_dir_entry *disp_arg_benabled;
+
+static int proc_read_disp_controller(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ int len;
+ NvBootArgsDisplay NvBootArgDisp;
+ NvError return_v;
+
+ return_v = NvOsBootArgGet(NvBootArgKey_Display,
+ &NvBootArgDisp, sizeof(NvBootArgsDisplay));
+
+ if (return_v!=NvSuccess) {
+ pr_err("%s: fail to get boot_arg_disp\n", __func__);
+ return 0;
+ }
+ len = snprintf(page, count, "%u\n", NvBootArgDisp.Controller);
+ return len;
+}
+
+static int proc_read_dev_index(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ int len;
+ NvBootArgsDisplay NvBootArgDisp;
+ NvError return_v;
+
+ return_v = NvOsBootArgGet(NvBootArgKey_Display,
+ &NvBootArgDisp, sizeof(NvBootArgsDisplay));
+
+ if (return_v!=NvSuccess) {
+ pr_err("%s: fail to get boot_arg_disp\n", __func__);
+ return 0;
+ }
+ len = snprintf(page, count, "%u\n", NvBootArgDisp.DisplayDeviceIndex);
+ return len;
+}
+
+static int proc_read_benabled(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ int len;
+ NvBootArgsDisplay NvBootArgDisp;
+ NvError return_v;
+
+ return_v = NvOsBootArgGet(NvBootArgKey_Display,
+ &NvBootArgDisp, sizeof(NvBootArgsDisplay));
+
+ if (return_v!=NvSuccess) {
+ pr_err("%s: fail to get boot_arg_disp\n", __func__);
+ return 0;
+ }
+ len = snprintf(page, count, "%u\n", (NvU32)(NvBootArgDisp.bEnabled));
+
+ return len;
+}
+
+static int __init tegra_bootarg_init(void)
+{
+ int rv = 0;
+
+ tegra_bootarg_dir = proc_mkdir(BOOT_ARGUMENTS, NULL);
+ if (tegra_bootarg_dir == NULL) {
+ rv = -ENOMEM;
+ pr_err("%s: mkdir _proc_bootarg failure\n", __func__);
+ return rv;
+ }
+ tegra_bootarg_dir->owner = THIS_MODULE;
+
+ /*build up a display boot argument directory*/
+ disp_dir = proc_mkdir(MODULE_DISP, tegra_bootarg_dir);
+ if (disp_dir == NULL) {
+ rv = -ENOMEM;
+ pr_err("%s: mkdir _proc_bootarg_disp failure\n", __func__);
+ remove_proc_entry(BOOT_ARGUMENTS, NULL);
+ return rv;
+ }
+ disp_dir->owner = THIS_MODULE;
+
+ /*build up each field of display boot argument as a different file*/
+
+ /* 1. DISP_CONTROLLER*/
+ /*0444 is from S_IRUSR|S_IRGRP|S_IROTH*/
+ disp_arg_controller =
+ create_proc_read_entry(DISP_CONTROLLER, 0444, disp_dir,
+ proc_read_disp_controller, NULL);
+ if (disp_arg_controller == NULL) {
+ rv = -ENOMEM;
+ pr_err("%s: read entry failure of disp_arg_controller\n", __func__);
+ remove_proc_entry(MODULE_DISP, tegra_bootarg_dir);
+ remove_proc_entry(BOOT_ARGUMENTS, NULL);
+ return rv;
+ }
+ disp_arg_controller->owner = THIS_MODULE;
+
+ /* 2. DISP_DEV_INDEX*/
+ disp_arg_dev_index =
+ create_proc_read_entry(DISP_DEV_INDEX, 0444, disp_dir,
+ proc_read_dev_index, NULL);
+ if (disp_arg_dev_index == NULL) {
+ rv = -ENOMEM;
+ pr_err("%s: read entry failure of disp_arg_dev_index\n", __func__);
+ remove_proc_entry(MODULE_DISP, tegra_bootarg_dir);
+ remove_proc_entry(BOOT_ARGUMENTS, NULL);
+ return rv;
+ }
+ disp_arg_dev_index->owner = THIS_MODULE;
+
+ /* 3. DISP_BENABLED*/
+ disp_arg_benabled =
+ create_proc_read_entry(DISP_BENABLED, 0444, disp_dir,
+ proc_read_benabled, NULL);
+ if (disp_arg_benabled == NULL) {
+ rv = -ENOMEM;
+ pr_err("%s: read entry failure of disp_arg_benabled\n", __func__);
+ remove_proc_entry(MODULE_DISP, tegra_bootarg_dir);
+ remove_proc_entry(BOOT_ARGUMENTS, NULL);
+ return rv;
+ }
+ disp_arg_benabled->owner = THIS_MODULE;
+
+ /*If everything is OK, return zero*/
+ return 0;
+
+}
+
+static void __exit tegra_bootarg_deinit(void)
+{
+ remove_proc_entry(MODULE_DISP, tegra_bootarg_dir);
+ remove_proc_entry(BOOT_ARGUMENTS, NULL);
+}
+
+module_init(tegra_bootarg_init);
+module_exit(tegra_bootarg_deinit);