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-05-23 14:42:51 -0700
commitccb4e22ef0deee7e66e2ef4787a9a9dacae08824 (patch)
treed7164df4d8e5a27ed8f371a53b499c7e08318303
parent16a062121c89c63b54905b9caa590ec9105fb88e (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: I1abd9eeeed8a82b0d387fc7a7ed4d481a7b96adb
-rwxr-xr-x[-rw-r--r--]fs/proc/Makefile1
-rw-r--r--fs/proc/tegra_bootarg.c173
2 files changed, 174 insertions, 0 deletions
diff --git a/fs/proc/Makefile b/fs/proc/Makefile
index 11a7b5c68153..f9ed74a55b4f 100644..100755
--- a/fs/proc/Makefile
+++ b/fs/proc/Makefile
@@ -19,6 +19,7 @@ proc-y += stat.o
proc-y += uptime.o
proc-y += version.o
proc-y += softirqs.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..4147a323cbae
--- /dev/null
+++ b/fs/proc/tegra_bootarg.c
@@ -0,0 +1,173 @@
+/*
+ * 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.
+ */
+
+#define NV_DEBUG 0
+
+#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 "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;
+ }
+
+ /*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;
+ }
+
+ /*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;
+ }
+
+ /* 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;
+ }
+
+ /* 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;
+ }
+
+ /*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);