diff options
author | Min-wuk Lee <mlee@nvidia.com> | 2010-02-22 18:07:39 -0800 |
---|---|---|
committer | Gary King <gking@nvidia.com> | 2010-05-23 14:42:51 -0700 |
commit | ccb4e22ef0deee7e66e2ef4787a9a9dacae08824 (patch) | |
tree | d7164df4d8e5a27ed8f371a53b499c7e08318303 /fs | |
parent | 16a062121c89c63b54905b9caa590ec9105fb88e (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
Diffstat (limited to 'fs')
-rwxr-xr-x[-rw-r--r--] | fs/proc/Makefile | 1 | ||||
-rw-r--r-- | fs/proc/tegra_bootarg.c | 173 |
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); |