summaryrefslogtreecommitdiff
path: root/fs/proc/tegra_bootarg.c
blob: 4147a323cbaeccea19ae4d4a824029042a64e082 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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);