diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-10 20:42:53 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-10 20:42:53 -0500 |
commit | 506c10f26c481b7f8ef27c1c79290f68989b2e9e (patch) | |
tree | 03de82e812f00957aa6276dac2fe51c3358e88d7 /include | |
parent | e1df957670aef74ffd9a4ad93e6d2c90bf6b4845 (diff) | |
parent | c59765042f53a79a7a65585042ff463b69cb248c (diff) |
Merge commit 'v2.6.29-rc1' into perfcounters/core
Conflicts:
include/linux/kernel_stat.h
Diffstat (limited to 'include')
489 files changed, 13799 insertions, 21647 deletions
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h deleted file mode 100644 index 29feee27f0ea..000000000000 --- a/include/acpi/acconfig.h +++ /dev/null | |||
@@ -1,217 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acconfig.h - Global configuration constants | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef _ACCONFIG_H | ||
45 | #define _ACCONFIG_H | ||
46 | |||
47 | /****************************************************************************** | ||
48 | * | ||
49 | * Configuration options | ||
50 | * | ||
51 | *****************************************************************************/ | ||
52 | |||
53 | /* | ||
54 | * ACPI_DEBUG_OUTPUT - This switch enables all the debug facilities of the | ||
55 | * ACPI subsystem. This includes the DEBUG_PRINT output | ||
56 | * statements. When disabled, all DEBUG_PRINT | ||
57 | * statements are compiled out. | ||
58 | * | ||
59 | * ACPI_APPLICATION - Use this switch if the subsystem is going to be run | ||
60 | * at the application level. | ||
61 | * | ||
62 | */ | ||
63 | |||
64 | /* Current ACPICA subsystem version in YYYYMMDD format */ | ||
65 | |||
66 | #define ACPI_CA_VERSION 0x20080926 | ||
67 | |||
68 | /* | ||
69 | * OS name, used for the _OS object. The _OS object is essentially obsolete, | ||
70 | * but there is a large base of ASL/AML code in existing machines that check | ||
71 | * for the string below. The use of this string usually guarantees that | ||
72 | * the ASL will execute down the most tested code path. Also, there is some | ||
73 | * code that will not execute the _OSI method unless _OS matches the string | ||
74 | * below. Therefore, change this string at your own risk. | ||
75 | */ | ||
76 | #define ACPI_OS_NAME "Microsoft Windows NT" | ||
77 | |||
78 | /* Maximum objects in the various object caches */ | ||
79 | |||
80 | #define ACPI_MAX_STATE_CACHE_DEPTH 96 /* State objects */ | ||
81 | #define ACPI_MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */ | ||
82 | #define ACPI_MAX_EXTPARSE_CACHE_DEPTH 96 /* Parse tree objects */ | ||
83 | #define ACPI_MAX_OBJECT_CACHE_DEPTH 96 /* Interpreter operand objects */ | ||
84 | #define ACPI_MAX_NAMESPACE_CACHE_DEPTH 96 /* Namespace objects */ | ||
85 | |||
86 | /* | ||
87 | * Should the subsystem abort the loading of an ACPI table if the | ||
88 | * table checksum is incorrect? | ||
89 | */ | ||
90 | #define ACPI_CHECKSUM_ABORT FALSE | ||
91 | |||
92 | /****************************************************************************** | ||
93 | * | ||
94 | * Subsystem Constants | ||
95 | * | ||
96 | *****************************************************************************/ | ||
97 | |||
98 | /* Version of ACPI supported */ | ||
99 | |||
100 | #define ACPI_CA_SUPPORT_LEVEL 3 | ||
101 | |||
102 | /* Maximum count for a semaphore object */ | ||
103 | |||
104 | #define ACPI_MAX_SEMAPHORE_COUNT 256 | ||
105 | |||
106 | /* Maximum object reference count (detects object deletion issues) */ | ||
107 | |||
108 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 | ||
109 | |||
110 | /* Size of cached memory mapping for system memory operation region */ | ||
111 | |||
112 | #define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096 | ||
113 | |||
114 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ | ||
115 | |||
116 | #define ACPI_NUM_OWNERID_MASKS 8 | ||
117 | |||
118 | /* Size of the root table array is increased by this increment */ | ||
119 | |||
120 | #define ACPI_ROOT_TABLE_SIZE_INCREMENT 4 | ||
121 | |||
122 | /****************************************************************************** | ||
123 | * | ||
124 | * ACPI Specification constants (Do not change unless the specification changes) | ||
125 | * | ||
126 | *****************************************************************************/ | ||
127 | |||
128 | /* Number of distinct GPE register blocks and register width */ | ||
129 | |||
130 | #define ACPI_MAX_GPE_BLOCKS 2 | ||
131 | #define ACPI_GPE_REGISTER_WIDTH 8 | ||
132 | |||
133 | /* Method info (in WALK_STATE), containing local variables and argumetns */ | ||
134 | |||
135 | #define ACPI_METHOD_NUM_LOCALS 8 | ||
136 | #define ACPI_METHOD_MAX_LOCAL 7 | ||
137 | |||
138 | #define ACPI_METHOD_NUM_ARGS 7 | ||
139 | #define ACPI_METHOD_MAX_ARG 6 | ||
140 | |||
141 | /* Length of _HID, _UID, _CID, and UUID values */ | ||
142 | |||
143 | #define ACPI_DEVICE_ID_LENGTH 0x09 | ||
144 | #define ACPI_MAX_CID_LENGTH 48 | ||
145 | #define ACPI_UUID_LENGTH 16 | ||
146 | |||
147 | /* | ||
148 | * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG | ||
149 | */ | ||
150 | #define ACPI_OBJ_NUM_OPERANDS 8 | ||
151 | #define ACPI_OBJ_MAX_OPERAND 7 | ||
152 | |||
153 | /* Number of elements in the Result Stack frame, can be an arbitrary value */ | ||
154 | |||
155 | #define ACPI_RESULTS_FRAME_OBJ_NUM 8 | ||
156 | |||
157 | /* | ||
158 | * Maximal number of elements the Result Stack can contain, | ||
159 | * it may be an arbitray value not exceeding the types of | ||
160 | * result_size and result_count (now u8). | ||
161 | */ | ||
162 | #define ACPI_RESULTS_OBJ_NUM_MAX 255 | ||
163 | |||
164 | /* Names within the namespace are 4 bytes long */ | ||
165 | |||
166 | #define ACPI_NAME_SIZE 4 | ||
167 | #define ACPI_PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 char for separator */ | ||
168 | #define ACPI_PATH_SEPARATOR '.' | ||
169 | |||
170 | /* Sizes for ACPI table headers */ | ||
171 | |||
172 | #define ACPI_OEM_ID_SIZE 6 | ||
173 | #define ACPI_OEM_TABLE_ID_SIZE 8 | ||
174 | |||
175 | /* Constants used in searching for the RSDP in low memory */ | ||
176 | |||
177 | #define ACPI_EBDA_PTR_LOCATION 0x0000040E /* Physical Address */ | ||
178 | #define ACPI_EBDA_PTR_LENGTH 2 | ||
179 | #define ACPI_EBDA_WINDOW_SIZE 1024 | ||
180 | #define ACPI_HI_RSDP_WINDOW_BASE 0x000E0000 /* Physical Address */ | ||
181 | #define ACPI_HI_RSDP_WINDOW_SIZE 0x00020000 | ||
182 | #define ACPI_RSDP_SCAN_STEP 16 | ||
183 | |||
184 | /* Operation regions */ | ||
185 | |||
186 | #define ACPI_NUM_PREDEFINED_REGIONS 8 | ||
187 | #define ACPI_USER_REGION_BEGIN 0x80 | ||
188 | |||
189 | /* Maximum space_ids for Operation Regions */ | ||
190 | |||
191 | #define ACPI_MAX_ADDRESS_SPACE 255 | ||
192 | |||
193 | /* Array sizes. Used for range checking also */ | ||
194 | |||
195 | #define ACPI_MAX_MATCH_OPCODE 5 | ||
196 | |||
197 | /* RSDP checksums */ | ||
198 | |||
199 | #define ACPI_RSDP_CHECKSUM_LENGTH 20 | ||
200 | #define ACPI_RSDP_XCHECKSUM_LENGTH 36 | ||
201 | |||
202 | /* SMBus bidirectional buffer size */ | ||
203 | |||
204 | #define ACPI_SMBUS_BUFFER_SIZE 34 | ||
205 | |||
206 | /****************************************************************************** | ||
207 | * | ||
208 | * ACPI AML Debugger | ||
209 | * | ||
210 | *****************************************************************************/ | ||
211 | |||
212 | #define ACPI_DEBUGGER_MAX_ARGS 8 /* Must be max method args + 1 */ | ||
213 | |||
214 | #define ACPI_DEBUGGER_COMMAND_PROMPT '-' | ||
215 | #define ACPI_DEBUGGER_EXECUTE_PROMPT '%' | ||
216 | |||
217 | #endif /* _ACCONFIG_H */ | ||
diff --git a/include/acpi/acdebug.h b/include/acpi/acdebug.h deleted file mode 100644 index 62c59df3b86c..000000000000 --- a/include/acpi/acdebug.h +++ /dev/null | |||
@@ -1,231 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acdebug.h - ACPI/AML debugger | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACDEBUG_H__ | ||
45 | #define __ACDEBUG_H__ | ||
46 | |||
47 | #define ACPI_DEBUG_BUFFER_SIZE 4196 | ||
48 | |||
49 | struct command_info { | ||
50 | char *name; /* Command Name */ | ||
51 | u8 min_args; /* Minimum arguments required */ | ||
52 | }; | ||
53 | |||
54 | struct argument_info { | ||
55 | char *name; /* Argument Name */ | ||
56 | }; | ||
57 | |||
58 | #define PARAM_LIST(pl) pl | ||
59 | #define DBTEST_OUTPUT_LEVEL(lvl) if (acpi_gbl_db_opt_verbose) | ||
60 | #define VERBOSE_PRINT(fp) DBTEST_OUTPUT_LEVEL(lvl) {\ | ||
61 | acpi_os_printf PARAM_LIST(fp);} | ||
62 | |||
63 | #define EX_NO_SINGLE_STEP 1 | ||
64 | #define EX_SINGLE_STEP 2 | ||
65 | |||
66 | /* | ||
67 | * dbxface - external debugger interfaces | ||
68 | */ | ||
69 | acpi_status acpi_db_initialize(void); | ||
70 | |||
71 | void acpi_db_terminate(void); | ||
72 | |||
73 | acpi_status | ||
74 | acpi_db_single_step(struct acpi_walk_state *walk_state, | ||
75 | union acpi_parse_object *op, u32 op_type); | ||
76 | |||
77 | /* | ||
78 | * dbcmds - debug commands and output routines | ||
79 | */ | ||
80 | acpi_status acpi_db_disassemble_method(char *name); | ||
81 | |||
82 | void acpi_db_display_table_info(char *table_arg); | ||
83 | |||
84 | void acpi_db_unload_acpi_table(char *table_arg, char *instance_arg); | ||
85 | |||
86 | void | ||
87 | acpi_db_set_method_breakpoint(char *location, | ||
88 | struct acpi_walk_state *walk_state, | ||
89 | union acpi_parse_object *op); | ||
90 | |||
91 | void acpi_db_set_method_call_breakpoint(union acpi_parse_object *op); | ||
92 | |||
93 | void acpi_db_get_bus_info(void); | ||
94 | |||
95 | void acpi_db_disassemble_aml(char *statements, union acpi_parse_object *op); | ||
96 | |||
97 | void acpi_db_dump_namespace(char *start_arg, char *depth_arg); | ||
98 | |||
99 | void acpi_db_dump_namespace_by_owner(char *owner_arg, char *depth_arg); | ||
100 | |||
101 | void acpi_db_send_notify(char *name, u32 value); | ||
102 | |||
103 | void acpi_db_set_method_data(char *type_arg, char *index_arg, char *value_arg); | ||
104 | |||
105 | acpi_status | ||
106 | acpi_db_display_objects(char *obj_type_arg, char *display_count_arg); | ||
107 | |||
108 | acpi_status acpi_db_find_name_in_namespace(char *name_arg); | ||
109 | |||
110 | void acpi_db_set_scope(char *name); | ||
111 | |||
112 | acpi_status acpi_db_sleep(char *object_arg); | ||
113 | |||
114 | void acpi_db_find_references(char *object_arg); | ||
115 | |||
116 | void acpi_db_display_locks(void); | ||
117 | |||
118 | void acpi_db_display_resources(char *object_arg); | ||
119 | |||
120 | void acpi_db_display_gpes(void); | ||
121 | |||
122 | void acpi_db_check_integrity(void); | ||
123 | |||
124 | void acpi_db_generate_gpe(char *gpe_arg, char *block_arg); | ||
125 | |||
126 | void acpi_db_check_predefined_names(void); | ||
127 | |||
128 | void acpi_db_batch_execute(void); | ||
129 | |||
130 | /* | ||
131 | * dbdisply - debug display commands | ||
132 | */ | ||
133 | void acpi_db_display_method_info(union acpi_parse_object *op); | ||
134 | |||
135 | void acpi_db_decode_and_display_object(char *target, char *output_type); | ||
136 | |||
137 | void | ||
138 | acpi_db_display_result_object(union acpi_operand_object *obj_desc, | ||
139 | struct acpi_walk_state *walk_state); | ||
140 | |||
141 | acpi_status acpi_db_display_all_methods(char *display_count_arg); | ||
142 | |||
143 | void acpi_db_display_arguments(void); | ||
144 | |||
145 | void acpi_db_display_locals(void); | ||
146 | |||
147 | void acpi_db_display_results(void); | ||
148 | |||
149 | void acpi_db_display_calling_tree(void); | ||
150 | |||
151 | void acpi_db_display_object_type(char *object_arg); | ||
152 | |||
153 | void | ||
154 | acpi_db_display_argument_object(union acpi_operand_object *obj_desc, | ||
155 | struct acpi_walk_state *walk_state); | ||
156 | |||
157 | void acpi_db_check_predefined_names(void); | ||
158 | |||
159 | void acpi_db_batch_execute(void); | ||
160 | |||
161 | /* | ||
162 | * dbexec - debugger control method execution | ||
163 | */ | ||
164 | void acpi_db_execute(char *name, char **args, u32 flags); | ||
165 | |||
166 | void | ||
167 | acpi_db_create_execution_threads(char *num_threads_arg, | ||
168 | char *num_loops_arg, char *method_name_arg); | ||
169 | |||
170 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | ||
171 | u32 acpi_db_get_cache_info(struct acpi_memory_list *cache); | ||
172 | #endif | ||
173 | |||
174 | /* | ||
175 | * dbfileio - Debugger file I/O commands | ||
176 | */ | ||
177 | acpi_object_type | ||
178 | acpi_db_match_argument(char *user_argument, struct argument_info *arguments); | ||
179 | |||
180 | void acpi_db_close_debug_file(void); | ||
181 | |||
182 | void acpi_db_open_debug_file(char *name); | ||
183 | |||
184 | acpi_status acpi_db_load_acpi_table(char *filename); | ||
185 | |||
186 | acpi_status | ||
187 | acpi_db_get_table_from_file(char *filename, struct acpi_table_header **table); | ||
188 | |||
189 | acpi_status | ||
190 | acpi_db_read_table_from_file(char *filename, struct acpi_table_header **table); | ||
191 | |||
192 | /* | ||
193 | * dbhistry - debugger HISTORY command | ||
194 | */ | ||
195 | void acpi_db_add_to_history(char *command_line); | ||
196 | |||
197 | void acpi_db_display_history(void); | ||
198 | |||
199 | char *acpi_db_get_from_history(char *command_num_arg); | ||
200 | |||
201 | /* | ||
202 | * dbinput - user front-end to the AML debugger | ||
203 | */ | ||
204 | acpi_status | ||
205 | acpi_db_command_dispatch(char *input_buffer, | ||
206 | struct acpi_walk_state *walk_state, | ||
207 | union acpi_parse_object *op); | ||
208 | |||
209 | void ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context); | ||
210 | |||
211 | /* | ||
212 | * dbstats - Generation and display of ACPI table statistics | ||
213 | */ | ||
214 | void acpi_db_generate_statistics(union acpi_parse_object *root, u8 is_method); | ||
215 | |||
216 | acpi_status acpi_db_display_statistics(char *type_arg); | ||
217 | |||
218 | /* | ||
219 | * dbutils - AML debugger utilities | ||
220 | */ | ||
221 | void acpi_db_set_output_destination(u32 where); | ||
222 | |||
223 | void acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level); | ||
224 | |||
225 | void acpi_db_prep_namestring(char *name); | ||
226 | |||
227 | struct acpi_namespace_node *acpi_db_local_ns_lookup(char *name); | ||
228 | |||
229 | void acpi_db_uint32_to_hex_string(u32 value, char *buffer); | ||
230 | |||
231 | #endif /* __ACDEBUG_H__ */ | ||
diff --git a/include/acpi/acdisasm.h b/include/acpi/acdisasm.h deleted file mode 100644 index 0c1ed387073c..000000000000 --- a/include/acpi/acdisasm.h +++ /dev/null | |||
@@ -1,445 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acdisasm.h - AML disassembler | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACDISASM_H__ | ||
45 | #define __ACDISASM_H__ | ||
46 | |||
47 | #include "amlresrc.h" | ||
48 | |||
49 | #define BLOCK_NONE 0 | ||
50 | #define BLOCK_PAREN 1 | ||
51 | #define BLOCK_BRACE 2 | ||
52 | #define BLOCK_COMMA_LIST 4 | ||
53 | #define ACPI_DEFAULT_RESNAME *(u32 *) "__RD" | ||
54 | |||
55 | struct acpi_external_list { | ||
56 | char *path; | ||
57 | char *internal_path; | ||
58 | struct acpi_external_list *next; | ||
59 | u32 value; | ||
60 | u16 length; | ||
61 | u8 type; | ||
62 | }; | ||
63 | |||
64 | extern struct acpi_external_list *acpi_gbl_external_list; | ||
65 | |||
66 | typedef const struct acpi_dmtable_info { | ||
67 | u8 opcode; | ||
68 | u8 offset; | ||
69 | char *name; | ||
70 | |||
71 | } acpi_dmtable_info; | ||
72 | |||
73 | /* | ||
74 | * Values for Opcode above. | ||
75 | * Note: 0-7 must not change, used as a flag shift value | ||
76 | */ | ||
77 | #define ACPI_DMT_FLAG0 0 | ||
78 | #define ACPI_DMT_FLAG1 1 | ||
79 | #define ACPI_DMT_FLAG2 2 | ||
80 | #define ACPI_DMT_FLAG3 3 | ||
81 | #define ACPI_DMT_FLAG4 4 | ||
82 | #define ACPI_DMT_FLAG5 5 | ||
83 | #define ACPI_DMT_FLAG6 6 | ||
84 | #define ACPI_DMT_FLAG7 7 | ||
85 | #define ACPI_DMT_FLAGS0 8 | ||
86 | #define ACPI_DMT_FLAGS2 9 | ||
87 | #define ACPI_DMT_UINT8 10 | ||
88 | #define ACPI_DMT_UINT16 11 | ||
89 | #define ACPI_DMT_UINT24 12 | ||
90 | #define ACPI_DMT_UINT32 13 | ||
91 | #define ACPI_DMT_UINT56 14 | ||
92 | #define ACPI_DMT_UINT64 15 | ||
93 | #define ACPI_DMT_STRING 16 | ||
94 | #define ACPI_DMT_NAME4 17 | ||
95 | #define ACPI_DMT_NAME6 18 | ||
96 | #define ACPI_DMT_NAME8 19 | ||
97 | #define ACPI_DMT_CHKSUM 20 | ||
98 | #define ACPI_DMT_SPACEID 21 | ||
99 | #define ACPI_DMT_GAS 22 | ||
100 | #define ACPI_DMT_ASF 23 | ||
101 | #define ACPI_DMT_DMAR 24 | ||
102 | #define ACPI_DMT_HEST 25 | ||
103 | #define ACPI_DMT_HESTNTFY 26 | ||
104 | #define ACPI_DMT_HESTNTYP 27 | ||
105 | #define ACPI_DMT_MADT 28 | ||
106 | #define ACPI_DMT_SRAT 29 | ||
107 | #define ACPI_DMT_EXIT 30 | ||
108 | #define ACPI_DMT_SIG 31 | ||
109 | |||
110 | typedef | ||
111 | void (*acpi_dmtable_handler) (struct acpi_table_header * table); | ||
112 | |||
113 | struct acpi_dmtable_data { | ||
114 | char *signature; | ||
115 | struct acpi_dmtable_info *table_info; | ||
116 | acpi_dmtable_handler table_handler; | ||
117 | char *name; | ||
118 | }; | ||
119 | |||
120 | struct acpi_op_walk_info { | ||
121 | u32 level; | ||
122 | u32 last_level; | ||
123 | u32 count; | ||
124 | u32 bit_offset; | ||
125 | u32 flags; | ||
126 | struct acpi_walk_state *walk_state; | ||
127 | }; | ||
128 | |||
129 | typedef | ||
130 | acpi_status(*asl_walk_callback) (union acpi_parse_object * op, | ||
131 | u32 level, void *context); | ||
132 | |||
133 | struct acpi_resource_tag { | ||
134 | u32 bit_index; | ||
135 | char *tag; | ||
136 | }; | ||
137 | |||
138 | /* Strings used for decoding flags to ASL keywords */ | ||
139 | |||
140 | extern const char *acpi_gbl_word_decode[]; | ||
141 | extern const char *acpi_gbl_irq_decode[]; | ||
142 | extern const char *acpi_gbl_lock_rule[]; | ||
143 | extern const char *acpi_gbl_access_types[]; | ||
144 | extern const char *acpi_gbl_update_rules[]; | ||
145 | extern const char *acpi_gbl_match_ops[]; | ||
146 | |||
147 | extern struct acpi_dmtable_info acpi_dm_table_info_asf0[]; | ||
148 | extern struct acpi_dmtable_info acpi_dm_table_info_asf1[]; | ||
149 | extern struct acpi_dmtable_info acpi_dm_table_info_asf1a[]; | ||
150 | extern struct acpi_dmtable_info acpi_dm_table_info_asf2[]; | ||
151 | extern struct acpi_dmtable_info acpi_dm_table_info_asf2a[]; | ||
152 | extern struct acpi_dmtable_info acpi_dm_table_info_asf3[]; | ||
153 | extern struct acpi_dmtable_info acpi_dm_table_info_asf4[]; | ||
154 | extern struct acpi_dmtable_info acpi_dm_table_info_asf_hdr[]; | ||
155 | extern struct acpi_dmtable_info acpi_dm_table_info_boot[]; | ||
156 | extern struct acpi_dmtable_info acpi_dm_table_info_bert[]; | ||
157 | extern struct acpi_dmtable_info acpi_dm_table_info_cpep[]; | ||
158 | extern struct acpi_dmtable_info acpi_dm_table_info_cpep0[]; | ||
159 | extern struct acpi_dmtable_info acpi_dm_table_info_dbgp[]; | ||
160 | extern struct acpi_dmtable_info acpi_dm_table_info_dmar[]; | ||
161 | extern struct acpi_dmtable_info acpi_dm_table_info_dmar_hdr[]; | ||
162 | extern struct acpi_dmtable_info acpi_dm_table_info_dmar_scope[]; | ||
163 | extern struct acpi_dmtable_info acpi_dm_table_info_dmar0[]; | ||
164 | extern struct acpi_dmtable_info acpi_dm_table_info_dmar1[]; | ||
165 | extern struct acpi_dmtable_info acpi_dm_table_info_dmar2[]; | ||
166 | extern struct acpi_dmtable_info acpi_dm_table_info_ecdt[]; | ||
167 | extern struct acpi_dmtable_info acpi_dm_table_info_einj[]; | ||
168 | extern struct acpi_dmtable_info acpi_dm_table_info_einj0[]; | ||
169 | extern struct acpi_dmtable_info acpi_dm_table_info_erst[]; | ||
170 | extern struct acpi_dmtable_info acpi_dm_table_info_facs[]; | ||
171 | extern struct acpi_dmtable_info acpi_dm_table_info_fadt1[]; | ||
172 | extern struct acpi_dmtable_info acpi_dm_table_info_fadt2[]; | ||
173 | extern struct acpi_dmtable_info acpi_dm_table_info_gas[]; | ||
174 | extern struct acpi_dmtable_info acpi_dm_table_info_header[]; | ||
175 | extern struct acpi_dmtable_info acpi_dm_table_info_hest[]; | ||
176 | extern struct acpi_dmtable_info acpi_dm_table_info_hest9[]; | ||
177 | extern struct acpi_dmtable_info acpi_dm_table_info_hest_notify[]; | ||
178 | extern struct acpi_dmtable_info acpi_dm_table_info_hpet[]; | ||
179 | extern struct acpi_dmtable_info acpi_dm_table_info_madt[]; | ||
180 | extern struct acpi_dmtable_info acpi_dm_table_info_madt0[]; | ||
181 | extern struct acpi_dmtable_info acpi_dm_table_info_madt1[]; | ||
182 | extern struct acpi_dmtable_info acpi_dm_table_info_madt2[]; | ||
183 | extern struct acpi_dmtable_info acpi_dm_table_info_madt3[]; | ||
184 | extern struct acpi_dmtable_info acpi_dm_table_info_madt4[]; | ||
185 | extern struct acpi_dmtable_info acpi_dm_table_info_madt5[]; | ||
186 | extern struct acpi_dmtable_info acpi_dm_table_info_madt6[]; | ||
187 | extern struct acpi_dmtable_info acpi_dm_table_info_madt7[]; | ||
188 | extern struct acpi_dmtable_info acpi_dm_table_info_madt8[]; | ||
189 | extern struct acpi_dmtable_info acpi_dm_table_info_madt9[]; | ||
190 | extern struct acpi_dmtable_info acpi_dm_table_info_madt10[]; | ||
191 | extern struct acpi_dmtable_info acpi_dm_table_info_madt_hdr[]; | ||
192 | extern struct acpi_dmtable_info acpi_dm_table_info_mcfg[]; | ||
193 | extern struct acpi_dmtable_info acpi_dm_table_info_mcfg0[]; | ||
194 | extern struct acpi_dmtable_info acpi_dm_table_info_rsdp1[]; | ||
195 | extern struct acpi_dmtable_info acpi_dm_table_info_rsdp2[]; | ||
196 | extern struct acpi_dmtable_info acpi_dm_table_info_sbst[]; | ||
197 | extern struct acpi_dmtable_info acpi_dm_table_info_slic[]; | ||
198 | extern struct acpi_dmtable_info acpi_dm_table_info_slit[]; | ||
199 | extern struct acpi_dmtable_info acpi_dm_table_info_spcr[]; | ||
200 | extern struct acpi_dmtable_info acpi_dm_table_info_spmi[]; | ||
201 | extern struct acpi_dmtable_info acpi_dm_table_info_srat[]; | ||
202 | extern struct acpi_dmtable_info acpi_dm_table_info_srat_hdr[]; | ||
203 | extern struct acpi_dmtable_info acpi_dm_table_info_srat0[]; | ||
204 | extern struct acpi_dmtable_info acpi_dm_table_info_srat1[]; | ||
205 | extern struct acpi_dmtable_info acpi_dm_table_info_srat2[]; | ||
206 | extern struct acpi_dmtable_info acpi_dm_table_info_tcpa[]; | ||
207 | extern struct acpi_dmtable_info acpi_dm_table_info_wdrt[]; | ||
208 | |||
209 | /* | ||
210 | * dmtable | ||
211 | */ | ||
212 | void acpi_dm_dump_data_table(struct acpi_table_header *table); | ||
213 | |||
214 | acpi_status | ||
215 | acpi_dm_dump_table(u32 table_length, | ||
216 | u32 table_offset, | ||
217 | void *table, | ||
218 | u32 sub_table_length, struct acpi_dmtable_info *info); | ||
219 | |||
220 | void acpi_dm_line_header(u32 offset, u32 byte_length, char *name); | ||
221 | |||
222 | void acpi_dm_line_header2(u32 offset, u32 byte_length, char *name, u32 value); | ||
223 | |||
224 | /* | ||
225 | * dmtbdump | ||
226 | */ | ||
227 | void acpi_dm_dump_asf(struct acpi_table_header *table); | ||
228 | |||
229 | void acpi_dm_dump_cpep(struct acpi_table_header *table); | ||
230 | |||
231 | void acpi_dm_dump_dmar(struct acpi_table_header *table); | ||
232 | |||
233 | void acpi_dm_dump_einj(struct acpi_table_header *table); | ||
234 | |||
235 | void acpi_dm_dump_erst(struct acpi_table_header *table); | ||
236 | |||
237 | void acpi_dm_dump_fadt(struct acpi_table_header *table); | ||
238 | |||
239 | void acpi_dm_dump_hest(struct acpi_table_header *table); | ||
240 | |||
241 | void acpi_dm_dump_mcfg(struct acpi_table_header *table); | ||
242 | |||
243 | void acpi_dm_dump_madt(struct acpi_table_header *table); | ||
244 | |||
245 | u32 acpi_dm_dump_rsdp(struct acpi_table_header *table); | ||
246 | |||
247 | void acpi_dm_dump_rsdt(struct acpi_table_header *table); | ||
248 | |||
249 | void acpi_dm_dump_slit(struct acpi_table_header *table); | ||
250 | |||
251 | void acpi_dm_dump_srat(struct acpi_table_header *table); | ||
252 | |||
253 | void acpi_dm_dump_xsdt(struct acpi_table_header *table); | ||
254 | |||
255 | /* | ||
256 | * dmwalk | ||
257 | */ | ||
258 | void | ||
259 | acpi_dm_disassemble(struct acpi_walk_state *walk_state, | ||
260 | union acpi_parse_object *origin, u32 num_opcodes); | ||
261 | |||
262 | void | ||
263 | acpi_dm_walk_parse_tree(union acpi_parse_object *op, | ||
264 | asl_walk_callback descending_callback, | ||
265 | asl_walk_callback ascending_callback, void *context); | ||
266 | |||
267 | /* | ||
268 | * dmopcode | ||
269 | */ | ||
270 | void | ||
271 | acpi_dm_disassemble_one_op(struct acpi_walk_state *walk_state, | ||
272 | struct acpi_op_walk_info *info, | ||
273 | union acpi_parse_object *op); | ||
274 | |||
275 | void acpi_dm_decode_internal_object(union acpi_operand_object *obj_desc); | ||
276 | |||
277 | u32 acpi_dm_list_type(union acpi_parse_object *op); | ||
278 | |||
279 | void acpi_dm_method_flags(union acpi_parse_object *op); | ||
280 | |||
281 | void acpi_dm_field_flags(union acpi_parse_object *op); | ||
282 | |||
283 | void acpi_dm_address_space(u8 space_id); | ||
284 | |||
285 | void acpi_dm_region_flags(union acpi_parse_object *op); | ||
286 | |||
287 | void acpi_dm_match_op(union acpi_parse_object *op); | ||
288 | |||
289 | u8 acpi_dm_comma_if_list_member(union acpi_parse_object *op); | ||
290 | |||
291 | void acpi_dm_comma_if_field_member(union acpi_parse_object *op); | ||
292 | |||
293 | /* | ||
294 | * dmnames | ||
295 | */ | ||
296 | u32 acpi_dm_dump_name(char *name); | ||
297 | |||
298 | acpi_status | ||
299 | acpi_ps_display_object_pathname(struct acpi_walk_state *walk_state, | ||
300 | union acpi_parse_object *op); | ||
301 | |||
302 | void acpi_dm_namestring(char *name); | ||
303 | |||
304 | /* | ||
305 | * dmobject | ||
306 | */ | ||
307 | void | ||
308 | acpi_dm_display_internal_object(union acpi_operand_object *obj_desc, | ||
309 | struct acpi_walk_state *walk_state); | ||
310 | |||
311 | void acpi_dm_display_arguments(struct acpi_walk_state *walk_state); | ||
312 | |||
313 | void acpi_dm_display_locals(struct acpi_walk_state *walk_state); | ||
314 | |||
315 | void | ||
316 | acpi_dm_dump_method_info(acpi_status status, | ||
317 | struct acpi_walk_state *walk_state, | ||
318 | union acpi_parse_object *op); | ||
319 | |||
320 | /* | ||
321 | * dmbuffer | ||
322 | */ | ||
323 | void acpi_dm_disasm_byte_list(u32 level, u8 * byte_data, u32 byte_count); | ||
324 | |||
325 | void | ||
326 | acpi_dm_byte_list(struct acpi_op_walk_info *info, union acpi_parse_object *op); | ||
327 | |||
328 | void acpi_dm_is_eisa_id(union acpi_parse_object *op); | ||
329 | |||
330 | void acpi_dm_eisa_id(u32 encoded_id); | ||
331 | |||
332 | u8 acpi_dm_is_unicode_buffer(union acpi_parse_object *op); | ||
333 | |||
334 | u8 acpi_dm_is_string_buffer(union acpi_parse_object *op); | ||
335 | |||
336 | /* | ||
337 | * dmresrc | ||
338 | */ | ||
339 | void acpi_dm_dump_integer8(u8 value, char *name); | ||
340 | |||
341 | void acpi_dm_dump_integer16(u16 value, char *name); | ||
342 | |||
343 | void acpi_dm_dump_integer32(u32 value, char *name); | ||
344 | |||
345 | void acpi_dm_dump_integer64(u64 value, char *name); | ||
346 | |||
347 | void | ||
348 | acpi_dm_resource_template(struct acpi_op_walk_info *info, | ||
349 | union acpi_parse_object *op, | ||
350 | u8 * byte_data, u32 byte_count); | ||
351 | |||
352 | acpi_status acpi_dm_is_resource_template(union acpi_parse_object *op); | ||
353 | |||
354 | void acpi_dm_indent(u32 level); | ||
355 | |||
356 | void acpi_dm_bit_list(u16 mask); | ||
357 | |||
358 | void acpi_dm_decode_attribute(u8 attribute); | ||
359 | |||
360 | void acpi_dm_descriptor_name(void); | ||
361 | |||
362 | /* | ||
363 | * dmresrcl | ||
364 | */ | ||
365 | void | ||
366 | acpi_dm_word_descriptor(union aml_resource *resource, u32 length, u32 level); | ||
367 | |||
368 | void | ||
369 | acpi_dm_dword_descriptor(union aml_resource *resource, u32 length, u32 level); | ||
370 | |||
371 | void | ||
372 | acpi_dm_extended_descriptor(union aml_resource *resource, | ||
373 | u32 length, u32 level); | ||
374 | |||
375 | void | ||
376 | acpi_dm_qword_descriptor(union aml_resource *resource, u32 length, u32 level); | ||
377 | |||
378 | void | ||
379 | acpi_dm_memory24_descriptor(union aml_resource *resource, | ||
380 | u32 length, u32 level); | ||
381 | |||
382 | void | ||
383 | acpi_dm_memory32_descriptor(union aml_resource *resource, | ||
384 | u32 length, u32 level); | ||
385 | |||
386 | void | ||
387 | acpi_dm_fixed_memory32_descriptor(union aml_resource *resource, | ||
388 | u32 length, u32 level); | ||
389 | |||
390 | void | ||
391 | acpi_dm_generic_register_descriptor(union aml_resource *resource, | ||
392 | u32 length, u32 level); | ||
393 | |||
394 | void | ||
395 | acpi_dm_interrupt_descriptor(union aml_resource *resource, | ||
396 | u32 length, u32 level); | ||
397 | |||
398 | void | ||
399 | acpi_dm_vendor_large_descriptor(union aml_resource *resource, | ||
400 | u32 length, u32 level); | ||
401 | |||
402 | void acpi_dm_vendor_common(char *name, u8 * byte_data, u32 length, u32 level); | ||
403 | |||
404 | /* | ||
405 | * dmresrcs | ||
406 | */ | ||
407 | void | ||
408 | acpi_dm_irq_descriptor(union aml_resource *resource, u32 length, u32 level); | ||
409 | |||
410 | void | ||
411 | acpi_dm_dma_descriptor(union aml_resource *resource, u32 length, u32 level); | ||
412 | |||
413 | void acpi_dm_io_descriptor(union aml_resource *resource, u32 length, u32 level); | ||
414 | |||
415 | void | ||
416 | acpi_dm_fixed_io_descriptor(union aml_resource *resource, | ||
417 | u32 length, u32 level); | ||
418 | |||
419 | void | ||
420 | acpi_dm_start_dependent_descriptor(union aml_resource *resource, | ||
421 | u32 length, u32 level); | ||
422 | |||
423 | void | ||
424 | acpi_dm_end_dependent_descriptor(union aml_resource *resource, | ||
425 | u32 length, u32 level); | ||
426 | |||
427 | void | ||
428 | acpi_dm_vendor_small_descriptor(union aml_resource *resource, | ||
429 | u32 length, u32 level); | ||
430 | |||
431 | /* | ||
432 | * dmutils | ||
433 | */ | ||
434 | void acpi_dm_add_to_external_list(char *path, u8 type, u32 value); | ||
435 | |||
436 | /* | ||
437 | * dmrestag | ||
438 | */ | ||
439 | void acpi_dm_find_resources(union acpi_parse_object *root); | ||
440 | |||
441 | void | ||
442 | acpi_dm_check_resource_reference(union acpi_parse_object *op, | ||
443 | struct acpi_walk_state *walk_state); | ||
444 | |||
445 | #endif /* __ACDISASM_H__ */ | ||
diff --git a/include/acpi/acdispat.h b/include/acpi/acdispat.h deleted file mode 100644 index 6291904be01e..000000000000 --- a/include/acpi/acdispat.h +++ /dev/null | |||
@@ -1,345 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acdispat.h - dispatcher (parser to interpreter interface) | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef _ACDISPAT_H_ | ||
45 | #define _ACDISPAT_H_ | ||
46 | |||
47 | #define NAMEOF_LOCAL_NTE "__L0" | ||
48 | #define NAMEOF_ARG_NTE "__A0" | ||
49 | |||
50 | /* | ||
51 | * dsopcode - support for late evaluation | ||
52 | */ | ||
53 | acpi_status | ||
54 | acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc); | ||
55 | |||
56 | acpi_status | ||
57 | acpi_ds_get_bank_field_arguments(union acpi_operand_object *obj_desc); | ||
58 | |||
59 | acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *rgn_desc); | ||
60 | |||
61 | acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc); | ||
62 | |||
63 | acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc); | ||
64 | |||
65 | acpi_status | ||
66 | acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, | ||
67 | union acpi_parse_object *op); | ||
68 | |||
69 | acpi_status | ||
70 | acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, | ||
71 | union acpi_parse_object *op); | ||
72 | |||
73 | acpi_status | ||
74 | acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state, | ||
75 | union acpi_parse_object *op); | ||
76 | |||
77 | acpi_status | ||
78 | acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state, | ||
79 | union acpi_parse_object *op, | ||
80 | union acpi_operand_object *obj_desc); | ||
81 | |||
82 | acpi_status | ||
83 | acpi_ds_eval_bank_field_operands(struct acpi_walk_state *walk_state, | ||
84 | union acpi_parse_object *op); | ||
85 | |||
86 | acpi_status acpi_ds_initialize_region(acpi_handle obj_handle); | ||
87 | |||
88 | /* | ||
89 | * dsctrl - Parser/Interpreter interface, control stack routines | ||
90 | */ | ||
91 | acpi_status | ||
92 | acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, | ||
93 | union acpi_parse_object *op); | ||
94 | |||
95 | acpi_status | ||
96 | acpi_ds_exec_end_control_op(struct acpi_walk_state *walk_state, | ||
97 | union acpi_parse_object *op); | ||
98 | |||
99 | /* | ||
100 | * dsexec - Parser/Interpreter interface, method execution callbacks | ||
101 | */ | ||
102 | acpi_status | ||
103 | acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, | ||
104 | union acpi_operand_object *result_obj); | ||
105 | |||
106 | acpi_status | ||
107 | acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, | ||
108 | union acpi_parse_object **out_op); | ||
109 | |||
110 | acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *state); | ||
111 | |||
112 | /* | ||
113 | * dsfield - Parser/Interpreter interface for AML fields | ||
114 | */ | ||
115 | acpi_status | ||
116 | acpi_ds_create_field(union acpi_parse_object *op, | ||
117 | struct acpi_namespace_node *region_node, | ||
118 | struct acpi_walk_state *walk_state); | ||
119 | |||
120 | acpi_status | ||
121 | acpi_ds_create_bank_field(union acpi_parse_object *op, | ||
122 | struct acpi_namespace_node *region_node, | ||
123 | struct acpi_walk_state *walk_state); | ||
124 | |||
125 | acpi_status | ||
126 | acpi_ds_create_index_field(union acpi_parse_object *op, | ||
127 | struct acpi_namespace_node *region_node, | ||
128 | struct acpi_walk_state *walk_state); | ||
129 | |||
130 | acpi_status | ||
131 | acpi_ds_create_buffer_field(union acpi_parse_object *op, | ||
132 | struct acpi_walk_state *walk_state); | ||
133 | |||
134 | acpi_status | ||
135 | acpi_ds_init_field_objects(union acpi_parse_object *op, | ||
136 | struct acpi_walk_state *walk_state); | ||
137 | |||
138 | /* | ||
139 | * dsload - Parser/Interpreter interface, namespace load callbacks | ||
140 | */ | ||
141 | acpi_status | ||
142 | acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state, | ||
143 | union acpi_parse_object **out_op); | ||
144 | |||
145 | acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state); | ||
146 | |||
147 | acpi_status | ||
148 | acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | ||
149 | union acpi_parse_object **out_op); | ||
150 | |||
151 | acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state); | ||
152 | |||
153 | acpi_status | ||
154 | acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number); | ||
155 | |||
156 | /* | ||
157 | * dsmthdat - method data (locals/args) | ||
158 | */ | ||
159 | acpi_status | ||
160 | acpi_ds_store_object_to_local(u8 type, | ||
161 | u32 index, | ||
162 | union acpi_operand_object *src_desc, | ||
163 | struct acpi_walk_state *walk_state); | ||
164 | |||
165 | acpi_status | ||
166 | acpi_ds_method_data_get_entry(u16 opcode, | ||
167 | u32 index, | ||
168 | struct acpi_walk_state *walk_state, | ||
169 | union acpi_operand_object ***node); | ||
170 | |||
171 | void acpi_ds_method_data_delete_all(struct acpi_walk_state *walk_state); | ||
172 | |||
173 | u8 acpi_ds_is_method_value(union acpi_operand_object *obj_desc); | ||
174 | |||
175 | acpi_status | ||
176 | acpi_ds_method_data_get_value(u8 type, | ||
177 | u32 index, | ||
178 | struct acpi_walk_state *walk_state, | ||
179 | union acpi_operand_object **dest_desc); | ||
180 | |||
181 | acpi_status | ||
182 | acpi_ds_method_data_init_args(union acpi_operand_object **params, | ||
183 | u32 max_param_count, | ||
184 | struct acpi_walk_state *walk_state); | ||
185 | |||
186 | acpi_status | ||
187 | acpi_ds_method_data_get_node(u8 type, | ||
188 | u32 index, | ||
189 | struct acpi_walk_state *walk_state, | ||
190 | struct acpi_namespace_node **node); | ||
191 | |||
192 | void acpi_ds_method_data_init(struct acpi_walk_state *walk_state); | ||
193 | |||
194 | /* | ||
195 | * dsmethod - Parser/Interpreter interface - control method parsing | ||
196 | */ | ||
197 | acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node); | ||
198 | |||
199 | acpi_status | ||
200 | acpi_ds_call_control_method(struct acpi_thread_state *thread, | ||
201 | struct acpi_walk_state *walk_state, | ||
202 | union acpi_parse_object *op); | ||
203 | |||
204 | acpi_status | ||
205 | acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, | ||
206 | union acpi_operand_object *return_desc); | ||
207 | |||
208 | void | ||
209 | acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, | ||
210 | struct acpi_walk_state *walk_state); | ||
211 | |||
212 | acpi_status | ||
213 | acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, | ||
214 | union acpi_operand_object *obj_desc, | ||
215 | struct acpi_walk_state *walk_state); | ||
216 | |||
217 | acpi_status | ||
218 | acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state); | ||
219 | |||
220 | /* | ||
221 | * dsinit | ||
222 | */ | ||
223 | acpi_status | ||
224 | acpi_ds_initialize_objects(u32 table_index, | ||
225 | struct acpi_namespace_node *start_node); | ||
226 | |||
227 | /* | ||
228 | * dsobject - Parser/Interpreter interface - object initialization and conversion | ||
229 | */ | ||
230 | acpi_status | ||
231 | acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, | ||
232 | union acpi_parse_object *op, | ||
233 | u32 buffer_length, | ||
234 | union acpi_operand_object **obj_desc_ptr); | ||
235 | |||
236 | acpi_status | ||
237 | acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | ||
238 | union acpi_parse_object *op, | ||
239 | u32 package_length, | ||
240 | union acpi_operand_object **obj_desc); | ||
241 | |||
242 | acpi_status | ||
243 | acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | ||
244 | union acpi_parse_object *op, | ||
245 | u16 opcode, union acpi_operand_object **obj_desc); | ||
246 | |||
247 | acpi_status | ||
248 | acpi_ds_create_node(struct acpi_walk_state *walk_state, | ||
249 | struct acpi_namespace_node *node, | ||
250 | union acpi_parse_object *op); | ||
251 | |||
252 | /* | ||
253 | * dsutils - Parser/Interpreter interface utility routines | ||
254 | */ | ||
255 | void acpi_ds_clear_implicit_return(struct acpi_walk_state *walk_state); | ||
256 | |||
257 | u8 | ||
258 | acpi_ds_do_implicit_return(union acpi_operand_object *return_desc, | ||
259 | struct acpi_walk_state *walk_state, | ||
260 | u8 add_reference); | ||
261 | |||
262 | u8 | ||
263 | acpi_ds_is_result_used(union acpi_parse_object *op, | ||
264 | struct acpi_walk_state *walk_state); | ||
265 | |||
266 | void | ||
267 | acpi_ds_delete_result_if_not_used(union acpi_parse_object *op, | ||
268 | union acpi_operand_object *result_obj, | ||
269 | struct acpi_walk_state *walk_state); | ||
270 | |||
271 | acpi_status | ||
272 | acpi_ds_create_operand(struct acpi_walk_state *walk_state, | ||
273 | union acpi_parse_object *arg, u32 args_remaining); | ||
274 | |||
275 | acpi_status | ||
276 | acpi_ds_create_operands(struct acpi_walk_state *walk_state, | ||
277 | union acpi_parse_object *first_arg); | ||
278 | |||
279 | acpi_status acpi_ds_resolve_operands(struct acpi_walk_state *walk_state); | ||
280 | |||
281 | void acpi_ds_clear_operands(struct acpi_walk_state *walk_state); | ||
282 | |||
283 | acpi_status acpi_ds_evaluate_name_path(struct acpi_walk_state *walk_state); | ||
284 | |||
285 | /* | ||
286 | * dswscope - Scope Stack manipulation | ||
287 | */ | ||
288 | acpi_status | ||
289 | acpi_ds_scope_stack_push(struct acpi_namespace_node *node, | ||
290 | acpi_object_type type, | ||
291 | struct acpi_walk_state *walk_state); | ||
292 | |||
293 | acpi_status acpi_ds_scope_stack_pop(struct acpi_walk_state *walk_state); | ||
294 | |||
295 | void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state); | ||
296 | |||
297 | /* | ||
298 | * dswstate - parser WALK_STATE management routines | ||
299 | */ | ||
300 | acpi_status | ||
301 | acpi_ds_obj_stack_push(void *object, struct acpi_walk_state *walk_state); | ||
302 | |||
303 | acpi_status | ||
304 | acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state *walk_state); | ||
305 | |||
306 | struct acpi_walk_state *acpi_ds_create_walk_state(acpi_owner_id owner_id, union acpi_parse_object | ||
307 | *origin, union acpi_operand_object | ||
308 | *mth_desc, struct acpi_thread_state | ||
309 | *thread); | ||
310 | |||
311 | acpi_status | ||
312 | acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, | ||
313 | union acpi_parse_object *op, | ||
314 | struct acpi_namespace_node *method_node, | ||
315 | u8 * aml_start, | ||
316 | u32 aml_length, | ||
317 | struct acpi_evaluate_info *info, u8 pass_number); | ||
318 | |||
319 | void | ||
320 | acpi_ds_obj_stack_pop_and_delete(u32 pop_count, | ||
321 | struct acpi_walk_state *walk_state); | ||
322 | |||
323 | void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state); | ||
324 | |||
325 | struct acpi_walk_state *acpi_ds_pop_walk_state(struct acpi_thread_state | ||
326 | *thread); | ||
327 | |||
328 | void | ||
329 | acpi_ds_push_walk_state(struct acpi_walk_state *walk_state, | ||
330 | struct acpi_thread_state *thread); | ||
331 | |||
332 | acpi_status acpi_ds_result_stack_clear(struct acpi_walk_state *walk_state); | ||
333 | |||
334 | struct acpi_walk_state *acpi_ds_get_current_walk_state(struct acpi_thread_state | ||
335 | *thread); | ||
336 | |||
337 | acpi_status | ||
338 | acpi_ds_result_pop(union acpi_operand_object **object, | ||
339 | struct acpi_walk_state *walk_state); | ||
340 | |||
341 | acpi_status | ||
342 | acpi_ds_result_push(union acpi_operand_object *object, | ||
343 | struct acpi_walk_state *walk_state); | ||
344 | |||
345 | #endif /* _ACDISPAT_H_ */ | ||
diff --git a/include/acpi/acevents.h b/include/acpi/acevents.h deleted file mode 100644 index d5d099bf349c..000000000000 --- a/include/acpi/acevents.h +++ /dev/null | |||
@@ -1,216 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acevents.h - Event subcomponent prototypes and defines | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACEVENTS_H__ | ||
45 | #define __ACEVENTS_H__ | ||
46 | |||
47 | /* | ||
48 | * evevent | ||
49 | */ | ||
50 | acpi_status acpi_ev_initialize_events(void); | ||
51 | |||
52 | acpi_status acpi_ev_install_xrupt_handlers(void); | ||
53 | |||
54 | acpi_status acpi_ev_install_fadt_gpes(void); | ||
55 | |||
56 | u32 acpi_ev_fixed_event_detect(void); | ||
57 | |||
58 | /* | ||
59 | * evmisc | ||
60 | */ | ||
61 | u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node); | ||
62 | |||
63 | acpi_status acpi_ev_acquire_global_lock(u16 timeout); | ||
64 | |||
65 | acpi_status acpi_ev_release_global_lock(void); | ||
66 | |||
67 | acpi_status acpi_ev_init_global_lock_handler(void); | ||
68 | |||
69 | u32 acpi_ev_get_gpe_number_index(u32 gpe_number); | ||
70 | |||
71 | acpi_status | ||
72 | acpi_ev_queue_notify_request(struct acpi_namespace_node *node, | ||
73 | u32 notify_value); | ||
74 | |||
75 | /* | ||
76 | * evgpe - GPE handling and dispatch | ||
77 | */ | ||
78 | acpi_status | ||
79 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info, | ||
80 | u8 type); | ||
81 | |||
82 | acpi_status | ||
83 | acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info, | ||
84 | u8 write_to_hardware); | ||
85 | |||
86 | acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
87 | |||
88 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, | ||
89 | u32 gpe_number); | ||
90 | |||
91 | /* | ||
92 | * evgpeblk | ||
93 | */ | ||
94 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info); | ||
95 | |||
96 | acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback); | ||
97 | |||
98 | acpi_status | ||
99 | acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
100 | struct acpi_gpe_block_info *gpe_block); | ||
101 | |||
102 | acpi_status | ||
103 | acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | ||
104 | struct acpi_generic_address *gpe_block_address, | ||
105 | u32 register_count, | ||
106 | u8 gpe_block_base_number, | ||
107 | u32 interrupt_number, | ||
108 | struct acpi_gpe_block_info **return_gpe_block); | ||
109 | |||
110 | acpi_status | ||
111 | acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | ||
112 | struct acpi_gpe_block_info *gpe_block); | ||
113 | |||
114 | acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block); | ||
115 | |||
116 | u32 | ||
117 | acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, | ||
118 | u32 gpe_number); | ||
119 | |||
120 | u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list); | ||
121 | |||
122 | acpi_status | ||
123 | acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type); | ||
124 | |||
125 | acpi_status | ||
126 | acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
127 | |||
128 | acpi_status acpi_ev_gpe_initialize(void); | ||
129 | |||
130 | /* | ||
131 | * evregion - Address Space handling | ||
132 | */ | ||
133 | acpi_status acpi_ev_install_region_handlers(void); | ||
134 | |||
135 | acpi_status acpi_ev_initialize_op_regions(void); | ||
136 | |||
137 | acpi_status | ||
138 | acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, | ||
139 | u32 function, | ||
140 | acpi_physical_address address, | ||
141 | u32 bit_width, acpi_integer * value); | ||
142 | |||
143 | acpi_status | ||
144 | acpi_ev_attach_region(union acpi_operand_object *handler_obj, | ||
145 | union acpi_operand_object *region_obj, | ||
146 | u8 acpi_ns_is_locked); | ||
147 | |||
148 | void | ||
149 | acpi_ev_detach_region(union acpi_operand_object *region_obj, | ||
150 | u8 acpi_ns_is_locked); | ||
151 | |||
152 | acpi_status | ||
153 | acpi_ev_install_space_handler(struct acpi_namespace_node *node, | ||
154 | acpi_adr_space_type space_id, | ||
155 | acpi_adr_space_handler handler, | ||
156 | acpi_adr_space_setup setup, void *context); | ||
157 | |||
158 | acpi_status | ||
159 | acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, | ||
160 | acpi_adr_space_type space_id); | ||
161 | |||
162 | acpi_status | ||
163 | acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function); | ||
164 | |||
165 | /* | ||
166 | * evregini - Region initialization and setup | ||
167 | */ | ||
168 | acpi_status | ||
169 | acpi_ev_system_memory_region_setup(acpi_handle handle, | ||
170 | u32 function, | ||
171 | void *handler_context, | ||
172 | void **region_context); | ||
173 | |||
174 | acpi_status | ||
175 | acpi_ev_io_space_region_setup(acpi_handle handle, | ||
176 | u32 function, | ||
177 | void *handler_context, void **region_context); | ||
178 | |||
179 | acpi_status | ||
180 | acpi_ev_pci_config_region_setup(acpi_handle handle, | ||
181 | u32 function, | ||
182 | void *handler_context, void **region_context); | ||
183 | |||
184 | acpi_status | ||
185 | acpi_ev_cmos_region_setup(acpi_handle handle, | ||
186 | u32 function, | ||
187 | void *handler_context, void **region_context); | ||
188 | |||
189 | acpi_status | ||
190 | acpi_ev_pci_bar_region_setup(acpi_handle handle, | ||
191 | u32 function, | ||
192 | void *handler_context, void **region_context); | ||
193 | |||
194 | acpi_status | ||
195 | acpi_ev_default_region_setup(acpi_handle handle, | ||
196 | u32 function, | ||
197 | void *handler_context, void **region_context); | ||
198 | |||
199 | acpi_status | ||
200 | acpi_ev_initialize_region(union acpi_operand_object *region_obj, | ||
201 | u8 acpi_ns_locked); | ||
202 | |||
203 | /* | ||
204 | * evsci - SCI (System Control Interrupt) handling/dispatch | ||
205 | */ | ||
206 | u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context); | ||
207 | |||
208 | u32 acpi_ev_install_sci_handler(void); | ||
209 | |||
210 | acpi_status acpi_ev_remove_sci_handler(void); | ||
211 | |||
212 | u32 acpi_ev_initialize_sCI(u32 program_sCI); | ||
213 | |||
214 | void acpi_ev_terminate(void); | ||
215 | |||
216 | #endif /* __ACEVENTS_H__ */ | ||
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index 84f5cb242863..eda04546cdf6 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h | |||
@@ -153,8 +153,9 @@ | |||
153 | #define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x001E | AE_CODE_AML) | 153 | #define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x001E | AE_CODE_AML) |
154 | #define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x001F | AE_CODE_AML) | 154 | #define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x001F | AE_CODE_AML) |
155 | #define AE_AML_ILLEGAL_ADDRESS (acpi_status) (0x0020 | AE_CODE_AML) | 155 | #define AE_AML_ILLEGAL_ADDRESS (acpi_status) (0x0020 | AE_CODE_AML) |
156 | #define AE_AML_INFINITE_LOOP (acpi_status) (0x0021 | AE_CODE_AML) | ||
156 | 157 | ||
157 | #define AE_CODE_AML_MAX 0x0020 | 158 | #define AE_CODE_AML_MAX 0x0021 |
158 | 159 | ||
159 | /* | 160 | /* |
160 | * Internal exceptions used for control | 161 | * Internal exceptions used for control |
@@ -175,6 +176,8 @@ | |||
175 | 176 | ||
176 | #define AE_CODE_CTRL_MAX 0x000D | 177 | #define AE_CODE_CTRL_MAX 0x000D |
177 | 178 | ||
179 | /* Exception strings for acpi_format_exception */ | ||
180 | |||
178 | #ifdef DEFINE_ACPI_GLOBALS | 181 | #ifdef DEFINE_ACPI_GLOBALS |
179 | 182 | ||
180 | /* | 183 | /* |
@@ -267,6 +270,7 @@ char const *acpi_gbl_exception_names_aml[] = { | |||
267 | "AE_AML_CIRCULAR_REFERENCE", | 270 | "AE_AML_CIRCULAR_REFERENCE", |
268 | "AE_AML_BAD_RESOURCE_LENGTH", | 271 | "AE_AML_BAD_RESOURCE_LENGTH", |
269 | "AE_AML_ILLEGAL_ADDRESS", | 272 | "AE_AML_ILLEGAL_ADDRESS", |
273 | "AE_AML_INFINITE_LOOP" | ||
270 | }; | 274 | }; |
271 | 275 | ||
272 | char const *acpi_gbl_exception_names_ctrl[] = { | 276 | char const *acpi_gbl_exception_names_ctrl[] = { |
diff --git a/include/acpi/acglobal.h b/include/acpi/acglobal.h deleted file mode 100644 index 15dda46b70d1..000000000000 --- a/include/acpi/acglobal.h +++ /dev/null | |||
@@ -1,387 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acglobal.h - Declarations for global variables | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACGLOBAL_H__ | ||
45 | #define __ACGLOBAL_H__ | ||
46 | |||
47 | /* | ||
48 | * Ensure that the globals are actually defined and initialized only once. | ||
49 | * | ||
50 | * The use of these macros allows a single list of globals (here) in order | ||
51 | * to simplify maintenance of the code. | ||
52 | */ | ||
53 | #ifdef DEFINE_ACPI_GLOBALS | ||
54 | #define ACPI_EXTERN | ||
55 | #define ACPI_INIT_GLOBAL(a,b) a=b | ||
56 | #else | ||
57 | #define ACPI_EXTERN extern | ||
58 | #define ACPI_INIT_GLOBAL(a,b) a | ||
59 | #endif | ||
60 | |||
61 | /***************************************************************************** | ||
62 | * | ||
63 | * Runtime configuration (static defaults that can be overriden at runtime) | ||
64 | * | ||
65 | ****************************************************************************/ | ||
66 | |||
67 | /* | ||
68 | * Enable "slack" in the AML interpreter? Default is FALSE, and the | ||
69 | * interpreter strictly follows the ACPI specification. Setting to TRUE | ||
70 | * allows the interpreter to ignore certain errors and/or bad AML constructs. | ||
71 | * | ||
72 | * Currently, these features are enabled by this flag: | ||
73 | * | ||
74 | * 1) Allow "implicit return" of last value in a control method | ||
75 | * 2) Allow access beyond the end of an operation region | ||
76 | * 3) Allow access to uninitialized locals/args (auto-init to integer 0) | ||
77 | * 4) Allow ANY object type to be a source operand for the Store() operator | ||
78 | * 5) Allow unresolved references (invalid target name) in package objects | ||
79 | * 6) Enable warning messages for behavior that is not ACPI spec compliant | ||
80 | */ | ||
81 | ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_interpreter_slack, FALSE); | ||
82 | |||
83 | /* | ||
84 | * Automatically serialize ALL control methods? Default is FALSE, meaning | ||
85 | * to use the Serialized/not_serialized method flags on a per method basis. | ||
86 | * Only change this if the ASL code is poorly written and cannot handle | ||
87 | * reentrancy even though methods are marked "NotSerialized". | ||
88 | */ | ||
89 | ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_all_methods_serialized, FALSE); | ||
90 | |||
91 | /* | ||
92 | * Create the predefined _OSI method in the namespace? Default is TRUE | ||
93 | * because ACPI CA is fully compatible with other ACPI implementations. | ||
94 | * Changing this will revert ACPI CA (and machine ASL) to pre-OSI behavior. | ||
95 | */ | ||
96 | ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_create_osi_method, TRUE); | ||
97 | |||
98 | /* | ||
99 | * Disable wakeup GPEs during runtime? Default is TRUE because WAKE and | ||
100 | * RUNTIME GPEs should never be shared, and WAKE GPEs should typically only | ||
101 | * be enabled just before going to sleep. | ||
102 | */ | ||
103 | ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_leave_wake_gpes_disabled, TRUE); | ||
104 | |||
105 | /***************************************************************************** | ||
106 | * | ||
107 | * Debug support | ||
108 | * | ||
109 | ****************************************************************************/ | ||
110 | |||
111 | /* Runtime configuration of debug print levels */ | ||
112 | |||
113 | extern u32 acpi_dbg_level; | ||
114 | extern u32 acpi_dbg_layer; | ||
115 | |||
116 | /* Procedure nesting level for debug output */ | ||
117 | |||
118 | extern u32 acpi_gbl_nesting_level; | ||
119 | |||
120 | /* Support for dynamic control method tracing mechanism */ | ||
121 | |||
122 | ACPI_EXTERN u32 acpi_gbl_original_dbg_level; | ||
123 | ACPI_EXTERN u32 acpi_gbl_original_dbg_layer; | ||
124 | ACPI_EXTERN acpi_name acpi_gbl_trace_method_name; | ||
125 | ACPI_EXTERN u32 acpi_gbl_trace_dbg_level; | ||
126 | ACPI_EXTERN u32 acpi_gbl_trace_dbg_layer; | ||
127 | ACPI_EXTERN u32 acpi_gbl_trace_flags; | ||
128 | |||
129 | /***************************************************************************** | ||
130 | * | ||
131 | * ACPI Table globals | ||
132 | * | ||
133 | ****************************************************************************/ | ||
134 | |||
135 | /* | ||
136 | * acpi_gbl_root_table_list is the master list of ACPI tables found in the | ||
137 | * RSDT/XSDT. | ||
138 | * | ||
139 | * acpi_gbl_FADT is a local copy of the FADT, converted to a common format. | ||
140 | */ | ||
141 | ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list; | ||
142 | ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT; | ||
143 | extern u8 acpi_gbl_permanent_mmap; | ||
144 | |||
145 | /* These addresses are calculated from FADT address values */ | ||
146 | |||
147 | ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_enable; | ||
148 | ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable; | ||
149 | |||
150 | /* | ||
151 | * Handle both ACPI 1.0 and ACPI 2.0 Integer widths. The integer width is | ||
152 | * determined by the revision of the DSDT: If the DSDT revision is less than | ||
153 | * 2, use only the lower 32 bits of the internal 64-bit Integer. | ||
154 | */ | ||
155 | ACPI_EXTERN u8 acpi_gbl_integer_bit_width; | ||
156 | ACPI_EXTERN u8 acpi_gbl_integer_byte_width; | ||
157 | ACPI_EXTERN u8 acpi_gbl_integer_nybble_width; | ||
158 | |||
159 | /***************************************************************************** | ||
160 | * | ||
161 | * Mutual exlusion within ACPICA subsystem | ||
162 | * | ||
163 | ****************************************************************************/ | ||
164 | |||
165 | /* | ||
166 | * Predefined mutex objects. This array contains the | ||
167 | * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs. | ||
168 | * (The table maps local handles to the real OS handles) | ||
169 | */ | ||
170 | ACPI_EXTERN struct acpi_mutex_info acpi_gbl_mutex_info[ACPI_NUM_MUTEX]; | ||
171 | |||
172 | /* | ||
173 | * Global lock mutex is an actual AML mutex object | ||
174 | * Global lock semaphore works in conjunction with the HW global lock | ||
175 | */ | ||
176 | ACPI_EXTERN union acpi_operand_object *acpi_gbl_global_lock_mutex; | ||
177 | ACPI_EXTERN acpi_semaphore acpi_gbl_global_lock_semaphore; | ||
178 | ACPI_EXTERN u16 acpi_gbl_global_lock_handle; | ||
179 | ACPI_EXTERN u8 acpi_gbl_global_lock_acquired; | ||
180 | ACPI_EXTERN u8 acpi_gbl_global_lock_present; | ||
181 | |||
182 | /* | ||
183 | * Spinlocks are used for interfaces that can be possibly called at | ||
184 | * interrupt level | ||
185 | */ | ||
186 | ACPI_EXTERN spinlock_t _acpi_gbl_gpe_lock; /* For GPE data structs and registers */ | ||
187 | ACPI_EXTERN spinlock_t _acpi_gbl_hardware_lock; /* For ACPI H/W except GPE registers */ | ||
188 | #define acpi_gbl_gpe_lock &_acpi_gbl_gpe_lock | ||
189 | #define acpi_gbl_hardware_lock &_acpi_gbl_hardware_lock | ||
190 | |||
191 | /***************************************************************************** | ||
192 | * | ||
193 | * Miscellaneous globals | ||
194 | * | ||
195 | ****************************************************************************/ | ||
196 | |||
197 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | ||
198 | |||
199 | /* Lists for tracking memory allocations */ | ||
200 | |||
201 | ACPI_EXTERN struct acpi_memory_list *acpi_gbl_global_list; | ||
202 | ACPI_EXTERN struct acpi_memory_list *acpi_gbl_ns_node_list; | ||
203 | ACPI_EXTERN u8 acpi_gbl_display_final_mem_stats; | ||
204 | #endif | ||
205 | |||
206 | /* Object caches */ | ||
207 | |||
208 | ACPI_EXTERN acpi_cache_t *acpi_gbl_namespace_cache; | ||
209 | ACPI_EXTERN acpi_cache_t *acpi_gbl_state_cache; | ||
210 | ACPI_EXTERN acpi_cache_t *acpi_gbl_ps_node_cache; | ||
211 | ACPI_EXTERN acpi_cache_t *acpi_gbl_ps_node_ext_cache; | ||
212 | ACPI_EXTERN acpi_cache_t *acpi_gbl_operand_cache; | ||
213 | |||
214 | /* Global handlers */ | ||
215 | |||
216 | ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_device_notify; | ||
217 | ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_system_notify; | ||
218 | ACPI_EXTERN acpi_exception_handler acpi_gbl_exception_handler; | ||
219 | ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler; | ||
220 | ACPI_EXTERN acpi_tbl_handler acpi_gbl_table_handler; | ||
221 | ACPI_EXTERN void *acpi_gbl_table_handler_context; | ||
222 | ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk; | ||
223 | |||
224 | /* Owner ID support */ | ||
225 | |||
226 | ACPI_EXTERN u32 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS]; | ||
227 | ACPI_EXTERN u8 acpi_gbl_last_owner_id_index; | ||
228 | ACPI_EXTERN u8 acpi_gbl_next_owner_id_offset; | ||
229 | |||
230 | /* Misc */ | ||
231 | |||
232 | ACPI_EXTERN u32 acpi_gbl_original_mode; | ||
233 | ACPI_EXTERN u32 acpi_gbl_rsdp_original_location; | ||
234 | ACPI_EXTERN u32 acpi_gbl_ns_lookup_count; | ||
235 | ACPI_EXTERN u32 acpi_gbl_ps_find_count; | ||
236 | ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save; | ||
237 | ACPI_EXTERN u8 acpi_gbl_debugger_configuration; | ||
238 | ACPI_EXTERN u8 acpi_gbl_step_to_next_call; | ||
239 | ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present; | ||
240 | ACPI_EXTERN u8 acpi_gbl_events_initialized; | ||
241 | ACPI_EXTERN u8 acpi_gbl_system_awake_and_running; | ||
242 | |||
243 | #ifndef DEFINE_ACPI_GLOBALS | ||
244 | |||
245 | /* Other miscellaneous */ | ||
246 | |||
247 | extern u8 acpi_gbl_shutdown; | ||
248 | extern u32 acpi_gbl_startup_flags; | ||
249 | extern const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT]; | ||
250 | extern const char *acpi_gbl_highest_dstate_names[4]; | ||
251 | extern const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES]; | ||
252 | extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS]; | ||
253 | |||
254 | #endif | ||
255 | |||
256 | /* Exception codes */ | ||
257 | |||
258 | extern char const *acpi_gbl_exception_names_env[]; | ||
259 | extern char const *acpi_gbl_exception_names_pgm[]; | ||
260 | extern char const *acpi_gbl_exception_names_tbl[]; | ||
261 | extern char const *acpi_gbl_exception_names_aml[]; | ||
262 | extern char const *acpi_gbl_exception_names_ctrl[]; | ||
263 | |||
264 | /***************************************************************************** | ||
265 | * | ||
266 | * Namespace globals | ||
267 | * | ||
268 | ****************************************************************************/ | ||
269 | |||
270 | #if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) | ||
271 | #define NUM_PREDEFINED_NAMES 10 | ||
272 | #else | ||
273 | #define NUM_PREDEFINED_NAMES 9 | ||
274 | #endif | ||
275 | |||
276 | ACPI_EXTERN struct acpi_namespace_node acpi_gbl_root_node_struct; | ||
277 | ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_root_node; | ||
278 | ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_fadt_gpe_device; | ||
279 | |||
280 | extern const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES]; | ||
281 | extern const struct acpi_predefined_names | ||
282 | acpi_gbl_pre_defined_names[NUM_PREDEFINED_NAMES]; | ||
283 | |||
284 | #ifdef ACPI_DEBUG_OUTPUT | ||
285 | ACPI_EXTERN u32 acpi_gbl_current_node_count; | ||
286 | ACPI_EXTERN u32 acpi_gbl_current_node_size; | ||
287 | ACPI_EXTERN u32 acpi_gbl_max_concurrent_node_count; | ||
288 | ACPI_EXTERN acpi_size *acpi_gbl_entry_stack_pointer; | ||
289 | ACPI_EXTERN acpi_size *acpi_gbl_lowest_stack_pointer; | ||
290 | ACPI_EXTERN u32 acpi_gbl_deepest_nesting; | ||
291 | #endif | ||
292 | |||
293 | /***************************************************************************** | ||
294 | * | ||
295 | * Interpreter globals | ||
296 | * | ||
297 | ****************************************************************************/ | ||
298 | |||
299 | ACPI_EXTERN struct acpi_thread_state *acpi_gbl_current_walk_list; | ||
300 | |||
301 | /* Control method single step flag */ | ||
302 | |||
303 | ACPI_EXTERN u8 acpi_gbl_cm_single_step; | ||
304 | |||
305 | /***************************************************************************** | ||
306 | * | ||
307 | * Hardware globals | ||
308 | * | ||
309 | ****************************************************************************/ | ||
310 | |||
311 | extern struct acpi_bit_register_info | ||
312 | acpi_gbl_bit_register_info[ACPI_NUM_BITREG]; | ||
313 | ACPI_EXTERN u8 acpi_gbl_sleep_type_a; | ||
314 | ACPI_EXTERN u8 acpi_gbl_sleep_type_b; | ||
315 | |||
316 | /***************************************************************************** | ||
317 | * | ||
318 | * Event and GPE globals | ||
319 | * | ||
320 | ****************************************************************************/ | ||
321 | |||
322 | extern struct acpi_fixed_event_info | ||
323 | acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS]; | ||
324 | ACPI_EXTERN struct acpi_fixed_event_handler | ||
325 | acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS]; | ||
326 | ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head; | ||
327 | ACPI_EXTERN struct acpi_gpe_block_info | ||
328 | *acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS]; | ||
329 | |||
330 | /***************************************************************************** | ||
331 | * | ||
332 | * Debugger globals | ||
333 | * | ||
334 | ****************************************************************************/ | ||
335 | |||
336 | ACPI_EXTERN u8 acpi_gbl_db_output_flags; | ||
337 | |||
338 | #ifdef ACPI_DISASSEMBLER | ||
339 | |||
340 | ACPI_EXTERN u8 acpi_gbl_db_opt_disasm; | ||
341 | ACPI_EXTERN u8 acpi_gbl_db_opt_verbose; | ||
342 | #endif | ||
343 | |||
344 | #ifdef ACPI_DEBUGGER | ||
345 | |||
346 | extern u8 acpi_gbl_method_executing; | ||
347 | extern u8 acpi_gbl_abort_method; | ||
348 | extern u8 acpi_gbl_db_terminate_threads; | ||
349 | |||
350 | ACPI_EXTERN int optind; | ||
351 | ACPI_EXTERN char *optarg; | ||
352 | |||
353 | ACPI_EXTERN u8 acpi_gbl_db_opt_tables; | ||
354 | ACPI_EXTERN u8 acpi_gbl_db_opt_stats; | ||
355 | ACPI_EXTERN u8 acpi_gbl_db_opt_ini_methods; | ||
356 | |||
357 | ACPI_EXTERN char *acpi_gbl_db_args[ACPI_DEBUGGER_MAX_ARGS]; | ||
358 | ACPI_EXTERN char acpi_gbl_db_line_buf[80]; | ||
359 | ACPI_EXTERN char acpi_gbl_db_parsed_buf[80]; | ||
360 | ACPI_EXTERN char acpi_gbl_db_scope_buf[40]; | ||
361 | ACPI_EXTERN char acpi_gbl_db_debug_filename[40]; | ||
362 | ACPI_EXTERN u8 acpi_gbl_db_output_to_file; | ||
363 | ACPI_EXTERN char *acpi_gbl_db_buffer; | ||
364 | ACPI_EXTERN char *acpi_gbl_db_filename; | ||
365 | ACPI_EXTERN u32 acpi_gbl_db_debug_level; | ||
366 | ACPI_EXTERN u32 acpi_gbl_db_console_debug_level; | ||
367 | ACPI_EXTERN struct acpi_table_header *acpi_gbl_db_table_ptr; | ||
368 | ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_db_scope_node; | ||
369 | |||
370 | /* | ||
371 | * Statistic globals | ||
372 | */ | ||
373 | ACPI_EXTERN u16 acpi_gbl_obj_type_count[ACPI_TYPE_NS_NODE_MAX + 1]; | ||
374 | ACPI_EXTERN u16 acpi_gbl_node_type_count[ACPI_TYPE_NS_NODE_MAX + 1]; | ||
375 | ACPI_EXTERN u16 acpi_gbl_obj_type_count_misc; | ||
376 | ACPI_EXTERN u16 acpi_gbl_node_type_count_misc; | ||
377 | ACPI_EXTERN u32 acpi_gbl_num_nodes; | ||
378 | ACPI_EXTERN u32 acpi_gbl_num_objects; | ||
379 | |||
380 | ACPI_EXTERN u32 acpi_gbl_size_of_parse_tree; | ||
381 | ACPI_EXTERN u32 acpi_gbl_size_of_method_trees; | ||
382 | ACPI_EXTERN u32 acpi_gbl_size_of_node_entries; | ||
383 | ACPI_EXTERN u32 acpi_gbl_size_of_acpi_objects; | ||
384 | |||
385 | #endif /* ACPI_DEBUGGER */ | ||
386 | |||
387 | #endif /* __ACGLOBAL_H__ */ | ||
diff --git a/include/acpi/achware.h b/include/acpi/achware.h deleted file mode 100644 index 97a72b193276..000000000000 --- a/include/acpi/achware.h +++ /dev/null | |||
@@ -1,131 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: achware.h -- hardware specific interfaces | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACHWARE_H__ | ||
45 | #define __ACHWARE_H__ | ||
46 | |||
47 | /* PM Timer ticks per second (HZ) */ | ||
48 | |||
49 | #define PM_TIMER_FREQUENCY 3579545 | ||
50 | |||
51 | /* Values for the _SST reserved method */ | ||
52 | |||
53 | #define ACPI_SST_INDICATOR_OFF 0 | ||
54 | #define ACPI_SST_WORKING 1 | ||
55 | #define ACPI_SST_WAKING 2 | ||
56 | #define ACPI_SST_SLEEPING 3 | ||
57 | #define ACPI_SST_SLEEP_CONTEXT 4 | ||
58 | |||
59 | /* Prototypes */ | ||
60 | |||
61 | /* | ||
62 | * hwacpi - high level functions | ||
63 | */ | ||
64 | acpi_status acpi_hw_set_mode(u32 mode); | ||
65 | |||
66 | u32 acpi_hw_get_mode(void); | ||
67 | |||
68 | /* | ||
69 | * hwregs - ACPI Register I/O | ||
70 | */ | ||
71 | struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id); | ||
72 | |||
73 | acpi_status | ||
74 | acpi_hw_register_read(u32 register_id, u32 * return_value); | ||
75 | |||
76 | acpi_status acpi_hw_register_write(u32 register_id, u32 value); | ||
77 | |||
78 | acpi_status | ||
79 | acpi_hw_low_level_read(u32 width, | ||
80 | u32 * value, struct acpi_generic_address *reg); | ||
81 | |||
82 | acpi_status | ||
83 | acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address *reg); | ||
84 | |||
85 | acpi_status acpi_hw_clear_acpi_status(void); | ||
86 | |||
87 | /* | ||
88 | * hwgpe - GPE support | ||
89 | */ | ||
90 | acpi_status acpi_hw_low_disable_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
91 | |||
92 | acpi_status | ||
93 | acpi_hw_write_gpe_enable_reg(struct acpi_gpe_event_info *gpe_event_info); | ||
94 | |||
95 | acpi_status | ||
96 | acpi_hw_disable_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
97 | struct acpi_gpe_block_info *gpe_block); | ||
98 | |||
99 | acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info *gpe_event_info); | ||
100 | |||
101 | acpi_status | ||
102 | acpi_hw_clear_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
103 | struct acpi_gpe_block_info *gpe_block); | ||
104 | |||
105 | acpi_status | ||
106 | acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info, | ||
107 | acpi_event_status * event_status); | ||
108 | |||
109 | acpi_status acpi_hw_disable_all_gpes(void); | ||
110 | |||
111 | acpi_status acpi_hw_enable_all_runtime_gpes(void); | ||
112 | |||
113 | acpi_status acpi_hw_enable_all_wakeup_gpes(void); | ||
114 | |||
115 | acpi_status | ||
116 | acpi_hw_enable_runtime_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
117 | struct acpi_gpe_block_info *gpe_block); | ||
118 | |||
119 | #ifdef ACPI_FUTURE_USAGE | ||
120 | /* | ||
121 | * hwtimer - ACPI Timer prototypes | ||
122 | */ | ||
123 | acpi_status acpi_get_timer_resolution(u32 * resolution); | ||
124 | |||
125 | acpi_status acpi_get_timer(u32 * ticks); | ||
126 | |||
127 | acpi_status | ||
128 | acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed); | ||
129 | #endif /* ACPI_FUTURE_USAGE */ | ||
130 | |||
131 | #endif /* __ACHWARE_H__ */ | ||
diff --git a/include/acpi/acinterp.h b/include/acpi/acinterp.h deleted file mode 100644 index e8db7a3143a5..000000000000 --- a/include/acpi/acinterp.h +++ /dev/null | |||
@@ -1,529 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acinterp.h - Interpreter subcomponent prototypes and defines | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACINTERP_H__ | ||
45 | #define __ACINTERP_H__ | ||
46 | |||
47 | #define ACPI_WALK_OPERANDS (&(walk_state->operands [walk_state->num_operands -1])) | ||
48 | |||
49 | /* Macros for tables used for debug output */ | ||
50 | |||
51 | #define ACPI_EXD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_operand_object,f) | ||
52 | #define ACPI_EXD_NSOFFSET(f) (u8) ACPI_OFFSET (struct acpi_namespace_node,f) | ||
53 | #define ACPI_EXD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_exdump_info)) | ||
54 | |||
55 | /* | ||
56 | * If possible, pack the following structures to byte alignment, since we | ||
57 | * don't care about performance for debug output. Two cases where we cannot | ||
58 | * pack the structures: | ||
59 | * | ||
60 | * 1) Hardware does not support misaligned memory transfers | ||
61 | * 2) Compiler does not support pointers within packed structures | ||
62 | */ | ||
63 | #if (!defined(ACPI_MISALIGNMENT_NOT_SUPPORTED) && !defined(ACPI_PACKED_POINTERS_NOT_SUPPORTED)) | ||
64 | #pragma pack(1) | ||
65 | #endif | ||
66 | |||
67 | typedef const struct acpi_exdump_info { | ||
68 | u8 opcode; | ||
69 | u8 offset; | ||
70 | char *name; | ||
71 | |||
72 | } acpi_exdump_info; | ||
73 | |||
74 | /* Values for the Opcode field above */ | ||
75 | |||
76 | #define ACPI_EXD_INIT 0 | ||
77 | #define ACPI_EXD_TYPE 1 | ||
78 | #define ACPI_EXD_UINT8 2 | ||
79 | #define ACPI_EXD_UINT16 3 | ||
80 | #define ACPI_EXD_UINT32 4 | ||
81 | #define ACPI_EXD_UINT64 5 | ||
82 | #define ACPI_EXD_LITERAL 6 | ||
83 | #define ACPI_EXD_POINTER 7 | ||
84 | #define ACPI_EXD_ADDRESS 8 | ||
85 | #define ACPI_EXD_STRING 9 | ||
86 | #define ACPI_EXD_BUFFER 10 | ||
87 | #define ACPI_EXD_PACKAGE 11 | ||
88 | #define ACPI_EXD_FIELD 12 | ||
89 | #define ACPI_EXD_REFERENCE 13 | ||
90 | |||
91 | /* restore default alignment */ | ||
92 | |||
93 | #pragma pack() | ||
94 | |||
95 | /* | ||
96 | * exconvrt - object conversion | ||
97 | */ | ||
98 | acpi_status | ||
99 | acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, | ||
100 | union acpi_operand_object **result_desc, u32 flags); | ||
101 | |||
102 | acpi_status | ||
103 | acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, | ||
104 | union acpi_operand_object **result_desc); | ||
105 | |||
106 | acpi_status | ||
107 | acpi_ex_convert_to_string(union acpi_operand_object *obj_desc, | ||
108 | union acpi_operand_object **result_desc, u32 type); | ||
109 | |||
110 | /* Types for ->String conversion */ | ||
111 | |||
112 | #define ACPI_EXPLICIT_BYTE_COPY 0x00000000 | ||
113 | #define ACPI_EXPLICIT_CONVERT_HEX 0x00000001 | ||
114 | #define ACPI_IMPLICIT_CONVERT_HEX 0x00000002 | ||
115 | #define ACPI_EXPLICIT_CONVERT_DECIMAL 0x00000003 | ||
116 | |||
117 | acpi_status | ||
118 | acpi_ex_convert_to_target_type(acpi_object_type destination_type, | ||
119 | union acpi_operand_object *source_desc, | ||
120 | union acpi_operand_object **result_desc, | ||
121 | struct acpi_walk_state *walk_state); | ||
122 | |||
123 | /* | ||
124 | * exfield - ACPI AML (p-code) execution - field manipulation | ||
125 | */ | ||
126 | acpi_status | ||
127 | acpi_ex_common_buffer_setup(union acpi_operand_object *obj_desc, | ||
128 | u32 buffer_length, u32 * datum_count); | ||
129 | |||
130 | acpi_status | ||
131 | acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc, | ||
132 | acpi_integer mask, | ||
133 | acpi_integer field_value, | ||
134 | u32 field_datum_byte_offset); | ||
135 | |||
136 | void | ||
137 | acpi_ex_get_buffer_datum(acpi_integer * datum, | ||
138 | void *buffer, | ||
139 | u32 buffer_length, | ||
140 | u32 byte_granularity, u32 buffer_offset); | ||
141 | |||
142 | void | ||
143 | acpi_ex_set_buffer_datum(acpi_integer merged_datum, | ||
144 | void *buffer, | ||
145 | u32 buffer_length, | ||
146 | u32 byte_granularity, u32 buffer_offset); | ||
147 | |||
148 | acpi_status | ||
149 | acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | ||
150 | union acpi_operand_object *obj_desc, | ||
151 | union acpi_operand_object **ret_buffer_desc); | ||
152 | |||
153 | acpi_status | ||
154 | acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | ||
155 | union acpi_operand_object *obj_desc, | ||
156 | union acpi_operand_object **result_desc); | ||
157 | |||
158 | /* | ||
159 | * exfldio - low level field I/O | ||
160 | */ | ||
161 | acpi_status | ||
162 | acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, | ||
163 | void *buffer, u32 buffer_length); | ||
164 | |||
165 | acpi_status | ||
166 | acpi_ex_insert_into_field(union acpi_operand_object *obj_desc, | ||
167 | void *buffer, u32 buffer_length); | ||
168 | |||
169 | acpi_status | ||
170 | acpi_ex_access_region(union acpi_operand_object *obj_desc, | ||
171 | u32 field_datum_byte_offset, | ||
172 | acpi_integer * value, u32 read_write); | ||
173 | |||
174 | /* | ||
175 | * exmisc - misc support routines | ||
176 | */ | ||
177 | acpi_status | ||
178 | acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, | ||
179 | union acpi_operand_object **return_desc, | ||
180 | struct acpi_walk_state *walk_state); | ||
181 | |||
182 | acpi_status | ||
183 | acpi_ex_concat_template(union acpi_operand_object *obj_desc, | ||
184 | union acpi_operand_object *obj_desc2, | ||
185 | union acpi_operand_object **actual_return_desc, | ||
186 | struct acpi_walk_state *walk_state); | ||
187 | |||
188 | acpi_status | ||
189 | acpi_ex_do_concatenate(union acpi_operand_object *obj_desc, | ||
190 | union acpi_operand_object *obj_desc2, | ||
191 | union acpi_operand_object **actual_return_desc, | ||
192 | struct acpi_walk_state *walk_state); | ||
193 | |||
194 | acpi_status | ||
195 | acpi_ex_do_logical_numeric_op(u16 opcode, | ||
196 | acpi_integer integer0, | ||
197 | acpi_integer integer1, u8 * logical_result); | ||
198 | |||
199 | acpi_status | ||
200 | acpi_ex_do_logical_op(u16 opcode, | ||
201 | union acpi_operand_object *operand0, | ||
202 | union acpi_operand_object *operand1, u8 * logical_result); | ||
203 | |||
204 | acpi_integer | ||
205 | acpi_ex_do_math_op(u16 opcode, acpi_integer operand0, acpi_integer operand1); | ||
206 | |||
207 | acpi_status acpi_ex_create_mutex(struct acpi_walk_state *walk_state); | ||
208 | |||
209 | acpi_status acpi_ex_create_processor(struct acpi_walk_state *walk_state); | ||
210 | |||
211 | acpi_status acpi_ex_create_power_resource(struct acpi_walk_state *walk_state); | ||
212 | |||
213 | acpi_status | ||
214 | acpi_ex_create_region(u8 * aml_start, | ||
215 | u32 aml_length, | ||
216 | u8 region_space, struct acpi_walk_state *walk_state); | ||
217 | |||
218 | acpi_status acpi_ex_create_event(struct acpi_walk_state *walk_state); | ||
219 | |||
220 | acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state); | ||
221 | |||
222 | acpi_status | ||
223 | acpi_ex_create_method(u8 * aml_start, | ||
224 | u32 aml_length, struct acpi_walk_state *walk_state); | ||
225 | |||
226 | /* | ||
227 | * exconfig - dynamic table load/unload | ||
228 | */ | ||
229 | acpi_status | ||
230 | acpi_ex_load_op(union acpi_operand_object *obj_desc, | ||
231 | union acpi_operand_object *target, | ||
232 | struct acpi_walk_state *walk_state); | ||
233 | |||
234 | acpi_status | ||
235 | acpi_ex_load_table_op(struct acpi_walk_state *walk_state, | ||
236 | union acpi_operand_object **return_desc); | ||
237 | |||
238 | acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle); | ||
239 | |||
240 | /* | ||
241 | * exmutex - mutex support | ||
242 | */ | ||
243 | acpi_status | ||
244 | acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | ||
245 | union acpi_operand_object *obj_desc, | ||
246 | struct acpi_walk_state *walk_state); | ||
247 | |||
248 | acpi_status | ||
249 | acpi_ex_acquire_mutex_object(u16 timeout, | ||
250 | union acpi_operand_object *obj_desc, | ||
251 | acpi_thread_id thread_id); | ||
252 | |||
253 | acpi_status | ||
254 | acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | ||
255 | struct acpi_walk_state *walk_state); | ||
256 | |||
257 | acpi_status acpi_ex_release_mutex_object(union acpi_operand_object *obj_desc); | ||
258 | |||
259 | void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread); | ||
260 | |||
261 | void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc); | ||
262 | |||
263 | /* | ||
264 | * exprep - ACPI AML execution - prep utilities | ||
265 | */ | ||
266 | acpi_status | ||
267 | acpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc, | ||
268 | u8 field_flags, | ||
269 | u8 field_attribute, | ||
270 | u32 field_bit_position, u32 field_bit_length); | ||
271 | |||
272 | acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info); | ||
273 | |||
274 | /* | ||
275 | * exsystem - Interface to OS services | ||
276 | */ | ||
277 | acpi_status | ||
278 | acpi_ex_system_do_notify_op(union acpi_operand_object *value, | ||
279 | union acpi_operand_object *obj_desc); | ||
280 | |||
281 | acpi_status acpi_ex_system_do_suspend(acpi_integer time); | ||
282 | |||
283 | acpi_status acpi_ex_system_do_stall(u32 time); | ||
284 | |||
285 | acpi_status acpi_ex_system_signal_event(union acpi_operand_object *obj_desc); | ||
286 | |||
287 | acpi_status | ||
288 | acpi_ex_system_wait_event(union acpi_operand_object *time, | ||
289 | union acpi_operand_object *obj_desc); | ||
290 | |||
291 | acpi_status acpi_ex_system_reset_event(union acpi_operand_object *obj_desc); | ||
292 | |||
293 | acpi_status | ||
294 | acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout); | ||
295 | |||
296 | acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout); | ||
297 | |||
298 | /* | ||
299 | * exoparg1 - ACPI AML execution, 1 operand | ||
300 | */ | ||
301 | acpi_status acpi_ex_opcode_0A_0T_1R(struct acpi_walk_state *walk_state); | ||
302 | |||
303 | acpi_status acpi_ex_opcode_1A_0T_0R(struct acpi_walk_state *walk_state); | ||
304 | |||
305 | acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state); | ||
306 | |||
307 | acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state); | ||
308 | |||
309 | acpi_status acpi_ex_opcode_1A_1T_0R(struct acpi_walk_state *walk_state); | ||
310 | |||
311 | /* | ||
312 | * exoparg2 - ACPI AML execution, 2 operands | ||
313 | */ | ||
314 | acpi_status acpi_ex_opcode_2A_0T_0R(struct acpi_walk_state *walk_state); | ||
315 | |||
316 | acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state); | ||
317 | |||
318 | acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state); | ||
319 | |||
320 | acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state); | ||
321 | |||
322 | /* | ||
323 | * exoparg3 - ACPI AML execution, 3 operands | ||
324 | */ | ||
325 | acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state); | ||
326 | |||
327 | acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state); | ||
328 | |||
329 | /* | ||
330 | * exoparg6 - ACPI AML execution, 6 operands | ||
331 | */ | ||
332 | acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state *walk_state); | ||
333 | |||
334 | /* | ||
335 | * exresolv - Object resolution and get value functions | ||
336 | */ | ||
337 | acpi_status | ||
338 | acpi_ex_resolve_to_value(union acpi_operand_object **stack_ptr, | ||
339 | struct acpi_walk_state *walk_state); | ||
340 | |||
341 | acpi_status | ||
342 | acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | ||
343 | union acpi_operand_object *operand, | ||
344 | acpi_object_type * return_type, | ||
345 | union acpi_operand_object **return_desc); | ||
346 | |||
347 | /* | ||
348 | * exresnte - resolve namespace node | ||
349 | */ | ||
350 | acpi_status | ||
351 | acpi_ex_resolve_node_to_value(struct acpi_namespace_node **stack_ptr, | ||
352 | struct acpi_walk_state *walk_state); | ||
353 | |||
354 | /* | ||
355 | * exresop - resolve operand to value | ||
356 | */ | ||
357 | acpi_status | ||
358 | acpi_ex_resolve_operands(u16 opcode, | ||
359 | union acpi_operand_object **stack_ptr, | ||
360 | struct acpi_walk_state *walk_state); | ||
361 | |||
362 | /* | ||
363 | * exdump - Interpreter debug output routines | ||
364 | */ | ||
365 | void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth); | ||
366 | |||
367 | void | ||
368 | acpi_ex_dump_operands(union acpi_operand_object **operands, | ||
369 | const char *opcode_name, u32 num_opcodes); | ||
370 | |||
371 | #ifdef ACPI_FUTURE_USAGE | ||
372 | void | ||
373 | acpi_ex_dump_object_descriptor(union acpi_operand_object *object, u32 flags); | ||
374 | |||
375 | void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags); | ||
376 | #endif /* ACPI_FUTURE_USAGE */ | ||
377 | |||
378 | /* | ||
379 | * exnames - AML namestring support | ||
380 | */ | ||
381 | acpi_status | ||
382 | acpi_ex_get_name_string(acpi_object_type data_type, | ||
383 | u8 * in_aml_address, | ||
384 | char **out_name_string, u32 * out_name_length); | ||
385 | |||
386 | /* | ||
387 | * exstore - Object store support | ||
388 | */ | ||
389 | acpi_status | ||
390 | acpi_ex_store(union acpi_operand_object *val_desc, | ||
391 | union acpi_operand_object *dest_desc, | ||
392 | struct acpi_walk_state *walk_state); | ||
393 | |||
394 | acpi_status | ||
395 | acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | ||
396 | struct acpi_namespace_node *node, | ||
397 | struct acpi_walk_state *walk_state, | ||
398 | u8 implicit_conversion); | ||
399 | |||
400 | #define ACPI_IMPLICIT_CONVERSION TRUE | ||
401 | #define ACPI_NO_IMPLICIT_CONVERSION FALSE | ||
402 | |||
403 | /* | ||
404 | * exstoren - resolve/store object | ||
405 | */ | ||
406 | acpi_status | ||
407 | acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr, | ||
408 | acpi_object_type target_type, | ||
409 | struct acpi_walk_state *walk_state); | ||
410 | |||
411 | acpi_status | ||
412 | acpi_ex_store_object_to_object(union acpi_operand_object *source_desc, | ||
413 | union acpi_operand_object *dest_desc, | ||
414 | union acpi_operand_object **new_desc, | ||
415 | struct acpi_walk_state *walk_state); | ||
416 | |||
417 | /* | ||
418 | * exstorob - store object - buffer/string | ||
419 | */ | ||
420 | acpi_status | ||
421 | acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc, | ||
422 | union acpi_operand_object *target_desc); | ||
423 | |||
424 | acpi_status | ||
425 | acpi_ex_store_string_to_string(union acpi_operand_object *source_desc, | ||
426 | union acpi_operand_object *target_desc); | ||
427 | |||
428 | /* | ||
429 | * excopy - object copy | ||
430 | */ | ||
431 | acpi_status | ||
432 | acpi_ex_copy_integer_to_index_field(union acpi_operand_object *source_desc, | ||
433 | union acpi_operand_object *target_desc); | ||
434 | |||
435 | acpi_status | ||
436 | acpi_ex_copy_integer_to_bank_field(union acpi_operand_object *source_desc, | ||
437 | union acpi_operand_object *target_desc); | ||
438 | |||
439 | acpi_status | ||
440 | acpi_ex_copy_data_to_named_field(union acpi_operand_object *source_desc, | ||
441 | struct acpi_namespace_node *node); | ||
442 | |||
443 | acpi_status | ||
444 | acpi_ex_copy_integer_to_buffer_field(union acpi_operand_object *source_desc, | ||
445 | union acpi_operand_object *target_desc); | ||
446 | |||
447 | /* | ||
448 | * exutils - interpreter/scanner utilities | ||
449 | */ | ||
450 | void acpi_ex_enter_interpreter(void); | ||
451 | |||
452 | void acpi_ex_exit_interpreter(void); | ||
453 | |||
454 | void acpi_ex_reacquire_interpreter(void); | ||
455 | |||
456 | void acpi_ex_relinquish_interpreter(void); | ||
457 | |||
458 | void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc); | ||
459 | |||
460 | void acpi_ex_acquire_global_lock(u32 rule); | ||
461 | |||
462 | void acpi_ex_release_global_lock(u32 rule); | ||
463 | |||
464 | void acpi_ex_eisa_id_to_string(u32 numeric_id, char *out_string); | ||
465 | |||
466 | void acpi_ex_unsigned_integer_to_string(acpi_integer value, char *out_string); | ||
467 | |||
468 | /* | ||
469 | * exregion - default op_region handlers | ||
470 | */ | ||
471 | acpi_status | ||
472 | acpi_ex_system_memory_space_handler(u32 function, | ||
473 | acpi_physical_address address, | ||
474 | u32 bit_width, | ||
475 | acpi_integer * value, | ||
476 | void *handler_context, | ||
477 | void *region_context); | ||
478 | |||
479 | acpi_status | ||
480 | acpi_ex_system_io_space_handler(u32 function, | ||
481 | acpi_physical_address address, | ||
482 | u32 bit_width, | ||
483 | acpi_integer * value, | ||
484 | void *handler_context, void *region_context); | ||
485 | |||
486 | acpi_status | ||
487 | acpi_ex_pci_config_space_handler(u32 function, | ||
488 | acpi_physical_address address, | ||
489 | u32 bit_width, | ||
490 | acpi_integer * value, | ||
491 | void *handler_context, void *region_context); | ||
492 | |||
493 | acpi_status | ||
494 | acpi_ex_cmos_space_handler(u32 function, | ||
495 | acpi_physical_address address, | ||
496 | u32 bit_width, | ||
497 | acpi_integer * value, | ||
498 | void *handler_context, void *region_context); | ||
499 | |||
500 | acpi_status | ||
501 | acpi_ex_pci_bar_space_handler(u32 function, | ||
502 | acpi_physical_address address, | ||
503 | u32 bit_width, | ||
504 | acpi_integer * value, | ||
505 | void *handler_context, void *region_context); | ||
506 | |||
507 | acpi_status | ||
508 | acpi_ex_embedded_controller_space_handler(u32 function, | ||
509 | acpi_physical_address address, | ||
510 | u32 bit_width, | ||
511 | acpi_integer * value, | ||
512 | void *handler_context, | ||
513 | void *region_context); | ||
514 | |||
515 | acpi_status | ||
516 | acpi_ex_sm_bus_space_handler(u32 function, | ||
517 | acpi_physical_address address, | ||
518 | u32 bit_width, | ||
519 | acpi_integer * value, | ||
520 | void *handler_context, void *region_context); | ||
521 | |||
522 | acpi_status | ||
523 | acpi_ex_data_table_space_handler(u32 function, | ||
524 | acpi_physical_address address, | ||
525 | u32 bit_width, | ||
526 | acpi_integer * value, | ||
527 | void *handler_context, void *region_context); | ||
528 | |||
529 | #endif /* __INTERP_H__ */ | ||
diff --git a/include/acpi/aclocal.h b/include/acpi/aclocal.h deleted file mode 100644 index ecab527cf78e..000000000000 --- a/include/acpi/aclocal.h +++ /dev/null | |||
@@ -1,1044 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: aclocal.h - Internal data types used across the ACPI subsystem | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACLOCAL_H__ | ||
45 | #define __ACLOCAL_H__ | ||
46 | |||
47 | /* acpisrc:struct_defs -- for acpisrc conversion */ | ||
48 | |||
49 | #define ACPI_WAIT_FOREVER 0xFFFF /* u16, as per ACPI spec */ | ||
50 | #define ACPI_DO_NOT_WAIT 0 | ||
51 | #define ACPI_SERIALIZED 0xFF | ||
52 | |||
53 | typedef u32 acpi_mutex_handle; | ||
54 | #define ACPI_GLOBAL_LOCK (acpi_semaphore) (-1) | ||
55 | |||
56 | /* Total number of aml opcodes defined */ | ||
57 | |||
58 | #define AML_NUM_OPCODES 0x7F | ||
59 | |||
60 | /* Forward declarations */ | ||
61 | |||
62 | struct acpi_walk_state; | ||
63 | struct acpi_obj_mutex; | ||
64 | union acpi_parse_object; | ||
65 | |||
66 | /***************************************************************************** | ||
67 | * | ||
68 | * Mutex typedefs and structs | ||
69 | * | ||
70 | ****************************************************************************/ | ||
71 | |||
72 | /* | ||
73 | * Predefined handles for the mutex objects used within the subsystem | ||
74 | * All mutex objects are automatically created by acpi_ut_mutex_initialize. | ||
75 | * | ||
76 | * The acquire/release ordering protocol is implied via this list. Mutexes | ||
77 | * with a lower value must be acquired before mutexes with a higher value. | ||
78 | * | ||
79 | * NOTE: any changes here must be reflected in the acpi_gbl_mutex_names | ||
80 | * table below also! | ||
81 | */ | ||
82 | #define ACPI_MTX_INTERPRETER 0 /* AML Interpreter, main lock */ | ||
83 | #define ACPI_MTX_NAMESPACE 1 /* ACPI Namespace */ | ||
84 | #define ACPI_MTX_TABLES 2 /* Data for ACPI tables */ | ||
85 | #define ACPI_MTX_EVENTS 3 /* Data for ACPI events */ | ||
86 | #define ACPI_MTX_CACHES 4 /* Internal caches, general purposes */ | ||
87 | #define ACPI_MTX_MEMORY 5 /* Debug memory tracking lists */ | ||
88 | #define ACPI_MTX_DEBUG_CMD_COMPLETE 6 /* AML debugger */ | ||
89 | #define ACPI_MTX_DEBUG_CMD_READY 7 /* AML debugger */ | ||
90 | |||
91 | #define ACPI_MAX_MUTEX 7 | ||
92 | #define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1 | ||
93 | |||
94 | #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) | ||
95 | #ifdef DEFINE_ACPI_GLOBALS | ||
96 | |||
97 | /* Debug names for the mutexes above */ | ||
98 | |||
99 | static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = { | ||
100 | "ACPI_MTX_Interpreter", | ||
101 | "ACPI_MTX_Namespace", | ||
102 | "ACPI_MTX_Tables", | ||
103 | "ACPI_MTX_Events", | ||
104 | "ACPI_MTX_Caches", | ||
105 | "ACPI_MTX_Memory", | ||
106 | "ACPI_MTX_CommandComplete", | ||
107 | "ACPI_MTX_CommandReady" | ||
108 | }; | ||
109 | |||
110 | #endif | ||
111 | #endif | ||
112 | |||
113 | /* | ||
114 | * Predefined handles for spinlocks used within the subsystem. | ||
115 | * These spinlocks are created by acpi_ut_mutex_initialize | ||
116 | */ | ||
117 | #define ACPI_LOCK_GPES 0 | ||
118 | #define ACPI_LOCK_HARDWARE 1 | ||
119 | |||
120 | #define ACPI_MAX_LOCK 1 | ||
121 | #define ACPI_NUM_LOCK ACPI_MAX_LOCK+1 | ||
122 | |||
123 | /* Owner IDs are used to track namespace nodes for selective deletion */ | ||
124 | |||
125 | typedef u8 acpi_owner_id; | ||
126 | #define ACPI_OWNER_ID_MAX 0xFF | ||
127 | |||
128 | /* This Thread ID means that the mutex is not in use (unlocked) */ | ||
129 | |||
130 | #define ACPI_MUTEX_NOT_ACQUIRED (acpi_thread_id) 0 | ||
131 | |||
132 | /* Table for the global mutexes */ | ||
133 | |||
134 | struct acpi_mutex_info { | ||
135 | acpi_mutex mutex; | ||
136 | u32 use_count; | ||
137 | acpi_thread_id thread_id; | ||
138 | }; | ||
139 | |||
140 | /* Lock flag parameter for various interfaces */ | ||
141 | |||
142 | #define ACPI_MTX_DO_NOT_LOCK 0 | ||
143 | #define ACPI_MTX_LOCK 1 | ||
144 | |||
145 | /* Field access granularities */ | ||
146 | |||
147 | #define ACPI_FIELD_BYTE_GRANULARITY 1 | ||
148 | #define ACPI_FIELD_WORD_GRANULARITY 2 | ||
149 | #define ACPI_FIELD_DWORD_GRANULARITY 4 | ||
150 | #define ACPI_FIELD_QWORD_GRANULARITY 8 | ||
151 | |||
152 | #define ACPI_ENTRY_NOT_FOUND NULL | ||
153 | |||
154 | /***************************************************************************** | ||
155 | * | ||
156 | * Namespace typedefs and structs | ||
157 | * | ||
158 | ****************************************************************************/ | ||
159 | |||
160 | /* Operational modes of the AML interpreter/scanner */ | ||
161 | |||
162 | typedef enum { | ||
163 | ACPI_IMODE_LOAD_PASS1 = 0x01, | ||
164 | ACPI_IMODE_LOAD_PASS2 = 0x02, | ||
165 | ACPI_IMODE_EXECUTE = 0x03 | ||
166 | } acpi_interpreter_mode; | ||
167 | |||
168 | union acpi_name_union { | ||
169 | u32 integer; | ||
170 | char ascii[4]; | ||
171 | }; | ||
172 | |||
173 | /* | ||
174 | * The Namespace Node describes a named object that appears in the AML. | ||
175 | * descriptor_type is used to differentiate between internal descriptors. | ||
176 | * | ||
177 | * The node is optimized for both 32-bit and 64-bit platforms: | ||
178 | * 20 bytes for the 32-bit case, 32 bytes for the 64-bit case. | ||
179 | * | ||
180 | * Note: The descriptor_type and Type fields must appear in the identical | ||
181 | * position in both the struct acpi_namespace_node and union acpi_operand_object | ||
182 | * structures. | ||
183 | */ | ||
184 | struct acpi_namespace_node { | ||
185 | union acpi_operand_object *object; /* Interpreter object */ | ||
186 | u8 descriptor_type; /* Differentiate object descriptor types */ | ||
187 | u8 type; /* ACPI Type associated with this name */ | ||
188 | u8 flags; /* Miscellaneous flags */ | ||
189 | acpi_owner_id owner_id; /* Node creator */ | ||
190 | union acpi_name_union name; /* ACPI Name, always 4 chars per ACPI spec */ | ||
191 | struct acpi_namespace_node *child; /* First child */ | ||
192 | struct acpi_namespace_node *peer; /* Peer. Parent if ANOBJ_END_OF_PEER_LIST set */ | ||
193 | |||
194 | /* | ||
195 | * The following fields are used by the ASL compiler and disassembler only | ||
196 | */ | ||
197 | #ifdef ACPI_LARGE_NAMESPACE_NODE | ||
198 | union acpi_parse_object *op; | ||
199 | u32 value; | ||
200 | u32 length; | ||
201 | #endif | ||
202 | }; | ||
203 | |||
204 | /* Namespace Node flags */ | ||
205 | |||
206 | #define ANOBJ_END_OF_PEER_LIST 0x01 /* End-of-list, Peer field points to parent */ | ||
207 | #define ANOBJ_TEMPORARY 0x02 /* Node is create by a method and is temporary */ | ||
208 | #define ANOBJ_METHOD_ARG 0x04 /* Node is a method argument */ | ||
209 | #define ANOBJ_METHOD_LOCAL 0x08 /* Node is a method local */ | ||
210 | #define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */ | ||
211 | #define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */ | ||
212 | |||
213 | #define ANOBJ_IS_EXTERNAL 0x08 /* i_aSL only: This object created via External() */ | ||
214 | #define ANOBJ_METHOD_NO_RETVAL 0x10 /* i_aSL only: Method has no return value */ | ||
215 | #define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* i_aSL only: Method has at least one return value */ | ||
216 | #define ANOBJ_IS_BIT_OFFSET 0x40 /* i_aSL only: Reference is a bit offset */ | ||
217 | #define ANOBJ_IS_REFERENCED 0x80 /* i_aSL only: Object was referenced */ | ||
218 | |||
219 | /* | ||
220 | * ACPI Table Descriptor. One per ACPI table | ||
221 | */ | ||
222 | struct acpi_table_desc { | ||
223 | acpi_physical_address address; | ||
224 | struct acpi_table_header *pointer; | ||
225 | u32 length; /* Length fixed at 32 bits */ | ||
226 | union acpi_name_union signature; | ||
227 | acpi_owner_id owner_id; | ||
228 | u8 flags; | ||
229 | }; | ||
230 | |||
231 | /* Flags for above */ | ||
232 | |||
233 | #define ACPI_TABLE_ORIGIN_UNKNOWN (0) | ||
234 | #define ACPI_TABLE_ORIGIN_MAPPED (1) | ||
235 | #define ACPI_TABLE_ORIGIN_ALLOCATED (2) | ||
236 | #define ACPI_TABLE_ORIGIN_MASK (3) | ||
237 | #define ACPI_TABLE_IS_LOADED (4) | ||
238 | |||
239 | /* One internal RSDT for table management */ | ||
240 | |||
241 | struct acpi_internal_rsdt { | ||
242 | struct acpi_table_desc *tables; | ||
243 | u32 count; | ||
244 | u32 size; | ||
245 | u8 flags; | ||
246 | }; | ||
247 | |||
248 | /* Flags for above */ | ||
249 | |||
250 | #define ACPI_ROOT_ORIGIN_UNKNOWN (0) /* ~ORIGIN_ALLOCATED */ | ||
251 | #define ACPI_ROOT_ORIGIN_ALLOCATED (1) | ||
252 | #define ACPI_ROOT_ALLOW_RESIZE (2) | ||
253 | |||
254 | /* Predefined (fixed) table indexes */ | ||
255 | |||
256 | #define ACPI_TABLE_INDEX_DSDT (0) | ||
257 | #define ACPI_TABLE_INDEX_FACS (1) | ||
258 | |||
259 | struct acpi_find_context { | ||
260 | char *search_for; | ||
261 | acpi_handle *list; | ||
262 | u32 *count; | ||
263 | }; | ||
264 | |||
265 | struct acpi_ns_search_data { | ||
266 | struct acpi_namespace_node *node; | ||
267 | }; | ||
268 | |||
269 | /* | ||
270 | * Predefined Namespace items | ||
271 | */ | ||
272 | struct acpi_predefined_names { | ||
273 | char *name; | ||
274 | u8 type; | ||
275 | char *val; | ||
276 | }; | ||
277 | |||
278 | /* Object types used during package copies */ | ||
279 | |||
280 | #define ACPI_COPY_TYPE_SIMPLE 0 | ||
281 | #define ACPI_COPY_TYPE_PACKAGE 1 | ||
282 | |||
283 | /* Info structure used to convert external<->internal namestrings */ | ||
284 | |||
285 | struct acpi_namestring_info { | ||
286 | const char *external_name; | ||
287 | const char *next_external_char; | ||
288 | char *internal_name; | ||
289 | u32 length; | ||
290 | u32 num_segments; | ||
291 | u32 num_carats; | ||
292 | u8 fully_qualified; | ||
293 | }; | ||
294 | |||
295 | /* Field creation info */ | ||
296 | |||
297 | struct acpi_create_field_info { | ||
298 | struct acpi_namespace_node *region_node; | ||
299 | struct acpi_namespace_node *field_node; | ||
300 | struct acpi_namespace_node *register_node; | ||
301 | struct acpi_namespace_node *data_register_node; | ||
302 | u32 bank_value; | ||
303 | u32 field_bit_position; | ||
304 | u32 field_bit_length; | ||
305 | u8 field_flags; | ||
306 | u8 attribute; | ||
307 | u8 field_type; | ||
308 | }; | ||
309 | |||
310 | typedef | ||
311 | acpi_status(*ACPI_INTERNAL_METHOD) (struct acpi_walk_state * walk_state); | ||
312 | |||
313 | /* | ||
314 | * Bitmapped ACPI types. Used internally only | ||
315 | */ | ||
316 | #define ACPI_BTYPE_ANY 0x00000000 | ||
317 | #define ACPI_BTYPE_INTEGER 0x00000001 | ||
318 | #define ACPI_BTYPE_STRING 0x00000002 | ||
319 | #define ACPI_BTYPE_BUFFER 0x00000004 | ||
320 | #define ACPI_BTYPE_PACKAGE 0x00000008 | ||
321 | #define ACPI_BTYPE_FIELD_UNIT 0x00000010 | ||
322 | #define ACPI_BTYPE_DEVICE 0x00000020 | ||
323 | #define ACPI_BTYPE_EVENT 0x00000040 | ||
324 | #define ACPI_BTYPE_METHOD 0x00000080 | ||
325 | #define ACPI_BTYPE_MUTEX 0x00000100 | ||
326 | #define ACPI_BTYPE_REGION 0x00000200 | ||
327 | #define ACPI_BTYPE_POWER 0x00000400 | ||
328 | #define ACPI_BTYPE_PROCESSOR 0x00000800 | ||
329 | #define ACPI_BTYPE_THERMAL 0x00001000 | ||
330 | #define ACPI_BTYPE_BUFFER_FIELD 0x00002000 | ||
331 | #define ACPI_BTYPE_DDB_HANDLE 0x00004000 | ||
332 | #define ACPI_BTYPE_DEBUG_OBJECT 0x00008000 | ||
333 | #define ACPI_BTYPE_REFERENCE 0x00010000 | ||
334 | #define ACPI_BTYPE_RESOURCE 0x00020000 | ||
335 | |||
336 | #define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER) | ||
337 | |||
338 | #define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE) | ||
339 | #define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE) | ||
340 | #define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR) | ||
341 | #define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */ | ||
342 | #define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF | ||
343 | |||
344 | /* | ||
345 | * Information structure for ACPI predefined names. | ||
346 | * Each entry in the table contains the following items: | ||
347 | * | ||
348 | * Name - The ACPI reserved name | ||
349 | * param_count - Number of arguments to the method | ||
350 | * expected_return_btypes - Allowed type(s) for the return value | ||
351 | */ | ||
352 | struct acpi_name_info { | ||
353 | char name[ACPI_NAME_SIZE]; | ||
354 | u8 param_count; | ||
355 | u8 expected_btypes; | ||
356 | }; | ||
357 | |||
358 | /* | ||
359 | * Secondary information structures for ACPI predefined objects that return | ||
360 | * package objects. This structure appears as the next entry in the table | ||
361 | * after the NAME_INFO structure above. | ||
362 | * | ||
363 | * The reason for this is to minimize the size of the predefined name table. | ||
364 | */ | ||
365 | |||
366 | /* | ||
367 | * Used for ACPI_PTYPE1_FIXED, ACPI_PTYPE1_VAR, ACPI_PTYPE2, | ||
368 | * ACPI_PTYPE2_MIN, ACPI_PTYPE2_PKG_COUNT, ACPI_PTYPE2_COUNT | ||
369 | */ | ||
370 | struct acpi_package_info { | ||
371 | u8 type; | ||
372 | u8 object_type1; | ||
373 | u8 count1; | ||
374 | u8 object_type2; | ||
375 | u8 count2; | ||
376 | u8 reserved; | ||
377 | }; | ||
378 | |||
379 | /* Used for ACPI_PTYPE2_FIXED */ | ||
380 | |||
381 | struct acpi_package_info2 { | ||
382 | u8 type; | ||
383 | u8 count; | ||
384 | u8 object_type[4]; | ||
385 | }; | ||
386 | |||
387 | /* Used for ACPI_PTYPE1_OPTION */ | ||
388 | |||
389 | struct acpi_package_info3 { | ||
390 | u8 type; | ||
391 | u8 count; | ||
392 | u8 object_type[2]; | ||
393 | u8 tail_object_type; | ||
394 | u8 reserved; | ||
395 | }; | ||
396 | |||
397 | union acpi_predefined_info { | ||
398 | struct acpi_name_info info; | ||
399 | struct acpi_package_info ret_info; | ||
400 | struct acpi_package_info2 ret_info2; | ||
401 | struct acpi_package_info3 ret_info3; | ||
402 | }; | ||
403 | |||
404 | /* | ||
405 | * Bitmapped return value types | ||
406 | * Note: the actual data types must be contiguous, a loop in nspredef.c | ||
407 | * depends on this. | ||
408 | */ | ||
409 | #define ACPI_RTYPE_ANY 0x00 | ||
410 | #define ACPI_RTYPE_NONE 0x01 | ||
411 | #define ACPI_RTYPE_INTEGER 0x02 | ||
412 | #define ACPI_RTYPE_STRING 0x04 | ||
413 | #define ACPI_RTYPE_BUFFER 0x08 | ||
414 | #define ACPI_RTYPE_PACKAGE 0x10 | ||
415 | #define ACPI_RTYPE_REFERENCE 0x20 | ||
416 | #define ACPI_RTYPE_ALL 0x3F | ||
417 | |||
418 | #define ACPI_NUM_RTYPES 5 /* Number of actual object types */ | ||
419 | |||
420 | /***************************************************************************** | ||
421 | * | ||
422 | * Event typedefs and structs | ||
423 | * | ||
424 | ****************************************************************************/ | ||
425 | |||
426 | /* Dispatch info for each GPE -- either a method or handler, cannot be both */ | ||
427 | |||
428 | struct acpi_handler_info { | ||
429 | acpi_event_handler address; /* Address of handler, if any */ | ||
430 | void *context; /* Context to be passed to handler */ | ||
431 | struct acpi_namespace_node *method_node; /* Method node for this GPE level (saved) */ | ||
432 | }; | ||
433 | |||
434 | union acpi_gpe_dispatch_info { | ||
435 | struct acpi_namespace_node *method_node; /* Method node for this GPE level */ | ||
436 | struct acpi_handler_info *handler; | ||
437 | }; | ||
438 | |||
439 | /* | ||
440 | * Information about a GPE, one per each GPE in an array. | ||
441 | * NOTE: Important to keep this struct as small as possible. | ||
442 | */ | ||
443 | struct acpi_gpe_event_info { | ||
444 | union acpi_gpe_dispatch_info dispatch; /* Either Method or Handler */ | ||
445 | struct acpi_gpe_register_info *register_info; /* Backpointer to register info */ | ||
446 | u8 flags; /* Misc info about this GPE */ | ||
447 | u8 gpe_number; /* This GPE */ | ||
448 | }; | ||
449 | |||
450 | /* Information about a GPE register pair, one per each status/enable pair in an array */ | ||
451 | |||
452 | struct acpi_gpe_register_info { | ||
453 | struct acpi_generic_address status_address; /* Address of status reg */ | ||
454 | struct acpi_generic_address enable_address; /* Address of enable reg */ | ||
455 | u8 enable_for_wake; /* GPEs to keep enabled when sleeping */ | ||
456 | u8 enable_for_run; /* GPEs to keep enabled when running */ | ||
457 | u8 base_gpe_number; /* Base GPE number for this register */ | ||
458 | }; | ||
459 | |||
460 | /* | ||
461 | * Information about a GPE register block, one per each installed block -- | ||
462 | * GPE0, GPE1, and one per each installed GPE Block Device. | ||
463 | */ | ||
464 | struct acpi_gpe_block_info { | ||
465 | struct acpi_namespace_node *node; | ||
466 | struct acpi_gpe_block_info *previous; | ||
467 | struct acpi_gpe_block_info *next; | ||
468 | struct acpi_gpe_xrupt_info *xrupt_block; /* Backpointer to interrupt block */ | ||
469 | struct acpi_gpe_register_info *register_info; /* One per GPE register pair */ | ||
470 | struct acpi_gpe_event_info *event_info; /* One for each GPE */ | ||
471 | struct acpi_generic_address block_address; /* Base address of the block */ | ||
472 | u32 register_count; /* Number of register pairs in block */ | ||
473 | u8 block_base_number; /* Base GPE number for this block */ | ||
474 | }; | ||
475 | |||
476 | /* Information about GPE interrupt handlers, one per each interrupt level used for GPEs */ | ||
477 | |||
478 | struct acpi_gpe_xrupt_info { | ||
479 | struct acpi_gpe_xrupt_info *previous; | ||
480 | struct acpi_gpe_xrupt_info *next; | ||
481 | struct acpi_gpe_block_info *gpe_block_list_head; /* List of GPE blocks for this xrupt */ | ||
482 | u32 interrupt_number; /* System interrupt number */ | ||
483 | }; | ||
484 | |||
485 | struct acpi_gpe_walk_info { | ||
486 | struct acpi_namespace_node *gpe_device; | ||
487 | struct acpi_gpe_block_info *gpe_block; | ||
488 | }; | ||
489 | |||
490 | typedef acpi_status(*acpi_gpe_callback) (struct acpi_gpe_xrupt_info * | ||
491 | gpe_xrupt_info, | ||
492 | struct acpi_gpe_block_info * | ||
493 | gpe_block); | ||
494 | |||
495 | /* Information about each particular fixed event */ | ||
496 | |||
497 | struct acpi_fixed_event_handler { | ||
498 | acpi_event_handler handler; /* Address of handler. */ | ||
499 | void *context; /* Context to be passed to handler */ | ||
500 | }; | ||
501 | |||
502 | struct acpi_fixed_event_info { | ||
503 | u8 status_register_id; | ||
504 | u8 enable_register_id; | ||
505 | u16 status_bit_mask; | ||
506 | u16 enable_bit_mask; | ||
507 | }; | ||
508 | |||
509 | /* Information used during field processing */ | ||
510 | |||
511 | struct acpi_field_info { | ||
512 | u8 skip_field; | ||
513 | u8 field_flag; | ||
514 | u32 pkg_length; | ||
515 | }; | ||
516 | |||
517 | /***************************************************************************** | ||
518 | * | ||
519 | * Generic "state" object for stacks | ||
520 | * | ||
521 | ****************************************************************************/ | ||
522 | |||
523 | #define ACPI_CONTROL_NORMAL 0xC0 | ||
524 | #define ACPI_CONTROL_CONDITIONAL_EXECUTING 0xC1 | ||
525 | #define ACPI_CONTROL_PREDICATE_EXECUTING 0xC2 | ||
526 | #define ACPI_CONTROL_PREDICATE_FALSE 0xC3 | ||
527 | #define ACPI_CONTROL_PREDICATE_TRUE 0xC4 | ||
528 | |||
529 | #define ACPI_STATE_COMMON \ | ||
530 | void *next; \ | ||
531 | u8 descriptor_type; /* To differentiate various internal objs */\ | ||
532 | u8 flags; \ | ||
533 | u16 value; \ | ||
534 | u16 state; | ||
535 | |||
536 | /* There are 2 bytes available here until the next natural alignment boundary */ | ||
537 | |||
538 | struct acpi_common_state { | ||
539 | ACPI_STATE_COMMON}; | ||
540 | |||
541 | /* | ||
542 | * Update state - used to traverse complex objects such as packages | ||
543 | */ | ||
544 | struct acpi_update_state { | ||
545 | ACPI_STATE_COMMON union acpi_operand_object *object; | ||
546 | }; | ||
547 | |||
548 | /* | ||
549 | * Pkg state - used to traverse nested package structures | ||
550 | */ | ||
551 | struct acpi_pkg_state { | ||
552 | ACPI_STATE_COMMON u16 index; | ||
553 | union acpi_operand_object *source_object; | ||
554 | union acpi_operand_object *dest_object; | ||
555 | struct acpi_walk_state *walk_state; | ||
556 | void *this_target_obj; | ||
557 | u32 num_packages; | ||
558 | }; | ||
559 | |||
560 | /* | ||
561 | * Control state - one per if/else and while constructs. | ||
562 | * Allows nesting of these constructs | ||
563 | */ | ||
564 | struct acpi_control_state { | ||
565 | ACPI_STATE_COMMON u16 opcode; | ||
566 | union acpi_parse_object *predicate_op; | ||
567 | u8 *aml_predicate_start; /* Start of if/while predicate */ | ||
568 | u8 *package_end; /* End of if/while block */ | ||
569 | }; | ||
570 | |||
571 | /* | ||
572 | * Scope state - current scope during namespace lookups | ||
573 | */ | ||
574 | struct acpi_scope_state { | ||
575 | ACPI_STATE_COMMON struct acpi_namespace_node *node; | ||
576 | }; | ||
577 | |||
578 | struct acpi_pscope_state { | ||
579 | ACPI_STATE_COMMON u32 arg_count; /* Number of fixed arguments */ | ||
580 | union acpi_parse_object *op; /* Current op being parsed */ | ||
581 | u8 *arg_end; /* Current argument end */ | ||
582 | u8 *pkg_end; /* Current package end */ | ||
583 | u32 arg_list; /* Next argument to parse */ | ||
584 | }; | ||
585 | |||
586 | /* | ||
587 | * Thread state - one per thread across multiple walk states. Multiple walk | ||
588 | * states are created when there are nested control methods executing. | ||
589 | */ | ||
590 | struct acpi_thread_state { | ||
591 | ACPI_STATE_COMMON u8 current_sync_level; /* Mutex Sync (nested acquire) level */ | ||
592 | struct acpi_walk_state *walk_state_list; /* Head of list of walk_states for this thread */ | ||
593 | union acpi_operand_object *acquired_mutex_list; /* List of all currently acquired mutexes */ | ||
594 | acpi_thread_id thread_id; /* Running thread ID */ | ||
595 | }; | ||
596 | |||
597 | /* | ||
598 | * Result values - used to accumulate the results of nested | ||
599 | * AML arguments | ||
600 | */ | ||
601 | struct acpi_result_values { | ||
602 | ACPI_STATE_COMMON | ||
603 | union acpi_operand_object *obj_desc[ACPI_RESULTS_FRAME_OBJ_NUM]; | ||
604 | }; | ||
605 | |||
606 | typedef | ||
607 | acpi_status(*acpi_parse_downwards) (struct acpi_walk_state * walk_state, | ||
608 | union acpi_parse_object ** out_op); | ||
609 | |||
610 | typedef acpi_status(*acpi_parse_upwards) (struct acpi_walk_state * walk_state); | ||
611 | |||
612 | /* | ||
613 | * Notify info - used to pass info to the deferred notify | ||
614 | * handler/dispatcher. | ||
615 | */ | ||
616 | struct acpi_notify_info { | ||
617 | ACPI_STATE_COMMON struct acpi_namespace_node *node; | ||
618 | union acpi_operand_object *handler_obj; | ||
619 | }; | ||
620 | |||
621 | /* Generic state is union of structs above */ | ||
622 | |||
623 | union acpi_generic_state { | ||
624 | struct acpi_common_state common; | ||
625 | struct acpi_control_state control; | ||
626 | struct acpi_update_state update; | ||
627 | struct acpi_scope_state scope; | ||
628 | struct acpi_pscope_state parse_scope; | ||
629 | struct acpi_pkg_state pkg; | ||
630 | struct acpi_thread_state thread; | ||
631 | struct acpi_result_values results; | ||
632 | struct acpi_notify_info notify; | ||
633 | }; | ||
634 | |||
635 | /***************************************************************************** | ||
636 | * | ||
637 | * Interpreter typedefs and structs | ||
638 | * | ||
639 | ****************************************************************************/ | ||
640 | |||
641 | typedef acpi_status(*ACPI_EXECUTE_OP) (struct acpi_walk_state * walk_state); | ||
642 | |||
643 | /***************************************************************************** | ||
644 | * | ||
645 | * Parser typedefs and structs | ||
646 | * | ||
647 | ****************************************************************************/ | ||
648 | |||
649 | /* | ||
650 | * AML opcode, name, and argument layout | ||
651 | */ | ||
652 | struct acpi_opcode_info { | ||
653 | #if defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUG_OUTPUT) | ||
654 | char *name; /* Opcode name (disassembler/debug only) */ | ||
655 | #endif | ||
656 | u32 parse_args; /* Grammar/Parse time arguments */ | ||
657 | u32 runtime_args; /* Interpret time arguments */ | ||
658 | u16 flags; /* Misc flags */ | ||
659 | u8 object_type; /* Corresponding internal object type */ | ||
660 | u8 class; /* Opcode class */ | ||
661 | u8 type; /* Opcode type */ | ||
662 | }; | ||
663 | |||
664 | union acpi_parse_value { | ||
665 | acpi_integer integer; /* Integer constant (Up to 64 bits) */ | ||
666 | struct uint64_struct integer64; /* Structure overlay for 2 32-bit Dwords */ | ||
667 | u32 size; /* bytelist or field size */ | ||
668 | char *string; /* NULL terminated string */ | ||
669 | u8 *buffer; /* buffer or string */ | ||
670 | char *name; /* NULL terminated string */ | ||
671 | union acpi_parse_object *arg; /* arguments and contained ops */ | ||
672 | }; | ||
673 | |||
674 | #define ACPI_PARSE_COMMON \ | ||
675 | union acpi_parse_object *parent; /* Parent op */\ | ||
676 | u8 descriptor_type; /* To differentiate various internal objs */\ | ||
677 | u8 flags; /* Type of Op */\ | ||
678 | u16 aml_opcode; /* AML opcode */\ | ||
679 | u32 aml_offset; /* Offset of declaration in AML */\ | ||
680 | union acpi_parse_object *next; /* Next op */\ | ||
681 | struct acpi_namespace_node *node; /* For use by interpreter */\ | ||
682 | union acpi_parse_value value; /* Value or args associated with the opcode */\ | ||
683 | u8 arg_list_length; /* Number of elements in the arg list */\ | ||
684 | ACPI_DISASM_ONLY_MEMBERS (\ | ||
685 | u8 disasm_flags; /* Used during AML disassembly */\ | ||
686 | u8 disasm_opcode; /* Subtype used for disassembly */\ | ||
687 | char aml_op_name[16]) /* Op name (debug only) */ | ||
688 | |||
689 | #define ACPI_DASM_BUFFER 0x00 | ||
690 | #define ACPI_DASM_RESOURCE 0x01 | ||
691 | #define ACPI_DASM_STRING 0x02 | ||
692 | #define ACPI_DASM_UNICODE 0x03 | ||
693 | #define ACPI_DASM_EISAID 0x04 | ||
694 | #define ACPI_DASM_MATCHOP 0x05 | ||
695 | #define ACPI_DASM_LNOT_PREFIX 0x06 | ||
696 | #define ACPI_DASM_LNOT_SUFFIX 0x07 | ||
697 | #define ACPI_DASM_IGNORE 0x08 | ||
698 | |||
699 | /* | ||
700 | * Generic operation (for example: If, While, Store) | ||
701 | */ | ||
702 | struct acpi_parse_obj_common { | ||
703 | ACPI_PARSE_COMMON}; | ||
704 | |||
705 | /* | ||
706 | * Extended Op for named ops (Scope, Method, etc.), deferred ops (Methods and op_regions), | ||
707 | * and bytelists. | ||
708 | */ | ||
709 | struct acpi_parse_obj_named { | ||
710 | ACPI_PARSE_COMMON u8 *path; | ||
711 | u8 *data; /* AML body or bytelist data */ | ||
712 | u32 length; /* AML length */ | ||
713 | u32 name; /* 4-byte name or zero if no name */ | ||
714 | }; | ||
715 | |||
716 | /* This version is used by the i_aSL compiler only */ | ||
717 | |||
718 | #define ACPI_MAX_PARSEOP_NAME 20 | ||
719 | |||
720 | struct acpi_parse_obj_asl { | ||
721 | ACPI_PARSE_COMMON union acpi_parse_object *child; | ||
722 | union acpi_parse_object *parent_method; | ||
723 | char *filename; | ||
724 | char *external_name; | ||
725 | char *namepath; | ||
726 | char name_seg[4]; | ||
727 | u32 extra_value; | ||
728 | u32 column; | ||
729 | u32 line_number; | ||
730 | u32 logical_line_number; | ||
731 | u32 logical_byte_offset; | ||
732 | u32 end_line; | ||
733 | u32 end_logical_line; | ||
734 | u32 acpi_btype; | ||
735 | u32 aml_length; | ||
736 | u32 aml_subtree_length; | ||
737 | u32 final_aml_length; | ||
738 | u32 final_aml_offset; | ||
739 | u32 compile_flags; | ||
740 | u16 parse_opcode; | ||
741 | u8 aml_opcode_length; | ||
742 | u8 aml_pkg_len_bytes; | ||
743 | u8 extra; | ||
744 | char parse_op_name[ACPI_MAX_PARSEOP_NAME]; | ||
745 | }; | ||
746 | |||
747 | union acpi_parse_object { | ||
748 | struct acpi_parse_obj_common common; | ||
749 | struct acpi_parse_obj_named named; | ||
750 | struct acpi_parse_obj_asl asl; | ||
751 | }; | ||
752 | |||
753 | /* | ||
754 | * Parse state - one state per parser invocation and each control | ||
755 | * method. | ||
756 | */ | ||
757 | struct acpi_parse_state { | ||
758 | u8 *aml_start; /* First AML byte */ | ||
759 | u8 *aml; /* Next AML byte */ | ||
760 | u8 *aml_end; /* (last + 1) AML byte */ | ||
761 | u8 *pkg_start; /* Current package begin */ | ||
762 | u8 *pkg_end; /* Current package end */ | ||
763 | union acpi_parse_object *start_op; /* Root of parse tree */ | ||
764 | struct acpi_namespace_node *start_node; | ||
765 | union acpi_generic_state *scope; /* Current scope */ | ||
766 | union acpi_parse_object *start_scope; | ||
767 | u32 aml_size; | ||
768 | }; | ||
769 | |||
770 | /* Parse object flags */ | ||
771 | |||
772 | #define ACPI_PARSEOP_GENERIC 0x01 | ||
773 | #define ACPI_PARSEOP_NAMED 0x02 | ||
774 | #define ACPI_PARSEOP_DEFERRED 0x04 | ||
775 | #define ACPI_PARSEOP_BYTELIST 0x08 | ||
776 | #define ACPI_PARSEOP_IN_STACK 0x10 | ||
777 | #define ACPI_PARSEOP_TARGET 0x20 | ||
778 | #define ACPI_PARSEOP_IN_CACHE 0x80 | ||
779 | |||
780 | /* Parse object disasm_flags */ | ||
781 | |||
782 | #define ACPI_PARSEOP_IGNORE 0x01 | ||
783 | #define ACPI_PARSEOP_PARAMLIST 0x02 | ||
784 | #define ACPI_PARSEOP_EMPTY_TERMLIST 0x04 | ||
785 | #define ACPI_PARSEOP_SPECIAL 0x10 | ||
786 | |||
787 | /***************************************************************************** | ||
788 | * | ||
789 | * Hardware (ACPI registers) and PNP | ||
790 | * | ||
791 | ****************************************************************************/ | ||
792 | |||
793 | #define PCI_ROOT_HID_STRING "PNP0A03" | ||
794 | #define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08" | ||
795 | |||
796 | struct acpi_bit_register_info { | ||
797 | u8 parent_register; | ||
798 | u8 bit_position; | ||
799 | u16 access_bit_mask; | ||
800 | }; | ||
801 | |||
802 | /* | ||
803 | * Some ACPI registers have bits that must be ignored -- meaning that they | ||
804 | * must be preserved. | ||
805 | */ | ||
806 | #define ACPI_PM1_STATUS_PRESERVED_BITS 0x0800 /* Bit 11 */ | ||
807 | #define ACPI_PM1_CONTROL_PRESERVED_BITS 0x0200 /* Bit 9 (whatever) */ | ||
808 | |||
809 | /* | ||
810 | * Register IDs | ||
811 | * These are the full ACPI registers | ||
812 | */ | ||
813 | #define ACPI_REGISTER_PM1_STATUS 0x01 | ||
814 | #define ACPI_REGISTER_PM1_ENABLE 0x02 | ||
815 | #define ACPI_REGISTER_PM1_CONTROL 0x03 | ||
816 | #define ACPI_REGISTER_PM1A_CONTROL 0x04 | ||
817 | #define ACPI_REGISTER_PM1B_CONTROL 0x05 | ||
818 | #define ACPI_REGISTER_PM2_CONTROL 0x06 | ||
819 | #define ACPI_REGISTER_PM_TIMER 0x07 | ||
820 | #define ACPI_REGISTER_PROCESSOR_BLOCK 0x08 | ||
821 | #define ACPI_REGISTER_SMI_COMMAND_BLOCK 0x09 | ||
822 | |||
823 | /* Masks used to access the bit_registers */ | ||
824 | |||
825 | #define ACPI_BITMASK_TIMER_STATUS 0x0001 | ||
826 | #define ACPI_BITMASK_BUS_MASTER_STATUS 0x0010 | ||
827 | #define ACPI_BITMASK_GLOBAL_LOCK_STATUS 0x0020 | ||
828 | #define ACPI_BITMASK_POWER_BUTTON_STATUS 0x0100 | ||
829 | #define ACPI_BITMASK_SLEEP_BUTTON_STATUS 0x0200 | ||
830 | #define ACPI_BITMASK_RT_CLOCK_STATUS 0x0400 | ||
831 | #define ACPI_BITMASK_PCIEXP_WAKE_STATUS 0x4000 /* ACPI 3.0 */ | ||
832 | #define ACPI_BITMASK_WAKE_STATUS 0x8000 | ||
833 | |||
834 | #define ACPI_BITMASK_ALL_FIXED_STATUS (\ | ||
835 | ACPI_BITMASK_TIMER_STATUS | \ | ||
836 | ACPI_BITMASK_BUS_MASTER_STATUS | \ | ||
837 | ACPI_BITMASK_GLOBAL_LOCK_STATUS | \ | ||
838 | ACPI_BITMASK_POWER_BUTTON_STATUS | \ | ||
839 | ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ | ||
840 | ACPI_BITMASK_RT_CLOCK_STATUS | \ | ||
841 | ACPI_BITMASK_WAKE_STATUS) | ||
842 | |||
843 | #define ACPI_BITMASK_TIMER_ENABLE 0x0001 | ||
844 | #define ACPI_BITMASK_GLOBAL_LOCK_ENABLE 0x0020 | ||
845 | #define ACPI_BITMASK_POWER_BUTTON_ENABLE 0x0100 | ||
846 | #define ACPI_BITMASK_SLEEP_BUTTON_ENABLE 0x0200 | ||
847 | #define ACPI_BITMASK_RT_CLOCK_ENABLE 0x0400 | ||
848 | #define ACPI_BITMASK_PCIEXP_WAKE_DISABLE 0x4000 /* ACPI 3.0 */ | ||
849 | |||
850 | #define ACPI_BITMASK_SCI_ENABLE 0x0001 | ||
851 | #define ACPI_BITMASK_BUS_MASTER_RLD 0x0002 | ||
852 | #define ACPI_BITMASK_GLOBAL_LOCK_RELEASE 0x0004 | ||
853 | #define ACPI_BITMASK_SLEEP_TYPE_X 0x1C00 | ||
854 | #define ACPI_BITMASK_SLEEP_ENABLE 0x2000 | ||
855 | |||
856 | #define ACPI_BITMASK_ARB_DISABLE 0x0001 | ||
857 | |||
858 | /* Raw bit position of each bit_register */ | ||
859 | |||
860 | #define ACPI_BITPOSITION_TIMER_STATUS 0x00 | ||
861 | #define ACPI_BITPOSITION_BUS_MASTER_STATUS 0x04 | ||
862 | #define ACPI_BITPOSITION_GLOBAL_LOCK_STATUS 0x05 | ||
863 | #define ACPI_BITPOSITION_POWER_BUTTON_STATUS 0x08 | ||
864 | #define ACPI_BITPOSITION_SLEEP_BUTTON_STATUS 0x09 | ||
865 | #define ACPI_BITPOSITION_RT_CLOCK_STATUS 0x0A | ||
866 | #define ACPI_BITPOSITION_PCIEXP_WAKE_STATUS 0x0E /* ACPI 3.0 */ | ||
867 | #define ACPI_BITPOSITION_WAKE_STATUS 0x0F | ||
868 | |||
869 | #define ACPI_BITPOSITION_TIMER_ENABLE 0x00 | ||
870 | #define ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE 0x05 | ||
871 | #define ACPI_BITPOSITION_POWER_BUTTON_ENABLE 0x08 | ||
872 | #define ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE 0x09 | ||
873 | #define ACPI_BITPOSITION_RT_CLOCK_ENABLE 0x0A | ||
874 | #define ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE 0x0E /* ACPI 3.0 */ | ||
875 | |||
876 | #define ACPI_BITPOSITION_SCI_ENABLE 0x00 | ||
877 | #define ACPI_BITPOSITION_BUS_MASTER_RLD 0x01 | ||
878 | #define ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE 0x02 | ||
879 | #define ACPI_BITPOSITION_SLEEP_TYPE_X 0x0A | ||
880 | #define ACPI_BITPOSITION_SLEEP_ENABLE 0x0D | ||
881 | |||
882 | #define ACPI_BITPOSITION_ARB_DISABLE 0x00 | ||
883 | |||
884 | /***************************************************************************** | ||
885 | * | ||
886 | * Resource descriptors | ||
887 | * | ||
888 | ****************************************************************************/ | ||
889 | |||
890 | /* resource_type values */ | ||
891 | |||
892 | #define ACPI_ADDRESS_TYPE_MEMORY_RANGE 0 | ||
893 | #define ACPI_ADDRESS_TYPE_IO_RANGE 1 | ||
894 | #define ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE 2 | ||
895 | |||
896 | /* Resource descriptor types and masks */ | ||
897 | |||
898 | #define ACPI_RESOURCE_NAME_LARGE 0x80 | ||
899 | #define ACPI_RESOURCE_NAME_SMALL 0x00 | ||
900 | |||
901 | #define ACPI_RESOURCE_NAME_SMALL_MASK 0x78 /* Bits 6:3 contain the type */ | ||
902 | #define ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK 0x07 /* Bits 2:0 contain the length */ | ||
903 | #define ACPI_RESOURCE_NAME_LARGE_MASK 0x7F /* Bits 6:0 contain the type */ | ||
904 | |||
905 | /* | ||
906 | * Small resource descriptor "names" as defined by the ACPI specification. | ||
907 | * Note: Bits 2:0 are used for the descriptor length | ||
908 | */ | ||
909 | #define ACPI_RESOURCE_NAME_IRQ 0x20 | ||
910 | #define ACPI_RESOURCE_NAME_DMA 0x28 | ||
911 | #define ACPI_RESOURCE_NAME_START_DEPENDENT 0x30 | ||
912 | #define ACPI_RESOURCE_NAME_END_DEPENDENT 0x38 | ||
913 | #define ACPI_RESOURCE_NAME_IO 0x40 | ||
914 | #define ACPI_RESOURCE_NAME_FIXED_IO 0x48 | ||
915 | #define ACPI_RESOURCE_NAME_RESERVED_S1 0x50 | ||
916 | #define ACPI_RESOURCE_NAME_RESERVED_S2 0x58 | ||
917 | #define ACPI_RESOURCE_NAME_RESERVED_S3 0x60 | ||
918 | #define ACPI_RESOURCE_NAME_RESERVED_S4 0x68 | ||
919 | #define ACPI_RESOURCE_NAME_VENDOR_SMALL 0x70 | ||
920 | #define ACPI_RESOURCE_NAME_END_TAG 0x78 | ||
921 | |||
922 | /* | ||
923 | * Large resource descriptor "names" as defined by the ACPI specification. | ||
924 | * Note: includes the Large Descriptor bit in bit[7] | ||
925 | */ | ||
926 | #define ACPI_RESOURCE_NAME_MEMORY24 0x81 | ||
927 | #define ACPI_RESOURCE_NAME_GENERIC_REGISTER 0x82 | ||
928 | #define ACPI_RESOURCE_NAME_RESERVED_L1 0x83 | ||
929 | #define ACPI_RESOURCE_NAME_VENDOR_LARGE 0x84 | ||
930 | #define ACPI_RESOURCE_NAME_MEMORY32 0x85 | ||
931 | #define ACPI_RESOURCE_NAME_FIXED_MEMORY32 0x86 | ||
932 | #define ACPI_RESOURCE_NAME_ADDRESS32 0x87 | ||
933 | #define ACPI_RESOURCE_NAME_ADDRESS16 0x88 | ||
934 | #define ACPI_RESOURCE_NAME_EXTENDED_IRQ 0x89 | ||
935 | #define ACPI_RESOURCE_NAME_ADDRESS64 0x8A | ||
936 | #define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 0x8B | ||
937 | #define ACPI_RESOURCE_NAME_LARGE_MAX 0x8B | ||
938 | |||
939 | /***************************************************************************** | ||
940 | * | ||
941 | * Miscellaneous | ||
942 | * | ||
943 | ****************************************************************************/ | ||
944 | |||
945 | #define ACPI_ASCII_ZERO 0x30 | ||
946 | |||
947 | /***************************************************************************** | ||
948 | * | ||
949 | * Debugger | ||
950 | * | ||
951 | ****************************************************************************/ | ||
952 | |||
953 | struct acpi_db_method_info { | ||
954 | acpi_handle main_thread_gate; | ||
955 | acpi_handle thread_complete_gate; | ||
956 | u32 *threads; | ||
957 | u32 num_threads; | ||
958 | u32 num_created; | ||
959 | u32 num_completed; | ||
960 | |||
961 | char *name; | ||
962 | u32 flags; | ||
963 | u32 num_loops; | ||
964 | char pathname[128]; | ||
965 | char **args; | ||
966 | |||
967 | /* | ||
968 | * Arguments to be passed to method for the command | ||
969 | * Threads - | ||
970 | * the Number of threads, ID of current thread and | ||
971 | * Index of current thread inside all them created. | ||
972 | */ | ||
973 | char init_args; | ||
974 | char *arguments[4]; | ||
975 | char num_threads_str[11]; | ||
976 | char id_of_thread_str[11]; | ||
977 | char index_of_thread_str[11]; | ||
978 | }; | ||
979 | |||
980 | struct acpi_integrity_info { | ||
981 | u32 nodes; | ||
982 | u32 objects; | ||
983 | }; | ||
984 | |||
985 | #define ACPI_DB_REDIRECTABLE_OUTPUT 0x01 | ||
986 | #define ACPI_DB_CONSOLE_OUTPUT 0x02 | ||
987 | #define ACPI_DB_DUPLICATE_OUTPUT 0x03 | ||
988 | |||
989 | /***************************************************************************** | ||
990 | * | ||
991 | * Debug | ||
992 | * | ||
993 | ****************************************************************************/ | ||
994 | |||
995 | /* Entry for a memory allocation (debug only) */ | ||
996 | |||
997 | #define ACPI_MEM_MALLOC 0 | ||
998 | #define ACPI_MEM_CALLOC 1 | ||
999 | #define ACPI_MAX_MODULE_NAME 16 | ||
1000 | |||
1001 | #define ACPI_COMMON_DEBUG_MEM_HEADER \ | ||
1002 | struct acpi_debug_mem_block *previous; \ | ||
1003 | struct acpi_debug_mem_block *next; \ | ||
1004 | u32 size; \ | ||
1005 | u32 component; \ | ||
1006 | u32 line; \ | ||
1007 | char module[ACPI_MAX_MODULE_NAME]; \ | ||
1008 | u8 alloc_type; | ||
1009 | |||
1010 | struct acpi_debug_mem_header { | ||
1011 | ACPI_COMMON_DEBUG_MEM_HEADER}; | ||
1012 | |||
1013 | struct acpi_debug_mem_block { | ||
1014 | ACPI_COMMON_DEBUG_MEM_HEADER u64 user_space; | ||
1015 | }; | ||
1016 | |||
1017 | #define ACPI_MEM_LIST_GLOBAL 0 | ||
1018 | #define ACPI_MEM_LIST_NSNODE 1 | ||
1019 | #define ACPI_MEM_LIST_MAX 1 | ||
1020 | #define ACPI_NUM_MEM_LISTS 2 | ||
1021 | |||
1022 | struct acpi_memory_list { | ||
1023 | char *list_name; | ||
1024 | void *list_head; | ||
1025 | u16 object_size; | ||
1026 | u16 max_depth; | ||
1027 | u16 current_depth; | ||
1028 | u16 link_offset; | ||
1029 | |||
1030 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | ||
1031 | |||
1032 | /* Statistics for debug memory tracking only */ | ||
1033 | |||
1034 | u32 total_allocated; | ||
1035 | u32 total_freed; | ||
1036 | u32 max_occupied; | ||
1037 | u32 total_size; | ||
1038 | u32 current_total_size; | ||
1039 | u32 requests; | ||
1040 | u32 hits; | ||
1041 | #endif | ||
1042 | }; | ||
1043 | |||
1044 | #endif /* __ACLOCAL_H__ */ | ||
diff --git a/include/acpi/acmacros.h b/include/acpi/acmacros.h deleted file mode 100644 index a597207e2835..000000000000 --- a/include/acpi/acmacros.h +++ /dev/null | |||
@@ -1,693 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acmacros.h - C macros for the entire subsystem. | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACMACROS_H__ | ||
45 | #define __ACMACROS_H__ | ||
46 | |||
47 | /* | ||
48 | * Data manipulation macros | ||
49 | */ | ||
50 | #define ACPI_LOWORD(l) ((u16)(u32)(l)) | ||
51 | #define ACPI_HIWORD(l) ((u16)((((u32)(l)) >> 16) & 0xFFFF)) | ||
52 | #define ACPI_LOBYTE(l) ((u8)(u16)(l)) | ||
53 | #define ACPI_HIBYTE(l) ((u8)((((u16)(l)) >> 8) & 0xFF)) | ||
54 | |||
55 | #define ACPI_SET_BIT(target,bit) ((target) |= (bit)) | ||
56 | #define ACPI_CLEAR_BIT(target,bit) ((target) &= ~(bit)) | ||
57 | #define ACPI_MIN(a,b) (((a)<(b))?(a):(b)) | ||
58 | #define ACPI_MAX(a,b) (((a)>(b))?(a):(b)) | ||
59 | |||
60 | /* Size calculation */ | ||
61 | |||
62 | #define ACPI_ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0])) | ||
63 | |||
64 | /* | ||
65 | * Extract data using a pointer. Any more than a byte and we | ||
66 | * get into potential aligment issues -- see the STORE macros below. | ||
67 | * Use with care. | ||
68 | */ | ||
69 | #define ACPI_GET8(ptr) *ACPI_CAST_PTR (u8, ptr) | ||
70 | #define ACPI_GET16(ptr) *ACPI_CAST_PTR (u16, ptr) | ||
71 | #define ACPI_GET32(ptr) *ACPI_CAST_PTR (u32, ptr) | ||
72 | #define ACPI_GET64(ptr) *ACPI_CAST_PTR (u64, ptr) | ||
73 | #define ACPI_SET8(ptr) *ACPI_CAST_PTR (u8, ptr) | ||
74 | #define ACPI_SET16(ptr) *ACPI_CAST_PTR (u16, ptr) | ||
75 | #define ACPI_SET32(ptr) *ACPI_CAST_PTR (u32, ptr) | ||
76 | #define ACPI_SET64(ptr) *ACPI_CAST_PTR (u64, ptr) | ||
77 | |||
78 | /* | ||
79 | * Pointer manipulation | ||
80 | */ | ||
81 | #define ACPI_CAST_PTR(t, p) ((t *) (acpi_uintptr_t) (p)) | ||
82 | #define ACPI_CAST_INDIRECT_PTR(t, p) ((t **) (acpi_uintptr_t) (p)) | ||
83 | #define ACPI_ADD_PTR(t, a, b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8, (a)) + (acpi_size)(b))) | ||
84 | #define ACPI_PTR_DIFF(a, b) (acpi_size) (ACPI_CAST_PTR (u8, (a)) - ACPI_CAST_PTR (u8, (b))) | ||
85 | |||
86 | /* Pointer/Integer type conversions */ | ||
87 | |||
88 | #define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void, (void *) NULL, (acpi_size) i) | ||
89 | #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) NULL) | ||
90 | #define ACPI_OFFSET(d, f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f), (void *) NULL) | ||
91 | #define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) | ||
92 | #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) | ||
93 | |||
94 | #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED | ||
95 | #define ACPI_COMPARE_NAME(a, b) (*ACPI_CAST_PTR (u32, (a)) == *ACPI_CAST_PTR (u32, (b))) | ||
96 | #else | ||
97 | #define ACPI_COMPARE_NAME(a, b) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_CAST_PTR (char, (b)), ACPI_NAME_SIZE)) | ||
98 | #endif | ||
99 | |||
100 | /* | ||
101 | * Full 64-bit integer must be available on both 32-bit and 64-bit platforms | ||
102 | */ | ||
103 | struct acpi_integer_overlay { | ||
104 | u32 lo_dword; | ||
105 | u32 hi_dword; | ||
106 | }; | ||
107 | |||
108 | #define ACPI_LODWORD(integer) (ACPI_CAST_PTR (struct acpi_integer_overlay, &integer)->lo_dword) | ||
109 | #define ACPI_HIDWORD(integer) (ACPI_CAST_PTR (struct acpi_integer_overlay, &integer)->hi_dword) | ||
110 | |||
111 | /* | ||
112 | * printf() format helpers | ||
113 | */ | ||
114 | |||
115 | /* Split 64-bit integer into two 32-bit values. Use with %8.8_x%8.8_x */ | ||
116 | |||
117 | #define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i), ACPI_LODWORD(i) | ||
118 | |||
119 | #if ACPI_MACHINE_WIDTH == 64 | ||
120 | #define ACPI_FORMAT_NATIVE_UINT(i) ACPI_FORMAT_UINT64(i) | ||
121 | #else | ||
122 | #define ACPI_FORMAT_NATIVE_UINT(i) 0, (i) | ||
123 | #endif | ||
124 | |||
125 | /* | ||
126 | * Macros for moving data around to/from buffers that are possibly unaligned. | ||
127 | * If the hardware supports the transfer of unaligned data, just do the store. | ||
128 | * Otherwise, we have to move one byte at a time. | ||
129 | */ | ||
130 | #ifdef ACPI_BIG_ENDIAN | ||
131 | /* | ||
132 | * Macros for big-endian machines | ||
133 | */ | ||
134 | |||
135 | /* These macros reverse the bytes during the move, converting little-endian to big endian */ | ||
136 | |||
137 | /* Big Endian <== Little Endian */ | ||
138 | /* Hi...Lo Lo...Hi */ | ||
139 | /* 16-bit source, 16/32/64 destination */ | ||
140 | |||
141 | #define ACPI_MOVE_16_TO_16(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[1];\ | ||
142 | (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[0];} | ||
143 | |||
144 | #define ACPI_MOVE_16_TO_32(d, s) {(*(u32 *)(void *)(d))=0;\ | ||
145 | ((u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[1];\ | ||
146 | ((u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[0];} | ||
147 | |||
148 | #define ACPI_MOVE_16_TO_64(d, s) {(*(u64 *)(void *)(d))=0;\ | ||
149 | ((u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\ | ||
150 | ((u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];} | ||
151 | |||
152 | /* 32-bit source, 16/32/64 destination */ | ||
153 | |||
154 | #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ | ||
155 | |||
156 | #define ACPI_MOVE_32_TO_32(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[3];\ | ||
157 | (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[2];\ | ||
158 | (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[1];\ | ||
159 | (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[0];} | ||
160 | |||
161 | #define ACPI_MOVE_32_TO_64(d, s) {(*(u64 *)(void *)(d))=0;\ | ||
162 | ((u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[3];\ | ||
163 | ((u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[2];\ | ||
164 | ((u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\ | ||
165 | ((u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];} | ||
166 | |||
167 | /* 64-bit source, 16/32/64 destination */ | ||
168 | |||
169 | #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ | ||
170 | |||
171 | #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ | ||
172 | |||
173 | #define ACPI_MOVE_64_TO_64(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[7];\ | ||
174 | (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[6];\ | ||
175 | (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[5];\ | ||
176 | (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[4];\ | ||
177 | (( u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[3];\ | ||
178 | (( u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[2];\ | ||
179 | (( u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\ | ||
180 | (( u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];} | ||
181 | #else | ||
182 | /* | ||
183 | * Macros for little-endian machines | ||
184 | */ | ||
185 | |||
186 | #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED | ||
187 | |||
188 | /* The hardware supports unaligned transfers, just do the little-endian move */ | ||
189 | |||
190 | /* 16-bit source, 16/32/64 destination */ | ||
191 | |||
192 | #define ACPI_MOVE_16_TO_16(d, s) *(u16 *)(void *)(d) = *(u16 *)(void *)(s) | ||
193 | #define ACPI_MOVE_16_TO_32(d, s) *(u32 *)(void *)(d) = *(u16 *)(void *)(s) | ||
194 | #define ACPI_MOVE_16_TO_64(d, s) *(u64 *)(void *)(d) = *(u16 *)(void *)(s) | ||
195 | |||
196 | /* 32-bit source, 16/32/64 destination */ | ||
197 | |||
198 | #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ | ||
199 | #define ACPI_MOVE_32_TO_32(d, s) *(u32 *)(void *)(d) = *(u32 *)(void *)(s) | ||
200 | #define ACPI_MOVE_32_TO_64(d, s) *(u64 *)(void *)(d) = *(u32 *)(void *)(s) | ||
201 | |||
202 | /* 64-bit source, 16/32/64 destination */ | ||
203 | |||
204 | #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ | ||
205 | #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ | ||
206 | #define ACPI_MOVE_64_TO_64(d, s) *(u64 *)(void *)(d) = *(u64 *)(void *)(s) | ||
207 | |||
208 | #else | ||
209 | /* | ||
210 | * The hardware does not support unaligned transfers. We must move the | ||
211 | * data one byte at a time. These macros work whether the source or | ||
212 | * the destination (or both) is/are unaligned. (Little-endian move) | ||
213 | */ | ||
214 | |||
215 | /* 16-bit source, 16/32/64 destination */ | ||
216 | |||
217 | #define ACPI_MOVE_16_TO_16(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\ | ||
218 | (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];} | ||
219 | |||
220 | #define ACPI_MOVE_16_TO_32(d, s) {(*(u32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);} | ||
221 | #define ACPI_MOVE_16_TO_64(d, s) {(*(u64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);} | ||
222 | |||
223 | /* 32-bit source, 16/32/64 destination */ | ||
224 | |||
225 | #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ | ||
226 | |||
227 | #define ACPI_MOVE_32_TO_32(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\ | ||
228 | (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];\ | ||
229 | (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[2];\ | ||
230 | (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[3];} | ||
231 | |||
232 | #define ACPI_MOVE_32_TO_64(d, s) {(*(u64 *)(void *)(d)) = 0; ACPI_MOVE_32_TO_32(d, s);} | ||
233 | |||
234 | /* 64-bit source, 16/32/64 destination */ | ||
235 | |||
236 | #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ | ||
237 | #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ | ||
238 | #define ACPI_MOVE_64_TO_64(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\ | ||
239 | (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];\ | ||
240 | (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[2];\ | ||
241 | (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[3];\ | ||
242 | (( u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[4];\ | ||
243 | (( u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[5];\ | ||
244 | (( u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[6];\ | ||
245 | (( u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[7];} | ||
246 | #endif | ||
247 | #endif | ||
248 | |||
249 | /* Macros based on machine integer width */ | ||
250 | |||
251 | #if ACPI_MACHINE_WIDTH == 32 | ||
252 | #define ACPI_MOVE_SIZE_TO_16(d, s) ACPI_MOVE_32_TO_16(d, s) | ||
253 | |||
254 | #elif ACPI_MACHINE_WIDTH == 64 | ||
255 | #define ACPI_MOVE_SIZE_TO_16(d, s) ACPI_MOVE_64_TO_16(d, s) | ||
256 | |||
257 | #else | ||
258 | #error unknown ACPI_MACHINE_WIDTH | ||
259 | #endif | ||
260 | |||
261 | /* | ||
262 | * Fast power-of-two math macros for non-optimized compilers | ||
263 | */ | ||
264 | #define _ACPI_DIV(value, power_of2) ((u32) ((value) >> (power_of2))) | ||
265 | #define _ACPI_MUL(value, power_of2) ((u32) ((value) << (power_of2))) | ||
266 | #define _ACPI_MOD(value, divisor) ((u32) ((value) & ((divisor) -1))) | ||
267 | |||
268 | #define ACPI_DIV_2(a) _ACPI_DIV(a, 1) | ||
269 | #define ACPI_MUL_2(a) _ACPI_MUL(a, 1) | ||
270 | #define ACPI_MOD_2(a) _ACPI_MOD(a, 2) | ||
271 | |||
272 | #define ACPI_DIV_4(a) _ACPI_DIV(a, 2) | ||
273 | #define ACPI_MUL_4(a) _ACPI_MUL(a, 2) | ||
274 | #define ACPI_MOD_4(a) _ACPI_MOD(a, 4) | ||
275 | |||
276 | #define ACPI_DIV_8(a) _ACPI_DIV(a, 3) | ||
277 | #define ACPI_MUL_8(a) _ACPI_MUL(a, 3) | ||
278 | #define ACPI_MOD_8(a) _ACPI_MOD(a, 8) | ||
279 | |||
280 | #define ACPI_DIV_16(a) _ACPI_DIV(a, 4) | ||
281 | #define ACPI_MUL_16(a) _ACPI_MUL(a, 4) | ||
282 | #define ACPI_MOD_16(a) _ACPI_MOD(a, 16) | ||
283 | |||
284 | #define ACPI_DIV_32(a) _ACPI_DIV(a, 5) | ||
285 | #define ACPI_MUL_32(a) _ACPI_MUL(a, 5) | ||
286 | #define ACPI_MOD_32(a) _ACPI_MOD(a, 32) | ||
287 | |||
288 | /* | ||
289 | * Rounding macros (Power of two boundaries only) | ||
290 | */ | ||
291 | #define ACPI_ROUND_DOWN(value, boundary) (((acpi_size)(value)) & \ | ||
292 | (~(((acpi_size) boundary)-1))) | ||
293 | |||
294 | #define ACPI_ROUND_UP(value, boundary) ((((acpi_size)(value)) + \ | ||
295 | (((acpi_size) boundary)-1)) & \ | ||
296 | (~(((acpi_size) boundary)-1))) | ||
297 | |||
298 | /* Note: sizeof(acpi_size) evaluates to either 4 or 8 (32- vs 64-bit mode) */ | ||
299 | |||
300 | #define ACPI_ROUND_DOWN_TO_32BIT(a) ACPI_ROUND_DOWN(a, 4) | ||
301 | #define ACPI_ROUND_DOWN_TO_64BIT(a) ACPI_ROUND_DOWN(a, 8) | ||
302 | #define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a) ACPI_ROUND_DOWN(a, sizeof(acpi_size)) | ||
303 | |||
304 | #define ACPI_ROUND_UP_TO_32BIT(a) ACPI_ROUND_UP(a, 4) | ||
305 | #define ACPI_ROUND_UP_TO_64BIT(a) ACPI_ROUND_UP(a, 8) | ||
306 | #define ACPI_ROUND_UP_TO_NATIVE_WORD(a) ACPI_ROUND_UP(a, sizeof(acpi_size)) | ||
307 | |||
308 | #define ACPI_ROUND_BITS_UP_TO_BYTES(a) ACPI_DIV_8((a) + 7) | ||
309 | #define ACPI_ROUND_BITS_DOWN_TO_BYTES(a) ACPI_DIV_8((a)) | ||
310 | |||
311 | #define ACPI_ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) | ||
312 | |||
313 | /* Generic (non-power-of-two) rounding */ | ||
314 | |||
315 | #define ACPI_ROUND_UP_TO(value, boundary) (((value) + ((boundary)-1)) / (boundary)) | ||
316 | |||
317 | #define ACPI_IS_MISALIGNED(value) (((acpi_size) value) & (sizeof(acpi_size)-1)) | ||
318 | |||
319 | /* | ||
320 | * Bitmask creation | ||
321 | * Bit positions start at zero. | ||
322 | * MASK_BITS_ABOVE creates a mask starting AT the position and above | ||
323 | * MASK_BITS_BELOW creates a mask starting one bit BELOW the position | ||
324 | */ | ||
325 | #define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_INTEGER_MAX) << ((u32) (position)))) | ||
326 | #define ACPI_MASK_BITS_BELOW(position) ((ACPI_INTEGER_MAX) << ((u32) (position))) | ||
327 | |||
328 | /* Bitfields within ACPI registers */ | ||
329 | |||
330 | #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask) | ||
331 | #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask) | ||
332 | |||
333 | #define ACPI_INSERT_BITS(target, mask, source) target = ((target & (~(mask))) | (source & mask)) | ||
334 | |||
335 | /* | ||
336 | * An struct acpi_namespace_node can appear in some contexts | ||
337 | * where a pointer to an union acpi_operand_object can also | ||
338 | * appear. This macro is used to distinguish them. | ||
339 | * | ||
340 | * The "Descriptor" field is the first field in both structures. | ||
341 | */ | ||
342 | #define ACPI_GET_DESCRIPTOR_TYPE(d) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type) | ||
343 | #define ACPI_SET_DESCRIPTOR_TYPE(d, t) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = t) | ||
344 | |||
345 | /* Macro to test the object type */ | ||
346 | |||
347 | #define ACPI_GET_OBJECT_TYPE(d) (((union acpi_operand_object *)(void *)(d))->common.type) | ||
348 | |||
349 | /* | ||
350 | * Macros for the master AML opcode table | ||
351 | */ | ||
352 | #if defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT) | ||
353 | #define ACPI_OP(name, Pargs, Iargs, obj_type, class, type, flags) \ | ||
354 | {name, (u32)(Pargs), (u32)(Iargs), (u32)(flags), obj_type, class, type} | ||
355 | #else | ||
356 | #define ACPI_OP(name, Pargs, Iargs, obj_type, class, type, flags) \ | ||
357 | {(u32)(Pargs), (u32)(Iargs), (u32)(flags), obj_type, class, type} | ||
358 | #endif | ||
359 | |||
360 | #ifdef ACPI_DISASSEMBLER | ||
361 | #define ACPI_DISASM_ONLY_MEMBERS(a) a; | ||
362 | #else | ||
363 | #define ACPI_DISASM_ONLY_MEMBERS(a) | ||
364 | #endif | ||
365 | |||
366 | #define ARG_TYPE_WIDTH 5 | ||
367 | #define ARG_1(x) ((u32)(x)) | ||
368 | #define ARG_2(x) ((u32)(x) << (1 * ARG_TYPE_WIDTH)) | ||
369 | #define ARG_3(x) ((u32)(x) << (2 * ARG_TYPE_WIDTH)) | ||
370 | #define ARG_4(x) ((u32)(x) << (3 * ARG_TYPE_WIDTH)) | ||
371 | #define ARG_5(x) ((u32)(x) << (4 * ARG_TYPE_WIDTH)) | ||
372 | #define ARG_6(x) ((u32)(x) << (5 * ARG_TYPE_WIDTH)) | ||
373 | |||
374 | #define ARGI_LIST1(a) (ARG_1(a)) | ||
375 | #define ARGI_LIST2(a, b) (ARG_1(b)|ARG_2(a)) | ||
376 | #define ARGI_LIST3(a, b, c) (ARG_1(c)|ARG_2(b)|ARG_3(a)) | ||
377 | #define ARGI_LIST4(a, b, c, d) (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a)) | ||
378 | #define ARGI_LIST5(a, b, c, d, e) (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a)) | ||
379 | #define ARGI_LIST6(a, b, c, d, e, f) (ARG_1(f)|ARG_2(e)|ARG_3(d)|ARG_4(c)|ARG_5(b)|ARG_6(a)) | ||
380 | |||
381 | #define ARGP_LIST1(a) (ARG_1(a)) | ||
382 | #define ARGP_LIST2(a, b) (ARG_1(a)|ARG_2(b)) | ||
383 | #define ARGP_LIST3(a, b, c) (ARG_1(a)|ARG_2(b)|ARG_3(c)) | ||
384 | #define ARGP_LIST4(a, b, c, d) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)) | ||
385 | #define ARGP_LIST5(a, b, c, d, e) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)) | ||
386 | #define ARGP_LIST6(a, b, c, d, e, f) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)|ARG_6(f)) | ||
387 | |||
388 | #define GET_CURRENT_ARG_TYPE(list) (list & ((u32) 0x1F)) | ||
389 | #define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH)) | ||
390 | |||
391 | #if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES) | ||
392 | /* | ||
393 | * Module name is include in both debug and non-debug versions primarily for | ||
394 | * error messages. The __FILE__ macro is not very useful for this, because it | ||
395 | * often includes the entire pathname to the module | ||
396 | */ | ||
397 | #define ACPI_MODULE_NAME(name) static const char ACPI_UNUSED_VAR _acpi_module_name[] = name; | ||
398 | #else | ||
399 | #define ACPI_MODULE_NAME(name) | ||
400 | #endif | ||
401 | |||
402 | /* | ||
403 | * Ascii error messages can be configured out | ||
404 | */ | ||
405 | #ifndef ACPI_NO_ERROR_MESSAGES | ||
406 | #define AE_INFO _acpi_module_name, __LINE__ | ||
407 | |||
408 | /* | ||
409 | * Error reporting. Callers module and line number are inserted by AE_INFO, | ||
410 | * the plist contains a set of parens to allow variable-length lists. | ||
411 | * These macros are used for both the debug and non-debug versions of the code. | ||
412 | */ | ||
413 | #define ACPI_INFO(plist) acpi_ut_info plist | ||
414 | #define ACPI_WARNING(plist) acpi_ut_warning plist | ||
415 | #define ACPI_EXCEPTION(plist) acpi_ut_exception plist | ||
416 | #define ACPI_ERROR(plist) acpi_ut_error plist | ||
417 | #define ACPI_ERROR_NAMESPACE(s, e) acpi_ns_report_error (AE_INFO, s, e); | ||
418 | #define ACPI_ERROR_METHOD(s, n, p, e) acpi_ns_report_method_error (AE_INFO, s, n, p, e); | ||
419 | |||
420 | #else | ||
421 | |||
422 | /* No error messages */ | ||
423 | |||
424 | #define ACPI_INFO(plist) | ||
425 | #define ACPI_WARNING(plist) | ||
426 | #define ACPI_EXCEPTION(plist) | ||
427 | #define ACPI_ERROR(plist) | ||
428 | #define ACPI_ERROR_NAMESPACE(s, e) | ||
429 | #define ACPI_ERROR_METHOD(s, n, p, e) | ||
430 | #endif | ||
431 | |||
432 | /* | ||
433 | * Debug macros that are conditionally compiled | ||
434 | */ | ||
435 | #ifdef ACPI_DEBUG_OUTPUT | ||
436 | |||
437 | /* | ||
438 | * Common parameters used for debug output functions: | ||
439 | * line number, function name, module(file) name, component ID | ||
440 | */ | ||
441 | #define ACPI_DEBUG_PARAMETERS __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT | ||
442 | |||
443 | /* | ||
444 | * Function entry tracing | ||
445 | */ | ||
446 | |||
447 | /* | ||
448 | * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header, | ||
449 | * define it now. This is the case where there the compiler does not support | ||
450 | * a __func__ macro or equivalent. | ||
451 | */ | ||
452 | #ifndef ACPI_GET_FUNCTION_NAME | ||
453 | #define ACPI_GET_FUNCTION_NAME _acpi_function_name | ||
454 | /* | ||
455 | * The Name parameter should be the procedure name as a quoted string. | ||
456 | * The function name is also used by the function exit macros below. | ||
457 | * Note: (const char) is used to be compatible with the debug interfaces | ||
458 | * and macros such as __func__. | ||
459 | */ | ||
460 | #define ACPI_FUNCTION_NAME(name) static const char _acpi_function_name[] = #name; | ||
461 | |||
462 | #else | ||
463 | /* Compiler supports __func__ (or equivalent) -- Ignore this macro */ | ||
464 | |||
465 | #define ACPI_FUNCTION_NAME(name) | ||
466 | #endif | ||
467 | |||
468 | #ifdef CONFIG_ACPI_DEBUG_FUNC_TRACE | ||
469 | |||
470 | #define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \ | ||
471 | acpi_ut_trace(ACPI_DEBUG_PARAMETERS) | ||
472 | #define ACPI_FUNCTION_TRACE_PTR(a, b) ACPI_FUNCTION_NAME(a) \ | ||
473 | acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS, (void *)b) | ||
474 | #define ACPI_FUNCTION_TRACE_U32(a, b) ACPI_FUNCTION_NAME(a) \ | ||
475 | acpi_ut_trace_u32(ACPI_DEBUG_PARAMETERS, (u32)b) | ||
476 | #define ACPI_FUNCTION_TRACE_STR(a, b) ACPI_FUNCTION_NAME(a) \ | ||
477 | acpi_ut_trace_str(ACPI_DEBUG_PARAMETERS, (char *)b) | ||
478 | |||
479 | #define ACPI_FUNCTION_ENTRY() acpi_ut_track_stack_ptr() | ||
480 | |||
481 | /* | ||
482 | * Function exit tracing. | ||
483 | * WARNING: These macros include a return statement. This is usually considered | ||
484 | * bad form, but having a separate exit macro is very ugly and difficult to maintain. | ||
485 | * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros | ||
486 | * so that "_AcpiFunctionName" is defined. | ||
487 | * | ||
488 | * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining | ||
489 | * about these constructs. | ||
490 | */ | ||
491 | #ifdef ACPI_USE_DO_WHILE_0 | ||
492 | #define ACPI_DO_WHILE0(a) do a while(0) | ||
493 | #else | ||
494 | #define ACPI_DO_WHILE0(a) a | ||
495 | #endif | ||
496 | |||
497 | #define return_VOID ACPI_DO_WHILE0 ({ \ | ||
498 | acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \ | ||
499 | return;}) | ||
500 | /* | ||
501 | * There are two versions of most of the return macros. The default version is | ||
502 | * safer, since it avoids side-effects by guaranteeing that the argument will | ||
503 | * not be evaluated twice. | ||
504 | * | ||
505 | * A less-safe version of the macros is provided for optional use if the | ||
506 | * compiler uses excessive CPU stack (for example, this may happen in the | ||
507 | * debug case if code optimzation is disabled.) | ||
508 | */ | ||
509 | #ifndef ACPI_SIMPLE_RETURN_MACROS | ||
510 | |||
511 | #define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \ | ||
512 | register acpi_status _s = (s); \ | ||
513 | acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, _s); \ | ||
514 | return (_s); }) | ||
515 | #define return_PTR(s) ACPI_DO_WHILE0 ({ \ | ||
516 | register void *_s = (void *) (s); \ | ||
517 | acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) _s); \ | ||
518 | return (_s); }) | ||
519 | #define return_VALUE(s) ACPI_DO_WHILE0 ({ \ | ||
520 | register acpi_integer _s = (s); \ | ||
521 | acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, _s); \ | ||
522 | return (_s); }) | ||
523 | #define return_UINT8(s) ACPI_DO_WHILE0 ({ \ | ||
524 | register u8 _s = (u8) (s); \ | ||
525 | acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \ | ||
526 | return (_s); }) | ||
527 | #define return_UINT32(s) ACPI_DO_WHILE0 ({ \ | ||
528 | register u32 _s = (u32) (s); \ | ||
529 | acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \ | ||
530 | return (_s); }) | ||
531 | #else /* Use original less-safe macros */ | ||
532 | |||
533 | #define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \ | ||
534 | acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, (s)); \ | ||
535 | return((s)); }) | ||
536 | #define return_PTR(s) ACPI_DO_WHILE0 ({ \ | ||
537 | acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) (s)); \ | ||
538 | return((s)); }) | ||
539 | #define return_VALUE(s) ACPI_DO_WHILE0 ({ \ | ||
540 | acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) (s)); \ | ||
541 | return((s)); }) | ||
542 | #define return_UINT8(s) return_VALUE(s) | ||
543 | #define return_UINT32(s) return_VALUE(s) | ||
544 | |||
545 | #endif /* ACPI_SIMPLE_RETURN_MACROS */ | ||
546 | |||
547 | #else /* !CONFIG_ACPI_DEBUG_FUNC_TRACE */ | ||
548 | |||
549 | #define ACPI_FUNCTION_TRACE(a) | ||
550 | #define ACPI_FUNCTION_TRACE_PTR(a,b) | ||
551 | #define ACPI_FUNCTION_TRACE_U32(a,b) | ||
552 | #define ACPI_FUNCTION_TRACE_STR(a,b) | ||
553 | #define ACPI_FUNCTION_EXIT | ||
554 | #define ACPI_FUNCTION_STATUS_EXIT(s) | ||
555 | #define ACPI_FUNCTION_VALUE_EXIT(s) | ||
556 | #define ACPI_FUNCTION_TRACE(a) | ||
557 | #define ACPI_FUNCTION_ENTRY() | ||
558 | |||
559 | #define return_VOID return | ||
560 | #define return_ACPI_STATUS(s) return(s) | ||
561 | #define return_VALUE(s) return(s) | ||
562 | #define return_UINT8(s) return(s) | ||
563 | #define return_UINT32(s) return(s) | ||
564 | #define return_PTR(s) return(s) | ||
565 | |||
566 | #endif /* CONFIG_ACPI_DEBUG_FUNC_TRACE */ | ||
567 | |||
568 | /* Conditional execution */ | ||
569 | |||
570 | #define ACPI_DEBUG_EXEC(a) a | ||
571 | #define ACPI_NORMAL_EXEC(a) | ||
572 | |||
573 | #define ACPI_DEBUG_DEFINE(a) a; | ||
574 | #define ACPI_DEBUG_ONLY_MEMBERS(a) a; | ||
575 | #define _VERBOSE_STRUCTURES | ||
576 | |||
577 | /* Stack and buffer dumping */ | ||
578 | |||
579 | #define ACPI_DUMP_STACK_ENTRY(a) acpi_ex_dump_operand((a), 0) | ||
580 | #define ACPI_DUMP_OPERANDS(a, b, c) acpi_ex_dump_operands(a, b, c) | ||
581 | |||
582 | #define ACPI_DUMP_ENTRY(a, b) acpi_ns_dump_entry (a, b) | ||
583 | #define ACPI_DUMP_PATHNAME(a, b, c, d) acpi_ns_dump_pathname(a, b, c, d) | ||
584 | #define ACPI_DUMP_RESOURCE_LIST(a) acpi_rs_dump_resource_list(a) | ||
585 | #define ACPI_DUMP_BUFFER(a, b) acpi_ut_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT) | ||
586 | |||
587 | /* | ||
588 | * Master debug print macros | ||
589 | * Print iff: | ||
590 | * 1) Debug print for the current component is enabled | ||
591 | * 2) Debug error level or trace level for the print statement is enabled | ||
592 | */ | ||
593 | #define ACPI_DEBUG_PRINT(plist) acpi_ut_debug_print plist | ||
594 | #define ACPI_DEBUG_PRINT_RAW(plist) acpi_ut_debug_print_raw plist | ||
595 | |||
596 | #else | ||
597 | /* | ||
598 | * This is the non-debug case -- make everything go away, | ||
599 | * leaving no executable debug code! | ||
600 | */ | ||
601 | #define ACPI_DEBUG_EXEC(a) | ||
602 | #define ACPI_NORMAL_EXEC(a) a; | ||
603 | |||
604 | #define ACPI_DEBUG_DEFINE(a) do { } while(0) | ||
605 | #define ACPI_DEBUG_ONLY_MEMBERS(a) do { } while(0) | ||
606 | #define ACPI_FUNCTION_NAME(a) do { } while(0) | ||
607 | #define ACPI_FUNCTION_TRACE(a) do { } while(0) | ||
608 | #define ACPI_FUNCTION_TRACE_PTR(a, b) do { } while(0) | ||
609 | #define ACPI_FUNCTION_TRACE_U32(a, b) do { } while(0) | ||
610 | #define ACPI_FUNCTION_TRACE_STR(a, b) do { } while(0) | ||
611 | #define ACPI_FUNCTION_EXIT do { } while(0) | ||
612 | #define ACPI_FUNCTION_STATUS_EXIT(s) do { } while(0) | ||
613 | #define ACPI_FUNCTION_VALUE_EXIT(s) do { } while(0) | ||
614 | #define ACPI_FUNCTION_ENTRY() do { } while(0) | ||
615 | #define ACPI_DUMP_STACK_ENTRY(a) do { } while(0) | ||
616 | #define ACPI_DUMP_OPERANDS(a, b, c) do { } while(0) | ||
617 | #define ACPI_DUMP_ENTRY(a, b) do { } while(0) | ||
618 | #define ACPI_DUMP_TABLES(a, b) do { } while(0) | ||
619 | #define ACPI_DUMP_PATHNAME(a, b, c, d) do { } while(0) | ||
620 | #define ACPI_DUMP_RESOURCE_LIST(a) do { } while(0) | ||
621 | #define ACPI_DUMP_BUFFER(a, b) do { } while(0) | ||
622 | #define ACPI_DEBUG_PRINT(pl) do { } while(0) | ||
623 | #define ACPI_DEBUG_PRINT_RAW(pl) do { } while(0) | ||
624 | |||
625 | #define return_VOID return | ||
626 | #define return_ACPI_STATUS(s) return(s) | ||
627 | #define return_VALUE(s) return(s) | ||
628 | #define return_UINT8(s) return(s) | ||
629 | #define return_UINT32(s) return(s) | ||
630 | #define return_PTR(s) return(s) | ||
631 | |||
632 | #endif | ||
633 | |||
634 | /* | ||
635 | * Some code only gets executed when the debugger is built in. | ||
636 | * Note that this is entirely independent of whether the | ||
637 | * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not. | ||
638 | */ | ||
639 | #ifdef ACPI_DEBUGGER | ||
640 | #define ACPI_DEBUGGER_EXEC(a) a | ||
641 | #else | ||
642 | #define ACPI_DEBUGGER_EXEC(a) | ||
643 | #endif | ||
644 | |||
645 | #ifdef ACPI_DEBUG_OUTPUT | ||
646 | /* | ||
647 | * 1) Set name to blanks | ||
648 | * 2) Copy the object name | ||
649 | */ | ||
650 | #define ACPI_ADD_OBJECT_NAME(a,b) ACPI_MEMSET (a->common.name, ' ', sizeof (a->common.name));\ | ||
651 | ACPI_STRNCPY (a->common.name, acpi_gbl_ns_type_names[b], sizeof (a->common.name)) | ||
652 | #else | ||
653 | |||
654 | #define ACPI_ADD_OBJECT_NAME(a,b) | ||
655 | #endif | ||
656 | |||
657 | /* | ||
658 | * Memory allocation tracking (DEBUG ONLY) | ||
659 | */ | ||
660 | #define ACPI_MEM_PARAMETERS _COMPONENT, _acpi_module_name, __LINE__ | ||
661 | |||
662 | #ifndef ACPI_DBG_TRACK_ALLOCATIONS | ||
663 | |||
664 | /* Memory allocation */ | ||
665 | |||
666 | #ifndef ACPI_ALLOCATE | ||
667 | #define ACPI_ALLOCATE(a) acpi_ut_allocate((acpi_size)(a), ACPI_MEM_PARAMETERS) | ||
668 | #endif | ||
669 | #ifndef ACPI_ALLOCATE_ZEROED | ||
670 | #define ACPI_ALLOCATE_ZEROED(a) acpi_ut_allocate_zeroed((acpi_size)(a), ACPI_MEM_PARAMETERS) | ||
671 | #endif | ||
672 | #ifndef ACPI_FREE | ||
673 | #define ACPI_FREE(a) acpio_os_free(a) | ||
674 | #endif | ||
675 | #define ACPI_MEM_TRACKING(a) | ||
676 | |||
677 | #else | ||
678 | |||
679 | /* Memory allocation */ | ||
680 | |||
681 | #define ACPI_ALLOCATE(a) acpi_ut_allocate_and_track((acpi_size)(a), ACPI_MEM_PARAMETERS) | ||
682 | #define ACPI_ALLOCATE_ZEROED(a) acpi_ut_allocate_zeroed_and_track((acpi_size)(a), ACPI_MEM_PARAMETERS) | ||
683 | #define ACPI_FREE(a) acpi_ut_free_and_track(a, ACPI_MEM_PARAMETERS) | ||
684 | #define ACPI_MEM_TRACKING(a) a | ||
685 | |||
686 | #endif /* ACPI_DBG_TRACK_ALLOCATIONS */ | ||
687 | |||
688 | /* Preemption point */ | ||
689 | #ifndef ACPI_PREEMPTION_POINT | ||
690 | #define ACPI_PREEMPTION_POINT() /* no preemption */ | ||
691 | #endif | ||
692 | |||
693 | #endif /* ACMACROS_H */ | ||
diff --git a/include/acpi/acnamesp.h b/include/acpi/acnamesp.h deleted file mode 100644 index db4e6f677855..000000000000 --- a/include/acpi/acnamesp.h +++ /dev/null | |||
@@ -1,321 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acnamesp.h - Namespace subcomponent prototypes and defines | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACNAMESP_H__ | ||
45 | #define __ACNAMESP_H__ | ||
46 | |||
47 | /* To search the entire name space, pass this as search_base */ | ||
48 | |||
49 | #define ACPI_NS_ALL ((acpi_handle)0) | ||
50 | |||
51 | /* | ||
52 | * Elements of acpi_ns_properties are bit significant | ||
53 | * and should be one-to-one with values of acpi_object_type | ||
54 | */ | ||
55 | #define ACPI_NS_NORMAL 0 | ||
56 | #define ACPI_NS_NEWSCOPE 1 /* a definition of this type opens a name scope */ | ||
57 | #define ACPI_NS_LOCAL 2 /* suppress search of enclosing scopes */ | ||
58 | |||
59 | /* Flags for acpi_ns_lookup, acpi_ns_search_and_enter */ | ||
60 | |||
61 | #define ACPI_NS_NO_UPSEARCH 0 | ||
62 | #define ACPI_NS_SEARCH_PARENT 0x01 | ||
63 | #define ACPI_NS_DONT_OPEN_SCOPE 0x02 | ||
64 | #define ACPI_NS_NO_PEER_SEARCH 0x04 | ||
65 | #define ACPI_NS_ERROR_IF_FOUND 0x08 | ||
66 | #define ACPI_NS_PREFIX_IS_SCOPE 0x10 | ||
67 | #define ACPI_NS_EXTERNAL 0x20 | ||
68 | #define ACPI_NS_TEMPORARY 0x40 | ||
69 | |||
70 | /* Flags for acpi_ns_walk_namespace */ | ||
71 | |||
72 | #define ACPI_NS_WALK_NO_UNLOCK 0 | ||
73 | #define ACPI_NS_WALK_UNLOCK 0x01 | ||
74 | #define ACPI_NS_WALK_TEMP_NODES 0x02 | ||
75 | |||
76 | /* | ||
77 | * nsinit - Namespace initialization | ||
78 | */ | ||
79 | acpi_status acpi_ns_initialize_objects(void); | ||
80 | |||
81 | acpi_status acpi_ns_initialize_devices(void); | ||
82 | |||
83 | /* | ||
84 | * nsload - Namespace loading | ||
85 | */ | ||
86 | acpi_status acpi_ns_load_namespace(void); | ||
87 | |||
88 | acpi_status | ||
89 | acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node); | ||
90 | |||
91 | /* | ||
92 | * nswalk - walk the namespace | ||
93 | */ | ||
94 | acpi_status | ||
95 | acpi_ns_walk_namespace(acpi_object_type type, | ||
96 | acpi_handle start_object, | ||
97 | u32 max_depth, | ||
98 | u32 flags, | ||
99 | acpi_walk_callback user_function, | ||
100 | void *context, void **return_value); | ||
101 | |||
102 | struct acpi_namespace_node *acpi_ns_get_next_node(acpi_object_type type, struct acpi_namespace_node | ||
103 | *parent, struct acpi_namespace_node | ||
104 | *child); | ||
105 | |||
106 | /* | ||
107 | * nsparse - table parsing | ||
108 | */ | ||
109 | acpi_status | ||
110 | acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node); | ||
111 | |||
112 | acpi_status | ||
113 | acpi_ns_one_complete_parse(u32 pass_number, | ||
114 | u32 table_index, | ||
115 | struct acpi_namespace_node *start_node); | ||
116 | |||
117 | /* | ||
118 | * nsaccess - Top-level namespace access | ||
119 | */ | ||
120 | acpi_status acpi_ns_root_initialize(void); | ||
121 | |||
122 | acpi_status | ||
123 | acpi_ns_lookup(union acpi_generic_state *scope_info, | ||
124 | char *name, | ||
125 | acpi_object_type type, | ||
126 | acpi_interpreter_mode interpreter_mode, | ||
127 | u32 flags, | ||
128 | struct acpi_walk_state *walk_state, | ||
129 | struct acpi_namespace_node **ret_node); | ||
130 | |||
131 | /* | ||
132 | * nsalloc - Named object allocation/deallocation | ||
133 | */ | ||
134 | struct acpi_namespace_node *acpi_ns_create_node(u32 name); | ||
135 | |||
136 | void acpi_ns_delete_node(struct acpi_namespace_node *node); | ||
137 | |||
138 | void | ||
139 | acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_handle); | ||
140 | |||
141 | void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id); | ||
142 | |||
143 | void acpi_ns_detach_object(struct acpi_namespace_node *node); | ||
144 | |||
145 | void acpi_ns_delete_children(struct acpi_namespace_node *parent); | ||
146 | |||
147 | int acpi_ns_compare_names(char *name1, char *name2); | ||
148 | |||
149 | /* | ||
150 | * nsdump - Namespace dump/print utilities | ||
151 | */ | ||
152 | #ifdef ACPI_FUTURE_USAGE | ||
153 | void acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth); | ||
154 | #endif /* ACPI_FUTURE_USAGE */ | ||
155 | |||
156 | void acpi_ns_dump_entry(acpi_handle handle, u32 debug_level); | ||
157 | |||
158 | void | ||
159 | acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component); | ||
160 | |||
161 | void acpi_ns_print_pathname(u32 num_segments, char *pathname); | ||
162 | |||
163 | acpi_status | ||
164 | acpi_ns_dump_one_object(acpi_handle obj_handle, | ||
165 | u32 level, void *context, void **return_value); | ||
166 | |||
167 | #ifdef ACPI_FUTURE_USAGE | ||
168 | void | ||
169 | acpi_ns_dump_objects(acpi_object_type type, | ||
170 | u8 display_type, | ||
171 | u32 max_depth, | ||
172 | acpi_owner_id owner_id, acpi_handle start_handle); | ||
173 | #endif /* ACPI_FUTURE_USAGE */ | ||
174 | |||
175 | /* | ||
176 | * nseval - Namespace evaluation functions | ||
177 | */ | ||
178 | acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info); | ||
179 | |||
180 | /* | ||
181 | * nspredef - Support for predefined/reserved names | ||
182 | */ | ||
183 | acpi_status | ||
184 | acpi_ns_check_predefined_names(struct acpi_namespace_node *node, | ||
185 | union acpi_operand_object *return_object); | ||
186 | |||
187 | const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct | ||
188 | acpi_namespace_node | ||
189 | *node); | ||
190 | |||
191 | void | ||
192 | acpi_ns_check_parameter_count(char *pathname, | ||
193 | struct acpi_namespace_node *node, | ||
194 | const union acpi_predefined_info *info); | ||
195 | |||
196 | /* | ||
197 | * nsnames - Name and Scope manipulation | ||
198 | */ | ||
199 | u32 acpi_ns_opens_scope(acpi_object_type type); | ||
200 | |||
201 | acpi_status | ||
202 | acpi_ns_build_external_path(struct acpi_namespace_node *node, | ||
203 | acpi_size size, char *name_buffer); | ||
204 | |||
205 | char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node); | ||
206 | |||
207 | char *acpi_ns_name_of_current_scope(struct acpi_walk_state *walk_state); | ||
208 | |||
209 | acpi_status | ||
210 | acpi_ns_handle_to_pathname(acpi_handle target_handle, | ||
211 | struct acpi_buffer *buffer); | ||
212 | |||
213 | u8 | ||
214 | acpi_ns_pattern_match(struct acpi_namespace_node *obj_node, char *search_for); | ||
215 | |||
216 | acpi_status | ||
217 | acpi_ns_get_node(struct acpi_namespace_node *prefix_node, | ||
218 | const char *external_pathname, | ||
219 | u32 flags, struct acpi_namespace_node **out_node); | ||
220 | |||
221 | acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node); | ||
222 | |||
223 | /* | ||
224 | * nsobject - Object management for namespace nodes | ||
225 | */ | ||
226 | acpi_status | ||
227 | acpi_ns_attach_object(struct acpi_namespace_node *node, | ||
228 | union acpi_operand_object *object, acpi_object_type type); | ||
229 | |||
230 | union acpi_operand_object *acpi_ns_get_attached_object(struct | ||
231 | acpi_namespace_node | ||
232 | *node); | ||
233 | |||
234 | union acpi_operand_object *acpi_ns_get_secondary_object(union | ||
235 | acpi_operand_object | ||
236 | *obj_desc); | ||
237 | |||
238 | acpi_status | ||
239 | acpi_ns_attach_data(struct acpi_namespace_node *node, | ||
240 | acpi_object_handler handler, void *data); | ||
241 | |||
242 | acpi_status | ||
243 | acpi_ns_detach_data(struct acpi_namespace_node *node, | ||
244 | acpi_object_handler handler); | ||
245 | |||
246 | acpi_status | ||
247 | acpi_ns_get_attached_data(struct acpi_namespace_node *node, | ||
248 | acpi_object_handler handler, void **data); | ||
249 | |||
250 | /* | ||
251 | * nssearch - Namespace searching and entry | ||
252 | */ | ||
253 | acpi_status | ||
254 | acpi_ns_search_and_enter(u32 entry_name, | ||
255 | struct acpi_walk_state *walk_state, | ||
256 | struct acpi_namespace_node *node, | ||
257 | acpi_interpreter_mode interpreter_mode, | ||
258 | acpi_object_type type, | ||
259 | u32 flags, struct acpi_namespace_node **ret_node); | ||
260 | |||
261 | acpi_status | ||
262 | acpi_ns_search_one_scope(u32 entry_name, | ||
263 | struct acpi_namespace_node *node, | ||
264 | acpi_object_type type, | ||
265 | struct acpi_namespace_node **ret_node); | ||
266 | |||
267 | void | ||
268 | acpi_ns_install_node(struct acpi_walk_state *walk_state, | ||
269 | struct acpi_namespace_node *parent_node, | ||
270 | struct acpi_namespace_node *node, acpi_object_type type); | ||
271 | |||
272 | /* | ||
273 | * nsutils - Utility functions | ||
274 | */ | ||
275 | u8 acpi_ns_valid_root_prefix(char prefix); | ||
276 | |||
277 | acpi_object_type acpi_ns_get_type(struct acpi_namespace_node *node); | ||
278 | |||
279 | u32 acpi_ns_local(acpi_object_type type); | ||
280 | |||
281 | void | ||
282 | acpi_ns_report_error(const char *module_name, | ||
283 | u32 line_number, | ||
284 | const char *internal_name, acpi_status lookup_status); | ||
285 | |||
286 | void | ||
287 | acpi_ns_report_method_error(const char *module_name, | ||
288 | u32 line_number, | ||
289 | const char *message, | ||
290 | struct acpi_namespace_node *node, | ||
291 | const char *path, acpi_status lookup_status); | ||
292 | |||
293 | void | ||
294 | acpi_ns_print_node_pathname(struct acpi_namespace_node *node, const char *msg); | ||
295 | |||
296 | acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info); | ||
297 | |||
298 | void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info); | ||
299 | |||
300 | acpi_status | ||
301 | acpi_ns_internalize_name(const char *dotted_name, char **converted_name); | ||
302 | |||
303 | acpi_status | ||
304 | acpi_ns_externalize_name(u32 internal_name_length, | ||
305 | const char *internal_name, | ||
306 | u32 * converted_name_length, char **converted_name); | ||
307 | |||
308 | struct acpi_namespace_node *acpi_ns_map_handle_to_node(acpi_handle handle); | ||
309 | |||
310 | acpi_handle acpi_ns_convert_entry_to_handle(struct acpi_namespace_node *node); | ||
311 | |||
312 | void acpi_ns_terminate(void); | ||
313 | |||
314 | struct acpi_namespace_node *acpi_ns_get_parent_node(struct acpi_namespace_node | ||
315 | *node); | ||
316 | |||
317 | struct acpi_namespace_node *acpi_ns_get_next_valid_node(struct | ||
318 | acpi_namespace_node | ||
319 | *node); | ||
320 | |||
321 | #endif /* __ACNAMESP_H__ */ | ||
diff --git a/include/acpi/acobject.h b/include/acpi/acobject.h deleted file mode 100644 index eb6f038b03d9..000000000000 --- a/include/acpi/acobject.h +++ /dev/null | |||
@@ -1,446 +0,0 @@ | |||
1 | |||
2 | /****************************************************************************** | ||
3 | * | ||
4 | * Name: acobject.h - Definition of union acpi_operand_object (Internal object only) | ||
5 | * | ||
6 | *****************************************************************************/ | ||
7 | |||
8 | /* | ||
9 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
10 | * All rights reserved. | ||
11 | * | ||
12 | * Redistribution and use in source and binary forms, with or without | ||
13 | * modification, are permitted provided that the following conditions | ||
14 | * are met: | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions, and the following disclaimer, | ||
17 | * without modification. | ||
18 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
19 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
20 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
21 | * including a substantially similar Disclaimer requirement for further | ||
22 | * binary redistribution. | ||
23 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
24 | * of any contributors may be used to endorse or promote products derived | ||
25 | * from this software without specific prior written permission. | ||
26 | * | ||
27 | * Alternatively, this software may be distributed under the terms of the | ||
28 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
29 | * Software Foundation. | ||
30 | * | ||
31 | * NO WARRANTY | ||
32 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
33 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
34 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
35 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
36 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
38 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
39 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
40 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
41 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
42 | * POSSIBILITY OF SUCH DAMAGES. | ||
43 | */ | ||
44 | |||
45 | #ifndef _ACOBJECT_H | ||
46 | #define _ACOBJECT_H | ||
47 | |||
48 | /* acpisrc:struct_defs -- for acpisrc conversion */ | ||
49 | |||
50 | /* | ||
51 | * The union acpi_operand_object is used to pass AML operands from the dispatcher | ||
52 | * to the interpreter, and to keep track of the various handlers such as | ||
53 | * address space handlers and notify handlers. The object is a constant | ||
54 | * size in order to allow it to be cached and reused. | ||
55 | * | ||
56 | * Note: The object is optimized to be aligned and will not work if it is | ||
57 | * byte-packed. | ||
58 | */ | ||
59 | #if ACPI_MACHINE_WIDTH == 64 | ||
60 | #pragma pack(8) | ||
61 | #else | ||
62 | #pragma pack(4) | ||
63 | #endif | ||
64 | |||
65 | /******************************************************************************* | ||
66 | * | ||
67 | * Common Descriptors | ||
68 | * | ||
69 | ******************************************************************************/ | ||
70 | |||
71 | /* | ||
72 | * Common area for all objects. | ||
73 | * | ||
74 | * descriptor_type is used to differentiate between internal descriptors, and | ||
75 | * must be in the same place across all descriptors | ||
76 | * | ||
77 | * Note: The descriptor_type and Type fields must appear in the identical | ||
78 | * position in both the struct acpi_namespace_node and union acpi_operand_object | ||
79 | * structures. | ||
80 | */ | ||
81 | #define ACPI_OBJECT_COMMON_HEADER \ | ||
82 | union acpi_operand_object *next_object; /* Objects linked to parent NS node */\ | ||
83 | u8 descriptor_type; /* To differentiate various internal objs */\ | ||
84 | u8 type; /* acpi_object_type */\ | ||
85 | u16 reference_count; /* For object deletion management */\ | ||
86 | u8 flags; | ||
87 | /* | ||
88 | * Note: There are 3 bytes available here before the | ||
89 | * next natural alignment boundary (for both 32/64 cases) | ||
90 | */ | ||
91 | |||
92 | /* Values for Flag byte above */ | ||
93 | |||
94 | #define AOPOBJ_AML_CONSTANT 0x01 | ||
95 | #define AOPOBJ_STATIC_POINTER 0x02 | ||
96 | #define AOPOBJ_DATA_VALID 0x04 | ||
97 | #define AOPOBJ_OBJECT_INITIALIZED 0x08 | ||
98 | #define AOPOBJ_SETUP_COMPLETE 0x10 | ||
99 | #define AOPOBJ_SINGLE_DATUM 0x20 | ||
100 | #define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an op_region address */ | ||
101 | |||
102 | /****************************************************************************** | ||
103 | * | ||
104 | * Basic data types | ||
105 | * | ||
106 | *****************************************************************************/ | ||
107 | |||
108 | struct acpi_object_common { | ||
109 | ACPI_OBJECT_COMMON_HEADER}; | ||
110 | |||
111 | struct acpi_object_integer { | ||
112 | ACPI_OBJECT_COMMON_HEADER u8 fill[3]; /* Prevent warning on some compilers */ | ||
113 | acpi_integer value; | ||
114 | }; | ||
115 | |||
116 | /* | ||
117 | * Note: The String and Buffer object must be identical through the Pointer | ||
118 | * and length elements. There is code that depends on this. | ||
119 | * | ||
120 | * Fields common to both Strings and Buffers | ||
121 | */ | ||
122 | #define ACPI_COMMON_BUFFER_INFO(_type) \ | ||
123 | _type *pointer; \ | ||
124 | u32 length; | ||
125 | |||
126 | struct acpi_object_string { /* Null terminated, ASCII characters only */ | ||
127 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(char) /* String in AML stream or allocated string */ | ||
128 | }; | ||
129 | |||
130 | struct acpi_object_buffer { | ||
131 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(u8) /* Buffer in AML stream or allocated buffer */ | ||
132 | u32 aml_length; | ||
133 | u8 *aml_start; | ||
134 | struct acpi_namespace_node *node; /* Link back to parent node */ | ||
135 | }; | ||
136 | |||
137 | struct acpi_object_package { | ||
138 | ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Link back to parent node */ | ||
139 | union acpi_operand_object **elements; /* Array of pointers to acpi_objects */ | ||
140 | u8 *aml_start; | ||
141 | u32 aml_length; | ||
142 | u32 count; /* # of elements in package */ | ||
143 | }; | ||
144 | |||
145 | /****************************************************************************** | ||
146 | * | ||
147 | * Complex data types | ||
148 | * | ||
149 | *****************************************************************************/ | ||
150 | |||
151 | struct acpi_object_event { | ||
152 | ACPI_OBJECT_COMMON_HEADER acpi_semaphore os_semaphore; /* Actual OS synchronization object */ | ||
153 | }; | ||
154 | |||
155 | struct acpi_object_mutex { | ||
156 | ACPI_OBJECT_COMMON_HEADER u8 sync_level; /* 0-15, specified in Mutex() call */ | ||
157 | u16 acquisition_depth; /* Allow multiple Acquires, same thread */ | ||
158 | acpi_mutex os_mutex; /* Actual OS synchronization object */ | ||
159 | acpi_thread_id thread_id; /* Current owner of the mutex */ | ||
160 | struct acpi_thread_state *owner_thread; /* Current owner of the mutex */ | ||
161 | union acpi_operand_object *prev; /* Link for list of acquired mutexes */ | ||
162 | union acpi_operand_object *next; /* Link for list of acquired mutexes */ | ||
163 | struct acpi_namespace_node *node; /* Containing namespace node */ | ||
164 | u8 original_sync_level; /* Owner's original sync level (0-15) */ | ||
165 | }; | ||
166 | |||
167 | struct acpi_object_region { | ||
168 | ACPI_OBJECT_COMMON_HEADER u8 space_id; | ||
169 | struct acpi_namespace_node *node; /* Containing namespace node */ | ||
170 | union acpi_operand_object *handler; /* Handler for region access */ | ||
171 | union acpi_operand_object *next; | ||
172 | acpi_physical_address address; | ||
173 | u32 length; | ||
174 | }; | ||
175 | |||
176 | struct acpi_object_method { | ||
177 | ACPI_OBJECT_COMMON_HEADER u8 method_flags; | ||
178 | u8 param_count; | ||
179 | u8 sync_level; | ||
180 | union acpi_operand_object *mutex; | ||
181 | u8 *aml_start; | ||
182 | ACPI_INTERNAL_METHOD implementation; | ||
183 | u32 aml_length; | ||
184 | u8 thread_count; | ||
185 | acpi_owner_id owner_id; | ||
186 | }; | ||
187 | |||
188 | /****************************************************************************** | ||
189 | * | ||
190 | * Objects that can be notified. All share a common notify_info area. | ||
191 | * | ||
192 | *****************************************************************************/ | ||
193 | |||
194 | /* | ||
195 | * Common fields for objects that support ASL notifications | ||
196 | */ | ||
197 | #define ACPI_COMMON_NOTIFY_INFO \ | ||
198 | union acpi_operand_object *system_notify; /* Handler for system notifies */\ | ||
199 | union acpi_operand_object *device_notify; /* Handler for driver notifies */\ | ||
200 | union acpi_operand_object *handler; /* Handler for Address space */ | ||
201 | |||
202 | struct acpi_object_notify_common { /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */ | ||
203 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; | ||
204 | |||
205 | struct acpi_object_device { | ||
206 | ACPI_OBJECT_COMMON_HEADER | ||
207 | ACPI_COMMON_NOTIFY_INFO struct acpi_gpe_block_info *gpe_block; | ||
208 | }; | ||
209 | |||
210 | struct acpi_object_power_resource { | ||
211 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 system_level; | ||
212 | u32 resource_order; | ||
213 | }; | ||
214 | |||
215 | struct acpi_object_processor { | ||
216 | ACPI_OBJECT_COMMON_HEADER | ||
217 | /* The next two fields take advantage of the 3-byte space before NOTIFY_INFO */ | ||
218 | u8 proc_id; | ||
219 | u8 length; | ||
220 | ACPI_COMMON_NOTIFY_INFO acpi_io_address address; | ||
221 | }; | ||
222 | |||
223 | struct acpi_object_thermal_zone { | ||
224 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; | ||
225 | |||
226 | /****************************************************************************** | ||
227 | * | ||
228 | * Fields. All share a common header/info field. | ||
229 | * | ||
230 | *****************************************************************************/ | ||
231 | |||
232 | /* | ||
233 | * Common bitfield for the field objects | ||
234 | * "Field Datum" -- a datum from the actual field object | ||
235 | * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field | ||
236 | */ | ||
237 | #define ACPI_COMMON_FIELD_INFO \ | ||
238 | u8 field_flags; /* Access, update, and lock bits */\ | ||
239 | u8 attribute; /* From access_as keyword */\ | ||
240 | u8 access_byte_width; /* Read/Write size in bytes */\ | ||
241 | struct acpi_namespace_node *node; /* Link back to parent node */\ | ||
242 | u32 bit_length; /* Length of field in bits */\ | ||
243 | u32 base_byte_offset; /* Byte offset within containing object */\ | ||
244 | u32 value; /* Value to store into the Bank or Index register */\ | ||
245 | u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ | ||
246 | u8 access_bit_width; /* Read/Write size in bits (8-64) */ | ||
247 | |||
248 | struct acpi_object_field_common { /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */ | ||
249 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */ | ||
250 | }; | ||
251 | |||
252 | struct acpi_object_region_field { | ||
253 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */ | ||
254 | }; | ||
255 | |||
256 | struct acpi_object_bank_field { | ||
257 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */ | ||
258 | union acpi_operand_object *bank_obj; /* bank_select Register object */ | ||
259 | }; | ||
260 | |||
261 | struct acpi_object_index_field { | ||
262 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO | ||
263 | /* | ||
264 | * No "RegionObj" pointer needed since the Index and Data registers | ||
265 | * are each field definitions unto themselves. | ||
266 | */ | ||
267 | union acpi_operand_object *index_obj; /* Index register */ | ||
268 | union acpi_operand_object *data_obj; /* Data register */ | ||
269 | }; | ||
270 | |||
271 | /* The buffer_field is different in that it is part of a Buffer, not an op_region */ | ||
272 | |||
273 | struct acpi_object_buffer_field { | ||
274 | ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *buffer_obj; /* Containing Buffer object */ | ||
275 | }; | ||
276 | |||
277 | /****************************************************************************** | ||
278 | * | ||
279 | * Objects for handlers | ||
280 | * | ||
281 | *****************************************************************************/ | ||
282 | |||
283 | struct acpi_object_notify_handler { | ||
284 | ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Parent device */ | ||
285 | acpi_notify_handler handler; | ||
286 | void *context; | ||
287 | }; | ||
288 | |||
289 | struct acpi_object_addr_handler { | ||
290 | ACPI_OBJECT_COMMON_HEADER u8 space_id; | ||
291 | u8 handler_flags; | ||
292 | acpi_adr_space_handler handler; | ||
293 | struct acpi_namespace_node *node; /* Parent device */ | ||
294 | void *context; | ||
295 | acpi_adr_space_setup setup; | ||
296 | union acpi_operand_object *region_list; /* regions using this handler */ | ||
297 | union acpi_operand_object *next; | ||
298 | }; | ||
299 | |||
300 | /* Flags for address handler (handler_flags) */ | ||
301 | |||
302 | #define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x01 | ||
303 | |||
304 | /****************************************************************************** | ||
305 | * | ||
306 | * Special internal objects | ||
307 | * | ||
308 | *****************************************************************************/ | ||
309 | |||
310 | /* | ||
311 | * The Reference object is used for these opcodes: | ||
312 | * Arg[0-6], Local[0-7], index_op, name_op, ref_of_op, load_op, load_table_op, debug_op | ||
313 | * The Reference.Class differentiates these types. | ||
314 | */ | ||
315 | struct acpi_object_reference { | ||
316 | ACPI_OBJECT_COMMON_HEADER u8 class; /* Reference Class */ | ||
317 | u8 target_type; /* Used for Index Op */ | ||
318 | u8 reserved; | ||
319 | void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */ | ||
320 | struct acpi_namespace_node *node; /* ref_of or Namepath */ | ||
321 | union acpi_operand_object **where; /* Target of Index */ | ||
322 | u32 value; /* Used for Local/Arg/Index/ddb_handle */ | ||
323 | }; | ||
324 | |||
325 | /* Values for Reference.Class above */ | ||
326 | |||
327 | typedef enum { | ||
328 | ACPI_REFCLASS_LOCAL = 0, /* Method local */ | ||
329 | ACPI_REFCLASS_ARG = 1, /* Method argument */ | ||
330 | ACPI_REFCLASS_REFOF = 2, /* Result of ref_of() TBD: Split to Ref/Node and Ref/operand_obj? */ | ||
331 | ACPI_REFCLASS_INDEX = 3, /* Result of Index() */ | ||
332 | ACPI_REFCLASS_TABLE = 4, /* ddb_handle - Load(), load_table() */ | ||
333 | ACPI_REFCLASS_NAME = 5, /* Reference to a named object */ | ||
334 | ACPI_REFCLASS_DEBUG = 6, /* Debug object */ | ||
335 | |||
336 | ACPI_REFCLASS_MAX = 6 | ||
337 | } ACPI_REFERENCE_CLASSES; | ||
338 | |||
339 | /* | ||
340 | * Extra object is used as additional storage for types that | ||
341 | * have AML code in their declarations (term_args) that must be | ||
342 | * evaluated at run time. | ||
343 | * | ||
344 | * Currently: Region and field_unit types | ||
345 | */ | ||
346 | struct acpi_object_extra { | ||
347 | ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ | ||
348 | void *region_context; /* Region-specific data */ | ||
349 | u8 *aml_start; | ||
350 | u32 aml_length; | ||
351 | }; | ||
352 | |||
353 | /* Additional data that can be attached to namespace nodes */ | ||
354 | |||
355 | struct acpi_object_data { | ||
356 | ACPI_OBJECT_COMMON_HEADER acpi_object_handler handler; | ||
357 | void *pointer; | ||
358 | }; | ||
359 | |||
360 | /* Structure used when objects are cached for reuse */ | ||
361 | |||
362 | struct acpi_object_cache_list { | ||
363 | ACPI_OBJECT_COMMON_HEADER union acpi_operand_object *next; /* Link for object cache and internal lists */ | ||
364 | }; | ||
365 | |||
366 | /****************************************************************************** | ||
367 | * | ||
368 | * union acpi_operand_object Descriptor - a giant union of all of the above | ||
369 | * | ||
370 | *****************************************************************************/ | ||
371 | |||
372 | union acpi_operand_object { | ||
373 | struct acpi_object_common common; | ||
374 | struct acpi_object_integer integer; | ||
375 | struct acpi_object_string string; | ||
376 | struct acpi_object_buffer buffer; | ||
377 | struct acpi_object_package package; | ||
378 | struct acpi_object_event event; | ||
379 | struct acpi_object_method method; | ||
380 | struct acpi_object_mutex mutex; | ||
381 | struct acpi_object_region region; | ||
382 | struct acpi_object_notify_common common_notify; | ||
383 | struct acpi_object_device device; | ||
384 | struct acpi_object_power_resource power_resource; | ||
385 | struct acpi_object_processor processor; | ||
386 | struct acpi_object_thermal_zone thermal_zone; | ||
387 | struct acpi_object_field_common common_field; | ||
388 | struct acpi_object_region_field field; | ||
389 | struct acpi_object_buffer_field buffer_field; | ||
390 | struct acpi_object_bank_field bank_field; | ||
391 | struct acpi_object_index_field index_field; | ||
392 | struct acpi_object_notify_handler notify; | ||
393 | struct acpi_object_addr_handler address_space; | ||
394 | struct acpi_object_reference reference; | ||
395 | struct acpi_object_extra extra; | ||
396 | struct acpi_object_data data; | ||
397 | struct acpi_object_cache_list cache; | ||
398 | |||
399 | /* | ||
400 | * Add namespace node to union in order to simplify code that accepts both | ||
401 | * ACPI_OPERAND_OBJECTs and ACPI_NAMESPACE_NODEs. The structures share | ||
402 | * a common descriptor_type field in order to differentiate them. | ||
403 | */ | ||
404 | struct acpi_namespace_node node; | ||
405 | }; | ||
406 | |||
407 | /****************************************************************************** | ||
408 | * | ||
409 | * union acpi_descriptor - objects that share a common descriptor identifier | ||
410 | * | ||
411 | *****************************************************************************/ | ||
412 | |||
413 | /* Object descriptor types */ | ||
414 | |||
415 | #define ACPI_DESC_TYPE_CACHED 0x01 /* Used only when object is cached */ | ||
416 | #define ACPI_DESC_TYPE_STATE 0x02 | ||
417 | #define ACPI_DESC_TYPE_STATE_UPDATE 0x03 | ||
418 | #define ACPI_DESC_TYPE_STATE_PACKAGE 0x04 | ||
419 | #define ACPI_DESC_TYPE_STATE_CONTROL 0x05 | ||
420 | #define ACPI_DESC_TYPE_STATE_RPSCOPE 0x06 | ||
421 | #define ACPI_DESC_TYPE_STATE_PSCOPE 0x07 | ||
422 | #define ACPI_DESC_TYPE_STATE_WSCOPE 0x08 | ||
423 | #define ACPI_DESC_TYPE_STATE_RESULT 0x09 | ||
424 | #define ACPI_DESC_TYPE_STATE_NOTIFY 0x0A | ||
425 | #define ACPI_DESC_TYPE_STATE_THREAD 0x0B | ||
426 | #define ACPI_DESC_TYPE_WALK 0x0C | ||
427 | #define ACPI_DESC_TYPE_PARSER 0x0D | ||
428 | #define ACPI_DESC_TYPE_OPERAND 0x0E | ||
429 | #define ACPI_DESC_TYPE_NAMED 0x0F | ||
430 | #define ACPI_DESC_TYPE_MAX 0x0F | ||
431 | |||
432 | struct acpi_common_descriptor { | ||
433 | void *common_pointer; | ||
434 | u8 descriptor_type; /* To differentiate various internal objs */ | ||
435 | }; | ||
436 | |||
437 | union acpi_descriptor { | ||
438 | struct acpi_common_descriptor common; | ||
439 | union acpi_operand_object object; | ||
440 | struct acpi_namespace_node node; | ||
441 | union acpi_parse_object op; | ||
442 | }; | ||
443 | |||
444 | #pragma pack() | ||
445 | |||
446 | #endif /* _ACOBJECT_H */ | ||
diff --git a/include/acpi/acopcode.h b/include/acpi/acopcode.h deleted file mode 100644 index dfdf63327885..000000000000 --- a/include/acpi/acopcode.h +++ /dev/null | |||
@@ -1,323 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acopcode.h - AML opcode information for the AML parser and interpreter | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACOPCODE_H__ | ||
45 | #define __ACOPCODE_H__ | ||
46 | |||
47 | #define MAX_EXTENDED_OPCODE 0x88 | ||
48 | #define NUM_EXTENDED_OPCODE (MAX_EXTENDED_OPCODE + 1) | ||
49 | #define MAX_INTERNAL_OPCODE | ||
50 | #define NUM_INTERNAL_OPCODE (MAX_INTERNAL_OPCODE + 1) | ||
51 | |||
52 | /* Used for non-assigned opcodes */ | ||
53 | |||
54 | #define _UNK 0x6B | ||
55 | |||
56 | /* | ||
57 | * Reserved ASCII characters. Do not use any of these for | ||
58 | * internal opcodes, since they are used to differentiate | ||
59 | * name strings from AML opcodes | ||
60 | */ | ||
61 | #define _ASC 0x6C | ||
62 | #define _NAM 0x6C | ||
63 | #define _PFX 0x6D | ||
64 | |||
65 | /* | ||
66 | * All AML opcodes and the parse-time arguments for each. Used by the AML | ||
67 | * parser Each list is compressed into a 32-bit number and stored in the | ||
68 | * master opcode table (in psopcode.c). | ||
69 | */ | ||
70 | #define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
71 | #define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA) | ||
72 | #define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
73 | #define ARGP_ALIAS_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_NAME) | ||
74 | #define ARGP_ARG0 ARG_NONE | ||
75 | #define ARGP_ARG1 ARG_NONE | ||
76 | #define ARGP_ARG2 ARG_NONE | ||
77 | #define ARGP_ARG3 ARG_NONE | ||
78 | #define ARGP_ARG4 ARG_NONE | ||
79 | #define ARGP_ARG5 ARG_NONE | ||
80 | #define ARGP_ARG6 ARG_NONE | ||
81 | #define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST) | ||
82 | #define ARGP_BIT_AND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
83 | #define ARGP_BIT_NAND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
84 | #define ARGP_BIT_NOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
85 | #define ARGP_BIT_NOT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
86 | #define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
87 | #define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
88 | #define ARGP_BREAK_OP ARG_NONE | ||
89 | #define ARGP_BREAK_POINT_OP ARG_NONE | ||
90 | #define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST) | ||
91 | #define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA) | ||
92 | #define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
93 | #define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
94 | #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
95 | #define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) | ||
96 | #define ARGP_CONTINUE_OP ARG_NONE | ||
97 | #define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME) | ||
98 | #define ARGP_CREATE_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) | ||
99 | #define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) | ||
100 | #define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) | ||
101 | #define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) | ||
102 | #define ARGP_CREATE_QWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) | ||
103 | #define ARGP_CREATE_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) | ||
104 | #define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) | ||
105 | #define ARGP_DEBUG_OP ARG_NONE | ||
106 | #define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
107 | #define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG) | ||
108 | #define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) | ||
109 | #define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET) | ||
110 | #define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA) | ||
111 | #define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST) | ||
112 | #define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME) | ||
113 | #define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG) | ||
114 | #define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST) | ||
115 | #define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
116 | #define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
117 | #define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
118 | #define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) | ||
119 | #define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
120 | #define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST) | ||
121 | #define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
122 | #define ARGP_LAND_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
123 | #define ARGP_LEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
124 | #define ARGP_LGREATER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
125 | #define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
126 | #define ARGP_LLESS_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
127 | #define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
128 | #define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG) | ||
129 | #define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
130 | #define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME) | ||
131 | #define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) | ||
132 | #define ARGP_LOCAL0 ARG_NONE | ||
133 | #define ARGP_LOCAL1 ARG_NONE | ||
134 | #define ARGP_LOCAL2 ARG_NONE | ||
135 | #define ARGP_LOCAL3 ARG_NONE | ||
136 | #define ARGP_LOCAL4 ARG_NONE | ||
137 | #define ARGP_LOCAL5 ARG_NONE | ||
138 | #define ARGP_LOCAL6 ARG_NONE | ||
139 | #define ARGP_LOCAL7 ARG_NONE | ||
140 | #define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) | ||
141 | #define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) | ||
142 | #define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST) | ||
143 | #define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
144 | #define ARGP_MID_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
145 | #define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
146 | #define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
147 | #define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA) | ||
148 | #define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ) | ||
149 | #define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
150 | #define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
151 | #define ARGP_NOOP_OP ARG_NONE | ||
152 | #define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) | ||
153 | #define ARGP_ONE_OP ARG_NONE | ||
154 | #define ARGP_ONES_OP ARG_NONE | ||
155 | #define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) | ||
156 | #define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST) | ||
157 | #define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) | ||
158 | #define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) | ||
159 | #define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
160 | #define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) | ||
161 | #define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
162 | #define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
163 | #define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
164 | #define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) | ||
165 | #define ARGP_REVISION_OP ARG_NONE | ||
166 | #define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) | ||
167 | #define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
168 | #define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
169 | #define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
170 | #define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
171 | #define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG) | ||
172 | #define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG) | ||
173 | #define ARGP_STATICSTRING_OP ARGP_LIST1 (ARGP_NAMESTRING) | ||
174 | #define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME) | ||
175 | #define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST) | ||
176 | #define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
177 | #define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) | ||
178 | #define ARGP_TIMER_OP ARG_NONE | ||
179 | #define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
180 | #define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
181 | #define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
182 | #define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
183 | #define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) | ||
184 | #define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) | ||
185 | #define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
186 | #define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) | ||
187 | #define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST) | ||
188 | #define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) | ||
189 | #define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) | ||
190 | #define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) | ||
191 | #define ARGP_ZERO_OP ARG_NONE | ||
192 | |||
193 | /* | ||
194 | * All AML opcodes and the runtime arguments for each. Used by the AML | ||
195 | * interpreter Each list is compressed into a 32-bit number and stored | ||
196 | * in the master opcode table (in psopcode.c). | ||
197 | * | ||
198 | * (Used by prep_operands procedure and the ASL Compiler) | ||
199 | */ | ||
200 | #define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE | ||
201 | #define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER) | ||
202 | #define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
203 | #define ARGI_ALIAS_OP ARGI_INVALID_OPCODE | ||
204 | #define ARGI_ARG0 ARG_NONE | ||
205 | #define ARGI_ARG1 ARG_NONE | ||
206 | #define ARGI_ARG2 ARG_NONE | ||
207 | #define ARGI_ARG3 ARG_NONE | ||
208 | #define ARGI_ARG4 ARG_NONE | ||
209 | #define ARGI_ARG5 ARG_NONE | ||
210 | #define ARGI_ARG6 ARG_NONE | ||
211 | #define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE | ||
212 | #define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
213 | #define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
214 | #define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
215 | #define ARGI_BIT_NOT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) | ||
216 | #define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
217 | #define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
218 | #define ARGI_BREAK_OP ARG_NONE | ||
219 | #define ARGI_BREAK_POINT_OP ARG_NONE | ||
220 | #define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER) | ||
221 | #define ARGI_BYTE_OP ARGI_INVALID_OPCODE | ||
222 | #define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE | ||
223 | #define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) | ||
224 | #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) | ||
225 | #define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) | ||
226 | #define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE | ||
227 | #define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) | ||
228 | #define ARGI_CREATE_BIT_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) | ||
229 | #define ARGI_CREATE_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) | ||
230 | #define ARGI_CREATE_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) | ||
231 | #define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) | ||
232 | #define ARGI_CREATE_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) | ||
233 | #define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) | ||
234 | #define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) | ||
235 | #define ARGI_DEBUG_OP ARG_NONE | ||
236 | #define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_TARGETREF) | ||
237 | #define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REF_OR_STRING) | ||
238 | #define ARGI_DEVICE_OP ARGI_INVALID_OPCODE | ||
239 | #define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF) | ||
240 | #define ARGI_DWORD_OP ARGI_INVALID_OPCODE | ||
241 | #define ARGI_ELSE_OP ARGI_INVALID_OPCODE | ||
242 | #define ARGI_EVENT_OP ARGI_INVALID_OPCODE | ||
243 | #define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) | ||
244 | #define ARGI_FIELD_OP ARGI_INVALID_OPCODE | ||
245 | #define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) | ||
246 | #define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) | ||
247 | #define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) | ||
248 | #define ARGI_IF_OP ARGI_INVALID_OPCODE | ||
249 | #define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_TARGETREF) | ||
250 | #define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE | ||
251 | #define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) | ||
252 | #define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) | ||
253 | #define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA) | ||
254 | #define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA) | ||
255 | #define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE | ||
256 | #define ARGI_LLESS_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA) | ||
257 | #define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE | ||
258 | #define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) | ||
259 | #define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE | ||
260 | #define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION_OR_BUFFER,ARGI_TARGETREF) | ||
261 | #define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_ANYTYPE) | ||
262 | #define ARGI_LOCAL0 ARG_NONE | ||
263 | #define ARGI_LOCAL1 ARG_NONE | ||
264 | #define ARGI_LOCAL2 ARG_NONE | ||
265 | #define ARGI_LOCAL3 ARG_NONE | ||
266 | #define ARGI_LOCAL4 ARG_NONE | ||
267 | #define ARGI_LOCAL5 ARG_NONE | ||
268 | #define ARGI_LOCAL6 ARG_NONE | ||
269 | #define ARGI_LOCAL7 ARG_NONE | ||
270 | #define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) | ||
271 | #define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_COMPUTEDATA, ARGI_INTEGER,ARGI_COMPUTEDATA,ARGI_INTEGER) | ||
272 | #define ARGI_METHOD_OP ARGI_INVALID_OPCODE | ||
273 | #define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE | ||
274 | #define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFER_OR_STRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
275 | #define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
276 | #define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
277 | #define ARGI_MUTEX_OP ARGI_INVALID_OPCODE | ||
278 | #define ARGI_NAME_OP ARGI_INVALID_OPCODE | ||
279 | #define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE | ||
280 | #define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE | ||
281 | #define ARGI_NOOP_OP ARG_NONE | ||
282 | #define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) | ||
283 | #define ARGI_ONE_OP ARG_NONE | ||
284 | #define ARGI_ONES_OP ARG_NONE | ||
285 | #define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER) | ||
286 | #define ARGI_POWER_RES_OP ARGI_INVALID_OPCODE | ||
287 | #define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE | ||
288 | #define ARGI_QWORD_OP ARGI_INVALID_OPCODE | ||
289 | #define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF) | ||
290 | #define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) | ||
291 | #define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX) | ||
292 | #define ARGI_RESERVEDFIELD_OP ARGI_INVALID_OPCODE | ||
293 | #define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT) | ||
294 | #define ARGI_RETURN_OP ARGI_INVALID_OPCODE | ||
295 | #define ARGI_REVISION_OP ARG_NONE | ||
296 | #define ARGI_SCOPE_OP ARGI_INVALID_OPCODE | ||
297 | #define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
298 | #define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
299 | #define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT) | ||
300 | #define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT) | ||
301 | #define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) | ||
302 | #define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) | ||
303 | #define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE | ||
304 | #define ARGI_STORE_OP ARGI_LIST2 (ARGI_DATAREFOBJ, ARGI_TARGETREF) | ||
305 | #define ARGI_STRING_OP ARGI_INVALID_OPCODE | ||
306 | #define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) | ||
307 | #define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE | ||
308 | #define ARGI_TIMER_OP ARG_NONE | ||
309 | #define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) | ||
310 | #define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) | ||
311 | #define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) | ||
312 | #define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) | ||
313 | #define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) | ||
314 | #define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) | ||
315 | #define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE) | ||
316 | #define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) | ||
317 | #define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER) | ||
318 | #define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) | ||
319 | #define ARGI_WHILE_OP ARGI_INVALID_OPCODE | ||
320 | #define ARGI_WORD_OP ARGI_INVALID_OPCODE | ||
321 | #define ARGI_ZERO_OP ARG_NONE | ||
322 | |||
323 | #endif /* __ACOPCODE_H__ */ | ||
diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index db8852d8bcf7..5c823d5ab783 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h | |||
@@ -45,9 +45,9 @@ | |||
45 | #define __ACOUTPUT_H__ | 45 | #define __ACOUTPUT_H__ |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * Debug levels and component IDs. These are used to control the | 48 | * Debug levels and component IDs. These are used to control the |
49 | * granularity of the output of the DEBUG_PRINT macro -- on a per- | 49 | * granularity of the output of the ACPI_DEBUG_PRINT macro -- on a |
50 | * component basis and a per-exception-type basis. | 50 | * per-component basis and a per-exception-type basis. |
51 | */ | 51 | */ |
52 | 52 | ||
53 | /* Component IDs are used in the global "DebugLayer" */ | 53 | /* Component IDs are used in the global "DebugLayer" */ |
@@ -69,8 +69,10 @@ | |||
69 | 69 | ||
70 | #define ACPI_COMPILER 0x00001000 | 70 | #define ACPI_COMPILER 0x00001000 |
71 | #define ACPI_TOOLS 0x00002000 | 71 | #define ACPI_TOOLS 0x00002000 |
72 | #define ACPI_EXAMPLE 0x00004000 | ||
73 | #define ACPI_DRIVER 0x00008000 | ||
72 | 74 | ||
73 | #define ACPI_ALL_COMPONENTS 0x00003FFF | 75 | #define ACPI_ALL_COMPONENTS 0x0000FFFF |
74 | #define ACPI_COMPONENT_DEFAULT (ACPI_ALL_COMPONENTS) | 76 | #define ACPI_COMPONENT_DEFAULT (ACPI_ALL_COMPONENTS) |
75 | 77 | ||
76 | /* Component IDs reserved for ACPI drivers */ | 78 | /* Component IDs reserved for ACPI drivers */ |
@@ -78,7 +80,7 @@ | |||
78 | #define ACPI_ALL_DRIVERS 0xFFFF0000 | 80 | #define ACPI_ALL_DRIVERS 0xFFFF0000 |
79 | 81 | ||
80 | /* | 82 | /* |
81 | * Raw debug output levels, do not use these in the DEBUG_PRINT macros | 83 | * Raw debug output levels, do not use these in the ACPI_DEBUG_PRINT macros |
82 | */ | 84 | */ |
83 | #define ACPI_LV_INIT 0x00000001 | 85 | #define ACPI_LV_INIT 0x00000001 |
84 | #define ACPI_LV_DEBUG_OBJECT 0x00000002 | 86 | #define ACPI_LV_DEBUG_OBJECT 0x00000002 |
@@ -176,4 +178,95 @@ | |||
176 | #define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT) | 178 | #define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT) |
177 | #define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL) | 179 | #define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL) |
178 | 180 | ||
181 | #if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES) | ||
182 | /* | ||
183 | * Module name is included in both debug and non-debug versions primarily for | ||
184 | * error messages. The __FILE__ macro is not very useful for this, because it | ||
185 | * often includes the entire pathname to the module | ||
186 | */ | ||
187 | #define ACPI_MODULE_NAME(name) static const char ACPI_UNUSED_VAR _acpi_module_name[] = name; | ||
188 | #else | ||
189 | #define ACPI_MODULE_NAME(name) | ||
190 | #endif | ||
191 | |||
192 | /* | ||
193 | * Ascii error messages can be configured out | ||
194 | */ | ||
195 | #ifndef ACPI_NO_ERROR_MESSAGES | ||
196 | #define AE_INFO _acpi_module_name, __LINE__ | ||
197 | |||
198 | /* | ||
199 | * Error reporting. Callers module and line number are inserted by AE_INFO, | ||
200 | * the plist contains a set of parens to allow variable-length lists. | ||
201 | * These macros are used for both the debug and non-debug versions of the code. | ||
202 | */ | ||
203 | #define ACPI_INFO(plist) acpi_info plist | ||
204 | #define ACPI_WARNING(plist) acpi_warning plist | ||
205 | #define ACPI_EXCEPTION(plist) acpi_exception plist | ||
206 | #define ACPI_ERROR(plist) acpi_error plist | ||
207 | |||
208 | #else | ||
209 | |||
210 | /* No error messages */ | ||
211 | |||
212 | #define ACPI_INFO(plist) | ||
213 | #define ACPI_WARNING(plist) | ||
214 | #define ACPI_EXCEPTION(plist) | ||
215 | #define ACPI_ERROR(plist) | ||
216 | |||
217 | #endif /* ACPI_NO_ERROR_MESSAGES */ | ||
218 | |||
219 | /* | ||
220 | * Debug macros that are conditionally compiled | ||
221 | */ | ||
222 | #ifdef ACPI_DEBUG_OUTPUT | ||
223 | |||
224 | /* | ||
225 | * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header, | ||
226 | * define it now. This is the case where there the compiler does not support | ||
227 | * a __FUNCTION__ macro or equivalent. | ||
228 | */ | ||
229 | #ifndef ACPI_GET_FUNCTION_NAME | ||
230 | #define ACPI_GET_FUNCTION_NAME _acpi_function_name | ||
231 | |||
232 | /* | ||
233 | * The Name parameter should be the procedure name as a quoted string. | ||
234 | * The function name is also used by the function exit macros below. | ||
235 | * Note: (const char) is used to be compatible with the debug interfaces | ||
236 | * and macros such as __FUNCTION__. | ||
237 | */ | ||
238 | #define ACPI_FUNCTION_NAME(name) static const char _acpi_function_name[] = #name; | ||
239 | |||
240 | #else | ||
241 | /* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */ | ||
242 | |||
243 | #define ACPI_FUNCTION_NAME(name) | ||
244 | #endif /* ACPI_GET_FUNCTION_NAME */ | ||
245 | |||
246 | /* | ||
247 | * Common parameters used for debug output functions: | ||
248 | * line number, function name, module(file) name, component ID | ||
249 | */ | ||
250 | #define ACPI_DEBUG_PARAMETERS __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT | ||
251 | |||
252 | /* | ||
253 | * Master debug print macros | ||
254 | * Print message if and only if: | ||
255 | * 1) Debug print for the current component is enabled | ||
256 | * 2) Debug error level or trace level for the print statement is enabled | ||
257 | */ | ||
258 | #define ACPI_DEBUG_PRINT(plist) acpi_debug_print plist | ||
259 | #define ACPI_DEBUG_PRINT_RAW(plist) acpi_debug_print_raw plist | ||
260 | |||
261 | #else | ||
262 | /* | ||
263 | * This is the non-debug case -- make everything go away, | ||
264 | * leaving no executable debug code! | ||
265 | */ | ||
266 | #define ACPI_FUNCTION_NAME(a) | ||
267 | #define ACPI_DEBUG_PRINT(pl) | ||
268 | #define ACPI_DEBUG_PRINT_RAW(pl) | ||
269 | |||
270 | #endif /* ACPI_DEBUG_OUTPUT */ | ||
271 | |||
179 | #endif /* __ACOUTPUT_H__ */ | 272 | #endif /* __ACOUTPUT_H__ */ |
diff --git a/include/acpi/acparser.h b/include/acpi/acparser.h deleted file mode 100644 index 23ee0fbf5619..000000000000 --- a/include/acpi/acparser.h +++ /dev/null | |||
@@ -1,234 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: acparser.h - AML Parser subcomponent prototypes and defines | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACPARSER_H__ | ||
45 | #define __ACPARSER_H__ | ||
46 | |||
47 | #define OP_HAS_RETURN_VALUE 1 | ||
48 | |||
49 | /* Variable number of arguments. This field must be 32 bits */ | ||
50 | |||
51 | #define ACPI_VAR_ARGS ACPI_UINT32_MAX | ||
52 | |||
53 | #define ACPI_PARSE_DELETE_TREE 0x0001 | ||
54 | #define ACPI_PARSE_NO_TREE_DELETE 0x0000 | ||
55 | #define ACPI_PARSE_TREE_MASK 0x0001 | ||
56 | |||
57 | #define ACPI_PARSE_LOAD_PASS1 0x0010 | ||
58 | #define ACPI_PARSE_LOAD_PASS2 0x0020 | ||
59 | #define ACPI_PARSE_EXECUTE 0x0030 | ||
60 | #define ACPI_PARSE_MODE_MASK 0x0030 | ||
61 | |||
62 | #define ACPI_PARSE_DEFERRED_OP 0x0100 | ||
63 | #define ACPI_PARSE_DISASSEMBLE 0x0200 | ||
64 | |||
65 | /****************************************************************************** | ||
66 | * | ||
67 | * Parser interfaces | ||
68 | * | ||
69 | *****************************************************************************/ | ||
70 | |||
71 | /* | ||
72 | * psxface - Parser external interfaces | ||
73 | */ | ||
74 | acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info); | ||
75 | |||
76 | /* | ||
77 | * psargs - Parse AML opcode arguments | ||
78 | */ | ||
79 | u8 *acpi_ps_get_next_package_end(struct acpi_parse_state *parser_state); | ||
80 | |||
81 | char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state); | ||
82 | |||
83 | void | ||
84 | acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state, | ||
85 | u32 arg_type, union acpi_parse_object *arg); | ||
86 | |||
87 | acpi_status | ||
88 | acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state, | ||
89 | struct acpi_parse_state *parser_state, | ||
90 | union acpi_parse_object *arg, u8 method_call); | ||
91 | |||
92 | acpi_status | ||
93 | acpi_ps_get_next_arg(struct acpi_walk_state *walk_state, | ||
94 | struct acpi_parse_state *parser_state, | ||
95 | u32 arg_type, union acpi_parse_object **return_arg); | ||
96 | |||
97 | /* | ||
98 | * psfind | ||
99 | */ | ||
100 | union acpi_parse_object *acpi_ps_find_name(union acpi_parse_object *scope, | ||
101 | u32 name, u32 opcode); | ||
102 | |||
103 | union acpi_parse_object *acpi_ps_get_parent(union acpi_parse_object *op); | ||
104 | |||
105 | /* | ||
106 | * psopcode - AML Opcode information | ||
107 | */ | ||
108 | const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode); | ||
109 | |||
110 | char *acpi_ps_get_opcode_name(u16 opcode); | ||
111 | |||
112 | u8 acpi_ps_get_argument_count(u32 op_type); | ||
113 | |||
114 | /* | ||
115 | * psparse - top level parsing routines | ||
116 | */ | ||
117 | acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state); | ||
118 | |||
119 | u32 acpi_ps_get_opcode_size(u32 opcode); | ||
120 | |||
121 | u16 acpi_ps_peek_opcode(struct acpi_parse_state *state); | ||
122 | |||
123 | acpi_status | ||
124 | acpi_ps_complete_this_op(struct acpi_walk_state *walk_state, | ||
125 | union acpi_parse_object *op); | ||
126 | |||
127 | acpi_status | ||
128 | acpi_ps_next_parse_state(struct acpi_walk_state *walk_state, | ||
129 | union acpi_parse_object *op, | ||
130 | acpi_status callback_status); | ||
131 | |||
132 | /* | ||
133 | * psloop - main parse loop | ||
134 | */ | ||
135 | acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state); | ||
136 | |||
137 | /* | ||
138 | * psscope - Scope stack management routines | ||
139 | */ | ||
140 | acpi_status | ||
141 | acpi_ps_init_scope(struct acpi_parse_state *parser_state, | ||
142 | union acpi_parse_object *root); | ||
143 | |||
144 | union acpi_parse_object *acpi_ps_get_parent_scope(struct acpi_parse_state | ||
145 | *state); | ||
146 | |||
147 | u8 acpi_ps_has_completed_scope(struct acpi_parse_state *parser_state); | ||
148 | |||
149 | void | ||
150 | acpi_ps_pop_scope(struct acpi_parse_state *parser_state, | ||
151 | union acpi_parse_object **op, | ||
152 | u32 * arg_list, u32 * arg_count); | ||
153 | |||
154 | acpi_status | ||
155 | acpi_ps_push_scope(struct acpi_parse_state *parser_state, | ||
156 | union acpi_parse_object *op, | ||
157 | u32 remaining_args, u32 arg_count); | ||
158 | |||
159 | void acpi_ps_cleanup_scope(struct acpi_parse_state *state); | ||
160 | |||
161 | /* | ||
162 | * pstree - parse tree manipulation routines | ||
163 | */ | ||
164 | void | ||
165 | acpi_ps_append_arg(union acpi_parse_object *op, union acpi_parse_object *arg); | ||
166 | |||
167 | union acpi_parse_object *acpi_ps_find(union acpi_parse_object *scope, | ||
168 | char *path, u16 opcode, u32 create); | ||
169 | |||
170 | union acpi_parse_object *acpi_ps_get_arg(union acpi_parse_object *op, u32 argn); | ||
171 | |||
172 | #ifdef ACPI_FUTURE_USAGE | ||
173 | union acpi_parse_object *acpi_ps_get_depth_next(union acpi_parse_object *origin, | ||
174 | union acpi_parse_object *op); | ||
175 | #endif /* ACPI_FUTURE_USAGE */ | ||
176 | |||
177 | /* | ||
178 | * pswalk - parse tree walk routines | ||
179 | */ | ||
180 | acpi_status | ||
181 | acpi_ps_walk_parsed_aml(union acpi_parse_object *start_op, | ||
182 | union acpi_parse_object *end_op, | ||
183 | union acpi_operand_object *mth_desc, | ||
184 | struct acpi_namespace_node *start_node, | ||
185 | union acpi_operand_object **params, | ||
186 | union acpi_operand_object **caller_return_desc, | ||
187 | acpi_owner_id owner_id, | ||
188 | acpi_parse_downwards descending_callback, | ||
189 | acpi_parse_upwards ascending_callback); | ||
190 | |||
191 | acpi_status | ||
192 | acpi_ps_get_next_walk_op(struct acpi_walk_state *walk_state, | ||
193 | union acpi_parse_object *op, | ||
194 | acpi_parse_upwards ascending_callback); | ||
195 | |||
196 | acpi_status acpi_ps_delete_completed_op(struct acpi_walk_state *walk_state); | ||
197 | |||
198 | void acpi_ps_delete_parse_tree(union acpi_parse_object *root); | ||
199 | |||
200 | /* | ||
201 | * psutils - parser utilities | ||
202 | */ | ||
203 | union acpi_parse_object *acpi_ps_create_scope_op(void); | ||
204 | |||
205 | void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode); | ||
206 | |||
207 | union acpi_parse_object *acpi_ps_alloc_op(u16 opcode); | ||
208 | |||
209 | void acpi_ps_free_op(union acpi_parse_object *op); | ||
210 | |||
211 | u8 acpi_ps_is_leading_char(u32 c); | ||
212 | |||
213 | u8 acpi_ps_is_prefix_char(u32 c); | ||
214 | |||
215 | #ifdef ACPI_FUTURE_USAGE | ||
216 | u32 acpi_ps_get_name(union acpi_parse_object *op); | ||
217 | #endif /* ACPI_FUTURE_USAGE */ | ||
218 | |||
219 | void acpi_ps_set_name(union acpi_parse_object *op, u32 name); | ||
220 | |||
221 | /* | ||
222 | * psdump - display parser tree | ||
223 | */ | ||
224 | u32 | ||
225 | acpi_ps_sprint_path(char *buffer_start, | ||
226 | u32 buffer_size, union acpi_parse_object *op); | ||
227 | |||
228 | u32 | ||
229 | acpi_ps_sprint_op(char *buffer_start, | ||
230 | u32 buffer_size, union acpi_parse_object *op); | ||
231 | |||
232 | void acpi_ps_show(union acpi_parse_object *op); | ||
233 | |||
234 | #endif /* __ACPARSER_H__ */ | ||
diff --git a/include/acpi/acpi.h b/include/acpi/acpi.h index c515ef6cc89e..472b7bf0c5d4 100644 --- a/include/acpi/acpi.h +++ b/include/acpi/acpi.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | * | 2 | * |
3 | * Name: acpi.h - Master include file, Publics and external data. | 3 | * Name: acpi.h - Master public include file used to interface to ACPICA |
4 | * | 4 | * |
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
@@ -45,25 +45,22 @@ | |||
45 | #define __ACPI_H__ | 45 | #define __ACPI_H__ |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * Common includes for all ACPI driver files | 48 | * Public include files for use by code that will interface to ACPICA. |
49 | * We put them here because we don't want to duplicate them | 49 | * |
50 | * in the rest of the source code again and again. | 50 | * Information includes the ACPICA data types, names, exceptions, and |
51 | * external interface prototypes. Also included are the definitions for | ||
52 | * all ACPI tables (FADT, MADT, etc.) | ||
53 | * | ||
54 | * Note: The order of these include files is important. | ||
51 | */ | 55 | */ |
52 | #include "acnames.h" /* Global ACPI names and strings */ | 56 | #include "platform/acenv.h" /* Environment-specific items */ |
53 | #include "acconfig.h" /* Configuration constants */ | 57 | #include "acnames.h" /* Common ACPI names and strings */ |
54 | #include "platform/acenv.h" /* Target environment specific items */ | 58 | #include "actypes.h" /* ACPICA data types and structures */ |
55 | #include "actypes.h" /* Fundamental common data types */ | 59 | #include "acexcep.h" /* ACPICA exceptions */ |
56 | #include "acexcep.h" /* ACPI exception codes */ | ||
57 | #include "acmacros.h" /* C macros */ | ||
58 | #include "actbl.h" /* ACPI table definitions */ | 60 | #include "actbl.h" /* ACPI table definitions */ |
59 | #include "aclocal.h" /* Internal data types */ | ||
60 | #include "acoutput.h" /* Error output and Debug macros */ | 61 | #include "acoutput.h" /* Error output and Debug macros */ |
61 | #include "acpiosxf.h" /* Interfaces to the ACPI-to-OS layer */ | 62 | #include "acrestyp.h" /* Resource Descriptor structs */ |
63 | #include "acpiosxf.h" /* OSL interfaces (ACPICA-to-OS) */ | ||
62 | #include "acpixf.h" /* ACPI core subsystem external interfaces */ | 64 | #include "acpixf.h" /* ACPI core subsystem external interfaces */ |
63 | #include "acobject.h" /* ACPI internal object */ | ||
64 | #include "acstruct.h" /* Common structures */ | ||
65 | #include "acglobal.h" /* All global variables */ | ||
66 | #include "achware.h" /* Hardware defines and interfaces */ | ||
67 | #include "acutils.h" /* Utility interfaces */ | ||
68 | 65 | ||
69 | #endif /* __ACPI_H__ */ | 66 | #endif /* __ACPI_H__ */ |
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index b91440ac0d16..a62720a7edc0 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -121,8 +121,11 @@ acpi_os_wait_semaphore(acpi_semaphore handle, u32 units, u16 timeout); | |||
121 | acpi_status acpi_os_signal_semaphore(acpi_semaphore handle, u32 units); | 121 | acpi_status acpi_os_signal_semaphore(acpi_semaphore handle, u32 units); |
122 | 122 | ||
123 | /* | 123 | /* |
124 | * Mutex primitives | 124 | * Mutex primitives. May be configured to use semaphores instead via |
125 | * ACPI_MUTEX_TYPE (see platform/acenv.h) | ||
125 | */ | 126 | */ |
127 | #if (ACPI_MUTEX_TYPE != ACPI_BINARY_SEMAPHORE) | ||
128 | |||
126 | acpi_status acpi_os_create_mutex(acpi_mutex * out_handle); | 129 | acpi_status acpi_os_create_mutex(acpi_mutex * out_handle); |
127 | 130 | ||
128 | void acpi_os_delete_mutex(acpi_mutex handle); | 131 | void acpi_os_delete_mutex(acpi_mutex handle); |
@@ -130,13 +133,7 @@ void acpi_os_delete_mutex(acpi_mutex handle); | |||
130 | acpi_status acpi_os_acquire_mutex(acpi_mutex handle, u16 timeout); | 133 | acpi_status acpi_os_acquire_mutex(acpi_mutex handle, u16 timeout); |
131 | 134 | ||
132 | void acpi_os_release_mutex(acpi_mutex handle); | 135 | void acpi_os_release_mutex(acpi_mutex handle); |
133 | 136 | #endif | |
134 | /* Temporary macros for Mutex* interfaces, map to existing semaphore xfaces */ | ||
135 | |||
136 | #define acpi_os_create_mutex(out_handle) acpi_os_create_semaphore (1, 1, out_handle) | ||
137 | #define acpi_os_delete_mutex(handle) (void) acpi_os_delete_semaphore (handle) | ||
138 | #define acpi_os_acquire_mutex(handle,time) acpi_os_wait_semaphore (handle, 1, time) | ||
139 | #define acpi_os_release_mutex(handle) (void) acpi_os_signal_semaphore (handle, 1) | ||
140 | 137 | ||
141 | /* | 138 | /* |
142 | * Memory allocation and mapping | 139 | * Memory allocation and mapping |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 33bc0e3b1954..c8e8cf45830f 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -45,9 +45,32 @@ | |||
45 | #ifndef __ACXFACE_H__ | 45 | #ifndef __ACXFACE_H__ |
46 | #define __ACXFACE_H__ | 46 | #define __ACXFACE_H__ |
47 | 47 | ||
48 | /* Current ACPICA subsystem version in YYYYMMDD format */ | ||
49 | |||
50 | #define ACPI_CA_VERSION 0x20081204 | ||
51 | |||
48 | #include "actypes.h" | 52 | #include "actypes.h" |
49 | #include "actbl.h" | 53 | #include "actbl.h" |
50 | 54 | ||
55 | extern u8 acpi_gbl_permanent_mmap; | ||
56 | |||
57 | /* | ||
58 | * Globals that are publically available, allowing for | ||
59 | * run time configuration | ||
60 | */ | ||
61 | extern u32 acpi_dbg_level; | ||
62 | extern u32 acpi_dbg_layer; | ||
63 | extern u8 acpi_gbl_enable_interpreter_slack; | ||
64 | extern u8 acpi_gbl_all_methods_serialized; | ||
65 | extern u8 acpi_gbl_create_osi_method; | ||
66 | extern u8 acpi_gbl_leave_wake_gpes_disabled; | ||
67 | extern acpi_name acpi_gbl_trace_method_name; | ||
68 | extern u32 acpi_gbl_trace_flags; | ||
69 | |||
70 | extern u32 acpi_current_gpe_count; | ||
71 | extern struct acpi_table_fadt acpi_gbl_FADT; | ||
72 | |||
73 | extern u32 acpi_rsdt_forced; | ||
51 | /* | 74 | /* |
52 | * Global interfaces | 75 | * Global interfaces |
53 | */ | 76 | */ |
@@ -79,11 +102,6 @@ const char *acpi_format_exception(acpi_status exception); | |||
79 | 102 | ||
80 | acpi_status acpi_purge_cached_objects(void); | 103 | acpi_status acpi_purge_cached_objects(void); |
81 | 104 | ||
82 | #ifdef ACPI_FUTURE_USAGE | ||
83 | acpi_status | ||
84 | acpi_install_initialization_handler(acpi_init_handler handler, u32 function); | ||
85 | #endif | ||
86 | |||
87 | /* | 105 | /* |
88 | * ACPI Memory management | 106 | * ACPI Memory management |
89 | */ | 107 | */ |
@@ -193,9 +211,12 @@ acpi_status acpi_get_id(acpi_handle object, acpi_owner_id * out_type); | |||
193 | acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle); | 211 | acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle); |
194 | 212 | ||
195 | /* | 213 | /* |
196 | * Event handler interfaces | 214 | * Handler interfaces |
197 | */ | 215 | */ |
198 | acpi_status | 216 | acpi_status |
217 | acpi_install_initialization_handler(acpi_init_handler handler, u32 function); | ||
218 | |||
219 | acpi_status | ||
199 | acpi_install_fixed_event_handler(u32 acpi_event, | 220 | acpi_install_fixed_event_handler(u32 acpi_event, |
200 | acpi_event_handler handler, void *context); | 221 | acpi_event_handler handler, void *context); |
201 | 222 | ||
@@ -227,6 +248,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
227 | u32 gpe_number, | 248 | u32 gpe_number, |
228 | u32 type, acpi_event_handler address, void *context); | 249 | u32 type, acpi_event_handler address, void *context); |
229 | 250 | ||
251 | acpi_status | ||
252 | acpi_remove_gpe_handler(acpi_handle gpe_device, | ||
253 | u32 gpe_number, acpi_event_handler address); | ||
254 | |||
230 | #ifdef ACPI_FUTURE_USAGE | 255 | #ifdef ACPI_FUTURE_USAGE |
231 | acpi_status acpi_install_exception_handler(acpi_exception_handler handler); | 256 | acpi_status acpi_install_exception_handler(acpi_exception_handler handler); |
232 | #endif | 257 | #endif |
@@ -238,10 +263,6 @@ acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle); | |||
238 | 263 | ||
239 | acpi_status acpi_release_global_lock(u32 handle); | 264 | acpi_status acpi_release_global_lock(u32 handle); |
240 | 265 | ||
241 | acpi_status | ||
242 | acpi_remove_gpe_handler(acpi_handle gpe_device, | ||
243 | u32 gpe_number, acpi_event_handler address); | ||
244 | |||
245 | acpi_status acpi_enable_event(u32 event, u32 flags); | 266 | acpi_status acpi_enable_event(u32 event, u32 flags); |
246 | 267 | ||
247 | acpi_status acpi_disable_event(u32 event, u32 flags); | 268 | acpi_status acpi_disable_event(u32 event, u32 flags); |
@@ -250,6 +271,9 @@ acpi_status acpi_clear_event(u32 event); | |||
250 | 271 | ||
251 | acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status); | 272 | acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status); |
252 | 273 | ||
274 | /* | ||
275 | * GPE Interfaces | ||
276 | */ | ||
253 | acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type); | 277 | acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type); |
254 | 278 | ||
255 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number); | 279 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number); |
@@ -263,6 +287,12 @@ acpi_get_gpe_status(acpi_handle gpe_device, | |||
263 | u32 gpe_number, | 287 | u32 gpe_number, |
264 | u32 flags, acpi_event_status * event_status); | 288 | u32 flags, acpi_event_status * event_status); |
265 | 289 | ||
290 | acpi_status acpi_disable_all_gpes(void); | ||
291 | |||
292 | acpi_status acpi_enable_all_runtime_gpes(void); | ||
293 | |||
294 | acpi_status acpi_get_gpe_device(u32 gpe_index, acpi_handle *gpe_device); | ||
295 | |||
266 | acpi_status | 296 | acpi_status |
267 | acpi_install_gpe_block(acpi_handle gpe_device, | 297 | acpi_install_gpe_block(acpi_handle gpe_device, |
268 | struct acpi_generic_address *gpe_block_address, | 298 | struct acpi_generic_address *gpe_block_address, |
@@ -313,6 +343,8 @@ acpi_resource_to_address64(struct acpi_resource *resource, | |||
313 | /* | 343 | /* |
314 | * Hardware (ACPI device) interfaces | 344 | * Hardware (ACPI device) interfaces |
315 | */ | 345 | */ |
346 | acpi_status acpi_reset(void); | ||
347 | |||
316 | acpi_status acpi_get_register(u32 register_id, u32 * return_value); | 348 | acpi_status acpi_get_register(u32 register_id, u32 * return_value); |
317 | 349 | ||
318 | acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value); | 350 | acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value); |
@@ -320,12 +352,14 @@ acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value); | |||
320 | acpi_status acpi_set_register(u32 register_id, u32 value); | 352 | acpi_status acpi_set_register(u32 register_id, u32 value); |
321 | 353 | ||
322 | acpi_status | 354 | acpi_status |
323 | acpi_set_firmware_waking_vector(acpi_physical_address physical_address); | 355 | acpi_set_firmware_waking_vector(u32 physical_address); |
324 | 356 | ||
325 | #ifdef ACPI_FUTURE_USAGE | ||
326 | acpi_status | 357 | acpi_status |
327 | acpi_get_firmware_waking_vector(acpi_physical_address * physical_address); | 358 | acpi_set_firmware_waking_vector64(u64 physical_address); |
328 | #endif | 359 | |
360 | acpi_status acpi_read(u32 *value, struct acpi_generic_address *reg); | ||
361 | |||
362 | acpi_status acpi_write(u32 value, struct acpi_generic_address *reg); | ||
329 | 363 | ||
330 | acpi_status | 364 | acpi_status |
331 | acpi_get_sleep_type_data(u8 sleep_state, u8 * slp_typ_a, u8 * slp_typ_b); | 365 | acpi_get_sleep_type_data(u8 sleep_state, u8 * slp_typ_a, u8 * slp_typ_b); |
@@ -340,4 +374,42 @@ acpi_status acpi_leave_sleep_state_prep(u8 sleep_state); | |||
340 | 374 | ||
341 | acpi_status acpi_leave_sleep_state(u8 sleep_state); | 375 | acpi_status acpi_leave_sleep_state(u8 sleep_state); |
342 | 376 | ||
377 | /* | ||
378 | * Debug output | ||
379 | */ | ||
380 | void ACPI_INTERNAL_VAR_XFACE | ||
381 | acpi_error(const char *module_name, | ||
382 | u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3); | ||
383 | |||
384 | void ACPI_INTERNAL_VAR_XFACE | ||
385 | acpi_exception(const char *module_name, | ||
386 | u32 line_number, | ||
387 | acpi_status status, const char *format, ...) ACPI_PRINTF_LIKE(4); | ||
388 | |||
389 | void ACPI_INTERNAL_VAR_XFACE | ||
390 | acpi_warning(const char *module_name, | ||
391 | u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3); | ||
392 | |||
393 | void ACPI_INTERNAL_VAR_XFACE | ||
394 | acpi_info(const char *module_name, | ||
395 | u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3); | ||
396 | |||
397 | #ifdef ACPI_DEBUG_OUTPUT | ||
398 | |||
399 | void ACPI_INTERNAL_VAR_XFACE | ||
400 | acpi_debug_print(u32 requested_debug_level, | ||
401 | u32 line_number, | ||
402 | const char *function_name, | ||
403 | const char *module_name, | ||
404 | u32 component_id, const char *format, ...) ACPI_PRINTF_LIKE(6); | ||
405 | |||
406 | void ACPI_INTERNAL_VAR_XFACE | ||
407 | acpi_debug_print_raw(u32 requested_debug_level, | ||
408 | u32 line_number, | ||
409 | const char *function_name, | ||
410 | const char *module_name, | ||
411 | u32 component_id, | ||
412 | const char *format, ...) ACPI_PRINTF_LIKE(6); | ||
413 | #endif | ||
414 | |||
343 | #endif /* __ACXFACE_H__ */ | 415 | #endif /* __ACXFACE_H__ */ |
diff --git a/include/acpi/acpredef.h b/include/acpi/acpredef.h deleted file mode 100644 index 16a9ca9a66e4..000000000000 --- a/include/acpi/acpredef.h +++ /dev/null | |||
@@ -1,371 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acpredef - Information table for ACPI predefined methods and objects | ||
4 | * $Revision: 1.1 $ | ||
5 | * | ||
6 | *****************************************************************************/ | ||
7 | |||
8 | /* | ||
9 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
10 | * All rights reserved. | ||
11 | * | ||
12 | * Redistribution and use in source and binary forms, with or without | ||
13 | * modification, are permitted provided that the following conditions | ||
14 | * are met: | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions, and the following disclaimer, | ||
17 | * without modification. | ||
18 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
19 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
20 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
21 | * including a substantially similar Disclaimer requirement for further | ||
22 | * binary redistribution. | ||
23 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
24 | * of any contributors may be used to endorse or promote products derived | ||
25 | * from this software without specific prior written permission. | ||
26 | * | ||
27 | * Alternatively, this software may be distributed under the terms of the | ||
28 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
29 | * Software Foundation. | ||
30 | * | ||
31 | * NO WARRANTY | ||
32 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
33 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
34 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
35 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
36 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
38 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
39 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
40 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
41 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
42 | * POSSIBILITY OF SUCH DAMAGES. | ||
43 | */ | ||
44 | |||
45 | #ifndef __ACPREDEF_H__ | ||
46 | #define __ACPREDEF_H__ | ||
47 | |||
48 | /****************************************************************************** | ||
49 | * | ||
50 | * Return Package types | ||
51 | * | ||
52 | * 1) PTYPE1 packages do not contain sub-packages. | ||
53 | * | ||
54 | * ACPI_PTYPE1_FIXED: Fixed length, 1 or 2 object types: | ||
55 | * object type | ||
56 | * count | ||
57 | * object type | ||
58 | * count | ||
59 | * | ||
60 | * ACPI_PTYPE1_VAR: Variable length: | ||
61 | * object type (Int/Buf/Ref) | ||
62 | * | ||
63 | * ACPI_PTYPE1_OPTION: Package has some required and some optional elements: | ||
64 | * Used for _PRW | ||
65 | * | ||
66 | * | ||
67 | * 2) PTYPE2 packages contain a variable number of sub-packages. Each of the | ||
68 | * different types describe the contents of each of the sub-packages. | ||
69 | * | ||
70 | * ACPI_PTYPE2: Each subpackage contains 1 or 2 object types: | ||
71 | * object type | ||
72 | * count | ||
73 | * object type | ||
74 | * count | ||
75 | * | ||
76 | * ACPI_PTYPE2_COUNT: Each subpackage has a count as first element: | ||
77 | * object type | ||
78 | * | ||
79 | * ACPI_PTYPE2_PKG_COUNT: Count of subpackages at start, 1 or 2 object types: | ||
80 | * object type | ||
81 | * count | ||
82 | * object type | ||
83 | * count | ||
84 | * | ||
85 | * ACPI_PTYPE2_FIXED: Each subpackage is of fixed length: | ||
86 | * Used for _PRT | ||
87 | * | ||
88 | * ACPI_PTYPE2_MIN: Each subpackage has a variable but minimum length | ||
89 | * Used for _HPX | ||
90 | * | ||
91 | *****************************************************************************/ | ||
92 | |||
93 | enum acpi_return_package_types { | ||
94 | ACPI_PTYPE1_FIXED = 1, | ||
95 | ACPI_PTYPE1_VAR = 2, | ||
96 | ACPI_PTYPE1_OPTION = 3, | ||
97 | ACPI_PTYPE2 = 4, | ||
98 | ACPI_PTYPE2_COUNT = 5, | ||
99 | ACPI_PTYPE2_PKG_COUNT = 6, | ||
100 | ACPI_PTYPE2_FIXED = 7, | ||
101 | ACPI_PTYPE2_MIN = 8 | ||
102 | }; | ||
103 | |||
104 | /* | ||
105 | * Predefined method/object information table. | ||
106 | * | ||
107 | * These are the names that can actually be evaluated via acpi_evaluate_object. | ||
108 | * Not present in this table are the following: | ||
109 | * | ||
110 | * 1) Predefined/Reserved names that are never evaluated via acpi_evaluate_object: | ||
111 | * _Lxx and _Exx GPE methods | ||
112 | * _Qxx EC methods | ||
113 | * _T_x compiler temporary variables | ||
114 | * | ||
115 | * 2) Predefined names that never actually exist within the AML code: | ||
116 | * Predefined resource descriptor field names | ||
117 | * | ||
118 | * 3) Predefined names that are implemented within ACPICA: | ||
119 | * _OSI | ||
120 | * | ||
121 | * 4) Some predefined names that are not documented within the ACPI spec. | ||
122 | * _WDG, _WED | ||
123 | * | ||
124 | * The main entries in the table each contain the following items: | ||
125 | * | ||
126 | * Name - The ACPI reserved name | ||
127 | * param_count - Number of arguments to the method | ||
128 | * expected_btypes - Allowed type(s) for the return value. | ||
129 | * 0 means that no return value is expected. | ||
130 | * | ||
131 | * For methods that return packages, the next entry in the table contains | ||
132 | * information about the expected structure of the package. This information | ||
133 | * is saved here (rather than in a separate table) in order to minimize the | ||
134 | * overall size of the stored data. | ||
135 | */ | ||
136 | static const union acpi_predefined_info predefined_names[] = { | ||
137 | {.info = {"_AC0", 0, ACPI_RTYPE_INTEGER}}, | ||
138 | {.info = {"_AC1", 0, ACPI_RTYPE_INTEGER}}, | ||
139 | {.info = {"_AC2", 0, ACPI_RTYPE_INTEGER}}, | ||
140 | {.info = {"_AC3", 0, ACPI_RTYPE_INTEGER}}, | ||
141 | {.info = {"_AC4", 0, ACPI_RTYPE_INTEGER}}, | ||
142 | {.info = {"_AC5", 0, ACPI_RTYPE_INTEGER}}, | ||
143 | {.info = {"_AC6", 0, ACPI_RTYPE_INTEGER}}, | ||
144 | {.info = {"_AC7", 0, ACPI_RTYPE_INTEGER}}, | ||
145 | {.info = {"_AC8", 0, ACPI_RTYPE_INTEGER}}, | ||
146 | {.info = {"_AC9", 0, ACPI_RTYPE_INTEGER}}, | ||
147 | {.info = {"_ADR", 0, ACPI_RTYPE_INTEGER}}, | ||
148 | {.info = {"_AL0", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
149 | {.info = {"_AL1", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
150 | {.info = {"_AL2", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
151 | {.info = {"_AL3", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
152 | {.info = {"_AL4", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
153 | {.info = {"_AL5", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
154 | {.info = {"_AL6", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
155 | {.info = {"_AL7", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
156 | {.info = {"_AL8", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
157 | {.info = {"_AL9", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
158 | {.info = {"_ALC", 0, ACPI_RTYPE_INTEGER}}, | ||
159 | {.info = {"_ALI", 0, ACPI_RTYPE_INTEGER}}, | ||
160 | {.info = {"_ALP", 0, ACPI_RTYPE_INTEGER}}, | ||
161 | {.info = {"_ALR", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}}, /* variable (Pkgs) each 2 (Ints) */ | ||
162 | {.info = {"_ALT", 0, ACPI_RTYPE_INTEGER}}, | ||
163 | {.info = {"_BBN", 0, ACPI_RTYPE_INTEGER}}, | ||
164 | {.info = {"_BCL", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 0, 0, 0, 0}}, /* variable (Ints) */ | ||
165 | {.info = {"_BCM", 1, 0}}, | ||
166 | {.info = {"_BDN", 0, ACPI_RTYPE_INTEGER}}, | ||
167 | {.info = {"_BFS", 1, 0}}, | ||
168 | {.info = {"_BIF", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, | ||
169 | 9, | ||
170 | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER, 4, 0}}, /* fixed (9 Int),(4 Str) */ | ||
171 | {.info = {"_BLT", 3, 0}}, | ||
172 | {.info = {"_BMC", 1, 0}}, | ||
173 | {.info = {"_BMD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* fixed (5 Int) */ | ||
174 | {.info = {"_BQC", 0, ACPI_RTYPE_INTEGER}}, | ||
175 | {.info = {"_BST", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4, 0, 0, 0}}, /* fixed (4 Int) */ | ||
176 | {.info = {"_BTM", 1, ACPI_RTYPE_INTEGER}}, | ||
177 | {.info = {"_BTP", 1, 0}}, | ||
178 | {.info = {"_CBA", 0, ACPI_RTYPE_INTEGER}}, /* see PCI firmware spec 3.0 */ | ||
179 | {.info = {"_CID", 0, | ||
180 | ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_PACKAGE}}, | ||
181 | {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING, 0, 0, 0, 0}}, /* variable (Ints/Strs) */ | ||
182 | {.info = {"_CRS", 0, ACPI_RTYPE_BUFFER}}, | ||
183 | {.info = {"_CRT", 0, ACPI_RTYPE_INTEGER}}, | ||
184 | {.info = {"_CSD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2_COUNT, ACPI_RTYPE_INTEGER, 0, 0, 0, 0}}, /* variable (1 Int(n), n-1 Int) */ | ||
185 | {.info = {"_CST", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2_PKG_COUNT, | ||
186 | ACPI_RTYPE_BUFFER, 1, | ||
187 | ACPI_RTYPE_INTEGER, 3, 0}}, /* variable (1 Int(n), n Pkg (1 Buf/3 Int) */ | ||
188 | {.info = {"_DCK", 1, ACPI_RTYPE_INTEGER}}, | ||
189 | {.info = {"_DCS", 0, ACPI_RTYPE_INTEGER}}, | ||
190 | {.info = {"_DDC", 1, ACPI_RTYPE_INTEGER | ACPI_RTYPE_BUFFER}}, | ||
191 | {.info = {"_DDN", 0, ACPI_RTYPE_STRING}}, | ||
192 | {.info = {"_DGS", 0, ACPI_RTYPE_INTEGER}}, | ||
193 | {.info = {"_DIS", 0, 0}}, | ||
194 | {.info = {"_DMA", 0, ACPI_RTYPE_BUFFER}}, | ||
195 | {.info = {"_DOD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 0, 0, 0, 0}}, /* variable (Ints) */ | ||
196 | {.info = {"_DOS", 1, 0}}, | ||
197 | {.info = {"_DSM", 4, ACPI_RTYPE_ALL}}, /* Must return a type, but it can be of any type */ | ||
198 | {.info = {"_DSS", 1, 0}}, | ||
199 | {.info = {"_DSW", 3, 0}}, | ||
200 | {.info = {"_EC_", 0, ACPI_RTYPE_INTEGER}}, | ||
201 | {.info = {"_EDL", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
202 | {.info = {"_EJ0", 1, 0}}, | ||
203 | {.info = {"_EJ1", 1, 0}}, | ||
204 | {.info = {"_EJ2", 1, 0}}, | ||
205 | {.info = {"_EJ3", 1, 0}}, | ||
206 | {.info = {"_EJ4", 1, 0}}, | ||
207 | {.info = {"_EJD", 0, ACPI_RTYPE_STRING}}, | ||
208 | {.info = {"_FDE", 0, ACPI_RTYPE_BUFFER}}, | ||
209 | {.info = {"_FDI", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 16, 0, 0, 0}}, /* fixed (16 Int) */ | ||
210 | {.info = {"_FDM", 1, 0}}, | ||
211 | {.info = {"_FIX", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 0, 0, 0, 0}}, /* variable (Ints) */ | ||
212 | {.info = {"_GLK", 0, ACPI_RTYPE_INTEGER}}, | ||
213 | {.info = {"_GPD", 0, ACPI_RTYPE_INTEGER}}, | ||
214 | {.info = {"_GPE", 0, ACPI_RTYPE_INTEGER}}, /* _GPE method, not _GPE scope */ | ||
215 | {.info = {"_GSB", 0, ACPI_RTYPE_INTEGER}}, | ||
216 | {.info = {"_GTF", 0, ACPI_RTYPE_BUFFER}}, | ||
217 | {.info = {"_GTM", 0, ACPI_RTYPE_BUFFER}}, | ||
218 | {.info = {"_GTS", 1, 0}}, | ||
219 | {.info = {"_HID", 0, ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING}}, | ||
220 | {.info = {"_HOT", 0, ACPI_RTYPE_INTEGER}}, | ||
221 | {.info = {"_HPP", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4, 0, 0, 0}}, /* fixed (4 Int) */ | ||
222 | |||
223 | /* | ||
224 | * For _HPX, a single package is returned, containing a variable number of sub-packages. | ||
225 | * Each sub-package contains a PCI record setting. There are several different type of | ||
226 | * record settings, of different lengths, but all elements of all settings are Integers. | ||
227 | */ | ||
228 | {.info = {"_HPX", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2_MIN, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* variable (Pkgs) each (var Ints) */ | ||
229 | {.info = {"_IFT", 0, ACPI_RTYPE_INTEGER}}, /* see IPMI spec */ | ||
230 | {.info = {"_INI", 0, 0}}, | ||
231 | {.info = {"_IRC", 0, 0}}, | ||
232 | {.info = {"_LCK", 1, 0}}, | ||
233 | {.info = {"_LID", 0, ACPI_RTYPE_INTEGER}}, | ||
234 | {.info = {"_MAT", 0, ACPI_RTYPE_BUFFER}}, | ||
235 | {.info = {"_MLS", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2, ACPI_RTYPE_STRING, 2, 0, 0, 0}}, /* variable (Pkgs) each (2 Str) */ | ||
236 | {.info = {"_MSG", 1, 0}}, | ||
237 | {.info = {"_OFF", 0, 0}}, | ||
238 | {.info = {"_ON_", 0, 0}}, | ||
239 | {.info = {"_OS_", 0, ACPI_RTYPE_STRING}}, | ||
240 | {.info = {"_OSC", 4, ACPI_RTYPE_BUFFER}}, | ||
241 | {.info = {"_OST", 3, 0}}, | ||
242 | {.info = {"_PCL", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
243 | {.info = {"_PCT", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_BUFFER, 2, 0, 0, 0}}, /* fixed (2 Buf) */ | ||
244 | {.info = {"_PDC", 1, 0}}, | ||
245 | {.info = {"_PIC", 1, 0}}, | ||
246 | {.info = {"_PLD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_BUFFER, 0, 0, 0, 0}}, /* variable (Bufs) */ | ||
247 | {.info = {"_PPC", 0, ACPI_RTYPE_INTEGER}}, | ||
248 | {.info = {"_PPE", 0, ACPI_RTYPE_INTEGER}}, /* see dig64 spec */ | ||
249 | {.info = {"_PR0", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
250 | {.info = {"_PR1", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
251 | {.info = {"_PR2", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
252 | {.info = {"_PRS", 0, ACPI_RTYPE_BUFFER}}, | ||
253 | |||
254 | /* | ||
255 | * For _PRT, many BIOSs reverse the 2nd and 3rd Package elements. This bug is so prevalent that there | ||
256 | * is code in the ACPICA Resource Manager to detect this and switch them back. For now, do not allow | ||
257 | * and issue a warning. To allow this and eliminate the warning, add the ACPI_RTYPE_REFERENCE | ||
258 | * type to the 2nd element (index 1) in the statement below. | ||
259 | */ | ||
260 | {.info = {"_PRT", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2_FIXED, 4, | ||
261 | ACPI_RTYPE_INTEGER, | ||
262 | ACPI_RTYPE_INTEGER, | ||
263 | ACPI_RTYPE_INTEGER | ACPI_RTYPE_REFERENCE, ACPI_RTYPE_INTEGER}}, /* variable (Pkgs) each (4): Int,Int,Int/Ref,Int */ | ||
264 | |||
265 | {.info = {"_PRW", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_OPTION, 2, | ||
266 | ACPI_RTYPE_INTEGER | | ||
267 | ACPI_RTYPE_PACKAGE, | ||
268 | ACPI_RTYPE_INTEGER, ACPI_RTYPE_REFERENCE, 0}}, /* variable (Pkgs) each: Pkg/Int,Int,[variable Refs] (Pkg is Ref/Int) */ | ||
269 | |||
270 | {.info = {"_PS0", 0, 0}}, | ||
271 | {.info = {"_PS1", 0, 0}}, | ||
272 | {.info = {"_PS2", 0, 0}}, | ||
273 | {.info = {"_PS3", 0, 0}}, | ||
274 | {.info = {"_PSC", 0, ACPI_RTYPE_INTEGER}}, | ||
275 | {.info = {"_PSD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2_COUNT, ACPI_RTYPE_INTEGER, 0, 0, 0, 0}}, /* variable (Pkgs) each (5 Int) with count */ | ||
276 | {.info = {"_PSL", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
277 | {.info = {"_PSR", 0, ACPI_RTYPE_INTEGER}}, | ||
278 | {.info = {"_PSS", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 6, 0, 0, 0}}, /* variable (Pkgs) each (6 Int) */ | ||
279 | {.info = {"_PSV", 0, ACPI_RTYPE_INTEGER}}, | ||
280 | {.info = {"_PSW", 1, 0}}, | ||
281 | {.info = {"_PTC", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_BUFFER, 2, 0, 0, 0}}, /* fixed (2 Buf) */ | ||
282 | {.info = {"_PTS", 1, 0}}, | ||
283 | {.info = {"_PXM", 0, ACPI_RTYPE_INTEGER}}, | ||
284 | {.info = {"_REG", 2, 0}}, | ||
285 | {.info = {"_REV", 0, ACPI_RTYPE_INTEGER}}, | ||
286 | {.info = {"_RMV", 0, ACPI_RTYPE_INTEGER}}, | ||
287 | {.info = {"_ROM", 2, ACPI_RTYPE_BUFFER}}, | ||
288 | {.info = {"_RTV", 0, ACPI_RTYPE_INTEGER}}, | ||
289 | |||
290 | /* | ||
291 | * For _S0_ through _S5_, the ACPI spec defines a return Package containing 1 Integer, | ||
292 | * but most DSDTs have it wrong - 2,3, or 4 integers. Allow this by making the objects "variable length", | ||
293 | * but all elements must be Integers. | ||
294 | */ | ||
295 | {.info = {"_S0_", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 1, 0, 0, 0}}, /* fixed (1 Int) */ | ||
296 | {.info = {"_S1_", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 1, 0, 0, 0}}, /* fixed (1 Int) */ | ||
297 | {.info = {"_S2_", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 1, 0, 0, 0}}, /* fixed (1 Int) */ | ||
298 | {.info = {"_S3_", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 1, 0, 0, 0}}, /* fixed (1 Int) */ | ||
299 | {.info = {"_S4_", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 1, 0, 0, 0}}, /* fixed (1 Int) */ | ||
300 | {.info = {"_S5_", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 1, 0, 0, 0}}, /* fixed (1 Int) */ | ||
301 | |||
302 | {.info = {"_S1D", 0, ACPI_RTYPE_INTEGER}}, | ||
303 | {.info = {"_S2D", 0, ACPI_RTYPE_INTEGER}}, | ||
304 | {.info = {"_S3D", 0, ACPI_RTYPE_INTEGER}}, | ||
305 | {.info = {"_S4D", 0, ACPI_RTYPE_INTEGER}}, | ||
306 | {.info = {"_S0W", 0, ACPI_RTYPE_INTEGER}}, | ||
307 | {.info = {"_S1W", 0, ACPI_RTYPE_INTEGER}}, | ||
308 | {.info = {"_S2W", 0, ACPI_RTYPE_INTEGER}}, | ||
309 | {.info = {"_S3W", 0, ACPI_RTYPE_INTEGER}}, | ||
310 | {.info = {"_S4W", 0, ACPI_RTYPE_INTEGER}}, | ||
311 | {.info = {"_SBS", 0, ACPI_RTYPE_INTEGER}}, | ||
312 | {.info = {"_SCP", 0x13, 0}}, /* Acpi 1.0 allowed 1 arg. Acpi 3.0 expanded to 3 args. Allow both. */ | ||
313 | /* Note: the 3-arg definition may be removed for ACPI 4.0 */ | ||
314 | {.info = {"_SDD", 1, 0}}, | ||
315 | {.info = {"_SEG", 0, ACPI_RTYPE_INTEGER}}, | ||
316 | {.info = {"_SLI", 0, ACPI_RTYPE_BUFFER}}, | ||
317 | {.info = {"_SPD", 1, ACPI_RTYPE_INTEGER}}, | ||
318 | {.info = {"_SRS", 1, 0}}, | ||
319 | {.info = {"_SRV", 0, ACPI_RTYPE_INTEGER}}, /* see IPMI spec */ | ||
320 | {.info = {"_SST", 1, 0}}, | ||
321 | {.info = {"_STA", 0, ACPI_RTYPE_INTEGER}}, | ||
322 | {.info = {"_STM", 3, 0}}, | ||
323 | {.info = {"_STR", 0, ACPI_RTYPE_BUFFER}}, | ||
324 | {.info = {"_SUN", 0, ACPI_RTYPE_INTEGER}}, | ||
325 | {.info = {"_SWS", 0, ACPI_RTYPE_INTEGER}}, | ||
326 | {.info = {"_TC1", 0, ACPI_RTYPE_INTEGER}}, | ||
327 | {.info = {"_TC2", 0, ACPI_RTYPE_INTEGER}}, | ||
328 | {.info = {"_TMP", 0, ACPI_RTYPE_INTEGER}}, | ||
329 | {.info = {"_TPC", 0, ACPI_RTYPE_INTEGER}}, | ||
330 | {.info = {"_TPT", 1, 0}}, | ||
331 | {.info = {"_TRT", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2, ACPI_RTYPE_REFERENCE, 2, | ||
332 | ACPI_RTYPE_INTEGER, 6, 0}}, /* variable (Pkgs) each 2_ref/6_int */ | ||
333 | {.info = {"_TSD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2_COUNT, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* variable (Pkgs) each 5_int with count */ | ||
334 | {.info = {"_TSP", 0, ACPI_RTYPE_INTEGER}}, | ||
335 | {.info = {"_TSS", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE2, ACPI_RTYPE_INTEGER, 5, 0, 0, 0}}, /* variable (Pkgs) each 5_int */ | ||
336 | {.info = {"_TST", 0, ACPI_RTYPE_INTEGER}}, | ||
337 | {.info = {"_TTS", 1, 0}}, | ||
338 | {.info = {"_TZD", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0, 0, 0, 0}}, /* variable (Refs) */ | ||
339 | {.info = {"_TZM", 0, ACPI_RTYPE_REFERENCE}}, | ||
340 | {.info = {"_TZP", 0, ACPI_RTYPE_INTEGER}}, | ||
341 | {.info = {"_UID", 0, ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING}}, | ||
342 | {.info = {"_UPC", 0, ACPI_RTYPE_PACKAGE}}, {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4, 0, 0, 0}}, /* fixed (4 Int) */ | ||
343 | {.info = {"_UPD", 0, ACPI_RTYPE_INTEGER}}, | ||
344 | {.info = {"_UPP", 0, ACPI_RTYPE_INTEGER}}, | ||
345 | {.info = {"_VPO", 0, ACPI_RTYPE_INTEGER}}, | ||
346 | |||
347 | /* Acpi 1.0 defined _WAK with no return value. Later, it was changed to return a package */ | ||
348 | |||
349 | {.info = {"_WAK", 1, ACPI_RTYPE_NONE | ACPI_RTYPE_INTEGER | ACPI_RTYPE_PACKAGE}}, | ||
350 | {.ret_info = {ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 2, 0, 0, 0}}, /* fixed (2 Int), but is optional */ | ||
351 | {.ret_info = {0, 0, 0, 0, 0, 0}} /* Table terminator */ | ||
352 | }; | ||
353 | |||
354 | #if 0 | ||
355 | /* Not implemented */ | ||
356 | |||
357 | { | ||
358 | "_WDG", 0, ACPI_RTYPE_BUFFER}, /* MS Extension */ | ||
359 | |||
360 | { | ||
361 | "_WED", 1, ACPI_RTYPE_PACKAGE}, /* MS Extension */ | ||
362 | |||
363 | /* This is an internally implemented control method, no need to check */ | ||
364 | { | ||
365 | "_OSI", 1, ACPI_RTYPE_INTEGER}, | ||
366 | |||
367 | /* TBD: */ | ||
368 | _PRT - currently ignore reversed entries.attempt to fix here ? | ||
369 | think about code that attempts to fix package elements like _BIF, etc. | ||
370 | #endif | ||
371 | #endif | ||
diff --git a/include/acpi/acresrc.h b/include/acpi/acresrc.h deleted file mode 100644 index eef5bd7a59fa..000000000000 --- a/include/acpi/acresrc.h +++ /dev/null | |||
@@ -1,336 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acresrc.h - Resource Manager function prototypes | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACRESRC_H__ | ||
45 | #define __ACRESRC_H__ | ||
46 | |||
47 | /* Need the AML resource descriptor structs */ | ||
48 | |||
49 | #include "amlresrc.h" | ||
50 | |||
51 | /* | ||
52 | * If possible, pack the following structures to byte alignment, since we | ||
53 | * don't care about performance for debug output. Two cases where we cannot | ||
54 | * pack the structures: | ||
55 | * | ||
56 | * 1) Hardware does not support misaligned memory transfers | ||
57 | * 2) Compiler does not support pointers within packed structures | ||
58 | */ | ||
59 | #if (!defined(ACPI_MISALIGNMENT_NOT_SUPPORTED) && !defined(ACPI_PACKED_POINTERS_NOT_SUPPORTED)) | ||
60 | #pragma pack(1) | ||
61 | #endif | ||
62 | |||
63 | /* | ||
64 | * Individual entry for the resource conversion tables | ||
65 | */ | ||
66 | typedef const struct acpi_rsconvert_info { | ||
67 | u8 opcode; | ||
68 | u8 resource_offset; | ||
69 | u8 aml_offset; | ||
70 | u8 value; | ||
71 | |||
72 | } acpi_rsconvert_info; | ||
73 | |||
74 | /* Resource conversion opcodes */ | ||
75 | |||
76 | #define ACPI_RSC_INITGET 0 | ||
77 | #define ACPI_RSC_INITSET 1 | ||
78 | #define ACPI_RSC_FLAGINIT 2 | ||
79 | #define ACPI_RSC_1BITFLAG 3 | ||
80 | #define ACPI_RSC_2BITFLAG 4 | ||
81 | #define ACPI_RSC_COUNT 5 | ||
82 | #define ACPI_RSC_COUNT16 6 | ||
83 | #define ACPI_RSC_LENGTH 7 | ||
84 | #define ACPI_RSC_MOVE8 8 | ||
85 | #define ACPI_RSC_MOVE16 9 | ||
86 | #define ACPI_RSC_MOVE32 10 | ||
87 | #define ACPI_RSC_MOVE64 11 | ||
88 | #define ACPI_RSC_SET8 12 | ||
89 | #define ACPI_RSC_DATA8 13 | ||
90 | #define ACPI_RSC_ADDRESS 14 | ||
91 | #define ACPI_RSC_SOURCE 15 | ||
92 | #define ACPI_RSC_SOURCEX 16 | ||
93 | #define ACPI_RSC_BITMASK 17 | ||
94 | #define ACPI_RSC_BITMASK16 18 | ||
95 | #define ACPI_RSC_EXIT_NE 19 | ||
96 | #define ACPI_RSC_EXIT_LE 20 | ||
97 | #define ACPI_RSC_EXIT_EQ 21 | ||
98 | |||
99 | /* Resource Conversion sub-opcodes */ | ||
100 | |||
101 | #define ACPI_RSC_COMPARE_AML_LENGTH 0 | ||
102 | #define ACPI_RSC_COMPARE_VALUE 1 | ||
103 | |||
104 | #define ACPI_RSC_TABLE_SIZE(d) (sizeof (d) / sizeof (struct acpi_rsconvert_info)) | ||
105 | |||
106 | #define ACPI_RS_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_resource,f) | ||
107 | #define AML_OFFSET(f) (u8) ACPI_OFFSET (union aml_resource,f) | ||
108 | |||
109 | typedef const struct acpi_rsdump_info { | ||
110 | u8 opcode; | ||
111 | u8 offset; | ||
112 | char *name; | ||
113 | const char **pointer; | ||
114 | |||
115 | } acpi_rsdump_info; | ||
116 | |||
117 | /* Values for the Opcode field above */ | ||
118 | |||
119 | #define ACPI_RSD_TITLE 0 | ||
120 | #define ACPI_RSD_LITERAL 1 | ||
121 | #define ACPI_RSD_STRING 2 | ||
122 | #define ACPI_RSD_UINT8 3 | ||
123 | #define ACPI_RSD_UINT16 4 | ||
124 | #define ACPI_RSD_UINT32 5 | ||
125 | #define ACPI_RSD_UINT64 6 | ||
126 | #define ACPI_RSD_1BITFLAG 7 | ||
127 | #define ACPI_RSD_2BITFLAG 8 | ||
128 | #define ACPI_RSD_SHORTLIST 9 | ||
129 | #define ACPI_RSD_LONGLIST 10 | ||
130 | #define ACPI_RSD_DWORDLIST 11 | ||
131 | #define ACPI_RSD_ADDRESS 12 | ||
132 | #define ACPI_RSD_SOURCE 13 | ||
133 | |||
134 | /* restore default alignment */ | ||
135 | |||
136 | #pragma pack() | ||
137 | |||
138 | /* Resource tables indexed by internal resource type */ | ||
139 | |||
140 | extern const u8 acpi_gbl_aml_resource_sizes[]; | ||
141 | extern struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[]; | ||
142 | |||
143 | /* Resource tables indexed by raw AML resource descriptor type */ | ||
144 | |||
145 | extern const u8 acpi_gbl_resource_struct_sizes[]; | ||
146 | extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[]; | ||
147 | |||
148 | struct acpi_vendor_walk_info { | ||
149 | struct acpi_vendor_uuid *uuid; | ||
150 | struct acpi_buffer *buffer; | ||
151 | acpi_status status; | ||
152 | }; | ||
153 | |||
154 | /* | ||
155 | * rscreate | ||
156 | */ | ||
157 | acpi_status | ||
158 | acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer, | ||
159 | struct acpi_buffer *output_buffer); | ||
160 | |||
161 | acpi_status | ||
162 | acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer, | ||
163 | struct acpi_buffer *output_buffer); | ||
164 | |||
165 | acpi_status | ||
166 | acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | ||
167 | struct acpi_buffer *output_buffer); | ||
168 | |||
169 | /* | ||
170 | * rsutils | ||
171 | */ | ||
172 | |||
173 | acpi_status | ||
174 | acpi_rs_get_prt_method_data(struct acpi_namespace_node *node, | ||
175 | struct acpi_buffer *ret_buffer); | ||
176 | |||
177 | acpi_status | ||
178 | acpi_rs_get_crs_method_data(struct acpi_namespace_node *node, | ||
179 | struct acpi_buffer *ret_buffer); | ||
180 | |||
181 | acpi_status | ||
182 | acpi_rs_get_prs_method_data(struct acpi_namespace_node *node, | ||
183 | struct acpi_buffer *ret_buffer); | ||
184 | |||
185 | acpi_status | ||
186 | acpi_rs_get_method_data(acpi_handle handle, | ||
187 | char *path, struct acpi_buffer *ret_buffer); | ||
188 | |||
189 | acpi_status | ||
190 | acpi_rs_set_srs_method_data(struct acpi_namespace_node *node, | ||
191 | struct acpi_buffer *ret_buffer); | ||
192 | |||
193 | /* | ||
194 | * rscalc | ||
195 | */ | ||
196 | acpi_status | ||
197 | acpi_rs_get_list_length(u8 * aml_buffer, | ||
198 | u32 aml_buffer_length, acpi_size * size_needed); | ||
199 | |||
200 | acpi_status | ||
201 | acpi_rs_get_aml_length(struct acpi_resource *linked_list_buffer, | ||
202 | acpi_size * size_needed); | ||
203 | |||
204 | acpi_status | ||
205 | acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, | ||
206 | acpi_size * buffer_size_needed); | ||
207 | |||
208 | acpi_status | ||
209 | acpi_rs_convert_aml_to_resources(u8 * aml, | ||
210 | u32 length, | ||
211 | u32 offset, u8 resource_index, void **context); | ||
212 | |||
213 | acpi_status | ||
214 | acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | ||
215 | acpi_size aml_size_needed, u8 * output_buffer); | ||
216 | |||
217 | /* | ||
218 | * rsaddr | ||
219 | */ | ||
220 | void | ||
221 | acpi_rs_set_address_common(union aml_resource *aml, | ||
222 | struct acpi_resource *resource); | ||
223 | |||
224 | u8 | ||
225 | acpi_rs_get_address_common(struct acpi_resource *resource, | ||
226 | union aml_resource *aml); | ||
227 | |||
228 | /* | ||
229 | * rsmisc | ||
230 | */ | ||
231 | acpi_status | ||
232 | acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, | ||
233 | union aml_resource *aml, | ||
234 | struct acpi_rsconvert_info *info); | ||
235 | |||
236 | acpi_status | ||
237 | acpi_rs_convert_resource_to_aml(struct acpi_resource *resource, | ||
238 | union aml_resource *aml, | ||
239 | struct acpi_rsconvert_info *info); | ||
240 | |||
241 | /* | ||
242 | * rsutils | ||
243 | */ | ||
244 | void | ||
245 | acpi_rs_move_data(void *destination, | ||
246 | void *source, u16 item_count, u8 move_type); | ||
247 | |||
248 | u8 acpi_rs_decode_bitmask(u16 mask, u8 * list); | ||
249 | |||
250 | u16 acpi_rs_encode_bitmask(u8 * list, u8 count); | ||
251 | |||
252 | acpi_rs_length | ||
253 | acpi_rs_get_resource_source(acpi_rs_length resource_length, | ||
254 | acpi_rs_length minimum_length, | ||
255 | struct acpi_resource_source *resource_source, | ||
256 | union aml_resource *aml, char *string_ptr); | ||
257 | |||
258 | acpi_rsdesc_size | ||
259 | acpi_rs_set_resource_source(union aml_resource *aml, | ||
260 | acpi_rs_length minimum_length, | ||
261 | struct acpi_resource_source *resource_source); | ||
262 | |||
263 | void | ||
264 | acpi_rs_set_resource_header(u8 descriptor_type, | ||
265 | acpi_rsdesc_size total_length, | ||
266 | union aml_resource *aml); | ||
267 | |||
268 | void | ||
269 | acpi_rs_set_resource_length(acpi_rsdesc_size total_length, | ||
270 | union aml_resource *aml); | ||
271 | |||
272 | /* | ||
273 | * rsdump | ||
274 | */ | ||
275 | void acpi_rs_dump_resource_list(struct acpi_resource *resource); | ||
276 | |||
277 | void acpi_rs_dump_irq_list(u8 * route_table); | ||
278 | |||
279 | /* | ||
280 | * Resource conversion tables | ||
281 | */ | ||
282 | extern struct acpi_rsconvert_info acpi_rs_convert_dma[]; | ||
283 | extern struct acpi_rsconvert_info acpi_rs_convert_end_dpf[]; | ||
284 | extern struct acpi_rsconvert_info acpi_rs_convert_io[]; | ||
285 | extern struct acpi_rsconvert_info acpi_rs_convert_fixed_io[]; | ||
286 | extern struct acpi_rsconvert_info acpi_rs_convert_end_tag[]; | ||
287 | extern struct acpi_rsconvert_info acpi_rs_convert_memory24[]; | ||
288 | extern struct acpi_rsconvert_info acpi_rs_convert_generic_reg[]; | ||
289 | extern struct acpi_rsconvert_info acpi_rs_convert_memory32[]; | ||
290 | extern struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[]; | ||
291 | extern struct acpi_rsconvert_info acpi_rs_convert_address32[]; | ||
292 | extern struct acpi_rsconvert_info acpi_rs_convert_address16[]; | ||
293 | extern struct acpi_rsconvert_info acpi_rs_convert_ext_irq[]; | ||
294 | extern struct acpi_rsconvert_info acpi_rs_convert_address64[]; | ||
295 | extern struct acpi_rsconvert_info acpi_rs_convert_ext_address64[]; | ||
296 | |||
297 | /* These resources require separate get/set tables */ | ||
298 | |||
299 | extern struct acpi_rsconvert_info acpi_rs_get_irq[]; | ||
300 | extern struct acpi_rsconvert_info acpi_rs_get_start_dpf[]; | ||
301 | extern struct acpi_rsconvert_info acpi_rs_get_vendor_small[]; | ||
302 | extern struct acpi_rsconvert_info acpi_rs_get_vendor_large[]; | ||
303 | |||
304 | extern struct acpi_rsconvert_info acpi_rs_set_irq[]; | ||
305 | extern struct acpi_rsconvert_info acpi_rs_set_start_dpf[]; | ||
306 | extern struct acpi_rsconvert_info acpi_rs_set_vendor[]; | ||
307 | |||
308 | #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) | ||
309 | /* | ||
310 | * rsinfo | ||
311 | */ | ||
312 | extern struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[]; | ||
313 | |||
314 | /* | ||
315 | * rsdump | ||
316 | */ | ||
317 | extern struct acpi_rsdump_info acpi_rs_dump_irq[]; | ||
318 | extern struct acpi_rsdump_info acpi_rs_dump_dma[]; | ||
319 | extern struct acpi_rsdump_info acpi_rs_dump_start_dpf[]; | ||
320 | extern struct acpi_rsdump_info acpi_rs_dump_end_dpf[]; | ||
321 | extern struct acpi_rsdump_info acpi_rs_dump_io[]; | ||
322 | extern struct acpi_rsdump_info acpi_rs_dump_fixed_io[]; | ||
323 | extern struct acpi_rsdump_info acpi_rs_dump_vendor[]; | ||
324 | extern struct acpi_rsdump_info acpi_rs_dump_end_tag[]; | ||
325 | extern struct acpi_rsdump_info acpi_rs_dump_memory24[]; | ||
326 | extern struct acpi_rsdump_info acpi_rs_dump_memory32[]; | ||
327 | extern struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[]; | ||
328 | extern struct acpi_rsdump_info acpi_rs_dump_address16[]; | ||
329 | extern struct acpi_rsdump_info acpi_rs_dump_address32[]; | ||
330 | extern struct acpi_rsdump_info acpi_rs_dump_address64[]; | ||
331 | extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[]; | ||
332 | extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[]; | ||
333 | extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[]; | ||
334 | #endif | ||
335 | |||
336 | #endif /* __ACRESRC_H__ */ | ||
diff --git a/include/acpi/acrestyp.h b/include/acpi/acrestyp.h new file mode 100644 index 000000000000..9ffe00feada6 --- /dev/null +++ b/include/acpi/acrestyp.h | |||
@@ -0,0 +1,405 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acrestyp.h - Defines, types, and structures for resource descriptors | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACRESTYP_H__ | ||
45 | #define __ACRESTYP_H__ | ||
46 | |||
47 | /* | ||
48 | * Definitions for Resource Attributes | ||
49 | */ | ||
50 | typedef u16 acpi_rs_length; /* Resource Length field is fixed at 16 bits */ | ||
51 | typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (64_k-1)+3 */ | ||
52 | |||
53 | /* | ||
54 | * Memory Attributes | ||
55 | */ | ||
56 | #define ACPI_READ_ONLY_MEMORY (u8) 0x00 | ||
57 | #define ACPI_READ_WRITE_MEMORY (u8) 0x01 | ||
58 | |||
59 | #define ACPI_NON_CACHEABLE_MEMORY (u8) 0x00 | ||
60 | #define ACPI_CACHABLE_MEMORY (u8) 0x01 | ||
61 | #define ACPI_WRITE_COMBINING_MEMORY (u8) 0x02 | ||
62 | #define ACPI_PREFETCHABLE_MEMORY (u8) 0x03 | ||
63 | |||
64 | /* | ||
65 | * IO Attributes | ||
66 | * The ISA IO ranges are: n000-n0_fFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. | ||
67 | * The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cd0-n_fFFh. | ||
68 | */ | ||
69 | #define ACPI_NON_ISA_ONLY_RANGES (u8) 0x01 | ||
70 | #define ACPI_ISA_ONLY_RANGES (u8) 0x02 | ||
71 | #define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES) | ||
72 | |||
73 | /* Type of translation - 1=Sparse, 0=Dense */ | ||
74 | |||
75 | #define ACPI_SPARSE_TRANSLATION (u8) 0x01 | ||
76 | |||
77 | /* | ||
78 | * IO Port Descriptor Decode | ||
79 | */ | ||
80 | #define ACPI_DECODE_10 (u8) 0x00 /* 10-bit IO address decode */ | ||
81 | #define ACPI_DECODE_16 (u8) 0x01 /* 16-bit IO address decode */ | ||
82 | |||
83 | /* | ||
84 | * IRQ Attributes | ||
85 | */ | ||
86 | #define ACPI_LEVEL_SENSITIVE (u8) 0x00 | ||
87 | #define ACPI_EDGE_SENSITIVE (u8) 0x01 | ||
88 | |||
89 | #define ACPI_ACTIVE_HIGH (u8) 0x00 | ||
90 | #define ACPI_ACTIVE_LOW (u8) 0x01 | ||
91 | |||
92 | #define ACPI_EXCLUSIVE (u8) 0x00 | ||
93 | #define ACPI_SHARED (u8) 0x01 | ||
94 | |||
95 | /* | ||
96 | * DMA Attributes | ||
97 | */ | ||
98 | #define ACPI_COMPATIBILITY (u8) 0x00 | ||
99 | #define ACPI_TYPE_A (u8) 0x01 | ||
100 | #define ACPI_TYPE_B (u8) 0x02 | ||
101 | #define ACPI_TYPE_F (u8) 0x03 | ||
102 | |||
103 | #define ACPI_NOT_BUS_MASTER (u8) 0x00 | ||
104 | #define ACPI_BUS_MASTER (u8) 0x01 | ||
105 | |||
106 | #define ACPI_TRANSFER_8 (u8) 0x00 | ||
107 | #define ACPI_TRANSFER_8_16 (u8) 0x01 | ||
108 | #define ACPI_TRANSFER_16 (u8) 0x02 | ||
109 | |||
110 | /* | ||
111 | * Start Dependent Functions Priority definitions | ||
112 | */ | ||
113 | #define ACPI_GOOD_CONFIGURATION (u8) 0x00 | ||
114 | #define ACPI_ACCEPTABLE_CONFIGURATION (u8) 0x01 | ||
115 | #define ACPI_SUB_OPTIMAL_CONFIGURATION (u8) 0x02 | ||
116 | |||
117 | /* | ||
118 | * 16, 32 and 64-bit Address Descriptor resource types | ||
119 | */ | ||
120 | #define ACPI_MEMORY_RANGE (u8) 0x00 | ||
121 | #define ACPI_IO_RANGE (u8) 0x01 | ||
122 | #define ACPI_BUS_NUMBER_RANGE (u8) 0x02 | ||
123 | |||
124 | #define ACPI_ADDRESS_NOT_FIXED (u8) 0x00 | ||
125 | #define ACPI_ADDRESS_FIXED (u8) 0x01 | ||
126 | |||
127 | #define ACPI_POS_DECODE (u8) 0x00 | ||
128 | #define ACPI_SUB_DECODE (u8) 0x01 | ||
129 | |||
130 | #define ACPI_PRODUCER (u8) 0x00 | ||
131 | #define ACPI_CONSUMER (u8) 0x01 | ||
132 | |||
133 | /* | ||
134 | * If possible, pack the following structures to byte alignment | ||
135 | */ | ||
136 | #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED | ||
137 | #pragma pack(1) | ||
138 | #endif | ||
139 | |||
140 | /* UUID data structures for use in vendor-defined resource descriptors */ | ||
141 | |||
142 | struct acpi_uuid { | ||
143 | u8 data[ACPI_UUID_LENGTH]; | ||
144 | }; | ||
145 | |||
146 | struct acpi_vendor_uuid { | ||
147 | u8 subtype; | ||
148 | u8 data[ACPI_UUID_LENGTH]; | ||
149 | }; | ||
150 | |||
151 | /* | ||
152 | * Structures used to describe device resources | ||
153 | */ | ||
154 | struct acpi_resource_irq { | ||
155 | u8 descriptor_length; | ||
156 | u8 triggering; | ||
157 | u8 polarity; | ||
158 | u8 sharable; | ||
159 | u8 interrupt_count; | ||
160 | u8 interrupts[1]; | ||
161 | }; | ||
162 | |||
163 | struct acpi_resource_dma { | ||
164 | u8 type; | ||
165 | u8 bus_master; | ||
166 | u8 transfer; | ||
167 | u8 channel_count; | ||
168 | u8 channels[1]; | ||
169 | }; | ||
170 | |||
171 | struct acpi_resource_start_dependent { | ||
172 | u8 descriptor_length; | ||
173 | u8 compatibility_priority; | ||
174 | u8 performance_robustness; | ||
175 | }; | ||
176 | |||
177 | /* | ||
178 | * The END_DEPENDENT_FUNCTIONS_RESOURCE struct is not | ||
179 | * needed because it has no fields | ||
180 | */ | ||
181 | |||
182 | struct acpi_resource_io { | ||
183 | u8 io_decode; | ||
184 | u8 alignment; | ||
185 | u8 address_length; | ||
186 | u16 minimum; | ||
187 | u16 maximum; | ||
188 | }; | ||
189 | |||
190 | struct acpi_resource_fixed_io { | ||
191 | u16 address; | ||
192 | u8 address_length; | ||
193 | }; | ||
194 | |||
195 | struct acpi_resource_vendor { | ||
196 | u16 byte_length; | ||
197 | u8 byte_data[1]; | ||
198 | }; | ||
199 | |||
200 | /* Vendor resource with UUID info (introduced in ACPI 3.0) */ | ||
201 | |||
202 | struct acpi_resource_vendor_typed { | ||
203 | u16 byte_length; | ||
204 | u8 uuid_subtype; | ||
205 | u8 uuid[ACPI_UUID_LENGTH]; | ||
206 | u8 byte_data[1]; | ||
207 | }; | ||
208 | |||
209 | struct acpi_resource_end_tag { | ||
210 | u8 checksum; | ||
211 | }; | ||
212 | |||
213 | struct acpi_resource_memory24 { | ||
214 | u8 write_protect; | ||
215 | u16 minimum; | ||
216 | u16 maximum; | ||
217 | u16 alignment; | ||
218 | u16 address_length; | ||
219 | }; | ||
220 | |||
221 | struct acpi_resource_memory32 { | ||
222 | u8 write_protect; | ||
223 | u32 minimum; | ||
224 | u32 maximum; | ||
225 | u32 alignment; | ||
226 | u32 address_length; | ||
227 | }; | ||
228 | |||
229 | struct acpi_resource_fixed_memory32 { | ||
230 | u8 write_protect; | ||
231 | u32 address; | ||
232 | u32 address_length; | ||
233 | }; | ||
234 | |||
235 | struct acpi_memory_attribute { | ||
236 | u8 write_protect; | ||
237 | u8 caching; | ||
238 | u8 range_type; | ||
239 | u8 translation; | ||
240 | }; | ||
241 | |||
242 | struct acpi_io_attribute { | ||
243 | u8 range_type; | ||
244 | u8 translation; | ||
245 | u8 translation_type; | ||
246 | u8 reserved1; | ||
247 | }; | ||
248 | |||
249 | union acpi_resource_attribute { | ||
250 | struct acpi_memory_attribute mem; | ||
251 | struct acpi_io_attribute io; | ||
252 | |||
253 | /* Used for the *word_space macros */ | ||
254 | |||
255 | u8 type_specific; | ||
256 | }; | ||
257 | |||
258 | struct acpi_resource_source { | ||
259 | u8 index; | ||
260 | u16 string_length; | ||
261 | char *string_ptr; | ||
262 | }; | ||
263 | |||
264 | /* Fields common to all address descriptors, 16/32/64 bit */ | ||
265 | |||
266 | #define ACPI_RESOURCE_ADDRESS_COMMON \ | ||
267 | u8 resource_type; \ | ||
268 | u8 producer_consumer; \ | ||
269 | u8 decode; \ | ||
270 | u8 min_address_fixed; \ | ||
271 | u8 max_address_fixed; \ | ||
272 | union acpi_resource_attribute info; | ||
273 | |||
274 | struct acpi_resource_address { | ||
275 | ACPI_RESOURCE_ADDRESS_COMMON}; | ||
276 | |||
277 | struct acpi_resource_address16 { | ||
278 | ACPI_RESOURCE_ADDRESS_COMMON u16 granularity; | ||
279 | u16 minimum; | ||
280 | u16 maximum; | ||
281 | u16 translation_offset; | ||
282 | u16 address_length; | ||
283 | struct acpi_resource_source resource_source; | ||
284 | }; | ||
285 | |||
286 | struct acpi_resource_address32 { | ||
287 | ACPI_RESOURCE_ADDRESS_COMMON u32 granularity; | ||
288 | u32 minimum; | ||
289 | u32 maximum; | ||
290 | u32 translation_offset; | ||
291 | u32 address_length; | ||
292 | struct acpi_resource_source resource_source; | ||
293 | }; | ||
294 | |||
295 | struct acpi_resource_address64 { | ||
296 | ACPI_RESOURCE_ADDRESS_COMMON u64 granularity; | ||
297 | u64 minimum; | ||
298 | u64 maximum; | ||
299 | u64 translation_offset; | ||
300 | u64 address_length; | ||
301 | struct acpi_resource_source resource_source; | ||
302 | }; | ||
303 | |||
304 | struct acpi_resource_extended_address64 { | ||
305 | ACPI_RESOURCE_ADDRESS_COMMON u8 revision_iD; | ||
306 | u64 granularity; | ||
307 | u64 minimum; | ||
308 | u64 maximum; | ||
309 | u64 translation_offset; | ||
310 | u64 address_length; | ||
311 | u64 type_specific; | ||
312 | }; | ||
313 | |||
314 | struct acpi_resource_extended_irq { | ||
315 | u8 producer_consumer; | ||
316 | u8 triggering; | ||
317 | u8 polarity; | ||
318 | u8 sharable; | ||
319 | u8 interrupt_count; | ||
320 | struct acpi_resource_source resource_source; | ||
321 | u32 interrupts[1]; | ||
322 | }; | ||
323 | |||
324 | struct acpi_resource_generic_register { | ||
325 | u8 space_id; | ||
326 | u8 bit_width; | ||
327 | u8 bit_offset; | ||
328 | u8 access_size; | ||
329 | u64 address; | ||
330 | }; | ||
331 | |||
332 | /* ACPI_RESOURCE_TYPEs */ | ||
333 | |||
334 | #define ACPI_RESOURCE_TYPE_IRQ 0 | ||
335 | #define ACPI_RESOURCE_TYPE_DMA 1 | ||
336 | #define ACPI_RESOURCE_TYPE_START_DEPENDENT 2 | ||
337 | #define ACPI_RESOURCE_TYPE_END_DEPENDENT 3 | ||
338 | #define ACPI_RESOURCE_TYPE_IO 4 | ||
339 | #define ACPI_RESOURCE_TYPE_FIXED_IO 5 | ||
340 | #define ACPI_RESOURCE_TYPE_VENDOR 6 | ||
341 | #define ACPI_RESOURCE_TYPE_END_TAG 7 | ||
342 | #define ACPI_RESOURCE_TYPE_MEMORY24 8 | ||
343 | #define ACPI_RESOURCE_TYPE_MEMORY32 9 | ||
344 | #define ACPI_RESOURCE_TYPE_FIXED_MEMORY32 10 | ||
345 | #define ACPI_RESOURCE_TYPE_ADDRESS16 11 | ||
346 | #define ACPI_RESOURCE_TYPE_ADDRESS32 12 | ||
347 | #define ACPI_RESOURCE_TYPE_ADDRESS64 13 | ||
348 | #define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 14 /* ACPI 3.0 */ | ||
349 | #define ACPI_RESOURCE_TYPE_EXTENDED_IRQ 15 | ||
350 | #define ACPI_RESOURCE_TYPE_GENERIC_REGISTER 16 | ||
351 | #define ACPI_RESOURCE_TYPE_MAX 16 | ||
352 | |||
353 | /* Master union for resource descriptors */ | ||
354 | |||
355 | union acpi_resource_data { | ||
356 | struct acpi_resource_irq irq; | ||
357 | struct acpi_resource_dma dma; | ||
358 | struct acpi_resource_start_dependent start_dpf; | ||
359 | struct acpi_resource_io io; | ||
360 | struct acpi_resource_fixed_io fixed_io; | ||
361 | struct acpi_resource_vendor vendor; | ||
362 | struct acpi_resource_vendor_typed vendor_typed; | ||
363 | struct acpi_resource_end_tag end_tag; | ||
364 | struct acpi_resource_memory24 memory24; | ||
365 | struct acpi_resource_memory32 memory32; | ||
366 | struct acpi_resource_fixed_memory32 fixed_memory32; | ||
367 | struct acpi_resource_address16 address16; | ||
368 | struct acpi_resource_address32 address32; | ||
369 | struct acpi_resource_address64 address64; | ||
370 | struct acpi_resource_extended_address64 ext_address64; | ||
371 | struct acpi_resource_extended_irq extended_irq; | ||
372 | struct acpi_resource_generic_register generic_reg; | ||
373 | |||
374 | /* Common fields */ | ||
375 | |||
376 | struct acpi_resource_address address; /* Common 16/32/64 address fields */ | ||
377 | }; | ||
378 | |||
379 | /* Common resource header */ | ||
380 | |||
381 | struct acpi_resource { | ||
382 | u32 type; | ||
383 | u32 length; | ||
384 | union acpi_resource_data data; | ||
385 | }; | ||
386 | |||
387 | /* restore default alignment */ | ||
388 | |||
389 | #pragma pack() | ||
390 | |||
391 | #define ACPI_RS_SIZE_NO_DATA 8 /* Id + Length fields */ | ||
392 | #define ACPI_RS_SIZE_MIN (u32) ACPI_ROUND_UP_TO_NATIVE_WORD (12) | ||
393 | #define ACPI_RS_SIZE(type) (u32) (ACPI_RS_SIZE_NO_DATA + sizeof (type)) | ||
394 | |||
395 | #define ACPI_NEXT_RESOURCE(res) (struct acpi_resource *)((u8 *) res + res->length) | ||
396 | |||
397 | struct acpi_pci_routing_table { | ||
398 | u32 length; | ||
399 | u32 pin; | ||
400 | acpi_integer address; /* here for 64-bit alignment */ | ||
401 | u32 source_index; | ||
402 | char source[4]; /* pad to 64 bits so sizeof() works in all cases */ | ||
403 | }; | ||
404 | |||
405 | #endif /* __ACRESTYP_H__ */ | ||
diff --git a/include/acpi/acstruct.h b/include/acpi/acstruct.h deleted file mode 100644 index 7980a26bad35..000000000000 --- a/include/acpi/acstruct.h +++ /dev/null | |||
@@ -1,228 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acstruct.h - Internal structs | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACSTRUCT_H__ | ||
45 | #define __ACSTRUCT_H__ | ||
46 | |||
47 | /* acpisrc:struct_defs -- for acpisrc conversion */ | ||
48 | |||
49 | /***************************************************************************** | ||
50 | * | ||
51 | * Tree walking typedefs and structs | ||
52 | * | ||
53 | ****************************************************************************/ | ||
54 | |||
55 | /* | ||
56 | * Walk state - current state of a parse tree walk. Used for both a leisurely | ||
57 | * stroll through the tree (for whatever reason), and for control method | ||
58 | * execution. | ||
59 | */ | ||
60 | #define ACPI_NEXT_OP_DOWNWARD 1 | ||
61 | #define ACPI_NEXT_OP_UPWARD 2 | ||
62 | |||
63 | /* | ||
64 | * Groups of definitions for walk_type used for different implementations of | ||
65 | * walkers (never simultaneously) - flags for interpreter: | ||
66 | */ | ||
67 | #define ACPI_WALK_NON_METHOD 0 | ||
68 | #define ACPI_WALK_METHOD 0x01 | ||
69 | #define ACPI_WALK_METHOD_RESTART 0x02 | ||
70 | |||
71 | /* Flags for i_aSL compiler only */ | ||
72 | |||
73 | #define ACPI_WALK_CONST_REQUIRED 0x10 | ||
74 | #define ACPI_WALK_CONST_OPTIONAL 0x20 | ||
75 | |||
76 | struct acpi_walk_state { | ||
77 | struct acpi_walk_state *next; /* Next walk_state in list */ | ||
78 | u8 descriptor_type; /* To differentiate various internal objs */ | ||
79 | u8 walk_type; | ||
80 | u16 opcode; /* Current AML opcode */ | ||
81 | u8 next_op_info; /* Info about next_op */ | ||
82 | u8 num_operands; /* Stack pointer for Operands[] array */ | ||
83 | u8 operand_index; /* Index into operand stack, to be used by acpi_ds_obj_stack_push */ | ||
84 | acpi_owner_id owner_id; /* Owner of objects created during the walk */ | ||
85 | u8 last_predicate; /* Result of last predicate */ | ||
86 | u8 current_result; | ||
87 | u8 return_used; | ||
88 | u8 scope_depth; | ||
89 | u8 pass_number; /* Parse pass during table load */ | ||
90 | u8 result_size; /* Total elements for the result stack */ | ||
91 | u8 result_count; /* Current number of occupied elements of result stack */ | ||
92 | u32 aml_offset; | ||
93 | u32 arg_types; | ||
94 | u32 method_breakpoint; /* For single stepping */ | ||
95 | u32 user_breakpoint; /* User AML breakpoint */ | ||
96 | u32 parse_flags; | ||
97 | |||
98 | struct acpi_parse_state parser_state; /* Current state of parser */ | ||
99 | u32 prev_arg_types; | ||
100 | u32 arg_count; /* push for fixed or var args */ | ||
101 | |||
102 | struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ | ||
103 | struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ | ||
104 | union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS + 1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ | ||
105 | union acpi_operand_object **params; | ||
106 | |||
107 | u8 *aml_last_while; | ||
108 | union acpi_operand_object **caller_return_desc; | ||
109 | union acpi_generic_state *control_state; /* List of control states (nested IFs) */ | ||
110 | struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ | ||
111 | union acpi_operand_object *implicit_return_obj; | ||
112 | struct acpi_namespace_node *method_call_node; /* Called method Node */ | ||
113 | union acpi_parse_object *method_call_op; /* method_call Op if running a method */ | ||
114 | union acpi_operand_object *method_desc; /* Method descriptor if running a method */ | ||
115 | struct acpi_namespace_node *method_node; /* Method node if running a method. */ | ||
116 | union acpi_parse_object *op; /* Current parser op */ | ||
117 | const struct acpi_opcode_info *op_info; /* Info on current opcode */ | ||
118 | union acpi_parse_object *origin; /* Start of walk [Obsolete] */ | ||
119 | union acpi_operand_object *result_obj; | ||
120 | union acpi_generic_state *results; /* Stack of accumulated results */ | ||
121 | union acpi_operand_object *return_desc; /* Return object, if any */ | ||
122 | union acpi_generic_state *scope_info; /* Stack of nested scopes */ | ||
123 | union acpi_parse_object *prev_op; /* Last op that was processed */ | ||
124 | union acpi_parse_object *next_op; /* next op to be processed */ | ||
125 | struct acpi_thread_state *thread; | ||
126 | acpi_parse_downwards descending_callback; | ||
127 | acpi_parse_upwards ascending_callback; | ||
128 | }; | ||
129 | |||
130 | /* Info used by acpi_ps_init_objects */ | ||
131 | |||
132 | struct acpi_init_walk_info { | ||
133 | u16 method_count; | ||
134 | u16 device_count; | ||
135 | u16 op_region_count; | ||
136 | u16 field_count; | ||
137 | u16 buffer_count; | ||
138 | u16 package_count; | ||
139 | u16 op_region_init; | ||
140 | u16 field_init; | ||
141 | u16 buffer_init; | ||
142 | u16 package_init; | ||
143 | u16 object_count; | ||
144 | acpi_owner_id owner_id; | ||
145 | u32 table_index; | ||
146 | }; | ||
147 | |||
148 | struct acpi_get_devices_info { | ||
149 | acpi_walk_callback user_function; | ||
150 | void *context; | ||
151 | const char *hid; | ||
152 | }; | ||
153 | |||
154 | union acpi_aml_operands { | ||
155 | union acpi_operand_object *operands[7]; | ||
156 | |||
157 | struct { | ||
158 | struct acpi_object_integer *type; | ||
159 | struct acpi_object_integer *code; | ||
160 | struct acpi_object_integer *argument; | ||
161 | |||
162 | } fatal; | ||
163 | |||
164 | struct { | ||
165 | union acpi_operand_object *source; | ||
166 | struct acpi_object_integer *index; | ||
167 | union acpi_operand_object *target; | ||
168 | |||
169 | } index; | ||
170 | |||
171 | struct { | ||
172 | union acpi_operand_object *source; | ||
173 | struct acpi_object_integer *index; | ||
174 | struct acpi_object_integer *length; | ||
175 | union acpi_operand_object *target; | ||
176 | |||
177 | } mid; | ||
178 | }; | ||
179 | |||
180 | /* | ||
181 | * Structure used to pass object evaluation parameters. | ||
182 | * Purpose is to reduce CPU stack use. | ||
183 | */ | ||
184 | struct acpi_evaluate_info { | ||
185 | struct acpi_namespace_node *prefix_node; | ||
186 | char *pathname; | ||
187 | union acpi_operand_object *obj_desc; | ||
188 | union acpi_operand_object **parameters; | ||
189 | struct acpi_namespace_node *resolved_node; | ||
190 | union acpi_operand_object *return_object; | ||
191 | u8 param_count; | ||
192 | u8 pass_number; | ||
193 | u8 return_object_type; | ||
194 | u8 flags; | ||
195 | }; | ||
196 | |||
197 | /* Values for Flags above */ | ||
198 | |||
199 | #define ACPI_IGNORE_RETURN_VALUE 1 | ||
200 | |||
201 | /* Info used by acpi_ns_initialize_devices */ | ||
202 | |||
203 | struct acpi_device_walk_info { | ||
204 | u16 device_count; | ||
205 | u16 num_STA; | ||
206 | u16 num_INI; | ||
207 | struct acpi_table_desc *table_desc; | ||
208 | struct acpi_evaluate_info *evaluate_info; | ||
209 | }; | ||
210 | |||
211 | /* TBD: [Restructure] Merge with struct above */ | ||
212 | |||
213 | struct acpi_walk_info { | ||
214 | u32 debug_level; | ||
215 | u32 count; | ||
216 | acpi_owner_id owner_id; | ||
217 | u8 display_type; | ||
218 | }; | ||
219 | |||
220 | /* Display Types */ | ||
221 | |||
222 | #define ACPI_DISPLAY_SUMMARY (u8) 0 | ||
223 | #define ACPI_DISPLAY_OBJECTS (u8) 1 | ||
224 | #define ACPI_DISPLAY_MASK (u8) 1 | ||
225 | |||
226 | #define ACPI_DISPLAY_SHORT (u8) 2 | ||
227 | |||
228 | #endif | ||
diff --git a/include/acpi/actables.h b/include/acpi/actables.h deleted file mode 100644 index 0cbe1b9ab522..000000000000 --- a/include/acpi/actables.h +++ /dev/null | |||
@@ -1,115 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: actables.h - ACPI table management | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef __ACTABLES_H__ | ||
45 | #define __ACTABLES_H__ | ||
46 | |||
47 | acpi_status acpi_allocate_root_table(u32 initial_table_count); | ||
48 | |||
49 | /* | ||
50 | * tbfadt - FADT parse/convert/validate | ||
51 | */ | ||
52 | void acpi_tb_parse_fadt(u32 table_index, u8 flags); | ||
53 | |||
54 | void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length); | ||
55 | |||
56 | /* | ||
57 | * tbfind - find ACPI table | ||
58 | */ | ||
59 | acpi_status | ||
60 | acpi_tb_find_table(char *signature, | ||
61 | char *oem_id, char *oem_table_id, u32 *table_index); | ||
62 | |||
63 | /* | ||
64 | * tbinstal - Table removal and deletion | ||
65 | */ | ||
66 | acpi_status acpi_tb_resize_root_table_list(void); | ||
67 | |||
68 | acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc); | ||
69 | |||
70 | acpi_status | ||
71 | acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index); | ||
72 | |||
73 | acpi_status | ||
74 | acpi_tb_store_table(acpi_physical_address address, | ||
75 | struct acpi_table_header *table, | ||
76 | u32 length, u8 flags, u32 *table_index); | ||
77 | |||
78 | void acpi_tb_delete_table(struct acpi_table_desc *table_desc); | ||
79 | |||
80 | void acpi_tb_terminate(void); | ||
81 | |||
82 | void acpi_tb_delete_namespace_by_owner(u32 table_index); | ||
83 | |||
84 | acpi_status acpi_tb_allocate_owner_id(u32 table_index); | ||
85 | |||
86 | acpi_status acpi_tb_release_owner_id(u32 table_index); | ||
87 | |||
88 | acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id); | ||
89 | |||
90 | u8 acpi_tb_is_table_loaded(u32 table_index); | ||
91 | |||
92 | void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded); | ||
93 | |||
94 | /* | ||
95 | * tbutils - table manager utilities | ||
96 | */ | ||
97 | u8 acpi_tb_tables_loaded(void); | ||
98 | |||
99 | void | ||
100 | acpi_tb_print_table_header(acpi_physical_address address, | ||
101 | struct acpi_table_header *header); | ||
102 | |||
103 | u8 acpi_tb_checksum(u8 *buffer, u32 length); | ||
104 | |||
105 | acpi_status | ||
106 | acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length); | ||
107 | |||
108 | void | ||
109 | acpi_tb_install_table(acpi_physical_address address, | ||
110 | u8 flags, char *signature, u32 table_index); | ||
111 | |||
112 | acpi_status | ||
113 | acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags); | ||
114 | |||
115 | #endif /* __ACTABLES_H__ */ | ||
diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h index 13a3d9ad92db..813e4b6c2c0d 100644 --- a/include/acpi/actbl.h +++ b/include/acpi/actbl.h | |||
@@ -288,6 +288,31 @@ enum acpi_prefered_pm_profiles { | |||
288 | 288 | ||
289 | #define ACPI_FADT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_fadt, f) | 289 | #define ACPI_FADT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_table_fadt, f) |
290 | 290 | ||
291 | union acpi_name_union { | ||
292 | u32 integer; | ||
293 | char ascii[4]; | ||
294 | }; | ||
295 | |||
296 | /* | ||
297 | * Internal ACPI Table Descriptor. One per ACPI table | ||
298 | */ | ||
299 | struct acpi_table_desc { | ||
300 | acpi_physical_address address; | ||
301 | struct acpi_table_header *pointer; | ||
302 | u32 length; /* Length fixed at 32 bits */ | ||
303 | union acpi_name_union signature; | ||
304 | acpi_owner_id owner_id; | ||
305 | u8 flags; | ||
306 | }; | ||
307 | |||
308 | /* Flags for above */ | ||
309 | |||
310 | #define ACPI_TABLE_ORIGIN_UNKNOWN (0) | ||
311 | #define ACPI_TABLE_ORIGIN_MAPPED (1) | ||
312 | #define ACPI_TABLE_ORIGIN_ALLOCATED (2) | ||
313 | #define ACPI_TABLE_ORIGIN_MASK (3) | ||
314 | #define ACPI_TABLE_IS_LOADED (4) | ||
315 | |||
291 | /* | 316 | /* |
292 | * Get the remaining ACPI tables | 317 | * Get the remaining ACPI tables |
293 | */ | 318 | */ |
diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h index 63f5b4cf4de1..18963b968114 100644 --- a/include/acpi/actbl1.h +++ b/include/acpi/actbl1.h | |||
@@ -627,7 +627,7 @@ struct acpi_hest_aer_common { | |||
627 | u32 uncorrectable_error_mask; | 627 | u32 uncorrectable_error_mask; |
628 | u32 uncorrectable_error_severity; | 628 | u32 uncorrectable_error_severity; |
629 | u32 correctable_error_mask; | 629 | u32 correctable_error_mask; |
630 | u32 advanced_error_cababilities; | 630 | u32 advanced_error_capabilities; |
631 | }; | 631 | }; |
632 | 632 | ||
633 | /* Hardware Error Notification */ | 633 | /* Hardware Error Notification */ |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 7220361790b3..a20aab510173 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -204,11 +204,10 @@ typedef u32 acpi_physical_address; | |||
204 | 204 | ||
205 | /******************************************************************************* | 205 | /******************************************************************************* |
206 | * | 206 | * |
207 | * OS-dependent and compiler-dependent types | 207 | * OS-dependent types |
208 | * | 208 | * |
209 | * If the defaults below are not appropriate for the host system, they can | 209 | * If the defaults below are not appropriate for the host system, they can |
210 | * be defined in the compiler-specific or OS-specific header, and this will | 210 | * be defined in the OS-specific header, and this will take precedence. |
211 | * take precedence. | ||
212 | * | 211 | * |
213 | ******************************************************************************/ | 212 | ******************************************************************************/ |
214 | 213 | ||
@@ -218,12 +217,6 @@ typedef u32 acpi_physical_address; | |||
218 | #define acpi_thread_id acpi_size | 217 | #define acpi_thread_id acpi_size |
219 | #endif | 218 | #endif |
220 | 219 | ||
221 | /* Object returned from acpi_os_create_lock */ | ||
222 | |||
223 | #ifndef acpi_spinlock | ||
224 | #define acpi_spinlock void * | ||
225 | #endif | ||
226 | |||
227 | /* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ | 220 | /* Flags for acpi_os_acquire_lock/acpi_os_release_lock */ |
228 | 221 | ||
229 | #ifndef acpi_cpu_flags | 222 | #ifndef acpi_cpu_flags |
@@ -233,9 +226,51 @@ typedef u32 acpi_physical_address; | |||
233 | /* Object returned from acpi_os_create_cache */ | 226 | /* Object returned from acpi_os_create_cache */ |
234 | 227 | ||
235 | #ifndef acpi_cache_t | 228 | #ifndef acpi_cache_t |
229 | #ifdef ACPI_USE_LOCAL_CACHE | ||
236 | #define acpi_cache_t struct acpi_memory_list | 230 | #define acpi_cache_t struct acpi_memory_list |
231 | #else | ||
232 | #define acpi_cache_t void * | ||
233 | #endif | ||
234 | #endif | ||
235 | |||
236 | /* | ||
237 | * Synchronization objects - Mutexes, Semaphores, and spin_locks | ||
238 | */ | ||
239 | #if (ACPI_MUTEX_TYPE == ACPI_BINARY_SEMAPHORE) | ||
240 | /* | ||
241 | * These macros are used if the host OS does not support a mutex object. | ||
242 | * Map the OSL Mutex interfaces to binary semaphores. | ||
243 | */ | ||
244 | #define acpi_mutex acpi_semaphore | ||
245 | #define acpi_os_create_mutex(out_handle) acpi_os_create_semaphore (1, 1, out_handle) | ||
246 | #define acpi_os_delete_mutex(handle) (void) acpi_os_delete_semaphore (handle) | ||
247 | #define acpi_os_acquire_mutex(handle,time) acpi_os_wait_semaphore (handle, 1, time) | ||
248 | #define acpi_os_release_mutex(handle) (void) acpi_os_signal_semaphore (handle, 1) | ||
249 | #endif | ||
250 | |||
251 | /* Configurable types for synchronization objects */ | ||
252 | |||
253 | #ifndef acpi_spinlock | ||
254 | #define acpi_spinlock void * | ||
255 | #endif | ||
256 | |||
257 | #ifndef acpi_semaphore | ||
258 | #define acpi_semaphore void * | ||
259 | #endif | ||
260 | |||
261 | #ifndef acpi_mutex | ||
262 | #define acpi_mutex void * | ||
237 | #endif | 263 | #endif |
238 | 264 | ||
265 | /******************************************************************************* | ||
266 | * | ||
267 | * Compiler-dependent types | ||
268 | * | ||
269 | * If the defaults below are not appropriate for the host compiler, they can | ||
270 | * be defined in the compiler-specific header, and this will take precedence. | ||
271 | * | ||
272 | ******************************************************************************/ | ||
273 | |||
239 | /* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */ | 274 | /* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */ |
240 | 275 | ||
241 | #ifndef acpi_uintptr_t | 276 | #ifndef acpi_uintptr_t |
@@ -268,6 +303,43 @@ typedef u32 acpi_physical_address; | |||
268 | #define ACPI_EXPORT_SYMBOL(symbol) | 303 | #define ACPI_EXPORT_SYMBOL(symbol) |
269 | #endif | 304 | #endif |
270 | 305 | ||
306 | /****************************************************************************** | ||
307 | * | ||
308 | * ACPI Specification constants (Do not change unless the specification changes) | ||
309 | * | ||
310 | *****************************************************************************/ | ||
311 | |||
312 | /* Number of distinct FADT-based GPE register blocks (GPE0 and GPE1) */ | ||
313 | |||
314 | #define ACPI_MAX_GPE_BLOCKS 2 | ||
315 | |||
316 | /* Default ACPI register widths */ | ||
317 | |||
318 | #define ACPI_GPE_REGISTER_WIDTH 8 | ||
319 | #define ACPI_PM1_REGISTER_WIDTH 16 | ||
320 | #define ACPI_PM2_REGISTER_WIDTH 8 | ||
321 | #define ACPI_PM_TIMER_WIDTH 32 | ||
322 | |||
323 | /* Names within the namespace are 4 bytes long */ | ||
324 | |||
325 | #define ACPI_NAME_SIZE 4 | ||
326 | #define ACPI_PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 char for separator */ | ||
327 | #define ACPI_PATH_SEPARATOR '.' | ||
328 | |||
329 | /* Sizes for ACPI table headers */ | ||
330 | |||
331 | #define ACPI_OEM_ID_SIZE 6 | ||
332 | #define ACPI_OEM_TABLE_ID_SIZE 8 | ||
333 | |||
334 | /* ACPI/PNP hardware IDs */ | ||
335 | |||
336 | #define PCI_ROOT_HID_STRING "PNP0A03" | ||
337 | #define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08" | ||
338 | |||
339 | /* PM Timer ticks per second (HZ) */ | ||
340 | |||
341 | #define PM_TIMER_FREQUENCY 3579545 | ||
342 | |||
271 | /******************************************************************************* | 343 | /******************************************************************************* |
272 | * | 344 | * |
273 | * Independent types | 345 | * Independent types |
@@ -291,13 +363,18 @@ typedef u32 acpi_physical_address; | |||
291 | #endif | 363 | #endif |
292 | 364 | ||
293 | /* | 365 | /* |
294 | * Mescellaneous types | 366 | * Miscellaneous types |
295 | */ | 367 | */ |
296 | typedef u32 acpi_status; /* All ACPI Exceptions */ | 368 | typedef u32 acpi_status; /* All ACPI Exceptions */ |
297 | typedef u32 acpi_name; /* 4-byte ACPI name */ | 369 | typedef u32 acpi_name; /* 4-byte ACPI name */ |
298 | typedef char *acpi_string; /* Null terminated ASCII string */ | 370 | typedef char *acpi_string; /* Null terminated ASCII string */ |
299 | typedef void *acpi_handle; /* Actually a ptr to a NS Node */ | 371 | typedef void *acpi_handle; /* Actually a ptr to a NS Node */ |
300 | 372 | ||
373 | /* Owner IDs are used to track namespace nodes for selective deletion */ | ||
374 | |||
375 | typedef u8 acpi_owner_id; | ||
376 | #define ACPI_OWNER_ID_MAX 0xFF | ||
377 | |||
301 | struct uint64_struct { | 378 | struct uint64_struct { |
302 | u32 lo; | 379 | u32 lo; |
303 | u32 hi; | 380 | u32 hi; |
@@ -313,13 +390,8 @@ struct uint32_struct { | |||
313 | u32 hi; | 390 | u32 hi; |
314 | }; | 391 | }; |
315 | 392 | ||
316 | /* Synchronization objects */ | ||
317 | |||
318 | #define acpi_mutex void * | ||
319 | #define acpi_semaphore void * | ||
320 | |||
321 | /* | 393 | /* |
322 | * Acpi integer width. In ACPI version 1, integers are 32 bits. In ACPI | 394 | * Acpi integer width. In ACPI version 1, integers are 32 bits. In ACPI |
323 | * version 2, integers are 64 bits. Note that this pertains to the ACPI integer | 395 | * version 2, integers are 64 bits. Note that this pertains to the ACPI integer |
324 | * type only, not other integers used in the implementation of the ACPI CA | 396 | * type only, not other integers used in the implementation of the ACPI CA |
325 | * subsystem. | 397 | * subsystem. |
@@ -338,10 +410,75 @@ typedef unsigned long long acpi_integer; | |||
338 | #define ACPI_MAX16_DECIMAL_DIGITS 5 | 410 | #define ACPI_MAX16_DECIMAL_DIGITS 5 |
339 | #define ACPI_MAX8_DECIMAL_DIGITS 3 | 411 | #define ACPI_MAX8_DECIMAL_DIGITS 3 |
340 | 412 | ||
413 | /* PM Timer ticks per second (HZ) */ | ||
414 | |||
415 | #define PM_TIMER_FREQUENCY 3579545 | ||
416 | |||
341 | /* | 417 | /* |
342 | * Constants with special meanings | 418 | * Constants with special meanings |
343 | */ | 419 | */ |
344 | #define ACPI_ROOT_OBJECT ACPI_ADD_PTR (acpi_handle, NULL, ACPI_MAX_PTR) | 420 | #define ACPI_ROOT_OBJECT ACPI_ADD_PTR (acpi_handle, NULL, ACPI_MAX_PTR) |
421 | #define ACPI_WAIT_FOREVER 0xFFFF /* u16, as per ACPI spec */ | ||
422 | #define ACPI_DO_NOT_WAIT 0 | ||
423 | |||
424 | /******************************************************************************* | ||
425 | * | ||
426 | * Commonly used macros | ||
427 | * | ||
428 | ******************************************************************************/ | ||
429 | |||
430 | /* Data manipulation */ | ||
431 | |||
432 | #define ACPI_LOWORD(l) ((u16)(u32)(l)) | ||
433 | #define ACPI_HIWORD(l) ((u16)((((u32)(l)) >> 16) & 0xFFFF)) | ||
434 | #define ACPI_LOBYTE(l) ((u8)(u16)(l)) | ||
435 | #define ACPI_HIBYTE(l) ((u8)((((u16)(l)) >> 8) & 0xFF)) | ||
436 | |||
437 | /* Full 64-bit integer must be available on both 32-bit and 64-bit platforms */ | ||
438 | |||
439 | struct acpi_integer_overlay { | ||
440 | u32 lo_dword; | ||
441 | u32 hi_dword; | ||
442 | }; | ||
443 | |||
444 | #define ACPI_LODWORD(integer) (ACPI_CAST_PTR (struct acpi_integer_overlay, &integer)->lo_dword) | ||
445 | #define ACPI_HIDWORD(integer) (ACPI_CAST_PTR (struct acpi_integer_overlay, &integer)->hi_dword) | ||
446 | |||
447 | #define ACPI_SET_BIT(target,bit) ((target) |= (bit)) | ||
448 | #define ACPI_CLEAR_BIT(target,bit) ((target) &= ~(bit)) | ||
449 | #define ACPI_MIN(a,b) (((a)<(b))?(a):(b)) | ||
450 | #define ACPI_MAX(a,b) (((a)>(b))?(a):(b)) | ||
451 | |||
452 | /* Size calculation */ | ||
453 | |||
454 | #define ACPI_ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0])) | ||
455 | |||
456 | /* Pointer manipulation */ | ||
457 | |||
458 | #define ACPI_CAST_PTR(t, p) ((t *) (acpi_uintptr_t) (p)) | ||
459 | #define ACPI_CAST_INDIRECT_PTR(t, p) ((t **) (acpi_uintptr_t) (p)) | ||
460 | #define ACPI_ADD_PTR(t, a, b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8, (a)) + (acpi_size)(b))) | ||
461 | #define ACPI_PTR_DIFF(a, b) (acpi_size) (ACPI_CAST_PTR (u8, (a)) - ACPI_CAST_PTR (u8, (b))) | ||
462 | |||
463 | /* Pointer/Integer type conversions */ | ||
464 | |||
465 | #define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void, (void *) NULL,(acpi_size) i) | ||
466 | #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p, (void *) NULL) | ||
467 | #define ACPI_OFFSET(d, f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f), (void *) NULL) | ||
468 | #define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) | ||
469 | #define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) | ||
470 | |||
471 | #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED | ||
472 | #define ACPI_COMPARE_NAME(a,b) (*ACPI_CAST_PTR (u32, (a)) == *ACPI_CAST_PTR (u32, (b))) | ||
473 | #else | ||
474 | #define ACPI_COMPARE_NAME(a,b) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_CAST_PTR (char, (b)), ACPI_NAME_SIZE)) | ||
475 | #endif | ||
476 | |||
477 | /******************************************************************************* | ||
478 | * | ||
479 | * Miscellaneous constants | ||
480 | * | ||
481 | ******************************************************************************/ | ||
345 | 482 | ||
346 | /* | 483 | /* |
347 | * Initialization sequence | 484 | * Initialization sequence |
@@ -414,7 +551,7 @@ typedef unsigned long long acpi_integer; | |||
414 | #define ACPI_NOTIFY_MAX 0x0B | 551 | #define ACPI_NOTIFY_MAX 0x0B |
415 | 552 | ||
416 | /* | 553 | /* |
417 | * Types associated with ACPI names and objects. The first group of | 554 | * Types associated with ACPI names and objects. The first group of |
418 | * values (up to ACPI_TYPE_EXTERNAL_MAX) correspond to the definition | 555 | * values (up to ACPI_TYPE_EXTERNAL_MAX) correspond to the definition |
419 | * of the ACPI object_type() operator (See the ACPI Spec). Therefore, | 556 | * of the ACPI object_type() operator (See the ACPI Spec). Therefore, |
420 | * only add to the first group if the spec changes. | 557 | * only add to the first group if the spec changes. |
@@ -467,7 +604,7 @@ typedef u32 acpi_object_type; | |||
467 | 604 | ||
468 | /* | 605 | /* |
469 | * These are special object types that never appear in | 606 | * These are special object types that never appear in |
470 | * a Namespace node, only in an union acpi_operand_object | 607 | * a Namespace node, only in a union acpi_operand_object |
471 | */ | 608 | */ |
472 | #define ACPI_TYPE_LOCAL_EXTRA 0x1C | 609 | #define ACPI_TYPE_LOCAL_EXTRA 0x1C |
473 | #define ACPI_TYPE_LOCAL_DATA 0x1D | 610 | #define ACPI_TYPE_LOCAL_DATA 0x1D |
@@ -732,6 +869,15 @@ struct acpi_buffer { | |||
732 | #define ACPI_NAME_TYPE_MAX 1 | 869 | #define ACPI_NAME_TYPE_MAX 1 |
733 | 870 | ||
734 | /* | 871 | /* |
872 | * Predefined Namespace items | ||
873 | */ | ||
874 | struct acpi_predefined_names { | ||
875 | char *name; | ||
876 | u8 type; | ||
877 | char *val; | ||
878 | }; | ||
879 | |||
880 | /* | ||
735 | * Structure and flags for acpi_get_system_info | 881 | * Structure and flags for acpi_get_system_info |
736 | */ | 882 | */ |
737 | #define ACPI_SYS_MODE_UNKNOWN 0x0000 | 883 | #define ACPI_SYS_MODE_UNKNOWN 0x0000 |
@@ -787,7 +933,7 @@ acpi_status(*acpi_exception_handler) (acpi_status aml_status, | |||
787 | u16 opcode, | 933 | u16 opcode, |
788 | u32 aml_offset, void *context); | 934 | u32 aml_offset, void *context); |
789 | 935 | ||
790 | /* Table Event handler (Load, load_table etc) and types */ | 936 | /* Table Event handler (Load, load_table, etc.) and types */ |
791 | 937 | ||
792 | typedef | 938 | typedef |
793 | acpi_status(*acpi_tbl_handler) (u32 event, void *table, void *context); | 939 | acpi_status(*acpi_tbl_handler) (u32 event, void *table, void *context); |
@@ -823,6 +969,12 @@ acpi_status(*acpi_walk_callback) (acpi_handle obj_handle, | |||
823 | #define ACPI_INTERRUPT_NOT_HANDLED 0x00 | 969 | #define ACPI_INTERRUPT_NOT_HANDLED 0x00 |
824 | #define ACPI_INTERRUPT_HANDLED 0x01 | 970 | #define ACPI_INTERRUPT_HANDLED 0x01 |
825 | 971 | ||
972 | /* Length of _HID, _UID, _CID, and UUID values */ | ||
973 | |||
974 | #define ACPI_DEVICE_ID_LENGTH 0x09 | ||
975 | #define ACPI_MAX_CID_LENGTH 48 | ||
976 | #define ACPI_UUID_LENGTH 16 | ||
977 | |||
826 | /* Common string version of device HIDs and UIDs */ | 978 | /* Common string version of device HIDs and UIDs */ |
827 | 979 | ||
828 | struct acpica_device_id { | 980 | struct acpica_device_id { |
@@ -900,357 +1052,28 @@ struct acpi_mem_space_context { | |||
900 | }; | 1052 | }; |
901 | 1053 | ||
902 | /* | 1054 | /* |
903 | * Definitions for Resource Attributes | 1055 | * struct acpi_memory_list is used only if the ACPICA local cache is enabled |
904 | */ | ||
905 | typedef u16 acpi_rs_length; /* Resource Length field is fixed at 16 bits */ | ||
906 | typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (Length+3) = (64_k-1)+3 */ | ||
907 | |||
908 | /* | ||
909 | * Memory Attributes | ||
910 | */ | ||
911 | #define ACPI_READ_ONLY_MEMORY (u8) 0x00 | ||
912 | #define ACPI_READ_WRITE_MEMORY (u8) 0x01 | ||
913 | |||
914 | #define ACPI_NON_CACHEABLE_MEMORY (u8) 0x00 | ||
915 | #define ACPI_CACHABLE_MEMORY (u8) 0x01 | ||
916 | #define ACPI_WRITE_COMBINING_MEMORY (u8) 0x02 | ||
917 | #define ACPI_PREFETCHABLE_MEMORY (u8) 0x03 | ||
918 | |||
919 | /* | ||
920 | * IO Attributes | ||
921 | * The ISA IO ranges are: n000-n0_fFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. | ||
922 | * The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cd0-n_fFFh. | ||
923 | */ | 1056 | */ |
924 | #define ACPI_NON_ISA_ONLY_RANGES (u8) 0x01 | 1057 | struct acpi_memory_list { |
925 | #define ACPI_ISA_ONLY_RANGES (u8) 0x02 | 1058 | char *list_name; |
926 | #define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES) | 1059 | void *list_head; |
927 | 1060 | u16 object_size; | |
928 | /* Type of translation - 1=Sparse, 0=Dense */ | 1061 | u16 max_depth; |
929 | 1062 | u16 current_depth; | |
930 | #define ACPI_SPARSE_TRANSLATION (u8) 0x01 | 1063 | u16 link_offset; |
931 | 1064 | ||
932 | /* | 1065 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS |
933 | * IO Port Descriptor Decode | 1066 | |
934 | */ | 1067 | /* Statistics for debug memory tracking only */ |
935 | #define ACPI_DECODE_10 (u8) 0x00 /* 10-bit IO address decode */ | 1068 | |
936 | #define ACPI_DECODE_16 (u8) 0x01 /* 16-bit IO address decode */ | 1069 | u32 total_allocated; |
937 | 1070 | u32 total_freed; | |
938 | /* | 1071 | u32 max_occupied; |
939 | * IRQ Attributes | 1072 | u32 total_size; |
940 | */ | 1073 | u32 current_total_size; |
941 | #define ACPI_LEVEL_SENSITIVE (u8) 0x00 | 1074 | u32 requests; |
942 | #define ACPI_EDGE_SENSITIVE (u8) 0x01 | 1075 | u32 hits; |
943 | |||
944 | #define ACPI_ACTIVE_HIGH (u8) 0x00 | ||
945 | #define ACPI_ACTIVE_LOW (u8) 0x01 | ||
946 | |||
947 | #define ACPI_EXCLUSIVE (u8) 0x00 | ||
948 | #define ACPI_SHARED (u8) 0x01 | ||
949 | |||
950 | /* | ||
951 | * DMA Attributes | ||
952 | */ | ||
953 | #define ACPI_COMPATIBILITY (u8) 0x00 | ||
954 | #define ACPI_TYPE_A (u8) 0x01 | ||
955 | #define ACPI_TYPE_B (u8) 0x02 | ||
956 | #define ACPI_TYPE_F (u8) 0x03 | ||
957 | |||
958 | #define ACPI_NOT_BUS_MASTER (u8) 0x00 | ||
959 | #define ACPI_BUS_MASTER (u8) 0x01 | ||
960 | |||
961 | #define ACPI_TRANSFER_8 (u8) 0x00 | ||
962 | #define ACPI_TRANSFER_8_16 (u8) 0x01 | ||
963 | #define ACPI_TRANSFER_16 (u8) 0x02 | ||
964 | |||
965 | /* | ||
966 | * Start Dependent Functions Priority definitions | ||
967 | */ | ||
968 | #define ACPI_GOOD_CONFIGURATION (u8) 0x00 | ||
969 | #define ACPI_ACCEPTABLE_CONFIGURATION (u8) 0x01 | ||
970 | #define ACPI_SUB_OPTIMAL_CONFIGURATION (u8) 0x02 | ||
971 | |||
972 | /* | ||
973 | * 16, 32 and 64-bit Address Descriptor resource types | ||
974 | */ | ||
975 | #define ACPI_MEMORY_RANGE (u8) 0x00 | ||
976 | #define ACPI_IO_RANGE (u8) 0x01 | ||
977 | #define ACPI_BUS_NUMBER_RANGE (u8) 0x02 | ||
978 | |||
979 | #define ACPI_ADDRESS_NOT_FIXED (u8) 0x00 | ||
980 | #define ACPI_ADDRESS_FIXED (u8) 0x01 | ||
981 | |||
982 | #define ACPI_POS_DECODE (u8) 0x00 | ||
983 | #define ACPI_SUB_DECODE (u8) 0x01 | ||
984 | |||
985 | #define ACPI_PRODUCER (u8) 0x00 | ||
986 | #define ACPI_CONSUMER (u8) 0x01 | ||
987 | |||
988 | /* | ||
989 | * If possible, pack the following structures to byte alignment | ||
990 | */ | ||
991 | #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED | ||
992 | #pragma pack(1) | ||
993 | #endif | 1076 | #endif |
994 | |||
995 | /* UUID data structures for use in vendor-defined resource descriptors */ | ||
996 | |||
997 | struct acpi_uuid { | ||
998 | u8 data[ACPI_UUID_LENGTH]; | ||
999 | }; | ||
1000 | |||
1001 | struct acpi_vendor_uuid { | ||
1002 | u8 subtype; | ||
1003 | u8 data[ACPI_UUID_LENGTH]; | ||
1004 | }; | ||
1005 | |||
1006 | /* | ||
1007 | * Structures used to describe device resources | ||
1008 | */ | ||
1009 | struct acpi_resource_irq { | ||
1010 | u8 descriptor_length; | ||
1011 | u8 triggering; | ||
1012 | u8 polarity; | ||
1013 | u8 sharable; | ||
1014 | u8 interrupt_count; | ||
1015 | u8 interrupts[1]; | ||
1016 | }; | ||
1017 | |||
1018 | struct acpi_resource_dma { | ||
1019 | u8 type; | ||
1020 | u8 bus_master; | ||
1021 | u8 transfer; | ||
1022 | u8 channel_count; | ||
1023 | u8 channels[1]; | ||
1024 | }; | ||
1025 | |||
1026 | struct acpi_resource_start_dependent { | ||
1027 | u8 descriptor_length; | ||
1028 | u8 compatibility_priority; | ||
1029 | u8 performance_robustness; | ||
1030 | }; | ||
1031 | |||
1032 | /* | ||
1033 | * END_DEPENDENT_FUNCTIONS_RESOURCE struct is not | ||
1034 | * needed because it has no fields | ||
1035 | */ | ||
1036 | |||
1037 | struct acpi_resource_io { | ||
1038 | u8 io_decode; | ||
1039 | u8 alignment; | ||
1040 | u8 address_length; | ||
1041 | u16 minimum; | ||
1042 | u16 maximum; | ||
1043 | }; | ||
1044 | |||
1045 | struct acpi_resource_fixed_io { | ||
1046 | u16 address; | ||
1047 | u8 address_length; | ||
1048 | }; | ||
1049 | |||
1050 | struct acpi_resource_vendor { | ||
1051 | u16 byte_length; | ||
1052 | u8 byte_data[1]; | ||
1053 | }; | ||
1054 | |||
1055 | /* Vendor resource with UUID info (introduced in ACPI 3.0) */ | ||
1056 | |||
1057 | struct acpi_resource_vendor_typed { | ||
1058 | u16 byte_length; | ||
1059 | u8 uuid_subtype; | ||
1060 | u8 uuid[ACPI_UUID_LENGTH]; | ||
1061 | u8 byte_data[1]; | ||
1062 | }; | ||
1063 | |||
1064 | struct acpi_resource_end_tag { | ||
1065 | u8 checksum; | ||
1066 | }; | ||
1067 | |||
1068 | struct acpi_resource_memory24 { | ||
1069 | u8 write_protect; | ||
1070 | u16 minimum; | ||
1071 | u16 maximum; | ||
1072 | u16 alignment; | ||
1073 | u16 address_length; | ||
1074 | }; | ||
1075 | |||
1076 | struct acpi_resource_memory32 { | ||
1077 | u8 write_protect; | ||
1078 | u32 minimum; | ||
1079 | u32 maximum; | ||
1080 | u32 alignment; | ||
1081 | u32 address_length; | ||
1082 | }; | ||
1083 | |||
1084 | struct acpi_resource_fixed_memory32 { | ||
1085 | u8 write_protect; | ||
1086 | u32 address; | ||
1087 | u32 address_length; | ||
1088 | }; | ||
1089 | |||
1090 | struct acpi_memory_attribute { | ||
1091 | u8 write_protect; | ||
1092 | u8 caching; | ||
1093 | u8 range_type; | ||
1094 | u8 translation; | ||
1095 | }; | ||
1096 | |||
1097 | struct acpi_io_attribute { | ||
1098 | u8 range_type; | ||
1099 | u8 translation; | ||
1100 | u8 translation_type; | ||
1101 | u8 reserved1; | ||
1102 | }; | ||
1103 | |||
1104 | union acpi_resource_attribute { | ||
1105 | struct acpi_memory_attribute mem; | ||
1106 | struct acpi_io_attribute io; | ||
1107 | |||
1108 | /* Used for the *word_space macros */ | ||
1109 | |||
1110 | u8 type_specific; | ||
1111 | }; | ||
1112 | |||
1113 | struct acpi_resource_source { | ||
1114 | u8 index; | ||
1115 | u16 string_length; | ||
1116 | char *string_ptr; | ||
1117 | }; | ||
1118 | |||
1119 | /* Fields common to all address descriptors, 16/32/64 bit */ | ||
1120 | |||
1121 | #define ACPI_RESOURCE_ADDRESS_COMMON \ | ||
1122 | u8 resource_type; \ | ||
1123 | u8 producer_consumer; \ | ||
1124 | u8 decode; \ | ||
1125 | u8 min_address_fixed; \ | ||
1126 | u8 max_address_fixed; \ | ||
1127 | union acpi_resource_attribute info; | ||
1128 | |||
1129 | struct acpi_resource_address { | ||
1130 | ACPI_RESOURCE_ADDRESS_COMMON}; | ||
1131 | |||
1132 | struct acpi_resource_address16 { | ||
1133 | ACPI_RESOURCE_ADDRESS_COMMON u16 granularity; | ||
1134 | u16 minimum; | ||
1135 | u16 maximum; | ||
1136 | u16 translation_offset; | ||
1137 | u16 address_length; | ||
1138 | struct acpi_resource_source resource_source; | ||
1139 | }; | ||
1140 | |||
1141 | struct acpi_resource_address32 { | ||
1142 | ACPI_RESOURCE_ADDRESS_COMMON u32 granularity; | ||
1143 | u32 minimum; | ||
1144 | u32 maximum; | ||
1145 | u32 translation_offset; | ||
1146 | u32 address_length; | ||
1147 | struct acpi_resource_source resource_source; | ||
1148 | }; | ||
1149 | |||
1150 | struct acpi_resource_address64 { | ||
1151 | ACPI_RESOURCE_ADDRESS_COMMON u64 granularity; | ||
1152 | u64 minimum; | ||
1153 | u64 maximum; | ||
1154 | u64 translation_offset; | ||
1155 | u64 address_length; | ||
1156 | struct acpi_resource_source resource_source; | ||
1157 | }; | ||
1158 | |||
1159 | struct acpi_resource_extended_address64 { | ||
1160 | ACPI_RESOURCE_ADDRESS_COMMON u8 revision_iD; | ||
1161 | u64 granularity; | ||
1162 | u64 minimum; | ||
1163 | u64 maximum; | ||
1164 | u64 translation_offset; | ||
1165 | u64 address_length; | ||
1166 | u64 type_specific; | ||
1167 | }; | ||
1168 | |||
1169 | struct acpi_resource_extended_irq { | ||
1170 | u8 producer_consumer; | ||
1171 | u8 triggering; | ||
1172 | u8 polarity; | ||
1173 | u8 sharable; | ||
1174 | u8 interrupt_count; | ||
1175 | struct acpi_resource_source resource_source; | ||
1176 | u32 interrupts[1]; | ||
1177 | }; | ||
1178 | |||
1179 | struct acpi_resource_generic_register { | ||
1180 | u8 space_id; | ||
1181 | u8 bit_width; | ||
1182 | u8 bit_offset; | ||
1183 | u8 access_size; | ||
1184 | u64 address; | ||
1185 | }; | ||
1186 | |||
1187 | /* ACPI_RESOURCE_TYPEs */ | ||
1188 | |||
1189 | #define ACPI_RESOURCE_TYPE_IRQ 0 | ||
1190 | #define ACPI_RESOURCE_TYPE_DMA 1 | ||
1191 | #define ACPI_RESOURCE_TYPE_START_DEPENDENT 2 | ||
1192 | #define ACPI_RESOURCE_TYPE_END_DEPENDENT 3 | ||
1193 | #define ACPI_RESOURCE_TYPE_IO 4 | ||
1194 | #define ACPI_RESOURCE_TYPE_FIXED_IO 5 | ||
1195 | #define ACPI_RESOURCE_TYPE_VENDOR 6 | ||
1196 | #define ACPI_RESOURCE_TYPE_END_TAG 7 | ||
1197 | #define ACPI_RESOURCE_TYPE_MEMORY24 8 | ||
1198 | #define ACPI_RESOURCE_TYPE_MEMORY32 9 | ||
1199 | #define ACPI_RESOURCE_TYPE_FIXED_MEMORY32 10 | ||
1200 | #define ACPI_RESOURCE_TYPE_ADDRESS16 11 | ||
1201 | #define ACPI_RESOURCE_TYPE_ADDRESS32 12 | ||
1202 | #define ACPI_RESOURCE_TYPE_ADDRESS64 13 | ||
1203 | #define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 14 /* ACPI 3.0 */ | ||
1204 | #define ACPI_RESOURCE_TYPE_EXTENDED_IRQ 15 | ||
1205 | #define ACPI_RESOURCE_TYPE_GENERIC_REGISTER 16 | ||
1206 | #define ACPI_RESOURCE_TYPE_MAX 16 | ||
1207 | |||
1208 | union acpi_resource_data { | ||
1209 | struct acpi_resource_irq irq; | ||
1210 | struct acpi_resource_dma dma; | ||
1211 | struct acpi_resource_start_dependent start_dpf; | ||
1212 | struct acpi_resource_io io; | ||
1213 | struct acpi_resource_fixed_io fixed_io; | ||
1214 | struct acpi_resource_vendor vendor; | ||
1215 | struct acpi_resource_vendor_typed vendor_typed; | ||
1216 | struct acpi_resource_end_tag end_tag; | ||
1217 | struct acpi_resource_memory24 memory24; | ||
1218 | struct acpi_resource_memory32 memory32; | ||
1219 | struct acpi_resource_fixed_memory32 fixed_memory32; | ||
1220 | struct acpi_resource_address16 address16; | ||
1221 | struct acpi_resource_address32 address32; | ||
1222 | struct acpi_resource_address64 address64; | ||
1223 | struct acpi_resource_extended_address64 ext_address64; | ||
1224 | struct acpi_resource_extended_irq extended_irq; | ||
1225 | struct acpi_resource_generic_register generic_reg; | ||
1226 | |||
1227 | /* Common fields */ | ||
1228 | |||
1229 | struct acpi_resource_address address; /* Common 16/32/64 address fields */ | ||
1230 | }; | ||
1231 | |||
1232 | struct acpi_resource { | ||
1233 | u32 type; | ||
1234 | u32 length; | ||
1235 | union acpi_resource_data data; | ||
1236 | }; | ||
1237 | |||
1238 | /* restore default alignment */ | ||
1239 | |||
1240 | #pragma pack() | ||
1241 | |||
1242 | #define ACPI_RS_SIZE_NO_DATA 8 /* Id + Length fields */ | ||
1243 | #define ACPI_RS_SIZE_MIN (u32) ACPI_ROUND_UP_TO_NATIVE_WORD (12) | ||
1244 | #define ACPI_RS_SIZE(type) (u32) (ACPI_RS_SIZE_NO_DATA + sizeof (type)) | ||
1245 | |||
1246 | #define ACPI_NEXT_RESOURCE(res) (struct acpi_resource *)((u8 *) res + res->length) | ||
1247 | |||
1248 | struct acpi_pci_routing_table { | ||
1249 | u32 length; | ||
1250 | u32 pin; | ||
1251 | acpi_integer address; /* here for 64-bit alignment */ | ||
1252 | u32 source_index; | ||
1253 | char source[4]; /* pad to 64 bits so sizeof() works in all cases */ | ||
1254 | }; | 1077 | }; |
1255 | 1078 | ||
1256 | #endif /* __ACTYPES_H__ */ | 1079 | #endif /* __ACTYPES_H__ */ |
diff --git a/include/acpi/acutils.h b/include/acpi/acutils.h deleted file mode 100644 index d8307b2987e3..000000000000 --- a/include/acpi/acutils.h +++ /dev/null | |||
@@ -1,585 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #ifndef _ACUTILS_H | ||
45 | #define _ACUTILS_H | ||
46 | |||
47 | extern const u8 acpi_gbl_resource_aml_sizes[]; | ||
48 | |||
49 | /* Strings used by the disassembler and debugger resource dump routines */ | ||
50 | |||
51 | #if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER) | ||
52 | |||
53 | extern const char *acpi_gbl_bm_decode[]; | ||
54 | extern const char *acpi_gbl_config_decode[]; | ||
55 | extern const char *acpi_gbl_consume_decode[]; | ||
56 | extern const char *acpi_gbl_dec_decode[]; | ||
57 | extern const char *acpi_gbl_he_decode[]; | ||
58 | extern const char *acpi_gbl_io_decode[]; | ||
59 | extern const char *acpi_gbl_ll_decode[]; | ||
60 | extern const char *acpi_gbl_max_decode[]; | ||
61 | extern const char *acpi_gbl_mem_decode[]; | ||
62 | extern const char *acpi_gbl_min_decode[]; | ||
63 | extern const char *acpi_gbl_mtp_decode[]; | ||
64 | extern const char *acpi_gbl_rng_decode[]; | ||
65 | extern const char *acpi_gbl_rw_decode[]; | ||
66 | extern const char *acpi_gbl_shr_decode[]; | ||
67 | extern const char *acpi_gbl_siz_decode[]; | ||
68 | extern const char *acpi_gbl_trs_decode[]; | ||
69 | extern const char *acpi_gbl_ttp_decode[]; | ||
70 | extern const char *acpi_gbl_typ_decode[]; | ||
71 | #endif | ||
72 | |||
73 | /* Types for Resource descriptor entries */ | ||
74 | |||
75 | #define ACPI_INVALID_RESOURCE 0 | ||
76 | #define ACPI_FIXED_LENGTH 1 | ||
77 | #define ACPI_VARIABLE_LENGTH 2 | ||
78 | #define ACPI_SMALL_VARIABLE_LENGTH 3 | ||
79 | |||
80 | typedef | ||
81 | acpi_status(*acpi_walk_aml_callback) (u8 * aml, | ||
82 | u32 length, | ||
83 | u32 offset, | ||
84 | u8 resource_index, void **context); | ||
85 | |||
86 | typedef | ||
87 | acpi_status(*acpi_pkg_callback) (u8 object_type, | ||
88 | union acpi_operand_object * source_object, | ||
89 | union acpi_generic_state * state, | ||
90 | void *context); | ||
91 | |||
92 | struct acpi_pkg_info { | ||
93 | u8 *free_space; | ||
94 | acpi_size length; | ||
95 | u32 object_space; | ||
96 | u32 num_packages; | ||
97 | }; | ||
98 | |||
99 | #define REF_INCREMENT (u16) 0 | ||
100 | #define REF_DECREMENT (u16) 1 | ||
101 | #define REF_FORCE_DELETE (u16) 2 | ||
102 | |||
103 | /* acpi_ut_dump_buffer */ | ||
104 | |||
105 | #define DB_BYTE_DISPLAY 1 | ||
106 | #define DB_WORD_DISPLAY 2 | ||
107 | #define DB_DWORD_DISPLAY 4 | ||
108 | #define DB_QWORD_DISPLAY 8 | ||
109 | |||
110 | /* | ||
111 | * utglobal - Global data structures and procedures | ||
112 | */ | ||
113 | acpi_status acpi_ut_init_globals(void); | ||
114 | |||
115 | #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) | ||
116 | |||
117 | char *acpi_ut_get_mutex_name(u32 mutex_id); | ||
118 | |||
119 | const char *acpi_ut_get_notify_name(u32 notify_value); | ||
120 | |||
121 | #endif | ||
122 | |||
123 | char *acpi_ut_get_type_name(acpi_object_type type); | ||
124 | |||
125 | char *acpi_ut_get_node_name(void *object); | ||
126 | |||
127 | char *acpi_ut_get_descriptor_name(void *object); | ||
128 | |||
129 | const char *acpi_ut_get_reference_name(union acpi_operand_object *object); | ||
130 | |||
131 | char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc); | ||
132 | |||
133 | char *acpi_ut_get_region_name(u8 space_id); | ||
134 | |||
135 | char *acpi_ut_get_event_name(u32 event_id); | ||
136 | |||
137 | char acpi_ut_hex_to_ascii_char(acpi_integer integer, u32 position); | ||
138 | |||
139 | u8 acpi_ut_valid_object_type(acpi_object_type type); | ||
140 | |||
141 | /* | ||
142 | * utinit - miscellaneous initialization and shutdown | ||
143 | */ | ||
144 | acpi_status acpi_ut_hardware_initialize(void); | ||
145 | |||
146 | void acpi_ut_subsystem_shutdown(void); | ||
147 | |||
148 | /* | ||
149 | * utclib - Local implementations of C library functions | ||
150 | */ | ||
151 | #ifndef ACPI_USE_SYSTEM_CLIBRARY | ||
152 | |||
153 | acpi_size acpi_ut_strlen(const char *string); | ||
154 | |||
155 | char *acpi_ut_strcpy(char *dst_string, const char *src_string); | ||
156 | |||
157 | char *acpi_ut_strncpy(char *dst_string, | ||
158 | const char *src_string, acpi_size count); | ||
159 | |||
160 | int acpi_ut_memcmp(const char *buffer1, const char *buffer2, acpi_size count); | ||
161 | |||
162 | int acpi_ut_strncmp(const char *string1, const char *string2, acpi_size count); | ||
163 | |||
164 | int acpi_ut_strcmp(const char *string1, const char *string2); | ||
165 | |||
166 | char *acpi_ut_strcat(char *dst_string, const char *src_string); | ||
167 | |||
168 | char *acpi_ut_strncat(char *dst_string, | ||
169 | const char *src_string, acpi_size count); | ||
170 | |||
171 | u32 acpi_ut_strtoul(const char *string, char **terminator, u32 base); | ||
172 | |||
173 | char *acpi_ut_strstr(char *string1, char *string2); | ||
174 | |||
175 | void *acpi_ut_memcpy(void *dest, const void *src, acpi_size count); | ||
176 | |||
177 | void *acpi_ut_memset(void *dest, u8 value, acpi_size count); | ||
178 | |||
179 | int acpi_ut_to_upper(int c); | ||
180 | |||
181 | int acpi_ut_to_lower(int c); | ||
182 | |||
183 | extern const u8 _acpi_ctype[]; | ||
184 | |||
185 | #define _ACPI_XA 0x00 /* extra alphabetic - not supported */ | ||
186 | #define _ACPI_XS 0x40 /* extra space */ | ||
187 | #define _ACPI_BB 0x00 /* BEL, BS, etc. - not supported */ | ||
188 | #define _ACPI_CN 0x20 /* CR, FF, HT, NL, VT */ | ||
189 | #define _ACPI_DI 0x04 /* '0'-'9' */ | ||
190 | #define _ACPI_LO 0x02 /* 'a'-'z' */ | ||
191 | #define _ACPI_PU 0x10 /* punctuation */ | ||
192 | #define _ACPI_SP 0x08 /* space */ | ||
193 | #define _ACPI_UP 0x01 /* 'A'-'Z' */ | ||
194 | #define _ACPI_XD 0x80 /* '0'-'9', 'A'-'F', 'a'-'f' */ | ||
195 | |||
196 | #define ACPI_IS_DIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI)) | ||
197 | #define ACPI_IS_SPACE(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP)) | ||
198 | #define ACPI_IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD)) | ||
199 | #define ACPI_IS_UPPER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP)) | ||
200 | #define ACPI_IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO)) | ||
201 | #define ACPI_IS_PRINT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU)) | ||
202 | #define ACPI_IS_ALPHA(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP)) | ||
203 | |||
204 | #endif /* ACPI_USE_SYSTEM_CLIBRARY */ | ||
205 | |||
206 | /* | ||
207 | * utcopy - Object construction and conversion interfaces | ||
208 | */ | ||
209 | acpi_status | ||
210 | acpi_ut_build_simple_object(union acpi_operand_object *obj, | ||
211 | union acpi_object *user_obj, | ||
212 | u8 * data_space, u32 * buffer_space_used); | ||
213 | |||
214 | acpi_status | ||
215 | acpi_ut_build_package_object(union acpi_operand_object *obj, | ||
216 | u8 * buffer, u32 * space_used); | ||
217 | |||
218 | acpi_status | ||
219 | acpi_ut_copy_iobject_to_eobject(union acpi_operand_object *obj, | ||
220 | struct acpi_buffer *ret_buffer); | ||
221 | |||
222 | acpi_status | ||
223 | acpi_ut_copy_eobject_to_iobject(union acpi_object *obj, | ||
224 | union acpi_operand_object **internal_obj); | ||
225 | |||
226 | acpi_status | ||
227 | acpi_ut_copy_isimple_to_isimple(union acpi_operand_object *source_obj, | ||
228 | union acpi_operand_object *dest_obj); | ||
229 | |||
230 | acpi_status | ||
231 | acpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc, | ||
232 | union acpi_operand_object **dest_desc, | ||
233 | struct acpi_walk_state *walk_state); | ||
234 | |||
235 | /* | ||
236 | * utcreate - Object creation | ||
237 | */ | ||
238 | acpi_status | ||
239 | acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action); | ||
240 | |||
241 | /* | ||
242 | * utdebug - Debug interfaces | ||
243 | */ | ||
244 | void acpi_ut_init_stack_ptr_trace(void); | ||
245 | |||
246 | void acpi_ut_track_stack_ptr(void); | ||
247 | |||
248 | void | ||
249 | acpi_ut_trace(u32 line_number, | ||
250 | const char *function_name, | ||
251 | const char *module_name, u32 component_id); | ||
252 | |||
253 | void | ||
254 | acpi_ut_trace_ptr(u32 line_number, | ||
255 | const char *function_name, | ||
256 | const char *module_name, u32 component_id, void *pointer); | ||
257 | |||
258 | void | ||
259 | acpi_ut_trace_u32(u32 line_number, | ||
260 | const char *function_name, | ||
261 | const char *module_name, u32 component_id, u32 integer); | ||
262 | |||
263 | void | ||
264 | acpi_ut_trace_str(u32 line_number, | ||
265 | const char *function_name, | ||
266 | const char *module_name, u32 component_id, char *string); | ||
267 | |||
268 | void | ||
269 | acpi_ut_exit(u32 line_number, | ||
270 | const char *function_name, | ||
271 | const char *module_name, u32 component_id); | ||
272 | |||
273 | void | ||
274 | acpi_ut_status_exit(u32 line_number, | ||
275 | const char *function_name, | ||
276 | const char *module_name, | ||
277 | u32 component_id, acpi_status status); | ||
278 | |||
279 | void | ||
280 | acpi_ut_value_exit(u32 line_number, | ||
281 | const char *function_name, | ||
282 | const char *module_name, | ||
283 | u32 component_id, acpi_integer value); | ||
284 | |||
285 | void | ||
286 | acpi_ut_ptr_exit(u32 line_number, | ||
287 | const char *function_name, | ||
288 | const char *module_name, u32 component_id, u8 *ptr); | ||
289 | |||
290 | void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id); | ||
291 | |||
292 | void acpi_ut_dump_buffer2(u8 * buffer, u32 count, u32 display); | ||
293 | |||
294 | void acpi_ut_report_error(char *module_name, u32 line_number); | ||
295 | |||
296 | void acpi_ut_report_info(char *module_name, u32 line_number); | ||
297 | |||
298 | void acpi_ut_report_warning(char *module_name, u32 line_number); | ||
299 | |||
300 | /* Error and message reporting interfaces */ | ||
301 | |||
302 | void ACPI_INTERNAL_VAR_XFACE | ||
303 | acpi_ut_debug_print(u32 requested_debug_level, | ||
304 | u32 line_number, | ||
305 | const char *function_name, | ||
306 | const char *module_name, | ||
307 | u32 component_id, | ||
308 | const char *format, ...) ACPI_PRINTF_LIKE(6); | ||
309 | |||
310 | void ACPI_INTERNAL_VAR_XFACE | ||
311 | acpi_ut_debug_print_raw(u32 requested_debug_level, | ||
312 | u32 line_number, | ||
313 | const char *function_name, | ||
314 | const char *module_name, | ||
315 | u32 component_id, | ||
316 | const char *format, ...) ACPI_PRINTF_LIKE(6); | ||
317 | |||
318 | void ACPI_INTERNAL_VAR_XFACE | ||
319 | acpi_ut_error(const char *module_name, | ||
320 | u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3); | ||
321 | |||
322 | void ACPI_INTERNAL_VAR_XFACE | ||
323 | acpi_ut_exception(const char *module_name, | ||
324 | u32 line_number, | ||
325 | acpi_status status, | ||
326 | const char *format, ...) ACPI_PRINTF_LIKE(4); | ||
327 | |||
328 | void ACPI_INTERNAL_VAR_XFACE | ||
329 | acpi_ut_warning(const char *module_name, | ||
330 | u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3); | ||
331 | |||
332 | void ACPI_INTERNAL_VAR_XFACE | ||
333 | acpi_ut_info(const char *module_name, | ||
334 | u32 line_number, const char *format, ...) ACPI_PRINTF_LIKE(3); | ||
335 | |||
336 | /* | ||
337 | * utdelete - Object deletion and reference counts | ||
338 | */ | ||
339 | void acpi_ut_add_reference(union acpi_operand_object *object); | ||
340 | |||
341 | void acpi_ut_remove_reference(union acpi_operand_object *object); | ||
342 | |||
343 | void acpi_ut_delete_internal_package_object(union acpi_operand_object *object); | ||
344 | |||
345 | void acpi_ut_delete_internal_simple_object(union acpi_operand_object *object); | ||
346 | |||
347 | void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list); | ||
348 | |||
349 | /* | ||
350 | * uteval - object evaluation | ||
351 | */ | ||
352 | acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state); | ||
353 | |||
354 | acpi_status | ||
355 | acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, | ||
356 | char *path, | ||
357 | u32 expected_return_btypes, | ||
358 | union acpi_operand_object **return_desc); | ||
359 | |||
360 | acpi_status | ||
361 | acpi_ut_evaluate_numeric_object(char *object_name, | ||
362 | struct acpi_namespace_node *device_node, | ||
363 | acpi_integer * address); | ||
364 | |||
365 | acpi_status | ||
366 | acpi_ut_execute_HID(struct acpi_namespace_node *device_node, | ||
367 | struct acpica_device_id *hid); | ||
368 | |||
369 | acpi_status | ||
370 | acpi_ut_execute_CID(struct acpi_namespace_node *device_node, | ||
371 | struct acpi_compatible_id_list **return_cid_list); | ||
372 | |||
373 | acpi_status | ||
374 | acpi_ut_execute_STA(struct acpi_namespace_node *device_node, | ||
375 | u32 * status_flags); | ||
376 | |||
377 | acpi_status | ||
378 | acpi_ut_execute_UID(struct acpi_namespace_node *device_node, | ||
379 | struct acpica_device_id *uid); | ||
380 | |||
381 | acpi_status | ||
382 | acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest); | ||
383 | |||
384 | /* | ||
385 | * utobject - internal object create/delete/cache routines | ||
386 | */ | ||
387 | union acpi_operand_object *acpi_ut_create_internal_object_dbg(const char | ||
388 | *module_name, | ||
389 | u32 line_number, | ||
390 | u32 component_id, | ||
391 | acpi_object_type | ||
392 | type); | ||
393 | |||
394 | void *acpi_ut_allocate_object_desc_dbg(const char *module_name, | ||
395 | u32 line_number, u32 component_id); | ||
396 | |||
397 | #define acpi_ut_create_internal_object(t) acpi_ut_create_internal_object_dbg (_acpi_module_name,__LINE__,_COMPONENT,t) | ||
398 | #define acpi_ut_allocate_object_desc() acpi_ut_allocate_object_desc_dbg (_acpi_module_name,__LINE__,_COMPONENT) | ||
399 | |||
400 | void acpi_ut_delete_object_desc(union acpi_operand_object *object); | ||
401 | |||
402 | u8 acpi_ut_valid_internal_object(void *object); | ||
403 | |||
404 | union acpi_operand_object *acpi_ut_create_package_object(u32 count); | ||
405 | |||
406 | union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size); | ||
407 | |||
408 | union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size); | ||
409 | |||
410 | acpi_status | ||
411 | acpi_ut_get_object_size(union acpi_operand_object *obj, acpi_size * obj_length); | ||
412 | |||
413 | /* | ||
414 | * utstate - Generic state creation/cache routines | ||
415 | */ | ||
416 | void | ||
417 | acpi_ut_push_generic_state(union acpi_generic_state **list_head, | ||
418 | union acpi_generic_state *state); | ||
419 | |||
420 | union acpi_generic_state *acpi_ut_pop_generic_state(union acpi_generic_state | ||
421 | **list_head); | ||
422 | |||
423 | union acpi_generic_state *acpi_ut_create_generic_state(void); | ||
424 | |||
425 | struct acpi_thread_state *acpi_ut_create_thread_state(void); | ||
426 | |||
427 | union acpi_generic_state *acpi_ut_create_update_state(union acpi_operand_object | ||
428 | *object, u16 action); | ||
429 | |||
430 | union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object, | ||
431 | void *external_object, | ||
432 | u16 index); | ||
433 | |||
434 | acpi_status | ||
435 | acpi_ut_create_update_state_and_push(union acpi_operand_object *object, | ||
436 | u16 action, | ||
437 | union acpi_generic_state **state_list); | ||
438 | |||
439 | #ifdef ACPI_FUTURE_USAGE | ||
440 | acpi_status | ||
441 | acpi_ut_create_pkg_state_and_push(void *internal_object, | ||
442 | void *external_object, | ||
443 | u16 index, | ||
444 | union acpi_generic_state **state_list); | ||
445 | #endif /* ACPI_FUTURE_USAGE */ | ||
446 | |||
447 | union acpi_generic_state *acpi_ut_create_control_state(void); | ||
448 | |||
449 | void acpi_ut_delete_generic_state(union acpi_generic_state *state); | ||
450 | |||
451 | /* | ||
452 | * utmath | ||
453 | */ | ||
454 | acpi_status | ||
455 | acpi_ut_divide(acpi_integer in_dividend, | ||
456 | acpi_integer in_divisor, | ||
457 | acpi_integer * out_quotient, acpi_integer * out_remainder); | ||
458 | |||
459 | acpi_status | ||
460 | acpi_ut_short_divide(acpi_integer in_dividend, | ||
461 | u32 divisor, | ||
462 | acpi_integer * out_quotient, u32 * out_remainder); | ||
463 | |||
464 | /* | ||
465 | * utmisc | ||
466 | */ | ||
467 | const char *acpi_ut_validate_exception(acpi_status status); | ||
468 | |||
469 | u8 acpi_ut_is_aml_table(struct acpi_table_header *table); | ||
470 | |||
471 | acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id); | ||
472 | |||
473 | void acpi_ut_release_owner_id(acpi_owner_id * owner_id); | ||
474 | |||
475 | acpi_status | ||
476 | acpi_ut_walk_package_tree(union acpi_operand_object *source_object, | ||
477 | void *target_object, | ||
478 | acpi_pkg_callback walk_callback, void *context); | ||
479 | |||
480 | void acpi_ut_strupr(char *src_string); | ||
481 | |||
482 | void acpi_ut_print_string(char *string, u8 max_length); | ||
483 | |||
484 | u8 acpi_ut_valid_acpi_name(u32 name); | ||
485 | |||
486 | acpi_name acpi_ut_repair_name(char *name); | ||
487 | |||
488 | u8 acpi_ut_valid_acpi_char(char character, u32 position); | ||
489 | |||
490 | acpi_status | ||
491 | acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer); | ||
492 | |||
493 | /* Values for Base above (16=Hex, 10=Decimal) */ | ||
494 | |||
495 | #define ACPI_ANY_BASE 0 | ||
496 | |||
497 | u32 acpi_ut_dword_byte_swap(u32 value); | ||
498 | |||
499 | void acpi_ut_set_integer_width(u8 revision); | ||
500 | |||
501 | #ifdef ACPI_DEBUG_OUTPUT | ||
502 | void | ||
503 | acpi_ut_display_init_pathname(u8 type, | ||
504 | struct acpi_namespace_node *obj_handle, | ||
505 | char *path); | ||
506 | #endif | ||
507 | |||
508 | /* | ||
509 | * utresrc | ||
510 | */ | ||
511 | acpi_status | ||
512 | acpi_ut_walk_aml_resources(u8 * aml, | ||
513 | acpi_size aml_length, | ||
514 | acpi_walk_aml_callback user_function, | ||
515 | void **context); | ||
516 | |||
517 | acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index); | ||
518 | |||
519 | u32 acpi_ut_get_descriptor_length(void *aml); | ||
520 | |||
521 | u16 acpi_ut_get_resource_length(void *aml); | ||
522 | |||
523 | u8 acpi_ut_get_resource_header_length(void *aml); | ||
524 | |||
525 | u8 acpi_ut_get_resource_type(void *aml); | ||
526 | |||
527 | acpi_status | ||
528 | acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, | ||
529 | u8 ** end_tag); | ||
530 | |||
531 | /* | ||
532 | * utmutex - mutex support | ||
533 | */ | ||
534 | acpi_status acpi_ut_mutex_initialize(void); | ||
535 | |||
536 | void acpi_ut_mutex_terminate(void); | ||
537 | |||
538 | acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id); | ||
539 | |||
540 | acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id); | ||
541 | |||
542 | /* | ||
543 | * utalloc - memory allocation and object caching | ||
544 | */ | ||
545 | acpi_status acpi_ut_create_caches(void); | ||
546 | |||
547 | acpi_status acpi_ut_delete_caches(void); | ||
548 | |||
549 | acpi_status acpi_ut_validate_buffer(struct acpi_buffer *buffer); | ||
550 | |||
551 | acpi_status | ||
552 | acpi_ut_initialize_buffer(struct acpi_buffer *buffer, | ||
553 | acpi_size required_length); | ||
554 | |||
555 | void *acpi_ut_allocate(acpi_size size, | ||
556 | u32 component, const char *module, u32 line); | ||
557 | |||
558 | void *acpi_ut_allocate_zeroed(acpi_size size, | ||
559 | u32 component, const char *module, u32 line); | ||
560 | |||
561 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | ||
562 | void *acpi_ut_allocate_and_track(acpi_size size, | ||
563 | u32 component, const char *module, u32 line); | ||
564 | |||
565 | void *acpi_ut_allocate_zeroed_and_track(acpi_size size, | ||
566 | u32 component, | ||
567 | const char *module, u32 line); | ||
568 | |||
569 | void | ||
570 | acpi_ut_free_and_track(void *address, | ||
571 | u32 component, const char *module, u32 line); | ||
572 | |||
573 | #ifdef ACPI_FUTURE_USAGE | ||
574 | void acpi_ut_dump_allocation_info(void); | ||
575 | #endif /* ACPI_FUTURE_USAGE */ | ||
576 | |||
577 | void acpi_ut_dump_allocations(u32 component, const char *module); | ||
578 | |||
579 | acpi_status | ||
580 | acpi_ut_create_list(char *list_name, | ||
581 | u16 object_size, struct acpi_memory_list **return_cache); | ||
582 | |||
583 | #endif | ||
584 | |||
585 | #endif /* _ACUTILS_H */ | ||
diff --git a/include/acpi/amlcode.h b/include/acpi/amlcode.h deleted file mode 100644 index ff851c5df698..000000000000 --- a/include/acpi/amlcode.h +++ /dev/null | |||
@@ -1,494 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Name: amlcode.h - Definitions for AML, as included in "definition blocks" | ||
4 | * Declarations and definitions contained herein are derived | ||
5 | * directly from the ACPI specification. | ||
6 | * | ||
7 | *****************************************************************************/ | ||
8 | |||
9 | /* | ||
10 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
11 | * All rights reserved. | ||
12 | * | ||
13 | * Redistribution and use in source and binary forms, with or without | ||
14 | * modification, are permitted provided that the following conditions | ||
15 | * are met: | ||
16 | * 1. Redistributions of source code must retain the above copyright | ||
17 | * notice, this list of conditions, and the following disclaimer, | ||
18 | * without modification. | ||
19 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
20 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
21 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
22 | * including a substantially similar Disclaimer requirement for further | ||
23 | * binary redistribution. | ||
24 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
25 | * of any contributors may be used to endorse or promote products derived | ||
26 | * from this software without specific prior written permission. | ||
27 | * | ||
28 | * Alternatively, this software may be distributed under the terms of the | ||
29 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
30 | * Software Foundation. | ||
31 | * | ||
32 | * NO WARRANTY | ||
33 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
34 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
35 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
36 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
37 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
38 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
39 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
40 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
41 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
42 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
43 | * POSSIBILITY OF SUCH DAMAGES. | ||
44 | */ | ||
45 | |||
46 | #ifndef __AMLCODE_H__ | ||
47 | #define __AMLCODE_H__ | ||
48 | |||
49 | /* primary opcodes */ | ||
50 | |||
51 | #define AML_NULL_CHAR (u16) 0x00 | ||
52 | |||
53 | #define AML_ZERO_OP (u16) 0x00 | ||
54 | #define AML_ONE_OP (u16) 0x01 | ||
55 | #define AML_UNASSIGNED (u16) 0x02 | ||
56 | #define AML_ALIAS_OP (u16) 0x06 | ||
57 | #define AML_NAME_OP (u16) 0x08 | ||
58 | #define AML_BYTE_OP (u16) 0x0a | ||
59 | #define AML_WORD_OP (u16) 0x0b | ||
60 | #define AML_DWORD_OP (u16) 0x0c | ||
61 | #define AML_STRING_OP (u16) 0x0d | ||
62 | #define AML_QWORD_OP (u16) 0x0e /* ACPI 2.0 */ | ||
63 | #define AML_SCOPE_OP (u16) 0x10 | ||
64 | #define AML_BUFFER_OP (u16) 0x11 | ||
65 | #define AML_PACKAGE_OP (u16) 0x12 | ||
66 | #define AML_VAR_PACKAGE_OP (u16) 0x13 /* ACPI 2.0 */ | ||
67 | #define AML_METHOD_OP (u16) 0x14 | ||
68 | #define AML_DUAL_NAME_PREFIX (u16) 0x2e | ||
69 | #define AML_MULTI_NAME_PREFIX_OP (u16) 0x2f | ||
70 | #define AML_NAME_CHAR_SUBSEQ (u16) 0x30 | ||
71 | #define AML_NAME_CHAR_FIRST (u16) 0x41 | ||
72 | #define AML_EXTENDED_OP_PREFIX (u16) 0x5b | ||
73 | #define AML_ROOT_PREFIX (u16) 0x5c | ||
74 | #define AML_PARENT_PREFIX (u16) 0x5e | ||
75 | #define AML_LOCAL_OP (u16) 0x60 | ||
76 | #define AML_LOCAL0 (u16) 0x60 | ||
77 | #define AML_LOCAL1 (u16) 0x61 | ||
78 | #define AML_LOCAL2 (u16) 0x62 | ||
79 | #define AML_LOCAL3 (u16) 0x63 | ||
80 | #define AML_LOCAL4 (u16) 0x64 | ||
81 | #define AML_LOCAL5 (u16) 0x65 | ||
82 | #define AML_LOCAL6 (u16) 0x66 | ||
83 | #define AML_LOCAL7 (u16) 0x67 | ||
84 | #define AML_ARG_OP (u16) 0x68 | ||
85 | #define AML_ARG0 (u16) 0x68 | ||
86 | #define AML_ARG1 (u16) 0x69 | ||
87 | #define AML_ARG2 (u16) 0x6a | ||
88 | #define AML_ARG3 (u16) 0x6b | ||
89 | #define AML_ARG4 (u16) 0x6c | ||
90 | #define AML_ARG5 (u16) 0x6d | ||
91 | #define AML_ARG6 (u16) 0x6e | ||
92 | #define AML_STORE_OP (u16) 0x70 | ||
93 | #define AML_REF_OF_OP (u16) 0x71 | ||
94 | #define AML_ADD_OP (u16) 0x72 | ||
95 | #define AML_CONCAT_OP (u16) 0x73 | ||
96 | #define AML_SUBTRACT_OP (u16) 0x74 | ||
97 | #define AML_INCREMENT_OP (u16) 0x75 | ||
98 | #define AML_DECREMENT_OP (u16) 0x76 | ||
99 | #define AML_MULTIPLY_OP (u16) 0x77 | ||
100 | #define AML_DIVIDE_OP (u16) 0x78 | ||
101 | #define AML_SHIFT_LEFT_OP (u16) 0x79 | ||
102 | #define AML_SHIFT_RIGHT_OP (u16) 0x7a | ||
103 | #define AML_BIT_AND_OP (u16) 0x7b | ||
104 | #define AML_BIT_NAND_OP (u16) 0x7c | ||
105 | #define AML_BIT_OR_OP (u16) 0x7d | ||
106 | #define AML_BIT_NOR_OP (u16) 0x7e | ||
107 | #define AML_BIT_XOR_OP (u16) 0x7f | ||
108 | #define AML_BIT_NOT_OP (u16) 0x80 | ||
109 | #define AML_FIND_SET_LEFT_BIT_OP (u16) 0x81 | ||
110 | #define AML_FIND_SET_RIGHT_BIT_OP (u16) 0x82 | ||
111 | #define AML_DEREF_OF_OP (u16) 0x83 | ||
112 | #define AML_CONCAT_RES_OP (u16) 0x84 /* ACPI 2.0 */ | ||
113 | #define AML_MOD_OP (u16) 0x85 /* ACPI 2.0 */ | ||
114 | #define AML_NOTIFY_OP (u16) 0x86 | ||
115 | #define AML_SIZE_OF_OP (u16) 0x87 | ||
116 | #define AML_INDEX_OP (u16) 0x88 | ||
117 | #define AML_MATCH_OP (u16) 0x89 | ||
118 | #define AML_CREATE_DWORD_FIELD_OP (u16) 0x8a | ||
119 | #define AML_CREATE_WORD_FIELD_OP (u16) 0x8b | ||
120 | #define AML_CREATE_BYTE_FIELD_OP (u16) 0x8c | ||
121 | #define AML_CREATE_BIT_FIELD_OP (u16) 0x8d | ||
122 | #define AML_TYPE_OP (u16) 0x8e | ||
123 | #define AML_CREATE_QWORD_FIELD_OP (u16) 0x8f /* ACPI 2.0 */ | ||
124 | #define AML_LAND_OP (u16) 0x90 | ||
125 | #define AML_LOR_OP (u16) 0x91 | ||
126 | #define AML_LNOT_OP (u16) 0x92 | ||
127 | #define AML_LEQUAL_OP (u16) 0x93 | ||
128 | #define AML_LGREATER_OP (u16) 0x94 | ||
129 | #define AML_LLESS_OP (u16) 0x95 | ||
130 | #define AML_TO_BUFFER_OP (u16) 0x96 /* ACPI 2.0 */ | ||
131 | #define AML_TO_DECSTRING_OP (u16) 0x97 /* ACPI 2.0 */ | ||
132 | #define AML_TO_HEXSTRING_OP (u16) 0x98 /* ACPI 2.0 */ | ||
133 | #define AML_TO_INTEGER_OP (u16) 0x99 /* ACPI 2.0 */ | ||
134 | #define AML_TO_STRING_OP (u16) 0x9c /* ACPI 2.0 */ | ||
135 | #define AML_COPY_OP (u16) 0x9d /* ACPI 2.0 */ | ||
136 | #define AML_MID_OP (u16) 0x9e /* ACPI 2.0 */ | ||
137 | #define AML_CONTINUE_OP (u16) 0x9f /* ACPI 2.0 */ | ||
138 | #define AML_IF_OP (u16) 0xa0 | ||
139 | #define AML_ELSE_OP (u16) 0xa1 | ||
140 | #define AML_WHILE_OP (u16) 0xa2 | ||
141 | #define AML_NOOP_OP (u16) 0xa3 | ||
142 | #define AML_RETURN_OP (u16) 0xa4 | ||
143 | #define AML_BREAK_OP (u16) 0xa5 | ||
144 | #define AML_BREAK_POINT_OP (u16) 0xcc | ||
145 | #define AML_ONES_OP (u16) 0xff | ||
146 | |||
147 | /* prefixed opcodes */ | ||
148 | |||
149 | #define AML_EXTENDED_OPCODE (u16) 0x5b00 /* prefix for 2-byte opcodes */ | ||
150 | |||
151 | #define AML_MUTEX_OP (u16) 0x5b01 | ||
152 | #define AML_EVENT_OP (u16) 0x5b02 | ||
153 | #define AML_SHIFT_RIGHT_BIT_OP (u16) 0x5b10 | ||
154 | #define AML_SHIFT_LEFT_BIT_OP (u16) 0x5b11 | ||
155 | #define AML_COND_REF_OF_OP (u16) 0x5b12 | ||
156 | #define AML_CREATE_FIELD_OP (u16) 0x5b13 | ||
157 | #define AML_LOAD_TABLE_OP (u16) 0x5b1f /* ACPI 2.0 */ | ||
158 | #define AML_LOAD_OP (u16) 0x5b20 | ||
159 | #define AML_STALL_OP (u16) 0x5b21 | ||
160 | #define AML_SLEEP_OP (u16) 0x5b22 | ||
161 | #define AML_ACQUIRE_OP (u16) 0x5b23 | ||
162 | #define AML_SIGNAL_OP (u16) 0x5b24 | ||
163 | #define AML_WAIT_OP (u16) 0x5b25 | ||
164 | #define AML_RESET_OP (u16) 0x5b26 | ||
165 | #define AML_RELEASE_OP (u16) 0x5b27 | ||
166 | #define AML_FROM_BCD_OP (u16) 0x5b28 | ||
167 | #define AML_TO_BCD_OP (u16) 0x5b29 | ||
168 | #define AML_UNLOAD_OP (u16) 0x5b2a | ||
169 | #define AML_REVISION_OP (u16) 0x5b30 | ||
170 | #define AML_DEBUG_OP (u16) 0x5b31 | ||
171 | #define AML_FATAL_OP (u16) 0x5b32 | ||
172 | #define AML_TIMER_OP (u16) 0x5b33 /* ACPI 3.0 */ | ||
173 | #define AML_REGION_OP (u16) 0x5b80 | ||
174 | #define AML_FIELD_OP (u16) 0x5b81 | ||
175 | #define AML_DEVICE_OP (u16) 0x5b82 | ||
176 | #define AML_PROCESSOR_OP (u16) 0x5b83 | ||
177 | #define AML_POWER_RES_OP (u16) 0x5b84 | ||
178 | #define AML_THERMAL_ZONE_OP (u16) 0x5b85 | ||
179 | #define AML_INDEX_FIELD_OP (u16) 0x5b86 | ||
180 | #define AML_BANK_FIELD_OP (u16) 0x5b87 | ||
181 | #define AML_DATA_REGION_OP (u16) 0x5b88 /* ACPI 2.0 */ | ||
182 | |||
183 | /* | ||
184 | * Combination opcodes (actually two one-byte opcodes) | ||
185 | * Used by the disassembler and i_aSL compiler | ||
186 | */ | ||
187 | #define AML_LGREATEREQUAL_OP (u16) 0x9295 | ||
188 | #define AML_LLESSEQUAL_OP (u16) 0x9294 | ||
189 | #define AML_LNOTEQUAL_OP (u16) 0x9293 | ||
190 | |||
191 | /* | ||
192 | * Internal opcodes | ||
193 | * Use only "Unknown" AML opcodes, don't attempt to use | ||
194 | * any valid ACPI ASCII values (A-Z, 0-9, '-') | ||
195 | */ | ||
196 | #define AML_INT_NAMEPATH_OP (u16) 0x002d | ||
197 | #define AML_INT_NAMEDFIELD_OP (u16) 0x0030 | ||
198 | #define AML_INT_RESERVEDFIELD_OP (u16) 0x0031 | ||
199 | #define AML_INT_ACCESSFIELD_OP (u16) 0x0032 | ||
200 | #define AML_INT_BYTELIST_OP (u16) 0x0033 | ||
201 | #define AML_INT_STATICSTRING_OP (u16) 0x0034 | ||
202 | #define AML_INT_METHODCALL_OP (u16) 0x0035 | ||
203 | #define AML_INT_RETURN_VALUE_OP (u16) 0x0036 | ||
204 | #define AML_INT_EVAL_SUBTREE_OP (u16) 0x0037 | ||
205 | |||
206 | #define ARG_NONE 0x0 | ||
207 | |||
208 | /* | ||
209 | * Argument types for the AML Parser | ||
210 | * Each field in the arg_types u32 is 5 bits, allowing for a maximum of 6 arguments. | ||
211 | * There can be up to 31 unique argument types | ||
212 | * Zero is reserved as end-of-list indicator | ||
213 | */ | ||
214 | #define ARGP_BYTEDATA 0x01 | ||
215 | #define ARGP_BYTELIST 0x02 | ||
216 | #define ARGP_CHARLIST 0x03 | ||
217 | #define ARGP_DATAOBJ 0x04 | ||
218 | #define ARGP_DATAOBJLIST 0x05 | ||
219 | #define ARGP_DWORDDATA 0x06 | ||
220 | #define ARGP_FIELDLIST 0x07 | ||
221 | #define ARGP_NAME 0x08 | ||
222 | #define ARGP_NAMESTRING 0x09 | ||
223 | #define ARGP_OBJLIST 0x0A | ||
224 | #define ARGP_PKGLENGTH 0x0B | ||
225 | #define ARGP_SUPERNAME 0x0C | ||
226 | #define ARGP_TARGET 0x0D | ||
227 | #define ARGP_TERMARG 0x0E | ||
228 | #define ARGP_TERMLIST 0x0F | ||
229 | #define ARGP_WORDDATA 0x10 | ||
230 | #define ARGP_QWORDDATA 0x11 | ||
231 | #define ARGP_SIMPLENAME 0x12 | ||
232 | |||
233 | /* | ||
234 | * Resolved argument types for the AML Interpreter | ||
235 | * Each field in the arg_types u32 is 5 bits, allowing for a maximum of 6 arguments. | ||
236 | * There can be up to 31 unique argument types (0 is end-of-arg-list indicator) | ||
237 | * | ||
238 | * Note1: These values are completely independent from the ACPI_TYPEs | ||
239 | * i.e., ARGI_INTEGER != ACPI_TYPE_INTEGER | ||
240 | * | ||
241 | * Note2: If and when 5 bits becomes insufficient, it would probably be best | ||
242 | * to convert to a 6-byte array of argument types, allowing 8 bits per argument. | ||
243 | */ | ||
244 | |||
245 | /* Single, simple types */ | ||
246 | |||
247 | #define ARGI_ANYTYPE 0x01 /* Don't care */ | ||
248 | #define ARGI_PACKAGE 0x02 | ||
249 | #define ARGI_EVENT 0x03 | ||
250 | #define ARGI_MUTEX 0x04 | ||
251 | #define ARGI_DDBHANDLE 0x05 | ||
252 | |||
253 | /* Interchangeable types (via implicit conversion) */ | ||
254 | |||
255 | #define ARGI_INTEGER 0x06 | ||
256 | #define ARGI_STRING 0x07 | ||
257 | #define ARGI_BUFFER 0x08 | ||
258 | #define ARGI_BUFFER_OR_STRING 0x09 /* Used by MID op only */ | ||
259 | #define ARGI_COMPUTEDATA 0x0A /* Buffer, String, or Integer */ | ||
260 | |||
261 | /* Reference objects */ | ||
262 | |||
263 | #define ARGI_INTEGER_REF 0x0B | ||
264 | #define ARGI_OBJECT_REF 0x0C | ||
265 | #define ARGI_DEVICE_REF 0x0D | ||
266 | #define ARGI_REFERENCE 0x0E | ||
267 | #define ARGI_TARGETREF 0x0F /* Target, subject to implicit conversion */ | ||
268 | #define ARGI_FIXED_TARGET 0x10 /* Target, no implicit conversion */ | ||
269 | #define ARGI_SIMPLE_TARGET 0x11 /* Name, Local, Arg -- no implicit conversion */ | ||
270 | |||
271 | /* Multiple/complex types */ | ||
272 | |||
273 | #define ARGI_DATAOBJECT 0x12 /* Buffer, String, package or reference to a Node - Used only by size_of operator */ | ||
274 | #define ARGI_COMPLEXOBJ 0x13 /* Buffer, String, or package (Used by INDEX op only) */ | ||
275 | #define ARGI_REF_OR_STRING 0x14 /* Reference or String (Used by DEREFOF op only) */ | ||
276 | #define ARGI_REGION_OR_BUFFER 0x15 /* Used by LOAD op only */ | ||
277 | #define ARGI_DATAREFOBJ 0x16 | ||
278 | |||
279 | /* Note: types above can expand to 0x1F maximum */ | ||
280 | |||
281 | #define ARGI_INVALID_OPCODE 0xFFFFFFFF | ||
282 | |||
283 | /* | ||
284 | * hash offsets | ||
285 | */ | ||
286 | #define AML_EXTOP_HASH_OFFSET 22 | ||
287 | #define AML_LNOT_HASH_OFFSET 19 | ||
288 | |||
289 | /* | ||
290 | * opcode groups and types | ||
291 | */ | ||
292 | #define OPGRP_NAMED 0x01 | ||
293 | #define OPGRP_FIELD 0x02 | ||
294 | #define OPGRP_BYTELIST 0x04 | ||
295 | |||
296 | /* | ||
297 | * Opcode information | ||
298 | */ | ||
299 | |||
300 | /* Opcode flags */ | ||
301 | |||
302 | #define AML_LOGICAL 0x0001 | ||
303 | #define AML_LOGICAL_NUMERIC 0x0002 | ||
304 | #define AML_MATH 0x0004 | ||
305 | #define AML_CREATE 0x0008 | ||
306 | #define AML_FIELD 0x0010 | ||
307 | #define AML_DEFER 0x0020 | ||
308 | #define AML_NAMED 0x0040 | ||
309 | #define AML_NSNODE 0x0080 | ||
310 | #define AML_NSOPCODE 0x0100 | ||
311 | #define AML_NSOBJECT 0x0200 | ||
312 | #define AML_HAS_RETVAL 0x0400 | ||
313 | #define AML_HAS_TARGET 0x0800 | ||
314 | #define AML_HAS_ARGS 0x1000 | ||
315 | #define AML_CONSTANT 0x2000 | ||
316 | #define AML_NO_OPERAND_RESOLVE 0x4000 | ||
317 | |||
318 | /* Convenient flag groupings */ | ||
319 | |||
320 | #define AML_FLAGS_EXEC_0A_0T_1R AML_HAS_RETVAL | ||
321 | #define AML_FLAGS_EXEC_1A_0T_0R AML_HAS_ARGS /* Monadic1 */ | ||
322 | #define AML_FLAGS_EXEC_1A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Monadic2 */ | ||
323 | #define AML_FLAGS_EXEC_1A_1T_0R AML_HAS_ARGS | AML_HAS_TARGET | ||
324 | #define AML_FLAGS_EXEC_1A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* monadic2_r */ | ||
325 | #define AML_FLAGS_EXEC_2A_0T_0R AML_HAS_ARGS /* Dyadic1 */ | ||
326 | #define AML_FLAGS_EXEC_2A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Dyadic2 */ | ||
327 | #define AML_FLAGS_EXEC_2A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* dyadic2_r */ | ||
328 | #define AML_FLAGS_EXEC_2A_2T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL | ||
329 | #define AML_FLAGS_EXEC_3A_0T_0R AML_HAS_ARGS | ||
330 | #define AML_FLAGS_EXEC_3A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL | ||
331 | #define AML_FLAGS_EXEC_6A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL | ||
332 | |||
333 | /* | ||
334 | * The opcode Type is used in a dispatch table, do not change | ||
335 | * without updating the table. | ||
336 | */ | ||
337 | #define AML_TYPE_EXEC_0A_0T_1R 0x00 | ||
338 | #define AML_TYPE_EXEC_1A_0T_0R 0x01 /* Monadic1 */ | ||
339 | #define AML_TYPE_EXEC_1A_0T_1R 0x02 /* Monadic2 */ | ||
340 | #define AML_TYPE_EXEC_1A_1T_0R 0x03 | ||
341 | #define AML_TYPE_EXEC_1A_1T_1R 0x04 /* monadic2_r */ | ||
342 | #define AML_TYPE_EXEC_2A_0T_0R 0x05 /* Dyadic1 */ | ||
343 | #define AML_TYPE_EXEC_2A_0T_1R 0x06 /* Dyadic2 */ | ||
344 | #define AML_TYPE_EXEC_2A_1T_1R 0x07 /* dyadic2_r */ | ||
345 | #define AML_TYPE_EXEC_2A_2T_1R 0x08 | ||
346 | #define AML_TYPE_EXEC_3A_0T_0R 0x09 | ||
347 | #define AML_TYPE_EXEC_3A_1T_1R 0x0A | ||
348 | #define AML_TYPE_EXEC_6A_0T_1R 0x0B | ||
349 | /* End of types used in dispatch table */ | ||
350 | |||
351 | #define AML_TYPE_LITERAL 0x0B | ||
352 | #define AML_TYPE_CONSTANT 0x0C | ||
353 | #define AML_TYPE_METHOD_ARGUMENT 0x0D | ||
354 | #define AML_TYPE_LOCAL_VARIABLE 0x0E | ||
355 | #define AML_TYPE_DATA_TERM 0x0F | ||
356 | |||
357 | /* Generic for an op that returns a value */ | ||
358 | |||
359 | #define AML_TYPE_METHOD_CALL 0x10 | ||
360 | |||
361 | /* Misc */ | ||
362 | |||
363 | #define AML_TYPE_CREATE_FIELD 0x11 | ||
364 | #define AML_TYPE_CREATE_OBJECT 0x12 | ||
365 | #define AML_TYPE_CONTROL 0x13 | ||
366 | #define AML_TYPE_NAMED_NO_OBJ 0x14 | ||
367 | #define AML_TYPE_NAMED_FIELD 0x15 | ||
368 | #define AML_TYPE_NAMED_SIMPLE 0x16 | ||
369 | #define AML_TYPE_NAMED_COMPLEX 0x17 | ||
370 | #define AML_TYPE_RETURN 0x18 | ||
371 | |||
372 | #define AML_TYPE_UNDEFINED 0x19 | ||
373 | #define AML_TYPE_BOGUS 0x1A | ||
374 | |||
375 | /* AML Package Length encodings */ | ||
376 | |||
377 | #define ACPI_AML_PACKAGE_TYPE1 0x40 | ||
378 | #define ACPI_AML_PACKAGE_TYPE2 0x4000 | ||
379 | #define ACPI_AML_PACKAGE_TYPE3 0x400000 | ||
380 | #define ACPI_AML_PACKAGE_TYPE4 0x40000000 | ||
381 | |||
382 | /* | ||
383 | * Opcode classes | ||
384 | */ | ||
385 | #define AML_CLASS_EXECUTE 0x00 | ||
386 | #define AML_CLASS_CREATE 0x01 | ||
387 | #define AML_CLASS_ARGUMENT 0x02 | ||
388 | #define AML_CLASS_NAMED_OBJECT 0x03 | ||
389 | #define AML_CLASS_CONTROL 0x04 | ||
390 | #define AML_CLASS_ASCII 0x05 | ||
391 | #define AML_CLASS_PREFIX 0x06 | ||
392 | #define AML_CLASS_INTERNAL 0x07 | ||
393 | #define AML_CLASS_RETURN_VALUE 0x08 | ||
394 | #define AML_CLASS_METHOD_CALL 0x09 | ||
395 | #define AML_CLASS_UNKNOWN 0x0A | ||
396 | |||
397 | /* Predefined Operation Region space_iDs */ | ||
398 | |||
399 | typedef enum { | ||
400 | REGION_MEMORY = 0, | ||
401 | REGION_IO, | ||
402 | REGION_PCI_CONFIG, | ||
403 | REGION_EC, | ||
404 | REGION_SMBUS, | ||
405 | REGION_CMOS, | ||
406 | REGION_PCI_BAR, | ||
407 | REGION_DATA_TABLE, /* Internal use only */ | ||
408 | REGION_FIXED_HW = 0x7F | ||
409 | } AML_REGION_TYPES; | ||
410 | |||
411 | /* Comparison operation codes for match_op operator */ | ||
412 | |||
413 | typedef enum { | ||
414 | MATCH_MTR = 0, | ||
415 | MATCH_MEQ = 1, | ||
416 | MATCH_MLE = 2, | ||
417 | MATCH_MLT = 3, | ||
418 | MATCH_MGE = 4, | ||
419 | MATCH_MGT = 5 | ||
420 | } AML_MATCH_OPERATOR; | ||
421 | |||
422 | #define MAX_MATCH_OPERATOR 5 | ||
423 | |||
424 | /* | ||
425 | * field_flags | ||
426 | * | ||
427 | * This byte is extracted from the AML and includes three separate | ||
428 | * pieces of information about the field: | ||
429 | * 1) The field access type | ||
430 | * 2) The field update rule | ||
431 | * 3) The lock rule for the field | ||
432 | * | ||
433 | * Bits 00 - 03 : access_type (any_acc, byte_acc, etc.) | ||
434 | * 04 : lock_rule (1 == Lock) | ||
435 | * 05 - 06 : update_rule | ||
436 | */ | ||
437 | #define AML_FIELD_ACCESS_TYPE_MASK 0x0F | ||
438 | #define AML_FIELD_LOCK_RULE_MASK 0x10 | ||
439 | #define AML_FIELD_UPDATE_RULE_MASK 0x60 | ||
440 | |||
441 | /* 1) Field Access Types */ | ||
442 | |||
443 | typedef enum { | ||
444 | AML_FIELD_ACCESS_ANY = 0x00, | ||
445 | AML_FIELD_ACCESS_BYTE = 0x01, | ||
446 | AML_FIELD_ACCESS_WORD = 0x02, | ||
447 | AML_FIELD_ACCESS_DWORD = 0x03, | ||
448 | AML_FIELD_ACCESS_QWORD = 0x04, /* ACPI 2.0 */ | ||
449 | AML_FIELD_ACCESS_BUFFER = 0x05 /* ACPI 2.0 */ | ||
450 | } AML_ACCESS_TYPE; | ||
451 | |||
452 | /* 2) Field Lock Rules */ | ||
453 | |||
454 | typedef enum { | ||
455 | AML_FIELD_LOCK_NEVER = 0x00, | ||
456 | AML_FIELD_LOCK_ALWAYS = 0x10 | ||
457 | } AML_LOCK_RULE; | ||
458 | |||
459 | /* 3) Field Update Rules */ | ||
460 | |||
461 | typedef enum { | ||
462 | AML_FIELD_UPDATE_PRESERVE = 0x00, | ||
463 | AML_FIELD_UPDATE_WRITE_AS_ONES = 0x20, | ||
464 | AML_FIELD_UPDATE_WRITE_AS_ZEROS = 0x40 | ||
465 | } AML_UPDATE_RULE; | ||
466 | |||
467 | /* | ||
468 | * Field Access Attributes. | ||
469 | * This byte is extracted from the AML via the | ||
470 | * access_as keyword | ||
471 | */ | ||
472 | typedef enum { | ||
473 | AML_FIELD_ATTRIB_SMB_QUICK = 0x02, | ||
474 | AML_FIELD_ATTRIB_SMB_SEND_RCV = 0x04, | ||
475 | AML_FIELD_ATTRIB_SMB_BYTE = 0x06, | ||
476 | AML_FIELD_ATTRIB_SMB_WORD = 0x08, | ||
477 | AML_FIELD_ATTRIB_SMB_BLOCK = 0x0A, | ||
478 | AML_FIELD_ATTRIB_SMB_WORD_CALL = 0x0C, | ||
479 | AML_FIELD_ATTRIB_SMB_BLOCK_CALL = 0x0D | ||
480 | } AML_ACCESS_ATTRIBUTE; | ||
481 | |||
482 | /* Bit fields in method_flags byte */ | ||
483 | |||
484 | #define AML_METHOD_ARG_COUNT 0x07 | ||
485 | #define AML_METHOD_SERIALIZED 0x08 | ||
486 | #define AML_METHOD_SYNCH_LEVEL 0xF0 | ||
487 | |||
488 | /* METHOD_FLAGS_ARG_COUNT is not used internally, define additional flags */ | ||
489 | |||
490 | #define AML_METHOD_INTERNAL_ONLY 0x01 | ||
491 | #define AML_METHOD_RESERVED1 0x02 | ||
492 | #define AML_METHOD_RESERVED2 0x04 | ||
493 | |||
494 | #endif /* __AMLCODE_H__ */ | ||
diff --git a/include/acpi/amlresrc.h b/include/acpi/amlresrc.h deleted file mode 100644 index 7b070e42b7c5..000000000000 --- a/include/acpi/amlresrc.h +++ /dev/null | |||
@@ -1,311 +0,0 @@ | |||
1 | |||
2 | /****************************************************************************** | ||
3 | * | ||
4 | * Module Name: amlresrc.h - AML resource descriptors | ||
5 | * | ||
6 | *****************************************************************************/ | ||
7 | |||
8 | /* | ||
9 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
10 | * All rights reserved. | ||
11 | * | ||
12 | * Redistribution and use in source and binary forms, with or without | ||
13 | * modification, are permitted provided that the following conditions | ||
14 | * are met: | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions, and the following disclaimer, | ||
17 | * without modification. | ||
18 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
19 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
20 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
21 | * including a substantially similar Disclaimer requirement for further | ||
22 | * binary redistribution. | ||
23 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
24 | * of any contributors may be used to endorse or promote products derived | ||
25 | * from this software without specific prior written permission. | ||
26 | * | ||
27 | * Alternatively, this software may be distributed under the terms of the | ||
28 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
29 | * Software Foundation. | ||
30 | * | ||
31 | * NO WARRANTY | ||
32 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
33 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
34 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
35 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
36 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
38 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
39 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
40 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
41 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
42 | * POSSIBILITY OF SUCH DAMAGES. | ||
43 | */ | ||
44 | |||
45 | /* acpisrc:struct_defs -- for acpisrc conversion */ | ||
46 | |||
47 | #ifndef __AMLRESRC_H | ||
48 | #define __AMLRESRC_H | ||
49 | |||
50 | /* | ||
51 | * Resource descriptor tags, as defined in the ACPI specification. | ||
52 | * Used to symbolically reference fields within a descriptor. | ||
53 | */ | ||
54 | #define ACPI_RESTAG_ADDRESS "_ADR" | ||
55 | #define ACPI_RESTAG_ALIGNMENT "_ALN" | ||
56 | #define ACPI_RESTAG_ADDRESSSPACE "_ASI" | ||
57 | #define ACPI_RESTAG_ACCESSSIZE "_ASZ" | ||
58 | #define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT" | ||
59 | #define ACPI_RESTAG_BASEADDRESS "_BAS" | ||
60 | #define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */ | ||
61 | #define ACPI_RESTAG_DECODE "_DEC" | ||
62 | #define ACPI_RESTAG_DMA "_DMA" | ||
63 | #define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */ | ||
64 | #define ACPI_RESTAG_GRANULARITY "_GRA" | ||
65 | #define ACPI_RESTAG_INTERRUPT "_INT" | ||
66 | #define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */ | ||
67 | #define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), no_share(0) */ | ||
68 | #define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */ | ||
69 | #define ACPI_RESTAG_LENGTH "_LEN" | ||
70 | #define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */ | ||
71 | #define ACPI_RESTAG_MEMTYPE "_MEM" /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */ | ||
72 | #define ACPI_RESTAG_MAXADDR "_MAX" | ||
73 | #define ACPI_RESTAG_MINADDR "_MIN" | ||
74 | #define ACPI_RESTAG_MAXTYPE "_MAF" | ||
75 | #define ACPI_RESTAG_MINTYPE "_MIF" | ||
76 | #define ACPI_RESTAG_REGISTERBITOFFSET "_RBO" | ||
77 | #define ACPI_RESTAG_REGISTERBITWIDTH "_RBW" | ||
78 | #define ACPI_RESTAG_RANGETYPE "_RNG" | ||
79 | #define ACPI_RESTAG_READWRITETYPE "_RW_" /* read_only(0), Writeable (1) */ | ||
80 | #define ACPI_RESTAG_TRANSLATION "_TRA" | ||
81 | #define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */ | ||
82 | #define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */ | ||
83 | #define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8_and16(1), 16(2) */ | ||
84 | |||
85 | /* Default sizes for "small" resource descriptors */ | ||
86 | |||
87 | #define ASL_RDESC_IRQ_SIZE 0x02 | ||
88 | #define ASL_RDESC_DMA_SIZE 0x02 | ||
89 | #define ASL_RDESC_ST_DEPEND_SIZE 0x00 | ||
90 | #define ASL_RDESC_END_DEPEND_SIZE 0x00 | ||
91 | #define ASL_RDESC_IO_SIZE 0x07 | ||
92 | #define ASL_RDESC_FIXED_IO_SIZE 0x03 | ||
93 | #define ASL_RDESC_END_TAG_SIZE 0x01 | ||
94 | |||
95 | struct asl_resource_node { | ||
96 | u32 buffer_length; | ||
97 | void *buffer; | ||
98 | struct asl_resource_node *next; | ||
99 | }; | ||
100 | |||
101 | /* Macros used to generate AML resource length fields */ | ||
102 | |||
103 | #define ACPI_AML_SIZE_LARGE(r) (sizeof (r) - sizeof (struct aml_resource_large_header)) | ||
104 | #define ACPI_AML_SIZE_SMALL(r) (sizeof (r) - sizeof (struct aml_resource_small_header)) | ||
105 | |||
106 | /* | ||
107 | * Resource descriptors defined in the ACPI specification. | ||
108 | * | ||
109 | * Packing/alignment must be BYTE because these descriptors | ||
110 | * are used to overlay the raw AML byte stream. | ||
111 | */ | ||
112 | #pragma pack(1) | ||
113 | |||
114 | /* | ||
115 | * SMALL descriptors | ||
116 | */ | ||
117 | #define AML_RESOURCE_SMALL_HEADER_COMMON \ | ||
118 | u8 descriptor_type; | ||
119 | |||
120 | struct aml_resource_small_header { | ||
121 | AML_RESOURCE_SMALL_HEADER_COMMON}; | ||
122 | |||
123 | struct aml_resource_irq { | ||
124 | AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask; | ||
125 | u8 flags; | ||
126 | }; | ||
127 | |||
128 | struct aml_resource_irq_noflags { | ||
129 | AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask; | ||
130 | }; | ||
131 | |||
132 | struct aml_resource_dma { | ||
133 | AML_RESOURCE_SMALL_HEADER_COMMON u8 dma_channel_mask; | ||
134 | u8 flags; | ||
135 | }; | ||
136 | |||
137 | struct aml_resource_start_dependent { | ||
138 | AML_RESOURCE_SMALL_HEADER_COMMON u8 flags; | ||
139 | }; | ||
140 | |||
141 | struct aml_resource_start_dependent_noprio { | ||
142 | AML_RESOURCE_SMALL_HEADER_COMMON}; | ||
143 | |||
144 | struct aml_resource_end_dependent { | ||
145 | AML_RESOURCE_SMALL_HEADER_COMMON}; | ||
146 | |||
147 | struct aml_resource_io { | ||
148 | AML_RESOURCE_SMALL_HEADER_COMMON u8 flags; | ||
149 | u16 minimum; | ||
150 | u16 maximum; | ||
151 | u8 alignment; | ||
152 | u8 address_length; | ||
153 | }; | ||
154 | |||
155 | struct aml_resource_fixed_io { | ||
156 | AML_RESOURCE_SMALL_HEADER_COMMON u16 address; | ||
157 | u8 address_length; | ||
158 | }; | ||
159 | |||
160 | struct aml_resource_vendor_small { | ||
161 | AML_RESOURCE_SMALL_HEADER_COMMON}; | ||
162 | |||
163 | struct aml_resource_end_tag { | ||
164 | AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum; | ||
165 | }; | ||
166 | |||
167 | /* | ||
168 | * LARGE descriptors | ||
169 | */ | ||
170 | #define AML_RESOURCE_LARGE_HEADER_COMMON \ | ||
171 | u8 descriptor_type;\ | ||
172 | u16 resource_length; | ||
173 | |||
174 | struct aml_resource_large_header { | ||
175 | AML_RESOURCE_LARGE_HEADER_COMMON}; | ||
176 | |||
177 | struct aml_resource_memory24 { | ||
178 | AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; | ||
179 | u16 minimum; | ||
180 | u16 maximum; | ||
181 | u16 alignment; | ||
182 | u16 address_length; | ||
183 | }; | ||
184 | |||
185 | struct aml_resource_vendor_large { | ||
186 | AML_RESOURCE_LARGE_HEADER_COMMON}; | ||
187 | |||
188 | struct aml_resource_memory32 { | ||
189 | AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; | ||
190 | u32 minimum; | ||
191 | u32 maximum; | ||
192 | u32 alignment; | ||
193 | u32 address_length; | ||
194 | }; | ||
195 | |||
196 | struct aml_resource_fixed_memory32 { | ||
197 | AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; | ||
198 | u32 address; | ||
199 | u32 address_length; | ||
200 | }; | ||
201 | |||
202 | #define AML_RESOURCE_ADDRESS_COMMON \ | ||
203 | u8 resource_type; \ | ||
204 | u8 flags; \ | ||
205 | u8 specific_flags; | ||
206 | |||
207 | struct aml_resource_address { | ||
208 | AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON}; | ||
209 | |||
210 | struct aml_resource_extended_address64 { | ||
211 | AML_RESOURCE_LARGE_HEADER_COMMON | ||
212 | AML_RESOURCE_ADDRESS_COMMON u8 revision_iD; | ||
213 | u8 reserved; | ||
214 | u64 granularity; | ||
215 | u64 minimum; | ||
216 | u64 maximum; | ||
217 | u64 translation_offset; | ||
218 | u64 address_length; | ||
219 | u64 type_specific; | ||
220 | }; | ||
221 | |||
222 | #define AML_RESOURCE_EXTENDED_ADDRESS_REVISION 1 /* ACPI 3.0 */ | ||
223 | |||
224 | struct aml_resource_address64 { | ||
225 | AML_RESOURCE_LARGE_HEADER_COMMON | ||
226 | AML_RESOURCE_ADDRESS_COMMON u64 granularity; | ||
227 | u64 minimum; | ||
228 | u64 maximum; | ||
229 | u64 translation_offset; | ||
230 | u64 address_length; | ||
231 | }; | ||
232 | |||
233 | struct aml_resource_address32 { | ||
234 | AML_RESOURCE_LARGE_HEADER_COMMON | ||
235 | AML_RESOURCE_ADDRESS_COMMON u32 granularity; | ||
236 | u32 minimum; | ||
237 | u32 maximum; | ||
238 | u32 translation_offset; | ||
239 | u32 address_length; | ||
240 | }; | ||
241 | |||
242 | struct aml_resource_address16 { | ||
243 | AML_RESOURCE_LARGE_HEADER_COMMON | ||
244 | AML_RESOURCE_ADDRESS_COMMON u16 granularity; | ||
245 | u16 minimum; | ||
246 | u16 maximum; | ||
247 | u16 translation_offset; | ||
248 | u16 address_length; | ||
249 | }; | ||
250 | |||
251 | struct aml_resource_extended_irq { | ||
252 | AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; | ||
253 | u8 interrupt_count; | ||
254 | u32 interrupts[1]; | ||
255 | /* res_source_index, res_source optional fields follow */ | ||
256 | }; | ||
257 | |||
258 | struct aml_resource_generic_register { | ||
259 | AML_RESOURCE_LARGE_HEADER_COMMON u8 address_space_id; | ||
260 | u8 bit_width; | ||
261 | u8 bit_offset; | ||
262 | u8 access_size; /* ACPI 3.0, was previously Reserved */ | ||
263 | u64 address; | ||
264 | }; | ||
265 | |||
266 | /* restore default alignment */ | ||
267 | |||
268 | #pragma pack() | ||
269 | |||
270 | /* Union of all resource descriptors, so we can allocate the worst case */ | ||
271 | |||
272 | union aml_resource { | ||
273 | /* Descriptor headers */ | ||
274 | |||
275 | u8 descriptor_type; | ||
276 | struct aml_resource_small_header small_header; | ||
277 | struct aml_resource_large_header large_header; | ||
278 | |||
279 | /* Small resource descriptors */ | ||
280 | |||
281 | struct aml_resource_irq irq; | ||
282 | struct aml_resource_dma dma; | ||
283 | struct aml_resource_start_dependent start_dpf; | ||
284 | struct aml_resource_end_dependent end_dpf; | ||
285 | struct aml_resource_io io; | ||
286 | struct aml_resource_fixed_io fixed_io; | ||
287 | struct aml_resource_vendor_small vendor_small; | ||
288 | struct aml_resource_end_tag end_tag; | ||
289 | |||
290 | /* Large resource descriptors */ | ||
291 | |||
292 | struct aml_resource_memory24 memory24; | ||
293 | struct aml_resource_generic_register generic_reg; | ||
294 | struct aml_resource_vendor_large vendor_large; | ||
295 | struct aml_resource_memory32 memory32; | ||
296 | struct aml_resource_fixed_memory32 fixed_memory32; | ||
297 | struct aml_resource_address16 address16; | ||
298 | struct aml_resource_address32 address32; | ||
299 | struct aml_resource_address64 address64; | ||
300 | struct aml_resource_extended_address64 ext_address64; | ||
301 | struct aml_resource_extended_irq extended_irq; | ||
302 | |||
303 | /* Utility overlays */ | ||
304 | |||
305 | struct aml_resource_address address; | ||
306 | u32 dword_item; | ||
307 | u16 word_item; | ||
308 | u8 byte_item; | ||
309 | }; | ||
310 | |||
311 | #endif | ||
diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h index fcd2572e428c..e62f10d9a7d8 100644 --- a/include/acpi/platform/acenv.h +++ b/include/acpi/platform/acenv.h | |||
@@ -44,14 +44,26 @@ | |||
44 | #ifndef __ACENV_H__ | 44 | #ifndef __ACENV_H__ |
45 | #define __ACENV_H__ | 45 | #define __ACENV_H__ |
46 | 46 | ||
47 | /* | 47 | /* Types for ACPI_MUTEX_TYPE */ |
48 | |||
49 | #define ACPI_BINARY_SEMAPHORE 0 | ||
50 | #define ACPI_OSL_MUTEX 1 | ||
51 | |||
52 | /* Types for DEBUGGER_THREADING */ | ||
53 | |||
54 | #define DEBUGGER_SINGLE_THREADED 0 | ||
55 | #define DEBUGGER_MULTI_THREADED 1 | ||
56 | |||
57 | /****************************************************************************** | ||
58 | * | ||
48 | * Configuration for ACPI tools and utilities | 59 | * Configuration for ACPI tools and utilities |
49 | */ | 60 | * |
61 | *****************************************************************************/ | ||
50 | 62 | ||
51 | #ifdef ACPI_LIBRARY | 63 | #ifdef ACPI_LIBRARY |
52 | /* | 64 | /* |
53 | * Note: The non-debug version of the acpi_library does not contain any | 65 | * Note: The non-debug version of the acpi_library does not contain any |
54 | * debug support, for minimimal size. The debug version uses ACPI_FULL_DEBUG | 66 | * debug support, for minimal size. The debug version uses ACPI_FULL_DEBUG |
55 | */ | 67 | */ |
56 | #define ACPI_USE_LOCAL_CACHE | 68 | #define ACPI_USE_LOCAL_CACHE |
57 | #endif | 69 | #endif |
@@ -75,17 +87,6 @@ | |||
75 | #define ACPI_DBG_TRACK_ALLOCATIONS | 87 | #define ACPI_DBG_TRACK_ALLOCATIONS |
76 | #endif | 88 | #endif |
77 | 89 | ||
78 | #ifdef ACPI_DASM_APP | ||
79 | #ifndef MSDOS | ||
80 | #define ACPI_DEBUG_OUTPUT | ||
81 | #endif | ||
82 | #define ACPI_APPLICATION | ||
83 | #define ACPI_DISASSEMBLER | ||
84 | #define ACPI_NO_METHOD_EXECUTION | ||
85 | #define ACPI_LARGE_NAMESPACE_NODE | ||
86 | #define ACPI_DATA_TABLE_DISASSEMBLY | ||
87 | #endif | ||
88 | |||
89 | #ifdef ACPI_APPLICATION | 90 | #ifdef ACPI_APPLICATION |
90 | #define ACPI_USE_SYSTEM_CLIBRARY | 91 | #define ACPI_USE_SYSTEM_CLIBRARY |
91 | #define ACPI_USE_LOCAL_CACHE | 92 | #define ACPI_USE_LOCAL_CACHE |
@@ -179,6 +180,19 @@ | |||
179 | 180 | ||
180 | /*! [End] no source code translation !*/ | 181 | /*! [End] no source code translation !*/ |
181 | 182 | ||
183 | /****************************************************************************** | ||
184 | * | ||
185 | * Miscellaneous configuration | ||
186 | * | ||
187 | *****************************************************************************/ | ||
188 | |||
189 | /* | ||
190 | * Are mutexes supported by the host? default is no, use binary semaphores. | ||
191 | */ | ||
192 | #ifndef ACPI_MUTEX_TYPE | ||
193 | #define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE | ||
194 | #endif | ||
195 | |||
182 | /* | 196 | /* |
183 | * Debugger threading model | 197 | * Debugger threading model |
184 | * Use single threaded if the entire subsystem is contained in an application | 198 | * Use single threaded if the entire subsystem is contained in an application |
@@ -187,9 +201,6 @@ | |||
187 | * By default the model is single threaded if ACPI_APPLICATION is set, | 201 | * By default the model is single threaded if ACPI_APPLICATION is set, |
188 | * multi-threaded if ACPI_APPLICATION is not set. | 202 | * multi-threaded if ACPI_APPLICATION is not set. |
189 | */ | 203 | */ |
190 | #define DEBUGGER_SINGLE_THREADED 0 | ||
191 | #define DEBUGGER_MULTI_THREADED 1 | ||
192 | |||
193 | #ifndef DEBUGGER_THREADING | 204 | #ifndef DEBUGGER_THREADING |
194 | #ifdef ACPI_APPLICATION | 205 | #ifdef ACPI_APPLICATION |
195 | #define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED | 206 | #define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED |
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 0515e754449d..6d49b2a498c4 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h | |||
@@ -46,6 +46,7 @@ | |||
46 | 46 | ||
47 | #define ACPI_USE_SYSTEM_CLIBRARY | 47 | #define ACPI_USE_SYSTEM_CLIBRARY |
48 | #define ACPI_USE_DO_WHILE_0 | 48 | #define ACPI_USE_DO_WHILE_0 |
49 | #define ACPI_MUTEX_TYPE ACPI_BINARY_SEMAPHORE | ||
49 | 50 | ||
50 | #ifdef __KERNEL__ | 51 | #ifdef __KERNEL__ |
51 | 52 | ||
@@ -70,9 +71,6 @@ | |||
70 | #define ACPI_EXPORT_SYMBOL(symbol) EXPORT_SYMBOL(symbol); | 71 | #define ACPI_EXPORT_SYMBOL(symbol) EXPORT_SYMBOL(symbol); |
71 | #define strtoul simple_strtoul | 72 | #define strtoul simple_strtoul |
72 | 73 | ||
73 | /* Full namespace pathname length limit - arbitrary */ | ||
74 | #define ACPI_PATHNAME_MAX 256 | ||
75 | |||
76 | #else /* !__KERNEL__ */ | 74 | #else /* !__KERNEL__ */ |
77 | 75 | ||
78 | #include <stdarg.h> | 76 | #include <stdarg.h> |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 3795590e152a..0574add2a1e3 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -127,7 +127,7 @@ struct acpi_processor_performance { | |||
127 | unsigned int state_count; | 127 | unsigned int state_count; |
128 | struct acpi_processor_px *states; | 128 | struct acpi_processor_px *states; |
129 | struct acpi_psd_package domain_info; | 129 | struct acpi_psd_package domain_info; |
130 | cpumask_t shared_cpu_map; | 130 | cpumask_var_t shared_cpu_map; |
131 | unsigned int shared_type; | 131 | unsigned int shared_type; |
132 | }; | 132 | }; |
133 | 133 | ||
@@ -172,7 +172,7 @@ struct acpi_processor_throttling { | |||
172 | unsigned int state_count; | 172 | unsigned int state_count; |
173 | struct acpi_processor_tx_tss *states_tss; | 173 | struct acpi_processor_tx_tss *states_tss; |
174 | struct acpi_tsd_package domain_info; | 174 | struct acpi_tsd_package domain_info; |
175 | cpumask_t shared_cpu_map; | 175 | cpumask_var_t shared_cpu_map; |
176 | int (*acpi_processor_get_throttling) (struct acpi_processor * pr); | 176 | int (*acpi_processor_get_throttling) (struct acpi_processor * pr); |
177 | int (*acpi_processor_set_throttling) (struct acpi_processor * pr, | 177 | int (*acpi_processor_set_throttling) (struct acpi_processor * pr, |
178 | int state); | 178 | int state); |
diff --git a/include/asm-arm/plat-s3c/iic.h b/include/asm-arm/plat-s3c/iic.h deleted file mode 100644 index 5106acaa1d0e..000000000000 --- a/include/asm-arm/plat-s3c/iic.h +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/iic.h | ||
2 | * | ||
3 | * Copyright (c) 2004 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * | ||
6 | * S3C2410 - I2C Controller platfrom_device info | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_IIC_H | ||
14 | #define __ASM_ARCH_IIC_H __FILE__ | ||
15 | |||
16 | #define S3C_IICFLG_FILTER (1<<0) /* enable s3c2440 filter */ | ||
17 | |||
18 | /* Notes: | ||
19 | * 1) All frequencies are expressed in Hz | ||
20 | * 2) A value of zero is `do not care` | ||
21 | */ | ||
22 | |||
23 | struct s3c2410_platform_i2c { | ||
24 | int bus_num; /* bus number to use */ | ||
25 | unsigned int flags; | ||
26 | unsigned int slave_addr; /* slave address for controller */ | ||
27 | unsigned long bus_freq; /* standard bus frequency */ | ||
28 | unsigned long max_freq; /* max frequency for the bus */ | ||
29 | unsigned long min_freq; /* min frequency for the bus */ | ||
30 | unsigned int sda_delay; /* pclks (s3c2440 only) */ | ||
31 | }; | ||
32 | |||
33 | #endif /* __ASM_ARCH_IIC_H */ | ||
diff --git a/include/asm-arm/plat-s3c/nand.h b/include/asm-arm/plat-s3c/nand.h deleted file mode 100644 index f4dcd14af059..000000000000 --- a/include/asm-arm/plat-s3c/nand.h +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/nand.h | ||
2 | * | ||
3 | * Copyright (c) 2004 Simtec Electronics | ||
4 | * Ben Dooks <ben@simtec.co.uk> | ||
5 | * | ||
6 | * S3C2410 - NAND device controller platfrom_device info | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | /* struct s3c2410_nand_set | ||
14 | * | ||
15 | * define an set of one or more nand chips registered with an unique mtd | ||
16 | * | ||
17 | * nr_chips = number of chips in this set | ||
18 | * nr_partitions = number of partitions pointed to be partitoons (or zero) | ||
19 | * name = name of set (optional) | ||
20 | * nr_map = map for low-layer logical to physical chip numbers (option) | ||
21 | * partitions = mtd partition list | ||
22 | */ | ||
23 | |||
24 | struct s3c2410_nand_set { | ||
25 | unsigned int disable_ecc : 1; | ||
26 | |||
27 | int nr_chips; | ||
28 | int nr_partitions; | ||
29 | char *name; | ||
30 | int *nr_map; | ||
31 | struct mtd_partition *partitions; | ||
32 | struct nand_ecclayout *ecc_layout; | ||
33 | }; | ||
34 | |||
35 | struct s3c2410_platform_nand { | ||
36 | /* timing information for controller, all times in nanoseconds */ | ||
37 | |||
38 | int tacls; /* time for active CLE/ALE to nWE/nOE */ | ||
39 | int twrph0; /* active time for nWE/nOE */ | ||
40 | int twrph1; /* time for release CLE/ALE from nWE/nOE inactive */ | ||
41 | |||
42 | unsigned int ignore_unset_ecc : 1; | ||
43 | |||
44 | int nr_sets; | ||
45 | struct s3c2410_nand_set *sets; | ||
46 | |||
47 | void (*select_chip)(struct s3c2410_nand_set *, | ||
48 | int chip); | ||
49 | }; | ||
50 | |||
diff --git a/include/asm-arm/plat-s3c/regs-ac97.h b/include/asm-arm/plat-s3c/regs-ac97.h deleted file mode 100644 index c3878f7acb83..000000000000 --- a/include/asm-arm/plat-s3c/regs-ac97.h +++ /dev/null | |||
@@ -1,67 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-ac97.h | ||
2 | * | ||
3 | * Copyright (c) 2006 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2440 AC97 Controller | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_AC97_H | ||
14 | #define __ASM_ARCH_REGS_AC97_H __FILE__ | ||
15 | |||
16 | #define S3C_AC97_GLBCTRL (0x00) | ||
17 | |||
18 | #define S3C_AC97_GLBCTRL_CODECREADYIE (1<<22) | ||
19 | #define S3C_AC97_GLBCTRL_PCMOUTURIE (1<<21) | ||
20 | #define S3C_AC97_GLBCTRL_PCMINORIE (1<<20) | ||
21 | #define S3C_AC97_GLBCTRL_MICINORIE (1<<19) | ||
22 | #define S3C_AC97_GLBCTRL_PCMOUTTIE (1<<18) | ||
23 | #define S3C_AC97_GLBCTRL_PCMINTIE (1<<17) | ||
24 | #define S3C_AC97_GLBCTRL_MICINTIE (1<<16) | ||
25 | #define S3C_AC97_GLBCTRL_PCMOUTTM_OFF (0<<12) | ||
26 | #define S3C_AC97_GLBCTRL_PCMOUTTM_PIO (1<<12) | ||
27 | #define S3C_AC97_GLBCTRL_PCMOUTTM_DMA (2<<12) | ||
28 | #define S3C_AC97_GLBCTRL_PCMOUTTM_MASK (3<<12) | ||
29 | #define S3C_AC97_GLBCTRL_PCMINTM_OFF (0<<10) | ||
30 | #define S3C_AC97_GLBCTRL_PCMINTM_PIO (1<<10) | ||
31 | #define S3C_AC97_GLBCTRL_PCMINTM_DMA (2<<10) | ||
32 | #define S3C_AC97_GLBCTRL_PCMINTM_MASK (3<<10) | ||
33 | #define S3C_AC97_GLBCTRL_MICINTM_OFF (0<<8) | ||
34 | #define S3C_AC97_GLBCTRL_MICINTM_PIO (1<<8) | ||
35 | #define S3C_AC97_GLBCTRL_MICINTM_DMA (2<<8) | ||
36 | #define S3C_AC97_GLBCTRL_MICINTM_MASK (3<<8) | ||
37 | #define S3C_AC97_GLBCTRL_TRANSFERDATAENABLE (1<<3) | ||
38 | #define S3C_AC97_GLBCTRL_ACLINKON (1<<2) | ||
39 | #define S3C_AC97_GLBCTRL_WARMRESET (1<<1) | ||
40 | #define S3C_AC97_GLBCTRL_COLDRESET (1<<0) | ||
41 | |||
42 | #define S3C_AC97_GLBSTAT (0x04) | ||
43 | |||
44 | #define S3C_AC97_GLBSTAT_CODECREADY (1<<22) | ||
45 | #define S3C_AC97_GLBSTAT_PCMOUTUR (1<<21) | ||
46 | #define S3C_AC97_GLBSTAT_PCMINORI (1<<20) | ||
47 | #define S3C_AC97_GLBSTAT_MICINORI (1<<19) | ||
48 | #define S3C_AC97_GLBSTAT_PCMOUTTI (1<<18) | ||
49 | #define S3C_AC97_GLBSTAT_PCMINTI (1<<17) | ||
50 | #define S3C_AC97_GLBSTAT_MICINTI (1<<16) | ||
51 | #define S3C_AC97_GLBSTAT_MAINSTATE_IDLE (0<<0) | ||
52 | #define S3C_AC97_GLBSTAT_MAINSTATE_INIT (1<<0) | ||
53 | #define S3C_AC97_GLBSTAT_MAINSTATE_READY (2<<0) | ||
54 | #define S3C_AC97_GLBSTAT_MAINSTATE_ACTIVE (3<<0) | ||
55 | #define S3C_AC97_GLBSTAT_MAINSTATE_LP (4<<0) | ||
56 | #define S3C_AC97_GLBSTAT_MAINSTATE_WARM (5<<0) | ||
57 | |||
58 | #define S3C_AC97_CODEC_CMD (0x08) | ||
59 | |||
60 | #define S3C_AC97_CODEC_CMD_READ (1<<23) | ||
61 | |||
62 | #define S3C_AC97_STAT (0x0c) | ||
63 | #define S3C_AC97_PCM_ADDR (0x10) | ||
64 | #define S3C_AC97_PCM_DATA (0x18) | ||
65 | #define S3C_AC97_MIC_DATA (0x1C) | ||
66 | |||
67 | #endif /* __ASM_ARCH_REGS_AC97_H */ | ||
diff --git a/include/asm-arm/plat-s3c/regs-iic.h b/include/asm-arm/plat-s3c/regs-iic.h deleted file mode 100644 index 2f7c17de8ac8..000000000000 --- a/include/asm-arm/plat-s3c/regs-iic.h +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-iic.h | ||
2 | * | ||
3 | * Copyright (c) 2004 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2410 I2C Controller | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_IIC_H | ||
14 | #define __ASM_ARCH_REGS_IIC_H __FILE__ | ||
15 | |||
16 | /* see s3c2410x user guide, v1.1, section 9 (p447) for more info */ | ||
17 | |||
18 | #define S3C2410_IICREG(x) (x) | ||
19 | |||
20 | #define S3C2410_IICCON S3C2410_IICREG(0x00) | ||
21 | #define S3C2410_IICSTAT S3C2410_IICREG(0x04) | ||
22 | #define S3C2410_IICADD S3C2410_IICREG(0x08) | ||
23 | #define S3C2410_IICDS S3C2410_IICREG(0x0C) | ||
24 | #define S3C2440_IICLC S3C2410_IICREG(0x10) | ||
25 | |||
26 | #define S3C2410_IICCON_ACKEN (1<<7) | ||
27 | #define S3C2410_IICCON_TXDIV_16 (0<<6) | ||
28 | #define S3C2410_IICCON_TXDIV_512 (1<<6) | ||
29 | #define S3C2410_IICCON_IRQEN (1<<5) | ||
30 | #define S3C2410_IICCON_IRQPEND (1<<4) | ||
31 | #define S3C2410_IICCON_SCALE(x) ((x)&15) | ||
32 | #define S3C2410_IICCON_SCALEMASK (0xf) | ||
33 | |||
34 | #define S3C2410_IICSTAT_MASTER_RX (2<<6) | ||
35 | #define S3C2410_IICSTAT_MASTER_TX (3<<6) | ||
36 | #define S3C2410_IICSTAT_SLAVE_RX (0<<6) | ||
37 | #define S3C2410_IICSTAT_SLAVE_TX (1<<6) | ||
38 | #define S3C2410_IICSTAT_MODEMASK (3<<6) | ||
39 | |||
40 | #define S3C2410_IICSTAT_START (1<<5) | ||
41 | #define S3C2410_IICSTAT_BUSBUSY (1<<5) | ||
42 | #define S3C2410_IICSTAT_TXRXEN (1<<4) | ||
43 | #define S3C2410_IICSTAT_ARBITR (1<<3) | ||
44 | #define S3C2410_IICSTAT_ASSLAVE (1<<2) | ||
45 | #define S3C2410_IICSTAT_ADDR0 (1<<1) | ||
46 | #define S3C2410_IICSTAT_LASTBIT (1<<0) | ||
47 | |||
48 | #define S3C2410_IICLC_SDA_DELAY0 (0 << 0) | ||
49 | #define S3C2410_IICLC_SDA_DELAY5 (1 << 0) | ||
50 | #define S3C2410_IICLC_SDA_DELAY10 (2 << 0) | ||
51 | #define S3C2410_IICLC_SDA_DELAY15 (3 << 0) | ||
52 | #define S3C2410_IICLC_SDA_DELAY_MASK (3 << 0) | ||
53 | |||
54 | #define S3C2410_IICLC_FILTER_ON (1<<2) | ||
55 | |||
56 | #endif /* __ASM_ARCH_REGS_IIC_H */ | ||
diff --git a/include/asm-arm/plat-s3c/regs-nand.h b/include/asm-arm/plat-s3c/regs-nand.h deleted file mode 100644 index b2caa4bca270..000000000000 --- a/include/asm-arm/plat-s3c/regs-nand.h +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-nand.h | ||
2 | * | ||
3 | * Copyright (c) 2004,2005 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2410 NAND register definitions | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARM_REGS_NAND | ||
14 | #define __ASM_ARM_REGS_NAND | ||
15 | |||
16 | |||
17 | #define S3C2410_NFREG(x) (x) | ||
18 | |||
19 | #define S3C2410_NFCONF S3C2410_NFREG(0x00) | ||
20 | #define S3C2410_NFCMD S3C2410_NFREG(0x04) | ||
21 | #define S3C2410_NFADDR S3C2410_NFREG(0x08) | ||
22 | #define S3C2410_NFDATA S3C2410_NFREG(0x0C) | ||
23 | #define S3C2410_NFSTAT S3C2410_NFREG(0x10) | ||
24 | #define S3C2410_NFECC S3C2410_NFREG(0x14) | ||
25 | |||
26 | #define S3C2440_NFCONT S3C2410_NFREG(0x04) | ||
27 | #define S3C2440_NFCMD S3C2410_NFREG(0x08) | ||
28 | #define S3C2440_NFADDR S3C2410_NFREG(0x0C) | ||
29 | #define S3C2440_NFDATA S3C2410_NFREG(0x10) | ||
30 | #define S3C2440_NFECCD0 S3C2410_NFREG(0x14) | ||
31 | #define S3C2440_NFECCD1 S3C2410_NFREG(0x18) | ||
32 | #define S3C2440_NFECCD S3C2410_NFREG(0x1C) | ||
33 | #define S3C2440_NFSTAT S3C2410_NFREG(0x20) | ||
34 | #define S3C2440_NFESTAT0 S3C2410_NFREG(0x24) | ||
35 | #define S3C2440_NFESTAT1 S3C2410_NFREG(0x28) | ||
36 | #define S3C2440_NFMECC0 S3C2410_NFREG(0x2C) | ||
37 | #define S3C2440_NFMECC1 S3C2410_NFREG(0x30) | ||
38 | #define S3C2440_NFSECC S3C2410_NFREG(0x34) | ||
39 | #define S3C2440_NFSBLK S3C2410_NFREG(0x38) | ||
40 | #define S3C2440_NFEBLK S3C2410_NFREG(0x3C) | ||
41 | |||
42 | #define S3C2412_NFSBLK S3C2410_NFREG(0x20) | ||
43 | #define S3C2412_NFEBLK S3C2410_NFREG(0x24) | ||
44 | #define S3C2412_NFSTAT S3C2410_NFREG(0x28) | ||
45 | #define S3C2412_NFMECC_ERR0 S3C2410_NFREG(0x2C) | ||
46 | #define S3C2412_NFMECC_ERR1 S3C2410_NFREG(0x30) | ||
47 | #define S3C2412_NFMECC0 S3C2410_NFREG(0x34) | ||
48 | #define S3C2412_NFMECC1 S3C2410_NFREG(0x38) | ||
49 | #define S3C2412_NFSECC S3C2410_NFREG(0x3C) | ||
50 | |||
51 | #define S3C2410_NFCONF_EN (1<<15) | ||
52 | #define S3C2410_NFCONF_512BYTE (1<<14) | ||
53 | #define S3C2410_NFCONF_4STEP (1<<13) | ||
54 | #define S3C2410_NFCONF_INITECC (1<<12) | ||
55 | #define S3C2410_NFCONF_nFCE (1<<11) | ||
56 | #define S3C2410_NFCONF_TACLS(x) ((x)<<8) | ||
57 | #define S3C2410_NFCONF_TWRPH0(x) ((x)<<4) | ||
58 | #define S3C2410_NFCONF_TWRPH1(x) ((x)<<0) | ||
59 | |||
60 | #define S3C2410_NFSTAT_BUSY (1<<0) | ||
61 | |||
62 | #define S3C2440_NFCONF_BUSWIDTH_8 (0<<0) | ||
63 | #define S3C2440_NFCONF_BUSWIDTH_16 (1<<0) | ||
64 | #define S3C2440_NFCONF_ADVFLASH (1<<3) | ||
65 | #define S3C2440_NFCONF_TACLS(x) ((x)<<12) | ||
66 | #define S3C2440_NFCONF_TWRPH0(x) ((x)<<8) | ||
67 | #define S3C2440_NFCONF_TWRPH1(x) ((x)<<4) | ||
68 | |||
69 | #define S3C2440_NFCONT_LOCKTIGHT (1<<13) | ||
70 | #define S3C2440_NFCONT_SOFTLOCK (1<<12) | ||
71 | #define S3C2440_NFCONT_ILLEGALACC_EN (1<<10) | ||
72 | #define S3C2440_NFCONT_RNBINT_EN (1<<9) | ||
73 | #define S3C2440_NFCONT_RN_FALLING (1<<8) | ||
74 | #define S3C2440_NFCONT_SPARE_ECCLOCK (1<<6) | ||
75 | #define S3C2440_NFCONT_MAIN_ECCLOCK (1<<5) | ||
76 | #define S3C2440_NFCONT_INITECC (1<<4) | ||
77 | #define S3C2440_NFCONT_nFCE (1<<1) | ||
78 | #define S3C2440_NFCONT_ENABLE (1<<0) | ||
79 | |||
80 | #define S3C2440_NFSTAT_READY (1<<0) | ||
81 | #define S3C2440_NFSTAT_nCE (1<<1) | ||
82 | #define S3C2440_NFSTAT_RnB_CHANGE (1<<2) | ||
83 | #define S3C2440_NFSTAT_ILLEGAL_ACCESS (1<<3) | ||
84 | |||
85 | #define S3C2412_NFCONF_NANDBOOT (1<<31) | ||
86 | #define S3C2412_NFCONF_ECCCLKCON (1<<30) | ||
87 | #define S3C2412_NFCONF_ECC_MLC (1<<24) | ||
88 | #define S3C2412_NFCONF_TACLS_MASK (7<<12) /* 1 extra bit of Tacls */ | ||
89 | |||
90 | #define S3C2412_NFCONT_ECC4_DIRWR (1<<18) | ||
91 | #define S3C2412_NFCONT_LOCKTIGHT (1<<17) | ||
92 | #define S3C2412_NFCONT_SOFTLOCK (1<<16) | ||
93 | #define S3C2412_NFCONT_ECC4_ENCINT (1<<13) | ||
94 | #define S3C2412_NFCONT_ECC4_DECINT (1<<12) | ||
95 | #define S3C2412_NFCONT_MAIN_ECC_LOCK (1<<7) | ||
96 | #define S3C2412_NFCONT_INIT_MAIN_ECC (1<<5) | ||
97 | #define S3C2412_NFCONT_nFCE1 (1<<2) | ||
98 | #define S3C2412_NFCONT_nFCE0 (1<<1) | ||
99 | |||
100 | #define S3C2412_NFSTAT_ECC_ENCDONE (1<<7) | ||
101 | #define S3C2412_NFSTAT_ECC_DECDONE (1<<6) | ||
102 | #define S3C2412_NFSTAT_ILLEGAL_ACCESS (1<<5) | ||
103 | #define S3C2412_NFSTAT_RnB_CHANGE (1<<4) | ||
104 | #define S3C2412_NFSTAT_nFCE1 (1<<3) | ||
105 | #define S3C2412_NFSTAT_nFCE0 (1<<2) | ||
106 | #define S3C2412_NFSTAT_Res1 (1<<1) | ||
107 | #define S3C2412_NFSTAT_READY (1<<0) | ||
108 | |||
109 | #define S3C2412_NFECCERR_SERRDATA(x) (((x) >> 21) & 0xf) | ||
110 | #define S3C2412_NFECCERR_SERRBIT(x) (((x) >> 18) & 0x7) | ||
111 | #define S3C2412_NFECCERR_MERRDATA(x) (((x) >> 7) & 0x3ff) | ||
112 | #define S3C2412_NFECCERR_MERRBIT(x) (((x) >> 4) & 0x7) | ||
113 | #define S3C2412_NFECCERR_SPARE_ERR(x) (((x) >> 2) & 0x3) | ||
114 | #define S3C2412_NFECCERR_MAIN_ERR(x) (((x) >> 2) & 0x3) | ||
115 | #define S3C2412_NFECCERR_NONE (0) | ||
116 | #define S3C2412_NFECCERR_1BIT (1) | ||
117 | #define S3C2412_NFECCERR_MULTIBIT (2) | ||
118 | #define S3C2412_NFECCERR_ECCAREA (3) | ||
119 | |||
120 | |||
121 | |||
122 | #endif /* __ASM_ARM_REGS_NAND */ | ||
123 | |||
diff --git a/include/asm-arm/plat-s3c/regs-rtc.h b/include/asm-arm/plat-s3c/regs-rtc.h deleted file mode 100644 index d5837cf8e402..000000000000 --- a/include/asm-arm/plat-s3c/regs-rtc.h +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-rtc.h | ||
2 | * | ||
3 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2410 Internal RTC register definition | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_RTC_H | ||
14 | #define __ASM_ARCH_REGS_RTC_H __FILE__ | ||
15 | |||
16 | #define S3C2410_RTCREG(x) (x) | ||
17 | |||
18 | #define S3C2410_RTCCON S3C2410_RTCREG(0x40) | ||
19 | #define S3C2410_RTCCON_RTCEN (1<<0) | ||
20 | #define S3C2410_RTCCON_CLKSEL (1<<1) | ||
21 | #define S3C2410_RTCCON_CNTSEL (1<<2) | ||
22 | #define S3C2410_RTCCON_CLKRST (1<<3) | ||
23 | |||
24 | #define S3C2410_TICNT S3C2410_RTCREG(0x44) | ||
25 | #define S3C2410_TICNT_ENABLE (1<<7) | ||
26 | |||
27 | #define S3C2410_RTCALM S3C2410_RTCREG(0x50) | ||
28 | #define S3C2410_RTCALM_ALMEN (1<<6) | ||
29 | #define S3C2410_RTCALM_YEAREN (1<<5) | ||
30 | #define S3C2410_RTCALM_MONEN (1<<4) | ||
31 | #define S3C2410_RTCALM_DAYEN (1<<3) | ||
32 | #define S3C2410_RTCALM_HOUREN (1<<2) | ||
33 | #define S3C2410_RTCALM_MINEN (1<<1) | ||
34 | #define S3C2410_RTCALM_SECEN (1<<0) | ||
35 | |||
36 | #define S3C2410_RTCALM_ALL \ | ||
37 | S3C2410_RTCALM_ALMEN | S3C2410_RTCALM_YEAREN | S3C2410_RTCALM_MONEN |\ | ||
38 | S3C2410_RTCALM_DAYEN | S3C2410_RTCALM_HOUREN | S3C2410_RTCALM_MINEN |\ | ||
39 | S3C2410_RTCALM_SECEN | ||
40 | |||
41 | |||
42 | #define S3C2410_ALMSEC S3C2410_RTCREG(0x54) | ||
43 | #define S3C2410_ALMMIN S3C2410_RTCREG(0x58) | ||
44 | #define S3C2410_ALMHOUR S3C2410_RTCREG(0x5c) | ||
45 | |||
46 | #define S3C2410_ALMDATE S3C2410_RTCREG(0x60) | ||
47 | #define S3C2410_ALMMON S3C2410_RTCREG(0x64) | ||
48 | #define S3C2410_ALMYEAR S3C2410_RTCREG(0x68) | ||
49 | |||
50 | #define S3C2410_RTCRST S3C2410_RTCREG(0x6c) | ||
51 | |||
52 | #define S3C2410_RTCSEC S3C2410_RTCREG(0x70) | ||
53 | #define S3C2410_RTCMIN S3C2410_RTCREG(0x74) | ||
54 | #define S3C2410_RTCHOUR S3C2410_RTCREG(0x78) | ||
55 | #define S3C2410_RTCDATE S3C2410_RTCREG(0x7c) | ||
56 | #define S3C2410_RTCDAY S3C2410_RTCREG(0x80) | ||
57 | #define S3C2410_RTCMON S3C2410_RTCREG(0x84) | ||
58 | #define S3C2410_RTCYEAR S3C2410_RTCREG(0x88) | ||
59 | |||
60 | |||
61 | #endif /* __ASM_ARCH_REGS_RTC_H */ | ||
diff --git a/include/asm-arm/plat-s3c/regs-watchdog.h b/include/asm-arm/plat-s3c/regs-watchdog.h deleted file mode 100644 index 4938492470f7..000000000000 --- a/include/asm-arm/plat-s3c/regs-watchdog.h +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-watchdog.h | ||
2 | * | ||
3 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2410 Watchdog timer control | ||
11 | */ | ||
12 | |||
13 | |||
14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H | ||
15 | #define __ASM_ARCH_REGS_WATCHDOG_H | ||
16 | |||
17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) | ||
18 | |||
19 | #define S3C2410_WTCON S3C_WDOGREG(0x00) | ||
20 | #define S3C2410_WTDAT S3C_WDOGREG(0x04) | ||
21 | #define S3C2410_WTCNT S3C_WDOGREG(0x08) | ||
22 | |||
23 | /* the watchdog can either generate a reset pulse, or an | ||
24 | * interrupt. | ||
25 | */ | ||
26 | |||
27 | #define S3C2410_WTCON_RSTEN (0x01) | ||
28 | #define S3C2410_WTCON_INTEN (1<<2) | ||
29 | #define S3C2410_WTCON_ENABLE (1<<5) | ||
30 | |||
31 | #define S3C2410_WTCON_DIV16 (0<<3) | ||
32 | #define S3C2410_WTCON_DIV32 (1<<3) | ||
33 | #define S3C2410_WTCON_DIV64 (2<<3) | ||
34 | #define S3C2410_WTCON_DIV128 (3<<3) | ||
35 | |||
36 | #define S3C2410_WTCON_PRESCALE(x) ((x) << 8) | ||
37 | #define S3C2410_WTCON_PRESCALE_MASK (0xff00) | ||
38 | |||
39 | #endif /* __ASM_ARCH_REGS_WATCHDOG_H */ | ||
40 | |||
41 | |||
diff --git a/include/asm-arm/plat-s3c24xx/mci.h b/include/asm-arm/plat-s3c24xx/mci.h deleted file mode 100644 index 2d0852ac3b27..000000000000 --- a/include/asm-arm/plat-s3c24xx/mci.h +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | #ifndef _ARCH_MCI_H | ||
2 | #define _ARCH_MCI_H | ||
3 | |||
4 | struct s3c24xx_mci_pdata { | ||
5 | unsigned int wprotect_invert : 1; | ||
6 | unsigned int detect_invert : 1; /* set => detect active high. */ | ||
7 | |||
8 | unsigned int gpio_detect; | ||
9 | unsigned int gpio_wprotect; | ||
10 | unsigned long ocr_avail; | ||
11 | void (*set_power)(unsigned char power_mode, | ||
12 | unsigned short vdd); | ||
13 | }; | ||
14 | |||
15 | #endif /* _ARCH_NCI_H */ | ||
diff --git a/include/asm-arm/plat-s3c24xx/regs-spi.h b/include/asm-arm/plat-s3c24xx/regs-spi.h deleted file mode 100644 index 2b35479ee35c..000000000000 --- a/include/asm-arm/plat-s3c24xx/regs-spi.h +++ /dev/null | |||
@@ -1,82 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-spi.h | ||
2 | * | ||
3 | * Copyright (c) 2004 Fetron GmbH | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * S3C2410 SPI register definition | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_ARCH_REGS_SPI_H | ||
13 | #define __ASM_ARCH_REGS_SPI_H | ||
14 | |||
15 | #define S3C2410_SPI1 (0x20) | ||
16 | #define S3C2412_SPI1 (0x100) | ||
17 | |||
18 | #define S3C2410_SPCON (0x00) | ||
19 | |||
20 | #define S3C2412_SPCON_RXFIFO_RB2 (0<<14) | ||
21 | #define S3C2412_SPCON_RXFIFO_RB4 (1<<14) | ||
22 | #define S3C2412_SPCON_RXFIFO_RB12 (2<<14) | ||
23 | #define S3C2412_SPCON_RXFIFO_RB14 (3<<14) | ||
24 | #define S3C2412_SPCON_TXFIFO_RB2 (0<<12) | ||
25 | #define S3C2412_SPCON_TXFIFO_RB4 (1<<12) | ||
26 | #define S3C2412_SPCON_TXFIFO_RB12 (2<<12) | ||
27 | #define S3C2412_SPCON_TXFIFO_RB14 (3<<12) | ||
28 | #define S3C2412_SPCON_RXFIFO_RESET (1<<11) /* RxFIFO reset */ | ||
29 | #define S3C2412_SPCON_TXFIFO_RESET (1<<10) /* TxFIFO reset */ | ||
30 | #define S3C2412_SPCON_RXFIFO_EN (1<<9) /* RxFIFO Enable */ | ||
31 | #define S3C2412_SPCON_TXFIFO_EN (1<<8) /* TxFIFO Enable */ | ||
32 | |||
33 | #define S3C2412_SPCON_DIRC_RX (1<<7) | ||
34 | |||
35 | #define S3C2410_SPCON_SMOD_DMA (2<<5) /* DMA mode */ | ||
36 | #define S3C2410_SPCON_SMOD_INT (1<<5) /* interrupt mode */ | ||
37 | #define S3C2410_SPCON_SMOD_POLL (0<<5) /* polling mode */ | ||
38 | #define S3C2410_SPCON_ENSCK (1<<4) /* Enable SCK */ | ||
39 | #define S3C2410_SPCON_MSTR (1<<3) /* Master/Slave select | ||
40 | 0: slave, 1: master */ | ||
41 | #define S3C2410_SPCON_CPOL_HIGH (1<<2) /* Clock polarity select */ | ||
42 | #define S3C2410_SPCON_CPOL_LOW (0<<2) /* Clock polarity select */ | ||
43 | |||
44 | #define S3C2410_SPCON_CPHA_FMTB (1<<1) /* Clock Phase Select */ | ||
45 | #define S3C2410_SPCON_CPHA_FMTA (0<<1) /* Clock Phase Select */ | ||
46 | |||
47 | #define S3C2410_SPCON_TAGD (1<<0) /* Tx auto garbage data mode */ | ||
48 | |||
49 | |||
50 | #define S3C2410_SPSTA (0x04) | ||
51 | |||
52 | #define S3C2412_SPSTA_RXFIFO_AE (1<<11) | ||
53 | #define S3C2412_SPSTA_TXFIFO_AE (1<<10) | ||
54 | #define S3C2412_SPSTA_RXFIFO_ERROR (1<<9) | ||
55 | #define S3C2412_SPSTA_TXFIFO_ERROR (1<<8) | ||
56 | #define S3C2412_SPSTA_RXFIFO_FIFO (1<<7) | ||
57 | #define S3C2412_SPSTA_RXFIFO_EMPTY (1<<6) | ||
58 | #define S3C2412_SPSTA_TXFIFO_NFULL (1<<5) | ||
59 | #define S3C2412_SPSTA_TXFIFO_EMPTY (1<<4) | ||
60 | |||
61 | #define S3C2410_SPSTA_DCOL (1<<2) /* Data Collision Error */ | ||
62 | #define S3C2410_SPSTA_MULD (1<<1) /* Multi Master Error */ | ||
63 | #define S3C2410_SPSTA_READY (1<<0) /* Data Tx/Rx ready */ | ||
64 | #define S3C2412_SPSTA_READY_ORG (1<<3) | ||
65 | |||
66 | #define S3C2410_SPPIN (0x08) | ||
67 | |||
68 | #define S3C2410_SPPIN_ENMUL (1<<2) /* Multi Master Error detect */ | ||
69 | #define S3C2410_SPPIN_RESERVED (1<<1) | ||
70 | #define S3C2400_SPPIN_nCS (1<<1) /* SPI Card Select */ | ||
71 | #define S3C2410_SPPIN_KEEP (1<<0) /* Master Out keep */ | ||
72 | |||
73 | #define S3C2410_SPPRE (0x0C) | ||
74 | #define S3C2410_SPTDAT (0x10) | ||
75 | #define S3C2410_SPRDAT (0x14) | ||
76 | |||
77 | #define S3C2412_TXFIFO (0x18) | ||
78 | #define S3C2412_RXFIFO (0x18) | ||
79 | #define S3C2412_SPFIC (0x24) | ||
80 | |||
81 | |||
82 | #endif /* __ASM_ARCH_REGS_SPI_H */ | ||
diff --git a/include/asm-arm/plat-s3c24xx/regs-udc.h b/include/asm-arm/plat-s3c24xx/regs-udc.h deleted file mode 100644 index f0dd4a41b37b..000000000000 --- a/include/asm-arm/plat-s3c24xx/regs-udc.h +++ /dev/null | |||
@@ -1,153 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-udc.h | ||
2 | * | ||
3 | * Copyright (C) 2004 Herbert Poetzl <herbert@13thfloor.at> | ||
4 | * | ||
5 | * This include file is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License as | ||
7 | * published by the Free Software Foundation; either version 2 of | ||
8 | * the License, or (at your option) any later version. | ||
9 | */ | ||
10 | |||
11 | #ifndef __ASM_ARCH_REGS_UDC_H | ||
12 | #define __ASM_ARCH_REGS_UDC_H | ||
13 | |||
14 | #define S3C2410_USBDREG(x) (x) | ||
15 | |||
16 | #define S3C2410_UDC_FUNC_ADDR_REG S3C2410_USBDREG(0x0140) | ||
17 | #define S3C2410_UDC_PWR_REG S3C2410_USBDREG(0x0144) | ||
18 | #define S3C2410_UDC_EP_INT_REG S3C2410_USBDREG(0x0148) | ||
19 | |||
20 | #define S3C2410_UDC_USB_INT_REG S3C2410_USBDREG(0x0158) | ||
21 | #define S3C2410_UDC_EP_INT_EN_REG S3C2410_USBDREG(0x015c) | ||
22 | |||
23 | #define S3C2410_UDC_USB_INT_EN_REG S3C2410_USBDREG(0x016c) | ||
24 | |||
25 | #define S3C2410_UDC_FRAME_NUM1_REG S3C2410_USBDREG(0x0170) | ||
26 | #define S3C2410_UDC_FRAME_NUM2_REG S3C2410_USBDREG(0x0174) | ||
27 | |||
28 | #define S3C2410_UDC_EP0_FIFO_REG S3C2410_USBDREG(0x01c0) | ||
29 | #define S3C2410_UDC_EP1_FIFO_REG S3C2410_USBDREG(0x01c4) | ||
30 | #define S3C2410_UDC_EP2_FIFO_REG S3C2410_USBDREG(0x01c8) | ||
31 | #define S3C2410_UDC_EP3_FIFO_REG S3C2410_USBDREG(0x01cc) | ||
32 | #define S3C2410_UDC_EP4_FIFO_REG S3C2410_USBDREG(0x01d0) | ||
33 | |||
34 | #define S3C2410_UDC_EP1_DMA_CON S3C2410_USBDREG(0x0200) | ||
35 | #define S3C2410_UDC_EP1_DMA_UNIT S3C2410_USBDREG(0x0204) | ||
36 | #define S3C2410_UDC_EP1_DMA_FIFO S3C2410_USBDREG(0x0208) | ||
37 | #define S3C2410_UDC_EP1_DMA_TTC_L S3C2410_USBDREG(0x020c) | ||
38 | #define S3C2410_UDC_EP1_DMA_TTC_M S3C2410_USBDREG(0x0210) | ||
39 | #define S3C2410_UDC_EP1_DMA_TTC_H S3C2410_USBDREG(0x0214) | ||
40 | |||
41 | #define S3C2410_UDC_EP2_DMA_CON S3C2410_USBDREG(0x0218) | ||
42 | #define S3C2410_UDC_EP2_DMA_UNIT S3C2410_USBDREG(0x021c) | ||
43 | #define S3C2410_UDC_EP2_DMA_FIFO S3C2410_USBDREG(0x0220) | ||
44 | #define S3C2410_UDC_EP2_DMA_TTC_L S3C2410_USBDREG(0x0224) | ||
45 | #define S3C2410_UDC_EP2_DMA_TTC_M S3C2410_USBDREG(0x0228) | ||
46 | #define S3C2410_UDC_EP2_DMA_TTC_H S3C2410_USBDREG(0x022c) | ||
47 | |||
48 | #define S3C2410_UDC_EP3_DMA_CON S3C2410_USBDREG(0x0240) | ||
49 | #define S3C2410_UDC_EP3_DMA_UNIT S3C2410_USBDREG(0x0244) | ||
50 | #define S3C2410_UDC_EP3_DMA_FIFO S3C2410_USBDREG(0x0248) | ||
51 | #define S3C2410_UDC_EP3_DMA_TTC_L S3C2410_USBDREG(0x024c) | ||
52 | #define S3C2410_UDC_EP3_DMA_TTC_M S3C2410_USBDREG(0x0250) | ||
53 | #define S3C2410_UDC_EP3_DMA_TTC_H S3C2410_USBDREG(0x0254) | ||
54 | |||
55 | #define S3C2410_UDC_EP4_DMA_CON S3C2410_USBDREG(0x0258) | ||
56 | #define S3C2410_UDC_EP4_DMA_UNIT S3C2410_USBDREG(0x025c) | ||
57 | #define S3C2410_UDC_EP4_DMA_FIFO S3C2410_USBDREG(0x0260) | ||
58 | #define S3C2410_UDC_EP4_DMA_TTC_L S3C2410_USBDREG(0x0264) | ||
59 | #define S3C2410_UDC_EP4_DMA_TTC_M S3C2410_USBDREG(0x0268) | ||
60 | #define S3C2410_UDC_EP4_DMA_TTC_H S3C2410_USBDREG(0x026c) | ||
61 | |||
62 | #define S3C2410_UDC_INDEX_REG S3C2410_USBDREG(0x0178) | ||
63 | |||
64 | /* indexed registers */ | ||
65 | |||
66 | #define S3C2410_UDC_MAXP_REG S3C2410_USBDREG(0x0180) | ||
67 | |||
68 | #define S3C2410_UDC_EP0_CSR_REG S3C2410_USBDREG(0x0184) | ||
69 | |||
70 | #define S3C2410_UDC_IN_CSR1_REG S3C2410_USBDREG(0x0184) | ||
71 | #define S3C2410_UDC_IN_CSR2_REG S3C2410_USBDREG(0x0188) | ||
72 | |||
73 | #define S3C2410_UDC_OUT_CSR1_REG S3C2410_USBDREG(0x0190) | ||
74 | #define S3C2410_UDC_OUT_CSR2_REG S3C2410_USBDREG(0x0194) | ||
75 | #define S3C2410_UDC_OUT_FIFO_CNT1_REG S3C2410_USBDREG(0x0198) | ||
76 | #define S3C2410_UDC_OUT_FIFO_CNT2_REG S3C2410_USBDREG(0x019c) | ||
77 | |||
78 | #define S3C2410_UDC_FUNCADDR_UPDATE (1<<7) | ||
79 | |||
80 | #define S3C2410_UDC_PWR_ISOUP (1<<7) // R/W | ||
81 | #define S3C2410_UDC_PWR_RESET (1<<3) // R | ||
82 | #define S3C2410_UDC_PWR_RESUME (1<<2) // R/W | ||
83 | #define S3C2410_UDC_PWR_SUSPEND (1<<1) // R | ||
84 | #define S3C2410_UDC_PWR_ENSUSPEND (1<<0) // R/W | ||
85 | |||
86 | #define S3C2410_UDC_PWR_DEFAULT 0x00 | ||
87 | |||
88 | #define S3C2410_UDC_INT_EP4 (1<<4) // R/W (clear only) | ||
89 | #define S3C2410_UDC_INT_EP3 (1<<3) // R/W (clear only) | ||
90 | #define S3C2410_UDC_INT_EP2 (1<<2) // R/W (clear only) | ||
91 | #define S3C2410_UDC_INT_EP1 (1<<1) // R/W (clear only) | ||
92 | #define S3C2410_UDC_INT_EP0 (1<<0) // R/W (clear only) | ||
93 | |||
94 | #define S3C2410_UDC_USBINT_RESET (1<<2) // R/W (clear only) | ||
95 | #define S3C2410_UDC_USBINT_RESUME (1<<1) // R/W (clear only) | ||
96 | #define S3C2410_UDC_USBINT_SUSPEND (1<<0) // R/W (clear only) | ||
97 | |||
98 | #define S3C2410_UDC_INTE_EP4 (1<<4) // R/W | ||
99 | #define S3C2410_UDC_INTE_EP3 (1<<3) // R/W | ||
100 | #define S3C2410_UDC_INTE_EP2 (1<<2) // R/W | ||
101 | #define S3C2410_UDC_INTE_EP1 (1<<1) // R/W | ||
102 | #define S3C2410_UDC_INTE_EP0 (1<<0) // R/W | ||
103 | |||
104 | #define S3C2410_UDC_USBINTE_RESET (1<<2) // R/W | ||
105 | #define S3C2410_UDC_USBINTE_SUSPEND (1<<0) // R/W | ||
106 | |||
107 | |||
108 | #define S3C2410_UDC_INDEX_EP0 (0x00) | ||
109 | #define S3C2410_UDC_INDEX_EP1 (0x01) // ?? | ||
110 | #define S3C2410_UDC_INDEX_EP2 (0x02) // ?? | ||
111 | #define S3C2410_UDC_INDEX_EP3 (0x03) // ?? | ||
112 | #define S3C2410_UDC_INDEX_EP4 (0x04) // ?? | ||
113 | |||
114 | #define S3C2410_UDC_ICSR1_CLRDT (1<<6) // R/W | ||
115 | #define S3C2410_UDC_ICSR1_SENTSTL (1<<5) // R/W (clear only) | ||
116 | #define S3C2410_UDC_ICSR1_SENDSTL (1<<4) // R/W | ||
117 | #define S3C2410_UDC_ICSR1_FFLUSH (1<<3) // W (set only) | ||
118 | #define S3C2410_UDC_ICSR1_UNDRUN (1<<2) // R/W (clear only) | ||
119 | #define S3C2410_UDC_ICSR1_PKTRDY (1<<0) // R/W (set only) | ||
120 | |||
121 | #define S3C2410_UDC_ICSR2_AUTOSET (1<<7) // R/W | ||
122 | #define S3C2410_UDC_ICSR2_ISO (1<<6) // R/W | ||
123 | #define S3C2410_UDC_ICSR2_MODEIN (1<<5) // R/W | ||
124 | #define S3C2410_UDC_ICSR2_DMAIEN (1<<4) // R/W | ||
125 | |||
126 | #define S3C2410_UDC_OCSR1_CLRDT (1<<7) // R/W | ||
127 | #define S3C2410_UDC_OCSR1_SENTSTL (1<<6) // R/W (clear only) | ||
128 | #define S3C2410_UDC_OCSR1_SENDSTL (1<<5) // R/W | ||
129 | #define S3C2410_UDC_OCSR1_FFLUSH (1<<4) // R/W | ||
130 | #define S3C2410_UDC_OCSR1_DERROR (1<<3) // R | ||
131 | #define S3C2410_UDC_OCSR1_OVRRUN (1<<2) // R/W (clear only) | ||
132 | #define S3C2410_UDC_OCSR1_PKTRDY (1<<0) // R/W (clear only) | ||
133 | |||
134 | #define S3C2410_UDC_OCSR2_AUTOCLR (1<<7) // R/W | ||
135 | #define S3C2410_UDC_OCSR2_ISO (1<<6) // R/W | ||
136 | #define S3C2410_UDC_OCSR2_DMAIEN (1<<5) // R/W | ||
137 | |||
138 | #define S3C2410_UDC_EP0_CSR_OPKRDY (1<<0) | ||
139 | #define S3C2410_UDC_EP0_CSR_IPKRDY (1<<1) | ||
140 | #define S3C2410_UDC_EP0_CSR_SENTSTL (1<<2) | ||
141 | #define S3C2410_UDC_EP0_CSR_DE (1<<3) | ||
142 | #define S3C2410_UDC_EP0_CSR_SE (1<<4) | ||
143 | #define S3C2410_UDC_EP0_CSR_SENDSTL (1<<5) | ||
144 | #define S3C2410_UDC_EP0_CSR_SOPKTRDY (1<<6) | ||
145 | #define S3C2410_UDC_EP0_CSR_SSE (1<<7) | ||
146 | |||
147 | #define S3C2410_UDC_MAXP_8 (1<<0) | ||
148 | #define S3C2410_UDC_MAXP_16 (1<<1) | ||
149 | #define S3C2410_UDC_MAXP_32 (1<<2) | ||
150 | #define S3C2410_UDC_MAXP_64 (1<<3) | ||
151 | |||
152 | |||
153 | #endif | ||
diff --git a/include/asm-arm/plat-s3c24xx/udc.h b/include/asm-arm/plat-s3c24xx/udc.h deleted file mode 100644 index 546bb4008f49..000000000000 --- a/include/asm-arm/plat-s3c24xx/udc.h +++ /dev/null | |||
@@ -1,36 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/udc.h | ||
2 | * | ||
3 | * Copyright (c) 2005 Arnaud Patard <arnaud.patard@rtp-net.org> | ||
4 | * | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * | ||
11 | * Changelog: | ||
12 | * 14-Mar-2005 RTP Created file | ||
13 | * 02-Aug-2005 RTP File rename | ||
14 | * 07-Sep-2005 BJD Minor cleanups, changed cmd to enum | ||
15 | * 18-Jan-2007 HMW Add per-platform vbus_draw function | ||
16 | */ | ||
17 | |||
18 | #ifndef __ASM_ARM_ARCH_UDC_H | ||
19 | #define __ASM_ARM_ARCH_UDC_H | ||
20 | |||
21 | enum s3c2410_udc_cmd_e { | ||
22 | S3C2410_UDC_P_ENABLE = 1, /* Pull-up enable */ | ||
23 | S3C2410_UDC_P_DISABLE = 2, /* Pull-up disable */ | ||
24 | S3C2410_UDC_P_RESET = 3, /* UDC reset, in case of */ | ||
25 | }; | ||
26 | |||
27 | struct s3c2410_udc_mach_info { | ||
28 | void (*udc_command)(enum s3c2410_udc_cmd_e); | ||
29 | void (*vbus_draw)(unsigned int ma); | ||
30 | unsigned int vbus_pin; | ||
31 | unsigned char vbus_pin_inverted; | ||
32 | }; | ||
33 | |||
34 | extern void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *); | ||
35 | |||
36 | #endif /* __ASM_ARM_ARCH_UDC_H */ | ||
diff --git a/include/asm-frv/Kbuild b/include/asm-frv/Kbuild index 0f8956def738..1f44e7c76995 100644 --- a/include/asm-frv/Kbuild +++ b/include/asm-frv/Kbuild | |||
@@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm | |||
3 | header-y += registers.h | 3 | header-y += registers.h |
4 | 4 | ||
5 | unifdef-y += termios.h | 5 | unifdef-y += termios.h |
6 | unifdef-y += swab.h | ||
diff --git a/include/asm-frv/atomic.h b/include/asm-frv/atomic.h index 46d696b331e7..296c35cfb207 100644 --- a/include/asm-frv/atomic.h +++ b/include/asm-frv/atomic.h | |||
@@ -35,10 +35,6 @@ | |||
35 | #define smp_mb__before_atomic_inc() barrier() | 35 | #define smp_mb__before_atomic_inc() barrier() |
36 | #define smp_mb__after_atomic_inc() barrier() | 36 | #define smp_mb__after_atomic_inc() barrier() |
37 | 37 | ||
38 | typedef struct { | ||
39 | int counter; | ||
40 | } atomic_t; | ||
41 | |||
42 | #define ATOMIC_INIT(i) { (i) } | 38 | #define ATOMIC_INIT(i) { (i) } |
43 | #define atomic_read(v) ((v)->counter) | 39 | #define atomic_read(v) ((v)->counter) |
44 | #define atomic_set(v, i) (((v)->counter) = (i)) | 40 | #define atomic_set(v, i) (((v)->counter) = (i)) |
diff --git a/include/asm-frv/bitops.h b/include/asm-frv/bitops.h index 39456ba0ec17..287f6f697ce2 100644 --- a/include/asm-frv/bitops.h +++ b/include/asm-frv/bitops.h | |||
@@ -339,6 +339,19 @@ int __ffs(unsigned long x) | |||
339 | return 31 - bit; | 339 | return 31 - bit; |
340 | } | 340 | } |
341 | 341 | ||
342 | /** | ||
343 | * __fls - find last (most-significant) set bit in a long word | ||
344 | * @word: the word to search | ||
345 | * | ||
346 | * Undefined if no set bit exists, so code should check against 0 first. | ||
347 | */ | ||
348 | static inline unsigned long __fls(unsigned long word) | ||
349 | { | ||
350 | unsigned long bit; | ||
351 | asm("scan %1,gr0,%0" : "=r"(bit) : "r"(word)); | ||
352 | return bit; | ||
353 | } | ||
354 | |||
342 | /* | 355 | /* |
343 | * special slimline version of fls() for calculating ilog2_u32() | 356 | * special slimline version of fls() for calculating ilog2_u32() |
344 | * - note: no protection against n == 0 | 357 | * - note: no protection against n == 0 |
diff --git a/include/asm-frv/byteorder.h b/include/asm-frv/byteorder.h index 411bec3cc1fc..1187e51ecd13 100644 --- a/include/asm-frv/byteorder.h +++ b/include/asm-frv/byteorder.h | |||
@@ -1,13 +1,7 @@ | |||
1 | #ifndef _ASM_BYTEORDER_H | 1 | #ifndef _ASM_BYTEORDER_H |
2 | #define _ASM_BYTEORDER_H | 2 | #define _ASM_BYTEORDER_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm/swab.h> |
5 | |||
6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
7 | # define __BYTEORDER_HAS_U64__ | ||
8 | # define __SWAB_64_THRU_32__ | ||
9 | #endif | ||
10 | |||
11 | #include <linux/byteorder/big_endian.h> | 5 | #include <linux/byteorder/big_endian.h> |
12 | 6 | ||
13 | #endif /* _ASM_BYTEORDER_H */ | 7 | #endif /* _ASM_BYTEORDER_H */ |
diff --git a/include/asm-frv/mmu.h b/include/asm-frv/mmu.h index 22c03714fb14..86ca0e86e7d2 100644 --- a/include/asm-frv/mmu.h +++ b/include/asm-frv/mmu.h | |||
@@ -22,7 +22,6 @@ typedef struct { | |||
22 | unsigned long dtlb_ptd_mapping; /* [DAMR5] PTD mapping for dtlb cached PGE */ | 22 | unsigned long dtlb_ptd_mapping; /* [DAMR5] PTD mapping for dtlb cached PGE */ |
23 | 23 | ||
24 | #else | 24 | #else |
25 | struct vm_list_struct *vmlist; | ||
26 | unsigned long end_brk; | 25 | unsigned long end_brk; |
27 | 26 | ||
28 | #endif | 27 | #endif |
diff --git a/include/asm-frv/swab.h b/include/asm-frv/swab.h new file mode 100644 index 000000000000..afb3396ba5ed --- /dev/null +++ b/include/asm-frv/swab.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef _ASM_SWAB_H | ||
2 | #define _ASM_SWAB_H | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
7 | # define __SWAB_64_THRU_32__ | ||
8 | #endif | ||
9 | |||
10 | #endif /* _ASM_SWAB_H */ | ||
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 4c794d73fb84..37b82cb96c89 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h | |||
@@ -28,6 +28,17 @@ struct bug_entry { | |||
28 | #define BUGFLAG_WARNING (1<<0) | 28 | #define BUGFLAG_WARNING (1<<0) |
29 | #endif /* CONFIG_GENERIC_BUG */ | 29 | #endif /* CONFIG_GENERIC_BUG */ |
30 | 30 | ||
31 | /* | ||
32 | * Don't use BUG() or BUG_ON() unless there's really no way out; one | ||
33 | * example might be detecting data structure corruption in the middle | ||
34 | * of an operation that can't be backed out of. If the (sub)system | ||
35 | * can somehow continue operating, perhaps with reduced functionality, | ||
36 | * it's probably not BUG-worthy. | ||
37 | * | ||
38 | * If you're tempted to BUG(), think again: is completely giving up | ||
39 | * really the *only* solution? There are usually better options, where | ||
40 | * users don't need to reboot ASAP and can mostly shut down cleanly. | ||
41 | */ | ||
31 | #ifndef HAVE_ARCH_BUG | 42 | #ifndef HAVE_ARCH_BUG |
32 | #define BUG() do { \ | 43 | #define BUG() do { \ |
33 | printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ | 44 | printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ |
@@ -39,17 +50,22 @@ struct bug_entry { | |||
39 | #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) | 50 | #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0) |
40 | #endif | 51 | #endif |
41 | 52 | ||
53 | /* | ||
54 | * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report | ||
55 | * significant issues that need prompt attention if they should ever | ||
56 | * appear at runtime. Use the versions with printk format strings | ||
57 | * to provide better diagnostics. | ||
58 | */ | ||
42 | #ifndef __WARN | 59 | #ifndef __WARN |
43 | #ifndef __ASSEMBLY__ | 60 | #ifndef __ASSEMBLY__ |
44 | extern void warn_on_slowpath(const char *file, const int line); | ||
45 | extern void warn_slowpath(const char *file, const int line, | 61 | extern void warn_slowpath(const char *file, const int line, |
46 | const char *fmt, ...) __attribute__((format(printf, 3, 4))); | 62 | const char *fmt, ...) __attribute__((format(printf, 3, 4))); |
47 | #define WANT_WARN_ON_SLOWPATH | 63 | #define WANT_WARN_ON_SLOWPATH |
48 | #endif | 64 | #endif |
49 | #define __WARN() warn_on_slowpath(__FILE__, __LINE__) | 65 | #define __WARN() warn_slowpath(__FILE__, __LINE__, NULL) |
50 | #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) | 66 | #define __WARN_printf(arg...) warn_slowpath(__FILE__, __LINE__, arg) |
51 | #else | 67 | #else |
52 | #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) | 68 | #define __WARN_printf(arg...) do { printk(arg); __WARN(); } while (0) |
53 | #endif | 69 | #endif |
54 | 70 | ||
55 | #ifndef WARN_ON | 71 | #ifndef WARN_ON |
diff --git a/include/asm-generic/local.h b/include/asm-generic/local.h index 33d7d04e4119..dbd6150763e9 100644 --- a/include/asm-generic/local.h +++ b/include/asm-generic/local.h | |||
@@ -2,7 +2,6 @@ | |||
2 | #define _ASM_GENERIC_LOCAL_H | 2 | #define _ASM_GENERIC_LOCAL_H |
3 | 3 | ||
4 | #include <linux/percpu.h> | 4 | #include <linux/percpu.h> |
5 | #include <linux/hardirq.h> | ||
6 | #include <asm/atomic.h> | 5 | #include <asm/atomic.h> |
7 | #include <asm/types.h> | 6 | #include <asm/types.h> |
8 | 7 | ||
diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h index 36fa286adad5..4c8d0afae711 100644 --- a/include/asm-generic/memory_model.h +++ b/include/asm-generic/memory_model.h | |||
@@ -69,15 +69,8 @@ | |||
69 | }) | 69 | }) |
70 | #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ | 70 | #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ |
71 | 71 | ||
72 | #ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE | ||
73 | struct page; | ||
74 | /* this is useful when inlined pfn_to_page is too big */ | ||
75 | extern struct page *pfn_to_page(unsigned long pfn); | ||
76 | extern unsigned long page_to_pfn(struct page *page); | ||
77 | #else | ||
78 | #define page_to_pfn __page_to_pfn | 72 | #define page_to_pfn __page_to_pfn |
79 | #define pfn_to_page __pfn_to_page | 73 | #define pfn_to_page __pfn_to_page |
80 | #endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */ | ||
81 | 74 | ||
82 | #endif /* __ASSEMBLY__ */ | 75 | #endif /* __ASSEMBLY__ */ |
83 | 76 | ||
diff --git a/include/asm-generic/topology.h b/include/asm-generic/topology.h index 54bbf6e04ee8..0e9e2bc0ee96 100644 --- a/include/asm-generic/topology.h +++ b/include/asm-generic/topology.h | |||
@@ -40,6 +40,9 @@ | |||
40 | #ifndef node_to_cpumask | 40 | #ifndef node_to_cpumask |
41 | #define node_to_cpumask(node) ((void)node, cpu_online_map) | 41 | #define node_to_cpumask(node) ((void)node, cpu_online_map) |
42 | #endif | 42 | #endif |
43 | #ifndef cpumask_of_node | ||
44 | #define cpumask_of_node(node) ((void)node, cpu_online_mask) | ||
45 | #endif | ||
43 | #ifndef node_to_first_cpu | 46 | #ifndef node_to_first_cpu |
44 | #define node_to_first_cpu(node) ((void)(node),0) | 47 | #define node_to_first_cpu(node) ((void)(node),0) |
45 | #endif | 48 | #endif |
@@ -54,9 +57,18 @@ | |||
54 | ) | 57 | ) |
55 | #endif | 58 | #endif |
56 | 59 | ||
60 | #ifndef cpumask_of_pcibus | ||
61 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ | ||
62 | cpu_all_mask : \ | ||
63 | cpumask_of_node(pcibus_to_node(bus))) | ||
64 | #endif | ||
65 | |||
57 | #endif /* CONFIG_NUMA */ | 66 | #endif /* CONFIG_NUMA */ |
58 | 67 | ||
59 | /* returns pointer to cpumask for specified node */ | 68 | /* |
69 | * returns pointer to cpumask for specified node | ||
70 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" | ||
71 | */ | ||
60 | #ifndef node_to_cpumask_ptr | 72 | #ifndef node_to_cpumask_ptr |
61 | 73 | ||
62 | #define node_to_cpumask_ptr(v, node) \ | 74 | #define node_to_cpumask_ptr(v, node) \ |
diff --git a/include/asm-m32r/Kbuild b/include/asm-m32r/Kbuild index c68e1680da01..27b108a86b39 100644 --- a/include/asm-m32r/Kbuild +++ b/include/asm-m32r/Kbuild | |||
@@ -1 +1,2 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | unifdef-y += swab.h | ||
diff --git a/include/asm-m32r/atomic.h b/include/asm-m32r/atomic.h index 3a38ffe4a4f4..2eed30f84080 100644 --- a/include/asm-m32r/atomic.h +++ b/include/asm-m32r/atomic.h | |||
@@ -9,6 +9,7 @@ | |||
9 | * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org> | 9 | * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org> |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/types.h> | ||
12 | #include <asm/assembler.h> | 13 | #include <asm/assembler.h> |
13 | #include <asm/system.h> | 14 | #include <asm/system.h> |
14 | 15 | ||
@@ -17,13 +18,6 @@ | |||
17 | * resource counting etc.. | 18 | * resource counting etc.. |
18 | */ | 19 | */ |
19 | 20 | ||
20 | /* | ||
21 | * Make sure gcc doesn't try to be clever and move things around | ||
22 | * on us. We need to use _exactly_ the address the user gave us, | ||
23 | * not some alias that contains the same information. | ||
24 | */ | ||
25 | typedef struct { volatile int counter; } atomic_t; | ||
26 | |||
27 | #define ATOMIC_INIT(i) { (i) } | 21 | #define ATOMIC_INIT(i) { (i) } |
28 | 22 | ||
29 | /** | 23 | /** |
diff --git a/include/asm-m32r/bitops.h b/include/asm-m32r/bitops.h index 6dc9b81bf9f3..aaddf0d57603 100644 --- a/include/asm-m32r/bitops.h +++ b/include/asm-m32r/bitops.h | |||
@@ -251,6 +251,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr) | |||
251 | #include <asm-generic/bitops/ffz.h> | 251 | #include <asm-generic/bitops/ffz.h> |
252 | #include <asm-generic/bitops/__ffs.h> | 252 | #include <asm-generic/bitops/__ffs.h> |
253 | #include <asm-generic/bitops/fls.h> | 253 | #include <asm-generic/bitops/fls.h> |
254 | #include <asm-generic/bitops/__fls.h> | ||
254 | #include <asm-generic/bitops/fls64.h> | 255 | #include <asm-generic/bitops/fls64.h> |
255 | 256 | ||
256 | #ifdef __KERNEL__ | 257 | #ifdef __KERNEL__ |
diff --git a/include/asm-m32r/byteorder.h b/include/asm-m32r/byteorder.h index 10b2c1d11614..61ff9cfd8451 100644 --- a/include/asm-m32r/byteorder.h +++ b/include/asm-m32r/byteorder.h | |||
@@ -1,12 +1,7 @@ | |||
1 | #ifndef _ASM_M32R_BYTEORDER_H | 1 | #ifndef _ASM_M32R_BYTEORDER_H |
2 | #define _ASM_M32R_BYTEORDER_H | 2 | #define _ASM_M32R_BYTEORDER_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm/swab.h> |
5 | |||
6 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
7 | # define __BYTEORDER_HAS_U64__ | ||
8 | # define __SWAB_64_THRU_32__ | ||
9 | #endif | ||
10 | 5 | ||
11 | #if defined(__LITTLE_ENDIAN__) | 6 | #if defined(__LITTLE_ENDIAN__) |
12 | # include <linux/byteorder/little_endian.h> | 7 | # include <linux/byteorder/little_endian.h> |
diff --git a/include/asm-m32r/mmu.h b/include/asm-m32r/mmu.h index d9bd724479cf..150cb92bb666 100644 --- a/include/asm-m32r/mmu.h +++ b/include/asm-m32r/mmu.h | |||
@@ -4,7 +4,6 @@ | |||
4 | #if !defined(CONFIG_MMU) | 4 | #if !defined(CONFIG_MMU) |
5 | 5 | ||
6 | typedef struct { | 6 | typedef struct { |
7 | struct vm_list_struct *vmlist; | ||
8 | unsigned long end_brk; | 7 | unsigned long end_brk; |
9 | } mm_context_t; | 8 | } mm_context_t; |
10 | 9 | ||
diff --git a/include/asm-m32r/smp.h b/include/asm-m32r/smp.h index c5dd66916692..b96a6d2ffbc3 100644 --- a/include/asm-m32r/smp.h +++ b/include/asm-m32r/smp.h | |||
@@ -63,8 +63,6 @@ extern volatile int cpu_2_physid[NR_CPUS]; | |||
63 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 63 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
64 | 64 | ||
65 | extern cpumask_t cpu_callout_map; | 65 | extern cpumask_t cpu_callout_map; |
66 | extern cpumask_t cpu_possible_map; | ||
67 | extern cpumask_t cpu_present_map; | ||
68 | 66 | ||
69 | static __inline__ int hard_smp_processor_id(void) | 67 | static __inline__ int hard_smp_processor_id(void) |
70 | { | 68 | { |
diff --git a/include/asm-m32r/swab.h b/include/asm-m32r/swab.h new file mode 100644 index 000000000000..97973e101825 --- /dev/null +++ b/include/asm-m32r/swab.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef _ASM_M32R_SWAB_H | ||
2 | #define _ASM_M32R_SWAB_H | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
7 | # define __SWAB_64_THRU_32__ | ||
8 | #endif | ||
9 | |||
10 | #endif /* _ASM_M32R_SWAB_H */ | ||
diff --git a/include/asm-m68k/Kbuild b/include/asm-m68k/Kbuild index 1a922fad76f7..52fd96b4142a 100644 --- a/include/asm-m68k/Kbuild +++ b/include/asm-m68k/Kbuild | |||
@@ -1,2 +1,3 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | header-y += cachectl.h | 2 | header-y += cachectl.h |
3 | unifdef-y += swab.h | ||
diff --git a/include/asm-m68k/atomic.h b/include/asm-m68k/atomic.h index 4915294fea63..eb0ab9d4ee77 100644 --- a/include/asm-m68k/atomic.h +++ b/include/asm-m68k/atomic.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef __ARCH_M68K_ATOMIC__ | 1 | #ifndef __ARCH_M68K_ATOMIC__ |
2 | #define __ARCH_M68K_ATOMIC__ | 2 | #define __ARCH_M68K_ATOMIC__ |
3 | 3 | ||
4 | 4 | #include <linux/types.h> | |
5 | #include <asm/system.h> | 5 | #include <asm/system.h> |
6 | 6 | ||
7 | /* | 7 | /* |
@@ -13,7 +13,6 @@ | |||
13 | * We do not have SMP m68k systems, so we don't have to deal with that. | 13 | * We do not have SMP m68k systems, so we don't have to deal with that. |
14 | */ | 14 | */ |
15 | 15 | ||
16 | typedef struct { int counter; } atomic_t; | ||
17 | #define ATOMIC_INIT(i) { (i) } | 16 | #define ATOMIC_INIT(i) { (i) } |
18 | 17 | ||
19 | #define atomic_read(v) ((v)->counter) | 18 | #define atomic_read(v) ((v)->counter) |
diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h index 3e8106442d5a..9bde784e7bad 100644 --- a/include/asm-m68k/bitops.h +++ b/include/asm-m68k/bitops.h | |||
@@ -315,6 +315,11 @@ static inline int fls(int x) | |||
315 | return 32 - cnt; | 315 | return 32 - cnt; |
316 | } | 316 | } |
317 | 317 | ||
318 | static inline int __fls(int x) | ||
319 | { | ||
320 | return fls(x) - 1; | ||
321 | } | ||
322 | |||
318 | #include <asm-generic/bitops/fls64.h> | 323 | #include <asm-generic/bitops/fls64.h> |
319 | #include <asm-generic/bitops/sched.h> | 324 | #include <asm-generic/bitops/sched.h> |
320 | #include <asm-generic/bitops/hweight.h> | 325 | #include <asm-generic/bitops/hweight.h> |
diff --git a/include/asm-m68k/byteorder.h b/include/asm-m68k/byteorder.h index b354acdafec8..300866523b86 100644 --- a/include/asm-m68k/byteorder.h +++ b/include/asm-m68k/byteorder.h | |||
@@ -1,19 +1,7 @@ | |||
1 | #ifndef _M68K_BYTEORDER_H | 1 | #ifndef _M68K_BYTEORDER_H |
2 | #define _M68K_BYTEORDER_H | 2 | #define _M68K_BYTEORDER_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm/swab.h> |
5 | #include <linux/compiler.h> | 5 | #include <linux/byteorder/big_endian.h> |
6 | |||
7 | #define __BIG_ENDIAN | ||
8 | #define __SWAB_64_THRU_32__ | ||
9 | |||
10 | static inline __attribute_const__ __u32 __arch_swab32(__u32 val) | ||
11 | { | ||
12 | __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); | ||
13 | return val; | ||
14 | } | ||
15 | #define __arch_swab32 __arch_swab32 | ||
16 | |||
17 | #include <linux/byteorder.h> | ||
18 | 6 | ||
19 | #endif /* _M68K_BYTEORDER_H */ | 7 | #endif /* _M68K_BYTEORDER_H */ |
diff --git a/include/asm-m68k/swab.h b/include/asm-m68k/swab.h new file mode 100644 index 000000000000..7221e3066825 --- /dev/null +++ b/include/asm-m68k/swab.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef _M68K_SWAB_H | ||
2 | #define _M68K_SWAB_H | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | #include <linux/compiler.h> | ||
6 | |||
7 | #define __SWAB_64_THRU_32__ | ||
8 | |||
9 | static inline __attribute_const__ __u32 __arch_swab32(__u32 val) | ||
10 | { | ||
11 | __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); | ||
12 | return val; | ||
13 | } | ||
14 | #define __arch_swab32 __arch_swab32 | ||
15 | |||
16 | #endif /* _M68K_SWAB_H */ | ||
diff --git a/include/asm-mn10300/Kbuild b/include/asm-mn10300/Kbuild index c68e1680da01..27b108a86b39 100644 --- a/include/asm-mn10300/Kbuild +++ b/include/asm-mn10300/Kbuild | |||
@@ -1 +1,2 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | unifdef-y += swab.h | ||
diff --git a/include/asm-mn10300/atomic.h b/include/asm-mn10300/atomic.h index 27c9690b9574..bc064825f9b1 100644 --- a/include/asm-mn10300/atomic.h +++ b/include/asm-mn10300/atomic.h | |||
@@ -20,15 +20,6 @@ | |||
20 | * resource counting etc.. | 20 | * resource counting etc.. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | /* | ||
24 | * Make sure gcc doesn't try to be clever and move things around | ||
25 | * on us. We need to use _exactly_ the address the user gave us, | ||
26 | * not some alias that contains the same information. | ||
27 | */ | ||
28 | typedef struct { | ||
29 | int counter; | ||
30 | } atomic_t; | ||
31 | |||
32 | #define ATOMIC_INIT(i) { (i) } | 23 | #define ATOMIC_INIT(i) { (i) } |
33 | 24 | ||
34 | #ifdef __KERNEL__ | 25 | #ifdef __KERNEL__ |
diff --git a/include/asm-mn10300/bitops.h b/include/asm-mn10300/bitops.h index cc6d40c05cf3..0b610f482abb 100644 --- a/include/asm-mn10300/bitops.h +++ b/include/asm-mn10300/bitops.h | |||
@@ -196,6 +196,17 @@ int fls(int x) | |||
196 | } | 196 | } |
197 | 197 | ||
198 | /** | 198 | /** |
199 | * __fls - find last (most-significant) set bit in a long word | ||
200 | * @word: the word to search | ||
201 | * | ||
202 | * Undefined if no set bit exists, so code should check against 0 first. | ||
203 | */ | ||
204 | static inline unsigned long __fls(unsigned long word) | ||
205 | { | ||
206 | return __ilog2_u32(word); | ||
207 | } | ||
208 | |||
209 | /** | ||
199 | * ffs - find first bit set | 210 | * ffs - find first bit set |
200 | * @x: the word to search | 211 | * @x: the word to search |
201 | * | 212 | * |
diff --git a/include/asm-mn10300/byteorder.h b/include/asm-mn10300/byteorder.h index 3c993cc625f8..45b18ded19e6 100644 --- a/include/asm-mn10300/byteorder.h +++ b/include/asm-mn10300/byteorder.h | |||
@@ -1,46 +1,7 @@ | |||
1 | /* MN10300 Byte-order primitive construction | ||
2 | * | ||
3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public Licence | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the Licence, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_BYTEORDER_H | 1 | #ifndef _ASM_BYTEORDER_H |
12 | #define _ASM_BYTEORDER_H | 2 | #define _ASM_BYTEORDER_H |
13 | 3 | ||
14 | #include <asm/types.h> | 4 | #include <asm/swab.h> |
15 | |||
16 | #ifdef __GNUC__ | ||
17 | |||
18 | static inline __attribute__((const)) | ||
19 | __u32 ___arch__swab32(__u32 x) | ||
20 | { | ||
21 | __u32 ret; | ||
22 | asm("swap %1,%0" : "=r" (ret) : "r" (x)); | ||
23 | return ret; | ||
24 | } | ||
25 | |||
26 | static inline __attribute__((const)) | ||
27 | __u16 ___arch__swab16(__u16 x) | ||
28 | { | ||
29 | __u16 ret; | ||
30 | asm("swaph %1,%0" : "=r" (ret) : "r" (x)); | ||
31 | return ret; | ||
32 | } | ||
33 | |||
34 | #define __arch__swab32(x) ___arch__swab32(x) | ||
35 | #define __arch__swab16(x) ___arch__swab16(x) | ||
36 | |||
37 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
38 | # define __BYTEORDER_HAS_U64__ | ||
39 | # define __SWAB_64_THRU_32__ | ||
40 | #endif | ||
41 | |||
42 | #endif /* __GNUC__ */ | ||
43 | |||
44 | #include <linux/byteorder/little_endian.h> | 5 | #include <linux/byteorder/little_endian.h> |
45 | 6 | ||
46 | #endif /* _ASM_BYTEORDER_H */ | 7 | #endif /* _ASM_BYTEORDER_H */ |
diff --git a/include/asm-mn10300/swab.h b/include/asm-mn10300/swab.h new file mode 100644 index 000000000000..4504d1b4b477 --- /dev/null +++ b/include/asm-mn10300/swab.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* MN10300 Byte-order primitive construction | ||
2 | * | ||
3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public Licence | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the Licence, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_SWAB_H | ||
12 | #define _ASM_SWAB_H | ||
13 | |||
14 | #include <asm/types.h> | ||
15 | |||
16 | #ifdef __GNUC__ | ||
17 | |||
18 | static inline __attribute__((const)) | ||
19 | __u32 __arch_swab32(__u32 x) | ||
20 | { | ||
21 | __u32 ret; | ||
22 | asm("swap %1,%0" : "=r" (ret) : "r" (x)); | ||
23 | return ret; | ||
24 | } | ||
25 | #define __arch_swab32 __arch_swab32 | ||
26 | |||
27 | static inline __attribute__((const)) | ||
28 | __u16 __arch_swab16(__u16 x) | ||
29 | { | ||
30 | __u16 ret; | ||
31 | asm("swaph %1,%0" : "=r" (ret) : "r" (x)); | ||
32 | return ret; | ||
33 | } | ||
34 | #define __arch_swab32 __arch_swab32 | ||
35 | |||
36 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
37 | # define __SWAB_64_THRU_32__ | ||
38 | #endif | ||
39 | |||
40 | #endif /* __GNUC__ */ | ||
41 | |||
42 | #endif /* _ASM_SWAB_H */ | ||
diff --git a/include/asm-xtensa/Kbuild b/include/asm-xtensa/Kbuild deleted file mode 100644 index c68e1680da01..000000000000 --- a/include/asm-xtensa/Kbuild +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | include include/asm-generic/Kbuild.asm | ||
diff --git a/include/asm-xtensa/asmmacro.h b/include/asm-xtensa/asmmacro.h deleted file mode 100644 index 76915cabad17..000000000000 --- a/include/asm-xtensa/asmmacro.h +++ /dev/null | |||
@@ -1,153 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/asmmacro.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_ASMMACRO_H | ||
12 | #define _XTENSA_ASMMACRO_H | ||
13 | |||
14 | #include <asm/variant/core.h> | ||
15 | |||
16 | /* | ||
17 | * Some little helpers for loops. Use zero-overhead-loops | ||
18 | * where applicable and if supported by the processor. | ||
19 | * | ||
20 | * __loopi ar, at, size, inc | ||
21 | * ar register initialized with the start address | ||
22 | * at scratch register used by macro | ||
23 | * size size immediate value | ||
24 | * inc increment | ||
25 | * | ||
26 | * __loops ar, as, at, inc_log2[, mask_log2][, cond][, ncond] | ||
27 | * ar register initialized with the start address | ||
28 | * as register initialized with the size | ||
29 | * at scratch register use by macro | ||
30 | * inc_log2 increment [in log2] | ||
31 | * mask_log2 mask [in log2] | ||
32 | * cond true condition (used in loop'cond') | ||
33 | * ncond false condition (used in b'ncond') | ||
34 | * | ||
35 | * __loop as | ||
36 | * restart loop. 'as' register must not have been modified! | ||
37 | * | ||
38 | * __endla ar, at, incr | ||
39 | * ar start address (modified) | ||
40 | * as scratch register used by macro | ||
41 | * inc increment | ||
42 | */ | ||
43 | |||
44 | /* | ||
45 | * loop for given size as immediate | ||
46 | */ | ||
47 | |||
48 | .macro __loopi ar, at, size, incr | ||
49 | |||
50 | #if XCHAL_HAVE_LOOPS | ||
51 | movi \at, ((\size + \incr - 1) / (\incr)) | ||
52 | loop \at, 99f | ||
53 | #else | ||
54 | addi \at, \ar, \size | ||
55 | 98: | ||
56 | #endif | ||
57 | |||
58 | .endm | ||
59 | |||
60 | /* | ||
61 | * loop for given size in register | ||
62 | */ | ||
63 | |||
64 | .macro __loops ar, as, at, incr_log2, mask_log2, cond, ncond | ||
65 | |||
66 | #if XCHAL_HAVE_LOOPS | ||
67 | .ifgt \incr_log2 - 1 | ||
68 | addi \at, \as, (1 << \incr_log2) - 1 | ||
69 | .ifnc \mask_log2, | ||
70 | extui \at, \at, \incr_log2, \mask_log2 | ||
71 | .else | ||
72 | srli \at, \at, \incr_log2 | ||
73 | .endif | ||
74 | .endif | ||
75 | loop\cond \at, 99f | ||
76 | #else | ||
77 | .ifnc \mask_log2, | ||
78 | extui \at, \as, \incr_log2, \mask_log2 | ||
79 | .else | ||
80 | .ifnc \ncond, | ||
81 | srli \at, \as, \incr_log2 | ||
82 | .endif | ||
83 | .endif | ||
84 | .ifnc \ncond, | ||
85 | b\ncond \at, 99f | ||
86 | |||
87 | .endif | ||
88 | .ifnc \mask_log2, | ||
89 | slli \at, \at, \incr_log2 | ||
90 | add \at, \ar, \at | ||
91 | .else | ||
92 | add \at, \ar, \as | ||
93 | .endif | ||
94 | #endif | ||
95 | 98: | ||
96 | |||
97 | .endm | ||
98 | |||
99 | /* | ||
100 | * loop from ar to ax | ||
101 | */ | ||
102 | |||
103 | .macro __loopt ar, as, at, incr_log2 | ||
104 | |||
105 | #if XCHAL_HAVE_LOOPS | ||
106 | sub \at, \as, \ar | ||
107 | .ifgt \incr_log2 - 1 | ||
108 | addi \at, \at, (1 << \incr_log2) - 1 | ||
109 | srli \at, \at, \incr_log2 | ||
110 | .endif | ||
111 | loop \at, 99f | ||
112 | #else | ||
113 | 98: | ||
114 | #endif | ||
115 | |||
116 | .endm | ||
117 | |||
118 | /* | ||
119 | * restart loop. registers must be unchanged | ||
120 | */ | ||
121 | |||
122 | .macro __loop as | ||
123 | |||
124 | #if XCHAL_HAVE_LOOPS | ||
125 | loop \as, 99f | ||
126 | #else | ||
127 | 98: | ||
128 | #endif | ||
129 | |||
130 | .endm | ||
131 | |||
132 | /* | ||
133 | * end of loop with no increment of the address. | ||
134 | */ | ||
135 | |||
136 | .macro __endl ar, as | ||
137 | #if !XCHAL_HAVE_LOOPS | ||
138 | bltu \ar, \as, 98b | ||
139 | #endif | ||
140 | 99: | ||
141 | .endm | ||
142 | |||
143 | /* | ||
144 | * end of loop with increment of the address. | ||
145 | */ | ||
146 | |||
147 | .macro __endla ar, as, incr | ||
148 | addi \ar, \ar, \incr | ||
149 | __endl \ar \as | ||
150 | .endm | ||
151 | |||
152 | |||
153 | #endif /* _XTENSA_ASMMACRO_H */ | ||
diff --git a/include/asm-xtensa/atomic.h b/include/asm-xtensa/atomic.h deleted file mode 100644 index b3b23540f14d..000000000000 --- a/include/asm-xtensa/atomic.h +++ /dev/null | |||
@@ -1,300 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/atomic.h | ||
3 | * | ||
4 | * Atomic operations that C can't guarantee us. Useful for resource counting.. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_ATOMIC_H | ||
14 | #define _XTENSA_ATOMIC_H | ||
15 | |||
16 | #include <linux/stringify.h> | ||
17 | |||
18 | typedef struct { volatile int counter; } atomic_t; | ||
19 | |||
20 | #ifdef __KERNEL__ | ||
21 | #include <asm/processor.h> | ||
22 | #include <asm/system.h> | ||
23 | |||
24 | #define ATOMIC_INIT(i) { (i) } | ||
25 | |||
26 | /* | ||
27 | * This Xtensa implementation assumes that the right mechanism | ||
28 | * for exclusion is for locking interrupts to level 1. | ||
29 | * | ||
30 | * Locking interrupts looks like this: | ||
31 | * | ||
32 | * rsil a15, 1 | ||
33 | * <code> | ||
34 | * wsr a15, PS | ||
35 | * rsync | ||
36 | * | ||
37 | * Note that a15 is used here because the register allocation | ||
38 | * done by the compiler is not guaranteed and a window overflow | ||
39 | * may not occur between the rsil and wsr instructions. By using | ||
40 | * a15 in the rsil, the machine is guaranteed to be in a state | ||
41 | * where no register reference will cause an overflow. | ||
42 | */ | ||
43 | |||
44 | /** | ||
45 | * atomic_read - read atomic variable | ||
46 | * @v: pointer of type atomic_t | ||
47 | * | ||
48 | * Atomically reads the value of @v. | ||
49 | */ | ||
50 | #define atomic_read(v) ((v)->counter) | ||
51 | |||
52 | /** | ||
53 | * atomic_set - set atomic variable | ||
54 | * @v: pointer of type atomic_t | ||
55 | * @i: required value | ||
56 | * | ||
57 | * Atomically sets the value of @v to @i. | ||
58 | */ | ||
59 | #define atomic_set(v,i) ((v)->counter = (i)) | ||
60 | |||
61 | /** | ||
62 | * atomic_add - add integer to atomic variable | ||
63 | * @i: integer value to add | ||
64 | * @v: pointer of type atomic_t | ||
65 | * | ||
66 | * Atomically adds @i to @v. | ||
67 | */ | ||
68 | static inline void atomic_add(int i, atomic_t * v) | ||
69 | { | ||
70 | unsigned int vval; | ||
71 | |||
72 | __asm__ __volatile__( | ||
73 | "rsil a15, "__stringify(LOCKLEVEL)"\n\t" | ||
74 | "l32i %0, %2, 0 \n\t" | ||
75 | "add %0, %0, %1 \n\t" | ||
76 | "s32i %0, %2, 0 \n\t" | ||
77 | "wsr a15, "__stringify(PS)" \n\t" | ||
78 | "rsync \n" | ||
79 | : "=&a" (vval) | ||
80 | : "a" (i), "a" (v) | ||
81 | : "a15", "memory" | ||
82 | ); | ||
83 | } | ||
84 | |||
85 | /** | ||
86 | * atomic_sub - subtract the atomic variable | ||
87 | * @i: integer value to subtract | ||
88 | * @v: pointer of type atomic_t | ||
89 | * | ||
90 | * Atomically subtracts @i from @v. | ||
91 | */ | ||
92 | static inline void atomic_sub(int i, atomic_t *v) | ||
93 | { | ||
94 | unsigned int vval; | ||
95 | |||
96 | __asm__ __volatile__( | ||
97 | "rsil a15, "__stringify(LOCKLEVEL)"\n\t" | ||
98 | "l32i %0, %2, 0 \n\t" | ||
99 | "sub %0, %0, %1 \n\t" | ||
100 | "s32i %0, %2, 0 \n\t" | ||
101 | "wsr a15, "__stringify(PS)" \n\t" | ||
102 | "rsync \n" | ||
103 | : "=&a" (vval) | ||
104 | : "a" (i), "a" (v) | ||
105 | : "a15", "memory" | ||
106 | ); | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * We use atomic_{add|sub}_return to define other functions. | ||
111 | */ | ||
112 | |||
113 | static inline int atomic_add_return(int i, atomic_t * v) | ||
114 | { | ||
115 | unsigned int vval; | ||
116 | |||
117 | __asm__ __volatile__( | ||
118 | "rsil a15,"__stringify(LOCKLEVEL)"\n\t" | ||
119 | "l32i %0, %2, 0 \n\t" | ||
120 | "add %0, %0, %1 \n\t" | ||
121 | "s32i %0, %2, 0 \n\t" | ||
122 | "wsr a15, "__stringify(PS)" \n\t" | ||
123 | "rsync \n" | ||
124 | : "=&a" (vval) | ||
125 | : "a" (i), "a" (v) | ||
126 | : "a15", "memory" | ||
127 | ); | ||
128 | |||
129 | return vval; | ||
130 | } | ||
131 | |||
132 | static inline int atomic_sub_return(int i, atomic_t * v) | ||
133 | { | ||
134 | unsigned int vval; | ||
135 | |||
136 | __asm__ __volatile__( | ||
137 | "rsil a15,"__stringify(LOCKLEVEL)"\n\t" | ||
138 | "l32i %0, %2, 0 \n\t" | ||
139 | "sub %0, %0, %1 \n\t" | ||
140 | "s32i %0, %2, 0 \n\t" | ||
141 | "wsr a15, "__stringify(PS)" \n\t" | ||
142 | "rsync \n" | ||
143 | : "=&a" (vval) | ||
144 | : "a" (i), "a" (v) | ||
145 | : "a15", "memory" | ||
146 | ); | ||
147 | |||
148 | return vval; | ||
149 | } | ||
150 | |||
151 | /** | ||
152 | * atomic_sub_and_test - subtract value from variable and test result | ||
153 | * @i: integer value to subtract | ||
154 | * @v: pointer of type atomic_t | ||
155 | * | ||
156 | * Atomically subtracts @i from @v and returns | ||
157 | * true if the result is zero, or false for all | ||
158 | * other cases. | ||
159 | */ | ||
160 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i),(v)) == 0) | ||
161 | |||
162 | /** | ||
163 | * atomic_inc - increment atomic variable | ||
164 | * @v: pointer of type atomic_t | ||
165 | * | ||
166 | * Atomically increments @v by 1. | ||
167 | */ | ||
168 | #define atomic_inc(v) atomic_add(1,(v)) | ||
169 | |||
170 | /** | ||
171 | * atomic_inc - increment atomic variable | ||
172 | * @v: pointer of type atomic_t | ||
173 | * | ||
174 | * Atomically increments @v by 1. | ||
175 | */ | ||
176 | #define atomic_inc_return(v) atomic_add_return(1,(v)) | ||
177 | |||
178 | /** | ||
179 | * atomic_dec - decrement atomic variable | ||
180 | * @v: pointer of type atomic_t | ||
181 | * | ||
182 | * Atomically decrements @v by 1. | ||
183 | */ | ||
184 | #define atomic_dec(v) atomic_sub(1,(v)) | ||
185 | |||
186 | /** | ||
187 | * atomic_dec_return - decrement atomic variable | ||
188 | * @v: pointer of type atomic_t | ||
189 | * | ||
190 | * Atomically decrements @v by 1. | ||
191 | */ | ||
192 | #define atomic_dec_return(v) atomic_sub_return(1,(v)) | ||
193 | |||
194 | /** | ||
195 | * atomic_dec_and_test - decrement and test | ||
196 | * @v: pointer of type atomic_t | ||
197 | * | ||
198 | * Atomically decrements @v by 1 and | ||
199 | * returns true if the result is 0, or false for all other | ||
200 | * cases. | ||
201 | */ | ||
202 | #define atomic_dec_and_test(v) (atomic_sub_return(1,(v)) == 0) | ||
203 | |||
204 | /** | ||
205 | * atomic_inc_and_test - increment and test | ||
206 | * @v: pointer of type atomic_t | ||
207 | * | ||
208 | * Atomically increments @v by 1 | ||
209 | * and returns true if the result is zero, or false for all | ||
210 | * other cases. | ||
211 | */ | ||
212 | #define atomic_inc_and_test(v) (atomic_add_return(1,(v)) == 0) | ||
213 | |||
214 | /** | ||
215 | * atomic_add_negative - add and test if negative | ||
216 | * @v: pointer of type atomic_t | ||
217 | * @i: integer value to add | ||
218 | * | ||
219 | * Atomically adds @i to @v and returns true | ||
220 | * if the result is negative, or false when | ||
221 | * result is greater than or equal to zero. | ||
222 | */ | ||
223 | #define atomic_add_negative(i,v) (atomic_add_return((i),(v)) < 0) | ||
224 | |||
225 | #define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) | ||
226 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | ||
227 | |||
228 | /** | ||
229 | * atomic_add_unless - add unless the number is a given value | ||
230 | * @v: pointer of type atomic_t | ||
231 | * @a: the amount to add to v... | ||
232 | * @u: ...unless v is equal to u. | ||
233 | * | ||
234 | * Atomically adds @a to @v, so long as it was not @u. | ||
235 | * Returns non-zero if @v was not @u, and zero otherwise. | ||
236 | */ | ||
237 | static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) | ||
238 | { | ||
239 | int c, old; | ||
240 | c = atomic_read(v); | ||
241 | for (;;) { | ||
242 | if (unlikely(c == (u))) | ||
243 | break; | ||
244 | old = atomic_cmpxchg((v), c, c + (a)); | ||
245 | if (likely(old == c)) | ||
246 | break; | ||
247 | c = old; | ||
248 | } | ||
249 | return c != (u); | ||
250 | } | ||
251 | |||
252 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
253 | |||
254 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | ||
255 | { | ||
256 | unsigned int all_f = -1; | ||
257 | unsigned int vval; | ||
258 | |||
259 | __asm__ __volatile__( | ||
260 | "rsil a15,"__stringify(LOCKLEVEL)"\n\t" | ||
261 | "l32i %0, %2, 0 \n\t" | ||
262 | "xor %1, %4, %3 \n\t" | ||
263 | "and %0, %0, %4 \n\t" | ||
264 | "s32i %0, %2, 0 \n\t" | ||
265 | "wsr a15, "__stringify(PS)" \n\t" | ||
266 | "rsync \n" | ||
267 | : "=&a" (vval), "=a" (mask) | ||
268 | : "a" (v), "a" (all_f), "1" (mask) | ||
269 | : "a15", "memory" | ||
270 | ); | ||
271 | } | ||
272 | |||
273 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | ||
274 | { | ||
275 | unsigned int vval; | ||
276 | |||
277 | __asm__ __volatile__( | ||
278 | "rsil a15,"__stringify(LOCKLEVEL)"\n\t" | ||
279 | "l32i %0, %2, 0 \n\t" | ||
280 | "or %0, %0, %1 \n\t" | ||
281 | "s32i %0, %2, 0 \n\t" | ||
282 | "wsr a15, "__stringify(PS)" \n\t" | ||
283 | "rsync \n" | ||
284 | : "=&a" (vval) | ||
285 | : "a" (mask), "a" (v) | ||
286 | : "a15", "memory" | ||
287 | ); | ||
288 | } | ||
289 | |||
290 | /* Atomic operations are already serializing */ | ||
291 | #define smp_mb__before_atomic_dec() barrier() | ||
292 | #define smp_mb__after_atomic_dec() barrier() | ||
293 | #define smp_mb__before_atomic_inc() barrier() | ||
294 | #define smp_mb__after_atomic_inc() barrier() | ||
295 | |||
296 | #include <asm-generic/atomic.h> | ||
297 | #endif /* __KERNEL__ */ | ||
298 | |||
299 | #endif /* _XTENSA_ATOMIC_H */ | ||
300 | |||
diff --git a/include/asm-xtensa/auxvec.h b/include/asm-xtensa/auxvec.h deleted file mode 100644 index 257dec75c5af..000000000000 --- a/include/asm-xtensa/auxvec.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | #ifndef __XTENSA_AUXVEC_H | ||
2 | #define __XTENSA_AUXVEC_H | ||
3 | |||
4 | #endif | ||
diff --git a/include/asm-xtensa/bitops.h b/include/asm-xtensa/bitops.h deleted file mode 100644 index 23261e8f2e5a..000000000000 --- a/include/asm-xtensa/bitops.h +++ /dev/null | |||
@@ -1,121 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/bitops.h | ||
3 | * | ||
4 | * Atomic operations that C can't guarantee us.Useful for resource counting etc. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_BITOPS_H | ||
14 | #define _XTENSA_BITOPS_H | ||
15 | |||
16 | #ifdef __KERNEL__ | ||
17 | |||
18 | #ifndef _LINUX_BITOPS_H | ||
19 | #error only <linux/bitops.h> can be included directly | ||
20 | #endif | ||
21 | |||
22 | #include <asm/processor.h> | ||
23 | #include <asm/byteorder.h> | ||
24 | #include <asm/system.h> | ||
25 | |||
26 | #ifdef CONFIG_SMP | ||
27 | # error SMP not supported on this architecture | ||
28 | #endif | ||
29 | |||
30 | #define smp_mb__before_clear_bit() barrier() | ||
31 | #define smp_mb__after_clear_bit() barrier() | ||
32 | |||
33 | #include <asm-generic/bitops/atomic.h> | ||
34 | #include <asm-generic/bitops/non-atomic.h> | ||
35 | |||
36 | #if XCHAL_HAVE_NSA | ||
37 | |||
38 | static inline unsigned long __cntlz (unsigned long x) | ||
39 | { | ||
40 | int lz; | ||
41 | asm ("nsau %0, %1" : "=r" (lz) : "r" (x)); | ||
42 | return lz; | ||
43 | } | ||
44 | |||
45 | /* | ||
46 | * ffz: Find first zero in word. Undefined if no zero exists. | ||
47 | * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). | ||
48 | */ | ||
49 | |||
50 | static inline int ffz(unsigned long x) | ||
51 | { | ||
52 | return 31 - __cntlz(~x & -~x); | ||
53 | } | ||
54 | |||
55 | /* | ||
56 | * __ffs: Find first bit set in word. Return 0 for bit 0 | ||
57 | */ | ||
58 | |||
59 | static inline int __ffs(unsigned long x) | ||
60 | { | ||
61 | return 31 - __cntlz(x & -x); | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * ffs: Find first bit set in word. This is defined the same way as | ||
66 | * the libc and compiler builtin ffs routines, therefore | ||
67 | * differs in spirit from the above ffz (man ffs). | ||
68 | */ | ||
69 | |||
70 | static inline int ffs(unsigned long x) | ||
71 | { | ||
72 | return 32 - __cntlz(x & -x); | ||
73 | } | ||
74 | |||
75 | /* | ||
76 | * fls: Find last (most-significant) bit set in word. | ||
77 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. | ||
78 | */ | ||
79 | |||
80 | static inline int fls (unsigned int x) | ||
81 | { | ||
82 | return 32 - __cntlz(x); | ||
83 | } | ||
84 | |||
85 | #else | ||
86 | |||
87 | /* Use the generic implementation if we don't have the nsa/nsau instructions. */ | ||
88 | |||
89 | # include <asm-generic/bitops/ffs.h> | ||
90 | # include <asm-generic/bitops/__ffs.h> | ||
91 | # include <asm-generic/bitops/ffz.h> | ||
92 | # include <asm-generic/bitops/fls.h> | ||
93 | |||
94 | #endif | ||
95 | |||
96 | #include <asm-generic/bitops/fls64.h> | ||
97 | #include <asm-generic/bitops/find.h> | ||
98 | #include <asm-generic/bitops/ext2-non-atomic.h> | ||
99 | |||
100 | #ifdef __XTENSA_EL__ | ||
101 | # define ext2_set_bit_atomic(lock,nr,addr) \ | ||
102 | test_and_set_bit((nr), (unsigned long*)(addr)) | ||
103 | # define ext2_clear_bit_atomic(lock,nr,addr) \ | ||
104 | test_and_clear_bit((nr), (unsigned long*)(addr)) | ||
105 | #elif defined(__XTENSA_EB__) | ||
106 | # define ext2_set_bit_atomic(lock,nr,addr) \ | ||
107 | test_and_set_bit((nr) ^ 0x18, (unsigned long*)(addr)) | ||
108 | # define ext2_clear_bit_atomic(lock,nr,addr) \ | ||
109 | test_and_clear_bit((nr) ^ 0x18, (unsigned long*)(addr)) | ||
110 | #else | ||
111 | # error processor byte order undefined! | ||
112 | #endif | ||
113 | |||
114 | #include <asm-generic/bitops/hweight.h> | ||
115 | #include <asm-generic/bitops/lock.h> | ||
116 | #include <asm-generic/bitops/sched.h> | ||
117 | #include <asm-generic/bitops/minix.h> | ||
118 | |||
119 | #endif /* __KERNEL__ */ | ||
120 | |||
121 | #endif /* _XTENSA_BITOPS_H */ | ||
diff --git a/include/asm-xtensa/bootparam.h b/include/asm-xtensa/bootparam.h deleted file mode 100644 index 9983f2c1b7ee..000000000000 --- a/include/asm-xtensa/bootparam.h +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/bootparam.h | ||
3 | * | ||
4 | * Definition of the Linux/Xtensa boot parameter structure | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | * | ||
12 | * (Concept borrowed from the 68K port) | ||
13 | */ | ||
14 | |||
15 | #ifndef _XTENSA_BOOTPARAM_H | ||
16 | #define _XTENSA_BOOTPARAM_H | ||
17 | |||
18 | #define BP_VERSION 0x0001 | ||
19 | |||
20 | #define BP_TAG_COMMAND_LINE 0x1001 /* command line (0-terminated string)*/ | ||
21 | #define BP_TAG_INITRD 0x1002 /* ramdisk addr and size (bp_meminfo) */ | ||
22 | #define BP_TAG_MEMORY 0x1003 /* memory addr and size (bp_meminfo) */ | ||
23 | #define BP_TAG_SERIAL_BAUSRATE 0x1004 /* baud rate of current console. */ | ||
24 | #define BP_TAG_SERIAL_PORT 0x1005 /* serial device of current console */ | ||
25 | |||
26 | #define BP_TAG_FIRST 0x7B0B /* first tag with a version number */ | ||
27 | #define BP_TAG_LAST 0x7E0B /* last tag */ | ||
28 | |||
29 | #ifndef __ASSEMBLY__ | ||
30 | |||
31 | /* All records are aligned to 4 bytes */ | ||
32 | |||
33 | typedef struct bp_tag { | ||
34 | unsigned short id; /* tag id */ | ||
35 | unsigned short size; /* size of this record excluding the structure*/ | ||
36 | unsigned long data[0]; /* data */ | ||
37 | } bp_tag_t; | ||
38 | |||
39 | typedef struct meminfo { | ||
40 | unsigned long type; | ||
41 | unsigned long start; | ||
42 | unsigned long end; | ||
43 | } meminfo_t; | ||
44 | |||
45 | #define SYSMEM_BANKS_MAX 5 | ||
46 | |||
47 | #define MEMORY_TYPE_CONVENTIONAL 0x1000 | ||
48 | #define MEMORY_TYPE_NONE 0x2000 | ||
49 | |||
50 | typedef struct sysmem_info { | ||
51 | int nr_banks; | ||
52 | meminfo_t bank[SYSMEM_BANKS_MAX]; | ||
53 | } sysmem_info_t; | ||
54 | |||
55 | extern sysmem_info_t sysmem; | ||
56 | |||
57 | #endif | ||
58 | #endif | ||
59 | |||
60 | |||
61 | |||
diff --git a/include/asm-xtensa/bug.h b/include/asm-xtensa/bug.h deleted file mode 100644 index 3e52d72712f1..000000000000 --- a/include/asm-xtensa/bug.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/bug.h | ||
3 | * | ||
4 | * Macros to cause a 'bug' message. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_BUG_H | ||
14 | #define _XTENSA_BUG_H | ||
15 | |||
16 | #include <asm-generic/bug.h> | ||
17 | |||
18 | #endif /* _XTENSA_BUG_H */ | ||
diff --git a/include/asm-xtensa/bugs.h b/include/asm-xtensa/bugs.h deleted file mode 100644 index 69b29d198249..000000000000 --- a/include/asm-xtensa/bugs.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/bugs.h | ||
3 | * | ||
4 | * This is included by init/main.c to check for architecture-dependent bugs. | ||
5 | * | ||
6 | * Xtensa processors don't have any bugs. :) | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General | ||
9 | * Public License. See the file "COPYING" in the main directory of | ||
10 | * this archive for more details. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_BUGS_H | ||
14 | #define _XTENSA_BUGS_H | ||
15 | |||
16 | static void check_bugs(void) { } | ||
17 | |||
18 | #endif /* _XTENSA_BUGS_H */ | ||
diff --git a/include/asm-xtensa/byteorder.h b/include/asm-xtensa/byteorder.h deleted file mode 100644 index 765edf17a9a4..000000000000 --- a/include/asm-xtensa/byteorder.h +++ /dev/null | |||
@@ -1,82 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/byteorder.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_BYTEORDER_H | ||
12 | #define _XTENSA_BYTEORDER_H | ||
13 | |||
14 | #include <asm/types.h> | ||
15 | #include <linux/compiler.h> | ||
16 | |||
17 | static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x) | ||
18 | { | ||
19 | __u32 res; | ||
20 | /* instruction sequence from Xtensa ISA release 2/2000 */ | ||
21 | __asm__("ssai 8 \n\t" | ||
22 | "srli %0, %1, 16 \n\t" | ||
23 | "src %0, %0, %1 \n\t" | ||
24 | "src %0, %0, %0 \n\t" | ||
25 | "src %0, %1, %0 \n" | ||
26 | : "=&a" (res) | ||
27 | : "a" (x) | ||
28 | ); | ||
29 | return res; | ||
30 | } | ||
31 | |||
32 | static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x) | ||
33 | { | ||
34 | /* Given that 'short' values are signed (i.e., can be negative), | ||
35 | * we cannot assume that the upper 16-bits of the register are | ||
36 | * zero. We are careful to mask values after shifting. | ||
37 | */ | ||
38 | |||
39 | /* There exists an anomaly between xt-gcc and xt-xcc. xt-gcc | ||
40 | * inserts an extui instruction after putting this function inline | ||
41 | * to ensure that it uses only the least-significant 16 bits of | ||
42 | * the result. xt-xcc doesn't use an extui, but assumes the | ||
43 | * __asm__ macro follows convention that the upper 16 bits of an | ||
44 | * 'unsigned short' result are still zero. This macro doesn't | ||
45 | * follow convention; indeed, it leaves garbage in the upport 16 | ||
46 | * bits of the register. | ||
47 | |||
48 | * Declaring the temporary variables 'res' and 'tmp' to be 32-bit | ||
49 | * types while the return type of the function is a 16-bit type | ||
50 | * forces both compilers to insert exactly one extui instruction | ||
51 | * (or equivalent) to mask off the upper 16 bits. */ | ||
52 | |||
53 | __u32 res; | ||
54 | __u32 tmp; | ||
55 | |||
56 | __asm__("extui %1, %2, 8, 8\n\t" | ||
57 | "slli %0, %2, 8 \n\t" | ||
58 | "or %0, %0, %1 \n" | ||
59 | : "=&a" (res), "=&a" (tmp) | ||
60 | : "a" (x) | ||
61 | ); | ||
62 | |||
63 | return res; | ||
64 | } | ||
65 | |||
66 | #define __arch__swab32(x) ___arch__swab32(x) | ||
67 | #define __arch__swab16(x) ___arch__swab16(x) | ||
68 | |||
69 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
70 | # define __BYTEORDER_HAS_U64__ | ||
71 | # define __SWAB_64_THRU_32__ | ||
72 | #endif | ||
73 | |||
74 | #ifdef __XTENSA_EL__ | ||
75 | # include <linux/byteorder/little_endian.h> | ||
76 | #elif defined(__XTENSA_EB__) | ||
77 | # include <linux/byteorder/big_endian.h> | ||
78 | #else | ||
79 | # error processor byte order undefined! | ||
80 | #endif | ||
81 | |||
82 | #endif /* _XTENSA_BYTEORDER_H */ | ||
diff --git a/include/asm-xtensa/cache.h b/include/asm-xtensa/cache.h deleted file mode 100644 index 3bba2a540cf0..000000000000 --- a/include/asm-xtensa/cache.h +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/cache.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CACHE_H | ||
12 | #define _XTENSA_CACHE_H | ||
13 | |||
14 | #include <asm/variant/core.h> | ||
15 | |||
16 | #define L1_CACHE_SHIFT XCHAL_DCACHE_LINEWIDTH | ||
17 | #define L1_CACHE_BYTES XCHAL_DCACHE_LINESIZE | ||
18 | #define SMP_CACHE_BYTES L1_CACHE_BYTES | ||
19 | |||
20 | #define DCACHE_WAY_SIZE (XCHAL_DCACHE_SIZE/XCHAL_DCACHE_WAYS) | ||
21 | #define ICACHE_WAY_SIZE (XCHAL_ICACHE_SIZE/XCHAL_ICACHE_WAYS) | ||
22 | #define DCACHE_WAY_SHIFT (XCHAL_DCACHE_SETWIDTH + XCHAL_DCACHE_LINEWIDTH) | ||
23 | #define ICACHE_WAY_SHIFT (XCHAL_ICACHE_SETWIDTH + XCHAL_ICACHE_LINEWIDTH) | ||
24 | |||
25 | /* Maximum cache size per way. */ | ||
26 | #if DCACHE_WAY_SIZE >= ICACHE_WAY_SIZE | ||
27 | # define CACHE_WAY_SIZE DCACHE_WAY_SIZE | ||
28 | #else | ||
29 | # define CACHE_WAY_SIZE ICACHE_WAY_SIZE | ||
30 | #endif | ||
31 | |||
32 | |||
33 | #endif /* _XTENSA_CACHE_H */ | ||
diff --git a/include/asm-xtensa/cacheasm.h b/include/asm-xtensa/cacheasm.h deleted file mode 100644 index 2c20a58f94cd..000000000000 --- a/include/asm-xtensa/cacheasm.h +++ /dev/null | |||
@@ -1,177 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/cacheasm.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2006 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #include <asm/cache.h> | ||
12 | #include <asm/asmmacro.h> | ||
13 | #include <linux/stringify.h> | ||
14 | |||
15 | /* | ||
16 | * Define cache functions as macros here so that they can be used | ||
17 | * by the kernel and boot loader. We should consider moving them to a | ||
18 | * library that can be linked by both. | ||
19 | * | ||
20 | * Locking | ||
21 | * | ||
22 | * ___unlock_dcache_all | ||
23 | * ___unlock_icache_all | ||
24 | * | ||
25 | * Flush and invaldating | ||
26 | * | ||
27 | * ___flush_invalidate_dcache_{all|range|page} | ||
28 | * ___flush_dcache_{all|range|page} | ||
29 | * ___invalidate_dcache_{all|range|page} | ||
30 | * ___invalidate_icache_{all|range|page} | ||
31 | * | ||
32 | */ | ||
33 | |||
34 | .macro __loop_cache_all ar at insn size line_width | ||
35 | |||
36 | movi \ar, 0 | ||
37 | |||
38 | __loopi \ar, \at, \size, (4 << (\line_width)) | ||
39 | \insn \ar, 0 << (\line_width) | ||
40 | \insn \ar, 1 << (\line_width) | ||
41 | \insn \ar, 2 << (\line_width) | ||
42 | \insn \ar, 3 << (\line_width) | ||
43 | __endla \ar, \at, 4 << (\line_width) | ||
44 | |||
45 | .endm | ||
46 | |||
47 | |||
48 | .macro __loop_cache_range ar as at insn line_width | ||
49 | |||
50 | extui \at, \ar, 0, \line_width | ||
51 | add \as, \as, \at | ||
52 | |||
53 | __loops \ar, \as, \at, \line_width | ||
54 | \insn \ar, 0 | ||
55 | __endla \ar, \at, (1 << (\line_width)) | ||
56 | |||
57 | .endm | ||
58 | |||
59 | |||
60 | .macro __loop_cache_page ar at insn line_width | ||
61 | |||
62 | __loopi \ar, \at, PAGE_SIZE, 4 << (\line_width) | ||
63 | \insn \ar, 0 << (\line_width) | ||
64 | \insn \ar, 1 << (\line_width) | ||
65 | \insn \ar, 2 << (\line_width) | ||
66 | \insn \ar, 3 << (\line_width) | ||
67 | __endla \ar, \at, 4 << (\line_width) | ||
68 | |||
69 | .endm | ||
70 | |||
71 | |||
72 | #if XCHAL_DCACHE_LINE_LOCKABLE | ||
73 | |||
74 | .macro ___unlock_dcache_all ar at | ||
75 | |||
76 | __loop_cache_all \ar \at diu XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH | ||
77 | |||
78 | .endm | ||
79 | |||
80 | #endif | ||
81 | |||
82 | #if XCHAL_ICACHE_LINE_LOCKABLE | ||
83 | |||
84 | .macro ___unlock_icache_all ar at | ||
85 | |||
86 | __loop_cache_all \ar \at iiu XCHAL_ICACHE_SIZE XCHAL_ICACHE_LINEWIDTH | ||
87 | |||
88 | .endm | ||
89 | #endif | ||
90 | |||
91 | .macro ___flush_invalidate_dcache_all ar at | ||
92 | |||
93 | __loop_cache_all \ar \at diwbi XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH | ||
94 | |||
95 | .endm | ||
96 | |||
97 | |||
98 | .macro ___flush_dcache_all ar at | ||
99 | |||
100 | __loop_cache_all \ar \at diwb XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH | ||
101 | |||
102 | .endm | ||
103 | |||
104 | |||
105 | .macro ___invalidate_dcache_all ar at | ||
106 | |||
107 | __loop_cache_all \ar \at dii __stringify(DCACHE_WAY_SIZE) \ | ||
108 | XCHAL_DCACHE_LINEWIDTH | ||
109 | |||
110 | .endm | ||
111 | |||
112 | |||
113 | .macro ___invalidate_icache_all ar at | ||
114 | |||
115 | __loop_cache_all \ar \at iii __stringify(ICACHE_WAY_SIZE) \ | ||
116 | XCHAL_ICACHE_LINEWIDTH | ||
117 | |||
118 | .endm | ||
119 | |||
120 | |||
121 | |||
122 | .macro ___flush_invalidate_dcache_range ar as at | ||
123 | |||
124 | __loop_cache_range \ar \as \at dhwbi XCHAL_DCACHE_LINEWIDTH | ||
125 | |||
126 | .endm | ||
127 | |||
128 | |||
129 | .macro ___flush_dcache_range ar as at | ||
130 | |||
131 | __loop_cache_range \ar \as \at dhwb XCHAL_DCACHE_LINEWIDTH | ||
132 | |||
133 | .endm | ||
134 | |||
135 | |||
136 | .macro ___invalidate_dcache_range ar as at | ||
137 | |||
138 | __loop_cache_range \ar \as \at dhi XCHAL_DCACHE_LINEWIDTH | ||
139 | |||
140 | .endm | ||
141 | |||
142 | |||
143 | .macro ___invalidate_icache_range ar as at | ||
144 | |||
145 | __loop_cache_range \ar \as \at ihi XCHAL_ICACHE_LINEWIDTH | ||
146 | |||
147 | .endm | ||
148 | |||
149 | |||
150 | |||
151 | .macro ___flush_invalidate_dcache_page ar as | ||
152 | |||
153 | __loop_cache_page \ar \as dhwbi XCHAL_DCACHE_LINEWIDTH | ||
154 | |||
155 | .endm | ||
156 | |||
157 | |||
158 | .macro ___flush_dcache_page ar as | ||
159 | |||
160 | __loop_cache_page \ar \as dhwb XCHAL_DCACHE_LINEWIDTH | ||
161 | |||
162 | .endm | ||
163 | |||
164 | |||
165 | .macro ___invalidate_dcache_page ar as | ||
166 | |||
167 | __loop_cache_page \ar \as dhi XCHAL_DCACHE_LINEWIDTH | ||
168 | |||
169 | .endm | ||
170 | |||
171 | |||
172 | .macro ___invalidate_icache_page ar as | ||
173 | |||
174 | __loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH | ||
175 | |||
176 | .endm | ||
177 | |||
diff --git a/include/asm-xtensa/cacheflush.h b/include/asm-xtensa/cacheflush.h deleted file mode 100644 index 94c4c53a099e..000000000000 --- a/include/asm-xtensa/cacheflush.h +++ /dev/null | |||
@@ -1,155 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/cacheflush.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CACHEFLUSH_H | ||
12 | #define _XTENSA_CACHEFLUSH_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | #include <linux/mm.h> | ||
17 | #include <asm/processor.h> | ||
18 | #include <asm/page.h> | ||
19 | |||
20 | /* | ||
21 | * Lo-level routines for cache flushing. | ||
22 | * | ||
23 | * invalidate data or instruction cache: | ||
24 | * | ||
25 | * __invalidate_icache_all() | ||
26 | * __invalidate_icache_page(adr) | ||
27 | * __invalidate_dcache_page(adr) | ||
28 | * __invalidate_icache_range(from,size) | ||
29 | * __invalidate_dcache_range(from,size) | ||
30 | * | ||
31 | * flush data cache: | ||
32 | * | ||
33 | * __flush_dcache_page(adr) | ||
34 | * | ||
35 | * flush and invalidate data cache: | ||
36 | * | ||
37 | * __flush_invalidate_dcache_all() | ||
38 | * __flush_invalidate_dcache_page(adr) | ||
39 | * __flush_invalidate_dcache_range(from,size) | ||
40 | * | ||
41 | * specials for cache aliasing: | ||
42 | * | ||
43 | * __flush_invalidate_dcache_page_alias(vaddr,paddr) | ||
44 | * __invalidate_icache_page_alias(vaddr,paddr) | ||
45 | */ | ||
46 | |||
47 | extern void __invalidate_dcache_all(void); | ||
48 | extern void __invalidate_icache_all(void); | ||
49 | extern void __invalidate_dcache_page(unsigned long); | ||
50 | extern void __invalidate_icache_page(unsigned long); | ||
51 | extern void __invalidate_icache_range(unsigned long, unsigned long); | ||
52 | extern void __invalidate_dcache_range(unsigned long, unsigned long); | ||
53 | |||
54 | |||
55 | #if XCHAL_DCACHE_IS_WRITEBACK | ||
56 | extern void __flush_invalidate_dcache_all(void); | ||
57 | extern void __flush_dcache_page(unsigned long); | ||
58 | extern void __flush_dcache_range(unsigned long, unsigned long); | ||
59 | extern void __flush_invalidate_dcache_page(unsigned long); | ||
60 | extern void __flush_invalidate_dcache_range(unsigned long, unsigned long); | ||
61 | #else | ||
62 | # define __flush_dcache_range(p,s) do { } while(0) | ||
63 | # define __flush_dcache_page(p) do { } while(0) | ||
64 | # define __flush_invalidate_dcache_page(p) __invalidate_dcache_page(p) | ||
65 | # define __flush_invalidate_dcache_range(p,s) __invalidate_dcache_range(p,s) | ||
66 | #endif | ||
67 | |||
68 | #if (DCACHE_WAY_SIZE > PAGE_SIZE) | ||
69 | extern void __flush_invalidate_dcache_page_alias(unsigned long, unsigned long); | ||
70 | #endif | ||
71 | #if (ICACHE_WAY_SIZE > PAGE_SIZE) | ||
72 | extern void __invalidate_icache_page_alias(unsigned long, unsigned long); | ||
73 | #else | ||
74 | # define __invalidate_icache_page_alias(v,p) do { } while(0) | ||
75 | #endif | ||
76 | |||
77 | /* | ||
78 | * We have physically tagged caches - nothing to do here - | ||
79 | * unless we have cache aliasing. | ||
80 | * | ||
81 | * Pages can get remapped. Because this might change the 'color' of that page, | ||
82 | * we have to flush the cache before the PTE is changed. | ||
83 | * (see also Documentation/cachetlb.txt) | ||
84 | */ | ||
85 | |||
86 | #if (DCACHE_WAY_SIZE > PAGE_SIZE) | ||
87 | |||
88 | #define flush_cache_all() \ | ||
89 | do { \ | ||
90 | __flush_invalidate_dcache_all(); \ | ||
91 | __invalidate_icache_all(); \ | ||
92 | } while (0) | ||
93 | |||
94 | #define flush_cache_mm(mm) flush_cache_all() | ||
95 | #define flush_cache_dup_mm(mm) flush_cache_mm(mm) | ||
96 | |||
97 | #define flush_cache_vmap(start,end) flush_cache_all() | ||
98 | #define flush_cache_vunmap(start,end) flush_cache_all() | ||
99 | |||
100 | extern void flush_dcache_page(struct page*); | ||
101 | extern void flush_cache_range(struct vm_area_struct*, ulong, ulong); | ||
102 | extern void flush_cache_page(struct vm_area_struct*, unsigned long, unsigned long); | ||
103 | |||
104 | #else | ||
105 | |||
106 | #define flush_cache_all() do { } while (0) | ||
107 | #define flush_cache_mm(mm) do { } while (0) | ||
108 | #define flush_cache_dup_mm(mm) do { } while (0) | ||
109 | |||
110 | #define flush_cache_vmap(start,end) do { } while (0) | ||
111 | #define flush_cache_vunmap(start,end) do { } while (0) | ||
112 | |||
113 | #define flush_dcache_page(page) do { } while (0) | ||
114 | |||
115 | #define flush_cache_page(vma,addr,pfn) do { } while (0) | ||
116 | #define flush_cache_range(vma,start,end) do { } while (0) | ||
117 | |||
118 | #endif | ||
119 | |||
120 | /* Ensure consistency between data and instruction cache. */ | ||
121 | #define flush_icache_range(start,end) \ | ||
122 | do { \ | ||
123 | __flush_dcache_range(start, (end) - (start)); \ | ||
124 | __invalidate_icache_range(start,(end) - (start)); \ | ||
125 | } while (0) | ||
126 | |||
127 | /* This is not required, see Documentation/cachetlb.txt */ | ||
128 | #define flush_icache_page(vma,page) do { } while (0) | ||
129 | |||
130 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | ||
131 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | ||
132 | |||
133 | #if (DCACHE_WAY_SIZE > PAGE_SIZE) | ||
134 | |||
135 | extern void copy_to_user_page(struct vm_area_struct*, struct page*, | ||
136 | unsigned long, void*, const void*, unsigned long); | ||
137 | extern void copy_from_user_page(struct vm_area_struct*, struct page*, | ||
138 | unsigned long, void*, const void*, unsigned long); | ||
139 | |||
140 | #else | ||
141 | |||
142 | #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ | ||
143 | do { \ | ||
144 | memcpy(dst, src, len); \ | ||
145 | __flush_dcache_range((unsigned long) dst, len); \ | ||
146 | __invalidate_icache_range((unsigned long) dst, len); \ | ||
147 | } while (0) | ||
148 | |||
149 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | ||
150 | memcpy(dst, src, len) | ||
151 | |||
152 | #endif | ||
153 | |||
154 | #endif /* __KERNEL__ */ | ||
155 | #endif /* _XTENSA_CACHEFLUSH_H */ | ||
diff --git a/include/asm-xtensa/checksum.h b/include/asm-xtensa/checksum.h deleted file mode 100644 index 23534c60b3a4..000000000000 --- a/include/asm-xtensa/checksum.h +++ /dev/null | |||
@@ -1,250 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/checksum.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CHECKSUM_H | ||
12 | #define _XTENSA_CHECKSUM_H | ||
13 | |||
14 | #include <linux/in6.h> | ||
15 | #include <asm/variant/core.h> | ||
16 | |||
17 | /* | ||
18 | * computes the checksum of a memory block at buff, length len, | ||
19 | * and adds in "sum" (32-bit) | ||
20 | * | ||
21 | * returns a 32-bit number suitable for feeding into itself | ||
22 | * or csum_tcpudp_magic | ||
23 | * | ||
24 | * this function must be called with even lengths, except | ||
25 | * for the last fragment, which may be odd | ||
26 | * | ||
27 | * it's best to have buff aligned on a 32-bit boundary | ||
28 | */ | ||
29 | asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum); | ||
30 | |||
31 | /* | ||
32 | * the same as csum_partial, but copies from src while it | ||
33 | * checksums, and handles user-space pointer exceptions correctly, when needed. | ||
34 | * | ||
35 | * here even more important to align src and dst on a 32-bit (or even | ||
36 | * better 64-bit) boundary | ||
37 | */ | ||
38 | |||
39 | asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len, __wsum sum, | ||
40 | int *src_err_ptr, int *dst_err_ptr); | ||
41 | |||
42 | /* | ||
43 | * Note: when you get a NULL pointer exception here this means someone | ||
44 | * passed in an incorrect kernel address to one of these functions. | ||
45 | * | ||
46 | * If you use these functions directly please don't forget the access_ok(). | ||
47 | */ | ||
48 | static inline | ||
49 | __wsum csum_partial_copy_nocheck(const void *src, void *dst, | ||
50 | int len, __wsum sum) | ||
51 | { | ||
52 | return csum_partial_copy_generic(src, dst, len, sum, NULL, NULL); | ||
53 | } | ||
54 | |||
55 | static inline | ||
56 | __wsum csum_partial_copy_from_user(const void __user *src, void *dst, | ||
57 | int len, __wsum sum, int *err_ptr) | ||
58 | { | ||
59 | return csum_partial_copy_generic((__force const void *)src, dst, | ||
60 | len, sum, err_ptr, NULL); | ||
61 | } | ||
62 | |||
63 | /* | ||
64 | * Fold a partial checksum | ||
65 | */ | ||
66 | |||
67 | static __inline__ __sum16 csum_fold(__wsum sum) | ||
68 | { | ||
69 | unsigned int __dummy; | ||
70 | __asm__("extui %1, %0, 16, 16\n\t" | ||
71 | "extui %0 ,%0, 0, 16\n\t" | ||
72 | "add %0, %0, %1\n\t" | ||
73 | "slli %1, %0, 16\n\t" | ||
74 | "add %0, %0, %1\n\t" | ||
75 | "extui %0, %0, 16, 16\n\t" | ||
76 | "neg %0, %0\n\t" | ||
77 | "addi %0, %0, -1\n\t" | ||
78 | "extui %0, %0, 0, 16\n\t" | ||
79 | : "=r" (sum), "=&r" (__dummy) | ||
80 | : "0" (sum)); | ||
81 | return (__force __sum16)sum; | ||
82 | } | ||
83 | |||
84 | /* | ||
85 | * This is a version of ip_compute_csum() optimized for IP headers, | ||
86 | * which always checksum on 4 octet boundaries. | ||
87 | */ | ||
88 | static __inline__ __sum16 ip_fast_csum(const void *iph, unsigned int ihl) | ||
89 | { | ||
90 | unsigned int sum, tmp, endaddr; | ||
91 | |||
92 | __asm__ __volatile__( | ||
93 | "sub %0, %0, %0\n\t" | ||
94 | #if XCHAL_HAVE_LOOPS | ||
95 | "loopgtz %2, 2f\n\t" | ||
96 | #else | ||
97 | "beqz %2, 2f\n\t" | ||
98 | "slli %4, %2, 2\n\t" | ||
99 | "add %4, %4, %1\n\t" | ||
100 | "0:\t" | ||
101 | #endif | ||
102 | "l32i %3, %1, 0\n\t" | ||
103 | "add %0, %0, %3\n\t" | ||
104 | "bgeu %0, %3, 1f\n\t" | ||
105 | "addi %0, %0, 1\n\t" | ||
106 | "1:\t" | ||
107 | "addi %1, %1, 4\n\t" | ||
108 | #if !XCHAL_HAVE_LOOPS | ||
109 | "blt %1, %4, 0b\n\t" | ||
110 | #endif | ||
111 | "2:\t" | ||
112 | /* Since the input registers which are loaded with iph and ihl | ||
113 | are modified, we must also specify them as outputs, or gcc | ||
114 | will assume they contain their original values. */ | ||
115 | : "=r" (sum), "=r" (iph), "=r" (ihl), "=&r" (tmp), "=&r" (endaddr) | ||
116 | : "1" (iph), "2" (ihl)); | ||
117 | |||
118 | return csum_fold(sum); | ||
119 | } | ||
120 | |||
121 | static __inline__ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | ||
122 | unsigned short len, | ||
123 | unsigned short proto, | ||
124 | __wsum sum) | ||
125 | { | ||
126 | |||
127 | #ifdef __XTENSA_EL__ | ||
128 | unsigned long len_proto = (len + proto) << 8; | ||
129 | #elif defined(__XTENSA_EB__) | ||
130 | unsigned long len_proto = len + proto; | ||
131 | #else | ||
132 | # error processor byte order undefined! | ||
133 | #endif | ||
134 | __asm__("add %0, %0, %1\n\t" | ||
135 | "bgeu %0, %1, 1f\n\t" | ||
136 | "addi %0, %0, 1\n\t" | ||
137 | "1:\t" | ||
138 | "add %0, %0, %2\n\t" | ||
139 | "bgeu %0, %2, 1f\n\t" | ||
140 | "addi %0, %0, 1\n\t" | ||
141 | "1:\t" | ||
142 | "add %0, %0, %3\n\t" | ||
143 | "bgeu %0, %3, 1f\n\t" | ||
144 | "addi %0, %0, 1\n\t" | ||
145 | "1:\t" | ||
146 | : "=r" (sum), "=r" (len_proto) | ||
147 | : "r" (daddr), "r" (saddr), "1" (len_proto), "0" (sum)); | ||
148 | return sum; | ||
149 | } | ||
150 | |||
151 | /* | ||
152 | * computes the checksum of the TCP/UDP pseudo-header | ||
153 | * returns a 16-bit checksum, already complemented | ||
154 | */ | ||
155 | static __inline__ __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, | ||
156 | unsigned short len, | ||
157 | unsigned short proto, | ||
158 | __wsum sum) | ||
159 | { | ||
160 | return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); | ||
161 | } | ||
162 | |||
163 | /* | ||
164 | * this routine is used for miscellaneous IP-like checksums, mainly | ||
165 | * in icmp.c | ||
166 | */ | ||
167 | |||
168 | static __inline__ __sum16 ip_compute_csum(const void *buff, int len) | ||
169 | { | ||
170 | return csum_fold (csum_partial(buff, len, 0)); | ||
171 | } | ||
172 | |||
173 | #define _HAVE_ARCH_IPV6_CSUM | ||
174 | static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, | ||
175 | const struct in6_addr *daddr, | ||
176 | __u32 len, unsigned short proto, | ||
177 | __wsum sum) | ||
178 | { | ||
179 | unsigned int __dummy; | ||
180 | __asm__("l32i %1, %2, 0\n\t" | ||
181 | "add %0, %0, %1\n\t" | ||
182 | "bgeu %0, %1, 1f\n\t" | ||
183 | "addi %0, %0, 1\n\t" | ||
184 | "1:\t" | ||
185 | "l32i %1, %2, 4\n\t" | ||
186 | "add %0, %0, %1\n\t" | ||
187 | "bgeu %0, %1, 1f\n\t" | ||
188 | "addi %0, %0, 1\n\t" | ||
189 | "1:\t" | ||
190 | "l32i %1, %2, 8\n\t" | ||
191 | "add %0, %0, %1\n\t" | ||
192 | "bgeu %0, %1, 1f\n\t" | ||
193 | "addi %0, %0, 1\n\t" | ||
194 | "1:\t" | ||
195 | "l32i %1, %2, 12\n\t" | ||
196 | "add %0, %0, %1\n\t" | ||
197 | "bgeu %0, %1, 1f\n\t" | ||
198 | "addi %0, %0, 1\n\t" | ||
199 | "1:\t" | ||
200 | "l32i %1, %3, 0\n\t" | ||
201 | "add %0, %0, %1\n\t" | ||
202 | "bgeu %0, %1, 1f\n\t" | ||
203 | "addi %0, %0, 1\n\t" | ||
204 | "1:\t" | ||
205 | "l32i %1, %3, 4\n\t" | ||
206 | "add %0, %0, %1\n\t" | ||
207 | "bgeu %0, %1, 1f\n\t" | ||
208 | "addi %0, %0, 1\n\t" | ||
209 | "1:\t" | ||
210 | "l32i %1, %3, 8\n\t" | ||
211 | "add %0, %0, %1\n\t" | ||
212 | "bgeu %0, %1, 1f\n\t" | ||
213 | "addi %0, %0, 1\n\t" | ||
214 | "1:\t" | ||
215 | "l32i %1, %3, 12\n\t" | ||
216 | "add %0, %0, %1\n\t" | ||
217 | "bgeu %0, %1, 1f\n\t" | ||
218 | "addi %0, %0, 1\n\t" | ||
219 | "1:\t" | ||
220 | "add %0, %0, %4\n\t" | ||
221 | "bgeu %0, %4, 1f\n\t" | ||
222 | "addi %0, %0, 1\n\t" | ||
223 | "1:\t" | ||
224 | "add %0, %0, %5\n\t" | ||
225 | "bgeu %0, %5, 1f\n\t" | ||
226 | "addi %0, %0, 1\n\t" | ||
227 | "1:\t" | ||
228 | : "=r" (sum), "=&r" (__dummy) | ||
229 | : "r" (saddr), "r" (daddr), | ||
230 | "r" (htonl(len)), "r" (htonl(proto)), "0" (sum)); | ||
231 | |||
232 | return csum_fold(sum); | ||
233 | } | ||
234 | |||
235 | /* | ||
236 | * Copy and checksum to user | ||
237 | */ | ||
238 | #define HAVE_CSUM_COPY_USER | ||
239 | static __inline__ __wsum csum_and_copy_to_user(const void *src, void __user *dst, | ||
240 | int len, __wsum sum, int *err_ptr) | ||
241 | { | ||
242 | if (access_ok(VERIFY_WRITE, dst, len)) | ||
243 | return csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr); | ||
244 | |||
245 | if (len) | ||
246 | *err_ptr = -EFAULT; | ||
247 | |||
248 | return (__force __wsum)-1; /* invalid checksum */ | ||
249 | } | ||
250 | #endif | ||
diff --git a/include/asm-xtensa/coprocessor.h b/include/asm-xtensa/coprocessor.h deleted file mode 100644 index 1cbcf9001a41..000000000000 --- a/include/asm-xtensa/coprocessor.h +++ /dev/null | |||
@@ -1,177 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/coprocessor.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2003 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | |||
12 | #ifndef _XTENSA_COPROCESSOR_H | ||
13 | #define _XTENSA_COPROCESSOR_H | ||
14 | |||
15 | #include <linux/stringify.h> | ||
16 | #include <asm/variant/tie.h> | ||
17 | #include <asm/types.h> | ||
18 | |||
19 | #ifdef __ASSEMBLY__ | ||
20 | # include <asm/variant/tie-asm.h> | ||
21 | |||
22 | .macro xchal_sa_start a b | ||
23 | .set .Lxchal_pofs_, 0 | ||
24 | .set .Lxchal_ofs_, 0 | ||
25 | .endm | ||
26 | |||
27 | .macro xchal_sa_align ptr minofs maxofs ofsalign totalign | ||
28 | .set .Lxchal_ofs_, .Lxchal_ofs_ + .Lxchal_pofs_ + \totalign - 1 | ||
29 | .set .Lxchal_ofs_, (.Lxchal_ofs_ & -\totalign) - .Lxchal_pofs_ | ||
30 | .endm | ||
31 | |||
32 | #define _SELECT ( XTHAL_SAS_TIE | XTHAL_SAS_OPT \ | ||
33 | | XTHAL_SAS_CC \ | ||
34 | | XTHAL_SAS_CALR | XTHAL_SAS_CALE ) | ||
35 | |||
36 | .macro save_xtregs_opt ptr clb at1 at2 at3 at4 offset | ||
37 | .if XTREGS_OPT_SIZE > 0 | ||
38 | addi \clb, \ptr, \offset | ||
39 | xchal_ncp_store \clb \at1 \at2 \at3 \at4 select=_SELECT | ||
40 | .endif | ||
41 | .endm | ||
42 | |||
43 | .macro load_xtregs_opt ptr clb at1 at2 at3 at4 offset | ||
44 | .if XTREGS_OPT_SIZE > 0 | ||
45 | addi \clb, \ptr, \offset | ||
46 | xchal_ncp_load \clb \at1 \at2 \at3 \at4 select=_SELECT | ||
47 | .endif | ||
48 | .endm | ||
49 | #undef _SELECT | ||
50 | |||
51 | #define _SELECT ( XTHAL_SAS_TIE | XTHAL_SAS_OPT \ | ||
52 | | XTHAL_SAS_NOCC \ | ||
53 | | XTHAL_SAS_CALR | XTHAL_SAS_CALE | XTHAL_SAS_GLOB ) | ||
54 | |||
55 | .macro save_xtregs_user ptr clb at1 at2 at3 at4 offset | ||
56 | .if XTREGS_USER_SIZE > 0 | ||
57 | addi \clb, \ptr, \offset | ||
58 | xchal_ncp_store \clb \at1 \at2 \at3 \at4 select=_SELECT | ||
59 | .endif | ||
60 | .endm | ||
61 | |||
62 | .macro load_xtregs_user ptr clb at1 at2 at3 at4 offset | ||
63 | .if XTREGS_USER_SIZE > 0 | ||
64 | addi \clb, \ptr, \offset | ||
65 | xchal_ncp_load \clb \at1 \at2 \at3 \at4 select=_SELECT | ||
66 | .endif | ||
67 | .endm | ||
68 | #undef _SELECT | ||
69 | |||
70 | |||
71 | |||
72 | #endif /* __ASSEMBLY__ */ | ||
73 | |||
74 | /* | ||
75 | * XTENSA_HAVE_COPROCESSOR(x) returns 1 if coprocessor x is configured. | ||
76 | * | ||
77 | * XTENSA_HAVE_IO_PORT(x) returns 1 if io-port x is configured. | ||
78 | * | ||
79 | */ | ||
80 | |||
81 | #define XTENSA_HAVE_COPROCESSOR(x) \ | ||
82 | ((XCHAL_CP_MASK ^ XCHAL_CP_PORT_MASK) & (1 << (x))) | ||
83 | #define XTENSA_HAVE_COPROCESSORS \ | ||
84 | (XCHAL_CP_MASK ^ XCHAL_CP_PORT_MASK) | ||
85 | #define XTENSA_HAVE_IO_PORT(x) \ | ||
86 | (XCHAL_CP_PORT_MASK & (1 << (x))) | ||
87 | #define XTENSA_HAVE_IO_PORTS \ | ||
88 | XCHAL_CP_PORT_MASK | ||
89 | |||
90 | #ifndef __ASSEMBLY__ | ||
91 | |||
92 | |||
93 | #if XCHAL_HAVE_CP | ||
94 | |||
95 | #define RSR_CPENABLE(x) do { \ | ||
96 | __asm__ __volatile__("rsr %0," __stringify(CPENABLE) : "=a" (x)); \ | ||
97 | } while(0); | ||
98 | #define WSR_CPENABLE(x) do { \ | ||
99 | __asm__ __volatile__("wsr %0," __stringify(CPENABLE) "; rsync" \ | ||
100 | :: "a" (x)); \ | ||
101 | } while(0); | ||
102 | |||
103 | #endif /* XCHAL_HAVE_CP */ | ||
104 | |||
105 | |||
106 | /* | ||
107 | * Additional registers. | ||
108 | * We define three types of additional registers: | ||
109 | * ext: extra registers that are used by the compiler | ||
110 | * cpn: optional registers that can be used by a user application | ||
111 | * cpX: coprocessor registers that can only be used if the corresponding | ||
112 | * CPENABLE bit is set. | ||
113 | */ | ||
114 | |||
115 | #define XCHAL_SA_REG(list,cc,abi,type,y,name,z,align,size,...) \ | ||
116 | __REG ## list (cc, abi, type, name, size, align) | ||
117 | |||
118 | #define __REG0(cc,abi,t,name,s,a) __REG0_ ## cc (abi,name) | ||
119 | #define __REG1(cc,abi,t,name,s,a) __REG1_ ## cc (name) | ||
120 | #define __REG2(cc,abi,type,...) __REG2_ ## type (__VA_ARGS__) | ||
121 | |||
122 | #define __REG0_0(abi,name) | ||
123 | #define __REG0_1(abi,name) __REG0_1 ## abi (name) | ||
124 | #define __REG0_10(name) __u32 name; | ||
125 | #define __REG0_11(name) __u32 name; | ||
126 | #define __REG0_12(name) | ||
127 | |||
128 | #define __REG1_0(name) __u32 name; | ||
129 | #define __REG1_1(name) | ||
130 | |||
131 | #define __REG2_0(n,s,a) __u32 name; | ||
132 | #define __REG2_1(n,s,a) unsigned char n[s] __attribute__ ((aligned(a))); | ||
133 | #define __REG2_2(n,s,a) unsigned char n[s] __attribute__ ((aligned(a))); | ||
134 | |||
135 | typedef struct { XCHAL_NCP_SA_LIST(0) } xtregs_opt_t | ||
136 | __attribute__ ((aligned (XCHAL_NCP_SA_ALIGN))); | ||
137 | typedef struct { XCHAL_NCP_SA_LIST(1) } xtregs_user_t | ||
138 | __attribute__ ((aligned (XCHAL_NCP_SA_ALIGN))); | ||
139 | |||
140 | #if XTENSA_HAVE_COPROCESSORS | ||
141 | |||
142 | typedef struct { XCHAL_CP0_SA_LIST(2) } xtregs_cp0_t | ||
143 | __attribute__ ((aligned (XCHAL_CP0_SA_ALIGN))); | ||
144 | typedef struct { XCHAL_CP1_SA_LIST(2) } xtregs_cp1_t | ||
145 | __attribute__ ((aligned (XCHAL_CP1_SA_ALIGN))); | ||
146 | typedef struct { XCHAL_CP2_SA_LIST(2) } xtregs_cp2_t | ||
147 | __attribute__ ((aligned (XCHAL_CP2_SA_ALIGN))); | ||
148 | typedef struct { XCHAL_CP3_SA_LIST(2) } xtregs_cp3_t | ||
149 | __attribute__ ((aligned (XCHAL_CP3_SA_ALIGN))); | ||
150 | typedef struct { XCHAL_CP4_SA_LIST(2) } xtregs_cp4_t | ||
151 | __attribute__ ((aligned (XCHAL_CP4_SA_ALIGN))); | ||
152 | typedef struct { XCHAL_CP5_SA_LIST(2) } xtregs_cp5_t | ||
153 | __attribute__ ((aligned (XCHAL_CP5_SA_ALIGN))); | ||
154 | typedef struct { XCHAL_CP6_SA_LIST(2) } xtregs_cp6_t | ||
155 | __attribute__ ((aligned (XCHAL_CP6_SA_ALIGN))); | ||
156 | typedef struct { XCHAL_CP7_SA_LIST(2) } xtregs_cp7_t | ||
157 | __attribute__ ((aligned (XCHAL_CP7_SA_ALIGN))); | ||
158 | |||
159 | extern struct thread_info* coprocessor_owner[XCHAL_CP_MAX]; | ||
160 | extern void coprocessor_save(void*, int); | ||
161 | extern void coprocessor_load(void*, int); | ||
162 | extern void coprocessor_flush(struct thread_info*, int); | ||
163 | extern void coprocessor_restore(struct thread_info*, int); | ||
164 | |||
165 | extern void coprocessor_release_all(struct thread_info*); | ||
166 | extern void coprocessor_flush_all(struct thread_info*); | ||
167 | |||
168 | static inline void coprocessor_clear_cpenable(void) | ||
169 | { | ||
170 | unsigned long i = 0; | ||
171 | WSR_CPENABLE(i); | ||
172 | } | ||
173 | |||
174 | #endif /* XTENSA_HAVE_COPROCESSORS */ | ||
175 | |||
176 | #endif /* !__ASSEMBLY__ */ | ||
177 | #endif /* _XTENSA_COPROCESSOR_H */ | ||
diff --git a/include/asm-xtensa/cpumask.h b/include/asm-xtensa/cpumask.h deleted file mode 100644 index ebeede397db3..000000000000 --- a/include/asm-xtensa/cpumask.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/cpumask.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CPUMASK_H | ||
12 | #define _XTENSA_CPUMASK_H | ||
13 | |||
14 | #include <asm-generic/cpumask.h> | ||
15 | |||
16 | #endif /* _XTENSA_CPUMASK_H */ | ||
diff --git a/include/asm-xtensa/cputime.h b/include/asm-xtensa/cputime.h deleted file mode 100644 index a7fb864a50ae..000000000000 --- a/include/asm-xtensa/cputime.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | #ifndef _XTENSA_CPUTIME_H | ||
2 | #define _XTENSA_CPUTIME_H | ||
3 | |||
4 | #include <asm-generic/cputime.h> | ||
5 | |||
6 | #endif /* _XTENSA_CPUTIME_H */ | ||
diff --git a/include/asm-xtensa/current.h b/include/asm-xtensa/current.h deleted file mode 100644 index 8d1eb5d78649..000000000000 --- a/include/asm-xtensa/current.h +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/current.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CURRENT_H | ||
12 | #define _XTENSA_CURRENT_H | ||
13 | |||
14 | #ifndef __ASSEMBLY__ | ||
15 | |||
16 | #include <linux/thread_info.h> | ||
17 | |||
18 | struct task_struct; | ||
19 | |||
20 | static inline struct task_struct *get_current(void) | ||
21 | { | ||
22 | return current_thread_info()->task; | ||
23 | } | ||
24 | |||
25 | #define current get_current() | ||
26 | |||
27 | #else | ||
28 | |||
29 | #define CURRENT_SHIFT 13 | ||
30 | |||
31 | #define GET_CURRENT(reg,sp) \ | ||
32 | GET_THREAD_INFO(reg,sp); \ | ||
33 | l32i reg, reg, TI_TASK \ | ||
34 | |||
35 | #endif | ||
36 | |||
37 | |||
38 | #endif /* XTENSA_CURRENT_H */ | ||
diff --git a/include/asm-xtensa/delay.h b/include/asm-xtensa/delay.h deleted file mode 100644 index e1d8c9e010c1..000000000000 --- a/include/asm-xtensa/delay.h +++ /dev/null | |||
@@ -1,49 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/delay.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #ifndef _XTENSA_DELAY_H | ||
13 | #define _XTENSA_DELAY_H | ||
14 | |||
15 | #include <asm/processor.h> | ||
16 | #include <asm/param.h> | ||
17 | |||
18 | extern unsigned long loops_per_jiffy; | ||
19 | |||
20 | static inline void __delay(unsigned long loops) | ||
21 | { | ||
22 | /* 2 cycles per loop. */ | ||
23 | __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b" | ||
24 | : "=r" (loops) : "0" (loops)); | ||
25 | } | ||
26 | |||
27 | static __inline__ u32 xtensa_get_ccount(void) | ||
28 | { | ||
29 | u32 ccount; | ||
30 | asm volatile ("rsr %0, 234; # CCOUNT\n" : "=r" (ccount)); | ||
31 | return ccount; | ||
32 | } | ||
33 | |||
34 | /* For SMP/NUMA systems, change boot_cpu_data to something like | ||
35 | * local_cpu_data->... where local_cpu_data points to the current | ||
36 | * cpu. */ | ||
37 | |||
38 | static __inline__ void udelay (unsigned long usecs) | ||
39 | { | ||
40 | unsigned long start = xtensa_get_ccount(); | ||
41 | unsigned long cycles = usecs * (loops_per_jiffy / (1000000UL / HZ)); | ||
42 | |||
43 | /* Note: all variables are unsigned (can wrap around)! */ | ||
44 | while (((unsigned long)xtensa_get_ccount()) - start < cycles) | ||
45 | ; | ||
46 | } | ||
47 | |||
48 | #endif | ||
49 | |||
diff --git a/include/asm-xtensa/device.h b/include/asm-xtensa/device.h deleted file mode 100644 index d8f9872b0e2d..000000000000 --- a/include/asm-xtensa/device.h +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | /* | ||
2 | * Arch specific extensions to struct device | ||
3 | * | ||
4 | * This file is released under the GPLv2 | ||
5 | */ | ||
6 | #include <asm-generic/device.h> | ||
7 | |||
diff --git a/include/asm-xtensa/div64.h b/include/asm-xtensa/div64.h deleted file mode 100644 index f35678cb0a9b..000000000000 --- a/include/asm-xtensa/div64.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/div64.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_DIV64_H | ||
12 | #define _XTENSA_DIV64_H | ||
13 | |||
14 | #include <asm-generic/div64.h> | ||
15 | |||
16 | #endif /* _XTENSA_DIV64_H */ | ||
diff --git a/include/asm-xtensa/dma-mapping.h b/include/asm-xtensa/dma-mapping.h deleted file mode 100644 index 51882ae3db4d..000000000000 --- a/include/asm-xtensa/dma-mapping.h +++ /dev/null | |||
@@ -1,179 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/dma-mapping.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2003 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_DMA_MAPPING_H | ||
12 | #define _XTENSA_DMA_MAPPING_H | ||
13 | |||
14 | #include <asm/cache.h> | ||
15 | #include <asm/io.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/scatterlist.h> | ||
18 | |||
19 | /* | ||
20 | * DMA-consistent mapping functions. | ||
21 | */ | ||
22 | |||
23 | extern void *consistent_alloc(int, size_t, dma_addr_t, unsigned long); | ||
24 | extern void consistent_free(void*, size_t, dma_addr_t); | ||
25 | extern void consistent_sync(void*, size_t, int); | ||
26 | |||
27 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | ||
28 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | ||
29 | |||
30 | void *dma_alloc_coherent(struct device *dev, size_t size, | ||
31 | dma_addr_t *dma_handle, gfp_t flag); | ||
32 | |||
33 | void dma_free_coherent(struct device *dev, size_t size, | ||
34 | void *vaddr, dma_addr_t dma_handle); | ||
35 | |||
36 | static inline dma_addr_t | ||
37 | dma_map_single(struct device *dev, void *ptr, size_t size, | ||
38 | enum dma_data_direction direction) | ||
39 | { | ||
40 | BUG_ON(direction == DMA_NONE); | ||
41 | consistent_sync(ptr, size, direction); | ||
42 | return virt_to_phys(ptr); | ||
43 | } | ||
44 | |||
45 | static inline void | ||
46 | dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | ||
47 | enum dma_data_direction direction) | ||
48 | { | ||
49 | BUG_ON(direction == DMA_NONE); | ||
50 | } | ||
51 | |||
52 | static inline int | ||
53 | dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
54 | enum dma_data_direction direction) | ||
55 | { | ||
56 | int i; | ||
57 | |||
58 | BUG_ON(direction == DMA_NONE); | ||
59 | |||
60 | for (i = 0; i < nents; i++, sg++ ) { | ||
61 | BUG_ON(!sg_page(sg)); | ||
62 | |||
63 | sg->dma_address = sg_phys(sg); | ||
64 | consistent_sync(sg_virt(sg), sg->length, direction); | ||
65 | } | ||
66 | |||
67 | return nents; | ||
68 | } | ||
69 | |||
70 | static inline dma_addr_t | ||
71 | dma_map_page(struct device *dev, struct page *page, unsigned long offset, | ||
72 | size_t size, enum dma_data_direction direction) | ||
73 | { | ||
74 | BUG_ON(direction == DMA_NONE); | ||
75 | return (dma_addr_t)(page_to_pfn(page)) * PAGE_SIZE + offset; | ||
76 | } | ||
77 | |||
78 | static inline void | ||
79 | dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, | ||
80 | enum dma_data_direction direction) | ||
81 | { | ||
82 | BUG_ON(direction == DMA_NONE); | ||
83 | } | ||
84 | |||
85 | |||
86 | static inline void | ||
87 | dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, | ||
88 | enum dma_data_direction direction) | ||
89 | { | ||
90 | BUG_ON(direction == DMA_NONE); | ||
91 | } | ||
92 | |||
93 | static inline void | ||
94 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
95 | enum dma_data_direction direction) | ||
96 | { | ||
97 | consistent_sync((void *)bus_to_virt(dma_handle), size, direction); | ||
98 | } | ||
99 | |||
100 | static inline void | ||
101 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
102 | enum dma_data_direction direction) | ||
103 | { | ||
104 | consistent_sync((void *)bus_to_virt(dma_handle), size, direction); | ||
105 | } | ||
106 | |||
107 | static inline void | ||
108 | dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, | ||
109 | unsigned long offset, size_t size, | ||
110 | enum dma_data_direction direction) | ||
111 | { | ||
112 | |||
113 | consistent_sync((void *)bus_to_virt(dma_handle)+offset,size,direction); | ||
114 | } | ||
115 | |||
116 | static inline void | ||
117 | dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, | ||
118 | unsigned long offset, size_t size, | ||
119 | enum dma_data_direction direction) | ||
120 | { | ||
121 | |||
122 | consistent_sync((void *)bus_to_virt(dma_handle)+offset,size,direction); | ||
123 | } | ||
124 | static inline void | ||
125 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | ||
126 | enum dma_data_direction dir) | ||
127 | { | ||
128 | int i; | ||
129 | for (i = 0; i < nelems; i++, sg++) | ||
130 | consistent_sync(sg_virt(sg), sg->length, dir); | ||
131 | } | ||
132 | |||
133 | static inline void | ||
134 | dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, | ||
135 | enum dma_data_direction dir) | ||
136 | { | ||
137 | int i; | ||
138 | for (i = 0; i < nelems; i++, sg++) | ||
139 | consistent_sync(sg_virt(sg), sg->length, dir); | ||
140 | } | ||
141 | static inline int | ||
142 | dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
143 | { | ||
144 | return 0; | ||
145 | } | ||
146 | |||
147 | static inline int | ||
148 | dma_supported(struct device *dev, u64 mask) | ||
149 | { | ||
150 | return 1; | ||
151 | } | ||
152 | |||
153 | static inline int | ||
154 | dma_set_mask(struct device *dev, u64 mask) | ||
155 | { | ||
156 | if(!dev->dma_mask || !dma_supported(dev, mask)) | ||
157 | return -EIO; | ||
158 | |||
159 | *dev->dma_mask = mask; | ||
160 | |||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | static inline int | ||
165 | dma_get_cache_alignment(void) | ||
166 | { | ||
167 | return L1_CACHE_BYTES; | ||
168 | } | ||
169 | |||
170 | #define dma_is_consistent(d, h) (1) | ||
171 | |||
172 | static inline void | ||
173 | dma_cache_sync(struct device *dev, void *vaddr, size_t size, | ||
174 | enum dma_data_direction direction) | ||
175 | { | ||
176 | consistent_sync(vaddr, size, direction); | ||
177 | } | ||
178 | |||
179 | #endif /* _XTENSA_DMA_MAPPING_H */ | ||
diff --git a/include/asm-xtensa/dma.h b/include/asm-xtensa/dma.h deleted file mode 100644 index e30f3abf48f0..000000000000 --- a/include/asm-xtensa/dma.h +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/dma.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2003 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_DMA_H | ||
12 | #define _XTENSA_DMA_H | ||
13 | |||
14 | #include <asm/io.h> /* need byte IO */ | ||
15 | |||
16 | /* | ||
17 | * This is only to be defined if we have PC-like DMA. | ||
18 | * By default this is not true on an Xtensa processor, | ||
19 | * however on boards with a PCI bus, such functionality | ||
20 | * might be emulated externally. | ||
21 | * | ||
22 | * NOTE: there still exists driver code that assumes | ||
23 | * this is defined, eg. drivers/sound/soundcard.c (as of 2.4). | ||
24 | */ | ||
25 | #define MAX_DMA_CHANNELS 8 | ||
26 | |||
27 | /* | ||
28 | * The maximum virtual address to which DMA transfers | ||
29 | * can be performed on this platform. | ||
30 | * | ||
31 | * NOTE: This is board (platform) specific, not processor-specific! | ||
32 | * | ||
33 | * NOTE: This assumes DMA transfers can only be performed on | ||
34 | * the section of physical memory contiguously mapped in virtual | ||
35 | * space for the kernel. For the Xtensa architecture, this | ||
36 | * means the maximum possible size of this DMA area is | ||
37 | * the size of the statically mapped kernel segment | ||
38 | * (XCHAL_KSEG_{CACHED,BYPASS}_SIZE), ie. 128 MB. | ||
39 | * | ||
40 | * NOTE: When the entire KSEG area is DMA capable, we substract | ||
41 | * one from the max address so that the virt_to_phys() macro | ||
42 | * works correctly on the address (otherwise the address | ||
43 | * enters another area, and virt_to_phys() may not return | ||
44 | * the value desired). | ||
45 | */ | ||
46 | |||
47 | #define MAX_DMA_ADDRESS (PAGE_OFFSET + XCHAL_KIO_SIZE - 1) | ||
48 | |||
49 | |||
50 | /* Reserve and release a DMA channel */ | ||
51 | extern int request_dma(unsigned int dmanr, const char * device_id); | ||
52 | extern void free_dma(unsigned int dmanr); | ||
53 | |||
54 | #ifdef CONFIG_PCI | ||
55 | extern int isa_dma_bridge_buggy; | ||
56 | #else | ||
57 | #define isa_dma_bridge_buggy (0) | ||
58 | #endif | ||
59 | |||
60 | |||
61 | #endif | ||
diff --git a/include/asm-xtensa/elf.h b/include/asm-xtensa/elf.h deleted file mode 100644 index c3f53e755ca5..000000000000 --- a/include/asm-xtensa/elf.h +++ /dev/null | |||
@@ -1,205 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/elf.h | ||
3 | * | ||
4 | * ELF register definitions | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_ELF_H | ||
14 | #define _XTENSA_ELF_H | ||
15 | |||
16 | #include <asm/ptrace.h> | ||
17 | |||
18 | /* Xtensa processor ELF architecture-magic number */ | ||
19 | |||
20 | #define EM_XTENSA 94 | ||
21 | #define EM_XTENSA_OLD 0xABC7 | ||
22 | |||
23 | /* Xtensa relocations defined by the ABIs */ | ||
24 | |||
25 | #define R_XTENSA_NONE 0 | ||
26 | #define R_XTENSA_32 1 | ||
27 | #define R_XTENSA_RTLD 2 | ||
28 | #define R_XTENSA_GLOB_DAT 3 | ||
29 | #define R_XTENSA_JMP_SLOT 4 | ||
30 | #define R_XTENSA_RELATIVE 5 | ||
31 | #define R_XTENSA_PLT 6 | ||
32 | #define R_XTENSA_OP0 8 | ||
33 | #define R_XTENSA_OP1 9 | ||
34 | #define R_XTENSA_OP2 10 | ||
35 | #define R_XTENSA_ASM_EXPAND 11 | ||
36 | #define R_XTENSA_ASM_SIMPLIFY 12 | ||
37 | #define R_XTENSA_GNU_VTINHERIT 15 | ||
38 | #define R_XTENSA_GNU_VTENTRY 16 | ||
39 | #define R_XTENSA_DIFF8 17 | ||
40 | #define R_XTENSA_DIFF16 18 | ||
41 | #define R_XTENSA_DIFF32 19 | ||
42 | #define R_XTENSA_SLOT0_OP 20 | ||
43 | #define R_XTENSA_SLOT1_OP 21 | ||
44 | #define R_XTENSA_SLOT2_OP 22 | ||
45 | #define R_XTENSA_SLOT3_OP 23 | ||
46 | #define R_XTENSA_SLOT4_OP 24 | ||
47 | #define R_XTENSA_SLOT5_OP 25 | ||
48 | #define R_XTENSA_SLOT6_OP 26 | ||
49 | #define R_XTENSA_SLOT7_OP 27 | ||
50 | #define R_XTENSA_SLOT8_OP 28 | ||
51 | #define R_XTENSA_SLOT9_OP 29 | ||
52 | #define R_XTENSA_SLOT10_OP 30 | ||
53 | #define R_XTENSA_SLOT11_OP 31 | ||
54 | #define R_XTENSA_SLOT12_OP 32 | ||
55 | #define R_XTENSA_SLOT13_OP 33 | ||
56 | #define R_XTENSA_SLOT14_OP 34 | ||
57 | #define R_XTENSA_SLOT0_ALT 35 | ||
58 | #define R_XTENSA_SLOT1_ALT 36 | ||
59 | #define R_XTENSA_SLOT2_ALT 37 | ||
60 | #define R_XTENSA_SLOT3_ALT 38 | ||
61 | #define R_XTENSA_SLOT4_ALT 39 | ||
62 | #define R_XTENSA_SLOT5_ALT 40 | ||
63 | #define R_XTENSA_SLOT6_ALT 41 | ||
64 | #define R_XTENSA_SLOT7_ALT 42 | ||
65 | #define R_XTENSA_SLOT8_ALT 43 | ||
66 | #define R_XTENSA_SLOT9_ALT 44 | ||
67 | #define R_XTENSA_SLOT10_ALT 45 | ||
68 | #define R_XTENSA_SLOT11_ALT 46 | ||
69 | #define R_XTENSA_SLOT12_ALT 47 | ||
70 | #define R_XTENSA_SLOT13_ALT 48 | ||
71 | #define R_XTENSA_SLOT14_ALT 49 | ||
72 | |||
73 | /* ELF register definitions. This is needed for core dump support. */ | ||
74 | |||
75 | typedef unsigned long elf_greg_t; | ||
76 | |||
77 | typedef struct { | ||
78 | elf_greg_t pc; | ||
79 | elf_greg_t ps; | ||
80 | elf_greg_t lbeg; | ||
81 | elf_greg_t lend; | ||
82 | elf_greg_t lcount; | ||
83 | elf_greg_t sar; | ||
84 | elf_greg_t windowstart; | ||
85 | elf_greg_t windowbase; | ||
86 | elf_greg_t reserved[8+48]; | ||
87 | elf_greg_t a[64]; | ||
88 | } xtensa_gregset_t; | ||
89 | |||
90 | #define ELF_NGREG (sizeof(xtensa_gregset_t) / sizeof(elf_greg_t)) | ||
91 | |||
92 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | ||
93 | |||
94 | #define ELF_NFPREG 18 | ||
95 | |||
96 | typedef unsigned int elf_fpreg_t; | ||
97 | typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; | ||
98 | |||
99 | #define ELF_CORE_COPY_REGS(_eregs, _pregs) \ | ||
100 | xtensa_elf_core_copy_regs ((xtensa_gregset_t*)&(_eregs), _pregs); | ||
101 | |||
102 | extern void xtensa_elf_core_copy_regs (xtensa_gregset_t *, struct pt_regs *); | ||
103 | |||
104 | /* | ||
105 | * This is used to ensure we don't load something for the wrong architecture. | ||
106 | */ | ||
107 | |||
108 | #define elf_check_arch(x) ( ( (x)->e_machine == EM_XTENSA ) || \ | ||
109 | ( (x)->e_machine == EM_XTENSA_OLD ) ) | ||
110 | |||
111 | /* | ||
112 | * These are used to set parameters in the core dumps. | ||
113 | */ | ||
114 | |||
115 | #ifdef __XTENSA_EL__ | ||
116 | # define ELF_DATA ELFDATA2LSB | ||
117 | #elif defined(__XTENSA_EB__) | ||
118 | # define ELF_DATA ELFDATA2MSB | ||
119 | #else | ||
120 | # error processor byte order undefined! | ||
121 | #endif | ||
122 | |||
123 | #define ELF_CLASS ELFCLASS32 | ||
124 | #define ELF_ARCH EM_XTENSA | ||
125 | |||
126 | #define USE_ELF_CORE_DUMP | ||
127 | #define ELF_EXEC_PAGESIZE PAGE_SIZE | ||
128 | |||
129 | /* | ||
130 | * This is the location that an ET_DYN program is loaded if exec'ed. Typical | ||
131 | * use of this is to invoke "./ld.so someprog" to test out a new version of | ||
132 | * the loader. We need to make sure that it is out of the way of the program | ||
133 | * that it will "exec", and that there is sufficient room for the brk. | ||
134 | */ | ||
135 | |||
136 | #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | ||
137 | |||
138 | /* | ||
139 | * This yields a mask that user programs can use to figure out what | ||
140 | * instruction set this CPU supports. This could be done in user space, | ||
141 | * but it's not easy, and we've already done it here. | ||
142 | */ | ||
143 | |||
144 | #define ELF_HWCAP (0) | ||
145 | |||
146 | /* | ||
147 | * This yields a string that ld.so will use to load implementation | ||
148 | * specific libraries for optimization. This is more specific in | ||
149 | * intent than poking at uname or /proc/cpuinfo. | ||
150 | * For the moment, we have only optimizations for the Intel generations, | ||
151 | * but that could change... | ||
152 | */ | ||
153 | |||
154 | #define ELF_PLATFORM (NULL) | ||
155 | |||
156 | /* | ||
157 | * The Xtensa processor ABI says that when the program starts, a2 | ||
158 | * contains a pointer to a function which might be registered using | ||
159 | * `atexit'. This provides a mean for the dynamic linker to call | ||
160 | * DT_FINI functions for shared libraries that have been loaded before | ||
161 | * the code runs. | ||
162 | * | ||
163 | * A value of 0 tells we have no such handler. | ||
164 | * | ||
165 | * We might as well make sure everything else is cleared too (except | ||
166 | * for the stack pointer in a1), just to make things more | ||
167 | * deterministic. Also, clearing a0 terminates debugger backtraces. | ||
168 | */ | ||
169 | |||
170 | #define ELF_PLAT_INIT(_r, load_addr) \ | ||
171 | do { _r->areg[0]=0; /*_r->areg[1]=0;*/ _r->areg[2]=0; _r->areg[3]=0; \ | ||
172 | _r->areg[4]=0; _r->areg[5]=0; _r->areg[6]=0; _r->areg[7]=0; \ | ||
173 | _r->areg[8]=0; _r->areg[9]=0; _r->areg[10]=0; _r->areg[11]=0; \ | ||
174 | _r->areg[12]=0; _r->areg[13]=0; _r->areg[14]=0; _r->areg[15]=0; \ | ||
175 | } while (0) | ||
176 | |||
177 | typedef struct { | ||
178 | xtregs_opt_t opt; | ||
179 | xtregs_user_t user; | ||
180 | #if XTENSA_HAVE_COPROCESSORS | ||
181 | xtregs_cp0_t cp0; | ||
182 | xtregs_cp1_t cp1; | ||
183 | xtregs_cp2_t cp2; | ||
184 | xtregs_cp3_t cp3; | ||
185 | xtregs_cp4_t cp4; | ||
186 | xtregs_cp5_t cp5; | ||
187 | xtregs_cp6_t cp6; | ||
188 | xtregs_cp7_t cp7; | ||
189 | #endif | ||
190 | } elf_xtregs_t; | ||
191 | |||
192 | #define SET_PERSONALITY(ex) set_personality(PER_LINUX_32BIT) | ||
193 | |||
194 | struct task_struct; | ||
195 | |||
196 | extern void do_copy_regs (xtensa_gregset_t*, struct pt_regs*, | ||
197 | struct task_struct*); | ||
198 | extern void do_restore_regs (xtensa_gregset_t*, struct pt_regs*, | ||
199 | struct task_struct*); | ||
200 | extern void do_save_fpregs (elf_fpregset_t*, struct pt_regs*, | ||
201 | struct task_struct*); | ||
202 | extern int do_restore_fpregs (elf_fpregset_t*, struct pt_regs*, | ||
203 | struct task_struct*); | ||
204 | |||
205 | #endif /* _XTENSA_ELF_H */ | ||
diff --git a/include/asm-xtensa/emergency-restart.h b/include/asm-xtensa/emergency-restart.h deleted file mode 100644 index 108d8c48e42e..000000000000 --- a/include/asm-xtensa/emergency-restart.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | #ifndef _ASM_EMERGENCY_RESTART_H | ||
2 | #define _ASM_EMERGENCY_RESTART_H | ||
3 | |||
4 | #include <asm-generic/emergency-restart.h> | ||
5 | |||
6 | #endif /* _ASM_EMERGENCY_RESTART_H */ | ||
diff --git a/include/asm-xtensa/errno.h b/include/asm-xtensa/errno.h deleted file mode 100644 index a0f3b96b79b4..000000000000 --- a/include/asm-xtensa/errno.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/errno.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | * | ||
8 | * Copyright (C) 2002 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_ERRNO_H | ||
12 | #define _XTENSA_ERRNO_H | ||
13 | |||
14 | #include <asm-generic/errno.h> | ||
15 | |||
16 | #endif /* _XTENSA_ERRNO_H */ | ||
diff --git a/include/asm-xtensa/fb.h b/include/asm-xtensa/fb.h deleted file mode 100644 index c7df38030992..000000000000 --- a/include/asm-xtensa/fb.h +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | #ifndef _ASM_FB_H_ | ||
2 | #define _ASM_FB_H_ | ||
3 | #include <linux/fb.h> | ||
4 | |||
5 | #define fb_pgprotect(...) do {} while (0) | ||
6 | |||
7 | static inline int fb_is_primary_device(struct fb_info *info) | ||
8 | { | ||
9 | return 0; | ||
10 | } | ||
11 | |||
12 | #endif /* _ASM_FB_H_ */ | ||
diff --git a/include/asm-xtensa/fcntl.h b/include/asm-xtensa/fcntl.h deleted file mode 100644 index 46ab12db5739..000000000000 --- a/include/asm-xtensa/fcntl.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/fcntl.h> | ||
diff --git a/include/asm-xtensa/futex.h b/include/asm-xtensa/futex.h deleted file mode 100644 index 0b745828f42b..000000000000 --- a/include/asm-xtensa/futex.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/futex.h> | ||
diff --git a/include/asm-xtensa/hardirq.h b/include/asm-xtensa/hardirq.h deleted file mode 100644 index 87cb19d1b10c..000000000000 --- a/include/asm-xtensa/hardirq.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/hardirq.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | * | ||
8 | * Copyright (C) 2002 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_HARDIRQ_H | ||
12 | #define _XTENSA_HARDIRQ_H | ||
13 | |||
14 | #include <linux/cache.h> | ||
15 | #include <asm/irq.h> | ||
16 | |||
17 | /* headers.S is sensitive to the offsets of these fields */ | ||
18 | typedef struct { | ||
19 | unsigned int __softirq_pending; | ||
20 | unsigned int __syscall_count; | ||
21 | struct task_struct * __ksoftirqd_task; /* waitqueue is too large */ | ||
22 | unsigned int __nmi_count; /* arch dependent */ | ||
23 | } ____cacheline_aligned irq_cpustat_t; | ||
24 | |||
25 | void ack_bad_irq(unsigned int irq); | ||
26 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | ||
27 | |||
28 | #endif /* _XTENSA_HARDIRQ_H */ | ||
diff --git a/include/asm-xtensa/highmem.h b/include/asm-xtensa/highmem.h deleted file mode 100644 index 0a046ca5a687..000000000000 --- a/include/asm-xtensa/highmem.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/highmem.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | * | ||
8 | * Copyright (C) 2003 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_HIGHMEM_H | ||
12 | #define _XTENSA_HIGHMEM_H | ||
13 | |||
14 | extern void flush_cache_kmaps(void); | ||
15 | |||
16 | #endif | ||
17 | |||
diff --git a/include/asm-xtensa/hw_irq.h b/include/asm-xtensa/hw_irq.h deleted file mode 100644 index 3ddbea759b2b..000000000000 --- a/include/asm-xtensa/hw_irq.h +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/hw_irq.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | * | ||
8 | * Copyright (C) 2002 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_HW_IRQ_H | ||
12 | #define _XTENSA_HW_IRQ_H | ||
13 | |||
14 | #endif | ||
diff --git a/include/asm-xtensa/io.h b/include/asm-xtensa/io.h deleted file mode 100644 index 07b7299dab20..000000000000 --- a/include/asm-xtensa/io.h +++ /dev/null | |||
@@ -1,200 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/io.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_IO_H | ||
12 | #define _XTENSA_IO_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | #include <asm/byteorder.h> | ||
16 | #include <asm/page.h> | ||
17 | #include <linux/kernel.h> | ||
18 | |||
19 | #include <linux/types.h> | ||
20 | |||
21 | #define XCHAL_KIO_CACHED_VADDR 0xe0000000 | ||
22 | #define XCHAL_KIO_BYPASS_VADDR 0xf0000000 | ||
23 | #define XCHAL_KIO_PADDR 0xf0000000 | ||
24 | #define XCHAL_KIO_SIZE 0x10000000 | ||
25 | |||
26 | #define IOADDR(x) (XCHAL_KIO_BYPASS_VADDR + (x)) | ||
27 | |||
28 | /* | ||
29 | * swap functions to change byte order from little-endian to big-endian and | ||
30 | * vice versa. | ||
31 | */ | ||
32 | |||
33 | static inline unsigned short _swapw (unsigned short v) | ||
34 | { | ||
35 | return (v << 8) | (v >> 8); | ||
36 | } | ||
37 | |||
38 | static inline unsigned int _swapl (unsigned int v) | ||
39 | { | ||
40 | return (v << 24) | ((v & 0xff00) << 8) | ((v >> 8) & 0xff00) | (v >> 24); | ||
41 | } | ||
42 | |||
43 | /* | ||
44 | * Change virtual addresses to physical addresses and vv. | ||
45 | * These are trivial on the 1:1 Linux/Xtensa mapping | ||
46 | */ | ||
47 | |||
48 | static inline unsigned long virt_to_phys(volatile void * address) | ||
49 | { | ||
50 | return __pa(address); | ||
51 | } | ||
52 | |||
53 | static inline void * phys_to_virt(unsigned long address) | ||
54 | { | ||
55 | return __va(address); | ||
56 | } | ||
57 | |||
58 | /* | ||
59 | * virt_to_bus and bus_to_virt are deprecated. | ||
60 | */ | ||
61 | |||
62 | #define virt_to_bus(x) virt_to_phys(x) | ||
63 | #define bus_to_virt(x) phys_to_virt(x) | ||
64 | |||
65 | /* | ||
66 | * Return the virtual (cached) address for the specified bus memory. | ||
67 | * Note that we currently don't support any address outside the KIO segment. | ||
68 | */ | ||
69 | |||
70 | static inline void *ioremap(unsigned long offset, unsigned long size) | ||
71 | { | ||
72 | if (offset >= XCHAL_KIO_PADDR | ||
73 | && offset < XCHAL_KIO_PADDR + XCHAL_KIO_SIZE) | ||
74 | return (void*)(offset-XCHAL_KIO_PADDR+XCHAL_KIO_BYPASS_VADDR); | ||
75 | |||
76 | else | ||
77 | BUG(); | ||
78 | } | ||
79 | |||
80 | static inline void *ioremap_nocache(unsigned long offset, unsigned long size) | ||
81 | { | ||
82 | if (offset >= XCHAL_KIO_PADDR | ||
83 | && offset < XCHAL_KIO_PADDR + XCHAL_KIO_SIZE) | ||
84 | return (void*)(offset-XCHAL_KIO_PADDR+XCHAL_KIO_CACHED_VADDR); | ||
85 | else | ||
86 | BUG(); | ||
87 | } | ||
88 | |||
89 | static inline void iounmap(void *addr) | ||
90 | { | ||
91 | } | ||
92 | |||
93 | /* | ||
94 | * Generic I/O | ||
95 | */ | ||
96 | |||
97 | #define readb(addr) \ | ||
98 | ({ unsigned char __v = (*(volatile unsigned char *)(addr)); __v; }) | ||
99 | #define readw(addr) \ | ||
100 | ({ unsigned short __v = (*(volatile unsigned short *)(addr)); __v; }) | ||
101 | #define readl(addr) \ | ||
102 | ({ unsigned int __v = (*(volatile unsigned int *)(addr)); __v; }) | ||
103 | #define writeb(b, addr) (void)((*(volatile unsigned char *)(addr)) = (b)) | ||
104 | #define writew(b, addr) (void)((*(volatile unsigned short *)(addr)) = (b)) | ||
105 | #define writel(b, addr) (void)((*(volatile unsigned int *)(addr)) = (b)) | ||
106 | |||
107 | static inline __u8 __raw_readb(const volatile void __iomem *addr) | ||
108 | { | ||
109 | return *(__force volatile __u8 *)(addr); | ||
110 | } | ||
111 | static inline __u16 __raw_readw(const volatile void __iomem *addr) | ||
112 | { | ||
113 | return *(__force volatile __u16 *)(addr); | ||
114 | } | ||
115 | static inline __u32 __raw_readl(const volatile void __iomem *addr) | ||
116 | { | ||
117 | return *(__force volatile __u32 *)(addr); | ||
118 | } | ||
119 | static inline void __raw_writeb(__u8 b, volatile void __iomem *addr) | ||
120 | { | ||
121 | *(__force volatile __u8 *)(addr) = b; | ||
122 | } | ||
123 | static inline void __raw_writew(__u16 b, volatile void __iomem *addr) | ||
124 | { | ||
125 | *(__force volatile __u16 *)(addr) = b; | ||
126 | } | ||
127 | static inline void __raw_writel(__u32 b, volatile void __iomem *addr) | ||
128 | { | ||
129 | *(__force volatile __u32 *)(addr) = b; | ||
130 | } | ||
131 | |||
132 | /* These are the definitions for the x86 IO instructions | ||
133 | * inb/inw/inl/outb/outw/outl, the "string" versions | ||
134 | * insb/insw/insl/outsb/outsw/outsl, and the "pausing" versions | ||
135 | * inb_p/inw_p/... | ||
136 | * The macros don't do byte-swapping. | ||
137 | */ | ||
138 | |||
139 | #define inb(port) readb((u8 *)((port))) | ||
140 | #define outb(val, port) writeb((val),(u8 *)((unsigned long)(port))) | ||
141 | #define inw(port) readw((u16 *)((port))) | ||
142 | #define outw(val, port) writew((val),(u16 *)((unsigned long)(port))) | ||
143 | #define inl(port) readl((u32 *)((port))) | ||
144 | #define outl(val, port) writel((val),(u32 *)((unsigned long)(port))) | ||
145 | |||
146 | #define inb_p(port) inb((port)) | ||
147 | #define outb_p(val, port) outb((val), (port)) | ||
148 | #define inw_p(port) inw((port)) | ||
149 | #define outw_p(val, port) outw((val), (port)) | ||
150 | #define inl_p(port) inl((port)) | ||
151 | #define outl_p(val, port) outl((val), (port)) | ||
152 | |||
153 | extern void insb (unsigned long port, void *dst, unsigned long count); | ||
154 | extern void insw (unsigned long port, void *dst, unsigned long count); | ||
155 | extern void insl (unsigned long port, void *dst, unsigned long count); | ||
156 | extern void outsb (unsigned long port, const void *src, unsigned long count); | ||
157 | extern void outsw (unsigned long port, const void *src, unsigned long count); | ||
158 | extern void outsl (unsigned long port, const void *src, unsigned long count); | ||
159 | |||
160 | #define IO_SPACE_LIMIT ~0 | ||
161 | |||
162 | #define memset_io(a,b,c) memset((void *)(a),(b),(c)) | ||
163 | #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) | ||
164 | #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c)) | ||
165 | |||
166 | /* At this point the Xtensa doesn't provide byte swap instructions */ | ||
167 | |||
168 | #ifdef __XTENSA_EB__ | ||
169 | # define in_8(addr) (*(u8*)(addr)) | ||
170 | # define in_le16(addr) _swapw(*(u16*)(addr)) | ||
171 | # define in_le32(addr) _swapl(*(u32*)(addr)) | ||
172 | # define out_8(b, addr) *(u8*)(addr) = (b) | ||
173 | # define out_le16(b, addr) *(u16*)(addr) = _swapw(b) | ||
174 | # define out_le32(b, addr) *(u32*)(addr) = _swapl(b) | ||
175 | #elif defined(__XTENSA_EL__) | ||
176 | # define in_8(addr) (*(u8*)(addr)) | ||
177 | # define in_le16(addr) (*(u16*)(addr)) | ||
178 | # define in_le32(addr) (*(u32*)(addr)) | ||
179 | # define out_8(b, addr) *(u8*)(addr) = (b) | ||
180 | # define out_le16(b, addr) *(u16*)(addr) = (b) | ||
181 | # define out_le32(b, addr) *(u32*)(addr) = (b) | ||
182 | #else | ||
183 | # error processor byte order undefined! | ||
184 | #endif | ||
185 | |||
186 | |||
187 | /* | ||
188 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem access | ||
189 | */ | ||
190 | #define xlate_dev_mem_ptr(p) __va(p) | ||
191 | |||
192 | /* | ||
193 | * Convert a virtual cached pointer to an uncached pointer | ||
194 | */ | ||
195 | #define xlate_dev_kmem_ptr(p) p | ||
196 | |||
197 | |||
198 | #endif /* __KERNEL__ */ | ||
199 | |||
200 | #endif /* _XTENSA_IO_H */ | ||
diff --git a/include/asm-xtensa/ioctl.h b/include/asm-xtensa/ioctl.h deleted file mode 100644 index b279fe06dfe5..000000000000 --- a/include/asm-xtensa/ioctl.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/ioctl.h> | ||
diff --git a/include/asm-xtensa/ioctls.h b/include/asm-xtensa/ioctls.h deleted file mode 100644 index 0ffa942954b9..000000000000 --- a/include/asm-xtensa/ioctls.h +++ /dev/null | |||
@@ -1,116 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/ioctls.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2003 - 2005 Tensilica Inc. | ||
9 | * | ||
10 | * Derived from "include/asm-i386/ioctls.h" | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_IOCTLS_H | ||
14 | #define _XTENSA_IOCTLS_H | ||
15 | |||
16 | #include <asm/ioctl.h> | ||
17 | |||
18 | #define FIOCLEX _IO('f', 1) | ||
19 | #define FIONCLEX _IO('f', 2) | ||
20 | #define FIOASYNC _IOW('f', 125, int) | ||
21 | #define FIONBIO _IOW('f', 126, int) | ||
22 | #define FIONREAD _IOR('f', 127, int) | ||
23 | #define TIOCINQ FIONREAD | ||
24 | #define FIOQSIZE _IOR('f', 128, loff_t) | ||
25 | |||
26 | #define TCGETS 0x5401 | ||
27 | #define TCSETS 0x5402 | ||
28 | #define TCSETSW 0x5403 | ||
29 | #define TCSETSF 0x5404 | ||
30 | |||
31 | #define TCGETA _IOR('t', 23, struct termio) | ||
32 | #define TCSETA _IOW('t', 24, struct termio) | ||
33 | #define TCSETAW _IOW('t', 25, struct termio) | ||
34 | #define TCSETAF _IOW('t', 28, struct termio) | ||
35 | |||
36 | #define TCSBRK _IO('t', 29) | ||
37 | #define TCXONC _IO('t', 30) | ||
38 | #define TCFLSH _IO('t', 31) | ||
39 | |||
40 | #define TIOCSWINSZ _IOW('t', 103, struct winsize) | ||
41 | #define TIOCGWINSZ _IOR('t', 104, struct winsize) | ||
42 | #define TIOCSTART _IO('t', 110) /* start output, like ^Q */ | ||
43 | #define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ | ||
44 | #define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ | ||
45 | |||
46 | #define TIOCSPGRP _IOW('t', 118, int) | ||
47 | #define TIOCGPGRP _IOR('t', 119, int) | ||
48 | |||
49 | #define TIOCEXCL _IO('T', 12) | ||
50 | #define TIOCNXCL _IO('T', 13) | ||
51 | #define TIOCSCTTY _IO('T', 14) | ||
52 | |||
53 | #define TIOCSTI _IOW('T', 18, char) | ||
54 | #define TIOCMGET _IOR('T', 21, unsigned int) | ||
55 | #define TIOCMBIS _IOW('T', 22, unsigned int) | ||
56 | #define TIOCMBIC _IOW('T', 23, unsigned int) | ||
57 | #define TIOCMSET _IOW('T', 24, unsigned int) | ||
58 | # define TIOCM_LE 0x001 | ||
59 | # define TIOCM_DTR 0x002 | ||
60 | # define TIOCM_RTS 0x004 | ||
61 | # define TIOCM_ST 0x008 | ||
62 | # define TIOCM_SR 0x010 | ||
63 | # define TIOCM_CTS 0x020 | ||
64 | # define TIOCM_CAR 0x040 | ||
65 | # define TIOCM_RNG 0x080 | ||
66 | # define TIOCM_DSR 0x100 | ||
67 | # define TIOCM_CD TIOCM_CAR | ||
68 | # define TIOCM_RI TIOCM_RNG | ||
69 | |||
70 | #define TIOCGSOFTCAR _IOR('T', 25, unsigned int) | ||
71 | #define TIOCSSOFTCAR _IOW('T', 26, unsigned int) | ||
72 | #define TIOCLINUX _IOW('T', 28, char) | ||
73 | #define TIOCCONS _IO('T', 29) | ||
74 | #define TIOCGSERIAL _IOR('T', 30, struct serial_struct) | ||
75 | #define TIOCSSERIAL _IOW('T', 31, struct serial_struct) | ||
76 | #define TIOCPKT _IOW('T', 32, int) | ||
77 | # define TIOCPKT_DATA 0 | ||
78 | # define TIOCPKT_FLUSHREAD 1 | ||
79 | # define TIOCPKT_FLUSHWRITE 2 | ||
80 | # define TIOCPKT_STOP 4 | ||
81 | # define TIOCPKT_START 8 | ||
82 | # define TIOCPKT_NOSTOP 16 | ||
83 | # define TIOCPKT_DOSTOP 32 | ||
84 | |||
85 | |||
86 | #define TIOCNOTTY _IO('T', 34) | ||
87 | #define TIOCSETD _IOW('T', 35, int) | ||
88 | #define TIOCGETD _IOR('T', 36, int) | ||
89 | #define TCSBRKP _IOW('T', 37, int) /* Needed for POSIX tcsendbreak()*/ | ||
90 | #define TIOCTTYGSTRUCT _IOR('T', 38, struct tty_struct) /* For debugging only*/ | ||
91 | #define TIOCSBRK _IO('T', 39) /* BSD compatibility */ | ||
92 | #define TIOCCBRK _IO('T', 40) /* BSD compatibility */ | ||
93 | #define TIOCGSID _IOR('T', 41, pid_t) /* Return the session ID of FD*/ | ||
94 | #define TCGETS2 _IOR('T', 42, struct termios2) | ||
95 | #define TCSETS2 _IOW('T', 43, struct termios2) | ||
96 | #define TCSETSW2 _IOW('T', 44, struct termios2) | ||
97 | #define TCSETSF2 _IOW('T', 45, struct termios2) | ||
98 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | ||
99 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ | ||
100 | |||
101 | #define TIOCSERCONFIG _IO('T', 83) | ||
102 | #define TIOCSERGWILD _IOR('T', 84, int) | ||
103 | #define TIOCSERSWILD _IOW('T', 85, int) | ||
104 | #define TIOCGLCKTRMIOS 0x5456 | ||
105 | #define TIOCSLCKTRMIOS 0x5457 | ||
106 | #define TIOCSERGSTRUCT 0x5458 /* For debugging only */ | ||
107 | #define TIOCSERGETLSR _IOR('T', 89, unsigned int) /* Get line status reg. */ | ||
108 | /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ | ||
109 | # define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ | ||
110 | #define TIOCSERGETMULTI _IOR('T', 90, struct serial_multiport_struct) /* Get multiport config */ | ||
111 | #define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */ | ||
112 | |||
113 | #define TIOCMIWAIT _IO('T', 92) /* wait for a change on serial input line(s) */ | ||
114 | #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ | ||
115 | |||
116 | #endif /* _XTENSA_IOCTLS_H */ | ||
diff --git a/include/asm-xtensa/ipcbuf.h b/include/asm-xtensa/ipcbuf.h deleted file mode 100644 index c33aa6a42145..000000000000 --- a/include/asm-xtensa/ipcbuf.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/ipcbuf.h | ||
3 | * | ||
4 | * The ipc64_perm structure for the Xtensa architecture. | ||
5 | * Note extra padding because this structure is passed back and forth | ||
6 | * between kernel and user space. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_IPCBUF_H | ||
12 | #define _XTENSA_IPCBUF_H | ||
13 | |||
14 | /* | ||
15 | * Pad space is left for: | ||
16 | * - 32-bit mode_t and seq | ||
17 | * - 2 miscellaneous 32-bit values | ||
18 | * | ||
19 | * This file is subject to the terms and conditions of the GNU General | ||
20 | * Public License. See the file "COPYING" in the main directory of | ||
21 | * this archive for more details. | ||
22 | */ | ||
23 | |||
24 | struct ipc64_perm | ||
25 | { | ||
26 | __kernel_key_t key; | ||
27 | __kernel_uid32_t uid; | ||
28 | __kernel_gid32_t gid; | ||
29 | __kernel_uid32_t cuid; | ||
30 | __kernel_gid32_t cgid; | ||
31 | __kernel_mode_t mode; | ||
32 | unsigned long seq; | ||
33 | unsigned long __unused1; | ||
34 | unsigned long __unused2; | ||
35 | }; | ||
36 | |||
37 | #endif /* _XTENSA_IPCBUF_H */ | ||
diff --git a/include/asm-xtensa/irq.h b/include/asm-xtensa/irq.h deleted file mode 100644 index fc73b7f11aff..000000000000 --- a/include/asm-xtensa/irq.h +++ /dev/null | |||
@@ -1,30 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/irq.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_IRQ_H | ||
12 | #define _XTENSA_IRQ_H | ||
13 | |||
14 | #include <asm/platform/hardware.h> | ||
15 | #include <asm/variant/core.h> | ||
16 | |||
17 | #ifndef PLATFORM_NR_IRQS | ||
18 | # define PLATFORM_NR_IRQS 0 | ||
19 | #endif | ||
20 | #define XTENSA_NR_IRQS XCHAL_NUM_INTERRUPTS | ||
21 | #define NR_IRQS (XTENSA_NR_IRQS + PLATFORM_NR_IRQS) | ||
22 | |||
23 | static __inline__ int irq_canonicalize(int irq) | ||
24 | { | ||
25 | return (irq); | ||
26 | } | ||
27 | |||
28 | struct irqaction; | ||
29 | |||
30 | #endif /* _XTENSA_IRQ_H */ | ||
diff --git a/include/asm-xtensa/irq_regs.h b/include/asm-xtensa/irq_regs.h deleted file mode 100644 index 3dd9c0b70270..000000000000 --- a/include/asm-xtensa/irq_regs.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/irq_regs.h> | ||
diff --git a/include/asm-xtensa/kdebug.h b/include/asm-xtensa/kdebug.h deleted file mode 100644 index 6ece1b037665..000000000000 --- a/include/asm-xtensa/kdebug.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/kdebug.h> | ||
diff --git a/include/asm-xtensa/kmap_types.h b/include/asm-xtensa/kmap_types.h deleted file mode 100644 index 9e822d2e3bce..000000000000 --- a/include/asm-xtensa/kmap_types.h +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/kmap_types.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_KMAP_TYPES_H | ||
12 | #define _XTENSA_KMAP_TYPES_H | ||
13 | |||
14 | enum km_type { | ||
15 | KM_BOUNCE_READ, | ||
16 | KM_SKB_SUNRPC_DATA, | ||
17 | KM_SKB_DATA_SOFTIRQ, | ||
18 | KM_USER0, | ||
19 | KM_USER1, | ||
20 | KM_BIO_SRC_IRQ, | ||
21 | KM_BIO_DST_IRQ, | ||
22 | KM_PTE0, | ||
23 | KM_PTE1, | ||
24 | KM_IRQ0, | ||
25 | KM_IRQ1, | ||
26 | KM_SOFTIRQ0, | ||
27 | KM_SOFTIRQ1, | ||
28 | KM_TYPE_NR | ||
29 | }; | ||
30 | |||
31 | #endif /* _XTENSA_KMAP_TYPES_H */ | ||
diff --git a/include/asm-xtensa/linkage.h b/include/asm-xtensa/linkage.h deleted file mode 100644 index bf2128a99d79..000000000000 --- a/include/asm-xtensa/linkage.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/linkage.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_LINKAGE_H | ||
12 | #define _XTENSA_LINKAGE_H | ||
13 | |||
14 | /* Nothing to do here ... */ | ||
15 | |||
16 | #endif /* _XTENSA_LINKAGE_H */ | ||
diff --git a/include/asm-xtensa/local.h b/include/asm-xtensa/local.h deleted file mode 100644 index 48723e550d14..000000000000 --- a/include/asm-xtensa/local.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/local.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_LOCAL_H | ||
12 | #define _XTENSA_LOCAL_H | ||
13 | |||
14 | #include <asm-generic/local.h> | ||
15 | |||
16 | #endif /* _XTENSA_LOCAL_H */ | ||
diff --git a/include/asm-xtensa/mman.h b/include/asm-xtensa/mman.h deleted file mode 100644 index 9b92620c8a1e..000000000000 --- a/include/asm-xtensa/mman.h +++ /dev/null | |||
@@ -1,84 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/mman.h | ||
3 | * | ||
4 | * Xtensa Processor memory-manager definitions | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 1995 by Ralf Baechle | ||
11 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
12 | */ | ||
13 | |||
14 | #ifndef _XTENSA_MMAN_H | ||
15 | #define _XTENSA_MMAN_H | ||
16 | |||
17 | /* | ||
18 | * Protections are chosen from these bits, OR'd together. The | ||
19 | * implementation does not necessarily support PROT_EXEC or PROT_WRITE | ||
20 | * without PROT_READ. The only guarantees are that no writing will be | ||
21 | * allowed without PROT_WRITE and no access will be allowed for PROT_NONE. | ||
22 | */ | ||
23 | |||
24 | #define PROT_NONE 0x0 /* page can not be accessed */ | ||
25 | #define PROT_READ 0x1 /* page can be read */ | ||
26 | #define PROT_WRITE 0x2 /* page can be written */ | ||
27 | #define PROT_EXEC 0x4 /* page can be executed */ | ||
28 | |||
29 | #define PROT_SEM 0x10 /* page may be used for atomic ops */ | ||
30 | #define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ | ||
31 | #define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end fo growsup vma */ | ||
32 | |||
33 | /* | ||
34 | * Flags for mmap | ||
35 | */ | ||
36 | #define MAP_SHARED 0x001 /* Share changes */ | ||
37 | #define MAP_PRIVATE 0x002 /* Changes are private */ | ||
38 | #define MAP_TYPE 0x00f /* Mask for type of mapping */ | ||
39 | #define MAP_FIXED 0x010 /* Interpret addr exactly */ | ||
40 | |||
41 | /* not used by linux, but here to make sure we don't clash with ABI defines */ | ||
42 | #define MAP_RENAME 0x020 /* Assign page to file */ | ||
43 | #define MAP_AUTOGROW 0x040 /* File may grow by writing */ | ||
44 | #define MAP_LOCAL 0x080 /* Copy on fork/sproc */ | ||
45 | #define MAP_AUTORSRV 0x100 /* Logical swap reserved on demand */ | ||
46 | |||
47 | /* These are linux-specific */ | ||
48 | #define MAP_NORESERVE 0x0400 /* don't check for reservations */ | ||
49 | #define MAP_ANONYMOUS 0x0800 /* don't use a file */ | ||
50 | #define MAP_GROWSDOWN 0x1000 /* stack-like segment */ | ||
51 | #define MAP_DENYWRITE 0x2000 /* ETXTBSY */ | ||
52 | #define MAP_EXECUTABLE 0x4000 /* mark it as an executable */ | ||
53 | #define MAP_LOCKED 0x8000 /* pages are locked */ | ||
54 | #define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ | ||
55 | #define MAP_NONBLOCK 0x20000 /* do not block on IO */ | ||
56 | |||
57 | /* | ||
58 | * Flags for msync | ||
59 | */ | ||
60 | #define MS_ASYNC 0x0001 /* sync memory asynchronously */ | ||
61 | #define MS_INVALIDATE 0x0002 /* invalidate mappings & caches */ | ||
62 | #define MS_SYNC 0x0004 /* synchronous memory sync */ | ||
63 | |||
64 | /* | ||
65 | * Flags for mlockall | ||
66 | */ | ||
67 | #define MCL_CURRENT 1 /* lock all current mappings */ | ||
68 | #define MCL_FUTURE 2 /* lock all future mappings */ | ||
69 | |||
70 | #define MADV_NORMAL 0 /* no further special treatment */ | ||
71 | #define MADV_RANDOM 1 /* expect random page references */ | ||
72 | #define MADV_SEQUENTIAL 2 /* expect sequential page references */ | ||
73 | #define MADV_WILLNEED 3 /* will need these pages */ | ||
74 | #define MADV_DONTNEED 4 /* don't need these pages */ | ||
75 | |||
76 | /* common parameters: try to keep these consistent across architectures */ | ||
77 | #define MADV_REMOVE 9 /* remove these pages & resources */ | ||
78 | #define MADV_DONTFORK 10 /* don't inherit across fork */ | ||
79 | #define MADV_DOFORK 11 /* do inherit across fork */ | ||
80 | |||
81 | /* compatibility flags */ | ||
82 | #define MAP_FILE 0 | ||
83 | |||
84 | #endif /* _XTENSA_MMAN_H */ | ||
diff --git a/include/asm-xtensa/mmu.h b/include/asm-xtensa/mmu.h deleted file mode 100644 index 44c5bb04c55c..000000000000 --- a/include/asm-xtensa/mmu.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/mmu.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_MMU_H | ||
12 | #define _XTENSA_MMU_H | ||
13 | |||
14 | /* Default "unsigned long" context */ | ||
15 | typedef unsigned long mm_context_t; | ||
16 | |||
17 | #endif /* _XTENSA_MMU_H */ | ||
diff --git a/include/asm-xtensa/mmu_context.h b/include/asm-xtensa/mmu_context.h deleted file mode 100644 index c0fd8e5b4513..000000000000 --- a/include/asm-xtensa/mmu_context.h +++ /dev/null | |||
@@ -1,136 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/mmu_context.h | ||
3 | * | ||
4 | * Switch an MMU context. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_MMU_CONTEXT_H | ||
14 | #define _XTENSA_MMU_CONTEXT_H | ||
15 | |||
16 | #include <linux/stringify.h> | ||
17 | #include <linux/sched.h> | ||
18 | |||
19 | #include <asm/pgtable.h> | ||
20 | #include <asm/cacheflush.h> | ||
21 | #include <asm/tlbflush.h> | ||
22 | #include <asm-generic/mm_hooks.h> | ||
23 | |||
24 | #define XCHAL_MMU_ASID_BITS 8 | ||
25 | |||
26 | #if (XCHAL_HAVE_TLBS != 1) | ||
27 | # error "Linux must have an MMU!" | ||
28 | #endif | ||
29 | |||
30 | extern unsigned long asid_cache; | ||
31 | |||
32 | /* | ||
33 | * NO_CONTEXT is the invalid ASID value that we don't ever assign to | ||
34 | * any user or kernel context. | ||
35 | * | ||
36 | * 0 invalid | ||
37 | * 1 kernel | ||
38 | * 2 reserved | ||
39 | * 3 reserved | ||
40 | * 4...255 available | ||
41 | */ | ||
42 | |||
43 | #define NO_CONTEXT 0 | ||
44 | #define ASID_USER_FIRST 4 | ||
45 | #define ASID_MASK ((1 << XCHAL_MMU_ASID_BITS) - 1) | ||
46 | #define ASID_INSERT(x) (0x03020001 | (((x) & ASID_MASK) << 8)) | ||
47 | |||
48 | static inline void set_rasid_register (unsigned long val) | ||
49 | { | ||
50 | __asm__ __volatile__ (" wsr %0, "__stringify(RASID)"\n\t" | ||
51 | " isync\n" : : "a" (val)); | ||
52 | } | ||
53 | |||
54 | static inline unsigned long get_rasid_register (void) | ||
55 | { | ||
56 | unsigned long tmp; | ||
57 | __asm__ __volatile__ (" rsr %0,"__stringify(RASID)"\n\t" : "=a" (tmp)); | ||
58 | return tmp; | ||
59 | } | ||
60 | |||
61 | static inline void | ||
62 | __get_new_mmu_context(struct mm_struct *mm) | ||
63 | { | ||
64 | extern void flush_tlb_all(void); | ||
65 | if (! (++asid_cache & ASID_MASK) ) { | ||
66 | flush_tlb_all(); /* start new asid cycle */ | ||
67 | asid_cache += ASID_USER_FIRST; | ||
68 | } | ||
69 | mm->context = asid_cache; | ||
70 | } | ||
71 | |||
72 | static inline void | ||
73 | __load_mmu_context(struct mm_struct *mm) | ||
74 | { | ||
75 | set_rasid_register(ASID_INSERT(mm->context)); | ||
76 | invalidate_page_directory(); | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | * Initialize the context related info for a new mm_struct | ||
81 | * instance. | ||
82 | */ | ||
83 | |||
84 | static inline int | ||
85 | init_new_context(struct task_struct *tsk, struct mm_struct *mm) | ||
86 | { | ||
87 | mm->context = NO_CONTEXT; | ||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * After we have set current->mm to a new value, this activates | ||
93 | * the context for the new mm so we see the new mappings. | ||
94 | */ | ||
95 | static inline void | ||
96 | activate_mm(struct mm_struct *prev, struct mm_struct *next) | ||
97 | { | ||
98 | /* Unconditionally get a new ASID. */ | ||
99 | |||
100 | __get_new_mmu_context(next); | ||
101 | __load_mmu_context(next); | ||
102 | } | ||
103 | |||
104 | |||
105 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | ||
106 | struct task_struct *tsk) | ||
107 | { | ||
108 | unsigned long asid = asid_cache; | ||
109 | |||
110 | /* Check if our ASID is of an older version and thus invalid */ | ||
111 | |||
112 | if (next->context == NO_CONTEXT || ((next->context^asid) & ~ASID_MASK)) | ||
113 | __get_new_mmu_context(next); | ||
114 | |||
115 | __load_mmu_context(next); | ||
116 | } | ||
117 | |||
118 | #define deactivate_mm(tsk, mm) do { } while(0) | ||
119 | |||
120 | /* | ||
121 | * Destroy context related info for an mm_struct that is about | ||
122 | * to be put to rest. | ||
123 | */ | ||
124 | static inline void destroy_context(struct mm_struct *mm) | ||
125 | { | ||
126 | invalidate_page_directory(); | ||
127 | } | ||
128 | |||
129 | |||
130 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | ||
131 | { | ||
132 | /* Nothing to do. */ | ||
133 | |||
134 | } | ||
135 | |||
136 | #endif /* _XTENSA_MMU_CONTEXT_H */ | ||
diff --git a/include/asm-xtensa/module.h b/include/asm-xtensa/module.h deleted file mode 100644 index d9b34bee4d42..000000000000 --- a/include/asm-xtensa/module.h +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/module.h | ||
3 | * | ||
4 | * This file contains the module code specific to the Xtensa architecture. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_MODULE_H | ||
14 | #define _XTENSA_MODULE_H | ||
15 | |||
16 | struct mod_arch_specific | ||
17 | { | ||
18 | /* No special elements, yet. */ | ||
19 | }; | ||
20 | |||
21 | #define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " " | ||
22 | |||
23 | #define Elf_Shdr Elf32_Shdr | ||
24 | #define Elf_Sym Elf32_Sym | ||
25 | #define Elf_Ehdr Elf32_Ehdr | ||
26 | |||
27 | #endif /* _XTENSA_MODULE_H */ | ||
diff --git a/include/asm-xtensa/msgbuf.h b/include/asm-xtensa/msgbuf.h deleted file mode 100644 index 693c96755280..000000000000 --- a/include/asm-xtensa/msgbuf.h +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/msgbuf.h | ||
3 | * | ||
4 | * The msqid64_ds structure for the Xtensa architecture. | ||
5 | * Note extra padding because this structure is passed back and forth | ||
6 | * between kernel and user space. | ||
7 | * | ||
8 | * Pad space is left for: | ||
9 | * - 64-bit time_t to solve y2038 problem | ||
10 | * - 2 miscellaneous 32-bit values | ||
11 | * | ||
12 | * This file is subject to the terms and conditions of the GNU General | ||
13 | * Public License. See the file "COPYING" in the main directory of | ||
14 | * this archive for more details. | ||
15 | */ | ||
16 | |||
17 | #ifndef _XTENSA_MSGBUF_H | ||
18 | #define _XTENSA_MSGBUF_H | ||
19 | |||
20 | struct msqid64_ds { | ||
21 | struct ipc64_perm msg_perm; | ||
22 | #ifdef __XTENSA_EB__ | ||
23 | unsigned int __unused1; | ||
24 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
25 | unsigned int __unused2; | ||
26 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
27 | unsigned int __unused3; | ||
28 | __kernel_time_t msg_ctime; /* last change time */ | ||
29 | #elif defined(__XTENSA_EL__) | ||
30 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
31 | unsigned int __unused1; | ||
32 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
33 | unsigned int __unused2; | ||
34 | __kernel_time_t msg_ctime; /* last change time */ | ||
35 | unsigned int __unused3; | ||
36 | #else | ||
37 | # error processor byte order undefined! | ||
38 | #endif | ||
39 | unsigned long msg_cbytes; /* current number of bytes on queue */ | ||
40 | unsigned long msg_qnum; /* number of messages in queue */ | ||
41 | unsigned long msg_qbytes; /* max number of bytes on queue */ | ||
42 | __kernel_pid_t msg_lspid; /* pid of last msgsnd */ | ||
43 | __kernel_pid_t msg_lrpid; /* last receive pid */ | ||
44 | unsigned long __unused4; | ||
45 | unsigned long __unused5; | ||
46 | }; | ||
47 | |||
48 | #endif /* _XTENSA_MSGBUF_H */ | ||
diff --git a/include/asm-xtensa/mutex.h b/include/asm-xtensa/mutex.h deleted file mode 100644 index 458c1f7fbc18..000000000000 --- a/include/asm-xtensa/mutex.h +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | /* | ||
2 | * Pull in the generic implementation for the mutex fastpath. | ||
3 | * | ||
4 | * TODO: implement optimized primitives instead, or leave the generic | ||
5 | * implementation in place, or pick the atomic_xchg() based generic | ||
6 | * implementation. (see asm-generic/mutex-xchg.h for details) | ||
7 | */ | ||
8 | |||
9 | #include <asm-generic/mutex-dec.h> | ||
diff --git a/include/asm-xtensa/page.h b/include/asm-xtensa/page.h deleted file mode 100644 index 11f7dc2dbec7..000000000000 --- a/include/asm-xtensa/page.h +++ /dev/null | |||
@@ -1,174 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/page.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PAGE_H | ||
12 | #define _XTENSA_PAGE_H | ||
13 | |||
14 | #include <asm/processor.h> | ||
15 | #include <asm/types.h> | ||
16 | #include <asm/cache.h> | ||
17 | |||
18 | /* | ||
19 | * Fixed TLB translations in the processor. | ||
20 | */ | ||
21 | |||
22 | #define XCHAL_KSEG_CACHED_VADDR 0xd0000000 | ||
23 | #define XCHAL_KSEG_BYPASS_VADDR 0xd8000000 | ||
24 | #define XCHAL_KSEG_PADDR 0x00000000 | ||
25 | #define XCHAL_KSEG_SIZE 0x08000000 | ||
26 | |||
27 | /* | ||
28 | * PAGE_SHIFT determines the page size | ||
29 | */ | ||
30 | |||
31 | #define PAGE_SHIFT 12 | ||
32 | #define PAGE_SIZE (__XTENSA_UL_CONST(1) << PAGE_SHIFT) | ||
33 | #define PAGE_MASK (~(PAGE_SIZE-1)) | ||
34 | |||
35 | #define PAGE_OFFSET XCHAL_KSEG_CACHED_VADDR | ||
36 | #define MAX_MEM_PFN XCHAL_KSEG_SIZE | ||
37 | #define PGTABLE_START 0x80000000 | ||
38 | |||
39 | /* | ||
40 | * Cache aliasing: | ||
41 | * | ||
42 | * If the cache size for one way is greater than the page size, we have to | ||
43 | * deal with cache aliasing. The cache index is wider than the page size: | ||
44 | * | ||
45 | * | |cache| cache index | ||
46 | * | pfn |off| virtual address | ||
47 | * |xxxx:X|zzz| | ||
48 | * | : | | | ||
49 | * | \ / | | | ||
50 | * |trans.| | | ||
51 | * | / \ | | | ||
52 | * |yyyy:Y|zzz| physical address | ||
53 | * | ||
54 | * When the page number is translated to the physical page address, the lowest | ||
55 | * bit(s) (X) that are part of the cache index are also translated (Y). | ||
56 | * If this translation changes bit(s) (X), the cache index is also afected, | ||
57 | * thus resulting in a different cache line than before. | ||
58 | * The kernel does not provide a mechanism to ensure that the page color | ||
59 | * (represented by this bit) remains the same when allocated or when pages | ||
60 | * are remapped. When user pages are mapped into kernel space, the color of | ||
61 | * the page might also change. | ||
62 | * | ||
63 | * We use the address space VMALLOC_END ... VMALLOC_END + DCACHE_WAY_SIZE * 2 | ||
64 | * to temporarily map a patch so we can match the color. | ||
65 | */ | ||
66 | |||
67 | #if DCACHE_WAY_SIZE > PAGE_SIZE | ||
68 | # define DCACHE_ALIAS_ORDER (DCACHE_WAY_SHIFT - PAGE_SHIFT) | ||
69 | # define DCACHE_ALIAS_MASK (PAGE_MASK & (DCACHE_WAY_SIZE - 1)) | ||
70 | # define DCACHE_ALIAS(a) (((a) & DCACHE_ALIAS_MASK) >> PAGE_SHIFT) | ||
71 | # define DCACHE_ALIAS_EQ(a,b) ((((a) ^ (b)) & DCACHE_ALIAS_MASK) == 0) | ||
72 | #else | ||
73 | # define DCACHE_ALIAS_ORDER 0 | ||
74 | #endif | ||
75 | |||
76 | #if ICACHE_WAY_SIZE > PAGE_SIZE | ||
77 | # define ICACHE_ALIAS_ORDER (ICACHE_WAY_SHIFT - PAGE_SHIFT) | ||
78 | # define ICACHE_ALIAS_MASK (PAGE_MASK & (ICACHE_WAY_SIZE - 1)) | ||
79 | # define ICACHE_ALIAS(a) (((a) & ICACHE_ALIAS_MASK) >> PAGE_SHIFT) | ||
80 | # define ICACHE_ALIAS_EQ(a,b) ((((a) ^ (b)) & ICACHE_ALIAS_MASK) == 0) | ||
81 | #else | ||
82 | # define ICACHE_ALIAS_ORDER 0 | ||
83 | #endif | ||
84 | |||
85 | |||
86 | #ifdef __ASSEMBLY__ | ||
87 | |||
88 | #define __pgprot(x) (x) | ||
89 | |||
90 | #else | ||
91 | |||
92 | /* | ||
93 | * These are used to make use of C type-checking.. | ||
94 | */ | ||
95 | |||
96 | typedef struct { unsigned long pte; } pte_t; /* page table entry */ | ||
97 | typedef struct { unsigned long pgd; } pgd_t; /* PGD table entry */ | ||
98 | typedef struct { unsigned long pgprot; } pgprot_t; | ||
99 | typedef struct page *pgtable_t; | ||
100 | |||
101 | #define pte_val(x) ((x).pte) | ||
102 | #define pgd_val(x) ((x).pgd) | ||
103 | #define pgprot_val(x) ((x).pgprot) | ||
104 | |||
105 | #define __pte(x) ((pte_t) { (x) } ) | ||
106 | #define __pgd(x) ((pgd_t) { (x) } ) | ||
107 | #define __pgprot(x) ((pgprot_t) { (x) } ) | ||
108 | |||
109 | /* | ||
110 | * Pure 2^n version of get_order | ||
111 | * Use 'nsau' instructions if supported by the processor or the generic version. | ||
112 | */ | ||
113 | |||
114 | #if XCHAL_HAVE_NSA | ||
115 | |||
116 | static inline __attribute_const__ int get_order(unsigned long size) | ||
117 | { | ||
118 | int lz; | ||
119 | asm ("nsau %0, %1" : "=r" (lz) : "r" ((size - 1) >> PAGE_SHIFT)); | ||
120 | return 32 - lz; | ||
121 | } | ||
122 | |||
123 | #else | ||
124 | |||
125 | # include <asm-generic/page.h> | ||
126 | |||
127 | #endif | ||
128 | |||
129 | struct page; | ||
130 | extern void clear_page(void *page); | ||
131 | extern void copy_page(void *to, void *from); | ||
132 | |||
133 | /* | ||
134 | * If we have cache aliasing and writeback caches, we might have to do | ||
135 | * some extra work | ||
136 | */ | ||
137 | |||
138 | #if DCACHE_WAY_SIZE > PAGE_SIZE | ||
139 | extern void clear_user_page(void*, unsigned long, struct page*); | ||
140 | extern void copy_user_page(void*, void*, unsigned long, struct page*); | ||
141 | #else | ||
142 | # define clear_user_page(page, vaddr, pg) clear_page(page) | ||
143 | # define copy_user_page(to, from, vaddr, pg) copy_page(to, from) | ||
144 | #endif | ||
145 | |||
146 | /* | ||
147 | * This handles the memory map. We handle pages at | ||
148 | * XCHAL_KSEG_CACHED_VADDR for kernels with 32 bit address space. | ||
149 | * These macros are for conversion of kernel address, not user | ||
150 | * addresses. | ||
151 | */ | ||
152 | |||
153 | #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) | ||
154 | #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) | ||
155 | #define pfn_valid(pfn) ((unsigned long)pfn < max_mapnr) | ||
156 | #ifdef CONFIG_DISCONTIGMEM | ||
157 | # error CONFIG_DISCONTIGMEM not supported | ||
158 | #endif | ||
159 | |||
160 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | ||
161 | #define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT) | ||
162 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | ||
163 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | ||
164 | |||
165 | #define WANT_PAGE_VIRTUAL | ||
166 | |||
167 | |||
168 | #endif /* __ASSEMBLY__ */ | ||
169 | |||
170 | #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ | ||
171 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | ||
172 | |||
173 | #include <asm-generic/memory_model.h> | ||
174 | #endif /* _XTENSA_PAGE_H */ | ||
diff --git a/include/asm-xtensa/param.h b/include/asm-xtensa/param.h deleted file mode 100644 index ba03d5aeab6b..000000000000 --- a/include/asm-xtensa/param.h +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/param.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PARAM_H | ||
12 | #define _XTENSA_PARAM_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | # define HZ CONFIG_HZ /* internal timer frequency */ | ||
16 | # define USER_HZ 100 /* for user interfaces in "ticks" */ | ||
17 | # define CLOCKS_PER_SEC (USER_HZ) /* frequnzy at which times() counts */ | ||
18 | #else | ||
19 | # define HZ 100 | ||
20 | #endif | ||
21 | |||
22 | #define EXEC_PAGESIZE 4096 | ||
23 | |||
24 | #ifndef NGROUPS | ||
25 | #define NGROUPS 32 | ||
26 | #endif | ||
27 | |||
28 | #ifndef NOGROUP | ||
29 | #define NOGROUP (-1) | ||
30 | #endif | ||
31 | |||
32 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | ||
33 | |||
34 | #endif /* _XTENSA_PARAM_H */ | ||
diff --git a/include/asm-xtensa/pci-bridge.h b/include/asm-xtensa/pci-bridge.h deleted file mode 100644 index 00fcbd7c534a..000000000000 --- a/include/asm-xtensa/pci-bridge.h +++ /dev/null | |||
@@ -1,88 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/pci-bridge.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | * | ||
8 | * Copyright (C) 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PCI_BRIDGE_H | ||
12 | #define _XTENSA_PCI_BRIDGE_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | struct device_node; | ||
17 | struct pci_controller; | ||
18 | |||
19 | /* | ||
20 | * pciauto_bus_scan() enumerates the pci space. | ||
21 | */ | ||
22 | |||
23 | extern int pciauto_bus_scan(struct pci_controller *, int); | ||
24 | |||
25 | struct pci_space { | ||
26 | unsigned long start; | ||
27 | unsigned long end; | ||
28 | unsigned long base; | ||
29 | }; | ||
30 | |||
31 | /* | ||
32 | * Structure of a PCI controller (host bridge) | ||
33 | */ | ||
34 | |||
35 | struct pci_controller { | ||
36 | int index; /* used for pci_controller_num */ | ||
37 | struct pci_controller *next; | ||
38 | struct pci_bus *bus; | ||
39 | void *arch_data; | ||
40 | |||
41 | int first_busno; | ||
42 | int last_busno; | ||
43 | |||
44 | struct pci_ops *ops; | ||
45 | volatile unsigned int *cfg_addr; | ||
46 | volatile unsigned char *cfg_data; | ||
47 | |||
48 | /* Currently, we limit ourselves to 1 IO range and 3 mem | ||
49 | * ranges since the common pci_bus structure can't handle more | ||
50 | */ | ||
51 | struct resource io_resource; | ||
52 | struct resource mem_resources[3]; | ||
53 | int mem_resource_count; | ||
54 | |||
55 | /* Host bridge I/O and Memory space | ||
56 | * Used for BAR placement algorithms | ||
57 | */ | ||
58 | struct pci_space io_space; | ||
59 | struct pci_space mem_space; | ||
60 | |||
61 | /* Return the interrupt number fo a device. */ | ||
62 | int (*map_irq)(struct pci_dev*, u8, u8); | ||
63 | |||
64 | }; | ||
65 | |||
66 | static inline void pcibios_init_resource(struct resource *res, | ||
67 | unsigned long start, unsigned long end, int flags, char *name) | ||
68 | { | ||
69 | res->start = start; | ||
70 | res->end = end; | ||
71 | res->flags = flags; | ||
72 | res->name = name; | ||
73 | res->parent = NULL; | ||
74 | res->sibling = NULL; | ||
75 | res->child = NULL; | ||
76 | } | ||
77 | |||
78 | |||
79 | /* These are used for config access before all the PCI probing has been done. */ | ||
80 | int early_read_config_byte(struct pci_controller*, int, int, int, u8*); | ||
81 | int early_read_config_word(struct pci_controller*, int, int, int, u16*); | ||
82 | int early_read_config_dword(struct pci_controller*, int, int, int, u32*); | ||
83 | int early_write_config_byte(struct pci_controller*, int, int, int, u8); | ||
84 | int early_write_config_word(struct pci_controller*, int, int, int, u16); | ||
85 | int early_write_config_dword(struct pci_controller*, int, int, int, u32); | ||
86 | |||
87 | #endif /* __KERNEL__ */ | ||
88 | #endif /* _XTENSA_PCI_BRIDGE_H */ | ||
diff --git a/include/asm-xtensa/pci.h b/include/asm-xtensa/pci.h deleted file mode 100644 index 66410acf18b4..000000000000 --- a/include/asm-xtensa/pci.h +++ /dev/null | |||
@@ -1,82 +0,0 @@ | |||
1 | /* | ||
2 | * linux/include/asm-xtensa/pci.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PCI_H | ||
12 | #define _XTENSA_PCI_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | /* Can be used to override the logic in pci_scan_bus for skipping | ||
17 | * already-configured bus numbers - to be used for buggy BIOSes | ||
18 | * or architectures with incomplete PCI setup by the loader | ||
19 | */ | ||
20 | |||
21 | #define pcibios_assign_all_busses() 0 | ||
22 | |||
23 | extern struct pci_controller* pcibios_alloc_controller(void); | ||
24 | |||
25 | static inline void pcibios_set_master(struct pci_dev *dev) | ||
26 | { | ||
27 | /* No special bus mastering setup handling */ | ||
28 | } | ||
29 | |||
30 | static inline void pcibios_penalize_isa_irq(int irq) | ||
31 | { | ||
32 | /* We don't do dynamic PCI IRQ allocation */ | ||
33 | } | ||
34 | |||
35 | /* Assume some values. (We should revise them, if necessary) */ | ||
36 | |||
37 | #define PCIBIOS_MIN_IO 0x2000 | ||
38 | #define PCIBIOS_MIN_MEM 0x10000000 | ||
39 | |||
40 | /* Dynamic DMA mapping stuff. | ||
41 | * Xtensa has everything mapped statically like x86. | ||
42 | */ | ||
43 | |||
44 | #include <linux/types.h> | ||
45 | #include <linux/slab.h> | ||
46 | #include <asm/scatterlist.h> | ||
47 | #include <linux/string.h> | ||
48 | #include <asm/io.h> | ||
49 | |||
50 | struct pci_dev; | ||
51 | |||
52 | /* The PCI address space does equal the physical memory address space. | ||
53 | * The networking and block device layers use this boolean for bounce buffer | ||
54 | * decisions. | ||
55 | */ | ||
56 | |||
57 | #define PCI_DMA_BUS_IS_PHYS (1) | ||
58 | |||
59 | /* pci_unmap_{page,single} is a no-op, so */ | ||
60 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
61 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
62 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
63 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
64 | #define pci_ubnmap_len(PTR, LEN_NAME) (0) | ||
65 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
66 | |||
67 | /* Map a range of PCI memory or I/O space for a device into user space */ | ||
68 | int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, | ||
69 | enum pci_mmap_state mmap_state, int write_combine); | ||
70 | |||
71 | /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ | ||
72 | #define HAVE_PCI_MMAP 1 | ||
73 | |||
74 | #endif /* __KERNEL__ */ | ||
75 | |||
76 | /* Implement the pci_ DMA API in terms of the generic device dma_ one */ | ||
77 | #include <asm-generic/pci-dma-compat.h> | ||
78 | |||
79 | /* Generic PCI */ | ||
80 | #include <asm-generic/pci.h> | ||
81 | |||
82 | #endif /* _XTENSA_PCI_H */ | ||
diff --git a/include/asm-xtensa/percpu.h b/include/asm-xtensa/percpu.h deleted file mode 100644 index 6d2bc2ada9d1..000000000000 --- a/include/asm-xtensa/percpu.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * linux/include/asm-xtensa/percpu.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PERCPU__ | ||
12 | #define _XTENSA_PERCPU__ | ||
13 | |||
14 | #include <asm-generic/percpu.h> | ||
15 | |||
16 | #endif /* _XTENSA_PERCPU__ */ | ||
diff --git a/include/asm-xtensa/pgalloc.h b/include/asm-xtensa/pgalloc.h deleted file mode 100644 index 4f4a7987eded..000000000000 --- a/include/asm-xtensa/pgalloc.h +++ /dev/null | |||
@@ -1,73 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/pgalloc.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * Copyright (C) 2001-2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PGALLOC_H | ||
12 | #define _XTENSA_PGALLOC_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | #include <linux/highmem.h> | ||
17 | |||
18 | /* | ||
19 | * Allocating and freeing a pmd is trivial: the 1-entry pmd is | ||
20 | * inside the pgd, so has no extra memory associated with it. | ||
21 | */ | ||
22 | |||
23 | #define pmd_populate_kernel(mm, pmdp, ptep) \ | ||
24 | (pmd_val(*(pmdp)) = ((unsigned long)ptep)) | ||
25 | #define pmd_populate(mm, pmdp, page) \ | ||
26 | (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) | ||
27 | #define pmd_pgtable(pmd) pmd_page(pmd) | ||
28 | |||
29 | static inline pgd_t* | ||
30 | pgd_alloc(struct mm_struct *mm) | ||
31 | { | ||
32 | return (pgd_t*) __get_free_pages(GFP_KERNEL | __GFP_ZERO, PGD_ORDER); | ||
33 | } | ||
34 | |||
35 | static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
36 | { | ||
37 | free_page((unsigned long)pgd); | ||
38 | } | ||
39 | |||
40 | /* Use a slab cache for the pte pages (see also sparc64 implementation) */ | ||
41 | |||
42 | extern struct kmem_cache *pgtable_cache; | ||
43 | |||
44 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | ||
45 | unsigned long address) | ||
46 | { | ||
47 | return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); | ||
48 | } | ||
49 | |||
50 | static inline pgtable_t pte_alloc_one(struct mm_struct *mm, | ||
51 | unsigned long addr) | ||
52 | { | ||
53 | struct page *page; | ||
54 | |||
55 | page = virt_to_page(pte_alloc_one_kernel(mm, addr)); | ||
56 | pgtable_page_ctor(page); | ||
57 | return page; | ||
58 | } | ||
59 | |||
60 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | ||
61 | { | ||
62 | kmem_cache_free(pgtable_cache, pte); | ||
63 | } | ||
64 | |||
65 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) | ||
66 | { | ||
67 | pgtable_page_dtor(pte); | ||
68 | kmem_cache_free(pgtable_cache, page_address(pte)); | ||
69 | } | ||
70 | #define pmd_pgtable(pmd) pmd_page(pmd) | ||
71 | |||
72 | #endif /* __KERNEL__ */ | ||
73 | #endif /* _XTENSA_PGALLOC_H */ | ||
diff --git a/include/asm-xtensa/pgtable.h b/include/asm-xtensa/pgtable.h deleted file mode 100644 index 8014d96b21f1..000000000000 --- a/include/asm-xtensa/pgtable.h +++ /dev/null | |||
@@ -1,416 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/pgtable.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PGTABLE_H | ||
12 | #define _XTENSA_PGTABLE_H | ||
13 | |||
14 | #include <asm-generic/pgtable-nopmd.h> | ||
15 | #include <asm/page.h> | ||
16 | |||
17 | /* | ||
18 | * We only use two ring levels, user and kernel space. | ||
19 | */ | ||
20 | |||
21 | #define USER_RING 1 /* user ring level */ | ||
22 | #define KERNEL_RING 0 /* kernel ring level */ | ||
23 | |||
24 | /* | ||
25 | * The Xtensa architecture port of Linux has a two-level page table system, | ||
26 | * i.e. the logical three-level Linux page table layout is folded. | ||
27 | * Each task has the following memory page tables: | ||
28 | * | ||
29 | * PGD table (page directory), ie. 3rd-level page table: | ||
30 | * One page (4 kB) of 1024 (PTRS_PER_PGD) pointers to PTE tables | ||
31 | * (Architectures that don't have the PMD folded point to the PMD tables) | ||
32 | * | ||
33 | * The pointer to the PGD table for a given task can be retrieved from | ||
34 | * the task structure (struct task_struct*) t, e.g. current(): | ||
35 | * (t->mm ? t->mm : t->active_mm)->pgd | ||
36 | * | ||
37 | * PMD tables (page middle-directory), ie. 2nd-level page tables: | ||
38 | * Absent for the Xtensa architecture (folded, PTRS_PER_PMD == 1). | ||
39 | * | ||
40 | * PTE tables (page table entry), ie. 1st-level page tables: | ||
41 | * One page (4 kB) of 1024 (PTRS_PER_PTE) PTEs with a special PTE | ||
42 | * invalid_pte_table for absent mappings. | ||
43 | * | ||
44 | * The individual pages are 4 kB big with special pages for the empty_zero_page. | ||
45 | */ | ||
46 | |||
47 | #define PGDIR_SHIFT 22 | ||
48 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
49 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | ||
50 | |||
51 | /* | ||
52 | * Entries per page directory level: we use two-level, so | ||
53 | * we don't really have any PMD directory physically. | ||
54 | */ | ||
55 | #define PTRS_PER_PTE 1024 | ||
56 | #define PTRS_PER_PTE_SHIFT 10 | ||
57 | #define PTRS_PER_PGD 1024 | ||
58 | #define PGD_ORDER 0 | ||
59 | #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) | ||
60 | #define FIRST_USER_ADDRESS 0 | ||
61 | #define FIRST_USER_PGD_NR (FIRST_USER_ADDRESS >> PGDIR_SHIFT) | ||
62 | |||
63 | /* | ||
64 | * Virtual memory area. We keep a distance to other memory regions to be | ||
65 | * on the safe side. We also use this area for cache aliasing. | ||
66 | */ | ||
67 | |||
68 | #define VMALLOC_START 0xC0000000 | ||
69 | #define VMALLOC_END 0xC7FEFFFF | ||
70 | #define TLBTEMP_BASE_1 0xC7FF0000 | ||
71 | #define TLBTEMP_BASE_2 0xC7FF8000 | ||
72 | |||
73 | /* | ||
74 | * Xtensa Linux config PTE layout (when present): | ||
75 | * 31-12: PPN | ||
76 | * 11-6: Software | ||
77 | * 5-4: RING | ||
78 | * 3-0: CA | ||
79 | * | ||
80 | * Similar to the Alpha and MIPS ports, we need to keep track of the ref | ||
81 | * and mod bits in software. We have a software "you can read | ||
82 | * from this page" bit, and a hardware one which actually lets the | ||
83 | * process read from the page. On the same token we have a software | ||
84 | * writable bit and the real hardware one which actually lets the | ||
85 | * process write to the page. | ||
86 | * | ||
87 | * See further below for PTE layout for swapped-out pages. | ||
88 | */ | ||
89 | |||
90 | #define _PAGE_HW_EXEC (1<<0) /* hardware: page is executable */ | ||
91 | #define _PAGE_HW_WRITE (1<<1) /* hardware: page is writable */ | ||
92 | |||
93 | #define _PAGE_FILE (1<<1) /* non-linear mapping, if !present */ | ||
94 | #define _PAGE_PROTNONE (3<<0) /* special case for VM_PROT_NONE */ | ||
95 | |||
96 | /* None of these cache modes include MP coherency: */ | ||
97 | #define _PAGE_CA_BYPASS (0<<2) /* bypass, non-speculative */ | ||
98 | #define _PAGE_CA_WB (1<<2) /* write-back */ | ||
99 | #define _PAGE_CA_WT (2<<2) /* write-through */ | ||
100 | #define _PAGE_CA_MASK (3<<2) | ||
101 | #define _PAGE_INVALID (3<<2) | ||
102 | |||
103 | #define _PAGE_USER (1<<4) /* user access (ring=1) */ | ||
104 | |||
105 | /* Software */ | ||
106 | #define _PAGE_WRITABLE_BIT 6 | ||
107 | #define _PAGE_WRITABLE (1<<6) /* software: page writable */ | ||
108 | #define _PAGE_DIRTY (1<<7) /* software: page dirty */ | ||
109 | #define _PAGE_ACCESSED (1<<8) /* software: page accessed (read) */ | ||
110 | |||
111 | /* On older HW revisions, we always have to set bit 0 */ | ||
112 | #if XCHAL_HW_VERSION_MAJOR < 2000 | ||
113 | # define _PAGE_VALID (1<<0) | ||
114 | #else | ||
115 | # define _PAGE_VALID 0 | ||
116 | #endif | ||
117 | |||
118 | #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
119 | #define _PAGE_PRESENT (_PAGE_VALID | _PAGE_CA_WB | _PAGE_ACCESSED) | ||
120 | |||
121 | #ifdef CONFIG_MMU | ||
122 | |||
123 | #define PAGE_NONE __pgprot(_PAGE_INVALID | _PAGE_USER | _PAGE_PROTNONE) | ||
124 | #define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_USER) | ||
125 | #define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_HW_EXEC) | ||
126 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER) | ||
127 | #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_HW_EXEC) | ||
128 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_WRITABLE) | ||
129 | #define PAGE_SHARED_EXEC \ | ||
130 | __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_WRITABLE | _PAGE_HW_EXEC) | ||
131 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_HW_WRITE) | ||
132 | #define PAGE_KERNEL_EXEC __pgprot(_PAGE_PRESENT|_PAGE_HW_WRITE|_PAGE_HW_EXEC) | ||
133 | |||
134 | #if (DCACHE_WAY_SIZE > PAGE_SIZE) | ||
135 | # define _PAGE_DIRECTORY (_PAGE_VALID | _PAGE_ACCESSED) | ||
136 | #else | ||
137 | # define _PAGE_DIRECTORY (_PAGE_VALID | _PAGE_ACCESSED | _PAGE_CA_WB) | ||
138 | #endif | ||
139 | |||
140 | #else /* no mmu */ | ||
141 | |||
142 | # define PAGE_NONE __pgprot(0) | ||
143 | # define PAGE_SHARED __pgprot(0) | ||
144 | # define PAGE_COPY __pgprot(0) | ||
145 | # define PAGE_READONLY __pgprot(0) | ||
146 | # define PAGE_KERNEL __pgprot(0) | ||
147 | |||
148 | #endif | ||
149 | |||
150 | /* | ||
151 | * On certain configurations of Xtensa MMUs (eg. the initial Linux config), | ||
152 | * the MMU can't do page protection for execute, and considers that the same as | ||
153 | * read. Also, write permissions may imply read permissions. | ||
154 | * What follows is the closest we can get by reasonable means.. | ||
155 | * See linux/mm/mmap.c for protection_map[] array that uses these definitions. | ||
156 | */ | ||
157 | #define __P000 PAGE_NONE /* private --- */ | ||
158 | #define __P001 PAGE_READONLY /* private --r */ | ||
159 | #define __P010 PAGE_COPY /* private -w- */ | ||
160 | #define __P011 PAGE_COPY /* private -wr */ | ||
161 | #define __P100 PAGE_READONLY_EXEC /* private x-- */ | ||
162 | #define __P101 PAGE_READONLY_EXEC /* private x-r */ | ||
163 | #define __P110 PAGE_COPY_EXEC /* private xw- */ | ||
164 | #define __P111 PAGE_COPY_EXEC /* private xwr */ | ||
165 | |||
166 | #define __S000 PAGE_NONE /* shared --- */ | ||
167 | #define __S001 PAGE_READONLY /* shared --r */ | ||
168 | #define __S010 PAGE_SHARED /* shared -w- */ | ||
169 | #define __S011 PAGE_SHARED /* shared -wr */ | ||
170 | #define __S100 PAGE_READONLY_EXEC /* shared x-- */ | ||
171 | #define __S101 PAGE_READONLY_EXEC /* shared x-r */ | ||
172 | #define __S110 PAGE_SHARED_EXEC /* shared xw- */ | ||
173 | #define __S111 PAGE_SHARED_EXEC /* shared xwr */ | ||
174 | |||
175 | #ifndef __ASSEMBLY__ | ||
176 | |||
177 | #define pte_ERROR(e) \ | ||
178 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) | ||
179 | #define pgd_ERROR(e) \ | ||
180 | printk("%s:%d: bad pgd entry %08lx.\n", __FILE__, __LINE__, pgd_val(e)) | ||
181 | |||
182 | extern unsigned long empty_zero_page[1024]; | ||
183 | |||
184 | #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) | ||
185 | |||
186 | extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)]; | ||
187 | |||
188 | /* | ||
189 | * The pmd contains the kernel virtual address of the pte page. | ||
190 | */ | ||
191 | #define pmd_page_vaddr(pmd) ((unsigned long)(pmd_val(pmd) & PAGE_MASK)) | ||
192 | #define pmd_page(pmd) virt_to_page(pmd_val(pmd)) | ||
193 | |||
194 | /* | ||
195 | * pte status. | ||
196 | */ | ||
197 | #define pte_none(pte) (pte_val(pte) == _PAGE_INVALID) | ||
198 | #define pte_present(pte) \ | ||
199 | (((pte_val(pte) & _PAGE_CA_MASK) != _PAGE_INVALID) \ | ||
200 | || ((pte_val(pte) & _PAGE_PROTNONE) == _PAGE_PROTNONE)) | ||
201 | #define pte_clear(mm,addr,ptep) \ | ||
202 | do { update_pte(ptep, __pte(_PAGE_INVALID)); } while(0) | ||
203 | |||
204 | #define pmd_none(pmd) (!pmd_val(pmd)) | ||
205 | #define pmd_present(pmd) (pmd_val(pmd) & PAGE_MASK) | ||
206 | #define pmd_bad(pmd) (pmd_val(pmd) & ~PAGE_MASK) | ||
207 | #define pmd_clear(pmdp) do { set_pmd(pmdp, __pmd(0)); } while (0) | ||
208 | |||
209 | static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_WRITABLE; } | ||
210 | static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } | ||
211 | static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } | ||
212 | static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } | ||
213 | static inline int pte_special(pte_t pte) { return 0; } | ||
214 | |||
215 | static inline pte_t pte_wrprotect(pte_t pte) | ||
216 | { pte_val(pte) &= ~(_PAGE_WRITABLE | _PAGE_HW_WRITE); return pte; } | ||
217 | static inline pte_t pte_mkclean(pte_t pte) | ||
218 | { pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_HW_WRITE); return pte; } | ||
219 | static inline pte_t pte_mkold(pte_t pte) | ||
220 | { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; } | ||
221 | static inline pte_t pte_mkdirty(pte_t pte) | ||
222 | { pte_val(pte) |= _PAGE_DIRTY; return pte; } | ||
223 | static inline pte_t pte_mkyoung(pte_t pte) | ||
224 | { pte_val(pte) |= _PAGE_ACCESSED; return pte; } | ||
225 | static inline pte_t pte_mkwrite(pte_t pte) | ||
226 | { pte_val(pte) |= _PAGE_WRITABLE; return pte; } | ||
227 | static inline pte_t pte_mkspecial(pte_t pte) | ||
228 | { return pte; } | ||
229 | |||
230 | /* | ||
231 | * Conversion functions: convert a page and protection to a page entry, | ||
232 | * and a page entry and page directory to the page they refer to. | ||
233 | */ | ||
234 | |||
235 | #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) | ||
236 | #define pte_same(a,b) (pte_val(a) == pte_val(b)) | ||
237 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | ||
238 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | ||
239 | #define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) | ||
240 | |||
241 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | ||
242 | { | ||
243 | return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot)); | ||
244 | } | ||
245 | |||
246 | /* | ||
247 | * Certain architectures need to do special things when pte's | ||
248 | * within a page table are directly modified. Thus, the following | ||
249 | * hook is made available. | ||
250 | */ | ||
251 | static inline void update_pte(pte_t *ptep, pte_t pteval) | ||
252 | { | ||
253 | *ptep = pteval; | ||
254 | #if (DCACHE_WAY_SIZE > PAGE_SIZE) && XCHAL_DCACHE_IS_WRITEBACK | ||
255 | __asm__ __volatile__ ("dhwb %0, 0" :: "a" (ptep)); | ||
256 | #endif | ||
257 | |||
258 | } | ||
259 | |||
260 | struct mm_struct; | ||
261 | |||
262 | static inline void | ||
263 | set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pteval) | ||
264 | { | ||
265 | update_pte(ptep, pteval); | ||
266 | } | ||
267 | |||
268 | |||
269 | static inline void | ||
270 | set_pmd(pmd_t *pmdp, pmd_t pmdval) | ||
271 | { | ||
272 | *pmdp = pmdval; | ||
273 | } | ||
274 | |||
275 | struct vm_area_struct; | ||
276 | |||
277 | static inline int | ||
278 | ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, | ||
279 | pte_t *ptep) | ||
280 | { | ||
281 | pte_t pte = *ptep; | ||
282 | if (!pte_young(pte)) | ||
283 | return 0; | ||
284 | update_pte(ptep, pte_mkold(pte)); | ||
285 | return 1; | ||
286 | } | ||
287 | |||
288 | static inline pte_t | ||
289 | ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | ||
290 | { | ||
291 | pte_t pte = *ptep; | ||
292 | pte_clear(mm, addr, ptep); | ||
293 | return pte; | ||
294 | } | ||
295 | |||
296 | static inline void | ||
297 | ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | ||
298 | { | ||
299 | pte_t pte = *ptep; | ||
300 | update_pte(ptep, pte_wrprotect(pte)); | ||
301 | } | ||
302 | |||
303 | /* to find an entry in a kernel page-table-directory */ | ||
304 | #define pgd_offset_k(address) pgd_offset(&init_mm, address) | ||
305 | |||
306 | /* to find an entry in a page-table-directory */ | ||
307 | #define pgd_offset(mm,address) ((mm)->pgd + pgd_index(address)) | ||
308 | |||
309 | #define pgd_index(address) ((address) >> PGDIR_SHIFT) | ||
310 | |||
311 | /* Find an entry in the second-level page table.. */ | ||
312 | #define pmd_offset(dir,address) ((pmd_t*)(dir)) | ||
313 | |||
314 | /* Find an entry in the third-level page table.. */ | ||
315 | #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
316 | #define pte_offset_kernel(dir,addr) \ | ||
317 | ((pte_t*) pmd_page_vaddr(*(dir)) + pte_index(addr)) | ||
318 | #define pte_offset_map(dir,addr) pte_offset_kernel((dir),(addr)) | ||
319 | #define pte_offset_map_nested(dir,addr) pte_offset_kernel((dir),(addr)) | ||
320 | |||
321 | #define pte_unmap(pte) do { } while (0) | ||
322 | #define pte_unmap_nested(pte) do { } while (0) | ||
323 | |||
324 | |||
325 | /* | ||
326 | * Encode and decode a swap entry. | ||
327 | * | ||
328 | * Format of swap pte: | ||
329 | * bit 0 MBZ | ||
330 | * bit 1 page-file (must be zero) | ||
331 | * bits 2 - 3 page hw access mode (must be 11: _PAGE_INVALID) | ||
332 | * bits 4 - 5 ring protection (must be 01: _PAGE_USER) | ||
333 | * bits 6 - 10 swap type (5 bits -> 32 types) | ||
334 | * bits 11 - 31 swap offset / PAGE_SIZE (21 bits -> 8GB) | ||
335 | |||
336 | * Format of file pte: | ||
337 | * bit 0 MBZ | ||
338 | * bit 1 page-file (must be one: _PAGE_FILE) | ||
339 | * bits 2 - 3 page hw access mode (must be 11: _PAGE_INVALID) | ||
340 | * bits 4 - 5 ring protection (must be 01: _PAGE_USER) | ||
341 | * bits 6 - 31 file offset / PAGE_SIZE | ||
342 | */ | ||
343 | |||
344 | #define __swp_type(entry) (((entry).val >> 6) & 0x1f) | ||
345 | #define __swp_offset(entry) ((entry).val >> 11) | ||
346 | #define __swp_entry(type,offs) \ | ||
347 | ((swp_entry_t) {((type) << 6) | ((offs) << 11) | _PAGE_INVALID}) | ||
348 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | ||
349 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | ||
350 | |||
351 | #define PTE_FILE_MAX_BITS 28 | ||
352 | #define pte_to_pgoff(pte) (pte_val(pte) >> 4) | ||
353 | #define pgoff_to_pte(off) \ | ||
354 | ((pte_t) { ((off) << 4) | _PAGE_INVALID | _PAGE_FILE }) | ||
355 | |||
356 | #endif /* !defined (__ASSEMBLY__) */ | ||
357 | |||
358 | |||
359 | #ifdef __ASSEMBLY__ | ||
360 | |||
361 | /* Assembly macro _PGD_INDEX is the same as C pgd_index(unsigned long), | ||
362 | * _PGD_OFFSET as C pgd_offset(struct mm_struct*, unsigned long), | ||
363 | * _PMD_OFFSET as C pmd_offset(pgd_t*, unsigned long) | ||
364 | * _PTE_OFFSET as C pte_offset(pmd_t*, unsigned long) | ||
365 | * | ||
366 | * Note: We require an additional temporary register which can be the same as | ||
367 | * the register that holds the address. | ||
368 | * | ||
369 | * ((pte_t*) ((unsigned long)(pmd_val(*pmd) & PAGE_MASK)) + pte_index(addr)) | ||
370 | * | ||
371 | */ | ||
372 | #define _PGD_INDEX(rt,rs) extui rt, rs, PGDIR_SHIFT, 32-PGDIR_SHIFT | ||
373 | #define _PTE_INDEX(rt,rs) extui rt, rs, PAGE_SHIFT, PTRS_PER_PTE_SHIFT | ||
374 | |||
375 | #define _PGD_OFFSET(mm,adr,tmp) l32i mm, mm, MM_PGD; \ | ||
376 | _PGD_INDEX(tmp, adr); \ | ||
377 | addx4 mm, tmp, mm | ||
378 | |||
379 | #define _PTE_OFFSET(pmd,adr,tmp) _PTE_INDEX(tmp, adr); \ | ||
380 | srli pmd, pmd, PAGE_SHIFT; \ | ||
381 | slli pmd, pmd, PAGE_SHIFT; \ | ||
382 | addx4 pmd, tmp, pmd | ||
383 | |||
384 | #else | ||
385 | |||
386 | extern void paging_init(void); | ||
387 | |||
388 | #define kern_addr_valid(addr) (1) | ||
389 | |||
390 | extern void update_mmu_cache(struct vm_area_struct * vma, | ||
391 | unsigned long address, pte_t pte); | ||
392 | |||
393 | /* | ||
394 | * remap a physical page `pfn' of size `size' with page protection `prot' | ||
395 | * into virtual address `from' | ||
396 | */ | ||
397 | |||
398 | #define io_remap_pfn_range(vma,from,pfn,size,prot) \ | ||
399 | remap_pfn_range(vma, from, pfn, size, prot) | ||
400 | |||
401 | |||
402 | extern void pgtable_cache_init(void); | ||
403 | |||
404 | typedef pte_t *pte_addr_t; | ||
405 | |||
406 | #endif /* !defined (__ASSEMBLY__) */ | ||
407 | |||
408 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | ||
409 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR | ||
410 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT | ||
411 | #define __HAVE_ARCH_PTEP_MKDIRTY | ||
412 | #define __HAVE_ARCH_PTE_SAME | ||
413 | |||
414 | #include <asm-generic/pgtable.h> | ||
415 | |||
416 | #endif /* _XTENSA_PGTABLE_H */ | ||
diff --git a/include/asm-xtensa/platform-iss/hardware.h b/include/asm-xtensa/platform-iss/hardware.h deleted file mode 100644 index 6930c12adc16..000000000000 --- a/include/asm-xtensa/platform-iss/hardware.h +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/platform-iss/hardware.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * This file contains the default configuration of ISS. | ||
13 | */ | ||
14 | |||
15 | #ifndef _XTENSA_PLATFORM_ISS_HARDWARE_H | ||
16 | #define _XTENSA_PLATFORM_ISS_HARDWARE_H | ||
17 | |||
18 | /* | ||
19 | * Memory configuration. | ||
20 | */ | ||
21 | |||
22 | #define PLATFORM_DEFAULT_MEM_START 0x00000000 | ||
23 | #define PLATFORM_DEFAULT_MEM_SIZE 0x08000000 | ||
24 | |||
25 | /* | ||
26 | * Interrupt configuration. | ||
27 | */ | ||
28 | |||
29 | #endif /* _XTENSA_PLATFORM_ISS_HARDWARE_H */ | ||
diff --git a/include/asm-xtensa/platform-iss/simcall.h b/include/asm-xtensa/platform-iss/simcall.h deleted file mode 100644 index b7952c06a2b7..000000000000 --- a/include/asm-xtensa/platform-iss/simcall.h +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/platform-iss/simcall.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PLATFORM_ISS_SIMCALL_H | ||
12 | #define _XTENSA_PLATFORM_ISS_SIMCALL_H | ||
13 | |||
14 | |||
15 | /* | ||
16 | * System call like services offered by the simulator host. | ||
17 | */ | ||
18 | |||
19 | #define SYS_nop 0 /* unused */ | ||
20 | #define SYS_exit 1 /*x*/ | ||
21 | #define SYS_fork 2 | ||
22 | #define SYS_read 3 /*x*/ | ||
23 | #define SYS_write 4 /*x*/ | ||
24 | #define SYS_open 5 /*x*/ | ||
25 | #define SYS_close 6 /*x*/ | ||
26 | #define SYS_rename 7 /*x 38 - waitpid */ | ||
27 | #define SYS_creat 8 /*x*/ | ||
28 | #define SYS_link 9 /*x (not implemented on WIN32) */ | ||
29 | #define SYS_unlink 10 /*x*/ | ||
30 | #define SYS_execv 11 /* n/a - execve */ | ||
31 | #define SYS_execve 12 /* 11 - chdir */ | ||
32 | #define SYS_pipe 13 /* 42 - time */ | ||
33 | #define SYS_stat 14 /* 106 - mknod */ | ||
34 | #define SYS_chmod 15 | ||
35 | #define SYS_chown 16 /* 202 - lchown */ | ||
36 | #define SYS_utime 17 /* 30 - break */ | ||
37 | #define SYS_wait 18 /* n/a - oldstat */ | ||
38 | #define SYS_lseek 19 /*x*/ | ||
39 | #define SYS_getpid 20 | ||
40 | #define SYS_isatty 21 /* n/a - mount */ | ||
41 | #define SYS_fstat 22 /* 108 - oldumount */ | ||
42 | #define SYS_time 23 /* 13 - setuid */ | ||
43 | #define SYS_gettimeofday 24 /*x 78 - getuid (not implemented on WIN32) */ | ||
44 | #define SYS_times 25 /*X 43 - stime (Xtensa-specific implementation) */ | ||
45 | #define SYS_socket 26 | ||
46 | #define SYS_sendto 27 | ||
47 | #define SYS_recvfrom 28 | ||
48 | #define SYS_select_one 29 /* not compitible select, one file descriptor at the time */ | ||
49 | #define SYS_bind 30 | ||
50 | #define SYS_ioctl 31 | ||
51 | |||
52 | /* | ||
53 | * SYS_select_one specifiers | ||
54 | */ | ||
55 | |||
56 | #define XTISS_SELECT_ONE_READ 1 | ||
57 | #define XTISS_SELECT_ONE_WRITE 2 | ||
58 | #define XTISS_SELECT_ONE_EXCEPT 3 | ||
59 | |||
60 | |||
61 | #endif /* _XTENSA_PLATFORM_ISS_SIMCALL_H */ | ||
62 | |||
diff --git a/include/asm-xtensa/platform.h b/include/asm-xtensa/platform.h deleted file mode 100644 index 48135a9718b0..000000000000 --- a/include/asm-xtensa/platform.h +++ /dev/null | |||
@@ -1,91 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/platform.h | ||
3 | * | ||
4 | * Platform specific functions | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General | ||
7 | * Public License. See the file "COPYING" in the main directory of | ||
8 | * this archive for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_PLATFORM_H | ||
14 | #define _XTENSA_PLATFORM_H | ||
15 | |||
16 | #include <linux/types.h> | ||
17 | #include <linux/pci.h> | ||
18 | |||
19 | #include <asm/bootparam.h> | ||
20 | |||
21 | /* | ||
22 | * platform_init is called before the mmu is initialized to give the | ||
23 | * platform a early hook-up. bp_tag_t is a list of configuration tags | ||
24 | * passed from the boot-loader. | ||
25 | */ | ||
26 | extern void platform_init(bp_tag_t*); | ||
27 | |||
28 | /* | ||
29 | * platform_setup is called from setup_arch with a pointer to the command-line | ||
30 | * string. | ||
31 | */ | ||
32 | extern void platform_setup (char **); | ||
33 | |||
34 | /* | ||
35 | * platform_init_irq is called from init_IRQ. | ||
36 | */ | ||
37 | extern void platform_init_irq (void); | ||
38 | |||
39 | /* | ||
40 | * platform_restart is called to restart the system. | ||
41 | */ | ||
42 | extern void platform_restart (void); | ||
43 | |||
44 | /* | ||
45 | * platform_halt is called to stop the system and halt. | ||
46 | */ | ||
47 | extern void platform_halt (void); | ||
48 | |||
49 | /* | ||
50 | * platform_power_off is called to stop the system and power it off. | ||
51 | */ | ||
52 | extern void platform_power_off (void); | ||
53 | |||
54 | /* | ||
55 | * platform_idle is called from the idle function. | ||
56 | */ | ||
57 | extern void platform_idle (void); | ||
58 | |||
59 | /* | ||
60 | * platform_heartbeat is called every HZ | ||
61 | */ | ||
62 | extern void platform_heartbeat (void); | ||
63 | |||
64 | /* | ||
65 | * platform_pcibios_init is called to allow the platform to setup the pci bus. | ||
66 | */ | ||
67 | extern void platform_pcibios_init (void); | ||
68 | |||
69 | /* | ||
70 | * platform_pcibios_fixup allows to modify the PCI configuration. | ||
71 | */ | ||
72 | extern int platform_pcibios_fixup (void); | ||
73 | |||
74 | /* | ||
75 | * platform_calibrate_ccount calibrates cpu clock freq (CONFIG_XTENSA_CALIBRATE) | ||
76 | */ | ||
77 | extern void platform_calibrate_ccount (void); | ||
78 | |||
79 | /* | ||
80 | * platform_get_rtc_time returns RTC seconds (returns 0 for no error) | ||
81 | */ | ||
82 | extern int platform_get_rtc_time(time_t*); | ||
83 | |||
84 | /* | ||
85 | * platform_set_rtc_time set RTC seconds (returns 0 for no error) | ||
86 | */ | ||
87 | extern int platform_set_rtc_time(time_t); | ||
88 | |||
89 | |||
90 | #endif /* _XTENSA_PLATFORM_H */ | ||
91 | |||
diff --git a/include/asm-xtensa/poll.h b/include/asm-xtensa/poll.h deleted file mode 100644 index 9d2d5993f068..000000000000 --- a/include/asm-xtensa/poll.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/poll.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_POLL_H | ||
12 | #define _XTENSA_POLL_H | ||
13 | |||
14 | #define POLLWRNORM POLLOUT | ||
15 | #define POLLWRBAND 0x0100 | ||
16 | #define POLLREMOVE 0x0800 | ||
17 | |||
18 | #include <asm-generic/poll.h> | ||
19 | |||
20 | #endif /* _XTENSA_POLL_H */ | ||
diff --git a/include/asm-xtensa/posix_types.h b/include/asm-xtensa/posix_types.h deleted file mode 100644 index 43f9dd1126a4..000000000000 --- a/include/asm-xtensa/posix_types.h +++ /dev/null | |||
@@ -1,122 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/posix_types.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Largely copied from include/asm-ppc/posix_types.h | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_POSIX_TYPES_H | ||
14 | #define _XTENSA_POSIX_TYPES_H | ||
15 | |||
16 | /* | ||
17 | * This file is generally used by user-level software, so you need to | ||
18 | * be a little careful about namespace pollution etc. Also, we cannot | ||
19 | * assume GCC is being used. | ||
20 | */ | ||
21 | |||
22 | typedef unsigned long __kernel_ino_t; | ||
23 | typedef unsigned int __kernel_mode_t; | ||
24 | typedef unsigned long __kernel_nlink_t; | ||
25 | typedef long __kernel_off_t; | ||
26 | typedef int __kernel_pid_t; | ||
27 | typedef unsigned short __kernel_ipc_pid_t; | ||
28 | typedef unsigned int __kernel_uid_t; | ||
29 | typedef unsigned int __kernel_gid_t; | ||
30 | typedef unsigned int __kernel_size_t; | ||
31 | typedef int __kernel_ssize_t; | ||
32 | typedef long __kernel_ptrdiff_t; | ||
33 | typedef long __kernel_time_t; | ||
34 | typedef long __kernel_suseconds_t; | ||
35 | typedef long __kernel_clock_t; | ||
36 | typedef int __kernel_timer_t; | ||
37 | typedef int __kernel_clockid_t; | ||
38 | typedef int __kernel_daddr_t; | ||
39 | typedef char * __kernel_caddr_t; | ||
40 | typedef unsigned short __kernel_uid16_t; | ||
41 | typedef unsigned short __kernel_gid16_t; | ||
42 | typedef unsigned int __kernel_uid32_t; | ||
43 | typedef unsigned int __kernel_gid32_t; | ||
44 | |||
45 | typedef unsigned short __kernel_old_uid_t; | ||
46 | typedef unsigned short __kernel_old_gid_t; | ||
47 | typedef unsigned short __kernel_old_dev_t; | ||
48 | |||
49 | #ifdef __GNUC__ | ||
50 | typedef long long __kernel_loff_t; | ||
51 | #endif | ||
52 | |||
53 | typedef struct { | ||
54 | int val[2]; | ||
55 | } __kernel_fsid_t; | ||
56 | |||
57 | #ifndef __GNUC__ | ||
58 | |||
59 | #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) | ||
60 | #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) | ||
61 | #define __FD_ISSET(d, set) ((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) | ||
62 | #define __FD_ZERO(set) \ | ||
63 | ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) | ||
64 | |||
65 | #else /* __GNUC__ */ | ||
66 | |||
67 | #if defined(__KERNEL__) | ||
68 | /* With GNU C, use inline functions instead so args are evaluated only once: */ | ||
69 | |||
70 | #undef __FD_SET | ||
71 | static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) | ||
72 | { | ||
73 | unsigned long _tmp = fd / __NFDBITS; | ||
74 | unsigned long _rem = fd % __NFDBITS; | ||
75 | fdsetp->fds_bits[_tmp] |= (1UL<<_rem); | ||
76 | } | ||
77 | |||
78 | #undef __FD_CLR | ||
79 | static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) | ||
80 | { | ||
81 | unsigned long _tmp = fd / __NFDBITS; | ||
82 | unsigned long _rem = fd % __NFDBITS; | ||
83 | fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); | ||
84 | } | ||
85 | |||
86 | #undef __FD_ISSET | ||
87 | static __inline__ int __FD_ISSET(unsigned long fd, __kernel_fd_set *p) | ||
88 | { | ||
89 | unsigned long _tmp = fd / __NFDBITS; | ||
90 | unsigned long _rem = fd % __NFDBITS; | ||
91 | return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; | ||
92 | } | ||
93 | |||
94 | /* | ||
95 | * This will unroll the loop for the normal constant case (8 ints, | ||
96 | * for a 256-bit fd_set) | ||
97 | */ | ||
98 | #undef __FD_ZERO | ||
99 | static __inline__ void __FD_ZERO(__kernel_fd_set *p) | ||
100 | { | ||
101 | unsigned int *tmp = (unsigned int *)p->fds_bits; | ||
102 | int i; | ||
103 | |||
104 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
105 | switch (__FDSET_LONGS) { | ||
106 | case 8: | ||
107 | tmp[0] = 0; tmp[1] = 0; tmp[2] = 0; tmp[3] = 0; | ||
108 | tmp[4] = 0; tmp[5] = 0; tmp[6] = 0; tmp[7] = 0; | ||
109 | return; | ||
110 | } | ||
111 | } | ||
112 | i = __FDSET_LONGS; | ||
113 | while (i) { | ||
114 | i--; | ||
115 | *tmp = 0; | ||
116 | tmp++; | ||
117 | } | ||
118 | } | ||
119 | |||
120 | #endif /* defined(__KERNEL__) */ | ||
121 | #endif /* __GNUC__ */ | ||
122 | #endif /* _XTENSA_POSIX_TYPES_H */ | ||
diff --git a/include/asm-xtensa/processor.h b/include/asm-xtensa/processor.h deleted file mode 100644 index 4918a4e96d42..000000000000 --- a/include/asm-xtensa/processor.h +++ /dev/null | |||
@@ -1,193 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/processor.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PROCESSOR_H | ||
12 | #define _XTENSA_PROCESSOR_H | ||
13 | |||
14 | #include <asm/variant/core.h> | ||
15 | #include <asm/coprocessor.h> | ||
16 | |||
17 | #include <linux/compiler.h> | ||
18 | #include <asm/ptrace.h> | ||
19 | #include <asm/types.h> | ||
20 | #include <asm/regs.h> | ||
21 | |||
22 | /* Assertions. */ | ||
23 | |||
24 | #if (XCHAL_HAVE_WINDOWED != 1) | ||
25 | # error Linux requires the Xtensa Windowed Registers Option. | ||
26 | #endif | ||
27 | |||
28 | /* | ||
29 | * User space process size: 1 GB. | ||
30 | * Windowed call ABI requires caller and callee to be located within the same | ||
31 | * 1 GB region. The C compiler places trampoline code on the stack for sources | ||
32 | * that take the address of a nested C function (a feature used by glibc), so | ||
33 | * the 1 GB requirement applies to the stack as well. | ||
34 | */ | ||
35 | |||
36 | #define TASK_SIZE __XTENSA_UL_CONST(0x40000000) | ||
37 | #define STACK_TOP TASK_SIZE | ||
38 | #define STACK_TOP_MAX STACK_TOP | ||
39 | |||
40 | /* | ||
41 | * General exception cause assigned to debug exceptions. Debug exceptions go | ||
42 | * to their own vector, rather than the general exception vectors (user, | ||
43 | * kernel, double); and their specific causes are reported via DEBUGCAUSE | ||
44 | * rather than EXCCAUSE. However it is sometimes convenient to redirect debug | ||
45 | * exceptions to the general exception mechanism. To do this, an otherwise | ||
46 | * unused EXCCAUSE value was assigned to debug exceptions for this purpose. | ||
47 | */ | ||
48 | |||
49 | #define EXCCAUSE_MAPPED_DEBUG 63 | ||
50 | |||
51 | /* | ||
52 | * We use DEPC also as a flag to distinguish between double and regular | ||
53 | * exceptions. For performance reasons, DEPC might contain the value of | ||
54 | * EXCCAUSE for regular exceptions, so we use this definition to mark a | ||
55 | * valid double exception address. | ||
56 | * (Note: We use it in bgeui, so it should be 64, 128, or 256) | ||
57 | */ | ||
58 | |||
59 | #define VALID_DOUBLE_EXCEPTION_ADDRESS 64 | ||
60 | |||
61 | /* LOCKLEVEL defines the interrupt level that masks all | ||
62 | * general-purpose interrupts. | ||
63 | */ | ||
64 | #define LOCKLEVEL 1 | ||
65 | |||
66 | /* WSBITS and WBBITS are the width of the WINDOWSTART and WINDOWBASE | ||
67 | * registers | ||
68 | */ | ||
69 | #define WSBITS (XCHAL_NUM_AREGS / 4) /* width of WINDOWSTART in bits */ | ||
70 | #define WBBITS (XCHAL_NUM_AREGS_LOG2 - 2) /* width of WINDOWBASE in bits */ | ||
71 | |||
72 | #ifndef __ASSEMBLY__ | ||
73 | |||
74 | /* Build a valid return address for the specified call winsize. | ||
75 | * winsize must be 1 (call4), 2 (call8), or 3 (call12) | ||
76 | */ | ||
77 | #define MAKE_RA_FOR_CALL(ra,ws) (((ra) & 0x3fffffff) | (ws) << 30) | ||
78 | |||
79 | /* Convert return address to a valid pc | ||
80 | * Note: We assume that the stack pointer is in the same 1GB ranges as the ra | ||
81 | */ | ||
82 | #define MAKE_PC_FROM_RA(ra,sp) (((ra) & 0x3fffffff) | ((sp) & 0xc0000000)) | ||
83 | |||
84 | typedef struct { | ||
85 | unsigned long seg; | ||
86 | } mm_segment_t; | ||
87 | |||
88 | struct thread_struct { | ||
89 | |||
90 | /* kernel's return address and stack pointer for context switching */ | ||
91 | unsigned long ra; /* kernel's a0: return address and window call size */ | ||
92 | unsigned long sp; /* kernel's a1: stack pointer */ | ||
93 | |||
94 | mm_segment_t current_ds; /* see uaccess.h for example uses */ | ||
95 | |||
96 | /* struct xtensa_cpuinfo info; */ | ||
97 | |||
98 | unsigned long bad_vaddr; /* last user fault */ | ||
99 | unsigned long bad_uaddr; /* last kernel fault accessing user space */ | ||
100 | unsigned long error_code; | ||
101 | |||
102 | unsigned long ibreak[XCHAL_NUM_IBREAK]; | ||
103 | unsigned long dbreaka[XCHAL_NUM_DBREAK]; | ||
104 | unsigned long dbreakc[XCHAL_NUM_DBREAK]; | ||
105 | |||
106 | /* Make structure 16 bytes aligned. */ | ||
107 | int align[0] __attribute__ ((aligned(16))); | ||
108 | }; | ||
109 | |||
110 | |||
111 | /* | ||
112 | * Default implementation of macro that returns current | ||
113 | * instruction pointer ("program counter"). | ||
114 | */ | ||
115 | #define current_text_addr() ({ __label__ _l; _l: &&_l;}) | ||
116 | |||
117 | |||
118 | /* This decides where the kernel will search for a free chunk of vm | ||
119 | * space during mmap's. | ||
120 | */ | ||
121 | #define TASK_UNMAPPED_BASE (TASK_SIZE / 2) | ||
122 | |||
123 | #define INIT_THREAD \ | ||
124 | { \ | ||
125 | ra: 0, \ | ||
126 | sp: sizeof(init_stack) + (long) &init_stack, \ | ||
127 | current_ds: {0}, \ | ||
128 | /*info: {0}, */ \ | ||
129 | bad_vaddr: 0, \ | ||
130 | bad_uaddr: 0, \ | ||
131 | error_code: 0, \ | ||
132 | } | ||
133 | |||
134 | |||
135 | /* | ||
136 | * Do necessary setup to start up a newly executed thread. | ||
137 | * Note: We set-up ps as if we did a call4 to the new pc. | ||
138 | * set_thread_state in signal.c depends on it. | ||
139 | */ | ||
140 | #define USER_PS_VALUE ((1 << PS_WOE_BIT) | \ | ||
141 | (1 << PS_CALLINC_SHIFT) | \ | ||
142 | (USER_RING << PS_RING_SHIFT) | \ | ||
143 | (1 << PS_UM_BIT) | \ | ||
144 | (1 << PS_EXCM_BIT)) | ||
145 | |||
146 | /* Clearing a0 terminates the backtrace. */ | ||
147 | #define start_thread(regs, new_pc, new_sp) \ | ||
148 | regs->pc = new_pc; \ | ||
149 | regs->ps = USER_PS_VALUE; \ | ||
150 | regs->areg[1] = new_sp; \ | ||
151 | regs->areg[0] = 0; \ | ||
152 | regs->wmask = 1; \ | ||
153 | regs->depc = 0; \ | ||
154 | regs->windowbase = 0; \ | ||
155 | regs->windowstart = 1; | ||
156 | |||
157 | /* Forward declaration */ | ||
158 | struct task_struct; | ||
159 | struct mm_struct; | ||
160 | |||
161 | /* Free all resources held by a thread. */ | ||
162 | #define release_thread(thread) do { } while(0) | ||
163 | |||
164 | /* Prepare to copy thread state - unlazy all lazy status */ | ||
165 | extern void prepare_to_copy(struct task_struct*); | ||
166 | |||
167 | /* Create a kernel thread without removing it from tasklists */ | ||
168 | extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); | ||
169 | |||
170 | /* Copy and release all segment info associated with a VM */ | ||
171 | #define copy_segments(p, mm) do { } while(0) | ||
172 | #define release_segments(mm) do { } while(0) | ||
173 | #define forget_segments() do { } while (0) | ||
174 | |||
175 | #define thread_saved_pc(tsk) (task_pt_regs(tsk)->pc) | ||
176 | |||
177 | extern unsigned long get_wchan(struct task_struct *p); | ||
178 | |||
179 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) | ||
180 | #define KSTK_ESP(tsk) (task_pt_regs(tsk)->areg[1]) | ||
181 | |||
182 | #define cpu_relax() barrier() | ||
183 | |||
184 | /* Special register access. */ | ||
185 | |||
186 | #define WSR(v,sr) __asm__ __volatile__ ("wsr %0,"__stringify(sr) :: "a"(v)); | ||
187 | #define RSR(v,sr) __asm__ __volatile__ ("rsr %0,"__stringify(sr) : "=a"(v)); | ||
188 | |||
189 | #define set_sr(x,sr) ({unsigned int v=(unsigned int)x; WSR(v,sr);}) | ||
190 | #define get_sr(sr) ({unsigned int v; RSR(v,sr); v; }) | ||
191 | |||
192 | #endif /* __ASSEMBLY__ */ | ||
193 | #endif /* _XTENSA_PROCESSOR_H */ | ||
diff --git a/include/asm-xtensa/ptrace.h b/include/asm-xtensa/ptrace.h deleted file mode 100644 index 089b0db44816..000000000000 --- a/include/asm-xtensa/ptrace.h +++ /dev/null | |||
@@ -1,135 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/ptrace.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_PTRACE_H | ||
12 | #define _XTENSA_PTRACE_H | ||
13 | |||
14 | /* | ||
15 | * Kernel stack | ||
16 | * | ||
17 | * +-----------------------+ -------- STACK_SIZE | ||
18 | * | register file | | | ||
19 | * +-----------------------+ | | ||
20 | * | struct pt_regs | | | ||
21 | * +-----------------------+ | ------ PT_REGS_OFFSET | ||
22 | * double : 16 bytes spill area : | ^ | ||
23 | * excetion :- - - - - - - - - - - -: | | | ||
24 | * frame : struct pt_regs : | | | ||
25 | * :- - - - - - - - - - - -: | | | ||
26 | * | | | | | ||
27 | * | memory stack | | | | ||
28 | * | | | | | ||
29 | * ~ ~ ~ ~ | ||
30 | * ~ ~ ~ ~ | ||
31 | * | | | | | ||
32 | * | | | | | ||
33 | * +-----------------------+ | | --- STACK_BIAS | ||
34 | * | struct task_struct | | | ^ | ||
35 | * current --> +-----------------------+ | | | | ||
36 | * | struct thread_info | | | | | ||
37 | * +-----------------------+ -------- | ||
38 | */ | ||
39 | |||
40 | #define KERNEL_STACK_SIZE (2 * PAGE_SIZE) | ||
41 | |||
42 | /* Offsets for exception_handlers[] (3 x 64-entries x 4-byte tables). */ | ||
43 | |||
44 | #define EXC_TABLE_KSTK 0x004 /* Kernel Stack */ | ||
45 | #define EXC_TABLE_DOUBLE_SAVE 0x008 /* Double exception save area for a0 */ | ||
46 | #define EXC_TABLE_FIXUP 0x00c /* Fixup handler */ | ||
47 | #define EXC_TABLE_PARAM 0x010 /* For passing a parameter to fixup */ | ||
48 | #define EXC_TABLE_SYSCALL_SAVE 0x014 /* For fast syscall handler */ | ||
49 | #define EXC_TABLE_FAST_USER 0x100 /* Fast user exception handler */ | ||
50 | #define EXC_TABLE_FAST_KERNEL 0x200 /* Fast kernel exception handler */ | ||
51 | #define EXC_TABLE_DEFAULT 0x300 /* Default C-Handler */ | ||
52 | #define EXC_TABLE_SIZE 0x400 | ||
53 | |||
54 | /* Registers used by strace */ | ||
55 | |||
56 | #define REG_A_BASE 0x0000 | ||
57 | #define REG_AR_BASE 0x0100 | ||
58 | #define REG_PC 0x0020 | ||
59 | #define REG_PS 0x02e6 | ||
60 | #define REG_WB 0x0248 | ||
61 | #define REG_WS 0x0249 | ||
62 | #define REG_LBEG 0x0200 | ||
63 | #define REG_LEND 0x0201 | ||
64 | #define REG_LCOUNT 0x0202 | ||
65 | #define REG_SAR 0x0203 | ||
66 | |||
67 | #define SYSCALL_NR 0x00ff | ||
68 | |||
69 | /* Other PTRACE_ values defined in <linux/ptrace.h> using values 0-9,16,17,24 */ | ||
70 | |||
71 | #define PTRACE_GETREGS 12 | ||
72 | #define PTRACE_SETREGS 13 | ||
73 | #define PTRACE_GETXTREGS 18 | ||
74 | #define PTRACE_SETXTREGS 19 | ||
75 | |||
76 | #ifdef __KERNEL__ | ||
77 | |||
78 | #ifndef __ASSEMBLY__ | ||
79 | |||
80 | /* | ||
81 | * This struct defines the way the registers are stored on the | ||
82 | * kernel stack during a system call or other kernel entry. | ||
83 | */ | ||
84 | struct pt_regs { | ||
85 | unsigned long pc; /* 4 */ | ||
86 | unsigned long ps; /* 8 */ | ||
87 | unsigned long depc; /* 12 */ | ||
88 | unsigned long exccause; /* 16 */ | ||
89 | unsigned long excvaddr; /* 20 */ | ||
90 | unsigned long debugcause; /* 24 */ | ||
91 | unsigned long wmask; /* 28 */ | ||
92 | unsigned long lbeg; /* 32 */ | ||
93 | unsigned long lend; /* 36 */ | ||
94 | unsigned long lcount; /* 40 */ | ||
95 | unsigned long sar; /* 44 */ | ||
96 | unsigned long windowbase; /* 48 */ | ||
97 | unsigned long windowstart; /* 52 */ | ||
98 | unsigned long syscall; /* 56 */ | ||
99 | unsigned long icountlevel; /* 60 */ | ||
100 | int reserved[1]; /* 64 */ | ||
101 | |||
102 | /* Additional configurable registers that are used by the compiler. */ | ||
103 | xtregs_opt_t xtregs_opt; | ||
104 | |||
105 | /* Make sure the areg field is 16 bytes aligned. */ | ||
106 | int align[0] __attribute__ ((aligned(16))); | ||
107 | |||
108 | /* current register frame. | ||
109 | * Note: The ESF for kernel exceptions ends after 16 registers! | ||
110 | */ | ||
111 | unsigned long areg[16]; /* 128 (64) */ | ||
112 | }; | ||
113 | |||
114 | #include <asm/variant/core.h> | ||
115 | |||
116 | # define task_pt_regs(tsk) ((struct pt_regs*) \ | ||
117 | (task_stack_page(tsk) + KERNEL_STACK_SIZE - (XCHAL_NUM_AREGS-16)*4) - 1) | ||
118 | # define user_mode(regs) (((regs)->ps & 0x00000020)!=0) | ||
119 | # define instruction_pointer(regs) ((regs)->pc) | ||
120 | extern void show_regs(struct pt_regs *); | ||
121 | |||
122 | # ifndef CONFIG_SMP | ||
123 | # define profile_pc(regs) instruction_pointer(regs) | ||
124 | # endif | ||
125 | |||
126 | #else /* __ASSEMBLY__ */ | ||
127 | |||
128 | # include <asm/asm-offsets.h> | ||
129 | #define PT_REGS_OFFSET (KERNEL_STACK_SIZE - PT_USER_SIZE) | ||
130 | |||
131 | #endif /* !__ASSEMBLY__ */ | ||
132 | |||
133 | #endif /* __KERNEL__ */ | ||
134 | |||
135 | #endif /* _XTENSA_PTRACE_H */ | ||
diff --git a/include/asm-xtensa/regs.h b/include/asm-xtensa/regs.h deleted file mode 100644 index d4baed246928..000000000000 --- a/include/asm-xtensa/regs.h +++ /dev/null | |||
@@ -1,145 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2006 Tensilica, Inc. All Rights Reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of version 2.1 of the GNU Lesser General Public | ||
6 | * License as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it would be useful, but | ||
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
11 | * | ||
12 | * Further, this software is distributed without any warranty that it is | ||
13 | * free of the rightful claim of any third person regarding infringement | ||
14 | * or the like. Any license provided herein, whether implied or | ||
15 | * otherwise, applies only to this software file. Patent licenses, if | ||
16 | * any, provided herein do not apply to combinations of this program with | ||
17 | * other software, or any other product whatsoever. | ||
18 | * | ||
19 | * You should have received a copy of the GNU Lesser General Public | ||
20 | * License along with this program; if not, write the Free Software | ||
21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, | ||
22 | * USA. | ||
23 | */ | ||
24 | |||
25 | #ifndef _XTENSA_REGS_H | ||
26 | #define _XTENSA_REGS_H | ||
27 | |||
28 | /* Special registers. */ | ||
29 | |||
30 | #define LBEG 0 | ||
31 | #define LEND 1 | ||
32 | #define LCOUNT 2 | ||
33 | #define SAR 3 | ||
34 | #define BR 4 | ||
35 | #define SCOMPARE1 12 | ||
36 | #define ACCHI 16 | ||
37 | #define ACCLO 17 | ||
38 | #define MR 32 | ||
39 | #define WINDOWBASE 72 | ||
40 | #define WINDOWSTART 73 | ||
41 | #define PTEVADDR 83 | ||
42 | #define RASID 90 | ||
43 | #define ITLBCFG 91 | ||
44 | #define DTLBCFG 92 | ||
45 | #define IBREAKENABLE 96 | ||
46 | #define DDR 104 | ||
47 | #define IBREAKA 128 | ||
48 | #define DBREAKA 144 | ||
49 | #define DBREAKC 160 | ||
50 | #define EPC 176 | ||
51 | #define EPC_1 177 | ||
52 | #define DEPC 192 | ||
53 | #define EPS 192 | ||
54 | #define EPS_1 193 | ||
55 | #define EXCSAVE 208 | ||
56 | #define EXCSAVE_1 209 | ||
57 | #define INTERRUPT 226 | ||
58 | #define INTENABLE 228 | ||
59 | #define PS 230 | ||
60 | #define THREADPTR 231 | ||
61 | #define EXCCAUSE 232 | ||
62 | #define DEBUGCAUSE 233 | ||
63 | #define CCOUNT 234 | ||
64 | #define PRID 235 | ||
65 | #define ICOUNT 236 | ||
66 | #define ICOUNTLEVEL 237 | ||
67 | #define EXCVADDR 238 | ||
68 | #define CCOMPARE 240 | ||
69 | #define MISC 244 | ||
70 | |||
71 | /* Special names for read-only and write-only interrupt registers. */ | ||
72 | |||
73 | #define INTREAD 226 | ||
74 | #define INTSET 226 | ||
75 | #define INTCLEAR 227 | ||
76 | |||
77 | /* EXCCAUSE register fields */ | ||
78 | |||
79 | #define EXCCAUSE_EXCCAUSE_SHIFT 0 | ||
80 | #define EXCCAUSE_EXCCAUSE_MASK 0x3F | ||
81 | |||
82 | #define EXCCAUSE_ILLEGAL_INSTRUCTION 0 | ||
83 | #define EXCCAUSE_SYSTEM_CALL 1 | ||
84 | #define EXCCAUSE_INSTRUCTION_FETCH_ERROR 2 | ||
85 | #define EXCCAUSE_LOAD_STORE_ERROR 3 | ||
86 | #define EXCCAUSE_LEVEL1_INTERRUPT 4 | ||
87 | #define EXCCAUSE_ALLOCA 5 | ||
88 | #define EXCCAUSE_INTEGER_DIVIDE_BY_ZERO 6 | ||
89 | #define EXCCAUSE_SPECULATION 7 | ||
90 | #define EXCCAUSE_PRIVILEGED 8 | ||
91 | #define EXCCAUSE_UNALIGNED 9 | ||
92 | #define EXCCAUSE_ITLB_MISS 16 | ||
93 | #define EXCCAUSE_ITLB_MULTIHIT 17 | ||
94 | #define EXCCAUSE_ITLB_PRIVILEGE 18 | ||
95 | #define EXCCAUSE_ITLB_SIZE_RESTRICTION 19 | ||
96 | #define EXCCAUSE_FETCH_CACHE_ATTRIBUTE 20 | ||
97 | #define EXCCAUSE_DTLB_MISS 24 | ||
98 | #define EXCCAUSE_DTLB_MULTIHIT 25 | ||
99 | #define EXCCAUSE_DTLB_PRIVILEGE 26 | ||
100 | #define EXCCAUSE_DTLB_SIZE_RESTRICTION 27 | ||
101 | #define EXCCAUSE_LOAD_CACHE_ATTRIBUTE 28 | ||
102 | #define EXCCAUSE_STORE_CACHE_ATTRIBUTE 29 | ||
103 | #define EXCCAUSE_COPROCESSOR0_DISABLED 32 | ||
104 | #define EXCCAUSE_COPROCESSOR1_DISABLED 33 | ||
105 | #define EXCCAUSE_COPROCESSOR2_DISABLED 34 | ||
106 | #define EXCCAUSE_COPROCESSOR3_DISABLED 35 | ||
107 | #define EXCCAUSE_COPROCESSOR4_DISABLED 36 | ||
108 | #define EXCCAUSE_COPROCESSOR5_DISABLED 37 | ||
109 | #define EXCCAUSE_COPROCESSOR6_DISABLED 38 | ||
110 | #define EXCCAUSE_COPROCESSOR7_DISABLED 39 | ||
111 | |||
112 | /* PS register fields. */ | ||
113 | |||
114 | #define PS_WOE_BIT 18 | ||
115 | #define PS_CALLINC_SHIFT 16 | ||
116 | #define PS_CALLINC_MASK 0x00030000 | ||
117 | #define PS_OWB_SHIFT 8 | ||
118 | #define PS_OWB_MASK 0x00000F00 | ||
119 | #define PS_RING_SHIFT 6 | ||
120 | #define PS_RING_MASK 0x000000C0 | ||
121 | #define PS_UM_BIT 5 | ||
122 | #define PS_EXCM_BIT 4 | ||
123 | #define PS_INTLEVEL_SHIFT 0 | ||
124 | #define PS_INTLEVEL_MASK 0x0000000F | ||
125 | |||
126 | /* DBREAKCn register fields. */ | ||
127 | |||
128 | #define DBREAKC_MASK_BIT 0 | ||
129 | #define DBREAKC_MASK_MASK 0x0000003F | ||
130 | #define DBREAKC_LOAD_BIT 30 | ||
131 | #define DBREAKC_LOAD_MASK 0x40000000 | ||
132 | #define DBREAKC_STOR_BIT 31 | ||
133 | #define DBREAKC_STOR_MASK 0x80000000 | ||
134 | |||
135 | /* DEBUGCAUSE register fields. */ | ||
136 | |||
137 | #define DEBUGCAUSE_DEBUGINT_BIT 5 /* External debug interrupt */ | ||
138 | #define DEBUGCAUSE_BREAKN_BIT 4 /* BREAK.N instruction */ | ||
139 | #define DEBUGCAUSE_BREAK_BIT 3 /* BREAK instruction */ | ||
140 | #define DEBUGCAUSE_DBREAK_BIT 2 /* DBREAK match */ | ||
141 | #define DEBUGCAUSE_IBREAK_BIT 1 /* IBREAK match */ | ||
142 | #define DEBUGCAUSE_ICOUNT_BIT 0 /* ICOUNT would incr. to zero */ | ||
143 | |||
144 | #endif /* _XTENSA_SPECREG_H */ | ||
145 | |||
diff --git a/include/asm-xtensa/resource.h b/include/asm-xtensa/resource.h deleted file mode 100644 index 17b5ab311771..000000000000 --- a/include/asm-xtensa/resource.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/resource.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_RESOURCE_H | ||
12 | #define _XTENSA_RESOURCE_H | ||
13 | |||
14 | #include <asm-generic/resource.h> | ||
15 | |||
16 | #endif /* _XTENSA_RESOURCE_H */ | ||
diff --git a/include/asm-xtensa/rmap.h b/include/asm-xtensa/rmap.h deleted file mode 100644 index 649588b7e9ad..000000000000 --- a/include/asm-xtensa/rmap.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/rmap.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_RMAP_H | ||
12 | #define _XTENSA_RMAP_H | ||
13 | |||
14 | #include <asm-generic/rmap.h> | ||
15 | |||
16 | #endif | ||
diff --git a/include/asm-xtensa/rwsem.h b/include/asm-xtensa/rwsem.h deleted file mode 100644 index e39edf5c86f2..000000000000 --- a/include/asm-xtensa/rwsem.h +++ /dev/null | |||
@@ -1,168 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/rwsem.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Largely copied from include/asm-ppc/rwsem.h | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_RWSEM_H | ||
14 | #define _XTENSA_RWSEM_H | ||
15 | |||
16 | #ifndef _LINUX_RWSEM_H | ||
17 | #error "Please don't include <asm/rwsem.h> directly, use <linux/rwsem.h> instead." | ||
18 | #endif | ||
19 | |||
20 | #include <linux/list.h> | ||
21 | #include <linux/spinlock.h> | ||
22 | #include <asm/atomic.h> | ||
23 | #include <asm/system.h> | ||
24 | |||
25 | /* | ||
26 | * the semaphore definition | ||
27 | */ | ||
28 | struct rw_semaphore { | ||
29 | signed long count; | ||
30 | #define RWSEM_UNLOCKED_VALUE 0x00000000 | ||
31 | #define RWSEM_ACTIVE_BIAS 0x00000001 | ||
32 | #define RWSEM_ACTIVE_MASK 0x0000ffff | ||
33 | #define RWSEM_WAITING_BIAS (-0x00010000) | ||
34 | #define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS | ||
35 | #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) | ||
36 | spinlock_t wait_lock; | ||
37 | struct list_head wait_list; | ||
38 | }; | ||
39 | |||
40 | #define __RWSEM_INITIALIZER(name) \ | ||
41 | { RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ | ||
42 | LIST_HEAD_INIT((name).wait_list) } | ||
43 | |||
44 | #define DECLARE_RWSEM(name) \ | ||
45 | struct rw_semaphore name = __RWSEM_INITIALIZER(name) | ||
46 | |||
47 | extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem); | ||
48 | extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem); | ||
49 | extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem); | ||
50 | extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem); | ||
51 | |||
52 | static inline void init_rwsem(struct rw_semaphore *sem) | ||
53 | { | ||
54 | sem->count = RWSEM_UNLOCKED_VALUE; | ||
55 | spin_lock_init(&sem->wait_lock); | ||
56 | INIT_LIST_HEAD(&sem->wait_list); | ||
57 | } | ||
58 | |||
59 | /* | ||
60 | * lock for reading | ||
61 | */ | ||
62 | static inline void __down_read(struct rw_semaphore *sem) | ||
63 | { | ||
64 | if (atomic_add_return(1,(atomic_t *)(&sem->count)) > 0) | ||
65 | smp_wmb(); | ||
66 | else | ||
67 | rwsem_down_read_failed(sem); | ||
68 | } | ||
69 | |||
70 | static inline int __down_read_trylock(struct rw_semaphore *sem) | ||
71 | { | ||
72 | int tmp; | ||
73 | |||
74 | while ((tmp = sem->count) >= 0) { | ||
75 | if (tmp == cmpxchg(&sem->count, tmp, | ||
76 | tmp + RWSEM_ACTIVE_READ_BIAS)) { | ||
77 | smp_wmb(); | ||
78 | return 1; | ||
79 | } | ||
80 | } | ||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | /* | ||
85 | * lock for writing | ||
86 | */ | ||
87 | static inline void __down_write(struct rw_semaphore *sem) | ||
88 | { | ||
89 | int tmp; | ||
90 | |||
91 | tmp = atomic_add_return(RWSEM_ACTIVE_WRITE_BIAS, | ||
92 | (atomic_t *)(&sem->count)); | ||
93 | if (tmp == RWSEM_ACTIVE_WRITE_BIAS) | ||
94 | smp_wmb(); | ||
95 | else | ||
96 | rwsem_down_write_failed(sem); | ||
97 | } | ||
98 | |||
99 | static inline int __down_write_trylock(struct rw_semaphore *sem) | ||
100 | { | ||
101 | int tmp; | ||
102 | |||
103 | tmp = cmpxchg(&sem->count, RWSEM_UNLOCKED_VALUE, | ||
104 | RWSEM_ACTIVE_WRITE_BIAS); | ||
105 | smp_wmb(); | ||
106 | return tmp == RWSEM_UNLOCKED_VALUE; | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * unlock after reading | ||
111 | */ | ||
112 | static inline void __up_read(struct rw_semaphore *sem) | ||
113 | { | ||
114 | int tmp; | ||
115 | |||
116 | smp_wmb(); | ||
117 | tmp = atomic_sub_return(1,(atomic_t *)(&sem->count)); | ||
118 | if (tmp < -1 && (tmp & RWSEM_ACTIVE_MASK) == 0) | ||
119 | rwsem_wake(sem); | ||
120 | } | ||
121 | |||
122 | /* | ||
123 | * unlock after writing | ||
124 | */ | ||
125 | static inline void __up_write(struct rw_semaphore *sem) | ||
126 | { | ||
127 | smp_wmb(); | ||
128 | if (atomic_sub_return(RWSEM_ACTIVE_WRITE_BIAS, | ||
129 | (atomic_t *)(&sem->count)) < 0) | ||
130 | rwsem_wake(sem); | ||
131 | } | ||
132 | |||
133 | /* | ||
134 | * implement atomic add functionality | ||
135 | */ | ||
136 | static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem) | ||
137 | { | ||
138 | atomic_add(delta, (atomic_t *)(&sem->count)); | ||
139 | } | ||
140 | |||
141 | /* | ||
142 | * downgrade write lock to read lock | ||
143 | */ | ||
144 | static inline void __downgrade_write(struct rw_semaphore *sem) | ||
145 | { | ||
146 | int tmp; | ||
147 | |||
148 | smp_wmb(); | ||
149 | tmp = atomic_add_return(-RWSEM_WAITING_BIAS, (atomic_t *)(&sem->count)); | ||
150 | if (tmp < 0) | ||
151 | rwsem_downgrade_wake(sem); | ||
152 | } | ||
153 | |||
154 | /* | ||
155 | * implement exchange and add functionality | ||
156 | */ | ||
157 | static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem) | ||
158 | { | ||
159 | smp_mb(); | ||
160 | return atomic_add_return(delta, (atomic_t *)(&sem->count)); | ||
161 | } | ||
162 | |||
163 | static inline int rwsem_is_locked(struct rw_semaphore *sem) | ||
164 | { | ||
165 | return (sem->count != 0); | ||
166 | } | ||
167 | |||
168 | #endif /* _XTENSA_RWSEM_H */ | ||
diff --git a/include/asm-xtensa/scatterlist.h b/include/asm-xtensa/scatterlist.h deleted file mode 100644 index 810080bb0a2b..000000000000 --- a/include/asm-xtensa/scatterlist.h +++ /dev/null | |||
@@ -1,39 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/scatterlist.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SCATTERLIST_H | ||
12 | #define _XTENSA_SCATTERLIST_H | ||
13 | |||
14 | #include <asm/types.h> | ||
15 | |||
16 | struct scatterlist { | ||
17 | #ifdef CONFIG_DEBUG_SG | ||
18 | unsigned long sg_magic; | ||
19 | #endif | ||
20 | unsigned long page_link; | ||
21 | unsigned int offset; | ||
22 | dma_addr_t dma_address; | ||
23 | unsigned int length; | ||
24 | }; | ||
25 | |||
26 | /* | ||
27 | * These macros should be used after a pci_map_sg call has been done | ||
28 | * to get bus addresses of each of the SG entries and their lengths. | ||
29 | * You should only work with the number of sg entries pci_map_sg | ||
30 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
31 | * is 0. | ||
32 | */ | ||
33 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
34 | #define sg_dma_len(sg) ((sg)->length) | ||
35 | |||
36 | |||
37 | #define ISA_DMA_THRESHOLD (~0UL) | ||
38 | |||
39 | #endif /* _XTENSA_SCATTERLIST_H */ | ||
diff --git a/include/asm-xtensa/sections.h b/include/asm-xtensa/sections.h deleted file mode 100644 index 40b5191b55a2..000000000000 --- a/include/asm-xtensa/sections.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/sections.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SECTIONS_H | ||
12 | #define _XTENSA_SECTIONS_H | ||
13 | |||
14 | #include <asm-generic/sections.h> | ||
15 | |||
16 | #endif /* _XTENSA_SECTIONS_H */ | ||
diff --git a/include/asm-xtensa/segment.h b/include/asm-xtensa/segment.h deleted file mode 100644 index a2eb547a1a75..000000000000 --- a/include/asm-xtensa/segment.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/segment.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SEGMENT_H | ||
12 | #define _XTENSA_SEGMENT_H | ||
13 | |||
14 | #include <asm/uaccess.h> | ||
15 | |||
16 | #endif /* _XTENSA_SEGEMENT_H */ | ||
diff --git a/include/asm-xtensa/sembuf.h b/include/asm-xtensa/sembuf.h deleted file mode 100644 index c15870493b33..000000000000 --- a/include/asm-xtensa/sembuf.h +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/sembuf.h | ||
3 | * | ||
4 | * The semid64_ds structure for Xtensa architecture. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | * | ||
12 | * Note extra padding because this structure is passed back and forth | ||
13 | * between kernel and user space. | ||
14 | * | ||
15 | * Pad space is left for: | ||
16 | * - 64-bit time_t to solve y2038 problem | ||
17 | * - 2 miscellaneous 32-bit values | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #ifndef _XTENSA_SEMBUF_H | ||
22 | #define _XTENSA_SEMBUF_H | ||
23 | |||
24 | #include <asm/byteorder.h> | ||
25 | |||
26 | struct semid64_ds { | ||
27 | struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ | ||
28 | #ifdef __XTENSA_EL__ | ||
29 | __kernel_time_t sem_otime; /* last semop time */ | ||
30 | unsigned long __unused1; | ||
31 | __kernel_time_t sem_ctime; /* last change time */ | ||
32 | unsigned long __unused2; | ||
33 | #else | ||
34 | unsigned long __unused1; | ||
35 | __kernel_time_t sem_otime; /* last semop time */ | ||
36 | unsigned long __unused2; | ||
37 | __kernel_time_t sem_ctime; /* last change time */ | ||
38 | #endif | ||
39 | unsigned long sem_nsems; /* no. of semaphores in array */ | ||
40 | unsigned long __unused3; | ||
41 | unsigned long __unused4; | ||
42 | }; | ||
43 | |||
44 | #endif /* __ASM_XTENSA_SEMBUF_H */ | ||
diff --git a/include/asm-xtensa/serial.h b/include/asm-xtensa/serial.h deleted file mode 100644 index ec04114fcf0b..000000000000 --- a/include/asm-xtensa/serial.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/serial.h | ||
3 | * | ||
4 | * Configuration details for 8250, 16450, 16550, etc. serial ports | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_SERIAL_H | ||
14 | #define _XTENSA_SERIAL_H | ||
15 | |||
16 | #include <asm/platform/serial.h> | ||
17 | |||
18 | #endif /* _XTENSA_SERIAL_H */ | ||
diff --git a/include/asm-xtensa/setup.h b/include/asm-xtensa/setup.h deleted file mode 100644 index e3636520d8cc..000000000000 --- a/include/asm-xtensa/setup.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/setup.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SETUP_H | ||
12 | #define _XTENSA_SETUP_H | ||
13 | |||
14 | #define COMMAND_LINE_SIZE 256 | ||
15 | |||
16 | #endif | ||
diff --git a/include/asm-xtensa/shmbuf.h b/include/asm-xtensa/shmbuf.h deleted file mode 100644 index ad4b0121782c..000000000000 --- a/include/asm-xtensa/shmbuf.h +++ /dev/null | |||
@@ -1,71 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/shmbuf.h | ||
3 | * | ||
4 | * The shmid64_ds structure for Xtensa architecture. | ||
5 | * Note extra padding because this structure is passed back and forth | ||
6 | * between kernel and user space. | ||
7 | * | ||
8 | * Pad space is left for: | ||
9 | * - 64-bit time_t to solve y2038 problem | ||
10 | * - 2 miscellaneous 32-bit values | ||
11 | * | ||
12 | * This file is subject to the terms and conditions of the GNU General Public | ||
13 | * License. See the file "COPYING" in the main directory of this archive | ||
14 | * for more details. | ||
15 | * | ||
16 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
17 | */ | ||
18 | |||
19 | #ifndef _XTENSA_SHMBUF_H | ||
20 | #define _XTENSA_SHMBUF_H | ||
21 | |||
22 | #if defined (__XTENSA_EL__) | ||
23 | struct shmid64_ds { | ||
24 | struct ipc64_perm shm_perm; /* operation perms */ | ||
25 | size_t shm_segsz; /* size of segment (bytes) */ | ||
26 | __kernel_time_t shm_atime; /* last attach time */ | ||
27 | unsigned long __unused1; | ||
28 | __kernel_time_t shm_dtime; /* last detach time */ | ||
29 | unsigned long __unused2; | ||
30 | __kernel_time_t shm_ctime; /* last change time */ | ||
31 | unsigned long __unused3; | ||
32 | __kernel_pid_t shm_cpid; /* pid of creator */ | ||
33 | __kernel_pid_t shm_lpid; /* pid of last operator */ | ||
34 | unsigned long shm_nattch; /* no. of current attaches */ | ||
35 | unsigned long __unused4; | ||
36 | unsigned long __unused5; | ||
37 | }; | ||
38 | #elif defined (__XTENSA_EB__) | ||
39 | struct shmid64_ds { | ||
40 | struct ipc64_perm shm_perm; /* operation perms */ | ||
41 | size_t shm_segsz; /* size of segment (bytes) */ | ||
42 | __kernel_time_t shm_atime; /* last attach time */ | ||
43 | unsigned long __unused1; | ||
44 | __kernel_time_t shm_dtime; /* last detach time */ | ||
45 | unsigned long __unused2; | ||
46 | __kernel_time_t shm_ctime; /* last change time */ | ||
47 | unsigned long __unused3; | ||
48 | __kernel_pid_t shm_cpid; /* pid of creator */ | ||
49 | __kernel_pid_t shm_lpid; /* pid of last operator */ | ||
50 | unsigned long shm_nattch; /* no. of current attaches */ | ||
51 | unsigned long __unused4; | ||
52 | unsigned long __unused5; | ||
53 | }; | ||
54 | #else | ||
55 | # error endian order not defined | ||
56 | #endif | ||
57 | |||
58 | |||
59 | struct shminfo64 { | ||
60 | unsigned long shmmax; | ||
61 | unsigned long shmmin; | ||
62 | unsigned long shmmni; | ||
63 | unsigned long shmseg; | ||
64 | unsigned long shmall; | ||
65 | unsigned long __unused1; | ||
66 | unsigned long __unused2; | ||
67 | unsigned long __unused3; | ||
68 | unsigned long __unused4; | ||
69 | }; | ||
70 | |||
71 | #endif /* _XTENSA_SHMBUF_H */ | ||
diff --git a/include/asm-xtensa/shmparam.h b/include/asm-xtensa/shmparam.h deleted file mode 100644 index c8cc16c3da9e..000000000000 --- a/include/asm-xtensa/shmparam.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/shmparam.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General | ||
5 | * Public License. See the file "COPYING" in the main directory of | ||
6 | * this archive for more details. | ||
7 | */ | ||
8 | |||
9 | #ifndef _XTENSA_SHMPARAM_H | ||
10 | #define _XTENSA_SHMPARAM_H | ||
11 | |||
12 | /* | ||
13 | * Xtensa can have variable size caches, and if | ||
14 | * the size of single way is larger than the page size, | ||
15 | * then we have to start worrying about cache aliasing | ||
16 | * problems. | ||
17 | */ | ||
18 | |||
19 | #define SHMLBA ((PAGE_SIZE > DCACHE_WAY_SIZE)? PAGE_SIZE : DCACHE_WAY_SIZE) | ||
20 | |||
21 | #endif /* _XTENSA_SHMPARAM_H */ | ||
diff --git a/include/asm-xtensa/sigcontext.h b/include/asm-xtensa/sigcontext.h deleted file mode 100644 index 03383af8c3b7..000000000000 --- a/include/asm-xtensa/sigcontext.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/sigcontext.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SIGCONTEXT_H | ||
12 | #define _XTENSA_SIGCONTEXT_H | ||
13 | |||
14 | |||
15 | struct sigcontext { | ||
16 | unsigned long sc_pc; | ||
17 | unsigned long sc_ps; | ||
18 | unsigned long sc_lbeg; | ||
19 | unsigned long sc_lend; | ||
20 | unsigned long sc_lcount; | ||
21 | unsigned long sc_sar; | ||
22 | unsigned long sc_acclo; | ||
23 | unsigned long sc_acchi; | ||
24 | unsigned long sc_a[16]; | ||
25 | void *sc_xtregs; | ||
26 | }; | ||
27 | |||
28 | #endif /* _XTENSA_SIGCONTEXT_H */ | ||
diff --git a/include/asm-xtensa/siginfo.h b/include/asm-xtensa/siginfo.h deleted file mode 100644 index 6916248295df..000000000000 --- a/include/asm-xtensa/siginfo.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/siginfo.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SIGINFO_H | ||
12 | #define _XTENSA_SIGINFO_H | ||
13 | |||
14 | #include <asm-generic/siginfo.h> | ||
15 | |||
16 | #endif /* _XTENSA_SIGINFO_H */ | ||
diff --git a/include/asm-xtensa/signal.h b/include/asm-xtensa/signal.h deleted file mode 100644 index 633ba73bc4d2..000000000000 --- a/include/asm-xtensa/signal.h +++ /dev/null | |||
@@ -1,172 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/signal.h | ||
3 | * | ||
4 | * Swiped from SH. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_SIGNAL_H | ||
14 | #define _XTENSA_SIGNAL_H | ||
15 | |||
16 | |||
17 | #define _NSIG 64 | ||
18 | #define _NSIG_BPW 32 | ||
19 | #define _NSIG_WORDS (_NSIG / _NSIG_BPW) | ||
20 | |||
21 | #ifndef __ASSEMBLY__ | ||
22 | |||
23 | #include <linux/types.h> | ||
24 | |||
25 | /* Avoid too many header ordering problems. */ | ||
26 | struct siginfo; | ||
27 | typedef unsigned long old_sigset_t; /* at least 32 bits */ | ||
28 | typedef struct { | ||
29 | unsigned long sig[_NSIG_WORDS]; | ||
30 | } sigset_t; | ||
31 | |||
32 | #endif | ||
33 | |||
34 | #define SIGHUP 1 | ||
35 | #define SIGINT 2 | ||
36 | #define SIGQUIT 3 | ||
37 | #define SIGILL 4 | ||
38 | #define SIGTRAP 5 | ||
39 | #define SIGABRT 6 | ||
40 | #define SIGIOT 6 | ||
41 | #define SIGBUS 7 | ||
42 | #define SIGFPE 8 | ||
43 | #define SIGKILL 9 | ||
44 | #define SIGUSR1 10 | ||
45 | #define SIGSEGV 11 | ||
46 | #define SIGUSR2 12 | ||
47 | #define SIGPIPE 13 | ||
48 | #define SIGALRM 14 | ||
49 | #define SIGTERM 15 | ||
50 | #define SIGSTKFLT 16 | ||
51 | #define SIGCHLD 17 | ||
52 | #define SIGCONT 18 | ||
53 | #define SIGSTOP 19 | ||
54 | #define SIGTSTP 20 | ||
55 | #define SIGTTIN 21 | ||
56 | #define SIGTTOU 22 | ||
57 | #define SIGURG 23 | ||
58 | #define SIGXCPU 24 | ||
59 | #define SIGXFSZ 25 | ||
60 | #define SIGVTALRM 26 | ||
61 | #define SIGPROF 27 | ||
62 | #define SIGWINCH 28 | ||
63 | #define SIGIO 29 | ||
64 | #define SIGPOLL SIGIO | ||
65 | /* #define SIGLOST 29 */ | ||
66 | #define SIGPWR 30 | ||
67 | #define SIGSYS 31 | ||
68 | #define SIGUNUSED 31 | ||
69 | |||
70 | /* These should not be considered constants from userland. */ | ||
71 | #define SIGRTMIN 32 | ||
72 | #define SIGRTMAX (_NSIG-1) | ||
73 | |||
74 | /* | ||
75 | * SA_FLAGS values: | ||
76 | * | ||
77 | * SA_ONSTACK indicates that a registered stack_t will be used. | ||
78 | * SA_RESTART flag to get restarting signals (which were the default long ago) | ||
79 | * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. | ||
80 | * SA_RESETHAND clears the handler when the signal is delivered. | ||
81 | * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. | ||
82 | * SA_NODEFER prevents the current signal from being masked in the handler. | ||
83 | * | ||
84 | * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single | ||
85 | * Unix names RESETHAND and NODEFER respectively. | ||
86 | */ | ||
87 | #define SA_NOCLDSTOP 0x00000001 | ||
88 | #define SA_NOCLDWAIT 0x00000002 /* not supported yet */ | ||
89 | #define SA_SIGINFO 0x00000004 | ||
90 | #define SA_ONSTACK 0x08000000 | ||
91 | #define SA_RESTART 0x10000000 | ||
92 | #define SA_NODEFER 0x40000000 | ||
93 | #define SA_RESETHAND 0x80000000 | ||
94 | |||
95 | #define SA_NOMASK SA_NODEFER | ||
96 | #define SA_ONESHOT SA_RESETHAND | ||
97 | |||
98 | #define SA_RESTORER 0x04000000 | ||
99 | |||
100 | /* | ||
101 | * sigaltstack controls | ||
102 | */ | ||
103 | #define SS_ONSTACK 1 | ||
104 | #define SS_DISABLE 2 | ||
105 | |||
106 | #define MINSIGSTKSZ 2048 | ||
107 | #define SIGSTKSZ 8192 | ||
108 | |||
109 | #ifndef __ASSEMBLY__ | ||
110 | |||
111 | #define SIG_BLOCK 0 /* for blocking signals */ | ||
112 | #define SIG_UNBLOCK 1 /* for unblocking signals */ | ||
113 | #define SIG_SETMASK 2 /* for setting the signal mask */ | ||
114 | |||
115 | /* Type of a signal handler. */ | ||
116 | typedef void (*__sighandler_t)(int); | ||
117 | |||
118 | #define SIG_DFL ((__sighandler_t)0) /* default signal handling */ | ||
119 | #define SIG_IGN ((__sighandler_t)1) /* ignore signal */ | ||
120 | #define SIG_ERR ((__sighandler_t)-1) /* error return from signal */ | ||
121 | |||
122 | #ifdef __KERNEL__ | ||
123 | struct old_sigaction { | ||
124 | __sighandler_t sa_handler; | ||
125 | old_sigset_t sa_mask; | ||
126 | unsigned long sa_flags; | ||
127 | void (*sa_restorer)(void); | ||
128 | }; | ||
129 | |||
130 | struct sigaction { | ||
131 | __sighandler_t sa_handler; | ||
132 | unsigned long sa_flags; | ||
133 | void (*sa_restorer)(void); | ||
134 | sigset_t sa_mask; /* mask last for extensibility */ | ||
135 | }; | ||
136 | |||
137 | struct k_sigaction { | ||
138 | struct sigaction sa; | ||
139 | }; | ||
140 | |||
141 | #else | ||
142 | |||
143 | /* Here we must cater to libcs that poke about in kernel headers. */ | ||
144 | |||
145 | struct sigaction { | ||
146 | union { | ||
147 | __sighandler_t _sa_handler; | ||
148 | void (*_sa_sigaction)(int, struct siginfo *, void *); | ||
149 | } _u; | ||
150 | sigset_t sa_mask; | ||
151 | unsigned long sa_flags; | ||
152 | void (*sa_restorer)(void); | ||
153 | }; | ||
154 | |||
155 | #define sa_handler _u._sa_handler | ||
156 | #define sa_sigaction _u._sa_sigaction | ||
157 | |||
158 | #endif /* __KERNEL__ */ | ||
159 | |||
160 | typedef struct sigaltstack { | ||
161 | void *ss_sp; | ||
162 | int ss_flags; | ||
163 | size_t ss_size; | ||
164 | } stack_t; | ||
165 | |||
166 | #ifdef __KERNEL__ | ||
167 | #include <asm/sigcontext.h> | ||
168 | #define ptrace_signal_deliver(regs, cookie) do { } while (0) | ||
169 | |||
170 | #endif /* __KERNEL__ */ | ||
171 | #endif /* __ASSEMBLY__ */ | ||
172 | #endif /* _XTENSA_SIGNAL_H */ | ||
diff --git a/include/asm-xtensa/smp.h b/include/asm-xtensa/smp.h deleted file mode 100644 index 83c569e3bdbd..000000000000 --- a/include/asm-xtensa/smp.h +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/smp.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SMP_H | ||
12 | #define _XTENSA_SMP_H | ||
13 | |||
14 | extern struct xtensa_cpuinfo boot_cpu_data; | ||
15 | |||
16 | #define cpu_data (&boot_cpu_data) | ||
17 | #define current_cpu_data boot_cpu_data | ||
18 | |||
19 | struct xtensa_cpuinfo { | ||
20 | unsigned long *pgd_cache; | ||
21 | unsigned long *pte_cache; | ||
22 | unsigned long pgtable_cache_sz; | ||
23 | }; | ||
24 | |||
25 | #define cpu_logical_map(cpu) (cpu) | ||
26 | |||
27 | #endif /* _XTENSA_SMP_H */ | ||
diff --git a/include/asm-xtensa/socket.h b/include/asm-xtensa/socket.h deleted file mode 100644 index 6100682b1da2..000000000000 --- a/include/asm-xtensa/socket.h +++ /dev/null | |||
@@ -1,68 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/socket.h | ||
3 | * | ||
4 | * Copied from i386. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SOCKET_H | ||
12 | #define _XTENSA_SOCKET_H | ||
13 | |||
14 | #include <asm/sockios.h> | ||
15 | |||
16 | /* For setsockoptions(2) */ | ||
17 | #define SOL_SOCKET 1 | ||
18 | |||
19 | #define SO_DEBUG 1 | ||
20 | #define SO_REUSEADDR 2 | ||
21 | #define SO_TYPE 3 | ||
22 | #define SO_ERROR 4 | ||
23 | #define SO_DONTROUTE 5 | ||
24 | #define SO_BROADCAST 6 | ||
25 | #define SO_SNDBUF 7 | ||
26 | #define SO_RCVBUF 8 | ||
27 | #define SO_SNDBUFFORCE 32 | ||
28 | #define SO_RCVBUFFORCE 33 | ||
29 | #define SO_KEEPALIVE 9 | ||
30 | #define SO_OOBINLINE 10 | ||
31 | #define SO_NO_CHECK 11 | ||
32 | #define SO_PRIORITY 12 | ||
33 | #define SO_LINGER 13 | ||
34 | #define SO_BSDCOMPAT 14 | ||
35 | /* To add :#define SO_REUSEPORT 15 */ | ||
36 | #define SO_PASSCRED 16 | ||
37 | #define SO_PEERCRED 17 | ||
38 | #define SO_RCVLOWAT 18 | ||
39 | #define SO_SNDLOWAT 19 | ||
40 | #define SO_RCVTIMEO 20 | ||
41 | #define SO_SNDTIMEO 21 | ||
42 | |||
43 | /* Security levels - as per NRL IPv6 - don't actually do anything */ | ||
44 | |||
45 | #define SO_SECURITY_AUTHENTICATION 22 | ||
46 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 | ||
47 | #define SO_SECURITY_ENCRYPTION_NETWORK 24 | ||
48 | |||
49 | #define SO_BINDTODEVICE 25 | ||
50 | |||
51 | /* Socket filtering */ | ||
52 | |||
53 | #define SO_ATTACH_FILTER 26 | ||
54 | #define SO_DETACH_FILTER 27 | ||
55 | |||
56 | #define SO_PEERNAME 28 | ||
57 | #define SO_TIMESTAMP 29 | ||
58 | #define SCM_TIMESTAMP SO_TIMESTAMP | ||
59 | |||
60 | #define SO_ACCEPTCONN 30 | ||
61 | #define SO_PEERSEC 31 | ||
62 | #define SO_PASSSEC 34 | ||
63 | #define SO_TIMESTAMPNS 35 | ||
64 | #define SCM_TIMESTAMPNS SO_TIMESTAMPNS | ||
65 | |||
66 | #define SO_MARK 36 | ||
67 | |||
68 | #endif /* _XTENSA_SOCKET_H */ | ||
diff --git a/include/asm-xtensa/sockios.h b/include/asm-xtensa/sockios.h deleted file mode 100644 index efe0af379f01..000000000000 --- a/include/asm-xtensa/sockios.h +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/sockios.h | ||
3 | * | ||
4 | * Socket-level I/O control calls. Copied from MIPS. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 1995 by Ralf Baechle | ||
11 | * Copyright (C) 2001 Tensilica Inc. | ||
12 | */ | ||
13 | |||
14 | #ifndef _XTENSA_SOCKIOS_H | ||
15 | #define _XTENSA_SOCKIOS_H | ||
16 | |||
17 | #include <asm/ioctl.h> | ||
18 | |||
19 | /* Socket-level I/O control calls. */ | ||
20 | |||
21 | #define FIOGETOWN _IOR('f', 123, int) | ||
22 | #define FIOSETOWN _IOW('f', 124, int) | ||
23 | |||
24 | #define SIOCATMARK _IOR('s', 7, int) | ||
25 | #define SIOCSPGRP _IOW('s', 8, pid_t) | ||
26 | #define SIOCGPGRP _IOR('s', 9, pid_t) | ||
27 | |||
28 | #define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ | ||
29 | #define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ | ||
30 | |||
31 | #endif /* _XTENSA_SOCKIOS_H */ | ||
diff --git a/include/asm-xtensa/spinlock.h b/include/asm-xtensa/spinlock.h deleted file mode 100644 index 8ff23649581b..000000000000 --- a/include/asm-xtensa/spinlock.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/spinlock.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SPINLOCK_H | ||
12 | #define _XTENSA_SPINLOCK_H | ||
13 | |||
14 | #include <linux/spinlock.h> | ||
15 | |||
16 | #endif /* _XTENSA_SPINLOCK_H */ | ||
diff --git a/include/asm-xtensa/stat.h b/include/asm-xtensa/stat.h deleted file mode 100644 index c4992038cee0..000000000000 --- a/include/asm-xtensa/stat.h +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/stat.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_STAT_H | ||
12 | #define _XTENSA_STAT_H | ||
13 | |||
14 | #define STAT_HAVE_NSEC 1 | ||
15 | |||
16 | struct stat { | ||
17 | unsigned long st_dev; | ||
18 | unsigned long st_ino; | ||
19 | unsigned int st_mode; | ||
20 | unsigned int st_nlink; | ||
21 | unsigned int st_uid; | ||
22 | unsigned int st_gid; | ||
23 | unsigned long st_rdev; | ||
24 | long st_size; | ||
25 | unsigned long st_blksize; | ||
26 | unsigned long st_blocks; | ||
27 | unsigned long st_atime; | ||
28 | unsigned long st_atime_nsec; | ||
29 | unsigned long st_mtime; | ||
30 | unsigned long st_mtime_nsec; | ||
31 | unsigned long st_ctime; | ||
32 | unsigned long st_ctime_nsec; | ||
33 | unsigned long __unused4; | ||
34 | unsigned long __unused5; | ||
35 | }; | ||
36 | |||
37 | struct stat64 { | ||
38 | unsigned long long st_dev; /* Device */ | ||
39 | unsigned long long st_ino; /* File serial number */ | ||
40 | unsigned int st_mode; /* File mode. */ | ||
41 | unsigned int st_nlink; /* Link count. */ | ||
42 | unsigned int st_uid; /* User ID of the file's owner. */ | ||
43 | unsigned int st_gid; /* Group ID of the file's group. */ | ||
44 | unsigned long long st_rdev; /* Device number, if device. */ | ||
45 | long long st_size; /* Size of file, in bytes. */ | ||
46 | unsigned long st_blksize; /* Optimal block size for I/O. */ | ||
47 | unsigned long __unused2; | ||
48 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ | ||
49 | unsigned long st_atime; /* Time of last access. */ | ||
50 | unsigned long st_atime_nsec; | ||
51 | unsigned long st_mtime; /* Time of last modification. */ | ||
52 | unsigned long st_mtime_nsec; | ||
53 | unsigned long st_ctime; /* Time of last status change. */ | ||
54 | unsigned long st_ctime_nsec; | ||
55 | unsigned long __unused4; | ||
56 | unsigned long __unused5; | ||
57 | }; | ||
58 | |||
59 | #endif /* _XTENSA_STAT_H */ | ||
diff --git a/include/asm-xtensa/statfs.h b/include/asm-xtensa/statfs.h deleted file mode 100644 index 9c3d1a213136..000000000000 --- a/include/asm-xtensa/statfs.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/statfs.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_STATFS_H | ||
12 | #define _XTENSA_STATFS_H | ||
13 | |||
14 | #include <asm-generic/statfs.h> | ||
15 | |||
16 | #endif /* _XTENSA_STATFS_H */ | ||
17 | |||
diff --git a/include/asm-xtensa/string.h b/include/asm-xtensa/string.h deleted file mode 100644 index 5fb8c27cbef5..000000000000 --- a/include/asm-xtensa/string.h +++ /dev/null | |||
@@ -1,124 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/string.h | ||
3 | * | ||
4 | * These trivial string functions are considered part of the public domain. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | /* We should optimize these. See arch/xtensa/lib/strncpy_user.S */ | ||
14 | |||
15 | #ifndef _XTENSA_STRING_H | ||
16 | #define _XTENSA_STRING_H | ||
17 | |||
18 | #define __HAVE_ARCH_STRCPY | ||
19 | static inline char *strcpy(char *__dest, const char *__src) | ||
20 | { | ||
21 | register char *__xdest = __dest; | ||
22 | unsigned long __dummy; | ||
23 | |||
24 | __asm__ __volatile__("1:\n\t" | ||
25 | "l8ui %2, %1, 0\n\t" | ||
26 | "s8i %2, %0, 0\n\t" | ||
27 | "addi %1, %1, 1\n\t" | ||
28 | "addi %0, %0, 1\n\t" | ||
29 | "bnez %2, 1b\n\t" | ||
30 | : "=r" (__dest), "=r" (__src), "=&r" (__dummy) | ||
31 | : "0" (__dest), "1" (__src) | ||
32 | : "memory"); | ||
33 | |||
34 | return __xdest; | ||
35 | } | ||
36 | |||
37 | #define __HAVE_ARCH_STRNCPY | ||
38 | static inline char *strncpy(char *__dest, const char *__src, size_t __n) | ||
39 | { | ||
40 | register char *__xdest = __dest; | ||
41 | unsigned long __dummy; | ||
42 | |||
43 | if (__n == 0) | ||
44 | return __xdest; | ||
45 | |||
46 | __asm__ __volatile__( | ||
47 | "1:\n\t" | ||
48 | "l8ui %2, %1, 0\n\t" | ||
49 | "s8i %2, %0, 0\n\t" | ||
50 | "addi %1, %1, 1\n\t" | ||
51 | "addi %0, %0, 1\n\t" | ||
52 | "beqz %2, 2f\n\t" | ||
53 | "bne %1, %5, 1b\n" | ||
54 | "2:" | ||
55 | : "=r" (__dest), "=r" (__src), "=&r" (__dummy) | ||
56 | : "0" (__dest), "1" (__src), "r" (__src+__n) | ||
57 | : "memory"); | ||
58 | |||
59 | return __xdest; | ||
60 | } | ||
61 | |||
62 | #define __HAVE_ARCH_STRCMP | ||
63 | static inline int strcmp(const char *__cs, const char *__ct) | ||
64 | { | ||
65 | register int __res; | ||
66 | unsigned long __dummy; | ||
67 | |||
68 | __asm__ __volatile__( | ||
69 | "1:\n\t" | ||
70 | "l8ui %3, %1, 0\n\t" | ||
71 | "addi %1, %1, 1\n\t" | ||
72 | "l8ui %2, %0, 0\n\t" | ||
73 | "addi %0, %0, 1\n\t" | ||
74 | "beqz %2, 2f\n\t" | ||
75 | "beq %2, %3, 1b\n" | ||
76 | "2:\n\t" | ||
77 | "sub %2, %3, %2" | ||
78 | : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy) | ||
79 | : "0" (__cs), "1" (__ct)); | ||
80 | |||
81 | return __res; | ||
82 | } | ||
83 | |||
84 | #define __HAVE_ARCH_STRNCMP | ||
85 | static inline int strncmp(const char *__cs, const char *__ct, size_t __n) | ||
86 | { | ||
87 | register int __res; | ||
88 | unsigned long __dummy; | ||
89 | |||
90 | __asm__ __volatile__( | ||
91 | "mov %2, %3\n" | ||
92 | "1:\n\t" | ||
93 | "beq %0, %6, 2f\n\t" | ||
94 | "l8ui %3, %1, 0\n\t" | ||
95 | "addi %1, %1, 1\n\t" | ||
96 | "l8ui %2, %0, 0\n\t" | ||
97 | "addi %0, %0, 1\n\t" | ||
98 | "beqz %2, 2f\n\t" | ||
99 | "beqz %3, 2f\n\t" | ||
100 | "beq %2, %3, 1b\n" | ||
101 | "2:\n\t" | ||
102 | "sub %2, %3, %2" | ||
103 | : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy) | ||
104 | : "0" (__cs), "1" (__ct), "r" (__cs+__n)); | ||
105 | |||
106 | return __res; | ||
107 | } | ||
108 | |||
109 | #define __HAVE_ARCH_MEMSET | ||
110 | extern void *memset(void *__s, int __c, size_t __count); | ||
111 | |||
112 | #define __HAVE_ARCH_MEMCPY | ||
113 | extern void *memcpy(void *__to, __const__ void *__from, size_t __n); | ||
114 | |||
115 | #define __HAVE_ARCH_MEMMOVE | ||
116 | extern void *memmove(void *__dest, __const__ void *__src, size_t __n); | ||
117 | |||
118 | /* Don't build bcopy at all ... */ | ||
119 | #define __HAVE_ARCH_BCOPY | ||
120 | |||
121 | #define __HAVE_ARCH_MEMSCAN | ||
122 | #define memscan memchr | ||
123 | |||
124 | #endif /* _XTENSA_STRING_H */ | ||
diff --git a/include/asm-xtensa/syscall.h b/include/asm-xtensa/syscall.h deleted file mode 100644 index 05cebf8f62b1..000000000000 --- a/include/asm-xtensa/syscall.h +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/syscall.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | struct pt_regs; | ||
12 | struct sigaction; | ||
13 | asmlinkage long xtensa_execve(char*, char**, char**, struct pt_regs*); | ||
14 | asmlinkage long xtensa_clone(unsigned long, unsigned long, struct pt_regs*); | ||
15 | asmlinkage long xtensa_pipe(int __user *); | ||
16 | asmlinkage long xtensa_mmap2(unsigned long, unsigned long, unsigned long, | ||
17 | unsigned long, unsigned long, unsigned long); | ||
18 | asmlinkage long xtensa_ptrace(long, long, long, long); | ||
19 | asmlinkage long xtensa_sigreturn(struct pt_regs*); | ||
20 | asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); | ||
21 | asmlinkage long xtensa_sigsuspend(struct pt_regs*); | ||
22 | asmlinkage long xtensa_rt_sigsuspend(struct pt_regs*); | ||
23 | asmlinkage long xtensa_sigaction(int, const struct old_sigaction*, | ||
24 | struct old_sigaction*); | ||
25 | asmlinkage long xtensa_sigaltstack(struct pt_regs *regs); | ||
26 | asmlinkage long sys_rt_sigaction(int, | ||
27 | const struct sigaction __user *, | ||
28 | struct sigaction __user *, | ||
29 | size_t); | ||
30 | asmlinkage long xtensa_shmat(int, char __user *, int); | ||
31 | asmlinkage long xtensa_fadvise64_64(int, int, | ||
32 | unsigned long long, unsigned long long); | ||
33 | |||
34 | /* Should probably move to linux/syscalls.h */ | ||
35 | struct pollfd; | ||
36 | asmlinkage long sys_pselect6(int n, fd_set __user *inp, fd_set __user *outp, | ||
37 | fd_set __user *exp, struct timespec __user *tsp, void __user *sig); | ||
38 | asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds, | ||
39 | struct timespec __user *tsp, const sigset_t __user *sigmask, | ||
40 | size_t sigsetsize); | ||
41 | |||
42 | |||
diff --git a/include/asm-xtensa/system.h b/include/asm-xtensa/system.h deleted file mode 100644 index 62b1e8f3c13c..000000000000 --- a/include/asm-xtensa/system.h +++ /dev/null | |||
@@ -1,215 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/system.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_SYSTEM_H | ||
12 | #define _XTENSA_SYSTEM_H | ||
13 | |||
14 | #include <linux/stringify.h> | ||
15 | |||
16 | #include <asm/processor.h> | ||
17 | |||
18 | /* interrupt control */ | ||
19 | |||
20 | #define local_save_flags(x) \ | ||
21 | __asm__ __volatile__ ("rsr %0,"__stringify(PS) : "=a" (x)); | ||
22 | #define local_irq_restore(x) do { \ | ||
23 | __asm__ __volatile__ ("wsr %0, "__stringify(PS)" ; rsync" \ | ||
24 | :: "a" (x) : "memory"); } while(0); | ||
25 | #define local_irq_save(x) do { \ | ||
26 | __asm__ __volatile__ ("rsil %0, "__stringify(LOCKLEVEL) \ | ||
27 | : "=a" (x) :: "memory");} while(0); | ||
28 | |||
29 | static inline void local_irq_disable(void) | ||
30 | { | ||
31 | unsigned long flags; | ||
32 | __asm__ __volatile__ ("rsil %0, "__stringify(LOCKLEVEL) | ||
33 | : "=a" (flags) :: "memory"); | ||
34 | } | ||
35 | static inline void local_irq_enable(void) | ||
36 | { | ||
37 | unsigned long flags; | ||
38 | __asm__ __volatile__ ("rsil %0, 0" : "=a" (flags) :: "memory"); | ||
39 | |||
40 | } | ||
41 | |||
42 | static inline int irqs_disabled(void) | ||
43 | { | ||
44 | unsigned long flags; | ||
45 | local_save_flags(flags); | ||
46 | return flags & 0xf; | ||
47 | } | ||
48 | |||
49 | |||
50 | #define smp_read_barrier_depends() do { } while(0) | ||
51 | #define read_barrier_depends() do { } while(0) | ||
52 | |||
53 | #define mb() barrier() | ||
54 | #define rmb() mb() | ||
55 | #define wmb() mb() | ||
56 | |||
57 | #ifdef CONFIG_SMP | ||
58 | #error smp_* not defined | ||
59 | #else | ||
60 | #define smp_mb() barrier() | ||
61 | #define smp_rmb() barrier() | ||
62 | #define smp_wmb() barrier() | ||
63 | #endif | ||
64 | |||
65 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
66 | |||
67 | #if !defined (__ASSEMBLY__) | ||
68 | |||
69 | /* * switch_to(n) should switch tasks to task nr n, first | ||
70 | * checking that n isn't the current task, in which case it does nothing. | ||
71 | */ | ||
72 | extern void *_switch_to(void *last, void *next); | ||
73 | |||
74 | #endif /* __ASSEMBLY__ */ | ||
75 | |||
76 | #define switch_to(prev,next,last) \ | ||
77 | do { \ | ||
78 | (last) = _switch_to(prev, next); \ | ||
79 | } while(0) | ||
80 | |||
81 | /* | ||
82 | * cmpxchg | ||
83 | */ | ||
84 | |||
85 | static inline unsigned long | ||
86 | __cmpxchg_u32(volatile int *p, int old, int new) | ||
87 | { | ||
88 | __asm__ __volatile__("rsil a15, "__stringify(LOCKLEVEL)"\n\t" | ||
89 | "l32i %0, %1, 0 \n\t" | ||
90 | "bne %0, %2, 1f \n\t" | ||
91 | "s32i %3, %1, 0 \n\t" | ||
92 | "1: \n\t" | ||
93 | "wsr a15, "__stringify(PS)" \n\t" | ||
94 | "rsync \n\t" | ||
95 | : "=&a" (old) | ||
96 | : "a" (p), "a" (old), "r" (new) | ||
97 | : "a15", "memory"); | ||
98 | return old; | ||
99 | } | ||
100 | /* This function doesn't exist, so you'll get a linker error | ||
101 | * if something tries to do an invalid cmpxchg(). */ | ||
102 | |||
103 | extern void __cmpxchg_called_with_bad_pointer(void); | ||
104 | |||
105 | static __inline__ unsigned long | ||
106 | __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) | ||
107 | { | ||
108 | switch (size) { | ||
109 | case 4: return __cmpxchg_u32(ptr, old, new); | ||
110 | default: __cmpxchg_called_with_bad_pointer(); | ||
111 | return old; | ||
112 | } | ||
113 | } | ||
114 | |||
115 | #define cmpxchg(ptr,o,n) \ | ||
116 | ({ __typeof__(*(ptr)) _o_ = (o); \ | ||
117 | __typeof__(*(ptr)) _n_ = (n); \ | ||
118 | (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ | ||
119 | (unsigned long)_n_, sizeof (*(ptr))); \ | ||
120 | }) | ||
121 | |||
122 | #include <asm-generic/cmpxchg-local.h> | ||
123 | |||
124 | static inline unsigned long __cmpxchg_local(volatile void *ptr, | ||
125 | unsigned long old, | ||
126 | unsigned long new, int size) | ||
127 | { | ||
128 | switch (size) { | ||
129 | case 4: | ||
130 | return __cmpxchg_u32(ptr, old, new); | ||
131 | default: | ||
132 | return __cmpxchg_local_generic(ptr, old, new, size); | ||
133 | } | ||
134 | |||
135 | return old; | ||
136 | } | ||
137 | |||
138 | /* | ||
139 | * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make | ||
140 | * them available. | ||
141 | */ | ||
142 | #define cmpxchg_local(ptr, o, n) \ | ||
143 | ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ | ||
144 | (unsigned long)(n), sizeof(*(ptr)))) | ||
145 | #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) | ||
146 | |||
147 | /* | ||
148 | * xchg_u32 | ||
149 | * | ||
150 | * Note that a15 is used here because the register allocation | ||
151 | * done by the compiler is not guaranteed and a window overflow | ||
152 | * may not occur between the rsil and wsr instructions. By using | ||
153 | * a15 in the rsil, the machine is guaranteed to be in a state | ||
154 | * where no register reference will cause an overflow. | ||
155 | */ | ||
156 | |||
157 | static inline unsigned long xchg_u32(volatile int * m, unsigned long val) | ||
158 | { | ||
159 | unsigned long tmp; | ||
160 | __asm__ __volatile__("rsil a15, "__stringify(LOCKLEVEL)"\n\t" | ||
161 | "l32i %0, %1, 0 \n\t" | ||
162 | "s32i %2, %1, 0 \n\t" | ||
163 | "wsr a15, "__stringify(PS)" \n\t" | ||
164 | "rsync \n\t" | ||
165 | : "=&a" (tmp) | ||
166 | : "a" (m), "a" (val) | ||
167 | : "a15", "memory"); | ||
168 | return tmp; | ||
169 | } | ||
170 | |||
171 | #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) | ||
172 | |||
173 | /* | ||
174 | * This only works if the compiler isn't horribly bad at optimizing. | ||
175 | * gcc-2.5.8 reportedly can't handle this, but I define that one to | ||
176 | * be dead anyway. | ||
177 | */ | ||
178 | |||
179 | extern void __xchg_called_with_bad_pointer(void); | ||
180 | |||
181 | static __inline__ unsigned long | ||
182 | __xchg(unsigned long x, volatile void * ptr, int size) | ||
183 | { | ||
184 | switch (size) { | ||
185 | case 4: | ||
186 | return xchg_u32(ptr, x); | ||
187 | } | ||
188 | __xchg_called_with_bad_pointer(); | ||
189 | return x; | ||
190 | } | ||
191 | |||
192 | extern void set_except_vector(int n, void *addr); | ||
193 | |||
194 | static inline void spill_registers(void) | ||
195 | { | ||
196 | unsigned int a0, ps; | ||
197 | |||
198 | __asm__ __volatile__ ( | ||
199 | "movi a14," __stringify (PS_EXCM_BIT) " | 1\n\t" | ||
200 | "mov a12, a0\n\t" | ||
201 | "rsr a13," __stringify(SAR) "\n\t" | ||
202 | "xsr a14," __stringify(PS) "\n\t" | ||
203 | "movi a0, _spill_registers\n\t" | ||
204 | "rsync\n\t" | ||
205 | "callx0 a0\n\t" | ||
206 | "mov a0, a12\n\t" | ||
207 | "wsr a13," __stringify(SAR) "\n\t" | ||
208 | "wsr a14," __stringify(PS) "\n\t" | ||
209 | :: "a" (&a0), "a" (&ps) | ||
210 | : "a2", "a3", "a4", "a7", "a11", "a12", "a13", "a14", "a15", "memory"); | ||
211 | } | ||
212 | |||
213 | #define arch_align_stack(x) (x) | ||
214 | |||
215 | #endif /* _XTENSA_SYSTEM_H */ | ||
diff --git a/include/asm-xtensa/termbits.h b/include/asm-xtensa/termbits.h deleted file mode 100644 index 85aa6a3c0b6e..000000000000 --- a/include/asm-xtensa/termbits.h +++ /dev/null | |||
@@ -1,219 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/termbits.h | ||
3 | * | ||
4 | * Copied from SH. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_TERMBITS_H | ||
14 | #define _XTENSA_TERMBITS_H | ||
15 | |||
16 | |||
17 | #include <linux/posix_types.h> | ||
18 | |||
19 | typedef unsigned char cc_t; | ||
20 | typedef unsigned int speed_t; | ||
21 | typedef unsigned int tcflag_t; | ||
22 | |||
23 | #define NCCS 19 | ||
24 | struct termios { | ||
25 | tcflag_t c_iflag; /* input mode flags */ | ||
26 | tcflag_t c_oflag; /* output mode flags */ | ||
27 | tcflag_t c_cflag; /* control mode flags */ | ||
28 | tcflag_t c_lflag; /* local mode flags */ | ||
29 | cc_t c_line; /* line discipline */ | ||
30 | cc_t c_cc[NCCS]; /* control characters */ | ||
31 | }; | ||
32 | |||
33 | struct termios2 { | ||
34 | tcflag_t c_iflag; /* input mode flags */ | ||
35 | tcflag_t c_oflag; /* output mode flags */ | ||
36 | tcflag_t c_cflag; /* control mode flags */ | ||
37 | tcflag_t c_lflag; /* local mode flags */ | ||
38 | cc_t c_line; /* line discipline */ | ||
39 | cc_t c_cc[NCCS]; /* control characters */ | ||
40 | speed_t c_ispeed; /* input speed */ | ||
41 | speed_t c_ospeed; /* output speed */ | ||
42 | }; | ||
43 | |||
44 | struct ktermios { | ||
45 | tcflag_t c_iflag; /* input mode flags */ | ||
46 | tcflag_t c_oflag; /* output mode flags */ | ||
47 | tcflag_t c_cflag; /* control mode flags */ | ||
48 | tcflag_t c_lflag; /* local mode flags */ | ||
49 | cc_t c_line; /* line discipline */ | ||
50 | cc_t c_cc[NCCS]; /* control characters */ | ||
51 | speed_t c_ispeed; /* input speed */ | ||
52 | speed_t c_ospeed; /* output speed */ | ||
53 | }; | ||
54 | |||
55 | /* c_cc characters */ | ||
56 | |||
57 | #define VINTR 0 | ||
58 | #define VQUIT 1 | ||
59 | #define VERASE 2 | ||
60 | #define VKILL 3 | ||
61 | #define VEOF 4 | ||
62 | #define VTIME 5 | ||
63 | #define VMIN 6 | ||
64 | #define VSWTC 7 | ||
65 | #define VSTART 8 | ||
66 | #define VSTOP 9 | ||
67 | #define VSUSP 10 | ||
68 | #define VEOL 11 | ||
69 | #define VREPRINT 12 | ||
70 | #define VDISCARD 13 | ||
71 | #define VWERASE 14 | ||
72 | #define VLNEXT 15 | ||
73 | #define VEOL2 16 | ||
74 | |||
75 | /* c_iflag bits */ | ||
76 | |||
77 | #define IGNBRK 0000001 | ||
78 | #define BRKINT 0000002 | ||
79 | #define IGNPAR 0000004 | ||
80 | #define PARMRK 0000010 | ||
81 | #define INPCK 0000020 | ||
82 | #define ISTRIP 0000040 | ||
83 | #define INLCR 0000100 | ||
84 | #define IGNCR 0000200 | ||
85 | #define ICRNL 0000400 | ||
86 | #define IUCLC 0001000 | ||
87 | #define IXON 0002000 | ||
88 | #define IXANY 0004000 | ||
89 | #define IXOFF 0010000 | ||
90 | #define IMAXBEL 0020000 | ||
91 | #define IUTF8 0040000 | ||
92 | |||
93 | /* c_oflag bits */ | ||
94 | |||
95 | #define OPOST 0000001 | ||
96 | #define OLCUC 0000002 | ||
97 | #define ONLCR 0000004 | ||
98 | #define OCRNL 0000010 | ||
99 | #define ONOCR 0000020 | ||
100 | #define ONLRET 0000040 | ||
101 | #define OFILL 0000100 | ||
102 | #define OFDEL 0000200 | ||
103 | #define NLDLY 0000400 | ||
104 | #define NL0 0000000 | ||
105 | #define NL1 0000400 | ||
106 | #define CRDLY 0003000 | ||
107 | #define CR0 0000000 | ||
108 | #define CR1 0001000 | ||
109 | #define CR2 0002000 | ||
110 | #define CR3 0003000 | ||
111 | #define TABDLY 0014000 | ||
112 | #define TAB0 0000000 | ||
113 | #define TAB1 0004000 | ||
114 | #define TAB2 0010000 | ||
115 | #define TAB3 0014000 | ||
116 | #define XTABS 0014000 | ||
117 | #define BSDLY 0020000 | ||
118 | #define BS0 0000000 | ||
119 | #define BS1 0020000 | ||
120 | #define VTDLY 0040000 | ||
121 | #define VT0 0000000 | ||
122 | #define VT1 0040000 | ||
123 | #define FFDLY 0100000 | ||
124 | #define FF0 0000000 | ||
125 | #define FF1 0100000 | ||
126 | |||
127 | /* c_cflag bit meaning */ | ||
128 | |||
129 | #define CBAUD 0010017 | ||
130 | #define B0 0000000 /* hang up */ | ||
131 | #define B50 0000001 | ||
132 | #define B75 0000002 | ||
133 | #define B110 0000003 | ||
134 | #define B134 0000004 | ||
135 | #define B150 0000005 | ||
136 | #define B200 0000006 | ||
137 | #define B300 0000007 | ||
138 | #define B600 0000010 | ||
139 | #define B1200 0000011 | ||
140 | #define B1800 0000012 | ||
141 | #define B2400 0000013 | ||
142 | #define B4800 0000014 | ||
143 | #define B9600 0000015 | ||
144 | #define B19200 0000016 | ||
145 | #define B38400 0000017 | ||
146 | #define EXTA B19200 | ||
147 | #define EXTB B38400 | ||
148 | #define CSIZE 0000060 | ||
149 | #define CS5 0000000 | ||
150 | #define CS6 0000020 | ||
151 | #define CS7 0000040 | ||
152 | #define CS8 0000060 | ||
153 | #define CSTOPB 0000100 | ||
154 | #define CREAD 0000200 | ||
155 | #define PARENB 0000400 | ||
156 | #define PARODD 0001000 | ||
157 | #define HUPCL 0002000 | ||
158 | #define CLOCAL 0004000 | ||
159 | #define CBAUDEX 0010000 | ||
160 | #define BOTHER 0010000 | ||
161 | #define B57600 0010001 | ||
162 | #define B115200 0010002 | ||
163 | #define B230400 0010003 | ||
164 | #define B460800 0010004 | ||
165 | #define B500000 0010005 | ||
166 | #define B576000 0010006 | ||
167 | #define B921600 0010007 | ||
168 | #define B1000000 0010010 | ||
169 | #define B1152000 0010011 | ||
170 | #define B1500000 0010012 | ||
171 | #define B2000000 0010013 | ||
172 | #define B2500000 0010014 | ||
173 | #define B3000000 0010015 | ||
174 | #define B3500000 0010016 | ||
175 | #define B4000000 0010017 | ||
176 | #define CIBAUD 002003600000 /* input baud rate */ | ||
177 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | ||
178 | #define CRTSCTS 020000000000 /* flow control */ | ||
179 | |||
180 | #define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ | ||
181 | |||
182 | /* c_lflag bits */ | ||
183 | |||
184 | #define ISIG 0000001 | ||
185 | #define ICANON 0000002 | ||
186 | #define XCASE 0000004 | ||
187 | #define ECHO 0000010 | ||
188 | #define ECHOE 0000020 | ||
189 | #define ECHOK 0000040 | ||
190 | #define ECHONL 0000100 | ||
191 | #define NOFLSH 0000200 | ||
192 | #define TOSTOP 0000400 | ||
193 | #define ECHOCTL 0001000 | ||
194 | #define ECHOPRT 0002000 | ||
195 | #define ECHOKE 0004000 | ||
196 | #define FLUSHO 0010000 | ||
197 | #define PENDIN 0040000 | ||
198 | #define IEXTEN 0100000 | ||
199 | |||
200 | /* tcflow() and TCXONC use these */ | ||
201 | |||
202 | #define TCOOFF 0 | ||
203 | #define TCOON 1 | ||
204 | #define TCIOFF 2 | ||
205 | #define TCION 3 | ||
206 | |||
207 | /* tcflush() and TCFLSH use these */ | ||
208 | |||
209 | #define TCIFLUSH 0 | ||
210 | #define TCOFLUSH 1 | ||
211 | #define TCIOFLUSH 2 | ||
212 | |||
213 | /* tcsetattr uses these */ | ||
214 | |||
215 | #define TCSANOW 0 | ||
216 | #define TCSADRAIN 1 | ||
217 | #define TCSAFLUSH 2 | ||
218 | |||
219 | #endif /* _XTENSA_TERMBITS_H */ | ||
diff --git a/include/asm-xtensa/termios.h b/include/asm-xtensa/termios.h deleted file mode 100644 index 4673f42f88a7..000000000000 --- a/include/asm-xtensa/termios.h +++ /dev/null | |||
@@ -1,105 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/termios.h | ||
3 | * | ||
4 | * Copied from SH. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_TERMIOS_H | ||
14 | #define _XTENSA_TERMIOS_H | ||
15 | |||
16 | #include <asm/termbits.h> | ||
17 | #include <asm/ioctls.h> | ||
18 | |||
19 | struct winsize { | ||
20 | unsigned short ws_row; | ||
21 | unsigned short ws_col; | ||
22 | unsigned short ws_xpixel; | ||
23 | unsigned short ws_ypixel; | ||
24 | }; | ||
25 | |||
26 | #define NCC 8 | ||
27 | struct termio { | ||
28 | unsigned short c_iflag; /* input mode flags */ | ||
29 | unsigned short c_oflag; /* output mode flags */ | ||
30 | unsigned short c_cflag; /* control mode flags */ | ||
31 | unsigned short c_lflag; /* local mode flags */ | ||
32 | unsigned char c_line; /* line discipline */ | ||
33 | unsigned char c_cc[NCC]; /* control characters */ | ||
34 | }; | ||
35 | |||
36 | /* Modem lines */ | ||
37 | |||
38 | #define TIOCM_LE 0x001 | ||
39 | #define TIOCM_DTR 0x002 | ||
40 | #define TIOCM_RTS 0x004 | ||
41 | #define TIOCM_ST 0x008 | ||
42 | #define TIOCM_SR 0x010 | ||
43 | #define TIOCM_CTS 0x020 | ||
44 | #define TIOCM_CAR 0x040 | ||
45 | #define TIOCM_RNG 0x080 | ||
46 | #define TIOCM_DSR 0x100 | ||
47 | #define TIOCM_CD TIOCM_CAR | ||
48 | #define TIOCM_RI TIOCM_RNG | ||
49 | #define TIOCM_OUT1 0x2000 | ||
50 | #define TIOCM_OUT2 0x4000 | ||
51 | #define TIOCM_LOOP 0x8000 | ||
52 | |||
53 | /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ | ||
54 | |||
55 | #ifdef __KERNEL__ | ||
56 | |||
57 | /* intr=^C quit=^\ erase=del kill=^U | ||
58 | eof=^D vtime=\0 vmin=\1 sxtc=\0 | ||
59 | start=^Q stop=^S susp=^Z eol=\0 | ||
60 | reprint=^R discard=^U werase=^W lnext=^V | ||
61 | eol2=\0 | ||
62 | */ | ||
63 | #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" | ||
64 | |||
65 | /* | ||
66 | * Translate a "termio" structure into a "termios". Ugh. | ||
67 | */ | ||
68 | |||
69 | #define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ | ||
70 | unsigned short __tmp; \ | ||
71 | get_user(__tmp,&(termio)->x); \ | ||
72 | *(unsigned short *) &(termios)->x = __tmp; \ | ||
73 | } | ||
74 | |||
75 | #define user_termio_to_kernel_termios(termios, termio) \ | ||
76 | ({ \ | ||
77 | SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ | ||
78 | SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ | ||
79 | SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ | ||
80 | SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ | ||
81 | copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ | ||
82 | }) | ||
83 | |||
84 | /* | ||
85 | * Translate a "termios" structure into a "termio". Ugh. | ||
86 | */ | ||
87 | |||
88 | #define kernel_termios_to_user_termio(termio, termios) \ | ||
89 | ({ \ | ||
90 | put_user((termios)->c_iflag, &(termio)->c_iflag); \ | ||
91 | put_user((termios)->c_oflag, &(termio)->c_oflag); \ | ||
92 | put_user((termios)->c_cflag, &(termio)->c_cflag); \ | ||
93 | put_user((termios)->c_lflag, &(termio)->c_lflag); \ | ||
94 | put_user((termios)->c_line, &(termio)->c_line); \ | ||
95 | copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ | ||
96 | }) | ||
97 | |||
98 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2)) | ||
99 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2)) | ||
100 | #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) | ||
101 | #define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) | ||
102 | |||
103 | #endif /* __KERNEL__ */ | ||
104 | |||
105 | #endif /* _XTENSA_TERMIOS_H */ | ||
diff --git a/include/asm-xtensa/thread_info.h b/include/asm-xtensa/thread_info.h deleted file mode 100644 index 0f4fe1faf9ba..000000000000 --- a/include/asm-xtensa/thread_info.h +++ /dev/null | |||
@@ -1,164 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/thread_info.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_THREAD_INFO_H | ||
12 | #define _XTENSA_THREAD_INFO_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | #ifndef __ASSEMBLY__ | ||
17 | # include <asm/processor.h> | ||
18 | #endif | ||
19 | |||
20 | /* | ||
21 | * low level task data that entry.S needs immediate access to | ||
22 | * - this struct should fit entirely inside of one cache line | ||
23 | * - this struct shares the supervisor stack pages | ||
24 | * - if the contents of this structure are changed, the assembly constants | ||
25 | * must also be changed | ||
26 | */ | ||
27 | |||
28 | #ifndef __ASSEMBLY__ | ||
29 | |||
30 | #if XTENSA_HAVE_COPROCESSORS | ||
31 | |||
32 | typedef struct xtregs_coprocessor { | ||
33 | xtregs_cp0_t cp0; | ||
34 | xtregs_cp1_t cp1; | ||
35 | xtregs_cp2_t cp2; | ||
36 | xtregs_cp3_t cp3; | ||
37 | xtregs_cp4_t cp4; | ||
38 | xtregs_cp5_t cp5; | ||
39 | xtregs_cp6_t cp6; | ||
40 | xtregs_cp7_t cp7; | ||
41 | } xtregs_coprocessor_t; | ||
42 | |||
43 | #endif | ||
44 | |||
45 | struct thread_info { | ||
46 | struct task_struct *task; /* main task structure */ | ||
47 | struct exec_domain *exec_domain; /* execution domain */ | ||
48 | unsigned long flags; /* low level flags */ | ||
49 | unsigned long status; /* thread-synchronous flags */ | ||
50 | __u32 cpu; /* current CPU */ | ||
51 | __s32 preempt_count; /* 0 => preemptable,< 0 => BUG*/ | ||
52 | |||
53 | mm_segment_t addr_limit; /* thread address space */ | ||
54 | struct restart_block restart_block; | ||
55 | |||
56 | unsigned long cpenable; | ||
57 | |||
58 | /* Allocate storage for extra user states and coprocessor states. */ | ||
59 | #if XTENSA_HAVE_COPROCESSORS | ||
60 | xtregs_coprocessor_t xtregs_cp; | ||
61 | #endif | ||
62 | xtregs_user_t xtregs_user; | ||
63 | }; | ||
64 | |||
65 | #else /* !__ASSEMBLY__ */ | ||
66 | |||
67 | /* offsets into the thread_info struct for assembly code access */ | ||
68 | #define TI_TASK 0x00000000 | ||
69 | #define TI_EXEC_DOMAIN 0x00000004 | ||
70 | #define TI_FLAGS 0x00000008 | ||
71 | #define TI_STATUS 0x0000000C | ||
72 | #define TI_CPU 0x00000010 | ||
73 | #define TI_PRE_COUNT 0x00000014 | ||
74 | #define TI_ADDR_LIMIT 0x00000018 | ||
75 | #define TI_RESTART_BLOCK 0x000001C | ||
76 | |||
77 | #endif | ||
78 | |||
79 | #define PREEMPT_ACTIVE 0x10000000 | ||
80 | |||
81 | /* | ||
82 | * macros/functions for gaining access to the thread information structure | ||
83 | * | ||
84 | * preempt_count needs to be 1 initially, until the scheduler is functional. | ||
85 | */ | ||
86 | |||
87 | #ifndef __ASSEMBLY__ | ||
88 | |||
89 | #define INIT_THREAD_INFO(tsk) \ | ||
90 | { \ | ||
91 | .task = &tsk, \ | ||
92 | .exec_domain = &default_exec_domain, \ | ||
93 | .flags = 0, \ | ||
94 | .cpu = 0, \ | ||
95 | .preempt_count = 1, \ | ||
96 | .addr_limit = KERNEL_DS, \ | ||
97 | .restart_block = { \ | ||
98 | .fn = do_no_restart_syscall, \ | ||
99 | }, \ | ||
100 | } | ||
101 | |||
102 | #define init_thread_info (init_thread_union.thread_info) | ||
103 | #define init_stack (init_thread_union.stack) | ||
104 | |||
105 | /* how to get the thread information struct from C */ | ||
106 | static inline struct thread_info *current_thread_info(void) | ||
107 | { | ||
108 | struct thread_info *ti; | ||
109 | __asm__("extui %0,a1,0,13\n\t" | ||
110 | "xor %0, a1, %0" : "=&r" (ti) : ); | ||
111 | return ti; | ||
112 | } | ||
113 | |||
114 | #else /* !__ASSEMBLY__ */ | ||
115 | |||
116 | /* how to get the thread information struct from ASM */ | ||
117 | #define GET_THREAD_INFO(reg,sp) \ | ||
118 | extui reg, sp, 0, 13; \ | ||
119 | xor reg, sp, reg | ||
120 | #endif | ||
121 | |||
122 | |||
123 | /* | ||
124 | * thread information flags | ||
125 | * - these are process state flags that various assembly files may need to access | ||
126 | * - pending work-to-be-done flags are in LSW | ||
127 | * - other flags in MSW | ||
128 | */ | ||
129 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | ||
130 | #define TIF_SIGPENDING 1 /* signal pending */ | ||
131 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | ||
132 | #define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ | ||
133 | #define TIF_IRET 4 /* return with iret */ | ||
134 | #define TIF_MEMDIE 5 | ||
135 | #define TIF_RESTORE_SIGMASK 6 /* restore signal mask in do_signal() */ | ||
136 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | ||
137 | #define TIF_FREEZE 17 /* is freezing for suspend */ | ||
138 | |||
139 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | ||
140 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) | ||
141 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | ||
142 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) | ||
143 | #define _TIF_IRET (1<<TIF_IRET) | ||
144 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | ||
145 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | ||
146 | #define _TIF_FREEZE (1<<TIF_FREEZE) | ||
147 | |||
148 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ | ||
149 | #define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ | ||
150 | |||
151 | /* | ||
152 | * Thread-synchronous status. | ||
153 | * | ||
154 | * This is different from the flags in that nobody else | ||
155 | * ever touches our thread-synchronous status, so we don't | ||
156 | * have to worry about atomic accesses. | ||
157 | */ | ||
158 | #define TS_USEDFPU 0x0001 /* FPU was used by this task this quantum (SMP) */ | ||
159 | |||
160 | #define THREAD_SIZE 8192 //(2*PAGE_SIZE) | ||
161 | #define THREAD_SIZE_ORDER 1 | ||
162 | |||
163 | #endif /* __KERNEL__ */ | ||
164 | #endif /* _XTENSA_THREAD_INFO */ | ||
diff --git a/include/asm-xtensa/timex.h b/include/asm-xtensa/timex.h deleted file mode 100644 index b83a8181d448..000000000000 --- a/include/asm-xtensa/timex.h +++ /dev/null | |||
@@ -1,96 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/timex.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_TIMEX_H | ||
12 | #define _XTENSA_TIMEX_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | #include <asm/processor.h> | ||
17 | #include <linux/stringify.h> | ||
18 | |||
19 | #define _INTLEVEL(x) XCHAL_INT ## x ## _LEVEL | ||
20 | #define INTLEVEL(x) _INTLEVEL(x) | ||
21 | |||
22 | #if INTLEVEL(XCHAL_TIMER0_INTERRUPT) == 1 | ||
23 | # define LINUX_TIMER 0 | ||
24 | # define LINUX_TIMER_INT XCHAL_TIMER0_INTERRUPT | ||
25 | #elif INTLEVEL(XCHAL_TIMER1_INTERRUPT) == 1 | ||
26 | # define LINUX_TIMER 1 | ||
27 | # define LINUX_TIMER_INT XCHAL_TIMER1_INTERRUPT | ||
28 | #elif INTLEVEL(XCHAL_TIMER2_INTERRUPT) == 1 | ||
29 | # define LINUX_TIMER 2 | ||
30 | # define LINUX_TIMER_INT XCHAL_TIMER2_INTERRUPT | ||
31 | #else | ||
32 | # error "Bad timer number for Linux configurations!" | ||
33 | #endif | ||
34 | |||
35 | #define LINUX_TIMER_MASK (1L << LINUX_TIMER_INT) | ||
36 | |||
37 | #define CLOCK_TICK_RATE 1193180 /* (everyone is using this value) */ | ||
38 | #define CLOCK_TICK_FACTOR 20 /* Factor of both 10^6 and CLOCK_TICK_RATE */ | ||
39 | |||
40 | #ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT | ||
41 | extern unsigned long ccount_per_jiffy; | ||
42 | extern unsigned long ccount_nsec; | ||
43 | #define CCOUNT_PER_JIFFY ccount_per_jiffy | ||
44 | #define NSEC_PER_CCOUNT ccount_nsec | ||
45 | #else | ||
46 | #define CCOUNT_PER_JIFFY (CONFIG_XTENSA_CPU_CLOCK*(1000000UL/HZ)) | ||
47 | #define NSEC_PER_CCOUNT (1000UL / CONFIG_XTENSA_CPU_CLOCK) | ||
48 | #endif | ||
49 | |||
50 | |||
51 | typedef unsigned long long cycles_t; | ||
52 | |||
53 | /* | ||
54 | * Only used for SMP. | ||
55 | */ | ||
56 | |||
57 | extern cycles_t cacheflush_time; | ||
58 | |||
59 | #define get_cycles() (0) | ||
60 | |||
61 | |||
62 | /* | ||
63 | * Register access. | ||
64 | */ | ||
65 | |||
66 | #define WSR_CCOUNT(r) asm volatile ("wsr %0,"__stringify(CCOUNT) :: "a" (r)) | ||
67 | #define RSR_CCOUNT(r) asm volatile ("rsr %0,"__stringify(CCOUNT) : "=a" (r)) | ||
68 | #define WSR_CCOMPARE(x,r) asm volatile ("wsr %0,"__stringify(CCOMPARE)"+"__stringify(x) :: "a"(r)) | ||
69 | #define RSR_CCOMPARE(x,r) asm volatile ("rsr %0,"__stringify(CCOMPARE)"+"__stringify(x) : "=a"(r)) | ||
70 | |||
71 | static inline unsigned long get_ccount (void) | ||
72 | { | ||
73 | unsigned long ccount; | ||
74 | RSR_CCOUNT(ccount); | ||
75 | return ccount; | ||
76 | } | ||
77 | |||
78 | static inline void set_ccount (unsigned long ccount) | ||
79 | { | ||
80 | WSR_CCOUNT(ccount); | ||
81 | } | ||
82 | |||
83 | static inline unsigned long get_linux_timer (void) | ||
84 | { | ||
85 | unsigned ccompare; | ||
86 | RSR_CCOMPARE(LINUX_TIMER, ccompare); | ||
87 | return ccompare; | ||
88 | } | ||
89 | |||
90 | static inline void set_linux_timer (unsigned long ccompare) | ||
91 | { | ||
92 | WSR_CCOMPARE(LINUX_TIMER, ccompare); | ||
93 | } | ||
94 | |||
95 | #endif /* __KERNEL__ */ | ||
96 | #endif /* _XTENSA_TIMEX_H */ | ||
diff --git a/include/asm-xtensa/tlb.h b/include/asm-xtensa/tlb.h deleted file mode 100644 index 31c220faca02..000000000000 --- a/include/asm-xtensa/tlb.h +++ /dev/null | |||
@@ -1,47 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/tlb.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_TLB_H | ||
12 | #define _XTENSA_TLB_H | ||
13 | |||
14 | #include <asm/cache.h> | ||
15 | #include <asm/page.h> | ||
16 | |||
17 | #if (DCACHE_WAY_SIZE <= PAGE_SIZE) | ||
18 | |||
19 | /* Note, read http://lkml.org/lkml/2004/1/15/6 */ | ||
20 | |||
21 | # define tlb_start_vma(tlb,vma) do { } while (0) | ||
22 | # define tlb_end_vma(tlb,vma) do { } while (0) | ||
23 | |||
24 | #else | ||
25 | |||
26 | # define tlb_start_vma(tlb, vma) \ | ||
27 | do { \ | ||
28 | if (!tlb->fullmm) \ | ||
29 | flush_cache_range(vma, vma->vm_start, vma->vm_end); \ | ||
30 | } while(0) | ||
31 | |||
32 | # define tlb_end_vma(tlb, vma) \ | ||
33 | do { \ | ||
34 | if (!tlb->fullmm) \ | ||
35 | flush_tlb_range(vma, vma->vm_start, vma->vm_end); \ | ||
36 | } while(0) | ||
37 | |||
38 | #endif | ||
39 | |||
40 | #define __tlb_remove_tlb_entry(tlb,pte,addr) do { } while (0) | ||
41 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) | ||
42 | |||
43 | #include <asm-generic/tlb.h> | ||
44 | |||
45 | #define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, pte) | ||
46 | |||
47 | #endif /* _XTENSA_TLB_H */ | ||
diff --git a/include/asm-xtensa/tlbflush.h b/include/asm-xtensa/tlbflush.h deleted file mode 100644 index 46d240074f74..000000000000 --- a/include/asm-xtensa/tlbflush.h +++ /dev/null | |||
@@ -1,191 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/tlbflush.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_TLBFLUSH_H | ||
12 | #define _XTENSA_TLBFLUSH_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | #include <linux/stringify.h> | ||
17 | #include <asm/processor.h> | ||
18 | |||
19 | #define DTLB_WAY_PGD 7 | ||
20 | |||
21 | #define ITLB_ARF_WAYS 4 | ||
22 | #define DTLB_ARF_WAYS 4 | ||
23 | |||
24 | #define ITLB_HIT_BIT 3 | ||
25 | #define DTLB_HIT_BIT 4 | ||
26 | |||
27 | #ifndef __ASSEMBLY__ | ||
28 | |||
29 | /* TLB flushing: | ||
30 | * | ||
31 | * - flush_tlb_all() flushes all processes TLB entries | ||
32 | * - flush_tlb_mm(mm) flushes the specified mm context TLB entries | ||
33 | * - flush_tlb_page(mm, vmaddr) flushes a single page | ||
34 | * - flush_tlb_range(mm, start, end) flushes a range of pages | ||
35 | */ | ||
36 | |||
37 | extern void flush_tlb_all(void); | ||
38 | extern void flush_tlb_mm(struct mm_struct*); | ||
39 | extern void flush_tlb_page(struct vm_area_struct*,unsigned long); | ||
40 | extern void flush_tlb_range(struct vm_area_struct*,unsigned long,unsigned long); | ||
41 | |||
42 | #define flush_tlb_kernel_range(start,end) flush_tlb_all() | ||
43 | |||
44 | /* TLB operations. */ | ||
45 | |||
46 | static inline unsigned long itlb_probe(unsigned long addr) | ||
47 | { | ||
48 | unsigned long tmp; | ||
49 | __asm__ __volatile__("pitlb %0, %1\n\t" : "=a" (tmp) : "a" (addr)); | ||
50 | return tmp; | ||
51 | } | ||
52 | |||
53 | static inline unsigned long dtlb_probe(unsigned long addr) | ||
54 | { | ||
55 | unsigned long tmp; | ||
56 | __asm__ __volatile__("pdtlb %0, %1\n\t" : "=a" (tmp) : "a" (addr)); | ||
57 | return tmp; | ||
58 | } | ||
59 | |||
60 | static inline void invalidate_itlb_entry (unsigned long probe) | ||
61 | { | ||
62 | __asm__ __volatile__("iitlb %0; isync\n\t" : : "a" (probe)); | ||
63 | } | ||
64 | |||
65 | static inline void invalidate_dtlb_entry (unsigned long probe) | ||
66 | { | ||
67 | __asm__ __volatile__("idtlb %0; dsync\n\t" : : "a" (probe)); | ||
68 | } | ||
69 | |||
70 | /* Use the .._no_isync functions with caution. Generally, these are | ||
71 | * handy for bulk invalidates followed by a single 'isync'. The | ||
72 | * caller must follow up with an 'isync', which can be relatively | ||
73 | * expensive on some Xtensa implementations. | ||
74 | */ | ||
75 | static inline void invalidate_itlb_entry_no_isync (unsigned entry) | ||
76 | { | ||
77 | /* Caller must follow up with 'isync'. */ | ||
78 | __asm__ __volatile__ ("iitlb %0\n" : : "a" (entry) ); | ||
79 | } | ||
80 | |||
81 | static inline void invalidate_dtlb_entry_no_isync (unsigned entry) | ||
82 | { | ||
83 | /* Caller must follow up with 'isync'. */ | ||
84 | __asm__ __volatile__ ("idtlb %0\n" : : "a" (entry) ); | ||
85 | } | ||
86 | |||
87 | static inline void set_itlbcfg_register (unsigned long val) | ||
88 | { | ||
89 | __asm__ __volatile__("wsr %0, "__stringify(ITLBCFG)"\n\t" "isync\n\t" | ||
90 | : : "a" (val)); | ||
91 | } | ||
92 | |||
93 | static inline void set_dtlbcfg_register (unsigned long val) | ||
94 | { | ||
95 | __asm__ __volatile__("wsr %0, "__stringify(DTLBCFG)"; dsync\n\t" | ||
96 | : : "a" (val)); | ||
97 | } | ||
98 | |||
99 | static inline void set_ptevaddr_register (unsigned long val) | ||
100 | { | ||
101 | __asm__ __volatile__(" wsr %0, "__stringify(PTEVADDR)"; isync\n" | ||
102 | : : "a" (val)); | ||
103 | } | ||
104 | |||
105 | static inline unsigned long read_ptevaddr_register (void) | ||
106 | { | ||
107 | unsigned long tmp; | ||
108 | __asm__ __volatile__("rsr %0, "__stringify(PTEVADDR)"\n\t" : "=a" (tmp)); | ||
109 | return tmp; | ||
110 | } | ||
111 | |||
112 | static inline void write_dtlb_entry (pte_t entry, int way) | ||
113 | { | ||
114 | __asm__ __volatile__("wdtlb %1, %0; dsync\n\t" | ||
115 | : : "r" (way), "r" (entry) ); | ||
116 | } | ||
117 | |||
118 | static inline void write_itlb_entry (pte_t entry, int way) | ||
119 | { | ||
120 | __asm__ __volatile__("witlb %1, %0; isync\n\t" | ||
121 | : : "r" (way), "r" (entry) ); | ||
122 | } | ||
123 | |||
124 | static inline void invalidate_page_directory (void) | ||
125 | { | ||
126 | invalidate_dtlb_entry (DTLB_WAY_PGD); | ||
127 | invalidate_dtlb_entry (DTLB_WAY_PGD+1); | ||
128 | invalidate_dtlb_entry (DTLB_WAY_PGD+2); | ||
129 | } | ||
130 | |||
131 | static inline void invalidate_itlb_mapping (unsigned address) | ||
132 | { | ||
133 | unsigned long tlb_entry; | ||
134 | if (((tlb_entry = itlb_probe(address)) & (1 << ITLB_HIT_BIT)) != 0) | ||
135 | invalidate_itlb_entry(tlb_entry); | ||
136 | } | ||
137 | |||
138 | static inline void invalidate_dtlb_mapping (unsigned address) | ||
139 | { | ||
140 | unsigned long tlb_entry; | ||
141 | if (((tlb_entry = dtlb_probe(address)) & (1 << DTLB_HIT_BIT)) != 0) | ||
142 | invalidate_dtlb_entry(tlb_entry); | ||
143 | } | ||
144 | |||
145 | #define check_pgt_cache() do { } while (0) | ||
146 | |||
147 | |||
148 | /* | ||
149 | * DO NOT USE THESE FUNCTIONS. These instructions aren't part of the Xtensa | ||
150 | * ISA and exist only for test purposes.. | ||
151 | * You may find it helpful for MMU debugging, however. | ||
152 | * | ||
153 | * 'at' is the unmodified input register | ||
154 | * 'as' is the output register, as follows (specific to the Linux config): | ||
155 | * | ||
156 | * as[31..12] contain the virtual address | ||
157 | * as[11..08] are meaningless | ||
158 | * as[07..00] contain the asid | ||
159 | */ | ||
160 | |||
161 | static inline unsigned long read_dtlb_virtual (int way) | ||
162 | { | ||
163 | unsigned long tmp; | ||
164 | __asm__ __volatile__("rdtlb0 %0, %1\n\t" : "=a" (tmp), "+a" (way)); | ||
165 | return tmp; | ||
166 | } | ||
167 | |||
168 | static inline unsigned long read_dtlb_translation (int way) | ||
169 | { | ||
170 | unsigned long tmp; | ||
171 | __asm__ __volatile__("rdtlb1 %0, %1\n\t" : "=a" (tmp), "+a" (way)); | ||
172 | return tmp; | ||
173 | } | ||
174 | |||
175 | static inline unsigned long read_itlb_virtual (int way) | ||
176 | { | ||
177 | unsigned long tmp; | ||
178 | __asm__ __volatile__("ritlb0 %0, %1\n\t" : "=a" (tmp), "+a" (way)); | ||
179 | return tmp; | ||
180 | } | ||
181 | |||
182 | static inline unsigned long read_itlb_translation (int way) | ||
183 | { | ||
184 | unsigned long tmp; | ||
185 | __asm__ __volatile__("ritlb1 %0, %1\n\t" : "=a" (tmp), "+a" (way)); | ||
186 | return tmp; | ||
187 | } | ||
188 | |||
189 | #endif /* __ASSEMBLY__ */ | ||
190 | #endif /* __KERNEL__ */ | ||
191 | #endif /* _XTENSA_TLBFLUSH_H */ | ||
diff --git a/include/asm-xtensa/topology.h b/include/asm-xtensa/topology.h deleted file mode 100644 index 7309e38a0ccb..000000000000 --- a/include/asm-xtensa/topology.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/topology.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_TOPOLOGY_H | ||
12 | #define _XTENSA_TOPOLOGY_H | ||
13 | |||
14 | #include <asm-generic/topology.h> | ||
15 | |||
16 | #endif /* _XTENSA_TOPOLOGY_H */ | ||
diff --git a/include/asm-xtensa/types.h b/include/asm-xtensa/types.h deleted file mode 100644 index c89569a8da0c..000000000000 --- a/include/asm-xtensa/types.h +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/types.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_TYPES_H | ||
12 | #define _XTENSA_TYPES_H | ||
13 | |||
14 | #include <asm-generic/int-ll64.h> | ||
15 | |||
16 | #ifdef __ASSEMBLY__ | ||
17 | # define __XTENSA_UL(x) (x) | ||
18 | # define __XTENSA_UL_CONST(x) x | ||
19 | #else | ||
20 | # define __XTENSA_UL(x) ((unsigned long)(x)) | ||
21 | # define __XTENSA_UL_CONST(x) x##UL | ||
22 | #endif | ||
23 | |||
24 | #ifndef __ASSEMBLY__ | ||
25 | |||
26 | typedef unsigned short umode_t; | ||
27 | |||
28 | /* | ||
29 | * These aren't exported outside the kernel to avoid name space clashes | ||
30 | */ | ||
31 | #ifdef __KERNEL__ | ||
32 | |||
33 | #define BITS_PER_LONG 32 | ||
34 | |||
35 | /* Dma addresses are 32-bits wide. */ | ||
36 | |||
37 | typedef u32 dma_addr_t; | ||
38 | |||
39 | #endif /* __KERNEL__ */ | ||
40 | #endif | ||
41 | |||
42 | #endif /* _XTENSA_TYPES_H */ | ||
diff --git a/include/asm-xtensa/uaccess.h b/include/asm-xtensa/uaccess.h deleted file mode 100644 index b8528426ab1f..000000000000 --- a/include/asm-xtensa/uaccess.h +++ /dev/null | |||
@@ -1,500 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/uaccess.h | ||
3 | * | ||
4 | * User space memory access functions | ||
5 | * | ||
6 | * These routines provide basic accessing functions to the user memory | ||
7 | * space for the kernel. This header file provides fuctions such as: | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | * | ||
13 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
14 | */ | ||
15 | |||
16 | #ifndef _XTENSA_UACCESS_H | ||
17 | #define _XTENSA_UACCESS_H | ||
18 | |||
19 | #include <linux/errno.h> | ||
20 | |||
21 | #define VERIFY_READ 0 | ||
22 | #define VERIFY_WRITE 1 | ||
23 | |||
24 | #ifdef __ASSEMBLY__ | ||
25 | |||
26 | #include <asm/current.h> | ||
27 | #include <asm/asm-offsets.h> | ||
28 | #include <asm/processor.h> | ||
29 | #include <asm/types.h> | ||
30 | |||
31 | /* | ||
32 | * These assembly macros mirror the C macros that follow below. They | ||
33 | * should always have identical functionality. See | ||
34 | * arch/xtensa/kernel/sys.S for usage. | ||
35 | */ | ||
36 | |||
37 | #define KERNEL_DS 0 | ||
38 | #define USER_DS 1 | ||
39 | |||
40 | #define get_ds (KERNEL_DS) | ||
41 | |||
42 | /* | ||
43 | * get_fs reads current->thread.current_ds into a register. | ||
44 | * On Entry: | ||
45 | * <ad> anything | ||
46 | * <sp> stack | ||
47 | * On Exit: | ||
48 | * <ad> contains current->thread.current_ds | ||
49 | */ | ||
50 | .macro get_fs ad, sp | ||
51 | GET_CURRENT(\ad,\sp) | ||
52 | l32i \ad, \ad, THREAD_CURRENT_DS | ||
53 | .endm | ||
54 | |||
55 | /* | ||
56 | * set_fs sets current->thread.current_ds to some value. | ||
57 | * On Entry: | ||
58 | * <at> anything (temp register) | ||
59 | * <av> value to write | ||
60 | * <sp> stack | ||
61 | * On Exit: | ||
62 | * <at> destroyed (actually, current) | ||
63 | * <av> preserved, value to write | ||
64 | */ | ||
65 | .macro set_fs at, av, sp | ||
66 | GET_CURRENT(\at,\sp) | ||
67 | s32i \av, \at, THREAD_CURRENT_DS | ||
68 | .endm | ||
69 | |||
70 | /* | ||
71 | * kernel_ok determines whether we should bypass addr/size checking. | ||
72 | * See the equivalent C-macro version below for clarity. | ||
73 | * On success, kernel_ok branches to a label indicated by parameter | ||
74 | * <success>. This implies that the macro falls through to the next | ||
75 | * insruction on an error. | ||
76 | * | ||
77 | * Note that while this macro can be used independently, we designed | ||
78 | * in for optimal use in the access_ok macro below (i.e., we fall | ||
79 | * through on error). | ||
80 | * | ||
81 | * On Entry: | ||
82 | * <at> anything (temp register) | ||
83 | * <success> label to branch to on success; implies | ||
84 | * fall-through macro on error | ||
85 | * <sp> stack pointer | ||
86 | * On Exit: | ||
87 | * <at> destroyed (actually, current->thread.current_ds) | ||
88 | */ | ||
89 | |||
90 | #if ((KERNEL_DS != 0) || (USER_DS == 0)) | ||
91 | # error Assembly macro kernel_ok fails | ||
92 | #endif | ||
93 | .macro kernel_ok at, sp, success | ||
94 | get_fs \at, \sp | ||
95 | beqz \at, \success | ||
96 | .endm | ||
97 | |||
98 | /* | ||
99 | * user_ok determines whether the access to user-space memory is allowed. | ||
100 | * See the equivalent C-macro version below for clarity. | ||
101 | * | ||
102 | * On error, user_ok branches to a label indicated by parameter | ||
103 | * <error>. This implies that the macro falls through to the next | ||
104 | * instruction on success. | ||
105 | * | ||
106 | * Note that while this macro can be used independently, we designed | ||
107 | * in for optimal use in the access_ok macro below (i.e., we fall | ||
108 | * through on success). | ||
109 | * | ||
110 | * On Entry: | ||
111 | * <aa> register containing memory address | ||
112 | * <as> register containing memory size | ||
113 | * <at> temp register | ||
114 | * <error> label to branch to on error; implies fall-through | ||
115 | * macro on success | ||
116 | * On Exit: | ||
117 | * <aa> preserved | ||
118 | * <as> preserved | ||
119 | * <at> destroyed (actually, (TASK_SIZE + 1 - size)) | ||
120 | */ | ||
121 | .macro user_ok aa, as, at, error | ||
122 | movi \at, __XTENSA_UL_CONST(TASK_SIZE) | ||
123 | bgeu \as, \at, \error | ||
124 | sub \at, \at, \as | ||
125 | bgeu \aa, \at, \error | ||
126 | .endm | ||
127 | |||
128 | /* | ||
129 | * access_ok determines whether a memory access is allowed. See the | ||
130 | * equivalent C-macro version below for clarity. | ||
131 | * | ||
132 | * On error, access_ok branches to a label indicated by parameter | ||
133 | * <error>. This implies that the macro falls through to the next | ||
134 | * instruction on success. | ||
135 | * | ||
136 | * Note that we assume success is the common case, and we optimize the | ||
137 | * branch fall-through case on success. | ||
138 | * | ||
139 | * On Entry: | ||
140 | * <aa> register containing memory address | ||
141 | * <as> register containing memory size | ||
142 | * <at> temp register | ||
143 | * <sp> | ||
144 | * <error> label to branch to on error; implies fall-through | ||
145 | * macro on success | ||
146 | * On Exit: | ||
147 | * <aa> preserved | ||
148 | * <as> preserved | ||
149 | * <at> destroyed | ||
150 | */ | ||
151 | .macro access_ok aa, as, at, sp, error | ||
152 | kernel_ok \at, \sp, .Laccess_ok_\@ | ||
153 | user_ok \aa, \as, \at, \error | ||
154 | .Laccess_ok_\@: | ||
155 | .endm | ||
156 | |||
157 | #else /* __ASSEMBLY__ not defined */ | ||
158 | |||
159 | #include <linux/sched.h> | ||
160 | #include <asm/types.h> | ||
161 | |||
162 | /* | ||
163 | * The fs value determines whether argument validity checking should | ||
164 | * be performed or not. If get_fs() == USER_DS, checking is | ||
165 | * performed, with get_fs() == KERNEL_DS, checking is bypassed. | ||
166 | * | ||
167 | * For historical reasons (Data Segment Register?), these macros are | ||
168 | * grossly misnamed. | ||
169 | */ | ||
170 | |||
171 | #define KERNEL_DS ((mm_segment_t) { 0 }) | ||
172 | #define USER_DS ((mm_segment_t) { 1 }) | ||
173 | |||
174 | #define get_ds() (KERNEL_DS) | ||
175 | #define get_fs() (current->thread.current_ds) | ||
176 | #define set_fs(val) (current->thread.current_ds = (val)) | ||
177 | |||
178 | #define segment_eq(a,b) ((a).seg == (b).seg) | ||
179 | |||
180 | #define __kernel_ok (segment_eq(get_fs(), KERNEL_DS)) | ||
181 | #define __user_ok(addr,size) (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size))) | ||
182 | #define __access_ok(addr,size) (__kernel_ok || __user_ok((addr),(size))) | ||
183 | #define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size)) | ||
184 | |||
185 | /* | ||
186 | * These are the main single-value transfer routines. They | ||
187 | * automatically use the right size if we just have the right pointer | ||
188 | * type. | ||
189 | * | ||
190 | * This gets kind of ugly. We want to return _two_ values in | ||
191 | * "get_user()" and yet we don't want to do any pointers, because that | ||
192 | * is too much of a performance impact. Thus we have a few rather ugly | ||
193 | * macros here, and hide all the uglyness from the user. | ||
194 | * | ||
195 | * Careful to not | ||
196 | * (a) re-use the arguments for side effects (sizeof is ok) | ||
197 | * (b) require any knowledge of processes at this stage | ||
198 | */ | ||
199 | #define put_user(x,ptr) __put_user_check((x),(ptr),sizeof(*(ptr))) | ||
200 | #define get_user(x,ptr) __get_user_check((x),(ptr),sizeof(*(ptr))) | ||
201 | |||
202 | /* | ||
203 | * The "__xxx" versions of the user access functions are versions that | ||
204 | * do not verify the address space, that must have been done previously | ||
205 | * with a separate "access_ok()" call (this is used when we do multiple | ||
206 | * accesses to the same area of user memory). | ||
207 | */ | ||
208 | #define __put_user(x,ptr) __put_user_nocheck((x),(ptr),sizeof(*(ptr))) | ||
209 | #define __get_user(x,ptr) __get_user_nocheck((x),(ptr),sizeof(*(ptr))) | ||
210 | |||
211 | |||
212 | extern long __put_user_bad(void); | ||
213 | |||
214 | #define __put_user_nocheck(x,ptr,size) \ | ||
215 | ({ \ | ||
216 | long __pu_err; \ | ||
217 | __put_user_size((x),(ptr),(size),__pu_err); \ | ||
218 | __pu_err; \ | ||
219 | }) | ||
220 | |||
221 | #define __put_user_check(x,ptr,size) \ | ||
222 | ({ \ | ||
223 | long __pu_err = -EFAULT; \ | ||
224 | __typeof__(*(ptr)) *__pu_addr = (ptr); \ | ||
225 | if (access_ok(VERIFY_WRITE,__pu_addr,size)) \ | ||
226 | __put_user_size((x),__pu_addr,(size),__pu_err); \ | ||
227 | __pu_err; \ | ||
228 | }) | ||
229 | |||
230 | #define __put_user_size(x,ptr,size,retval) \ | ||
231 | do { \ | ||
232 | int __cb; \ | ||
233 | retval = 0; \ | ||
234 | switch (size) { \ | ||
235 | case 1: __put_user_asm(x,ptr,retval,1,"s8i",__cb); break; \ | ||
236 | case 2: __put_user_asm(x,ptr,retval,2,"s16i",__cb); break; \ | ||
237 | case 4: __put_user_asm(x,ptr,retval,4,"s32i",__cb); break; \ | ||
238 | case 8: { \ | ||
239 | __typeof__(*ptr) __v64 = x; \ | ||
240 | retval = __copy_to_user(ptr,&__v64,8); \ | ||
241 | break; \ | ||
242 | } \ | ||
243 | default: __put_user_bad(); \ | ||
244 | } \ | ||
245 | } while (0) | ||
246 | |||
247 | |||
248 | /* | ||
249 | * Consider a case of a user single load/store would cause both an | ||
250 | * unaligned exception and an MMU-related exception (unaligned | ||
251 | * exceptions happen first): | ||
252 | * | ||
253 | * User code passes a bad variable ptr to a system call. | ||
254 | * Kernel tries to access the variable. | ||
255 | * Unaligned exception occurs. | ||
256 | * Unaligned exception handler tries to make aligned accesses. | ||
257 | * Double exception occurs for MMU-related cause (e.g., page not mapped). | ||
258 | * do_page_fault() thinks the fault address belongs to the kernel, not the | ||
259 | * user, and panics. | ||
260 | * | ||
261 | * The kernel currently prohibits user unaligned accesses. We use the | ||
262 | * __check_align_* macros to check for unaligned addresses before | ||
263 | * accessing user space so we don't crash the kernel. Both | ||
264 | * __put_user_asm and __get_user_asm use these alignment macros, so | ||
265 | * macro-specific labels such as 0f, 1f, %0, %2, and %3 must stay in | ||
266 | * sync. | ||
267 | */ | ||
268 | |||
269 | #define __check_align_1 "" | ||
270 | |||
271 | #define __check_align_2 \ | ||
272 | " _bbci.l %3, 0, 1f \n" \ | ||
273 | " movi %0, %4 \n" \ | ||
274 | " _j 2f \n" | ||
275 | |||
276 | #define __check_align_4 \ | ||
277 | " _bbsi.l %3, 0, 0f \n" \ | ||
278 | " _bbci.l %3, 1, 1f \n" \ | ||
279 | "0: movi %0, %4 \n" \ | ||
280 | " _j 2f \n" | ||
281 | |||
282 | |||
283 | /* | ||
284 | * We don't tell gcc that we are accessing memory, but this is OK | ||
285 | * because we do not write to any memory gcc knows about, so there | ||
286 | * are no aliasing issues. | ||
287 | * | ||
288 | * WARNING: If you modify this macro at all, verify that the | ||
289 | * __check_align_* macros still work. | ||
290 | */ | ||
291 | #define __put_user_asm(x, addr, err, align, insn, cb) \ | ||
292 | __asm__ __volatile__( \ | ||
293 | __check_align_##align \ | ||
294 | "1: "insn" %2, %3, 0 \n" \ | ||
295 | "2: \n" \ | ||
296 | " .section .fixup,\"ax\" \n" \ | ||
297 | " .align 4 \n" \ | ||
298 | "4: \n" \ | ||
299 | " .long 2b \n" \ | ||
300 | "5: \n" \ | ||
301 | " l32r %1, 4b \n" \ | ||
302 | " movi %0, %4 \n" \ | ||
303 | " jx %1 \n" \ | ||
304 | " .previous \n" \ | ||
305 | " .section __ex_table,\"a\" \n" \ | ||
306 | " .long 1b, 5b \n" \ | ||
307 | " .previous" \ | ||
308 | :"=r" (err), "=r" (cb) \ | ||
309 | :"r" ((int)(x)), "r" (addr), "i" (-EFAULT), "0" (err)) | ||
310 | |||
311 | #define __get_user_nocheck(x,ptr,size) \ | ||
312 | ({ \ | ||
313 | long __gu_err, __gu_val; \ | ||
314 | __get_user_size(__gu_val,(ptr),(size),__gu_err); \ | ||
315 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
316 | __gu_err; \ | ||
317 | }) | ||
318 | |||
319 | #define __get_user_check(x,ptr,size) \ | ||
320 | ({ \ | ||
321 | long __gu_err = -EFAULT, __gu_val = 0; \ | ||
322 | const __typeof__(*(ptr)) *__gu_addr = (ptr); \ | ||
323 | if (access_ok(VERIFY_READ,__gu_addr,size)) \ | ||
324 | __get_user_size(__gu_val,__gu_addr,(size),__gu_err); \ | ||
325 | (x) = (__typeof__(*(ptr)))__gu_val; \ | ||
326 | __gu_err; \ | ||
327 | }) | ||
328 | |||
329 | extern long __get_user_bad(void); | ||
330 | |||
331 | #define __get_user_size(x,ptr,size,retval) \ | ||
332 | do { \ | ||
333 | int __cb; \ | ||
334 | retval = 0; \ | ||
335 | switch (size) { \ | ||
336 | case 1: __get_user_asm(x,ptr,retval,1,"l8ui",__cb); break; \ | ||
337 | case 2: __get_user_asm(x,ptr,retval,2,"l16ui",__cb); break; \ | ||
338 | case 4: __get_user_asm(x,ptr,retval,4,"l32i",__cb); break; \ | ||
339 | case 8: retval = __copy_from_user(&x,ptr,8); break; \ | ||
340 | default: (x) = __get_user_bad(); \ | ||
341 | } \ | ||
342 | } while (0) | ||
343 | |||
344 | |||
345 | /* | ||
346 | * WARNING: If you modify this macro at all, verify that the | ||
347 | * __check_align_* macros still work. | ||
348 | */ | ||
349 | #define __get_user_asm(x, addr, err, align, insn, cb) \ | ||
350 | __asm__ __volatile__( \ | ||
351 | __check_align_##align \ | ||
352 | "1: "insn" %2, %3, 0 \n" \ | ||
353 | "2: \n" \ | ||
354 | " .section .fixup,\"ax\" \n" \ | ||
355 | " .align 4 \n" \ | ||
356 | "4: \n" \ | ||
357 | " .long 2b \n" \ | ||
358 | "5: \n" \ | ||
359 | " l32r %1, 4b \n" \ | ||
360 | " movi %2, 0 \n" \ | ||
361 | " movi %0, %4 \n" \ | ||
362 | " jx %1 \n" \ | ||
363 | " .previous \n" \ | ||
364 | " .section __ex_table,\"a\" \n" \ | ||
365 | " .long 1b, 5b \n" \ | ||
366 | " .previous" \ | ||
367 | :"=r" (err), "=r" (cb), "=r" (x) \ | ||
368 | :"r" (addr), "i" (-EFAULT), "0" (err)) | ||
369 | |||
370 | |||
371 | /* | ||
372 | * Copy to/from user space | ||
373 | */ | ||
374 | |||
375 | /* | ||
376 | * We use a generic, arbitrary-sized copy subroutine. The Xtensa | ||
377 | * architecture would cause heavy code bloat if we tried to inline | ||
378 | * these functions and provide __constant_copy_* equivalents like the | ||
379 | * i386 versions. __xtensa_copy_user is quite efficient. See the | ||
380 | * .fixup section of __xtensa_copy_user for a discussion on the | ||
381 | * X_zeroing equivalents for Xtensa. | ||
382 | */ | ||
383 | |||
384 | extern unsigned __xtensa_copy_user(void *to, const void *from, unsigned n); | ||
385 | #define __copy_user(to,from,size) __xtensa_copy_user(to,from,size) | ||
386 | |||
387 | |||
388 | static inline unsigned long | ||
389 | __generic_copy_from_user_nocheck(void *to, const void *from, unsigned long n) | ||
390 | { | ||
391 | return __copy_user(to,from,n); | ||
392 | } | ||
393 | |||
394 | static inline unsigned long | ||
395 | __generic_copy_to_user_nocheck(void *to, const void *from, unsigned long n) | ||
396 | { | ||
397 | return __copy_user(to,from,n); | ||
398 | } | ||
399 | |||
400 | static inline unsigned long | ||
401 | __generic_copy_to_user(void *to, const void *from, unsigned long n) | ||
402 | { | ||
403 | prefetch(from); | ||
404 | if (access_ok(VERIFY_WRITE, to, n)) | ||
405 | return __copy_user(to,from,n); | ||
406 | return n; | ||
407 | } | ||
408 | |||
409 | static inline unsigned long | ||
410 | __generic_copy_from_user(void *to, const void *from, unsigned long n) | ||
411 | { | ||
412 | prefetchw(to); | ||
413 | if (access_ok(VERIFY_READ, from, n)) | ||
414 | return __copy_user(to,from,n); | ||
415 | else | ||
416 | memset(to, 0, n); | ||
417 | return n; | ||
418 | } | ||
419 | |||
420 | #define copy_to_user(to,from,n) __generic_copy_to_user((to),(from),(n)) | ||
421 | #define copy_from_user(to,from,n) __generic_copy_from_user((to),(from),(n)) | ||
422 | #define __copy_to_user(to,from,n) __generic_copy_to_user_nocheck((to),(from),(n)) | ||
423 | #define __copy_from_user(to,from,n) __generic_copy_from_user_nocheck((to),(from),(n)) | ||
424 | #define __copy_to_user_inatomic __copy_to_user | ||
425 | #define __copy_from_user_inatomic __copy_from_user | ||
426 | |||
427 | |||
428 | /* | ||
429 | * We need to return the number of bytes not cleared. Our memset() | ||
430 | * returns zero if a problem occurs while accessing user-space memory. | ||
431 | * In that event, return no memory cleared. Otherwise, zero for | ||
432 | * success. | ||
433 | */ | ||
434 | |||
435 | static inline unsigned long | ||
436 | __xtensa_clear_user(void *addr, unsigned long size) | ||
437 | { | ||
438 | if ( ! memset(addr, 0, size) ) | ||
439 | return size; | ||
440 | return 0; | ||
441 | } | ||
442 | |||
443 | static inline unsigned long | ||
444 | clear_user(void *addr, unsigned long size) | ||
445 | { | ||
446 | if (access_ok(VERIFY_WRITE, addr, size)) | ||
447 | return __xtensa_clear_user(addr, size); | ||
448 | return size ? -EFAULT : 0; | ||
449 | } | ||
450 | |||
451 | #define __clear_user __xtensa_clear_user | ||
452 | |||
453 | |||
454 | extern long __strncpy_user(char *, const char *, long); | ||
455 | #define __strncpy_from_user __strncpy_user | ||
456 | |||
457 | static inline long | ||
458 | strncpy_from_user(char *dst, const char *src, long count) | ||
459 | { | ||
460 | if (access_ok(VERIFY_READ, src, 1)) | ||
461 | return __strncpy_from_user(dst, src, count); | ||
462 | return -EFAULT; | ||
463 | } | ||
464 | |||
465 | |||
466 | #define strlen_user(str) strnlen_user((str), TASK_SIZE - 1) | ||
467 | |||
468 | /* | ||
469 | * Return the size of a string (including the ending 0!) | ||
470 | */ | ||
471 | extern long __strnlen_user(const char *, long); | ||
472 | |||
473 | static inline long strnlen_user(const char *str, long len) | ||
474 | { | ||
475 | unsigned long top = __kernel_ok ? ~0UL : TASK_SIZE - 1; | ||
476 | |||
477 | if ((unsigned long)str > top) | ||
478 | return 0; | ||
479 | return __strnlen_user(str, len); | ||
480 | } | ||
481 | |||
482 | |||
483 | struct exception_table_entry | ||
484 | { | ||
485 | unsigned long insn, fixup; | ||
486 | }; | ||
487 | |||
488 | /* Returns 0 if exception not found and fixup.unit otherwise. */ | ||
489 | |||
490 | extern unsigned long search_exception_table(unsigned long addr); | ||
491 | extern void sort_exception_table(void); | ||
492 | |||
493 | /* Returns the new pc */ | ||
494 | #define fixup_exception(map_reg, fixup_unit, pc) \ | ||
495 | ({ \ | ||
496 | fixup_unit; \ | ||
497 | }) | ||
498 | |||
499 | #endif /* __ASSEMBLY__ */ | ||
500 | #endif /* _XTENSA_UACCESS_H */ | ||
diff --git a/include/asm-xtensa/ucontext.h b/include/asm-xtensa/ucontext.h deleted file mode 100644 index 94c94ed3e00a..000000000000 --- a/include/asm-xtensa/ucontext.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/ucontext.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_UCONTEXT_H | ||
12 | #define _XTENSA_UCONTEXT_H | ||
13 | |||
14 | struct ucontext { | ||
15 | unsigned long uc_flags; | ||
16 | struct ucontext *uc_link; | ||
17 | stack_t uc_stack; | ||
18 | struct sigcontext uc_mcontext; | ||
19 | sigset_t uc_sigmask; /* mask last for extensibility */ | ||
20 | }; | ||
21 | |||
22 | #endif /* _XTENSA_UCONTEXT_H */ | ||
diff --git a/include/asm-xtensa/unaligned.h b/include/asm-xtensa/unaligned.h deleted file mode 100644 index 8f3424fc5d18..000000000000 --- a/include/asm-xtensa/unaligned.h +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | /* | ||
2 | * Xtensa doesn't handle unaligned accesses efficiently. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | #ifndef _ASM_XTENSA_UNALIGNED_H | ||
11 | #define _ASM_XTENSA_UNALIGNED_H | ||
12 | |||
13 | #ifdef __XTENSA_EL__ | ||
14 | # include <linux/unaligned/le_memmove.h> | ||
15 | # include <linux/unaligned/be_byteshift.h> | ||
16 | # include <linux/unaligned/generic.h> | ||
17 | # define get_unaligned __get_unaligned_le | ||
18 | # define put_unaligned __put_unaligned_le | ||
19 | #elif defined(__XTENSA_EB__) | ||
20 | # include <linux/unaligned/be_memmove.h> | ||
21 | # include <linux/unaligned/le_byteshift.h> | ||
22 | # include <linux/unaligned/generic.h> | ||
23 | # define get_unaligned __get_unaligned_be | ||
24 | # define put_unaligned __put_unaligned_be | ||
25 | #else | ||
26 | # error processor byte order undefined! | ||
27 | #endif | ||
28 | |||
29 | #endif /* _ASM_XTENSA_UNALIGNED_H */ | ||
diff --git a/include/asm-xtensa/unistd.h b/include/asm-xtensa/unistd.h deleted file mode 100644 index c092c8fbb2cf..000000000000 --- a/include/asm-xtensa/unistd.h +++ /dev/null | |||
@@ -1,735 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/unistd.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_UNISTD_H | ||
12 | #define _XTENSA_UNISTD_H | ||
13 | |||
14 | #ifndef __SYSCALL | ||
15 | # define __SYSCALL(nr,func,nargs) | ||
16 | #endif | ||
17 | |||
18 | #define __NR_spill 0 | ||
19 | __SYSCALL( 0, sys_ni_syscall, 0) | ||
20 | #define __NR_xtensa 1 | ||
21 | __SYSCALL( 1, sys_ni_syscall, 0) | ||
22 | #define __NR_available4 2 | ||
23 | __SYSCALL( 2, sys_ni_syscall, 0) | ||
24 | #define __NR_available5 3 | ||
25 | __SYSCALL( 3, sys_ni_syscall, 0) | ||
26 | #define __NR_available6 4 | ||
27 | __SYSCALL( 4, sys_ni_syscall, 0) | ||
28 | #define __NR_available7 5 | ||
29 | __SYSCALL( 5, sys_ni_syscall, 0) | ||
30 | #define __NR_available8 6 | ||
31 | __SYSCALL( 6, sys_ni_syscall, 0) | ||
32 | #define __NR_available9 7 | ||
33 | __SYSCALL( 7, sys_ni_syscall, 0) | ||
34 | |||
35 | /* File Operations */ | ||
36 | |||
37 | #define __NR_open 8 | ||
38 | __SYSCALL( 8, sys_open, 3) | ||
39 | #define __NR_close 9 | ||
40 | __SYSCALL( 9, sys_close, 1) | ||
41 | #define __NR_dup 10 | ||
42 | __SYSCALL( 10, sys_dup, 1) | ||
43 | #define __NR_dup2 11 | ||
44 | __SYSCALL( 11, sys_dup2, 2) | ||
45 | #define __NR_read 12 | ||
46 | __SYSCALL( 12, sys_read, 3) | ||
47 | #define __NR_write 13 | ||
48 | __SYSCALL( 13, sys_write, 3) | ||
49 | #define __NR_select 14 | ||
50 | __SYSCALL( 14, sys_select, 5) | ||
51 | #define __NR_lseek 15 | ||
52 | __SYSCALL( 15, sys_lseek, 3) | ||
53 | #define __NR_poll 16 | ||
54 | __SYSCALL( 16, sys_poll, 3) | ||
55 | #define __NR__llseek 17 | ||
56 | __SYSCALL( 17, sys_llseek, 5) | ||
57 | #define __NR_epoll_wait 18 | ||
58 | __SYSCALL( 18, sys_epoll_wait, 4) | ||
59 | #define __NR_epoll_ctl 19 | ||
60 | __SYSCALL( 19, sys_epoll_ctl, 4) | ||
61 | #define __NR_epoll_create 20 | ||
62 | __SYSCALL( 20, sys_epoll_create, 1) | ||
63 | #define __NR_creat 21 | ||
64 | __SYSCALL( 21, sys_creat, 2) | ||
65 | #define __NR_truncate 22 | ||
66 | __SYSCALL( 22, sys_truncate, 2) | ||
67 | #define __NR_ftruncate 23 | ||
68 | __SYSCALL( 23, sys_ftruncate, 2) | ||
69 | #define __NR_readv 24 | ||
70 | __SYSCALL( 24, sys_readv, 3) | ||
71 | #define __NR_writev 25 | ||
72 | __SYSCALL( 25, sys_writev, 3) | ||
73 | #define __NR_fsync 26 | ||
74 | __SYSCALL( 26, sys_fsync, 1) | ||
75 | #define __NR_fdatasync 27 | ||
76 | __SYSCALL( 27, sys_fdatasync, 1) | ||
77 | #define __NR_truncate64 28 | ||
78 | __SYSCALL( 28, sys_truncate64, 2) | ||
79 | #define __NR_ftruncate64 29 | ||
80 | __SYSCALL( 29, sys_ftruncate64, 2) | ||
81 | #define __NR_pread64 30 | ||
82 | __SYSCALL( 30, sys_pread64, 6) | ||
83 | #define __NR_pwrite64 31 | ||
84 | __SYSCALL( 31, sys_pwrite64, 6) | ||
85 | |||
86 | #define __NR_link 32 | ||
87 | __SYSCALL( 32, sys_link, 2) | ||
88 | #define __NR_rename 33 | ||
89 | __SYSCALL( 33, sys_rename, 2) | ||
90 | #define __NR_symlink 34 | ||
91 | __SYSCALL( 34, sys_symlink, 2) | ||
92 | #define __NR_readlink 35 | ||
93 | __SYSCALL( 35, sys_readlink, 3) | ||
94 | #define __NR_mknod 36 | ||
95 | __SYSCALL( 36, sys_mknod, 3) | ||
96 | #define __NR_pipe 37 | ||
97 | __SYSCALL( 37, xtensa_pipe, 1) | ||
98 | #define __NR_unlink 38 | ||
99 | __SYSCALL( 38, sys_unlink, 1) | ||
100 | #define __NR_rmdir 39 | ||
101 | __SYSCALL( 39, sys_rmdir, 1) | ||
102 | |||
103 | #define __NR_mkdir 40 | ||
104 | __SYSCALL( 40, sys_mkdir, 2) | ||
105 | #define __NR_chdir 41 | ||
106 | __SYSCALL( 41, sys_chdir, 1) | ||
107 | #define __NR_fchdir 42 | ||
108 | __SYSCALL( 42, sys_fchdir, 1) | ||
109 | #define __NR_getcwd 43 | ||
110 | __SYSCALL( 43, sys_getcwd, 2) | ||
111 | |||
112 | #define __NR_chmod 44 | ||
113 | __SYSCALL( 44, sys_chmod, 2) | ||
114 | #define __NR_chown 45 | ||
115 | __SYSCALL( 45, sys_chown, 3) | ||
116 | #define __NR_stat 46 | ||
117 | __SYSCALL( 46, sys_newstat, 2) | ||
118 | #define __NR_stat64 47 | ||
119 | __SYSCALL( 47, sys_stat64, 2) | ||
120 | |||
121 | #define __NR_lchown 48 | ||
122 | __SYSCALL( 48, sys_lchown, 3) | ||
123 | #define __NR_lstat 49 | ||
124 | __SYSCALL( 49, sys_newlstat, 2) | ||
125 | #define __NR_lstat64 50 | ||
126 | __SYSCALL( 50, sys_lstat64, 2) | ||
127 | #define __NR_available51 51 | ||
128 | __SYSCALL( 51, sys_ni_syscall, 0) | ||
129 | |||
130 | #define __NR_fchmod 52 | ||
131 | __SYSCALL( 52, sys_fchmod, 2) | ||
132 | #define __NR_fchown 53 | ||
133 | __SYSCALL( 53, sys_fchown, 3) | ||
134 | #define __NR_fstat 54 | ||
135 | __SYSCALL( 54, sys_newfstat, 2) | ||
136 | #define __NR_fstat64 55 | ||
137 | __SYSCALL( 55, sys_fstat64, 2) | ||
138 | |||
139 | #define __NR_flock 56 | ||
140 | __SYSCALL( 56, sys_flock, 2) | ||
141 | #define __NR_access 57 | ||
142 | __SYSCALL( 57, sys_access, 2) | ||
143 | #define __NR_umask 58 | ||
144 | __SYSCALL( 58, sys_umask, 1) | ||
145 | #define __NR_getdents 59 | ||
146 | __SYSCALL( 59, sys_getdents, 3) | ||
147 | #define __NR_getdents64 60 | ||
148 | __SYSCALL( 60, sys_getdents64, 3) | ||
149 | #define __NR_fcntl64 61 | ||
150 | __SYSCALL( 61, sys_fcntl64, 3) | ||
151 | #define __NR_available62 62 | ||
152 | __SYSCALL( 62, sys_ni_syscall, 0) | ||
153 | #define __NR_fadvise64_64 63 | ||
154 | __SYSCALL( 63, xtensa_fadvise64_64, 6) | ||
155 | #define __NR_utime 64 /* glibc 2.3.3 ?? */ | ||
156 | __SYSCALL( 64, sys_utime, 2) | ||
157 | #define __NR_utimes 65 | ||
158 | __SYSCALL( 65, sys_utimes, 2) | ||
159 | #define __NR_ioctl 66 | ||
160 | __SYSCALL( 66, sys_ioctl, 3) | ||
161 | #define __NR_fcntl 67 | ||
162 | __SYSCALL( 67, sys_fcntl, 3) | ||
163 | |||
164 | #define __NR_setxattr 68 | ||
165 | __SYSCALL( 68, sys_setxattr, 5) | ||
166 | #define __NR_getxattr 69 | ||
167 | __SYSCALL( 69, sys_getxattr, 4) | ||
168 | #define __NR_listxattr 70 | ||
169 | __SYSCALL( 70, sys_listxattr, 3) | ||
170 | #define __NR_removexattr 71 | ||
171 | __SYSCALL( 71, sys_removexattr, 2) | ||
172 | #define __NR_lsetxattr 72 | ||
173 | __SYSCALL( 72, sys_lsetxattr, 5) | ||
174 | #define __NR_lgetxattr 73 | ||
175 | __SYSCALL( 73, sys_lgetxattr, 4) | ||
176 | #define __NR_llistxattr 74 | ||
177 | __SYSCALL( 74, sys_llistxattr, 3) | ||
178 | #define __NR_lremovexattr 75 | ||
179 | __SYSCALL( 75, sys_lremovexattr, 2) | ||
180 | #define __NR_fsetxattr 76 | ||
181 | __SYSCALL( 76, sys_fsetxattr, 5) | ||
182 | #define __NR_fgetxattr 77 | ||
183 | __SYSCALL( 77, sys_fgetxattr, 4) | ||
184 | #define __NR_flistxattr 78 | ||
185 | __SYSCALL( 78, sys_flistxattr, 3) | ||
186 | #define __NR_fremovexattr 79 | ||
187 | __SYSCALL( 79, sys_fremovexattr, 2) | ||
188 | |||
189 | /* File Map / Shared Memory Operations */ | ||
190 | |||
191 | #define __NR_mmap2 80 | ||
192 | __SYSCALL( 80, xtensa_mmap2, 6) | ||
193 | #define __NR_munmap 81 | ||
194 | __SYSCALL( 81, sys_munmap, 2) | ||
195 | #define __NR_mprotect 82 | ||
196 | __SYSCALL( 82, sys_mprotect, 3) | ||
197 | #define __NR_brk 83 | ||
198 | __SYSCALL( 83, sys_brk, 1) | ||
199 | #define __NR_mlock 84 | ||
200 | __SYSCALL( 84, sys_mlock, 2) | ||
201 | #define __NR_munlock 85 | ||
202 | __SYSCALL( 85, sys_munlock, 2) | ||
203 | #define __NR_mlockall 86 | ||
204 | __SYSCALL( 86, sys_mlockall, 1) | ||
205 | #define __NR_munlockall 87 | ||
206 | __SYSCALL( 87, sys_munlockall, 0) | ||
207 | #define __NR_mremap 88 | ||
208 | __SYSCALL( 88, sys_mremap, 4) | ||
209 | #define __NR_msync 89 | ||
210 | __SYSCALL( 89, sys_msync, 3) | ||
211 | #define __NR_mincore 90 | ||
212 | __SYSCALL( 90, sys_mincore, 3) | ||
213 | #define __NR_madvise 91 | ||
214 | __SYSCALL( 91, sys_madvise, 3) | ||
215 | #define __NR_shmget 92 | ||
216 | __SYSCALL( 92, sys_shmget, 4) | ||
217 | #define __NR_shmat 93 | ||
218 | __SYSCALL( 93, xtensa_shmat, 4) | ||
219 | #define __NR_shmctl 94 | ||
220 | __SYSCALL( 94, sys_shmctl, 4) | ||
221 | #define __NR_shmdt 95 | ||
222 | __SYSCALL( 95, sys_shmdt, 4) | ||
223 | |||
224 | /* Socket Operations */ | ||
225 | |||
226 | #define __NR_socket 96 | ||
227 | __SYSCALL( 96, sys_socket, 3) | ||
228 | #define __NR_setsockopt 97 | ||
229 | __SYSCALL( 97, sys_setsockopt, 5) | ||
230 | #define __NR_getsockopt 98 | ||
231 | __SYSCALL( 98, sys_getsockopt, 5) | ||
232 | #define __NR_shutdown 99 | ||
233 | __SYSCALL( 99, sys_shutdown, 2) | ||
234 | |||
235 | #define __NR_bind 100 | ||
236 | __SYSCALL(100, sys_bind, 3) | ||
237 | #define __NR_connect 101 | ||
238 | __SYSCALL(101, sys_connect, 3) | ||
239 | #define __NR_listen 102 | ||
240 | __SYSCALL(102, sys_listen, 2) | ||
241 | #define __NR_accept 103 | ||
242 | __SYSCALL(103, sys_accept, 3) | ||
243 | |||
244 | #define __NR_getsockname 104 | ||
245 | __SYSCALL(104, sys_getsockname, 3) | ||
246 | #define __NR_getpeername 105 | ||
247 | __SYSCALL(105, sys_getpeername, 3) | ||
248 | #define __NR_sendmsg 106 | ||
249 | __SYSCALL(106, sys_sendmsg, 3) | ||
250 | #define __NR_recvmsg 107 | ||
251 | __SYSCALL(107, sys_recvmsg, 3) | ||
252 | #define __NR_send 108 | ||
253 | __SYSCALL(108, sys_send, 4) | ||
254 | #define __NR_recv 109 | ||
255 | __SYSCALL(109, sys_recv, 4) | ||
256 | #define __NR_sendto 110 | ||
257 | __SYSCALL(110, sys_sendto, 6) | ||
258 | #define __NR_recvfrom 111 | ||
259 | __SYSCALL(111, sys_recvfrom, 6) | ||
260 | |||
261 | #define __NR_socketpair 112 | ||
262 | __SYSCALL(112, sys_socketpair, 4) | ||
263 | #define __NR_sendfile 113 | ||
264 | __SYSCALL(113, sys_sendfile, 4) | ||
265 | #define __NR_sendfile64 114 | ||
266 | __SYSCALL(114, sys_sendfile64, 4) | ||
267 | #define __NR_available115 115 | ||
268 | __SYSCALL(115, sys_ni_syscall, 0) | ||
269 | |||
270 | /* Process Operations */ | ||
271 | |||
272 | #define __NR_clone 116 | ||
273 | __SYSCALL(116, xtensa_clone, 5) | ||
274 | #define __NR_execve 117 | ||
275 | __SYSCALL(117, xtensa_execve, 3) | ||
276 | #define __NR_exit 118 | ||
277 | __SYSCALL(118, sys_exit, 1) | ||
278 | #define __NR_exit_group 119 | ||
279 | __SYSCALL(119, sys_exit_group, 1) | ||
280 | #define __NR_getpid 120 | ||
281 | __SYSCALL(120, sys_getpid, 0) | ||
282 | #define __NR_wait4 121 | ||
283 | __SYSCALL(121, sys_wait4, 4) | ||
284 | #define __NR_waitid 122 | ||
285 | __SYSCALL(122, sys_waitid, 5) | ||
286 | #define __NR_kill 123 | ||
287 | __SYSCALL(123, sys_kill, 2) | ||
288 | #define __NR_tkill 124 | ||
289 | __SYSCALL(124, sys_tkill, 2) | ||
290 | #define __NR_tgkill 125 | ||
291 | __SYSCALL(125, sys_tgkill, 3) | ||
292 | #define __NR_set_tid_address 126 | ||
293 | __SYSCALL(126, sys_set_tid_address, 1) | ||
294 | #define __NR_gettid 127 | ||
295 | __SYSCALL(127, sys_gettid, 0) | ||
296 | #define __NR_setsid 128 | ||
297 | __SYSCALL(128, sys_setsid, 0) | ||
298 | #define __NR_getsid 129 | ||
299 | __SYSCALL(129, sys_getsid, 1) | ||
300 | #define __NR_prctl 130 | ||
301 | __SYSCALL(130, sys_prctl, 5) | ||
302 | #define __NR_personality 131 | ||
303 | __SYSCALL(131, sys_personality, 1) | ||
304 | #define __NR_getpriority 132 | ||
305 | __SYSCALL(132, sys_getpriority, 2) | ||
306 | #define __NR_setpriority 133 | ||
307 | __SYSCALL(133, sys_setpriority, 3) | ||
308 | #define __NR_setitimer 134 | ||
309 | __SYSCALL(134, sys_setitimer, 3) | ||
310 | #define __NR_getitimer 135 | ||
311 | __SYSCALL(135, sys_getitimer, 2) | ||
312 | #define __NR_setuid 136 | ||
313 | __SYSCALL(136, sys_setuid, 1) | ||
314 | #define __NR_getuid 137 | ||
315 | __SYSCALL(137, sys_getuid, 0) | ||
316 | #define __NR_setgid 138 | ||
317 | __SYSCALL(138, sys_setgid, 1) | ||
318 | #define __NR_getgid 139 | ||
319 | __SYSCALL(139, sys_getgid, 0) | ||
320 | #define __NR_geteuid 140 | ||
321 | __SYSCALL(140, sys_geteuid, 0) | ||
322 | #define __NR_getegid 141 | ||
323 | __SYSCALL(141, sys_getegid, 0) | ||
324 | #define __NR_setreuid 142 | ||
325 | __SYSCALL(142, sys_setreuid, 2) | ||
326 | #define __NR_setregid 143 | ||
327 | __SYSCALL(143, sys_setregid, 2) | ||
328 | #define __NR_setresuid 144 | ||
329 | __SYSCALL(144, sys_setresuid, 3) | ||
330 | #define __NR_getresuid 145 | ||
331 | __SYSCALL(145, sys_getresuid, 3) | ||
332 | #define __NR_setresgid 146 | ||
333 | __SYSCALL(146, sys_setresgid, 3) | ||
334 | #define __NR_getresgid 147 | ||
335 | __SYSCALL(147, sys_getresgid, 3) | ||
336 | #define __NR_setpgid 148 | ||
337 | __SYSCALL(148, sys_setpgid, 2) | ||
338 | #define __NR_getpgid 149 | ||
339 | __SYSCALL(149, sys_getpgid, 1) | ||
340 | #define __NR_getppid 150 | ||
341 | __SYSCALL(150, sys_getppid, 0) | ||
342 | #define __NR_getpgrp 151 | ||
343 | __SYSCALL(151, sys_getpgrp, 0) | ||
344 | |||
345 | #define __NR_reserved152 152 /* set_thread_area */ | ||
346 | __SYSCALL(152, sys_ni_syscall, 0) | ||
347 | #define __NR_reserved153 153 /* get_thread_area */ | ||
348 | __SYSCALL(153, sys_ni_syscall, 0) | ||
349 | #define __NR_times 154 | ||
350 | __SYSCALL(154, sys_times, 1) | ||
351 | #define __NR_acct 155 | ||
352 | __SYSCALL(155, sys_acct, 1) | ||
353 | #define __NR_sched_setaffinity 156 | ||
354 | __SYSCALL(156, sys_sched_setaffinity, 3) | ||
355 | #define __NR_sched_getaffinity 157 | ||
356 | __SYSCALL(157, sys_sched_getaffinity, 3) | ||
357 | #define __NR_capget 158 | ||
358 | __SYSCALL(158, sys_capget, 2) | ||
359 | #define __NR_capset 159 | ||
360 | __SYSCALL(159, sys_capset, 2) | ||
361 | #define __NR_ptrace 160 | ||
362 | __SYSCALL(160, sys_ptrace, 4) | ||
363 | #define __NR_semtimedop 161 | ||
364 | __SYSCALL(161, sys_semtimedop, 5) | ||
365 | #define __NR_semget 162 | ||
366 | __SYSCALL(162, sys_semget, 4) | ||
367 | #define __NR_semop 163 | ||
368 | __SYSCALL(163, sys_semop, 4) | ||
369 | #define __NR_semctl 164 | ||
370 | __SYSCALL(164, sys_semctl, 4) | ||
371 | #define __NR_available165 165 | ||
372 | __SYSCALL(165, sys_ni_syscall, 0) | ||
373 | #define __NR_msgget 166 | ||
374 | __SYSCALL(166, sys_msgget, 4) | ||
375 | #define __NR_msgsnd 167 | ||
376 | __SYSCALL(167, sys_msgsnd, 4) | ||
377 | #define __NR_msgrcv 168 | ||
378 | __SYSCALL(168, sys_msgrcv, 4) | ||
379 | #define __NR_msgctl 169 | ||
380 | __SYSCALL(169, sys_msgctl, 4) | ||
381 | #define __NR_available170 170 | ||
382 | __SYSCALL(170, sys_ni_syscall, 0) | ||
383 | #define __NR_available171 171 | ||
384 | __SYSCALL(171, sys_ni_syscall, 0) | ||
385 | |||
386 | /* File System */ | ||
387 | |||
388 | #define __NR_mount 172 | ||
389 | __SYSCALL(172, sys_mount, 5) | ||
390 | #define __NR_swapon 173 | ||
391 | __SYSCALL(173, sys_swapon, 2) | ||
392 | #define __NR_chroot 174 | ||
393 | __SYSCALL(174, sys_chroot, 1) | ||
394 | #define __NR_pivot_root 175 | ||
395 | __SYSCALL(175, sys_pivot_root, 2) | ||
396 | #define __NR_umount 176 | ||
397 | __SYSCALL(176, sys_umount, 2) | ||
398 | #define __NR_swapoff 177 | ||
399 | __SYSCALL(177, sys_swapoff, 1) | ||
400 | #define __NR_sync 178 | ||
401 | __SYSCALL(178, sys_sync, 0) | ||
402 | #define __NR_available179 179 | ||
403 | __SYSCALL(179, sys_ni_syscall, 0) | ||
404 | #define __NR_setfsuid 180 | ||
405 | __SYSCALL(180, sys_setfsuid, 1) | ||
406 | #define __NR_setfsgid 181 | ||
407 | __SYSCALL(181, sys_setfsgid, 1) | ||
408 | #define __NR_sysfs 182 | ||
409 | __SYSCALL(182, sys_sysfs, 3) | ||
410 | #define __NR_ustat 183 | ||
411 | __SYSCALL(183, sys_ustat, 2) | ||
412 | #define __NR_statfs 184 | ||
413 | __SYSCALL(184, sys_statfs, 2) | ||
414 | #define __NR_fstatfs 185 | ||
415 | __SYSCALL(185, sys_fstatfs, 2) | ||
416 | #define __NR_statfs64 186 | ||
417 | __SYSCALL(186, sys_statfs64, 3) | ||
418 | #define __NR_fstatfs64 187 | ||
419 | __SYSCALL(187, sys_fstatfs64, 3) | ||
420 | |||
421 | /* System */ | ||
422 | |||
423 | #define __NR_setrlimit 188 | ||
424 | __SYSCALL(188, sys_setrlimit, 2) | ||
425 | #define __NR_getrlimit 189 | ||
426 | __SYSCALL(189, sys_getrlimit, 2) | ||
427 | #define __NR_getrusage 190 | ||
428 | __SYSCALL(190, sys_getrusage, 2) | ||
429 | #define __NR_futex 191 | ||
430 | __SYSCALL(191, sys_futex, 5) | ||
431 | #define __NR_gettimeofday 192 | ||
432 | __SYSCALL(192, sys_gettimeofday, 2) | ||
433 | #define __NR_settimeofday 193 | ||
434 | __SYSCALL(193, sys_settimeofday, 2) | ||
435 | #define __NR_adjtimex 194 | ||
436 | __SYSCALL(194, sys_adjtimex, 1) | ||
437 | #define __NR_nanosleep 195 | ||
438 | __SYSCALL(195, sys_nanosleep, 2) | ||
439 | #define __NR_getgroups 196 | ||
440 | __SYSCALL(196, sys_getgroups, 2) | ||
441 | #define __NR_setgroups 197 | ||
442 | __SYSCALL(197, sys_setgroups, 2) | ||
443 | #define __NR_sethostname 198 | ||
444 | __SYSCALL(198, sys_sethostname, 2) | ||
445 | #define __NR_setdomainname 199 | ||
446 | __SYSCALL(199, sys_setdomainname, 2) | ||
447 | #define __NR_syslog 200 | ||
448 | __SYSCALL(200, sys_syslog, 3) | ||
449 | #define __NR_vhangup 201 | ||
450 | __SYSCALL(201, sys_vhangup, 0) | ||
451 | #define __NR_uselib 202 | ||
452 | __SYSCALL(202, sys_uselib, 1) | ||
453 | #define __NR_reboot 203 | ||
454 | __SYSCALL(203, sys_reboot, 3) | ||
455 | #define __NR_quotactl 204 | ||
456 | __SYSCALL(204, sys_quotactl, 4) | ||
457 | #define __NR_nfsservctl 205 | ||
458 | __SYSCALL(205, sys_nfsservctl, 3) | ||
459 | #define __NR__sysctl 206 | ||
460 | __SYSCALL(206, sys_sysctl, 1) | ||
461 | #define __NR_bdflush 207 | ||
462 | __SYSCALL(207, sys_bdflush, 2) | ||
463 | #define __NR_uname 208 | ||
464 | __SYSCALL(208, sys_newuname, 1) | ||
465 | #define __NR_sysinfo 209 | ||
466 | __SYSCALL(209, sys_sysinfo, 1) | ||
467 | #define __NR_init_module 210 | ||
468 | __SYSCALL(210, sys_init_module, 2) | ||
469 | #define __NR_delete_module 211 | ||
470 | __SYSCALL(211, sys_delete_module, 1) | ||
471 | |||
472 | #define __NR_sched_setparam 212 | ||
473 | __SYSCALL(212, sys_sched_setparam, 2) | ||
474 | #define __NR_sched_getparam 213 | ||
475 | __SYSCALL(213, sys_sched_getparam, 2) | ||
476 | #define __NR_sched_setscheduler 214 | ||
477 | __SYSCALL(214, sys_sched_setscheduler, 3) | ||
478 | #define __NR_sched_getscheduler 215 | ||
479 | __SYSCALL(215, sys_sched_getscheduler, 1) | ||
480 | #define __NR_sched_get_priority_max 216 | ||
481 | __SYSCALL(216, sys_sched_get_priority_max, 1) | ||
482 | #define __NR_sched_get_priority_min 217 | ||
483 | __SYSCALL(217, sys_sched_get_priority_min, 1) | ||
484 | #define __NR_sched_rr_get_interval 218 | ||
485 | __SYSCALL(218, sys_sched_rr_get_interval, 2) | ||
486 | #define __NR_sched_yield 219 | ||
487 | __SYSCALL(219, sys_sched_yield, 0) | ||
488 | #define __NR_available222 222 | ||
489 | __SYSCALL(222, sys_ni_syscall, 0) | ||
490 | |||
491 | /* Signal Handling */ | ||
492 | |||
493 | #define __NR_restart_syscall 223 | ||
494 | __SYSCALL(223, sys_restart_syscall, 0) | ||
495 | #define __NR_sigaltstack 224 | ||
496 | __SYSCALL(224, xtensa_sigaltstack, 2) | ||
497 | #define __NR_rt_sigreturn 225 | ||
498 | __SYSCALL(225, xtensa_rt_sigreturn, 1) | ||
499 | #define __NR_rt_sigaction 226 | ||
500 | __SYSCALL(226, sys_rt_sigaction, 4) | ||
501 | #define __NR_rt_sigprocmask 227 | ||
502 | __SYSCALL(227, sys_rt_sigprocmask, 4) | ||
503 | #define __NR_rt_sigpending 228 | ||
504 | __SYSCALL(228, sys_rt_sigpending, 2) | ||
505 | #define __NR_rt_sigtimedwait 229 | ||
506 | __SYSCALL(229, sys_rt_sigtimedwait, 4) | ||
507 | #define __NR_rt_sigqueueinfo 230 | ||
508 | __SYSCALL(230, sys_rt_sigqueueinfo, 3) | ||
509 | #define __NR_rt_sigsuspend 231 | ||
510 | __SYSCALL(231, xtensa_rt_sigsuspend, 2) | ||
511 | |||
512 | /* Message */ | ||
513 | |||
514 | #define __NR_mq_open 232 | ||
515 | __SYSCALL(232, sys_mq_open, 4) | ||
516 | #define __NR_mq_unlink 233 | ||
517 | __SYSCALL(233, sys_mq_unlink, 1) | ||
518 | #define __NR_mq_timedsend 234 | ||
519 | __SYSCALL(234, sys_mq_timedsend, 5) | ||
520 | #define __NR_mq_timedreceive 235 | ||
521 | __SYSCALL(235, sys_mq_timedreceive, 5) | ||
522 | #define __NR_mq_notify 236 | ||
523 | __SYSCALL(236, sys_mq_notify, 2) | ||
524 | #define __NR_mq_getsetattr 237 | ||
525 | __SYSCALL(237, sys_mq_getsetattr, 3) | ||
526 | #define __NR_available238 238 | ||
527 | __SYSCALL(238, sys_ni_syscall, 0) | ||
528 | |||
529 | /* IO */ | ||
530 | |||
531 | #define __NR_io_setup 239 | ||
532 | __SYSCALL(239, sys_io_setup, 2) | ||
533 | #define __NR_io_destroy 240 | ||
534 | __SYSCALL(240, sys_io_destroy, 1) | ||
535 | #define __NR_io_submit 241 | ||
536 | __SYSCALL(241, sys_io_submit, 3) | ||
537 | #define __NR_io_getevents 242 | ||
538 | __SYSCALL(242, sys_io_getevents, 5) | ||
539 | #define __NR_io_cancel 243 | ||
540 | __SYSCALL(243, sys_io_cancel, 3) | ||
541 | #define __NR_clock_settime 244 | ||
542 | __SYSCALL(244, sys_clock_settime, 2) | ||
543 | #define __NR_clock_gettime 245 | ||
544 | __SYSCALL(245, sys_clock_gettime, 2) | ||
545 | #define __NR_clock_getres 246 | ||
546 | __SYSCALL(246, sys_clock_getres, 2) | ||
547 | #define __NR_clock_nanosleep 247 | ||
548 | __SYSCALL(247, sys_clock_nanosleep, 4) | ||
549 | |||
550 | /* Timer */ | ||
551 | |||
552 | #define __NR_timer_create 248 | ||
553 | __SYSCALL(248, sys_timer_create, 3) | ||
554 | #define __NR_timer_delete 249 | ||
555 | __SYSCALL(249, sys_timer_delete, 1) | ||
556 | #define __NR_timer_settime 250 | ||
557 | __SYSCALL(250, sys_timer_settime, 4) | ||
558 | #define __NR_timer_gettime 251 | ||
559 | __SYSCALL(251, sys_timer_gettime, 2) | ||
560 | #define __NR_timer_getoverrun 252 | ||
561 | __SYSCALL(252, sys_timer_getoverrun, 1) | ||
562 | |||
563 | /* System */ | ||
564 | |||
565 | #define __NR_reserved244 253 | ||
566 | __SYSCALL(253, sys_ni_syscall, 0) | ||
567 | #define __NR_lookup_dcookie 254 | ||
568 | __SYSCALL(254, sys_lookup_dcookie, 4) | ||
569 | #define __NR_available255 255 | ||
570 | __SYSCALL(255, sys_ni_syscall, 0) | ||
571 | #define __NR_add_key 256 | ||
572 | __SYSCALL(256, sys_add_key, 5) | ||
573 | #define __NR_request_key 257 | ||
574 | __SYSCALL(257, sys_request_key, 5) | ||
575 | #define __NR_keyctl 258 | ||
576 | __SYSCALL(258, sys_keyctl, 5) | ||
577 | #define __NR_available259 259 | ||
578 | __SYSCALL(259, sys_ni_syscall, 0) | ||
579 | |||
580 | |||
581 | #define __NR_readahead 260 | ||
582 | __SYSCALL(260, sys_readahead, 5) | ||
583 | #define __NR_remap_file_pages 261 | ||
584 | __SYSCALL(261, sys_remap_file_pages, 5) | ||
585 | #define __NR_migrate_pages 262 | ||
586 | __SYSCALL(262, sys_migrate_pages, 0) | ||
587 | #define __NR_mbind 263 | ||
588 | __SYSCALL(263, sys_mbind, 6) | ||
589 | #define __NR_get_mempolicy 264 | ||
590 | __SYSCALL(264, sys_get_mempolicy, 5) | ||
591 | #define __NR_set_mempolicy 265 | ||
592 | __SYSCALL(265, sys_set_mempolicy, 3) | ||
593 | #define __NR_unshare 266 | ||
594 | __SYSCALL(266, sys_unshare, 1) | ||
595 | #define __NR_move_pages 267 | ||
596 | __SYSCALL(267, sys_move_pages, 0) | ||
597 | #define __NR_splice 268 | ||
598 | __SYSCALL(268, sys_splice, 0) | ||
599 | #define __NR_tee 269 | ||
600 | __SYSCALL(269, sys_tee, 0) | ||
601 | #define __NR_vmsplice 270 | ||
602 | __SYSCALL(270, sys_vmsplice, 0) | ||
603 | #define __NR_available271 271 | ||
604 | __SYSCALL(271, sys_ni_syscall, 0) | ||
605 | |||
606 | #define __NR_pselect6 272 | ||
607 | __SYSCALL(272, sys_pselect6, 0) | ||
608 | #define __NR_ppoll 273 | ||
609 | __SYSCALL(273, sys_ppoll, 0) | ||
610 | #define __NR_epoll_pwait 274 | ||
611 | __SYSCALL(274, sys_epoll_pwait, 0) | ||
612 | #define __NR_available275 275 | ||
613 | __SYSCALL(275, sys_ni_syscall, 0) | ||
614 | |||
615 | #define __NR_inotify_init 276 | ||
616 | __SYSCALL(276, sys_inotify_init, 0) | ||
617 | #define __NR_inotify_add_watch 277 | ||
618 | __SYSCALL(277, sys_inotify_add_watch, 3) | ||
619 | #define __NR_inotify_rm_watch 278 | ||
620 | __SYSCALL(278, sys_inotify_rm_watch, 2) | ||
621 | #define __NR_available279 279 | ||
622 | __SYSCALL(279, sys_ni_syscall, 0) | ||
623 | |||
624 | #define __NR_getcpu 280 | ||
625 | __SYSCALL(280, sys_getcpu, 0) | ||
626 | #define __NR_kexec_load 281 | ||
627 | __SYSCALL(281, sys_ni_syscall, 0) | ||
628 | |||
629 | #define __NR_ioprio_set 282 | ||
630 | __SYSCALL(282, sys_ioprio_set, 2) | ||
631 | #define __NR_ioprio_get 283 | ||
632 | __SYSCALL(283, sys_ioprio_get, 3) | ||
633 | |||
634 | #define __NR_set_robust_list 284 | ||
635 | __SYSCALL(284, sys_set_robust_list, 3) | ||
636 | #define __NR_get_robust_list 285 | ||
637 | __SYSCALL(285, sys_get_robust_list, 3) | ||
638 | #define __NR_reserved286 286 /* sync_file_rangeX */ | ||
639 | __SYSCALL(286, sys_ni_syscall, 3) | ||
640 | #define __NR_available287 287 | ||
641 | __SYSCALL(287, sys_faccessat, 0) | ||
642 | |||
643 | /* Relative File Operations */ | ||
644 | |||
645 | #define __NR_openat 288 | ||
646 | __SYSCALL(288, sys_openat, 4) | ||
647 | #define __NR_mkdirat 289 | ||
648 | __SYSCALL(289, sys_mkdirat, 3) | ||
649 | #define __NR_mknodat 290 | ||
650 | __SYSCALL(290, sys_mknodat, 4) | ||
651 | #define __NR_unlinkat 291 | ||
652 | __SYSCALL(291, sys_unlinkat, 3) | ||
653 | #define __NR_renameat 292 | ||
654 | __SYSCALL(292, sys_renameat, 4) | ||
655 | #define __NR_linkat 293 | ||
656 | __SYSCALL(293, sys_linkat, 5) | ||
657 | #define __NR_symlinkat 294 | ||
658 | __SYSCALL(294, sys_symlinkat, 3) | ||
659 | #define __NR_readlinkat 295 | ||
660 | __SYSCALL(295, sys_readlinkat, 4) | ||
661 | #define __NR_utimensat 296 | ||
662 | __SYSCALL(296, sys_utimensat, 0) | ||
663 | #define __NR_fchownat 297 | ||
664 | __SYSCALL(297, sys_fchownat, 5) | ||
665 | #define __NR_futimesat 298 | ||
666 | __SYSCALL(298, sys_futimesat, 4) | ||
667 | #define __NR_fstatat64 299 | ||
668 | __SYSCALL(299, sys_fstatat64, 0) | ||
669 | #define __NR_fchmodat 300 | ||
670 | __SYSCALL(300, sys_fchmodat, 4) | ||
671 | #define __NR_faccessat 301 | ||
672 | __SYSCALL(301, sys_faccessat, 4) | ||
673 | #define __NR_available302 302 | ||
674 | __SYSCALL(302, sys_ni_syscall, 0) | ||
675 | #define __NR_available303 303 | ||
676 | __SYSCALL(303, sys_ni_syscall, 0) | ||
677 | |||
678 | #define __NR_signalfd 304 | ||
679 | __SYSCALL(304, sys_signalfd, 3) | ||
680 | /* 305 was __NR_timerfd */ | ||
681 | __SYSCALL(305, sys_ni_syscall, 0) | ||
682 | #define __NR_eventfd 306 | ||
683 | __SYSCALL(306, sys_eventfd, 1) | ||
684 | |||
685 | #define __NR_syscall_count 307 | ||
686 | |||
687 | /* | ||
688 | * sysxtensa syscall handler | ||
689 | * | ||
690 | * int sysxtensa (SYS_XTENSA_ATOMIC_SET, ptr, val, unused); | ||
691 | * int sysxtensa (SYS_XTENSA_ATOMIC_ADD, ptr, val, unused); | ||
692 | * int sysxtensa (SYS_XTENSA_ATOMIC_EXG_ADD, ptr, val, unused); | ||
693 | * int sysxtensa (SYS_XTENSA_ATOMIC_CMP_SWP, ptr, oldval, newval); | ||
694 | * a2 a6 a3 a4 a5 | ||
695 | */ | ||
696 | |||
697 | #define SYS_XTENSA_RESERVED 0 /* don't use this */ | ||
698 | #define SYS_XTENSA_ATOMIC_SET 1 /* set variable */ | ||
699 | #define SYS_XTENSA_ATOMIC_EXG_ADD 2 /* exchange memory and add */ | ||
700 | #define SYS_XTENSA_ATOMIC_ADD 3 /* add to memory */ | ||
701 | #define SYS_XTENSA_ATOMIC_CMP_SWP 4 /* compare and swap */ | ||
702 | |||
703 | #define SYS_XTENSA_COUNT 5 /* count */ | ||
704 | |||
705 | #ifdef __KERNEL__ | ||
706 | |||
707 | /* | ||
708 | * "Conditional" syscalls | ||
709 | * | ||
710 | * What we want is __attribute__((weak,alias("sys_ni_syscall"))), | ||
711 | * but it doesn't work on all toolchains, so we just do it by hand | ||
712 | */ | ||
713 | #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall"); | ||
714 | |||
715 | #define __ARCH_WANT_STAT64 | ||
716 | #define __ARCH_WANT_SYS_UTIME | ||
717 | #define __ARCH_WANT_SYS_LLSEEK | ||
718 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
719 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
720 | #define __ARCH_WANT_SYS_GETPGRP | ||
721 | |||
722 | /* | ||
723 | * Ignore legacy system calls in the checksyscalls.sh script | ||
724 | */ | ||
725 | |||
726 | #define __IGNORE_fork /* use clone */ | ||
727 | #define __IGNORE_time | ||
728 | #define __IGNORE_alarm /* use setitimer */ | ||
729 | #define __IGNORE_pause | ||
730 | #define __IGNORE_mmap /* use mmap2 */ | ||
731 | #define __IGNORE_vfork /* use clone */ | ||
732 | #define __IGNORE_fadvise64 /* use fadvise64_64 */ | ||
733 | |||
734 | #endif /* __KERNEL__ */ | ||
735 | #endif /* _XTENSA_UNISTD_H */ | ||
diff --git a/include/asm-xtensa/user.h b/include/asm-xtensa/user.h deleted file mode 100644 index 2c3ed23354a8..000000000000 --- a/include/asm-xtensa/user.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/user.h | ||
3 | * | ||
4 | * Xtensa Processor version. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_USER_H | ||
14 | #define _XTENSA_USER_H | ||
15 | |||
16 | /* This file usually defines a 'struct user' structure. However, it it only | ||
17 | * used for a.out file, which are not supported on Xtensa. | ||
18 | */ | ||
19 | |||
20 | #endif /* _XTENSA_USER_H */ | ||
diff --git a/include/asm-xtensa/variant-dc232b/core.h b/include/asm-xtensa/variant-dc232b/core.h deleted file mode 100644 index 525bd3d90154..000000000000 --- a/include/asm-xtensa/variant-dc232b/core.h +++ /dev/null | |||
@@ -1,424 +0,0 @@ | |||
1 | /* | ||
2 | * Xtensa processor core configuration information. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (c) 1999-2007 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CORE_CONFIGURATION_H | ||
12 | #define _XTENSA_CORE_CONFIGURATION_H | ||
13 | |||
14 | |||
15 | /**************************************************************************** | ||
16 | Parameters Useful for Any Code, USER or PRIVILEGED | ||
17 | ****************************************************************************/ | ||
18 | |||
19 | /* | ||
20 | * Note: Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is | ||
21 | * configured, and a value of 0 otherwise. These macros are always defined. | ||
22 | */ | ||
23 | |||
24 | |||
25 | /*---------------------------------------------------------------------- | ||
26 | ISA | ||
27 | ----------------------------------------------------------------------*/ | ||
28 | |||
29 | #define XCHAL_HAVE_BE 0 /* big-endian byte ordering */ | ||
30 | #define XCHAL_HAVE_WINDOWED 1 /* windowed registers option */ | ||
31 | #define XCHAL_NUM_AREGS 32 /* num of physical addr regs */ | ||
32 | #define XCHAL_NUM_AREGS_LOG2 5 /* log2(XCHAL_NUM_AREGS) */ | ||
33 | #define XCHAL_MAX_INSTRUCTION_SIZE 3 /* max instr bytes (3..8) */ | ||
34 | #define XCHAL_HAVE_DEBUG 1 /* debug option */ | ||
35 | #define XCHAL_HAVE_DENSITY 1 /* 16-bit instructions */ | ||
36 | #define XCHAL_HAVE_LOOPS 1 /* zero-overhead loops */ | ||
37 | #define XCHAL_HAVE_NSA 1 /* NSA/NSAU instructions */ | ||
38 | #define XCHAL_HAVE_MINMAX 1 /* MIN/MAX instructions */ | ||
39 | #define XCHAL_HAVE_SEXT 1 /* SEXT instruction */ | ||
40 | #define XCHAL_HAVE_CLAMPS 1 /* CLAMPS instruction */ | ||
41 | #define XCHAL_HAVE_MUL16 1 /* MUL16S/MUL16U instructions */ | ||
42 | #define XCHAL_HAVE_MUL32 1 /* MULL instruction */ | ||
43 | #define XCHAL_HAVE_MUL32_HIGH 0 /* MULUH/MULSH instructions */ | ||
44 | #define XCHAL_HAVE_DIV32 1 /* QUOS/QUOU/REMS/REMU instructions */ | ||
45 | #define XCHAL_HAVE_L32R 1 /* L32R instruction */ | ||
46 | #define XCHAL_HAVE_ABSOLUTE_LITERALS 1 /* non-PC-rel (extended) L32R */ | ||
47 | #define XCHAL_HAVE_CONST16 0 /* CONST16 instruction */ | ||
48 | #define XCHAL_HAVE_ADDX 1 /* ADDX#/SUBX# instructions */ | ||
49 | #define XCHAL_HAVE_WIDE_BRANCHES 0 /* B*.W18 or B*.W15 instr's */ | ||
50 | #define XCHAL_HAVE_PREDICTED_BRANCHES 0 /* B[EQ/EQZ/NE/NEZ]T instr's */ | ||
51 | #define XCHAL_HAVE_CALL4AND12 1 /* (obsolete option) */ | ||
52 | #define XCHAL_HAVE_ABS 1 /* ABS instruction */ | ||
53 | /*#define XCHAL_HAVE_POPC 0*/ /* POPC instruction */ | ||
54 | /*#define XCHAL_HAVE_CRC 0*/ /* CRC instruction */ | ||
55 | #define XCHAL_HAVE_RELEASE_SYNC 1 /* L32AI/S32RI instructions */ | ||
56 | #define XCHAL_HAVE_S32C1I 1 /* S32C1I instruction */ | ||
57 | #define XCHAL_HAVE_SPECULATION 0 /* speculation */ | ||
58 | #define XCHAL_HAVE_FULL_RESET 1 /* all regs/state reset */ | ||
59 | #define XCHAL_NUM_CONTEXTS 1 /* */ | ||
60 | #define XCHAL_NUM_MISC_REGS 2 /* num of scratch regs (0..4) */ | ||
61 | #define XCHAL_HAVE_TAP_MASTER 0 /* JTAG TAP control instr's */ | ||
62 | #define XCHAL_HAVE_PRID 1 /* processor ID register */ | ||
63 | #define XCHAL_HAVE_THREADPTR 1 /* THREADPTR register */ | ||
64 | #define XCHAL_HAVE_BOOLEANS 0 /* boolean registers */ | ||
65 | #define XCHAL_HAVE_CP 1 /* CPENABLE reg (coprocessor) */ | ||
66 | #define XCHAL_CP_MAXCFG 8 /* max allowed cp id plus one */ | ||
67 | #define XCHAL_HAVE_MAC16 1 /* MAC16 package */ | ||
68 | #define XCHAL_HAVE_VECTORFPU2005 0 /* vector floating-point pkg */ | ||
69 | #define XCHAL_HAVE_FP 0 /* floating point pkg */ | ||
70 | #define XCHAL_HAVE_VECTRA1 0 /* Vectra I pkg */ | ||
71 | #define XCHAL_HAVE_VECTRALX 0 /* Vectra LX pkg */ | ||
72 | #define XCHAL_HAVE_HIFI2 0 /* HiFi2 Audio Engine pkg */ | ||
73 | |||
74 | |||
75 | /*---------------------------------------------------------------------- | ||
76 | MISC | ||
77 | ----------------------------------------------------------------------*/ | ||
78 | |||
79 | #define XCHAL_NUM_WRITEBUFFER_ENTRIES 8 /* size of write buffer */ | ||
80 | #define XCHAL_INST_FETCH_WIDTH 4 /* instr-fetch width in bytes */ | ||
81 | #define XCHAL_DATA_WIDTH 4 /* data width in bytes */ | ||
82 | /* In T1050, applies to selected core load and store instructions (see ISA): */ | ||
83 | #define XCHAL_UNALIGNED_LOAD_EXCEPTION 1 /* unaligned loads cause exc. */ | ||
84 | #define XCHAL_UNALIGNED_STORE_EXCEPTION 1 /* unaligned stores cause exc.*/ | ||
85 | |||
86 | #define XCHAL_SW_VERSION 701001 /* sw version of this header */ | ||
87 | |||
88 | #define XCHAL_CORE_ID "dc232b" /* alphanum core name | ||
89 | (CoreID) set in the Xtensa | ||
90 | Processor Generator */ | ||
91 | |||
92 | #define XCHAL_CORE_DESCRIPTION "Diamond 232L Standard Core Rev.B (LE)" | ||
93 | #define XCHAL_BUILD_UNIQUE_ID 0x0000BEEF /* 22-bit sw build ID */ | ||
94 | |||
95 | /* | ||
96 | * These definitions describe the hardware targeted by this software. | ||
97 | */ | ||
98 | #define XCHAL_HW_CONFIGID0 0xC56307FE /* ConfigID hi 32 bits*/ | ||
99 | #define XCHAL_HW_CONFIGID1 0x0D40BEEF /* ConfigID lo 32 bits*/ | ||
100 | #define XCHAL_HW_VERSION_NAME "LX2.1.1" /* full version name */ | ||
101 | #define XCHAL_HW_VERSION_MAJOR 2210 /* major ver# of targeted hw */ | ||
102 | #define XCHAL_HW_VERSION_MINOR 1 /* minor ver# of targeted hw */ | ||
103 | #define XCHAL_HW_VERSION 221001 /* major*100+minor */ | ||
104 | #define XCHAL_HW_REL_LX2 1 | ||
105 | #define XCHAL_HW_REL_LX2_1 1 | ||
106 | #define XCHAL_HW_REL_LX2_1_1 1 | ||
107 | #define XCHAL_HW_CONFIGID_RELIABLE 1 | ||
108 | /* If software targets a *range* of hardware versions, these are the bounds: */ | ||
109 | #define XCHAL_HW_MIN_VERSION_MAJOR 2210 /* major v of earliest tgt hw */ | ||
110 | #define XCHAL_HW_MIN_VERSION_MINOR 1 /* minor v of earliest tgt hw */ | ||
111 | #define XCHAL_HW_MIN_VERSION 221001 /* earliest targeted hw */ | ||
112 | #define XCHAL_HW_MAX_VERSION_MAJOR 2210 /* major v of latest tgt hw */ | ||
113 | #define XCHAL_HW_MAX_VERSION_MINOR 1 /* minor v of latest tgt hw */ | ||
114 | #define XCHAL_HW_MAX_VERSION 221001 /* latest targeted hw */ | ||
115 | |||
116 | |||
117 | /*---------------------------------------------------------------------- | ||
118 | CACHE | ||
119 | ----------------------------------------------------------------------*/ | ||
120 | |||
121 | #define XCHAL_ICACHE_LINESIZE 32 /* I-cache line size in bytes */ | ||
122 | #define XCHAL_DCACHE_LINESIZE 32 /* D-cache line size in bytes */ | ||
123 | #define XCHAL_ICACHE_LINEWIDTH 5 /* log2(I line size in bytes) */ | ||
124 | #define XCHAL_DCACHE_LINEWIDTH 5 /* log2(D line size in bytes) */ | ||
125 | |||
126 | #define XCHAL_ICACHE_SIZE 16384 /* I-cache size in bytes or 0 */ | ||
127 | #define XCHAL_DCACHE_SIZE 16384 /* D-cache size in bytes or 0 */ | ||
128 | |||
129 | #define XCHAL_DCACHE_IS_WRITEBACK 1 /* writeback feature */ | ||
130 | |||
131 | |||
132 | |||
133 | |||
134 | /**************************************************************************** | ||
135 | Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code | ||
136 | ****************************************************************************/ | ||
137 | |||
138 | |||
139 | #ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY | ||
140 | |||
141 | /*---------------------------------------------------------------------- | ||
142 | CACHE | ||
143 | ----------------------------------------------------------------------*/ | ||
144 | |||
145 | #define XCHAL_HAVE_PIF 1 /* any outbound PIF present */ | ||
146 | |||
147 | /* If present, cache size in bytes == (ways * 2^(linewidth + setwidth)). */ | ||
148 | |||
149 | /* Number of cache sets in log2(lines per way): */ | ||
150 | #define XCHAL_ICACHE_SETWIDTH 7 | ||
151 | #define XCHAL_DCACHE_SETWIDTH 7 | ||
152 | |||
153 | /* Cache set associativity (number of ways): */ | ||
154 | #define XCHAL_ICACHE_WAYS 4 | ||
155 | #define XCHAL_DCACHE_WAYS 4 | ||
156 | |||
157 | /* Cache features: */ | ||
158 | #define XCHAL_ICACHE_LINE_LOCKABLE 1 | ||
159 | #define XCHAL_DCACHE_LINE_LOCKABLE 1 | ||
160 | #define XCHAL_ICACHE_ECC_PARITY 0 | ||
161 | #define XCHAL_DCACHE_ECC_PARITY 0 | ||
162 | |||
163 | /* Number of encoded cache attr bits (see <xtensa/hal.h> for decoded bits): */ | ||
164 | #define XCHAL_CA_BITS 4 | ||
165 | |||
166 | |||
167 | /*---------------------------------------------------------------------- | ||
168 | INTERNAL I/D RAM/ROMs and XLMI | ||
169 | ----------------------------------------------------------------------*/ | ||
170 | |||
171 | #define XCHAL_NUM_INSTROM 0 /* number of core instr. ROMs */ | ||
172 | #define XCHAL_NUM_INSTRAM 0 /* number of core instr. RAMs */ | ||
173 | #define XCHAL_NUM_DATAROM 0 /* number of core data ROMs */ | ||
174 | #define XCHAL_NUM_DATARAM 0 /* number of core data RAMs */ | ||
175 | #define XCHAL_NUM_URAM 0 /* number of core unified RAMs*/ | ||
176 | #define XCHAL_NUM_XLMI 0 /* number of core XLMI ports */ | ||
177 | |||
178 | |||
179 | /*---------------------------------------------------------------------- | ||
180 | INTERRUPTS and TIMERS | ||
181 | ----------------------------------------------------------------------*/ | ||
182 | |||
183 | #define XCHAL_HAVE_INTERRUPTS 1 /* interrupt option */ | ||
184 | #define XCHAL_HAVE_HIGHPRI_INTERRUPTS 1 /* med/high-pri. interrupts */ | ||
185 | #define XCHAL_HAVE_NMI 1 /* non-maskable interrupt */ | ||
186 | #define XCHAL_HAVE_CCOUNT 1 /* CCOUNT reg. (timer option) */ | ||
187 | #define XCHAL_NUM_TIMERS 3 /* number of CCOMPAREn regs */ | ||
188 | #define XCHAL_NUM_INTERRUPTS 22 /* number of interrupts */ | ||
189 | #define XCHAL_NUM_INTERRUPTS_LOG2 5 /* ceil(log2(NUM_INTERRUPTS)) */ | ||
190 | #define XCHAL_NUM_EXTINTERRUPTS 17 /* num of external interrupts */ | ||
191 | #define XCHAL_NUM_INTLEVELS 6 /* number of interrupt levels | ||
192 | (not including level zero) */ | ||
193 | #define XCHAL_EXCM_LEVEL 3 /* level masked by PS.EXCM */ | ||
194 | /* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */ | ||
195 | |||
196 | /* Masks of interrupts at each interrupt level: */ | ||
197 | #define XCHAL_INTLEVEL1_MASK 0x001F80FF | ||
198 | #define XCHAL_INTLEVEL2_MASK 0x00000100 | ||
199 | #define XCHAL_INTLEVEL3_MASK 0x00200E00 | ||
200 | #define XCHAL_INTLEVEL4_MASK 0x00001000 | ||
201 | #define XCHAL_INTLEVEL5_MASK 0x00002000 | ||
202 | #define XCHAL_INTLEVEL6_MASK 0x00000000 | ||
203 | #define XCHAL_INTLEVEL7_MASK 0x00004000 | ||
204 | |||
205 | /* Masks of interrupts at each range 1..n of interrupt levels: */ | ||
206 | #define XCHAL_INTLEVEL1_ANDBELOW_MASK 0x001F80FF | ||
207 | #define XCHAL_INTLEVEL2_ANDBELOW_MASK 0x001F81FF | ||
208 | #define XCHAL_INTLEVEL3_ANDBELOW_MASK 0x003F8FFF | ||
209 | #define XCHAL_INTLEVEL4_ANDBELOW_MASK 0x003F9FFF | ||
210 | #define XCHAL_INTLEVEL5_ANDBELOW_MASK 0x003FBFFF | ||
211 | #define XCHAL_INTLEVEL6_ANDBELOW_MASK 0x003FBFFF | ||
212 | #define XCHAL_INTLEVEL7_ANDBELOW_MASK 0x003FFFFF | ||
213 | |||
214 | /* Level of each interrupt: */ | ||
215 | #define XCHAL_INT0_LEVEL 1 | ||
216 | #define XCHAL_INT1_LEVEL 1 | ||
217 | #define XCHAL_INT2_LEVEL 1 | ||
218 | #define XCHAL_INT3_LEVEL 1 | ||
219 | #define XCHAL_INT4_LEVEL 1 | ||
220 | #define XCHAL_INT5_LEVEL 1 | ||
221 | #define XCHAL_INT6_LEVEL 1 | ||
222 | #define XCHAL_INT7_LEVEL 1 | ||
223 | #define XCHAL_INT8_LEVEL 2 | ||
224 | #define XCHAL_INT9_LEVEL 3 | ||
225 | #define XCHAL_INT10_LEVEL 3 | ||
226 | #define XCHAL_INT11_LEVEL 3 | ||
227 | #define XCHAL_INT12_LEVEL 4 | ||
228 | #define XCHAL_INT13_LEVEL 5 | ||
229 | #define XCHAL_INT14_LEVEL 7 | ||
230 | #define XCHAL_INT15_LEVEL 1 | ||
231 | #define XCHAL_INT16_LEVEL 1 | ||
232 | #define XCHAL_INT17_LEVEL 1 | ||
233 | #define XCHAL_INT18_LEVEL 1 | ||
234 | #define XCHAL_INT19_LEVEL 1 | ||
235 | #define XCHAL_INT20_LEVEL 1 | ||
236 | #define XCHAL_INT21_LEVEL 3 | ||
237 | #define XCHAL_DEBUGLEVEL 6 /* debug interrupt level */ | ||
238 | #define XCHAL_HAVE_DEBUG_EXTERN_INT 1 /* OCD external db interrupt */ | ||
239 | #define XCHAL_NMILEVEL 7 /* NMI "level" (for use with | ||
240 | EXCSAVE/EPS/EPC_n, RFI n) */ | ||
241 | |||
242 | /* Type of each interrupt: */ | ||
243 | #define XCHAL_INT0_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
244 | #define XCHAL_INT1_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
245 | #define XCHAL_INT2_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
246 | #define XCHAL_INT3_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
247 | #define XCHAL_INT4_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
248 | #define XCHAL_INT5_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
249 | #define XCHAL_INT6_TYPE XTHAL_INTTYPE_TIMER | ||
250 | #define XCHAL_INT7_TYPE XTHAL_INTTYPE_SOFTWARE | ||
251 | #define XCHAL_INT8_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
252 | #define XCHAL_INT9_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
253 | #define XCHAL_INT10_TYPE XTHAL_INTTYPE_TIMER | ||
254 | #define XCHAL_INT11_TYPE XTHAL_INTTYPE_SOFTWARE | ||
255 | #define XCHAL_INT12_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
256 | #define XCHAL_INT13_TYPE XTHAL_INTTYPE_TIMER | ||
257 | #define XCHAL_INT14_TYPE XTHAL_INTTYPE_NMI | ||
258 | #define XCHAL_INT15_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
259 | #define XCHAL_INT16_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
260 | #define XCHAL_INT17_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
261 | #define XCHAL_INT18_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
262 | #define XCHAL_INT19_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
263 | #define XCHAL_INT20_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
264 | #define XCHAL_INT21_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
265 | |||
266 | /* Masks of interrupts for each type of interrupt: */ | ||
267 | #define XCHAL_INTTYPE_MASK_UNCONFIGURED 0xFFC00000 | ||
268 | #define XCHAL_INTTYPE_MASK_SOFTWARE 0x00000880 | ||
269 | #define XCHAL_INTTYPE_MASK_EXTERN_EDGE 0x003F8000 | ||
270 | #define XCHAL_INTTYPE_MASK_EXTERN_LEVEL 0x0000133F | ||
271 | #define XCHAL_INTTYPE_MASK_TIMER 0x00002440 | ||
272 | #define XCHAL_INTTYPE_MASK_NMI 0x00004000 | ||
273 | #define XCHAL_INTTYPE_MASK_WRITE_ERROR 0x00000000 | ||
274 | |||
275 | /* Interrupt numbers assigned to specific interrupt sources: */ | ||
276 | #define XCHAL_TIMER0_INTERRUPT 6 /* CCOMPARE0 */ | ||
277 | #define XCHAL_TIMER1_INTERRUPT 10 /* CCOMPARE1 */ | ||
278 | #define XCHAL_TIMER2_INTERRUPT 13 /* CCOMPARE2 */ | ||
279 | #define XCHAL_TIMER3_INTERRUPT XTHAL_TIMER_UNCONFIGURED | ||
280 | #define XCHAL_NMI_INTERRUPT 14 /* non-maskable interrupt */ | ||
281 | |||
282 | /* Interrupt numbers for levels at which only one interrupt is configured: */ | ||
283 | #define XCHAL_INTLEVEL2_NUM 8 | ||
284 | #define XCHAL_INTLEVEL4_NUM 12 | ||
285 | #define XCHAL_INTLEVEL5_NUM 13 | ||
286 | #define XCHAL_INTLEVEL7_NUM 14 | ||
287 | /* (There are many interrupts each at level(s) 1, 3.) */ | ||
288 | |||
289 | |||
290 | /* | ||
291 | * External interrupt vectors/levels. | ||
292 | * These macros describe how Xtensa processor interrupt numbers | ||
293 | * (as numbered internally, eg. in INTERRUPT and INTENABLE registers) | ||
294 | * map to external BInterrupt<n> pins, for those interrupts | ||
295 | * configured as external (level-triggered, edge-triggered, or NMI). | ||
296 | * See the Xtensa processor databook for more details. | ||
297 | */ | ||
298 | |||
299 | /* Core interrupt numbers mapped to each EXTERNAL interrupt number: */ | ||
300 | #define XCHAL_EXTINT0_NUM 0 /* (intlevel 1) */ | ||
301 | #define XCHAL_EXTINT1_NUM 1 /* (intlevel 1) */ | ||
302 | #define XCHAL_EXTINT2_NUM 2 /* (intlevel 1) */ | ||
303 | #define XCHAL_EXTINT3_NUM 3 /* (intlevel 1) */ | ||
304 | #define XCHAL_EXTINT4_NUM 4 /* (intlevel 1) */ | ||
305 | #define XCHAL_EXTINT5_NUM 5 /* (intlevel 1) */ | ||
306 | #define XCHAL_EXTINT6_NUM 8 /* (intlevel 2) */ | ||
307 | #define XCHAL_EXTINT7_NUM 9 /* (intlevel 3) */ | ||
308 | #define XCHAL_EXTINT8_NUM 12 /* (intlevel 4) */ | ||
309 | #define XCHAL_EXTINT9_NUM 14 /* (intlevel 7) */ | ||
310 | #define XCHAL_EXTINT10_NUM 15 /* (intlevel 1) */ | ||
311 | #define XCHAL_EXTINT11_NUM 16 /* (intlevel 1) */ | ||
312 | #define XCHAL_EXTINT12_NUM 17 /* (intlevel 1) */ | ||
313 | #define XCHAL_EXTINT13_NUM 18 /* (intlevel 1) */ | ||
314 | #define XCHAL_EXTINT14_NUM 19 /* (intlevel 1) */ | ||
315 | #define XCHAL_EXTINT15_NUM 20 /* (intlevel 1) */ | ||
316 | #define XCHAL_EXTINT16_NUM 21 /* (intlevel 3) */ | ||
317 | |||
318 | |||
319 | /*---------------------------------------------------------------------- | ||
320 | EXCEPTIONS and VECTORS | ||
321 | ----------------------------------------------------------------------*/ | ||
322 | |||
323 | #define XCHAL_XEA_VERSION 2 /* Xtensa Exception Architecture | ||
324 | number: 1 == XEA1 (old) | ||
325 | 2 == XEA2 (new) | ||
326 | 0 == XEAX (extern) */ | ||
327 | #define XCHAL_HAVE_XEA1 0 /* Exception Architecture 1 */ | ||
328 | #define XCHAL_HAVE_XEA2 1 /* Exception Architecture 2 */ | ||
329 | #define XCHAL_HAVE_XEAX 0 /* External Exception Arch. */ | ||
330 | #define XCHAL_HAVE_EXCEPTIONS 1 /* exception option */ | ||
331 | #define XCHAL_HAVE_MEM_ECC_PARITY 0 /* local memory ECC/parity */ | ||
332 | #define XCHAL_HAVE_VECTOR_SELECT 1 /* relocatable vectors */ | ||
333 | #define XCHAL_HAVE_VECBASE 1 /* relocatable vectors */ | ||
334 | #define XCHAL_VECBASE_RESET_VADDR 0xD0000000 /* VECBASE reset value */ | ||
335 | #define XCHAL_VECBASE_RESET_PADDR 0x00000000 | ||
336 | #define XCHAL_RESET_VECBASE_OVERLAP 0 | ||
337 | |||
338 | #define XCHAL_RESET_VECTOR0_VADDR 0xFE000000 | ||
339 | #define XCHAL_RESET_VECTOR0_PADDR 0xFE000000 | ||
340 | #define XCHAL_RESET_VECTOR1_VADDR 0xD8000500 | ||
341 | #define XCHAL_RESET_VECTOR1_PADDR 0x00000500 | ||
342 | #define XCHAL_RESET_VECTOR_VADDR 0xFE000000 | ||
343 | #define XCHAL_RESET_VECTOR_PADDR 0xFE000000 | ||
344 | #define XCHAL_USER_VECOFS 0x00000340 | ||
345 | #define XCHAL_USER_VECTOR_VADDR 0xD0000340 | ||
346 | #define XCHAL_USER_VECTOR_PADDR 0x00000340 | ||
347 | #define XCHAL_KERNEL_VECOFS 0x00000300 | ||
348 | #define XCHAL_KERNEL_VECTOR_VADDR 0xD0000300 | ||
349 | #define XCHAL_KERNEL_VECTOR_PADDR 0x00000300 | ||
350 | #define XCHAL_DOUBLEEXC_VECOFS 0x000003C0 | ||
351 | #define XCHAL_DOUBLEEXC_VECTOR_VADDR 0xD00003C0 | ||
352 | #define XCHAL_DOUBLEEXC_VECTOR_PADDR 0x000003C0 | ||
353 | #define XCHAL_WINDOW_OF4_VECOFS 0x00000000 | ||
354 | #define XCHAL_WINDOW_UF4_VECOFS 0x00000040 | ||
355 | #define XCHAL_WINDOW_OF8_VECOFS 0x00000080 | ||
356 | #define XCHAL_WINDOW_UF8_VECOFS 0x000000C0 | ||
357 | #define XCHAL_WINDOW_OF12_VECOFS 0x00000100 | ||
358 | #define XCHAL_WINDOW_UF12_VECOFS 0x00000140 | ||
359 | #define XCHAL_WINDOW_VECTORS_VADDR 0xD0000000 | ||
360 | #define XCHAL_WINDOW_VECTORS_PADDR 0x00000000 | ||
361 | #define XCHAL_INTLEVEL2_VECOFS 0x00000180 | ||
362 | #define XCHAL_INTLEVEL2_VECTOR_VADDR 0xD0000180 | ||
363 | #define XCHAL_INTLEVEL2_VECTOR_PADDR 0x00000180 | ||
364 | #define XCHAL_INTLEVEL3_VECOFS 0x000001C0 | ||
365 | #define XCHAL_INTLEVEL3_VECTOR_VADDR 0xD00001C0 | ||
366 | #define XCHAL_INTLEVEL3_VECTOR_PADDR 0x000001C0 | ||
367 | #define XCHAL_INTLEVEL4_VECOFS 0x00000200 | ||
368 | #define XCHAL_INTLEVEL4_VECTOR_VADDR 0xD0000200 | ||
369 | #define XCHAL_INTLEVEL4_VECTOR_PADDR 0x00000200 | ||
370 | #define XCHAL_INTLEVEL5_VECOFS 0x00000240 | ||
371 | #define XCHAL_INTLEVEL5_VECTOR_VADDR 0xD0000240 | ||
372 | #define XCHAL_INTLEVEL5_VECTOR_PADDR 0x00000240 | ||
373 | #define XCHAL_INTLEVEL6_VECOFS 0x00000280 | ||
374 | #define XCHAL_INTLEVEL6_VECTOR_VADDR 0xD0000280 | ||
375 | #define XCHAL_INTLEVEL6_VECTOR_PADDR 0x00000280 | ||
376 | #define XCHAL_DEBUG_VECOFS XCHAL_INTLEVEL6_VECOFS | ||
377 | #define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL6_VECTOR_VADDR | ||
378 | #define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL6_VECTOR_PADDR | ||
379 | #define XCHAL_NMI_VECOFS 0x000002C0 | ||
380 | #define XCHAL_NMI_VECTOR_VADDR 0xD00002C0 | ||
381 | #define XCHAL_NMI_VECTOR_PADDR 0x000002C0 | ||
382 | #define XCHAL_INTLEVEL7_VECOFS XCHAL_NMI_VECOFS | ||
383 | #define XCHAL_INTLEVEL7_VECTOR_VADDR XCHAL_NMI_VECTOR_VADDR | ||
384 | #define XCHAL_INTLEVEL7_VECTOR_PADDR XCHAL_NMI_VECTOR_PADDR | ||
385 | |||
386 | |||
387 | /*---------------------------------------------------------------------- | ||
388 | DEBUG | ||
389 | ----------------------------------------------------------------------*/ | ||
390 | |||
391 | #define XCHAL_HAVE_OCD 1 /* OnChipDebug option */ | ||
392 | #define XCHAL_NUM_IBREAK 2 /* number of IBREAKn regs */ | ||
393 | #define XCHAL_NUM_DBREAK 2 /* number of DBREAKn regs */ | ||
394 | #define XCHAL_HAVE_OCD_DIR_ARRAY 1 /* faster OCD option */ | ||
395 | |||
396 | |||
397 | /*---------------------------------------------------------------------- | ||
398 | MMU | ||
399 | ----------------------------------------------------------------------*/ | ||
400 | |||
401 | /* See core-matmap.h header file for more details. */ | ||
402 | |||
403 | #define XCHAL_HAVE_TLBS 1 /* inverse of HAVE_CACHEATTR */ | ||
404 | #define XCHAL_HAVE_SPANNING_WAY 0 /* one way maps I+D 4GB vaddr */ | ||
405 | #define XCHAL_HAVE_IDENTITY_MAP 0 /* vaddr == paddr always */ | ||
406 | #define XCHAL_HAVE_CACHEATTR 0 /* CACHEATTR register present */ | ||
407 | #define XCHAL_HAVE_MIMIC_CACHEATTR 0 /* region protection */ | ||
408 | #define XCHAL_HAVE_XLT_CACHEATTR 0 /* region prot. w/translation */ | ||
409 | #define XCHAL_HAVE_PTP_MMU 1 /* full MMU (with page table | ||
410 | [autorefill] and protection) | ||
411 | usable for an MMU-based OS */ | ||
412 | /* If none of the above last 4 are set, it's a custom TLB configuration. */ | ||
413 | #define XCHAL_ITLB_ARF_ENTRIES_LOG2 2 /* log2(autorefill way size) */ | ||
414 | #define XCHAL_DTLB_ARF_ENTRIES_LOG2 2 /* log2(autorefill way size) */ | ||
415 | |||
416 | #define XCHAL_MMU_ASID_BITS 8 /* number of bits in ASIDs */ | ||
417 | #define XCHAL_MMU_RINGS 4 /* number of rings (1..4) */ | ||
418 | #define XCHAL_MMU_RING_BITS 2 /* num of bits in RING field */ | ||
419 | |||
420 | #endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ | ||
421 | |||
422 | |||
423 | #endif /* _XTENSA_CORE_CONFIGURATION_H */ | ||
424 | |||
diff --git a/include/asm-xtensa/variant-dc232b/tie-asm.h b/include/asm-xtensa/variant-dc232b/tie-asm.h deleted file mode 100644 index ed4f53f529db..000000000000 --- a/include/asm-xtensa/variant-dc232b/tie-asm.h +++ /dev/null | |||
@@ -1,122 +0,0 @@ | |||
1 | /* | ||
2 | * This header file contains assembly-language definitions (assembly | ||
3 | * macros, etc.) for this specific Xtensa processor's TIE extensions | ||
4 | * and options. It is customized to this Xtensa processor configuration. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 1999-2007 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_CORE_TIE_ASM_H | ||
14 | #define _XTENSA_CORE_TIE_ASM_H | ||
15 | |||
16 | /* Selection parameter values for save-area save/restore macros: */ | ||
17 | /* Option vs. TIE: */ | ||
18 | #define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ | ||
19 | #define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ | ||
20 | /* Whether used automatically by compiler: */ | ||
21 | #define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ | ||
22 | #define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ | ||
23 | /* ABI handling across function calls: */ | ||
24 | #define XTHAL_SAS_CALR 0x0010 /* caller-saved */ | ||
25 | #define XTHAL_SAS_CALE 0x0020 /* callee-saved */ | ||
26 | #define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ | ||
27 | /* Misc */ | ||
28 | #define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ | ||
29 | |||
30 | |||
31 | |||
32 | /* Macro to save all non-coprocessor (extra) custom TIE and optional state | ||
33 | * (not including zero-overhead loop registers). | ||
34 | * Save area ptr (clobbered): ptr (1 byte aligned) | ||
35 | * Scratch regs (clobbered): at1..at4 (only first XCHAL_NCP_NUM_ATMPS needed) | ||
36 | */ | ||
37 | .macro xchal_ncp_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL | ||
38 | xchal_sa_start \continue, \ofs | ||
39 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~\select | ||
40 | xchal_sa_align \ptr, 0, 1024-8, 4, 4 | ||
41 | rsr \at1, ACCLO // MAC16 accumulator | ||
42 | rsr \at2, ACCHI | ||
43 | s32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
44 | s32i \at2, \ptr, .Lxchal_ofs_ + 4 | ||
45 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 | ||
46 | .endif | ||
47 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~\select | ||
48 | xchal_sa_align \ptr, 0, 1024-16, 4, 4 | ||
49 | rsr \at1, M0 // MAC16 registers | ||
50 | rsr \at2, M1 | ||
51 | s32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
52 | s32i \at2, \ptr, .Lxchal_ofs_ + 4 | ||
53 | rsr \at1, M2 | ||
54 | rsr \at2, M3 | ||
55 | s32i \at1, \ptr, .Lxchal_ofs_ + 8 | ||
56 | s32i \at2, \ptr, .Lxchal_ofs_ + 12 | ||
57 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 16 | ||
58 | .endif | ||
59 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~\select | ||
60 | xchal_sa_align \ptr, 0, 1024-4, 4, 4 | ||
61 | rsr \at1, SCOMPARE1 // conditional store option | ||
62 | s32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
63 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 | ||
64 | .endif | ||
65 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~\select | ||
66 | xchal_sa_align \ptr, 0, 1024-4, 4, 4 | ||
67 | rur \at1, THREADPTR // threadptr option | ||
68 | s32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
69 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 | ||
70 | .endif | ||
71 | .endm // xchal_ncp_store | ||
72 | |||
73 | /* Macro to save all non-coprocessor (extra) custom TIE and optional state | ||
74 | * (not including zero-overhead loop registers). | ||
75 | * Save area ptr (clobbered): ptr (1 byte aligned) | ||
76 | * Scratch regs (clobbered): at1..at4 (only first XCHAL_NCP_NUM_ATMPS needed) | ||
77 | */ | ||
78 | .macro xchal_ncp_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL | ||
79 | xchal_sa_start \continue, \ofs | ||
80 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_CALR) & ~\select | ||
81 | xchal_sa_align \ptr, 0, 1024-8, 4, 4 | ||
82 | l32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
83 | l32i \at2, \ptr, .Lxchal_ofs_ + 4 | ||
84 | wsr \at1, ACCLO // MAC16 accumulator | ||
85 | wsr \at2, ACCHI | ||
86 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 8 | ||
87 | .endif | ||
88 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~\select | ||
89 | xchal_sa_align \ptr, 0, 1024-16, 4, 4 | ||
90 | l32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
91 | l32i \at2, \ptr, .Lxchal_ofs_ + 4 | ||
92 | wsr \at1, M0 // MAC16 registers | ||
93 | wsr \at2, M1 | ||
94 | l32i \at1, \ptr, .Lxchal_ofs_ + 8 | ||
95 | l32i \at2, \ptr, .Lxchal_ofs_ + 12 | ||
96 | wsr \at1, M2 | ||
97 | wsr \at2, M3 | ||
98 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 16 | ||
99 | .endif | ||
100 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_NOCC | XTHAL_SAS_CALR) & ~\select | ||
101 | xchal_sa_align \ptr, 0, 1024-4, 4, 4 | ||
102 | l32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
103 | wsr \at1, SCOMPARE1 // conditional store option | ||
104 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 | ||
105 | .endif | ||
106 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~\select | ||
107 | xchal_sa_align \ptr, 0, 1024-4, 4, 4 | ||
108 | l32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
109 | wur \at1, THREADPTR // threadptr option | ||
110 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 | ||
111 | .endif | ||
112 | .endm // xchal_ncp_load | ||
113 | |||
114 | |||
115 | |||
116 | #define XCHAL_NCP_NUM_ATMPS 2 | ||
117 | |||
118 | |||
119 | #define XCHAL_SA_NUM_ATMPS 2 | ||
120 | |||
121 | #endif /*_XTENSA_CORE_TIE_ASM_H*/ | ||
122 | |||
diff --git a/include/asm-xtensa/variant-dc232b/tie.h b/include/asm-xtensa/variant-dc232b/tie.h deleted file mode 100644 index 018e81af4393..000000000000 --- a/include/asm-xtensa/variant-dc232b/tie.h +++ /dev/null | |||
@@ -1,131 +0,0 @@ | |||
1 | /* | ||
2 | * This header file describes this specific Xtensa processor's TIE extensions | ||
3 | * that extend basic Xtensa core functionality. It is customized to this | ||
4 | * Xtensa processor configuration. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 1999-2007 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_CORE_TIE_H | ||
14 | #define _XTENSA_CORE_TIE_H | ||
15 | |||
16 | #define XCHAL_CP_NUM 1 /* number of coprocessors */ | ||
17 | #define XCHAL_CP_MAX 8 /* max CP ID + 1 (0 if none) */ | ||
18 | #define XCHAL_CP_MASK 0x80 /* bitmask of all CPs by ID */ | ||
19 | #define XCHAL_CP_PORT_MASK 0x80 /* bitmask of only port CPs */ | ||
20 | |||
21 | /* Basic parameters of each coprocessor: */ | ||
22 | #define XCHAL_CP7_NAME "XTIOP" | ||
23 | #define XCHAL_CP7_IDENT XTIOP | ||
24 | #define XCHAL_CP7_SA_SIZE 0 /* size of state save area */ | ||
25 | #define XCHAL_CP7_SA_ALIGN 1 /* min alignment of save area */ | ||
26 | #define XCHAL_CP_ID_XTIOP 7 /* coprocessor ID (0..7) */ | ||
27 | |||
28 | /* Filler info for unassigned coprocessors, to simplify arrays etc: */ | ||
29 | #define XCHAL_CP0_SA_SIZE 0 | ||
30 | #define XCHAL_CP0_SA_ALIGN 1 | ||
31 | #define XCHAL_CP1_SA_SIZE 0 | ||
32 | #define XCHAL_CP1_SA_ALIGN 1 | ||
33 | #define XCHAL_CP2_SA_SIZE 0 | ||
34 | #define XCHAL_CP2_SA_ALIGN 1 | ||
35 | #define XCHAL_CP3_SA_SIZE 0 | ||
36 | #define XCHAL_CP3_SA_ALIGN 1 | ||
37 | #define XCHAL_CP4_SA_SIZE 0 | ||
38 | #define XCHAL_CP4_SA_ALIGN 1 | ||
39 | #define XCHAL_CP5_SA_SIZE 0 | ||
40 | #define XCHAL_CP5_SA_ALIGN 1 | ||
41 | #define XCHAL_CP6_SA_SIZE 0 | ||
42 | #define XCHAL_CP6_SA_ALIGN 1 | ||
43 | |||
44 | /* Save area for non-coprocessor optional and custom (TIE) state: */ | ||
45 | #define XCHAL_NCP_SA_SIZE 32 | ||
46 | #define XCHAL_NCP_SA_ALIGN 4 | ||
47 | |||
48 | /* Total save area for optional and custom state (NCP + CPn): */ | ||
49 | #define XCHAL_TOTAL_SA_SIZE 32 /* with 16-byte align padding */ | ||
50 | #define XCHAL_TOTAL_SA_ALIGN 4 /* actual minimum alignment */ | ||
51 | |||
52 | /* | ||
53 | * Detailed contents of save areas. | ||
54 | * NOTE: caller must define the XCHAL_SA_REG macro (not defined here) | ||
55 | * before expanding the XCHAL_xxx_SA_LIST() macros. | ||
56 | * | ||
57 | * XCHAL_SA_REG(s,ccused,abikind,kind,opt,name,galign,align,asize, | ||
58 | * dbnum,base,regnum,bitsz,gapsz,reset,x...) | ||
59 | * | ||
60 | * s = passed from XCHAL_*_LIST(s), eg. to select how to expand | ||
61 | * ccused = set if used by compiler without special options or code | ||
62 | * abikind = 0 (caller-saved), 1 (callee-saved), or 2 (thread-global) | ||
63 | * kind = 0 (special reg), 1 (TIE user reg), or 2 (TIE regfile reg) | ||
64 | * opt = 0 (custom TIE extension or coprocessor), or 1 (optional reg) | ||
65 | * name = lowercase reg name (no quotes) | ||
66 | * galign = group byte alignment (power of 2) (galign >= align) | ||
67 | * align = register byte alignment (power of 2) | ||
68 | * asize = allocated size in bytes (asize*8 == bitsz + gapsz + padsz) | ||
69 | * (not including any pad bytes required to galign this or next reg) | ||
70 | * dbnum = unique target number f/debug (see <xtensa-libdb-macros.h>) | ||
71 | * base = reg shortname w/o index (or sr=special, ur=TIE user reg) | ||
72 | * regnum = reg index in regfile, or special/TIE-user reg number | ||
73 | * bitsz = number of significant bits (regfile width, or ur/sr mask bits) | ||
74 | * gapsz = intervening bits, if bitsz bits not stored contiguously | ||
75 | * (padsz = pad bits at end [TIE regfile] or at msbits [ur,sr] of asize) | ||
76 | * reset = register reset value (or 0 if undefined at reset) | ||
77 | * x = reserved for future use (0 until then) | ||
78 | * | ||
79 | * To filter out certain registers, e.g. to expand only the non-global | ||
80 | * registers used by the compiler, you can do something like this: | ||
81 | * | ||
82 | * #define XCHAL_SA_REG(s,ccused,p...) SELCC##ccused(p) | ||
83 | * #define SELCC0(p...) | ||
84 | * #define SELCC1(abikind,p...) SELAK##abikind(p) | ||
85 | * #define SELAK0(p...) REG(p) | ||
86 | * #define SELAK1(p...) REG(p) | ||
87 | * #define SELAK2(p...) | ||
88 | * #define REG(kind,tie,name,galn,aln,asz,csz,dbnum,base,rnum,bsz,rst,x...) \ | ||
89 | * ...what you want to expand... | ||
90 | */ | ||
91 | |||
92 | #define XCHAL_NCP_SA_NUM 8 | ||
93 | #define XCHAL_NCP_SA_LIST(s) \ | ||
94 | XCHAL_SA_REG(s,1,0,0,1, acclo, 4, 4, 4,0x0210, sr,16 , 32,0,0,0) \ | ||
95 | XCHAL_SA_REG(s,1,0,0,1, acchi, 4, 4, 4,0x0211, sr,17 , 8,0,0,0) \ | ||
96 | XCHAL_SA_REG(s,0,0,0,1, m0, 4, 4, 4,0x0220, sr,32 , 32,0,0,0) \ | ||
97 | XCHAL_SA_REG(s,0,0,0,1, m1, 4, 4, 4,0x0221, sr,33 , 32,0,0,0) \ | ||
98 | XCHAL_SA_REG(s,0,0,0,1, m2, 4, 4, 4,0x0222, sr,34 , 32,0,0,0) \ | ||
99 | XCHAL_SA_REG(s,0,0,0,1, m3, 4, 4, 4,0x0223, sr,35 , 32,0,0,0) \ | ||
100 | XCHAL_SA_REG(s,0,0,0,1, scompare1, 4, 4, 4,0x020C, sr,12 , 32,0,0,0) \ | ||
101 | XCHAL_SA_REG(s,1,2,1,1, threadptr, 4, 4, 4,0x03E7, ur,231, 32,0,0,0) | ||
102 | |||
103 | #define XCHAL_CP0_SA_NUM 0 | ||
104 | #define XCHAL_CP0_SA_LIST(s) /* empty */ | ||
105 | |||
106 | #define XCHAL_CP1_SA_NUM 0 | ||
107 | #define XCHAL_CP1_SA_LIST(s) /* empty */ | ||
108 | |||
109 | #define XCHAL_CP2_SA_NUM 0 | ||
110 | #define XCHAL_CP2_SA_LIST(s) /* empty */ | ||
111 | |||
112 | #define XCHAL_CP3_SA_NUM 0 | ||
113 | #define XCHAL_CP3_SA_LIST(s) /* empty */ | ||
114 | |||
115 | #define XCHAL_CP4_SA_NUM 0 | ||
116 | #define XCHAL_CP4_SA_LIST(s) /* empty */ | ||
117 | |||
118 | #define XCHAL_CP5_SA_NUM 0 | ||
119 | #define XCHAL_CP5_SA_LIST(s) /* empty */ | ||
120 | |||
121 | #define XCHAL_CP6_SA_NUM 0 | ||
122 | #define XCHAL_CP6_SA_LIST(s) /* empty */ | ||
123 | |||
124 | #define XCHAL_CP7_SA_NUM 0 | ||
125 | #define XCHAL_CP7_SA_LIST(s) /* empty */ | ||
126 | |||
127 | /* Byte length of instruction from its first nibble (op0 field), per FLIX. */ | ||
128 | #define XCHAL_OP0_FORMAT_LENGTHS 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3 | ||
129 | |||
130 | #endif /*_XTENSA_CORE_TIE_H*/ | ||
131 | |||
diff --git a/include/asm-xtensa/variant-fsf/core.h b/include/asm-xtensa/variant-fsf/core.h deleted file mode 100644 index 2f337605c744..000000000000 --- a/include/asm-xtensa/variant-fsf/core.h +++ /dev/null | |||
@@ -1,359 +0,0 @@ | |||
1 | /* | ||
2 | * Xtensa processor core configuration information. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 1999-2006 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_CORE_H | ||
12 | #define _XTENSA_CORE_H | ||
13 | |||
14 | |||
15 | /**************************************************************************** | ||
16 | Parameters Useful for Any Code, USER or PRIVILEGED | ||
17 | ****************************************************************************/ | ||
18 | |||
19 | /* | ||
20 | * Note: Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is | ||
21 | * configured, and a value of 0 otherwise. These macros are always defined. | ||
22 | */ | ||
23 | |||
24 | |||
25 | /*---------------------------------------------------------------------- | ||
26 | ISA | ||
27 | ----------------------------------------------------------------------*/ | ||
28 | |||
29 | #define XCHAL_HAVE_BE 1 /* big-endian byte ordering */ | ||
30 | #define XCHAL_HAVE_WINDOWED 1 /* windowed registers option */ | ||
31 | #define XCHAL_NUM_AREGS 64 /* num of physical addr regs */ | ||
32 | #define XCHAL_NUM_AREGS_LOG2 6 /* log2(XCHAL_NUM_AREGS) */ | ||
33 | #define XCHAL_MAX_INSTRUCTION_SIZE 3 /* max instr bytes (3..8) */ | ||
34 | #define XCHAL_HAVE_DEBUG 1 /* debug option */ | ||
35 | #define XCHAL_HAVE_DENSITY 1 /* 16-bit instructions */ | ||
36 | #define XCHAL_HAVE_LOOPS 1 /* zero-overhead loops */ | ||
37 | #define XCHAL_HAVE_NSA 1 /* NSA/NSAU instructions */ | ||
38 | #define XCHAL_HAVE_MINMAX 0 /* MIN/MAX instructions */ | ||
39 | #define XCHAL_HAVE_SEXT 0 /* SEXT instruction */ | ||
40 | #define XCHAL_HAVE_CLAMPS 0 /* CLAMPS instruction */ | ||
41 | #define XCHAL_HAVE_MUL16 0 /* MUL16S/MUL16U instructions */ | ||
42 | #define XCHAL_HAVE_MUL32 0 /* MULL instruction */ | ||
43 | #define XCHAL_HAVE_MUL32_HIGH 0 /* MULUH/MULSH instructions */ | ||
44 | #define XCHAL_HAVE_L32R 1 /* L32R instruction */ | ||
45 | #define XCHAL_HAVE_ABSOLUTE_LITERALS 1 /* non-PC-rel (extended) L32R */ | ||
46 | #define XCHAL_HAVE_CONST16 0 /* CONST16 instruction */ | ||
47 | #define XCHAL_HAVE_ADDX 1 /* ADDX#/SUBX# instructions */ | ||
48 | #define XCHAL_HAVE_WIDE_BRANCHES 0 /* B*.W18 or B*.W15 instr's */ | ||
49 | #define XCHAL_HAVE_PREDICTED_BRANCHES 0 /* B[EQ/EQZ/NE/NEZ]T instr's */ | ||
50 | #define XCHAL_HAVE_CALL4AND12 1 /* (obsolete option) */ | ||
51 | #define XCHAL_HAVE_ABS 1 /* ABS instruction */ | ||
52 | /*#define XCHAL_HAVE_POPC 0*/ /* POPC instruction */ | ||
53 | /*#define XCHAL_HAVE_CRC 0*/ /* CRC instruction */ | ||
54 | #define XCHAL_HAVE_RELEASE_SYNC 0 /* L32AI/S32RI instructions */ | ||
55 | #define XCHAL_HAVE_S32C1I 0 /* S32C1I instruction */ | ||
56 | #define XCHAL_HAVE_SPECULATION 0 /* speculation */ | ||
57 | #define XCHAL_HAVE_FULL_RESET 1 /* all regs/state reset */ | ||
58 | #define XCHAL_NUM_CONTEXTS 1 /* */ | ||
59 | #define XCHAL_NUM_MISC_REGS 2 /* num of scratch regs (0..4) */ | ||
60 | #define XCHAL_HAVE_TAP_MASTER 0 /* JTAG TAP control instr's */ | ||
61 | #define XCHAL_HAVE_PRID 1 /* processor ID register */ | ||
62 | #define XCHAL_HAVE_THREADPTR 1 /* THREADPTR register */ | ||
63 | #define XCHAL_HAVE_BOOLEANS 0 /* boolean registers */ | ||
64 | #define XCHAL_HAVE_CP 0 /* CPENABLE reg (coprocessor) */ | ||
65 | #define XCHAL_CP_MAXCFG 0 /* max allowed cp id plus one */ | ||
66 | #define XCHAL_HAVE_MAC16 0 /* MAC16 package */ | ||
67 | #define XCHAL_HAVE_VECTORFPU2005 0 /* vector floating-point pkg */ | ||
68 | #define XCHAL_HAVE_FP 0 /* floating point pkg */ | ||
69 | #define XCHAL_HAVE_VECTRA1 0 /* Vectra I pkg */ | ||
70 | #define XCHAL_HAVE_VECTRALX 0 /* Vectra LX pkg */ | ||
71 | #define XCHAL_HAVE_HIFI2 0 /* HiFi2 Audio Engine pkg */ | ||
72 | |||
73 | |||
74 | /*---------------------------------------------------------------------- | ||
75 | MISC | ||
76 | ----------------------------------------------------------------------*/ | ||
77 | |||
78 | #define XCHAL_NUM_WRITEBUFFER_ENTRIES 4 /* size of write buffer */ | ||
79 | #define XCHAL_INST_FETCH_WIDTH 4 /* instr-fetch width in bytes */ | ||
80 | #define XCHAL_DATA_WIDTH 4 /* data width in bytes */ | ||
81 | /* In T1050, applies to selected core load and store instructions (see ISA): */ | ||
82 | #define XCHAL_UNALIGNED_LOAD_EXCEPTION 1 /* unaligned loads cause exc. */ | ||
83 | #define XCHAL_UNALIGNED_STORE_EXCEPTION 1 /* unaligned stores cause exc.*/ | ||
84 | |||
85 | #define XCHAL_CORE_ID "fsf" /* alphanum core name | ||
86 | (CoreID) set in the Xtensa | ||
87 | Processor Generator */ | ||
88 | |||
89 | #define XCHAL_BUILD_UNIQUE_ID 0x00006700 /* 22-bit sw build ID */ | ||
90 | |||
91 | /* | ||
92 | * These definitions describe the hardware targeted by this software. | ||
93 | */ | ||
94 | #define XCHAL_HW_CONFIGID0 0xC103C3FF /* ConfigID hi 32 bits*/ | ||
95 | #define XCHAL_HW_CONFIGID1 0x0C006700 /* ConfigID lo 32 bits*/ | ||
96 | #define XCHAL_HW_VERSION_NAME "LX2.0.0" /* full version name */ | ||
97 | #define XCHAL_HW_VERSION_MAJOR 2200 /* major ver# of targeted hw */ | ||
98 | #define XCHAL_HW_VERSION_MINOR 0 /* minor ver# of targeted hw */ | ||
99 | #define XTHAL_HW_REL_LX2 1 | ||
100 | #define XTHAL_HW_REL_LX2_0 1 | ||
101 | #define XTHAL_HW_REL_LX2_0_0 1 | ||
102 | #define XCHAL_HW_CONFIGID_RELIABLE 1 | ||
103 | /* If software targets a *range* of hardware versions, these are the bounds: */ | ||
104 | #define XCHAL_HW_MIN_VERSION_MAJOR 2200 /* major v of earliest tgt hw */ | ||
105 | #define XCHAL_HW_MIN_VERSION_MINOR 0 /* minor v of earliest tgt hw */ | ||
106 | #define XCHAL_HW_MAX_VERSION_MAJOR 2200 /* major v of latest tgt hw */ | ||
107 | #define XCHAL_HW_MAX_VERSION_MINOR 0 /* minor v of latest tgt hw */ | ||
108 | |||
109 | |||
110 | /*---------------------------------------------------------------------- | ||
111 | CACHE | ||
112 | ----------------------------------------------------------------------*/ | ||
113 | |||
114 | #define XCHAL_ICACHE_LINESIZE 16 /* I-cache line size in bytes */ | ||
115 | #define XCHAL_DCACHE_LINESIZE 16 /* D-cache line size in bytes */ | ||
116 | #define XCHAL_ICACHE_LINEWIDTH 4 /* log2(I line size in bytes) */ | ||
117 | #define XCHAL_DCACHE_LINEWIDTH 4 /* log2(D line size in bytes) */ | ||
118 | |||
119 | #define XCHAL_ICACHE_SIZE 8192 /* I-cache size in bytes or 0 */ | ||
120 | #define XCHAL_DCACHE_SIZE 8192 /* D-cache size in bytes or 0 */ | ||
121 | |||
122 | #define XCHAL_DCACHE_IS_WRITEBACK 0 /* writeback feature */ | ||
123 | |||
124 | |||
125 | |||
126 | |||
127 | /**************************************************************************** | ||
128 | Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code | ||
129 | ****************************************************************************/ | ||
130 | |||
131 | |||
132 | #ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY | ||
133 | |||
134 | /*---------------------------------------------------------------------- | ||
135 | CACHE | ||
136 | ----------------------------------------------------------------------*/ | ||
137 | |||
138 | #define XCHAL_HAVE_PIF 1 /* any outbound PIF present */ | ||
139 | |||
140 | /* If present, cache size in bytes == (ways * 2^(linewidth + setwidth)). */ | ||
141 | |||
142 | /* Number of cache sets in log2(lines per way): */ | ||
143 | #define XCHAL_ICACHE_SETWIDTH 8 | ||
144 | #define XCHAL_DCACHE_SETWIDTH 8 | ||
145 | |||
146 | /* Cache set associativity (number of ways): */ | ||
147 | #define XCHAL_ICACHE_WAYS 2 | ||
148 | #define XCHAL_DCACHE_WAYS 2 | ||
149 | |||
150 | /* Cache features: */ | ||
151 | #define XCHAL_ICACHE_LINE_LOCKABLE 0 | ||
152 | #define XCHAL_DCACHE_LINE_LOCKABLE 0 | ||
153 | #define XCHAL_ICACHE_ECC_PARITY 0 | ||
154 | #define XCHAL_DCACHE_ECC_PARITY 0 | ||
155 | |||
156 | /* Number of encoded cache attr bits (see <xtensa/hal.h> for decoded bits): */ | ||
157 | #define XCHAL_CA_BITS 4 | ||
158 | |||
159 | |||
160 | /*---------------------------------------------------------------------- | ||
161 | INTERNAL I/D RAM/ROMs and XLMI | ||
162 | ----------------------------------------------------------------------*/ | ||
163 | |||
164 | #define XCHAL_NUM_INSTROM 0 /* number of core instr. ROMs */ | ||
165 | #define XCHAL_NUM_INSTRAM 0 /* number of core instr. RAMs */ | ||
166 | #define XCHAL_NUM_DATAROM 0 /* number of core data ROMs */ | ||
167 | #define XCHAL_NUM_DATARAM 0 /* number of core data RAMs */ | ||
168 | #define XCHAL_NUM_URAM 0 /* number of core unified RAMs*/ | ||
169 | #define XCHAL_NUM_XLMI 0 /* number of core XLMI ports */ | ||
170 | |||
171 | |||
172 | /*---------------------------------------------------------------------- | ||
173 | INTERRUPTS and TIMERS | ||
174 | ----------------------------------------------------------------------*/ | ||
175 | |||
176 | #define XCHAL_HAVE_INTERRUPTS 1 /* interrupt option */ | ||
177 | #define XCHAL_HAVE_HIGHPRI_INTERRUPTS 1 /* med/high-pri. interrupts */ | ||
178 | #define XCHAL_HAVE_NMI 0 /* non-maskable interrupt */ | ||
179 | #define XCHAL_HAVE_CCOUNT 1 /* CCOUNT reg. (timer option) */ | ||
180 | #define XCHAL_NUM_TIMERS 3 /* number of CCOMPAREn regs */ | ||
181 | #define XCHAL_NUM_INTERRUPTS 17 /* number of interrupts */ | ||
182 | #define XCHAL_NUM_INTERRUPTS_LOG2 5 /* ceil(log2(NUM_INTERRUPTS)) */ | ||
183 | #define XCHAL_NUM_EXTINTERRUPTS 10 /* num of external interrupts */ | ||
184 | #define XCHAL_NUM_INTLEVELS 4 /* number of interrupt levels | ||
185 | (not including level zero) */ | ||
186 | #define XCHAL_EXCM_LEVEL 1 /* level masked by PS.EXCM */ | ||
187 | /* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */ | ||
188 | |||
189 | /* Masks of interrupts at each interrupt level: */ | ||
190 | #define XCHAL_INTLEVEL1_MASK 0x000064F9 | ||
191 | #define XCHAL_INTLEVEL2_MASK 0x00008902 | ||
192 | #define XCHAL_INTLEVEL3_MASK 0x00011204 | ||
193 | #define XCHAL_INTLEVEL4_MASK 0x00000000 | ||
194 | #define XCHAL_INTLEVEL5_MASK 0x00000000 | ||
195 | #define XCHAL_INTLEVEL6_MASK 0x00000000 | ||
196 | #define XCHAL_INTLEVEL7_MASK 0x00000000 | ||
197 | |||
198 | /* Masks of interrupts at each range 1..n of interrupt levels: */ | ||
199 | #define XCHAL_INTLEVEL1_ANDBELOW_MASK 0x000064F9 | ||
200 | #define XCHAL_INTLEVEL2_ANDBELOW_MASK 0x0000EDFB | ||
201 | #define XCHAL_INTLEVEL3_ANDBELOW_MASK 0x0001FFFF | ||
202 | #define XCHAL_INTLEVEL4_ANDBELOW_MASK 0x0001FFFF | ||
203 | #define XCHAL_INTLEVEL5_ANDBELOW_MASK 0x0001FFFF | ||
204 | #define XCHAL_INTLEVEL6_ANDBELOW_MASK 0x0001FFFF | ||
205 | #define XCHAL_INTLEVEL7_ANDBELOW_MASK 0x0001FFFF | ||
206 | |||
207 | /* Level of each interrupt: */ | ||
208 | #define XCHAL_INT0_LEVEL 1 | ||
209 | #define XCHAL_INT1_LEVEL 2 | ||
210 | #define XCHAL_INT2_LEVEL 3 | ||
211 | #define XCHAL_INT3_LEVEL 1 | ||
212 | #define XCHAL_INT4_LEVEL 1 | ||
213 | #define XCHAL_INT5_LEVEL 1 | ||
214 | #define XCHAL_INT6_LEVEL 1 | ||
215 | #define XCHAL_INT7_LEVEL 1 | ||
216 | #define XCHAL_INT8_LEVEL 2 | ||
217 | #define XCHAL_INT9_LEVEL 3 | ||
218 | #define XCHAL_INT10_LEVEL 1 | ||
219 | #define XCHAL_INT11_LEVEL 2 | ||
220 | #define XCHAL_INT12_LEVEL 3 | ||
221 | #define XCHAL_INT13_LEVEL 1 | ||
222 | #define XCHAL_INT14_LEVEL 1 | ||
223 | #define XCHAL_INT15_LEVEL 2 | ||
224 | #define XCHAL_INT16_LEVEL 3 | ||
225 | #define XCHAL_DEBUGLEVEL 4 /* debug interrupt level */ | ||
226 | #define XCHAL_HAVE_DEBUG_EXTERN_INT 0 /* OCD external db interrupt */ | ||
227 | |||
228 | /* Type of each interrupt: */ | ||
229 | #define XCHAL_INT0_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
230 | #define XCHAL_INT1_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
231 | #define XCHAL_INT2_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
232 | #define XCHAL_INT3_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
233 | #define XCHAL_INT4_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
234 | #define XCHAL_INT5_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
235 | #define XCHAL_INT6_TYPE XTHAL_INTTYPE_EXTERN_LEVEL | ||
236 | #define XCHAL_INT7_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
237 | #define XCHAL_INT8_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
238 | #define XCHAL_INT9_TYPE XTHAL_INTTYPE_EXTERN_EDGE | ||
239 | #define XCHAL_INT10_TYPE XTHAL_INTTYPE_TIMER | ||
240 | #define XCHAL_INT11_TYPE XTHAL_INTTYPE_TIMER | ||
241 | #define XCHAL_INT12_TYPE XTHAL_INTTYPE_TIMER | ||
242 | #define XCHAL_INT13_TYPE XTHAL_INTTYPE_SOFTWARE | ||
243 | #define XCHAL_INT14_TYPE XTHAL_INTTYPE_SOFTWARE | ||
244 | #define XCHAL_INT15_TYPE XTHAL_INTTYPE_SOFTWARE | ||
245 | #define XCHAL_INT16_TYPE XTHAL_INTTYPE_SOFTWARE | ||
246 | |||
247 | /* Masks of interrupts for each type of interrupt: */ | ||
248 | #define XCHAL_INTTYPE_MASK_UNCONFIGURED 0xFFFE0000 | ||
249 | #define XCHAL_INTTYPE_MASK_SOFTWARE 0x0001E000 | ||
250 | #define XCHAL_INTTYPE_MASK_EXTERN_EDGE 0x00000380 | ||
251 | #define XCHAL_INTTYPE_MASK_EXTERN_LEVEL 0x0000007F | ||
252 | #define XCHAL_INTTYPE_MASK_TIMER 0x00001C00 | ||
253 | #define XCHAL_INTTYPE_MASK_NMI 0x00000000 | ||
254 | #define XCHAL_INTTYPE_MASK_WRITE_ERROR 0x00000000 | ||
255 | |||
256 | /* Interrupt numbers assigned to specific interrupt sources: */ | ||
257 | #define XCHAL_TIMER0_INTERRUPT 10 /* CCOMPARE0 */ | ||
258 | #define XCHAL_TIMER1_INTERRUPT 11 /* CCOMPARE1 */ | ||
259 | #define XCHAL_TIMER2_INTERRUPT 12 /* CCOMPARE2 */ | ||
260 | #define XCHAL_TIMER3_INTERRUPT XTHAL_TIMER_UNCONFIGURED | ||
261 | |||
262 | /* Interrupt numbers for levels at which only one interrupt is configured: */ | ||
263 | /* (There are many interrupts each at level(s) 1, 2, 3.) */ | ||
264 | |||
265 | |||
266 | /* | ||
267 | * External interrupt vectors/levels. | ||
268 | * These macros describe how Xtensa processor interrupt numbers | ||
269 | * (as numbered internally, eg. in INTERRUPT and INTENABLE registers) | ||
270 | * map to external BInterrupt<n> pins, for those interrupts | ||
271 | * configured as external (level-triggered, edge-triggered, or NMI). | ||
272 | * See the Xtensa processor databook for more details. | ||
273 | */ | ||
274 | |||
275 | /* Core interrupt numbers mapped to each EXTERNAL interrupt number: */ | ||
276 | #define XCHAL_EXTINT0_NUM 0 /* (intlevel 1) */ | ||
277 | #define XCHAL_EXTINT1_NUM 1 /* (intlevel 2) */ | ||
278 | #define XCHAL_EXTINT2_NUM 2 /* (intlevel 3) */ | ||
279 | #define XCHAL_EXTINT3_NUM 3 /* (intlevel 1) */ | ||
280 | #define XCHAL_EXTINT4_NUM 4 /* (intlevel 1) */ | ||
281 | #define XCHAL_EXTINT5_NUM 5 /* (intlevel 1) */ | ||
282 | #define XCHAL_EXTINT6_NUM 6 /* (intlevel 1) */ | ||
283 | #define XCHAL_EXTINT7_NUM 7 /* (intlevel 1) */ | ||
284 | #define XCHAL_EXTINT8_NUM 8 /* (intlevel 2) */ | ||
285 | #define XCHAL_EXTINT9_NUM 9 /* (intlevel 3) */ | ||
286 | |||
287 | |||
288 | /*---------------------------------------------------------------------- | ||
289 | EXCEPTIONS and VECTORS | ||
290 | ----------------------------------------------------------------------*/ | ||
291 | |||
292 | #define XCHAL_XEA_VERSION 2 /* Xtensa Exception Architecture | ||
293 | number: 1 == XEA1 (old) | ||
294 | 2 == XEA2 (new) | ||
295 | 0 == XEAX (extern) */ | ||
296 | #define XCHAL_HAVE_XEA1 0 /* Exception Architecture 1 */ | ||
297 | #define XCHAL_HAVE_XEA2 1 /* Exception Architecture 2 */ | ||
298 | #define XCHAL_HAVE_XEAX 0 /* External Exception Arch. */ | ||
299 | #define XCHAL_HAVE_EXCEPTIONS 1 /* exception option */ | ||
300 | #define XCHAL_HAVE_MEM_ECC_PARITY 0 /* local memory ECC/parity */ | ||
301 | |||
302 | #define XCHAL_RESET_VECTOR_VADDR 0xFE000020 | ||
303 | #define XCHAL_RESET_VECTOR_PADDR 0xFE000020 | ||
304 | #define XCHAL_USER_VECTOR_VADDR 0xD0000220 | ||
305 | #define XCHAL_USER_VECTOR_PADDR 0x00000220 | ||
306 | #define XCHAL_KERNEL_VECTOR_VADDR 0xD0000200 | ||
307 | #define XCHAL_KERNEL_VECTOR_PADDR 0x00000200 | ||
308 | #define XCHAL_DOUBLEEXC_VECTOR_VADDR 0xD0000290 | ||
309 | #define XCHAL_DOUBLEEXC_VECTOR_PADDR 0x00000290 | ||
310 | #define XCHAL_WINDOW_VECTORS_VADDR 0xD0000000 | ||
311 | #define XCHAL_WINDOW_VECTORS_PADDR 0x00000000 | ||
312 | #define XCHAL_INTLEVEL2_VECTOR_VADDR 0xD0000240 | ||
313 | #define XCHAL_INTLEVEL2_VECTOR_PADDR 0x00000240 | ||
314 | #define XCHAL_INTLEVEL3_VECTOR_VADDR 0xD0000250 | ||
315 | #define XCHAL_INTLEVEL3_VECTOR_PADDR 0x00000250 | ||
316 | #define XCHAL_INTLEVEL4_VECTOR_VADDR 0xFE000520 | ||
317 | #define XCHAL_INTLEVEL4_VECTOR_PADDR 0xFE000520 | ||
318 | #define XCHAL_DEBUG_VECTOR_VADDR XCHAL_INTLEVEL4_VECTOR_VADDR | ||
319 | #define XCHAL_DEBUG_VECTOR_PADDR XCHAL_INTLEVEL4_VECTOR_PADDR | ||
320 | |||
321 | |||
322 | /*---------------------------------------------------------------------- | ||
323 | DEBUG | ||
324 | ----------------------------------------------------------------------*/ | ||
325 | |||
326 | #define XCHAL_HAVE_OCD 1 /* OnChipDebug option */ | ||
327 | #define XCHAL_NUM_IBREAK 2 /* number of IBREAKn regs */ | ||
328 | #define XCHAL_NUM_DBREAK 2 /* number of DBREAKn regs */ | ||
329 | #define XCHAL_HAVE_OCD_DIR_ARRAY 1 /* faster OCD option */ | ||
330 | |||
331 | |||
332 | /*---------------------------------------------------------------------- | ||
333 | MMU | ||
334 | ----------------------------------------------------------------------*/ | ||
335 | |||
336 | /* See <xtensa/config/core-matmap.h> header file for more details. */ | ||
337 | |||
338 | #define XCHAL_HAVE_TLBS 1 /* inverse of HAVE_CACHEATTR */ | ||
339 | #define XCHAL_HAVE_SPANNING_WAY 0 /* one way maps I+D 4GB vaddr */ | ||
340 | #define XCHAL_HAVE_IDENTITY_MAP 0 /* vaddr == paddr always */ | ||
341 | #define XCHAL_HAVE_CACHEATTR 0 /* CACHEATTR register present */ | ||
342 | #define XCHAL_HAVE_MIMIC_CACHEATTR 0 /* region protection */ | ||
343 | #define XCHAL_HAVE_XLT_CACHEATTR 0 /* region prot. w/translation */ | ||
344 | #define XCHAL_HAVE_PTP_MMU 1 /* full MMU (with page table | ||
345 | [autorefill] and protection) | ||
346 | usable for an MMU-based OS */ | ||
347 | /* If none of the above last 4 are set, it's a custom TLB configuration. */ | ||
348 | #define XCHAL_ITLB_ARF_ENTRIES_LOG2 2 /* log2(autorefill way size) */ | ||
349 | #define XCHAL_DTLB_ARF_ENTRIES_LOG2 2 /* log2(autorefill way size) */ | ||
350 | |||
351 | #define XCHAL_MMU_ASID_BITS 8 /* number of bits in ASIDs */ | ||
352 | #define XCHAL_MMU_RINGS 4 /* number of rings (1..4) */ | ||
353 | #define XCHAL_MMU_RING_BITS 2 /* num of bits in RING field */ | ||
354 | |||
355 | #endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */ | ||
356 | |||
357 | |||
358 | #endif /* _XTENSA_CORE_CONFIGURATION_H */ | ||
359 | |||
diff --git a/include/asm-xtensa/variant-fsf/tie-asm.h b/include/asm-xtensa/variant-fsf/tie-asm.h deleted file mode 100644 index 68a73bf4ffc5..000000000000 --- a/include/asm-xtensa/variant-fsf/tie-asm.h +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | /* | ||
2 | * This header file contains assembly-language definitions (assembly | ||
3 | * macros, etc.) for this specific Xtensa processor's TIE extensions | ||
4 | * and options. It is customized to this Xtensa processor configuration. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 1999-2008 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_CORE_TIE_ASM_H | ||
14 | #define _XTENSA_CORE_TIE_ASM_H | ||
15 | |||
16 | /* Selection parameter values for save-area save/restore macros: */ | ||
17 | /* Option vs. TIE: */ | ||
18 | #define XTHAL_SAS_TIE 0x0001 /* custom extension or coprocessor */ | ||
19 | #define XTHAL_SAS_OPT 0x0002 /* optional (and not a coprocessor) */ | ||
20 | /* Whether used automatically by compiler: */ | ||
21 | #define XTHAL_SAS_NOCC 0x0004 /* not used by compiler w/o special opts/code */ | ||
22 | #define XTHAL_SAS_CC 0x0008 /* used by compiler without special opts/code */ | ||
23 | /* ABI handling across function calls: */ | ||
24 | #define XTHAL_SAS_CALR 0x0010 /* caller-saved */ | ||
25 | #define XTHAL_SAS_CALE 0x0020 /* callee-saved */ | ||
26 | #define XTHAL_SAS_GLOB 0x0040 /* global across function calls (in thread) */ | ||
27 | /* Misc */ | ||
28 | #define XTHAL_SAS_ALL 0xFFFF /* include all default NCP contents */ | ||
29 | |||
30 | |||
31 | |||
32 | /* Macro to save all non-coprocessor (extra) custom TIE and optional state | ||
33 | * (not including zero-overhead loop registers). | ||
34 | * Save area ptr (clobbered): ptr (1 byte aligned) | ||
35 | * Scratch regs (clobbered): at1..at4 (only first XCHAL_NCP_NUM_ATMPS needed) | ||
36 | */ | ||
37 | .macro xchal_ncp_store ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL | ||
38 | xchal_sa_start \continue, \ofs | ||
39 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~\select | ||
40 | xchal_sa_align \ptr, 0, 1024-4, 4, 4 | ||
41 | rur \at1, THREADPTR // threadptr option | ||
42 | s32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
43 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 | ||
44 | .endif | ||
45 | .endm // xchal_ncp_store | ||
46 | |||
47 | /* Macro to save all non-coprocessor (extra) custom TIE and optional state | ||
48 | * (not including zero-overhead loop registers). | ||
49 | * Save area ptr (clobbered): ptr (1 byte aligned) | ||
50 | * Scratch regs (clobbered): at1..at4 (only first XCHAL_NCP_NUM_ATMPS needed) | ||
51 | */ | ||
52 | .macro xchal_ncp_load ptr at1 at2 at3 at4 continue=0 ofs=-1 select=XTHAL_SAS_ALL | ||
53 | xchal_sa_start \continue, \ofs | ||
54 | .ifeq (XTHAL_SAS_OPT | XTHAL_SAS_CC | XTHAL_SAS_GLOB) & ~\select | ||
55 | xchal_sa_align \ptr, 0, 1024-4, 4, 4 | ||
56 | l32i \at1, \ptr, .Lxchal_ofs_ + 0 | ||
57 | wur \at1, THREADPTR // threadptr option | ||
58 | .set .Lxchal_ofs_, .Lxchal_ofs_ + 4 | ||
59 | .endif | ||
60 | .endm // xchal_ncp_load | ||
61 | |||
62 | |||
63 | |||
64 | #define XCHAL_NCP_NUM_ATMPS 1 | ||
65 | |||
66 | |||
67 | #define XCHAL_SA_NUM_ATMPS 1 | ||
68 | |||
69 | #endif /*_XTENSA_CORE_TIE_ASM_H*/ | ||
70 | |||
diff --git a/include/asm-xtensa/variant-fsf/tie.h b/include/asm-xtensa/variant-fsf/tie.h deleted file mode 100644 index bf4020116df5..000000000000 --- a/include/asm-xtensa/variant-fsf/tie.h +++ /dev/null | |||
@@ -1,77 +0,0 @@ | |||
1 | /* | ||
2 | * This header file describes this specific Xtensa processor's TIE extensions | ||
3 | * that extend basic Xtensa core functionality. It is customized to this | ||
4 | * Xtensa processor configuration. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | * | ||
10 | * Copyright (C) 1999-2007 Tensilica Inc. | ||
11 | */ | ||
12 | |||
13 | #ifndef _XTENSA_CORE_TIE_H | ||
14 | #define _XTENSA_CORE_TIE_H | ||
15 | |||
16 | #define XCHAL_CP_NUM 0 /* number of coprocessors */ | ||
17 | #define XCHAL_CP_MAX 0 /* max CP ID + 1 (0 if none) */ | ||
18 | #define XCHAL_CP_MASK 0x00 /* bitmask of all CPs by ID */ | ||
19 | #define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ | ||
20 | |||
21 | /* Basic parameters of each coprocessor: */ | ||
22 | #define XCHAL_CP7_NAME "XTIOP" | ||
23 | #define XCHAL_CP7_IDENT XTIOP | ||
24 | #define XCHAL_CP7_SA_SIZE 0 /* size of state save area */ | ||
25 | #define XCHAL_CP7_SA_ALIGN 1 /* min alignment of save area */ | ||
26 | #define XCHAL_CP_ID_XTIOP 7 /* coprocessor ID (0..7) */ | ||
27 | |||
28 | /* Filler info for unassigned coprocessors, to simplify arrays etc: */ | ||
29 | #define XCHAL_NCP_SA_SIZE 0 | ||
30 | #define XCHAL_NCP_SA_ALIGN 1 | ||
31 | #define XCHAL_CP0_SA_SIZE 0 | ||
32 | #define XCHAL_CP0_SA_ALIGN 1 | ||
33 | #define XCHAL_CP1_SA_SIZE 0 | ||
34 | #define XCHAL_CP1_SA_ALIGN 1 | ||
35 | #define XCHAL_CP2_SA_SIZE 0 | ||
36 | #define XCHAL_CP2_SA_ALIGN 1 | ||
37 | #define XCHAL_CP3_SA_SIZE 0 | ||
38 | #define XCHAL_CP3_SA_ALIGN 1 | ||
39 | #define XCHAL_CP4_SA_SIZE 0 | ||
40 | #define XCHAL_CP4_SA_ALIGN 1 | ||
41 | #define XCHAL_CP5_SA_SIZE 0 | ||
42 | #define XCHAL_CP5_SA_ALIGN 1 | ||
43 | #define XCHAL_CP6_SA_SIZE 0 | ||
44 | #define XCHAL_CP6_SA_ALIGN 1 | ||
45 | |||
46 | /* Save area for non-coprocessor optional and custom (TIE) state: */ | ||
47 | #define XCHAL_NCP_SA_SIZE 0 | ||
48 | #define XCHAL_NCP_SA_ALIGN 1 | ||
49 | |||
50 | /* Total save area for optional and custom state (NCP + CPn): */ | ||
51 | #define XCHAL_TOTAL_SA_SIZE 0 /* with 16-byte align padding */ | ||
52 | #define XCHAL_TOTAL_SA_ALIGN 1 /* actual minimum alignment */ | ||
53 | |||
54 | #define XCHAL_NCP_SA_NUM 0 | ||
55 | #define XCHAL_NCP_SA_LIST(s) | ||
56 | #define XCHAL_CP0_SA_NUM 0 | ||
57 | #define XCHAL_CP0_SA_LIST(s) | ||
58 | #define XCHAL_CP1_SA_NUM 0 | ||
59 | #define XCHAL_CP1_SA_LIST(s) | ||
60 | #define XCHAL_CP2_SA_NUM 0 | ||
61 | #define XCHAL_CP2_SA_LIST(s) | ||
62 | #define XCHAL_CP3_SA_NUM 0 | ||
63 | #define XCHAL_CP3_SA_LIST(s) | ||
64 | #define XCHAL_CP4_SA_NUM 0 | ||
65 | #define XCHAL_CP4_SA_LIST(s) | ||
66 | #define XCHAL_CP5_SA_NUM 0 | ||
67 | #define XCHAL_CP5_SA_LIST(s) | ||
68 | #define XCHAL_CP6_SA_NUM 0 | ||
69 | #define XCHAL_CP6_SA_LIST(s) | ||
70 | #define XCHAL_CP7_SA_NUM 0 | ||
71 | #define XCHAL_CP7_SA_LIST(s) | ||
72 | |||
73 | /* Byte length of instruction from its first nibble (op0 field), per FLIX. */ | ||
74 | #define XCHAL_OP0_FORMAT_LENGTHS 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,3 | ||
75 | |||
76 | #endif /*_XTENSA_CORE_TIE_H*/ | ||
77 | |||
diff --git a/include/asm-xtensa/vga.h b/include/asm-xtensa/vga.h deleted file mode 100644 index 1fd8cab3a297..000000000000 --- a/include/asm-xtensa/vga.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/vga.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_VGA_H | ||
12 | #define _XTENSA_VGA_H | ||
13 | |||
14 | #define VGA_MAP_MEM(x,s) (unsigned long)phys_to_virt(x) | ||
15 | |||
16 | #define vga_readb(x) (*(x)) | ||
17 | #define vga_writeb(x,y) (*(y) = (x)) | ||
18 | |||
19 | #endif | ||
diff --git a/include/asm-xtensa/xor.h b/include/asm-xtensa/xor.h deleted file mode 100644 index e7b1f083991d..000000000000 --- a/include/asm-xtensa/xor.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/xor.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_XOR_H | ||
12 | #define _XTENSA_XOR_H | ||
13 | |||
14 | #include <asm-generic/xor.h> | ||
15 | |||
16 | #endif | ||
diff --git a/include/drm/Kbuild b/include/drm/Kbuild index 82b6983b7fbb..b940fdfa3b25 100644 --- a/include/drm/Kbuild +++ b/include/drm/Kbuild | |||
@@ -1,4 +1,4 @@ | |||
1 | unifdef-y += drm.h drm_sarea.h | 1 | unifdef-y += drm.h drm_sarea.h drm_mode.h |
2 | unifdef-y += i810_drm.h | 2 | unifdef-y += i810_drm.h |
3 | unifdef-y += i830_drm.h | 3 | unifdef-y += i830_drm.h |
4 | unifdef-y += i915_drm.h | 4 | unifdef-y += i915_drm.h |
diff --git a/include/drm/drm.h b/include/drm/drm.h index f46ba4b57da4..32e5096554e9 100644 --- a/include/drm/drm.h +++ b/include/drm/drm.h | |||
@@ -173,6 +173,7 @@ enum drm_map_type { | |||
173 | _DRM_AGP = 3, /**< AGP/GART */ | 173 | _DRM_AGP = 3, /**< AGP/GART */ |
174 | _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ | 174 | _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ |
175 | _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ | 175 | _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ |
176 | _DRM_GEM = 6, /**< GEM object */ | ||
176 | }; | 177 | }; |
177 | 178 | ||
178 | /** | 179 | /** |
@@ -598,6 +599,8 @@ struct drm_gem_open { | |||
598 | uint64_t size; | 599 | uint64_t size; |
599 | }; | 600 | }; |
600 | 601 | ||
602 | #include "drm_mode.h" | ||
603 | |||
601 | #define DRM_IOCTL_BASE 'd' | 604 | #define DRM_IOCTL_BASE 'd' |
602 | #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) | 605 | #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) |
603 | #define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) | 606 | #define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) |
@@ -634,6 +637,9 @@ struct drm_gem_open { | |||
634 | #define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map) | 637 | #define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map) |
635 | #define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map) | 638 | #define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map) |
636 | 639 | ||
640 | #define DRM_IOCTL_SET_MASTER DRM_IO(0x1e) | ||
641 | #define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f) | ||
642 | |||
637 | #define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx) | 643 | #define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx) |
638 | #define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx) | 644 | #define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx) |
639 | #define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx) | 645 | #define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx) |
@@ -664,6 +670,24 @@ struct drm_gem_open { | |||
664 | 670 | ||
665 | #define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw) | 671 | #define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw) |
666 | 672 | ||
673 | #define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res) | ||
674 | #define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc) | ||
675 | #define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc) | ||
676 | #define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor) | ||
677 | #define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut) | ||
678 | #define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut) | ||
679 | #define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder) | ||
680 | #define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector) | ||
681 | #define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) | ||
682 | #define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) | ||
683 | |||
684 | #define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property) | ||
685 | #define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property) | ||
686 | #define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob) | ||
687 | #define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd) | ||
688 | #define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd) | ||
689 | #define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int) | ||
690 | |||
667 | /** | 691 | /** |
668 | * Device specific ioctls should only be in their respective headers | 692 | * Device specific ioctls should only be in their respective headers |
669 | * The device specific ioctl range is from 0x40 to 0x99. | 693 | * The device specific ioctl range is from 0x40 to 0x99. |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index d5e8e5c89548..afb7858c068d 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -105,6 +105,7 @@ struct drm_device; | |||
105 | #define DRIVER_FB_DMA 0x400 | 105 | #define DRIVER_FB_DMA 0x400 |
106 | #define DRIVER_IRQ_VBL2 0x800 | 106 | #define DRIVER_IRQ_VBL2 0x800 |
107 | #define DRIVER_GEM 0x1000 | 107 | #define DRIVER_GEM 0x1000 |
108 | #define DRIVER_MODESET 0x2000 | ||
108 | 109 | ||
109 | /***********************************************************************/ | 110 | /***********************************************************************/ |
110 | /** \name Begin the DRM... */ | 111 | /** \name Begin the DRM... */ |
@@ -238,11 +239,11 @@ struct drm_device; | |||
238 | */ | 239 | */ |
239 | #define LOCK_TEST_WITH_RETURN( dev, file_priv ) \ | 240 | #define LOCK_TEST_WITH_RETURN( dev, file_priv ) \ |
240 | do { \ | 241 | do { \ |
241 | if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ | 242 | if (!_DRM_LOCK_IS_HELD(file_priv->master->lock.hw_lock->lock) || \ |
242 | dev->lock.file_priv != file_priv ) { \ | 243 | file_priv->master->lock.file_priv != file_priv) { \ |
243 | DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\ | 244 | DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\ |
244 | __func__, _DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ),\ | 245 | __func__, _DRM_LOCK_IS_HELD(file_priv->master->lock.hw_lock->lock),\ |
245 | dev->lock.file_priv, file_priv ); \ | 246 | file_priv->master->lock.file_priv, file_priv); \ |
246 | return -EINVAL; \ | 247 | return -EINVAL; \ |
247 | } \ | 248 | } \ |
248 | } while (0) | 249 | } while (0) |
@@ -276,6 +277,7 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, | |||
276 | #define DRM_AUTH 0x1 | 277 | #define DRM_AUTH 0x1 |
277 | #define DRM_MASTER 0x2 | 278 | #define DRM_MASTER 0x2 |
278 | #define DRM_ROOT_ONLY 0x4 | 279 | #define DRM_ROOT_ONLY 0x4 |
280 | #define DRM_CONTROL_ALLOW 0x8 | ||
279 | 281 | ||
280 | struct drm_ioctl_desc { | 282 | struct drm_ioctl_desc { |
281 | unsigned int cmd; | 283 | unsigned int cmd; |
@@ -379,21 +381,26 @@ struct drm_buf_entry { | |||
379 | /** File private data */ | 381 | /** File private data */ |
380 | struct drm_file { | 382 | struct drm_file { |
381 | int authenticated; | 383 | int authenticated; |
382 | int master; | ||
383 | pid_t pid; | 384 | pid_t pid; |
384 | uid_t uid; | 385 | uid_t uid; |
385 | drm_magic_t magic; | 386 | drm_magic_t magic; |
386 | unsigned long ioctl_count; | 387 | unsigned long ioctl_count; |
387 | struct list_head lhead; | 388 | struct list_head lhead; |
388 | struct drm_minor *minor; | 389 | struct drm_minor *minor; |
389 | int remove_auth_on_close; | ||
390 | unsigned long lock_count; | 390 | unsigned long lock_count; |
391 | |||
391 | /** Mapping of mm object handles to object pointers. */ | 392 | /** Mapping of mm object handles to object pointers. */ |
392 | struct idr object_idr; | 393 | struct idr object_idr; |
393 | /** Lock for synchronization of access to object_idr. */ | 394 | /** Lock for synchronization of access to object_idr. */ |
394 | spinlock_t table_lock; | 395 | spinlock_t table_lock; |
396 | |||
395 | struct file *filp; | 397 | struct file *filp; |
396 | void *driver_priv; | 398 | void *driver_priv; |
399 | |||
400 | int is_master; /* this file private is a master for a minor */ | ||
401 | struct drm_master *master; /* master this node is currently associated with | ||
402 | N.B. not always minor->master */ | ||
403 | struct list_head fbs; | ||
397 | }; | 404 | }; |
398 | 405 | ||
399 | /** Wait queue */ | 406 | /** Wait queue */ |
@@ -523,6 +530,8 @@ struct drm_map_list { | |||
523 | struct drm_hash_item hash; | 530 | struct drm_hash_item hash; |
524 | struct drm_map *map; /**< mapping */ | 531 | struct drm_map *map; /**< mapping */ |
525 | uint64_t user_token; | 532 | uint64_t user_token; |
533 | struct drm_master *master; | ||
534 | struct drm_mm_node *file_offset_node; /**< fake offset */ | ||
526 | }; | 535 | }; |
527 | 536 | ||
528 | typedef struct drm_map drm_local_map_t; | 537 | typedef struct drm_map drm_local_map_t; |
@@ -563,6 +572,14 @@ struct drm_ati_pcigart_info { | |||
563 | }; | 572 | }; |
564 | 573 | ||
565 | /** | 574 | /** |
575 | * GEM specific mm private for tracking GEM objects | ||
576 | */ | ||
577 | struct drm_gem_mm { | ||
578 | struct drm_mm offset_manager; /**< Offset mgmt for buffer objects */ | ||
579 | struct drm_open_hash offset_hash; /**< User token hash table for maps */ | ||
580 | }; | ||
581 | |||
582 | /** | ||
566 | * This structure defines the drm_mm memory object, which will be used by the | 583 | * This structure defines the drm_mm memory object, which will be used by the |
567 | * DRM for its buffer objects. | 584 | * DRM for its buffer objects. |
568 | */ | 585 | */ |
@@ -579,6 +596,9 @@ struct drm_gem_object { | |||
579 | /** File representing the shmem storage */ | 596 | /** File representing the shmem storage */ |
580 | struct file *filp; | 597 | struct file *filp; |
581 | 598 | ||
599 | /* Mapping info for this object */ | ||
600 | struct drm_map_list map_list; | ||
601 | |||
582 | /** | 602 | /** |
583 | * Size of the object, in bytes. Immutable over the object's | 603 | * Size of the object, in bytes. Immutable over the object's |
584 | * lifetime. | 604 | * lifetime. |
@@ -612,6 +632,33 @@ struct drm_gem_object { | |||
612 | void *driver_private; | 632 | void *driver_private; |
613 | }; | 633 | }; |
614 | 634 | ||
635 | #include "drm_crtc.h" | ||
636 | |||
637 | /* per-master structure */ | ||
638 | struct drm_master { | ||
639 | |||
640 | struct kref refcount; /* refcount for this master */ | ||
641 | |||
642 | struct list_head head; /**< each minor contains a list of masters */ | ||
643 | struct drm_minor *minor; /**< link back to minor we are a master for */ | ||
644 | |||
645 | char *unique; /**< Unique identifier: e.g., busid */ | ||
646 | int unique_len; /**< Length of unique field */ | ||
647 | int unique_size; /**< amount allocated */ | ||
648 | |||
649 | int blocked; /**< Blocked due to VC switch? */ | ||
650 | |||
651 | /** \name Authentication */ | ||
652 | /*@{ */ | ||
653 | struct drm_open_hash magiclist; | ||
654 | struct list_head magicfree; | ||
655 | /*@} */ | ||
656 | |||
657 | struct drm_lock_data lock; /**< Information on hardware lock */ | ||
658 | |||
659 | void *driver_priv; /**< Private structure for driver to use */ | ||
660 | }; | ||
661 | |||
615 | /** | 662 | /** |
616 | * DRM driver structure. This structure represent the common code for | 663 | * DRM driver structure. This structure represent the common code for |
617 | * a family of cards. There will one drm_device for each card present | 664 | * a family of cards. There will one drm_device for each card present |
@@ -712,6 +759,10 @@ struct drm_driver { | |||
712 | void (*set_version) (struct drm_device *dev, | 759 | void (*set_version) (struct drm_device *dev, |
713 | struct drm_set_version *sv); | 760 | struct drm_set_version *sv); |
714 | 761 | ||
762 | /* Master routines */ | ||
763 | int (*master_create)(struct drm_device *dev, struct drm_master *master); | ||
764 | void (*master_destroy)(struct drm_device *dev, struct drm_master *master); | ||
765 | |||
715 | int (*proc_init)(struct drm_minor *minor); | 766 | int (*proc_init)(struct drm_minor *minor); |
716 | void (*proc_cleanup)(struct drm_minor *minor); | 767 | void (*proc_cleanup)(struct drm_minor *minor); |
717 | 768 | ||
@@ -724,6 +775,9 @@ struct drm_driver { | |||
724 | int (*gem_init_object) (struct drm_gem_object *obj); | 775 | int (*gem_init_object) (struct drm_gem_object *obj); |
725 | void (*gem_free_object) (struct drm_gem_object *obj); | 776 | void (*gem_free_object) (struct drm_gem_object *obj); |
726 | 777 | ||
778 | /* Driver private ops for this object */ | ||
779 | struct vm_operations_struct *gem_vm_ops; | ||
780 | |||
727 | int major; | 781 | int major; |
728 | int minor; | 782 | int minor; |
729 | int patchlevel; | 783 | int patchlevel; |
@@ -737,10 +791,14 @@ struct drm_driver { | |||
737 | int num_ioctls; | 791 | int num_ioctls; |
738 | struct file_operations fops; | 792 | struct file_operations fops; |
739 | struct pci_driver pci_driver; | 793 | struct pci_driver pci_driver; |
794 | /* List of devices hanging off this driver */ | ||
795 | struct list_head device_list; | ||
740 | }; | 796 | }; |
741 | 797 | ||
742 | #define DRM_MINOR_UNASSIGNED 0 | 798 | #define DRM_MINOR_UNASSIGNED 0 |
743 | #define DRM_MINOR_LEGACY 1 | 799 | #define DRM_MINOR_LEGACY 1 |
800 | #define DRM_MINOR_CONTROL 2 | ||
801 | #define DRM_MINOR_RENDER 3 | ||
744 | 802 | ||
745 | /** | 803 | /** |
746 | * DRM minor structure. This structure represents a drm minor number. | 804 | * DRM minor structure. This structure represents a drm minor number. |
@@ -752,6 +810,9 @@ struct drm_minor { | |||
752 | struct device kdev; /**< Linux device */ | 810 | struct device kdev; /**< Linux device */ |
753 | struct drm_device *dev; | 811 | struct drm_device *dev; |
754 | struct proc_dir_entry *dev_root; /**< proc directory entry */ | 812 | struct proc_dir_entry *dev_root; /**< proc directory entry */ |
813 | struct drm_master *master; /* currently active master for this node */ | ||
814 | struct list_head master_list; | ||
815 | struct drm_mode_group mode_group; | ||
755 | }; | 816 | }; |
756 | 817 | ||
757 | /** | 818 | /** |
@@ -759,13 +820,10 @@ struct drm_minor { | |||
759 | * may contain multiple heads. | 820 | * may contain multiple heads. |
760 | */ | 821 | */ |
761 | struct drm_device { | 822 | struct drm_device { |
762 | char *unique; /**< Unique identifier: e.g., busid */ | 823 | struct list_head driver_item; /**< list of devices per driver */ |
763 | int unique_len; /**< Length of unique field */ | ||
764 | char *devname; /**< For /proc/interrupts */ | 824 | char *devname; /**< For /proc/interrupts */ |
765 | int if_version; /**< Highest interface version set */ | 825 | int if_version; /**< Highest interface version set */ |
766 | 826 | ||
767 | int blocked; /**< Blocked due to VC switch? */ | ||
768 | |||
769 | /** \name Locks */ | 827 | /** \name Locks */ |
770 | /*@{ */ | 828 | /*@{ */ |
771 | spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ | 829 | spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ |
@@ -788,12 +846,7 @@ struct drm_device { | |||
788 | atomic_t counts[15]; | 846 | atomic_t counts[15]; |
789 | /*@} */ | 847 | /*@} */ |
790 | 848 | ||
791 | /** \name Authentication */ | ||
792 | /*@{ */ | ||
793 | struct list_head filelist; | 849 | struct list_head filelist; |
794 | struct drm_open_hash magiclist; /**< magic hash table */ | ||
795 | struct list_head magicfree; | ||
796 | /*@} */ | ||
797 | 850 | ||
798 | /** \name Memory management */ | 851 | /** \name Memory management */ |
799 | /*@{ */ | 852 | /*@{ */ |
@@ -810,7 +863,7 @@ struct drm_device { | |||
810 | struct idr ctx_idr; | 863 | struct idr ctx_idr; |
811 | 864 | ||
812 | struct list_head vmalist; /**< List of vmas (for debugging) */ | 865 | struct list_head vmalist; /**< List of vmas (for debugging) */ |
813 | struct drm_lock_data lock; /**< Information on hardware lock */ | 866 | |
814 | /*@} */ | 867 | /*@} */ |
815 | 868 | ||
816 | /** \name DMA queues (contexts) */ | 869 | /** \name DMA queues (contexts) */ |
@@ -858,6 +911,7 @@ struct drm_device { | |||
858 | int *vblank_enabled; /* so we don't call enable more than | 911 | int *vblank_enabled; /* so we don't call enable more than |
859 | once per disable */ | 912 | once per disable */ |
860 | int *vblank_inmodeset; /* Display driver is setting mode */ | 913 | int *vblank_inmodeset; /* Display driver is setting mode */ |
914 | u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ | ||
861 | struct timer_list vblank_disable_timer; | 915 | struct timer_list vblank_disable_timer; |
862 | 916 | ||
863 | u32 max_vblank_count; /**< size of vblank counter register */ | 917 | u32 max_vblank_count; /**< size of vblank counter register */ |
@@ -881,12 +935,15 @@ struct drm_device { | |||
881 | struct drm_sg_mem *sg; /**< Scatter gather memory */ | 935 | struct drm_sg_mem *sg; /**< Scatter gather memory */ |
882 | int num_crtcs; /**< Number of CRTCs on this device */ | 936 | int num_crtcs; /**< Number of CRTCs on this device */ |
883 | void *dev_private; /**< device private data */ | 937 | void *dev_private; /**< device private data */ |
938 | void *mm_private; | ||
939 | struct address_space *dev_mapping; | ||
884 | struct drm_sigdata sigdata; /**< For block_all_signals */ | 940 | struct drm_sigdata sigdata; /**< For block_all_signals */ |
885 | sigset_t sigmask; | 941 | sigset_t sigmask; |
886 | 942 | ||
887 | struct drm_driver *driver; | 943 | struct drm_driver *driver; |
888 | drm_local_map_t *agp_buffer_map; | 944 | drm_local_map_t *agp_buffer_map; |
889 | unsigned int agp_buffer_token; | 945 | unsigned int agp_buffer_token; |
946 | struct drm_minor *control; /**< Control node for card */ | ||
890 | struct drm_minor *primary; /**< render type primary screen head */ | 947 | struct drm_minor *primary; /**< render type primary screen head */ |
891 | 948 | ||
892 | /** \name Drawable information */ | 949 | /** \name Drawable information */ |
@@ -895,6 +952,8 @@ struct drm_device { | |||
895 | struct idr drw_idr; | 952 | struct idr drw_idr; |
896 | /*@} */ | 953 | /*@} */ |
897 | 954 | ||
955 | struct drm_mode_config mode_config; /**< Current mode config */ | ||
956 | |||
898 | /** \name GEM information */ | 957 | /** \name GEM information */ |
899 | /*@{ */ | 958 | /*@{ */ |
900 | spinlock_t object_name_lock; | 959 | spinlock_t object_name_lock; |
@@ -997,6 +1056,8 @@ extern int drm_release(struct inode *inode, struct file *filp); | |||
997 | 1056 | ||
998 | /* Mapping support (drm_vm.h) */ | 1057 | /* Mapping support (drm_vm.h) */ |
999 | extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); | 1058 | extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); |
1059 | extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); | ||
1060 | extern void drm_vm_open_locked(struct vm_area_struct *vma); | ||
1000 | extern unsigned long drm_core_get_map_ofs(struct drm_map * map); | 1061 | extern unsigned long drm_core_get_map_ofs(struct drm_map * map); |
1001 | extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); | 1062 | extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); |
1002 | extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); | 1063 | extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); |
@@ -1153,6 +1214,8 @@ extern int drm_vblank_get(struct drm_device *dev, int crtc); | |||
1153 | extern void drm_vblank_put(struct drm_device *dev, int crtc); | 1214 | extern void drm_vblank_put(struct drm_device *dev, int crtc); |
1154 | extern void drm_vblank_cleanup(struct drm_device *dev); | 1215 | extern void drm_vblank_cleanup(struct drm_device *dev); |
1155 | /* Modesetting support */ | 1216 | /* Modesetting support */ |
1217 | extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); | ||
1218 | extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc); | ||
1156 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, | 1219 | extern int drm_modeset_ctl(struct drm_device *dev, void *data, |
1157 | struct drm_file *file_priv); | 1220 | struct drm_file *file_priv); |
1158 | 1221 | ||
@@ -1189,6 +1252,13 @@ extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle); | |||
1189 | extern void drm_agp_chipset_flush(struct drm_device *dev); | 1252 | extern void drm_agp_chipset_flush(struct drm_device *dev); |
1190 | 1253 | ||
1191 | /* Stub support (drm_stub.h) */ | 1254 | /* Stub support (drm_stub.h) */ |
1255 | extern int drm_setmaster_ioctl(struct drm_device *dev, void *data, | ||
1256 | struct drm_file *file_priv); | ||
1257 | extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data, | ||
1258 | struct drm_file *file_priv); | ||
1259 | struct drm_master *drm_master_create(struct drm_minor *minor); | ||
1260 | extern struct drm_master *drm_master_get(struct drm_master *master); | ||
1261 | extern void drm_master_put(struct drm_master **master); | ||
1192 | extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | 1262 | extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, |
1193 | struct drm_driver *driver); | 1263 | struct drm_driver *driver); |
1194 | extern int drm_put_dev(struct drm_device *dev); | 1264 | extern int drm_put_dev(struct drm_device *dev); |
@@ -1231,7 +1301,11 @@ struct drm_sysfs_class; | |||
1231 | extern struct class *drm_sysfs_create(struct module *owner, char *name); | 1301 | extern struct class *drm_sysfs_create(struct module *owner, char *name); |
1232 | extern void drm_sysfs_destroy(void); | 1302 | extern void drm_sysfs_destroy(void); |
1233 | extern int drm_sysfs_device_add(struct drm_minor *minor); | 1303 | extern int drm_sysfs_device_add(struct drm_minor *minor); |
1304 | extern void drm_sysfs_hotplug_event(struct drm_device *dev); | ||
1234 | extern void drm_sysfs_device_remove(struct drm_minor *minor); | 1305 | extern void drm_sysfs_device_remove(struct drm_minor *minor); |
1306 | extern char *drm_get_connector_status_name(enum drm_connector_status status); | ||
1307 | extern int drm_sysfs_connector_add(struct drm_connector *connector); | ||
1308 | extern void drm_sysfs_connector_remove(struct drm_connector *connector); | ||
1235 | 1309 | ||
1236 | /* | 1310 | /* |
1237 | * Basic memory manager support (drm_mm.c) | 1311 | * Basic memory manager support (drm_mm.c) |
@@ -1251,10 +1325,12 @@ extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size); | |||
1251 | 1325 | ||
1252 | /* Graphics Execution Manager library functions (drm_gem.c) */ | 1326 | /* Graphics Execution Manager library functions (drm_gem.c) */ |
1253 | int drm_gem_init(struct drm_device *dev); | 1327 | int drm_gem_init(struct drm_device *dev); |
1328 | void drm_gem_destroy(struct drm_device *dev); | ||
1254 | void drm_gem_object_free(struct kref *kref); | 1329 | void drm_gem_object_free(struct kref *kref); |
1255 | struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, | 1330 | struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, |
1256 | size_t size); | 1331 | size_t size); |
1257 | void drm_gem_object_handle_free(struct kref *kref); | 1332 | void drm_gem_object_handle_free(struct kref *kref); |
1333 | int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); | ||
1258 | 1334 | ||
1259 | static inline void | 1335 | static inline void |
1260 | drm_gem_object_reference(struct drm_gem_object *obj) | 1336 | drm_gem_object_reference(struct drm_gem_object *obj) |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h new file mode 100644 index 000000000000..0acb07f31fa4 --- /dev/null +++ b/include/drm/drm_crtc.h | |||
@@ -0,0 +1,733 @@ | |||
1 | /* | ||
2 | * Copyright © 2006 Keith Packard | ||
3 | * Copyright © 2007-2008 Dave Airlie | ||
4 | * Copyright © 2007-2008 Intel Corporation | ||
5 | * Jesse Barnes <jesse.barnes@intel.com> | ||
6 | * | ||
7 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
8 | * copy of this software and associated documentation files (the "Software"), | ||
9 | * to deal in the Software without restriction, including without limitation | ||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
11 | * and/or sell copies of the Software, and to permit persons to whom the | ||
12 | * Software is furnished to do so, subject to the following conditions: | ||
13 | * | ||
14 | * The above copyright notice and this permission notice shall be included in | ||
15 | * all copies or substantial portions of the Software. | ||
16 | * | ||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
20 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
24 | */ | ||
25 | #ifndef __DRM_CRTC_H__ | ||
26 | #define __DRM_CRTC_H__ | ||
27 | |||
28 | #include <linux/i2c.h> | ||
29 | #include <linux/spinlock.h> | ||
30 | #include <linux/types.h> | ||
31 | #include <linux/idr.h> | ||
32 | |||
33 | #include <linux/fb.h> | ||
34 | |||
35 | struct drm_device; | ||
36 | struct drm_mode_set; | ||
37 | struct drm_framebuffer; | ||
38 | |||
39 | |||
40 | #define DRM_MODE_OBJECT_CRTC 0xcccccccc | ||
41 | #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0 | ||
42 | #define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0 | ||
43 | #define DRM_MODE_OBJECT_MODE 0xdededede | ||
44 | #define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0 | ||
45 | #define DRM_MODE_OBJECT_FB 0xfbfbfbfb | ||
46 | #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb | ||
47 | |||
48 | struct drm_mode_object { | ||
49 | uint32_t id; | ||
50 | uint32_t type; | ||
51 | }; | ||
52 | |||
53 | /* | ||
54 | * Note on terminology: here, for brevity and convenience, we refer to connector | ||
55 | * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, | ||
56 | * DVI, etc. And 'screen' refers to the whole of the visible display, which | ||
57 | * may span multiple monitors (and therefore multiple CRTC and connector | ||
58 | * structures). | ||
59 | */ | ||
60 | |||
61 | enum drm_mode_status { | ||
62 | MODE_OK = 0, /* Mode OK */ | ||
63 | MODE_HSYNC, /* hsync out of range */ | ||
64 | MODE_VSYNC, /* vsync out of range */ | ||
65 | MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ | ||
66 | MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ | ||
67 | MODE_BAD_WIDTH, /* requires an unsupported linepitch */ | ||
68 | MODE_NOMODE, /* no mode with a maching name */ | ||
69 | MODE_NO_INTERLACE, /* interlaced mode not supported */ | ||
70 | MODE_NO_DBLESCAN, /* doublescan mode not supported */ | ||
71 | MODE_NO_VSCAN, /* multiscan mode not supported */ | ||
72 | MODE_MEM, /* insufficient video memory */ | ||
73 | MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ | ||
74 | MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ | ||
75 | MODE_MEM_VIRT, /* insufficient video memory given virtual size */ | ||
76 | MODE_NOCLOCK, /* no fixed clock available */ | ||
77 | MODE_CLOCK_HIGH, /* clock required is too high */ | ||
78 | MODE_CLOCK_LOW, /* clock required is too low */ | ||
79 | MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ | ||
80 | MODE_BAD_HVALUE, /* horizontal timing was out of range */ | ||
81 | MODE_BAD_VVALUE, /* vertical timing was out of range */ | ||
82 | MODE_BAD_VSCAN, /* VScan value out of range */ | ||
83 | MODE_HSYNC_NARROW, /* horizontal sync too narrow */ | ||
84 | MODE_HSYNC_WIDE, /* horizontal sync too wide */ | ||
85 | MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ | ||
86 | MODE_HBLANK_WIDE, /* horizontal blanking too wide */ | ||
87 | MODE_VSYNC_NARROW, /* vertical sync too narrow */ | ||
88 | MODE_VSYNC_WIDE, /* vertical sync too wide */ | ||
89 | MODE_VBLANK_NARROW, /* vertical blanking too narrow */ | ||
90 | MODE_VBLANK_WIDE, /* vertical blanking too wide */ | ||
91 | MODE_PANEL, /* exceeds panel dimensions */ | ||
92 | MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ | ||
93 | MODE_ONE_WIDTH, /* only one width is supported */ | ||
94 | MODE_ONE_HEIGHT, /* only one height is supported */ | ||
95 | MODE_ONE_SIZE, /* only one resolution is supported */ | ||
96 | MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ | ||
97 | MODE_UNVERIFIED = -3, /* mode needs to reverified */ | ||
98 | MODE_BAD = -2, /* unspecified reason */ | ||
99 | MODE_ERROR = -1 /* error condition */ | ||
100 | }; | ||
101 | |||
102 | #define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ | ||
103 | DRM_MODE_TYPE_CRTC_C) | ||
104 | |||
105 | #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ | ||
106 | .name = nm, .status = 0, .type = (t), .clock = (c), \ | ||
107 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | ||
108 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | ||
109 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | ||
110 | .vscan = (vs), .flags = (f), .vrefresh = 0 | ||
111 | |||
112 | #define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ | ||
113 | |||
114 | struct drm_display_mode { | ||
115 | /* Header */ | ||
116 | struct list_head head; | ||
117 | struct drm_mode_object base; | ||
118 | |||
119 | char name[DRM_DISPLAY_MODE_LEN]; | ||
120 | |||
121 | int connector_count; | ||
122 | enum drm_mode_status status; | ||
123 | int type; | ||
124 | |||
125 | /* Proposed mode values */ | ||
126 | int clock; | ||
127 | int hdisplay; | ||
128 | int hsync_start; | ||
129 | int hsync_end; | ||
130 | int htotal; | ||
131 | int hskew; | ||
132 | int vdisplay; | ||
133 | int vsync_start; | ||
134 | int vsync_end; | ||
135 | int vtotal; | ||
136 | int vscan; | ||
137 | unsigned int flags; | ||
138 | |||
139 | /* Addressable image size (may be 0 for projectors, etc.) */ | ||
140 | int width_mm; | ||
141 | int height_mm; | ||
142 | |||
143 | /* Actual mode we give to hw */ | ||
144 | int clock_index; | ||
145 | int synth_clock; | ||
146 | int crtc_hdisplay; | ||
147 | int crtc_hblank_start; | ||
148 | int crtc_hblank_end; | ||
149 | int crtc_hsync_start; | ||
150 | int crtc_hsync_end; | ||
151 | int crtc_htotal; | ||
152 | int crtc_hskew; | ||
153 | int crtc_vdisplay; | ||
154 | int crtc_vblank_start; | ||
155 | int crtc_vblank_end; | ||
156 | int crtc_vsync_start; | ||
157 | int crtc_vsync_end; | ||
158 | int crtc_vtotal; | ||
159 | int crtc_hadjusted; | ||
160 | int crtc_vadjusted; | ||
161 | |||
162 | /* Driver private mode info */ | ||
163 | int private_size; | ||
164 | int *private; | ||
165 | int private_flags; | ||
166 | |||
167 | int vrefresh; | ||
168 | float hsync; | ||
169 | }; | ||
170 | |||
171 | enum drm_connector_status { | ||
172 | connector_status_connected = 1, | ||
173 | connector_status_disconnected = 2, | ||
174 | connector_status_unknown = 3, | ||
175 | }; | ||
176 | |||
177 | enum subpixel_order { | ||
178 | SubPixelUnknown = 0, | ||
179 | SubPixelHorizontalRGB, | ||
180 | SubPixelHorizontalBGR, | ||
181 | SubPixelVerticalRGB, | ||
182 | SubPixelVerticalBGR, | ||
183 | SubPixelNone, | ||
184 | }; | ||
185 | |||
186 | |||
187 | /* | ||
188 | * Describes a given display (e.g. CRT or flat panel) and its limitations. | ||
189 | */ | ||
190 | struct drm_display_info { | ||
191 | char name[DRM_DISPLAY_INFO_LEN]; | ||
192 | /* Input info */ | ||
193 | bool serration_vsync; | ||
194 | bool sync_on_green; | ||
195 | bool composite_sync; | ||
196 | bool separate_syncs; | ||
197 | bool blank_to_black; | ||
198 | unsigned char video_level; | ||
199 | bool digital; | ||
200 | /* Physical size */ | ||
201 | unsigned int width_mm; | ||
202 | unsigned int height_mm; | ||
203 | |||
204 | /* Display parameters */ | ||
205 | unsigned char gamma; /* FIXME: storage format */ | ||
206 | bool gtf_supported; | ||
207 | bool standard_color; | ||
208 | enum { | ||
209 | monochrome = 0, | ||
210 | rgb, | ||
211 | other, | ||
212 | unknown, | ||
213 | } display_type; | ||
214 | bool active_off_supported; | ||
215 | bool suspend_supported; | ||
216 | bool standby_supported; | ||
217 | |||
218 | /* Color info FIXME: storage format */ | ||
219 | unsigned short redx, redy; | ||
220 | unsigned short greenx, greeny; | ||
221 | unsigned short bluex, bluey; | ||
222 | unsigned short whitex, whitey; | ||
223 | |||
224 | /* Clock limits FIXME: storage format */ | ||
225 | unsigned int min_vfreq, max_vfreq; | ||
226 | unsigned int min_hfreq, max_hfreq; | ||
227 | unsigned int pixel_clock; | ||
228 | |||
229 | /* White point indices FIXME: storage format */ | ||
230 | unsigned int wpx1, wpy1; | ||
231 | unsigned int wpgamma1; | ||
232 | unsigned int wpx2, wpy2; | ||
233 | unsigned int wpgamma2; | ||
234 | |||
235 | enum subpixel_order subpixel_order; | ||
236 | |||
237 | char *raw_edid; /* if any */ | ||
238 | }; | ||
239 | |||
240 | struct drm_framebuffer_funcs { | ||
241 | void (*destroy)(struct drm_framebuffer *framebuffer); | ||
242 | int (*create_handle)(struct drm_framebuffer *fb, | ||
243 | struct drm_file *file_priv, | ||
244 | unsigned int *handle); | ||
245 | }; | ||
246 | |||
247 | struct drm_framebuffer { | ||
248 | struct drm_device *dev; | ||
249 | struct list_head head; | ||
250 | struct drm_mode_object base; | ||
251 | const struct drm_framebuffer_funcs *funcs; | ||
252 | unsigned int pitch; | ||
253 | unsigned int width; | ||
254 | unsigned int height; | ||
255 | /* depth can be 15 or 16 */ | ||
256 | unsigned int depth; | ||
257 | int bits_per_pixel; | ||
258 | int flags; | ||
259 | void *fbdev; | ||
260 | u32 pseudo_palette[17]; | ||
261 | struct list_head filp_head; | ||
262 | }; | ||
263 | |||
264 | struct drm_property_blob { | ||
265 | struct drm_mode_object base; | ||
266 | struct list_head head; | ||
267 | unsigned int length; | ||
268 | void *data; | ||
269 | }; | ||
270 | |||
271 | struct drm_property_enum { | ||
272 | uint64_t value; | ||
273 | struct list_head head; | ||
274 | char name[DRM_PROP_NAME_LEN]; | ||
275 | }; | ||
276 | |||
277 | struct drm_property { | ||
278 | struct list_head head; | ||
279 | struct drm_mode_object base; | ||
280 | uint32_t flags; | ||
281 | char name[DRM_PROP_NAME_LEN]; | ||
282 | uint32_t num_values; | ||
283 | uint64_t *values; | ||
284 | |||
285 | struct list_head enum_blob_list; | ||
286 | }; | ||
287 | |||
288 | struct drm_crtc; | ||
289 | struct drm_connector; | ||
290 | struct drm_encoder; | ||
291 | |||
292 | /** | ||
293 | * drm_crtc_funcs - control CRTCs for a given device | ||
294 | * @dpms: control display power levels | ||
295 | * @save: save CRTC state | ||
296 | * @resore: restore CRTC state | ||
297 | * @lock: lock the CRTC | ||
298 | * @unlock: unlock the CRTC | ||
299 | * @shadow_allocate: allocate shadow pixmap | ||
300 | * @shadow_create: create shadow pixmap for rotation support | ||
301 | * @shadow_destroy: free shadow pixmap | ||
302 | * @mode_fixup: fixup proposed mode | ||
303 | * @mode_set: set the desired mode on the CRTC | ||
304 | * @gamma_set: specify color ramp for CRTC | ||
305 | * @destroy: deinit and free object. | ||
306 | * | ||
307 | * The drm_crtc_funcs structure is the central CRTC management structure | ||
308 | * in the DRM. Each CRTC controls one or more connectors (note that the name | ||
309 | * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc. | ||
310 | * connectors, not just CRTs). | ||
311 | * | ||
312 | * Each driver is responsible for filling out this structure at startup time, | ||
313 | * in addition to providing other modesetting features, like i2c and DDC | ||
314 | * bus accessors. | ||
315 | */ | ||
316 | struct drm_crtc_funcs { | ||
317 | /* Save CRTC state */ | ||
318 | void (*save)(struct drm_crtc *crtc); /* suspend? */ | ||
319 | /* Restore CRTC state */ | ||
320 | void (*restore)(struct drm_crtc *crtc); /* resume? */ | ||
321 | |||
322 | /* cursor controls */ | ||
323 | int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv, | ||
324 | uint32_t handle, uint32_t width, uint32_t height); | ||
325 | int (*cursor_move)(struct drm_crtc *crtc, int x, int y); | ||
326 | |||
327 | /* Set gamma on the CRTC */ | ||
328 | void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, | ||
329 | uint32_t size); | ||
330 | /* Object destroy routine */ | ||
331 | void (*destroy)(struct drm_crtc *crtc); | ||
332 | |||
333 | int (*set_config)(struct drm_mode_set *set); | ||
334 | }; | ||
335 | |||
336 | /** | ||
337 | * drm_crtc - central CRTC control structure | ||
338 | * @enabled: is this CRTC enabled? | ||
339 | * @x: x position on screen | ||
340 | * @y: y position on screen | ||
341 | * @desired_mode: new desired mode | ||
342 | * @desired_x: desired x for desired_mode | ||
343 | * @desired_y: desired y for desired_mode | ||
344 | * @funcs: CRTC control functions | ||
345 | * | ||
346 | * Each CRTC may have one or more connectors associated with it. This structure | ||
347 | * allows the CRTC to be controlled. | ||
348 | */ | ||
349 | struct drm_crtc { | ||
350 | struct drm_device *dev; | ||
351 | struct list_head head; | ||
352 | |||
353 | struct drm_mode_object base; | ||
354 | |||
355 | /* framebuffer the connector is currently bound to */ | ||
356 | struct drm_framebuffer *fb; | ||
357 | |||
358 | bool enabled; | ||
359 | |||
360 | struct drm_display_mode mode; | ||
361 | |||
362 | int x, y; | ||
363 | struct drm_display_mode *desired_mode; | ||
364 | int desired_x, desired_y; | ||
365 | const struct drm_crtc_funcs *funcs; | ||
366 | |||
367 | /* CRTC gamma size for reporting to userspace */ | ||
368 | uint32_t gamma_size; | ||
369 | uint16_t *gamma_store; | ||
370 | |||
371 | /* if you are using the helper */ | ||
372 | void *helper_private; | ||
373 | }; | ||
374 | |||
375 | |||
376 | /** | ||
377 | * drm_connector_funcs - control connectors on a given device | ||
378 | * @dpms: set power state (see drm_crtc_funcs above) | ||
379 | * @save: save connector state | ||
380 | * @restore: restore connector state | ||
381 | * @mode_valid: is this mode valid on the given connector? | ||
382 | * @mode_fixup: try to fixup proposed mode for this connector | ||
383 | * @mode_set: set this mode | ||
384 | * @detect: is this connector active? | ||
385 | * @get_modes: get mode list for this connector | ||
386 | * @set_property: property for this connector may need update | ||
387 | * @destroy: make object go away | ||
388 | * | ||
389 | * Each CRTC may have one or more connectors attached to it. The functions | ||
390 | * below allow the core DRM code to control connectors, enumerate available modes, | ||
391 | * etc. | ||
392 | */ | ||
393 | struct drm_connector_funcs { | ||
394 | void (*dpms)(struct drm_connector *connector, int mode); | ||
395 | void (*save)(struct drm_connector *connector); | ||
396 | void (*restore)(struct drm_connector *connector); | ||
397 | enum drm_connector_status (*detect)(struct drm_connector *connector); | ||
398 | void (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height); | ||
399 | int (*set_property)(struct drm_connector *connector, struct drm_property *property, | ||
400 | uint64_t val); | ||
401 | void (*destroy)(struct drm_connector *connector); | ||
402 | }; | ||
403 | |||
404 | struct drm_encoder_funcs { | ||
405 | void (*destroy)(struct drm_encoder *encoder); | ||
406 | }; | ||
407 | |||
408 | #define DRM_CONNECTOR_MAX_UMODES 16 | ||
409 | #define DRM_CONNECTOR_MAX_PROPERTY 16 | ||
410 | #define DRM_CONNECTOR_LEN 32 | ||
411 | #define DRM_CONNECTOR_MAX_ENCODER 2 | ||
412 | |||
413 | /** | ||
414 | * drm_encoder - central DRM encoder structure | ||
415 | */ | ||
416 | struct drm_encoder { | ||
417 | struct drm_device *dev; | ||
418 | struct list_head head; | ||
419 | |||
420 | struct drm_mode_object base; | ||
421 | int encoder_type; | ||
422 | uint32_t possible_crtcs; | ||
423 | uint32_t possible_clones; | ||
424 | |||
425 | struct drm_crtc *crtc; | ||
426 | const struct drm_encoder_funcs *funcs; | ||
427 | void *helper_private; | ||
428 | }; | ||
429 | |||
430 | /** | ||
431 | * drm_connector - central DRM connector control structure | ||
432 | * @crtc: CRTC this connector is currently connected to, NULL if none | ||
433 | * @interlace_allowed: can this connector handle interlaced modes? | ||
434 | * @doublescan_allowed: can this connector handle doublescan? | ||
435 | * @available_modes: modes available on this connector (from get_modes() + user) | ||
436 | * @initial_x: initial x position for this connector | ||
437 | * @initial_y: initial y position for this connector | ||
438 | * @status: connector connected? | ||
439 | * @funcs: connector control functions | ||
440 | * | ||
441 | * Each connector may be connected to one or more CRTCs, or may be clonable by | ||
442 | * another connector if they can share a CRTC. Each connector also has a specific | ||
443 | * position in the broader display (referred to as a 'screen' though it could | ||
444 | * span multiple monitors). | ||
445 | */ | ||
446 | struct drm_connector { | ||
447 | struct drm_device *dev; | ||
448 | struct device kdev; | ||
449 | struct device_attribute *attr; | ||
450 | struct list_head head; | ||
451 | |||
452 | struct drm_mode_object base; | ||
453 | |||
454 | int connector_type; | ||
455 | int connector_type_id; | ||
456 | bool interlace_allowed; | ||
457 | bool doublescan_allowed; | ||
458 | struct list_head modes; /* list of modes on this connector */ | ||
459 | |||
460 | int initial_x, initial_y; | ||
461 | enum drm_connector_status status; | ||
462 | |||
463 | /* these are modes added by probing with DDC or the BIOS */ | ||
464 | struct list_head probed_modes; | ||
465 | |||
466 | struct drm_display_info display_info; | ||
467 | const struct drm_connector_funcs *funcs; | ||
468 | |||
469 | struct list_head user_modes; | ||
470 | struct drm_property_blob *edid_blob_ptr; | ||
471 | u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY]; | ||
472 | uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY]; | ||
473 | |||
474 | void *helper_private; | ||
475 | |||
476 | uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; | ||
477 | uint32_t force_encoder_id; | ||
478 | struct drm_encoder *encoder; /* currently active encoder */ | ||
479 | }; | ||
480 | |||
481 | /** | ||
482 | * struct drm_mode_set | ||
483 | * | ||
484 | * Represents a single crtc the connectors that it drives with what mode | ||
485 | * and from which framebuffer it scans out from. | ||
486 | * | ||
487 | * This is used to set modes. | ||
488 | */ | ||
489 | struct drm_mode_set { | ||
490 | struct list_head head; | ||
491 | |||
492 | struct drm_framebuffer *fb; | ||
493 | struct drm_crtc *crtc; | ||
494 | struct drm_display_mode *mode; | ||
495 | |||
496 | uint32_t x; | ||
497 | uint32_t y; | ||
498 | |||
499 | struct drm_connector **connectors; | ||
500 | size_t num_connectors; | ||
501 | }; | ||
502 | |||
503 | /** | ||
504 | * struct drm_mode_config_funcs - configure CRTCs for a given screen layout | ||
505 | * @resize: adjust CRTCs as necessary for the proposed layout | ||
506 | * | ||
507 | * Currently only a resize hook is available. DRM will call back into the | ||
508 | * driver with a new screen width and height. If the driver can't support | ||
509 | * the proposed size, it can return false. Otherwise it should adjust | ||
510 | * the CRTC<->connector mappings as needed and update its view of the screen. | ||
511 | */ | ||
512 | struct drm_mode_config_funcs { | ||
513 | struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd); | ||
514 | int (*fb_changed)(struct drm_device *dev); | ||
515 | }; | ||
516 | |||
517 | struct drm_mode_group { | ||
518 | uint32_t num_crtcs; | ||
519 | uint32_t num_encoders; | ||
520 | uint32_t num_connectors; | ||
521 | |||
522 | /* list of object IDs for this group */ | ||
523 | uint32_t *id_list; | ||
524 | }; | ||
525 | |||
526 | /** | ||
527 | * drm_mode_config - Mode configuration control structure | ||
528 | * | ||
529 | */ | ||
530 | struct drm_mode_config { | ||
531 | struct mutex mutex; /* protects configuration and IDR */ | ||
532 | struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */ | ||
533 | /* this is limited to one for now */ | ||
534 | int num_fb; | ||
535 | struct list_head fb_list; | ||
536 | int num_connector; | ||
537 | struct list_head connector_list; | ||
538 | int num_encoder; | ||
539 | struct list_head encoder_list; | ||
540 | |||
541 | int num_crtc; | ||
542 | struct list_head crtc_list; | ||
543 | |||
544 | struct list_head property_list; | ||
545 | |||
546 | /* in-kernel framebuffers - hung of filp_head in drm_framebuffer */ | ||
547 | struct list_head fb_kernel_list; | ||
548 | |||
549 | int min_width, min_height; | ||
550 | int max_width, max_height; | ||
551 | struct drm_mode_config_funcs *funcs; | ||
552 | unsigned long fb_base; | ||
553 | |||
554 | /* pointers to standard properties */ | ||
555 | struct list_head property_blob_list; | ||
556 | struct drm_property *edid_property; | ||
557 | struct drm_property *dpms_property; | ||
558 | |||
559 | /* DVI-I properties */ | ||
560 | struct drm_property *dvi_i_subconnector_property; | ||
561 | struct drm_property *dvi_i_select_subconnector_property; | ||
562 | |||
563 | /* TV properties */ | ||
564 | struct drm_property *tv_subconnector_property; | ||
565 | struct drm_property *tv_select_subconnector_property; | ||
566 | struct drm_property *tv_mode_property; | ||
567 | struct drm_property *tv_left_margin_property; | ||
568 | struct drm_property *tv_right_margin_property; | ||
569 | struct drm_property *tv_top_margin_property; | ||
570 | struct drm_property *tv_bottom_margin_property; | ||
571 | |||
572 | /* Optional properties */ | ||
573 | struct drm_property *scaling_mode_property; | ||
574 | struct drm_property *dithering_mode_property; | ||
575 | }; | ||
576 | |||
577 | #define obj_to_crtc(x) container_of(x, struct drm_crtc, base) | ||
578 | #define obj_to_connector(x) container_of(x, struct drm_connector, base) | ||
579 | #define obj_to_encoder(x) container_of(x, struct drm_encoder, base) | ||
580 | #define obj_to_mode(x) container_of(x, struct drm_display_mode, base) | ||
581 | #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base) | ||
582 | #define obj_to_property(x) container_of(x, struct drm_property, base) | ||
583 | #define obj_to_blob(x) container_of(x, struct drm_property_blob, base) | ||
584 | |||
585 | |||
586 | extern void drm_crtc_init(struct drm_device *dev, | ||
587 | struct drm_crtc *crtc, | ||
588 | const struct drm_crtc_funcs *funcs); | ||
589 | extern void drm_crtc_cleanup(struct drm_crtc *crtc); | ||
590 | |||
591 | extern void drm_connector_init(struct drm_device *dev, | ||
592 | struct drm_connector *connector, | ||
593 | const struct drm_connector_funcs *funcs, | ||
594 | int connector_type); | ||
595 | |||
596 | extern void drm_connector_cleanup(struct drm_connector *connector); | ||
597 | |||
598 | extern void drm_encoder_init(struct drm_device *dev, | ||
599 | struct drm_encoder *encoder, | ||
600 | const struct drm_encoder_funcs *funcs, | ||
601 | int encoder_type); | ||
602 | |||
603 | extern void drm_encoder_cleanup(struct drm_encoder *encoder); | ||
604 | |||
605 | extern char *drm_get_connector_name(struct drm_connector *connector); | ||
606 | extern char *drm_get_dpms_name(int val); | ||
607 | extern char *drm_get_dvi_i_subconnector_name(int val); | ||
608 | extern char *drm_get_dvi_i_select_name(int val); | ||
609 | extern char *drm_get_tv_subconnector_name(int val); | ||
610 | extern char *drm_get_tv_select_name(int val); | ||
611 | extern void drm_fb_release(struct file *filp); | ||
612 | extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); | ||
613 | extern struct edid *drm_get_edid(struct drm_connector *connector, | ||
614 | struct i2c_adapter *adapter); | ||
615 | extern unsigned char *drm_do_probe_ddc_edid(struct i2c_adapter *adapter); | ||
616 | extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); | ||
617 | extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | ||
618 | extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); | ||
619 | extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | ||
620 | struct drm_display_mode *mode); | ||
621 | extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode); | ||
622 | extern void drm_mode_config_init(struct drm_device *dev); | ||
623 | extern void drm_mode_config_cleanup(struct drm_device *dev); | ||
624 | extern void drm_mode_set_name(struct drm_display_mode *mode); | ||
625 | extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2); | ||
626 | extern int drm_mode_width(struct drm_display_mode *mode); | ||
627 | extern int drm_mode_height(struct drm_display_mode *mode); | ||
628 | |||
629 | /* for us by fb module */ | ||
630 | extern int drm_mode_attachmode_crtc(struct drm_device *dev, | ||
631 | struct drm_crtc *crtc, | ||
632 | struct drm_display_mode *mode); | ||
633 | extern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode); | ||
634 | |||
635 | extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); | ||
636 | extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); | ||
637 | extern void drm_mode_list_concat(struct list_head *head, | ||
638 | struct list_head *new); | ||
639 | extern void drm_mode_validate_size(struct drm_device *dev, | ||
640 | struct list_head *mode_list, | ||
641 | int maxX, int maxY, int maxPitch); | ||
642 | extern void drm_mode_prune_invalid(struct drm_device *dev, | ||
643 | struct list_head *mode_list, bool verbose); | ||
644 | extern void drm_mode_sort(struct list_head *mode_list); | ||
645 | extern int drm_mode_vrefresh(struct drm_display_mode *mode); | ||
646 | extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, | ||
647 | int adjust_flags); | ||
648 | extern void drm_mode_connector_list_update(struct drm_connector *connector); | ||
649 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, | ||
650 | struct edid *edid); | ||
651 | extern int drm_connector_property_set_value(struct drm_connector *connector, | ||
652 | struct drm_property *property, | ||
653 | uint64_t value); | ||
654 | extern int drm_connector_property_get_value(struct drm_connector *connector, | ||
655 | struct drm_property *property, | ||
656 | uint64_t *value); | ||
657 | extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev); | ||
658 | extern void drm_framebuffer_set_object(struct drm_device *dev, | ||
659 | unsigned long handle); | ||
660 | extern int drm_framebuffer_init(struct drm_device *dev, | ||
661 | struct drm_framebuffer *fb, | ||
662 | const struct drm_framebuffer_funcs *funcs); | ||
663 | extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb); | ||
664 | extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc); | ||
665 | extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); | ||
666 | extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY); | ||
667 | extern bool drm_crtc_in_use(struct drm_crtc *crtc); | ||
668 | |||
669 | extern int drm_connector_attach_property(struct drm_connector *connector, | ||
670 | struct drm_property *property, uint64_t init_val); | ||
671 | extern struct drm_property *drm_property_create(struct drm_device *dev, int flags, | ||
672 | const char *name, int num_values); | ||
673 | extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); | ||
674 | extern int drm_property_add_enum(struct drm_property *property, int index, | ||
675 | uint64_t value, const char *name); | ||
676 | extern int drm_mode_create_dvi_i_properties(struct drm_device *dev); | ||
677 | extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats, | ||
678 | char *formats[]); | ||
679 | extern int drm_mode_create_scaling_mode_property(struct drm_device *dev); | ||
680 | extern int drm_mode_create_dithering_property(struct drm_device *dev); | ||
681 | extern char *drm_get_encoder_name(struct drm_encoder *encoder); | ||
682 | |||
683 | extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, | ||
684 | struct drm_encoder *encoder); | ||
685 | extern void drm_mode_connector_detach_encoder(struct drm_connector *connector, | ||
686 | struct drm_encoder *encoder); | ||
687 | extern bool drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, | ||
688 | int gamma_size); | ||
689 | extern void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type); | ||
690 | /* IOCTLs */ | ||
691 | extern int drm_mode_getresources(struct drm_device *dev, | ||
692 | void *data, struct drm_file *file_priv); | ||
693 | |||
694 | extern int drm_mode_getcrtc(struct drm_device *dev, | ||
695 | void *data, struct drm_file *file_priv); | ||
696 | extern int drm_mode_getconnector(struct drm_device *dev, | ||
697 | void *data, struct drm_file *file_priv); | ||
698 | extern int drm_mode_setcrtc(struct drm_device *dev, | ||
699 | void *data, struct drm_file *file_priv); | ||
700 | extern int drm_mode_cursor_ioctl(struct drm_device *dev, | ||
701 | void *data, struct drm_file *file_priv); | ||
702 | extern int drm_mode_addfb(struct drm_device *dev, | ||
703 | void *data, struct drm_file *file_priv); | ||
704 | extern int drm_mode_rmfb(struct drm_device *dev, | ||
705 | void *data, struct drm_file *file_priv); | ||
706 | extern int drm_mode_getfb(struct drm_device *dev, | ||
707 | void *data, struct drm_file *file_priv); | ||
708 | extern int drm_mode_addmode_ioctl(struct drm_device *dev, | ||
709 | void *data, struct drm_file *file_priv); | ||
710 | extern int drm_mode_rmmode_ioctl(struct drm_device *dev, | ||
711 | void *data, struct drm_file *file_priv); | ||
712 | extern int drm_mode_attachmode_ioctl(struct drm_device *dev, | ||
713 | void *data, struct drm_file *file_priv); | ||
714 | extern int drm_mode_detachmode_ioctl(struct drm_device *dev, | ||
715 | void *data, struct drm_file *file_priv); | ||
716 | |||
717 | extern int drm_mode_getproperty_ioctl(struct drm_device *dev, | ||
718 | void *data, struct drm_file *file_priv); | ||
719 | extern int drm_mode_getblob_ioctl(struct drm_device *dev, | ||
720 | void *data, struct drm_file *file_priv); | ||
721 | extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev, | ||
722 | void *data, struct drm_file *file_priv); | ||
723 | extern int drm_mode_hotplug_ioctl(struct drm_device *dev, | ||
724 | void *data, struct drm_file *file_priv); | ||
725 | extern int drm_mode_replacefb(struct drm_device *dev, | ||
726 | void *data, struct drm_file *file_priv); | ||
727 | extern int drm_mode_getencoder(struct drm_device *dev, | ||
728 | void *data, struct drm_file *file_priv); | ||
729 | extern int drm_mode_gamma_get_ioctl(struct drm_device *dev, | ||
730 | void *data, struct drm_file *file_priv); | ||
731 | extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, | ||
732 | void *data, struct drm_file *file_priv); | ||
733 | #endif /* __DRM_CRTC_H__ */ | ||
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h new file mode 100644 index 000000000000..4bc04cf460a7 --- /dev/null +++ b/include/drm/drm_crtc_helper.h | |||
@@ -0,0 +1,124 @@ | |||
1 | /* | ||
2 | * Copyright © 2006 Keith Packard | ||
3 | * Copyright © 2007-2008 Dave Airlie | ||
4 | * Copyright © 2007-2008 Intel Corporation | ||
5 | * Jesse Barnes <jesse.barnes@intel.com> | ||
6 | * | ||
7 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
8 | * copy of this software and associated documentation files (the "Software"), | ||
9 | * to deal in the Software without restriction, including without limitation | ||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
11 | * and/or sell copies of the Software, and to permit persons to whom the | ||
12 | * Software is furnished to do so, subject to the following conditions: | ||
13 | * | ||
14 | * The above copyright notice and this permission notice shall be included in | ||
15 | * all copies or substantial portions of the Software. | ||
16 | * | ||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
20 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
23 | * OTHER DEALINGS IN THE SOFTWARE. | ||
24 | */ | ||
25 | |||
26 | /* | ||
27 | * The DRM mode setting helper functions are common code for drivers to use if | ||
28 | * they wish. Drivers are not forced to use this code in their | ||
29 | * implementations but it would be useful if they code they do use at least | ||
30 | * provides a consistent interface and operation to userspace | ||
31 | */ | ||
32 | |||
33 | #ifndef __DRM_CRTC_HELPER_H__ | ||
34 | #define __DRM_CRTC_HELPER_H__ | ||
35 | |||
36 | #include <linux/i2c.h> | ||
37 | #include <linux/spinlock.h> | ||
38 | #include <linux/types.h> | ||
39 | #include <linux/idr.h> | ||
40 | |||
41 | #include <linux/fb.h> | ||
42 | |||
43 | struct drm_crtc_helper_funcs { | ||
44 | /* | ||
45 | * Control power levels on the CRTC. If the mode passed in is | ||
46 | * unsupported, the provider must use the next lowest power level. | ||
47 | */ | ||
48 | void (*dpms)(struct drm_crtc *crtc, int mode); | ||
49 | void (*prepare)(struct drm_crtc *crtc); | ||
50 | void (*commit)(struct drm_crtc *crtc); | ||
51 | |||
52 | /* Provider can fixup or change mode timings before modeset occurs */ | ||
53 | bool (*mode_fixup)(struct drm_crtc *crtc, | ||
54 | struct drm_display_mode *mode, | ||
55 | struct drm_display_mode *adjusted_mode); | ||
56 | /* Actually set the mode */ | ||
57 | void (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, | ||
58 | struct drm_display_mode *adjusted_mode, int x, int y, | ||
59 | struct drm_framebuffer *old_fb); | ||
60 | |||
61 | /* Move the crtc on the current fb to the given position *optional* */ | ||
62 | void (*mode_set_base)(struct drm_crtc *crtc, int x, int y, | ||
63 | struct drm_framebuffer *old_fb); | ||
64 | }; | ||
65 | |||
66 | struct drm_encoder_helper_funcs { | ||
67 | void (*dpms)(struct drm_encoder *encoder, int mode); | ||
68 | void (*save)(struct drm_encoder *encoder); | ||
69 | void (*restore)(struct drm_encoder *encoder); | ||
70 | |||
71 | bool (*mode_fixup)(struct drm_encoder *encoder, | ||
72 | struct drm_display_mode *mode, | ||
73 | struct drm_display_mode *adjusted_mode); | ||
74 | void (*prepare)(struct drm_encoder *encoder); | ||
75 | void (*commit)(struct drm_encoder *encoder); | ||
76 | void (*mode_set)(struct drm_encoder *encoder, | ||
77 | struct drm_display_mode *mode, | ||
78 | struct drm_display_mode *adjusted_mode); | ||
79 | /* detect for DAC style encoders */ | ||
80 | enum drm_connector_status (*detect)(struct drm_encoder *encoder, | ||
81 | struct drm_connector *connector); | ||
82 | }; | ||
83 | |||
84 | struct drm_connector_helper_funcs { | ||
85 | int (*get_modes)(struct drm_connector *connector); | ||
86 | int (*mode_valid)(struct drm_connector *connector, | ||
87 | struct drm_display_mode *mode); | ||
88 | struct drm_encoder *(*best_encoder)(struct drm_connector *connector); | ||
89 | }; | ||
90 | |||
91 | extern void drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY); | ||
92 | extern void drm_helper_disable_unused_functions(struct drm_device *dev); | ||
93 | extern int drm_helper_hotplug_stage_two(struct drm_device *dev); | ||
94 | extern bool drm_helper_initial_config(struct drm_device *dev, bool can_grow); | ||
95 | extern int drm_crtc_helper_set_config(struct drm_mode_set *set); | ||
96 | extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | ||
97 | struct drm_display_mode *mode, | ||
98 | int x, int y, | ||
99 | struct drm_framebuffer *old_fb); | ||
100 | extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); | ||
101 | |||
102 | extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | ||
103 | struct drm_mode_fb_cmd *mode_cmd); | ||
104 | |||
105 | static inline void drm_crtc_helper_add(struct drm_crtc *crtc, | ||
106 | const struct drm_crtc_helper_funcs *funcs) | ||
107 | { | ||
108 | crtc->helper_private = (void *)funcs; | ||
109 | } | ||
110 | |||
111 | static inline void drm_encoder_helper_add(struct drm_encoder *encoder, | ||
112 | const struct drm_encoder_helper_funcs *funcs) | ||
113 | { | ||
114 | encoder->helper_private = (void *)funcs; | ||
115 | } | ||
116 | |||
117 | static inline void drm_connector_helper_add(struct drm_connector *connector, | ||
118 | const struct drm_connector_helper_funcs *funcs) | ||
119 | { | ||
120 | connector->helper_private = (void *)funcs; | ||
121 | } | ||
122 | |||
123 | extern int drm_helper_resume_force_mode(struct drm_device *dev); | ||
124 | #endif | ||
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h new file mode 100644 index 000000000000..c707c15f5164 --- /dev/null +++ b/include/drm/drm_edid.h | |||
@@ -0,0 +1,202 @@ | |||
1 | /* | ||
2 | * Copyright © 2007-2008 Intel Corporation | ||
3 | * Jesse Barnes <jesse.barnes@intel.com> | ||
4 | * | ||
5 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
6 | * copy of this software and associated documentation files (the "Software"), | ||
7 | * to deal in the Software without restriction, including without limitation | ||
8 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
9 | * and/or sell copies of the Software, and to permit persons to whom the | ||
10 | * Software is furnished to do so, subject to the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice shall be included in | ||
13 | * all copies or substantial portions of the Software. | ||
14 | * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
18 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
19 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
20 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
21 | * OTHER DEALINGS IN THE SOFTWARE. | ||
22 | */ | ||
23 | #ifndef __DRM_EDID_H__ | ||
24 | #define __DRM_EDID_H__ | ||
25 | |||
26 | #include <linux/types.h> | ||
27 | |||
28 | #define EDID_LENGTH 128 | ||
29 | #define DDC_ADDR 0x50 | ||
30 | |||
31 | #ifdef BIG_ENDIAN | ||
32 | #error "EDID structure is little endian, need big endian versions" | ||
33 | #else | ||
34 | |||
35 | struct est_timings { | ||
36 | u8 t1; | ||
37 | u8 t2; | ||
38 | u8 mfg_rsvd; | ||
39 | } __attribute__((packed)); | ||
40 | |||
41 | struct std_timing { | ||
42 | u8 hsize; /* need to multiply by 8 then add 248 */ | ||
43 | u8 vfreq:6; /* need to add 60 */ | ||
44 | u8 aspect_ratio:2; /* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */ | ||
45 | } __attribute__((packed)); | ||
46 | |||
47 | /* If detailed data is pixel timing */ | ||
48 | struct detailed_pixel_timing { | ||
49 | u8 hactive_lo; | ||
50 | u8 hblank_lo; | ||
51 | u8 hblank_hi:4; | ||
52 | u8 hactive_hi:4; | ||
53 | u8 vactive_lo; | ||
54 | u8 vblank_lo; | ||
55 | u8 vblank_hi:4; | ||
56 | u8 vactive_hi:4; | ||
57 | u8 hsync_offset_lo; | ||
58 | u8 hsync_pulse_width_lo; | ||
59 | u8 vsync_pulse_width_lo:4; | ||
60 | u8 vsync_offset_lo:4; | ||
61 | u8 hsync_pulse_width_hi:2; | ||
62 | u8 hsync_offset_hi:2; | ||
63 | u8 vsync_pulse_width_hi:2; | ||
64 | u8 vsync_offset_hi:2; | ||
65 | u8 width_mm_lo; | ||
66 | u8 height_mm_lo; | ||
67 | u8 height_mm_hi:4; | ||
68 | u8 width_mm_hi:4; | ||
69 | u8 hborder; | ||
70 | u8 vborder; | ||
71 | u8 unknown0:1; | ||
72 | u8 vsync_positive:1; | ||
73 | u8 hsync_positive:1; | ||
74 | u8 separate_sync:2; | ||
75 | u8 stereo:1; | ||
76 | u8 unknown6:1; | ||
77 | u8 interlaced:1; | ||
78 | } __attribute__((packed)); | ||
79 | |||
80 | /* If it's not pixel timing, it'll be one of the below */ | ||
81 | struct detailed_data_string { | ||
82 | u8 str[13]; | ||
83 | } __attribute__((packed)); | ||
84 | |||
85 | struct detailed_data_monitor_range { | ||
86 | u8 min_vfreq; | ||
87 | u8 max_vfreq; | ||
88 | u8 min_hfreq_khz; | ||
89 | u8 max_hfreq_khz; | ||
90 | u8 pixel_clock_mhz; /* need to multiply by 10 */ | ||
91 | u16 sec_gtf_toggle; /* A000=use above, 20=use below */ /* FIXME: byte order */ | ||
92 | u8 hfreq_start_khz; /* need to multiply by 2 */ | ||
93 | u8 c; /* need to divide by 2 */ | ||
94 | u16 m; /* FIXME: byte order */ | ||
95 | u8 k; | ||
96 | u8 j; /* need to divide by 2 */ | ||
97 | } __attribute__((packed)); | ||
98 | |||
99 | struct detailed_data_wpindex { | ||
100 | u8 white_y_lo:2; | ||
101 | u8 white_x_lo:2; | ||
102 | u8 pad:4; | ||
103 | u8 white_x_hi; | ||
104 | u8 white_y_hi; | ||
105 | u8 gamma; /* need to divide by 100 then add 1 */ | ||
106 | } __attribute__((packed)); | ||
107 | |||
108 | struct detailed_data_color_point { | ||
109 | u8 windex1; | ||
110 | u8 wpindex1[3]; | ||
111 | u8 windex2; | ||
112 | u8 wpindex2[3]; | ||
113 | } __attribute__((packed)); | ||
114 | |||
115 | struct detailed_non_pixel { | ||
116 | u8 pad1; | ||
117 | u8 type; /* ff=serial, fe=string, fd=monitor range, fc=monitor name | ||
118 | fb=color point data, fa=standard timing data, | ||
119 | f9=undefined, f8=mfg. reserved */ | ||
120 | u8 pad2; | ||
121 | union { | ||
122 | struct detailed_data_string str; | ||
123 | struct detailed_data_monitor_range range; | ||
124 | struct detailed_data_wpindex color; | ||
125 | struct std_timing timings[5]; | ||
126 | } data; | ||
127 | } __attribute__((packed)); | ||
128 | |||
129 | #define EDID_DETAIL_STD_MODES 0xfa | ||
130 | #define EDID_DETAIL_MONITOR_CPDATA 0xfb | ||
131 | #define EDID_DETAIL_MONITOR_NAME 0xfc | ||
132 | #define EDID_DETAIL_MONITOR_RANGE 0xfd | ||
133 | #define EDID_DETAIL_MONITOR_STRING 0xfe | ||
134 | #define EDID_DETAIL_MONITOR_SERIAL 0xff | ||
135 | |||
136 | struct detailed_timing { | ||
137 | u16 pixel_clock; /* need to multiply by 10 KHz */ /* FIXME: byte order */ | ||
138 | union { | ||
139 | struct detailed_pixel_timing pixel_data; | ||
140 | struct detailed_non_pixel other_data; | ||
141 | } data; | ||
142 | } __attribute__((packed)); | ||
143 | |||
144 | struct edid { | ||
145 | u8 header[8]; | ||
146 | /* Vendor & product info */ | ||
147 | u8 mfg_id[2]; | ||
148 | u8 prod_code[2]; | ||
149 | u32 serial; /* FIXME: byte order */ | ||
150 | u8 mfg_week; | ||
151 | u8 mfg_year; | ||
152 | /* EDID version */ | ||
153 | u8 version; | ||
154 | u8 revision; | ||
155 | /* Display info: */ | ||
156 | /* input definition */ | ||
157 | u8 serration_vsync:1; | ||
158 | u8 sync_on_green:1; | ||
159 | u8 composite_sync:1; | ||
160 | u8 separate_syncs:1; | ||
161 | u8 blank_to_black:1; | ||
162 | u8 video_level:2; | ||
163 | u8 digital:1; /* bits below must be zero if set */ | ||
164 | u8 width_cm; | ||
165 | u8 height_cm; | ||
166 | u8 gamma; | ||
167 | /* feature support */ | ||
168 | u8 default_gtf:1; | ||
169 | u8 preferred_timing:1; | ||
170 | u8 standard_color:1; | ||
171 | u8 display_type:2; /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ | ||
172 | u8 pm_active_off:1; | ||
173 | u8 pm_suspend:1; | ||
174 | u8 pm_standby:1; | ||
175 | /* Color characteristics */ | ||
176 | u8 red_green_lo; | ||
177 | u8 black_white_lo; | ||
178 | u8 red_x; | ||
179 | u8 red_y; | ||
180 | u8 green_x; | ||
181 | u8 green_y; | ||
182 | u8 blue_x; | ||
183 | u8 blue_y; | ||
184 | u8 white_x; | ||
185 | u8 white_y; | ||
186 | /* Est. timings and mfg rsvd timings*/ | ||
187 | struct est_timings established_timings; | ||
188 | /* Standard timings 1-8*/ | ||
189 | struct std_timing standard_timings[8]; | ||
190 | /* Detailing timings 1-4 */ | ||
191 | struct detailed_timing detailed_timings[4]; | ||
192 | /* Number of 128 byte ext. blocks */ | ||
193 | u8 extensions; | ||
194 | /* Checksum */ | ||
195 | u8 checksum; | ||
196 | } __attribute__((packed)); | ||
197 | |||
198 | #endif /* little endian structs */ | ||
199 | |||
200 | #define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8)) | ||
201 | |||
202 | #endif /* __DRM_EDID_H__ */ | ||
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h new file mode 100644 index 000000000000..601d2bd839f6 --- /dev/null +++ b/include/drm/drm_mode.h | |||
@@ -0,0 +1,271 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> | ||
3 | * Copyright (c) 2007 Jakob Bornecrantz <wallbraker@gmail.com> | ||
4 | * Copyright (c) 2008 Red Hat Inc. | ||
5 | * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA | ||
6 | * Copyright (c) 2007-2008 Intel Corporation | ||
7 | * | ||
8 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
9 | * copy of this software and associated documentation files (the "Software"), | ||
10 | * to deal in the Software without restriction, including without limitation | ||
11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
12 | * and/or sell copies of the Software, and to permit persons to whom the | ||
13 | * Software is furnished to do so, subject to the following conditions: | ||
14 | * | ||
15 | * The above copyright notice and this permission notice shall be included in | ||
16 | * all copies or substantial portions of the Software. | ||
17 | * | ||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
24 | * IN THE SOFTWARE. | ||
25 | */ | ||
26 | |||
27 | #ifndef _DRM_MODE_H | ||
28 | #define _DRM_MODE_H | ||
29 | |||
30 | #if !defined(__KERNEL__) && !defined(_KERNEL) | ||
31 | #include <stdint.h> | ||
32 | #else | ||
33 | #include <linux/kernel.h> | ||
34 | #endif | ||
35 | |||
36 | #define DRM_DISPLAY_INFO_LEN 32 | ||
37 | #define DRM_CONNECTOR_NAME_LEN 32 | ||
38 | #define DRM_DISPLAY_MODE_LEN 32 | ||
39 | #define DRM_PROP_NAME_LEN 32 | ||
40 | |||
41 | #define DRM_MODE_TYPE_BUILTIN (1<<0) | ||
42 | #define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN) | ||
43 | #define DRM_MODE_TYPE_CRTC_C ((1<<2) | DRM_MODE_TYPE_BUILTIN) | ||
44 | #define DRM_MODE_TYPE_PREFERRED (1<<3) | ||
45 | #define DRM_MODE_TYPE_DEFAULT (1<<4) | ||
46 | #define DRM_MODE_TYPE_USERDEF (1<<5) | ||
47 | #define DRM_MODE_TYPE_DRIVER (1<<6) | ||
48 | |||
49 | /* Video mode flags */ | ||
50 | /* bit compatible with the xorg definitions. */ | ||
51 | #define DRM_MODE_FLAG_PHSYNC (1<<0) | ||
52 | #define DRM_MODE_FLAG_NHSYNC (1<<1) | ||
53 | #define DRM_MODE_FLAG_PVSYNC (1<<2) | ||
54 | #define DRM_MODE_FLAG_NVSYNC (1<<3) | ||
55 | #define DRM_MODE_FLAG_INTERLACE (1<<4) | ||
56 | #define DRM_MODE_FLAG_DBLSCAN (1<<5) | ||
57 | #define DRM_MODE_FLAG_CSYNC (1<<6) | ||
58 | #define DRM_MODE_FLAG_PCSYNC (1<<7) | ||
59 | #define DRM_MODE_FLAG_NCSYNC (1<<8) | ||
60 | #define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */ | ||
61 | #define DRM_MODE_FLAG_BCAST (1<<10) | ||
62 | #define DRM_MODE_FLAG_PIXMUX (1<<11) | ||
63 | #define DRM_MODE_FLAG_DBLCLK (1<<12) | ||
64 | #define DRM_MODE_FLAG_CLKDIV2 (1<<13) | ||
65 | |||
66 | /* DPMS flags */ | ||
67 | /* bit compatible with the xorg definitions. */ | ||
68 | #define DRM_MODE_DPMS_ON 0 | ||
69 | #define DRM_MODE_DPMS_STANDBY 1 | ||
70 | #define DRM_MODE_DPMS_SUSPEND 2 | ||
71 | #define DRM_MODE_DPMS_OFF 3 | ||
72 | |||
73 | /* Scaling mode options */ | ||
74 | #define DRM_MODE_SCALE_NON_GPU 0 | ||
75 | #define DRM_MODE_SCALE_FULLSCREEN 1 | ||
76 | #define DRM_MODE_SCALE_NO_SCALE 2 | ||
77 | #define DRM_MODE_SCALE_ASPECT 3 | ||
78 | |||
79 | /* Dithering mode options */ | ||
80 | #define DRM_MODE_DITHERING_OFF 0 | ||
81 | #define DRM_MODE_DITHERING_ON 1 | ||
82 | |||
83 | struct drm_mode_modeinfo { | ||
84 | uint32_t clock; | ||
85 | uint16_t hdisplay, hsync_start, hsync_end, htotal, hskew; | ||
86 | uint16_t vdisplay, vsync_start, vsync_end, vtotal, vscan; | ||
87 | |||
88 | uint32_t vrefresh; /* vertical refresh * 1000 */ | ||
89 | |||
90 | uint32_t flags; | ||
91 | uint32_t type; | ||
92 | char name[DRM_DISPLAY_MODE_LEN]; | ||
93 | }; | ||
94 | |||
95 | struct drm_mode_card_res { | ||
96 | uint64_t fb_id_ptr; | ||
97 | uint64_t crtc_id_ptr; | ||
98 | uint64_t connector_id_ptr; | ||
99 | uint64_t encoder_id_ptr; | ||
100 | uint32_t count_fbs; | ||
101 | uint32_t count_crtcs; | ||
102 | uint32_t count_connectors; | ||
103 | uint32_t count_encoders; | ||
104 | uint32_t min_width, max_width; | ||
105 | uint32_t min_height, max_height; | ||
106 | }; | ||
107 | |||
108 | struct drm_mode_crtc { | ||
109 | uint64_t set_connectors_ptr; | ||
110 | uint32_t count_connectors; | ||
111 | |||
112 | uint32_t crtc_id; /**< Id */ | ||
113 | uint32_t fb_id; /**< Id of framebuffer */ | ||
114 | |||
115 | uint32_t x, y; /**< Position on the frameuffer */ | ||
116 | |||
117 | uint32_t gamma_size; | ||
118 | uint32_t mode_valid; | ||
119 | struct drm_mode_modeinfo mode; | ||
120 | }; | ||
121 | |||
122 | #define DRM_MODE_ENCODER_NONE 0 | ||
123 | #define DRM_MODE_ENCODER_DAC 1 | ||
124 | #define DRM_MODE_ENCODER_TMDS 2 | ||
125 | #define DRM_MODE_ENCODER_LVDS 3 | ||
126 | #define DRM_MODE_ENCODER_TVDAC 4 | ||
127 | |||
128 | struct drm_mode_get_encoder { | ||
129 | uint32_t encoder_id; | ||
130 | uint32_t encoder_type; | ||
131 | |||
132 | uint32_t crtc_id; /**< Id of crtc */ | ||
133 | |||
134 | uint32_t possible_crtcs; | ||
135 | uint32_t possible_clones; | ||
136 | }; | ||
137 | |||
138 | /* This is for connectors with multiple signal types. */ | ||
139 | /* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */ | ||
140 | #define DRM_MODE_SUBCONNECTOR_Automatic 0 | ||
141 | #define DRM_MODE_SUBCONNECTOR_Unknown 0 | ||
142 | #define DRM_MODE_SUBCONNECTOR_DVID 3 | ||
143 | #define DRM_MODE_SUBCONNECTOR_DVIA 4 | ||
144 | #define DRM_MODE_SUBCONNECTOR_Composite 5 | ||
145 | #define DRM_MODE_SUBCONNECTOR_SVIDEO 6 | ||
146 | #define DRM_MODE_SUBCONNECTOR_Component 8 | ||
147 | |||
148 | #define DRM_MODE_CONNECTOR_Unknown 0 | ||
149 | #define DRM_MODE_CONNECTOR_VGA 1 | ||
150 | #define DRM_MODE_CONNECTOR_DVII 2 | ||
151 | #define DRM_MODE_CONNECTOR_DVID 3 | ||
152 | #define DRM_MODE_CONNECTOR_DVIA 4 | ||
153 | #define DRM_MODE_CONNECTOR_Composite 5 | ||
154 | #define DRM_MODE_CONNECTOR_SVIDEO 6 | ||
155 | #define DRM_MODE_CONNECTOR_LVDS 7 | ||
156 | #define DRM_MODE_CONNECTOR_Component 8 | ||
157 | #define DRM_MODE_CONNECTOR_9PinDIN 9 | ||
158 | #define DRM_MODE_CONNECTOR_DisplayPort 10 | ||
159 | #define DRM_MODE_CONNECTOR_HDMIA 11 | ||
160 | #define DRM_MODE_CONNECTOR_HDMIB 12 | ||
161 | |||
162 | struct drm_mode_get_connector { | ||
163 | |||
164 | uint64_t encoders_ptr; | ||
165 | uint64_t modes_ptr; | ||
166 | uint64_t props_ptr; | ||
167 | uint64_t prop_values_ptr; | ||
168 | |||
169 | uint32_t count_modes; | ||
170 | uint32_t count_props; | ||
171 | uint32_t count_encoders; | ||
172 | |||
173 | uint32_t encoder_id; /**< Current Encoder */ | ||
174 | uint32_t connector_id; /**< Id */ | ||
175 | uint32_t connector_type; | ||
176 | uint32_t connector_type_id; | ||
177 | |||
178 | uint32_t connection; | ||
179 | uint32_t mm_width, mm_height; /**< HxW in millimeters */ | ||
180 | uint32_t subpixel; | ||
181 | }; | ||
182 | |||
183 | #define DRM_MODE_PROP_PENDING (1<<0) | ||
184 | #define DRM_MODE_PROP_RANGE (1<<1) | ||
185 | #define DRM_MODE_PROP_IMMUTABLE (1<<2) | ||
186 | #define DRM_MODE_PROP_ENUM (1<<3) /* enumerated type with text strings */ | ||
187 | #define DRM_MODE_PROP_BLOB (1<<4) | ||
188 | |||
189 | struct drm_mode_property_enum { | ||
190 | uint64_t value; | ||
191 | char name[DRM_PROP_NAME_LEN]; | ||
192 | }; | ||
193 | |||
194 | struct drm_mode_get_property { | ||
195 | uint64_t values_ptr; /* values and blob lengths */ | ||
196 | uint64_t enum_blob_ptr; /* enum and blob id ptrs */ | ||
197 | |||
198 | uint32_t prop_id; | ||
199 | uint32_t flags; | ||
200 | char name[DRM_PROP_NAME_LEN]; | ||
201 | |||
202 | uint32_t count_values; | ||
203 | uint32_t count_enum_blobs; | ||
204 | }; | ||
205 | |||
206 | struct drm_mode_connector_set_property { | ||
207 | uint64_t value; | ||
208 | uint32_t prop_id; | ||
209 | uint32_t connector_id; | ||
210 | }; | ||
211 | |||
212 | struct drm_mode_get_blob { | ||
213 | uint32_t blob_id; | ||
214 | uint32_t length; | ||
215 | uint64_t data; | ||
216 | }; | ||
217 | |||
218 | struct drm_mode_fb_cmd { | ||
219 | uint32_t fb_id; | ||
220 | uint32_t width, height; | ||
221 | uint32_t pitch; | ||
222 | uint32_t bpp; | ||
223 | uint32_t depth; | ||
224 | /* driver specific handle */ | ||
225 | uint32_t handle; | ||
226 | }; | ||
227 | |||
228 | struct drm_mode_mode_cmd { | ||
229 | uint32_t connector_id; | ||
230 | struct drm_mode_modeinfo mode; | ||
231 | }; | ||
232 | |||
233 | #define DRM_MODE_CURSOR_BO (1<<0) | ||
234 | #define DRM_MODE_CURSOR_MOVE (1<<1) | ||
235 | |||
236 | /* | ||
237 | * depending on the value in flags diffrent members are used. | ||
238 | * | ||
239 | * CURSOR_BO uses | ||
240 | * crtc | ||
241 | * width | ||
242 | * height | ||
243 | * handle - if 0 turns the cursor of | ||
244 | * | ||
245 | * CURSOR_MOVE uses | ||
246 | * crtc | ||
247 | * x | ||
248 | * y | ||
249 | */ | ||
250 | struct drm_mode_cursor { | ||
251 | uint32_t flags; | ||
252 | uint32_t crtc_id; | ||
253 | int32_t x; | ||
254 | int32_t y; | ||
255 | uint32_t width; | ||
256 | uint32_t height; | ||
257 | /* driver specific handle */ | ||
258 | uint32_t handle; | ||
259 | }; | ||
260 | |||
261 | struct drm_mode_crtc_lut { | ||
262 | uint32_t crtc_id; | ||
263 | uint32_t gamma_size; | ||
264 | |||
265 | /* pointers to arrays */ | ||
266 | uint64_t red; | ||
267 | uint64_t green; | ||
268 | uint64_t blue; | ||
269 | }; | ||
270 | |||
271 | #endif | ||
diff --git a/include/drm/drm_sarea.h b/include/drm/drm_sarea.h index 480037331e4e..ee5389d22c64 100644 --- a/include/drm/drm_sarea.h +++ b/include/drm/drm_sarea.h | |||
@@ -36,12 +36,12 @@ | |||
36 | 36 | ||
37 | /* SAREA area needs to be at least a page */ | 37 | /* SAREA area needs to be at least a page */ |
38 | #if defined(__alpha__) | 38 | #if defined(__alpha__) |
39 | #define SAREA_MAX 0x2000 | 39 | #define SAREA_MAX 0x2000U |
40 | #elif defined(__ia64__) | 40 | #elif defined(__ia64__) |
41 | #define SAREA_MAX 0x10000 /* 64kB */ | 41 | #define SAREA_MAX 0x10000U /* 64kB */ |
42 | #else | 42 | #else |
43 | /* Intel 830M driver needs at least 8k SAREA */ | 43 | /* Intel 830M driver needs at least 8k SAREA */ |
44 | #define SAREA_MAX 0x2000 | 44 | #define SAREA_MAX 0x2000U |
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | /** Maximum number of drawables in the SAREA */ | 47 | /** Maximum number of drawables in the SAREA */ |
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index 152b34da927c..b3bcf72dc656 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
@@ -113,8 +113,31 @@ typedef struct _drm_i915_sarea { | |||
113 | int pipeB_y; | 113 | int pipeB_y; |
114 | int pipeB_w; | 114 | int pipeB_w; |
115 | int pipeB_h; | 115 | int pipeB_h; |
116 | |||
117 | /* fill out some space for old userspace triple buffer */ | ||
118 | drm_handle_t unused_handle; | ||
119 | uint32_t unused1, unused2, unused3; | ||
120 | |||
121 | /* buffer object handles for static buffers. May change | ||
122 | * over the lifetime of the client. | ||
123 | */ | ||
124 | uint32_t front_bo_handle; | ||
125 | uint32_t back_bo_handle; | ||
126 | uint32_t unused_bo_handle; | ||
127 | uint32_t depth_bo_handle; | ||
128 | |||
116 | } drm_i915_sarea_t; | 129 | } drm_i915_sarea_t; |
117 | 130 | ||
131 | /* due to userspace building against these headers we need some compat here */ | ||
132 | #define planeA_x pipeA_x | ||
133 | #define planeA_y pipeA_y | ||
134 | #define planeA_w pipeA_w | ||
135 | #define planeA_h pipeA_h | ||
136 | #define planeB_x pipeB_x | ||
137 | #define planeB_y pipeB_y | ||
138 | #define planeB_w pipeB_w | ||
139 | #define planeB_h pipeB_h | ||
140 | |||
118 | /* Flags for perf_boxes | 141 | /* Flags for perf_boxes |
119 | */ | 142 | */ |
120 | #define I915_BOX_RING_EMPTY 0x1 | 143 | #define I915_BOX_RING_EMPTY 0x1 |
@@ -160,6 +183,7 @@ typedef struct _drm_i915_sarea { | |||
160 | #define DRM_I915_GEM_SET_TILING 0x21 | 183 | #define DRM_I915_GEM_SET_TILING 0x21 |
161 | #define DRM_I915_GEM_GET_TILING 0x22 | 184 | #define DRM_I915_GEM_GET_TILING 0x22 |
162 | #define DRM_I915_GEM_GET_APERTURE 0x23 | 185 | #define DRM_I915_GEM_GET_APERTURE 0x23 |
186 | #define DRM_I915_GEM_MMAP_GTT 0x24 | ||
163 | 187 | ||
164 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) | 188 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) |
165 | #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) | 189 | #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) |
@@ -177,6 +201,8 @@ typedef struct _drm_i915_sarea { | |||
177 | #define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t) | 201 | #define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t) |
178 | #define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t) | 202 | #define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t) |
179 | #define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t) | 203 | #define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t) |
204 | #define DRM_IOCTL_I915_GEM_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_INIT, struct drm_i915_gem_init) | ||
205 | #define DRM_IOCTL_I915_GEM_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer) | ||
180 | #define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin) | 206 | #define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin) |
181 | #define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin) | 207 | #define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin) |
182 | #define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) | 208 | #define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) |
@@ -187,6 +213,7 @@ typedef struct _drm_i915_sarea { | |||
187 | #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) | 213 | #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) |
188 | #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) | 214 | #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) |
189 | #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) | 215 | #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) |
216 | #define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt) | ||
190 | #define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) | 217 | #define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) |
191 | #define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish) | 218 | #define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish) |
192 | #define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) | 219 | #define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) |
@@ -196,7 +223,7 @@ typedef struct _drm_i915_sarea { | |||
196 | /* Allow drivers to submit batchbuffers directly to hardware, relying | 223 | /* Allow drivers to submit batchbuffers directly to hardware, relying |
197 | * on the security mechanisms provided by hardware. | 224 | * on the security mechanisms provided by hardware. |
198 | */ | 225 | */ |
199 | typedef struct _drm_i915_batchbuffer { | 226 | typedef struct drm_i915_batchbuffer { |
200 | int start; /* agp offset */ | 227 | int start; /* agp offset */ |
201 | int used; /* nr bytes in use */ | 228 | int used; /* nr bytes in use */ |
202 | int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */ | 229 | int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */ |
@@ -382,6 +409,18 @@ struct drm_i915_gem_mmap { | |||
382 | uint64_t addr_ptr; | 409 | uint64_t addr_ptr; |
383 | }; | 410 | }; |
384 | 411 | ||
412 | struct drm_i915_gem_mmap_gtt { | ||
413 | /** Handle for the object being mapped. */ | ||
414 | uint32_t handle; | ||
415 | uint32_t pad; | ||
416 | /** | ||
417 | * Fake offset to use for subsequent mmap call | ||
418 | * | ||
419 | * This is a fixed-size type for 32/64 compatibility. | ||
420 | */ | ||
421 | uint64_t offset; | ||
422 | }; | ||
423 | |||
385 | struct drm_i915_gem_set_domain { | 424 | struct drm_i915_gem_set_domain { |
386 | /** Handle for the object */ | 425 | /** Handle for the object */ |
387 | uint32_t handle; | 426 | uint32_t handle; |
diff --git a/include/linux/8250_pci.h b/include/linux/8250_pci.h index 3209dd46ea7d..b24ff086a662 100644 --- a/include/linux/8250_pci.h +++ b/include/linux/8250_pci.h | |||
@@ -31,7 +31,7 @@ struct pciserial_board { | |||
31 | struct serial_private; | 31 | struct serial_private; |
32 | 32 | ||
33 | struct serial_private * | 33 | struct serial_private * |
34 | pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board); | 34 | pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board); |
35 | void pciserial_remove_ports(struct serial_private *priv); | 35 | void pciserial_remove_ports(struct serial_private *priv); |
36 | void pciserial_suspend_ports(struct serial_private *priv); | 36 | void pciserial_suspend_ports(struct serial_private *priv); |
37 | void pciserial_resume_ports(struct serial_private *priv); | 37 | void pciserial_resume_ports(struct serial_private *priv); |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index e531783e5d78..12e9a2957caf 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -56,8 +56,6 @@ header-y += dlm_device.h | |||
56 | header-y += dlm_netlink.h | 56 | header-y += dlm_netlink.h |
57 | header-y += dm-ioctl.h | 57 | header-y += dm-ioctl.h |
58 | header-y += dn.h | 58 | header-y += dn.h |
59 | header-y += dqblk_v1.h | ||
60 | header-y += dqblk_v2.h | ||
61 | header-y += dqblk_xfs.h | 59 | header-y += dqblk_xfs.h |
62 | header-y += efs_fs_sb.h | 60 | header-y += efs_fs_sb.h |
63 | header-y += elf-fdpic.h | 61 | header-y += elf-fdpic.h |
@@ -134,8 +132,6 @@ header-y += posix_types.h | |||
134 | header-y += ppdev.h | 132 | header-y += ppdev.h |
135 | header-y += prctl.h | 133 | header-y += prctl.h |
136 | header-y += qnxtypes.h | 134 | header-y += qnxtypes.h |
137 | header-y += quotaio_v1.h | ||
138 | header-y += quotaio_v2.h | ||
139 | header-y += radeonfb.h | 135 | header-y += radeonfb.h |
140 | header-y += raw.h | 136 | header-y += raw.h |
141 | header-y += resource.h | 137 | header-y += resource.h |
@@ -183,7 +179,6 @@ unifdef-y += auto_fs.h | |||
183 | unifdef-y += auxvec.h | 179 | unifdef-y += auxvec.h |
184 | unifdef-y += binfmts.h | 180 | unifdef-y += binfmts.h |
185 | unifdef-y += blktrace_api.h | 181 | unifdef-y += blktrace_api.h |
186 | unifdef-y += byteorder.h | ||
187 | unifdef-y += capability.h | 182 | unifdef-y += capability.h |
188 | unifdef-y += capi.h | 183 | unifdef-y += capi.h |
189 | unifdef-y += cciss_ioctl.h | 184 | unifdef-y += cciss_ioctl.h |
@@ -313,6 +308,7 @@ unifdef-y += ptrace.h | |||
313 | unifdef-y += qnx4_fs.h | 308 | unifdef-y += qnx4_fs.h |
314 | unifdef-y += quota.h | 309 | unifdef-y += quota.h |
315 | unifdef-y += random.h | 310 | unifdef-y += random.h |
311 | unifdef-y += irqnr.h | ||
316 | unifdef-y += reboot.h | 312 | unifdef-y += reboot.h |
317 | unifdef-y += reiserfs_fs.h | 313 | unifdef-y += reiserfs_fs.h |
318 | unifdef-y += reiserfs_xattr.h | 314 | unifdef-y += reiserfs_xattr.h |
@@ -375,3 +371,5 @@ unifdef-y += xattr.h | |||
375 | unifdef-y += xfrm.h | 371 | unifdef-y += xfrm.h |
376 | 372 | ||
377 | objhdr-y += version.h | 373 | objhdr-y += version.h |
374 | header-y += wimax.h | ||
375 | header-y += wimax/ | ||
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index fba8051fb297..6fce2fc2d124 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -131,22 +131,6 @@ extern int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity); | |||
131 | */ | 131 | */ |
132 | void acpi_unregister_gsi (u32 gsi); | 132 | void acpi_unregister_gsi (u32 gsi); |
133 | 133 | ||
134 | struct acpi_prt_entry { | ||
135 | struct list_head node; | ||
136 | struct acpi_pci_id id; | ||
137 | u8 pin; | ||
138 | struct { | ||
139 | acpi_handle handle; | ||
140 | u32 index; | ||
141 | } link; | ||
142 | u32 irq; | ||
143 | }; | ||
144 | |||
145 | struct acpi_prt_list { | ||
146 | int count; | ||
147 | struct list_head entries; | ||
148 | }; | ||
149 | |||
150 | struct pci_dev; | 134 | struct pci_dev; |
151 | 135 | ||
152 | int acpi_pci_irq_enable (struct pci_dev *dev); | 136 | int acpi_pci_irq_enable (struct pci_dev *dev); |
@@ -270,6 +254,7 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n, | |||
270 | #ifdef CONFIG_PM_SLEEP | 254 | #ifdef CONFIG_PM_SLEEP |
271 | void __init acpi_no_s4_hw_signature(void); | 255 | void __init acpi_no_s4_hw_signature(void); |
272 | void __init acpi_old_suspend_ordering(void); | 256 | void __init acpi_old_suspend_ordering(void); |
257 | void __init acpi_s4_no_nvs(void); | ||
273 | #endif /* CONFIG_PM_SLEEP */ | 258 | #endif /* CONFIG_PM_SLEEP */ |
274 | #else /* CONFIG_ACPI */ | 259 | #else /* CONFIG_ACPI */ |
275 | 260 | ||
diff --git a/include/linux/aio.h b/include/linux/aio.h index f6b8cf99b596..b16a957030f8 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/workqueue.h> | 5 | #include <linux/workqueue.h> |
6 | #include <linux/aio_abi.h> | 6 | #include <linux/aio_abi.h> |
7 | #include <linux/uio.h> | 7 | #include <linux/uio.h> |
8 | #include <linux/rcupdate.h> | ||
8 | 9 | ||
9 | #include <asm/atomic.h> | 10 | #include <asm/atomic.h> |
10 | 11 | ||
@@ -183,7 +184,7 @@ struct kioctx { | |||
183 | 184 | ||
184 | /* This needs improving */ | 185 | /* This needs improving */ |
185 | unsigned long user_id; | 186 | unsigned long user_id; |
186 | struct kioctx *next; | 187 | struct hlist_node list; |
187 | 188 | ||
188 | wait_queue_head_t wait; | 189 | wait_queue_head_t wait; |
189 | 190 | ||
@@ -199,6 +200,8 @@ struct kioctx { | |||
199 | struct aio_ring_info ring_info; | 200 | struct aio_ring_info ring_info; |
200 | 201 | ||
201 | struct delayed_work wq; | 202 | struct delayed_work wq; |
203 | |||
204 | struct rcu_head rcu_head; | ||
202 | }; | 205 | }; |
203 | 206 | ||
204 | /* prototypes */ | 207 | /* prototypes */ |
diff --git a/include/linux/async.h b/include/linux/async.h new file mode 100644 index 000000000000..c4ecacd0b327 --- /dev/null +++ b/include/linux/async.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * async.h: Asynchronous function calls for boot performance | ||
3 | * | ||
4 | * (C) Copyright 2009 Intel Corporation | ||
5 | * Author: Arjan van de Ven <arjan@linux.intel.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; version 2 | ||
10 | * of the License. | ||
11 | */ | ||
12 | |||
13 | #include <linux/types.h> | ||
14 | #include <linux/list.h> | ||
15 | |||
16 | typedef u64 async_cookie_t; | ||
17 | typedef void (async_func_ptr) (void *data, async_cookie_t cookie); | ||
18 | |||
19 | extern async_cookie_t async_schedule(async_func_ptr *ptr, void *data); | ||
20 | extern async_cookie_t async_schedule_special(async_func_ptr *ptr, void *data, struct list_head *list); | ||
21 | extern void async_synchronize_full(void); | ||
22 | extern void async_synchronize_full_special(struct list_head *list); | ||
23 | extern void async_synchronize_cookie(async_cookie_t cookie); | ||
24 | extern void async_synchronize_cookie_special(async_cookie_t cookie, struct list_head *list); | ||
25 | |||
diff --git a/include/linux/async_tx.h b/include/linux/async_tx.h index 0f50d4cc4360..45f6297821bd 100644 --- a/include/linux/async_tx.h +++ b/include/linux/async_tx.h | |||
@@ -59,9 +59,7 @@ enum async_tx_flags { | |||
59 | }; | 59 | }; |
60 | 60 | ||
61 | #ifdef CONFIG_DMA_ENGINE | 61 | #ifdef CONFIG_DMA_ENGINE |
62 | void async_tx_issue_pending_all(void); | 62 | #define async_tx_issue_pending_all dma_issue_pending_all |
63 | enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx); | ||
64 | void async_tx_run_dependencies(struct dma_async_tx_descriptor *tx); | ||
65 | #ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL | 63 | #ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL |
66 | #include <asm/async_tx.h> | 64 | #include <asm/async_tx.h> |
67 | #else | 65 | #else |
@@ -77,19 +75,6 @@ static inline void async_tx_issue_pending_all(void) | |||
77 | do { } while (0); | 75 | do { } while (0); |
78 | } | 76 | } |
79 | 77 | ||
80 | static inline enum dma_status | ||
81 | dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx) | ||
82 | { | ||
83 | return DMA_SUCCESS; | ||
84 | } | ||
85 | |||
86 | static inline void | ||
87 | async_tx_run_dependencies(struct dma_async_tx_descriptor *tx, | ||
88 | struct dma_chan *host_chan) | ||
89 | { | ||
90 | do { } while (0); | ||
91 | } | ||
92 | |||
93 | static inline struct dma_chan * | 78 | static inline struct dma_chan * |
94 | async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, | 79 | async_tx_find_channel(struct dma_async_tx_descriptor *depend_tx, |
95 | enum dma_transaction_type tx_type, struct page **dst, int dst_count, | 80 | enum dma_transaction_type tx_type, struct page **dst, int dst_count, |
diff --git a/include/linux/atmel-mci.h b/include/linux/atmel-mci.h new file mode 100644 index 000000000000..2f1f95737acb --- /dev/null +++ b/include/linux/atmel-mci.h | |||
@@ -0,0 +1,39 @@ | |||
1 | #ifndef __LINUX_ATMEL_MCI_H | ||
2 | #define __LINUX_ATMEL_MCI_H | ||
3 | |||
4 | #define ATMEL_MCI_MAX_NR_SLOTS 2 | ||
5 | |||
6 | #include <linux/dw_dmac.h> | ||
7 | |||
8 | /** | ||
9 | * struct mci_slot_pdata - board-specific per-slot configuration | ||
10 | * @bus_width: Number of data lines wired up the slot | ||
11 | * @detect_pin: GPIO pin wired to the card detect switch | ||
12 | * @wp_pin: GPIO pin wired to the write protect sensor | ||
13 | * | ||
14 | * If a given slot is not present on the board, @bus_width should be | ||
15 | * set to 0. The other fields are ignored in this case. | ||
16 | * | ||
17 | * Any pins that aren't available should be set to a negative value. | ||
18 | * | ||
19 | * Note that support for multiple slots is experimental -- some cards | ||
20 | * might get upset if we don't get the clock management exactly right. | ||
21 | * But in most cases, it should work just fine. | ||
22 | */ | ||
23 | struct mci_slot_pdata { | ||
24 | unsigned int bus_width; | ||
25 | int detect_pin; | ||
26 | int wp_pin; | ||
27 | }; | ||
28 | |||
29 | /** | ||
30 | * struct mci_platform_data - board-specific MMC/SDcard configuration | ||
31 | * @dma_slave: DMA slave interface to use in data transfers. | ||
32 | * @slot: Per-slot configuration data. | ||
33 | */ | ||
34 | struct mci_platform_data { | ||
35 | struct dw_dma_slave dma_slave; | ||
36 | struct mci_slot_pdata slot[ATMEL_MCI_MAX_NR_SLOTS]; | ||
37 | }; | ||
38 | |||
39 | #endif /* __LINUX_ATMEL_MCI_H */ | ||
diff --git a/include/linux/audit.h b/include/linux/audit.h index 26c4f6f65a46..67e5dbfc2961 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -247,6 +247,18 @@ | |||
247 | #define AUDIT_GREATER_THAN_OR_EQUAL (AUDIT_GREATER_THAN|AUDIT_EQUAL) | 247 | #define AUDIT_GREATER_THAN_OR_EQUAL (AUDIT_GREATER_THAN|AUDIT_EQUAL) |
248 | #define AUDIT_OPERATORS (AUDIT_EQUAL|AUDIT_NOT_EQUAL|AUDIT_BIT_MASK) | 248 | #define AUDIT_OPERATORS (AUDIT_EQUAL|AUDIT_NOT_EQUAL|AUDIT_BIT_MASK) |
249 | 249 | ||
250 | enum { | ||
251 | Audit_equal, | ||
252 | Audit_not_equal, | ||
253 | Audit_bitmask, | ||
254 | Audit_bittest, | ||
255 | Audit_lt, | ||
256 | Audit_gt, | ||
257 | Audit_le, | ||
258 | Audit_ge, | ||
259 | Audit_bad | ||
260 | }; | ||
261 | |||
250 | /* Status symbols */ | 262 | /* Status symbols */ |
251 | /* Mask values */ | 263 | /* Mask values */ |
252 | #define AUDIT_STATUS_ENABLED 0x0001 | 264 | #define AUDIT_STATUS_ENABLED 0x0001 |
@@ -373,6 +385,8 @@ struct audit_krule { | |||
373 | struct audit_watch *watch; /* associated watch */ | 385 | struct audit_watch *watch; /* associated watch */ |
374 | struct audit_tree *tree; /* associated watched tree */ | 386 | struct audit_tree *tree; /* associated watched tree */ |
375 | struct list_head rlist; /* entry in audit_{watch,tree}.rules list */ | 387 | struct list_head rlist; /* entry in audit_{watch,tree}.rules list */ |
388 | struct list_head list; /* for AUDIT_LIST* purposes only */ | ||
389 | u64 prio; | ||
376 | }; | 390 | }; |
377 | 391 | ||
378 | struct audit_field { | 392 | struct audit_field { |
@@ -443,70 +457,56 @@ extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); | |||
443 | #define audit_get_loginuid(t) ((t)->loginuid) | 457 | #define audit_get_loginuid(t) ((t)->loginuid) |
444 | #define audit_get_sessionid(t) ((t)->sessionid) | 458 | #define audit_get_sessionid(t) ((t)->sessionid) |
445 | extern void audit_log_task_context(struct audit_buffer *ab); | 459 | extern void audit_log_task_context(struct audit_buffer *ab); |
446 | extern int __audit_ipc_obj(struct kern_ipc_perm *ipcp); | 460 | extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp); |
447 | extern int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); | 461 | extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); |
448 | extern int audit_bprm(struct linux_binprm *bprm); | 462 | extern int audit_bprm(struct linux_binprm *bprm); |
449 | extern int audit_socketcall(int nargs, unsigned long *args); | 463 | extern void audit_socketcall(int nargs, unsigned long *args); |
450 | extern int audit_sockaddr(int len, void *addr); | 464 | extern int audit_sockaddr(int len, void *addr); |
451 | extern int __audit_fd_pair(int fd1, int fd2); | 465 | extern void __audit_fd_pair(int fd1, int fd2); |
452 | extern int audit_set_macxattr(const char *name); | 466 | extern int audit_set_macxattr(const char *name); |
453 | extern int __audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr); | 467 | extern void __audit_mq_open(int oflag, mode_t mode, struct mq_attr *attr); |
454 | extern int __audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout); | 468 | extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout); |
455 | extern int __audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout); | 469 | extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification); |
456 | extern int __audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification); | 470 | extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); |
457 | extern int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); | ||
458 | extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm, | 471 | extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm, |
459 | const struct cred *new, | 472 | const struct cred *new, |
460 | const struct cred *old); | 473 | const struct cred *old); |
461 | extern int __audit_log_capset(pid_t pid, const struct cred *new, const struct cred *old); | 474 | extern void __audit_log_capset(pid_t pid, const struct cred *new, const struct cred *old); |
462 | 475 | ||
463 | static inline int audit_ipc_obj(struct kern_ipc_perm *ipcp) | 476 | static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp) |
464 | { | 477 | { |
465 | if (unlikely(!audit_dummy_context())) | 478 | if (unlikely(!audit_dummy_context())) |
466 | return __audit_ipc_obj(ipcp); | 479 | __audit_ipc_obj(ipcp); |
467 | return 0; | ||
468 | } | ||
469 | static inline int audit_fd_pair(int fd1, int fd2) | ||
470 | { | ||
471 | if (unlikely(!audit_dummy_context())) | ||
472 | return __audit_fd_pair(fd1, fd2); | ||
473 | return 0; | ||
474 | } | 480 | } |
475 | static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) | 481 | static inline void audit_fd_pair(int fd1, int fd2) |
476 | { | 482 | { |
477 | if (unlikely(!audit_dummy_context())) | 483 | if (unlikely(!audit_dummy_context())) |
478 | return __audit_ipc_set_perm(qbytes, uid, gid, mode); | 484 | __audit_fd_pair(fd1, fd2); |
479 | return 0; | ||
480 | } | 485 | } |
481 | static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr) | 486 | static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode) |
482 | { | 487 | { |
483 | if (unlikely(!audit_dummy_context())) | 488 | if (unlikely(!audit_dummy_context())) |
484 | return __audit_mq_open(oflag, mode, u_attr); | 489 | __audit_ipc_set_perm(qbytes, uid, gid, mode); |
485 | return 0; | ||
486 | } | 490 | } |
487 | static inline int audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout) | 491 | static inline void audit_mq_open(int oflag, mode_t mode, struct mq_attr *attr) |
488 | { | 492 | { |
489 | if (unlikely(!audit_dummy_context())) | 493 | if (unlikely(!audit_dummy_context())) |
490 | return __audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout); | 494 | __audit_mq_open(oflag, mode, attr); |
491 | return 0; | ||
492 | } | 495 | } |
493 | static inline int audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout) | 496 | static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout) |
494 | { | 497 | { |
495 | if (unlikely(!audit_dummy_context())) | 498 | if (unlikely(!audit_dummy_context())) |
496 | return __audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout); | 499 | __audit_mq_sendrecv(mqdes, msg_len, msg_prio, abs_timeout); |
497 | return 0; | ||
498 | } | 500 | } |
499 | static inline int audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification) | 501 | static inline void audit_mq_notify(mqd_t mqdes, const struct sigevent *notification) |
500 | { | 502 | { |
501 | if (unlikely(!audit_dummy_context())) | 503 | if (unlikely(!audit_dummy_context())) |
502 | return __audit_mq_notify(mqdes, u_notification); | 504 | __audit_mq_notify(mqdes, notification); |
503 | return 0; | ||
504 | } | 505 | } |
505 | static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) | 506 | static inline void audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat) |
506 | { | 507 | { |
507 | if (unlikely(!audit_dummy_context())) | 508 | if (unlikely(!audit_dummy_context())) |
508 | return __audit_mq_getsetattr(mqdes, mqstat); | 509 | __audit_mq_getsetattr(mqdes, mqstat); |
509 | return 0; | ||
510 | } | 510 | } |
511 | 511 | ||
512 | static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm, | 512 | static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm, |
@@ -518,12 +518,11 @@ static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm, | |||
518 | return 0; | 518 | return 0; |
519 | } | 519 | } |
520 | 520 | ||
521 | static inline int audit_log_capset(pid_t pid, const struct cred *new, | 521 | static inline void audit_log_capset(pid_t pid, const struct cred *new, |
522 | const struct cred *old) | 522 | const struct cred *old) |
523 | { | 523 | { |
524 | if (unlikely(!audit_dummy_context())) | 524 | if (unlikely(!audit_dummy_context())) |
525 | return __audit_log_capset(pid, new, old); | 525 | __audit_log_capset(pid, new, old); |
526 | return 0; | ||
527 | } | 526 | } |
528 | 527 | ||
529 | extern int audit_n_rules; | 528 | extern int audit_n_rules; |
@@ -546,20 +545,19 @@ extern int audit_signals; | |||
546 | #define audit_get_loginuid(t) (-1) | 545 | #define audit_get_loginuid(t) (-1) |
547 | #define audit_get_sessionid(t) (-1) | 546 | #define audit_get_sessionid(t) (-1) |
548 | #define audit_log_task_context(b) do { ; } while (0) | 547 | #define audit_log_task_context(b) do { ; } while (0) |
549 | #define audit_ipc_obj(i) ({ 0; }) | 548 | #define audit_ipc_obj(i) ((void)0) |
550 | #define audit_ipc_set_perm(q,u,g,m) ({ 0; }) | 549 | #define audit_ipc_set_perm(q,u,g,m) ((void)0) |
551 | #define audit_bprm(p) ({ 0; }) | 550 | #define audit_bprm(p) ({ 0; }) |
552 | #define audit_socketcall(n,a) ({ 0; }) | 551 | #define audit_socketcall(n,a) ((void)0) |
553 | #define audit_fd_pair(n,a) ({ 0; }) | 552 | #define audit_fd_pair(n,a) ((void)0) |
554 | #define audit_sockaddr(len, addr) ({ 0; }) | 553 | #define audit_sockaddr(len, addr) ({ 0; }) |
555 | #define audit_set_macxattr(n) do { ; } while (0) | 554 | #define audit_set_macxattr(n) do { ; } while (0) |
556 | #define audit_mq_open(o,m,a) ({ 0; }) | 555 | #define audit_mq_open(o,m,a) ((void)0) |
557 | #define audit_mq_timedsend(d,l,p,t) ({ 0; }) | 556 | #define audit_mq_sendrecv(d,l,p,t) ((void)0) |
558 | #define audit_mq_timedreceive(d,l,p,t) ({ 0; }) | 557 | #define audit_mq_notify(d,n) ((void)0) |
559 | #define audit_mq_notify(d,n) ({ 0; }) | 558 | #define audit_mq_getsetattr(d,s) ((void)0) |
560 | #define audit_mq_getsetattr(d,s) ({ 0; }) | ||
561 | #define audit_log_bprm_fcaps(b, ncr, ocr) ({ 0; }) | 559 | #define audit_log_bprm_fcaps(b, ncr, ocr) ({ 0; }) |
562 | #define audit_log_capset(pid, ncr, ocr) ({ 0; }) | 560 | #define audit_log_capset(pid, ncr, ocr) ((void)0) |
563 | #define audit_ptrace(t) ((void)0) | 561 | #define audit_ptrace(t) ((void)0) |
564 | #define audit_n_rules 0 | 562 | #define audit_n_rules 0 |
565 | #define audit_signals 0 | 563 | #define audit_signals 0 |
diff --git a/include/linux/auto_dev-ioctl.h b/include/linux/auto_dev-ioctl.h index f4d05ccd731f..91a773993a5c 100644 --- a/include/linux/auto_dev-ioctl.h +++ b/include/linux/auto_dev-ioctl.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #ifndef _LINUX_AUTO_DEV_IOCTL_H | 10 | #ifndef _LINUX_AUTO_DEV_IOCTL_H |
11 | #define _LINUX_AUTO_DEV_IOCTL_H | 11 | #define _LINUX_AUTO_DEV_IOCTL_H |
12 | 12 | ||
13 | #include <linux/string.h> | ||
13 | #include <linux/types.h> | 14 | #include <linux/types.h> |
14 | 15 | ||
15 | #define AUTOFS_DEVICE_NAME "autofs" | 16 | #define AUTOFS_DEVICE_NAME "autofs" |
@@ -25,6 +26,60 @@ | |||
25 | * An ioctl interface for autofs mount point control. | 26 | * An ioctl interface for autofs mount point control. |
26 | */ | 27 | */ |
27 | 28 | ||
29 | struct args_protover { | ||
30 | __u32 version; | ||
31 | }; | ||
32 | |||
33 | struct args_protosubver { | ||
34 | __u32 sub_version; | ||
35 | }; | ||
36 | |||
37 | struct args_openmount { | ||
38 | __u32 devid; | ||
39 | }; | ||
40 | |||
41 | struct args_ready { | ||
42 | __u32 token; | ||
43 | }; | ||
44 | |||
45 | struct args_fail { | ||
46 | __u32 token; | ||
47 | __s32 status; | ||
48 | }; | ||
49 | |||
50 | struct args_setpipefd { | ||
51 | __s32 pipefd; | ||
52 | }; | ||
53 | |||
54 | struct args_timeout { | ||
55 | __u64 timeout; | ||
56 | }; | ||
57 | |||
58 | struct args_requester { | ||
59 | __u32 uid; | ||
60 | __u32 gid; | ||
61 | }; | ||
62 | |||
63 | struct args_expire { | ||
64 | __u32 how; | ||
65 | }; | ||
66 | |||
67 | struct args_askumount { | ||
68 | __u32 may_umount; | ||
69 | }; | ||
70 | |||
71 | struct args_ismountpoint { | ||
72 | union { | ||
73 | struct args_in { | ||
74 | __u32 type; | ||
75 | } in; | ||
76 | struct args_out { | ||
77 | __u32 devid; | ||
78 | __u32 magic; | ||
79 | } out; | ||
80 | }; | ||
81 | }; | ||
82 | |||
28 | /* | 83 | /* |
29 | * All the ioctls use this structure. | 84 | * All the ioctls use this structure. |
30 | * When sending a path size must account for the total length | 85 | * When sending a path size must account for the total length |
@@ -39,20 +94,32 @@ struct autofs_dev_ioctl { | |||
39 | * including this struct */ | 94 | * including this struct */ |
40 | __s32 ioctlfd; /* automount command fd */ | 95 | __s32 ioctlfd; /* automount command fd */ |
41 | 96 | ||
42 | __u32 arg1; /* Command parameters */ | 97 | /* Command parameters */ |
43 | __u32 arg2; | 98 | |
99 | union { | ||
100 | struct args_protover protover; | ||
101 | struct args_protosubver protosubver; | ||
102 | struct args_openmount openmount; | ||
103 | struct args_ready ready; | ||
104 | struct args_fail fail; | ||
105 | struct args_setpipefd setpipefd; | ||
106 | struct args_timeout timeout; | ||
107 | struct args_requester requester; | ||
108 | struct args_expire expire; | ||
109 | struct args_askumount askumount; | ||
110 | struct args_ismountpoint ismountpoint; | ||
111 | }; | ||
44 | 112 | ||
45 | char path[0]; | 113 | char path[0]; |
46 | }; | 114 | }; |
47 | 115 | ||
48 | static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in) | 116 | static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in) |
49 | { | 117 | { |
118 | memset(in, 0, sizeof(struct autofs_dev_ioctl)); | ||
50 | in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR; | 119 | in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR; |
51 | in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR; | 120 | in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR; |
52 | in->size = sizeof(struct autofs_dev_ioctl); | 121 | in->size = sizeof(struct autofs_dev_ioctl); |
53 | in->ioctlfd = -1; | 122 | in->ioctlfd = -1; |
54 | in->arg1 = 0; | ||
55 | in->arg2 = 0; | ||
56 | return; | 123 | return; |
57 | } | 124 | } |
58 | 125 | ||
diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h index 2253716d4b92..55fa478bd639 100644 --- a/include/linux/auto_fs4.h +++ b/include/linux/auto_fs4.h | |||
@@ -29,10 +29,64 @@ | |||
29 | #define AUTOFS_EXP_IMMEDIATE 1 | 29 | #define AUTOFS_EXP_IMMEDIATE 1 |
30 | #define AUTOFS_EXP_LEAVES 2 | 30 | #define AUTOFS_EXP_LEAVES 2 |
31 | 31 | ||
32 | #define AUTOFS_TYPE_ANY 0x0000 | 32 | #define AUTOFS_TYPE_ANY 0U |
33 | #define AUTOFS_TYPE_INDIRECT 0x0001 | 33 | #define AUTOFS_TYPE_INDIRECT 1U |
34 | #define AUTOFS_TYPE_DIRECT 0x0002 | 34 | #define AUTOFS_TYPE_DIRECT 2U |
35 | #define AUTOFS_TYPE_OFFSET 0x0004 | 35 | #define AUTOFS_TYPE_OFFSET 4U |
36 | |||
37 | static inline void set_autofs_type_indirect(unsigned int *type) | ||
38 | { | ||
39 | *type = AUTOFS_TYPE_INDIRECT; | ||
40 | return; | ||
41 | } | ||
42 | |||
43 | static inline unsigned int autofs_type_indirect(unsigned int type) | ||
44 | { | ||
45 | return (type == AUTOFS_TYPE_INDIRECT); | ||
46 | } | ||
47 | |||
48 | static inline void set_autofs_type_direct(unsigned int *type) | ||
49 | { | ||
50 | *type = AUTOFS_TYPE_DIRECT; | ||
51 | return; | ||
52 | } | ||
53 | |||
54 | static inline unsigned int autofs_type_direct(unsigned int type) | ||
55 | { | ||
56 | return (type == AUTOFS_TYPE_DIRECT); | ||
57 | } | ||
58 | |||
59 | static inline void set_autofs_type_offset(unsigned int *type) | ||
60 | { | ||
61 | *type = AUTOFS_TYPE_OFFSET; | ||
62 | return; | ||
63 | } | ||
64 | |||
65 | static inline unsigned int autofs_type_offset(unsigned int type) | ||
66 | { | ||
67 | return (type == AUTOFS_TYPE_OFFSET); | ||
68 | } | ||
69 | |||
70 | static inline unsigned int autofs_type_trigger(unsigned int type) | ||
71 | { | ||
72 | return (type == AUTOFS_TYPE_DIRECT || type == AUTOFS_TYPE_OFFSET); | ||
73 | } | ||
74 | |||
75 | /* | ||
76 | * This isn't really a type as we use it to say "no type set" to | ||
77 | * indicate we want to search for "any" mount in the | ||
78 | * autofs_dev_ioctl_ismountpoint() device ioctl function. | ||
79 | */ | ||
80 | static inline void set_autofs_type_any(unsigned int *type) | ||
81 | { | ||
82 | *type = AUTOFS_TYPE_ANY; | ||
83 | return; | ||
84 | } | ||
85 | |||
86 | static inline unsigned int autofs_type_any(unsigned int type) | ||
87 | { | ||
88 | return (type == AUTOFS_TYPE_ANY); | ||
89 | } | ||
36 | 90 | ||
37 | /* Daemon notification packet types */ | 91 | /* Daemon notification packet types */ |
38 | enum autofs_notify { | 92 | enum autofs_notify { |
diff --git a/include/linux/auxvec.h b/include/linux/auxvec.h index d7afa9dd6635..f3b5d4e3a2ac 100644 --- a/include/linux/auxvec.h +++ b/include/linux/auxvec.h | |||
@@ -23,16 +23,16 @@ | |||
23 | #define AT_PLATFORM 15 /* string identifying CPU for optimizations */ | 23 | #define AT_PLATFORM 15 /* string identifying CPU for optimizations */ |
24 | #define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ | 24 | #define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ |
25 | #define AT_CLKTCK 17 /* frequency at which times() increments */ | 25 | #define AT_CLKTCK 17 /* frequency at which times() increments */ |
26 | 26 | /* AT_* values 18 through 22 are reserved */ | |
27 | #define AT_SECURE 23 /* secure mode boolean */ | 27 | #define AT_SECURE 23 /* secure mode boolean */ |
28 | |||
29 | #define AT_BASE_PLATFORM 24 /* string identifying real platform, may | 28 | #define AT_BASE_PLATFORM 24 /* string identifying real platform, may |
30 | * differ from AT_PLATFORM. */ | 29 | * differ from AT_PLATFORM. */ |
30 | #define AT_RANDOM 25 /* address of 16 random bytes */ | ||
31 | 31 | ||
32 | #define AT_EXECFN 31 /* filename of program */ | 32 | #define AT_EXECFN 31 /* filename of program */ |
33 | 33 | ||
34 | #ifdef __KERNEL__ | 34 | #ifdef __KERNEL__ |
35 | #define AT_VECTOR_SIZE_BASE 18 /* NEW_AUX_ENT entries in auxiliary table */ | 35 | #define AT_VECTOR_SIZE_BASE 19 /* NEW_AUX_ENT entries in auxiliary table */ |
36 | /* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */ | 36 | /* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */ |
37 | #endif | 37 | #endif |
38 | 38 | ||
diff --git a/include/linux/backlight.h b/include/linux/backlight.h index 1ee9488ca2e4..79ca2da81c87 100644 --- a/include/linux/backlight.h +++ b/include/linux/backlight.h | |||
@@ -31,6 +31,10 @@ struct backlight_device; | |||
31 | struct fb_info; | 31 | struct fb_info; |
32 | 32 | ||
33 | struct backlight_ops { | 33 | struct backlight_ops { |
34 | unsigned int options; | ||
35 | |||
36 | #define BL_CORE_SUSPENDRESUME (1 << 0) | ||
37 | |||
34 | /* Notify the backlight driver some property has changed */ | 38 | /* Notify the backlight driver some property has changed */ |
35 | int (*update_status)(struct backlight_device *); | 39 | int (*update_status)(struct backlight_device *); |
36 | /* Return the current backlight brightness (accounting for power, | 40 | /* Return the current backlight brightness (accounting for power, |
@@ -51,7 +55,19 @@ struct backlight_properties { | |||
51 | modes; 4: full off), see FB_BLANK_XXX */ | 55 | modes; 4: full off), see FB_BLANK_XXX */ |
52 | int power; | 56 | int power; |
53 | /* FB Blanking active? (values as for power) */ | 57 | /* FB Blanking active? (values as for power) */ |
58 | /* Due to be removed, please use (state & BL_CORE_FBBLANK) */ | ||
54 | int fb_blank; | 59 | int fb_blank; |
60 | /* Flags used to signal drivers of state changes */ | ||
61 | /* Upper 4 bits are reserved for driver internal use */ | ||
62 | unsigned int state; | ||
63 | |||
64 | #define BL_CORE_SUSPENDED (1 << 0) /* backlight is suspended */ | ||
65 | #define BL_CORE_FBBLANK (1 << 1) /* backlight is under an fb blank event */ | ||
66 | #define BL_CORE_DRIVER4 (1 << 28) /* reserved for driver specific use */ | ||
67 | #define BL_CORE_DRIVER3 (1 << 29) /* reserved for driver specific use */ | ||
68 | #define BL_CORE_DRIVER2 (1 << 30) /* reserved for driver specific use */ | ||
69 | #define BL_CORE_DRIVER1 (1 << 31) /* reserved for driver specific use */ | ||
70 | |||
55 | }; | 71 | }; |
56 | 72 | ||
57 | struct backlight_device { | 73 | struct backlight_device { |
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 6cbfbe297180..77b4a9e46004 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h | |||
@@ -18,6 +18,7 @@ struct pt_regs; | |||
18 | #define BINPRM_BUF_SIZE 128 | 18 | #define BINPRM_BUF_SIZE 128 |
19 | 19 | ||
20 | #ifdef __KERNEL__ | 20 | #ifdef __KERNEL__ |
21 | #include <linux/list.h> | ||
21 | 22 | ||
22 | #define CORENAME_MAX_SIZE 128 | 23 | #define CORENAME_MAX_SIZE 128 |
23 | 24 | ||
@@ -106,7 +107,7 @@ extern int setup_arg_pages(struct linux_binprm * bprm, | |||
106 | extern int bprm_mm_init(struct linux_binprm *bprm); | 107 | extern int bprm_mm_init(struct linux_binprm *bprm); |
107 | extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); | 108 | extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm); |
108 | extern void install_exec_creds(struct linux_binprm *bprm); | 109 | extern void install_exec_creds(struct linux_binprm *bprm); |
109 | extern int do_coredump(long signr, int exit_code, struct pt_regs * regs); | 110 | extern void do_coredump(long signr, int exit_code, struct pt_regs *regs); |
110 | extern int set_binfmt(struct linux_binfmt *new); | 111 | extern int set_binfmt(struct linux_binfmt *new); |
111 | extern void free_bprm(struct linux_binprm *); | 112 | extern void free_bprm(struct linux_binprm *); |
112 | 113 | ||
diff --git a/include/linux/bio.h b/include/linux/bio.h index 6a642098e5c3..18462c5b8fff 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
@@ -90,10 +90,11 @@ struct bio { | |||
90 | 90 | ||
91 | unsigned int bi_comp_cpu; /* completion CPU */ | 91 | unsigned int bi_comp_cpu; /* completion CPU */ |
92 | 92 | ||
93 | atomic_t bi_cnt; /* pin count */ | ||
94 | |||
93 | struct bio_vec *bi_io_vec; /* the actual vec list */ | 95 | struct bio_vec *bi_io_vec; /* the actual vec list */ |
94 | 96 | ||
95 | bio_end_io_t *bi_end_io; | 97 | bio_end_io_t *bi_end_io; |
96 | atomic_t bi_cnt; /* pin count */ | ||
97 | 98 | ||
98 | void *bi_private; | 99 | void *bi_private; |
99 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | 100 | #if defined(CONFIG_BLK_DEV_INTEGRITY) |
@@ -101,6 +102,13 @@ struct bio { | |||
101 | #endif | 102 | #endif |
102 | 103 | ||
103 | bio_destructor_t *bi_destructor; /* destructor */ | 104 | bio_destructor_t *bi_destructor; /* destructor */ |
105 | |||
106 | /* | ||
107 | * We can inline a number of vecs at the end of the bio, to avoid | ||
108 | * double allocations for a small number of bio_vecs. This member | ||
109 | * MUST obviously be kept at the very end of the bio. | ||
110 | */ | ||
111 | struct bio_vec bi_inline_vecs[0]; | ||
104 | }; | 112 | }; |
105 | 113 | ||
106 | /* | 114 | /* |
@@ -117,6 +125,7 @@ struct bio { | |||
117 | #define BIO_CPU_AFFINE 8 /* complete bio on same CPU as submitted */ | 125 | #define BIO_CPU_AFFINE 8 /* complete bio on same CPU as submitted */ |
118 | #define BIO_NULL_MAPPED 9 /* contains invalid user pages */ | 126 | #define BIO_NULL_MAPPED 9 /* contains invalid user pages */ |
119 | #define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */ | 127 | #define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */ |
128 | #define BIO_QUIET 11 /* Make BIO Quiet */ | ||
120 | #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) | 129 | #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) |
121 | 130 | ||
122 | /* | 131 | /* |
@@ -211,6 +220,11 @@ static inline void *bio_data(struct bio *bio) | |||
211 | return NULL; | 220 | return NULL; |
212 | } | 221 | } |
213 | 222 | ||
223 | static inline int bio_has_allocated_vec(struct bio *bio) | ||
224 | { | ||
225 | return bio->bi_io_vec && bio->bi_io_vec != bio->bi_inline_vecs; | ||
226 | } | ||
227 | |||
214 | /* | 228 | /* |
215 | * will die | 229 | * will die |
216 | */ | 230 | */ |
@@ -332,7 +346,7 @@ struct bio_pair { | |||
332 | extern struct bio_pair *bio_split(struct bio *bi, int first_sectors); | 346 | extern struct bio_pair *bio_split(struct bio *bi, int first_sectors); |
333 | extern void bio_pair_release(struct bio_pair *dbio); | 347 | extern void bio_pair_release(struct bio_pair *dbio); |
334 | 348 | ||
335 | extern struct bio_set *bioset_create(int, int); | 349 | extern struct bio_set *bioset_create(unsigned int, unsigned int); |
336 | extern void bioset_free(struct bio_set *); | 350 | extern void bioset_free(struct bio_set *); |
337 | 351 | ||
338 | extern struct bio *bio_alloc(gfp_t, int); | 352 | extern struct bio *bio_alloc(gfp_t, int); |
@@ -377,6 +391,7 @@ extern struct bio *bio_copy_user_iov(struct request_queue *, | |||
377 | extern int bio_uncopy_user(struct bio *); | 391 | extern int bio_uncopy_user(struct bio *); |
378 | void zero_fill_bio(struct bio *bio); | 392 | void zero_fill_bio(struct bio *bio); |
379 | extern struct bio_vec *bvec_alloc_bs(gfp_t, int, unsigned long *, struct bio_set *); | 393 | extern struct bio_vec *bvec_alloc_bs(gfp_t, int, unsigned long *, struct bio_set *); |
394 | extern void bvec_free_bs(struct bio_set *, struct bio_vec *, unsigned int); | ||
380 | extern unsigned int bvec_nr_vecs(unsigned short idx); | 395 | extern unsigned int bvec_nr_vecs(unsigned short idx); |
381 | 396 | ||
382 | /* | 397 | /* |
@@ -395,13 +410,17 @@ static inline void bio_set_completion_cpu(struct bio *bio, unsigned int cpu) | |||
395 | */ | 410 | */ |
396 | #define BIO_POOL_SIZE 2 | 411 | #define BIO_POOL_SIZE 2 |
397 | #define BIOVEC_NR_POOLS 6 | 412 | #define BIOVEC_NR_POOLS 6 |
413 | #define BIOVEC_MAX_IDX (BIOVEC_NR_POOLS - 1) | ||
398 | 414 | ||
399 | struct bio_set { | 415 | struct bio_set { |
416 | struct kmem_cache *bio_slab; | ||
417 | unsigned int front_pad; | ||
418 | |||
400 | mempool_t *bio_pool; | 419 | mempool_t *bio_pool; |
401 | #if defined(CONFIG_BLK_DEV_INTEGRITY) | 420 | #if defined(CONFIG_BLK_DEV_INTEGRITY) |
402 | mempool_t *bio_integrity_pool; | 421 | mempool_t *bio_integrity_pool; |
403 | #endif | 422 | #endif |
404 | mempool_t *bvec_pools[BIOVEC_NR_POOLS]; | 423 | mempool_t *bvec_pool; |
405 | }; | 424 | }; |
406 | 425 | ||
407 | struct biovec_slab { | 426 | struct biovec_slab { |
@@ -411,6 +430,7 @@ struct biovec_slab { | |||
411 | }; | 430 | }; |
412 | 431 | ||
413 | extern struct bio_set *fs_bio_set; | 432 | extern struct bio_set *fs_bio_set; |
433 | extern struct biovec_slab bvec_slabs[BIOVEC_NR_POOLS] __read_mostly; | ||
414 | 434 | ||
415 | /* | 435 | /* |
416 | * a small number of entries is fine, not going to be performance critical. | 436 | * a small number of entries is fine, not going to be performance critical. |
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index a08c33a26ca9..2878811c6134 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h | |||
@@ -137,9 +137,12 @@ extern void bitmap_copy_le(void *dst, const unsigned long *src, int nbits); | |||
137 | (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \ | 137 | (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \ |
138 | ) | 138 | ) |
139 | 139 | ||
140 | #define small_const_nbits(nbits) \ | ||
141 | (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) | ||
142 | |||
140 | static inline void bitmap_zero(unsigned long *dst, int nbits) | 143 | static inline void bitmap_zero(unsigned long *dst, int nbits) |
141 | { | 144 | { |
142 | if (nbits <= BITS_PER_LONG) | 145 | if (small_const_nbits(nbits)) |
143 | *dst = 0UL; | 146 | *dst = 0UL; |
144 | else { | 147 | else { |
145 | int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); | 148 | int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); |
@@ -150,7 +153,7 @@ static inline void bitmap_zero(unsigned long *dst, int nbits) | |||
150 | static inline void bitmap_fill(unsigned long *dst, int nbits) | 153 | static inline void bitmap_fill(unsigned long *dst, int nbits) |
151 | { | 154 | { |
152 | size_t nlongs = BITS_TO_LONGS(nbits); | 155 | size_t nlongs = BITS_TO_LONGS(nbits); |
153 | if (nlongs > 1) { | 156 | if (!small_const_nbits(nbits)) { |
154 | int len = (nlongs - 1) * sizeof(unsigned long); | 157 | int len = (nlongs - 1) * sizeof(unsigned long); |
155 | memset(dst, 0xff, len); | 158 | memset(dst, 0xff, len); |
156 | } | 159 | } |
@@ -160,7 +163,7 @@ static inline void bitmap_fill(unsigned long *dst, int nbits) | |||
160 | static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, | 163 | static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, |
161 | int nbits) | 164 | int nbits) |
162 | { | 165 | { |
163 | if (nbits <= BITS_PER_LONG) | 166 | if (small_const_nbits(nbits)) |
164 | *dst = *src; | 167 | *dst = *src; |
165 | else { | 168 | else { |
166 | int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); | 169 | int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); |
@@ -171,7 +174,7 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, | |||
171 | static inline void bitmap_and(unsigned long *dst, const unsigned long *src1, | 174 | static inline void bitmap_and(unsigned long *dst, const unsigned long *src1, |
172 | const unsigned long *src2, int nbits) | 175 | const unsigned long *src2, int nbits) |
173 | { | 176 | { |
174 | if (nbits <= BITS_PER_LONG) | 177 | if (small_const_nbits(nbits)) |
175 | *dst = *src1 & *src2; | 178 | *dst = *src1 & *src2; |
176 | else | 179 | else |
177 | __bitmap_and(dst, src1, src2, nbits); | 180 | __bitmap_and(dst, src1, src2, nbits); |
@@ -180,7 +183,7 @@ static inline void bitmap_and(unsigned long *dst, const unsigned long *src1, | |||
180 | static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, | 183 | static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, |
181 | const unsigned long *src2, int nbits) | 184 | const unsigned long *src2, int nbits) |
182 | { | 185 | { |
183 | if (nbits <= BITS_PER_LONG) | 186 | if (small_const_nbits(nbits)) |
184 | *dst = *src1 | *src2; | 187 | *dst = *src1 | *src2; |
185 | else | 188 | else |
186 | __bitmap_or(dst, src1, src2, nbits); | 189 | __bitmap_or(dst, src1, src2, nbits); |
@@ -189,7 +192,7 @@ static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, | |||
189 | static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, | 192 | static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, |
190 | const unsigned long *src2, int nbits) | 193 | const unsigned long *src2, int nbits) |
191 | { | 194 | { |
192 | if (nbits <= BITS_PER_LONG) | 195 | if (small_const_nbits(nbits)) |
193 | *dst = *src1 ^ *src2; | 196 | *dst = *src1 ^ *src2; |
194 | else | 197 | else |
195 | __bitmap_xor(dst, src1, src2, nbits); | 198 | __bitmap_xor(dst, src1, src2, nbits); |
@@ -198,7 +201,7 @@ static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, | |||
198 | static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, | 201 | static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, |
199 | const unsigned long *src2, int nbits) | 202 | const unsigned long *src2, int nbits) |
200 | { | 203 | { |
201 | if (nbits <= BITS_PER_LONG) | 204 | if (small_const_nbits(nbits)) |
202 | *dst = *src1 & ~(*src2); | 205 | *dst = *src1 & ~(*src2); |
203 | else | 206 | else |
204 | __bitmap_andnot(dst, src1, src2, nbits); | 207 | __bitmap_andnot(dst, src1, src2, nbits); |
@@ -207,7 +210,7 @@ static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, | |||
207 | static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, | 210 | static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, |
208 | int nbits) | 211 | int nbits) |
209 | { | 212 | { |
210 | if (nbits <= BITS_PER_LONG) | 213 | if (small_const_nbits(nbits)) |
211 | *dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits); | 214 | *dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits); |
212 | else | 215 | else |
213 | __bitmap_complement(dst, src, nbits); | 216 | __bitmap_complement(dst, src, nbits); |
@@ -216,7 +219,7 @@ static inline void bitmap_complement(unsigned long *dst, const unsigned long *sr | |||
216 | static inline int bitmap_equal(const unsigned long *src1, | 219 | static inline int bitmap_equal(const unsigned long *src1, |
217 | const unsigned long *src2, int nbits) | 220 | const unsigned long *src2, int nbits) |
218 | { | 221 | { |
219 | if (nbits <= BITS_PER_LONG) | 222 | if (small_const_nbits(nbits)) |
220 | return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); | 223 | return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); |
221 | else | 224 | else |
222 | return __bitmap_equal(src1, src2, nbits); | 225 | return __bitmap_equal(src1, src2, nbits); |
@@ -225,7 +228,7 @@ static inline int bitmap_equal(const unsigned long *src1, | |||
225 | static inline int bitmap_intersects(const unsigned long *src1, | 228 | static inline int bitmap_intersects(const unsigned long *src1, |
226 | const unsigned long *src2, int nbits) | 229 | const unsigned long *src2, int nbits) |
227 | { | 230 | { |
228 | if (nbits <= BITS_PER_LONG) | 231 | if (small_const_nbits(nbits)) |
229 | return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0; | 232 | return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0; |
230 | else | 233 | else |
231 | return __bitmap_intersects(src1, src2, nbits); | 234 | return __bitmap_intersects(src1, src2, nbits); |
@@ -234,7 +237,7 @@ static inline int bitmap_intersects(const unsigned long *src1, | |||
234 | static inline int bitmap_subset(const unsigned long *src1, | 237 | static inline int bitmap_subset(const unsigned long *src1, |
235 | const unsigned long *src2, int nbits) | 238 | const unsigned long *src2, int nbits) |
236 | { | 239 | { |
237 | if (nbits <= BITS_PER_LONG) | 240 | if (small_const_nbits(nbits)) |
238 | return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits)); | 241 | return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits)); |
239 | else | 242 | else |
240 | return __bitmap_subset(src1, src2, nbits); | 243 | return __bitmap_subset(src1, src2, nbits); |
@@ -242,7 +245,7 @@ static inline int bitmap_subset(const unsigned long *src1, | |||
242 | 245 | ||
243 | static inline int bitmap_empty(const unsigned long *src, int nbits) | 246 | static inline int bitmap_empty(const unsigned long *src, int nbits) |
244 | { | 247 | { |
245 | if (nbits <= BITS_PER_LONG) | 248 | if (small_const_nbits(nbits)) |
246 | return ! (*src & BITMAP_LAST_WORD_MASK(nbits)); | 249 | return ! (*src & BITMAP_LAST_WORD_MASK(nbits)); |
247 | else | 250 | else |
248 | return __bitmap_empty(src, nbits); | 251 | return __bitmap_empty(src, nbits); |
@@ -250,7 +253,7 @@ static inline int bitmap_empty(const unsigned long *src, int nbits) | |||
250 | 253 | ||
251 | static inline int bitmap_full(const unsigned long *src, int nbits) | 254 | static inline int bitmap_full(const unsigned long *src, int nbits) |
252 | { | 255 | { |
253 | if (nbits <= BITS_PER_LONG) | 256 | if (small_const_nbits(nbits)) |
254 | return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits)); | 257 | return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits)); |
255 | else | 258 | else |
256 | return __bitmap_full(src, nbits); | 259 | return __bitmap_full(src, nbits); |
@@ -258,7 +261,7 @@ static inline int bitmap_full(const unsigned long *src, int nbits) | |||
258 | 261 | ||
259 | static inline int bitmap_weight(const unsigned long *src, int nbits) | 262 | static inline int bitmap_weight(const unsigned long *src, int nbits) |
260 | { | 263 | { |
261 | if (nbits <= BITS_PER_LONG) | 264 | if (small_const_nbits(nbits)) |
262 | return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); | 265 | return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); |
263 | return __bitmap_weight(src, nbits); | 266 | return __bitmap_weight(src, nbits); |
264 | } | 267 | } |
@@ -266,7 +269,7 @@ static inline int bitmap_weight(const unsigned long *src, int nbits) | |||
266 | static inline void bitmap_shift_right(unsigned long *dst, | 269 | static inline void bitmap_shift_right(unsigned long *dst, |
267 | const unsigned long *src, int n, int nbits) | 270 | const unsigned long *src, int n, int nbits) |
268 | { | 271 | { |
269 | if (nbits <= BITS_PER_LONG) | 272 | if (small_const_nbits(nbits)) |
270 | *dst = *src >> n; | 273 | *dst = *src >> n; |
271 | else | 274 | else |
272 | __bitmap_shift_right(dst, src, n, nbits); | 275 | __bitmap_shift_right(dst, src, n, nbits); |
@@ -275,7 +278,7 @@ static inline void bitmap_shift_right(unsigned long *dst, | |||
275 | static inline void bitmap_shift_left(unsigned long *dst, | 278 | static inline void bitmap_shift_left(unsigned long *dst, |
276 | const unsigned long *src, int n, int nbits) | 279 | const unsigned long *src, int n, int nbits) |
277 | { | 280 | { |
278 | if (nbits <= BITS_PER_LONG) | 281 | if (small_const_nbits(nbits)) |
279 | *dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits); | 282 | *dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits); |
280 | else | 283 | else |
281 | __bitmap_shift_left(dst, src, n, nbits); | 284 | __bitmap_shift_left(dst, src, n, nbits); |
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 024f2b027244..61829139795a 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h | |||
@@ -134,9 +134,20 @@ extern unsigned long find_first_bit(const unsigned long *addr, | |||
134 | */ | 134 | */ |
135 | extern unsigned long find_first_zero_bit(const unsigned long *addr, | 135 | extern unsigned long find_first_zero_bit(const unsigned long *addr, |
136 | unsigned long size); | 136 | unsigned long size); |
137 | |||
138 | #endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ | 137 | #endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ |
139 | 138 | ||
139 | #ifdef CONFIG_GENERIC_FIND_LAST_BIT | ||
140 | /** | ||
141 | * find_last_bit - find the last set bit in a memory region | ||
142 | * @addr: The address to start the search at | ||
143 | * @size: The maximum size to search | ||
144 | * | ||
145 | * Returns the bit number of the first set bit, or size. | ||
146 | */ | ||
147 | extern unsigned long find_last_bit(const unsigned long *addr, | ||
148 | unsigned long size); | ||
149 | #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ | ||
150 | |||
140 | #ifdef CONFIG_GENERIC_FIND_NEXT_BIT | 151 | #ifdef CONFIG_GENERIC_FIND_NEXT_BIT |
141 | 152 | ||
142 | /** | 153 | /** |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 031a315c0509..044467ef7b11 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -26,7 +26,6 @@ struct scsi_ioctl_command; | |||
26 | 26 | ||
27 | struct request_queue; | 27 | struct request_queue; |
28 | struct elevator_queue; | 28 | struct elevator_queue; |
29 | typedef struct elevator_queue elevator_t; | ||
30 | struct request_pm_state; | 29 | struct request_pm_state; |
31 | struct blk_trace; | 30 | struct blk_trace; |
32 | struct request; | 31 | struct request; |
@@ -313,7 +312,7 @@ struct request_queue | |||
313 | */ | 312 | */ |
314 | struct list_head queue_head; | 313 | struct list_head queue_head; |
315 | struct request *last_merge; | 314 | struct request *last_merge; |
316 | elevator_t *elevator; | 315 | struct elevator_queue *elevator; |
317 | 316 | ||
318 | /* | 317 | /* |
319 | * the queue request freelist, one for reads and one for writes | 318 | * the queue request freelist, one for reads and one for writes |
@@ -449,6 +448,7 @@ struct request_queue | |||
449 | #define QUEUE_FLAG_FAIL_IO 12 /* fake timeout */ | 448 | #define QUEUE_FLAG_FAIL_IO 12 /* fake timeout */ |
450 | #define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */ | 449 | #define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */ |
451 | #define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */ | 450 | #define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */ |
451 | #define QUEUE_FLAG_VIRT QUEUE_FLAG_NONROT /* paravirt device */ | ||
452 | 452 | ||
453 | static inline int queue_is_locked(struct request_queue *q) | 453 | static inline int queue_is_locked(struct request_queue *q) |
454 | { | 454 | { |
@@ -522,22 +522,32 @@ enum { | |||
522 | * TAG_FLUSH : ordering by tag w/ pre and post flushes | 522 | * TAG_FLUSH : ordering by tag w/ pre and post flushes |
523 | * TAG_FUA : ordering by tag w/ pre flush and FUA write | 523 | * TAG_FUA : ordering by tag w/ pre flush and FUA write |
524 | */ | 524 | */ |
525 | QUEUE_ORDERED_NONE = 0x00, | 525 | QUEUE_ORDERED_BY_DRAIN = 0x01, |
526 | QUEUE_ORDERED_DRAIN = 0x01, | 526 | QUEUE_ORDERED_BY_TAG = 0x02, |
527 | QUEUE_ORDERED_TAG = 0x02, | 527 | QUEUE_ORDERED_DO_PREFLUSH = 0x10, |
528 | 528 | QUEUE_ORDERED_DO_BAR = 0x20, | |
529 | QUEUE_ORDERED_PREFLUSH = 0x10, | 529 | QUEUE_ORDERED_DO_POSTFLUSH = 0x40, |
530 | QUEUE_ORDERED_POSTFLUSH = 0x20, | 530 | QUEUE_ORDERED_DO_FUA = 0x80, |
531 | QUEUE_ORDERED_FUA = 0x40, | 531 | |
532 | 532 | QUEUE_ORDERED_NONE = 0x00, | |
533 | QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN | | 533 | |
534 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_POSTFLUSH, | 534 | QUEUE_ORDERED_DRAIN = QUEUE_ORDERED_BY_DRAIN | |
535 | QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN | | 535 | QUEUE_ORDERED_DO_BAR, |
536 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_FUA, | 536 | QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN | |
537 | QUEUE_ORDERED_TAG_FLUSH = QUEUE_ORDERED_TAG | | 537 | QUEUE_ORDERED_DO_PREFLUSH | |
538 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_POSTFLUSH, | 538 | QUEUE_ORDERED_DO_POSTFLUSH, |
539 | QUEUE_ORDERED_TAG_FUA = QUEUE_ORDERED_TAG | | 539 | QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN | |
540 | QUEUE_ORDERED_PREFLUSH | QUEUE_ORDERED_FUA, | 540 | QUEUE_ORDERED_DO_PREFLUSH | |
541 | QUEUE_ORDERED_DO_FUA, | ||
542 | |||
543 | QUEUE_ORDERED_TAG = QUEUE_ORDERED_BY_TAG | | ||
544 | QUEUE_ORDERED_DO_BAR, | ||
545 | QUEUE_ORDERED_TAG_FLUSH = QUEUE_ORDERED_TAG | | ||
546 | QUEUE_ORDERED_DO_PREFLUSH | | ||
547 | QUEUE_ORDERED_DO_POSTFLUSH, | ||
548 | QUEUE_ORDERED_TAG_FUA = QUEUE_ORDERED_TAG | | ||
549 | QUEUE_ORDERED_DO_PREFLUSH | | ||
550 | QUEUE_ORDERED_DO_FUA, | ||
541 | 551 | ||
542 | /* | 552 | /* |
543 | * Ordered operation sequence | 553 | * Ordered operation sequence |
@@ -585,7 +595,6 @@ enum { | |||
585 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) | 595 | #define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA) |
586 | #define blk_discard_rq(rq) ((rq)->cmd_flags & REQ_DISCARD) | 596 | #define blk_discard_rq(rq) ((rq)->cmd_flags & REQ_DISCARD) |
587 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) | 597 | #define blk_bidi_rq(rq) ((rq)->next_rq != NULL) |
588 | #define blk_empty_barrier(rq) (blk_barrier_rq(rq) && blk_fs_request(rq) && !(rq)->hard_nr_sectors) | ||
589 | /* rq->queuelist of dequeued request must be list_empty() */ | 598 | /* rq->queuelist of dequeued request must be list_empty() */ |
590 | #define blk_queued_rq(rq) (!list_empty(&(rq)->queuelist)) | 599 | #define blk_queued_rq(rq) (!list_empty(&(rq)->queuelist)) |
591 | 600 | ||
@@ -681,6 +690,8 @@ struct rq_map_data { | |||
681 | struct page **pages; | 690 | struct page **pages; |
682 | int page_order; | 691 | int page_order; |
683 | int nr_entries; | 692 | int nr_entries; |
693 | unsigned long offset; | ||
694 | int null_mapped; | ||
684 | }; | 695 | }; |
685 | 696 | ||
686 | struct req_iterator { | 697 | struct req_iterator { |
@@ -855,10 +866,10 @@ extern void blk_queue_rq_timed_out(struct request_queue *, rq_timed_out_fn *); | |||
855 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); | 866 | extern void blk_queue_rq_timeout(struct request_queue *, unsigned int); |
856 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); | 867 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
857 | extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *); | 868 | extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *); |
858 | extern int blk_do_ordered(struct request_queue *, struct request **); | 869 | extern bool blk_do_ordered(struct request_queue *, struct request **); |
859 | extern unsigned blk_ordered_cur_seq(struct request_queue *); | 870 | extern unsigned blk_ordered_cur_seq(struct request_queue *); |
860 | extern unsigned blk_ordered_req_seq(struct request *); | 871 | extern unsigned blk_ordered_req_seq(struct request *); |
861 | extern void blk_ordered_complete_seq(struct request_queue *, unsigned, int); | 872 | extern bool blk_ordered_complete_seq(struct request_queue *, unsigned, int); |
862 | 873 | ||
863 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); | 874 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); |
864 | extern void blk_dump_rq_flags(struct request *, char *); | 875 | extern void blk_dump_rq_flags(struct request *, char *); |
@@ -977,7 +988,6 @@ static inline void put_dev_sector(Sector p) | |||
977 | 988 | ||
978 | struct work_struct; | 989 | struct work_struct; |
979 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); | 990 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); |
980 | void kblockd_flush_work(struct work_struct *work); | ||
981 | 991 | ||
982 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ | 992 | #define MODULE_ALIAS_BLOCKDEV(major,minor) \ |
983 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) | 993 | MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) |
diff --git a/include/linux/blockgroup_lock.h b/include/linux/blockgroup_lock.h index 8607312983bd..e44b88ba552b 100644 --- a/include/linux/blockgroup_lock.h +++ b/include/linux/blockgroup_lock.h | |||
@@ -53,7 +53,10 @@ static inline void bgl_lock_init(struct blockgroup_lock *bgl) | |||
53 | * The accessor is a macro so we can embed a blockgroup_lock into different | 53 | * The accessor is a macro so we can embed a blockgroup_lock into different |
54 | * superblock types | 54 | * superblock types |
55 | */ | 55 | */ |
56 | #define sb_bgl_lock(sb, block_group) \ | 56 | static inline spinlock_t * |
57 | (&(sb)->s_blockgroup_lock.locks[(block_group) & (NR_BG_LOCKS-1)].lock) | 57 | bgl_lock_ptr(struct blockgroup_lock *bgl, unsigned int block_group) |
58 | { | ||
59 | return &bgl->locks[(block_group) & (NR_BG_LOCKS-1)].lock; | ||
60 | } | ||
58 | 61 | ||
59 | #endif | 62 | #endif |
diff --git a/include/linux/bottom_half.h b/include/linux/bottom_half.h index 777dbf695d44..27b1bcffe408 100644 --- a/include/linux/bottom_half.h +++ b/include/linux/bottom_half.h | |||
@@ -2,7 +2,6 @@ | |||
2 | #define _LINUX_BH_H | 2 | #define _LINUX_BH_H |
3 | 3 | ||
4 | extern void local_bh_disable(void); | 4 | extern void local_bh_disable(void); |
5 | extern void __local_bh_enable(void); | ||
6 | extern void _local_bh_enable(void); | 5 | extern void _local_bh_enable(void); |
7 | extern void local_bh_enable(void); | 6 | extern void local_bh_enable(void); |
8 | extern void local_bh_enable_ip(unsigned long ip); | 7 | extern void local_bh_enable_ip(unsigned long ip); |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 3ce64b90118c..bd7ac793be19 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
@@ -35,6 +35,7 @@ enum bh_state_bits { | |||
35 | BH_Ordered, /* ordered write */ | 35 | BH_Ordered, /* ordered write */ |
36 | BH_Eopnotsupp, /* operation not supported (barrier) */ | 36 | BH_Eopnotsupp, /* operation not supported (barrier) */ |
37 | BH_Unwritten, /* Buffer is allocated on disk but not written */ | 37 | BH_Unwritten, /* Buffer is allocated on disk but not written */ |
38 | BH_Quiet, /* Buffer Error Prinks to be quiet */ | ||
38 | 39 | ||
39 | BH_PrivateStart,/* not a state bit, but the first bit available | 40 | BH_PrivateStart,/* not a state bit, but the first bit available |
40 | * for private allocation by other entities | 41 | * for private allocation by other entities |
@@ -170,7 +171,7 @@ void __wait_on_buffer(struct buffer_head *); | |||
170 | wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); | 171 | wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); |
171 | int fsync_bdev(struct block_device *); | 172 | int fsync_bdev(struct block_device *); |
172 | struct super_block *freeze_bdev(struct block_device *); | 173 | struct super_block *freeze_bdev(struct block_device *); |
173 | void thaw_bdev(struct block_device *, struct super_block *); | 174 | int thaw_bdev(struct block_device *, struct super_block *); |
174 | int fsync_super(struct super_block *); | 175 | int fsync_super(struct super_block *); |
175 | int fsync_no_super(struct block_device *); | 176 | int fsync_no_super(struct block_device *); |
176 | struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, | 177 | struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, |
@@ -345,6 +346,15 @@ static inline int remove_inode_buffers(struct inode *inode) { return 1; } | |||
345 | static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; } | 346 | static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; } |
346 | static inline void invalidate_bdev(struct block_device *bdev) {} | 347 | static inline void invalidate_bdev(struct block_device *bdev) {} |
347 | 348 | ||
349 | static inline struct super_block *freeze_bdev(struct block_device *sb) | ||
350 | { | ||
351 | return NULL; | ||
352 | } | ||
353 | |||
354 | static inline int thaw_bdev(struct block_device *bdev, struct super_block *sb) | ||
355 | { | ||
356 | return 0; | ||
357 | } | ||
348 | 358 | ||
349 | #endif /* CONFIG_BLOCK */ | 359 | #endif /* CONFIG_BLOCK */ |
350 | #endif /* _LINUX_BUFFER_HEAD_H */ | 360 | #endif /* _LINUX_BUFFER_HEAD_H */ |
diff --git a/include/linux/byteorder.h b/include/linux/byteorder.h deleted file mode 100644 index 29f002d73d98..000000000000 --- a/include/linux/byteorder.h +++ /dev/null | |||
@@ -1,372 +0,0 @@ | |||
1 | #ifndef _LINUX_BYTEORDER_H | ||
2 | #define _LINUX_BYTEORDER_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <linux/swab.h> | ||
6 | |||
7 | #if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN) | ||
8 | # error Fix asm/byteorder.h to define one endianness | ||
9 | #endif | ||
10 | |||
11 | #if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) | ||
12 | # error Fix asm/byteorder.h to define arch endianness | ||
13 | #endif | ||
14 | |||
15 | #ifdef __LITTLE_ENDIAN | ||
16 | # undef __LITTLE_ENDIAN | ||
17 | # define __LITTLE_ENDIAN 1234 | ||
18 | #endif | ||
19 | |||
20 | #ifdef __BIG_ENDIAN | ||
21 | # undef __BIG_ENDIAN | ||
22 | # define __BIG_ENDIAN 4321 | ||
23 | #endif | ||
24 | |||
25 | #if defined(__LITTLE_ENDIAN) && !defined(__LITTLE_ENDIAN_BITFIELD) | ||
26 | # define __LITTLE_ENDIAN_BITFIELD | ||
27 | #endif | ||
28 | |||
29 | #if defined(__BIG_ENDIAN) && !defined(__BIG_ENDIAN_BITFIELD) | ||
30 | # define __BIG_ENDIAN_BITFIELD | ||
31 | #endif | ||
32 | |||
33 | #ifdef __LITTLE_ENDIAN | ||
34 | # define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) | ||
35 | # define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) | ||
36 | # define __le64_to_cpu(x) ((__force __u64)(__le64)(x)) | ||
37 | # define __cpu_to_le16(x) ((__force __le16)(__u16)(x)) | ||
38 | # define __cpu_to_le32(x) ((__force __le32)(__u32)(x)) | ||
39 | # define __cpu_to_le64(x) ((__force __le64)(__u64)(x)) | ||
40 | |||
41 | # define __be16_to_cpu(x) __swab16((__force __u16)(__be16)(x)) | ||
42 | # define __be32_to_cpu(x) __swab32((__force __u32)(__be32)(x)) | ||
43 | # define __be64_to_cpu(x) __swab64((__force __u64)(__be64)(x)) | ||
44 | # define __cpu_to_be16(x) ((__force __be16)__swab16(x)) | ||
45 | # define __cpu_to_be32(x) ((__force __be32)__swab32(x)) | ||
46 | # define __cpu_to_be64(x) ((__force __be64)__swab64(x)) | ||
47 | #endif | ||
48 | |||
49 | #ifdef __BIG_ENDIAN | ||
50 | # define __be16_to_cpu(x) ((__force __u16)(__be16)(x)) | ||
51 | # define __be32_to_cpu(x) ((__force __u32)(__be32)(x)) | ||
52 | # define __be64_to_cpu(x) ((__force __u64)(__be64)(x)) | ||
53 | # define __cpu_to_be16(x) ((__force __be16)(__u16)(x)) | ||
54 | # define __cpu_to_be32(x) ((__force __be32)(__u32)(x)) | ||
55 | # define __cpu_to_be64(x) ((__force __be64)(__u64)(x)) | ||
56 | |||
57 | # define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x)) | ||
58 | # define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) | ||
59 | # define __le64_to_cpu(x) __swab64((__force __u64)(__le64)(x)) | ||
60 | # define __cpu_to_le16(x) ((__force __le16)__swab16(x)) | ||
61 | # define __cpu_to_le32(x) ((__force __le32)__swab32(x)) | ||
62 | # define __cpu_to_le64(x) ((__force __le64)__swab64(x)) | ||
63 | #endif | ||
64 | |||
65 | /* | ||
66 | * These helpers could be phased out over time as the base version | ||
67 | * handles constant folding. | ||
68 | */ | ||
69 | #define __constant_htonl(x) __cpu_to_be32(x) | ||
70 | #define __constant_ntohl(x) __be32_to_cpu(x) | ||
71 | #define __constant_htons(x) __cpu_to_be16(x) | ||
72 | #define __constant_ntohs(x) __be16_to_cpu(x) | ||
73 | |||
74 | #define __constant_le16_to_cpu(x) __le16_to_cpu(x) | ||
75 | #define __constant_le32_to_cpu(x) __le32_to_cpu(x) | ||
76 | #define __constant_le64_to_cpu(x) __le64_to_cpu(x) | ||
77 | #define __constant_be16_to_cpu(x) __be16_to_cpu(x) | ||
78 | #define __constant_be32_to_cpu(x) __be32_to_cpu(x) | ||
79 | #define __constant_be64_to_cpu(x) __be64_to_cpu(x) | ||
80 | |||
81 | #define __constant_cpu_to_le16(x) __cpu_to_le16(x) | ||
82 | #define __constant_cpu_to_le32(x) __cpu_to_le32(x) | ||
83 | #define __constant_cpu_to_le64(x) __cpu_to_le64(x) | ||
84 | #define __constant_cpu_to_be16(x) __cpu_to_be16(x) | ||
85 | #define __constant_cpu_to_be32(x) __cpu_to_be32(x) | ||
86 | #define __constant_cpu_to_be64(x) __cpu_to_be64(x) | ||
87 | |||
88 | static inline void __le16_to_cpus(__u16 *p) | ||
89 | { | ||
90 | #ifdef __BIG_ENDIAN | ||
91 | __swab16s(p); | ||
92 | #endif | ||
93 | } | ||
94 | |||
95 | static inline void __cpu_to_le16s(__u16 *p) | ||
96 | { | ||
97 | #ifdef __BIG_ENDIAN | ||
98 | __swab16s(p); | ||
99 | #endif | ||
100 | } | ||
101 | |||
102 | static inline void __le32_to_cpus(__u32 *p) | ||
103 | { | ||
104 | #ifdef __BIG_ENDIAN | ||
105 | __swab32s(p); | ||
106 | #endif | ||
107 | } | ||
108 | |||
109 | static inline void __cpu_to_le32s(__u32 *p) | ||
110 | { | ||
111 | #ifdef __BIG_ENDIAN | ||
112 | __swab32s(p); | ||
113 | #endif | ||
114 | } | ||
115 | |||
116 | static inline void __le64_to_cpus(__u64 *p) | ||
117 | { | ||
118 | #ifdef __BIG_ENDIAN | ||
119 | __swab64s(p); | ||
120 | #endif | ||
121 | } | ||
122 | |||
123 | static inline void __cpu_to_le64s(__u64 *p) | ||
124 | { | ||
125 | #ifdef __BIG_ENDIAN | ||
126 | __swab64s(p); | ||
127 | #endif | ||
128 | } | ||
129 | |||
130 | static inline void __be16_to_cpus(__u16 *p) | ||
131 | { | ||
132 | #ifdef __LITTLE_ENDIAN | ||
133 | __swab16s(p); | ||
134 | #endif | ||
135 | } | ||
136 | |||
137 | static inline void __cpu_to_be16s(__u16 *p) | ||
138 | { | ||
139 | #ifdef __LITTLE_ENDIAN | ||
140 | __swab16s(p); | ||
141 | #endif | ||
142 | } | ||
143 | |||
144 | static inline void __be32_to_cpus(__u32 *p) | ||
145 | { | ||
146 | #ifdef __LITTLE_ENDIAN | ||
147 | __swab32s(p); | ||
148 | #endif | ||
149 | } | ||
150 | |||
151 | static inline void __cpu_to_be32s(__u32 *p) | ||
152 | { | ||
153 | #ifdef __LITTLE_ENDIAN | ||
154 | __swab32s(p); | ||
155 | #endif | ||
156 | } | ||
157 | |||
158 | static inline void __be64_to_cpus(__u64 *p) | ||
159 | { | ||
160 | #ifdef __LITTLE_ENDIAN | ||
161 | __swab64s(p); | ||
162 | #endif | ||
163 | } | ||
164 | |||
165 | static inline void __cpu_to_be64s(__u64 *p) | ||
166 | { | ||
167 | #ifdef __LITTLE_ENDIAN | ||
168 | __swab64s(p); | ||
169 | #endif | ||
170 | } | ||
171 | |||
172 | static inline __u16 __le16_to_cpup(const __le16 *p) | ||
173 | { | ||
174 | #ifdef __LITTLE_ENDIAN | ||
175 | return (__force __u16)*p; | ||
176 | #else | ||
177 | return __swab16p((__force __u16 *)p); | ||
178 | #endif | ||
179 | } | ||
180 | |||
181 | static inline __u32 __le32_to_cpup(const __le32 *p) | ||
182 | { | ||
183 | #ifdef __LITTLE_ENDIAN | ||
184 | return (__force __u32)*p; | ||
185 | #else | ||
186 | return __swab32p((__force __u32 *)p); | ||
187 | #endif | ||
188 | } | ||
189 | |||
190 | static inline __u64 __le64_to_cpup(const __le64 *p) | ||
191 | { | ||
192 | #ifdef __LITTLE_ENDIAN | ||
193 | return (__force __u64)*p; | ||
194 | #else | ||
195 | return __swab64p((__force __u64 *)p); | ||
196 | #endif | ||
197 | } | ||
198 | |||
199 | static inline __le16 __cpu_to_le16p(const __u16 *p) | ||
200 | { | ||
201 | #ifdef __LITTLE_ENDIAN | ||
202 | return (__force __le16)*p; | ||
203 | #else | ||
204 | return (__force __le16)__swab16p(p); | ||
205 | #endif | ||
206 | } | ||
207 | |||
208 | static inline __le32 __cpu_to_le32p(const __u32 *p) | ||
209 | { | ||
210 | #ifdef __LITTLE_ENDIAN | ||
211 | return (__force __le32)*p; | ||
212 | #else | ||
213 | return (__force __le32)__swab32p(p); | ||
214 | #endif | ||
215 | } | ||
216 | |||
217 | static inline __le64 __cpu_to_le64p(const __u64 *p) | ||
218 | { | ||
219 | #ifdef __LITTLE_ENDIAN | ||
220 | return (__force __le64)*p; | ||
221 | #else | ||
222 | return (__force __le64)__swab64p(p); | ||
223 | #endif | ||
224 | } | ||
225 | |||
226 | static inline __u16 __be16_to_cpup(const __be16 *p) | ||
227 | { | ||
228 | #ifdef __BIG_ENDIAN | ||
229 | return (__force __u16)*p; | ||
230 | #else | ||
231 | return __swab16p((__force __u16 *)p); | ||
232 | #endif | ||
233 | } | ||
234 | |||
235 | static inline __u32 __be32_to_cpup(const __be32 *p) | ||
236 | { | ||
237 | #ifdef __BIG_ENDIAN | ||
238 | return (__force __u32)*p; | ||
239 | #else | ||
240 | return __swab32p((__force __u32 *)p); | ||
241 | #endif | ||
242 | } | ||
243 | |||
244 | static inline __u64 __be64_to_cpup(const __be64 *p) | ||
245 | { | ||
246 | #ifdef __BIG_ENDIAN | ||
247 | return (__force __u64)*p; | ||
248 | #else | ||
249 | return __swab64p((__force __u64 *)p); | ||
250 | #endif | ||
251 | } | ||
252 | |||
253 | static inline __be16 __cpu_to_be16p(const __u16 *p) | ||
254 | { | ||
255 | #ifdef __BIG_ENDIAN | ||
256 | return (__force __be16)*p; | ||
257 | #else | ||
258 | return (__force __be16)__swab16p(p); | ||
259 | #endif | ||
260 | } | ||
261 | |||
262 | static inline __be32 __cpu_to_be32p(const __u32 *p) | ||
263 | { | ||
264 | #ifdef __BIG_ENDIAN | ||
265 | return (__force __be32)*p; | ||
266 | #else | ||
267 | return (__force __be32)__swab32p(p); | ||
268 | #endif | ||
269 | } | ||
270 | |||
271 | static inline __be64 __cpu_to_be64p(const __u64 *p) | ||
272 | { | ||
273 | #ifdef __BIG_ENDIAN | ||
274 | return (__force __be64)*p; | ||
275 | #else | ||
276 | return (__force __be64)__swab64p(p); | ||
277 | #endif | ||
278 | } | ||
279 | |||
280 | #ifdef __KERNEL__ | ||
281 | |||
282 | # define le16_to_cpu __le16_to_cpu | ||
283 | # define le32_to_cpu __le32_to_cpu | ||
284 | # define le64_to_cpu __le64_to_cpu | ||
285 | # define be16_to_cpu __be16_to_cpu | ||
286 | # define be32_to_cpu __be32_to_cpu | ||
287 | # define be64_to_cpu __be64_to_cpu | ||
288 | # define cpu_to_le16 __cpu_to_le16 | ||
289 | # define cpu_to_le32 __cpu_to_le32 | ||
290 | # define cpu_to_le64 __cpu_to_le64 | ||
291 | # define cpu_to_be16 __cpu_to_be16 | ||
292 | # define cpu_to_be32 __cpu_to_be32 | ||
293 | # define cpu_to_be64 __cpu_to_be64 | ||
294 | |||
295 | # define le16_to_cpup __le16_to_cpup | ||
296 | # define le32_to_cpup __le32_to_cpup | ||
297 | # define le64_to_cpup __le64_to_cpup | ||
298 | # define be16_to_cpup __be16_to_cpup | ||
299 | # define be32_to_cpup __be32_to_cpup | ||
300 | # define be64_to_cpup __be64_to_cpup | ||
301 | # define cpu_to_le16p __cpu_to_le16p | ||
302 | # define cpu_to_le32p __cpu_to_le32p | ||
303 | # define cpu_to_le64p __cpu_to_le64p | ||
304 | # define cpu_to_be16p __cpu_to_be16p | ||
305 | # define cpu_to_be32p __cpu_to_be32p | ||
306 | # define cpu_to_be64p __cpu_to_be64p | ||
307 | |||
308 | # define le16_to_cpus __le16_to_cpus | ||
309 | # define le32_to_cpus __le32_to_cpus | ||
310 | # define le64_to_cpus __le64_to_cpus | ||
311 | # define be16_to_cpus __be16_to_cpus | ||
312 | # define be32_to_cpus __be32_to_cpus | ||
313 | # define be64_to_cpus __be64_to_cpus | ||
314 | # define cpu_to_le16s __cpu_to_le16s | ||
315 | # define cpu_to_le32s __cpu_to_le32s | ||
316 | # define cpu_to_le64s __cpu_to_le64s | ||
317 | # define cpu_to_be16s __cpu_to_be16s | ||
318 | # define cpu_to_be32s __cpu_to_be32s | ||
319 | # define cpu_to_be64s __cpu_to_be64s | ||
320 | |||
321 | /* | ||
322 | * They have to be macros in order to do the constant folding | ||
323 | * correctly - if the argument passed into a inline function | ||
324 | * it is no longer constant according to gcc.. | ||
325 | */ | ||
326 | # undef ntohl | ||
327 | # undef ntohs | ||
328 | # undef htonl | ||
329 | # undef htons | ||
330 | |||
331 | # define ___htonl(x) __cpu_to_be32(x) | ||
332 | # define ___htons(x) __cpu_to_be16(x) | ||
333 | # define ___ntohl(x) __be32_to_cpu(x) | ||
334 | # define ___ntohs(x) __be16_to_cpu(x) | ||
335 | |||
336 | # define htonl(x) ___htonl(x) | ||
337 | # define ntohl(x) ___ntohl(x) | ||
338 | # define htons(x) ___htons(x) | ||
339 | # define ntohs(x) ___ntohs(x) | ||
340 | |||
341 | static inline void le16_add_cpu(__le16 *var, u16 val) | ||
342 | { | ||
343 | *var = cpu_to_le16(le16_to_cpup(var) + val); | ||
344 | } | ||
345 | |||
346 | static inline void le32_add_cpu(__le32 *var, u32 val) | ||
347 | { | ||
348 | *var = cpu_to_le32(le32_to_cpup(var) + val); | ||
349 | } | ||
350 | |||
351 | static inline void le64_add_cpu(__le64 *var, u64 val) | ||
352 | { | ||
353 | *var = cpu_to_le64(le64_to_cpup(var) + val); | ||
354 | } | ||
355 | |||
356 | static inline void be16_add_cpu(__be16 *var, u16 val) | ||
357 | { | ||
358 | *var = cpu_to_be16(be16_to_cpup(var) + val); | ||
359 | } | ||
360 | |||
361 | static inline void be32_add_cpu(__be32 *var, u32 val) | ||
362 | { | ||
363 | *var = cpu_to_be32(be32_to_cpup(var) + val); | ||
364 | } | ||
365 | |||
366 | static inline void be64_add_cpu(__be64 *var, u64 val) | ||
367 | { | ||
368 | *var = cpu_to_be64(be64_to_cpup(var) + val); | ||
369 | } | ||
370 | |||
371 | #endif /* __KERNEL__ */ | ||
372 | #endif /* _LINUX_BYTEORDER_H */ | ||
diff --git a/include/linux/byteorder/Kbuild b/include/linux/byteorder/Kbuild index fbaa7f9cee32..38437225b092 100644 --- a/include/linux/byteorder/Kbuild +++ b/include/linux/byteorder/Kbuild | |||
@@ -1,4 +1,2 @@ | |||
1 | unifdef-y += big_endian.h | 1 | unifdef-y += big_endian.h |
2 | unifdef-y += little_endian.h | 2 | unifdef-y += little_endian.h |
3 | unifdef-y += swab.h | ||
4 | unifdef-y += swabb.h | ||
diff --git a/include/linux/byteorder/big_endian.h b/include/linux/byteorder/big_endian.h index 1cba3f3efe5f..3c80fd7e8b56 100644 --- a/include/linux/byteorder/big_endian.h +++ b/include/linux/byteorder/big_endian.h | |||
@@ -9,8 +9,7 @@ | |||
9 | #endif | 9 | #endif |
10 | 10 | ||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | #include <linux/byteorder/swab.h> | 12 | #include <linux/swab.h> |
13 | #include <linux/byteorder/swabb.h> | ||
14 | 13 | ||
15 | #define __constant_htonl(x) ((__force __be32)(__u32)(x)) | 14 | #define __constant_htonl(x) ((__force __be32)(__u32)(x)) |
16 | #define __constant_ntohl(x) ((__force __u32)(__be32)(x)) | 15 | #define __constant_ntohl(x) ((__force __u32)(__be32)(x)) |
diff --git a/include/linux/byteorder/little_endian.h b/include/linux/byteorder/little_endian.h index cedc1b5a289c..83195fb82962 100644 --- a/include/linux/byteorder/little_endian.h +++ b/include/linux/byteorder/little_endian.h | |||
@@ -9,8 +9,7 @@ | |||
9 | #endif | 9 | #endif |
10 | 10 | ||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | #include <linux/byteorder/swab.h> | 12 | #include <linux/swab.h> |
13 | #include <linux/byteorder/swabb.h> | ||
14 | 13 | ||
15 | #define __constant_htonl(x) ((__force __be32)___constant_swab32((x))) | 14 | #define __constant_htonl(x) ((__force __be32)___constant_swab32((x))) |
16 | #define __constant_ntohl(x) ___constant_swab32((__force __be32)(x)) | 15 | #define __constant_ntohl(x) ___constant_swab32((__force __be32)(x)) |
diff --git a/include/linux/byteorder/swab.h b/include/linux/byteorder/swab.h deleted file mode 100644 index 142134ff1645..000000000000 --- a/include/linux/byteorder/swab.h +++ /dev/null | |||
@@ -1,222 +0,0 @@ | |||
1 | #ifndef _LINUX_BYTEORDER_SWAB_H | ||
2 | #define _LINUX_BYTEORDER_SWAB_H | ||
3 | |||
4 | /* | ||
5 | * linux/byteorder/swab.h | ||
6 | * Byte-swapping, independently from CPU endianness | ||
7 | * swabXX[ps]?(foo) | ||
8 | * | ||
9 | * Francois-Rene Rideau <fare@tunes.org> 19971205 | ||
10 | * separated swab functions from cpu_to_XX, | ||
11 | * to clean up support for bizarre-endian architectures. | ||
12 | * | ||
13 | * Trent Piepho <xyzzy@speakeasy.org> 2007114 | ||
14 | * make constant-folding work, provide C versions that | ||
15 | * gcc can optimize better, explain different versions | ||
16 | * | ||
17 | * See asm-i386/byteorder.h and suches for examples of how to provide | ||
18 | * architecture-dependent optimized versions | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include <linux/compiler.h> | ||
23 | |||
24 | /* Functions/macros defined, there are a lot: | ||
25 | * | ||
26 | * ___swabXX | ||
27 | * Generic C versions of the swab functions. | ||
28 | * | ||
29 | * ___constant_swabXX | ||
30 | * C versions that gcc can fold into a compile-time constant when | ||
31 | * the argument is a compile-time constant. | ||
32 | * | ||
33 | * __arch__swabXX[sp]? | ||
34 | * Architecture optimized versions of all the swab functions | ||
35 | * (including the s and p versions). These can be defined in | ||
36 | * asm-arch/byteorder.h. Any which are not, are defined here. | ||
37 | * __arch__swabXXs() is defined in terms of __arch__swabXXp(), which | ||
38 | * is defined in terms of __arch__swabXX(), which is in turn defined | ||
39 | * in terms of ___swabXX(x). | ||
40 | * These must be macros. They may be unsafe for arguments with | ||
41 | * side-effects. | ||
42 | * | ||
43 | * __fswabXX | ||
44 | * Inline function versions of the __arch__ macros. These _are_ safe | ||
45 | * if the arguments have side-effects. Note there are no s and p | ||
46 | * versions of these. | ||
47 | * | ||
48 | * __swabXX[sb] | ||
49 | * There are the ones you should actually use. The __swabXX versions | ||
50 | * will be a constant given a constant argument and use the arch | ||
51 | * specific code (if any) for non-constant arguments. The s and p | ||
52 | * versions always use the arch specific code (constant folding | ||
53 | * doesn't apply). They are safe to use with arguments with | ||
54 | * side-effects. | ||
55 | * | ||
56 | * swabXX[sb] | ||
57 | * Nicknames for __swabXX[sb] to use in the kernel. | ||
58 | */ | ||
59 | |||
60 | /* casts are necessary for constants, because we never know how for sure | ||
61 | * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way. | ||
62 | */ | ||
63 | |||
64 | static __inline__ __attribute_const__ __u16 ___swab16(__u16 x) | ||
65 | { | ||
66 | return x<<8 | x>>8; | ||
67 | } | ||
68 | static __inline__ __attribute_const__ __u32 ___swab32(__u32 x) | ||
69 | { | ||
70 | return x<<24 | x>>24 | | ||
71 | (x & (__u32)0x0000ff00UL)<<8 | | ||
72 | (x & (__u32)0x00ff0000UL)>>8; | ||
73 | } | ||
74 | static __inline__ __attribute_const__ __u64 ___swab64(__u64 x) | ||
75 | { | ||
76 | return x<<56 | x>>56 | | ||
77 | (x & (__u64)0x000000000000ff00ULL)<<40 | | ||
78 | (x & (__u64)0x0000000000ff0000ULL)<<24 | | ||
79 | (x & (__u64)0x00000000ff000000ULL)<< 8 | | ||
80 | (x & (__u64)0x000000ff00000000ULL)>> 8 | | ||
81 | (x & (__u64)0x0000ff0000000000ULL)>>24 | | ||
82 | (x & (__u64)0x00ff000000000000ULL)>>40; | ||
83 | } | ||
84 | |||
85 | #define ___constant_swab16(x) \ | ||
86 | ((__u16)( \ | ||
87 | (((__u16)(x) & (__u16)0x00ffU) << 8) | \ | ||
88 | (((__u16)(x) & (__u16)0xff00U) >> 8) )) | ||
89 | #define ___constant_swab32(x) \ | ||
90 | ((__u32)( \ | ||
91 | (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ | ||
92 | (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \ | ||
93 | (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \ | ||
94 | (((__u32)(x) & (__u32)0xff000000UL) >> 24) )) | ||
95 | #define ___constant_swab64(x) \ | ||
96 | ((__u64)( \ | ||
97 | (__u64)(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \ | ||
98 | (__u64)(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \ | ||
99 | (__u64)(((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \ | ||
100 | (__u64)(((__u64)(x) & (__u64)0x00000000ff000000ULL) << 8) | \ | ||
101 | (__u64)(((__u64)(x) & (__u64)0x000000ff00000000ULL) >> 8) | \ | ||
102 | (__u64)(((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ | ||
103 | (__u64)(((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \ | ||
104 | (__u64)(((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56) )) | ||
105 | |||
106 | /* | ||
107 | * provide defaults when no architecture-specific optimization is detected | ||
108 | */ | ||
109 | #ifndef __arch__swab16 | ||
110 | # define __arch__swab16(x) ___swab16(x) | ||
111 | #endif | ||
112 | #ifndef __arch__swab32 | ||
113 | # define __arch__swab32(x) ___swab32(x) | ||
114 | #endif | ||
115 | #ifndef __arch__swab64 | ||
116 | # define __arch__swab64(x) ___swab64(x) | ||
117 | #endif | ||
118 | |||
119 | #ifndef __arch__swab16p | ||
120 | # define __arch__swab16p(x) __arch__swab16(*(x)) | ||
121 | #endif | ||
122 | #ifndef __arch__swab32p | ||
123 | # define __arch__swab32p(x) __arch__swab32(*(x)) | ||
124 | #endif | ||
125 | #ifndef __arch__swab64p | ||
126 | # define __arch__swab64p(x) __arch__swab64(*(x)) | ||
127 | #endif | ||
128 | |||
129 | #ifndef __arch__swab16s | ||
130 | # define __arch__swab16s(x) ((void)(*(x) = __arch__swab16p(x))) | ||
131 | #endif | ||
132 | #ifndef __arch__swab32s | ||
133 | # define __arch__swab32s(x) ((void)(*(x) = __arch__swab32p(x))) | ||
134 | #endif | ||
135 | #ifndef __arch__swab64s | ||
136 | # define __arch__swab64s(x) ((void)(*(x) = __arch__swab64p(x))) | ||
137 | #endif | ||
138 | |||
139 | |||
140 | /* | ||
141 | * Allow constant folding | ||
142 | */ | ||
143 | #if defined(__GNUC__) && defined(__OPTIMIZE__) | ||
144 | # define __swab16(x) \ | ||
145 | (__builtin_constant_p((__u16)(x)) ? \ | ||
146 | ___constant_swab16((x)) : \ | ||
147 | __fswab16((x))) | ||
148 | # define __swab32(x) \ | ||
149 | (__builtin_constant_p((__u32)(x)) ? \ | ||
150 | ___constant_swab32((x)) : \ | ||
151 | __fswab32((x))) | ||
152 | # define __swab64(x) \ | ||
153 | (__builtin_constant_p((__u64)(x)) ? \ | ||
154 | ___constant_swab64((x)) : \ | ||
155 | __fswab64((x))) | ||
156 | #else | ||
157 | # define __swab16(x) __fswab16(x) | ||
158 | # define __swab32(x) __fswab32(x) | ||
159 | # define __swab64(x) __fswab64(x) | ||
160 | #endif /* OPTIMIZE */ | ||
161 | |||
162 | |||
163 | static __inline__ __attribute_const__ __u16 __fswab16(__u16 x) | ||
164 | { | ||
165 | return __arch__swab16(x); | ||
166 | } | ||
167 | static __inline__ __u16 __swab16p(const __u16 *x) | ||
168 | { | ||
169 | return __arch__swab16p(x); | ||
170 | } | ||
171 | static __inline__ void __swab16s(__u16 *addr) | ||
172 | { | ||
173 | __arch__swab16s(addr); | ||
174 | } | ||
175 | |||
176 | static __inline__ __attribute_const__ __u32 __fswab32(__u32 x) | ||
177 | { | ||
178 | return __arch__swab32(x); | ||
179 | } | ||
180 | static __inline__ __u32 __swab32p(const __u32 *x) | ||
181 | { | ||
182 | return __arch__swab32p(x); | ||
183 | } | ||
184 | static __inline__ void __swab32s(__u32 *addr) | ||
185 | { | ||
186 | __arch__swab32s(addr); | ||
187 | } | ||
188 | |||
189 | #ifdef __BYTEORDER_HAS_U64__ | ||
190 | static __inline__ __attribute_const__ __u64 __fswab64(__u64 x) | ||
191 | { | ||
192 | # ifdef __SWAB_64_THRU_32__ | ||
193 | __u32 h = x >> 32; | ||
194 | __u32 l = x & ((1ULL<<32)-1); | ||
195 | return (((__u64)__swab32(l)) << 32) | ((__u64)(__swab32(h))); | ||
196 | # else | ||
197 | return __arch__swab64(x); | ||
198 | # endif | ||
199 | } | ||
200 | static __inline__ __u64 __swab64p(const __u64 *x) | ||
201 | { | ||
202 | return __arch__swab64p(x); | ||
203 | } | ||
204 | static __inline__ void __swab64s(__u64 *addr) | ||
205 | { | ||
206 | __arch__swab64s(addr); | ||
207 | } | ||
208 | #endif /* __BYTEORDER_HAS_U64__ */ | ||
209 | |||
210 | #if defined(__KERNEL__) | ||
211 | #define swab16 __swab16 | ||
212 | #define swab32 __swab32 | ||
213 | #define swab64 __swab64 | ||
214 | #define swab16p __swab16p | ||
215 | #define swab32p __swab32p | ||
216 | #define swab64p __swab64p | ||
217 | #define swab16s __swab16s | ||
218 | #define swab32s __swab32s | ||
219 | #define swab64s __swab64s | ||
220 | #endif | ||
221 | |||
222 | #endif /* _LINUX_BYTEORDER_SWAB_H */ | ||
diff --git a/include/linux/byteorder/swabb.h b/include/linux/byteorder/swabb.h deleted file mode 100644 index 8c780c7d779e..000000000000 --- a/include/linux/byteorder/swabb.h +++ /dev/null | |||
@@ -1,135 +0,0 @@ | |||
1 | #ifndef _LINUX_BYTEORDER_SWABB_H | ||
2 | #define _LINUX_BYTEORDER_SWABB_H | ||
3 | |||
4 | /* | ||
5 | * linux/byteorder/swabb.h | ||
6 | * SWAp Bytes Bizarrely | ||
7 | * swaHHXX[ps]?(foo) | ||
8 | * | ||
9 | * Support for obNUXIous pdp-endian and other bizarre architectures. | ||
10 | * Will Linux ever run on such ancient beasts? if not, this file | ||
11 | * will be but a programming pearl. Still, it's a reminder that we | ||
12 | * shouldn't be making too many assumptions when trying to be portable. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | /* | ||
17 | * Meaning of the names I chose (vaxlinux people feel free to correct them): | ||
18 | * swahw32 swap 16-bit half-words in a 32-bit word | ||
19 | * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word | ||
20 | * | ||
21 | * No 64-bit support yet. I don't know NUXI conventions for long longs. | ||
22 | * I guarantee it will be a mess when it's there, though :-> | ||
23 | * It will be even worse if there are conflicting 64-bit conventions. | ||
24 | * Hopefully, no one ever used 64-bit objects on NUXI machines. | ||
25 | * | ||
26 | */ | ||
27 | |||
28 | #include <linux/types.h> | ||
29 | |||
30 | #define ___swahw32(x) \ | ||
31 | ({ \ | ||
32 | __u32 __x = (x); \ | ||
33 | ((__u32)( \ | ||
34 | (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \ | ||
35 | (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \ | ||
36 | }) | ||
37 | #define ___swahb32(x) \ | ||
38 | ({ \ | ||
39 | __u32 __x = (x); \ | ||
40 | ((__u32)( \ | ||
41 | (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \ | ||
42 | (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \ | ||
43 | }) | ||
44 | |||
45 | #define ___constant_swahw32(x) \ | ||
46 | ((__u32)( \ | ||
47 | (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ | ||
48 | (((__u32)(x) & (__u32)0xffff0000UL) >> 16) )) | ||
49 | #define ___constant_swahb32(x) \ | ||
50 | ((__u32)( \ | ||
51 | (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ | ||
52 | (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) )) | ||
53 | |||
54 | /* | ||
55 | * provide defaults when no architecture-specific optimization is detected | ||
56 | */ | ||
57 | #ifndef __arch__swahw32 | ||
58 | # define __arch__swahw32(x) ___swahw32(x) | ||
59 | #endif | ||
60 | #ifndef __arch__swahb32 | ||
61 | # define __arch__swahb32(x) ___swahb32(x) | ||
62 | #endif | ||
63 | |||
64 | #ifndef __arch__swahw32p | ||
65 | # define __arch__swahw32p(x) __swahw32(*(x)) | ||
66 | #endif | ||
67 | #ifndef __arch__swahb32p | ||
68 | # define __arch__swahb32p(x) __swahb32(*(x)) | ||
69 | #endif | ||
70 | |||
71 | #ifndef __arch__swahw32s | ||
72 | # define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0) | ||
73 | #endif | ||
74 | #ifndef __arch__swahb32s | ||
75 | # define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0) | ||
76 | #endif | ||
77 | |||
78 | |||
79 | /* | ||
80 | * Allow constant folding | ||
81 | */ | ||
82 | #define __swahw32(x) \ | ||
83 | (__builtin_constant_p((__u32)(x)) ? \ | ||
84 | ___swahw32((x)) : \ | ||
85 | __fswahw32((x))) | ||
86 | #define __swahb32(x) \ | ||
87 | (__builtin_constant_p((__u32)(x)) ? \ | ||
88 | ___swahb32((x)) : \ | ||
89 | __fswahb32((x))) | ||
90 | |||
91 | |||
92 | static inline __u32 __fswahw32(__u32 x) | ||
93 | { | ||
94 | return __arch__swahw32(x); | ||
95 | } | ||
96 | |||
97 | static inline __u32 __swahw32p(__u32 *x) | ||
98 | { | ||
99 | return __arch__swahw32p(x); | ||
100 | } | ||
101 | |||
102 | static inline void __swahw32s(__u32 *addr) | ||
103 | { | ||
104 | __arch__swahw32s(addr); | ||
105 | } | ||
106 | |||
107 | static inline __u32 __fswahb32(__u32 x) | ||
108 | { | ||
109 | return __arch__swahb32(x); | ||
110 | } | ||
111 | |||
112 | static inline __u32 __swahb32p(__u32 *x) | ||
113 | { | ||
114 | return __arch__swahb32p(x); | ||
115 | } | ||
116 | |||
117 | static inline void __swahb32s(__u32 *addr) | ||
118 | { | ||
119 | __arch__swahb32s(addr); | ||
120 | } | ||
121 | |||
122 | #ifdef __BYTEORDER_HAS_U64__ | ||
123 | /* | ||
124 | * Not supported yet | ||
125 | */ | ||
126 | #endif /* __BYTEORDER_HAS_U64__ */ | ||
127 | |||
128 | #define swahw32 __swahw32 | ||
129 | #define swahb32 __swahb32 | ||
130 | #define swahw32p __swahw32p | ||
131 | #define swahb32p __swahb32p | ||
132 | #define swahw32s __swahw32s | ||
133 | #define swahb32s __swahb32s | ||
134 | |||
135 | #endif /* _LINUX_BYTEORDER_SWABB_H */ | ||
diff --git a/include/linux/can/core.h b/include/linux/can/core.h index f50785ad4781..25085cbadcfc 100644 --- a/include/linux/can/core.h +++ b/include/linux/can/core.h | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/skbuff.h> | 19 | #include <linux/skbuff.h> |
20 | #include <linux/netdevice.h> | 20 | #include <linux/netdevice.h> |
21 | 21 | ||
22 | #define CAN_VERSION "20081130" | 22 | #define CAN_VERSION "20090105" |
23 | 23 | ||
24 | /* increment this number each time you change some user-space interface */ | 24 | /* increment this number each time you change some user-space interface */ |
25 | #define CAN_ABI_VERSION "8" | 25 | #define CAN_ABI_VERSION "8" |
diff --git a/include/linux/capability.h b/include/linux/capability.h index e22f48c2a46f..02bdb768d43b 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
@@ -529,8 +529,21 @@ extern const kernel_cap_t __cap_init_eff_set; | |||
529 | * | 529 | * |
530 | * Note that this does not set PF_SUPERPRIV on the task. | 530 | * Note that this does not set PF_SUPERPRIV on the task. |
531 | */ | 531 | */ |
532 | #define has_capability(t, cap) (security_capable((t), (cap)) == 0) | 532 | #define has_capability(t, cap) (security_real_capable((t), (cap)) == 0) |
533 | #define has_capability_noaudit(t, cap) (security_capable_noaudit((t), (cap)) == 0) | 533 | |
534 | /** | ||
535 | * has_capability_noaudit - Determine if a task has a superior capability available (unaudited) | ||
536 | * @t: The task in question | ||
537 | * @cap: The capability to be tested for | ||
538 | * | ||
539 | * Return true if the specified task has the given superior capability | ||
540 | * currently in effect, false if not, but don't write an audit message for the | ||
541 | * check. | ||
542 | * | ||
543 | * Note that this does not set PF_SUPERPRIV on the task. | ||
544 | */ | ||
545 | #define has_capability_noaudit(t, cap) \ | ||
546 | (security_real_capable_noaudit((t), (cap)) == 0) | ||
534 | 547 | ||
535 | extern int capable(int cap); | 548 | extern int capable(int cap); |
536 | 549 | ||
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 1164963c3a85..e267e62827bb 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -52,9 +52,9 @@ struct cgroup_subsys_state { | |||
52 | * hierarchy structure */ | 52 | * hierarchy structure */ |
53 | struct cgroup *cgroup; | 53 | struct cgroup *cgroup; |
54 | 54 | ||
55 | /* State maintained by the cgroup system to allow | 55 | /* State maintained by the cgroup system to allow subsystems |
56 | * subsystems to be "busy". Should be accessed via css_get() | 56 | * to be "busy". Should be accessed via css_get(), |
57 | * and css_put() */ | 57 | * css_tryget() and and css_put(). */ |
58 | 58 | ||
59 | atomic_t refcnt; | 59 | atomic_t refcnt; |
60 | 60 | ||
@@ -64,11 +64,14 @@ struct cgroup_subsys_state { | |||
64 | /* bits in struct cgroup_subsys_state flags field */ | 64 | /* bits in struct cgroup_subsys_state flags field */ |
65 | enum { | 65 | enum { |
66 | CSS_ROOT, /* This CSS is the root of the subsystem */ | 66 | CSS_ROOT, /* This CSS is the root of the subsystem */ |
67 | CSS_REMOVED, /* This CSS is dead */ | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | /* | 70 | /* |
70 | * Call css_get() to hold a reference on the cgroup; | 71 | * Call css_get() to hold a reference on the css; it can be used |
71 | * | 72 | * for a reference obtained via: |
73 | * - an existing ref-counted reference to the css | ||
74 | * - task->cgroups for a locked task | ||
72 | */ | 75 | */ |
73 | 76 | ||
74 | static inline void css_get(struct cgroup_subsys_state *css) | 77 | static inline void css_get(struct cgroup_subsys_state *css) |
@@ -77,9 +80,32 @@ static inline void css_get(struct cgroup_subsys_state *css) | |||
77 | if (!test_bit(CSS_ROOT, &css->flags)) | 80 | if (!test_bit(CSS_ROOT, &css->flags)) |
78 | atomic_inc(&css->refcnt); | 81 | atomic_inc(&css->refcnt); |
79 | } | 82 | } |
83 | |||
84 | static inline bool css_is_removed(struct cgroup_subsys_state *css) | ||
85 | { | ||
86 | return test_bit(CSS_REMOVED, &css->flags); | ||
87 | } | ||
88 | |||
89 | /* | ||
90 | * Call css_tryget() to take a reference on a css if your existing | ||
91 | * (known-valid) reference isn't already ref-counted. Returns false if | ||
92 | * the css has been destroyed. | ||
93 | */ | ||
94 | |||
95 | static inline bool css_tryget(struct cgroup_subsys_state *css) | ||
96 | { | ||
97 | if (test_bit(CSS_ROOT, &css->flags)) | ||
98 | return true; | ||
99 | while (!atomic_inc_not_zero(&css->refcnt)) { | ||
100 | if (test_bit(CSS_REMOVED, &css->flags)) | ||
101 | return false; | ||
102 | } | ||
103 | return true; | ||
104 | } | ||
105 | |||
80 | /* | 106 | /* |
81 | * css_put() should be called to release a reference taken by | 107 | * css_put() should be called to release a reference taken by |
82 | * css_get() | 108 | * css_get() or css_tryget() |
83 | */ | 109 | */ |
84 | 110 | ||
85 | extern void __css_put(struct cgroup_subsys_state *css); | 111 | extern void __css_put(struct cgroup_subsys_state *css); |
@@ -116,7 +142,7 @@ struct cgroup { | |||
116 | struct list_head children; /* my children */ | 142 | struct list_head children; /* my children */ |
117 | 143 | ||
118 | struct cgroup *parent; /* my parent */ | 144 | struct cgroup *parent; /* my parent */ |
119 | struct dentry *dentry; /* cgroup fs entry */ | 145 | struct dentry *dentry; /* cgroup fs entry, RCU protected */ |
120 | 146 | ||
121 | /* Private pointers for each registered subsystem */ | 147 | /* Private pointers for each registered subsystem */ |
122 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; | 148 | struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; |
@@ -145,6 +171,9 @@ struct cgroup { | |||
145 | int pids_use_count; | 171 | int pids_use_count; |
146 | /* Length of the current tasks_pids array */ | 172 | /* Length of the current tasks_pids array */ |
147 | int pids_length; | 173 | int pids_length; |
174 | |||
175 | /* For RCU-protected deletion */ | ||
176 | struct rcu_head rcu_head; | ||
148 | }; | 177 | }; |
149 | 178 | ||
150 | /* A css_set is a structure holding pointers to a set of | 179 | /* A css_set is a structure holding pointers to a set of |
@@ -329,13 +358,7 @@ struct cgroup_subsys { | |||
329 | struct cgroup *cgrp); | 358 | struct cgroup *cgrp); |
330 | void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp); | 359 | void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp); |
331 | void (*bind)(struct cgroup_subsys *ss, struct cgroup *root); | 360 | void (*bind)(struct cgroup_subsys *ss, struct cgroup *root); |
332 | /* | 361 | |
333 | * This routine is called with the task_lock of mm->owner held | ||
334 | */ | ||
335 | void (*mm_owner_changed)(struct cgroup_subsys *ss, | ||
336 | struct cgroup *old, | ||
337 | struct cgroup *new, | ||
338 | struct task_struct *p); | ||
339 | int subsys_id; | 362 | int subsys_id; |
340 | int active; | 363 | int active; |
341 | int disabled; | 364 | int disabled; |
@@ -343,9 +366,23 @@ struct cgroup_subsys { | |||
343 | #define MAX_CGROUP_TYPE_NAMELEN 32 | 366 | #define MAX_CGROUP_TYPE_NAMELEN 32 |
344 | const char *name; | 367 | const char *name; |
345 | 368 | ||
346 | /* Protected by RCU */ | 369 | /* |
347 | struct cgroupfs_root *root; | 370 | * Protects sibling/children links of cgroups in this |
371 | * hierarchy, plus protects which hierarchy (or none) the | ||
372 | * subsystem is a part of (i.e. root/sibling). To avoid | ||
373 | * potential deadlocks, the following operations should not be | ||
374 | * undertaken while holding any hierarchy_mutex: | ||
375 | * | ||
376 | * - allocating memory | ||
377 | * - initiating hotplug events | ||
378 | */ | ||
379 | struct mutex hierarchy_mutex; | ||
348 | 380 | ||
381 | /* | ||
382 | * Link to parent, and list entry in parent's children. | ||
383 | * Protected by this->hierarchy_mutex and cgroup_lock() | ||
384 | */ | ||
385 | struct cgroupfs_root *root; | ||
349 | struct list_head sibling; | 386 | struct list_head sibling; |
350 | }; | 387 | }; |
351 | 388 | ||
@@ -400,9 +437,6 @@ void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it); | |||
400 | int cgroup_scan_tasks(struct cgroup_scanner *scan); | 437 | int cgroup_scan_tasks(struct cgroup_scanner *scan); |
401 | int cgroup_attach_task(struct cgroup *, struct task_struct *); | 438 | int cgroup_attach_task(struct cgroup *, struct task_struct *); |
402 | 439 | ||
403 | void cgroup_mm_owner_callbacks(struct task_struct *old, | ||
404 | struct task_struct *new); | ||
405 | |||
406 | #else /* !CONFIG_CGROUPS */ | 440 | #else /* !CONFIG_CGROUPS */ |
407 | 441 | ||
408 | static inline int cgroup_init_early(void) { return 0; } | 442 | static inline int cgroup_init_early(void) { return 0; } |
@@ -420,9 +454,6 @@ static inline int cgroupstats_build(struct cgroupstats *stats, | |||
420 | return -EINVAL; | 454 | return -EINVAL; |
421 | } | 455 | } |
422 | 456 | ||
423 | static inline void cgroup_mm_owner_callbacks(struct task_struct *old, | ||
424 | struct task_struct *new) {} | ||
425 | |||
426 | #endif /* !CONFIG_CGROUPS */ | 457 | #endif /* !CONFIG_CGROUPS */ |
427 | 458 | ||
428 | #endif /* _LINUX_CGROUP_H */ | 459 | #endif /* _LINUX_CGROUP_H */ |
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index ed3a5d473e52..cea153697ec7 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h | |||
@@ -82,13 +82,13 @@ struct clock_event_device { | |||
82 | int shift; | 82 | int shift; |
83 | int rating; | 83 | int rating; |
84 | int irq; | 84 | int irq; |
85 | cpumask_t cpumask; | 85 | const struct cpumask *cpumask; |
86 | int (*set_next_event)(unsigned long evt, | 86 | int (*set_next_event)(unsigned long evt, |
87 | struct clock_event_device *); | 87 | struct clock_event_device *); |
88 | void (*set_mode)(enum clock_event_mode mode, | 88 | void (*set_mode)(enum clock_event_mode mode, |
89 | struct clock_event_device *); | 89 | struct clock_event_device *); |
90 | void (*event_handler)(struct clock_event_device *); | 90 | void (*event_handler)(struct clock_event_device *); |
91 | void (*broadcast)(cpumask_t mask); | 91 | void (*broadcast)(const struct cpumask *mask); |
92 | struct list_head list; | 92 | struct list_head list; |
93 | enum clock_event_mode mode; | 93 | enum clock_event_mode mode; |
94 | ktime_t next_event; | 94 | ktime_t next_event; |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 5c8351b859f0..1514d534deeb 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
@@ -11,9 +11,19 @@ | |||
11 | /* The "volatile" is due to gcc bugs */ | 11 | /* The "volatile" is due to gcc bugs */ |
12 | #define barrier() __asm__ __volatile__("": : :"memory") | 12 | #define barrier() __asm__ __volatile__("": : :"memory") |
13 | 13 | ||
14 | /* This macro obfuscates arithmetic on a variable address so that gcc | ||
15 | shouldn't recognize the original var, and make assumptions about it */ | ||
16 | /* | 14 | /* |
15 | * This macro obfuscates arithmetic on a variable address so that gcc | ||
16 | * shouldn't recognize the original var, and make assumptions about it. | ||
17 | * | ||
18 | * This is needed because the C standard makes it undefined to do | ||
19 | * pointer arithmetic on "objects" outside their boundaries and the | ||
20 | * gcc optimizers assume this is the case. In particular they | ||
21 | * assume such arithmetic does not wrap. | ||
22 | * | ||
23 | * A miscompilation has been observed because of this on PPC. | ||
24 | * To work around it we hide the relationship of the pointer and the object | ||
25 | * using this macro. | ||
26 | * | ||
17 | * Versions of the ppc64 compiler before 4.1 had a bug where use of | 27 | * Versions of the ppc64 compiler before 4.1 had a bug where use of |
18 | * RELOC_HIDE could trash r30. The bug can be worked around by changing | 28 | * RELOC_HIDE could trash r30. The bug can be worked around by changing |
19 | * the inline assembly constraint from =g to =r, in this particular | 29 | * the inline assembly constraint from =g to =r, in this particular |
@@ -61,3 +71,8 @@ | |||
61 | #define noinline __attribute__((noinline)) | 71 | #define noinline __attribute__((noinline)) |
62 | #define __attribute_const__ __attribute__((__const__)) | 72 | #define __attribute_const__ __attribute__((__const__)) |
63 | #define __maybe_unused __attribute__((unused)) | 73 | #define __maybe_unused __attribute__((unused)) |
74 | |||
75 | #define __gcc_header(x) #x | ||
76 | #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) | ||
77 | #define gcc_header(x) _gcc_header(x) | ||
78 | #include gcc_header(__GNUC__) | ||
diff --git a/include/linux/compiler-gcc3.h b/include/linux/compiler-gcc3.h index e5eb795f78a1..8005effc04f1 100644 --- a/include/linux/compiler-gcc3.h +++ b/include/linux/compiler-gcc3.h | |||
@@ -2,8 +2,9 @@ | |||
2 | #error "Please don't include <linux/compiler-gcc3.h> directly, include <linux/compiler.h> instead." | 2 | #error "Please don't include <linux/compiler-gcc3.h> directly, include <linux/compiler.h> instead." |
3 | #endif | 3 | #endif |
4 | 4 | ||
5 | /* These definitions are for GCC v3.x. */ | 5 | #if __GNUC_MINOR__ < 2 |
6 | #include <linux/compiler-gcc.h> | 6 | # error Sorry, your compiler is too old - please upgrade it. |
7 | #endif | ||
7 | 8 | ||
8 | #if __GNUC_MINOR__ >= 3 | 9 | #if __GNUC_MINOR__ >= 3 |
9 | # define __used __attribute__((__used__)) | 10 | # define __used __attribute__((__used__)) |
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 974f5b7bb205..09992718f9e8 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h | |||
@@ -2,8 +2,10 @@ | |||
2 | #error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead." | 2 | #error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead." |
3 | #endif | 3 | #endif |
4 | 4 | ||
5 | /* These definitions are for GCC v4.x. */ | 5 | /* GCC 4.1.[01] miscompiles __weak */ |
6 | #include <linux/compiler-gcc.h> | 6 | #if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1 |
7 | # error Your version of gcc miscompiles the __weak directive | ||
8 | #endif | ||
7 | 9 | ||
8 | #define __used __attribute__((__used__)) | 10 | #define __used __attribute__((__used__)) |
9 | #define __must_check __attribute__((warn_unused_result)) | 11 | #define __must_check __attribute__((warn_unused_result)) |
@@ -16,7 +18,7 @@ | |||
16 | */ | 18 | */ |
17 | #define uninitialized_var(x) x = x | 19 | #define uninitialized_var(x) x = x |
18 | 20 | ||
19 | #if !(__GNUC__ == 4 && __GNUC_MINOR__ < 3) | 21 | #if __GNUC_MINOR__ >= 3 |
20 | /* Mark functions as cold. gcc will assume any path leading to a call | 22 | /* Mark functions as cold. gcc will assume any path leading to a call |
21 | to them will be unlikely. This means a lot of manual unlikely()s | 23 | to them will be unlikely. This means a lot of manual unlikely()s |
22 | are unnecessary now for any paths leading to the usual suspects | 24 | are unnecessary now for any paths leading to the usual suspects |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index ea7c6be354b7..d95da1020f1c 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -36,12 +36,8 @@ extern void __chk_io_ptr(const volatile void __iomem *); | |||
36 | 36 | ||
37 | #ifdef __KERNEL__ | 37 | #ifdef __KERNEL__ |
38 | 38 | ||
39 | #if __GNUC__ >= 4 | 39 | #ifdef __GNUC__ |
40 | # include <linux/compiler-gcc4.h> | 40 | #include <linux/compiler-gcc.h> |
41 | #elif __GNUC__ == 3 && __GNUC_MINOR__ >= 2 | ||
42 | # include <linux/compiler-gcc3.h> | ||
43 | #else | ||
44 | # error Sorry, your compiler is too old/not recognized. | ||
45 | #endif | 41 | #endif |
46 | 42 | ||
47 | #define notrace __attribute__((no_instrument_function)) | 43 | #define notrace __attribute__((no_instrument_function)) |
diff --git a/include/linux/console.h b/include/linux/console.h index 248e6e3b9b73..a67a90cf8268 100644 --- a/include/linux/console.h +++ b/include/linux/console.h | |||
@@ -153,4 +153,8 @@ void vcs_remove_sysfs(struct tty_struct *tty); | |||
153 | #define VESA_HSYNC_SUSPEND 2 | 153 | #define VESA_HSYNC_SUSPEND 2 |
154 | #define VESA_POWERDOWN 3 | 154 | #define VESA_POWERDOWN 3 |
155 | 155 | ||
156 | #ifdef CONFIG_VGA_CONSOLE | ||
157 | extern bool vgacon_text_force(void); | ||
158 | #endif | ||
159 | |||
156 | #endif /* _LINUX_CONSOLE_H */ | 160 | #endif /* _LINUX_CONSOLE_H */ |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 1ee608fd7b77..384b38d3e8e2 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
@@ -80,8 +80,8 @@ struct cpufreq_real_policy { | |||
80 | }; | 80 | }; |
81 | 81 | ||
82 | struct cpufreq_policy { | 82 | struct cpufreq_policy { |
83 | cpumask_t cpus; /* CPUs requiring sw coordination */ | 83 | cpumask_var_t cpus; /* CPUs requiring sw coordination */ |
84 | cpumask_t related_cpus; /* CPUs with any coordination */ | 84 | cpumask_var_t related_cpus; /* CPUs with any coordination */ |
85 | unsigned int shared_type; /* ANY or ALL affected CPUs | 85 | unsigned int shared_type; /* ANY or ALL affected CPUs |
86 | should set cpufreq */ | 86 | should set cpufreq */ |
87 | unsigned int cpu; /* cpu nr of registered CPU */ | 87 | unsigned int cpu; /* cpu nr of registered CPU */ |
@@ -234,6 +234,7 @@ struct cpufreq_driver { | |||
234 | int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg); | 234 | int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg); |
235 | int (*resume) (struct cpufreq_policy *policy); | 235 | int (*resume) (struct cpufreq_policy *policy); |
236 | struct freq_attr **attr; | 236 | struct freq_attr **attr; |
237 | bool hide_interface; | ||
237 | }; | 238 | }; |
238 | 239 | ||
239 | /* flags */ | 240 | /* flags */ |
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 21e1dd43e52a..9f315382610b 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
@@ -144,6 +144,7 @@ | |||
144 | typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t; | 144 | typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t; |
145 | extern cpumask_t _unused_cpumask_arg_; | 145 | extern cpumask_t _unused_cpumask_arg_; |
146 | 146 | ||
147 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
147 | #define cpu_set(cpu, dst) __cpu_set((cpu), &(dst)) | 148 | #define cpu_set(cpu, dst) __cpu_set((cpu), &(dst)) |
148 | static inline void __cpu_set(int cpu, volatile cpumask_t *dstp) | 149 | static inline void __cpu_set(int cpu, volatile cpumask_t *dstp) |
149 | { | 150 | { |
@@ -267,6 +268,26 @@ static inline void __cpus_shift_left(cpumask_t *dstp, | |||
267 | { | 268 | { |
268 | bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); | 269 | bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); |
269 | } | 270 | } |
271 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
272 | |||
273 | /** | ||
274 | * to_cpumask - convert an NR_CPUS bitmap to a struct cpumask * | ||
275 | * @bitmap: the bitmap | ||
276 | * | ||
277 | * There are a few places where cpumask_var_t isn't appropriate and | ||
278 | * static cpumasks must be used (eg. very early boot), yet we don't | ||
279 | * expose the definition of 'struct cpumask'. | ||
280 | * | ||
281 | * This does the conversion, and can be used as a constant initializer. | ||
282 | */ | ||
283 | #define to_cpumask(bitmap) \ | ||
284 | ((struct cpumask *)(1 ? (bitmap) \ | ||
285 | : (void *)sizeof(__check_is_bitmap(bitmap)))) | ||
286 | |||
287 | static inline int __check_is_bitmap(const unsigned long *bitmap) | ||
288 | { | ||
289 | return 1; | ||
290 | } | ||
270 | 291 | ||
271 | /* | 292 | /* |
272 | * Special-case data structure for "single bit set only" constant CPU masks. | 293 | * Special-case data structure for "single bit set only" constant CPU masks. |
@@ -278,13 +299,14 @@ static inline void __cpus_shift_left(cpumask_t *dstp, | |||
278 | extern const unsigned long | 299 | extern const unsigned long |
279 | cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)]; | 300 | cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)]; |
280 | 301 | ||
281 | static inline const cpumask_t *get_cpu_mask(unsigned int cpu) | 302 | static inline const struct cpumask *get_cpu_mask(unsigned int cpu) |
282 | { | 303 | { |
283 | const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG]; | 304 | const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG]; |
284 | p -= cpu / BITS_PER_LONG; | 305 | p -= cpu / BITS_PER_LONG; |
285 | return (const cpumask_t *)p; | 306 | return to_cpumask(p); |
286 | } | 307 | } |
287 | 308 | ||
309 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
288 | /* | 310 | /* |
289 | * In cases where we take the address of the cpumask immediately, | 311 | * In cases where we take the address of the cpumask immediately, |
290 | * gcc optimizes it out (it's a constant) and there's no huge stack | 312 | * gcc optimizes it out (it's a constant) and there's no huge stack |
@@ -339,36 +361,6 @@ extern cpumask_t cpu_mask_all; | |||
339 | #endif | 361 | #endif |
340 | #define CPUMASK_PTR(v, m) cpumask_t *v = &(m->v) | 362 | #define CPUMASK_PTR(v, m) cpumask_t *v = &(m->v) |
341 | 363 | ||
342 | #define cpumask_scnprintf(buf, len, src) \ | ||
343 | __cpumask_scnprintf((buf), (len), &(src), NR_CPUS) | ||
344 | static inline int __cpumask_scnprintf(char *buf, int len, | ||
345 | const cpumask_t *srcp, int nbits) | ||
346 | { | ||
347 | return bitmap_scnprintf(buf, len, srcp->bits, nbits); | ||
348 | } | ||
349 | |||
350 | #define cpumask_parse_user(ubuf, ulen, dst) \ | ||
351 | __cpumask_parse_user((ubuf), (ulen), &(dst), NR_CPUS) | ||
352 | static inline int __cpumask_parse_user(const char __user *buf, int len, | ||
353 | cpumask_t *dstp, int nbits) | ||
354 | { | ||
355 | return bitmap_parse_user(buf, len, dstp->bits, nbits); | ||
356 | } | ||
357 | |||
358 | #define cpulist_scnprintf(buf, len, src) \ | ||
359 | __cpulist_scnprintf((buf), (len), &(src), NR_CPUS) | ||
360 | static inline int __cpulist_scnprintf(char *buf, int len, | ||
361 | const cpumask_t *srcp, int nbits) | ||
362 | { | ||
363 | return bitmap_scnlistprintf(buf, len, srcp->bits, nbits); | ||
364 | } | ||
365 | |||
366 | #define cpulist_parse(buf, dst) __cpulist_parse((buf), &(dst), NR_CPUS) | ||
367 | static inline int __cpulist_parse(const char *buf, cpumask_t *dstp, int nbits) | ||
368 | { | ||
369 | return bitmap_parselist(buf, dstp->bits, nbits); | ||
370 | } | ||
371 | |||
372 | #define cpu_remap(oldbit, old, new) \ | 364 | #define cpu_remap(oldbit, old, new) \ |
373 | __cpu_remap((oldbit), &(old), &(new), NR_CPUS) | 365 | __cpu_remap((oldbit), &(old), &(new), NR_CPUS) |
374 | static inline int __cpu_remap(int oldbit, | 366 | static inline int __cpu_remap(int oldbit, |
@@ -400,19 +392,22 @@ static inline void __cpus_fold(cpumask_t *dstp, const cpumask_t *origp, | |||
400 | { | 392 | { |
401 | bitmap_fold(dstp->bits, origp->bits, sz, nbits); | 393 | bitmap_fold(dstp->bits, origp->bits, sz, nbits); |
402 | } | 394 | } |
395 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
403 | 396 | ||
404 | #if NR_CPUS == 1 | 397 | #if NR_CPUS == 1 |
405 | 398 | ||
406 | #define nr_cpu_ids 1 | 399 | #define nr_cpu_ids 1 |
400 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
407 | #define first_cpu(src) ({ (void)(src); 0; }) | 401 | #define first_cpu(src) ({ (void)(src); 0; }) |
408 | #define next_cpu(n, src) ({ (void)(src); 1; }) | 402 | #define next_cpu(n, src) ({ (void)(src); 1; }) |
409 | #define any_online_cpu(mask) 0 | 403 | #define any_online_cpu(mask) 0 |
410 | #define for_each_cpu_mask(cpu, mask) \ | 404 | #define for_each_cpu_mask(cpu, mask) \ |
411 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) | 405 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) |
412 | 406 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | |
413 | #else /* NR_CPUS > 1 */ | 407 | #else /* NR_CPUS > 1 */ |
414 | 408 | ||
415 | extern int nr_cpu_ids; | 409 | extern int nr_cpu_ids; |
410 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
416 | int __first_cpu(const cpumask_t *srcp); | 411 | int __first_cpu(const cpumask_t *srcp); |
417 | int __next_cpu(int n, const cpumask_t *srcp); | 412 | int __next_cpu(int n, const cpumask_t *srcp); |
418 | int __any_online_cpu(const cpumask_t *mask); | 413 | int __any_online_cpu(const cpumask_t *mask); |
@@ -424,8 +419,10 @@ int __any_online_cpu(const cpumask_t *mask); | |||
424 | for ((cpu) = -1; \ | 419 | for ((cpu) = -1; \ |
425 | (cpu) = next_cpu((cpu), (mask)), \ | 420 | (cpu) = next_cpu((cpu), (mask)), \ |
426 | (cpu) < NR_CPUS; ) | 421 | (cpu) < NR_CPUS; ) |
422 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
427 | #endif | 423 | #endif |
428 | 424 | ||
425 | #ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS | ||
429 | #if NR_CPUS <= 64 | 426 | #if NR_CPUS <= 64 |
430 | 427 | ||
431 | #define next_cpu_nr(n, src) next_cpu(n, src) | 428 | #define next_cpu_nr(n, src) next_cpu(n, src) |
@@ -443,77 +440,67 @@ int __next_cpu_nr(int n, const cpumask_t *srcp); | |||
443 | (cpu) < nr_cpu_ids; ) | 440 | (cpu) < nr_cpu_ids; ) |
444 | 441 | ||
445 | #endif /* NR_CPUS > 64 */ | 442 | #endif /* NR_CPUS > 64 */ |
443 | #endif /* !CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS */ | ||
446 | 444 | ||
447 | /* | 445 | /* |
448 | * The following particular system cpumasks and operations manage | 446 | * The following particular system cpumasks and operations manage |
449 | * possible, present, active and online cpus. Each of them is a fixed size | 447 | * possible, present, active and online cpus. |
450 | * bitmap of size NR_CPUS. | ||
451 | * | 448 | * |
452 | * #ifdef CONFIG_HOTPLUG_CPU | 449 | * cpu_possible_mask- has bit 'cpu' set iff cpu is populatable |
453 | * cpu_possible_map - has bit 'cpu' set iff cpu is populatable | 450 | * cpu_present_mask - has bit 'cpu' set iff cpu is populated |
454 | * cpu_present_map - has bit 'cpu' set iff cpu is populated | 451 | * cpu_online_mask - has bit 'cpu' set iff cpu available to scheduler |
455 | * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler | 452 | * cpu_active_mask - has bit 'cpu' set iff cpu available to migration |
456 | * cpu_active_map - has bit 'cpu' set iff cpu available to migration | ||
457 | * #else | ||
458 | * cpu_possible_map - has bit 'cpu' set iff cpu is populated | ||
459 | * cpu_present_map - copy of cpu_possible_map | ||
460 | * cpu_online_map - has bit 'cpu' set iff cpu available to scheduler | ||
461 | * #endif | ||
462 | * | 453 | * |
463 | * In either case, NR_CPUS is fixed at compile time, as the static | 454 | * If !CONFIG_HOTPLUG_CPU, present == possible, and active == online. |
464 | * size of these bitmaps. The cpu_possible_map is fixed at boot | ||
465 | * time, as the set of CPU id's that it is possible might ever | ||
466 | * be plugged in at anytime during the life of that system boot. | ||
467 | * The cpu_present_map is dynamic(*), representing which CPUs | ||
468 | * are currently plugged in. And cpu_online_map is the dynamic | ||
469 | * subset of cpu_present_map, indicating those CPUs available | ||
470 | * for scheduling. | ||
471 | * | 455 | * |
472 | * If HOTPLUG is enabled, then cpu_possible_map is forced to have | 456 | * The cpu_possible_mask is fixed at boot time, as the set of CPU id's |
457 | * that it is possible might ever be plugged in at anytime during the | ||
458 | * life of that system boot. The cpu_present_mask is dynamic(*), | ||
459 | * representing which CPUs are currently plugged in. And | ||
460 | * cpu_online_mask is the dynamic subset of cpu_present_mask, | ||
461 | * indicating those CPUs available for scheduling. | ||
462 | * | ||
463 | * If HOTPLUG is enabled, then cpu_possible_mask is forced to have | ||
473 | * all NR_CPUS bits set, otherwise it is just the set of CPUs that | 464 | * all NR_CPUS bits set, otherwise it is just the set of CPUs that |
474 | * ACPI reports present at boot. | 465 | * ACPI reports present at boot. |
475 | * | 466 | * |
476 | * If HOTPLUG is enabled, then cpu_present_map varies dynamically, | 467 | * If HOTPLUG is enabled, then cpu_present_mask varies dynamically, |
477 | * depending on what ACPI reports as currently plugged in, otherwise | 468 | * depending on what ACPI reports as currently plugged in, otherwise |
478 | * cpu_present_map is just a copy of cpu_possible_map. | 469 | * cpu_present_mask is just a copy of cpu_possible_mask. |
479 | * | 470 | * |
480 | * (*) Well, cpu_present_map is dynamic in the hotplug case. If not | 471 | * (*) Well, cpu_present_mask is dynamic in the hotplug case. If not |
481 | * hotplug, it's a copy of cpu_possible_map, hence fixed at boot. | 472 | * hotplug, it's a copy of cpu_possible_mask, hence fixed at boot. |
482 | * | 473 | * |
483 | * Subtleties: | 474 | * Subtleties: |
484 | * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode | 475 | * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode |
485 | * assumption that their single CPU is online. The UP | 476 | * assumption that their single CPU is online. The UP |
486 | * cpu_{online,possible,present}_maps are placebos. Changing them | 477 | * cpu_{online,possible,present}_masks are placebos. Changing them |
487 | * will have no useful affect on the following num_*_cpus() | 478 | * will have no useful affect on the following num_*_cpus() |
488 | * and cpu_*() macros in the UP case. This ugliness is a UP | 479 | * and cpu_*() macros in the UP case. This ugliness is a UP |
489 | * optimization - don't waste any instructions or memory references | 480 | * optimization - don't waste any instructions or memory references |
490 | * asking if you're online or how many CPUs there are if there is | 481 | * asking if you're online or how many CPUs there are if there is |
491 | * only one CPU. | 482 | * only one CPU. |
492 | * 2) Most SMP arch's #define some of these maps to be some | ||
493 | * other map specific to that arch. Therefore, the following | ||
494 | * must be #define macros, not inlines. To see why, examine | ||
495 | * the assembly code produced by the following. Note that | ||
496 | * set1() writes phys_x_map, but set2() writes x_map: | ||
497 | * int x_map, phys_x_map; | ||
498 | * #define set1(a) x_map = a | ||
499 | * inline void set2(int a) { x_map = a; } | ||
500 | * #define x_map phys_x_map | ||
501 | * main(){ set1(3); set2(5); } | ||
502 | */ | 483 | */ |
503 | 484 | ||
504 | extern cpumask_t cpu_possible_map; | 485 | extern const struct cpumask *const cpu_possible_mask; |
505 | extern cpumask_t cpu_online_map; | 486 | extern const struct cpumask *const cpu_online_mask; |
506 | extern cpumask_t cpu_present_map; | 487 | extern const struct cpumask *const cpu_present_mask; |
507 | extern cpumask_t cpu_active_map; | 488 | extern const struct cpumask *const cpu_active_mask; |
489 | |||
490 | /* These strip const, as traditionally they weren't const. */ | ||
491 | #define cpu_possible_map (*(cpumask_t *)cpu_possible_mask) | ||
492 | #define cpu_online_map (*(cpumask_t *)cpu_online_mask) | ||
493 | #define cpu_present_map (*(cpumask_t *)cpu_present_mask) | ||
494 | #define cpu_active_map (*(cpumask_t *)cpu_active_mask) | ||
508 | 495 | ||
509 | #if NR_CPUS > 1 | 496 | #if NR_CPUS > 1 |
510 | #define num_online_cpus() cpus_weight_nr(cpu_online_map) | 497 | #define num_online_cpus() cpumask_weight(cpu_online_mask) |
511 | #define num_possible_cpus() cpus_weight_nr(cpu_possible_map) | 498 | #define num_possible_cpus() cpumask_weight(cpu_possible_mask) |
512 | #define num_present_cpus() cpus_weight_nr(cpu_present_map) | 499 | #define num_present_cpus() cpumask_weight(cpu_present_mask) |
513 | #define cpu_online(cpu) cpu_isset((cpu), cpu_online_map) | 500 | #define cpu_online(cpu) cpumask_test_cpu((cpu), cpu_online_mask) |
514 | #define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map) | 501 | #define cpu_possible(cpu) cpumask_test_cpu((cpu), cpu_possible_mask) |
515 | #define cpu_present(cpu) cpu_isset((cpu), cpu_present_map) | 502 | #define cpu_present(cpu) cpumask_test_cpu((cpu), cpu_present_mask) |
516 | #define cpu_active(cpu) cpu_isset((cpu), cpu_active_map) | 503 | #define cpu_active(cpu) cpumask_test_cpu((cpu), cpu_active_mask) |
517 | #else | 504 | #else |
518 | #define num_online_cpus() 1 | 505 | #define num_online_cpus() 1 |
519 | #define num_possible_cpus() 1 | 506 | #define num_possible_cpus() 1 |
@@ -526,10 +513,6 @@ extern cpumask_t cpu_active_map; | |||
526 | 513 | ||
527 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) | 514 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) |
528 | 515 | ||
529 | #define for_each_possible_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_possible_map) | ||
530 | #define for_each_online_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_online_map) | ||
531 | #define for_each_present_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_present_map) | ||
532 | |||
533 | /* These are the new versions of the cpumask operators: passed by pointer. | 516 | /* These are the new versions of the cpumask operators: passed by pointer. |
534 | * The older versions will be implemented in terms of these, then deleted. */ | 517 | * The older versions will be implemented in terms of these, then deleted. */ |
535 | #define cpumask_bits(maskp) ((maskp)->bits) | 518 | #define cpumask_bits(maskp) ((maskp)->bits) |
@@ -540,9 +523,6 @@ extern cpumask_t cpu_active_map; | |||
540 | [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \ | 523 | [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \ |
541 | } | 524 | } |
542 | 525 | ||
543 | /* This produces more efficient code. */ | ||
544 | #define nr_cpumask_bits NR_CPUS | ||
545 | |||
546 | #else /* NR_CPUS > BITS_PER_LONG */ | 526 | #else /* NR_CPUS > BITS_PER_LONG */ |
547 | 527 | ||
548 | #define CPU_BITS_ALL \ | 528 | #define CPU_BITS_ALL \ |
@@ -550,9 +530,15 @@ extern cpumask_t cpu_active_map; | |||
550 | [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \ | 530 | [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \ |
551 | [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \ | 531 | [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \ |
552 | } | 532 | } |
533 | #endif /* NR_CPUS > BITS_PER_LONG */ | ||
553 | 534 | ||
535 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
536 | /* Assuming NR_CPUS is huge, a runtime limit is more efficient. Also, | ||
537 | * not all bits may be allocated. */ | ||
554 | #define nr_cpumask_bits nr_cpu_ids | 538 | #define nr_cpumask_bits nr_cpu_ids |
555 | #endif /* NR_CPUS > BITS_PER_LONG */ | 539 | #else |
540 | #define nr_cpumask_bits NR_CPUS | ||
541 | #endif | ||
556 | 542 | ||
557 | /* verify cpu argument to cpumask_* operators */ | 543 | /* verify cpu argument to cpumask_* operators */ |
558 | static inline unsigned int cpumask_check(unsigned int cpu) | 544 | static inline unsigned int cpumask_check(unsigned int cpu) |
@@ -714,7 +700,7 @@ static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp) | |||
714 | * No static inline type checking - see Subtlety (1) above. | 700 | * No static inline type checking - see Subtlety (1) above. |
715 | */ | 701 | */ |
716 | #define cpumask_test_cpu(cpu, cpumask) \ | 702 | #define cpumask_test_cpu(cpu, cpumask) \ |
717 | test_bit(cpumask_check(cpu), (cpumask)->bits) | 703 | test_bit(cpumask_check(cpu), cpumask_bits((cpumask))) |
718 | 704 | ||
719 | /** | 705 | /** |
720 | * cpumask_test_and_set_cpu - atomically test and set a cpu in a cpumask | 706 | * cpumask_test_and_set_cpu - atomically test and set a cpu in a cpumask |
@@ -946,22 +932,61 @@ static inline void cpumask_copy(struct cpumask *dstp, | |||
946 | #define cpumask_of(cpu) (get_cpu_mask(cpu)) | 932 | #define cpumask_of(cpu) (get_cpu_mask(cpu)) |
947 | 933 | ||
948 | /** | 934 | /** |
949 | * to_cpumask - convert an NR_CPUS bitmap to a struct cpumask * | 935 | * cpumask_scnprintf - print a cpumask into a string as comma-separated hex |
950 | * @bitmap: the bitmap | 936 | * @buf: the buffer to sprintf into |
937 | * @len: the length of the buffer | ||
938 | * @srcp: the cpumask to print | ||
951 | * | 939 | * |
952 | * There are a few places where cpumask_var_t isn't appropriate and | 940 | * If len is zero, returns zero. Otherwise returns the length of the |
953 | * static cpumasks must be used (eg. very early boot), yet we don't | 941 | * (nul-terminated) @buf string. |
954 | * expose the definition of 'struct cpumask'. | 942 | */ |
943 | static inline int cpumask_scnprintf(char *buf, int len, | ||
944 | const struct cpumask *srcp) | ||
945 | { | ||
946 | return bitmap_scnprintf(buf, len, cpumask_bits(srcp), nr_cpumask_bits); | ||
947 | } | ||
948 | |||
949 | /** | ||
950 | * cpumask_parse_user - extract a cpumask from a user string | ||
951 | * @buf: the buffer to extract from | ||
952 | * @len: the length of the buffer | ||
953 | * @dstp: the cpumask to set. | ||
955 | * | 954 | * |
956 | * This does the conversion, and can be used as a constant initializer. | 955 | * Returns -errno, or 0 for success. |
957 | */ | 956 | */ |
958 | #define to_cpumask(bitmap) \ | 957 | static inline int cpumask_parse_user(const char __user *buf, int len, |
959 | ((struct cpumask *)(1 ? (bitmap) \ | 958 | struct cpumask *dstp) |
960 | : (void *)sizeof(__check_is_bitmap(bitmap)))) | 959 | { |
960 | return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpumask_bits); | ||
961 | } | ||
961 | 962 | ||
962 | static inline int __check_is_bitmap(const unsigned long *bitmap) | 963 | /** |
964 | * cpulist_scnprintf - print a cpumask into a string as comma-separated list | ||
965 | * @buf: the buffer to sprintf into | ||
966 | * @len: the length of the buffer | ||
967 | * @srcp: the cpumask to print | ||
968 | * | ||
969 | * If len is zero, returns zero. Otherwise returns the length of the | ||
970 | * (nul-terminated) @buf string. | ||
971 | */ | ||
972 | static inline int cpulist_scnprintf(char *buf, int len, | ||
973 | const struct cpumask *srcp) | ||
963 | { | 974 | { |
964 | return 1; | 975 | return bitmap_scnlistprintf(buf, len, cpumask_bits(srcp), |
976 | nr_cpumask_bits); | ||
977 | } | ||
978 | |||
979 | /** | ||
980 | * cpulist_parse_user - extract a cpumask from a user string of ranges | ||
981 | * @buf: the buffer to extract from | ||
982 | * @len: the length of the buffer | ||
983 | * @dstp: the cpumask to set. | ||
984 | * | ||
985 | * Returns -errno, or 0 for success. | ||
986 | */ | ||
987 | static inline int cpulist_parse(const char *buf, struct cpumask *dstp) | ||
988 | { | ||
989 | return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpumask_bits); | ||
965 | } | 990 | } |
966 | 991 | ||
967 | /** | 992 | /** |
@@ -995,6 +1020,7 @@ static inline size_t cpumask_size(void) | |||
995 | #ifdef CONFIG_CPUMASK_OFFSTACK | 1020 | #ifdef CONFIG_CPUMASK_OFFSTACK |
996 | typedef struct cpumask *cpumask_var_t; | 1021 | typedef struct cpumask *cpumask_var_t; |
997 | 1022 | ||
1023 | bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node); | ||
998 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags); | 1024 | bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags); |
999 | void alloc_bootmem_cpumask_var(cpumask_var_t *mask); | 1025 | void alloc_bootmem_cpumask_var(cpumask_var_t *mask); |
1000 | void free_cpumask_var(cpumask_var_t mask); | 1026 | void free_cpumask_var(cpumask_var_t mask); |
@@ -1008,6 +1034,12 @@ static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags) | |||
1008 | return true; | 1034 | return true; |
1009 | } | 1035 | } |
1010 | 1036 | ||
1037 | static inline bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, | ||
1038 | int node) | ||
1039 | { | ||
1040 | return true; | ||
1041 | } | ||
1042 | |||
1011 | static inline void alloc_bootmem_cpumask_var(cpumask_var_t *mask) | 1043 | static inline void alloc_bootmem_cpumask_var(cpumask_var_t *mask) |
1012 | { | 1044 | { |
1013 | } | 1045 | } |
@@ -1021,12 +1053,6 @@ static inline void free_bootmem_cpumask_var(cpumask_var_t mask) | |||
1021 | } | 1053 | } |
1022 | #endif /* CONFIG_CPUMASK_OFFSTACK */ | 1054 | #endif /* CONFIG_CPUMASK_OFFSTACK */ |
1023 | 1055 | ||
1024 | /* The pointer versions of the maps, these will become the primary versions. */ | ||
1025 | #define cpu_possible_mask ((const struct cpumask *)&cpu_possible_map) | ||
1026 | #define cpu_online_mask ((const struct cpumask *)&cpu_online_map) | ||
1027 | #define cpu_present_mask ((const struct cpumask *)&cpu_present_map) | ||
1028 | #define cpu_active_mask ((const struct cpumask *)&cpu_active_map) | ||
1029 | |||
1030 | /* It's common to want to use cpu_all_mask in struct member initializers, | 1056 | /* It's common to want to use cpu_all_mask in struct member initializers, |
1031 | * so it has to refer to an address rather than a pointer. */ | 1057 | * so it has to refer to an address rather than a pointer. */ |
1032 | extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS); | 1058 | extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS); |
@@ -1035,51 +1061,16 @@ extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS); | |||
1035 | /* First bits of cpu_bit_bitmap are in fact unset. */ | 1061 | /* First bits of cpu_bit_bitmap are in fact unset. */ |
1036 | #define cpu_none_mask to_cpumask(cpu_bit_bitmap[0]) | 1062 | #define cpu_none_mask to_cpumask(cpu_bit_bitmap[0]) |
1037 | 1063 | ||
1038 | /* Wrappers for arch boot code to manipulate normally-constant masks */ | 1064 | #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask) |
1039 | static inline void set_cpu_possible(unsigned int cpu, bool possible) | 1065 | #define for_each_online_cpu(cpu) for_each_cpu((cpu), cpu_online_mask) |
1040 | { | 1066 | #define for_each_present_cpu(cpu) for_each_cpu((cpu), cpu_present_mask) |
1041 | if (possible) | ||
1042 | cpumask_set_cpu(cpu, &cpu_possible_map); | ||
1043 | else | ||
1044 | cpumask_clear_cpu(cpu, &cpu_possible_map); | ||
1045 | } | ||
1046 | |||
1047 | static inline void set_cpu_present(unsigned int cpu, bool present) | ||
1048 | { | ||
1049 | if (present) | ||
1050 | cpumask_set_cpu(cpu, &cpu_present_map); | ||
1051 | else | ||
1052 | cpumask_clear_cpu(cpu, &cpu_present_map); | ||
1053 | } | ||
1054 | |||
1055 | static inline void set_cpu_online(unsigned int cpu, bool online) | ||
1056 | { | ||
1057 | if (online) | ||
1058 | cpumask_set_cpu(cpu, &cpu_online_map); | ||
1059 | else | ||
1060 | cpumask_clear_cpu(cpu, &cpu_online_map); | ||
1061 | } | ||
1062 | |||
1063 | static inline void set_cpu_active(unsigned int cpu, bool active) | ||
1064 | { | ||
1065 | if (active) | ||
1066 | cpumask_set_cpu(cpu, &cpu_active_map); | ||
1067 | else | ||
1068 | cpumask_clear_cpu(cpu, &cpu_active_map); | ||
1069 | } | ||
1070 | |||
1071 | static inline void init_cpu_present(const struct cpumask *src) | ||
1072 | { | ||
1073 | cpumask_copy(&cpu_present_map, src); | ||
1074 | } | ||
1075 | |||
1076 | static inline void init_cpu_possible(const struct cpumask *src) | ||
1077 | { | ||
1078 | cpumask_copy(&cpu_possible_map, src); | ||
1079 | } | ||
1080 | 1067 | ||
1081 | static inline void init_cpu_online(const struct cpumask *src) | 1068 | /* Wrappers for arch boot code to manipulate normally-constant masks */ |
1082 | { | 1069 | void set_cpu_possible(unsigned int cpu, bool possible); |
1083 | cpumask_copy(&cpu_online_map, src); | 1070 | void set_cpu_present(unsigned int cpu, bool present); |
1084 | } | 1071 | void set_cpu_online(unsigned int cpu, bool online); |
1072 | void set_cpu_active(unsigned int cpu, bool active); | ||
1073 | void init_cpu_present(const struct cpumask *src); | ||
1074 | void init_cpu_possible(const struct cpumask *src); | ||
1075 | void init_cpu_online(const struct cpumask *src); | ||
1085 | #endif /* __LINUX_CPUMASK_H */ | 1076 | #endif /* __LINUX_CPUMASK_H */ |
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 8e540d32c9fe..90c6074a36ca 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h | |||
@@ -20,8 +20,9 @@ extern int number_of_cpusets; /* How many cpusets are defined in system? */ | |||
20 | extern int cpuset_init_early(void); | 20 | extern int cpuset_init_early(void); |
21 | extern int cpuset_init(void); | 21 | extern int cpuset_init(void); |
22 | extern void cpuset_init_smp(void); | 22 | extern void cpuset_init_smp(void); |
23 | extern void cpuset_cpus_allowed(struct task_struct *p, cpumask_t *mask); | 23 | extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); |
24 | extern void cpuset_cpus_allowed_locked(struct task_struct *p, cpumask_t *mask); | 24 | extern void cpuset_cpus_allowed_locked(struct task_struct *p, |
25 | struct cpumask *mask); | ||
25 | extern nodemask_t cpuset_mems_allowed(struct task_struct *p); | 26 | extern nodemask_t cpuset_mems_allowed(struct task_struct *p); |
26 | #define cpuset_current_mems_allowed (current->mems_allowed) | 27 | #define cpuset_current_mems_allowed (current->mems_allowed) |
27 | void cpuset_init_current_mems_allowed(void); | 28 | void cpuset_init_current_mems_allowed(void); |
@@ -78,18 +79,21 @@ extern int current_cpuset_is_being_rebound(void); | |||
78 | 79 | ||
79 | extern void rebuild_sched_domains(void); | 80 | extern void rebuild_sched_domains(void); |
80 | 81 | ||
82 | extern void cpuset_print_task_mems_allowed(struct task_struct *p); | ||
83 | |||
81 | #else /* !CONFIG_CPUSETS */ | 84 | #else /* !CONFIG_CPUSETS */ |
82 | 85 | ||
83 | static inline int cpuset_init_early(void) { return 0; } | 86 | static inline int cpuset_init_early(void) { return 0; } |
84 | static inline int cpuset_init(void) { return 0; } | 87 | static inline int cpuset_init(void) { return 0; } |
85 | static inline void cpuset_init_smp(void) {} | 88 | static inline void cpuset_init_smp(void) {} |
86 | 89 | ||
87 | static inline void cpuset_cpus_allowed(struct task_struct *p, cpumask_t *mask) | 90 | static inline void cpuset_cpus_allowed(struct task_struct *p, |
91 | struct cpumask *mask) | ||
88 | { | 92 | { |
89 | *mask = cpu_possible_map; | 93 | *mask = cpu_possible_map; |
90 | } | 94 | } |
91 | static inline void cpuset_cpus_allowed_locked(struct task_struct *p, | 95 | static inline void cpuset_cpus_allowed_locked(struct task_struct *p, |
92 | cpumask_t *mask) | 96 | struct cpumask *mask) |
93 | { | 97 | { |
94 | *mask = cpu_possible_map; | 98 | *mask = cpu_possible_map; |
95 | } | 99 | } |
@@ -159,6 +163,10 @@ static inline void rebuild_sched_domains(void) | |||
159 | partition_sched_domains(1, NULL, NULL); | 163 | partition_sched_domains(1, NULL, NULL); |
160 | } | 164 | } |
161 | 165 | ||
166 | static inline void cpuset_print_task_mems_allowed(struct task_struct *p) | ||
167 | { | ||
168 | } | ||
169 | |||
162 | #endif /* !CONFIG_CPUSETS */ | 170 | #endif /* !CONFIG_CPUSETS */ |
163 | 171 | ||
164 | #endif /* _LINUX_CPUSET_H */ | 172 | #endif /* _LINUX_CPUSET_H */ |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index a37359d0bad1..c66d22487bf8 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -75,14 +75,22 @@ full_name_hash(const unsigned char *name, unsigned int len) | |||
75 | return end_name_hash(hash); | 75 | return end_name_hash(hash); |
76 | } | 76 | } |
77 | 77 | ||
78 | struct dcookie_struct; | 78 | /* |
79 | 79 | * Try to keep struct dentry aligned on 64 byte cachelines (this will | |
80 | #define DNAME_INLINE_LEN_MIN 36 | 80 | * give reasonable cacheline footprint with larger lines without the |
81 | * large memory footprint increase). | ||
82 | */ | ||
83 | #ifdef CONFIG_64BIT | ||
84 | #define DNAME_INLINE_LEN_MIN 32 /* 192 bytes */ | ||
85 | #else | ||
86 | #define DNAME_INLINE_LEN_MIN 40 /* 128 bytes */ | ||
87 | #endif | ||
81 | 88 | ||
82 | struct dentry { | 89 | struct dentry { |
83 | atomic_t d_count; | 90 | atomic_t d_count; |
84 | unsigned int d_flags; /* protected by d_lock */ | 91 | unsigned int d_flags; /* protected by d_lock */ |
85 | spinlock_t d_lock; /* per dentry lock */ | 92 | spinlock_t d_lock; /* per dentry lock */ |
93 | int d_mounted; | ||
86 | struct inode *d_inode; /* Where the name belongs to - NULL is | 94 | struct inode *d_inode; /* Where the name belongs to - NULL is |
87 | * negative */ | 95 | * negative */ |
88 | /* | 96 | /* |
@@ -107,10 +115,7 @@ struct dentry { | |||
107 | struct dentry_operations *d_op; | 115 | struct dentry_operations *d_op; |
108 | struct super_block *d_sb; /* The root of the dentry tree */ | 116 | struct super_block *d_sb; /* The root of the dentry tree */ |
109 | void *d_fsdata; /* fs-specific data */ | 117 | void *d_fsdata; /* fs-specific data */ |
110 | #ifdef CONFIG_PROFILING | 118 | |
111 | struct dcookie_struct *d_cookie; /* cookie, if any */ | ||
112 | #endif | ||
113 | int d_mounted; | ||
114 | unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ | 119 | unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ |
115 | }; | 120 | }; |
116 | 121 | ||
@@ -177,6 +182,8 @@ d_iput: no no no yes | |||
177 | 182 | ||
178 | #define DCACHE_INOTIFY_PARENT_WATCHED 0x0020 /* Parent inode is watched */ | 183 | #define DCACHE_INOTIFY_PARENT_WATCHED 0x0020 /* Parent inode is watched */ |
179 | 184 | ||
185 | #define DCACHE_COOKIE 0x0040 /* For use by dcookie subsystem */ | ||
186 | |||
180 | extern spinlock_t dcache_lock; | 187 | extern spinlock_t dcache_lock; |
181 | extern seqlock_t rename_lock; | 188 | extern seqlock_t rename_lock; |
182 | 189 | ||
diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h index 4aaa4afb1cb9..096476f1fb35 100644 --- a/include/linux/debug_locks.h +++ b/include/linux/debug_locks.h | |||
@@ -17,7 +17,7 @@ extern int debug_locks_off(void); | |||
17 | ({ \ | 17 | ({ \ |
18 | int __ret = 0; \ | 18 | int __ret = 0; \ |
19 | \ | 19 | \ |
20 | if (unlikely(c)) { \ | 20 | if (!oops_in_progress && unlikely(c)) { \ |
21 | if (debug_locks_off() && !debug_locks_silent) \ | 21 | if (debug_locks_off() && !debug_locks_silent) \ |
22 | WARN_ON(1); \ | 22 | WARN_ON(1); \ |
23 | __ret = 1; \ | 23 | __ret = 1; \ |
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index e1a6c046cea3..23936b16426b 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h | |||
@@ -63,6 +63,8 @@ struct dentry *debugfs_create_x16(const char *name, mode_t mode, | |||
63 | struct dentry *parent, u16 *value); | 63 | struct dentry *parent, u16 *value); |
64 | struct dentry *debugfs_create_x32(const char *name, mode_t mode, | 64 | struct dentry *debugfs_create_x32(const char *name, mode_t mode, |
65 | struct dentry *parent, u32 *value); | 65 | struct dentry *parent, u32 *value); |
66 | struct dentry *debugfs_create_size_t(const char *name, mode_t mode, | ||
67 | struct dentry *parent, size_t *value); | ||
66 | struct dentry *debugfs_create_bool(const char *name, mode_t mode, | 68 | struct dentry *debugfs_create_bool(const char *name, mode_t mode, |
67 | struct dentry *parent, u32 *value); | 69 | struct dentry *parent, u32 *value); |
68 | 70 | ||
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index c17fd334e574..8209e08969f9 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
@@ -45,6 +45,8 @@ typedef void (*dm_dtr_fn) (struct dm_target *ti); | |||
45 | */ | 45 | */ |
46 | typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio, | 46 | typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio, |
47 | union map_info *map_context); | 47 | union map_info *map_context); |
48 | typedef int (*dm_map_request_fn) (struct dm_target *ti, struct request *clone, | ||
49 | union map_info *map_context); | ||
48 | 50 | ||
49 | /* | 51 | /* |
50 | * Returns: | 52 | * Returns: |
@@ -57,6 +59,9 @@ typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio, | |||
57 | typedef int (*dm_endio_fn) (struct dm_target *ti, | 59 | typedef int (*dm_endio_fn) (struct dm_target *ti, |
58 | struct bio *bio, int error, | 60 | struct bio *bio, int error, |
59 | union map_info *map_context); | 61 | union map_info *map_context); |
62 | typedef int (*dm_request_endio_fn) (struct dm_target *ti, | ||
63 | struct request *clone, int error, | ||
64 | union map_info *map_context); | ||
60 | 65 | ||
61 | typedef void (*dm_flush_fn) (struct dm_target *ti); | 66 | typedef void (*dm_flush_fn) (struct dm_target *ti); |
62 | typedef void (*dm_presuspend_fn) (struct dm_target *ti); | 67 | typedef void (*dm_presuspend_fn) (struct dm_target *ti); |
@@ -75,6 +80,13 @@ typedef int (*dm_ioctl_fn) (struct dm_target *ti, unsigned int cmd, | |||
75 | typedef int (*dm_merge_fn) (struct dm_target *ti, struct bvec_merge_data *bvm, | 80 | typedef int (*dm_merge_fn) (struct dm_target *ti, struct bvec_merge_data *bvm, |
76 | struct bio_vec *biovec, int max_size); | 81 | struct bio_vec *biovec, int max_size); |
77 | 82 | ||
83 | /* | ||
84 | * Returns: | ||
85 | * 0: The target can handle the next I/O immediately. | ||
86 | * 1: The target can't handle the next I/O immediately. | ||
87 | */ | ||
88 | typedef int (*dm_busy_fn) (struct dm_target *ti); | ||
89 | |||
78 | void dm_error(const char *message); | 90 | void dm_error(const char *message); |
79 | 91 | ||
80 | /* | 92 | /* |
@@ -100,14 +112,23 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d); | |||
100 | /* | 112 | /* |
101 | * Information about a target type | 113 | * Information about a target type |
102 | */ | 114 | */ |
115 | |||
116 | /* | ||
117 | * Target features | ||
118 | */ | ||
119 | #define DM_TARGET_SUPPORTS_BARRIERS 0x00000001 | ||
120 | |||
103 | struct target_type { | 121 | struct target_type { |
122 | uint64_t features; | ||
104 | const char *name; | 123 | const char *name; |
105 | struct module *module; | 124 | struct module *module; |
106 | unsigned version[3]; | 125 | unsigned version[3]; |
107 | dm_ctr_fn ctr; | 126 | dm_ctr_fn ctr; |
108 | dm_dtr_fn dtr; | 127 | dm_dtr_fn dtr; |
109 | dm_map_fn map; | 128 | dm_map_fn map; |
129 | dm_map_request_fn map_rq; | ||
110 | dm_endio_fn end_io; | 130 | dm_endio_fn end_io; |
131 | dm_request_endio_fn rq_end_io; | ||
111 | dm_flush_fn flush; | 132 | dm_flush_fn flush; |
112 | dm_presuspend_fn presuspend; | 133 | dm_presuspend_fn presuspend; |
113 | dm_postsuspend_fn postsuspend; | 134 | dm_postsuspend_fn postsuspend; |
@@ -117,6 +138,7 @@ struct target_type { | |||
117 | dm_message_fn message; | 138 | dm_message_fn message; |
118 | dm_ioctl_fn ioctl; | 139 | dm_ioctl_fn ioctl; |
119 | dm_merge_fn merge; | 140 | dm_merge_fn merge; |
141 | dm_busy_fn busy; | ||
120 | }; | 142 | }; |
121 | 143 | ||
122 | struct io_restrictions { | 144 | struct io_restrictions { |
@@ -157,8 +179,7 @@ struct dm_target { | |||
157 | }; | 179 | }; |
158 | 180 | ||
159 | int dm_register_target(struct target_type *t); | 181 | int dm_register_target(struct target_type *t); |
160 | int dm_unregister_target(struct target_type *t); | 182 | void dm_unregister_target(struct target_type *t); |
161 | |||
162 | 183 | ||
163 | /*----------------------------------------------------------------- | 184 | /*----------------------------------------------------------------- |
164 | * Functions for creating and manipulating mapped devices. | 185 | * Functions for creating and manipulating mapped devices. |
@@ -276,6 +297,9 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size); | |||
276 | *---------------------------------------------------------------*/ | 297 | *---------------------------------------------------------------*/ |
277 | #define DM_NAME "device-mapper" | 298 | #define DM_NAME "device-mapper" |
278 | 299 | ||
300 | #define DMCRIT(f, arg...) \ | ||
301 | printk(KERN_CRIT DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) | ||
302 | |||
279 | #define DMERR(f, arg...) \ | 303 | #define DMERR(f, arg...) \ |
280 | printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) | 304 | printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg) |
281 | #define DMERR_LIMIT(f, arg...) \ | 305 | #define DMERR_LIMIT(f, arg...) \ |
diff --git a/include/linux/device.h b/include/linux/device.h index 1a3686d15f98..45e5b1921fbb 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -65,7 +65,7 @@ struct bus_type { | |||
65 | int (*resume_early)(struct device *dev); | 65 | int (*resume_early)(struct device *dev); |
66 | int (*resume)(struct device *dev); | 66 | int (*resume)(struct device *dev); |
67 | 67 | ||
68 | struct pm_ext_ops *pm; | 68 | struct dev_pm_ops *pm; |
69 | 69 | ||
70 | struct bus_type_private *p; | 70 | struct bus_type_private *p; |
71 | }; | 71 | }; |
@@ -133,7 +133,7 @@ struct device_driver { | |||
133 | int (*resume) (struct device *dev); | 133 | int (*resume) (struct device *dev); |
134 | struct attribute_group **groups; | 134 | struct attribute_group **groups; |
135 | 135 | ||
136 | struct pm_ops *pm; | 136 | struct dev_pm_ops *pm; |
137 | 137 | ||
138 | struct driver_private *p; | 138 | struct driver_private *p; |
139 | }; | 139 | }; |
@@ -198,7 +198,7 @@ struct class { | |||
198 | int (*suspend)(struct device *dev, pm_message_t state); | 198 | int (*suspend)(struct device *dev, pm_message_t state); |
199 | int (*resume)(struct device *dev); | 199 | int (*resume)(struct device *dev); |
200 | 200 | ||
201 | struct pm_ops *pm; | 201 | struct dev_pm_ops *pm; |
202 | struct class_private *p; | 202 | struct class_private *p; |
203 | }; | 203 | }; |
204 | 204 | ||
@@ -291,7 +291,7 @@ struct device_type { | |||
291 | int (*suspend)(struct device *dev, pm_message_t state); | 291 | int (*suspend)(struct device *dev, pm_message_t state); |
292 | int (*resume)(struct device *dev); | 292 | int (*resume)(struct device *dev); |
293 | 293 | ||
294 | struct pm_ops *pm; | 294 | struct dev_pm_ops *pm; |
295 | }; | 295 | }; |
296 | 296 | ||
297 | /* interface for exporting device attributes */ | 297 | /* interface for exporting device attributes */ |
@@ -373,9 +373,9 @@ struct device { | |||
373 | 373 | ||
374 | struct kobject kobj; | 374 | struct kobject kobj; |
375 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ | 375 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ |
376 | unsigned uevent_suppress:1; | ||
376 | const char *init_name; /* initial name of the device */ | 377 | const char *init_name; /* initial name of the device */ |
377 | struct device_type *type; | 378 | struct device_type *type; |
378 | unsigned uevent_suppress:1; | ||
379 | 379 | ||
380 | struct semaphore sem; /* semaphore to synchronize calls to | 380 | struct semaphore sem; /* semaphore to synchronize calls to |
381 | * its driver. | 381 | * its driver. |
@@ -408,12 +408,13 @@ struct device { | |||
408 | /* arch specific additions */ | 408 | /* arch specific additions */ |
409 | struct dev_archdata archdata; | 409 | struct dev_archdata archdata; |
410 | 410 | ||
411 | dev_t devt; /* dev_t, creates the sysfs "dev" */ | ||
412 | |||
411 | spinlock_t devres_lock; | 413 | spinlock_t devres_lock; |
412 | struct list_head devres_head; | 414 | struct list_head devres_head; |
413 | 415 | ||
414 | struct klist_node knode_class; | 416 | struct klist_node knode_class; |
415 | struct class *class; | 417 | struct class *class; |
416 | dev_t devt; /* dev_t, creates the sysfs "dev" */ | ||
417 | struct attribute_group **groups; /* optional groups */ | 418 | struct attribute_group **groups; /* optional groups */ |
418 | 419 | ||
419 | void (*release)(struct device *dev); | 420 | void (*release)(struct device *dev); |
@@ -483,6 +484,17 @@ extern int device_rename(struct device *dev, char *new_name); | |||
483 | extern int device_move(struct device *dev, struct device *new_parent); | 484 | extern int device_move(struct device *dev, struct device *new_parent); |
484 | 485 | ||
485 | /* | 486 | /* |
487 | * Root device objects for grouping under /sys/devices | ||
488 | */ | ||
489 | extern struct device *__root_device_register(const char *name, | ||
490 | struct module *owner); | ||
491 | static inline struct device *root_device_register(const char *name) | ||
492 | { | ||
493 | return __root_device_register(name, THIS_MODULE); | ||
494 | } | ||
495 | extern void root_device_unregister(struct device *root); | ||
496 | |||
497 | /* | ||
486 | * Manual binding of a device to driver. See drivers/base/bus.c | 498 | * Manual binding of a device to driver. See drivers/base/bus.c |
487 | * for information on use. | 499 | * for information on use. |
488 | */ | 500 | */ |
@@ -553,13 +565,13 @@ extern const char *dev_driver_string(const struct device *dev); | |||
553 | #define dev_info(dev, format, arg...) \ | 565 | #define dev_info(dev, format, arg...) \ |
554 | dev_printk(KERN_INFO , dev , format , ## arg) | 566 | dev_printk(KERN_INFO , dev , format , ## arg) |
555 | 567 | ||
556 | #if defined(CONFIG_DYNAMIC_PRINTK_DEBUG) | 568 | #if defined(DEBUG) |
569 | #define dev_dbg(dev, format, arg...) \ | ||
570 | dev_printk(KERN_DEBUG , dev , format , ## arg) | ||
571 | #elif defined(CONFIG_DYNAMIC_PRINTK_DEBUG) | ||
557 | #define dev_dbg(dev, format, ...) do { \ | 572 | #define dev_dbg(dev, format, ...) do { \ |
558 | dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ | 573 | dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ |
559 | } while (0) | 574 | } while (0) |
560 | #elif defined(DEBUG) | ||
561 | #define dev_dbg(dev, format, arg...) \ | ||
562 | dev_printk(KERN_DEBUG , dev , format , ## arg) | ||
563 | #else | 575 | #else |
564 | #define dev_dbg(dev, format, arg...) \ | 576 | #define dev_dbg(dev, format, arg...) \ |
565 | ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; }) | 577 | ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; }) |
diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h index 952df39c989d..af1dab41674b 100644 --- a/include/linux/dma_remapping.h +++ b/include/linux/dma_remapping.h | |||
@@ -9,148 +9,24 @@ | |||
9 | #define VTD_PAGE_MASK (((u64)-1) << VTD_PAGE_SHIFT) | 9 | #define VTD_PAGE_MASK (((u64)-1) << VTD_PAGE_SHIFT) |
10 | #define VTD_PAGE_ALIGN(addr) (((addr) + VTD_PAGE_SIZE - 1) & VTD_PAGE_MASK) | 10 | #define VTD_PAGE_ALIGN(addr) (((addr) + VTD_PAGE_SIZE - 1) & VTD_PAGE_MASK) |
11 | 11 | ||
12 | #define IOVA_PFN(addr) ((addr) >> PAGE_SHIFT) | ||
13 | #define DMA_32BIT_PFN IOVA_PFN(DMA_32BIT_MASK) | ||
14 | #define DMA_64BIT_PFN IOVA_PFN(DMA_64BIT_MASK) | ||
15 | |||
16 | |||
17 | /* | ||
18 | * 0: Present | ||
19 | * 1-11: Reserved | ||
20 | * 12-63: Context Ptr (12 - (haw-1)) | ||
21 | * 64-127: Reserved | ||
22 | */ | ||
23 | struct root_entry { | ||
24 | u64 val; | ||
25 | u64 rsvd1; | ||
26 | }; | ||
27 | #define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry)) | ||
28 | static inline bool root_present(struct root_entry *root) | ||
29 | { | ||
30 | return (root->val & 1); | ||
31 | } | ||
32 | static inline void set_root_present(struct root_entry *root) | ||
33 | { | ||
34 | root->val |= 1; | ||
35 | } | ||
36 | static inline void set_root_value(struct root_entry *root, unsigned long value) | ||
37 | { | ||
38 | root->val |= value & VTD_PAGE_MASK; | ||
39 | } | ||
40 | |||
41 | struct context_entry; | ||
42 | static inline struct context_entry * | ||
43 | get_context_addr_from_root(struct root_entry *root) | ||
44 | { | ||
45 | return (struct context_entry *) | ||
46 | (root_present(root)?phys_to_virt( | ||
47 | root->val & VTD_PAGE_MASK) : | ||
48 | NULL); | ||
49 | } | ||
50 | |||
51 | /* | ||
52 | * low 64 bits: | ||
53 | * 0: present | ||
54 | * 1: fault processing disable | ||
55 | * 2-3: translation type | ||
56 | * 12-63: address space root | ||
57 | * high 64 bits: | ||
58 | * 0-2: address width | ||
59 | * 3-6: aval | ||
60 | * 8-23: domain id | ||
61 | */ | ||
62 | struct context_entry { | ||
63 | u64 lo; | ||
64 | u64 hi; | ||
65 | }; | ||
66 | #define context_present(c) ((c).lo & 1) | ||
67 | #define context_fault_disable(c) (((c).lo >> 1) & 1) | ||
68 | #define context_translation_type(c) (((c).lo >> 2) & 3) | ||
69 | #define context_address_root(c) ((c).lo & VTD_PAGE_MASK) | ||
70 | #define context_address_width(c) ((c).hi & 7) | ||
71 | #define context_domain_id(c) (((c).hi >> 8) & ((1 << 16) - 1)) | ||
72 | |||
73 | #define context_set_present(c) do {(c).lo |= 1;} while (0) | ||
74 | #define context_set_fault_enable(c) \ | ||
75 | do {(c).lo &= (((u64)-1) << 2) | 1;} while (0) | ||
76 | #define context_set_translation_type(c, val) \ | ||
77 | do { \ | ||
78 | (c).lo &= (((u64)-1) << 4) | 3; \ | ||
79 | (c).lo |= ((val) & 3) << 2; \ | ||
80 | } while (0) | ||
81 | #define CONTEXT_TT_MULTI_LEVEL 0 | ||
82 | #define context_set_address_root(c, val) \ | ||
83 | do {(c).lo |= (val) & VTD_PAGE_MASK; } while (0) | ||
84 | #define context_set_address_width(c, val) do {(c).hi |= (val) & 7;} while (0) | ||
85 | #define context_set_domain_id(c, val) \ | ||
86 | do {(c).hi |= ((val) & ((1 << 16) - 1)) << 8;} while (0) | ||
87 | #define context_clear_entry(c) do {(c).lo = 0; (c).hi = 0;} while (0) | ||
88 | |||
89 | /* | ||
90 | * 0: readable | ||
91 | * 1: writable | ||
92 | * 2-6: reserved | ||
93 | * 7: super page | ||
94 | * 8-11: available | ||
95 | * 12-63: Host physcial address | ||
96 | */ | ||
97 | struct dma_pte { | ||
98 | u64 val; | ||
99 | }; | ||
100 | #define dma_clear_pte(p) do {(p).val = 0;} while (0) | ||
101 | |||
102 | #define DMA_PTE_READ (1) | 12 | #define DMA_PTE_READ (1) |
103 | #define DMA_PTE_WRITE (2) | 13 | #define DMA_PTE_WRITE (2) |
104 | 14 | ||
105 | #define dma_set_pte_readable(p) do {(p).val |= DMA_PTE_READ;} while (0) | ||
106 | #define dma_set_pte_writable(p) do {(p).val |= DMA_PTE_WRITE;} while (0) | ||
107 | #define dma_set_pte_prot(p, prot) \ | ||
108 | do {(p).val = ((p).val & ~3) | ((prot) & 3); } while (0) | ||
109 | #define dma_pte_addr(p) ((p).val & VTD_PAGE_MASK) | ||
110 | #define dma_set_pte_addr(p, addr) do {\ | ||
111 | (p).val |= ((addr) & VTD_PAGE_MASK); } while (0) | ||
112 | #define dma_pte_present(p) (((p).val & 3) != 0) | ||
113 | |||
114 | struct intel_iommu; | 15 | struct intel_iommu; |
16 | struct dmar_domain; | ||
17 | struct root_entry; | ||
115 | 18 | ||
116 | struct dmar_domain { | ||
117 | int id; /* domain id */ | ||
118 | struct intel_iommu *iommu; /* back pointer to owning iommu */ | ||
119 | |||
120 | struct list_head devices; /* all devices' list */ | ||
121 | struct iova_domain iovad; /* iova's that belong to this domain */ | ||
122 | |||
123 | struct dma_pte *pgd; /* virtual address */ | ||
124 | spinlock_t mapping_lock; /* page table lock */ | ||
125 | int gaw; /* max guest address width */ | ||
126 | |||
127 | /* adjusted guest address width, 0 is level 2 30-bit */ | ||
128 | int agaw; | ||
129 | |||
130 | #define DOMAIN_FLAG_MULTIPLE_DEVICES 1 | ||
131 | int flags; | ||
132 | }; | ||
133 | |||
134 | /* PCI domain-device relationship */ | ||
135 | struct device_domain_info { | ||
136 | struct list_head link; /* link to domain siblings */ | ||
137 | struct list_head global; /* link to global list */ | ||
138 | u8 bus; /* PCI bus numer */ | ||
139 | u8 devfn; /* PCI devfn number */ | ||
140 | struct pci_dev *dev; /* it's NULL for PCIE-to-PCI bridge */ | ||
141 | struct dmar_domain *domain; /* pointer to domain */ | ||
142 | }; | ||
143 | |||
144 | extern int init_dmars(void); | ||
145 | extern void free_dmar_iommu(struct intel_iommu *iommu); | 19 | extern void free_dmar_iommu(struct intel_iommu *iommu); |
146 | 20 | ||
147 | extern int dmar_disabled; | 21 | #ifdef CONFIG_DMAR |
148 | 22 | extern int iommu_calculate_agaw(struct intel_iommu *iommu); | |
149 | #ifndef CONFIG_DMAR_GFX_WA | 23 | #else |
150 | static inline void iommu_prepare_gfx_mapping(void) | 24 | static inline int iommu_calculate_agaw(struct intel_iommu *iommu) |
151 | { | 25 | { |
152 | return; | 26 | return 0; |
153 | } | 27 | } |
154 | #endif /* !CONFIG_DMAR_GFX_WA */ | 28 | #endif |
29 | |||
30 | extern int dmar_disabled; | ||
155 | 31 | ||
156 | #endif | 32 | #endif |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index adb0b084eb5a..64dea2ab326c 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
@@ -29,32 +29,6 @@ | |||
29 | #include <linux/dma-mapping.h> | 29 | #include <linux/dma-mapping.h> |
30 | 30 | ||
31 | /** | 31 | /** |
32 | * enum dma_state - resource PNP/power management state | ||
33 | * @DMA_RESOURCE_SUSPEND: DMA device going into low power state | ||
34 | * @DMA_RESOURCE_RESUME: DMA device returning to full power | ||
35 | * @DMA_RESOURCE_AVAILABLE: DMA device available to the system | ||
36 | * @DMA_RESOURCE_REMOVED: DMA device removed from the system | ||
37 | */ | ||
38 | enum dma_state { | ||
39 | DMA_RESOURCE_SUSPEND, | ||
40 | DMA_RESOURCE_RESUME, | ||
41 | DMA_RESOURCE_AVAILABLE, | ||
42 | DMA_RESOURCE_REMOVED, | ||
43 | }; | ||
44 | |||
45 | /** | ||
46 | * enum dma_state_client - state of the channel in the client | ||
47 | * @DMA_ACK: client would like to use, or was using this channel | ||
48 | * @DMA_DUP: client has already seen this channel, or is not using this channel | ||
49 | * @DMA_NAK: client does not want to see any more channels | ||
50 | */ | ||
51 | enum dma_state_client { | ||
52 | DMA_ACK, | ||
53 | DMA_DUP, | ||
54 | DMA_NAK, | ||
55 | }; | ||
56 | |||
57 | /** | ||
58 | * typedef dma_cookie_t - an opaque DMA cookie | 32 | * typedef dma_cookie_t - an opaque DMA cookie |
59 | * | 33 | * |
60 | * if dma_cookie_t is >0 it's a DMA request cookie, <0 it's an error code | 34 | * if dma_cookie_t is >0 it's a DMA request cookie, <0 it's an error code |
@@ -89,23 +63,13 @@ enum dma_transaction_type { | |||
89 | DMA_MEMSET, | 63 | DMA_MEMSET, |
90 | DMA_MEMCPY_CRC32C, | 64 | DMA_MEMCPY_CRC32C, |
91 | DMA_INTERRUPT, | 65 | DMA_INTERRUPT, |
66 | DMA_PRIVATE, | ||
92 | DMA_SLAVE, | 67 | DMA_SLAVE, |
93 | }; | 68 | }; |
94 | 69 | ||
95 | /* last transaction type for creation of the capabilities mask */ | 70 | /* last transaction type for creation of the capabilities mask */ |
96 | #define DMA_TX_TYPE_END (DMA_SLAVE + 1) | 71 | #define DMA_TX_TYPE_END (DMA_SLAVE + 1) |
97 | 72 | ||
98 | /** | ||
99 | * enum dma_slave_width - DMA slave register access width. | ||
100 | * @DMA_SLAVE_WIDTH_8BIT: Do 8-bit slave register accesses | ||
101 | * @DMA_SLAVE_WIDTH_16BIT: Do 16-bit slave register accesses | ||
102 | * @DMA_SLAVE_WIDTH_32BIT: Do 32-bit slave register accesses | ||
103 | */ | ||
104 | enum dma_slave_width { | ||
105 | DMA_SLAVE_WIDTH_8BIT, | ||
106 | DMA_SLAVE_WIDTH_16BIT, | ||
107 | DMA_SLAVE_WIDTH_32BIT, | ||
108 | }; | ||
109 | 73 | ||
110 | /** | 74 | /** |
111 | * enum dma_ctrl_flags - DMA flags to augment operation preparation, | 75 | * enum dma_ctrl_flags - DMA flags to augment operation preparation, |
@@ -132,32 +96,6 @@ enum dma_ctrl_flags { | |||
132 | typedef struct { DECLARE_BITMAP(bits, DMA_TX_TYPE_END); } dma_cap_mask_t; | 96 | typedef struct { DECLARE_BITMAP(bits, DMA_TX_TYPE_END); } dma_cap_mask_t; |
133 | 97 | ||
134 | /** | 98 | /** |
135 | * struct dma_slave - Information about a DMA slave | ||
136 | * @dev: device acting as DMA slave | ||
137 | * @dma_dev: required DMA master device. If non-NULL, the client can not be | ||
138 | * bound to other masters than this. | ||
139 | * @tx_reg: physical address of data register used for | ||
140 | * memory-to-peripheral transfers | ||
141 | * @rx_reg: physical address of data register used for | ||
142 | * peripheral-to-memory transfers | ||
143 | * @reg_width: peripheral register width | ||
144 | * | ||
145 | * If dma_dev is non-NULL, the client can not be bound to other DMA | ||
146 | * masters than the one corresponding to this device. The DMA master | ||
147 | * driver may use this to determine if there is controller-specific | ||
148 | * data wrapped around this struct. Drivers of platform code that sets | ||
149 | * the dma_dev field must therefore make sure to use an appropriate | ||
150 | * controller-specific dma slave structure wrapping this struct. | ||
151 | */ | ||
152 | struct dma_slave { | ||
153 | struct device *dev; | ||
154 | struct device *dma_dev; | ||
155 | dma_addr_t tx_reg; | ||
156 | dma_addr_t rx_reg; | ||
157 | enum dma_slave_width reg_width; | ||
158 | }; | ||
159 | |||
160 | /** | ||
161 | * struct dma_chan_percpu - the per-CPU part of struct dma_chan | 99 | * struct dma_chan_percpu - the per-CPU part of struct dma_chan |
162 | * @refcount: local_t used for open-coded "bigref" counting | 100 | * @refcount: local_t used for open-coded "bigref" counting |
163 | * @memcpy_count: transaction counter | 101 | * @memcpy_count: transaction counter |
@@ -165,7 +103,6 @@ struct dma_slave { | |||
165 | */ | 103 | */ |
166 | 104 | ||
167 | struct dma_chan_percpu { | 105 | struct dma_chan_percpu { |
168 | local_t refcount; | ||
169 | /* stats */ | 106 | /* stats */ |
170 | unsigned long memcpy_count; | 107 | unsigned long memcpy_count; |
171 | unsigned long bytes_transferred; | 108 | unsigned long bytes_transferred; |
@@ -176,13 +113,14 @@ struct dma_chan_percpu { | |||
176 | * @device: ptr to the dma device who supplies this channel, always !%NULL | 113 | * @device: ptr to the dma device who supplies this channel, always !%NULL |
177 | * @cookie: last cookie value returned to client | 114 | * @cookie: last cookie value returned to client |
178 | * @chan_id: channel ID for sysfs | 115 | * @chan_id: channel ID for sysfs |
179 | * @class_dev: class device for sysfs | 116 | * @dev: class device for sysfs |
180 | * @refcount: kref, used in "bigref" slow-mode | 117 | * @refcount: kref, used in "bigref" slow-mode |
181 | * @slow_ref: indicates that the DMA channel is free | 118 | * @slow_ref: indicates that the DMA channel is free |
182 | * @rcu: the DMA channel's RCU head | 119 | * @rcu: the DMA channel's RCU head |
183 | * @device_node: used to add this to the device chan list | 120 | * @device_node: used to add this to the device chan list |
184 | * @local: per-cpu pointer to a struct dma_chan_percpu | 121 | * @local: per-cpu pointer to a struct dma_chan_percpu |
185 | * @client-count: how many clients are using this channel | 122 | * @client-count: how many clients are using this channel |
123 | * @table_count: number of appearances in the mem-to-mem allocation table | ||
186 | */ | 124 | */ |
187 | struct dma_chan { | 125 | struct dma_chan { |
188 | struct dma_device *device; | 126 | struct dma_device *device; |
@@ -190,73 +128,47 @@ struct dma_chan { | |||
190 | 128 | ||
191 | /* sysfs */ | 129 | /* sysfs */ |
192 | int chan_id; | 130 | int chan_id; |
193 | struct device dev; | 131 | struct dma_chan_dev *dev; |
194 | |||
195 | struct kref refcount; | ||
196 | int slow_ref; | ||
197 | struct rcu_head rcu; | ||
198 | 132 | ||
199 | struct list_head device_node; | 133 | struct list_head device_node; |
200 | struct dma_chan_percpu *local; | 134 | struct dma_chan_percpu *local; |
201 | int client_count; | 135 | int client_count; |
136 | int table_count; | ||
202 | }; | 137 | }; |
203 | 138 | ||
204 | #define to_dma_chan(p) container_of(p, struct dma_chan, dev) | 139 | /** |
205 | 140 | * struct dma_chan_dev - relate sysfs device node to backing channel device | |
206 | void dma_chan_cleanup(struct kref *kref); | 141 | * @chan - driver channel device |
207 | 142 | * @device - sysfs device | |
208 | static inline void dma_chan_get(struct dma_chan *chan) | 143 | * @dev_id - parent dma_device dev_id |
209 | { | 144 | * @idr_ref - reference count to gate release of dma_device dev_id |
210 | if (unlikely(chan->slow_ref)) | 145 | */ |
211 | kref_get(&chan->refcount); | 146 | struct dma_chan_dev { |
212 | else { | 147 | struct dma_chan *chan; |
213 | local_inc(&(per_cpu_ptr(chan->local, get_cpu())->refcount)); | 148 | struct device device; |
214 | put_cpu(); | 149 | int dev_id; |
215 | } | 150 | atomic_t *idr_ref; |
216 | } | 151 | }; |
217 | 152 | ||
218 | static inline void dma_chan_put(struct dma_chan *chan) | 153 | static inline const char *dma_chan_name(struct dma_chan *chan) |
219 | { | 154 | { |
220 | if (unlikely(chan->slow_ref)) | 155 | return dev_name(&chan->dev->device); |
221 | kref_put(&chan->refcount, dma_chan_cleanup); | ||
222 | else { | ||
223 | local_dec(&(per_cpu_ptr(chan->local, get_cpu())->refcount)); | ||
224 | put_cpu(); | ||
225 | } | ||
226 | } | 156 | } |
227 | 157 | ||
228 | /* | 158 | void dma_chan_cleanup(struct kref *kref); |
229 | * typedef dma_event_callback - function pointer to a DMA event callback | ||
230 | * For each channel added to the system this routine is called for each client. | ||
231 | * If the client would like to use the channel it returns '1' to signal (ack) | ||
232 | * the dmaengine core to take out a reference on the channel and its | ||
233 | * corresponding device. A client must not 'ack' an available channel more | ||
234 | * than once. When a channel is removed all clients are notified. If a client | ||
235 | * is using the channel it must 'ack' the removal. A client must not 'ack' a | ||
236 | * removed channel more than once. | ||
237 | * @client - 'this' pointer for the client context | ||
238 | * @chan - channel to be acted upon | ||
239 | * @state - available or removed | ||
240 | */ | ||
241 | struct dma_client; | ||
242 | typedef enum dma_state_client (*dma_event_callback) (struct dma_client *client, | ||
243 | struct dma_chan *chan, enum dma_state state); | ||
244 | 159 | ||
245 | /** | 160 | /** |
246 | * struct dma_client - info on the entity making use of DMA services | 161 | * typedef dma_filter_fn - callback filter for dma_request_channel |
247 | * @event_callback: func ptr to call when something happens | 162 | * @chan: channel to be reviewed |
248 | * @cap_mask: only return channels that satisfy the requested capabilities | 163 | * @filter_param: opaque parameter passed through dma_request_channel |
249 | * a value of zero corresponds to any capability | 164 | * |
250 | * @slave: data for preparing slave transfer. Must be non-NULL iff the | 165 | * When this optional parameter is specified in a call to dma_request_channel a |
251 | * DMA_SLAVE capability is requested. | 166 | * suitable channel is passed to this routine for further dispositioning before |
252 | * @global_node: list_head for global dma_client_list | 167 | * being returned. Where 'suitable' indicates a non-busy channel that |
168 | * satisfies the given capability mask. It returns 'true' to indicate that the | ||
169 | * channel is suitable. | ||
253 | */ | 170 | */ |
254 | struct dma_client { | 171 | typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param); |
255 | dma_event_callback event_callback; | ||
256 | dma_cap_mask_t cap_mask; | ||
257 | struct dma_slave *slave; | ||
258 | struct list_head global_node; | ||
259 | }; | ||
260 | 172 | ||
261 | typedef void (*dma_async_tx_callback)(void *dma_async_param); | 173 | typedef void (*dma_async_tx_callback)(void *dma_async_param); |
262 | /** | 174 | /** |
@@ -323,14 +235,10 @@ struct dma_device { | |||
323 | dma_cap_mask_t cap_mask; | 235 | dma_cap_mask_t cap_mask; |
324 | int max_xor; | 236 | int max_xor; |
325 | 237 | ||
326 | struct kref refcount; | ||
327 | struct completion done; | ||
328 | |||
329 | int dev_id; | 238 | int dev_id; |
330 | struct device *dev; | 239 | struct device *dev; |
331 | 240 | ||
332 | int (*device_alloc_chan_resources)(struct dma_chan *chan, | 241 | int (*device_alloc_chan_resources)(struct dma_chan *chan); |
333 | struct dma_client *client); | ||
334 | void (*device_free_chan_resources)(struct dma_chan *chan); | 242 | void (*device_free_chan_resources)(struct dma_chan *chan); |
335 | 243 | ||
336 | struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( | 244 | struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( |
@@ -362,9 +270,8 @@ struct dma_device { | |||
362 | 270 | ||
363 | /* --- public DMA engine API --- */ | 271 | /* --- public DMA engine API --- */ |
364 | 272 | ||
365 | void dma_async_client_register(struct dma_client *client); | 273 | void dmaengine_get(void); |
366 | void dma_async_client_unregister(struct dma_client *client); | 274 | void dmaengine_put(void); |
367 | void dma_async_client_chan_request(struct dma_client *client); | ||
368 | dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan, | 275 | dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan, |
369 | void *dest, void *src, size_t len); | 276 | void *dest, void *src, size_t len); |
370 | dma_cookie_t dma_async_memcpy_buf_to_pg(struct dma_chan *chan, | 277 | dma_cookie_t dma_async_memcpy_buf_to_pg(struct dma_chan *chan, |
@@ -406,6 +313,12 @@ __dma_cap_set(enum dma_transaction_type tx_type, dma_cap_mask_t *dstp) | |||
406 | set_bit(tx_type, dstp->bits); | 313 | set_bit(tx_type, dstp->bits); |
407 | } | 314 | } |
408 | 315 | ||
316 | #define dma_cap_zero(mask) __dma_cap_zero(&(mask)) | ||
317 | static inline void __dma_cap_zero(dma_cap_mask_t *dstp) | ||
318 | { | ||
319 | bitmap_zero(dstp->bits, DMA_TX_TYPE_END); | ||
320 | } | ||
321 | |||
409 | #define dma_has_cap(tx, mask) __dma_has_cap((tx), &(mask)) | 322 | #define dma_has_cap(tx, mask) __dma_has_cap((tx), &(mask)) |
410 | static inline int | 323 | static inline int |
411 | __dma_has_cap(enum dma_transaction_type tx_type, dma_cap_mask_t *srcp) | 324 | __dma_has_cap(enum dma_transaction_type tx_type, dma_cap_mask_t *srcp) |
@@ -475,11 +388,25 @@ static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie, | |||
475 | } | 388 | } |
476 | 389 | ||
477 | enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie); | 390 | enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie); |
391 | #ifdef CONFIG_DMA_ENGINE | ||
392 | enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx); | ||
393 | #else | ||
394 | static inline enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx) | ||
395 | { | ||
396 | return DMA_SUCCESS; | ||
397 | } | ||
398 | #endif | ||
478 | 399 | ||
479 | /* --- DMA device --- */ | 400 | /* --- DMA device --- */ |
480 | 401 | ||
481 | int dma_async_device_register(struct dma_device *device); | 402 | int dma_async_device_register(struct dma_device *device); |
482 | void dma_async_device_unregister(struct dma_device *device); | 403 | void dma_async_device_unregister(struct dma_device *device); |
404 | void dma_run_dependencies(struct dma_async_tx_descriptor *tx); | ||
405 | struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type); | ||
406 | void dma_issue_pending_all(void); | ||
407 | #define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y) | ||
408 | struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, void *fn_param); | ||
409 | void dma_release_channel(struct dma_chan *chan); | ||
483 | 410 | ||
484 | /* --- Helper iov-locking functions --- */ | 411 | /* --- Helper iov-locking functions --- */ |
485 | 412 | ||
diff --git a/include/linux/dmar.h b/include/linux/dmar.h index f1984fc3e06d..f28440784cf0 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h | |||
@@ -144,7 +144,6 @@ struct dmar_rmrr_unit { | |||
144 | list_for_each_entry(rmrr, &dmar_rmrr_units, list) | 144 | list_for_each_entry(rmrr, &dmar_rmrr_units, list) |
145 | /* Intel DMAR initialization functions */ | 145 | /* Intel DMAR initialization functions */ |
146 | extern int intel_iommu_init(void); | 146 | extern int intel_iommu_init(void); |
147 | extern int dmar_disabled; | ||
148 | #else | 147 | #else |
149 | static inline int intel_iommu_init(void) | 148 | static inline int intel_iommu_init(void) |
150 | { | 149 | { |
diff --git a/include/linux/dmi.h b/include/linux/dmi.h index 2bfda178f274..34161907b2f8 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h | |||
@@ -47,6 +47,7 @@ extern int dmi_name_in_vendors(const char *str); | |||
47 | extern int dmi_name_in_serial(const char *str); | 47 | extern int dmi_name_in_serial(const char *str); |
48 | extern int dmi_available; | 48 | extern int dmi_available; |
49 | extern int dmi_walk(void (*decode)(const struct dmi_header *)); | 49 | extern int dmi_walk(void (*decode)(const struct dmi_header *)); |
50 | extern bool dmi_match(enum dmi_field f, const char *str); | ||
50 | 51 | ||
51 | #else | 52 | #else |
52 | 53 | ||
@@ -61,6 +62,8 @@ static inline int dmi_name_in_serial(const char *s) { return 0; } | |||
61 | #define dmi_available 0 | 62 | #define dmi_available 0 |
62 | static inline int dmi_walk(void (*decode)(const struct dmi_header *)) | 63 | static inline int dmi_walk(void (*decode)(const struct dmi_header *)) |
63 | { return -1; } | 64 | { return -1; } |
65 | static inline bool dmi_match(enum dmi_field f, const char *str) | ||
66 | { return false; } | ||
64 | 67 | ||
65 | #endif | 68 | #endif |
66 | 69 | ||
diff --git a/include/linux/dqblk_qtree.h b/include/linux/dqblk_qtree.h new file mode 100644 index 000000000000..82a16527b367 --- /dev/null +++ b/include/linux/dqblk_qtree.h | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * Definitions of structures and functions for quota formats using trie | ||
3 | */ | ||
4 | |||
5 | #ifndef _LINUX_DQBLK_QTREE_H | ||
6 | #define _LINUX_DQBLK_QTREE_H | ||
7 | |||
8 | #include <linux/types.h> | ||
9 | |||
10 | /* Numbers of blocks needed for updates - we count with the smallest | ||
11 | * possible block size (1024) */ | ||
12 | #define QTREE_INIT_ALLOC 4 | ||
13 | #define QTREE_INIT_REWRITE 2 | ||
14 | #define QTREE_DEL_ALLOC 0 | ||
15 | #define QTREE_DEL_REWRITE 6 | ||
16 | |||
17 | struct dquot; | ||
18 | |||
19 | /* Operations */ | ||
20 | struct qtree_fmt_operations { | ||
21 | void (*mem2disk_dqblk)(void *disk, struct dquot *dquot); /* Convert given entry from in memory format to disk one */ | ||
22 | void (*disk2mem_dqblk)(struct dquot *dquot, void *disk); /* Convert given entry from disk format to in memory one */ | ||
23 | int (*is_id)(void *disk, struct dquot *dquot); /* Is this structure for given id? */ | ||
24 | }; | ||
25 | |||
26 | /* Inmemory copy of version specific information */ | ||
27 | struct qtree_mem_dqinfo { | ||
28 | struct super_block *dqi_sb; /* Sb quota is on */ | ||
29 | int dqi_type; /* Quota type */ | ||
30 | unsigned int dqi_blocks; /* # of blocks in quota file */ | ||
31 | unsigned int dqi_free_blk; /* First block in list of free blocks */ | ||
32 | unsigned int dqi_free_entry; /* First block with free entry */ | ||
33 | unsigned int dqi_blocksize_bits; /* Block size of quota file */ | ||
34 | unsigned int dqi_entry_size; /* Size of quota entry in quota file */ | ||
35 | unsigned int dqi_usable_bs; /* Space usable in block for quota data */ | ||
36 | unsigned int dqi_qtree_depth; /* Precomputed depth of quota tree */ | ||
37 | struct qtree_fmt_operations *dqi_ops; /* Operations for entry manipulation */ | ||
38 | }; | ||
39 | |||
40 | int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot); | ||
41 | int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot); | ||
42 | int qtree_delete_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot); | ||
43 | int qtree_release_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot); | ||
44 | int qtree_entry_unused(struct qtree_mem_dqinfo *info, char *disk); | ||
45 | static inline int qtree_depth(struct qtree_mem_dqinfo *info) | ||
46 | { | ||
47 | unsigned int epb = info->dqi_usable_bs >> 2; | ||
48 | unsigned long long entries = epb; | ||
49 | int i; | ||
50 | |||
51 | for (i = 1; entries < (1ULL << 32); i++) | ||
52 | entries *= epb; | ||
53 | return i; | ||
54 | } | ||
55 | |||
56 | #endif /* _LINUX_DQBLK_QTREE_H */ | ||
diff --git a/include/linux/dqblk_v1.h b/include/linux/dqblk_v1.h index 57f1250d5a52..3713a7232dd8 100644 --- a/include/linux/dqblk_v1.h +++ b/include/linux/dqblk_v1.h | |||
@@ -5,9 +5,6 @@ | |||
5 | #ifndef _LINUX_DQBLK_V1_H | 5 | #ifndef _LINUX_DQBLK_V1_H |
6 | #define _LINUX_DQBLK_V1_H | 6 | #define _LINUX_DQBLK_V1_H |
7 | 7 | ||
8 | /* Id of quota format */ | ||
9 | #define QFMT_VFS_OLD 1 | ||
10 | |||
11 | /* Root squash turned on */ | 8 | /* Root squash turned on */ |
12 | #define V1_DQF_RSQUASH 1 | 9 | #define V1_DQF_RSQUASH 1 |
13 | 10 | ||
@@ -17,8 +14,4 @@ | |||
17 | #define V1_DEL_ALLOC 0 | 14 | #define V1_DEL_ALLOC 0 |
18 | #define V1_DEL_REWRITE 2 | 15 | #define V1_DEL_REWRITE 2 |
19 | 16 | ||
20 | /* Special information about quotafile */ | ||
21 | struct v1_mem_dqinfo { | ||
22 | }; | ||
23 | |||
24 | #endif /* _LINUX_DQBLK_V1_H */ | 17 | #endif /* _LINUX_DQBLK_V1_H */ |
diff --git a/include/linux/dqblk_v2.h b/include/linux/dqblk_v2.h index 4f853322cb7f..18000a542677 100644 --- a/include/linux/dqblk_v2.h +++ b/include/linux/dqblk_v2.h | |||
@@ -1,26 +1,16 @@ | |||
1 | /* | 1 | /* |
2 | * Definitions of structures for vfsv0 quota format | 2 | * Definitions for vfsv0 quota format |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #ifndef _LINUX_DQBLK_V2_H | 5 | #ifndef _LINUX_DQBLK_V2_H |
6 | #define _LINUX_DQBLK_V2_H | 6 | #define _LINUX_DQBLK_V2_H |
7 | 7 | ||
8 | #include <linux/types.h> | 8 | #include <linux/dqblk_qtree.h> |
9 | |||
10 | /* id numbers of quota format */ | ||
11 | #define QFMT_VFS_V0 2 | ||
12 | 9 | ||
13 | /* Numbers of blocks needed for updates */ | 10 | /* Numbers of blocks needed for updates */ |
14 | #define V2_INIT_ALLOC 4 | 11 | #define V2_INIT_ALLOC QTREE_INIT_ALLOC |
15 | #define V2_INIT_REWRITE 2 | 12 | #define V2_INIT_REWRITE QTREE_INIT_REWRITE |
16 | #define V2_DEL_ALLOC 0 | 13 | #define V2_DEL_ALLOC QTREE_DEL_ALLOC |
17 | #define V2_DEL_REWRITE 6 | 14 | #define V2_DEL_REWRITE QTREE_DEL_REWRITE |
18 | |||
19 | /* Inmemory copy of version specific information */ | ||
20 | struct v2_mem_dqinfo { | ||
21 | unsigned int dqi_blocks; | ||
22 | unsigned int dqi_free_blk; | ||
23 | unsigned int dqi_free_entry; | ||
24 | }; | ||
25 | 15 | ||
26 | #endif /* _LINUX_DQBLK_V2_H */ | 16 | #endif /* _LINUX_DQBLK_V2_H */ |
diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h index 79a8ed8e6a7d..55026b1a40bd 100644 --- a/include/linux/dvb/frontend.h +++ b/include/linux/dvb/frontend.h | |||
@@ -62,10 +62,11 @@ typedef enum fe_caps { | |||
62 | FE_CAN_HIERARCHY_AUTO = 0x100000, | 62 | FE_CAN_HIERARCHY_AUTO = 0x100000, |
63 | FE_CAN_8VSB = 0x200000, | 63 | FE_CAN_8VSB = 0x200000, |
64 | FE_CAN_16VSB = 0x400000, | 64 | FE_CAN_16VSB = 0x400000, |
65 | FE_HAS_EXTENDED_CAPS = 0x800000, // We need more bitspace for newer APIs, indicate this. | 65 | FE_HAS_EXTENDED_CAPS = 0x800000, /* We need more bitspace for newer APIs, indicate this. */ |
66 | FE_NEEDS_BENDING = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending) | 66 | FE_CAN_2G_MODULATION = 0x10000000, /* frontend supports "2nd generation modulation" (DVB-S2) */ |
67 | FE_CAN_RECOVER = 0x40000000, // frontend can recover from a cable unplug automatically | 67 | FE_NEEDS_BENDING = 0x20000000, /* not supported anymore, don't use (frontend requires frequency bending) */ |
68 | FE_CAN_MUTE_TS = 0x80000000 // frontend can stop spurious TS data output | 68 | FE_CAN_RECOVER = 0x40000000, /* frontend can recover from a cable unplug automatically */ |
69 | FE_CAN_MUTE_TS = 0x80000000 /* frontend can stop spurious TS data output */ | ||
69 | } fe_caps_t; | 70 | } fe_caps_t; |
70 | 71 | ||
71 | 72 | ||
@@ -121,15 +122,15 @@ typedef enum fe_sec_mini_cmd { | |||
121 | 122 | ||
122 | 123 | ||
123 | typedef enum fe_status { | 124 | typedef enum fe_status { |
124 | FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ | 125 | FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ |
125 | FE_HAS_CARRIER = 0x02, /* found a DVB signal */ | 126 | FE_HAS_CARRIER = 0x02, /* found a DVB signal */ |
126 | FE_HAS_VITERBI = 0x04, /* FEC is stable */ | 127 | FE_HAS_VITERBI = 0x04, /* FEC is stable */ |
127 | FE_HAS_SYNC = 0x08, /* found sync bytes */ | 128 | FE_HAS_SYNC = 0x08, /* found sync bytes */ |
128 | FE_HAS_LOCK = 0x10, /* everything's working... */ | 129 | FE_HAS_LOCK = 0x10, /* everything's working... */ |
129 | FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ | 130 | FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ |
130 | FE_REINIT = 0x40 /* frontend was reinitialized, */ | 131 | FE_REINIT = 0x40 /* frontend was reinitialized, */ |
131 | } fe_status_t; /* application is recommended to reset */ | 132 | } fe_status_t; /* application is recommended to reset */ |
132 | /* DiSEqC, tone and parameters */ | 133 | /* DiSEqC, tone and parameters */ |
133 | 134 | ||
134 | typedef enum fe_spectral_inversion { | 135 | typedef enum fe_spectral_inversion { |
135 | INVERSION_OFF, | 136 | INVERSION_OFF, |
diff --git a/include/linux/dw_dmac.h b/include/linux/dw_dmac.h index 04d217b442bf..d797dde247f7 100644 --- a/include/linux/dw_dmac.h +++ b/include/linux/dw_dmac.h | |||
@@ -22,14 +22,34 @@ struct dw_dma_platform_data { | |||
22 | }; | 22 | }; |
23 | 23 | ||
24 | /** | 24 | /** |
25 | * enum dw_dma_slave_width - DMA slave register access width. | ||
26 | * @DMA_SLAVE_WIDTH_8BIT: Do 8-bit slave register accesses | ||
27 | * @DMA_SLAVE_WIDTH_16BIT: Do 16-bit slave register accesses | ||
28 | * @DMA_SLAVE_WIDTH_32BIT: Do 32-bit slave register accesses | ||
29 | */ | ||
30 | enum dw_dma_slave_width { | ||
31 | DW_DMA_SLAVE_WIDTH_8BIT, | ||
32 | DW_DMA_SLAVE_WIDTH_16BIT, | ||
33 | DW_DMA_SLAVE_WIDTH_32BIT, | ||
34 | }; | ||
35 | |||
36 | /** | ||
25 | * struct dw_dma_slave - Controller-specific information about a slave | 37 | * struct dw_dma_slave - Controller-specific information about a slave |
26 | * @slave: Generic information about the slave | 38 | * |
27 | * @ctl_lo: Platform-specific initializer for the CTL_LO register | 39 | * @dma_dev: required DMA master device |
40 | * @tx_reg: physical address of data register used for | ||
41 | * memory-to-peripheral transfers | ||
42 | * @rx_reg: physical address of data register used for | ||
43 | * peripheral-to-memory transfers | ||
44 | * @reg_width: peripheral register width | ||
28 | * @cfg_hi: Platform-specific initializer for the CFG_HI register | 45 | * @cfg_hi: Platform-specific initializer for the CFG_HI register |
29 | * @cfg_lo: Platform-specific initializer for the CFG_LO register | 46 | * @cfg_lo: Platform-specific initializer for the CFG_LO register |
30 | */ | 47 | */ |
31 | struct dw_dma_slave { | 48 | struct dw_dma_slave { |
32 | struct dma_slave slave; | 49 | struct device *dma_dev; |
50 | dma_addr_t tx_reg; | ||
51 | dma_addr_t rx_reg; | ||
52 | enum dw_dma_slave_width reg_width; | ||
33 | u32 cfg_hi; | 53 | u32 cfg_hi; |
34 | u32 cfg_lo; | 54 | u32 cfg_lo; |
35 | }; | 55 | }; |
@@ -54,9 +74,4 @@ struct dw_dma_slave { | |||
54 | #define DWC_CFGL_HS_DST_POL (1 << 18) /* dst handshake active low */ | 74 | #define DWC_CFGL_HS_DST_POL (1 << 18) /* dst handshake active low */ |
55 | #define DWC_CFGL_HS_SRC_POL (1 << 19) /* src handshake active low */ | 75 | #define DWC_CFGL_HS_SRC_POL (1 << 19) /* src handshake active low */ |
56 | 76 | ||
57 | static inline struct dw_dma_slave *to_dw_dma_slave(struct dma_slave *slave) | ||
58 | { | ||
59 | return container_of(slave, struct dw_dma_slave, slave); | ||
60 | } | ||
61 | |||
62 | #endif /* DW_DMAC_H */ | 77 | #endif /* DW_DMAC_H */ |
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 92f6f634e3e6..7a204256b155 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
@@ -28,7 +28,7 @@ typedef void (elevator_activate_req_fn) (struct request_queue *, struct request | |||
28 | typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct request *); | 28 | typedef void (elevator_deactivate_req_fn) (struct request_queue *, struct request *); |
29 | 29 | ||
30 | typedef void *(elevator_init_fn) (struct request_queue *); | 30 | typedef void *(elevator_init_fn) (struct request_queue *); |
31 | typedef void (elevator_exit_fn) (elevator_t *); | 31 | typedef void (elevator_exit_fn) (struct elevator_queue *); |
32 | 32 | ||
33 | struct elevator_ops | 33 | struct elevator_ops |
34 | { | 34 | { |
@@ -62,8 +62,8 @@ struct elevator_ops | |||
62 | 62 | ||
63 | struct elv_fs_entry { | 63 | struct elv_fs_entry { |
64 | struct attribute attr; | 64 | struct attribute attr; |
65 | ssize_t (*show)(elevator_t *, char *); | 65 | ssize_t (*show)(struct elevator_queue *, char *); |
66 | ssize_t (*store)(elevator_t *, const char *, size_t); | 66 | ssize_t (*store)(struct elevator_queue *, const char *, size_t); |
67 | }; | 67 | }; |
68 | 68 | ||
69 | /* | 69 | /* |
@@ -130,7 +130,7 @@ extern ssize_t elv_iosched_show(struct request_queue *, char *); | |||
130 | extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t); | 130 | extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t); |
131 | 131 | ||
132 | extern int elevator_init(struct request_queue *, char *); | 132 | extern int elevator_init(struct request_queue *, char *); |
133 | extern void elevator_exit(elevator_t *); | 133 | extern void elevator_exit(struct elevator_queue *); |
134 | extern int elv_rq_merge_ok(struct request *, struct bio *); | 134 | extern int elv_rq_merge_ok(struct request *, struct bio *); |
135 | 135 | ||
136 | /* | 136 | /* |
diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h index 78c775a83f7c..121720d74e15 100644 --- a/include/linux/ext2_fs.h +++ b/include/linux/ext2_fs.h | |||
@@ -194,6 +194,30 @@ struct ext2_group_desc | |||
194 | #define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */ | 194 | #define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */ |
195 | #define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */ | 195 | #define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */ |
196 | 196 | ||
197 | /* Flags that should be inherited by new inodes from their parent. */ | ||
198 | #define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\ | ||
199 | EXT2_SYNC_FL | EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |\ | ||
200 | EXT2_NODUMP_FL | EXT2_NOATIME_FL | EXT2_COMPRBLK_FL|\ | ||
201 | EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\ | ||
202 | EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL) | ||
203 | |||
204 | /* Flags that are appropriate for regular files (all but dir-specific ones). */ | ||
205 | #define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL)) | ||
206 | |||
207 | /* Flags that are appropriate for non-directories/regular files. */ | ||
208 | #define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL) | ||
209 | |||
210 | /* Mask out flags that are inappropriate for the given type of inode. */ | ||
211 | static inline __u32 ext2_mask_flags(umode_t mode, __u32 flags) | ||
212 | { | ||
213 | if (S_ISDIR(mode)) | ||
214 | return flags; | ||
215 | else if (S_ISREG(mode)) | ||
216 | return flags & EXT2_REG_FLMASK; | ||
217 | else | ||
218 | return flags & EXT2_OTHER_FLMASK; | ||
219 | } | ||
220 | |||
197 | /* | 221 | /* |
198 | * ioctl commands | 222 | * ioctl commands |
199 | */ | 223 | */ |
diff --git a/include/linux/ext2_fs_sb.h b/include/linux/ext2_fs_sb.h index f273415ab6f1..1cdb66367c98 100644 --- a/include/linux/ext2_fs_sb.h +++ b/include/linux/ext2_fs_sb.h | |||
@@ -101,11 +101,17 @@ struct ext2_sb_info { | |||
101 | struct percpu_counter s_freeblocks_counter; | 101 | struct percpu_counter s_freeblocks_counter; |
102 | struct percpu_counter s_freeinodes_counter; | 102 | struct percpu_counter s_freeinodes_counter; |
103 | struct percpu_counter s_dirs_counter; | 103 | struct percpu_counter s_dirs_counter; |
104 | struct blockgroup_lock s_blockgroup_lock; | 104 | struct blockgroup_lock *s_blockgroup_lock; |
105 | /* root of the per fs reservation window tree */ | 105 | /* root of the per fs reservation window tree */ |
106 | spinlock_t s_rsv_window_lock; | 106 | spinlock_t s_rsv_window_lock; |
107 | struct rb_root s_rsv_window_root; | 107 | struct rb_root s_rsv_window_root; |
108 | struct ext2_reserve_window_node s_rsv_window_head; | 108 | struct ext2_reserve_window_node s_rsv_window_head; |
109 | }; | 109 | }; |
110 | 110 | ||
111 | static inline spinlock_t * | ||
112 | sb_bgl_lock(struct ext2_sb_info *sbi, unsigned int block_group) | ||
113 | { | ||
114 | return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group); | ||
115 | } | ||
116 | |||
111 | #endif /* _LINUX_EXT2_FS_SB */ | 117 | #endif /* _LINUX_EXT2_FS_SB */ |
diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index d14f02918483..dd495b8c3091 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h | |||
@@ -178,6 +178,30 @@ struct ext3_group_desc | |||
178 | #define EXT3_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ | 178 | #define EXT3_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ |
179 | #define EXT3_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ | 179 | #define EXT3_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ |
180 | 180 | ||
181 | /* Flags that should be inherited by new inodes from their parent. */ | ||
182 | #define EXT3_FL_INHERITED (EXT3_SECRM_FL | EXT3_UNRM_FL | EXT3_COMPR_FL |\ | ||
183 | EXT3_SYNC_FL | EXT3_IMMUTABLE_FL | EXT3_APPEND_FL |\ | ||
184 | EXT3_NODUMP_FL | EXT3_NOATIME_FL | EXT3_COMPRBLK_FL|\ | ||
185 | EXT3_NOCOMPR_FL | EXT3_JOURNAL_DATA_FL |\ | ||
186 | EXT3_NOTAIL_FL | EXT3_DIRSYNC_FL) | ||
187 | |||
188 | /* Flags that are appropriate for regular files (all but dir-specific ones). */ | ||
189 | #define EXT3_REG_FLMASK (~(EXT3_DIRSYNC_FL | EXT3_TOPDIR_FL)) | ||
190 | |||
191 | /* Flags that are appropriate for non-directories/regular files. */ | ||
192 | #define EXT3_OTHER_FLMASK (EXT3_NODUMP_FL | EXT3_NOATIME_FL) | ||
193 | |||
194 | /* Mask out flags that are inappropriate for the given type of inode. */ | ||
195 | static inline __u32 ext3_mask_flags(umode_t mode, __u32 flags) | ||
196 | { | ||
197 | if (S_ISDIR(mode)) | ||
198 | return flags; | ||
199 | else if (S_ISREG(mode)) | ||
200 | return flags & EXT3_REG_FLMASK; | ||
201 | else | ||
202 | return flags & EXT3_OTHER_FLMASK; | ||
203 | } | ||
204 | |||
181 | /* | 205 | /* |
182 | * Inode dynamic state flags | 206 | * Inode dynamic state flags |
183 | */ | 207 | */ |
@@ -354,6 +378,13 @@ struct ext3_inode { | |||
354 | #define EXT3_ORPHAN_FS 0x0004 /* Orphans being recovered */ | 378 | #define EXT3_ORPHAN_FS 0x0004 /* Orphans being recovered */ |
355 | 379 | ||
356 | /* | 380 | /* |
381 | * Misc. filesystem flags | ||
382 | */ | ||
383 | #define EXT2_FLAGS_SIGNED_HASH 0x0001 /* Signed dirhash in use */ | ||
384 | #define EXT2_FLAGS_UNSIGNED_HASH 0x0002 /* Unsigned dirhash in use */ | ||
385 | #define EXT2_FLAGS_TEST_FILESYS 0x0004 /* to test development code */ | ||
386 | |||
387 | /* | ||
357 | * Mount flags | 388 | * Mount flags |
358 | */ | 389 | */ |
359 | #define EXT3_MOUNT_CHECK 0x00001 /* Do mount-time checks */ | 390 | #define EXT3_MOUNT_CHECK 0x00001 /* Do mount-time checks */ |
@@ -489,7 +520,23 @@ struct ext3_super_block { | |||
489 | __u16 s_reserved_word_pad; | 520 | __u16 s_reserved_word_pad; |
490 | __le32 s_default_mount_opts; | 521 | __le32 s_default_mount_opts; |
491 | __le32 s_first_meta_bg; /* First metablock block group */ | 522 | __le32 s_first_meta_bg; /* First metablock block group */ |
492 | __u32 s_reserved[190]; /* Padding to the end of the block */ | 523 | __le32 s_mkfs_time; /* When the filesystem was created */ |
524 | __le32 s_jnl_blocks[17]; /* Backup of the journal inode */ | ||
525 | /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */ | ||
526 | /*150*/ __le32 s_blocks_count_hi; /* Blocks count */ | ||
527 | __le32 s_r_blocks_count_hi; /* Reserved blocks count */ | ||
528 | __le32 s_free_blocks_count_hi; /* Free blocks count */ | ||
529 | __le16 s_min_extra_isize; /* All inodes have at least # bytes */ | ||
530 | __le16 s_want_extra_isize; /* New inodes should reserve # bytes */ | ||
531 | __le32 s_flags; /* Miscellaneous flags */ | ||
532 | __le16 s_raid_stride; /* RAID stride */ | ||
533 | __le16 s_mmp_interval; /* # seconds to wait in MMP checking */ | ||
534 | __le64 s_mmp_block; /* Block for multi-mount protection */ | ||
535 | __le32 s_raid_stripe_width; /* blocks on all data disks (N*stride)*/ | ||
536 | __u8 s_log_groups_per_flex; /* FLEX_BG group size */ | ||
537 | __u8 s_reserved_char_pad2; | ||
538 | __le16 s_reserved_pad; | ||
539 | __u32 s_reserved[162]; /* Padding to the end of the block */ | ||
493 | }; | 540 | }; |
494 | 541 | ||
495 | #ifdef __KERNEL__ | 542 | #ifdef __KERNEL__ |
@@ -694,6 +741,9 @@ static inline __le16 ext3_rec_len_to_disk(unsigned len) | |||
694 | #define DX_HASH_LEGACY 0 | 741 | #define DX_HASH_LEGACY 0 |
695 | #define DX_HASH_HALF_MD4 1 | 742 | #define DX_HASH_HALF_MD4 1 |
696 | #define DX_HASH_TEA 2 | 743 | #define DX_HASH_TEA 2 |
744 | #define DX_HASH_LEGACY_UNSIGNED 3 | ||
745 | #define DX_HASH_HALF_MD4_UNSIGNED 4 | ||
746 | #define DX_HASH_TEA_UNSIGNED 5 | ||
697 | 747 | ||
698 | #ifdef __KERNEL__ | 748 | #ifdef __KERNEL__ |
699 | 749 | ||
diff --git a/include/linux/ext3_fs_sb.h b/include/linux/ext3_fs_sb.h index b65f0288b842..f07f34de2f0e 100644 --- a/include/linux/ext3_fs_sb.h +++ b/include/linux/ext3_fs_sb.h | |||
@@ -57,10 +57,11 @@ struct ext3_sb_info { | |||
57 | u32 s_next_generation; | 57 | u32 s_next_generation; |
58 | u32 s_hash_seed[4]; | 58 | u32 s_hash_seed[4]; |
59 | int s_def_hash_version; | 59 | int s_def_hash_version; |
60 | int s_hash_unsigned; /* 3 if hash should be signed, 0 if not */ | ||
60 | struct percpu_counter s_freeblocks_counter; | 61 | struct percpu_counter s_freeblocks_counter; |
61 | struct percpu_counter s_freeinodes_counter; | 62 | struct percpu_counter s_freeinodes_counter; |
62 | struct percpu_counter s_dirs_counter; | 63 | struct percpu_counter s_dirs_counter; |
63 | struct blockgroup_lock s_blockgroup_lock; | 64 | struct blockgroup_lock *s_blockgroup_lock; |
64 | 65 | ||
65 | /* root of the per fs reservation window tree */ | 66 | /* root of the per fs reservation window tree */ |
66 | spinlock_t s_rsv_window_lock; | 67 | spinlock_t s_rsv_window_lock; |
@@ -83,4 +84,10 @@ struct ext3_sb_info { | |||
83 | #endif | 84 | #endif |
84 | }; | 85 | }; |
85 | 86 | ||
87 | static inline spinlock_t * | ||
88 | sb_bgl_lock(struct ext3_sb_info *sbi, unsigned int block_group) | ||
89 | { | ||
90 | return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group); | ||
91 | } | ||
92 | |||
86 | #endif /* _LINUX_EXT3_FS_SB */ | 93 | #endif /* _LINUX_EXT3_FS_SB */ |
diff --git a/include/linux/fault-inject.h b/include/linux/fault-inject.h index 32368c4f0326..06ca9b21dad2 100644 --- a/include/linux/fault-inject.h +++ b/include/linux/fault-inject.h | |||
@@ -81,4 +81,13 @@ static inline void cleanup_fault_attr_dentries(struct fault_attr *attr) | |||
81 | 81 | ||
82 | #endif /* CONFIG_FAULT_INJECTION */ | 82 | #endif /* CONFIG_FAULT_INJECTION */ |
83 | 83 | ||
84 | #ifdef CONFIG_FAILSLAB | ||
85 | extern bool should_failslab(size_t size, gfp_t gfpflags); | ||
86 | #else | ||
87 | static inline bool should_failslab(size_t size, gfp_t gfpflags) | ||
88 | { | ||
89 | return false; | ||
90 | } | ||
91 | #endif /* CONFIG_FAILSLAB */ | ||
92 | |||
84 | #endif /* _LINUX_FAULT_INJECT_H */ | 93 | #endif /* _LINUX_FAULT_INJECT_H */ |
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index 4aab6f12cfab..09d6c5bbdddd 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h | |||
@@ -57,8 +57,6 @@ struct files_struct { | |||
57 | 57 | ||
58 | #define files_fdtable(files) (rcu_dereference((files)->fdt)) | 58 | #define files_fdtable(files) (rcu_dereference((files)->fdt)) |
59 | 59 | ||
60 | extern struct kmem_cache *filp_cachep; | ||
61 | |||
62 | struct file_operations; | 60 | struct file_operations; |
63 | struct vfsmount; | 61 | struct vfsmount; |
64 | struct dentry; | 62 | struct dentry; |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 195a8cb2a749..6022f44043f2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -21,7 +21,6 @@ | |||
21 | 21 | ||
22 | /* Fixed constants first: */ | 22 | /* Fixed constants first: */ |
23 | #undef NR_OPEN | 23 | #undef NR_OPEN |
24 | extern int sysctl_nr_open; | ||
25 | #define INR_OPEN 1024 /* Initial setting for nfile rlimits */ | 24 | #define INR_OPEN 1024 /* Initial setting for nfile rlimits */ |
26 | 25 | ||
27 | #define BLOCK_SIZE_BITS 10 | 26 | #define BLOCK_SIZE_BITS 10 |
@@ -38,21 +37,13 @@ struct files_stat_struct { | |||
38 | int nr_free_files; /* read only */ | 37 | int nr_free_files; /* read only */ |
39 | int max_files; /* tunable */ | 38 | int max_files; /* tunable */ |
40 | }; | 39 | }; |
41 | extern struct files_stat_struct files_stat; | ||
42 | extern int get_max_files(void); | ||
43 | 40 | ||
44 | struct inodes_stat_t { | 41 | struct inodes_stat_t { |
45 | int nr_inodes; | 42 | int nr_inodes; |
46 | int nr_unused; | 43 | int nr_unused; |
47 | int dummy[5]; /* padding for sysctl ABI compatibility */ | 44 | int dummy[5]; /* padding for sysctl ABI compatibility */ |
48 | }; | 45 | }; |
49 | extern struct inodes_stat_t inodes_stat; | ||
50 | 46 | ||
51 | extern int leases_enable, lease_break_time; | ||
52 | |||
53 | #ifdef CONFIG_DNOTIFY | ||
54 | extern int dir_notify_enable; | ||
55 | #endif | ||
56 | 47 | ||
57 | #define NR_FILE 8192 /* this can well be larger on a larger system */ | 48 | #define NR_FILE 8192 /* this can well be larger on a larger system */ |
58 | 49 | ||
@@ -82,6 +73,14 @@ extern int dir_notify_enable; | |||
82 | (specialy hack for floppy.c) */ | 73 | (specialy hack for floppy.c) */ |
83 | #define FMODE_WRITE_IOCTL ((__force fmode_t)128) | 74 | #define FMODE_WRITE_IOCTL ((__force fmode_t)128) |
84 | 75 | ||
76 | /* | ||
77 | * Don't update ctime and mtime. | ||
78 | * | ||
79 | * Currently a special hack for the XFS open_by_handle ioctl, but we'll | ||
80 | * hopefully graduate it to a proper O_CMTIME flag supported by open(2) soon. | ||
81 | */ | ||
82 | #define FMODE_NOCMTIME ((__force fmode_t)2048) | ||
83 | |||
85 | #define RW_MASK 1 | 84 | #define RW_MASK 1 |
86 | #define RWA_MASK 2 | 85 | #define RWA_MASK 2 |
87 | #define READ 0 | 86 | #define READ 0 |
@@ -235,6 +234,8 @@ extern int dir_notify_enable; | |||
235 | #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ | 234 | #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ |
236 | #define FIBMAP _IO(0x00,1) /* bmap access */ | 235 | #define FIBMAP _IO(0x00,1) /* bmap access */ |
237 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ | 236 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ |
237 | #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ | ||
238 | #define FITHAW _IOWR('X', 120, int) /* Thaw */ | ||
238 | 239 | ||
239 | #define FS_IOC_GETFLAGS _IOR('f', 1, long) | 240 | #define FS_IOC_GETFLAGS _IOR('f', 1, long) |
240 | #define FS_IOC_SETFLAGS _IOW('f', 2, long) | 241 | #define FS_IOC_SETFLAGS _IOW('f', 2, long) |
@@ -322,6 +323,15 @@ extern void __init inode_init(void); | |||
322 | extern void __init inode_init_early(void); | 323 | extern void __init inode_init_early(void); |
323 | extern void __init files_init(unsigned long); | 324 | extern void __init files_init(unsigned long); |
324 | 325 | ||
326 | extern struct files_stat_struct files_stat; | ||
327 | extern int get_max_files(void); | ||
328 | extern int sysctl_nr_open; | ||
329 | extern struct inodes_stat_t inodes_stat; | ||
330 | extern int leases_enable, lease_break_time; | ||
331 | #ifdef CONFIG_DNOTIFY | ||
332 | extern int dir_notify_enable; | ||
333 | #endif | ||
334 | |||
325 | struct buffer_head; | 335 | struct buffer_head; |
326 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, | 336 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, |
327 | struct buffer_head *bh_result, int create); | 337 | struct buffer_head *bh_result, int create); |
@@ -415,6 +425,9 @@ enum positive_aop_returns { | |||
415 | 425 | ||
416 | #define AOP_FLAG_UNINTERRUPTIBLE 0x0001 /* will not do a short write */ | 426 | #define AOP_FLAG_UNINTERRUPTIBLE 0x0001 /* will not do a short write */ |
417 | #define AOP_FLAG_CONT_EXPAND 0x0002 /* called from cont_expand */ | 427 | #define AOP_FLAG_CONT_EXPAND 0x0002 /* called from cont_expand */ |
428 | #define AOP_FLAG_NOFS 0x0004 /* used by filesystem to direct | ||
429 | * helper code (eg buffer layer) | ||
430 | * to clear GFP_FS from alloc */ | ||
418 | 431 | ||
419 | /* | 432 | /* |
420 | * oh the beauties of C type declarations. | 433 | * oh the beauties of C type declarations. |
@@ -554,6 +567,7 @@ struct address_space { | |||
554 | struct block_device { | 567 | struct block_device { |
555 | dev_t bd_dev; /* not a kdev_t - it's a search key */ | 568 | dev_t bd_dev; /* not a kdev_t - it's a search key */ |
556 | struct inode * bd_inode; /* will die */ | 569 | struct inode * bd_inode; /* will die */ |
570 | struct super_block * bd_super; | ||
557 | int bd_openers; | 571 | int bd_openers; |
558 | struct mutex bd_mutex; /* open/close mutex */ | 572 | struct mutex bd_mutex; /* open/close mutex */ |
559 | struct semaphore bd_mount_sem; | 573 | struct semaphore bd_mount_sem; |
@@ -579,6 +593,11 @@ struct block_device { | |||
579 | * care to not mess up bd_private for that case. | 593 | * care to not mess up bd_private for that case. |
580 | */ | 594 | */ |
581 | unsigned long bd_private; | 595 | unsigned long bd_private; |
596 | |||
597 | /* The counter of freeze processes */ | ||
598 | int bd_fsfreeze_count; | ||
599 | /* Mutex for freeze */ | ||
600 | struct mutex bd_fsfreeze_mutex; | ||
582 | }; | 601 | }; |
583 | 602 | ||
584 | /* | 603 | /* |
@@ -1122,7 +1141,6 @@ struct super_block { | |||
1122 | struct rw_semaphore s_umount; | 1141 | struct rw_semaphore s_umount; |
1123 | struct mutex s_lock; | 1142 | struct mutex s_lock; |
1124 | int s_count; | 1143 | int s_count; |
1125 | int s_syncing; | ||
1126 | int s_need_sync_fs; | 1144 | int s_need_sync_fs; |
1127 | atomic_t s_active; | 1145 | atomic_t s_active; |
1128 | #ifdef CONFIG_SECURITY | 1146 | #ifdef CONFIG_SECURITY |
@@ -1174,6 +1192,11 @@ struct super_block { | |||
1174 | * generic_show_options() | 1192 | * generic_show_options() |
1175 | */ | 1193 | */ |
1176 | char *s_options; | 1194 | char *s_options; |
1195 | |||
1196 | /* | ||
1197 | * storage for asynchronous operations | ||
1198 | */ | ||
1199 | struct list_head s_async_list; | ||
1177 | }; | 1200 | }; |
1178 | 1201 | ||
1179 | extern struct timespec current_fs_time(struct super_block *sb); | 1202 | extern struct timespec current_fs_time(struct super_block *sb); |
@@ -1204,7 +1227,6 @@ extern void unlock_super(struct super_block *); | |||
1204 | /* | 1227 | /* |
1205 | * VFS helper functions.. | 1228 | * VFS helper functions.. |
1206 | */ | 1229 | */ |
1207 | extern int vfs_permission(struct nameidata *, int); | ||
1208 | extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *); | 1230 | extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *); |
1209 | extern int vfs_mkdir(struct inode *, struct dentry *, int); | 1231 | extern int vfs_mkdir(struct inode *, struct dentry *, int); |
1210 | extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t); | 1232 | extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t); |
@@ -1302,7 +1324,6 @@ struct file_operations { | |||
1302 | ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); | 1324 | ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); |
1303 | unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); | 1325 | unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); |
1304 | int (*check_flags)(int); | 1326 | int (*check_flags)(int); |
1305 | int (*dir_notify)(struct file *filp, unsigned long arg); | ||
1306 | int (*flock) (struct file *, int, struct file_lock *); | 1327 | int (*flock) (struct file *, int, struct file_lock *); |
1307 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); | 1328 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); |
1308 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); | 1329 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); |
@@ -1363,8 +1384,8 @@ struct super_operations { | |||
1363 | void (*put_super) (struct super_block *); | 1384 | void (*put_super) (struct super_block *); |
1364 | void (*write_super) (struct super_block *); | 1385 | void (*write_super) (struct super_block *); |
1365 | int (*sync_fs)(struct super_block *sb, int wait); | 1386 | int (*sync_fs)(struct super_block *sb, int wait); |
1366 | void (*write_super_lockfs) (struct super_block *); | 1387 | int (*freeze_fs) (struct super_block *); |
1367 | void (*unlockfs) (struct super_block *); | 1388 | int (*unfreeze_fs) (struct super_block *); |
1368 | int (*statfs) (struct dentry *, struct kstatfs *); | 1389 | int (*statfs) (struct dentry *, struct kstatfs *); |
1369 | int (*remount_fs) (struct super_block *, int *, char *); | 1390 | int (*remount_fs) (struct super_block *, int *, char *); |
1370 | void (*clear_inode) (struct inode *); | 1391 | void (*clear_inode) (struct inode *); |
@@ -1376,6 +1397,7 @@ struct super_operations { | |||
1376 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); | 1397 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); |
1377 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 1398 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
1378 | #endif | 1399 | #endif |
1400 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); | ||
1379 | }; | 1401 | }; |
1380 | 1402 | ||
1381 | /* | 1403 | /* |
@@ -1821,7 +1843,7 @@ extern int __filemap_fdatawrite_range(struct address_space *mapping, | |||
1821 | extern int filemap_fdatawrite_range(struct address_space *mapping, | 1843 | extern int filemap_fdatawrite_range(struct address_space *mapping, |
1822 | loff_t start, loff_t end); | 1844 | loff_t start, loff_t end); |
1823 | 1845 | ||
1824 | extern long do_fsync(struct file *file, int datasync); | 1846 | extern int vfs_fsync(struct file *file, struct dentry *dentry, int datasync); |
1825 | extern void sync_supers(void); | 1847 | extern void sync_supers(void); |
1826 | extern void sync_filesystems(int wait); | 1848 | extern void sync_filesystems(int wait); |
1827 | extern void __fsync_super(struct super_block *sb); | 1849 | extern void __fsync_super(struct super_block *sb); |
@@ -1861,7 +1883,7 @@ extern void free_write_pipe(struct file *); | |||
1861 | 1883 | ||
1862 | extern struct file *do_filp_open(int dfd, const char *pathname, | 1884 | extern struct file *do_filp_open(int dfd, const char *pathname, |
1863 | int open_flag, int mode); | 1885 | int open_flag, int mode); |
1864 | extern int may_open(struct nameidata *, int, int); | 1886 | extern int may_open(struct path *, int, int); |
1865 | 1887 | ||
1866 | extern int kernel_read(struct file *, unsigned long, char *, unsigned long); | 1888 | extern int kernel_read(struct file *, unsigned long, char *, unsigned long); |
1867 | extern struct file * open_exec(const char *); | 1889 | extern struct file * open_exec(const char *); |
@@ -1877,7 +1899,9 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int origin); | |||
1877 | 1899 | ||
1878 | extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); | 1900 | extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); |
1879 | 1901 | ||
1902 | extern struct inode * inode_init_always(struct super_block *, struct inode *); | ||
1880 | extern void inode_init_once(struct inode *); | 1903 | extern void inode_init_once(struct inode *); |
1904 | extern void inode_add_to_lists(struct super_block *, struct inode *); | ||
1881 | extern void iput(struct inode *); | 1905 | extern void iput(struct inode *); |
1882 | extern struct inode * igrab(struct inode *); | 1906 | extern struct inode * igrab(struct inode *); |
1883 | extern ino_t iunique(struct super_block *, ino_t); | 1907 | extern ino_t iunique(struct super_block *, ino_t); |
@@ -1894,6 +1918,8 @@ extern struct inode *ilookup(struct super_block *sb, unsigned long ino); | |||
1894 | 1918 | ||
1895 | extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); | 1919 | extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); |
1896 | extern struct inode * iget_locked(struct super_block *, unsigned long); | 1920 | extern struct inode * iget_locked(struct super_block *, unsigned long); |
1921 | extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); | ||
1922 | extern int insert_inode_locked(struct inode *); | ||
1897 | extern void unlock_new_inode(struct inode *); | 1923 | extern void unlock_new_inode(struct inode *); |
1898 | 1924 | ||
1899 | extern void __iget(struct inode * inode); | 1925 | extern void __iget(struct inode * inode); |
@@ -2025,7 +2051,7 @@ extern int page_readlink(struct dentry *, char __user *, int); | |||
2025 | extern void *page_follow_link_light(struct dentry *, struct nameidata *); | 2051 | extern void *page_follow_link_light(struct dentry *, struct nameidata *); |
2026 | extern void page_put_link(struct dentry *, struct nameidata *, void *); | 2052 | extern void page_put_link(struct dentry *, struct nameidata *, void *); |
2027 | extern int __page_symlink(struct inode *inode, const char *symname, int len, | 2053 | extern int __page_symlink(struct inode *inode, const char *symname, int len, |
2028 | gfp_t gfp_mask); | 2054 | int nofs); |
2029 | extern int page_symlink(struct inode *inode, const char *symname, int len); | 2055 | extern int page_symlink(struct inode *inode, const char *symname, int len); |
2030 | extern const struct inode_operations page_symlink_inode_operations; | 2056 | extern const struct inode_operations page_symlink_inode_operations; |
2031 | extern int generic_readlink(struct dentry *, char __user *, int); | 2057 | extern int generic_readlink(struct dentry *, char __user *, int); |
@@ -2046,6 +2072,9 @@ extern int vfs_fstat(unsigned int, struct kstat *); | |||
2046 | 2072 | ||
2047 | extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, | 2073 | extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, |
2048 | unsigned long arg); | 2074 | unsigned long arg); |
2075 | extern int __generic_block_fiemap(struct inode *inode, | ||
2076 | struct fiemap_extent_info *fieinfo, u64 start, | ||
2077 | u64 len, get_block_t *get_block); | ||
2049 | extern int generic_block_fiemap(struct inode *inode, | 2078 | extern int generic_block_fiemap(struct inode *inode, |
2050 | struct fiemap_extent_info *fieinfo, u64 start, | 2079 | struct fiemap_extent_info *fieinfo, u64 start, |
2051 | u64 len, get_block_t *get_block); | 2080 | u64 len, get_block_t *get_block); |
diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index 9e5a06e78d02..a97c053d3a9a 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h | |||
@@ -10,12 +10,6 @@ struct fs_struct { | |||
10 | struct path root, pwd; | 10 | struct path root, pwd; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | #define INIT_FS { \ | ||
14 | .count = ATOMIC_INIT(1), \ | ||
15 | .lock = RW_LOCK_UNLOCKED, \ | ||
16 | .umask = 0022, \ | ||
17 | } | ||
18 | |||
19 | extern struct kmem_cache *fs_cachep; | 13 | extern struct kmem_cache *fs_cachep; |
20 | 14 | ||
21 | extern void exit_fs(struct task_struct *); | 15 | extern void exit_fs(struct task_struct *); |
diff --git a/include/linux/fuse.h b/include/linux/fuse.h index 350fe9767bbc..162e5defe683 100644 --- a/include/linux/fuse.h +++ b/include/linux/fuse.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | FUSE: Filesystem in Userspace | 2 | FUSE: Filesystem in Userspace |
3 | Copyright (C) 2001-2006 Miklos Szeredi <miklos@szeredi.hu> | 3 | Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu> |
4 | 4 | ||
5 | This program can be distributed under the terms of the GNU GPL. | 5 | This program can be distributed under the terms of the GNU GPL. |
6 | See the file COPYING. | 6 | See the file COPYING. |
@@ -20,29 +20,27 @@ | |||
20 | * | 20 | * |
21 | * 7.10 | 21 | * 7.10 |
22 | * - add nonseekable open flag | 22 | * - add nonseekable open flag |
23 | * | ||
24 | * 7.11 | ||
25 | * - add IOCTL message | ||
26 | * - add unsolicited notification support | ||
27 | * - add POLL message and NOTIFY_POLL notification | ||
23 | */ | 28 | */ |
24 | 29 | ||
25 | #ifndef _LINUX_FUSE_H | 30 | #ifndef _LINUX_FUSE_H |
26 | #define _LINUX_FUSE_H | 31 | #define _LINUX_FUSE_H |
27 | 32 | ||
28 | #include <asm/types.h> | 33 | #include <linux/types.h> |
29 | #include <linux/major.h> | ||
30 | 34 | ||
31 | /** Version number of this interface */ | 35 | /** Version number of this interface */ |
32 | #define FUSE_KERNEL_VERSION 7 | 36 | #define FUSE_KERNEL_VERSION 7 |
33 | 37 | ||
34 | /** Minor version number of this interface */ | 38 | /** Minor version number of this interface */ |
35 | #define FUSE_KERNEL_MINOR_VERSION 10 | 39 | #define FUSE_KERNEL_MINOR_VERSION 11 |
36 | 40 | ||
37 | /** The node ID of the root inode */ | 41 | /** The node ID of the root inode */ |
38 | #define FUSE_ROOT_ID 1 | 42 | #define FUSE_ROOT_ID 1 |
39 | 43 | ||
40 | /** The major number of the fuse character device */ | ||
41 | #define FUSE_MAJOR MISC_MAJOR | ||
42 | |||
43 | /** The minor number of the fuse character device */ | ||
44 | #define FUSE_MINOR 229 | ||
45 | |||
46 | /* Make sure all structures are padded to 64bit boundary, so 32bit | 44 | /* Make sure all structures are padded to 64bit boundary, so 32bit |
47 | userspace works under 64bit kernels */ | 45 | userspace works under 64bit kernels */ |
48 | 46 | ||
@@ -151,6 +149,28 @@ struct fuse_file_lock { | |||
151 | */ | 149 | */ |
152 | #define FUSE_READ_LOCKOWNER (1 << 1) | 150 | #define FUSE_READ_LOCKOWNER (1 << 1) |
153 | 151 | ||
152 | /** | ||
153 | * Ioctl flags | ||
154 | * | ||
155 | * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine | ||
156 | * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed | ||
157 | * FUSE_IOCTL_RETRY: retry with new iovecs | ||
158 | * | ||
159 | * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs | ||
160 | */ | ||
161 | #define FUSE_IOCTL_COMPAT (1 << 0) | ||
162 | #define FUSE_IOCTL_UNRESTRICTED (1 << 1) | ||
163 | #define FUSE_IOCTL_RETRY (1 << 2) | ||
164 | |||
165 | #define FUSE_IOCTL_MAX_IOV 256 | ||
166 | |||
167 | /** | ||
168 | * Poll flags | ||
169 | * | ||
170 | * FUSE_POLL_SCHEDULE_NOTIFY: request poll notify | ||
171 | */ | ||
172 | #define FUSE_POLL_SCHEDULE_NOTIFY (1 << 0) | ||
173 | |||
154 | enum fuse_opcode { | 174 | enum fuse_opcode { |
155 | FUSE_LOOKUP = 1, | 175 | FUSE_LOOKUP = 1, |
156 | FUSE_FORGET = 2, /* no reply */ | 176 | FUSE_FORGET = 2, /* no reply */ |
@@ -188,6 +208,13 @@ enum fuse_opcode { | |||
188 | FUSE_INTERRUPT = 36, | 208 | FUSE_INTERRUPT = 36, |
189 | FUSE_BMAP = 37, | 209 | FUSE_BMAP = 37, |
190 | FUSE_DESTROY = 38, | 210 | FUSE_DESTROY = 38, |
211 | FUSE_IOCTL = 39, | ||
212 | FUSE_POLL = 40, | ||
213 | }; | ||
214 | |||
215 | enum fuse_notify_code { | ||
216 | FUSE_NOTIFY_POLL = 1, | ||
217 | FUSE_NOTIFY_CODE_MAX, | ||
191 | }; | 218 | }; |
192 | 219 | ||
193 | /* The read buffer is required to be at least 8k, but may be much larger */ | 220 | /* The read buffer is required to be at least 8k, but may be much larger */ |
@@ -388,6 +415,38 @@ struct fuse_bmap_out { | |||
388 | __u64 block; | 415 | __u64 block; |
389 | }; | 416 | }; |
390 | 417 | ||
418 | struct fuse_ioctl_in { | ||
419 | __u64 fh; | ||
420 | __u32 flags; | ||
421 | __u32 cmd; | ||
422 | __u64 arg; | ||
423 | __u32 in_size; | ||
424 | __u32 out_size; | ||
425 | }; | ||
426 | |||
427 | struct fuse_ioctl_out { | ||
428 | __s32 result; | ||
429 | __u32 flags; | ||
430 | __u32 in_iovs; | ||
431 | __u32 out_iovs; | ||
432 | }; | ||
433 | |||
434 | struct fuse_poll_in { | ||
435 | __u64 fh; | ||
436 | __u64 kh; | ||
437 | __u32 flags; | ||
438 | __u32 padding; | ||
439 | }; | ||
440 | |||
441 | struct fuse_poll_out { | ||
442 | __u32 revents; | ||
443 | __u32 padding; | ||
444 | }; | ||
445 | |||
446 | struct fuse_notify_poll_wakeup_out { | ||
447 | __u64 kh; | ||
448 | }; | ||
449 | |||
391 | struct fuse_in_header { | 450 | struct fuse_in_header { |
392 | __u32 len; | 451 | __u32 len; |
393 | __u32 opcode; | 452 | __u32 opcode; |
diff --git a/include/linux/futex.h b/include/linux/futex.h index 586ab56a3ec3..3bf5bb5a34f9 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h | |||
@@ -25,7 +25,8 @@ union ktime; | |||
25 | #define FUTEX_WAKE_BITSET 10 | 25 | #define FUTEX_WAKE_BITSET 10 |
26 | 26 | ||
27 | #define FUTEX_PRIVATE_FLAG 128 | 27 | #define FUTEX_PRIVATE_FLAG 128 |
28 | #define FUTEX_CMD_MASK ~FUTEX_PRIVATE_FLAG | 28 | #define FUTEX_CLOCK_REALTIME 256 |
29 | #define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME) | ||
29 | 30 | ||
30 | #define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) | 31 | #define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) |
31 | #define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) | 32 | #define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) |
@@ -164,6 +165,8 @@ union futex_key { | |||
164 | } both; | 165 | } both; |
165 | }; | 166 | }; |
166 | 167 | ||
168 | #define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = NULL } } | ||
169 | |||
167 | #ifdef CONFIG_FUTEX | 170 | #ifdef CONFIG_FUTEX |
168 | extern void exit_robust_list(struct task_struct *curr); | 171 | extern void exit_robust_list(struct task_struct *curr); |
169 | extern void exit_pi_state_list(struct task_struct *curr); | 172 | extern void exit_pi_state_list(struct task_struct *curr); |
diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h index 4cc913939817..fadff28505bb 100644 --- a/include/linux/generic_serial.h +++ b/include/linux/generic_serial.h | |||
@@ -21,7 +21,6 @@ struct real_driver { | |||
21 | void (*enable_tx_interrupts) (void *); | 21 | void (*enable_tx_interrupts) (void *); |
22 | void (*disable_rx_interrupts) (void *); | 22 | void (*disable_rx_interrupts) (void *); |
23 | void (*enable_rx_interrupts) (void *); | 23 | void (*enable_rx_interrupts) (void *); |
24 | int (*get_CD) (void *); | ||
25 | void (*shutdown_port) (void*); | 24 | void (*shutdown_port) (void*); |
26 | int (*set_real_termios) (void*); | 25 | int (*set_real_termios) (void*); |
27 | int (*chars_in_buffer) (void*); | 26 | int (*chars_in_buffer) (void*); |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 3df7742ce246..16948eaecae3 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -126,6 +126,7 @@ struct blk_scsi_cmd_filter { | |||
126 | struct disk_part_tbl { | 126 | struct disk_part_tbl { |
127 | struct rcu_head rcu_head; | 127 | struct rcu_head rcu_head; |
128 | int len; | 128 | int len; |
129 | struct hd_struct *last_lookup; | ||
129 | struct hd_struct *part[]; | 130 | struct hd_struct *part[]; |
130 | }; | 131 | }; |
131 | 132 | ||
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index e8003afeffba..dd20cd78faa8 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
@@ -69,12 +69,6 @@ struct vm_area_struct; | |||
69 | #define GFP_HIGHUSER_MOVABLE (__GFP_WAIT | __GFP_IO | __GFP_FS | \ | 69 | #define GFP_HIGHUSER_MOVABLE (__GFP_WAIT | __GFP_IO | __GFP_FS | \ |
70 | __GFP_HARDWALL | __GFP_HIGHMEM | \ | 70 | __GFP_HARDWALL | __GFP_HIGHMEM | \ |
71 | __GFP_MOVABLE) | 71 | __GFP_MOVABLE) |
72 | #define GFP_NOFS_PAGECACHE (__GFP_WAIT | __GFP_IO | __GFP_MOVABLE) | ||
73 | #define GFP_USER_PAGECACHE (__GFP_WAIT | __GFP_IO | __GFP_FS | \ | ||
74 | __GFP_HARDWALL | __GFP_MOVABLE) | ||
75 | #define GFP_HIGHUSER_PAGECACHE (__GFP_WAIT | __GFP_IO | __GFP_FS | \ | ||
76 | __GFP_HARDWALL | __GFP_HIGHMEM | \ | ||
77 | __GFP_MOVABLE) | ||
78 | 72 | ||
79 | #ifdef CONFIG_NUMA | 73 | #ifdef CONFIG_NUMA |
80 | #define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) | 74 | #define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) |
diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h index ec6ecd74781d..1289fa7623ca 100644 --- a/include/linux/gpio_keys.h +++ b/include/linux/gpio_keys.h | |||
@@ -15,6 +15,7 @@ struct gpio_keys_button { | |||
15 | struct gpio_keys_platform_data { | 15 | struct gpio_keys_platform_data { |
16 | struct gpio_keys_button *buttons; | 16 | struct gpio_keys_button *buttons; |
17 | int nbuttons; | 17 | int nbuttons; |
18 | unsigned int rep:1; /* enable input subsystem auto repeat */ | ||
18 | }; | 19 | }; |
19 | 20 | ||
20 | #endif | 21 | #endif |
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 89a56d79e4c6..f83288347dda 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h | |||
@@ -119,13 +119,17 @@ static inline void account_system_vtime(struct task_struct *tsk) | |||
119 | } | 119 | } |
120 | #endif | 120 | #endif |
121 | 121 | ||
122 | #if defined(CONFIG_PREEMPT_RCU) && defined(CONFIG_NO_HZ) | 122 | #if defined(CONFIG_NO_HZ) && !defined(CONFIG_CLASSIC_RCU) |
123 | extern void rcu_irq_enter(void); | 123 | extern void rcu_irq_enter(void); |
124 | extern void rcu_irq_exit(void); | 124 | extern void rcu_irq_exit(void); |
125 | extern void rcu_nmi_enter(void); | ||
126 | extern void rcu_nmi_exit(void); | ||
125 | #else | 127 | #else |
126 | # define rcu_irq_enter() do { } while (0) | 128 | # define rcu_irq_enter() do { } while (0) |
127 | # define rcu_irq_exit() do { } while (0) | 129 | # define rcu_irq_exit() do { } while (0) |
128 | #endif /* CONFIG_PREEMPT_RCU */ | 130 | # define rcu_nmi_enter() do { } while (0) |
131 | # define rcu_nmi_exit() do { } while (0) | ||
132 | #endif /* #if defined(CONFIG_NO_HZ) && !defined(CONFIG_CLASSIC_RCU) */ | ||
129 | 133 | ||
130 | /* | 134 | /* |
131 | * It is safe to do non-atomic ops on ->hardirq_context, | 135 | * It is safe to do non-atomic ops on ->hardirq_context, |
@@ -135,7 +139,6 @@ extern void rcu_irq_exit(void); | |||
135 | */ | 139 | */ |
136 | #define __irq_enter() \ | 140 | #define __irq_enter() \ |
137 | do { \ | 141 | do { \ |
138 | rcu_irq_enter(); \ | ||
139 | account_system_vtime(current); \ | 142 | account_system_vtime(current); \ |
140 | add_preempt_count(HARDIRQ_OFFSET); \ | 143 | add_preempt_count(HARDIRQ_OFFSET); \ |
141 | trace_hardirq_enter(); \ | 144 | trace_hardirq_enter(); \ |
@@ -154,7 +157,6 @@ extern void irq_enter(void); | |||
154 | trace_hardirq_exit(); \ | 157 | trace_hardirq_exit(); \ |
155 | account_system_vtime(current); \ | 158 | account_system_vtime(current); \ |
156 | sub_preempt_count(HARDIRQ_OFFSET); \ | 159 | sub_preempt_count(HARDIRQ_OFFSET); \ |
157 | rcu_irq_exit(); \ | ||
158 | } while (0) | 160 | } while (0) |
159 | 161 | ||
160 | /* | 162 | /* |
@@ -166,11 +168,14 @@ extern void irq_exit(void); | |||
166 | do { \ | 168 | do { \ |
167 | ftrace_nmi_enter(); \ | 169 | ftrace_nmi_enter(); \ |
168 | lockdep_off(); \ | 170 | lockdep_off(); \ |
171 | rcu_nmi_enter(); \ | ||
169 | __irq_enter(); \ | 172 | __irq_enter(); \ |
170 | } while (0) | 173 | } while (0) |
174 | |||
171 | #define nmi_exit() \ | 175 | #define nmi_exit() \ |
172 | do { \ | 176 | do { \ |
173 | __irq_exit(); \ | 177 | __irq_exit(); \ |
178 | rcu_nmi_exit(); \ | ||
174 | lockdep_on(); \ | 179 | lockdep_on(); \ |
175 | ftrace_nmi_exit(); \ | 180 | ftrace_nmi_exit(); \ |
176 | } while (0) | 181 | } while (0) |
diff --git a/include/linux/hid.h b/include/linux/hid.h index e5780f8c934a..81aa84d60c6b 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -403,15 +403,6 @@ struct hid_output_fifo { | |||
403 | #define HID_STAT_ADDED 1 | 403 | #define HID_STAT_ADDED 1 |
404 | #define HID_STAT_PARSED 2 | 404 | #define HID_STAT_PARSED 2 |
405 | 405 | ||
406 | #define HID_CTRL_RUNNING 1 | ||
407 | #define HID_OUT_RUNNING 2 | ||
408 | #define HID_IN_RUNNING 3 | ||
409 | #define HID_RESET_PENDING 4 | ||
410 | #define HID_SUSPENDED 5 | ||
411 | #define HID_CLEAR_HALT 6 | ||
412 | #define HID_DISCONNECTED 7 | ||
413 | #define HID_STARTED 8 | ||
414 | |||
415 | struct hid_input { | 406 | struct hid_input { |
416 | struct list_head list; | 407 | struct list_head list; |
417 | struct hid_report *report; | 408 | struct hid_report *report; |
@@ -540,6 +531,8 @@ struct hid_usage_id { | |||
540 | * @name: driver name (e.g. "Footech_bar-wheel") | 531 | * @name: driver name (e.g. "Footech_bar-wheel") |
541 | * @id_table: which devices is this driver for (must be non-NULL for probe | 532 | * @id_table: which devices is this driver for (must be non-NULL for probe |
542 | * to be called) | 533 | * to be called) |
534 | * @dyn_list: list of dynamically added device ids | ||
535 | * @dyn_lock: lock protecting @dyn_list | ||
543 | * @probe: new device inserted | 536 | * @probe: new device inserted |
544 | * @remove: device removed (NULL if not a hot-plug capable driver) | 537 | * @remove: device removed (NULL if not a hot-plug capable driver) |
545 | * @report_table: on which reports to call raw_event (NULL means all) | 538 | * @report_table: on which reports to call raw_event (NULL means all) |
@@ -567,6 +560,9 @@ struct hid_driver { | |||
567 | char *name; | 560 | char *name; |
568 | const struct hid_device_id *id_table; | 561 | const struct hid_device_id *id_table; |
569 | 562 | ||
563 | struct list_head dyn_list; | ||
564 | spinlock_t dyn_lock; | ||
565 | |||
570 | int (*probe)(struct hid_device *dev, const struct hid_device_id *id); | 566 | int (*probe)(struct hid_device *dev, const struct hid_device_id *id); |
571 | void (*remove)(struct hid_device *dev); | 567 | void (*remove)(struct hid_device *dev); |
572 | 568 | ||
@@ -797,6 +793,8 @@ dbg_hid(const char *fmt, ...) | |||
797 | 793 | ||
798 | #ifdef CONFIG_HID_COMPAT | 794 | #ifdef CONFIG_HID_COMPAT |
799 | #define HID_COMPAT_LOAD_DRIVER(name) \ | 795 | #define HID_COMPAT_LOAD_DRIVER(name) \ |
796 | /* prototype to avoid sparse warning */ \ | ||
797 | extern void hid_compat_##name(void); \ | ||
800 | void hid_compat_##name(void) { } \ | 798 | void hid_compat_##name(void) { } \ |
801 | EXPORT_SYMBOL(hid_compat_##name) | 799 | EXPORT_SYMBOL(hid_compat_##name) |
802 | #else | 800 | #else |
diff --git a/include/linux/hidraw.h b/include/linux/hidraw.h index dbb5c8c374f0..dd8d69269176 100644 --- a/include/linux/hidraw.h +++ b/include/linux/hidraw.h | |||
@@ -33,6 +33,8 @@ struct hidraw_devinfo { | |||
33 | #define HIDIOCGRDESCSIZE _IOR('H', 0x01, int) | 33 | #define HIDIOCGRDESCSIZE _IOR('H', 0x01, int) |
34 | #define HIDIOCGRDESC _IOR('H', 0x02, struct hidraw_report_descriptor) | 34 | #define HIDIOCGRDESC _IOR('H', 0x02, struct hidraw_report_descriptor) |
35 | #define HIDIOCGRAWINFO _IOR('H', 0x03, struct hidraw_devinfo) | 35 | #define HIDIOCGRAWINFO _IOR('H', 0x03, struct hidraw_devinfo) |
36 | #define HIDIOCGRAWNAME(len) _IOC(_IOC_READ, 'H', 0x04, len) | ||
37 | #define HIDIOCGRAWPHYS(len) _IOC(_IOC_READ, 'H', 0x05, len) | ||
36 | 38 | ||
37 | #define HIDRAW_FIRST_MINOR 0 | 39 | #define HIDRAW_FIRST_MINOR 0 |
38 | #define HIDRAW_MAX_DEVICES 64 | 40 | #define HIDRAW_MAX_DEVICES 64 |
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 3eba43878dcb..bd37078c2d7d 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
@@ -43,26 +43,6 @@ enum hrtimer_restart { | |||
43 | }; | 43 | }; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * hrtimer callback modes: | ||
47 | * | ||
48 | * HRTIMER_CB_SOFTIRQ: Callback must run in softirq context | ||
49 | * HRTIMER_CB_IRQSAFE_PERCPU: Callback must run in hardirq context | ||
50 | * Special mode for tick emulation and | ||
51 | * scheduler timer. Such timers are per | ||
52 | * cpu and not allowed to be migrated on | ||
53 | * cpu unplug. | ||
54 | * HRTIMER_CB_IRQSAFE_UNLOCKED: Callback should run in hardirq context | ||
55 | * with timer->base lock unlocked | ||
56 | * used for timers which call wakeup to | ||
57 | * avoid lock order problems with rq->lock | ||
58 | */ | ||
59 | enum hrtimer_cb_mode { | ||
60 | HRTIMER_CB_SOFTIRQ, | ||
61 | HRTIMER_CB_IRQSAFE_PERCPU, | ||
62 | HRTIMER_CB_IRQSAFE_UNLOCKED, | ||
63 | }; | ||
64 | |||
65 | /* | ||
66 | * Values to track state of the timer | 46 | * Values to track state of the timer |
67 | * | 47 | * |
68 | * Possible states: | 48 | * Possible states: |
@@ -70,7 +50,6 @@ enum hrtimer_cb_mode { | |||
70 | * 0x00 inactive | 50 | * 0x00 inactive |
71 | * 0x01 enqueued into rbtree | 51 | * 0x01 enqueued into rbtree |
72 | * 0x02 callback function running | 52 | * 0x02 callback function running |
73 | * 0x04 callback pending (high resolution mode) | ||
74 | * | 53 | * |
75 | * Special cases: | 54 | * Special cases: |
76 | * 0x03 callback function running and enqueued | 55 | * 0x03 callback function running and enqueued |
@@ -92,8 +71,7 @@ enum hrtimer_cb_mode { | |||
92 | #define HRTIMER_STATE_INACTIVE 0x00 | 71 | #define HRTIMER_STATE_INACTIVE 0x00 |
93 | #define HRTIMER_STATE_ENQUEUED 0x01 | 72 | #define HRTIMER_STATE_ENQUEUED 0x01 |
94 | #define HRTIMER_STATE_CALLBACK 0x02 | 73 | #define HRTIMER_STATE_CALLBACK 0x02 |
95 | #define HRTIMER_STATE_PENDING 0x04 | 74 | #define HRTIMER_STATE_MIGRATE 0x04 |
96 | #define HRTIMER_STATE_MIGRATE 0x08 | ||
97 | 75 | ||
98 | /** | 76 | /** |
99 | * struct hrtimer - the basic hrtimer structure | 77 | * struct hrtimer - the basic hrtimer structure |
@@ -109,8 +87,6 @@ enum hrtimer_cb_mode { | |||
109 | * @function: timer expiry callback function | 87 | * @function: timer expiry callback function |
110 | * @base: pointer to the timer base (per cpu and per clock) | 88 | * @base: pointer to the timer base (per cpu and per clock) |
111 | * @state: state information (See bit values above) | 89 | * @state: state information (See bit values above) |
112 | * @cb_mode: high resolution timer feature to select the callback execution | ||
113 | * mode | ||
114 | * @cb_entry: list head to enqueue an expired timer into the callback list | 90 | * @cb_entry: list head to enqueue an expired timer into the callback list |
115 | * @start_site: timer statistics field to store the site where the timer | 91 | * @start_site: timer statistics field to store the site where the timer |
116 | * was started | 92 | * was started |
@@ -129,7 +105,6 @@ struct hrtimer { | |||
129 | struct hrtimer_clock_base *base; | 105 | struct hrtimer_clock_base *base; |
130 | unsigned long state; | 106 | unsigned long state; |
131 | struct list_head cb_entry; | 107 | struct list_head cb_entry; |
132 | enum hrtimer_cb_mode cb_mode; | ||
133 | #ifdef CONFIG_TIMER_STATS | 108 | #ifdef CONFIG_TIMER_STATS |
134 | int start_pid; | 109 | int start_pid; |
135 | void *start_site; | 110 | void *start_site; |
@@ -188,15 +163,11 @@ struct hrtimer_clock_base { | |||
188 | * @check_clocks: Indictator, when set evaluate time source and clock | 163 | * @check_clocks: Indictator, when set evaluate time source and clock |
189 | * event devices whether high resolution mode can be | 164 | * event devices whether high resolution mode can be |
190 | * activated. | 165 | * activated. |
191 | * @cb_pending: Expired timers are moved from the rbtree to this | ||
192 | * list in the timer interrupt. The list is processed | ||
193 | * in the softirq. | ||
194 | * @nr_events: Total number of timer interrupt events | 166 | * @nr_events: Total number of timer interrupt events |
195 | */ | 167 | */ |
196 | struct hrtimer_cpu_base { | 168 | struct hrtimer_cpu_base { |
197 | spinlock_t lock; | 169 | spinlock_t lock; |
198 | struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; | 170 | struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; |
199 | struct list_head cb_pending; | ||
200 | #ifdef CONFIG_HIGH_RES_TIMERS | 171 | #ifdef CONFIG_HIGH_RES_TIMERS |
201 | ktime_t expires_next; | 172 | ktime_t expires_next; |
202 | int hres_active; | 173 | int hres_active; |
@@ -404,8 +375,7 @@ static inline int hrtimer_active(const struct hrtimer *timer) | |||
404 | */ | 375 | */ |
405 | static inline int hrtimer_is_queued(struct hrtimer *timer) | 376 | static inline int hrtimer_is_queued(struct hrtimer *timer) |
406 | { | 377 | { |
407 | return timer->state & | 378 | return timer->state & HRTIMER_STATE_ENQUEUED; |
408 | (HRTIMER_STATE_ENQUEUED | HRTIMER_STATE_PENDING); | ||
409 | } | 379 | } |
410 | 380 | ||
411 | /* | 381 | /* |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index e1c8afc002c0..f1d2fba19ea0 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -233,6 +233,10 @@ static inline unsigned long huge_page_size(struct hstate *h) | |||
233 | return (unsigned long)PAGE_SIZE << h->order; | 233 | return (unsigned long)PAGE_SIZE << h->order; |
234 | } | 234 | } |
235 | 235 | ||
236 | extern unsigned long vma_kernel_pagesize(struct vm_area_struct *vma); | ||
237 | |||
238 | extern unsigned long vma_mmu_pagesize(struct vm_area_struct *vma); | ||
239 | |||
236 | static inline unsigned long huge_page_mask(struct hstate *h) | 240 | static inline unsigned long huge_page_mask(struct hstate *h) |
237 | { | 241 | { |
238 | return h->mask; | 242 | return h->mask; |
@@ -273,6 +277,8 @@ struct hstate {}; | |||
273 | #define hstate_inode(i) NULL | 277 | #define hstate_inode(i) NULL |
274 | #define huge_page_size(h) PAGE_SIZE | 278 | #define huge_page_size(h) PAGE_SIZE |
275 | #define huge_page_mask(h) PAGE_MASK | 279 | #define huge_page_mask(h) PAGE_MASK |
280 | #define vma_kernel_pagesize(v) PAGE_SIZE | ||
281 | #define vma_mmu_pagesize(v) PAGE_SIZE | ||
276 | #define huge_page_order(h) 0 | 282 | #define huge_page_order(h) 0 |
277 | #define huge_page_shift(h) PAGE_SHIFT | 283 | #define huge_page_shift(h) PAGE_SHIFT |
278 | static inline unsigned int pages_per_huge_page(struct hstate *h) | 284 | static inline unsigned int pages_per_huge_page(struct hstate *h) |
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 33a5992d4936..20873d402467 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -393,11 +393,7 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data) | |||
393 | #define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */ | 393 | #define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */ |
394 | #define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */ | 394 | #define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */ |
395 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ | 395 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ |
396 | #define I2C_CLASS_CAM_ANALOG (1<<4) /* camera with analog CCD */ | ||
397 | #define I2C_CLASS_CAM_DIGITAL (1<<5) /* most webcams */ | ||
398 | #define I2C_CLASS_SOUND (1<<6) /* sound devices */ | ||
399 | #define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */ | 396 | #define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */ |
400 | #define I2C_CLASS_ALL (UINT_MAX) /* all of the above */ | ||
401 | 397 | ||
402 | /* i2c_client_address_data is the struct for holding default client | 398 | /* i2c_client_address_data is the struct for holding default client |
403 | * addresses for a driver and for the parameters supplied on the | 399 | * addresses for a driver and for the parameters supplied on the |
diff --git a/include/linux/i2c/dm355evm_msp.h b/include/linux/i2c/dm355evm_msp.h new file mode 100644 index 000000000000..372470350fab --- /dev/null +++ b/include/linux/i2c/dm355evm_msp.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * dm355evm_msp.h - support MSP430 microcontroller on DM355EVM board | ||
3 | */ | ||
4 | #ifndef __LINUX_I2C_DM355EVM_MSP | ||
5 | #define __LINUX_I2C_DM355EVM_MSP | ||
6 | |||
7 | /* | ||
8 | * Written against Spectrum's writeup for the A4 firmware revision, | ||
9 | * and tweaked to match source and rev D2 schematics by removing CPLD | ||
10 | * and NOR flash hooks (which were last appropriate in rev B boards). | ||
11 | * | ||
12 | * Note that the firmware supports a flavor of write posting ... to be | ||
13 | * sure a write completes, issue another read or write. | ||
14 | */ | ||
15 | |||
16 | /* utilities to access "registers" emulated by msp430 firmware */ | ||
17 | extern int dm355evm_msp_write(u8 value, u8 reg); | ||
18 | extern int dm355evm_msp_read(u8 reg); | ||
19 | |||
20 | |||
21 | /* command/control registers */ | ||
22 | #define DM355EVM_MSP_COMMAND 0x00 | ||
23 | # define MSP_COMMAND_NULL 0 | ||
24 | # define MSP_COMMAND_RESET_COLD 1 | ||
25 | # define MSP_COMMAND_RESET_WARM 2 | ||
26 | # define MSP_COMMAND_RESET_WARM_I 3 | ||
27 | # define MSP_COMMAND_POWEROFF 4 | ||
28 | # define MSP_COMMAND_IR_REINIT 5 | ||
29 | #define DM355EVM_MSP_STATUS 0x01 | ||
30 | # define MSP_STATUS_BAD_OFFSET BIT(0) | ||
31 | # define MSP_STATUS_BAD_COMMAND BIT(1) | ||
32 | # define MSP_STATUS_POWER_ERROR BIT(2) | ||
33 | # define MSP_STATUS_RXBUF_OVERRUN BIT(3) | ||
34 | #define DM355EVM_MSP_RESET 0x02 /* 0 bits == in reset */ | ||
35 | # define MSP_RESET_DC5 BIT(0) | ||
36 | # define MSP_RESET_TVP5154 BIT(2) | ||
37 | # define MSP_RESET_IMAGER BIT(3) | ||
38 | # define MSP_RESET_ETHERNET BIT(4) | ||
39 | # define MSP_RESET_SYS BIT(5) | ||
40 | # define MSP_RESET_AIC33 BIT(7) | ||
41 | |||
42 | /* GPIO registers ... bit patterns mostly match the source MSP ports */ | ||
43 | #define DM355EVM_MSP_LED 0x03 /* active low (MSP P4) */ | ||
44 | #define DM355EVM_MSP_SWITCH1 0x04 /* (MSP P5, masked) */ | ||
45 | # define MSP_SWITCH1_SW6_1 BIT(0) | ||
46 | # define MSP_SWITCH1_SW6_2 BIT(1) | ||
47 | # define MSP_SWITCH1_SW6_3 BIT(2) | ||
48 | # define MSP_SWITCH1_SW6_4 BIT(3) | ||
49 | # define MSP_SWITCH1_J1 BIT(4) /* NTSC/PAL */ | ||
50 | # define MSP_SWITCH1_MSP_INT BIT(5) /* active low */ | ||
51 | #define DM355EVM_MSP_SWITCH2 0x05 /* (MSP P6, masked) */ | ||
52 | # define MSP_SWITCH2_SW10 BIT(3) | ||
53 | # define MSP_SWITCH2_SW11 BIT(4) | ||
54 | # define MSP_SWITCH2_SW12 BIT(5) | ||
55 | # define MSP_SWITCH2_SW13 BIT(6) | ||
56 | # define MSP_SWITCH2_SW14 BIT(7) | ||
57 | #define DM355EVM_MSP_SDMMC 0x06 /* (MSP P2, masked) */ | ||
58 | # define MSP_SDMMC_0_WP BIT(1) | ||
59 | # define MSP_SDMMC_0_CD BIT(2) /* active low */ | ||
60 | # define MSP_SDMMC_1_WP BIT(3) | ||
61 | # define MSP_SDMMC_1_CD BIT(4) /* active low */ | ||
62 | #define DM355EVM_MSP_FIRMREV 0x07 /* not a GPIO (out of order) */ | ||
63 | #define DM355EVM_MSP_VIDEO_IN 0x08 /* (MSP P3, masked) */ | ||
64 | # define MSP_VIDEO_IMAGER BIT(7) /* low == tvp5146 */ | ||
65 | |||
66 | /* power supply registers are currently omitted */ | ||
67 | |||
68 | /* RTC registers */ | ||
69 | #define DM355EVM_MSP_RTC_0 0x12 /* LSB */ | ||
70 | #define DM355EVM_MSP_RTC_1 0x13 | ||
71 | #define DM355EVM_MSP_RTC_2 0x14 | ||
72 | #define DM355EVM_MSP_RTC_3 0x15 /* MSB */ | ||
73 | |||
74 | /* input event queue registers; code == ((HIGH << 8) | LOW) */ | ||
75 | #define DM355EVM_MSP_INPUT_COUNT 0x16 /* decrement by reading LOW */ | ||
76 | #define DM355EVM_MSP_INPUT_HIGH 0x17 | ||
77 | #define DM355EVM_MSP_INPUT_LOW 0x18 | ||
78 | |||
79 | #endif /* __LINUX_I2C_DM355EVM_MSP */ | ||
diff --git a/include/linux/i2c/tsc2007.h b/include/linux/i2c/tsc2007.h new file mode 100644 index 000000000000..c6361fbb7bf9 --- /dev/null +++ b/include/linux/i2c/tsc2007.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef __LINUX_I2C_TSC2007_H | ||
2 | #define __LINUX_I2C_TSC2007_H | ||
3 | |||
4 | /* linux/i2c/tsc2007.h */ | ||
5 | |||
6 | struct tsc2007_platform_data { | ||
7 | u16 model; /* 2007. */ | ||
8 | u16 x_plate_ohms; | ||
9 | |||
10 | int (*get_pendown_state)(void); | ||
11 | void (*clear_penirq)(void); /* If needed, clear 2nd level | ||
12 | interrupt source */ | ||
13 | int (*init_platform_hw)(void); | ||
14 | void (*exit_platform_hw)(void); | ||
15 | }; | ||
16 | |||
17 | #endif | ||
diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h index fb604dcd38f1..8137f660a5cc 100644 --- a/include/linux/i2c/twl4030.h +++ b/include/linux/i2c/twl4030.h | |||
@@ -78,8 +78,8 @@ int twl4030_i2c_read_u8(u8 mod_no, u8 *val, u8 reg); | |||
78 | * IMPORTANT: For twl4030_i2c_write(), allocate num_bytes + 1 | 78 | * IMPORTANT: For twl4030_i2c_write(), allocate num_bytes + 1 |
79 | * for the value, and populate your data starting at offset 1. | 79 | * for the value, and populate your data starting at offset 1. |
80 | */ | 80 | */ |
81 | int twl4030_i2c_write(u8 mod_no, u8 *value, u8 reg, u8 num_bytes); | 81 | int twl4030_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); |
82 | int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, u8 num_bytes); | 82 | int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); |
83 | 83 | ||
84 | /*----------------------------------------------------------------------*/ | 84 | /*----------------------------------------------------------------------*/ |
85 | 85 | ||
@@ -234,6 +234,9 @@ struct twl4030_gpio_platform_data { | |||
234 | /* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */ | 234 | /* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */ |
235 | u8 mmc_cd; | 235 | u8 mmc_cd; |
236 | 236 | ||
237 | /* if BIT(N) is set, or VMMC(n+1) is linked, debounce GPIO-N */ | ||
238 | u32 debounce; | ||
239 | |||
237 | /* For gpio-N, bit (1 << N) in "pullups" is set if that pullup | 240 | /* For gpio-N, bit (1 << N) in "pullups" is set if that pullup |
238 | * should be enabled. Else, if that bit is set in "pulldowns", | 241 | * should be enabled. Else, if that bit is set in "pulldowns", |
239 | * that pulldown is enabled. Don't waste power by letting any | 242 | * that pulldown is enabled. Don't waste power by letting any |
@@ -278,6 +281,18 @@ struct twl4030_platform_data { | |||
278 | struct twl4030_keypad_data *keypad; | 281 | struct twl4030_keypad_data *keypad; |
279 | struct twl4030_usb_data *usb; | 282 | struct twl4030_usb_data *usb; |
280 | 283 | ||
284 | /* LDO regulators */ | ||
285 | struct regulator_init_data *vdac; | ||
286 | struct regulator_init_data *vpll1; | ||
287 | struct regulator_init_data *vpll2; | ||
288 | struct regulator_init_data *vmmc1; | ||
289 | struct regulator_init_data *vmmc2; | ||
290 | struct regulator_init_data *vsim; | ||
291 | struct regulator_init_data *vaux1; | ||
292 | struct regulator_init_data *vaux2; | ||
293 | struct regulator_init_data *vaux3; | ||
294 | struct regulator_init_data *vaux4; | ||
295 | |||
281 | /* REVISIT more to come ... _nothing_ should be hard-wired */ | 296 | /* REVISIT more to come ... _nothing_ should be hard-wired */ |
282 | }; | 297 | }; |
283 | 298 | ||
@@ -285,33 +300,6 @@ struct twl4030_platform_data { | |||
285 | 300 | ||
286 | int twl4030_sih_setup(int module); | 301 | int twl4030_sih_setup(int module); |
287 | 302 | ||
288 | /* | ||
289 | * FIXME completely stop using TWL4030_IRQ_BASE ... instead, pass the | ||
290 | * IRQ data to subsidiary devices using platform device resources. | ||
291 | */ | ||
292 | |||
293 | /* IRQ information-need base */ | ||
294 | #include <mach/irqs.h> | ||
295 | /* TWL4030 interrupts */ | ||
296 | |||
297 | /* #define TWL4030_MODIRQ_GPIO (TWL4030_IRQ_BASE + 0) */ | ||
298 | #define TWL4030_MODIRQ_KEYPAD (TWL4030_IRQ_BASE + 1) | ||
299 | #define TWL4030_MODIRQ_BCI (TWL4030_IRQ_BASE + 2) | ||
300 | #define TWL4030_MODIRQ_MADC (TWL4030_IRQ_BASE + 3) | ||
301 | /* #define TWL4030_MODIRQ_USB (TWL4030_IRQ_BASE + 4) */ | ||
302 | /* #define TWL4030_MODIRQ_PWR (TWL4030_IRQ_BASE + 5) */ | ||
303 | |||
304 | #define TWL4030_PWRIRQ_PWRBTN (TWL4030_PWR_IRQ_BASE + 0) | ||
305 | /* #define TWL4030_PWRIRQ_CHG_PRES (TWL4030_PWR_IRQ_BASE + 1) */ | ||
306 | /* #define TWL4030_PWRIRQ_USB_PRES (TWL4030_PWR_IRQ_BASE + 2) */ | ||
307 | /* #define TWL4030_PWRIRQ_RTC (TWL4030_PWR_IRQ_BASE + 3) */ | ||
308 | /* #define TWL4030_PWRIRQ_HOT_DIE (TWL4030_PWR_IRQ_BASE + 4) */ | ||
309 | /* #define TWL4030_PWRIRQ_PWROK_TIMEOUT (TWL4030_PWR_IRQ_BASE + 5) */ | ||
310 | /* #define TWL4030_PWRIRQ_MBCHG (TWL4030_PWR_IRQ_BASE + 6) */ | ||
311 | /* #define TWL4030_PWRIRQ_SC_DETECT (TWL4030_PWR_IRQ_BASE + 7) */ | ||
312 | |||
313 | /* Rest are unsued currently*/ | ||
314 | |||
315 | /* Offsets to Power Registers */ | 303 | /* Offsets to Power Registers */ |
316 | #define TWL4030_VDAC_DEV_GRP 0x3B | 304 | #define TWL4030_VDAC_DEV_GRP 0x3B |
317 | #define TWL4030_VDAC_DEDICATED 0x3E | 305 | #define TWL4030_VDAC_DEDICATED 0x3E |
@@ -322,16 +310,6 @@ int twl4030_sih_setup(int module); | |||
322 | #define TWL4030_VAUX3_DEV_GRP 0x1F | 310 | #define TWL4030_VAUX3_DEV_GRP 0x1F |
323 | #define TWL4030_VAUX3_DEDICATED 0x22 | 311 | #define TWL4030_VAUX3_DEDICATED 0x22 |
324 | 312 | ||
325 | /* TWL4030 GPIO interrupt definitions */ | ||
326 | |||
327 | #define TWL4030_GPIO_IRQ_NO(n) (TWL4030_GPIO_IRQ_BASE + (n)) | ||
328 | |||
329 | /* | ||
330 | * Exported TWL4030 GPIO APIs | ||
331 | * | ||
332 | * WARNING -- use standard GPIO and IRQ calls instead; these will vanish. | ||
333 | */ | ||
334 | int twl4030_set_gpio_debounce(int gpio, int enable); | ||
335 | 313 | ||
336 | #if defined(CONFIG_TWL4030_BCI_BATTERY) || \ | 314 | #if defined(CONFIG_TWL4030_BCI_BATTERY) || \ |
337 | defined(CONFIG_TWL4030_BCI_BATTERY_MODULE) | 315 | defined(CONFIG_TWL4030_BCI_BATTERY_MODULE) |
@@ -340,4 +318,38 @@ int twl4030_set_gpio_debounce(int gpio, int enable); | |||
340 | static inline int twl4030charger_usb_en(int enable) { return 0; } | 318 | static inline int twl4030charger_usb_en(int enable) { return 0; } |
341 | #endif | 319 | #endif |
342 | 320 | ||
321 | /*----------------------------------------------------------------------*/ | ||
322 | |||
323 | /* Linux-specific regulator identifiers ... for now, we only support | ||
324 | * the LDOs, and leave the three buck converters alone. VDD1 and VDD2 | ||
325 | * need to tie into hardware based voltage scaling (cpufreq etc), while | ||
326 | * VIO is generally fixed. | ||
327 | */ | ||
328 | |||
329 | /* EXTERNAL dc-to-dc buck converters */ | ||
330 | #define TWL4030_REG_VDD1 0 | ||
331 | #define TWL4030_REG_VDD2 1 | ||
332 | #define TWL4030_REG_VIO 2 | ||
333 | |||
334 | /* EXTERNAL LDOs */ | ||
335 | #define TWL4030_REG_VDAC 3 | ||
336 | #define TWL4030_REG_VPLL1 4 | ||
337 | #define TWL4030_REG_VPLL2 5 /* not on all chips */ | ||
338 | #define TWL4030_REG_VMMC1 6 | ||
339 | #define TWL4030_REG_VMMC2 7 /* not on all chips */ | ||
340 | #define TWL4030_REG_VSIM 8 /* not on all chips */ | ||
341 | #define TWL4030_REG_VAUX1 9 /* not on all chips */ | ||
342 | #define TWL4030_REG_VAUX2_4030 10 /* (twl4030-specific) */ | ||
343 | #define TWL4030_REG_VAUX2 11 /* (twl5030 and newer) */ | ||
344 | #define TWL4030_REG_VAUX3 12 /* not on all chips */ | ||
345 | #define TWL4030_REG_VAUX4 13 /* not on all chips */ | ||
346 | |||
347 | /* INTERNAL LDOs */ | ||
348 | #define TWL4030_REG_VINTANA1 14 | ||
349 | #define TWL4030_REG_VINTANA2 15 | ||
350 | #define TWL4030_REG_VINTDIG 16 | ||
351 | #define TWL4030_REG_VUSB1V5 17 | ||
352 | #define TWL4030_REG_VUSB1V8 18 | ||
353 | #define TWL4030_REG_VUSB3V1 19 | ||
354 | |||
343 | #endif /* End of __TWL4030_H */ | 355 | #endif /* End of __TWL4030_H */ |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 010fb26a1579..3644f6323384 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -33,24 +33,13 @@ | |||
33 | #endif | 33 | #endif |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Used to indicate "no IRQ", should be a value that cannot be an IRQ | ||
37 | * number. | ||
38 | */ | ||
39 | |||
40 | #define IDE_NO_IRQ (-1) | ||
41 | |||
42 | typedef unsigned char byte; /* used everywhere */ | ||
43 | |||
44 | /* | ||
45 | * Probably not wise to fiddle with these | 36 | * Probably not wise to fiddle with these |
46 | */ | 37 | */ |
38 | #define IDE_DEFAULT_MAX_FAILURES 1 | ||
47 | #define ERROR_MAX 8 /* Max read/write errors per sector */ | 39 | #define ERROR_MAX 8 /* Max read/write errors per sector */ |
48 | #define ERROR_RESET 3 /* Reset controller every 4th retry */ | 40 | #define ERROR_RESET 3 /* Reset controller every 4th retry */ |
49 | #define ERROR_RECAL 1 /* Recalibrate every 2nd retry */ | 41 | #define ERROR_RECAL 1 /* Recalibrate every 2nd retry */ |
50 | 42 | ||
51 | #define HWIF(drive) ((ide_hwif_t *)((drive)->hwif)) | ||
52 | #define HWGROUP(drive) ((ide_hwgroup_t *)(HWIF(drive)->hwgroup)) | ||
53 | |||
54 | /* | 43 | /* |
55 | * Definitions for accessing IDE controller registers | 44 | * Definitions for accessing IDE controller registers |
56 | */ | 45 | */ |
@@ -122,8 +111,6 @@ struct ide_io_ports { | |||
122 | #define MAX_DRIVES 2 /* per interface; 2 assumed by lots of code */ | 111 | #define MAX_DRIVES 2 /* per interface; 2 assumed by lots of code */ |
123 | #define SECTOR_SIZE 512 | 112 | #define SECTOR_SIZE 512 |
124 | 113 | ||
125 | #define IDE_LARGE_SEEK(b1,b2,t) (((b1) > (b2) + (t)) || ((b2) > (b1) + (t))) | ||
126 | |||
127 | /* | 114 | /* |
128 | * Timeouts for various operations: | 115 | * Timeouts for various operations: |
129 | */ | 116 | */ |
@@ -172,9 +159,7 @@ typedef int (ide_ack_intr_t)(struct hwif_s *); | |||
172 | enum { ide_unknown, ide_generic, ide_pci, | 159 | enum { ide_unknown, ide_generic, ide_pci, |
173 | ide_cmd640, ide_dtc2278, ide_ali14xx, | 160 | ide_cmd640, ide_dtc2278, ide_ali14xx, |
174 | ide_qd65xx, ide_umc8672, ide_ht6560b, | 161 | ide_qd65xx, ide_umc8672, ide_ht6560b, |
175 | ide_rz1000, ide_trm290, | 162 | ide_4drives, ide_pmac, ide_acorn, |
176 | ide_cmd646, ide_cy82c693, ide_4drives, | ||
177 | ide_pmac, ide_acorn, | ||
178 | ide_au1xxx, ide_palm3710 | 163 | ide_au1xxx, ide_palm3710 |
179 | }; | 164 | }; |
180 | 165 | ||
@@ -196,9 +181,6 @@ typedef struct hw_regs_s { | |||
196 | unsigned long config; | 181 | unsigned long config; |
197 | } hw_regs_t; | 182 | } hw_regs_t; |
198 | 183 | ||
199 | void ide_init_port_data(struct hwif_s *, unsigned int); | ||
200 | void ide_init_port_hw(struct hwif_s *, hw_regs_t *); | ||
201 | |||
202 | static inline void ide_std_init_ports(hw_regs_t *hw, | 184 | static inline void ide_std_init_ports(hw_regs_t *hw, |
203 | unsigned long io_addr, | 185 | unsigned long io_addr, |
204 | unsigned long ctl_addr) | 186 | unsigned long ctl_addr) |
@@ -407,6 +389,7 @@ enum { | |||
407 | * This is used for several packet commands (not for READ/WRITE commands). | 389 | * This is used for several packet commands (not for READ/WRITE commands). |
408 | */ | 390 | */ |
409 | #define IDE_PC_BUFFER_SIZE 256 | 391 | #define IDE_PC_BUFFER_SIZE 256 |
392 | #define ATAPI_WAIT_PC (60 * HZ) | ||
410 | 393 | ||
411 | struct ide_atapi_pc { | 394 | struct ide_atapi_pc { |
412 | /* actual packet bytes */ | 395 | /* actual packet bytes */ |
@@ -443,18 +426,14 @@ struct ide_atapi_pc { | |||
443 | struct idetape_bh *bh; | 426 | struct idetape_bh *bh; |
444 | char *b_data; | 427 | char *b_data; |
445 | 428 | ||
446 | /* idescsi only for now */ | ||
447 | struct scatterlist *sg; | 429 | struct scatterlist *sg; |
448 | unsigned int sg_cnt; | 430 | unsigned int sg_cnt; |
449 | 431 | ||
450 | struct scsi_cmnd *scsi_cmd; | ||
451 | void (*done) (struct scsi_cmnd *); | ||
452 | |||
453 | unsigned long timeout; | 432 | unsigned long timeout; |
454 | }; | 433 | }; |
455 | 434 | ||
456 | struct ide_devset; | 435 | struct ide_devset; |
457 | struct ide_driver_s; | 436 | struct ide_driver; |
458 | 437 | ||
459 | #ifdef CONFIG_BLK_DEV_IDEACPI | 438 | #ifdef CONFIG_BLK_DEV_IDEACPI |
460 | struct ide_acpi_drive_link; | 439 | struct ide_acpi_drive_link; |
@@ -484,55 +463,53 @@ enum { | |||
484 | 463 | ||
485 | /* ide-cd */ | 464 | /* ide-cd */ |
486 | /* Drive cannot eject the disc. */ | 465 | /* Drive cannot eject the disc. */ |
487 | IDE_AFLAG_NO_EJECT = (1 << 3), | 466 | IDE_AFLAG_NO_EJECT = (1 << 1), |
488 | /* Drive is a pre ATAPI 1.2 drive. */ | 467 | /* Drive is a pre ATAPI 1.2 drive. */ |
489 | IDE_AFLAG_PRE_ATAPI12 = (1 << 4), | 468 | IDE_AFLAG_PRE_ATAPI12 = (1 << 2), |
490 | /* TOC addresses are in BCD. */ | 469 | /* TOC addresses are in BCD. */ |
491 | IDE_AFLAG_TOCADDR_AS_BCD = (1 << 5), | 470 | IDE_AFLAG_TOCADDR_AS_BCD = (1 << 3), |
492 | /* TOC track numbers are in BCD. */ | 471 | /* TOC track numbers are in BCD. */ |
493 | IDE_AFLAG_TOCTRACKS_AS_BCD = (1 << 6), | 472 | IDE_AFLAG_TOCTRACKS_AS_BCD = (1 << 4), |
494 | /* | 473 | /* |
495 | * Drive does not provide data in multiples of SECTOR_SIZE | 474 | * Drive does not provide data in multiples of SECTOR_SIZE |
496 | * when more than one interrupt is needed. | 475 | * when more than one interrupt is needed. |
497 | */ | 476 | */ |
498 | IDE_AFLAG_LIMIT_NFRAMES = (1 << 7), | 477 | IDE_AFLAG_LIMIT_NFRAMES = (1 << 5), |
499 | /* Seeking in progress. */ | ||
500 | IDE_AFLAG_SEEKING = (1 << 8), | ||
501 | /* Saved TOC information is current. */ | 478 | /* Saved TOC information is current. */ |
502 | IDE_AFLAG_TOC_VALID = (1 << 9), | 479 | IDE_AFLAG_TOC_VALID = (1 << 6), |
503 | /* We think that the drive door is locked. */ | 480 | /* We think that the drive door is locked. */ |
504 | IDE_AFLAG_DOOR_LOCKED = (1 << 10), | 481 | IDE_AFLAG_DOOR_LOCKED = (1 << 7), |
505 | /* SET_CD_SPEED command is unsupported. */ | 482 | /* SET_CD_SPEED command is unsupported. */ |
506 | IDE_AFLAG_NO_SPEED_SELECT = (1 << 11), | 483 | IDE_AFLAG_NO_SPEED_SELECT = (1 << 8), |
507 | IDE_AFLAG_VERTOS_300_SSD = (1 << 12), | 484 | IDE_AFLAG_VERTOS_300_SSD = (1 << 9), |
508 | IDE_AFLAG_VERTOS_600_ESD = (1 << 13), | 485 | IDE_AFLAG_VERTOS_600_ESD = (1 << 10), |
509 | IDE_AFLAG_SANYO_3CD = (1 << 14), | 486 | IDE_AFLAG_SANYO_3CD = (1 << 11), |
510 | IDE_AFLAG_FULL_CAPS_PAGE = (1 << 15), | 487 | IDE_AFLAG_FULL_CAPS_PAGE = (1 << 12), |
511 | IDE_AFLAG_PLAY_AUDIO_OK = (1 << 16), | 488 | IDE_AFLAG_PLAY_AUDIO_OK = (1 << 13), |
512 | IDE_AFLAG_LE_SPEED_FIELDS = (1 << 17), | 489 | IDE_AFLAG_LE_SPEED_FIELDS = (1 << 14), |
513 | 490 | ||
514 | /* ide-floppy */ | 491 | /* ide-floppy */ |
515 | /* Avoid commands not supported in Clik drive */ | 492 | /* Avoid commands not supported in Clik drive */ |
516 | IDE_AFLAG_CLIK_DRIVE = (1 << 19), | 493 | IDE_AFLAG_CLIK_DRIVE = (1 << 15), |
517 | /* Requires BH algorithm for packets */ | 494 | /* Requires BH algorithm for packets */ |
518 | IDE_AFLAG_ZIP_DRIVE = (1 << 20), | 495 | IDE_AFLAG_ZIP_DRIVE = (1 << 16), |
519 | /* Supports format progress report */ | 496 | /* Supports format progress report */ |
520 | IDE_AFLAG_SRFP = (1 << 22), | 497 | IDE_AFLAG_SRFP = (1 << 17), |
521 | 498 | ||
522 | /* ide-tape */ | 499 | /* ide-tape */ |
523 | IDE_AFLAG_IGNORE_DSC = (1 << 23), | 500 | IDE_AFLAG_IGNORE_DSC = (1 << 18), |
524 | /* 0 When the tape position is unknown */ | 501 | /* 0 When the tape position is unknown */ |
525 | IDE_AFLAG_ADDRESS_VALID = (1 << 24), | 502 | IDE_AFLAG_ADDRESS_VALID = (1 << 19), |
526 | /* Device already opened */ | 503 | /* Device already opened */ |
527 | IDE_AFLAG_BUSY = (1 << 25), | 504 | IDE_AFLAG_BUSY = (1 << 20), |
528 | /* Attempt to auto-detect the current user block size */ | 505 | /* Attempt to auto-detect the current user block size */ |
529 | IDE_AFLAG_DETECT_BS = (1 << 26), | 506 | IDE_AFLAG_DETECT_BS = (1 << 21), |
530 | /* Currently on a filemark */ | 507 | /* Currently on a filemark */ |
531 | IDE_AFLAG_FILEMARK = (1 << 27), | 508 | IDE_AFLAG_FILEMARK = (1 << 22), |
532 | /* 0 = no tape is loaded, so we don't rewind after ejecting */ | 509 | /* 0 = no tape is loaded, so we don't rewind after ejecting */ |
533 | IDE_AFLAG_MEDIUM_PRESENT = (1 << 28), | 510 | IDE_AFLAG_MEDIUM_PRESENT = (1 << 23), |
534 | 511 | ||
535 | IDE_AFLAG_NO_AUTOCLOSE = (1 << 29), | 512 | IDE_AFLAG_NO_AUTOCLOSE = (1 << 24), |
536 | }; | 513 | }; |
537 | 514 | ||
538 | /* device flags */ | 515 | /* device flags */ |
@@ -571,28 +548,26 @@ enum { | |||
571 | IDE_DFLAG_NODMA = (1 << 16), | 548 | IDE_DFLAG_NODMA = (1 << 16), |
572 | /* powermanagment told us not to do anything, so sleep nicely */ | 549 | /* powermanagment told us not to do anything, so sleep nicely */ |
573 | IDE_DFLAG_BLOCKED = (1 << 17), | 550 | IDE_DFLAG_BLOCKED = (1 << 17), |
574 | /* ide-scsi emulation */ | ||
575 | IDE_DFLAG_SCSI = (1 << 18), | ||
576 | /* sleeping & sleep field valid */ | 551 | /* sleeping & sleep field valid */ |
577 | IDE_DFLAG_SLEEPING = (1 << 19), | 552 | IDE_DFLAG_SLEEPING = (1 << 18), |
578 | IDE_DFLAG_POST_RESET = (1 << 20), | 553 | IDE_DFLAG_POST_RESET = (1 << 19), |
579 | IDE_DFLAG_UDMA33_WARNED = (1 << 21), | 554 | IDE_DFLAG_UDMA33_WARNED = (1 << 20), |
580 | IDE_DFLAG_LBA48 = (1 << 22), | 555 | IDE_DFLAG_LBA48 = (1 << 21), |
581 | /* status of write cache */ | 556 | /* status of write cache */ |
582 | IDE_DFLAG_WCACHE = (1 << 23), | 557 | IDE_DFLAG_WCACHE = (1 << 22), |
583 | /* used for ignoring ATA_DF */ | 558 | /* used for ignoring ATA_DF */ |
584 | IDE_DFLAG_NOWERR = (1 << 24), | 559 | IDE_DFLAG_NOWERR = (1 << 23), |
585 | /* retrying in PIO */ | 560 | /* retrying in PIO */ |
586 | IDE_DFLAG_DMA_PIO_RETRY = (1 << 25), | 561 | IDE_DFLAG_DMA_PIO_RETRY = (1 << 24), |
587 | IDE_DFLAG_LBA = (1 << 26), | 562 | IDE_DFLAG_LBA = (1 << 25), |
588 | /* don't unload heads */ | 563 | /* don't unload heads */ |
589 | IDE_DFLAG_NO_UNLOAD = (1 << 27), | 564 | IDE_DFLAG_NO_UNLOAD = (1 << 26), |
590 | /* heads unloaded, please don't reset port */ | 565 | /* heads unloaded, please don't reset port */ |
591 | IDE_DFLAG_PARKED = (1 << 28), | 566 | IDE_DFLAG_PARKED = (1 << 27), |
592 | IDE_DFLAG_MEDIA_CHANGED = (1 << 29), | 567 | IDE_DFLAG_MEDIA_CHANGED = (1 << 28), |
593 | /* write protect */ | 568 | /* write protect */ |
594 | IDE_DFLAG_WP = (1 << 30), | 569 | IDE_DFLAG_WP = (1 << 29), |
595 | IDE_DFLAG_FORMAT_IN_PROGRESS = (1 << 31), | 570 | IDE_DFLAG_FORMAT_IN_PROGRESS = (1 << 30), |
596 | }; | 571 | }; |
597 | 572 | ||
598 | struct ide_drive_s { | 573 | struct ide_drive_s { |
@@ -602,7 +577,6 @@ struct ide_drive_s { | |||
602 | struct request_queue *queue; /* request queue */ | 577 | struct request_queue *queue; /* request queue */ |
603 | 578 | ||
604 | struct request *rq; /* current request */ | 579 | struct request *rq; /* current request */ |
605 | struct ide_drive_s *next; /* circular list of hwgroup drives */ | ||
606 | void *driver_data; /* extra driver data */ | 580 | void *driver_data; /* extra driver data */ |
607 | u16 *id; /* identification info */ | 581 | u16 *id; /* identification info */ |
608 | #ifdef CONFIG_IDE_PROC_FS | 582 | #ifdef CONFIG_IDE_PROC_FS |
@@ -616,8 +590,6 @@ struct ide_drive_s { | |||
616 | unsigned long dev_flags; | 590 | unsigned long dev_flags; |
617 | 591 | ||
618 | unsigned long sleep; /* sleep until this time */ | 592 | unsigned long sleep; /* sleep until this time */ |
619 | unsigned long service_start; /* time we started last request */ | ||
620 | unsigned long service_time; /* service time of last request */ | ||
621 | unsigned long timeout; /* max time to wait for irq */ | 593 | unsigned long timeout; /* max time to wait for irq */ |
622 | 594 | ||
623 | special_t special; /* special action flags */ | 595 | special_t special; /* special action flags */ |
@@ -678,6 +650,8 @@ struct ide_drive_s { | |||
678 | int (*pc_io_buffers)(struct ide_drive_s *, struct ide_atapi_pc *, | 650 | int (*pc_io_buffers)(struct ide_drive_s *, struct ide_atapi_pc *, |
679 | unsigned int, int); | 651 | unsigned int, int); |
680 | 652 | ||
653 | ide_startstop_t (*irq_handler)(struct ide_drive_s *); | ||
654 | |||
681 | unsigned long atapi_flags; | 655 | unsigned long atapi_flags; |
682 | 656 | ||
683 | struct ide_atapi_pc request_sense_pc; | 657 | struct ide_atapi_pc request_sense_pc; |
@@ -700,7 +674,6 @@ struct ide_tp_ops { | |||
700 | void (*exec_command)(struct hwif_s *, u8); | 674 | void (*exec_command)(struct hwif_s *, u8); |
701 | u8 (*read_status)(struct hwif_s *); | 675 | u8 (*read_status)(struct hwif_s *); |
702 | u8 (*read_altstatus)(struct hwif_s *); | 676 | u8 (*read_altstatus)(struct hwif_s *); |
703 | u8 (*read_sff_dma_status)(struct hwif_s *); | ||
704 | 677 | ||
705 | void (*set_irq)(struct hwif_s *, int); | 678 | void (*set_irq)(struct hwif_s *, int); |
706 | 679 | ||
@@ -761,14 +734,17 @@ struct ide_dma_ops { | |||
761 | int (*dma_test_irq)(struct ide_drive_s *); | 734 | int (*dma_test_irq)(struct ide_drive_s *); |
762 | void (*dma_lost_irq)(struct ide_drive_s *); | 735 | void (*dma_lost_irq)(struct ide_drive_s *); |
763 | void (*dma_timeout)(struct ide_drive_s *); | 736 | void (*dma_timeout)(struct ide_drive_s *); |
737 | /* | ||
738 | * The following method is optional and only required to be | ||
739 | * implemented for the SFF-8038i compatible controllers. | ||
740 | */ | ||
741 | u8 (*dma_sff_read_status)(struct hwif_s *); | ||
764 | }; | 742 | }; |
765 | 743 | ||
766 | struct ide_host; | 744 | struct ide_host; |
767 | 745 | ||
768 | typedef struct hwif_s { | 746 | typedef struct hwif_s { |
769 | struct hwif_s *next; /* for linked-list in ide_hwgroup_t */ | ||
770 | struct hwif_s *mate; /* other hwif from same PCI chip */ | 747 | struct hwif_s *mate; /* other hwif from same PCI chip */ |
771 | struct hwgroup_s *hwgroup; /* actually (ide_hwgroup_t *) */ | ||
772 | struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ | 748 | struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ |
773 | 749 | ||
774 | struct ide_host *host; | 750 | struct ide_host *host; |
@@ -779,7 +755,7 @@ typedef struct hwif_s { | |||
779 | 755 | ||
780 | unsigned long sata_scr[SATA_NR_PORTS]; | 756 | unsigned long sata_scr[SATA_NR_PORTS]; |
781 | 757 | ||
782 | ide_drive_t drives[MAX_DRIVES]; /* drive info */ | 758 | ide_drive_t *devices[MAX_DRIVES + 1]; |
783 | 759 | ||
784 | u8 major; /* our major number */ | 760 | u8 major; /* our major number */ |
785 | u8 index; /* 0 for ide0; 1 for ide1; ... */ | 761 | u8 index; /* 0 for ide0; 1 for ide1; ... */ |
@@ -845,9 +821,7 @@ typedef struct hwif_s { | |||
845 | unsigned extra_ports; /* number of extra dma ports */ | 821 | unsigned extra_ports; /* number of extra dma ports */ |
846 | 822 | ||
847 | unsigned present : 1; /* this interface exists */ | 823 | unsigned present : 1; /* this interface exists */ |
848 | unsigned serialized : 1; /* serialized all channel operation */ | 824 | unsigned busy : 1; /* serializes devices on a port */ |
849 | unsigned sharing_irq: 1; /* 1 = sharing irq with another hwif */ | ||
850 | unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ | ||
851 | 825 | ||
852 | struct device gendev; | 826 | struct device gendev; |
853 | struct device *portdev; | 827 | struct device *portdev; |
@@ -859,19 +833,49 @@ typedef struct hwif_s { | |||
859 | #ifdef CONFIG_BLK_DEV_IDEACPI | 833 | #ifdef CONFIG_BLK_DEV_IDEACPI |
860 | struct ide_acpi_hwif_link *acpidata; | 834 | struct ide_acpi_hwif_link *acpidata; |
861 | #endif | 835 | #endif |
836 | |||
837 | /* IRQ handler, if active */ | ||
838 | ide_startstop_t (*handler)(ide_drive_t *); | ||
839 | |||
840 | /* BOOL: polling active & poll_timeout field valid */ | ||
841 | unsigned int polling : 1; | ||
842 | |||
843 | /* current drive */ | ||
844 | ide_drive_t *cur_dev; | ||
845 | |||
846 | /* current request */ | ||
847 | struct request *rq; | ||
848 | |||
849 | /* failsafe timer */ | ||
850 | struct timer_list timer; | ||
851 | /* timeout value during long polls */ | ||
852 | unsigned long poll_timeout; | ||
853 | /* queried upon timeouts */ | ||
854 | int (*expiry)(ide_drive_t *); | ||
855 | |||
856 | int req_gen; | ||
857 | int req_gen_timer; | ||
858 | |||
859 | spinlock_t lock; | ||
862 | } ____cacheline_internodealigned_in_smp ide_hwif_t; | 860 | } ____cacheline_internodealigned_in_smp ide_hwif_t; |
863 | 861 | ||
864 | #define MAX_HOST_PORTS 4 | 862 | #define MAX_HOST_PORTS 4 |
865 | 863 | ||
866 | struct ide_host { | 864 | struct ide_host { |
867 | ide_hwif_t *ports[MAX_HOST_PORTS]; | 865 | ide_hwif_t *ports[MAX_HOST_PORTS + 1]; |
868 | unsigned int n_ports; | 866 | unsigned int n_ports; |
869 | struct device *dev[2]; | 867 | struct device *dev[2]; |
870 | unsigned int (*init_chipset)(struct pci_dev *); | 868 | unsigned int (*init_chipset)(struct pci_dev *); |
871 | unsigned long host_flags; | 869 | unsigned long host_flags; |
872 | void *host_priv; | 870 | void *host_priv; |
871 | ide_hwif_t *cur_port; /* for hosts requiring serialization */ | ||
872 | |||
873 | /* used for hosts requiring serialization */ | ||
874 | volatile long host_busy; | ||
873 | }; | 875 | }; |
874 | 876 | ||
877 | #define IDE_HOST_BUSY 0 | ||
878 | |||
875 | /* | 879 | /* |
876 | * internal ide interrupt handler type | 880 | * internal ide interrupt handler type |
877 | */ | 881 | */ |
@@ -881,38 +885,6 @@ typedef int (ide_expiry_t)(ide_drive_t *); | |||
881 | /* used by ide-cd, ide-floppy, etc. */ | 885 | /* used by ide-cd, ide-floppy, etc. */ |
882 | typedef void (xfer_func_t)(ide_drive_t *, struct request *rq, void *, unsigned); | 886 | typedef void (xfer_func_t)(ide_drive_t *, struct request *rq, void *, unsigned); |
883 | 887 | ||
884 | typedef struct hwgroup_s { | ||
885 | /* irq handler, if active */ | ||
886 | ide_startstop_t (*handler)(ide_drive_t *); | ||
887 | |||
888 | /* BOOL: protects all fields below */ | ||
889 | volatile int busy; | ||
890 | /* BOOL: wake us up on timer expiry */ | ||
891 | unsigned int sleeping : 1; | ||
892 | /* BOOL: polling active & poll_timeout field valid */ | ||
893 | unsigned int polling : 1; | ||
894 | |||
895 | /* current drive */ | ||
896 | ide_drive_t *drive; | ||
897 | /* ptr to current hwif in linked-list */ | ||
898 | ide_hwif_t *hwif; | ||
899 | |||
900 | /* current request */ | ||
901 | struct request *rq; | ||
902 | |||
903 | /* failsafe timer */ | ||
904 | struct timer_list timer; | ||
905 | /* timeout value during long polls */ | ||
906 | unsigned long poll_timeout; | ||
907 | /* queried upon timeouts */ | ||
908 | int (*expiry)(ide_drive_t *); | ||
909 | |||
910 | int req_gen; | ||
911 | int req_gen_timer; | ||
912 | } ide_hwgroup_t; | ||
913 | |||
914 | typedef struct ide_driver_s ide_driver_t; | ||
915 | |||
916 | extern struct mutex ide_setting_mtx; | 888 | extern struct mutex ide_setting_mtx; |
917 | 889 | ||
918 | /* | 890 | /* |
@@ -1038,8 +1010,8 @@ void ide_proc_register_port(ide_hwif_t *); | |||
1038 | void ide_proc_port_register_devices(ide_hwif_t *); | 1010 | void ide_proc_port_register_devices(ide_hwif_t *); |
1039 | void ide_proc_unregister_device(ide_drive_t *); | 1011 | void ide_proc_unregister_device(ide_drive_t *); |
1040 | void ide_proc_unregister_port(ide_hwif_t *); | 1012 | void ide_proc_unregister_port(ide_hwif_t *); |
1041 | void ide_proc_register_driver(ide_drive_t *, ide_driver_t *); | 1013 | void ide_proc_register_driver(ide_drive_t *, struct ide_driver *); |
1042 | void ide_proc_unregister_driver(ide_drive_t *, ide_driver_t *); | 1014 | void ide_proc_unregister_driver(ide_drive_t *, struct ide_driver *); |
1043 | 1015 | ||
1044 | read_proc_t proc_ide_read_capacity; | 1016 | read_proc_t proc_ide_read_capacity; |
1045 | read_proc_t proc_ide_read_geometry; | 1017 | read_proc_t proc_ide_read_geometry; |
@@ -1066,8 +1038,10 @@ static inline void ide_proc_register_port(ide_hwif_t *hwif) { ; } | |||
1066 | static inline void ide_proc_port_register_devices(ide_hwif_t *hwif) { ; } | 1038 | static inline void ide_proc_port_register_devices(ide_hwif_t *hwif) { ; } |
1067 | static inline void ide_proc_unregister_device(ide_drive_t *drive) { ; } | 1039 | static inline void ide_proc_unregister_device(ide_drive_t *drive) { ; } |
1068 | static inline void ide_proc_unregister_port(ide_hwif_t *hwif) { ; } | 1040 | static inline void ide_proc_unregister_port(ide_hwif_t *hwif) { ; } |
1069 | static inline void ide_proc_register_driver(ide_drive_t *drive, ide_driver_t *driver) { ; } | 1041 | static inline void ide_proc_register_driver(ide_drive_t *drive, |
1070 | static inline void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver) { ; } | 1042 | struct ide_driver *driver) { ; } |
1043 | static inline void ide_proc_unregister_driver(ide_drive_t *drive, | ||
1044 | struct ide_driver *driver) { ; } | ||
1071 | #define PROC_IDE_READ_RETURN(page,start,off,count,eof,len) return 0; | 1045 | #define PROC_IDE_READ_RETURN(page,start,off,count,eof,len) return 0; |
1072 | #endif | 1046 | #endif |
1073 | 1047 | ||
@@ -1122,17 +1096,24 @@ enum { | |||
1122 | IDE_PM_COMPLETED, | 1096 | IDE_PM_COMPLETED, |
1123 | }; | 1097 | }; |
1124 | 1098 | ||
1099 | int generic_ide_suspend(struct device *, pm_message_t); | ||
1100 | int generic_ide_resume(struct device *); | ||
1101 | |||
1102 | void ide_complete_power_step(ide_drive_t *, struct request *); | ||
1103 | ide_startstop_t ide_start_power_step(ide_drive_t *, struct request *); | ||
1104 | void ide_complete_pm_request(ide_drive_t *, struct request *); | ||
1105 | void ide_check_pm_state(ide_drive_t *, struct request *); | ||
1106 | |||
1125 | /* | 1107 | /* |
1126 | * Subdrivers support. | 1108 | * Subdrivers support. |
1127 | * | 1109 | * |
1128 | * The gendriver.owner field should be set to the module owner of this driver. | 1110 | * The gendriver.owner field should be set to the module owner of this driver. |
1129 | * The gendriver.name field should be set to the name of this driver | 1111 | * The gendriver.name field should be set to the name of this driver |
1130 | */ | 1112 | */ |
1131 | struct ide_driver_s { | 1113 | struct ide_driver { |
1132 | const char *version; | 1114 | const char *version; |
1133 | ide_startstop_t (*do_request)(ide_drive_t *, struct request *, sector_t); | 1115 | ide_startstop_t (*do_request)(ide_drive_t *, struct request *, sector_t); |
1134 | int (*end_request)(ide_drive_t *, int, int); | 1116 | int (*end_request)(ide_drive_t *, int, int); |
1135 | ide_startstop_t (*error)(ide_drive_t *, struct request *rq, u8, u8); | ||
1136 | struct device_driver gen_driver; | 1117 | struct device_driver gen_driver; |
1137 | int (*probe)(ide_drive_t *); | 1118 | int (*probe)(ide_drive_t *); |
1138 | void (*remove)(ide_drive_t *); | 1119 | void (*remove)(ide_drive_t *); |
@@ -1144,7 +1125,7 @@ struct ide_driver_s { | |||
1144 | #endif | 1125 | #endif |
1145 | }; | 1126 | }; |
1146 | 1127 | ||
1147 | #define to_ide_driver(drv) container_of(drv, ide_driver_t, gen_driver) | 1128 | #define to_ide_driver(drv) container_of(drv, struct ide_driver, gen_driver) |
1148 | 1129 | ||
1149 | int ide_device_get(ide_drive_t *); | 1130 | int ide_device_get(ide_drive_t *); |
1150 | void ide_device_put(ide_drive_t *); | 1131 | void ide_device_put(ide_drive_t *); |
@@ -1176,9 +1157,7 @@ void ide_execute_pkt_cmd(ide_drive_t *); | |||
1176 | 1157 | ||
1177 | void ide_pad_transfer(ide_drive_t *, int, int); | 1158 | void ide_pad_transfer(ide_drive_t *, int, int); |
1178 | 1159 | ||
1179 | ide_startstop_t __ide_error(ide_drive_t *, struct request *, u8, u8); | 1160 | ide_startstop_t ide_error(ide_drive_t *, const char *, u8); |
1180 | |||
1181 | ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat); | ||
1182 | 1161 | ||
1183 | void ide_fix_driveid(u16 *); | 1162 | void ide_fix_driveid(u16 *); |
1184 | 1163 | ||
@@ -1202,7 +1181,6 @@ void ide_tf_dump(const char *, struct ide_taskfile *); | |||
1202 | void ide_exec_command(ide_hwif_t *, u8); | 1181 | void ide_exec_command(ide_hwif_t *, u8); |
1203 | u8 ide_read_status(ide_hwif_t *); | 1182 | u8 ide_read_status(ide_hwif_t *); |
1204 | u8 ide_read_altstatus(ide_hwif_t *); | 1183 | u8 ide_read_altstatus(ide_hwif_t *); |
1205 | u8 ide_read_sff_dma_status(ide_hwif_t *); | ||
1206 | 1184 | ||
1207 | void ide_set_irq(ide_hwif_t *, int); | 1185 | void ide_set_irq(ide_hwif_t *, int); |
1208 | 1186 | ||
@@ -1256,14 +1234,11 @@ int ide_set_media_lock(ide_drive_t *, struct gendisk *, int); | |||
1256 | void ide_create_request_sense_cmd(ide_drive_t *, struct ide_atapi_pc *); | 1234 | void ide_create_request_sense_cmd(ide_drive_t *, struct ide_atapi_pc *); |
1257 | void ide_retry_pc(ide_drive_t *, struct gendisk *); | 1235 | void ide_retry_pc(ide_drive_t *, struct gendisk *); |
1258 | 1236 | ||
1259 | static inline unsigned long ide_scsi_get_timeout(struct ide_atapi_pc *pc) | 1237 | int ide_cd_expiry(ide_drive_t *); |
1260 | { | ||
1261 | return max_t(unsigned long, WAIT_CMD, pc->timeout - jiffies); | ||
1262 | } | ||
1263 | 1238 | ||
1264 | int ide_scsi_expiry(ide_drive_t *); | 1239 | int ide_cd_get_xferlen(struct request *); |
1265 | 1240 | ||
1266 | ide_startstop_t ide_issue_pc(ide_drive_t *, unsigned int, ide_expiry_t *); | 1241 | ide_startstop_t ide_issue_pc(ide_drive_t *); |
1267 | 1242 | ||
1268 | ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *); | 1243 | ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *); |
1269 | 1244 | ||
@@ -1320,11 +1295,11 @@ static inline int ide_hwif_setup_dma(ide_hwif_t *hwif, | |||
1320 | } | 1295 | } |
1321 | #endif | 1296 | #endif |
1322 | 1297 | ||
1323 | typedef struct ide_pci_enablebit_s { | 1298 | struct ide_pci_enablebit { |
1324 | u8 reg; /* byte pci reg holding the enable-bit */ | 1299 | u8 reg; /* byte pci reg holding the enable-bit */ |
1325 | u8 mask; /* mask to isolate the enable-bit */ | 1300 | u8 mask; /* mask to isolate the enable-bit */ |
1326 | u8 val; /* value of masked reg when "enabled" */ | 1301 | u8 val; /* value of masked reg when "enabled" */ |
1327 | } ide_pci_enablebit_t; | 1302 | }; |
1328 | 1303 | ||
1329 | enum { | 1304 | enum { |
1330 | /* Uses ISA control ports not PCI ones. */ | 1305 | /* Uses ISA control ports not PCI ones. */ |
@@ -1376,8 +1351,8 @@ enum { | |||
1376 | IDE_HFLAG_LEGACY_IRQS = (1 << 21), | 1351 | IDE_HFLAG_LEGACY_IRQS = (1 << 21), |
1377 | /* force use of legacy IRQs */ | 1352 | /* force use of legacy IRQs */ |
1378 | IDE_HFLAG_FORCE_LEGACY_IRQS = (1 << 22), | 1353 | IDE_HFLAG_FORCE_LEGACY_IRQS = (1 << 22), |
1379 | /* limit LBA48 requests to 256 sectors */ | 1354 | /* host is TRM290 */ |
1380 | IDE_HFLAG_RQSIZE_256 = (1 << 23), | 1355 | IDE_HFLAG_TRM290 = (1 << 23), |
1381 | /* use 32-bit I/O ops */ | 1356 | /* use 32-bit I/O ops */ |
1382 | IDE_HFLAG_IO_32BIT = (1 << 24), | 1357 | IDE_HFLAG_IO_32BIT = (1 << 24), |
1383 | /* unmask IRQs */ | 1358 | /* unmask IRQs */ |
@@ -1413,8 +1388,12 @@ struct ide_port_info { | |||
1413 | const struct ide_port_ops *port_ops; | 1388 | const struct ide_port_ops *port_ops; |
1414 | const struct ide_dma_ops *dma_ops; | 1389 | const struct ide_dma_ops *dma_ops; |
1415 | 1390 | ||
1416 | ide_pci_enablebit_t enablebits[2]; | 1391 | struct ide_pci_enablebit enablebits[2]; |
1392 | |||
1417 | hwif_chipset_t chipset; | 1393 | hwif_chipset_t chipset; |
1394 | |||
1395 | u16 max_sectors; /* if < than the default one */ | ||
1396 | |||
1418 | u32 host_flags; | 1397 | u32 host_flags; |
1419 | u8 pio_mask; | 1398 | u8 pio_mask; |
1420 | u8 swdma_mask; | 1399 | u8 swdma_mask; |
@@ -1482,6 +1461,7 @@ void ide_dma_exec_cmd(ide_drive_t *, u8); | |||
1482 | extern void ide_dma_start(ide_drive_t *); | 1461 | extern void ide_dma_start(ide_drive_t *); |
1483 | int ide_dma_end(ide_drive_t *); | 1462 | int ide_dma_end(ide_drive_t *); |
1484 | int ide_dma_test_irq(ide_drive_t *); | 1463 | int ide_dma_test_irq(ide_drive_t *); |
1464 | u8 ide_dma_sff_read_status(ide_hwif_t *); | ||
1485 | extern const struct ide_dma_ops sff_dma_ops; | 1465 | extern const struct ide_dma_ops sff_dma_ops; |
1486 | #else | 1466 | #else |
1487 | static inline int config_drive_for_dma(ide_drive_t *drive) { return 0; } | 1467 | static inline int config_drive_for_dma(ide_drive_t *drive) { return 0; } |
@@ -1519,15 +1499,13 @@ static inline void ide_acpi_port_init_devices(ide_hwif_t *hwif) { ; } | |||
1519 | static inline void ide_acpi_set_state(ide_hwif_t *hwif, int on) {} | 1499 | static inline void ide_acpi_set_state(ide_hwif_t *hwif, int on) {} |
1520 | #endif | 1500 | #endif |
1521 | 1501 | ||
1522 | void ide_remove_port_from_hwgroup(ide_hwif_t *); | ||
1523 | void ide_unregister(ide_hwif_t *); | ||
1524 | |||
1525 | void ide_register_region(struct gendisk *); | 1502 | void ide_register_region(struct gendisk *); |
1526 | void ide_unregister_region(struct gendisk *); | 1503 | void ide_unregister_region(struct gendisk *); |
1527 | 1504 | ||
1528 | void ide_undecoded_slave(ide_drive_t *); | 1505 | void ide_undecoded_slave(ide_drive_t *); |
1529 | 1506 | ||
1530 | void ide_port_apply_params(ide_hwif_t *); | 1507 | void ide_port_apply_params(ide_hwif_t *); |
1508 | int ide_sysfs_register_port(ide_hwif_t *); | ||
1531 | 1509 | ||
1532 | struct ide_host *ide_host_alloc(const struct ide_port_info *, hw_regs_t **); | 1510 | struct ide_host *ide_host_alloc(const struct ide_port_info *, hw_regs_t **); |
1533 | void ide_host_free(struct ide_host *); | 1511 | void ide_host_free(struct ide_host *); |
@@ -1605,23 +1583,9 @@ static inline void ide_set_max_pio(ide_drive_t *drive) | |||
1605 | ide_set_pio(drive, 255); | 1583 | ide_set_pio(drive, 255); |
1606 | } | 1584 | } |
1607 | 1585 | ||
1608 | extern spinlock_t ide_lock; | 1586 | char *ide_media_string(ide_drive_t *); |
1609 | extern struct mutex ide_cfg_mtx; | ||
1610 | /* | ||
1611 | * Structure locking: | ||
1612 | * | ||
1613 | * ide_cfg_mtx and ide_lock together protect changes to | ||
1614 | * ide_hwif_t->{next,hwgroup} | ||
1615 | * ide_drive_t->next | ||
1616 | * | ||
1617 | * ide_hwgroup_t->busy: ide_lock | ||
1618 | * ide_hwgroup_t->hwif: ide_lock | ||
1619 | * ide_hwif_t->mate: constant, no locking | ||
1620 | * ide_drive_t->hwif: constant, no locking | ||
1621 | */ | ||
1622 | |||
1623 | #define local_irq_set(flags) do { local_save_flags((flags)); local_irq_enable_in_hardirq(); } while (0) | ||
1624 | 1587 | ||
1588 | extern struct device_attribute ide_dev_attrs[]; | ||
1625 | extern struct bus_type ide_bus_type; | 1589 | extern struct bus_type ide_bus_type; |
1626 | extern struct class *ide_port_class; | 1590 | extern struct class *ide_port_class; |
1627 | 1591 | ||
@@ -1637,8 +1601,15 @@ static inline int hwif_to_node(ide_hwif_t *hwif) | |||
1637 | 1601 | ||
1638 | static inline ide_drive_t *ide_get_pair_dev(ide_drive_t *drive) | 1602 | static inline ide_drive_t *ide_get_pair_dev(ide_drive_t *drive) |
1639 | { | 1603 | { |
1640 | ide_drive_t *peer = &drive->hwif->drives[(drive->dn ^ 1) & 1]; | 1604 | ide_drive_t *peer = drive->hwif->devices[(drive->dn ^ 1) & 1]; |
1641 | 1605 | ||
1642 | return (peer->dev_flags & IDE_DFLAG_PRESENT) ? peer : NULL; | 1606 | return (peer->dev_flags & IDE_DFLAG_PRESENT) ? peer : NULL; |
1643 | } | 1607 | } |
1608 | |||
1609 | #define ide_port_for_each_dev(i, dev, port) \ | ||
1610 | for ((i) = 0; ((dev) = (port)->devices[i]) || (i) < MAX_DRIVES; (i)++) | ||
1611 | |||
1612 | #define ide_host_for_each_port(i, port, host) \ | ||
1613 | for ((i) = 0; ((port) = (host)->ports[i]) || (i) < MAX_HOST_PORTS; (i)++) | ||
1614 | |||
1644 | #endif /* _IDE_H */ | 1615 | #endif /* _IDE_H */ |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index a5cb0c3f6dcf..f8ff918c208f 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -115,6 +115,11 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev); | |||
115 | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | 115 | extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
116 | u16 vlan_tci, int polling); | 116 | u16 vlan_tci, int polling); |
117 | extern int vlan_hwaccel_do_receive(struct sk_buff *skb); | 117 | extern int vlan_hwaccel_do_receive(struct sk_buff *skb); |
118 | extern int vlan_gro_receive(struct napi_struct *napi, struct vlan_group *grp, | ||
119 | unsigned int vlan_tci, struct sk_buff *skb); | ||
120 | extern int vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp, | ||
121 | unsigned int vlan_tci, | ||
122 | struct napi_gro_fraginfo *info); | ||
118 | 123 | ||
119 | #else | 124 | #else |
120 | static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) | 125 | static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) |
@@ -140,6 +145,20 @@ static inline int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
140 | { | 145 | { |
141 | return 0; | 146 | return 0; |
142 | } | 147 | } |
148 | |||
149 | static inline int vlan_gro_receive(struct napi_struct *napi, | ||
150 | struct vlan_group *grp, | ||
151 | unsigned int vlan_tci, struct sk_buff *skb) | ||
152 | { | ||
153 | return NET_RX_DROP; | ||
154 | } | ||
155 | |||
156 | static inline int vlan_gro_frags(struct napi_struct *napi, | ||
157 | struct vlan_group *grp, unsigned int vlan_tci, | ||
158 | struct napi_gro_fraginfo *info) | ||
159 | { | ||
160 | return NET_RX_DROP; | ||
161 | } | ||
143 | #endif | 162 | #endif |
144 | 163 | ||
145 | /** | 164 | /** |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index d0e6cf3b201c..49a40fbc806b 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <net/net_namespace.h> | 12 | #include <net/net_namespace.h> |
13 | 13 | ||
14 | extern struct files_struct init_files; | 14 | extern struct files_struct init_files; |
15 | extern struct fs_struct init_fs; | ||
15 | 16 | ||
16 | #define INIT_KIOCTX(name, which_mm) \ | 17 | #define INIT_KIOCTX(name, which_mm) \ |
17 | { \ | 18 | { \ |
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 3d017cfd245b..c4f6c101dbcd 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h | |||
@@ -23,8 +23,6 @@ | |||
23 | #define _INTEL_IOMMU_H_ | 23 | #define _INTEL_IOMMU_H_ |
24 | 24 | ||
25 | #include <linux/types.h> | 25 | #include <linux/types.h> |
26 | #include <linux/msi.h> | ||
27 | #include <linux/sysdev.h> | ||
28 | #include <linux/iova.h> | 26 | #include <linux/iova.h> |
29 | #include <linux/io.h> | 27 | #include <linux/io.h> |
30 | #include <linux/dma_remapping.h> | 28 | #include <linux/dma_remapping.h> |
@@ -289,10 +287,10 @@ struct intel_iommu { | |||
289 | void __iomem *reg; /* Pointer to hardware regs, virtual addr */ | 287 | void __iomem *reg; /* Pointer to hardware regs, virtual addr */ |
290 | u64 cap; | 288 | u64 cap; |
291 | u64 ecap; | 289 | u64 ecap; |
292 | int seg; | ||
293 | u32 gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */ | 290 | u32 gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */ |
294 | spinlock_t register_lock; /* protect register handling */ | 291 | spinlock_t register_lock; /* protect register handling */ |
295 | int seq_id; /* sequence id of the iommu */ | 292 | int seq_id; /* sequence id of the iommu */ |
293 | int agaw; /* agaw of this iommu */ | ||
296 | 294 | ||
297 | #ifdef CONFIG_DMAR | 295 | #ifdef CONFIG_DMAR |
298 | unsigned long *domain_ids; /* bitmap of domains */ | 296 | unsigned long *domain_ids; /* bitmap of domains */ |
@@ -302,8 +300,6 @@ struct intel_iommu { | |||
302 | 300 | ||
303 | unsigned int irq; | 301 | unsigned int irq; |
304 | unsigned char name[7]; /* Device Name */ | 302 | unsigned char name[7]; /* Device Name */ |
305 | struct msi_msg saved_msg; | ||
306 | struct sys_device sysdev; | ||
307 | struct iommu_flush flush; | 303 | struct iommu_flush flush; |
308 | #endif | 304 | #endif |
309 | struct q_inval *qi; /* Queued invalidation info */ | 305 | struct q_inval *qi; /* Queued invalidation info */ |
@@ -334,25 +330,6 @@ extern int qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr, | |||
334 | 330 | ||
335 | extern void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu); | 331 | extern void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu); |
336 | 332 | ||
337 | void intel_iommu_domain_exit(struct dmar_domain *domain); | ||
338 | struct dmar_domain *intel_iommu_domain_alloc(struct pci_dev *pdev); | ||
339 | int intel_iommu_context_mapping(struct dmar_domain *domain, | ||
340 | struct pci_dev *pdev); | ||
341 | int intel_iommu_page_mapping(struct dmar_domain *domain, dma_addr_t iova, | ||
342 | u64 hpa, size_t size, int prot); | ||
343 | void intel_iommu_detach_dev(struct dmar_domain *domain, u8 bus, u8 devfn); | ||
344 | struct dmar_domain *intel_iommu_find_domain(struct pci_dev *pdev); | ||
345 | u64 intel_iommu_iova_to_pfn(struct dmar_domain *domain, u64 iova); | ||
346 | |||
347 | #ifdef CONFIG_DMAR | ||
348 | int intel_iommu_found(void); | ||
349 | #else /* CONFIG_DMAR */ | ||
350 | static inline int intel_iommu_found(void) | ||
351 | { | ||
352 | return 0; | ||
353 | } | ||
354 | #endif /* CONFIG_DMAR */ | ||
355 | |||
356 | extern void *intel_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t); | 333 | extern void *intel_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t); |
357 | extern void intel_free_coherent(struct device *, size_t, void *, dma_addr_t); | 334 | extern void intel_free_coherent(struct device *, size_t, void *, dma_addr_t); |
358 | extern dma_addr_t intel_map_single(struct device *, phys_addr_t, size_t, int); | 335 | extern dma_addr_t intel_map_single(struct device *, phys_addr_t, size_t, int); |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index f58a0cf8929a..9127f6b51a39 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/irqflags.h> | 14 | #include <linux/irqflags.h> |
15 | #include <linux/smp.h> | 15 | #include <linux/smp.h> |
16 | #include <linux/percpu.h> | 16 | #include <linux/percpu.h> |
17 | |||
17 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
18 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
19 | #include <asm/system.h> | 20 | #include <asm/system.h> |
@@ -107,15 +108,15 @@ extern void enable_irq(unsigned int irq); | |||
107 | 108 | ||
108 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS) | 109 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS) |
109 | 110 | ||
110 | extern cpumask_t irq_default_affinity; | 111 | extern cpumask_var_t irq_default_affinity; |
111 | 112 | ||
112 | extern int irq_set_affinity(unsigned int irq, cpumask_t cpumask); | 113 | extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask); |
113 | extern int irq_can_set_affinity(unsigned int irq); | 114 | extern int irq_can_set_affinity(unsigned int irq); |
114 | extern int irq_select_affinity(unsigned int irq); | 115 | extern int irq_select_affinity(unsigned int irq); |
115 | 116 | ||
116 | #else /* CONFIG_SMP */ | 117 | #else /* CONFIG_SMP */ |
117 | 118 | ||
118 | static inline int irq_set_affinity(unsigned int irq, cpumask_t cpumask) | 119 | static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m) |
119 | { | 120 | { |
120 | return -EINVAL; | 121 | return -EINVAL; |
121 | } | 122 | } |
@@ -251,10 +252,8 @@ enum | |||
251 | BLOCK_SOFTIRQ, | 252 | BLOCK_SOFTIRQ, |
252 | TASKLET_SOFTIRQ, | 253 | TASKLET_SOFTIRQ, |
253 | SCHED_SOFTIRQ, | 254 | SCHED_SOFTIRQ, |
254 | #ifdef CONFIG_HIGH_RES_TIMERS | ||
255 | HRTIMER_SOFTIRQ, | 255 | HRTIMER_SOFTIRQ, |
256 | #endif | 256 | RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ |
257 | RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ | ||
258 | 257 | ||
259 | NR_SOFTIRQS | 258 | NR_SOFTIRQS |
260 | }; | 259 | }; |
@@ -465,4 +464,10 @@ static inline void init_irq_proc(void) | |||
465 | 464 | ||
466 | int show_interrupts(struct seq_file *p, void *v); | 465 | int show_interrupts(struct seq_file *p, void *v); |
467 | 466 | ||
467 | struct irq_desc; | ||
468 | |||
469 | extern int early_irq_init(void); | ||
470 | extern int arch_early_irq_init(void); | ||
471 | extern int arch_init_chip_data(struct irq_desc *desc, int cpu); | ||
472 | |||
468 | #endif | 473 | #endif |
diff --git a/include/linux/iommu.h b/include/linux/iommu.h new file mode 100644 index 000000000000..8a7bfb1b6ca0 --- /dev/null +++ b/include/linux/iommu.h | |||
@@ -0,0 +1,112 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2008 Advanced Micro Devices, Inc. | ||
3 | * Author: Joerg Roedel <joerg.roedel@amd.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License version 2 as published | ||
7 | * by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | |||
19 | #ifndef __LINUX_IOMMU_H | ||
20 | #define __LINUX_IOMMU_H | ||
21 | |||
22 | #define IOMMU_READ (1) | ||
23 | #define IOMMU_WRITE (2) | ||
24 | |||
25 | struct device; | ||
26 | |||
27 | struct iommu_domain { | ||
28 | void *priv; | ||
29 | }; | ||
30 | |||
31 | struct iommu_ops { | ||
32 | int (*domain_init)(struct iommu_domain *domain); | ||
33 | void (*domain_destroy)(struct iommu_domain *domain); | ||
34 | int (*attach_dev)(struct iommu_domain *domain, struct device *dev); | ||
35 | void (*detach_dev)(struct iommu_domain *domain, struct device *dev); | ||
36 | int (*map)(struct iommu_domain *domain, unsigned long iova, | ||
37 | phys_addr_t paddr, size_t size, int prot); | ||
38 | void (*unmap)(struct iommu_domain *domain, unsigned long iova, | ||
39 | size_t size); | ||
40 | phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, | ||
41 | unsigned long iova); | ||
42 | }; | ||
43 | |||
44 | #ifdef CONFIG_IOMMU_API | ||
45 | |||
46 | extern void register_iommu(struct iommu_ops *ops); | ||
47 | extern bool iommu_found(void); | ||
48 | extern struct iommu_domain *iommu_domain_alloc(void); | ||
49 | extern void iommu_domain_free(struct iommu_domain *domain); | ||
50 | extern int iommu_attach_device(struct iommu_domain *domain, | ||
51 | struct device *dev); | ||
52 | extern void iommu_detach_device(struct iommu_domain *domain, | ||
53 | struct device *dev); | ||
54 | extern int iommu_map_range(struct iommu_domain *domain, unsigned long iova, | ||
55 | phys_addr_t paddr, size_t size, int prot); | ||
56 | extern void iommu_unmap_range(struct iommu_domain *domain, unsigned long iova, | ||
57 | size_t size); | ||
58 | extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, | ||
59 | unsigned long iova); | ||
60 | |||
61 | #else /* CONFIG_IOMMU_API */ | ||
62 | |||
63 | static inline void register_iommu(struct iommu_ops *ops) | ||
64 | { | ||
65 | } | ||
66 | |||
67 | static inline bool iommu_found(void) | ||
68 | { | ||
69 | return false; | ||
70 | } | ||
71 | |||
72 | static inline struct iommu_domain *iommu_domain_alloc(void) | ||
73 | { | ||
74 | return NULL; | ||
75 | } | ||
76 | |||
77 | static inline void iommu_domain_free(struct iommu_domain *domain) | ||
78 | { | ||
79 | } | ||
80 | |||
81 | static inline int iommu_attach_device(struct iommu_domain *domain, | ||
82 | struct device *dev) | ||
83 | { | ||
84 | return -ENODEV; | ||
85 | } | ||
86 | |||
87 | static inline void iommu_detach_device(struct iommu_domain *domain, | ||
88 | struct device *dev) | ||
89 | { | ||
90 | } | ||
91 | |||
92 | static inline int iommu_map_range(struct iommu_domain *domain, | ||
93 | unsigned long iova, phys_addr_t paddr, | ||
94 | size_t size, int prot) | ||
95 | { | ||
96 | return -ENODEV; | ||
97 | } | ||
98 | |||
99 | static inline void iommu_unmap_range(struct iommu_domain *domain, | ||
100 | unsigned long iova, size_t size) | ||
101 | { | ||
102 | } | ||
103 | |||
104 | static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, | ||
105 | unsigned long iova) | ||
106 | { | ||
107 | return 0; | ||
108 | } | ||
109 | |||
110 | #endif /* CONFIG_IOMMU_API */ | ||
111 | |||
112 | #endif /* __LINUX_IOMMU_H */ | ||
diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 041e95aac2bf..f6bb2ca8e3ba 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h | |||
@@ -49,6 +49,7 @@ struct resource_list { | |||
49 | #define IORESOURCE_SIZEALIGN 0x00020000 /* size indicates alignment */ | 49 | #define IORESOURCE_SIZEALIGN 0x00020000 /* size indicates alignment */ |
50 | #define IORESOURCE_STARTALIGN 0x00040000 /* start field is alignment */ | 50 | #define IORESOURCE_STARTALIGN 0x00040000 /* start field is alignment */ |
51 | 51 | ||
52 | #define IORESOURCE_EXCLUSIVE 0x08000000 /* Userland may not map this resource */ | ||
52 | #define IORESOURCE_DISABLED 0x10000000 | 53 | #define IORESOURCE_DISABLED 0x10000000 |
53 | #define IORESOURCE_UNSET 0x20000000 | 54 | #define IORESOURCE_UNSET 0x20000000 |
54 | #define IORESOURCE_AUTO 0x40000000 | 55 | #define IORESOURCE_AUTO 0x40000000 |
@@ -133,13 +134,16 @@ static inline unsigned long resource_type(struct resource *res) | |||
133 | } | 134 | } |
134 | 135 | ||
135 | /* Convenience shorthand with allocation */ | 136 | /* Convenience shorthand with allocation */ |
136 | #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name)) | 137 | #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0) |
137 | #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name)) | 138 | #define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl) |
139 | #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0) | ||
140 | #define request_mem_region_exclusive(start,n,name) \ | ||
141 | __request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE) | ||
138 | #define rename_region(region, newname) do { (region)->name = (newname); } while (0) | 142 | #define rename_region(region, newname) do { (region)->name = (newname); } while (0) |
139 | 143 | ||
140 | extern struct resource * __request_region(struct resource *, | 144 | extern struct resource * __request_region(struct resource *, |
141 | resource_size_t start, | 145 | resource_size_t start, |
142 | resource_size_t n, const char *name); | 146 | resource_size_t n, const char *name, int relaxed); |
143 | 147 | ||
144 | /* Compatibility cruft */ | 148 | /* Compatibility cruft */ |
145 | #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) | 149 | #define release_region(start,n) __release_region(&ioport_resource, (start), (n)) |
@@ -175,6 +179,7 @@ extern struct resource * __devm_request_region(struct device *dev, | |||
175 | extern void __devm_release_region(struct device *dev, struct resource *parent, | 179 | extern void __devm_release_region(struct device *dev, struct resource *parent, |
176 | resource_size_t start, resource_size_t n); | 180 | resource_size_t start, resource_size_t n); |
177 | extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size); | 181 | extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size); |
182 | extern int iomem_is_exclusive(u64 addr); | ||
178 | 183 | ||
179 | #endif /* __ASSEMBLY__ */ | 184 | #endif /* __ASSEMBLY__ */ |
180 | #endif /* _LINUX_IOPORT_H */ | 185 | #endif /* _LINUX_IOPORT_H */ |
diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h index f98a656b17e5..76dad4808847 100644 --- a/include/linux/ioprio.h +++ b/include/linux/ioprio.h | |||
@@ -86,4 +86,6 @@ static inline int task_nice_ioclass(struct task_struct *task) | |||
86 | */ | 86 | */ |
87 | extern int ioprio_best(unsigned short aprio, unsigned short bprio); | 87 | extern int ioprio_best(unsigned short aprio, unsigned short bprio); |
88 | 88 | ||
89 | extern int set_task_ioprio(struct task_struct *task, int ioprio); | ||
90 | |||
89 | #endif | 91 | #endif |
diff --git a/include/linux/irq.h b/include/linux/irq.h index 3dddfa703ebd..f899b502f186 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -113,7 +113,8 @@ struct irq_chip { | |||
113 | void (*eoi)(unsigned int irq); | 113 | void (*eoi)(unsigned int irq); |
114 | 114 | ||
115 | void (*end)(unsigned int irq); | 115 | void (*end)(unsigned int irq); |
116 | void (*set_affinity)(unsigned int irq, cpumask_t dest); | 116 | void (*set_affinity)(unsigned int irq, |
117 | const struct cpumask *dest); | ||
117 | int (*retrigger)(unsigned int irq); | 118 | int (*retrigger)(unsigned int irq); |
118 | int (*set_type)(unsigned int irq, unsigned int flow_type); | 119 | int (*set_type)(unsigned int irq, unsigned int flow_type); |
119 | int (*set_wake)(unsigned int irq, unsigned int on); | 120 | int (*set_wake)(unsigned int irq, unsigned int on); |
@@ -129,9 +130,14 @@ struct irq_chip { | |||
129 | const char *typename; | 130 | const char *typename; |
130 | }; | 131 | }; |
131 | 132 | ||
133 | struct timer_rand_state; | ||
134 | struct irq_2_iommu; | ||
132 | /** | 135 | /** |
133 | * struct irq_desc - interrupt descriptor | 136 | * struct irq_desc - interrupt descriptor |
134 | * @irq: interrupt number for this descriptor | 137 | * @irq: interrupt number for this descriptor |
138 | * @timer_rand_state: pointer to timer rand state struct | ||
139 | * @kstat_irqs: irq stats per cpu | ||
140 | * @irq_2_iommu: iommu with this irq | ||
135 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | 141 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] |
136 | * @chip: low level interrupt hardware access | 142 | * @chip: low level interrupt hardware access |
137 | * @msi_desc: MSI descriptor | 143 | * @msi_desc: MSI descriptor |
@@ -143,8 +149,8 @@ struct irq_chip { | |||
143 | * @depth: disable-depth, for nested irq_disable() calls | 149 | * @depth: disable-depth, for nested irq_disable() calls |
144 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | 150 | * @wake_depth: enable depth, for multiple set_irq_wake() callers |
145 | * @irq_count: stats field to detect stalled irqs | 151 | * @irq_count: stats field to detect stalled irqs |
146 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
147 | * @last_unhandled: aging timer for unhandled count | 152 | * @last_unhandled: aging timer for unhandled count |
153 | * @irqs_unhandled: stats field for spurious unhandled interrupts | ||
148 | * @lock: locking for SMP | 154 | * @lock: locking for SMP |
149 | * @affinity: IRQ affinity on SMP | 155 | * @affinity: IRQ affinity on SMP |
150 | * @cpu: cpu index useful for balancing | 156 | * @cpu: cpu index useful for balancing |
@@ -154,6 +160,13 @@ struct irq_chip { | |||
154 | */ | 160 | */ |
155 | struct irq_desc { | 161 | struct irq_desc { |
156 | unsigned int irq; | 162 | unsigned int irq; |
163 | #ifdef CONFIG_SPARSE_IRQ | ||
164 | struct timer_rand_state *timer_rand_state; | ||
165 | unsigned int *kstat_irqs; | ||
166 | # ifdef CONFIG_INTR_REMAP | ||
167 | struct irq_2_iommu *irq_2_iommu; | ||
168 | # endif | ||
169 | #endif | ||
157 | irq_flow_handler_t handle_irq; | 170 | irq_flow_handler_t handle_irq; |
158 | struct irq_chip *chip; | 171 | struct irq_chip *chip; |
159 | struct msi_desc *msi_desc; | 172 | struct msi_desc *msi_desc; |
@@ -165,8 +178,8 @@ struct irq_desc { | |||
165 | unsigned int depth; /* nested irq disables */ | 178 | unsigned int depth; /* nested irq disables */ |
166 | unsigned int wake_depth; /* nested wake enables */ | 179 | unsigned int wake_depth; /* nested wake enables */ |
167 | unsigned int irq_count; /* For detecting broken IRQs */ | 180 | unsigned int irq_count; /* For detecting broken IRQs */ |
168 | unsigned int irqs_unhandled; | ||
169 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | 181 | unsigned long last_unhandled; /* Aging timer for unhandled count */ |
182 | unsigned int irqs_unhandled; | ||
170 | spinlock_t lock; | 183 | spinlock_t lock; |
171 | #ifdef CONFIG_SMP | 184 | #ifdef CONFIG_SMP |
172 | cpumask_t affinity; | 185 | cpumask_t affinity; |
@@ -181,12 +194,32 @@ struct irq_desc { | |||
181 | const char *name; | 194 | const char *name; |
182 | } ____cacheline_internodealigned_in_smp; | 195 | } ____cacheline_internodealigned_in_smp; |
183 | 196 | ||
197 | extern void arch_init_copy_chip_data(struct irq_desc *old_desc, | ||
198 | struct irq_desc *desc, int cpu); | ||
199 | extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); | ||
184 | 200 | ||
201 | #ifndef CONFIG_SPARSE_IRQ | ||
185 | extern struct irq_desc irq_desc[NR_IRQS]; | 202 | extern struct irq_desc irq_desc[NR_IRQS]; |
203 | #else /* CONFIG_SPARSE_IRQ */ | ||
204 | extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu); | ||
205 | |||
206 | #define kstat_irqs_this_cpu(DESC) \ | ||
207 | ((DESC)->kstat_irqs[smp_processor_id()]) | ||
208 | #define kstat_incr_irqs_this_cpu(irqno, DESC) \ | ||
209 | ((DESC)->kstat_irqs[smp_processor_id()]++) | ||
186 | 210 | ||
187 | static inline struct irq_desc *irq_to_desc(unsigned int irq) | 211 | #endif /* CONFIG_SPARSE_IRQ */ |
212 | |||
213 | extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); | ||
214 | |||
215 | static inline struct irq_desc * | ||
216 | irq_remap_to_desc(unsigned int irq, struct irq_desc *desc) | ||
188 | { | 217 | { |
189 | return (irq < nr_irqs) ? irq_desc + irq : NULL; | 218 | #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC |
219 | return irq_to_desc(irq); | ||
220 | #else | ||
221 | return desc; | ||
222 | #endif | ||
190 | } | 223 | } |
191 | 224 | ||
192 | /* | 225 | /* |
@@ -380,6 +413,11 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | |||
380 | #define get_irq_data(irq) (irq_to_desc(irq)->handler_data) | 413 | #define get_irq_data(irq) (irq_to_desc(irq)->handler_data) |
381 | #define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc) | 414 | #define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc) |
382 | 415 | ||
416 | #define get_irq_desc_chip(desc) ((desc)->chip) | ||
417 | #define get_irq_desc_chip_data(desc) ((desc)->chip_data) | ||
418 | #define get_irq_desc_data(desc) ((desc)->handler_data) | ||
419 | #define get_irq_desc_msi(desc) ((desc)->msi_desc) | ||
420 | |||
383 | #endif /* CONFIG_GENERIC_HARDIRQS */ | 421 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
384 | 422 | ||
385 | #endif /* !CONFIG_S390 */ | 423 | #endif /* !CONFIG_S390 */ |
diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h index 452c280c8115..86af92e9e84c 100644 --- a/include/linux/irqnr.h +++ b/include/linux/irqnr.h | |||
@@ -1,24 +1,46 @@ | |||
1 | #ifndef _LINUX_IRQNR_H | 1 | #ifndef _LINUX_IRQNR_H |
2 | #define _LINUX_IRQNR_H | 2 | #define _LINUX_IRQNR_H |
3 | 3 | ||
4 | /* | ||
5 | * Generic irq_desc iterators: | ||
6 | */ | ||
7 | #ifdef __KERNEL__ | ||
8 | |||
4 | #ifndef CONFIG_GENERIC_HARDIRQS | 9 | #ifndef CONFIG_GENERIC_HARDIRQS |
5 | #include <asm/irq.h> | 10 | #include <asm/irq.h> |
6 | # define nr_irqs NR_IRQS | 11 | |
12 | /* | ||
13 | * Wrappers for non-genirq architectures: | ||
14 | */ | ||
15 | #define nr_irqs NR_IRQS | ||
16 | #define irq_to_desc(irq) (&irq_desc[irq]) | ||
7 | 17 | ||
8 | # define for_each_irq_desc(irq, desc) \ | 18 | # define for_each_irq_desc(irq, desc) \ |
9 | for (irq = 0; irq < nr_irqs; irq++) | 19 | for (irq = 0; irq < nr_irqs; irq++) |
10 | #else | 20 | |
21 | # define for_each_irq_desc_reverse(irq, desc) \ | ||
22 | for (irq = nr_irqs - 1; irq >= 0; irq--) | ||
23 | #else /* CONFIG_GENERIC_HARDIRQS */ | ||
24 | |||
11 | extern int nr_irqs; | 25 | extern int nr_irqs; |
26 | extern struct irq_desc *irq_to_desc(unsigned int irq); | ||
27 | |||
28 | # define for_each_irq_desc(irq, desc) \ | ||
29 | for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ | ||
30 | irq++, desc = irq_to_desc(irq)) \ | ||
31 | if (desc) | ||
12 | 32 | ||
13 | # define for_each_irq_desc(irq, desc) \ | ||
14 | for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++) | ||
15 | 33 | ||
16 | # define for_each_irq_desc_reverse(irq, desc) \ | 34 | # define for_each_irq_desc_reverse(irq, desc) \ |
17 | for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \ | 35 | for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; \ |
18 | irq >= 0; irq--, desc--) | 36 | irq--, desc = irq_to_desc(irq)) \ |
19 | #endif | 37 | if (desc) |
20 | 38 | ||
21 | #define for_each_irq_nr(irq) \ | 39 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
22 | for (irq = 0; irq < nr_irqs; irq++) | 40 | |
41 | #define for_each_irq_nr(irq) \ | ||
42 | for (irq = 0; irq < nr_irqs; irq++) | ||
43 | |||
44 | #endif /* __KERNEL__ */ | ||
23 | 45 | ||
24 | #endif | 46 | #endif |
diff --git a/include/linux/istallion.h b/include/linux/istallion.h index 0d1840723249..7faca98c7d14 100644 --- a/include/linux/istallion.h +++ b/include/linux/istallion.h | |||
@@ -59,9 +59,7 @@ struct stliport { | |||
59 | unsigned int devnr; | 59 | unsigned int devnr; |
60 | int baud_base; | 60 | int baud_base; |
61 | int custom_divisor; | 61 | int custom_divisor; |
62 | int close_delay; | ||
63 | int closing_wait; | 62 | int closing_wait; |
64 | int openwaitcnt; | ||
65 | int rc; | 63 | int rc; |
66 | int argsize; | 64 | int argsize; |
67 | void *argp; | 65 | void *argp; |
diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 346e2b80be7d..6384b19efe64 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h | |||
@@ -543,6 +543,11 @@ struct transaction_s | |||
543 | unsigned long t_expires; | 543 | unsigned long t_expires; |
544 | 544 | ||
545 | /* | 545 | /* |
546 | * When this transaction started, in nanoseconds [no locking] | ||
547 | */ | ||
548 | ktime_t t_start_time; | ||
549 | |||
550 | /* | ||
546 | * How many handles used this transaction? [t_handle_lock] | 551 | * How many handles used this transaction? [t_handle_lock] |
547 | */ | 552 | */ |
548 | int t_handle_count; | 553 | int t_handle_count; |
@@ -798,9 +803,19 @@ struct journal_s | |||
798 | struct buffer_head **j_wbuf; | 803 | struct buffer_head **j_wbuf; |
799 | int j_wbufsize; | 804 | int j_wbufsize; |
800 | 805 | ||
806 | /* | ||
807 | * this is the pid of the last person to run a synchronous operation | ||
808 | * through the journal. | ||
809 | */ | ||
801 | pid_t j_last_sync_writer; | 810 | pid_t j_last_sync_writer; |
802 | 811 | ||
803 | /* | 812 | /* |
813 | * the average amount of time in nanoseconds it takes to commit a | ||
814 | * transaction to the disk. [j_state_lock] | ||
815 | */ | ||
816 | u64 j_average_commit_time; | ||
817 | |||
818 | /* | ||
804 | * An opaque pointer to fs-private information. ext3 puts its | 819 | * An opaque pointer to fs-private information. ext3 puts its |
805 | * superblock pointer here | 820 | * superblock pointer here |
806 | */ | 821 | */ |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index c7d106ef22e2..b45109c61fba 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
@@ -329,6 +329,7 @@ enum jbd_state_bits { | |||
329 | BH_State, /* Pins most journal_head state */ | 329 | BH_State, /* Pins most journal_head state */ |
330 | BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ | 330 | BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ |
331 | BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */ | 331 | BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */ |
332 | BH_JBDPrivateStart, /* First bit available for private use by FS */ | ||
332 | }; | 333 | }; |
333 | 334 | ||
334 | BUFFER_FNS(JBD, jbd) | 335 | BUFFER_FNS(JBD, jbd) |
@@ -637,6 +638,11 @@ struct transaction_s | |||
637 | unsigned long t_expires; | 638 | unsigned long t_expires; |
638 | 639 | ||
639 | /* | 640 | /* |
641 | * When this transaction started, in nanoseconds [no locking] | ||
642 | */ | ||
643 | ktime_t t_start_time; | ||
644 | |||
645 | /* | ||
640 | * How many handles used this transaction? [t_handle_lock] | 646 | * How many handles used this transaction? [t_handle_lock] |
641 | */ | 647 | */ |
642 | int t_handle_count; | 648 | int t_handle_count; |
@@ -681,6 +687,8 @@ jbd2_time_diff(unsigned long start, unsigned long end) | |||
681 | return end + (MAX_JIFFY_OFFSET - start); | 687 | return end + (MAX_JIFFY_OFFSET - start); |
682 | } | 688 | } |
683 | 689 | ||
690 | #define JBD2_NR_BATCH 64 | ||
691 | |||
684 | /** | 692 | /** |
685 | * struct journal_s - The journal_s type is the concrete type associated with | 693 | * struct journal_s - The journal_s type is the concrete type associated with |
686 | * journal_t. | 694 | * journal_t. |
@@ -825,6 +833,14 @@ struct journal_s | |||
825 | struct mutex j_checkpoint_mutex; | 833 | struct mutex j_checkpoint_mutex; |
826 | 834 | ||
827 | /* | 835 | /* |
836 | * List of buffer heads used by the checkpoint routine. This | ||
837 | * was moved from jbd2_log_do_checkpoint() to reduce stack | ||
838 | * usage. Access to this array is controlled by the | ||
839 | * j_checkpoint_mutex. [j_checkpoint_mutex] | ||
840 | */ | ||
841 | struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH]; | ||
842 | |||
843 | /* | ||
828 | * Journal head: identifies the first unused block in the journal. | 844 | * Journal head: identifies the first unused block in the journal. |
829 | * [j_state_lock] | 845 | * [j_state_lock] |
830 | */ | 846 | */ |
@@ -938,8 +954,26 @@ struct journal_s | |||
938 | struct buffer_head **j_wbuf; | 954 | struct buffer_head **j_wbuf; |
939 | int j_wbufsize; | 955 | int j_wbufsize; |
940 | 956 | ||
957 | /* | ||
958 | * this is the pid of hte last person to run a synchronous operation | ||
959 | * through the journal | ||
960 | */ | ||
941 | pid_t j_last_sync_writer; | 961 | pid_t j_last_sync_writer; |
942 | 962 | ||
963 | /* | ||
964 | * the average amount of time in nanoseconds it takes to commit a | ||
965 | * transaction to disk. [j_state_lock] | ||
966 | */ | ||
967 | u64 j_average_commit_time; | ||
968 | |||
969 | /* | ||
970 | * minimum and maximum times that we should wait for | ||
971 | * additional filesystem operations to get batched into a | ||
972 | * synchronous handle in microseconds | ||
973 | */ | ||
974 | u32 j_min_batch_time; | ||
975 | u32 j_max_batch_time; | ||
976 | |||
943 | /* This function is called when a transaction is closed */ | 977 | /* This function is called when a transaction is closed */ |
944 | void (*j_commit_callback)(journal_t *, | 978 | void (*j_commit_callback)(journal_t *, |
945 | transaction_t *); | 979 | transaction_t *); |
@@ -1007,6 +1041,35 @@ int __jbd2_journal_clean_checkpoint_list(journal_t *journal); | |||
1007 | int __jbd2_journal_remove_checkpoint(struct journal_head *); | 1041 | int __jbd2_journal_remove_checkpoint(struct journal_head *); |
1008 | void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *); | 1042 | void __jbd2_journal_insert_checkpoint(struct journal_head *, transaction_t *); |
1009 | 1043 | ||
1044 | |||
1045 | /* | ||
1046 | * Triggers | ||
1047 | */ | ||
1048 | |||
1049 | struct jbd2_buffer_trigger_type { | ||
1050 | /* | ||
1051 | * Fired just before a buffer is written to the journal. | ||
1052 | * mapped_data is a mapped buffer that is the frozen data for | ||
1053 | * commit. | ||
1054 | */ | ||
1055 | void (*t_commit)(struct jbd2_buffer_trigger_type *type, | ||
1056 | struct buffer_head *bh, void *mapped_data, | ||
1057 | size_t size); | ||
1058 | |||
1059 | /* | ||
1060 | * Fired during journal abort for dirty buffers that will not be | ||
1061 | * committed. | ||
1062 | */ | ||
1063 | void (*t_abort)(struct jbd2_buffer_trigger_type *type, | ||
1064 | struct buffer_head *bh); | ||
1065 | }; | ||
1066 | |||
1067 | extern void jbd2_buffer_commit_trigger(struct journal_head *jh, | ||
1068 | void *mapped_data, | ||
1069 | struct jbd2_buffer_trigger_type *triggers); | ||
1070 | extern void jbd2_buffer_abort_trigger(struct journal_head *jh, | ||
1071 | struct jbd2_buffer_trigger_type *triggers); | ||
1072 | |||
1010 | /* Buffer IO */ | 1073 | /* Buffer IO */ |
1011 | extern int | 1074 | extern int |
1012 | jbd2_journal_write_metadata_buffer(transaction_t *transaction, | 1075 | jbd2_journal_write_metadata_buffer(transaction_t *transaction, |
@@ -1045,6 +1108,8 @@ extern int jbd2_journal_extend (handle_t *, int nblocks); | |||
1045 | extern int jbd2_journal_get_write_access(handle_t *, struct buffer_head *); | 1108 | extern int jbd2_journal_get_write_access(handle_t *, struct buffer_head *); |
1046 | extern int jbd2_journal_get_create_access (handle_t *, struct buffer_head *); | 1109 | extern int jbd2_journal_get_create_access (handle_t *, struct buffer_head *); |
1047 | extern int jbd2_journal_get_undo_access(handle_t *, struct buffer_head *); | 1110 | extern int jbd2_journal_get_undo_access(handle_t *, struct buffer_head *); |
1111 | void jbd2_journal_set_triggers(struct buffer_head *, | ||
1112 | struct jbd2_buffer_trigger_type *type); | ||
1048 | extern int jbd2_journal_dirty_metadata (handle_t *, struct buffer_head *); | 1113 | extern int jbd2_journal_dirty_metadata (handle_t *, struct buffer_head *); |
1049 | extern void jbd2_journal_release_buffer (handle_t *, struct buffer_head *); | 1114 | extern void jbd2_journal_release_buffer (handle_t *, struct buffer_head *); |
1050 | extern int jbd2_journal_forget (handle_t *, struct buffer_head *); | 1115 | extern int jbd2_journal_forget (handle_t *, struct buffer_head *); |
@@ -1070,7 +1135,6 @@ extern int jbd2_journal_set_features | |||
1070 | (journal_t *, unsigned long, unsigned long, unsigned long); | 1135 | (journal_t *, unsigned long, unsigned long, unsigned long); |
1071 | extern void jbd2_journal_clear_features | 1136 | extern void jbd2_journal_clear_features |
1072 | (journal_t *, unsigned long, unsigned long, unsigned long); | 1137 | (journal_t *, unsigned long, unsigned long, unsigned long); |
1073 | extern int jbd2_journal_create (journal_t *); | ||
1074 | extern int jbd2_journal_load (journal_t *journal); | 1138 | extern int jbd2_journal_load (journal_t *journal); |
1075 | extern int jbd2_journal_destroy (journal_t *); | 1139 | extern int jbd2_journal_destroy (journal_t *); |
1076 | extern int jbd2_journal_recover (journal_t *journal); | 1140 | extern int jbd2_journal_recover (journal_t *journal); |
@@ -1145,8 +1209,8 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid); | |||
1145 | int jbd2_log_do_checkpoint(journal_t *journal); | 1209 | int jbd2_log_do_checkpoint(journal_t *journal); |
1146 | 1210 | ||
1147 | void __jbd2_log_wait_for_space(journal_t *journal); | 1211 | void __jbd2_log_wait_for_space(journal_t *journal); |
1148 | extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *); | 1212 | extern void __jbd2_journal_drop_transaction(journal_t *, transaction_t *); |
1149 | extern int jbd2_cleanup_journal_tail(journal_t *); | 1213 | extern int jbd2_cleanup_journal_tail(journal_t *); |
1150 | 1214 | ||
1151 | /* Debugging code only: */ | 1215 | /* Debugging code only: */ |
1152 | 1216 | ||
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index abb6ac639e8e..1a9cf78bfce5 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h | |||
@@ -115,10 +115,20 @@ static inline u64 get_jiffies_64(void) | |||
115 | ((long)(a) - (long)(b) >= 0)) | 115 | ((long)(a) - (long)(b) >= 0)) |
116 | #define time_before_eq(a,b) time_after_eq(b,a) | 116 | #define time_before_eq(a,b) time_after_eq(b,a) |
117 | 117 | ||
118 | /* | ||
119 | * Calculate whether a is in the range of [b, c]. | ||
120 | */ | ||
118 | #define time_in_range(a,b,c) \ | 121 | #define time_in_range(a,b,c) \ |
119 | (time_after_eq(a,b) && \ | 122 | (time_after_eq(a,b) && \ |
120 | time_before_eq(a,c)) | 123 | time_before_eq(a,c)) |
121 | 124 | ||
125 | /* | ||
126 | * Calculate whether a is in the range of [b, c). | ||
127 | */ | ||
128 | #define time_in_range_open(a,b,c) \ | ||
129 | (time_after_eq(a,b) && \ | ||
130 | time_before(a,c)) | ||
131 | |||
122 | /* Same as above, but does so with platform independent 64bit types. | 132 | /* Same as above, but does so with platform independent 64bit types. |
123 | * These must be used when utilizing jiffies_64 (i.e. return value of | 133 | * These must be used when utilizing jiffies_64 (i.e. return value of |
124 | * get_jiffies_64() */ | 134 | * get_jiffies_64() */ |
diff --git a/include/linux/journal-head.h b/include/linux/journal-head.h index bb70ebb6a2d5..525aac3c97df 100644 --- a/include/linux/journal-head.h +++ b/include/linux/journal-head.h | |||
@@ -12,6 +12,8 @@ | |||
12 | 12 | ||
13 | typedef unsigned int tid_t; /* Unique transaction ID */ | 13 | typedef unsigned int tid_t; /* Unique transaction ID */ |
14 | typedef struct transaction_s transaction_t; /* Compound transaction type */ | 14 | typedef struct transaction_s transaction_t; /* Compound transaction type */ |
15 | |||
16 | |||
15 | struct buffer_head; | 17 | struct buffer_head; |
16 | 18 | ||
17 | struct journal_head { | 19 | struct journal_head { |
@@ -87,6 +89,12 @@ struct journal_head { | |||
87 | * [j_list_lock] | 89 | * [j_list_lock] |
88 | */ | 90 | */ |
89 | struct journal_head *b_cpnext, *b_cpprev; | 91 | struct journal_head *b_cpnext, *b_cpprev; |
92 | |||
93 | /* Trigger type */ | ||
94 | struct jbd2_buffer_trigger_type *b_triggers; | ||
95 | |||
96 | /* Trigger type for the committing transaction's frozen data */ | ||
97 | struct jbd2_buffer_trigger_type *b_frozen_triggers; | ||
90 | }; | 98 | }; |
91 | 99 | ||
92 | #endif /* JOURNAL_HEAD_H_INCLUDED */ | 100 | #endif /* JOURNAL_HEAD_H_INCLUDED */ |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 6002ae76785c..343df9ef2412 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -48,6 +48,12 @@ extern const char linux_proc_banner[]; | |||
48 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | 48 | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) |
49 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 49 | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
50 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | 50 | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) |
51 | #define DIV_ROUND_CLOSEST(x, divisor)( \ | ||
52 | { \ | ||
53 | typeof(divisor) __divisor = divisor; \ | ||
54 | (((x) + ((__divisor) / 2)) / (__divisor)); \ | ||
55 | } \ | ||
56 | ) | ||
51 | 57 | ||
52 | #define _RET_IP_ (unsigned long)__builtin_return_address(0) | 58 | #define _RET_IP_ (unsigned long)__builtin_return_address(0) |
53 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) | 59 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) |
@@ -141,6 +147,15 @@ extern int _cond_resched(void); | |||
141 | (__x < 0) ? -__x : __x; \ | 147 | (__x < 0) ? -__x : __x; \ |
142 | }) | 148 | }) |
143 | 149 | ||
150 | #ifdef CONFIG_PROVE_LOCKING | ||
151 | void might_fault(void); | ||
152 | #else | ||
153 | static inline void might_fault(void) | ||
154 | { | ||
155 | might_sleep(); | ||
156 | } | ||
157 | #endif | ||
158 | |||
144 | extern struct atomic_notifier_head panic_notifier_list; | 159 | extern struct atomic_notifier_head panic_notifier_list; |
145 | extern long (*panic_blink)(long time); | 160 | extern long (*panic_blink)(long time); |
146 | NORET_TYPE void panic(const char * fmt, ...) | 161 | NORET_TYPE void panic(const char * fmt, ...) |
@@ -188,6 +203,8 @@ extern unsigned long long memparse(const char *ptr, char **retptr); | |||
188 | extern int core_kernel_text(unsigned long addr); | 203 | extern int core_kernel_text(unsigned long addr); |
189 | extern int __kernel_text_address(unsigned long addr); | 204 | extern int __kernel_text_address(unsigned long addr); |
190 | extern int kernel_text_address(unsigned long addr); | 205 | extern int kernel_text_address(unsigned long addr); |
206 | extern int func_ptr_is_kernel_text(void *ptr); | ||
207 | |||
191 | struct pid; | 208 | struct pid; |
192 | extern struct pid *session_of_pgrp(struct pid *pgrp); | 209 | extern struct pid *session_of_pgrp(struct pid *pgrp); |
193 | 210 | ||
@@ -338,13 +355,13 @@ static inline char *pack_hex_byte(char *buf, u8 byte) | |||
338 | printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) | 355 | printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) |
339 | 356 | ||
340 | /* If you are writing a driver, please use dev_dbg instead */ | 357 | /* If you are writing a driver, please use dev_dbg instead */ |
341 | #if defined(CONFIG_DYNAMIC_PRINTK_DEBUG) | 358 | #if defined(DEBUG) |
359 | #define pr_debug(fmt, ...) \ | ||
360 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
361 | #elif defined(CONFIG_DYNAMIC_PRINTK_DEBUG) | ||
342 | #define pr_debug(fmt, ...) do { \ | 362 | #define pr_debug(fmt, ...) do { \ |
343 | dynamic_pr_debug(pr_fmt(fmt), ##__VA_ARGS__); \ | 363 | dynamic_pr_debug(pr_fmt(fmt), ##__VA_ARGS__); \ |
344 | } while (0) | 364 | } while (0) |
345 | #elif defined(DEBUG) | ||
346 | #define pr_debug(fmt, ...) \ | ||
347 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) | ||
348 | #else | 365 | #else |
349 | #define pr_debug(fmt, ...) \ | 366 | #define pr_debug(fmt, ...) \ |
350 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) | 367 | ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; }) |
@@ -459,6 +476,12 @@ static inline char *pack_hex_byte(char *buf, u8 byte) | |||
459 | __val = __val < __min ? __min: __val; \ | 476 | __val = __val < __min ? __min: __val; \ |
460 | __val > __max ? __max: __val; }) | 477 | __val > __max ? __max: __val; }) |
461 | 478 | ||
479 | |||
480 | /* | ||
481 | * swap - swap value of @a and @b | ||
482 | */ | ||
483 | #define swap(a, b) ({ typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; }) | ||
484 | |||
462 | /** | 485 | /** |
463 | * container_of - cast a member of a structure out to the containing structure | 486 | * container_of - cast a member of a structure out to the containing structure |
464 | * @ptr: the pointer to the member. | 487 | * @ptr: the pointer to the member. |
diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 1b2e3242497c..ecfa66817634 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h | |||
@@ -28,7 +28,9 @@ struct cpu_usage_stat { | |||
28 | 28 | ||
29 | struct kernel_stat { | 29 | struct kernel_stat { |
30 | struct cpu_usage_stat cpustat; | 30 | struct cpu_usage_stat cpustat; |
31 | unsigned int irqs[NR_IRQS]; | 31 | #ifndef CONFIG_SPARSE_IRQ |
32 | unsigned int irqs[NR_IRQS]; | ||
33 | #endif | ||
32 | }; | 34 | }; |
33 | 35 | ||
34 | DECLARE_PER_CPU(struct kernel_stat, kstat); | 36 | DECLARE_PER_CPU(struct kernel_stat, kstat); |
@@ -39,6 +41,10 @@ DECLARE_PER_CPU(struct kernel_stat, kstat); | |||
39 | 41 | ||
40 | extern unsigned long long nr_context_switches(void); | 42 | extern unsigned long long nr_context_switches(void); |
41 | 43 | ||
44 | #ifndef CONFIG_SPARSE_IRQ | ||
45 | #define kstat_irqs_this_cpu(irq) \ | ||
46 | (kstat_this_cpu.irqs[irq]) | ||
47 | |||
42 | struct irq_desc; | 48 | struct irq_desc; |
43 | 49 | ||
44 | static inline void kstat_incr_irqs_this_cpu(unsigned int irq, | 50 | static inline void kstat_incr_irqs_this_cpu(unsigned int irq, |
@@ -46,11 +52,17 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq, | |||
46 | { | 52 | { |
47 | kstat_this_cpu.irqs[irq]++; | 53 | kstat_this_cpu.irqs[irq]++; |
48 | } | 54 | } |
55 | #endif | ||
56 | |||
49 | 57 | ||
58 | #ifndef CONFIG_SPARSE_IRQ | ||
50 | static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | 59 | static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) |
51 | { | 60 | { |
52 | return kstat_cpu(cpu).irqs[irq]; | 61 | return kstat_cpu(cpu).irqs[irq]; |
53 | } | 62 | } |
63 | #else | ||
64 | extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu); | ||
65 | #endif | ||
54 | 66 | ||
55 | /* | 67 | /* |
56 | * Number of interrupts per specific IRQ source, since bootup | 68 | * Number of interrupts per specific IRQ source, since bootup |
@@ -75,10 +87,13 @@ extern void curr_rq_unlock_irq_restore(unsigned long *flags); | |||
75 | extern unsigned long long __task_delta_exec(struct task_struct *tsk, int update); | 87 | extern unsigned long long __task_delta_exec(struct task_struct *tsk, int update); |
76 | extern unsigned long long task_delta_exec(struct task_struct *); | 88 | extern unsigned long long task_delta_exec(struct task_struct *); |
77 | 89 | ||
78 | extern void account_user_time(struct task_struct *, cputime_t); | 90 | extern void account_user_time(struct task_struct *, cputime_t, cputime_t); |
79 | extern void account_user_time_scaled(struct task_struct *, cputime_t); | 91 | extern void account_system_time(struct task_struct *, int, cputime_t, cputime_t); |
80 | extern void account_system_time(struct task_struct *, int, cputime_t); | 92 | extern void account_steal_time(cputime_t); |
81 | extern void account_system_time_scaled(struct task_struct *, cputime_t); | 93 | extern void account_idle_time(cputime_t); |
82 | extern void account_steal_time(struct task_struct *, cputime_t); | 94 | |
95 | extern void account_process_tick(struct task_struct *, int user); | ||
96 | extern void account_steal_ticks(unsigned long ticks); | ||
97 | extern void account_idle_ticks(unsigned long ticks); | ||
83 | 98 | ||
84 | #endif /* _LINUX_KERNEL_STAT_H */ | 99 | #endif /* _LINUX_KERNEL_STAT_H */ |
diff --git a/include/linux/klist.h b/include/linux/klist.h index 8ea98db223e5..d5a27af9dba5 100644 --- a/include/linux/klist.h +++ b/include/linux/klist.h | |||
@@ -13,7 +13,6 @@ | |||
13 | #define _LINUX_KLIST_H | 13 | #define _LINUX_KLIST_H |
14 | 14 | ||
15 | #include <linux/spinlock.h> | 15 | #include <linux/spinlock.h> |
16 | #include <linux/completion.h> | ||
17 | #include <linux/kref.h> | 16 | #include <linux/kref.h> |
18 | #include <linux/list.h> | 17 | #include <linux/list.h> |
19 | 18 | ||
@@ -41,7 +40,6 @@ struct klist_node { | |||
41 | void *n_klist; /* never access directly */ | 40 | void *n_klist; /* never access directly */ |
42 | struct list_head n_node; | 41 | struct list_head n_node; |
43 | struct kref n_ref; | 42 | struct kref n_ref; |
44 | struct completion n_removed; | ||
45 | }; | 43 | }; |
46 | 44 | ||
47 | extern void klist_add_tail(struct klist_node *n, struct klist *k); | 45 | extern void klist_add_tail(struct klist_node *n, struct klist *k); |
diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 497b1d1f7a05..d6ea19e314bb 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h | |||
@@ -69,9 +69,6 @@ struct kprobe { | |||
69 | /* list of kprobes for multi-handler support */ | 69 | /* list of kprobes for multi-handler support */ |
70 | struct list_head list; | 70 | struct list_head list; |
71 | 71 | ||
72 | /* Indicates that the corresponding module has been ref counted */ | ||
73 | unsigned int mod_refcounted; | ||
74 | |||
75 | /*count the number of times this probe was temporarily disarmed */ | 72 | /*count the number of times this probe was temporarily disarmed */ |
76 | unsigned long nmissed; | 73 | unsigned long nmissed; |
77 | 74 | ||
@@ -103,8 +100,19 @@ struct kprobe { | |||
103 | 100 | ||
104 | /* copy of the original instruction */ | 101 | /* copy of the original instruction */ |
105 | struct arch_specific_insn ainsn; | 102 | struct arch_specific_insn ainsn; |
103 | |||
104 | /* Indicates various status flags. Protected by kprobe_mutex. */ | ||
105 | u32 flags; | ||
106 | }; | 106 | }; |
107 | 107 | ||
108 | /* Kprobe status flags */ | ||
109 | #define KPROBE_FLAG_GONE 1 /* breakpoint has already gone */ | ||
110 | |||
111 | static inline int kprobe_gone(struct kprobe *p) | ||
112 | { | ||
113 | return p->flags & KPROBE_FLAG_GONE; | ||
114 | } | ||
115 | |||
108 | /* | 116 | /* |
109 | * Special probe type that uses setjmp-longjmp type tricks to resume | 117 | * Special probe type that uses setjmp-longjmp type tricks to resume |
110 | * execution at a specified entry with a matching prototype corresponding | 118 | * execution at a specified entry with a matching prototype corresponding |
@@ -201,7 +209,6 @@ static inline int init_test_probes(void) | |||
201 | } | 209 | } |
202 | #endif /* CONFIG_KPROBES_SANITY_TEST */ | 210 | #endif /* CONFIG_KPROBES_SANITY_TEST */ |
203 | 211 | ||
204 | extern struct mutex kprobe_mutex; | ||
205 | extern int arch_prepare_kprobe(struct kprobe *p); | 212 | extern int arch_prepare_kprobe(struct kprobe *p); |
206 | extern void arch_arm_kprobe(struct kprobe *p); | 213 | extern void arch_arm_kprobe(struct kprobe *p); |
207 | extern void arch_disarm_kprobe(struct kprobe *p); | 214 | extern void arch_disarm_kprobe(struct kprobe *p); |
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index f18b86fa8655..35525ac63337 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -83,6 +83,7 @@ struct kvm_irqchip { | |||
83 | #define KVM_EXIT_S390_SIEIC 13 | 83 | #define KVM_EXIT_S390_SIEIC 13 |
84 | #define KVM_EXIT_S390_RESET 14 | 84 | #define KVM_EXIT_S390_RESET 14 |
85 | #define KVM_EXIT_DCR 15 | 85 | #define KVM_EXIT_DCR 15 |
86 | #define KVM_EXIT_NMI 16 | ||
86 | 87 | ||
87 | /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ | 88 | /* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ |
88 | struct kvm_run { | 89 | struct kvm_run { |
@@ -387,6 +388,14 @@ struct kvm_trace_rec { | |||
387 | #define KVM_CAP_DEVICE_ASSIGNMENT 17 | 388 | #define KVM_CAP_DEVICE_ASSIGNMENT 17 |
388 | #endif | 389 | #endif |
389 | #define KVM_CAP_IOMMU 18 | 390 | #define KVM_CAP_IOMMU 18 |
391 | #if defined(CONFIG_X86) | ||
392 | #define KVM_CAP_DEVICE_MSI 20 | ||
393 | #endif | ||
394 | /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */ | ||
395 | #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21 | ||
396 | #if defined(CONFIG_X86) | ||
397 | #define KVM_CAP_USER_NMI 22 | ||
398 | #endif | ||
390 | 399 | ||
391 | /* | 400 | /* |
392 | * ioctls for VM fds | 401 | * ioctls for VM fds |
@@ -458,6 +467,8 @@ struct kvm_trace_rec { | |||
458 | #define KVM_S390_INITIAL_RESET _IO(KVMIO, 0x97) | 467 | #define KVM_S390_INITIAL_RESET _IO(KVMIO, 0x97) |
459 | #define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state) | 468 | #define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state) |
460 | #define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state) | 469 | #define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state) |
470 | /* Available with KVM_CAP_NMI */ | ||
471 | #define KVM_NMI _IO(KVMIO, 0x9a) | ||
461 | 472 | ||
462 | #define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) | 473 | #define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02) |
463 | #define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) | 474 | #define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03) |
@@ -500,10 +511,17 @@ struct kvm_assigned_irq { | |||
500 | __u32 guest_irq; | 511 | __u32 guest_irq; |
501 | __u32 flags; | 512 | __u32 flags; |
502 | union { | 513 | union { |
514 | struct { | ||
515 | __u32 addr_lo; | ||
516 | __u32 addr_hi; | ||
517 | __u32 data; | ||
518 | } guest_msi; | ||
503 | __u32 reserved[12]; | 519 | __u32 reserved[12]; |
504 | }; | 520 | }; |
505 | }; | 521 | }; |
506 | 522 | ||
507 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) | 523 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) |
508 | 524 | ||
525 | #define KVM_DEV_IRQ_ASSIGN_ENABLE_MSI (1 << 0) | ||
526 | |||
509 | #endif | 527 | #endif |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index bb92be2153bc..ec49d0be7f52 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/mm.h> | 16 | #include <linux/mm.h> |
17 | #include <linux/preempt.h> | 17 | #include <linux/preempt.h> |
18 | #include <linux/marker.h> | 18 | #include <linux/marker.h> |
19 | #include <linux/msi.h> | ||
19 | #include <asm/signal.h> | 20 | #include <asm/signal.h> |
20 | 21 | ||
21 | #include <linux/kvm.h> | 22 | #include <linux/kvm.h> |
@@ -306,9 +307,16 @@ struct kvm_assigned_dev_kernel { | |||
306 | int host_busnr; | 307 | int host_busnr; |
307 | int host_devfn; | 308 | int host_devfn; |
308 | int host_irq; | 309 | int host_irq; |
310 | bool host_irq_disabled; | ||
309 | int guest_irq; | 311 | int guest_irq; |
310 | int irq_requested; | 312 | struct msi_msg guest_msi; |
313 | #define KVM_ASSIGNED_DEV_GUEST_INTX (1 << 0) | ||
314 | #define KVM_ASSIGNED_DEV_GUEST_MSI (1 << 1) | ||
315 | #define KVM_ASSIGNED_DEV_HOST_INTX (1 << 8) | ||
316 | #define KVM_ASSIGNED_DEV_HOST_MSI (1 << 9) | ||
317 | unsigned long irq_requested_type; | ||
311 | int irq_source_id; | 318 | int irq_source_id; |
319 | int flags; | ||
312 | struct pci_dev *dev; | 320 | struct pci_dev *dev; |
313 | struct kvm *kvm; | 321 | struct kvm *kvm; |
314 | }; | 322 | }; |
@@ -316,18 +324,20 @@ void kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level); | |||
316 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi); | 324 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi); |
317 | void kvm_register_irq_ack_notifier(struct kvm *kvm, | 325 | void kvm_register_irq_ack_notifier(struct kvm *kvm, |
318 | struct kvm_irq_ack_notifier *kian); | 326 | struct kvm_irq_ack_notifier *kian); |
319 | void kvm_unregister_irq_ack_notifier(struct kvm *kvm, | 327 | void kvm_unregister_irq_ack_notifier(struct kvm_irq_ack_notifier *kian); |
320 | struct kvm_irq_ack_notifier *kian); | ||
321 | int kvm_request_irq_source_id(struct kvm *kvm); | 328 | int kvm_request_irq_source_id(struct kvm *kvm); |
322 | void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); | 329 | void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); |
323 | 330 | ||
324 | #ifdef CONFIG_DMAR | 331 | #ifdef CONFIG_IOMMU_API |
325 | int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn, | 332 | int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn, |
326 | unsigned long npages); | 333 | unsigned long npages); |
327 | int kvm_iommu_map_guest(struct kvm *kvm, | 334 | int kvm_iommu_map_guest(struct kvm *kvm); |
328 | struct kvm_assigned_dev_kernel *assigned_dev); | ||
329 | int kvm_iommu_unmap_guest(struct kvm *kvm); | 335 | int kvm_iommu_unmap_guest(struct kvm *kvm); |
330 | #else /* CONFIG_DMAR */ | 336 | int kvm_assign_device(struct kvm *kvm, |
337 | struct kvm_assigned_dev_kernel *assigned_dev); | ||
338 | int kvm_deassign_device(struct kvm *kvm, | ||
339 | struct kvm_assigned_dev_kernel *assigned_dev); | ||
340 | #else /* CONFIG_IOMMU_API */ | ||
331 | static inline int kvm_iommu_map_pages(struct kvm *kvm, | 341 | static inline int kvm_iommu_map_pages(struct kvm *kvm, |
332 | gfn_t base_gfn, | 342 | gfn_t base_gfn, |
333 | unsigned long npages) | 343 | unsigned long npages) |
@@ -335,9 +345,7 @@ static inline int kvm_iommu_map_pages(struct kvm *kvm, | |||
335 | return 0; | 345 | return 0; |
336 | } | 346 | } |
337 | 347 | ||
338 | static inline int kvm_iommu_map_guest(struct kvm *kvm, | 348 | static inline int kvm_iommu_map_guest(struct kvm *kvm) |
339 | struct kvm_assigned_dev_kernel | ||
340 | *assigned_dev) | ||
341 | { | 349 | { |
342 | return -ENODEV; | 350 | return -ENODEV; |
343 | } | 351 | } |
@@ -346,7 +354,19 @@ static inline int kvm_iommu_unmap_guest(struct kvm *kvm) | |||
346 | { | 354 | { |
347 | return 0; | 355 | return 0; |
348 | } | 356 | } |
349 | #endif /* CONFIG_DMAR */ | 357 | |
358 | static inline int kvm_assign_device(struct kvm *kvm, | ||
359 | struct kvm_assigned_dev_kernel *assigned_dev) | ||
360 | { | ||
361 | return 0; | ||
362 | } | ||
363 | |||
364 | static inline int kvm_deassign_device(struct kvm *kvm, | ||
365 | struct kvm_assigned_dev_kernel *assigned_dev) | ||
366 | { | ||
367 | return 0; | ||
368 | } | ||
369 | #endif /* CONFIG_IOMMU_API */ | ||
350 | 370 | ||
351 | static inline void kvm_guest_enter(void) | 371 | static inline void kvm_guest_enter(void) |
352 | { | 372 | { |
diff --git a/include/linux/leds-pca9532.h b/include/linux/leds-pca9532.h index 81b4207deb95..96eea90f01a8 100644 --- a/include/linux/leds-pca9532.h +++ b/include/linux/leds-pca9532.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define __LINUX_PCA9532_H | 15 | #define __LINUX_PCA9532_H |
16 | 16 | ||
17 | #include <linux/leds.h> | 17 | #include <linux/leds.h> |
18 | #include <linux/workqueue.h> | ||
18 | 19 | ||
19 | enum pca9532_state { | 20 | enum pca9532_state { |
20 | PCA9532_OFF = 0x0, | 21 | PCA9532_OFF = 0x0, |
@@ -31,6 +32,7 @@ struct pca9532_led { | |||
31 | struct i2c_client *client; | 32 | struct i2c_client *client; |
32 | char *name; | 33 | char *name; |
33 | struct led_classdev ldev; | 34 | struct led_classdev ldev; |
35 | struct work_struct work; | ||
34 | enum pca9532_type type; | 36 | enum pca9532_type type; |
35 | enum pca9532_state state; | 37 | enum pca9532_state state; |
36 | }; | 38 | }; |
diff --git a/include/linux/leds.h b/include/linux/leds.h index d3a73f5a48c3..24489da701e3 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h | |||
@@ -32,7 +32,10 @@ struct led_classdev { | |||
32 | int brightness; | 32 | int brightness; |
33 | int flags; | 33 | int flags; |
34 | 34 | ||
35 | /* Lower 16 bits reflect status */ | ||
35 | #define LED_SUSPENDED (1 << 0) | 36 | #define LED_SUSPENDED (1 << 0) |
37 | /* Upper 16 bits reflect control information */ | ||
38 | #define LED_CORE_SUSPENDRESUME (1 << 16) | ||
36 | 39 | ||
37 | /* Set LED brightness level */ | 40 | /* Set LED brightness level */ |
38 | /* Must not sleep, use a workqueue if needed */ | 41 | /* Must not sleep, use a workqueue if needed */ |
@@ -62,7 +65,7 @@ struct led_classdev { | |||
62 | 65 | ||
63 | extern int led_classdev_register(struct device *parent, | 66 | extern int led_classdev_register(struct device *parent, |
64 | struct led_classdev *led_cdev); | 67 | struct led_classdev *led_cdev); |
65 | extern void led_classdev_unregister(struct led_classdev *lcd); | 68 | extern void led_classdev_unregister(struct led_classdev *led_cdev); |
66 | extern void led_classdev_suspend(struct led_classdev *led_cdev); | 69 | extern void led_classdev_suspend(struct led_classdev *led_cdev); |
67 | extern void led_classdev_resume(struct led_classdev *led_cdev); | 70 | extern void led_classdev_resume(struct led_classdev *led_cdev); |
68 | 71 | ||
diff --git a/include/linux/lguest_launcher.h b/include/linux/lguest_launcher.h index e7217dc58f39..a53407a4165c 100644 --- a/include/linux/lguest_launcher.h +++ b/include/linux/lguest_launcher.h | |||
@@ -54,9 +54,13 @@ struct lguest_vqconfig { | |||
54 | /* Write command first word is a request. */ | 54 | /* Write command first word is a request. */ |
55 | enum lguest_req | 55 | enum lguest_req |
56 | { | 56 | { |
57 | LHREQ_INITIALIZE, /* + base, pfnlimit, pgdir, start */ | 57 | LHREQ_INITIALIZE, /* + base, pfnlimit, start */ |
58 | LHREQ_GETDMA, /* No longer used */ | 58 | LHREQ_GETDMA, /* No longer used */ |
59 | LHREQ_IRQ, /* + irq */ | 59 | LHREQ_IRQ, /* + irq */ |
60 | LHREQ_BREAK, /* + on/off flag (on blocks until someone does off) */ | 60 | LHREQ_BREAK, /* + on/off flag (on blocks until someone does off) */ |
61 | }; | 61 | }; |
62 | |||
63 | /* The alignment to use between consumer and producer parts of vring. | ||
64 | * x86 pagesize for historical reasons. */ | ||
65 | #define LGUEST_VRING_ALIGN 4096 | ||
62 | #endif /* _LINUX_LGUEST_LAUNCHER */ | 66 | #endif /* _LINUX_LGUEST_LAUNCHER */ |
diff --git a/include/linux/libata.h b/include/linux/libata.h index ed3f26eb5df1..b6b8a7f3ec66 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -213,10 +213,11 @@ enum { | |||
213 | ATA_PFLAG_FROZEN = (1 << 2), /* port is frozen */ | 213 | ATA_PFLAG_FROZEN = (1 << 2), /* port is frozen */ |
214 | ATA_PFLAG_RECOVERED = (1 << 3), /* recovery action performed */ | 214 | ATA_PFLAG_RECOVERED = (1 << 3), /* recovery action performed */ |
215 | ATA_PFLAG_LOADING = (1 << 4), /* boot/loading probe */ | 215 | ATA_PFLAG_LOADING = (1 << 4), /* boot/loading probe */ |
216 | ATA_PFLAG_UNLOADING = (1 << 5), /* module is unloading */ | ||
217 | ATA_PFLAG_SCSI_HOTPLUG = (1 << 6), /* SCSI hotplug scheduled */ | 216 | ATA_PFLAG_SCSI_HOTPLUG = (1 << 6), /* SCSI hotplug scheduled */ |
218 | ATA_PFLAG_INITIALIZING = (1 << 7), /* being initialized, don't touch */ | 217 | ATA_PFLAG_INITIALIZING = (1 << 7), /* being initialized, don't touch */ |
219 | ATA_PFLAG_RESETTING = (1 << 8), /* reset in progress */ | 218 | ATA_PFLAG_RESETTING = (1 << 8), /* reset in progress */ |
219 | ATA_PFLAG_UNLOADING = (1 << 9), /* driver is being unloaded */ | ||
220 | ATA_PFLAG_UNLOADED = (1 << 10), /* driver is unloaded */ | ||
220 | 221 | ||
221 | ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ | 222 | ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ |
222 | ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ | 223 | ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ |
@@ -238,6 +239,7 @@ enum { | |||
238 | /* host set flags */ | 239 | /* host set flags */ |
239 | ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */ | 240 | ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */ |
240 | ATA_HOST_STARTED = (1 << 1), /* Host started */ | 241 | ATA_HOST_STARTED = (1 << 1), /* Host started */ |
242 | ATA_HOST_PARALLEL_SCAN = (1 << 2), /* Ports on this host can be scanned in parallel */ | ||
241 | 243 | ||
242 | /* bits 24:31 of host->flags are reserved for LLD specific flags */ | 244 | /* bits 24:31 of host->flags are reserved for LLD specific flags */ |
243 | 245 | ||
@@ -1285,26 +1287,62 @@ static inline int ata_link_active(struct ata_link *link) | |||
1285 | return ata_tag_valid(link->active_tag) || link->sactive; | 1287 | return ata_tag_valid(link->active_tag) || link->sactive; |
1286 | } | 1288 | } |
1287 | 1289 | ||
1288 | extern struct ata_link *__ata_port_next_link(struct ata_port *ap, | 1290 | /* |
1289 | struct ata_link *link, | 1291 | * Iterators |
1290 | bool dev_only); | 1292 | * |
1293 | * ATA_LITER_* constants are used to select link iteration mode and | ||
1294 | * ATA_DITER_* device iteration mode. | ||
1295 | * | ||
1296 | * For a custom iteration directly using ata_{link|dev}_next(), if | ||
1297 | * @link or @dev, respectively, is NULL, the first element is | ||
1298 | * returned. @dev and @link can be any valid device or link and the | ||
1299 | * next element according to the iteration mode will be returned. | ||
1300 | * After the last element, NULL is returned. | ||
1301 | */ | ||
1302 | enum ata_link_iter_mode { | ||
1303 | ATA_LITER_EDGE, /* if present, PMP links only; otherwise, | ||
1304 | * host link. no slave link */ | ||
1305 | ATA_LITER_HOST_FIRST, /* host link followed by PMP or slave links */ | ||
1306 | ATA_LITER_PMP_FIRST, /* PMP links followed by host link, | ||
1307 | * slave link still comes after host link */ | ||
1308 | }; | ||
1309 | |||
1310 | enum ata_dev_iter_mode { | ||
1311 | ATA_DITER_ENABLED, | ||
1312 | ATA_DITER_ENABLED_REVERSE, | ||
1313 | ATA_DITER_ALL, | ||
1314 | ATA_DITER_ALL_REVERSE, | ||
1315 | }; | ||
1291 | 1316 | ||
1292 | #define __ata_port_for_each_link(link, ap) \ | 1317 | extern struct ata_link *ata_link_next(struct ata_link *link, |
1293 | for ((link) = __ata_port_next_link((ap), NULL, false); (link); \ | 1318 | struct ata_port *ap, |
1294 | (link) = __ata_port_next_link((ap), (link), false)) | 1319 | enum ata_link_iter_mode mode); |
1295 | 1320 | ||
1296 | #define ata_port_for_each_link(link, ap) \ | 1321 | extern struct ata_device *ata_dev_next(struct ata_device *dev, |
1297 | for ((link) = __ata_port_next_link((ap), NULL, true); (link); \ | 1322 | struct ata_link *link, |
1298 | (link) = __ata_port_next_link((ap), (link), true)) | 1323 | enum ata_dev_iter_mode mode); |
1299 | 1324 | ||
1300 | #define ata_link_for_each_dev(dev, link) \ | 1325 | /* |
1301 | for ((dev) = (link)->device; \ | 1326 | * Shortcut notation for iterations |
1302 | (dev) < (link)->device + ata_link_max_devices(link) || ((dev) = NULL); \ | 1327 | * |
1303 | (dev)++) | 1328 | * ata_for_each_link() iterates over each link of @ap according to |
1329 | * @mode. @link points to the current link in the loop. @link is | ||
1330 | * NULL after loop termination. ata_for_each_dev() works the same way | ||
1331 | * except that it iterates over each device of @link. | ||
1332 | * | ||
1333 | * Note that the mode prefixes ATA_{L|D}ITER_ shouldn't need to be | ||
1334 | * specified when using the following shorthand notations. Only the | ||
1335 | * mode itself (EDGE, HOST_FIRST, ENABLED, etc...) should be | ||
1336 | * specified. This not only increases brevity but also makes it | ||
1337 | * impossible to use ATA_LITER_* for device iteration or vice-versa. | ||
1338 | */ | ||
1339 | #define ata_for_each_link(link, ap, mode) \ | ||
1340 | for ((link) = ata_link_next(NULL, (ap), ATA_LITER_##mode); (link); \ | ||
1341 | (link) = ata_link_next((link), (ap), ATA_LITER_##mode)) | ||
1304 | 1342 | ||
1305 | #define ata_link_for_each_dev_reverse(dev, link) \ | 1343 | #define ata_for_each_dev(dev, link, mode) \ |
1306 | for ((dev) = (link)->device + ata_link_max_devices(link) - 1; \ | 1344 | for ((dev) = ata_dev_next(NULL, (link), ATA_DITER_##mode); (dev); \ |
1307 | (dev) >= (link)->device || ((dev) = NULL); (dev)--) | 1345 | (dev) = ata_dev_next((dev), (link), ATA_DITER_##mode)) |
1308 | 1346 | ||
1309 | /** | 1347 | /** |
1310 | * ata_ncq_enabled - Test whether NCQ is enabled | 1348 | * ata_ncq_enabled - Test whether NCQ is enabled |
@@ -1481,6 +1519,7 @@ extern void sata_pmp_error_handler(struct ata_port *ap); | |||
1481 | 1519 | ||
1482 | extern const struct ata_port_operations ata_sff_port_ops; | 1520 | extern const struct ata_port_operations ata_sff_port_ops; |
1483 | extern const struct ata_port_operations ata_bmdma_port_ops; | 1521 | extern const struct ata_port_operations ata_bmdma_port_ops; |
1522 | extern const struct ata_port_operations ata_bmdma32_port_ops; | ||
1484 | 1523 | ||
1485 | /* PIO only, sg_tablesize and dma_boundary limits can be removed */ | 1524 | /* PIO only, sg_tablesize and dma_boundary limits can be removed */ |
1486 | #define ATA_PIO_SHT(drv_name) \ | 1525 | #define ATA_PIO_SHT(drv_name) \ |
@@ -1508,6 +1547,8 @@ extern void ata_sff_exec_command(struct ata_port *ap, | |||
1508 | const struct ata_taskfile *tf); | 1547 | const struct ata_taskfile *tf); |
1509 | extern unsigned int ata_sff_data_xfer(struct ata_device *dev, | 1548 | extern unsigned int ata_sff_data_xfer(struct ata_device *dev, |
1510 | unsigned char *buf, unsigned int buflen, int rw); | 1549 | unsigned char *buf, unsigned int buflen, int rw); |
1550 | extern unsigned int ata_sff_data_xfer32(struct ata_device *dev, | ||
1551 | unsigned char *buf, unsigned int buflen, int rw); | ||
1511 | extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, | 1552 | extern unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, |
1512 | unsigned char *buf, unsigned int buflen, int rw); | 1553 | unsigned char *buf, unsigned int buflen, int rw); |
1513 | extern u8 ata_sff_irq_on(struct ata_port *ap); | 1554 | extern u8 ata_sff_irq_on(struct ata_port *ap); |
diff --git a/include/linux/libps2.h b/include/linux/libps2.h index afc413369101..b94534b7e266 100644 --- a/include/linux/libps2.h +++ b/include/linux/libps2.h | |||
@@ -18,11 +18,13 @@ | |||
18 | #define PS2_RET_ID 0x00 | 18 | #define PS2_RET_ID 0x00 |
19 | #define PS2_RET_ACK 0xfa | 19 | #define PS2_RET_ACK 0xfa |
20 | #define PS2_RET_NAK 0xfe | 20 | #define PS2_RET_NAK 0xfe |
21 | #define PS2_RET_ERR 0xfc | ||
21 | 22 | ||
22 | #define PS2_FLAG_ACK 1 /* Waiting for ACK/NAK */ | 23 | #define PS2_FLAG_ACK 1 /* Waiting for ACK/NAK */ |
23 | #define PS2_FLAG_CMD 2 /* Waiting for command to finish */ | 24 | #define PS2_FLAG_CMD 2 /* Waiting for command to finish */ |
24 | #define PS2_FLAG_CMD1 4 /* Waiting for the first byte of command response */ | 25 | #define PS2_FLAG_CMD1 4 /* Waiting for the first byte of command response */ |
25 | #define PS2_FLAG_WAITID 8 /* Command execiting is GET ID */ | 26 | #define PS2_FLAG_WAITID 8 /* Command execiting is GET ID */ |
27 | #define PS2_FLAG_NAK 16 /* Last transmission was NAKed */ | ||
26 | 28 | ||
27 | struct ps2dev { | 29 | struct ps2dev { |
28 | struct serio *serio; | 30 | struct serio *serio; |
diff --git a/include/linux/lockd/bind.h b/include/linux/lockd/bind.h index e5872dc994c0..fbc48f898521 100644 --- a/include/linux/lockd/bind.h +++ b/include/linux/lockd/bind.h | |||
@@ -41,6 +41,7 @@ struct nlmclnt_initdata { | |||
41 | size_t addrlen; | 41 | size_t addrlen; |
42 | unsigned short protocol; | 42 | unsigned short protocol; |
43 | u32 nfs_version; | 43 | u32 nfs_version; |
44 | int noresvport; | ||
44 | }; | 45 | }; |
45 | 46 | ||
46 | /* | 47 | /* |
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index b56d5aa9b194..aa6fe7026de7 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h | |||
@@ -43,12 +43,13 @@ struct nlm_host { | |||
43 | struct sockaddr_storage h_addr; /* peer address */ | 43 | struct sockaddr_storage h_addr; /* peer address */ |
44 | size_t h_addrlen; | 44 | size_t h_addrlen; |
45 | struct sockaddr_storage h_srcaddr; /* our address (optional) */ | 45 | struct sockaddr_storage h_srcaddr; /* our address (optional) */ |
46 | struct rpc_clnt * h_rpcclnt; /* RPC client to talk to peer */ | 46 | struct rpc_clnt *h_rpcclnt; /* RPC client to talk to peer */ |
47 | char * h_name; /* remote hostname */ | 47 | char *h_name; /* remote hostname */ |
48 | u32 h_version; /* interface version */ | 48 | u32 h_version; /* interface version */ |
49 | unsigned short h_proto; /* transport proto */ | 49 | unsigned short h_proto; /* transport proto */ |
50 | unsigned short h_reclaiming : 1, | 50 | unsigned short h_reclaiming : 1, |
51 | h_server : 1, /* server side, not client side */ | 51 | h_server : 1, /* server side, not client side */ |
52 | h_noresvport : 1, | ||
52 | h_inuse : 1; | 53 | h_inuse : 1; |
53 | wait_queue_head_t h_gracewait; /* wait while reclaiming */ | 54 | wait_queue_head_t h_gracewait; /* wait while reclaiming */ |
54 | struct rw_semaphore h_rwsem; /* Reboot recovery lock */ | 55 | struct rw_semaphore h_rwsem; /* Reboot recovery lock */ |
@@ -63,21 +64,29 @@ struct nlm_host { | |||
63 | spinlock_t h_lock; | 64 | spinlock_t h_lock; |
64 | struct list_head h_granted; /* Locks in GRANTED state */ | 65 | struct list_head h_granted; /* Locks in GRANTED state */ |
65 | struct list_head h_reclaim; /* Locks in RECLAIM state */ | 66 | struct list_head h_reclaim; /* Locks in RECLAIM state */ |
66 | struct nsm_handle * h_nsmhandle; /* NSM status handle */ | 67 | struct nsm_handle *h_nsmhandle; /* NSM status handle */ |
67 | 68 | char *h_addrbuf; /* address eyecatcher */ | |
68 | char h_addrbuf[48], /* address eyecatchers */ | ||
69 | h_srcaddrbuf[48]; | ||
70 | }; | 69 | }; |
71 | 70 | ||
71 | /* | ||
72 | * The largest string sm_addrbuf should hold is a full-size IPv6 address | ||
73 | * (no "::" anywhere) with a scope ID. The buffer size is computed to | ||
74 | * hold eight groups of colon-separated four-hex-digit numbers, a | ||
75 | * percent sign, a scope id (at most 32 bits, in decimal), and NUL. | ||
76 | */ | ||
77 | #define NSM_ADDRBUF ((8 * 4 + 7) + (1 + 10) + 1) | ||
78 | |||
72 | struct nsm_handle { | 79 | struct nsm_handle { |
73 | struct list_head sm_link; | 80 | struct list_head sm_link; |
74 | atomic_t sm_count; | 81 | atomic_t sm_count; |
75 | char * sm_name; | 82 | char *sm_mon_name; |
83 | char *sm_name; | ||
76 | struct sockaddr_storage sm_addr; | 84 | struct sockaddr_storage sm_addr; |
77 | size_t sm_addrlen; | 85 | size_t sm_addrlen; |
78 | unsigned int sm_monitored : 1, | 86 | unsigned int sm_monitored : 1, |
79 | sm_sticky : 1; /* don't unmonitor */ | 87 | sm_sticky : 1; /* don't unmonitor */ |
80 | char sm_addrbuf[48]; /* address eyecatcher */ | 88 | struct nsm_private sm_priv; |
89 | char sm_addrbuf[NSM_ADDRBUF]; | ||
81 | }; | 90 | }; |
82 | 91 | ||
83 | /* | 92 | /* |
@@ -103,16 +112,6 @@ static inline struct sockaddr *nlm_srcaddr(const struct nlm_host *host) | |||
103 | return (struct sockaddr *)&host->h_srcaddr; | 112 | return (struct sockaddr *)&host->h_srcaddr; |
104 | } | 113 | } |
105 | 114 | ||
106 | static inline struct sockaddr_in *nsm_addr_in(const struct nsm_handle *handle) | ||
107 | { | ||
108 | return (struct sockaddr_in *)&handle->sm_addr; | ||
109 | } | ||
110 | |||
111 | static inline struct sockaddr *nsm_addr(const struct nsm_handle *handle) | ||
112 | { | ||
113 | return (struct sockaddr *)&handle->sm_addr; | ||
114 | } | ||
115 | |||
116 | /* | 115 | /* |
117 | * Map an fl_owner_t into a unique 32-bit "pid" | 116 | * Map an fl_owner_t into a unique 32-bit "pid" |
118 | */ | 117 | */ |
@@ -196,6 +195,7 @@ extern struct svc_procedure nlmsvc_procedures4[]; | |||
196 | extern int nlmsvc_grace_period; | 195 | extern int nlmsvc_grace_period; |
197 | extern unsigned long nlmsvc_timeout; | 196 | extern unsigned long nlmsvc_timeout; |
198 | extern int nsm_use_hostnames; | 197 | extern int nsm_use_hostnames; |
198 | extern int nsm_local_state; | ||
199 | 199 | ||
200 | /* | 200 | /* |
201 | * Lockd client functions | 201 | * Lockd client functions |
@@ -220,7 +220,8 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, | |||
220 | const size_t salen, | 220 | const size_t salen, |
221 | const unsigned short protocol, | 221 | const unsigned short protocol, |
222 | const u32 version, | 222 | const u32 version, |
223 | const char *hostname); | 223 | const char *hostname, |
224 | int noresvport); | ||
224 | struct nlm_host *nlmsvc_lookup_host(const struct svc_rqst *rqstp, | 225 | struct nlm_host *nlmsvc_lookup_host(const struct svc_rqst *rqstp, |
225 | const char *hostname, | 226 | const char *hostname, |
226 | const size_t hostname_len); | 227 | const size_t hostname_len); |
@@ -229,10 +230,20 @@ void nlm_rebind_host(struct nlm_host *); | |||
229 | struct nlm_host * nlm_get_host(struct nlm_host *); | 230 | struct nlm_host * nlm_get_host(struct nlm_host *); |
230 | void nlm_release_host(struct nlm_host *); | 231 | void nlm_release_host(struct nlm_host *); |
231 | void nlm_shutdown_hosts(void); | 232 | void nlm_shutdown_hosts(void); |
232 | extern void nlm_host_rebooted(const struct sockaddr_in *, const char *, | 233 | void nlm_host_rebooted(const struct nlm_reboot *); |
233 | unsigned int, u32); | 234 | |
234 | void nsm_release(struct nsm_handle *); | 235 | /* |
236 | * Host monitoring | ||
237 | */ | ||
238 | int nsm_monitor(const struct nlm_host *host); | ||
239 | void nsm_unmonitor(const struct nlm_host *host); | ||
235 | 240 | ||
241 | struct nsm_handle *nsm_get_handle(const struct sockaddr *sap, | ||
242 | const size_t salen, | ||
243 | const char *hostname, | ||
244 | const size_t hostname_len); | ||
245 | struct nsm_handle *nsm_reboot_lookup(const struct nlm_reboot *info); | ||
246 | void nsm_release(struct nsm_handle *nsm); | ||
236 | 247 | ||
237 | /* | 248 | /* |
238 | * This is used in garbage collection and resource reclaim | 249 | * This is used in garbage collection and resource reclaim |
@@ -280,16 +291,25 @@ static inline struct inode *nlmsvc_file_inode(struct nlm_file *file) | |||
280 | static inline int __nlm_privileged_request4(const struct sockaddr *sap) | 291 | static inline int __nlm_privileged_request4(const struct sockaddr *sap) |
281 | { | 292 | { |
282 | const struct sockaddr_in *sin = (struct sockaddr_in *)sap; | 293 | const struct sockaddr_in *sin = (struct sockaddr_in *)sap; |
283 | return (sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) && | 294 | |
284 | (ntohs(sin->sin_port) < 1024); | 295 | if (ntohs(sin->sin_port) > 1023) |
296 | return 0; | ||
297 | |||
298 | return ipv4_is_loopback(sin->sin_addr.s_addr); | ||
285 | } | 299 | } |
286 | 300 | ||
287 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 301 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
288 | static inline int __nlm_privileged_request6(const struct sockaddr *sap) | 302 | static inline int __nlm_privileged_request6(const struct sockaddr *sap) |
289 | { | 303 | { |
290 | const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap; | 304 | const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap; |
291 | return (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LOOPBACK) && | 305 | |
292 | (ntohs(sin6->sin6_port) < 1024); | 306 | if (ntohs(sin6->sin6_port) > 1023) |
307 | return 0; | ||
308 | |||
309 | if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_MAPPED) | ||
310 | return ipv4_is_loopback(sin6->sin6_addr.s6_addr32[3]); | ||
311 | |||
312 | return ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LOOPBACK; | ||
293 | } | 313 | } |
294 | #else /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | 314 | #else /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ |
295 | static inline int __nlm_privileged_request6(const struct sockaddr *sap) | 315 | static inline int __nlm_privileged_request6(const struct sockaddr *sap) |
diff --git a/include/linux/lockd/sm_inter.h b/include/linux/lockd/sm_inter.h deleted file mode 100644 index 5a5448bdb17d..000000000000 --- a/include/linux/lockd/sm_inter.h +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* | ||
2 | * linux/include/linux/lockd/sm_inter.h | ||
3 | * | ||
4 | * Declarations for the kernel statd client. | ||
5 | * | ||
6 | * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de> | ||
7 | */ | ||
8 | |||
9 | #ifndef LINUX_LOCKD_SM_INTER_H | ||
10 | #define LINUX_LOCKD_SM_INTER_H | ||
11 | |||
12 | #define SM_PROGRAM 100024 | ||
13 | #define SM_VERSION 1 | ||
14 | #define SM_STAT 1 | ||
15 | #define SM_MON 2 | ||
16 | #define SM_UNMON 3 | ||
17 | #define SM_UNMON_ALL 4 | ||
18 | #define SM_SIMU_CRASH 5 | ||
19 | #define SM_NOTIFY 6 | ||
20 | |||
21 | #define SM_MAXSTRLEN 1024 | ||
22 | #define SM_PRIV_SIZE 16 | ||
23 | |||
24 | /* | ||
25 | * Arguments for all calls to statd | ||
26 | */ | ||
27 | struct nsm_args { | ||
28 | __be32 addr; /* remote address */ | ||
29 | u32 prog; /* RPC callback info */ | ||
30 | u32 vers; | ||
31 | u32 proc; | ||
32 | |||
33 | char * mon_name; | ||
34 | }; | ||
35 | |||
36 | /* | ||
37 | * Result returned by statd | ||
38 | */ | ||
39 | struct nsm_res { | ||
40 | u32 status; | ||
41 | u32 state; | ||
42 | }; | ||
43 | |||
44 | int nsm_monitor(struct nlm_host *); | ||
45 | int nsm_unmonitor(struct nlm_host *); | ||
46 | extern int nsm_local_state; | ||
47 | |||
48 | #endif /* LINUX_LOCKD_SM_INTER_H */ | ||
diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h index d6b3a802c046..7dc5b6cb44cd 100644 --- a/include/linux/lockd/xdr.h +++ b/include/linux/lockd/xdr.h | |||
@@ -13,6 +13,13 @@ | |||
13 | #include <linux/nfs.h> | 13 | #include <linux/nfs.h> |
14 | #include <linux/sunrpc/xdr.h> | 14 | #include <linux/sunrpc/xdr.h> |
15 | 15 | ||
16 | #define SM_MAXSTRLEN 1024 | ||
17 | #define SM_PRIV_SIZE 16 | ||
18 | |||
19 | struct nsm_private { | ||
20 | unsigned char data[SM_PRIV_SIZE]; | ||
21 | }; | ||
22 | |||
16 | struct svc_rqst; | 23 | struct svc_rqst; |
17 | 24 | ||
18 | #define NLM_MAXCOOKIELEN 32 | 25 | #define NLM_MAXCOOKIELEN 32 |
@@ -77,10 +84,10 @@ struct nlm_res { | |||
77 | * statd callback when client has rebooted | 84 | * statd callback when client has rebooted |
78 | */ | 85 | */ |
79 | struct nlm_reboot { | 86 | struct nlm_reboot { |
80 | char * mon; | 87 | char *mon; |
81 | unsigned int len; | 88 | unsigned int len; |
82 | u32 state; | 89 | u32 state; |
83 | __be32 addr; | 90 | struct nsm_private priv; |
84 | }; | 91 | }; |
85 | 92 | ||
86 | /* | 93 | /* |
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 29aec6e10020..23bf02fb124f 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
@@ -73,6 +73,8 @@ struct lock_class_key { | |||
73 | struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; | 73 | struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | #define LOCKSTAT_POINTS 4 | ||
77 | |||
76 | /* | 78 | /* |
77 | * The lock-class itself: | 79 | * The lock-class itself: |
78 | */ | 80 | */ |
@@ -119,7 +121,8 @@ struct lock_class { | |||
119 | int name_version; | 121 | int name_version; |
120 | 122 | ||
121 | #ifdef CONFIG_LOCK_STAT | 123 | #ifdef CONFIG_LOCK_STAT |
122 | unsigned long contention_point[4]; | 124 | unsigned long contention_point[LOCKSTAT_POINTS]; |
125 | unsigned long contending_point[LOCKSTAT_POINTS]; | ||
123 | #endif | 126 | #endif |
124 | }; | 127 | }; |
125 | 128 | ||
@@ -144,6 +147,7 @@ enum bounce_type { | |||
144 | 147 | ||
145 | struct lock_class_stats { | 148 | struct lock_class_stats { |
146 | unsigned long contention_point[4]; | 149 | unsigned long contention_point[4]; |
150 | unsigned long contending_point[4]; | ||
147 | struct lock_time read_waittime; | 151 | struct lock_time read_waittime; |
148 | struct lock_time write_waittime; | 152 | struct lock_time write_waittime; |
149 | struct lock_time read_holdtime; | 153 | struct lock_time read_holdtime; |
@@ -165,6 +169,7 @@ struct lockdep_map { | |||
165 | const char *name; | 169 | const char *name; |
166 | #ifdef CONFIG_LOCK_STAT | 170 | #ifdef CONFIG_LOCK_STAT |
167 | int cpu; | 171 | int cpu; |
172 | unsigned long ip; | ||
168 | #endif | 173 | #endif |
169 | }; | 174 | }; |
170 | 175 | ||
@@ -309,8 +314,15 @@ extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass, | |||
309 | extern void lock_release(struct lockdep_map *lock, int nested, | 314 | extern void lock_release(struct lockdep_map *lock, int nested, |
310 | unsigned long ip); | 315 | unsigned long ip); |
311 | 316 | ||
312 | extern void lock_set_subclass(struct lockdep_map *lock, unsigned int subclass, | 317 | extern void lock_set_class(struct lockdep_map *lock, const char *name, |
313 | unsigned long ip); | 318 | struct lock_class_key *key, unsigned int subclass, |
319 | unsigned long ip); | ||
320 | |||
321 | static inline void lock_set_subclass(struct lockdep_map *lock, | ||
322 | unsigned int subclass, unsigned long ip) | ||
323 | { | ||
324 | lock_set_class(lock, lock->name, lock->key, subclass, ip); | ||
325 | } | ||
314 | 326 | ||
315 | # define INIT_LOCKDEP .lockdep_recursion = 0, | 327 | # define INIT_LOCKDEP .lockdep_recursion = 0, |
316 | 328 | ||
@@ -328,6 +340,7 @@ static inline void lockdep_on(void) | |||
328 | 340 | ||
329 | # define lock_acquire(l, s, t, r, c, n, i) do { } while (0) | 341 | # define lock_acquire(l, s, t, r, c, n, i) do { } while (0) |
330 | # define lock_release(l, n, i) do { } while (0) | 342 | # define lock_release(l, n, i) do { } while (0) |
343 | # define lock_set_class(l, n, k, s, i) do { } while (0) | ||
331 | # define lock_set_subclass(l, s, i) do { } while (0) | 344 | # define lock_set_subclass(l, s, i) do { } while (0) |
332 | # define lockdep_init() do { } while (0) | 345 | # define lockdep_init() do { } while (0) |
333 | # define lockdep_info() do { } while (0) | 346 | # define lockdep_info() do { } while (0) |
@@ -356,7 +369,7 @@ struct lock_class_key { }; | |||
356 | #ifdef CONFIG_LOCK_STAT | 369 | #ifdef CONFIG_LOCK_STAT |
357 | 370 | ||
358 | extern void lock_contended(struct lockdep_map *lock, unsigned long ip); | 371 | extern void lock_contended(struct lockdep_map *lock, unsigned long ip); |
359 | extern void lock_acquired(struct lockdep_map *lock); | 372 | extern void lock_acquired(struct lockdep_map *lock, unsigned long ip); |
360 | 373 | ||
361 | #define LOCK_CONTENDED(_lock, try, lock) \ | 374 | #define LOCK_CONTENDED(_lock, try, lock) \ |
362 | do { \ | 375 | do { \ |
@@ -364,20 +377,20 @@ do { \ | |||
364 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ | 377 | lock_contended(&(_lock)->dep_map, _RET_IP_); \ |
365 | lock(_lock); \ | 378 | lock(_lock); \ |
366 | } \ | 379 | } \ |
367 | lock_acquired(&(_lock)->dep_map); \ | 380 | lock_acquired(&(_lock)->dep_map, _RET_IP_); \ |
368 | } while (0) | 381 | } while (0) |
369 | 382 | ||
370 | #else /* CONFIG_LOCK_STAT */ | 383 | #else /* CONFIG_LOCK_STAT */ |
371 | 384 | ||
372 | #define lock_contended(lockdep_map, ip) do {} while (0) | 385 | #define lock_contended(lockdep_map, ip) do {} while (0) |
373 | #define lock_acquired(lockdep_map) do {} while (0) | 386 | #define lock_acquired(lockdep_map, ip) do {} while (0) |
374 | 387 | ||
375 | #define LOCK_CONTENDED(_lock, try, lock) \ | 388 | #define LOCK_CONTENDED(_lock, try, lock) \ |
376 | lock(_lock) | 389 | lock(_lock) |
377 | 390 | ||
378 | #endif /* CONFIG_LOCK_STAT */ | 391 | #endif /* CONFIG_LOCK_STAT */ |
379 | 392 | ||
380 | #if defined(CONFIG_TRACE_IRQFLAGS) && defined(CONFIG_GENERIC_HARDIRQS) | 393 | #ifdef CONFIG_GENERIC_HARDIRQS |
381 | extern void early_init_irq_lock_class(void); | 394 | extern void early_init_irq_lock_class(void); |
382 | #else | 395 | #else |
383 | static inline void early_init_irq_lock_class(void) | 396 | static inline void early_init_irq_lock_class(void) |
@@ -481,4 +494,22 @@ static inline void print_irqtrace_events(struct task_struct *curr) | |||
481 | # define lock_map_release(l) do { } while (0) | 494 | # define lock_map_release(l) do { } while (0) |
482 | #endif | 495 | #endif |
483 | 496 | ||
497 | #ifdef CONFIG_PROVE_LOCKING | ||
498 | # define might_lock(lock) \ | ||
499 | do { \ | ||
500 | typecheck(struct lockdep_map *, &(lock)->dep_map); \ | ||
501 | lock_acquire(&(lock)->dep_map, 0, 0, 0, 2, NULL, _THIS_IP_); \ | ||
502 | lock_release(&(lock)->dep_map, 0, _THIS_IP_); \ | ||
503 | } while (0) | ||
504 | # define might_lock_read(lock) \ | ||
505 | do { \ | ||
506 | typecheck(struct lockdep_map *, &(lock)->dep_map); \ | ||
507 | lock_acquire(&(lock)->dep_map, 0, 0, 1, 2, NULL, _THIS_IP_); \ | ||
508 | lock_release(&(lock)->dep_map, 0, _THIS_IP_); \ | ||
509 | } while (0) | ||
510 | #else | ||
511 | # define might_lock(lock) do { } while (0) | ||
512 | # define might_lock_read(lock) do { } while (0) | ||
513 | #endif | ||
514 | |||
484 | #endif /* __LINUX_LOCKDEP_H */ | 515 | #endif /* __LINUX_LOCKDEP_H */ |
diff --git a/include/linux/mISDNhw.h b/include/linux/mISDNhw.h index e794dfb87504..97ffdc1d3442 100644 --- a/include/linux/mISDNhw.h +++ b/include/linux/mISDNhw.h | |||
@@ -57,20 +57,21 @@ | |||
57 | #define FLG_L2DATA 14 /* channel use L2 DATA primitivs */ | 57 | #define FLG_L2DATA 14 /* channel use L2 DATA primitivs */ |
58 | #define FLG_ORIGIN 15 /* channel is on origin site */ | 58 | #define FLG_ORIGIN 15 /* channel is on origin site */ |
59 | /* channel specific stuff */ | 59 | /* channel specific stuff */ |
60 | #define FLG_FILLEMPTY 16 /* fill fifo on first frame (empty) */ | ||
60 | /* arcofi specific */ | 61 | /* arcofi specific */ |
61 | #define FLG_ARCOFI_TIMER 16 | 62 | #define FLG_ARCOFI_TIMER 17 |
62 | #define FLG_ARCOFI_ERROR 17 | 63 | #define FLG_ARCOFI_ERROR 18 |
63 | /* isar specific */ | 64 | /* isar specific */ |
64 | #define FLG_INITIALIZED 16 | 65 | #define FLG_INITIALIZED 17 |
65 | #define FLG_DLEETX 17 | 66 | #define FLG_DLEETX 18 |
66 | #define FLG_LASTDLE 18 | 67 | #define FLG_LASTDLE 19 |
67 | #define FLG_FIRST 19 | 68 | #define FLG_FIRST 20 |
68 | #define FLG_LASTDATA 20 | 69 | #define FLG_LASTDATA 21 |
69 | #define FLG_NMD_DATA 21 | 70 | #define FLG_NMD_DATA 22 |
70 | #define FLG_FTI_RUN 22 | 71 | #define FLG_FTI_RUN 23 |
71 | #define FLG_LL_OK 23 | 72 | #define FLG_LL_OK 24 |
72 | #define FLG_LL_CONN 24 | 73 | #define FLG_LL_CONN 25 |
73 | #define FLG_DTMFSEND 25 | 74 | #define FLG_DTMFSEND 26 |
74 | 75 | ||
75 | /* workq events */ | 76 | /* workq events */ |
76 | #define FLG_RECVQUEUE 30 | 77 | #define FLG_RECVQUEUE 30 |
@@ -183,6 +184,7 @@ extern void queue_ch_frame(struct mISDNchannel *, u_int, | |||
183 | extern int dchannel_senddata(struct dchannel *, struct sk_buff *); | 184 | extern int dchannel_senddata(struct dchannel *, struct sk_buff *); |
184 | extern int bchannel_senddata(struct bchannel *, struct sk_buff *); | 185 | extern int bchannel_senddata(struct bchannel *, struct sk_buff *); |
185 | extern void recv_Dchannel(struct dchannel *); | 186 | extern void recv_Dchannel(struct dchannel *); |
187 | extern void recv_Echannel(struct dchannel *, struct dchannel *); | ||
186 | extern void recv_Bchannel(struct bchannel *); | 188 | extern void recv_Bchannel(struct bchannel *); |
187 | extern void recv_Dchannel_skb(struct dchannel *, struct sk_buff *); | 189 | extern void recv_Dchannel_skb(struct dchannel *, struct sk_buff *); |
188 | extern void recv_Bchannel_skb(struct bchannel *, struct sk_buff *); | 190 | extern void recv_Bchannel_skb(struct bchannel *, struct sk_buff *); |
diff --git a/include/linux/mISDNif.h b/include/linux/mISDNif.h index 8f2d60da04e7..557477ac3d5b 100644 --- a/include/linux/mISDNif.h +++ b/include/linux/mISDNif.h | |||
@@ -36,8 +36,8 @@ | |||
36 | * - should be incremented on every checkin | 36 | * - should be incremented on every checkin |
37 | */ | 37 | */ |
38 | #define MISDN_MAJOR_VERSION 1 | 38 | #define MISDN_MAJOR_VERSION 1 |
39 | #define MISDN_MINOR_VERSION 0 | 39 | #define MISDN_MINOR_VERSION 1 |
40 | #define MISDN_RELEASE 19 | 40 | #define MISDN_RELEASE 20 |
41 | 41 | ||
42 | /* primitives for information exchange | 42 | /* primitives for information exchange |
43 | * generell format | 43 | * generell format |
@@ -80,6 +80,7 @@ | |||
80 | #define PH_DEACTIVATE_IND 0x0202 | 80 | #define PH_DEACTIVATE_IND 0x0202 |
81 | #define PH_DEACTIVATE_CNF 0x4202 | 81 | #define PH_DEACTIVATE_CNF 0x4202 |
82 | #define PH_DATA_IND 0x2002 | 82 | #define PH_DATA_IND 0x2002 |
83 | #define PH_DATA_E_IND 0x3002 | ||
83 | #define MPH_ACTIVATE_IND 0x0502 | 84 | #define MPH_ACTIVATE_IND 0x0502 |
84 | #define MPH_DEACTIVATE_IND 0x0602 | 85 | #define MPH_DEACTIVATE_IND 0x0602 |
85 | #define MPH_INFORMATION_IND 0x0702 | 86 | #define MPH_INFORMATION_IND 0x0702 |
@@ -199,6 +200,18 @@ | |||
199 | #define ISDN_P_NT_S0 0x02 | 200 | #define ISDN_P_NT_S0 0x02 |
200 | #define ISDN_P_TE_E1 0x03 | 201 | #define ISDN_P_TE_E1 0x03 |
201 | #define ISDN_P_NT_E1 0x04 | 202 | #define ISDN_P_NT_E1 0x04 |
203 | #define ISDN_P_TE_UP0 0x05 | ||
204 | #define ISDN_P_NT_UP0 0x06 | ||
205 | |||
206 | #define IS_ISDN_P_TE(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_TE_E1) || \ | ||
207 | (p == ISDN_P_TE_UP0) || (p == ISDN_P_LAPD_TE)) | ||
208 | #define IS_ISDN_P_NT(p) ((p == ISDN_P_NT_S0) || (p == ISDN_P_NT_E1) || \ | ||
209 | (p == ISDN_P_NT_UP0) || (p == ISDN_P_LAPD_NT)) | ||
210 | #define IS_ISDN_P_S0(p) ((p == ISDN_P_TE_S0) || (p == ISDN_P_NT_S0)) | ||
211 | #define IS_ISDN_P_E1(p) ((p == ISDN_P_TE_E1) || (p == ISDN_P_NT_E1)) | ||
212 | #define IS_ISDN_P_UP0(p) ((p == ISDN_P_TE_UP0) || (p == ISDN_P_NT_UP0)) | ||
213 | |||
214 | |||
202 | #define ISDN_P_LAPD_TE 0x10 | 215 | #define ISDN_P_LAPD_TE 0x10 |
203 | #define ISDN_P_LAPD_NT 0x11 | 216 | #define ISDN_P_LAPD_NT 0x11 |
204 | 217 | ||
@@ -255,16 +268,6 @@ struct sockaddr_mISDN { | |||
255 | unsigned char tei; | 268 | unsigned char tei; |
256 | }; | 269 | }; |
257 | 270 | ||
258 | /* timer device ioctl */ | ||
259 | #define IMADDTIMER _IOR('I', 64, int) | ||
260 | #define IMDELTIMER _IOR('I', 65, int) | ||
261 | /* socket ioctls */ | ||
262 | #define IMGETVERSION _IOR('I', 66, int) | ||
263 | #define IMGETCOUNT _IOR('I', 67, int) | ||
264 | #define IMGETDEVINFO _IOR('I', 68, int) | ||
265 | #define IMCTRLREQ _IOR('I', 69, int) | ||
266 | #define IMCLEAR_L2 _IOR('I', 70, int) | ||
267 | |||
268 | struct mISDNversion { | 271 | struct mISDNversion { |
269 | unsigned char major; | 272 | unsigned char major; |
270 | unsigned char minor; | 273 | unsigned char minor; |
@@ -281,6 +284,40 @@ struct mISDN_devinfo { | |||
281 | char name[MISDN_MAX_IDLEN]; | 284 | char name[MISDN_MAX_IDLEN]; |
282 | }; | 285 | }; |
283 | 286 | ||
287 | struct mISDN_devrename { | ||
288 | u_int id; | ||
289 | char name[MISDN_MAX_IDLEN]; /* new name */ | ||
290 | }; | ||
291 | |||
292 | /* MPH_INFORMATION_REQ payload */ | ||
293 | struct ph_info_ch { | ||
294 | __u32 protocol; | ||
295 | __u64 Flags; | ||
296 | }; | ||
297 | |||
298 | struct ph_info_dch { | ||
299 | struct ph_info_ch ch; | ||
300 | __u16 state; | ||
301 | __u16 num_bch; | ||
302 | }; | ||
303 | |||
304 | struct ph_info { | ||
305 | struct ph_info_dch dch; | ||
306 | struct ph_info_ch bch[]; | ||
307 | }; | ||
308 | |||
309 | /* timer device ioctl */ | ||
310 | #define IMADDTIMER _IOR('I', 64, int) | ||
311 | #define IMDELTIMER _IOR('I', 65, int) | ||
312 | |||
313 | /* socket ioctls */ | ||
314 | #define IMGETVERSION _IOR('I', 66, int) | ||
315 | #define IMGETCOUNT _IOR('I', 67, int) | ||
316 | #define IMGETDEVINFO _IOR('I', 68, int) | ||
317 | #define IMCTRLREQ _IOR('I', 69, int) | ||
318 | #define IMCLEAR_L2 _IOR('I', 70, int) | ||
319 | #define IMSETDEVNAME _IOR('I', 71, struct mISDN_devrename) | ||
320 | |||
284 | static inline int | 321 | static inline int |
285 | test_channelmap(u_int nr, u_char *map) | 322 | test_channelmap(u_int nr, u_char *map) |
286 | { | 323 | { |
@@ -312,6 +349,8 @@ clear_channelmap(u_int nr, u_char *map) | |||
312 | #define MISDN_CTRL_SETPEER 0x0040 | 349 | #define MISDN_CTRL_SETPEER 0x0040 |
313 | #define MISDN_CTRL_UNSETPEER 0x0080 | 350 | #define MISDN_CTRL_UNSETPEER 0x0080 |
314 | #define MISDN_CTRL_RX_OFF 0x0100 | 351 | #define MISDN_CTRL_RX_OFF 0x0100 |
352 | #define MISDN_CTRL_FILL_EMPTY 0x0200 | ||
353 | #define MISDN_CTRL_GETPEER 0x0400 | ||
315 | #define MISDN_CTRL_HW_FEATURES_OP 0x2000 | 354 | #define MISDN_CTRL_HW_FEATURES_OP 0x2000 |
316 | #define MISDN_CTRL_HW_FEATURES 0x2001 | 355 | #define MISDN_CTRL_HW_FEATURES 0x2001 |
317 | #define MISDN_CTRL_HFC_OP 0x4000 | 356 | #define MISDN_CTRL_HFC_OP 0x4000 |
@@ -362,6 +401,7 @@ struct mISDN_ctrl_req { | |||
362 | #define DEBUG_L2_TEI 0x00100000 | 401 | #define DEBUG_L2_TEI 0x00100000 |
363 | #define DEBUG_L2_TEIFSM 0x00200000 | 402 | #define DEBUG_L2_TEIFSM 0x00200000 |
364 | #define DEBUG_TIMER 0x01000000 | 403 | #define DEBUG_TIMER 0x01000000 |
404 | #define DEBUG_CLOCK 0x02000000 | ||
365 | 405 | ||
366 | #define mISDN_HEAD_P(s) ((struct mISDNhead *)&s->cb[0]) | 406 | #define mISDN_HEAD_P(s) ((struct mISDNhead *)&s->cb[0]) |
367 | #define mISDN_HEAD_PRIM(s) (((struct mISDNhead *)&s->cb[0])->prim) | 407 | #define mISDN_HEAD_PRIM(s) (((struct mISDNhead *)&s->cb[0])->prim) |
@@ -375,6 +415,7 @@ struct mISDN_ctrl_req { | |||
375 | struct mISDNchannel; | 415 | struct mISDNchannel; |
376 | struct mISDNdevice; | 416 | struct mISDNdevice; |
377 | struct mISDNstack; | 417 | struct mISDNstack; |
418 | struct mISDNclock; | ||
378 | 419 | ||
379 | struct channel_req { | 420 | struct channel_req { |
380 | u_int protocol; | 421 | u_int protocol; |
@@ -423,7 +464,6 @@ struct mISDN_sock { | |||
423 | struct mISDNdevice { | 464 | struct mISDNdevice { |
424 | struct mISDNchannel D; | 465 | struct mISDNchannel D; |
425 | u_int id; | 466 | u_int id; |
426 | char name[MISDN_MAX_IDLEN]; | ||
427 | u_int Dprotocols; | 467 | u_int Dprotocols; |
428 | u_int Bprotocols; | 468 | u_int Bprotocols; |
429 | u_int nrbchan; | 469 | u_int nrbchan; |
@@ -452,6 +492,16 @@ struct mISDNstack { | |||
452 | #endif | 492 | #endif |
453 | }; | 493 | }; |
454 | 494 | ||
495 | typedef int (clockctl_func_t)(void *, int); | ||
496 | |||
497 | struct mISDNclock { | ||
498 | struct list_head list; | ||
499 | char name[64]; | ||
500 | int pri; | ||
501 | clockctl_func_t *ctl; | ||
502 | void *priv; | ||
503 | }; | ||
504 | |||
455 | /* global alloc/queue functions */ | 505 | /* global alloc/queue functions */ |
456 | 506 | ||
457 | static inline struct sk_buff * | 507 | static inline struct sk_buff * |
@@ -498,12 +548,23 @@ _queue_data(struct mISDNchannel *ch, u_int prim, | |||
498 | 548 | ||
499 | /* global register/unregister functions */ | 549 | /* global register/unregister functions */ |
500 | 550 | ||
501 | extern int mISDN_register_device(struct mISDNdevice *, char *name); | 551 | extern int mISDN_register_device(struct mISDNdevice *, |
552 | struct device *parent, char *name); | ||
502 | extern void mISDN_unregister_device(struct mISDNdevice *); | 553 | extern void mISDN_unregister_device(struct mISDNdevice *); |
503 | extern int mISDN_register_Bprotocol(struct Bprotocol *); | 554 | extern int mISDN_register_Bprotocol(struct Bprotocol *); |
504 | extern void mISDN_unregister_Bprotocol(struct Bprotocol *); | 555 | extern void mISDN_unregister_Bprotocol(struct Bprotocol *); |
556 | extern struct mISDNclock *mISDN_register_clock(char *, int, clockctl_func_t *, | ||
557 | void *); | ||
558 | extern void mISDN_unregister_clock(struct mISDNclock *); | ||
559 | |||
560 | static inline struct mISDNdevice *dev_to_mISDN(struct device *dev) | ||
561 | { | ||
562 | return dev_get_drvdata(dev); | ||
563 | } | ||
505 | 564 | ||
506 | extern void set_channel_address(struct mISDNchannel *, u_int, u_int); | 565 | extern void set_channel_address(struct mISDNchannel *, u_int, u_int); |
566 | extern void mISDN_clock_update(struct mISDNclock *, int, struct timeval *); | ||
567 | extern unsigned short mISDN_clock_get(void); | ||
507 | 568 | ||
508 | #endif /* __KERNEL__ */ | 569 | #endif /* __KERNEL__ */ |
509 | #endif /* mISDNIF_H */ | 570 | #endif /* mISDNIF_H */ |
diff --git a/include/linux/magic.h b/include/linux/magic.h index f7f3fdddbef0..439f6f3cb0c4 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define EFS_SUPER_MAGIC 0x414A53 | 13 | #define EFS_SUPER_MAGIC 0x414A53 |
14 | #define EXT2_SUPER_MAGIC 0xEF53 | 14 | #define EXT2_SUPER_MAGIC 0xEF53 |
15 | #define EXT3_SUPER_MAGIC 0xEF53 | 15 | #define EXT3_SUPER_MAGIC 0xEF53 |
16 | #define XENFS_SUPER_MAGIC 0xabba1974 | ||
16 | #define EXT4_SUPER_MAGIC 0xEF53 | 17 | #define EXT4_SUPER_MAGIC 0xEF53 |
17 | #define HPFS_SUPER_MAGIC 0xf995e849 | 18 | #define HPFS_SUPER_MAGIC 0xf995e849 |
18 | #define ISOFS_SUPER_MAGIC 0x9660 | 19 | #define ISOFS_SUPER_MAGIC 0x9660 |
diff --git a/include/linux/map_to_7segment.h b/include/linux/map_to_7segment.h index 7df8432c4402..12d62a54d470 100644 --- a/include/linux/map_to_7segment.h +++ b/include/linux/map_to_7segment.h | |||
@@ -75,7 +75,7 @@ struct seg7_conversion_map { | |||
75 | unsigned char table[128]; | 75 | unsigned char table[128]; |
76 | }; | 76 | }; |
77 | 77 | ||
78 | static inline int map_to_seg7(struct seg7_conversion_map *map, int c) | 78 | static __inline__ int map_to_seg7(struct seg7_conversion_map *map, int c) |
79 | { | 79 | { |
80 | return c >= 0 && c < sizeof(map->table) ? map->table[c] : -EINVAL; | 80 | return c >= 0 && c < sizeof(map->table) ? map->table[c] : -EINVAL; |
81 | } | 81 | } |
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 1fbe14d39521..326f45c86530 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -19,22 +19,45 @@ | |||
19 | 19 | ||
20 | #ifndef _LINUX_MEMCONTROL_H | 20 | #ifndef _LINUX_MEMCONTROL_H |
21 | #define _LINUX_MEMCONTROL_H | 21 | #define _LINUX_MEMCONTROL_H |
22 | 22 | #include <linux/cgroup.h> | |
23 | struct mem_cgroup; | 23 | struct mem_cgroup; |
24 | struct page_cgroup; | 24 | struct page_cgroup; |
25 | struct page; | 25 | struct page; |
26 | struct mm_struct; | 26 | struct mm_struct; |
27 | 27 | ||
28 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR | 28 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
29 | /* | ||
30 | * All "charge" functions with gfp_mask should use GFP_KERNEL or | ||
31 | * (gfp_mask & GFP_RECLAIM_MASK). In current implementatin, memcg doesn't | ||
32 | * alloc memory but reclaims memory from all available zones. So, "where I want | ||
33 | * memory from" bits of gfp_mask has no meaning. So any bits of that field is | ||
34 | * available but adding a rule is better. charge functions' gfp_mask should | ||
35 | * be set to GFP_KERNEL or gfp_mask & GFP_RECLAIM_MASK for avoiding ambiguous | ||
36 | * codes. | ||
37 | * (Of course, if memcg does memory allocation in future, GFP_KERNEL is sane.) | ||
38 | */ | ||
29 | 39 | ||
30 | extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm, | 40 | extern int mem_cgroup_newpage_charge(struct page *page, struct mm_struct *mm, |
31 | gfp_t gfp_mask); | 41 | gfp_t gfp_mask); |
42 | /* for swap handling */ | ||
43 | extern int mem_cgroup_try_charge_swapin(struct mm_struct *mm, | ||
44 | struct page *page, gfp_t mask, struct mem_cgroup **ptr); | ||
45 | extern void mem_cgroup_commit_charge_swapin(struct page *page, | ||
46 | struct mem_cgroup *ptr); | ||
47 | extern void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *ptr); | ||
48 | |||
32 | extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | 49 | extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, |
33 | gfp_t gfp_mask); | 50 | gfp_t gfp_mask); |
34 | extern void mem_cgroup_move_lists(struct page *page, enum lru_list lru); | 51 | extern void mem_cgroup_add_lru_list(struct page *page, enum lru_list lru); |
52 | extern void mem_cgroup_del_lru_list(struct page *page, enum lru_list lru); | ||
53 | extern void mem_cgroup_rotate_lru_list(struct page *page, enum lru_list lru); | ||
54 | extern void mem_cgroup_del_lru(struct page *page); | ||
55 | extern void mem_cgroup_move_lists(struct page *page, | ||
56 | enum lru_list from, enum lru_list to); | ||
35 | extern void mem_cgroup_uncharge_page(struct page *page); | 57 | extern void mem_cgroup_uncharge_page(struct page *page); |
36 | extern void mem_cgroup_uncharge_cache_page(struct page *page); | 58 | extern void mem_cgroup_uncharge_cache_page(struct page *page); |
37 | extern int mem_cgroup_shrink_usage(struct mm_struct *mm, gfp_t gfp_mask); | 59 | extern int mem_cgroup_shrink_usage(struct page *page, |
60 | struct mm_struct *mm, gfp_t gfp_mask); | ||
38 | 61 | ||
39 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, | 62 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, |
40 | struct list_head *dst, | 63 | struct list_head *dst, |
@@ -47,12 +70,20 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); | |||
47 | 70 | ||
48 | extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); | 71 | extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); |
49 | 72 | ||
50 | #define mm_match_cgroup(mm, cgroup) \ | 73 | static inline |
51 | ((cgroup) == mem_cgroup_from_task((mm)->owner)) | 74 | int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup) |
75 | { | ||
76 | struct mem_cgroup *mem; | ||
77 | rcu_read_lock(); | ||
78 | mem = mem_cgroup_from_task((mm)->owner); | ||
79 | rcu_read_unlock(); | ||
80 | return cgroup == mem; | ||
81 | } | ||
52 | 82 | ||
53 | extern int | 83 | extern int |
54 | mem_cgroup_prepare_migration(struct page *page, struct page *newpage); | 84 | mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr); |
55 | extern void mem_cgroup_end_migration(struct page *page); | 85 | extern void mem_cgroup_end_migration(struct mem_cgroup *mem, |
86 | struct page *oldpage, struct page *newpage); | ||
56 | 87 | ||
57 | /* | 88 | /* |
58 | * For memory reclaim. | 89 | * For memory reclaim. |
@@ -65,13 +96,32 @@ extern void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, | |||
65 | int priority); | 96 | int priority); |
66 | extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, | 97 | extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, |
67 | int priority); | 98 | int priority); |
99 | int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg); | ||
100 | unsigned long mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, | ||
101 | struct zone *zone, | ||
102 | enum lru_list lru); | ||
103 | struct zone_reclaim_stat *mem_cgroup_get_reclaim_stat(struct mem_cgroup *memcg, | ||
104 | struct zone *zone); | ||
105 | struct zone_reclaim_stat* | ||
106 | mem_cgroup_get_reclaim_stat_from_page(struct page *page); | ||
68 | 107 | ||
69 | extern long mem_cgroup_calc_reclaim(struct mem_cgroup *mem, struct zone *zone, | 108 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP |
70 | int priority, enum lru_list lru); | 109 | extern int do_swap_account; |
110 | #endif | ||
71 | 111 | ||
112 | static inline bool mem_cgroup_disabled(void) | ||
113 | { | ||
114 | if (mem_cgroup_subsys.disabled) | ||
115 | return true; | ||
116 | return false; | ||
117 | } | ||
118 | |||
119 | extern bool mem_cgroup_oom_called(struct task_struct *task); | ||
72 | 120 | ||
73 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ | 121 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
74 | static inline int mem_cgroup_charge(struct page *page, | 122 | struct mem_cgroup; |
123 | |||
124 | static inline int mem_cgroup_newpage_charge(struct page *page, | ||
75 | struct mm_struct *mm, gfp_t gfp_mask) | 125 | struct mm_struct *mm, gfp_t gfp_mask) |
76 | { | 126 | { |
77 | return 0; | 127 | return 0; |
@@ -83,6 +133,21 @@ static inline int mem_cgroup_cache_charge(struct page *page, | |||
83 | return 0; | 133 | return 0; |
84 | } | 134 | } |
85 | 135 | ||
136 | static inline int mem_cgroup_try_charge_swapin(struct mm_struct *mm, | ||
137 | struct page *page, gfp_t gfp_mask, struct mem_cgroup **ptr) | ||
138 | { | ||
139 | return 0; | ||
140 | } | ||
141 | |||
142 | static inline void mem_cgroup_commit_charge_swapin(struct page *page, | ||
143 | struct mem_cgroup *ptr) | ||
144 | { | ||
145 | } | ||
146 | |||
147 | static inline void mem_cgroup_cancel_charge_swapin(struct mem_cgroup *ptr) | ||
148 | { | ||
149 | } | ||
150 | |||
86 | static inline void mem_cgroup_uncharge_page(struct page *page) | 151 | static inline void mem_cgroup_uncharge_page(struct page *page) |
87 | { | 152 | { |
88 | } | 153 | } |
@@ -91,12 +156,33 @@ static inline void mem_cgroup_uncharge_cache_page(struct page *page) | |||
91 | { | 156 | { |
92 | } | 157 | } |
93 | 158 | ||
94 | static inline int mem_cgroup_shrink_usage(struct mm_struct *mm, gfp_t gfp_mask) | 159 | static inline int mem_cgroup_shrink_usage(struct page *page, |
160 | struct mm_struct *mm, gfp_t gfp_mask) | ||
95 | { | 161 | { |
96 | return 0; | 162 | return 0; |
97 | } | 163 | } |
98 | 164 | ||
99 | static inline void mem_cgroup_move_lists(struct page *page, bool active) | 165 | static inline void mem_cgroup_add_lru_list(struct page *page, int lru) |
166 | { | ||
167 | } | ||
168 | |||
169 | static inline void mem_cgroup_del_lru_list(struct page *page, int lru) | ||
170 | { | ||
171 | return ; | ||
172 | } | ||
173 | |||
174 | static inline void mem_cgroup_rotate_lru_list(struct page *page, int lru) | ||
175 | { | ||
176 | return ; | ||
177 | } | ||
178 | |||
179 | static inline void mem_cgroup_del_lru(struct page *page) | ||
180 | { | ||
181 | return ; | ||
182 | } | ||
183 | |||
184 | static inline void | ||
185 | mem_cgroup_move_lists(struct page *page, enum lru_list from, enum lru_list to) | ||
100 | { | 186 | { |
101 | } | 187 | } |
102 | 188 | ||
@@ -112,12 +198,14 @@ static inline int task_in_mem_cgroup(struct task_struct *task, | |||
112 | } | 198 | } |
113 | 199 | ||
114 | static inline int | 200 | static inline int |
115 | mem_cgroup_prepare_migration(struct page *page, struct page *newpage) | 201 | mem_cgroup_prepare_migration(struct page *page, struct mem_cgroup **ptr) |
116 | { | 202 | { |
117 | return 0; | 203 | return 0; |
118 | } | 204 | } |
119 | 205 | ||
120 | static inline void mem_cgroup_end_migration(struct page *page) | 206 | static inline void mem_cgroup_end_migration(struct mem_cgroup *mem, |
207 | struct page *oldpage, | ||
208 | struct page *newpage) | ||
121 | { | 209 | { |
122 | } | 210 | } |
123 | 211 | ||
@@ -146,12 +234,42 @@ static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, | |||
146 | { | 234 | { |
147 | } | 235 | } |
148 | 236 | ||
149 | static inline long mem_cgroup_calc_reclaim(struct mem_cgroup *mem, | 237 | static inline bool mem_cgroup_disabled(void) |
150 | struct zone *zone, int priority, | 238 | { |
151 | enum lru_list lru) | 239 | return true; |
240 | } | ||
241 | |||
242 | static inline bool mem_cgroup_oom_called(struct task_struct *task) | ||
243 | { | ||
244 | return false; | ||
245 | } | ||
246 | |||
247 | static inline int | ||
248 | mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg) | ||
249 | { | ||
250 | return 1; | ||
251 | } | ||
252 | |||
253 | static inline unsigned long | ||
254 | mem_cgroup_zone_nr_pages(struct mem_cgroup *memcg, struct zone *zone, | ||
255 | enum lru_list lru) | ||
152 | { | 256 | { |
153 | return 0; | 257 | return 0; |
154 | } | 258 | } |
259 | |||
260 | |||
261 | static inline struct zone_reclaim_stat* | ||
262 | mem_cgroup_get_reclaim_stat(struct mem_cgroup *memcg, struct zone *zone) | ||
263 | { | ||
264 | return NULL; | ||
265 | } | ||
266 | |||
267 | static inline struct zone_reclaim_stat* | ||
268 | mem_cgroup_get_reclaim_stat_from_page(struct page *page) | ||
269 | { | ||
270 | return NULL; | ||
271 | } | ||
272 | |||
155 | #endif /* CONFIG_CGROUP_MEM_CONT */ | 273 | #endif /* CONFIG_CGROUP_MEM_CONT */ |
156 | 274 | ||
157 | #endif /* _LINUX_MEMCONTROL_H */ | 275 | #endif /* _LINUX_MEMCONTROL_H */ |
diff --git a/include/linux/memory.h b/include/linux/memory.h index 36c82c9e6ea7..3fdc10806d31 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
@@ -79,14 +79,14 @@ static inline int memory_notify(unsigned long val, void *v) | |||
79 | #else | 79 | #else |
80 | extern int register_memory_notifier(struct notifier_block *nb); | 80 | extern int register_memory_notifier(struct notifier_block *nb); |
81 | extern void unregister_memory_notifier(struct notifier_block *nb); | 81 | extern void unregister_memory_notifier(struct notifier_block *nb); |
82 | extern int register_new_memory(struct mem_section *); | 82 | extern int register_new_memory(int, struct mem_section *); |
83 | extern int unregister_memory_section(struct mem_section *); | 83 | extern int unregister_memory_section(struct mem_section *); |
84 | extern int memory_dev_init(void); | 84 | extern int memory_dev_init(void); |
85 | extern int remove_memory_block(unsigned long, struct mem_section *, int); | 85 | extern int remove_memory_block(unsigned long, struct mem_section *, int); |
86 | extern int memory_notify(unsigned long val, void *v); | 86 | extern int memory_notify(unsigned long val, void *v); |
87 | extern struct memory_block *find_memory_block(struct mem_section *); | ||
87 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) | 88 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) |
88 | 89 | enum mem_add_context { BOOT, HOTPLUG }; | |
89 | |||
90 | #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ | 90 | #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ |
91 | 91 | ||
92 | #ifdef CONFIG_MEMORY_HOTPLUG | 92 | #ifdef CONFIG_MEMORY_HOTPLUG |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 763ba81fc0f0..d95f72e79b82 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
@@ -72,7 +72,7 @@ extern void __offline_isolated_pages(unsigned long, unsigned long); | |||
72 | extern int offline_pages(unsigned long, unsigned long, unsigned long); | 72 | extern int offline_pages(unsigned long, unsigned long, unsigned long); |
73 | 73 | ||
74 | /* reasonably generic interface to expand the physical pages in a zone */ | 74 | /* reasonably generic interface to expand the physical pages in a zone */ |
75 | extern int __add_pages(struct zone *zone, unsigned long start_pfn, | 75 | extern int __add_pages(int nid, struct zone *zone, unsigned long start_pfn, |
76 | unsigned long nr_pages); | 76 | unsigned long nr_pages); |
77 | extern int __remove_pages(struct zone *zone, unsigned long start_pfn, | 77 | extern int __remove_pages(struct zone *zone, unsigned long start_pfn, |
78 | unsigned long nr_pages); | 78 | unsigned long nr_pages); |
diff --git a/include/linux/memstick.h b/include/linux/memstick.h index d0c37e682234..690c35a9d4cc 100644 --- a/include/linux/memstick.h +++ b/include/linux/memstick.h | |||
@@ -100,8 +100,8 @@ struct mspro_param_register { | |||
100 | #define MEMSTICK_SYS_PAR8 0x40 | 100 | #define MEMSTICK_SYS_PAR8 0x40 |
101 | #define MEMSTICK_SYS_SERIAL 0x80 | 101 | #define MEMSTICK_SYS_SERIAL 0x80 |
102 | 102 | ||
103 | unsigned short data_count; | 103 | __be16 data_count; |
104 | unsigned int data_address; | 104 | __be32 data_address; |
105 | unsigned char tpc_param; | 105 | unsigned char tpc_param; |
106 | } __attribute__((packed)); | 106 | } __attribute__((packed)); |
107 | 107 | ||
diff --git a/include/linux/mfd/da903x.h b/include/linux/mfd/da903x.h index cad314c12439..115dbe965082 100644 --- a/include/linux/mfd/da903x.h +++ b/include/linux/mfd/da903x.h | |||
@@ -32,6 +32,7 @@ enum { | |||
32 | DA9030_ID_LDO18, | 32 | DA9030_ID_LDO18, |
33 | DA9030_ID_LDO19, | 33 | DA9030_ID_LDO19, |
34 | DA9030_ID_LDO_INT, /* LDO Internal */ | 34 | DA9030_ID_LDO_INT, /* LDO Internal */ |
35 | DA9030_ID_BAT, /* battery charger */ | ||
35 | 36 | ||
36 | DA9034_ID_LED_1, | 37 | DA9034_ID_LED_1, |
37 | DA9034_ID_LED_2, | 38 | DA9034_ID_LED_2, |
@@ -93,6 +94,43 @@ struct da9034_touch_pdata { | |||
93 | int y_inverted; | 94 | int y_inverted; |
94 | }; | 95 | }; |
95 | 96 | ||
97 | /* DA9030 battery charger data */ | ||
98 | struct power_supply_info; | ||
99 | |||
100 | struct da9030_battery_info { | ||
101 | /* battery parameters */ | ||
102 | struct power_supply_info *battery_info; | ||
103 | |||
104 | /* current and voltage to use for battery charging */ | ||
105 | unsigned int charge_milliamp; | ||
106 | unsigned int charge_millivolt; | ||
107 | |||
108 | /* voltage thresholds (in millivolts) */ | ||
109 | int vbat_low; | ||
110 | int vbat_crit; | ||
111 | int vbat_charge_start; | ||
112 | int vbat_charge_stop; | ||
113 | int vbat_charge_restart; | ||
114 | |||
115 | /* battery nominal minimal and maximal voltages in millivolts */ | ||
116 | int vcharge_min; | ||
117 | int vcharge_max; | ||
118 | |||
119 | /* Temperature thresholds. These are DA9030 register values | ||
120 | "as is" and should be measured for each battery type */ | ||
121 | int tbat_low; | ||
122 | int tbat_high; | ||
123 | int tbat_restart; | ||
124 | |||
125 | |||
126 | /* battery monitor interval (seconds) */ | ||
127 | unsigned int batmon_interval; | ||
128 | |||
129 | /* platform callbacks for battery low and critical events */ | ||
130 | void (*battery_low)(void); | ||
131 | void (*battery_critical)(void); | ||
132 | }; | ||
133 | |||
96 | struct da903x_subdev_info { | 134 | struct da903x_subdev_info { |
97 | int id; | 135 | int id; |
98 | const char *name; | 136 | const char *name; |
@@ -190,11 +228,13 @@ extern int da903x_unregister_notifier(struct device *dev, | |||
190 | extern int da903x_query_status(struct device *dev, unsigned int status); | 228 | extern int da903x_query_status(struct device *dev, unsigned int status); |
191 | 229 | ||
192 | 230 | ||
193 | /* NOTE: the two functions below are not intended for use outside | 231 | /* NOTE: the functions below are not intended for use outside |
194 | * of the DA9034 sub-device drivers | 232 | * of the DA903x sub-device drivers |
195 | */ | 233 | */ |
196 | extern int da903x_write(struct device *dev, int reg, uint8_t val); | 234 | extern int da903x_write(struct device *dev, int reg, uint8_t val); |
235 | extern int da903x_writes(struct device *dev, int reg, int len, uint8_t *val); | ||
197 | extern int da903x_read(struct device *dev, int reg, uint8_t *val); | 236 | extern int da903x_read(struct device *dev, int reg, uint8_t *val); |
237 | extern int da903x_reads(struct device *dev, int reg, int len, uint8_t *val); | ||
198 | extern int da903x_update(struct device *dev, int reg, uint8_t val, uint8_t mask); | 238 | extern int da903x_update(struct device *dev, int reg, uint8_t val, uint8_t mask); |
199 | extern int da903x_set_bits(struct device *dev, int reg, uint8_t bit_mask); | 239 | extern int da903x_set_bits(struct device *dev, int reg, uint8_t bit_mask); |
200 | extern int da903x_clr_bits(struct device *dev, int reg, uint8_t bit_mask); | 240 | extern int da903x_clr_bits(struct device *dev, int reg, uint8_t bit_mask); |
diff --git a/include/linux/mfd/wm8350/comparator.h b/include/linux/mfd/wm8350/comparator.h index 053788649452..54bc5d0fd502 100644 --- a/include/linux/mfd/wm8350/comparator.h +++ b/include/linux/mfd/wm8350/comparator.h | |||
@@ -164,4 +164,12 @@ | |||
164 | #define WM8350_AUXADC_BATT 6 | 164 | #define WM8350_AUXADC_BATT 6 |
165 | #define WM8350_AUXADC_TEMP 7 | 165 | #define WM8350_AUXADC_TEMP 7 |
166 | 166 | ||
167 | struct wm8350; | ||
168 | |||
169 | /* | ||
170 | * AUX ADC Readback | ||
171 | */ | ||
172 | int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, | ||
173 | int vref); | ||
174 | |||
167 | #endif | 175 | #endif |
diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h index 6ebf97f2a475..980669d50dca 100644 --- a/include/linux/mfd/wm8350/core.h +++ b/include/linux/mfd/wm8350/core.h | |||
@@ -29,6 +29,7 @@ | |||
29 | */ | 29 | */ |
30 | #define WM8350_RESET_ID 0x00 | 30 | #define WM8350_RESET_ID 0x00 |
31 | #define WM8350_ID 0x01 | 31 | #define WM8350_ID 0x01 |
32 | #define WM8350_REVISION 0x02 | ||
32 | #define WM8350_SYSTEM_CONTROL_1 0x03 | 33 | #define WM8350_SYSTEM_CONTROL_1 0x03 |
33 | #define WM8350_SYSTEM_CONTROL_2 0x04 | 34 | #define WM8350_SYSTEM_CONTROL_2 0x04 |
34 | #define WM8350_SYSTEM_HIBERNATE 0x05 | 35 | #define WM8350_SYSTEM_HIBERNATE 0x05 |
@@ -57,6 +58,10 @@ | |||
57 | #define WM8350_OVER_CURRENT_INT_STATUS_MASK 0x25 | 58 | #define WM8350_OVER_CURRENT_INT_STATUS_MASK 0x25 |
58 | #define WM8350_GPIO_INT_STATUS_MASK 0x26 | 59 | #define WM8350_GPIO_INT_STATUS_MASK 0x26 |
59 | #define WM8350_COMPARATOR_INT_STATUS_MASK 0x27 | 60 | #define WM8350_COMPARATOR_INT_STATUS_MASK 0x27 |
61 | #define WM8350_CHARGER_OVERRIDES 0xE2 | ||
62 | #define WM8350_MISC_OVERRIDES 0xE3 | ||
63 | #define WM8350_COMPARATOR_OVERRIDES 0xE7 | ||
64 | #define WM8350_STATE_MACHINE_STATUS 0xE9 | ||
60 | 65 | ||
61 | #define WM8350_MAX_REGISTER 0xFF | 66 | #define WM8350_MAX_REGISTER 0xFF |
62 | 67 | ||
@@ -77,6 +82,11 @@ | |||
77 | #define WM8350_CUST_ID_MASK 0x00FF | 82 | #define WM8350_CUST_ID_MASK 0x00FF |
78 | 83 | ||
79 | /* | 84 | /* |
85 | * R2 (0x02) - Revision | ||
86 | */ | ||
87 | #define WM8350_MASK_REV_MASK 0x00FF | ||
88 | |||
89 | /* | ||
80 | * R3 (0x03) - System Control 1 | 90 | * R3 (0x03) - System Control 1 |
81 | */ | 91 | */ |
82 | #define WM8350_CHIP_ON 0x8000 | 92 | #define WM8350_CHIP_ON 0x8000 |
@@ -523,6 +533,35 @@ | |||
523 | #define WM8350_DC2_STS 0x0002 | 533 | #define WM8350_DC2_STS 0x0002 |
524 | #define WM8350_DC1_STS 0x0001 | 534 | #define WM8350_DC1_STS 0x0001 |
525 | 535 | ||
536 | /* | ||
537 | * R226 (0xE2) - Charger status | ||
538 | */ | ||
539 | #define WM8350_CHG_BATT_HOT_OVRDE 0x8000 | ||
540 | #define WM8350_CHG_BATT_COLD_OVRDE 0x4000 | ||
541 | |||
542 | /* | ||
543 | * R227 (0xE3) - Misc Overrides | ||
544 | */ | ||
545 | #define WM8350_USB_LIMIT_OVRDE 0x0400 | ||
546 | |||
547 | /* | ||
548 | * R227 (0xE7) - Comparator Overrides | ||
549 | */ | ||
550 | #define WM8350_USB_FB_OVRDE 0x8000 | ||
551 | #define WM8350_WALL_FB_OVRDE 0x4000 | ||
552 | #define WM8350_BATT_FB_OVRDE 0x2000 | ||
553 | |||
554 | |||
555 | /* | ||
556 | * R233 (0xE9) - State Machinine Status | ||
557 | */ | ||
558 | #define WM8350_USB_SM_MASK 0x0700 | ||
559 | #define WM8350_USB_SM_SHIFT 8 | ||
560 | |||
561 | #define WM8350_USB_SM_100_SLV 1 | ||
562 | #define WM8350_USB_SM_500_SLV 5 | ||
563 | #define WM8350_USB_SM_STDBY_SLV 7 | ||
564 | |||
526 | /* WM8350 wake up conditions */ | 565 | /* WM8350 wake up conditions */ |
527 | #define WM8350_IRQ_WKUP_OFF_STATE 43 | 566 | #define WM8350_IRQ_WKUP_OFF_STATE 43 |
528 | #define WM8350_IRQ_WKUP_HIB_STATE 44 | 567 | #define WM8350_IRQ_WKUP_HIB_STATE 44 |
@@ -536,6 +575,7 @@ | |||
536 | #define WM8350_REV_E 0x4 | 575 | #define WM8350_REV_E 0x4 |
537 | #define WM8350_REV_F 0x5 | 576 | #define WM8350_REV_F 0x5 |
538 | #define WM8350_REV_G 0x6 | 577 | #define WM8350_REV_G 0x6 |
578 | #define WM8350_REV_H 0x7 | ||
539 | 579 | ||
540 | #define WM8350_NUM_IRQ 63 | 580 | #define WM8350_NUM_IRQ 63 |
541 | 581 | ||
@@ -549,6 +589,14 @@ extern const u16 wm8350_mode0_defaults[]; | |||
549 | extern const u16 wm8350_mode1_defaults[]; | 589 | extern const u16 wm8350_mode1_defaults[]; |
550 | extern const u16 wm8350_mode2_defaults[]; | 590 | extern const u16 wm8350_mode2_defaults[]; |
551 | extern const u16 wm8350_mode3_defaults[]; | 591 | extern const u16 wm8350_mode3_defaults[]; |
592 | extern const u16 wm8351_mode0_defaults[]; | ||
593 | extern const u16 wm8351_mode1_defaults[]; | ||
594 | extern const u16 wm8351_mode2_defaults[]; | ||
595 | extern const u16 wm8351_mode3_defaults[]; | ||
596 | extern const u16 wm8352_mode0_defaults[]; | ||
597 | extern const u16 wm8352_mode1_defaults[]; | ||
598 | extern const u16 wm8352_mode2_defaults[]; | ||
599 | extern const u16 wm8352_mode3_defaults[]; | ||
552 | 600 | ||
553 | struct wm8350; | 601 | struct wm8350; |
554 | 602 | ||
@@ -558,8 +606,6 @@ struct wm8350_irq { | |||
558 | }; | 606 | }; |
559 | 607 | ||
560 | struct wm8350 { | 608 | struct wm8350 { |
561 | int rev; /* chip revision */ | ||
562 | |||
563 | struct device *dev; | 609 | struct device *dev; |
564 | 610 | ||
565 | /* device IO */ | 611 | /* device IO */ |
@@ -572,6 +618,8 @@ struct wm8350 { | |||
572 | void *src); | 618 | void *src); |
573 | u16 *reg_cache; | 619 | u16 *reg_cache; |
574 | 620 | ||
621 | struct mutex auxadc_mutex; | ||
622 | |||
575 | /* Interrupt handling */ | 623 | /* Interrupt handling */ |
576 | struct work_struct irq_work; | 624 | struct work_struct irq_work; |
577 | struct mutex irq_mutex; /* IRQ table mutex */ | 625 | struct mutex irq_mutex; /* IRQ table mutex */ |
diff --git a/include/linux/mfd/wm8350/pmic.h b/include/linux/mfd/wm8350/pmic.h index 69b69e07f62f..be3264e286e0 100644 --- a/include/linux/mfd/wm8350/pmic.h +++ b/include/linux/mfd/wm8350/pmic.h | |||
@@ -13,6 +13,10 @@ | |||
13 | #ifndef __LINUX_MFD_WM8350_PMIC_H | 13 | #ifndef __LINUX_MFD_WM8350_PMIC_H |
14 | #define __LINUX_MFD_WM8350_PMIC_H | 14 | #define __LINUX_MFD_WM8350_PMIC_H |
15 | 15 | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/leds.h> | ||
18 | #include <linux/regulator/machine.h> | ||
19 | |||
16 | /* | 20 | /* |
17 | * Register values. | 21 | * Register values. |
18 | */ | 22 | */ |
@@ -700,7 +704,38 @@ struct wm8350; | |||
700 | struct platform_device; | 704 | struct platform_device; |
701 | struct regulator_init_data; | 705 | struct regulator_init_data; |
702 | 706 | ||
707 | /* | ||
708 | * WM8350 LED platform data | ||
709 | */ | ||
710 | struct wm8350_led_platform_data { | ||
711 | const char *name; | ||
712 | const char *default_trigger; | ||
713 | int max_uA; | ||
714 | }; | ||
715 | |||
716 | struct wm8350_led { | ||
717 | struct platform_device *pdev; | ||
718 | struct mutex mutex; | ||
719 | struct work_struct work; | ||
720 | spinlock_t value_lock; | ||
721 | enum led_brightness value; | ||
722 | struct led_classdev cdev; | ||
723 | int max_uA_index; | ||
724 | int enabled; | ||
725 | |||
726 | struct regulator *isink; | ||
727 | struct regulator_consumer_supply isink_consumer; | ||
728 | struct regulator_init_data isink_init; | ||
729 | struct regulator *dcdc; | ||
730 | struct regulator_consumer_supply dcdc_consumer; | ||
731 | struct regulator_init_data dcdc_init; | ||
732 | }; | ||
733 | |||
703 | struct wm8350_pmic { | 734 | struct wm8350_pmic { |
735 | /* Number of regulators of each type on this device */ | ||
736 | int max_dcdc; | ||
737 | int max_isink; | ||
738 | |||
704 | /* ISINK to DCDC mapping */ | 739 | /* ISINK to DCDC mapping */ |
705 | int isink_A_dcdc; | 740 | int isink_A_dcdc; |
706 | int isink_B_dcdc; | 741 | int isink_B_dcdc; |
@@ -713,10 +748,15 @@ struct wm8350_pmic { | |||
713 | 748 | ||
714 | /* regulator devices */ | 749 | /* regulator devices */ |
715 | struct platform_device *pdev[NUM_WM8350_REGULATORS]; | 750 | struct platform_device *pdev[NUM_WM8350_REGULATORS]; |
751 | |||
752 | /* LED devices */ | ||
753 | struct wm8350_led led[2]; | ||
716 | }; | 754 | }; |
717 | 755 | ||
718 | int wm8350_register_regulator(struct wm8350 *wm8350, int reg, | 756 | int wm8350_register_regulator(struct wm8350 *wm8350, int reg, |
719 | struct regulator_init_data *initdata); | 757 | struct regulator_init_data *initdata); |
758 | int wm8350_register_led(struct wm8350 *wm8350, int lednum, int dcdc, int isink, | ||
759 | struct wm8350_led_platform_data *pdata); | ||
720 | 760 | ||
721 | /* | 761 | /* |
722 | * Additional DCDC control not supported via regulator API | 762 | * Additional DCDC control not supported via regulator API |
diff --git a/include/linux/mfd/wm8350/supply.h b/include/linux/mfd/wm8350/supply.h index 1c8f3cde79b0..2b9479310bbd 100644 --- a/include/linux/mfd/wm8350/supply.h +++ b/include/linux/mfd/wm8350/supply.h | |||
@@ -13,7 +13,8 @@ | |||
13 | #ifndef __LINUX_MFD_WM8350_SUPPLY_H_ | 13 | #ifndef __LINUX_MFD_WM8350_SUPPLY_H_ |
14 | #define __LINUX_MFD_WM8350_SUPPLY_H_ | 14 | #define __LINUX_MFD_WM8350_SUPPLY_H_ |
15 | 15 | ||
16 | #include <linux/platform_device.h> | 16 | #include <linux/mutex.h> |
17 | #include <linux/power_supply.h> | ||
17 | 18 | ||
18 | /* | 19 | /* |
19 | * Charger registers | 20 | * Charger registers |
@@ -104,8 +105,30 @@ | |||
104 | #define WM8350_IRQ_EXT_WALL_FB 37 | 105 | #define WM8350_IRQ_EXT_WALL_FB 37 |
105 | #define WM8350_IRQ_EXT_BAT_FB 38 | 106 | #define WM8350_IRQ_EXT_BAT_FB 38 |
106 | 107 | ||
108 | /* | ||
109 | * Policy to control charger state machine. | ||
110 | */ | ||
111 | struct wm8350_charger_policy { | ||
112 | |||
113 | /* charger state machine policy - set in machine driver */ | ||
114 | int eoc_mA; /* end of charge current (mA) */ | ||
115 | int charge_mV; /* charge voltage */ | ||
116 | int fast_limit_mA; /* fast charge current limit */ | ||
117 | int fast_limit_USB_mA; /* USB fast charge current limit */ | ||
118 | int charge_timeout; /* charge timeout (mins) */ | ||
119 | int trickle_start_mV; /* trickle charge starts at mV */ | ||
120 | int trickle_charge_mA; /* trickle charge current */ | ||
121 | int trickle_charge_USB_mA; /* USB trickle charge current */ | ||
122 | }; | ||
123 | |||
107 | struct wm8350_power { | 124 | struct wm8350_power { |
108 | struct platform_device *pdev; | 125 | struct platform_device *pdev; |
126 | struct power_supply battery; | ||
127 | struct power_supply usb; | ||
128 | struct power_supply ac; | ||
129 | struct wm8350_charger_policy *policy; | ||
130 | |||
131 | int rev_g_coeff; | ||
109 | }; | 132 | }; |
110 | 133 | ||
111 | #endif | 134 | #endif |
diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 3f34005068d4..527602cdea1c 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h | |||
@@ -7,6 +7,8 @@ | |||
7 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); | 7 | typedef struct page *new_page_t(struct page *, unsigned long private, int **); |
8 | 8 | ||
9 | #ifdef CONFIG_MIGRATION | 9 | #ifdef CONFIG_MIGRATION |
10 | #define PAGE_MIGRATION 1 | ||
11 | |||
10 | extern int putback_lru_pages(struct list_head *l); | 12 | extern int putback_lru_pages(struct list_head *l); |
11 | extern int migrate_page(struct address_space *, | 13 | extern int migrate_page(struct address_space *, |
12 | struct page *, struct page *); | 14 | struct page *, struct page *); |
@@ -20,6 +22,8 @@ extern int migrate_vmas(struct mm_struct *mm, | |||
20 | const nodemask_t *from, const nodemask_t *to, | 22 | const nodemask_t *from, const nodemask_t *to, |
21 | unsigned long flags); | 23 | unsigned long flags); |
22 | #else | 24 | #else |
25 | #define PAGE_MIGRATION 0 | ||
26 | |||
23 | static inline int putback_lru_pages(struct list_head *l) { return 0; } | 27 | static inline int putback_lru_pages(struct list_head *l) { return 0; } |
24 | static inline int migrate_pages(struct list_head *l, new_page_t x, | 28 | static inline int migrate_pages(struct list_head *l, new_page_t x, |
25 | unsigned long private) { return -ENOSYS; } | 29 | unsigned long private) { return -ENOSYS; } |
diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index 26433ec520b3..a820f816a49e 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h | |||
@@ -3,33 +3,33 @@ | |||
3 | #include <linux/module.h> | 3 | #include <linux/module.h> |
4 | #include <linux/major.h> | 4 | #include <linux/major.h> |
5 | 5 | ||
6 | #define PSMOUSE_MINOR 1 | 6 | #define PSMOUSE_MINOR 1 |
7 | #define MS_BUSMOUSE_MINOR 2 | 7 | #define MS_BUSMOUSE_MINOR 2 |
8 | #define ATIXL_BUSMOUSE_MINOR 3 | 8 | #define ATIXL_BUSMOUSE_MINOR 3 |
9 | /*#define AMIGAMOUSE_MINOR 4 FIXME OBSOLETE */ | 9 | /*#define AMIGAMOUSE_MINOR 4 FIXME OBSOLETE */ |
10 | #define ATARIMOUSE_MINOR 5 | 10 | #define ATARIMOUSE_MINOR 5 |
11 | #define SUN_MOUSE_MINOR 6 | 11 | #define SUN_MOUSE_MINOR 6 |
12 | #define APOLLO_MOUSE_MINOR 7 | 12 | #define APOLLO_MOUSE_MINOR 7 |
13 | #define PC110PAD_MINOR 9 | 13 | #define PC110PAD_MINOR 9 |
14 | /*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */ | 14 | /*#define ADB_MOUSE_MINOR 10 FIXME OBSOLETE */ |
15 | #define WATCHDOG_MINOR 130 /* Watchdog timer */ | 15 | #define WATCHDOG_MINOR 130 /* Watchdog timer */ |
16 | #define TEMP_MINOR 131 /* Temperature Sensor */ | 16 | #define TEMP_MINOR 131 /* Temperature Sensor */ |
17 | #define RTC_MINOR 135 | 17 | #define RTC_MINOR 135 |
18 | #define EFI_RTC_MINOR 136 /* EFI Time services */ | 18 | #define EFI_RTC_MINOR 136 /* EFI Time services */ |
19 | #define SUN_OPENPROM_MINOR 139 | 19 | #define SUN_OPENPROM_MINOR 139 |
20 | #define DMAPI_MINOR 140 /* DMAPI */ | 20 | #define DMAPI_MINOR 140 /* DMAPI */ |
21 | #define NVRAM_MINOR 144 | 21 | #define NVRAM_MINOR 144 |
22 | #define SGI_MMTIMER 153 | 22 | #define SGI_MMTIMER 153 |
23 | #define STORE_QUEUE_MINOR 155 | 23 | #define STORE_QUEUE_MINOR 155 |
24 | #define I2O_MINOR 166 | 24 | #define I2O_MINOR 166 |
25 | #define MICROCODE_MINOR 184 | 25 | #define MICROCODE_MINOR 184 |
26 | #define MWAVE_MINOR 219 /* ACP/Mwave Modem */ | 26 | #define TUN_MINOR 200 |
27 | #define MPT_MINOR 220 | 27 | #define MWAVE_MINOR 219 /* ACP/Mwave Modem */ |
28 | #define MISC_DYNAMIC_MINOR 255 | 28 | #define MPT_MINOR 220 |
29 | 29 | #define HPET_MINOR 228 | |
30 | #define TUN_MINOR 200 | 30 | #define FUSE_MINOR 229 |
31 | #define HPET_MINOR 228 | 31 | #define KVM_MINOR 232 |
32 | #define KVM_MINOR 232 | 32 | #define MISC_DYNAMIC_MINOR 255 |
33 | 33 | ||
34 | struct device; | 34 | struct device; |
35 | 35 | ||
diff --git a/include/linux/mm.h b/include/linux/mm.h index aaa8b843be28..b91a73fd1bcc 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -56,19 +56,9 @@ extern unsigned long mmap_min_addr; | |||
56 | 56 | ||
57 | extern struct kmem_cache *vm_area_cachep; | 57 | extern struct kmem_cache *vm_area_cachep; |
58 | 58 | ||
59 | /* | ||
60 | * This struct defines the per-mm list of VMAs for uClinux. If CONFIG_MMU is | ||
61 | * disabled, then there's a single shared list of VMAs maintained by the | ||
62 | * system, and mm's subscribe to these individually | ||
63 | */ | ||
64 | struct vm_list_struct { | ||
65 | struct vm_list_struct *next; | ||
66 | struct vm_area_struct *vma; | ||
67 | }; | ||
68 | |||
69 | #ifndef CONFIG_MMU | 59 | #ifndef CONFIG_MMU |
70 | extern struct rb_root nommu_vma_tree; | 60 | extern struct rb_root nommu_region_tree; |
71 | extern struct rw_semaphore nommu_vma_sem; | 61 | extern struct rw_semaphore nommu_region_sem; |
72 | 62 | ||
73 | extern unsigned int kobjsize(const void *objp); | 63 | extern unsigned int kobjsize(const void *objp); |
74 | #endif | 64 | #endif |
@@ -717,6 +707,11 @@ static inline int page_mapped(struct page *page) | |||
717 | 707 | ||
718 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS) | 708 | #define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS) |
719 | 709 | ||
710 | /* | ||
711 | * Can be called by the pagefault handler when it gets a VM_FAULT_OOM. | ||
712 | */ | ||
713 | extern void pagefault_out_of_memory(void); | ||
714 | |||
720 | #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) | 715 | #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) |
721 | 716 | ||
722 | extern void show_free_areas(void); | 717 | extern void show_free_areas(void); |
@@ -1056,6 +1051,7 @@ extern void memmap_init_zone(unsigned long, int, unsigned long, | |||
1056 | unsigned long, enum memmap_context); | 1051 | unsigned long, enum memmap_context); |
1057 | extern void setup_per_zone_pages_min(void); | 1052 | extern void setup_per_zone_pages_min(void); |
1058 | extern void mem_init(void); | 1053 | extern void mem_init(void); |
1054 | extern void __init mmap_init(void); | ||
1059 | extern void show_mem(void); | 1055 | extern void show_mem(void); |
1060 | extern void si_meminfo(struct sysinfo * val); | 1056 | extern void si_meminfo(struct sysinfo * val); |
1061 | extern void si_meminfo_node(struct sysinfo *val, int nid); | 1057 | extern void si_meminfo_node(struct sysinfo *val, int nid); |
@@ -1067,6 +1063,9 @@ extern void setup_per_cpu_pageset(void); | |||
1067 | static inline void setup_per_cpu_pageset(void) {} | 1063 | static inline void setup_per_cpu_pageset(void) {} |
1068 | #endif | 1064 | #endif |
1069 | 1065 | ||
1066 | /* nommu.c */ | ||
1067 | extern atomic_t mmap_pages_allocated; | ||
1068 | |||
1070 | /* prio_tree.c */ | 1069 | /* prio_tree.c */ |
1071 | void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old); | 1070 | void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old); |
1072 | void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *); | 1071 | void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *); |
diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index c948350c378e..7fbb97267556 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h | |||
@@ -28,6 +28,7 @@ add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l) | |||
28 | { | 28 | { |
29 | list_add(&page->lru, &zone->lru[l].list); | 29 | list_add(&page->lru, &zone->lru[l].list); |
30 | __inc_zone_state(zone, NR_LRU_BASE + l); | 30 | __inc_zone_state(zone, NR_LRU_BASE + l); |
31 | mem_cgroup_add_lru_list(page, l); | ||
31 | } | 32 | } |
32 | 33 | ||
33 | static inline void | 34 | static inline void |
@@ -35,6 +36,7 @@ del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l) | |||
35 | { | 36 | { |
36 | list_del(&page->lru); | 37 | list_del(&page->lru); |
37 | __dec_zone_state(zone, NR_LRU_BASE + l); | 38 | __dec_zone_state(zone, NR_LRU_BASE + l); |
39 | mem_cgroup_del_lru_list(page, l); | ||
38 | } | 40 | } |
39 | 41 | ||
40 | static inline void | 42 | static inline void |
@@ -54,6 +56,7 @@ del_page_from_lru(struct zone *zone, struct page *page) | |||
54 | l += page_is_file_cache(page); | 56 | l += page_is_file_cache(page); |
55 | } | 57 | } |
56 | __dec_zone_state(zone, NR_LRU_BASE + l); | 58 | __dec_zone_state(zone, NR_LRU_BASE + l); |
59 | mem_cgroup_del_lru_list(page, l); | ||
57 | } | 60 | } |
58 | 61 | ||
59 | /** | 62 | /** |
@@ -78,23 +81,4 @@ static inline enum lru_list page_lru(struct page *page) | |||
78 | return lru; | 81 | return lru; |
79 | } | 82 | } |
80 | 83 | ||
81 | /** | ||
82 | * inactive_anon_is_low - check if anonymous pages need to be deactivated | ||
83 | * @zone: zone to check | ||
84 | * | ||
85 | * Returns true if the zone does not have enough inactive anon pages, | ||
86 | * meaning some active anon pages need to be deactivated. | ||
87 | */ | ||
88 | static inline int inactive_anon_is_low(struct zone *zone) | ||
89 | { | ||
90 | unsigned long active, inactive; | ||
91 | |||
92 | active = zone_page_state(zone, NR_ACTIVE_ANON); | ||
93 | inactive = zone_page_state(zone, NR_INACTIVE_ANON); | ||
94 | |||
95 | if (inactive * zone->inactive_ratio < active) | ||
96 | return 1; | ||
97 | |||
98 | return 0; | ||
99 | } | ||
100 | #endif | 84 | #endif |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index fe825471d5aa..92915e81443f 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -97,6 +97,23 @@ struct page { | |||
97 | }; | 97 | }; |
98 | 98 | ||
99 | /* | 99 | /* |
100 | * A region containing a mapping of a non-memory backed file under NOMMU | ||
101 | * conditions. These are held in a global tree and are pinned by the VMAs that | ||
102 | * map parts of them. | ||
103 | */ | ||
104 | struct vm_region { | ||
105 | struct rb_node vm_rb; /* link in global region tree */ | ||
106 | unsigned long vm_flags; /* VMA vm_flags */ | ||
107 | unsigned long vm_start; /* start address of region */ | ||
108 | unsigned long vm_end; /* region initialised to here */ | ||
109 | unsigned long vm_top; /* region allocated to here */ | ||
110 | unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */ | ||
111 | struct file *vm_file; /* the backing file or NULL */ | ||
112 | |||
113 | atomic_t vm_usage; /* region usage count */ | ||
114 | }; | ||
115 | |||
116 | /* | ||
100 | * This struct defines a memory VMM memory area. There is one of these | 117 | * This struct defines a memory VMM memory area. There is one of these |
101 | * per VM-area/task. A VM area is any part of the process virtual memory | 118 | * per VM-area/task. A VM area is any part of the process virtual memory |
102 | * space that has a special rule for the page-fault handlers (ie a shared | 119 | * space that has a special rule for the page-fault handlers (ie a shared |
@@ -152,7 +169,7 @@ struct vm_area_struct { | |||
152 | unsigned long vm_truncate_count;/* truncate_count or restart_addr */ | 169 | unsigned long vm_truncate_count;/* truncate_count or restart_addr */ |
153 | 170 | ||
154 | #ifndef CONFIG_MMU | 171 | #ifndef CONFIG_MMU |
155 | atomic_t vm_usage; /* refcount (VMAs shared if !MMU) */ | 172 | struct vm_region *vm_region; /* NOMMU mapping region */ |
156 | #endif | 173 | #endif |
157 | #ifdef CONFIG_NUMA | 174 | #ifdef CONFIG_NUMA |
158 | struct mempolicy *vm_policy; /* NUMA policy for the VMA */ | 175 | struct mempolicy *vm_policy; /* NUMA policy for the VMA */ |
@@ -232,8 +249,9 @@ struct mm_struct { | |||
232 | struct core_state *core_state; /* coredumping support */ | 249 | struct core_state *core_state; /* coredumping support */ |
233 | 250 | ||
234 | /* aio bits */ | 251 | /* aio bits */ |
235 | rwlock_t ioctx_list_lock; /* aio lock */ | 252 | spinlock_t ioctx_lock; |
236 | struct kioctx *ioctx_list; | 253 | struct hlist_head ioctx_list; |
254 | |||
237 | #ifdef CONFIG_MM_OWNER | 255 | #ifdef CONFIG_MM_OWNER |
238 | /* | 256 | /* |
239 | * "owner" points to a task that is regarded as the canonical | 257 | * "owner" points to a task that is regarded as the canonical |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 143cebf0586f..7ac8b500d55c 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
@@ -151,4 +151,6 @@ static inline void mmc_claim_host(struct mmc_host *host) | |||
151 | __mmc_claim_host(host, NULL); | 151 | __mmc_claim_host(host, NULL); |
152 | } | 152 | } |
153 | 153 | ||
154 | extern u32 mmc_vddrange_to_ocrmask(int vdd_min, int vdd_max); | ||
155 | |||
154 | #endif | 156 | #endif |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index f842f234e44f..4e457256bd33 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
@@ -41,6 +41,7 @@ struct mmc_ios { | |||
41 | 41 | ||
42 | #define MMC_BUS_WIDTH_1 0 | 42 | #define MMC_BUS_WIDTH_1 0 |
43 | #define MMC_BUS_WIDTH_4 2 | 43 | #define MMC_BUS_WIDTH_4 2 |
44 | #define MMC_BUS_WIDTH_8 3 | ||
44 | 45 | ||
45 | unsigned char timing; /* timing specification used */ | 46 | unsigned char timing; /* timing specification used */ |
46 | 47 | ||
@@ -116,6 +117,7 @@ struct mmc_host { | |||
116 | #define MMC_CAP_SDIO_IRQ (1 << 3) /* Can signal pending SDIO IRQs */ | 117 | #define MMC_CAP_SDIO_IRQ (1 << 3) /* Can signal pending SDIO IRQs */ |
117 | #define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */ | 118 | #define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */ |
118 | #define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */ | 119 | #define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */ |
120 | #define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */ | ||
119 | 121 | ||
120 | /* host specific block data */ | 122 | /* host specific block data */ |
121 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ | 123 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 35a7b5e19465..09c14e213b63 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -263,6 +263,19 @@ enum zone_type { | |||
263 | #error ZONES_SHIFT -- too many zones configured adjust calculation | 263 | #error ZONES_SHIFT -- too many zones configured adjust calculation |
264 | #endif | 264 | #endif |
265 | 265 | ||
266 | struct zone_reclaim_stat { | ||
267 | /* | ||
268 | * The pageout code in vmscan.c keeps track of how many of the | ||
269 | * mem/swap backed and file backed pages are refeferenced. | ||
270 | * The higher the rotated/scanned ratio, the more valuable | ||
271 | * that cache is. | ||
272 | * | ||
273 | * The anon LRU stats live in [0], file LRU stats in [1] | ||
274 | */ | ||
275 | unsigned long recent_rotated[2]; | ||
276 | unsigned long recent_scanned[2]; | ||
277 | }; | ||
278 | |||
266 | struct zone { | 279 | struct zone { |
267 | /* Fields commonly accessed by the page allocator */ | 280 | /* Fields commonly accessed by the page allocator */ |
268 | unsigned long pages_min, pages_low, pages_high; | 281 | unsigned long pages_min, pages_low, pages_high; |
@@ -315,16 +328,7 @@ struct zone { | |||
315 | unsigned long nr_scan; | 328 | unsigned long nr_scan; |
316 | } lru[NR_LRU_LISTS]; | 329 | } lru[NR_LRU_LISTS]; |
317 | 330 | ||
318 | /* | 331 | struct zone_reclaim_stat reclaim_stat; |
319 | * The pageout code in vmscan.c keeps track of how many of the | ||
320 | * mem/swap backed and file backed pages are refeferenced. | ||
321 | * The higher the rotated/scanned ratio, the more valuable | ||
322 | * that cache is. | ||
323 | * | ||
324 | * The anon LRU stats live in [0], file LRU stats in [1] | ||
325 | */ | ||
326 | unsigned long recent_rotated[2]; | ||
327 | unsigned long recent_scanned[2]; | ||
328 | 332 | ||
329 | unsigned long pages_scanned; /* since last reclaim */ | 333 | unsigned long pages_scanned; /* since last reclaim */ |
330 | unsigned long flags; /* zone flags, see below */ | 334 | unsigned long flags; /* zone flags, see below */ |
diff --git a/include/linux/module.h b/include/linux/module.h index 3bfed013350b..4f7ea12463d3 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -294,9 +294,6 @@ struct module | |||
294 | /* The size of the executable code in each section. */ | 294 | /* The size of the executable code in each section. */ |
295 | unsigned int init_text_size, core_text_size; | 295 | unsigned int init_text_size, core_text_size; |
296 | 296 | ||
297 | /* The handle returned from unwind_add_table. */ | ||
298 | void *unwind_info; | ||
299 | |||
300 | /* Arch-specific module values */ | 297 | /* Arch-specific module values */ |
301 | struct mod_arch_specific arch; | 298 | struct mod_arch_specific arch; |
302 | 299 | ||
@@ -368,6 +365,18 @@ struct module *module_text_address(unsigned long addr); | |||
368 | struct module *__module_text_address(unsigned long addr); | 365 | struct module *__module_text_address(unsigned long addr); |
369 | int is_module_address(unsigned long addr); | 366 | int is_module_address(unsigned long addr); |
370 | 367 | ||
368 | static inline int within_module_core(unsigned long addr, struct module *mod) | ||
369 | { | ||
370 | return (unsigned long)mod->module_core <= addr && | ||
371 | addr < (unsigned long)mod->module_core + mod->core_size; | ||
372 | } | ||
373 | |||
374 | static inline int within_module_init(unsigned long addr, struct module *mod) | ||
375 | { | ||
376 | return (unsigned long)mod->module_init <= addr && | ||
377 | addr < (unsigned long)mod->module_init + mod->init_size; | ||
378 | } | ||
379 | |||
371 | /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if | 380 | /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if |
372 | symnum out of range. */ | 381 | symnum out of range. */ |
373 | int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, | 382 | int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, |
diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index eb1033957486..c1f40c2f7ffb 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h | |||
@@ -13,6 +13,9 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, | |||
13 | char *secstrings, | 13 | char *secstrings, |
14 | struct module *mod); | 14 | struct module *mod); |
15 | 15 | ||
16 | /* Additional bytes needed by arch in front of individual sections */ | ||
17 | unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); | ||
18 | |||
16 | /* Allocator used for allocating struct module, core sections and init | 19 | /* Allocator used for allocating struct module, core sections and init |
17 | sections. Returns NULL on failure. */ | 20 | sections. Returns NULL on failure. */ |
18 | void *module_alloc(unsigned long size); | 21 | void *module_alloc(unsigned long size); |
diff --git a/include/linux/msi.h b/include/linux/msi.h index 8f2939227207..d2b8a1e8ca11 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h | |||
@@ -10,8 +10,11 @@ struct msi_msg { | |||
10 | }; | 10 | }; |
11 | 11 | ||
12 | /* Helper functions */ | 12 | /* Helper functions */ |
13 | struct irq_desc; | ||
13 | extern void mask_msi_irq(unsigned int irq); | 14 | extern void mask_msi_irq(unsigned int irq); |
14 | extern void unmask_msi_irq(unsigned int irq); | 15 | extern void unmask_msi_irq(unsigned int irq); |
16 | extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | ||
17 | extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); | ||
15 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); | 18 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); |
16 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); | 19 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); |
17 | 20 | ||
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index 00e2b575021f..88d3d8fbf9f2 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h | |||
@@ -520,6 +520,7 @@ struct cfi_fixup { | |||
520 | 520 | ||
521 | #define CFI_MFR_AMD 0x0001 | 521 | #define CFI_MFR_AMD 0x0001 |
522 | #define CFI_MFR_ATMEL 0x001F | 522 | #define CFI_MFR_ATMEL 0x001F |
523 | #define CFI_MFR_SAMSUNG 0x00EC | ||
523 | #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ | 524 | #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ |
524 | 525 | ||
525 | void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); | 526 | void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); |
diff --git a/include/linux/mtd/concat.h b/include/linux/mtd/concat.h index c02f3d264ecf..e80c674daeb3 100644 --- a/include/linux/mtd/concat.h +++ b/include/linux/mtd/concat.h | |||
@@ -13,7 +13,7 @@ | |||
13 | struct mtd_info *mtd_concat_create( | 13 | struct mtd_info *mtd_concat_create( |
14 | struct mtd_info *subdev[], /* subdevices to concatenate */ | 14 | struct mtd_info *subdev[], /* subdevices to concatenate */ |
15 | int num_devs, /* number of subdevices */ | 15 | int num_devs, /* number of subdevices */ |
16 | char *name); /* name for the new device */ | 16 | const char *name); /* name for the new device */ |
17 | 17 | ||
18 | void mtd_concat_destroy(struct mtd_info *mtd); | 18 | void mtd_concat_destroy(struct mtd_info *mtd); |
19 | 19 | ||
diff --git a/include/linux/mtd/ftl.h b/include/linux/mtd/ftl.h index 0be442f881dd..0555f7a0b9ed 100644 --- a/include/linux/mtd/ftl.h +++ b/include/linux/mtd/ftl.h | |||
@@ -32,25 +32,25 @@ | |||
32 | #define _LINUX_FTL_H | 32 | #define _LINUX_FTL_H |
33 | 33 | ||
34 | typedef struct erase_unit_header_t { | 34 | typedef struct erase_unit_header_t { |
35 | u_int8_t LinkTargetTuple[5]; | 35 | uint8_t LinkTargetTuple[5]; |
36 | u_int8_t DataOrgTuple[10]; | 36 | uint8_t DataOrgTuple[10]; |
37 | u_int8_t NumTransferUnits; | 37 | uint8_t NumTransferUnits; |
38 | u_int32_t EraseCount; | 38 | uint32_t EraseCount; |
39 | u_int16_t LogicalEUN; | 39 | uint16_t LogicalEUN; |
40 | u_int8_t BlockSize; | 40 | uint8_t BlockSize; |
41 | u_int8_t EraseUnitSize; | 41 | uint8_t EraseUnitSize; |
42 | u_int16_t FirstPhysicalEUN; | 42 | uint16_t FirstPhysicalEUN; |
43 | u_int16_t NumEraseUnits; | 43 | uint16_t NumEraseUnits; |
44 | u_int32_t FormattedSize; | 44 | uint32_t FormattedSize; |
45 | u_int32_t FirstVMAddress; | 45 | uint32_t FirstVMAddress; |
46 | u_int16_t NumVMPages; | 46 | uint16_t NumVMPages; |
47 | u_int8_t Flags; | 47 | uint8_t Flags; |
48 | u_int8_t Code; | 48 | uint8_t Code; |
49 | u_int32_t SerialNumber; | 49 | uint32_t SerialNumber; |
50 | u_int32_t AltEUHOffset; | 50 | uint32_t AltEUHOffset; |
51 | u_int32_t BAMOffset; | 51 | uint32_t BAMOffset; |
52 | u_int8_t Reserved[12]; | 52 | uint8_t Reserved[12]; |
53 | u_int8_t EndTuple[2]; | 53 | uint8_t EndTuple[2]; |
54 | } erase_unit_header_t; | 54 | } erase_unit_header_t; |
55 | 55 | ||
56 | /* Flags in erase_unit_header_t */ | 56 | /* Flags in erase_unit_header_t */ |
diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index aa30244492c6..b981b8772217 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h | |||
@@ -223,6 +223,7 @@ struct map_info { | |||
223 | must leave it enabled. */ | 223 | must leave it enabled. */ |
224 | void (*set_vpp)(struct map_info *, int); | 224 | void (*set_vpp)(struct map_info *, int); |
225 | 225 | ||
226 | unsigned long pfow_base; | ||
226 | unsigned long map_priv_1; | 227 | unsigned long map_priv_1; |
227 | unsigned long map_priv_2; | 228 | unsigned long map_priv_2; |
228 | void *fldrv_priv; | 229 | void *fldrv_priv; |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index eae26bb6430a..3aa5d77c2cdb 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/mtd/compatmac.h> | 15 | #include <linux/mtd/compatmac.h> |
16 | #include <mtd/mtd-abi.h> | 16 | #include <mtd/mtd-abi.h> |
17 | 17 | ||
18 | #include <asm/div64.h> | ||
19 | |||
18 | #define MTD_CHAR_MAJOR 90 | 20 | #define MTD_CHAR_MAJOR 90 |
19 | #define MTD_BLOCK_MAJOR 31 | 21 | #define MTD_BLOCK_MAJOR 31 |
20 | #define MAX_MTD_DEVICES 32 | 22 | #define MAX_MTD_DEVICES 32 |
@@ -25,20 +27,20 @@ | |||
25 | #define MTD_ERASE_DONE 0x08 | 27 | #define MTD_ERASE_DONE 0x08 |
26 | #define MTD_ERASE_FAILED 0x10 | 28 | #define MTD_ERASE_FAILED 0x10 |
27 | 29 | ||
28 | #define MTD_FAIL_ADDR_UNKNOWN 0xffffffff | 30 | #define MTD_FAIL_ADDR_UNKNOWN -1LL |
29 | 31 | ||
30 | /* If the erase fails, fail_addr might indicate exactly which block failed. If | 32 | /* If the erase fails, fail_addr might indicate exactly which block failed. If |
31 | fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not | 33 | fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not |
32 | specific to any particular block. */ | 34 | specific to any particular block. */ |
33 | struct erase_info { | 35 | struct erase_info { |
34 | struct mtd_info *mtd; | 36 | struct mtd_info *mtd; |
35 | u_int32_t addr; | 37 | uint64_t addr; |
36 | u_int32_t len; | 38 | uint64_t len; |
37 | u_int32_t fail_addr; | 39 | uint64_t fail_addr; |
38 | u_long time; | 40 | u_long time; |
39 | u_long retries; | 41 | u_long retries; |
40 | u_int dev; | 42 | unsigned dev; |
41 | u_int cell; | 43 | unsigned cell; |
42 | void (*callback) (struct erase_info *self); | 44 | void (*callback) (struct erase_info *self); |
43 | u_long priv; | 45 | u_long priv; |
44 | u_char state; | 46 | u_char state; |
@@ -46,9 +48,9 @@ struct erase_info { | |||
46 | }; | 48 | }; |
47 | 49 | ||
48 | struct mtd_erase_region_info { | 50 | struct mtd_erase_region_info { |
49 | u_int32_t offset; /* At which this region starts, from the beginning of the MTD */ | 51 | uint64_t offset; /* At which this region starts, from the beginning of the MTD */ |
50 | u_int32_t erasesize; /* For this region */ | 52 | uint32_t erasesize; /* For this region */ |
51 | u_int32_t numblocks; /* Number of blocks of erasesize in this region */ | 53 | uint32_t numblocks; /* Number of blocks of erasesize in this region */ |
52 | unsigned long *lockmap; /* If keeping bitmap of locks */ | 54 | unsigned long *lockmap; /* If keeping bitmap of locks */ |
53 | }; | 55 | }; |
54 | 56 | ||
@@ -83,7 +85,7 @@ typedef enum { | |||
83 | * @datbuf: data buffer - if NULL only oob data are read/written | 85 | * @datbuf: data buffer - if NULL only oob data are read/written |
84 | * @oobbuf: oob data buffer | 86 | * @oobbuf: oob data buffer |
85 | * | 87 | * |
86 | * Note, it is allowed to read more then one OOB area at one go, but not write. | 88 | * Note, it is allowed to read more than one OOB area at one go, but not write. |
87 | * The interface assumes that the OOB write requests program only one page's | 89 | * The interface assumes that the OOB write requests program only one page's |
88 | * OOB area. | 90 | * OOB area. |
89 | */ | 91 | */ |
@@ -100,14 +102,14 @@ struct mtd_oob_ops { | |||
100 | 102 | ||
101 | struct mtd_info { | 103 | struct mtd_info { |
102 | u_char type; | 104 | u_char type; |
103 | u_int32_t flags; | 105 | uint32_t flags; |
104 | u_int32_t size; // Total size of the MTD | 106 | uint64_t size; // Total size of the MTD |
105 | 107 | ||
106 | /* "Major" erase size for the device. Naïve users may take this | 108 | /* "Major" erase size for the device. Naïve users may take this |
107 | * to be the only erase size available, or may use the more detailed | 109 | * to be the only erase size available, or may use the more detailed |
108 | * information below if they desire | 110 | * information below if they desire |
109 | */ | 111 | */ |
110 | u_int32_t erasesize; | 112 | uint32_t erasesize; |
111 | /* Minimal writable flash unit size. In case of NOR flash it is 1 (even | 113 | /* Minimal writable flash unit size. In case of NOR flash it is 1 (even |
112 | * though individual bits can be cleared), in case of NAND flash it is | 114 | * though individual bits can be cleared), in case of NAND flash it is |
113 | * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR | 115 | * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR |
@@ -115,10 +117,20 @@ struct mtd_info { | |||
115 | * Any driver registering a struct mtd_info must ensure a writesize of | 117 | * Any driver registering a struct mtd_info must ensure a writesize of |
116 | * 1 or larger. | 118 | * 1 or larger. |
117 | */ | 119 | */ |
118 | u_int32_t writesize; | 120 | uint32_t writesize; |
121 | |||
122 | uint32_t oobsize; // Amount of OOB data per block (e.g. 16) | ||
123 | uint32_t oobavail; // Available OOB bytes per block | ||
119 | 124 | ||
120 | u_int32_t oobsize; // Amount of OOB data per block (e.g. 16) | 125 | /* |
121 | u_int32_t oobavail; // Available OOB bytes per block | 126 | * If erasesize is a power of 2 then the shift is stored in |
127 | * erasesize_shift otherwise erasesize_shift is zero. Ditto writesize. | ||
128 | */ | ||
129 | unsigned int erasesize_shift; | ||
130 | unsigned int writesize_shift; | ||
131 | /* Masks based on erasesize_shift and writesize_shift */ | ||
132 | unsigned int erasesize_mask; | ||
133 | unsigned int writesize_mask; | ||
122 | 134 | ||
123 | // Kernel-only stuff starts here. | 135 | // Kernel-only stuff starts here. |
124 | const char *name; | 136 | const char *name; |
@@ -190,8 +202,8 @@ struct mtd_info { | |||
190 | void (*sync) (struct mtd_info *mtd); | 202 | void (*sync) (struct mtd_info *mtd); |
191 | 203 | ||
192 | /* Chip-supported device locking */ | 204 | /* Chip-supported device locking */ |
193 | int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len); | 205 | int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
194 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len); | 206 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
195 | 207 | ||
196 | /* Power Management functions */ | 208 | /* Power Management functions */ |
197 | int (*suspend) (struct mtd_info *mtd); | 209 | int (*suspend) (struct mtd_info *mtd); |
@@ -221,6 +233,35 @@ struct mtd_info { | |||
221 | void (*put_device) (struct mtd_info *mtd); | 233 | void (*put_device) (struct mtd_info *mtd); |
222 | }; | 234 | }; |
223 | 235 | ||
236 | static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd) | ||
237 | { | ||
238 | if (mtd->erasesize_shift) | ||
239 | return sz >> mtd->erasesize_shift; | ||
240 | do_div(sz, mtd->erasesize); | ||
241 | return sz; | ||
242 | } | ||
243 | |||
244 | static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd) | ||
245 | { | ||
246 | if (mtd->erasesize_shift) | ||
247 | return sz & mtd->erasesize_mask; | ||
248 | return do_div(sz, mtd->erasesize); | ||
249 | } | ||
250 | |||
251 | static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd) | ||
252 | { | ||
253 | if (mtd->writesize_shift) | ||
254 | return sz >> mtd->writesize_shift; | ||
255 | do_div(sz, mtd->writesize); | ||
256 | return sz; | ||
257 | } | ||
258 | |||
259 | static inline uint32_t mtd_mod_by_ws(uint64_t sz, struct mtd_info *mtd) | ||
260 | { | ||
261 | if (mtd->writesize_shift) | ||
262 | return sz & mtd->writesize_mask; | ||
263 | return do_div(sz, mtd->writesize); | ||
264 | } | ||
224 | 265 | ||
225 | /* Kernel-side ioctl definitions */ | 266 | /* Kernel-side ioctl definitions */ |
226 | 267 | ||
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 733d3f3b4eb8..db5b63da2a7e 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -335,17 +335,12 @@ struct nand_buffers { | |||
335 | * @erase_cmd: [INTERN] erase command write function, selectable due to AND support | 335 | * @erase_cmd: [INTERN] erase command write function, selectable due to AND support |
336 | * @scan_bbt: [REPLACEABLE] function to scan bad block table | 336 | * @scan_bbt: [REPLACEABLE] function to scan bad block table |
337 | * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering data from array to read regs (tR) | 337 | * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering data from array to read regs (tR) |
338 | * @wq: [INTERN] wait queue to sleep on if a NAND operation is in progress | ||
339 | * @state: [INTERN] the current state of the NAND device | 338 | * @state: [INTERN] the current state of the NAND device |
340 | * @oob_poi: poison value buffer | 339 | * @oob_poi: poison value buffer |
341 | * @page_shift: [INTERN] number of address bits in a page (column address bits) | 340 | * @page_shift: [INTERN] number of address bits in a page (column address bits) |
342 | * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock | 341 | * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock |
343 | * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry | 342 | * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry |
344 | * @chip_shift: [INTERN] number of address bits in one chip | 343 | * @chip_shift: [INTERN] number of address bits in one chip |
345 | * @datbuf: [INTERN] internal buffer for one page + oob | ||
346 | * @oobbuf: [INTERN] oob buffer for one eraseblock | ||
347 | * @oobdirty: [INTERN] indicates that oob_buf must be reinitialized | ||
348 | * @data_poi: [INTERN] pointer to a data buffer | ||
349 | * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about | 344 | * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about |
350 | * special functionality. See the defines for further explanation | 345 | * special functionality. See the defines for further explanation |
351 | * @badblockpos: [INTERN] position of the bad block marker in the oob area | 346 | * @badblockpos: [INTERN] position of the bad block marker in the oob area |
@@ -399,7 +394,7 @@ struct nand_chip { | |||
399 | int bbt_erase_shift; | 394 | int bbt_erase_shift; |
400 | int chip_shift; | 395 | int chip_shift; |
401 | int numchips; | 396 | int numchips; |
402 | unsigned long chipsize; | 397 | uint64_t chipsize; |
403 | int pagemask; | 398 | int pagemask; |
404 | int pagebuf; | 399 | int pagebuf; |
405 | int subpagesize; | 400 | int subpagesize; |
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index c92b4d439609..a45dd831b3f8 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h | |||
@@ -36,9 +36,9 @@ | |||
36 | 36 | ||
37 | struct mtd_partition { | 37 | struct mtd_partition { |
38 | char *name; /* identifier string */ | 38 | char *name; /* identifier string */ |
39 | u_int32_t size; /* partition size */ | 39 | uint64_t size; /* partition size */ |
40 | u_int32_t offset; /* offset within the master MTD space */ | 40 | uint64_t offset; /* offset within the master MTD space */ |
41 | u_int32_t mask_flags; /* master MTD flags to mask out for this partition */ | 41 | uint32_t mask_flags; /* master MTD flags to mask out for this partition */ |
42 | struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ | 42 | struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ |
43 | struct mtd_info **mtdp; /* pointer to store the MTD object */ | 43 | struct mtd_info **mtdp; /* pointer to store the MTD object */ |
44 | }; | 44 | }; |
diff --git a/include/linux/mtd/pfow.h b/include/linux/mtd/pfow.h new file mode 100644 index 000000000000..b730d4f84655 --- /dev/null +++ b/include/linux/mtd/pfow.h | |||
@@ -0,0 +1,159 @@ | |||
1 | /* Primary function overlay window definitions | ||
2 | * and service functions used by LPDDR chips | ||
3 | */ | ||
4 | #ifndef __LINUX_MTD_PFOW_H | ||
5 | #define __LINUX_MTD_PFOW_H | ||
6 | |||
7 | #include <linux/mtd/qinfo.h> | ||
8 | |||
9 | /* PFOW registers addressing */ | ||
10 | /* Address of symbol "P" */ | ||
11 | #define PFOW_QUERY_STRING_P 0x0000 | ||
12 | /* Address of symbol "F" */ | ||
13 | #define PFOW_QUERY_STRING_F 0x0002 | ||
14 | /* Address of symbol "O" */ | ||
15 | #define PFOW_QUERY_STRING_O 0x0004 | ||
16 | /* Address of symbol "W" */ | ||
17 | #define PFOW_QUERY_STRING_W 0x0006 | ||
18 | /* Identification info for LPDDR chip */ | ||
19 | #define PFOW_MANUFACTURER_ID 0x0020 | ||
20 | #define PFOW_DEVICE_ID 0x0022 | ||
21 | /* Address in PFOW where prog buffer can can be found */ | ||
22 | #define PFOW_PROGRAM_BUFFER_OFFSET 0x0040 | ||
23 | /* Size of program buffer in words */ | ||
24 | #define PFOW_PROGRAM_BUFFER_SIZE 0x0042 | ||
25 | /* Address command code register */ | ||
26 | #define PFOW_COMMAND_CODE 0x0080 | ||
27 | /* command data register */ | ||
28 | #define PFOW_COMMAND_DATA 0x0084 | ||
29 | /* command address register lower address bits */ | ||
30 | #define PFOW_COMMAND_ADDRESS_L 0x0088 | ||
31 | /* command address register upper address bits */ | ||
32 | #define PFOW_COMMAND_ADDRESS_H 0x008a | ||
33 | /* number of bytes to be proggrammed lower address bits */ | ||
34 | #define PFOW_DATA_COUNT_L 0x0090 | ||
35 | /* number of bytes to be proggrammed higher address bits */ | ||
36 | #define PFOW_DATA_COUNT_H 0x0092 | ||
37 | /* command execution register, the only possible value is 0x01 */ | ||
38 | #define PFOW_COMMAND_EXECUTE 0x00c0 | ||
39 | /* 0x01 should be written at this address to clear buffer */ | ||
40 | #define PFOW_CLEAR_PROGRAM_BUFFER 0x00c4 | ||
41 | /* device program/erase suspend register */ | ||
42 | #define PFOW_PROGRAM_ERASE_SUSPEND 0x00c8 | ||
43 | /* device status register */ | ||
44 | #define PFOW_DSR 0x00cc | ||
45 | |||
46 | /* LPDDR memory device command codes */ | ||
47 | /* They are possible values of PFOW command code register */ | ||
48 | #define LPDDR_WORD_PROGRAM 0x0041 | ||
49 | #define LPDDR_BUFF_PROGRAM 0x00E9 | ||
50 | #define LPDDR_BLOCK_ERASE 0x0020 | ||
51 | #define LPDDR_LOCK_BLOCK 0x0061 | ||
52 | #define LPDDR_UNLOCK_BLOCK 0x0062 | ||
53 | #define LPDDR_READ_BLOCK_LOCK_STATUS 0x0065 | ||
54 | #define LPDDR_INFO_QUERY 0x0098 | ||
55 | #define LPDDR_READ_OTP 0x0097 | ||
56 | #define LPDDR_PROG_OTP 0x00C0 | ||
57 | #define LPDDR_RESUME 0x00D0 | ||
58 | |||
59 | /* Defines possible value of PFOW command execution register */ | ||
60 | #define LPDDR_START_EXECUTION 0x0001 | ||
61 | |||
62 | /* Defines possible value of PFOW program/erase suspend register */ | ||
63 | #define LPDDR_SUSPEND 0x0001 | ||
64 | |||
65 | /* Possible values of PFOW device status register */ | ||
66 | /* access R - read; RC read & clearable */ | ||
67 | #define DSR_DPS (1<<1) /* RC; device protect status | ||
68 | * 0 - not protected 1 - locked */ | ||
69 | #define DSR_PSS (1<<2) /* R; program suspend status; | ||
70 | * 0-prog in progress/completed, | ||
71 | * 1- prog suspended */ | ||
72 | #define DSR_VPPS (1<<3) /* RC; 0-Vpp OK, * 1-Vpp low */ | ||
73 | #define DSR_PROGRAM_STATUS (1<<4) /* RC; 0-successful, 1-error */ | ||
74 | #define DSR_ERASE_STATUS (1<<5) /* RC; erase or blank check status; | ||
75 | * 0-success erase/blank check, | ||
76 | * 1 blank check error */ | ||
77 | #define DSR_ESS (1<<6) /* R; erase suspend status; | ||
78 | * 0-erase in progress/complete, | ||
79 | * 1 erase suspended */ | ||
80 | #define DSR_READY_STATUS (1<<7) /* R; Device status | ||
81 | * 0-busy, | ||
82 | * 1-ready */ | ||
83 | #define DSR_RPS (0x3<<8) /* RC; region program status | ||
84 | * 00 - Success, | ||
85 | * 01-re-program attempt in region with | ||
86 | * object mode data, | ||
87 | * 10-object mode program w attempt in | ||
88 | * region with control mode data | ||
89 | * 11-attempt to program invalid half | ||
90 | * with 0x41 command */ | ||
91 | #define DSR_AOS (1<<12) /* RC; 1- AO related failure */ | ||
92 | #define DSR_AVAILABLE (1<<15) /* R; Device availbility | ||
93 | * 1 - Device available | ||
94 | * 0 - not available */ | ||
95 | |||
96 | /* The superset of all possible error bits in DSR */ | ||
97 | #define DSR_ERR 0x133A | ||
98 | |||
99 | static inline void send_pfow_command(struct map_info *map, | ||
100 | unsigned long cmd_code, unsigned long adr, | ||
101 | unsigned long len, map_word *datum) | ||
102 | { | ||
103 | int bits_per_chip = map_bankwidth(map) * 8; | ||
104 | int chipnum; | ||
105 | struct lpddr_private *lpddr = map->fldrv_priv; | ||
106 | chipnum = adr >> lpddr->chipshift; | ||
107 | |||
108 | map_write(map, CMD(cmd_code), map->pfow_base + PFOW_COMMAND_CODE); | ||
109 | map_write(map, CMD(adr & ((1<<bits_per_chip) - 1)), | ||
110 | map->pfow_base + PFOW_COMMAND_ADDRESS_L); | ||
111 | map_write(map, CMD(adr>>bits_per_chip), | ||
112 | map->pfow_base + PFOW_COMMAND_ADDRESS_H); | ||
113 | if (len) { | ||
114 | map_write(map, CMD(len & ((1<<bits_per_chip) - 1)), | ||
115 | map->pfow_base + PFOW_DATA_COUNT_L); | ||
116 | map_write(map, CMD(len>>bits_per_chip), | ||
117 | map->pfow_base + PFOW_DATA_COUNT_H); | ||
118 | } | ||
119 | if (datum) | ||
120 | map_write(map, *datum, map->pfow_base + PFOW_COMMAND_DATA); | ||
121 | |||
122 | /* Command execution start */ | ||
123 | map_write(map, CMD(LPDDR_START_EXECUTION), | ||
124 | map->pfow_base + PFOW_COMMAND_EXECUTE); | ||
125 | } | ||
126 | |||
127 | static inline void print_drs_error(unsigned dsr) | ||
128 | { | ||
129 | int prog_status = (dsr & DSR_RPS) >> 8; | ||
130 | |||
131 | if (!(dsr & DSR_AVAILABLE)) | ||
132 | printk(KERN_NOTICE"DSR.15: (0) Device not Available\n"); | ||
133 | if (prog_status & 0x03) | ||
134 | printk(KERN_NOTICE"DSR.9,8: (11) Attempt to program invalid " | ||
135 | "half with 41h command\n"); | ||
136 | else if (prog_status & 0x02) | ||
137 | printk(KERN_NOTICE"DSR.9,8: (10) Object Mode Program attempt " | ||
138 | "in region with Control Mode data\n"); | ||
139 | else if (prog_status & 0x01) | ||
140 | printk(KERN_NOTICE"DSR.9,8: (01) Program attempt in region " | ||
141 | "with Object Mode data\n"); | ||
142 | if (!(dsr & DSR_READY_STATUS)) | ||
143 | printk(KERN_NOTICE"DSR.7: (0) Device is Busy\n"); | ||
144 | if (dsr & DSR_ESS) | ||
145 | printk(KERN_NOTICE"DSR.6: (1) Erase Suspended\n"); | ||
146 | if (dsr & DSR_ERASE_STATUS) | ||
147 | printk(KERN_NOTICE"DSR.5: (1) Erase/Blank check error\n"); | ||
148 | if (dsr & DSR_PROGRAM_STATUS) | ||
149 | printk(KERN_NOTICE"DSR.4: (1) Program Error\n"); | ||
150 | if (dsr & DSR_VPPS) | ||
151 | printk(KERN_NOTICE"DSR.3: (1) Vpp low detect, operation " | ||
152 | "aborted\n"); | ||
153 | if (dsr & DSR_PSS) | ||
154 | printk(KERN_NOTICE"DSR.2: (1) Program suspended\n"); | ||
155 | if (dsr & DSR_DPS) | ||
156 | printk(KERN_NOTICE"DSR.1: (1) Aborted Erase/Program attempt " | ||
157 | "on locked block\n"); | ||
158 | } | ||
159 | #endif /* __LINUX_MTD_PFOW_H */ | ||
diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h index c8e63a5ee72e..76f7cabf07d3 100644 --- a/include/linux/mtd/physmap.h +++ b/include/linux/mtd/physmap.h | |||
@@ -24,6 +24,7 @@ struct physmap_flash_data { | |||
24 | unsigned int width; | 24 | unsigned int width; |
25 | void (*set_vpp)(struct map_info *, int); | 25 | void (*set_vpp)(struct map_info *, int); |
26 | unsigned int nr_parts; | 26 | unsigned int nr_parts; |
27 | unsigned int pfow_base; | ||
27 | struct mtd_partition *parts; | 28 | struct mtd_partition *parts; |
28 | }; | 29 | }; |
29 | 30 | ||
diff --git a/include/linux/mtd/qinfo.h b/include/linux/mtd/qinfo.h new file mode 100644 index 000000000000..7b3d487d8b3f --- /dev/null +++ b/include/linux/mtd/qinfo.h | |||
@@ -0,0 +1,91 @@ | |||
1 | #ifndef __LINUX_MTD_QINFO_H | ||
2 | #define __LINUX_MTD_QINFO_H | ||
3 | |||
4 | #include <linux/mtd/map.h> | ||
5 | #include <linux/wait.h> | ||
6 | #include <linux/spinlock.h> | ||
7 | #include <linux/delay.h> | ||
8 | #include <linux/mtd/mtd.h> | ||
9 | #include <linux/mtd/flashchip.h> | ||
10 | #include <linux/mtd/partitions.h> | ||
11 | |||
12 | /* lpddr_private describes lpddr flash chip in memory map | ||
13 | * @ManufactId - Chip Manufacture ID | ||
14 | * @DevId - Chip Device ID | ||
15 | * @qinfo - pointer to qinfo records describing the chip | ||
16 | * @numchips - number of chips including virual RWW partitions | ||
17 | * @chipshift - Chip/partiton size 2^chipshift | ||
18 | * @chips - per-chip data structure | ||
19 | */ | ||
20 | struct lpddr_private { | ||
21 | uint16_t ManufactId; | ||
22 | uint16_t DevId; | ||
23 | struct qinfo_chip *qinfo; | ||
24 | int numchips; | ||
25 | unsigned long chipshift; | ||
26 | struct flchip chips[0]; | ||
27 | }; | ||
28 | |||
29 | /* qinfo_query_info structure contains request information for | ||
30 | * each qinfo record | ||
31 | * @major - major number of qinfo record | ||
32 | * @major - minor number of qinfo record | ||
33 | * @id_str - descriptive string to access the record | ||
34 | * @desc - detailed description for the qinfo record | ||
35 | */ | ||
36 | struct qinfo_query_info { | ||
37 | uint8_t major; | ||
38 | uint8_t minor; | ||
39 | char *id_str; | ||
40 | char *desc; | ||
41 | }; | ||
42 | |||
43 | /* | ||
44 | * qinfo_chip structure contains necessary qinfo records data | ||
45 | * @DevSizeShift - Device size 2^n bytes | ||
46 | * @BufSizeShift - Program buffer size 2^n bytes | ||
47 | * @TotalBlocksNum - Total number of blocks | ||
48 | * @UniformBlockSizeShift - Uniform block size 2^UniformBlockSizeShift bytes | ||
49 | * @HWPartsNum - Number of hardware partitions | ||
50 | * @SuspEraseSupp - Suspend erase supported | ||
51 | * @SingleWordProgTime - Single word program 2^SingleWordProgTime u-sec | ||
52 | * @ProgBufferTime - Program buffer write 2^ProgBufferTime u-sec | ||
53 | * @BlockEraseTime - Block erase 2^BlockEraseTime m-sec | ||
54 | */ | ||
55 | struct qinfo_chip { | ||
56 | /* General device info */ | ||
57 | uint16_t DevSizeShift; | ||
58 | uint16_t BufSizeShift; | ||
59 | /* Erase block information */ | ||
60 | uint16_t TotalBlocksNum; | ||
61 | uint16_t UniformBlockSizeShift; | ||
62 | /* Partition information */ | ||
63 | uint16_t HWPartsNum; | ||
64 | /* Optional features */ | ||
65 | uint16_t SuspEraseSupp; | ||
66 | /* Operation typical time */ | ||
67 | uint16_t SingleWordProgTime; | ||
68 | uint16_t ProgBufferTime; | ||
69 | uint16_t BlockEraseTime; | ||
70 | }; | ||
71 | |||
72 | /* defines for fixup usage */ | ||
73 | #define LPDDR_MFR_ANY 0xffff | ||
74 | #define LPDDR_ID_ANY 0xffff | ||
75 | #define NUMONYX_MFGR_ID 0x0089 | ||
76 | #define R18_DEVICE_ID_1G 0x893c | ||
77 | |||
78 | static inline map_word lpddr_build_cmd(u_long cmd, struct map_info *map) | ||
79 | { | ||
80 | map_word val = { {0} }; | ||
81 | val.x[0] = cmd; | ||
82 | return val; | ||
83 | } | ||
84 | |||
85 | #define CMD(x) lpddr_build_cmd(x, map) | ||
86 | #define CMDVAL(cmd) cmd.x[0] | ||
87 | |||
88 | struct mtd_info *lpddr_cmdset(struct map_info *); | ||
89 | |||
90 | #endif | ||
91 | |||
diff --git a/include/linux/mtd/sharpsl.h b/include/linux/mtd/sharpsl.h new file mode 100644 index 000000000000..25f4d2a845c1 --- /dev/null +++ b/include/linux/mtd/sharpsl.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * SharpSL NAND support | ||
3 | * | ||
4 | * Copyright (C) 2008 Dmitry Baryshkov | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/mtd/nand.h> | ||
12 | #include <linux/mtd/nand_ecc.h> | ||
13 | #include <linux/mtd/partitions.h> | ||
14 | |||
15 | struct sharpsl_nand_platform_data { | ||
16 | struct nand_bbt_descr *badblock_pattern; | ||
17 | struct nand_ecclayout *ecc_layout; | ||
18 | struct mtd_partition *partitions; | ||
19 | unsigned int nr_partitions; | ||
20 | }; | ||
diff --git a/include/linux/mutex.h b/include/linux/mutex.h index bc6da10ceee0..7a0e5c4f8072 100644 --- a/include/linux/mutex.h +++ b/include/linux/mutex.h | |||
@@ -144,6 +144,8 @@ extern int __must_check mutex_lock_killable(struct mutex *lock); | |||
144 | /* | 144 | /* |
145 | * NOTE: mutex_trylock() follows the spin_trylock() convention, | 145 | * NOTE: mutex_trylock() follows the spin_trylock() convention, |
146 | * not the down_trylock() convention! | 146 | * not the down_trylock() convention! |
147 | * | ||
148 | * Returns 1 if the mutex has been acquired successfully, and 0 on contention. | ||
147 | */ | 149 | */ |
148 | extern int mutex_trylock(struct mutex *lock); | 150 | extern int mutex_trylock(struct mutex *lock); |
149 | extern void mutex_unlock(struct mutex *lock); | 151 | extern void mutex_unlock(struct mutex *lock); |
diff --git a/include/linux/namei.h b/include/linux/namei.h index 99eb80306dc5..fc2e03579877 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
@@ -94,4 +94,9 @@ static inline char *nd_get_link(struct nameidata *nd) | |||
94 | return nd->saved_names[nd->depth]; | 94 | return nd->saved_names[nd->depth]; |
95 | } | 95 | } |
96 | 96 | ||
97 | static inline void nd_terminate_link(void *name, size_t len, size_t maxlen) | ||
98 | { | ||
99 | ((char *) name)[min(len, maxlen)] = '\0'; | ||
100 | } | ||
101 | |||
97 | #endif /* _LINUX_NAMEI_H */ | 102 | #endif /* _LINUX_NAMEI_H */ |
diff --git a/include/linux/ncp_fs.h b/include/linux/ncp_fs.h index 9f2d76347f19..f69e66d151cc 100644 --- a/include/linux/ncp_fs.h +++ b/include/linux/ncp_fs.h | |||
@@ -87,7 +87,7 @@ struct ncp_objectname_ioctl | |||
87 | #define NCP_AUTH_NDS 0x32 | 87 | #define NCP_AUTH_NDS 0x32 |
88 | int auth_type; | 88 | int auth_type; |
89 | size_t object_name_len; | 89 | size_t object_name_len; |
90 | void __user * object_name; /* an userspace data, in most cases user name */ | 90 | void __user * object_name; /* a userspace data, in most cases user name */ |
91 | }; | 91 | }; |
92 | 92 | ||
93 | struct ncp_privatedata_ioctl | 93 | struct ncp_privatedata_ioctl |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 41e1224651cf..f24556813375 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -313,10 +313,11 @@ struct napi_struct { | |||
313 | #ifdef CONFIG_NETPOLL | 313 | #ifdef CONFIG_NETPOLL |
314 | spinlock_t poll_lock; | 314 | spinlock_t poll_lock; |
315 | int poll_owner; | 315 | int poll_owner; |
316 | struct net_device *dev; | ||
317 | #endif | 316 | #endif |
317 | struct net_device *dev; | ||
318 | struct list_head dev_list; | 318 | struct list_head dev_list; |
319 | struct sk_buff *gro_list; | 319 | struct sk_buff *gro_list; |
320 | struct sk_buff *skb; | ||
320 | }; | 321 | }; |
321 | 322 | ||
322 | enum | 323 | enum |
@@ -990,6 +991,9 @@ struct napi_gro_cb { | |||
990 | 991 | ||
991 | /* Number of segments aggregated. */ | 992 | /* Number of segments aggregated. */ |
992 | int count; | 993 | int count; |
994 | |||
995 | /* Free the skb? */ | ||
996 | int free; | ||
993 | }; | 997 | }; |
994 | 998 | ||
995 | #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) | 999 | #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) |
@@ -1011,6 +1015,14 @@ struct packet_type { | |||
1011 | struct list_head list; | 1015 | struct list_head list; |
1012 | }; | 1016 | }; |
1013 | 1017 | ||
1018 | struct napi_gro_fraginfo { | ||
1019 | skb_frag_t frags[MAX_SKB_FRAGS]; | ||
1020 | unsigned int nr_frags; | ||
1021 | unsigned int ip_summed; | ||
1022 | unsigned int len; | ||
1023 | __wsum csum; | ||
1024 | }; | ||
1025 | |||
1014 | #include <linux/interrupt.h> | 1026 | #include <linux/interrupt.h> |
1015 | #include <linux/notifier.h> | 1027 | #include <linux/notifier.h> |
1016 | 1028 | ||
@@ -1113,9 +1125,6 @@ struct softnet_data | |||
1113 | struct sk_buff *completion_queue; | 1125 | struct sk_buff *completion_queue; |
1114 | 1126 | ||
1115 | struct napi_struct backlog; | 1127 | struct napi_struct backlog; |
1116 | #ifdef CONFIG_NET_DMA | ||
1117 | struct dma_chan *net_dma; | ||
1118 | #endif | ||
1119 | }; | 1128 | }; |
1120 | 1129 | ||
1121 | DECLARE_PER_CPU(struct softnet_data,softnet_data); | 1130 | DECLARE_PER_CPU(struct softnet_data,softnet_data); |
@@ -1361,8 +1370,16 @@ extern int netif_rx_ni(struct sk_buff *skb); | |||
1361 | #define HAVE_NETIF_RECEIVE_SKB 1 | 1370 | #define HAVE_NETIF_RECEIVE_SKB 1 |
1362 | extern int netif_receive_skb(struct sk_buff *skb); | 1371 | extern int netif_receive_skb(struct sk_buff *skb); |
1363 | extern void napi_gro_flush(struct napi_struct *napi); | 1372 | extern void napi_gro_flush(struct napi_struct *napi); |
1373 | extern int dev_gro_receive(struct napi_struct *napi, | ||
1374 | struct sk_buff *skb); | ||
1364 | extern int napi_gro_receive(struct napi_struct *napi, | 1375 | extern int napi_gro_receive(struct napi_struct *napi, |
1365 | struct sk_buff *skb); | 1376 | struct sk_buff *skb); |
1377 | extern void napi_reuse_skb(struct napi_struct *napi, | ||
1378 | struct sk_buff *skb); | ||
1379 | extern struct sk_buff * napi_fraginfo_skb(struct napi_struct *napi, | ||
1380 | struct napi_gro_fraginfo *info); | ||
1381 | extern int napi_gro_frags(struct napi_struct *napi, | ||
1382 | struct napi_gro_fraginfo *info); | ||
1366 | extern void netif_nit_deliver(struct sk_buff *skb); | 1383 | extern void netif_nit_deliver(struct sk_buff *skb); |
1367 | extern int dev_valid_name(const char *name); | 1384 | extern int dev_valid_name(const char *name); |
1368 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); | 1385 | extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); |
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index ea0366769484..b912311a56b1 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
@@ -88,6 +88,8 @@ | |||
88 | #define NFS4_ACE_GENERIC_EXECUTE 0x001200A0 | 88 | #define NFS4_ACE_GENERIC_EXECUTE 0x001200A0 |
89 | #define NFS4_ACE_MASK_ALL 0x001F01FF | 89 | #define NFS4_ACE_MASK_ALL 0x001F01FF |
90 | 90 | ||
91 | #define NFS4_MAX_UINT64 (~(u64)0) | ||
92 | |||
91 | enum nfs4_acl_whotype { | 93 | enum nfs4_acl_whotype { |
92 | NFS4_ACL_WHO_NAMED = 0, | 94 | NFS4_ACL_WHO_NAMED = 0, |
93 | NFS4_ACL_WHO_OWNER, | 95 | NFS4_ACL_WHO_OWNER, |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 4eaa8347a0d9..db867b04ac3c 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -83,7 +83,7 @@ struct nfs_open_context { | |||
83 | struct rpc_cred *cred; | 83 | struct rpc_cred *cred; |
84 | struct nfs4_state *state; | 84 | struct nfs4_state *state; |
85 | fl_owner_t lockowner; | 85 | fl_owner_t lockowner; |
86 | int mode; | 86 | fmode_t mode; |
87 | 87 | ||
88 | unsigned long flags; | 88 | unsigned long flags; |
89 | #define NFS_CONTEXT_ERROR_WRITE (0) | 89 | #define NFS_CONTEXT_ERROR_WRITE (0) |
@@ -130,7 +130,10 @@ struct nfs_inode { | |||
130 | * | 130 | * |
131 | * We need to revalidate the cached attrs for this inode if | 131 | * We need to revalidate the cached attrs for this inode if |
132 | * | 132 | * |
133 | * jiffies - read_cache_jiffies > attrtimeo | 133 | * jiffies - read_cache_jiffies >= attrtimeo |
134 | * | ||
135 | * Please note the comparison is greater than or equal | ||
136 | * so that zero timeout values can be specified. | ||
134 | */ | 137 | */ |
135 | unsigned long read_cache_jiffies; | 138 | unsigned long read_cache_jiffies; |
136 | unsigned long attrtimeo; | 139 | unsigned long attrtimeo; |
@@ -180,7 +183,7 @@ struct nfs_inode { | |||
180 | /* NFSv4 state */ | 183 | /* NFSv4 state */ |
181 | struct list_head open_states; | 184 | struct list_head open_states; |
182 | struct nfs_delegation *delegation; | 185 | struct nfs_delegation *delegation; |
183 | int delegation_state; | 186 | fmode_t delegation_state; |
184 | struct rw_semaphore rwsem; | 187 | struct rw_semaphore rwsem; |
185 | #endif /* CONFIG_NFS_V4*/ | 188 | #endif /* CONFIG_NFS_V4*/ |
186 | struct inode vfs_inode; | 189 | struct inode vfs_inode; |
@@ -342,7 +345,7 @@ extern int nfs_setattr(struct dentry *, struct iattr *); | |||
342 | extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr); | 345 | extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr); |
343 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); | 346 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); |
344 | extern void put_nfs_open_context(struct nfs_open_context *ctx); | 347 | extern void put_nfs_open_context(struct nfs_open_context *ctx); |
345 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode); | 348 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); |
346 | extern u64 nfs_compat_user_ino64(u64 fileid); | 349 | extern u64 nfs_compat_user_ino64(u64 fileid); |
347 | extern void nfs_fattr_init(struct nfs_fattr *fattr); | 350 | extern void nfs_fattr_init(struct nfs_fattr *fattr); |
348 | 351 | ||
@@ -533,12 +536,6 @@ static inline void nfs3_forget_cached_acls(struct inode *inode) | |||
533 | #endif /* CONFIG_NFS_V3_ACL */ | 536 | #endif /* CONFIG_NFS_V3_ACL */ |
534 | 537 | ||
535 | /* | 538 | /* |
536 | * linux/fs/mount_clnt.c | ||
537 | */ | ||
538 | extern int nfs_mount(struct sockaddr *, size_t, char *, char *, | ||
539 | int, int, struct nfs_fh *); | ||
540 | |||
541 | /* | ||
542 | * inline functions | 539 | * inline functions |
543 | */ | 540 | */ |
544 | 541 | ||
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 4e477ae58699..9bb81aec91cf 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -42,12 +42,6 @@ struct nfs_client { | |||
42 | struct rb_root cl_openowner_id; | 42 | struct rb_root cl_openowner_id; |
43 | struct rb_root cl_lockowner_id; | 43 | struct rb_root cl_lockowner_id; |
44 | 44 | ||
45 | /* | ||
46 | * The following rwsem ensures exclusive access to the server | ||
47 | * while we recover the state following a lease expiration. | ||
48 | */ | ||
49 | struct rw_semaphore cl_sem; | ||
50 | |||
51 | struct list_head cl_delegations; | 45 | struct list_head cl_delegations; |
52 | struct rb_root cl_state_owners; | 46 | struct rb_root cl_state_owners; |
53 | spinlock_t cl_lock; | 47 | spinlock_t cl_lock; |
diff --git a/include/linux/nfs_mount.h b/include/linux/nfs_mount.h index 6549a06ac16e..4499016e6d0d 100644 --- a/include/linux/nfs_mount.h +++ b/include/linux/nfs_mount.h | |||
@@ -45,7 +45,7 @@ struct nfs_mount_data { | |||
45 | char context[NFS_MAX_CONTEXT_LEN + 1]; /* 6 */ | 45 | char context[NFS_MAX_CONTEXT_LEN + 1]; /* 6 */ |
46 | }; | 46 | }; |
47 | 47 | ||
48 | /* bits in the flags field */ | 48 | /* bits in the flags field visible to user space */ |
49 | 49 | ||
50 | #define NFS_MOUNT_SOFT 0x0001 /* 1 */ | 50 | #define NFS_MOUNT_SOFT 0x0001 /* 1 */ |
51 | #define NFS_MOUNT_INTR 0x0002 /* 1 */ /* now unused, but ABI */ | 51 | #define NFS_MOUNT_INTR 0x0002 /* 1 */ /* now unused, but ABI */ |
@@ -68,5 +68,6 @@ struct nfs_mount_data { | |||
68 | /* The following are for internal use only */ | 68 | /* The following are for internal use only */ |
69 | #define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000 | 69 | #define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000 |
70 | #define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000 | 70 | #define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000 |
71 | #define NFS_MOUNT_NORESVPORT 0x40000 | ||
71 | 72 | ||
72 | #endif | 73 | #endif |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index c1c31acb8a2b..a550b528319f 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -120,13 +120,14 @@ struct nfs_openargs { | |||
120 | const struct nfs_fh * fh; | 120 | const struct nfs_fh * fh; |
121 | struct nfs_seqid * seqid; | 121 | struct nfs_seqid * seqid; |
122 | int open_flags; | 122 | int open_flags; |
123 | fmode_t fmode; | ||
123 | __u64 clientid; | 124 | __u64 clientid; |
124 | __u64 id; | 125 | __u64 id; |
125 | union { | 126 | union { |
126 | struct iattr * attrs; /* UNCHECKED, GUARDED */ | 127 | struct iattr * attrs; /* UNCHECKED, GUARDED */ |
127 | nfs4_verifier verifier; /* EXCLUSIVE */ | 128 | nfs4_verifier verifier; /* EXCLUSIVE */ |
128 | nfs4_stateid delegation; /* CLAIM_DELEGATE_CUR */ | 129 | nfs4_stateid delegation; /* CLAIM_DELEGATE_CUR */ |
129 | int delegation_type; /* CLAIM_PREVIOUS */ | 130 | fmode_t delegation_type; /* CLAIM_PREVIOUS */ |
130 | } u; | 131 | } u; |
131 | const struct qstr * name; | 132 | const struct qstr * name; |
132 | const struct nfs_server *server; /* Needed for ID mapping */ | 133 | const struct nfs_server *server; /* Needed for ID mapping */ |
@@ -143,7 +144,7 @@ struct nfs_openres { | |||
143 | struct nfs_fattr * dir_attr; | 144 | struct nfs_fattr * dir_attr; |
144 | struct nfs_seqid * seqid; | 145 | struct nfs_seqid * seqid; |
145 | const struct nfs_server *server; | 146 | const struct nfs_server *server; |
146 | int delegation_type; | 147 | fmode_t delegation_type; |
147 | nfs4_stateid delegation; | 148 | nfs4_stateid delegation; |
148 | __u32 do_recall; | 149 | __u32 do_recall; |
149 | __u64 maxsize; | 150 | __u64 maxsize; |
@@ -171,7 +172,7 @@ struct nfs_closeargs { | |||
171 | struct nfs_fh * fh; | 172 | struct nfs_fh * fh; |
172 | nfs4_stateid * stateid; | 173 | nfs4_stateid * stateid; |
173 | struct nfs_seqid * seqid; | 174 | struct nfs_seqid * seqid; |
174 | int open_flags; | 175 | fmode_t fmode; |
175 | const u32 * bitmask; | 176 | const u32 * bitmask; |
176 | }; | 177 | }; |
177 | 178 | ||
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h index 21269405ffe2..e19f45991b2e 100644 --- a/include/linux/nfsd/nfsd.h +++ b/include/linux/nfsd/nfsd.h | |||
@@ -23,7 +23,6 @@ | |||
23 | /* | 23 | /* |
24 | * nfsd version | 24 | * nfsd version |
25 | */ | 25 | */ |
26 | #define NFSD_VERSION "0.5" | ||
27 | #define NFSD_SUPPORTED_MINOR_VERSION 0 | 26 | #define NFSD_SUPPORTED_MINOR_VERSION 0 |
28 | 27 | ||
29 | /* | 28 | /* |
diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index d1941cb965e9..b2e093870bc6 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h | |||
@@ -68,6 +68,10 @@ struct nfs_fhbase_old { | |||
68 | * 1 - 4 byte user specified identifier | 68 | * 1 - 4 byte user specified identifier |
69 | * 2 - 4 byte major, 4 byte minor, 4 byte inode number - DEPRECATED | 69 | * 2 - 4 byte major, 4 byte minor, 4 byte inode number - DEPRECATED |
70 | * 3 - 4 byte device id, encoded for user-space, 4 byte inode number | 70 | * 3 - 4 byte device id, encoded for user-space, 4 byte inode number |
71 | * 4 - 4 byte inode number and 4 byte uuid | ||
72 | * 5 - 8 byte uuid | ||
73 | * 6 - 16 byte uuid | ||
74 | * 7 - 8 byte inode number and 16 byte uuid | ||
71 | * | 75 | * |
72 | * The fileid_type identified how the file within the filesystem is encoded. | 76 | * The fileid_type identified how the file within the filesystem is encoded. |
73 | * This is (will be) passed to, and set by, the underlying filesystem if it supports | 77 | * This is (will be) passed to, and set by, the underlying filesystem if it supports |
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h index d0fe2e378452..128298c0362d 100644 --- a/include/linux/nfsd/state.h +++ b/include/linux/nfsd/state.h | |||
@@ -124,6 +124,8 @@ struct nfs4_client { | |||
124 | nfs4_verifier cl_verifier; /* generated by client */ | 124 | nfs4_verifier cl_verifier; /* generated by client */ |
125 | time_t cl_time; /* time of last lease renewal */ | 125 | time_t cl_time; /* time of last lease renewal */ |
126 | __be32 cl_addr; /* client ipaddress */ | 126 | __be32 cl_addr; /* client ipaddress */ |
127 | u32 cl_flavor; /* setclientid pseudoflavor */ | ||
128 | char *cl_principal; /* setclientid principal name */ | ||
127 | struct svc_cred cl_cred; /* setclientid principal */ | 129 | struct svc_cred cl_cred; /* setclientid principal */ |
128 | clientid_t cl_clientid; /* generated by server */ | 130 | clientid_t cl_clientid; /* generated by server */ |
129 | nfs4_verifier cl_confirm; /* generated by server */ | 131 | nfs4_verifier cl_confirm; /* generated by server */ |
diff --git a/include/linux/node.h b/include/linux/node.h index bc001bc225c3..681a697b9a86 100644 --- a/include/linux/node.h +++ b/include/linux/node.h | |||
@@ -26,6 +26,7 @@ struct node { | |||
26 | struct sys_device sysdev; | 26 | struct sys_device sysdev; |
27 | }; | 27 | }; |
28 | 28 | ||
29 | struct memory_block; | ||
29 | extern struct node node_devices[]; | 30 | extern struct node node_devices[]; |
30 | 31 | ||
31 | extern int register_node(struct node *, int, struct node *); | 32 | extern int register_node(struct node *, int, struct node *); |
@@ -35,6 +36,9 @@ extern int register_one_node(int nid); | |||
35 | extern void unregister_one_node(int nid); | 36 | extern void unregister_one_node(int nid); |
36 | extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); | 37 | extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); |
37 | extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); | 38 | extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); |
39 | extern int register_mem_sect_under_node(struct memory_block *mem_blk, | ||
40 | int nid); | ||
41 | extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk); | ||
38 | #else | 42 | #else |
39 | static inline int register_one_node(int nid) | 43 | static inline int register_one_node(int nid) |
40 | { | 44 | { |
@@ -52,6 +56,15 @@ static inline int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) | |||
52 | { | 56 | { |
53 | return 0; | 57 | return 0; |
54 | } | 58 | } |
59 | static inline int register_mem_sect_under_node(struct memory_block *mem_blk, | ||
60 | int nid) | ||
61 | { | ||
62 | return 0; | ||
63 | } | ||
64 | static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk) | ||
65 | { | ||
66 | return 0; | ||
67 | } | ||
55 | #endif | 68 | #endif |
56 | 69 | ||
57 | #define to_node(sys_device) container_of(sys_device, struct node, sysdev) | 70 | #define to_node(sys_device) container_of(sys_device, struct node, sysdev) |
diff --git a/include/linux/nwpserial.h b/include/linux/nwpserial.h new file mode 100644 index 000000000000..9acb21572eaf --- /dev/null +++ b/include/linux/nwpserial.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * Serial Port driver for a NWP uart device | ||
3 | * | ||
4 | * Copyright (C) 2008 IBM Corp., Benjamin Krill <ben@codiert.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | */ | ||
12 | #ifndef _NWPSERIAL_H | ||
13 | #define _NWPSERIAL_H | ||
14 | |||
15 | int nwpserial_register_port(struct uart_port *port); | ||
16 | void nwpserial_unregister_port(int line); | ||
17 | |||
18 | #endif /* _NWPSERIAL_H */ | ||
diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h index a8efcfeea732..3d327b67d7e2 100644 --- a/include/linux/of_platform.h +++ b/include/linux/of_platform.h | |||
@@ -26,8 +26,7 @@ extern struct bus_type of_platform_bus_type; | |||
26 | 26 | ||
27 | /* | 27 | /* |
28 | * An of_platform_driver driver is attached to a basic of_device on | 28 | * An of_platform_driver driver is attached to a basic of_device on |
29 | * the "platform bus" (of_platform_bus_type) (or ISA, EBUS and SBUS | 29 | * the "platform bus" (of_platform_bus_type). |
30 | * busses on sparc). | ||
31 | */ | 30 | */ |
32 | struct of_platform_driver | 31 | struct of_platform_driver |
33 | { | 32 | { |
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 5231861f357d..1d9518bc4c58 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h | |||
@@ -86,8 +86,7 @@ int oprofile_arch_init(struct oprofile_operations * ops); | |||
86 | void oprofile_arch_exit(void); | 86 | void oprofile_arch_exit(void); |
87 | 87 | ||
88 | /** | 88 | /** |
89 | * Add a sample. This may be called from any context. Pass | 89 | * Add a sample. This may be called from any context. |
90 | * smp_processor_id() as cpu. | ||
91 | */ | 90 | */ |
92 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); | 91 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); |
93 | 92 | ||
@@ -165,4 +164,22 @@ void oprofile_put_buff(unsigned long *buf, unsigned int start, | |||
165 | unsigned long oprofile_get_cpu_buffer_size(void); | 164 | unsigned long oprofile_get_cpu_buffer_size(void); |
166 | void oprofile_cpu_buffer_inc_smpl_lost(void); | 165 | void oprofile_cpu_buffer_inc_smpl_lost(void); |
167 | 166 | ||
167 | /* cpu buffer functions */ | ||
168 | |||
169 | struct op_sample; | ||
170 | |||
171 | struct op_entry { | ||
172 | struct ring_buffer_event *event; | ||
173 | struct op_sample *sample; | ||
174 | unsigned long irq_flags; | ||
175 | unsigned long size; | ||
176 | unsigned long *data; | ||
177 | }; | ||
178 | |||
179 | void oprofile_write_reserve(struct op_entry *entry, | ||
180 | struct pt_regs * const regs, | ||
181 | unsigned long pc, int code, int size); | ||
182 | int oprofile_add_data(struct op_entry *entry, unsigned long val); | ||
183 | int oprofile_write_commit(struct op_entry *entry); | ||
184 | |||
168 | #endif /* OPROFILE_H */ | 185 | #endif /* OPROFILE_H */ |
diff --git a/include/linux/oxu210hp.h b/include/linux/oxu210hp.h new file mode 100644 index 000000000000..0bf96eae5389 --- /dev/null +++ b/include/linux/oxu210hp.h | |||
@@ -0,0 +1,7 @@ | |||
1 | /* platform data for the OXU210HP HCD */ | ||
2 | |||
3 | struct oxu210hp_platform_data { | ||
4 | unsigned int bus16:1; | ||
5 | unsigned int use_hcd_otg:1; | ||
6 | unsigned int use_hcd_sph:1; | ||
7 | }; | ||
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index b12f93a3c345..219a523ecdb0 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
@@ -228,6 +228,7 @@ PAGEFLAG_FALSE(HighMem) | |||
228 | PAGEFLAG(SwapCache, swapcache) | 228 | PAGEFLAG(SwapCache, swapcache) |
229 | #else | 229 | #else |
230 | PAGEFLAG_FALSE(SwapCache) | 230 | PAGEFLAG_FALSE(SwapCache) |
231 | SETPAGEFLAG_NOOP(SwapCache) CLEARPAGEFLAG_NOOP(SwapCache) | ||
231 | #endif | 232 | #endif |
232 | 233 | ||
233 | #ifdef CONFIG_UNEVICTABLE_LRU | 234 | #ifdef CONFIG_UNEVICTABLE_LRU |
@@ -372,31 +373,22 @@ static inline void __ClearPageTail(struct page *page) | |||
372 | #define __PG_MLOCKED 0 | 373 | #define __PG_MLOCKED 0 |
373 | #endif | 374 | #endif |
374 | 375 | ||
375 | #define PAGE_FLAGS (1 << PG_lru | 1 << PG_private | 1 << PG_locked | \ | ||
376 | 1 << PG_buddy | 1 << PG_writeback | \ | ||
377 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ | ||
378 | __PG_UNEVICTABLE | __PG_MLOCKED) | ||
379 | |||
380 | /* | ||
381 | * Flags checked in bad_page(). Pages on the free list should not have | ||
382 | * these flags set. It they are, there is a problem. | ||
383 | */ | ||
384 | #define PAGE_FLAGS_CLEAR_WHEN_BAD (PAGE_FLAGS | \ | ||
385 | 1 << PG_reclaim | 1 << PG_dirty | 1 << PG_swapbacked) | ||
386 | |||
387 | /* | 376 | /* |
388 | * Flags checked when a page is freed. Pages being freed should not have | 377 | * Flags checked when a page is freed. Pages being freed should not have |
389 | * these flags set. It they are, there is a problem. | 378 | * these flags set. It they are, there is a problem. |
390 | */ | 379 | */ |
391 | #define PAGE_FLAGS_CHECK_AT_FREE (PAGE_FLAGS | 1 << PG_reserved) | 380 | #define PAGE_FLAGS_CHECK_AT_FREE \ |
381 | (1 << PG_lru | 1 << PG_private | 1 << PG_locked | \ | ||
382 | 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \ | ||
383 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ | ||
384 | __PG_UNEVICTABLE | __PG_MLOCKED) | ||
392 | 385 | ||
393 | /* | 386 | /* |
394 | * Flags checked when a page is prepped for return by the page allocator. | 387 | * Flags checked when a page is prepped for return by the page allocator. |
395 | * Pages being prepped should not have these flags set. It they are, there | 388 | * Pages being prepped should not have any flags set. It they are set, |
396 | * is a problem. | 389 | * there has been a kernel bug or struct page corruption. |
397 | */ | 390 | */ |
398 | #define PAGE_FLAGS_CHECK_AT_PREP (PAGE_FLAGS | \ | 391 | #define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1) |
399 | 1 << PG_reserved | 1 << PG_dirty | 1 << PG_swapbacked) | ||
400 | 392 | ||
401 | #endif /* !__GENERATING_BOUNDS_H */ | 393 | #endif /* !__GENERATING_BOUNDS_H */ |
402 | #endif /* PAGE_FLAGS_H */ | 394 | #endif /* PAGE_FLAGS_H */ |
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index 1e6d34bfa094..602cc1fdee90 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h | |||
@@ -26,10 +26,6 @@ enum { | |||
26 | PCG_LOCK, /* page cgroup is locked */ | 26 | PCG_LOCK, /* page cgroup is locked */ |
27 | PCG_CACHE, /* charged as cache */ | 27 | PCG_CACHE, /* charged as cache */ |
28 | PCG_USED, /* this object is in use. */ | 28 | PCG_USED, /* this object is in use. */ |
29 | /* flags for LRU placement */ | ||
30 | PCG_ACTIVE, /* page is active in this cgroup */ | ||
31 | PCG_FILE, /* page is file system backed */ | ||
32 | PCG_UNEVICTABLE, /* page is unevictableable */ | ||
33 | }; | 29 | }; |
34 | 30 | ||
35 | #define TESTPCGFLAG(uname, lname) \ | 31 | #define TESTPCGFLAG(uname, lname) \ |
@@ -50,19 +46,6 @@ TESTPCGFLAG(Cache, CACHE) | |||
50 | TESTPCGFLAG(Used, USED) | 46 | TESTPCGFLAG(Used, USED) |
51 | CLEARPCGFLAG(Used, USED) | 47 | CLEARPCGFLAG(Used, USED) |
52 | 48 | ||
53 | /* LRU management flags (from global-lru definition) */ | ||
54 | TESTPCGFLAG(File, FILE) | ||
55 | SETPCGFLAG(File, FILE) | ||
56 | CLEARPCGFLAG(File, FILE) | ||
57 | |||
58 | TESTPCGFLAG(Active, ACTIVE) | ||
59 | SETPCGFLAG(Active, ACTIVE) | ||
60 | CLEARPCGFLAG(Active, ACTIVE) | ||
61 | |||
62 | TESTPCGFLAG(Unevictable, UNEVICTABLE) | ||
63 | SETPCGFLAG(Unevictable, UNEVICTABLE) | ||
64 | CLEARPCGFLAG(Unevictable, UNEVICTABLE) | ||
65 | |||
66 | static inline int page_cgroup_nid(struct page_cgroup *pc) | 49 | static inline int page_cgroup_nid(struct page_cgroup *pc) |
67 | { | 50 | { |
68 | return page_to_nid(pc->page); | 51 | return page_to_nid(pc->page); |
@@ -105,4 +88,39 @@ static inline void page_cgroup_init(void) | |||
105 | } | 88 | } |
106 | 89 | ||
107 | #endif | 90 | #endif |
91 | |||
92 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | ||
93 | #include <linux/swap.h> | ||
94 | extern struct mem_cgroup * | ||
95 | swap_cgroup_record(swp_entry_t ent, struct mem_cgroup *mem); | ||
96 | extern struct mem_cgroup *lookup_swap_cgroup(swp_entry_t ent); | ||
97 | extern int swap_cgroup_swapon(int type, unsigned long max_pages); | ||
98 | extern void swap_cgroup_swapoff(int type); | ||
99 | #else | ||
100 | #include <linux/swap.h> | ||
101 | |||
102 | static inline | ||
103 | struct mem_cgroup *swap_cgroup_record(swp_entry_t ent, struct mem_cgroup *mem) | ||
104 | { | ||
105 | return NULL; | ||
106 | } | ||
107 | |||
108 | static inline | ||
109 | struct mem_cgroup *lookup_swap_cgroup(swp_entry_t ent) | ||
110 | { | ||
111 | return NULL; | ||
112 | } | ||
113 | |||
114 | static inline int | ||
115 | swap_cgroup_swapon(int type, unsigned long max_pages) | ||
116 | { | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static inline void swap_cgroup_swapoff(int type) | ||
121 | { | ||
122 | return; | ||
123 | } | ||
124 | |||
125 | #endif | ||
108 | #endif | 126 | #endif |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 709742be02f0..01ca0856caff 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -241,7 +241,8 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start, | |||
241 | unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, | 241 | unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, |
242 | int tag, unsigned int nr_pages, struct page **pages); | 242 | int tag, unsigned int nr_pages, struct page **pages); |
243 | 243 | ||
244 | struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index); | 244 | struct page *grab_cache_page_write_begin(struct address_space *mapping, |
245 | pgoff_t index, unsigned flags); | ||
245 | 246 | ||
246 | /* | 247 | /* |
247 | * Returns locked page at given index in given cache, creating it if needed. | 248 | * Returns locked page at given index in given cache, creating it if needed. |
diff --git a/include/linux/pagevec.h b/include/linux/pagevec.h index e90a2cb02915..7b2886fa7fdc 100644 --- a/include/linux/pagevec.h +++ b/include/linux/pagevec.h | |||
@@ -21,7 +21,6 @@ struct pagevec { | |||
21 | }; | 21 | }; |
22 | 22 | ||
23 | void __pagevec_release(struct pagevec *pvec); | 23 | void __pagevec_release(struct pagevec *pvec); |
24 | void __pagevec_release_nonlru(struct pagevec *pvec); | ||
25 | void __pagevec_free(struct pagevec *pvec); | 24 | void __pagevec_free(struct pagevec *pvec); |
26 | void ____pagevec_lru_add(struct pagevec *pvec, enum lru_list lru); | 25 | void ____pagevec_lru_add(struct pagevec *pvec, enum lru_list lru); |
27 | void pagevec_strip(struct pagevec *pvec); | 26 | void pagevec_strip(struct pagevec *pvec); |
@@ -69,12 +68,6 @@ static inline void pagevec_release(struct pagevec *pvec) | |||
69 | __pagevec_release(pvec); | 68 | __pagevec_release(pvec); |
70 | } | 69 | } |
71 | 70 | ||
72 | static inline void pagevec_release_nonlru(struct pagevec *pvec) | ||
73 | { | ||
74 | if (pagevec_count(pvec)) | ||
75 | __pagevec_release_nonlru(pvec); | ||
76 | } | ||
77 | |||
78 | static inline void pagevec_free(struct pagevec *pvec) | 71 | static inline void pagevec_free(struct pagevec *pvec) |
79 | { | 72 | { |
80 | if (pagevec_count(pvec)) | 73 | if (pagevec_count(pvec)) |
diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 8837928fbf33..042c166f65d5 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h | |||
@@ -8,6 +8,8 @@ | |||
8 | #ifndef _PCI_ACPI_H_ | 8 | #ifndef _PCI_ACPI_H_ |
9 | #define _PCI_ACPI_H_ | 9 | #define _PCI_ACPI_H_ |
10 | 10 | ||
11 | #include <linux/acpi.h> | ||
12 | |||
11 | #define OSC_QUERY_TYPE 0 | 13 | #define OSC_QUERY_TYPE 0 |
12 | #define OSC_SUPPORT_TYPE 1 | 14 | #define OSC_SUPPORT_TYPE 1 |
13 | #define OSC_CONTROL_TYPE 2 | 15 | #define OSC_CONTROL_TYPE 2 |
@@ -48,15 +50,7 @@ | |||
48 | 50 | ||
49 | #ifdef CONFIG_ACPI | 51 | #ifdef CONFIG_ACPI |
50 | extern acpi_status pci_osc_control_set(acpi_handle handle, u32 flags); | 52 | extern acpi_status pci_osc_control_set(acpi_handle handle, u32 flags); |
51 | extern acpi_status __pci_osc_support_set(u32 flags, const char *hid); | 53 | int pci_acpi_osc_support(acpi_handle handle, u32 flags); |
52 | static inline acpi_status pci_osc_support_set(u32 flags) | ||
53 | { | ||
54 | return __pci_osc_support_set(flags, PCI_ROOT_HID_STRING); | ||
55 | } | ||
56 | static inline acpi_status pcie_osc_support_set(u32 flags) | ||
57 | { | ||
58 | return __pci_osc_support_set(flags, PCI_EXPRESS_ROOT_HID_STRING); | ||
59 | } | ||
60 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) | 54 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) |
61 | { | 55 | { |
62 | /* Find root host bridge */ | 56 | /* Find root host bridge */ |
@@ -66,6 +60,15 @@ static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) | |||
66 | return acpi_get_pci_rootbridge_handle(pci_domain_nr(pdev->bus), | 60 | return acpi_get_pci_rootbridge_handle(pci_domain_nr(pdev->bus), |
67 | pdev->bus->number); | 61 | pdev->bus->number); |
68 | } | 62 | } |
63 | |||
64 | static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus) | ||
65 | { | ||
66 | int seg = pci_domain_nr(pbus), busnr = pbus->number; | ||
67 | struct pci_dev *bridge = pbus->self; | ||
68 | if (bridge) | ||
69 | return DEVICE_ACPI_HANDLE(&(bridge->dev)); | ||
70 | return acpi_get_pci_rootbridge_handle(seg, busnr); | ||
71 | } | ||
69 | #else | 72 | #else |
70 | #if !defined(AE_ERROR) | 73 | #if !defined(AE_ERROR) |
71 | typedef u32 acpi_status; | 74 | typedef u32 acpi_status; |
@@ -73,8 +76,6 @@ typedef u32 acpi_status; | |||
73 | #endif | 76 | #endif |
74 | static inline acpi_status pci_osc_control_set(acpi_handle handle, u32 flags) | 77 | static inline acpi_status pci_osc_control_set(acpi_handle handle, u32 flags) |
75 | {return AE_ERROR;} | 78 | {return AE_ERROR;} |
76 | static inline acpi_status pci_osc_support_set(u32 flags) {return AE_ERROR;} | ||
77 | static inline acpi_status pcie_osc_support_set(u32 flags) {return AE_ERROR;} | ||
78 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) | 79 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) |
79 | { return NULL; } | 80 | { return NULL; } |
80 | #endif | 81 | #endif |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 03b0b8c3c81b..80f8b8b65fde 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -82,7 +82,30 @@ enum pci_mmap_state { | |||
82 | #define PCI_DMA_FROMDEVICE 2 | 82 | #define PCI_DMA_FROMDEVICE 2 |
83 | #define PCI_DMA_NONE 3 | 83 | #define PCI_DMA_NONE 3 |
84 | 84 | ||
85 | #define DEVICE_COUNT_RESOURCE 12 | 85 | /* |
86 | * For PCI devices, the region numbers are assigned this way: | ||
87 | */ | ||
88 | enum { | ||
89 | /* #0-5: standard PCI resources */ | ||
90 | PCI_STD_RESOURCES, | ||
91 | PCI_STD_RESOURCE_END = 5, | ||
92 | |||
93 | /* #6: expansion ROM resource */ | ||
94 | PCI_ROM_RESOURCE, | ||
95 | |||
96 | /* resources assigned to buses behind the bridge */ | ||
97 | #define PCI_BRIDGE_RESOURCE_NUM 4 | ||
98 | |||
99 | PCI_BRIDGE_RESOURCES, | ||
100 | PCI_BRIDGE_RESOURCE_END = PCI_BRIDGE_RESOURCES + | ||
101 | PCI_BRIDGE_RESOURCE_NUM - 1, | ||
102 | |||
103 | /* total resources associated with a PCI device */ | ||
104 | PCI_NUM_RESOURCES, | ||
105 | |||
106 | /* preserve this for compatibility */ | ||
107 | DEVICE_COUNT_RESOURCE | ||
108 | }; | ||
86 | 109 | ||
87 | typedef int __bitwise pci_power_t; | 110 | typedef int __bitwise pci_power_t; |
88 | 111 | ||
@@ -274,18 +297,6 @@ static inline void pci_add_saved_cap(struct pci_dev *pci_dev, | |||
274 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); | 297 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); |
275 | } | 298 | } |
276 | 299 | ||
277 | /* | ||
278 | * For PCI devices, the region numbers are assigned this way: | ||
279 | * | ||
280 | * 0-5 standard PCI regions | ||
281 | * 6 expansion ROM | ||
282 | * 7-10 bridges: address space assigned to buses behind the bridge | ||
283 | */ | ||
284 | |||
285 | #define PCI_ROM_RESOURCE 6 | ||
286 | #define PCI_BRIDGE_RESOURCES 7 | ||
287 | #define PCI_NUM_RESOURCES 11 | ||
288 | |||
289 | #ifndef PCI_BUS_NUM_RESOURCES | 300 | #ifndef PCI_BUS_NUM_RESOURCES |
290 | #define PCI_BUS_NUM_RESOURCES 16 | 301 | #define PCI_BUS_NUM_RESOURCES 16 |
291 | #endif | 302 | #endif |
@@ -325,6 +336,15 @@ struct pci_bus { | |||
325 | #define pci_bus_b(n) list_entry(n, struct pci_bus, node) | 336 | #define pci_bus_b(n) list_entry(n, struct pci_bus, node) |
326 | #define to_pci_bus(n) container_of(n, struct pci_bus, dev) | 337 | #define to_pci_bus(n) container_of(n, struct pci_bus, dev) |
327 | 338 | ||
339 | #ifdef CONFIG_PCI_MSI | ||
340 | static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) | ||
341 | { | ||
342 | return pci_dev->msi_enabled || pci_dev->msix_enabled; | ||
343 | } | ||
344 | #else | ||
345 | static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) { return false; } | ||
346 | #endif | ||
347 | |||
328 | /* | 348 | /* |
329 | * Error values that may be returned by PCI functions. | 349 | * Error values that may be returned by PCI functions. |
330 | */ | 350 | */ |
@@ -421,7 +441,6 @@ struct pci_driver { | |||
421 | int (*resume_early) (struct pci_dev *dev); | 441 | int (*resume_early) (struct pci_dev *dev); |
422 | int (*resume) (struct pci_dev *dev); /* Device woken up */ | 442 | int (*resume) (struct pci_dev *dev); /* Device woken up */ |
423 | void (*shutdown) (struct pci_dev *dev); | 443 | void (*shutdown) (struct pci_dev *dev); |
424 | struct pm_ext_ops *pm; | ||
425 | struct pci_error_handlers *err_handler; | 444 | struct pci_error_handlers *err_handler; |
426 | struct device_driver driver; | 445 | struct device_driver driver; |
427 | struct pci_dynids dynids; | 446 | struct pci_dynids dynids; |
@@ -533,7 +552,9 @@ int __must_check pci_bus_add_device(struct pci_dev *dev); | |||
533 | void pci_read_bridge_bases(struct pci_bus *child); | 552 | void pci_read_bridge_bases(struct pci_bus *child); |
534 | struct resource *pci_find_parent_resource(const struct pci_dev *dev, | 553 | struct resource *pci_find_parent_resource(const struct pci_dev *dev, |
535 | struct resource *res); | 554 | struct resource *res); |
555 | u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin); | ||
536 | int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); | 556 | int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); |
557 | u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp); | ||
537 | extern struct pci_dev *pci_dev_get(struct pci_dev *dev); | 558 | extern struct pci_dev *pci_dev_get(struct pci_dev *dev); |
538 | extern void pci_dev_put(struct pci_dev *dev); | 559 | extern void pci_dev_put(struct pci_dev *dev); |
539 | extern void pci_remove_bus(struct pci_bus *b); | 560 | extern void pci_remove_bus(struct pci_bus *b); |
@@ -630,6 +651,7 @@ static inline int pci_is_managed(struct pci_dev *pdev) | |||
630 | 651 | ||
631 | void pci_disable_device(struct pci_dev *dev); | 652 | void pci_disable_device(struct pci_dev *dev); |
632 | void pci_set_master(struct pci_dev *dev); | 653 | void pci_set_master(struct pci_dev *dev); |
654 | void pci_clear_master(struct pci_dev *dev); | ||
633 | int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state); | 655 | int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state); |
634 | #define HAVE_PCI_SET_MWI | 656 | #define HAVE_PCI_SET_MWI |
635 | int __must_check pci_set_mwi(struct pci_dev *dev); | 657 | int __must_check pci_set_mwi(struct pci_dev *dev); |
@@ -648,7 +670,7 @@ int pcie_get_readrq(struct pci_dev *dev); | |||
648 | int pcie_set_readrq(struct pci_dev *dev, int rq); | 670 | int pcie_set_readrq(struct pci_dev *dev, int rq); |
649 | int pci_reset_function(struct pci_dev *dev); | 671 | int pci_reset_function(struct pci_dev *dev); |
650 | int pci_execute_reset_function(struct pci_dev *dev); | 672 | int pci_execute_reset_function(struct pci_dev *dev); |
651 | void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); | 673 | void pci_update_resource(struct pci_dev *dev, int resno); |
652 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); | 674 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); |
653 | int pci_select_bars(struct pci_dev *dev, unsigned long flags); | 675 | int pci_select_bars(struct pci_dev *dev, unsigned long flags); |
654 | 676 | ||
@@ -675,6 +697,11 @@ int pci_back_from_sleep(struct pci_dev *dev); | |||
675 | /* Functions for PCI Hotplug drivers to use */ | 697 | /* Functions for PCI Hotplug drivers to use */ |
676 | int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); | 698 | int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap); |
677 | 699 | ||
700 | /* Vital product data routines */ | ||
701 | ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf); | ||
702 | ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); | ||
703 | int pci_vpd_truncate(struct pci_dev *dev, size_t size); | ||
704 | |||
678 | /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ | 705 | /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */ |
679 | void pci_bus_assign_resources(struct pci_bus *bus); | 706 | void pci_bus_assign_resources(struct pci_bus *bus); |
680 | void pci_bus_size_bridges(struct pci_bus *bus); | 707 | void pci_bus_size_bridges(struct pci_bus *bus); |
@@ -687,10 +714,13 @@ void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *), | |||
687 | int (*)(struct pci_dev *, u8, u8)); | 714 | int (*)(struct pci_dev *, u8, u8)); |
688 | #define HAVE_PCI_REQ_REGIONS 2 | 715 | #define HAVE_PCI_REQ_REGIONS 2 |
689 | int __must_check pci_request_regions(struct pci_dev *, const char *); | 716 | int __must_check pci_request_regions(struct pci_dev *, const char *); |
717 | int __must_check pci_request_regions_exclusive(struct pci_dev *, const char *); | ||
690 | void pci_release_regions(struct pci_dev *); | 718 | void pci_release_regions(struct pci_dev *); |
691 | int __must_check pci_request_region(struct pci_dev *, int, const char *); | 719 | int __must_check pci_request_region(struct pci_dev *, int, const char *); |
720 | int __must_check pci_request_region_exclusive(struct pci_dev *, int, const char *); | ||
692 | void pci_release_region(struct pci_dev *, int); | 721 | void pci_release_region(struct pci_dev *, int); |
693 | int pci_request_selected_regions(struct pci_dev *, int, const char *); | 722 | int pci_request_selected_regions(struct pci_dev *, int, const char *); |
723 | int pci_request_selected_regions_exclusive(struct pci_dev *, int, const char *); | ||
694 | void pci_release_selected_regions(struct pci_dev *, int); | 724 | void pci_release_selected_regions(struct pci_dev *, int); |
695 | 725 | ||
696 | /* drivers/pci/bus.c */ | 726 | /* drivers/pci/bus.c */ |
@@ -780,6 +810,10 @@ static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) | |||
780 | 810 | ||
781 | static inline void pci_restore_msi_state(struct pci_dev *dev) | 811 | static inline void pci_restore_msi_state(struct pci_dev *dev) |
782 | { } | 812 | { } |
813 | static inline int pci_msi_enabled(void) | ||
814 | { | ||
815 | return 0; | ||
816 | } | ||
783 | #else | 817 | #else |
784 | extern int pci_enable_msi(struct pci_dev *dev); | 818 | extern int pci_enable_msi(struct pci_dev *dev); |
785 | extern void pci_msi_shutdown(struct pci_dev *dev); | 819 | extern void pci_msi_shutdown(struct pci_dev *dev); |
@@ -790,6 +824,16 @@ extern void pci_msix_shutdown(struct pci_dev *dev); | |||
790 | extern void pci_disable_msix(struct pci_dev *dev); | 824 | extern void pci_disable_msix(struct pci_dev *dev); |
791 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); | 825 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); |
792 | extern void pci_restore_msi_state(struct pci_dev *dev); | 826 | extern void pci_restore_msi_state(struct pci_dev *dev); |
827 | extern int pci_msi_enabled(void); | ||
828 | #endif | ||
829 | |||
830 | #ifndef CONFIG_PCIEASPM | ||
831 | static inline int pcie_aspm_enabled(void) | ||
832 | { | ||
833 | return 0; | ||
834 | } | ||
835 | #else | ||
836 | extern int pcie_aspm_enabled(void); | ||
793 | #endif | 837 | #endif |
794 | 838 | ||
795 | #ifdef CONFIG_HT_IRQ | 839 | #ifdef CONFIG_HT_IRQ |
@@ -1141,20 +1185,9 @@ static inline void pci_mmcfg_early_init(void) { } | |||
1141 | static inline void pci_mmcfg_late_init(void) { } | 1185 | static inline void pci_mmcfg_late_init(void) { } |
1142 | #endif | 1186 | #endif |
1143 | 1187 | ||
1144 | #ifdef CONFIG_HAS_IOMEM | 1188 | int pci_ext_cfg_avail(struct pci_dev *dev); |
1145 | static inline void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar) | 1189 | |
1146 | { | 1190 | void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar); |
1147 | /* | ||
1148 | * Make sure the BAR is actually a memory resource, not an IO resource | ||
1149 | */ | ||
1150 | if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) { | ||
1151 | WARN_ON(1); | ||
1152 | return NULL; | ||
1153 | } | ||
1154 | return ioremap_nocache(pci_resource_start(pdev, bar), | ||
1155 | pci_resource_len(pdev, bar)); | ||
1156 | } | ||
1157 | #endif | ||
1158 | 1191 | ||
1159 | #endif /* __KERNEL__ */ | 1192 | #endif /* __KERNEL__ */ |
1160 | #endif /* LINUX_PCI_H */ | 1193 | #endif /* LINUX_PCI_H */ |
diff --git a/include/linux/pci_hotplug.h b/include/linux/pci_hotplug.h index a00bd1a0f156..20998746518e 100644 --- a/include/linux/pci_hotplug.h +++ b/include/linux/pci_hotplug.h | |||
@@ -223,11 +223,12 @@ struct hotplug_params { | |||
223 | #ifdef CONFIG_ACPI | 223 | #ifdef CONFIG_ACPI |
224 | #include <acpi/acpi.h> | 224 | #include <acpi/acpi.h> |
225 | #include <acpi/acpi_bus.h> | 225 | #include <acpi/acpi_bus.h> |
226 | #include <acpi/actypes.h> | ||
227 | extern acpi_status acpi_get_hp_params_from_firmware(struct pci_bus *bus, | 226 | extern acpi_status acpi_get_hp_params_from_firmware(struct pci_bus *bus, |
228 | struct hotplug_params *hpp); | 227 | struct hotplug_params *hpp); |
229 | int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags); | 228 | int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags); |
230 | int acpi_root_bridge(acpi_handle handle); | 229 | int acpi_root_bridge(acpi_handle handle); |
230 | int acpi_pci_check_ejectable(struct pci_bus *pbus, acpi_handle handle); | ||
231 | int acpi_pci_detect_ejectable(struct pci_bus *pbus); | ||
231 | #endif | 232 | #endif |
232 | #endif | 233 | #endif |
233 | 234 | ||
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index b6e694454280..d543365518ab 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -1658,6 +1658,7 @@ | |||
1658 | #define PCI_VENDOR_ID_ROCKWELL 0x127A | 1658 | #define PCI_VENDOR_ID_ROCKWELL 0x127A |
1659 | 1659 | ||
1660 | #define PCI_VENDOR_ID_ITE 0x1283 | 1660 | #define PCI_VENDOR_ID_ITE 0x1283 |
1661 | #define PCI_DEVICE_ID_ITE_8172 0x8172 | ||
1661 | #define PCI_DEVICE_ID_ITE_8211 0x8211 | 1662 | #define PCI_DEVICE_ID_ITE_8211 0x8211 |
1662 | #define PCI_DEVICE_ID_ITE_8212 0x8212 | 1663 | #define PCI_DEVICE_ID_ITE_8212 0x8212 |
1663 | #define PCI_DEVICE_ID_ITE_8213 0x8213 | 1664 | #define PCI_DEVICE_ID_ITE_8213 0x8213 |
@@ -1766,6 +1767,7 @@ | |||
1766 | #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081 | 1767 | #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081 |
1767 | #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082 | 1768 | #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082 |
1768 | #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050 | 1769 | #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050 |
1770 | #define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530 | ||
1769 | 1771 | ||
1770 | #define PCI_VENDOR_ID_RADISYS 0x1331 | 1772 | #define PCI_VENDOR_ID_RADISYS 0x1331 |
1771 | 1773 | ||
@@ -1795,6 +1797,7 @@ | |||
1795 | #define PCI_DEVICE_ID_SEALEVEL_UCOMM232 0x7202 | 1797 | #define PCI_DEVICE_ID_SEALEVEL_UCOMM232 0x7202 |
1796 | #define PCI_DEVICE_ID_SEALEVEL_COMM4 0x7401 | 1798 | #define PCI_DEVICE_ID_SEALEVEL_COMM4 0x7401 |
1797 | #define PCI_DEVICE_ID_SEALEVEL_COMM8 0x7801 | 1799 | #define PCI_DEVICE_ID_SEALEVEL_COMM8 0x7801 |
1800 | #define PCI_DEVICE_ID_SEALEVEL_7803 0x7803 | ||
1798 | #define PCI_DEVICE_ID_SEALEVEL_UCOMM8 0x7804 | 1801 | #define PCI_DEVICE_ID_SEALEVEL_UCOMM8 0x7804 |
1799 | 1802 | ||
1800 | #define PCI_VENDOR_ID_HYPERCOPE 0x1365 | 1803 | #define PCI_VENDOR_ID_HYPERCOPE 0x1365 |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h index e5effd47ed74..027815b4635e 100644 --- a/include/linux/pci_regs.h +++ b/include/linux/pci_regs.h | |||
@@ -210,6 +210,7 @@ | |||
210 | #define PCI_CAP_ID_AGP3 0x0E /* AGP Target PCI-PCI bridge */ | 210 | #define PCI_CAP_ID_AGP3 0x0E /* AGP Target PCI-PCI bridge */ |
211 | #define PCI_CAP_ID_EXP 0x10 /* PCI Express */ | 211 | #define PCI_CAP_ID_EXP 0x10 /* PCI Express */ |
212 | #define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ | 212 | #define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ |
213 | #define PCI_CAP_ID_AF 0x13 /* PCI Advanced Features */ | ||
213 | #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ | 214 | #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ |
214 | #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ | 215 | #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ |
215 | #define PCI_CAP_SIZEOF 4 | 216 | #define PCI_CAP_SIZEOF 4 |
@@ -316,6 +317,17 @@ | |||
316 | #define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */ | 317 | #define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */ |
317 | #define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */ | 318 | #define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */ |
318 | 319 | ||
320 | /* PCI Advanced Feature registers */ | ||
321 | |||
322 | #define PCI_AF_LENGTH 2 | ||
323 | #define PCI_AF_CAP 3 | ||
324 | #define PCI_AF_CAP_TP 0x01 | ||
325 | #define PCI_AF_CAP_FLR 0x02 | ||
326 | #define PCI_AF_CTRL 4 | ||
327 | #define PCI_AF_CTRL_FLR 0x01 | ||
328 | #define PCI_AF_STATUS 5 | ||
329 | #define PCI_AF_STATUS_TP 0x01 | ||
330 | |||
319 | /* PCI-X registers */ | 331 | /* PCI-X registers */ |
320 | 332 | ||
321 | #define PCI_X_CMD 2 /* Modes & Features */ | 333 | #define PCI_X_CMD 2 /* Modes & Features */ |
@@ -399,20 +411,70 @@ | |||
399 | #define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ | 411 | #define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ |
400 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ | 412 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ |
401 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ | 413 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ |
402 | #define PCI_EXP_LNKCAP_ASPMS 0xc00 /* ASPM Support */ | 414 | #define PCI_EXP_LNKCAP_SLS 0x0000000f /* Supported Link Speeds */ |
403 | #define PCI_EXP_LNKCAP_L0SEL 0x7000 /* L0s Exit Latency */ | 415 | #define PCI_EXP_LNKCAP_MLW 0x000003f0 /* Maximum Link Width */ |
404 | #define PCI_EXP_LNKCAP_L1EL 0x38000 /* L1 Exit Latency */ | 416 | #define PCI_EXP_LNKCAP_ASPMS 0x00000c00 /* ASPM Support */ |
405 | #define PCI_EXP_LNKCAP_CLKPM 0x40000 /* L1 Clock Power Management */ | 417 | #define PCI_EXP_LNKCAP_L0SEL 0x00007000 /* L0s Exit Latency */ |
418 | #define PCI_EXP_LNKCAP_L1EL 0x00038000 /* L1 Exit Latency */ | ||
419 | #define PCI_EXP_LNKCAP_CLKPM 0x00040000 /* L1 Clock Power Management */ | ||
420 | #define PCI_EXP_LNKCAP_SDERC 0x00080000 /* Suprise Down Error Reporting Capable */ | ||
421 | #define PCI_EXP_LNKCAP_DLLLARC 0x00100000 /* Data Link Layer Link Active Reporting Capable */ | ||
422 | #define PCI_EXP_LNKCAP_LBNC 0x00200000 /* Link Bandwidth Notification Capability */ | ||
423 | #define PCI_EXP_LNKCAP_PN 0xff000000 /* Port Number */ | ||
406 | #define PCI_EXP_LNKCTL 16 /* Link Control */ | 424 | #define PCI_EXP_LNKCTL 16 /* Link Control */ |
407 | #define PCI_EXP_LNKCTL_RL 0x20 /* Retrain Link */ | 425 | #define PCI_EXP_LNKCTL_ASPMC 0x0003 /* ASPM Control */ |
408 | #define PCI_EXP_LNKCTL_CCC 0x40 /* Common Clock COnfiguration */ | 426 | #define PCI_EXP_LNKCTL_RCB 0x0008 /* Read Completion Boundary */ |
427 | #define PCI_EXP_LNKCTL_LD 0x0010 /* Link Disable */ | ||
428 | #define PCI_EXP_LNKCTL_RL 0x0020 /* Retrain Link */ | ||
429 | #define PCI_EXP_LNKCTL_CCC 0x0040 /* Common Clock Configuration */ | ||
430 | #define PCI_EXP_LNKCTL_ES 0x0080 /* Extended Synch */ | ||
409 | #define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */ | 431 | #define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */ |
432 | #define PCI_EXP_LNKCTL_HAWD 0x0200 /* Hardware Autonomous Width Disable */ | ||
433 | #define PCI_EXP_LNKCTL_LBMIE 0x0400 /* Link Bandwidth Management Interrupt Enable */ | ||
434 | #define PCI_EXP_LNKCTL_LABIE 0x0800 /* Lnk Autonomous Bandwidth Interrupt Enable */ | ||
410 | #define PCI_EXP_LNKSTA 18 /* Link Status */ | 435 | #define PCI_EXP_LNKSTA 18 /* Link Status */ |
411 | #define PCI_EXP_LNKSTA_LT 0x800 /* Link Training */ | 436 | #define PCI_EXP_LNKSTA_CLS 0x000f /* Current Link Speed */ |
437 | #define PCI_EXP_LNKSTA_NLW 0x03f0 /* Nogotiated Link Width */ | ||
438 | #define PCI_EXP_LNKSTA_LT 0x0800 /* Link Training */ | ||
412 | #define PCI_EXP_LNKSTA_SLC 0x1000 /* Slot Clock Configuration */ | 439 | #define PCI_EXP_LNKSTA_SLC 0x1000 /* Slot Clock Configuration */ |
440 | #define PCI_EXP_LNKSTA_DLLLA 0x2000 /* Data Link Layer Link Active */ | ||
441 | #define PCI_EXP_LNKSTA_LBMS 0x4000 /* Link Bandwidth Management Status */ | ||
442 | #define PCI_EXP_LNKSTA_LABS 0x8000 /* Link Autonomous Bandwidth Status */ | ||
413 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ | 443 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ |
444 | #define PCI_EXP_SLTCAP_ABP 0x00000001 /* Attention Button Present */ | ||
445 | #define PCI_EXP_SLTCAP_PCP 0x00000002 /* Power Controller Present */ | ||
446 | #define PCI_EXP_SLTCAP_MRLSP 0x00000004 /* MRL Sensor Present */ | ||
447 | #define PCI_EXP_SLTCAP_AIP 0x00000008 /* Attention Indicator Present */ | ||
448 | #define PCI_EXP_SLTCAP_PIP 0x00000010 /* Power Indicator Present */ | ||
449 | #define PCI_EXP_SLTCAP_HPS 0x00000020 /* Hot-Plug Surprise */ | ||
450 | #define PCI_EXP_SLTCAP_HPC 0x00000040 /* Hot-Plug Capable */ | ||
451 | #define PCI_EXP_SLTCAP_SPLV 0x00007f80 /* Slot Power Limit Value */ | ||
452 | #define PCI_EXP_SLTCAP_SPLS 0x00018000 /* Slot Power Limit Scale */ | ||
453 | #define PCI_EXP_SLTCAP_EIP 0x00020000 /* Electromechanical Interlock Present */ | ||
454 | #define PCI_EXP_SLTCAP_NCCS 0x00040000 /* No Command Completed Support */ | ||
455 | #define PCI_EXP_SLTCAP_PSN 0xfff80000 /* Physical Slot Number */ | ||
414 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ | 456 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ |
457 | #define PCI_EXP_SLTCTL_ABPE 0x0001 /* Attention Button Pressed Enable */ | ||
458 | #define PCI_EXP_SLTCTL_PFDE 0x0002 /* Power Fault Detected Enable */ | ||
459 | #define PCI_EXP_SLTCTL_MRLSCE 0x0004 /* MRL Sensor Changed Enable */ | ||
460 | #define PCI_EXP_SLTCTL_PDCE 0x0008 /* Presence Detect Changed Enable */ | ||
461 | #define PCI_EXP_SLTCTL_CCIE 0x0010 /* Command Completed Interrupt Enable */ | ||
462 | #define PCI_EXP_SLTCTL_HPIE 0x0020 /* Hot-Plug Interrupt Enable */ | ||
463 | #define PCI_EXP_SLTCTL_AIC 0x00c0 /* Attention Indicator Control */ | ||
464 | #define PCI_EXP_SLTCTL_PIC 0x0300 /* Power Indicator Control */ | ||
465 | #define PCI_EXP_SLTCTL_PCC 0x0400 /* Power Controller Control */ | ||
466 | #define PCI_EXP_SLTCTL_EIC 0x0800 /* Electromechanical Interlock Control */ | ||
467 | #define PCI_EXP_SLTCTL_DLLSCE 0x1000 /* Data Link Layer State Changed Enable */ | ||
415 | #define PCI_EXP_SLTSTA 26 /* Slot Status */ | 468 | #define PCI_EXP_SLTSTA 26 /* Slot Status */ |
469 | #define PCI_EXP_SLTSTA_ABP 0x0001 /* Attention Button Pressed */ | ||
470 | #define PCI_EXP_SLTSTA_PFD 0x0002 /* Power Fault Detected */ | ||
471 | #define PCI_EXP_SLTSTA_MRLSC 0x0004 /* MRL Sensor Changed */ | ||
472 | #define PCI_EXP_SLTSTA_PDC 0x0008 /* Presence Detect Changed */ | ||
473 | #define PCI_EXP_SLTSTA_CC 0x0010 /* Command Completed */ | ||
474 | #define PCI_EXP_SLTSTA_MRLSS 0x0020 /* MRL Sensor State */ | ||
475 | #define PCI_EXP_SLTSTA_PDS 0x0040 /* Presence Detect State */ | ||
476 | #define PCI_EXP_SLTSTA_EIS 0x0080 /* Electromechanical Interlock Status */ | ||
477 | #define PCI_EXP_SLTSTA_DLLSC 0x0100 /* Data Link Layer State Changed */ | ||
416 | #define PCI_EXP_RTCTL 28 /* Root Control */ | 478 | #define PCI_EXP_RTCTL 28 /* Root Control */ |
417 | #define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Correctable Error */ | 479 | #define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Correctable Error */ |
418 | #define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */ | 480 | #define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */ |
diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 9007ccdfc112..a7684a513994 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h | |||
@@ -24,14 +24,18 @@ struct percpu_counter { | |||
24 | s32 *counters; | 24 | s32 *counters; |
25 | }; | 25 | }; |
26 | 26 | ||
27 | #if NR_CPUS >= 16 | 27 | extern int percpu_counter_batch; |
28 | #define FBC_BATCH (NR_CPUS*2) | 28 | |
29 | #else | 29 | int __percpu_counter_init(struct percpu_counter *fbc, s64 amount, |
30 | #define FBC_BATCH (NR_CPUS*4) | 30 | struct lock_class_key *key); |
31 | #endif | 31 | |
32 | #define percpu_counter_init(fbc, value) \ | ||
33 | ({ \ | ||
34 | static struct lock_class_key __key; \ | ||
35 | \ | ||
36 | __percpu_counter_init(fbc, value, &__key); \ | ||
37 | }) | ||
32 | 38 | ||
33 | int percpu_counter_init(struct percpu_counter *fbc, s64 amount); | ||
34 | int percpu_counter_init_irq(struct percpu_counter *fbc, s64 amount); | ||
35 | void percpu_counter_destroy(struct percpu_counter *fbc); | 39 | void percpu_counter_destroy(struct percpu_counter *fbc); |
36 | void percpu_counter_set(struct percpu_counter *fbc, s64 amount); | 40 | void percpu_counter_set(struct percpu_counter *fbc, s64 amount); |
37 | void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); | 41 | void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); |
@@ -39,7 +43,7 @@ s64 __percpu_counter_sum(struct percpu_counter *fbc); | |||
39 | 43 | ||
40 | static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount) | 44 | static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount) |
41 | { | 45 | { |
42 | __percpu_counter_add(fbc, amount, FBC_BATCH); | 46 | __percpu_counter_add(fbc, amount, percpu_counter_batch); |
43 | } | 47 | } |
44 | 48 | ||
45 | static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc) | 49 | static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc) |
@@ -85,8 +89,6 @@ static inline int percpu_counter_init(struct percpu_counter *fbc, s64 amount) | |||
85 | return 0; | 89 | return 0; |
86 | } | 90 | } |
87 | 91 | ||
88 | #define percpu_counter_init_irq percpu_counter_init | ||
89 | |||
90 | static inline void percpu_counter_destroy(struct percpu_counter *fbc) | 92 | static inline void percpu_counter_destroy(struct percpu_counter *fbc) |
91 | { | 93 | { |
92 | } | 94 | } |
diff --git a/include/linux/pid.h b/include/linux/pid.h index bb206c56d1f0..49f1c2f66e95 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h | |||
@@ -123,6 +123,24 @@ extern struct pid *alloc_pid(struct pid_namespace *ns); | |||
123 | extern void free_pid(struct pid *pid); | 123 | extern void free_pid(struct pid *pid); |
124 | 124 | ||
125 | /* | 125 | /* |
126 | * ns_of_pid() returns the pid namespace in which the specified pid was | ||
127 | * allocated. | ||
128 | * | ||
129 | * NOTE: | ||
130 | * ns_of_pid() is expected to be called for a process (task) that has | ||
131 | * an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid | ||
132 | * is expected to be non-NULL. If @pid is NULL, caller should handle | ||
133 | * the resulting NULL pid-ns. | ||
134 | */ | ||
135 | static inline struct pid_namespace *ns_of_pid(struct pid *pid) | ||
136 | { | ||
137 | struct pid_namespace *ns = NULL; | ||
138 | if (pid) | ||
139 | ns = pid->numbers[pid->level].ns; | ||
140 | return ns; | ||
141 | } | ||
142 | |||
143 | /* | ||
126 | * the helpers to get the pid's id seen from different namespaces | 144 | * the helpers to get the pid's id seen from different namespaces |
127 | * | 145 | * |
128 | * pid_nr() : global id, i.e. the id seen from the init namespace; | 146 | * pid_nr() : global id, i.e. the id seen from the init namespace; |
diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h index d82fe825d62f..38d10326246a 100644 --- a/include/linux/pid_namespace.h +++ b/include/linux/pid_namespace.h | |||
@@ -79,11 +79,7 @@ static inline void zap_pid_ns_processes(struct pid_namespace *ns) | |||
79 | } | 79 | } |
80 | #endif /* CONFIG_PID_NS */ | 80 | #endif /* CONFIG_PID_NS */ |
81 | 81 | ||
82 | static inline struct pid_namespace *task_active_pid_ns(struct task_struct *tsk) | 82 | extern struct pid_namespace *task_active_pid_ns(struct task_struct *tsk); |
83 | { | ||
84 | return tsk->nsproxy->pid_ns; | ||
85 | } | ||
86 | |||
87 | void pidhash_init(void); | 83 | void pidhash_init(void); |
88 | void pidmap_init(void); | 84 | void pidmap_init(void); |
89 | 85 | ||
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 4b8cc6a32479..9a342699c607 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h | |||
@@ -55,7 +55,6 @@ struct platform_driver { | |||
55 | int (*suspend_late)(struct platform_device *, pm_message_t state); | 55 | int (*suspend_late)(struct platform_device *, pm_message_t state); |
56 | int (*resume_early)(struct platform_device *); | 56 | int (*resume_early)(struct platform_device *); |
57 | int (*resume)(struct platform_device *); | 57 | int (*resume)(struct platform_device *); |
58 | struct pm_ext_ops *pm; | ||
59 | struct device_driver driver; | 58 | struct device_driver driver; |
60 | }; | 59 | }; |
61 | 60 | ||
diff --git a/include/linux/pm.h b/include/linux/pm.h index 42de4003c4ee..de2e0a8f6728 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
@@ -41,7 +41,7 @@ typedef struct pm_message { | |||
41 | } pm_message_t; | 41 | } pm_message_t; |
42 | 42 | ||
43 | /** | 43 | /** |
44 | * struct pm_ops - device PM callbacks | 44 | * struct dev_pm_ops - device PM callbacks |
45 | * | 45 | * |
46 | * Several driver power state transitions are externally visible, affecting | 46 | * Several driver power state transitions are externally visible, affecting |
47 | * the state of pending I/O queues and (for drivers that touch hardware) | 47 | * the state of pending I/O queues and (for drivers that touch hardware) |
@@ -126,46 +126,6 @@ typedef struct pm_message { | |||
126 | * On most platforms, there are no restrictions on availability of | 126 | * On most platforms, there are no restrictions on availability of |
127 | * resources like clocks during @restore(). | 127 | * resources like clocks during @restore(). |
128 | * | 128 | * |
129 | * All of the above callbacks, except for @complete(), return error codes. | ||
130 | * However, the error codes returned by the resume operations, @resume(), | ||
131 | * @thaw(), and @restore(), do not cause the PM core to abort the resume | ||
132 | * transition during which they are returned. The error codes returned in | ||
133 | * that cases are only printed by the PM core to the system logs for debugging | ||
134 | * purposes. Still, it is recommended that drivers only return error codes | ||
135 | * from their resume methods in case of an unrecoverable failure (i.e. when the | ||
136 | * device being handled refuses to resume and becomes unusable) to allow us to | ||
137 | * modify the PM core in the future, so that it can avoid attempting to handle | ||
138 | * devices that failed to resume and their children. | ||
139 | * | ||
140 | * It is allowed to unregister devices while the above callbacks are being | ||
141 | * executed. However, it is not allowed to unregister a device from within any | ||
142 | * of its own callbacks. | ||
143 | */ | ||
144 | |||
145 | struct pm_ops { | ||
146 | int (*prepare)(struct device *dev); | ||
147 | void (*complete)(struct device *dev); | ||
148 | int (*suspend)(struct device *dev); | ||
149 | int (*resume)(struct device *dev); | ||
150 | int (*freeze)(struct device *dev); | ||
151 | int (*thaw)(struct device *dev); | ||
152 | int (*poweroff)(struct device *dev); | ||
153 | int (*restore)(struct device *dev); | ||
154 | }; | ||
155 | |||
156 | /** | ||
157 | * struct pm_ext_ops - extended device PM callbacks | ||
158 | * | ||
159 | * Some devices require certain operations related to suspend and hibernation | ||
160 | * to be carried out with interrupts disabled. Thus, 'struct pm_ext_ops' below | ||
161 | * is defined, adding callbacks to be executed with interrupts disabled to | ||
162 | * 'struct pm_ops'. | ||
163 | * | ||
164 | * The following callbacks included in 'struct pm_ext_ops' are executed with | ||
165 | * the nonboot CPUs switched off and with interrupts disabled on the only | ||
166 | * functional CPU. They also are executed with the PM core list of devices | ||
167 | * locked, so they must NOT unregister any devices. | ||
168 | * | ||
169 | * @suspend_noirq: Complete the operations of ->suspend() by carrying out any | 129 | * @suspend_noirq: Complete the operations of ->suspend() by carrying out any |
170 | * actions required for suspending the device that need interrupts to be | 130 | * actions required for suspending the device that need interrupts to be |
171 | * disabled | 131 | * disabled |
@@ -190,18 +150,32 @@ struct pm_ops { | |||
190 | * actions required for restoring the operations of the device that need | 150 | * actions required for restoring the operations of the device that need |
191 | * interrupts to be disabled | 151 | * interrupts to be disabled |
192 | * | 152 | * |
193 | * All of the above callbacks return error codes, but the error codes returned | 153 | * All of the above callbacks, except for @complete(), return error codes. |
194 | * by the resume operations, @resume_noirq(), @thaw_noirq(), and | 154 | * However, the error codes returned by the resume operations, @resume(), |
195 | * @restore_noirq(), do not cause the PM core to abort the resume transition | 155 | * @thaw(), @restore(), @resume_noirq(), @thaw_noirq(), and @restore_noirq() do |
196 | * during which they are returned. The error codes returned in that cases are | 156 | * not cause the PM core to abort the resume transition during which they are |
197 | * only printed by the PM core to the system logs for debugging purposes. | 157 | * returned. The error codes returned in that cases are only printed by the PM |
198 | * Still, as stated above, it is recommended that drivers only return error | 158 | * core to the system logs for debugging purposes. Still, it is recommended |
199 | * codes from their resume methods if the device being handled fails to resume | 159 | * that drivers only return error codes from their resume methods in case of an |
200 | * and is not usable any more. | 160 | * unrecoverable failure (i.e. when the device being handled refuses to resume |
161 | * and becomes unusable) to allow us to modify the PM core in the future, so | ||
162 | * that it can avoid attempting to handle devices that failed to resume and | ||
163 | * their children. | ||
164 | * | ||
165 | * It is allowed to unregister devices while the above callbacks are being | ||
166 | * executed. However, it is not allowed to unregister a device from within any | ||
167 | * of its own callbacks. | ||
201 | */ | 168 | */ |
202 | 169 | ||
203 | struct pm_ext_ops { | 170 | struct dev_pm_ops { |
204 | struct pm_ops base; | 171 | int (*prepare)(struct device *dev); |
172 | void (*complete)(struct device *dev); | ||
173 | int (*suspend)(struct device *dev); | ||
174 | int (*resume)(struct device *dev); | ||
175 | int (*freeze)(struct device *dev); | ||
176 | int (*thaw)(struct device *dev); | ||
177 | int (*poweroff)(struct device *dev); | ||
178 | int (*restore)(struct device *dev); | ||
205 | int (*suspend_noirq)(struct device *dev); | 179 | int (*suspend_noirq)(struct device *dev); |
206 | int (*resume_noirq)(struct device *dev); | 180 | int (*resume_noirq)(struct device *dev); |
207 | int (*freeze_noirq)(struct device *dev); | 181 | int (*freeze_noirq)(struct device *dev); |
@@ -278,7 +252,7 @@ struct pm_ext_ops { | |||
278 | #define PM_EVENT_SLEEP (PM_EVENT_SUSPEND | PM_EVENT_HIBERNATE) | 252 | #define PM_EVENT_SLEEP (PM_EVENT_SUSPEND | PM_EVENT_HIBERNATE) |
279 | #define PM_EVENT_USER_SUSPEND (PM_EVENT_USER | PM_EVENT_SUSPEND) | 253 | #define PM_EVENT_USER_SUSPEND (PM_EVENT_USER | PM_EVENT_SUSPEND) |
280 | #define PM_EVENT_USER_RESUME (PM_EVENT_USER | PM_EVENT_RESUME) | 254 | #define PM_EVENT_USER_RESUME (PM_EVENT_USER | PM_EVENT_RESUME) |
281 | #define PM_EVENT_REMOTE_WAKEUP (PM_EVENT_REMOTE | PM_EVENT_RESUME) | 255 | #define PM_EVENT_REMOTE_RESUME (PM_EVENT_REMOTE | PM_EVENT_RESUME) |
282 | #define PM_EVENT_AUTO_SUSPEND (PM_EVENT_AUTO | PM_EVENT_SUSPEND) | 256 | #define PM_EVENT_AUTO_SUSPEND (PM_EVENT_AUTO | PM_EVENT_SUSPEND) |
283 | #define PM_EVENT_AUTO_RESUME (PM_EVENT_AUTO | PM_EVENT_RESUME) | 257 | #define PM_EVENT_AUTO_RESUME (PM_EVENT_AUTO | PM_EVENT_RESUME) |
284 | 258 | ||
@@ -291,15 +265,15 @@ struct pm_ext_ops { | |||
291 | #define PMSG_THAW ((struct pm_message){ .event = PM_EVENT_THAW, }) | 265 | #define PMSG_THAW ((struct pm_message){ .event = PM_EVENT_THAW, }) |
292 | #define PMSG_RESTORE ((struct pm_message){ .event = PM_EVENT_RESTORE, }) | 266 | #define PMSG_RESTORE ((struct pm_message){ .event = PM_EVENT_RESTORE, }) |
293 | #define PMSG_RECOVER ((struct pm_message){ .event = PM_EVENT_RECOVER, }) | 267 | #define PMSG_RECOVER ((struct pm_message){ .event = PM_EVENT_RECOVER, }) |
294 | #define PMSG_USER_SUSPEND ((struct pm_messge) \ | 268 | #define PMSG_USER_SUSPEND ((struct pm_message) \ |
295 | { .event = PM_EVENT_USER_SUSPEND, }) | 269 | { .event = PM_EVENT_USER_SUSPEND, }) |
296 | #define PMSG_USER_RESUME ((struct pm_messge) \ | 270 | #define PMSG_USER_RESUME ((struct pm_message) \ |
297 | { .event = PM_EVENT_USER_RESUME, }) | 271 | { .event = PM_EVENT_USER_RESUME, }) |
298 | #define PMSG_REMOTE_RESUME ((struct pm_messge) \ | 272 | #define PMSG_REMOTE_RESUME ((struct pm_message) \ |
299 | { .event = PM_EVENT_REMOTE_RESUME, }) | 273 | { .event = PM_EVENT_REMOTE_RESUME, }) |
300 | #define PMSG_AUTO_SUSPEND ((struct pm_messge) \ | 274 | #define PMSG_AUTO_SUSPEND ((struct pm_message) \ |
301 | { .event = PM_EVENT_AUTO_SUSPEND, }) | 275 | { .event = PM_EVENT_AUTO_SUSPEND, }) |
302 | #define PMSG_AUTO_RESUME ((struct pm_messge) \ | 276 | #define PMSG_AUTO_RESUME ((struct pm_message) \ |
303 | { .event = PM_EVENT_AUTO_RESUME, }) | 277 | { .event = PM_EVENT_AUTO_RESUME, }) |
304 | 278 | ||
305 | /** | 279 | /** |
diff --git a/include/linux/poll.h b/include/linux/poll.h index badd98ab06f6..8c24ef8d9976 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
@@ -46,9 +46,9 @@ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) | |||
46 | } | 46 | } |
47 | 47 | ||
48 | struct poll_table_entry { | 48 | struct poll_table_entry { |
49 | struct file * filp; | 49 | struct file *filp; |
50 | wait_queue_t wait; | 50 | wait_queue_t wait; |
51 | wait_queue_head_t * wait_address; | 51 | wait_queue_head_t *wait_address; |
52 | }; | 52 | }; |
53 | 53 | ||
54 | /* | 54 | /* |
@@ -56,7 +56,9 @@ struct poll_table_entry { | |||
56 | */ | 56 | */ |
57 | struct poll_wqueues { | 57 | struct poll_wqueues { |
58 | poll_table pt; | 58 | poll_table pt; |
59 | struct poll_table_page * table; | 59 | struct poll_table_page *table; |
60 | struct task_struct *polling_task; | ||
61 | int triggered; | ||
60 | int error; | 62 | int error; |
61 | int inline_index; | 63 | int inline_index; |
62 | struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES]; | 64 | struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES]; |
@@ -64,6 +66,13 @@ struct poll_wqueues { | |||
64 | 66 | ||
65 | extern void poll_initwait(struct poll_wqueues *pwq); | 67 | extern void poll_initwait(struct poll_wqueues *pwq); |
66 | extern void poll_freewait(struct poll_wqueues *pwq); | 68 | extern void poll_freewait(struct poll_wqueues *pwq); |
69 | extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state, | ||
70 | ktime_t *expires, unsigned long slack); | ||
71 | |||
72 | static inline int poll_schedule(struct poll_wqueues *pwq, int state) | ||
73 | { | ||
74 | return poll_schedule_timeout(pwq, state, NULL, 0); | ||
75 | } | ||
67 | 76 | ||
68 | /* | 77 | /* |
69 | * Scaleable version of the fd_set. | 78 | * Scaleable version of the fd_set. |
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index a7c721355549..4f71bf4e628c 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h | |||
@@ -45,7 +45,11 @@ struct k_itimer { | |||
45 | int it_requeue_pending; /* waiting to requeue this timer */ | 45 | int it_requeue_pending; /* waiting to requeue this timer */ |
46 | #define REQUEUE_PENDING 1 | 46 | #define REQUEUE_PENDING 1 |
47 | int it_sigev_notify; /* notify word of sigevent struct */ | 47 | int it_sigev_notify; /* notify word of sigevent struct */ |
48 | struct task_struct *it_process; /* process to send signal to */ | 48 | struct signal_struct *it_signal; |
49 | union { | ||
50 | struct pid *it_pid; /* pid of process to send signal to */ | ||
51 | struct task_struct *it_process; /* for clock_nanosleep */ | ||
52 | }; | ||
49 | struct sigqueue *sigq; /* signal queue entry. */ | 53 | struct sigqueue *sigq; /* signal queue entry. */ |
50 | union { | 54 | union { |
51 | struct { | 55 | struct { |
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index f9348cba6dc1..8ff25e0e7f7a 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h | |||
@@ -45,6 +45,7 @@ enum { | |||
45 | POWER_SUPPLY_HEALTH_DEAD, | 45 | POWER_SUPPLY_HEALTH_DEAD, |
46 | POWER_SUPPLY_HEALTH_OVERVOLTAGE, | 46 | POWER_SUPPLY_HEALTH_OVERVOLTAGE, |
47 | POWER_SUPPLY_HEALTH_UNSPEC_FAILURE, | 47 | POWER_SUPPLY_HEALTH_UNSPEC_FAILURE, |
48 | POWER_SUPPLY_HEALTH_COLD, | ||
48 | }; | 49 | }; |
49 | 50 | ||
50 | enum { | 51 | enum { |
diff --git a/include/linux/qnx4_fs.h b/include/linux/qnx4_fs.h index 34a196ee7941..787d19ea9f46 100644 --- a/include/linux/qnx4_fs.h +++ b/include/linux/qnx4_fs.h | |||
@@ -2,14 +2,12 @@ | |||
2 | * Name : qnx4_fs.h | 2 | * Name : qnx4_fs.h |
3 | * Author : Richard Frowijn | 3 | * Author : Richard Frowijn |
4 | * Function : qnx4 global filesystem definitions | 4 | * Function : qnx4 global filesystem definitions |
5 | * Version : 1.0.2 | ||
6 | * Last modified : 2000-01-31 | ||
7 | * | ||
8 | * History : 23-03-1998 created | 5 | * History : 23-03-1998 created |
9 | */ | 6 | */ |
10 | #ifndef _LINUX_QNX4_FS_H | 7 | #ifndef _LINUX_QNX4_FS_H |
11 | #define _LINUX_QNX4_FS_H | 8 | #define _LINUX_QNX4_FS_H |
12 | 9 | ||
10 | #include <linux/types.h> | ||
13 | #include <linux/qnxtypes.h> | 11 | #include <linux/qnxtypes.h> |
14 | #include <linux/magic.h> | 12 | #include <linux/magic.h> |
15 | 13 | ||
diff --git a/include/linux/qnxtypes.h b/include/linux/qnxtypes.h index a3eb1137857b..bebbe5cc4fb8 100644 --- a/include/linux/qnxtypes.h +++ b/include/linux/qnxtypes.h | |||
@@ -2,9 +2,6 @@ | |||
2 | * Name : qnxtypes.h | 2 | * Name : qnxtypes.h |
3 | * Author : Richard Frowijn | 3 | * Author : Richard Frowijn |
4 | * Function : standard qnx types | 4 | * Function : standard qnx types |
5 | * Version : 1.0.2 | ||
6 | * Last modified : 2000-01-06 | ||
7 | * | ||
8 | * History : 22-03-1998 created | 5 | * History : 22-03-1998 created |
9 | * | 6 | * |
10 | */ | 7 | */ |
@@ -12,6 +9,8 @@ | |||
12 | #ifndef _QNX4TYPES_H | 9 | #ifndef _QNX4TYPES_H |
13 | #define _QNX4TYPES_H | 10 | #define _QNX4TYPES_H |
14 | 11 | ||
12 | #include <linux/types.h> | ||
13 | |||
15 | typedef __le16 qnx4_nxtnt_t; | 14 | typedef __le16 qnx4_nxtnt_t; |
16 | typedef __u8 qnx4_ftype_t; | 15 | typedef __u8 qnx4_ftype_t; |
17 | 16 | ||
diff --git a/include/linux/quota.h b/include/linux/quota.h index 40401b554484..d72d5d84fde5 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
@@ -36,17 +36,7 @@ | |||
36 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
37 | #include <linux/types.h> | 37 | #include <linux/types.h> |
38 | 38 | ||
39 | #define __DQUOT_VERSION__ "dquot_6.5.1" | 39 | #define __DQUOT_VERSION__ "dquot_6.5.2" |
40 | #define __DQUOT_NUM_VERSION__ 6*10000+5*100+1 | ||
41 | |||
42 | /* Size of blocks in which are counted size limits */ | ||
43 | #define QUOTABLOCK_BITS 10 | ||
44 | #define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS) | ||
45 | |||
46 | /* Conversion routines from and to quota blocks */ | ||
47 | #define qb2kb(x) ((x) << (QUOTABLOCK_BITS-10)) | ||
48 | #define kb2qb(x) ((x) >> (QUOTABLOCK_BITS-10)) | ||
49 | #define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS) | ||
50 | 40 | ||
51 | #define MAXQUOTAS 2 | 41 | #define MAXQUOTAS 2 |
52 | #define USRQUOTA 0 /* element used for user quotas */ | 42 | #define USRQUOTA 0 /* element used for user quotas */ |
@@ -80,16 +70,34 @@ | |||
80 | #define Q_GETQUOTA 0x800007 /* get user quota structure */ | 70 | #define Q_GETQUOTA 0x800007 /* get user quota structure */ |
81 | #define Q_SETQUOTA 0x800008 /* set user quota structure */ | 71 | #define Q_SETQUOTA 0x800008 /* set user quota structure */ |
82 | 72 | ||
73 | /* Quota format type IDs */ | ||
74 | #define QFMT_VFS_OLD 1 | ||
75 | #define QFMT_VFS_V0 2 | ||
76 | |||
77 | /* Size of block in which space limits are passed through the quota | ||
78 | * interface */ | ||
79 | #define QIF_DQBLKSIZE_BITS 10 | ||
80 | #define QIF_DQBLKSIZE (1 << QIF_DQBLKSIZE_BITS) | ||
81 | |||
83 | /* | 82 | /* |
84 | * Quota structure used for communication with userspace via quotactl | 83 | * Quota structure used for communication with userspace via quotactl |
85 | * Following flags are used to specify which fields are valid | 84 | * Following flags are used to specify which fields are valid |
86 | */ | 85 | */ |
87 | #define QIF_BLIMITS 1 | 86 | enum { |
88 | #define QIF_SPACE 2 | 87 | QIF_BLIMITS_B = 0, |
89 | #define QIF_ILIMITS 4 | 88 | QIF_SPACE_B, |
90 | #define QIF_INODES 8 | 89 | QIF_ILIMITS_B, |
91 | #define QIF_BTIME 16 | 90 | QIF_INODES_B, |
92 | #define QIF_ITIME 32 | 91 | QIF_BTIME_B, |
92 | QIF_ITIME_B, | ||
93 | }; | ||
94 | |||
95 | #define QIF_BLIMITS (1 << QIF_BLIMITS_B) | ||
96 | #define QIF_SPACE (1 << QIF_SPACE_B) | ||
97 | #define QIF_ILIMITS (1 << QIF_ILIMITS_B) | ||
98 | #define QIF_INODES (1 << QIF_INODES_B) | ||
99 | #define QIF_BTIME (1 << QIF_BTIME_B) | ||
100 | #define QIF_ITIME (1 << QIF_ITIME_B) | ||
93 | #define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS) | 101 | #define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS) |
94 | #define QIF_USAGE (QIF_SPACE | QIF_INODES) | 102 | #define QIF_USAGE (QIF_SPACE | QIF_INODES) |
95 | #define QIF_TIMES (QIF_BTIME | QIF_ITIME) | 103 | #define QIF_TIMES (QIF_BTIME | QIF_ITIME) |
@@ -172,7 +180,7 @@ enum { | |||
172 | #include <asm/atomic.h> | 180 | #include <asm/atomic.h> |
173 | 181 | ||
174 | typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */ | 182 | typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */ |
175 | typedef __u64 qsize_t; /* Type in which we store sizes */ | 183 | typedef long long qsize_t; /* Type in which we store sizes */ |
176 | 184 | ||
177 | extern spinlock_t dq_data_lock; | 185 | extern spinlock_t dq_data_lock; |
178 | 186 | ||
@@ -187,12 +195,12 @@ extern spinlock_t dq_data_lock; | |||
187 | * Data for one user/group kept in memory | 195 | * Data for one user/group kept in memory |
188 | */ | 196 | */ |
189 | struct mem_dqblk { | 197 | struct mem_dqblk { |
190 | __u32 dqb_bhardlimit; /* absolute limit on disk blks alloc */ | 198 | qsize_t dqb_bhardlimit; /* absolute limit on disk blks alloc */ |
191 | __u32 dqb_bsoftlimit; /* preferred limit on disk blks */ | 199 | qsize_t dqb_bsoftlimit; /* preferred limit on disk blks */ |
192 | qsize_t dqb_curspace; /* current used space */ | 200 | qsize_t dqb_curspace; /* current used space */ |
193 | __u32 dqb_ihardlimit; /* absolute limit on allocated inodes */ | 201 | qsize_t dqb_ihardlimit; /* absolute limit on allocated inodes */ |
194 | __u32 dqb_isoftlimit; /* preferred inode limit */ | 202 | qsize_t dqb_isoftlimit; /* preferred inode limit */ |
195 | __u32 dqb_curinodes; /* current # allocated inodes */ | 203 | qsize_t dqb_curinodes; /* current # allocated inodes */ |
196 | time_t dqb_btime; /* time limit for excessive disk use */ | 204 | time_t dqb_btime; /* time limit for excessive disk use */ |
197 | time_t dqb_itime; /* time limit for excessive inode use */ | 205 | time_t dqb_itime; /* time limit for excessive inode use */ |
198 | }; | 206 | }; |
@@ -212,10 +220,7 @@ struct mem_dqinfo { | |||
212 | unsigned int dqi_igrace; | 220 | unsigned int dqi_igrace; |
213 | qsize_t dqi_maxblimit; | 221 | qsize_t dqi_maxblimit; |
214 | qsize_t dqi_maxilimit; | 222 | qsize_t dqi_maxilimit; |
215 | union { | 223 | void *dqi_priv; |
216 | struct v1_mem_dqinfo v1_i; | ||
217 | struct v2_mem_dqinfo v2_i; | ||
218 | } u; | ||
219 | }; | 224 | }; |
220 | 225 | ||
221 | struct super_block; | 226 | struct super_block; |
@@ -249,6 +254,11 @@ extern struct dqstats dqstats; | |||
249 | #define DQ_FAKE_B 3 /* no limits only usage */ | 254 | #define DQ_FAKE_B 3 /* no limits only usage */ |
250 | #define DQ_READ_B 4 /* dquot was read into memory */ | 255 | #define DQ_READ_B 4 /* dquot was read into memory */ |
251 | #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ | 256 | #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ |
257 | #define DQ_LASTSET_B 6 /* Following 6 bits (see QIF_) are reserved\ | ||
258 | * for the mask of entries set via SETQUOTA\ | ||
259 | * quotactl. They are set under dq_data_lock\ | ||
260 | * and the quota format handling dquot can\ | ||
261 | * clear them when it sees fit. */ | ||
252 | 262 | ||
253 | struct dquot { | 263 | struct dquot { |
254 | struct hlist_node dq_hash; /* Hash list in memory */ | 264 | struct hlist_node dq_hash; /* Hash list in memory */ |
@@ -287,11 +297,13 @@ struct dquot_operations { | |||
287 | int (*initialize) (struct inode *, int); | 297 | int (*initialize) (struct inode *, int); |
288 | int (*drop) (struct inode *); | 298 | int (*drop) (struct inode *); |
289 | int (*alloc_space) (struct inode *, qsize_t, int); | 299 | int (*alloc_space) (struct inode *, qsize_t, int); |
290 | int (*alloc_inode) (const struct inode *, unsigned long); | 300 | int (*alloc_inode) (const struct inode *, qsize_t); |
291 | int (*free_space) (struct inode *, qsize_t); | 301 | int (*free_space) (struct inode *, qsize_t); |
292 | int (*free_inode) (const struct inode *, unsigned long); | 302 | int (*free_inode) (const struct inode *, qsize_t); |
293 | int (*transfer) (struct inode *, struct iattr *); | 303 | int (*transfer) (struct inode *, struct iattr *); |
294 | int (*write_dquot) (struct dquot *); /* Ordinary dquot write */ | 304 | int (*write_dquot) (struct dquot *); /* Ordinary dquot write */ |
305 | struct dquot *(*alloc_dquot)(struct super_block *, int); /* Allocate memory for new dquot */ | ||
306 | void (*destroy_dquot)(struct dquot *); /* Free memory for dquot */ | ||
295 | int (*acquire_dquot) (struct dquot *); /* Quota is going to be created on disk */ | 307 | int (*acquire_dquot) (struct dquot *); /* Quota is going to be created on disk */ |
296 | int (*release_dquot) (struct dquot *); /* Quota is going to be deleted from disk */ | 308 | int (*release_dquot) (struct dquot *); /* Quota is going to be deleted from disk */ |
297 | int (*mark_dirty) (struct dquot *); /* Dquot is marked dirty */ | 309 | int (*mark_dirty) (struct dquot *); /* Dquot is marked dirty */ |
@@ -320,12 +332,42 @@ struct quota_format_type { | |||
320 | struct quota_format_type *qf_next; | 332 | struct quota_format_type *qf_next; |
321 | }; | 333 | }; |
322 | 334 | ||
323 | #define DQUOT_USR_ENABLED 0x01 /* User diskquotas enabled */ | 335 | /* Quota state flags - they actually come in two flavors - for users and groups */ |
324 | #define DQUOT_GRP_ENABLED 0x02 /* Group diskquotas enabled */ | 336 | enum { |
325 | #define DQUOT_USR_SUSPENDED 0x04 /* User diskquotas are off, but | 337 | _DQUOT_USAGE_ENABLED = 0, /* Track disk usage for users */ |
338 | _DQUOT_LIMITS_ENABLED, /* Enforce quota limits for users */ | ||
339 | _DQUOT_SUSPENDED, /* User diskquotas are off, but | ||
326 | * we have necessary info in | 340 | * we have necessary info in |
327 | * memory to turn them on */ | 341 | * memory to turn them on */ |
328 | #define DQUOT_GRP_SUSPENDED 0x08 /* The same for group quotas */ | 342 | _DQUOT_STATE_FLAGS |
343 | }; | ||
344 | #define DQUOT_USAGE_ENABLED (1 << _DQUOT_USAGE_ENABLED) | ||
345 | #define DQUOT_LIMITS_ENABLED (1 << _DQUOT_LIMITS_ENABLED) | ||
346 | #define DQUOT_SUSPENDED (1 << _DQUOT_SUSPENDED) | ||
347 | #define DQUOT_STATE_FLAGS (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \ | ||
348 | DQUOT_SUSPENDED) | ||
349 | /* Other quota flags */ | ||
350 | #define DQUOT_QUOTA_SYS_FILE (1 << 6) /* Quota file is a special | ||
351 | * system file and user cannot | ||
352 | * touch it. Filesystem is | ||
353 | * responsible for setting | ||
354 | * S_NOQUOTA, S_NOATIME flags | ||
355 | */ | ||
356 | #define DQUOT_NEGATIVE_USAGE (1 << 7) /* Allow negative quota usage */ | ||
357 | |||
358 | static inline unsigned int dquot_state_flag(unsigned int flags, int type) | ||
359 | { | ||
360 | if (type == USRQUOTA) | ||
361 | return flags; | ||
362 | return flags << _DQUOT_STATE_FLAGS; | ||
363 | } | ||
364 | |||
365 | static inline unsigned int dquot_generic_flag(unsigned int flags, int type) | ||
366 | { | ||
367 | if (type == USRQUOTA) | ||
368 | return flags; | ||
369 | return flags >> _DQUOT_STATE_FLAGS; | ||
370 | } | ||
329 | 371 | ||
330 | struct quota_info { | 372 | struct quota_info { |
331 | unsigned int flags; /* Flags for diskquotas on this device */ | 373 | unsigned int flags; /* Flags for diskquotas on this device */ |
diff --git a/include/linux/quotaio_v1.h b/include/linux/quotaio_v1.h deleted file mode 100644 index 746654b5de70..000000000000 --- a/include/linux/quotaio_v1.h +++ /dev/null | |||
@@ -1,33 +0,0 @@ | |||
1 | #ifndef _LINUX_QUOTAIO_V1_H | ||
2 | #define _LINUX_QUOTAIO_V1_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | /* | ||
7 | * The following constants define the amount of time given a user | ||
8 | * before the soft limits are treated as hard limits (usually resulting | ||
9 | * in an allocation failure). The timer is started when the user crosses | ||
10 | * their soft limit, it is reset when they go below their soft limit. | ||
11 | */ | ||
12 | #define MAX_IQ_TIME 604800 /* (7*24*60*60) 1 week */ | ||
13 | #define MAX_DQ_TIME 604800 /* (7*24*60*60) 1 week */ | ||
14 | |||
15 | /* | ||
16 | * The following structure defines the format of the disk quota file | ||
17 | * (as it appears on disk) - the file is an array of these structures | ||
18 | * indexed by user or group number. | ||
19 | */ | ||
20 | struct v1_disk_dqblk { | ||
21 | __u32 dqb_bhardlimit; /* absolute limit on disk blks alloc */ | ||
22 | __u32 dqb_bsoftlimit; /* preferred limit on disk blks */ | ||
23 | __u32 dqb_curblocks; /* current block count */ | ||
24 | __u32 dqb_ihardlimit; /* absolute limit on allocated inodes */ | ||
25 | __u32 dqb_isoftlimit; /* preferred inode limit */ | ||
26 | __u32 dqb_curinodes; /* current # allocated inodes */ | ||
27 | time_t dqb_btime; /* time limit for excessive disk use */ | ||
28 | time_t dqb_itime; /* time limit for excessive inode use */ | ||
29 | }; | ||
30 | |||
31 | #define v1_dqoff(UID) ((loff_t)((UID) * sizeof (struct v1_disk_dqblk))) | ||
32 | |||
33 | #endif /* _LINUX_QUOTAIO_V1_H */ | ||
diff --git a/include/linux/quotaio_v2.h b/include/linux/quotaio_v2.h deleted file mode 100644 index 303d7cbe30d4..000000000000 --- a/include/linux/quotaio_v2.h +++ /dev/null | |||
@@ -1,79 +0,0 @@ | |||
1 | /* | ||
2 | * Definitions of structures for vfsv0 quota format | ||
3 | */ | ||
4 | |||
5 | #ifndef _LINUX_QUOTAIO_V2_H | ||
6 | #define _LINUX_QUOTAIO_V2_H | ||
7 | |||
8 | #include <linux/types.h> | ||
9 | #include <linux/quota.h> | ||
10 | |||
11 | /* | ||
12 | * Definitions of magics and versions of current quota files | ||
13 | */ | ||
14 | #define V2_INITQMAGICS {\ | ||
15 | 0xd9c01f11, /* USRQUOTA */\ | ||
16 | 0xd9c01927 /* GRPQUOTA */\ | ||
17 | } | ||
18 | |||
19 | #define V2_INITQVERSIONS {\ | ||
20 | 0, /* USRQUOTA */\ | ||
21 | 0 /* GRPQUOTA */\ | ||
22 | } | ||
23 | |||
24 | /* | ||
25 | * The following structure defines the format of the disk quota file | ||
26 | * (as it appears on disk) - the file is a radix tree whose leaves point | ||
27 | * to blocks of these structures. | ||
28 | */ | ||
29 | struct v2_disk_dqblk { | ||
30 | __le32 dqb_id; /* id this quota applies to */ | ||
31 | __le32 dqb_ihardlimit; /* absolute limit on allocated inodes */ | ||
32 | __le32 dqb_isoftlimit; /* preferred inode limit */ | ||
33 | __le32 dqb_curinodes; /* current # allocated inodes */ | ||
34 | __le32 dqb_bhardlimit; /* absolute limit on disk space (in QUOTABLOCK_SIZE) */ | ||
35 | __le32 dqb_bsoftlimit; /* preferred limit on disk space (in QUOTABLOCK_SIZE) */ | ||
36 | __le64 dqb_curspace; /* current space occupied (in bytes) */ | ||
37 | __le64 dqb_btime; /* time limit for excessive disk use */ | ||
38 | __le64 dqb_itime; /* time limit for excessive inode use */ | ||
39 | }; | ||
40 | |||
41 | /* | ||
42 | * Here are header structures as written on disk and their in-memory copies | ||
43 | */ | ||
44 | /* First generic header */ | ||
45 | struct v2_disk_dqheader { | ||
46 | __le32 dqh_magic; /* Magic number identifying file */ | ||
47 | __le32 dqh_version; /* File version */ | ||
48 | }; | ||
49 | |||
50 | /* Header with type and version specific information */ | ||
51 | struct v2_disk_dqinfo { | ||
52 | __le32 dqi_bgrace; /* Time before block soft limit becomes hard limit */ | ||
53 | __le32 dqi_igrace; /* Time before inode soft limit becomes hard limit */ | ||
54 | __le32 dqi_flags; /* Flags for quotafile (DQF_*) */ | ||
55 | __le32 dqi_blocks; /* Number of blocks in file */ | ||
56 | __le32 dqi_free_blk; /* Number of first free block in the list */ | ||
57 | __le32 dqi_free_entry; /* Number of block with at least one free entry */ | ||
58 | }; | ||
59 | |||
60 | /* | ||
61 | * Structure of header of block with quota structures. It is padded to 16 bytes so | ||
62 | * there will be space for exactly 21 quota-entries in a block | ||
63 | */ | ||
64 | struct v2_disk_dqdbheader { | ||
65 | __le32 dqdh_next_free; /* Number of next block with free entry */ | ||
66 | __le32 dqdh_prev_free; /* Number of previous block with free entry */ | ||
67 | __le16 dqdh_entries; /* Number of valid entries in block */ | ||
68 | __le16 dqdh_pad1; | ||
69 | __le32 dqdh_pad2; | ||
70 | }; | ||
71 | |||
72 | #define V2_DQINFOOFF sizeof(struct v2_disk_dqheader) /* Offset of info header in file */ | ||
73 | #define V2_DQBLKSIZE_BITS 10 | ||
74 | #define V2_DQBLKSIZE (1 << V2_DQBLKSIZE_BITS) /* Size of block with quota structures */ | ||
75 | #define V2_DQTREEOFF 1 /* Offset of tree in file in blocks */ | ||
76 | #define V2_DQTREEDEPTH 4 /* Depth of quota tree */ | ||
77 | #define V2_DQSTRINBLK ((V2_DQBLKSIZE - sizeof(struct v2_disk_dqdbheader)) / sizeof(struct v2_disk_dqblk)) /* Number of entries in one blocks */ | ||
78 | |||
79 | #endif /* _LINUX_QUOTAIO_V2_H */ | ||
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index a558a4c1d35a..21b781a3350f 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
@@ -24,12 +24,21 @@ void sync_dquots(struct super_block *sb, int type); | |||
24 | 24 | ||
25 | int dquot_initialize(struct inode *inode, int type); | 25 | int dquot_initialize(struct inode *inode, int type); |
26 | int dquot_drop(struct inode *inode); | 26 | int dquot_drop(struct inode *inode); |
27 | int dquot_drop_locked(struct inode *inode); | ||
28 | struct dquot *dqget(struct super_block *sb, unsigned int id, int type); | ||
29 | void dqput(struct dquot *dquot); | ||
30 | int dquot_is_cached(struct super_block *sb, unsigned int id, int type); | ||
31 | int dquot_scan_active(struct super_block *sb, | ||
32 | int (*fn)(struct dquot *dquot, unsigned long priv), | ||
33 | unsigned long priv); | ||
34 | struct dquot *dquot_alloc(struct super_block *sb, int type); | ||
35 | void dquot_destroy(struct dquot *dquot); | ||
27 | 36 | ||
28 | int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc); | 37 | int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc); |
29 | int dquot_alloc_inode(const struct inode *inode, unsigned long number); | 38 | int dquot_alloc_inode(const struct inode *inode, qsize_t number); |
30 | 39 | ||
31 | int dquot_free_space(struct inode *inode, qsize_t number); | 40 | int dquot_free_space(struct inode *inode, qsize_t number); |
32 | int dquot_free_inode(const struct inode *inode, unsigned long number); | 41 | int dquot_free_inode(const struct inode *inode, qsize_t number); |
33 | 42 | ||
34 | int dquot_transfer(struct inode *inode, struct iattr *iattr); | 43 | int dquot_transfer(struct inode *inode, struct iattr *iattr); |
35 | int dquot_commit(struct dquot *dquot); | 44 | int dquot_commit(struct dquot *dquot); |
@@ -40,11 +49,14 @@ int dquot_mark_dquot_dirty(struct dquot *dquot); | |||
40 | 49 | ||
41 | int vfs_quota_on(struct super_block *sb, int type, int format_id, | 50 | int vfs_quota_on(struct super_block *sb, int type, int format_id, |
42 | char *path, int remount); | 51 | char *path, int remount); |
52 | int vfs_quota_enable(struct inode *inode, int type, int format_id, | ||
53 | unsigned int flags); | ||
43 | int vfs_quota_on_path(struct super_block *sb, int type, int format_id, | 54 | int vfs_quota_on_path(struct super_block *sb, int type, int format_id, |
44 | struct path *path); | 55 | struct path *path); |
45 | int vfs_quota_on_mount(struct super_block *sb, char *qf_name, | 56 | int vfs_quota_on_mount(struct super_block *sb, char *qf_name, |
46 | int format_id, int type); | 57 | int format_id, int type); |
47 | int vfs_quota_off(struct super_block *sb, int type, int remount); | 58 | int vfs_quota_off(struct super_block *sb, int type, int remount); |
59 | int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags); | ||
48 | int vfs_quota_sync(struct super_block *sb, int type); | 60 | int vfs_quota_sync(struct super_block *sb, int type); |
49 | int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 61 | int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
50 | int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | 62 | int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
@@ -64,24 +76,22 @@ static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) | |||
64 | * Functions for checking status of quota | 76 | * Functions for checking status of quota |
65 | */ | 77 | */ |
66 | 78 | ||
67 | static inline int sb_has_quota_enabled(struct super_block *sb, int type) | 79 | static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) |
68 | { | 80 | { |
69 | if (type == USRQUOTA) | 81 | return sb_dqopt(sb)->flags & |
70 | return sb_dqopt(sb)->flags & DQUOT_USR_ENABLED; | 82 | dquot_state_flag(DQUOT_USAGE_ENABLED, type); |
71 | return sb_dqopt(sb)->flags & DQUOT_GRP_ENABLED; | ||
72 | } | 83 | } |
73 | 84 | ||
74 | static inline int sb_any_quota_enabled(struct super_block *sb) | 85 | static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) |
75 | { | 86 | { |
76 | return sb_has_quota_enabled(sb, USRQUOTA) || | 87 | return sb_dqopt(sb)->flags & |
77 | sb_has_quota_enabled(sb, GRPQUOTA); | 88 | dquot_state_flag(DQUOT_LIMITS_ENABLED, type); |
78 | } | 89 | } |
79 | 90 | ||
80 | static inline int sb_has_quota_suspended(struct super_block *sb, int type) | 91 | static inline int sb_has_quota_suspended(struct super_block *sb, int type) |
81 | { | 92 | { |
82 | if (type == USRQUOTA) | 93 | return sb_dqopt(sb)->flags & |
83 | return sb_dqopt(sb)->flags & DQUOT_USR_SUSPENDED; | 94 | dquot_state_flag(DQUOT_SUSPENDED, type); |
84 | return sb_dqopt(sb)->flags & DQUOT_GRP_SUSPENDED; | ||
85 | } | 95 | } |
86 | 96 | ||
87 | static inline int sb_any_quota_suspended(struct super_block *sb) | 97 | static inline int sb_any_quota_suspended(struct super_block *sb) |
@@ -90,6 +100,31 @@ static inline int sb_any_quota_suspended(struct super_block *sb) | |||
90 | sb_has_quota_suspended(sb, GRPQUOTA); | 100 | sb_has_quota_suspended(sb, GRPQUOTA); |
91 | } | 101 | } |
92 | 102 | ||
103 | /* Does kernel know about any quota information for given sb + type? */ | ||
104 | static inline int sb_has_quota_loaded(struct super_block *sb, int type) | ||
105 | { | ||
106 | /* Currently if anything is on, then quota usage is on as well */ | ||
107 | return sb_has_quota_usage_enabled(sb, type); | ||
108 | } | ||
109 | |||
110 | static inline int sb_any_quota_loaded(struct super_block *sb) | ||
111 | { | ||
112 | return sb_has_quota_loaded(sb, USRQUOTA) || | ||
113 | sb_has_quota_loaded(sb, GRPQUOTA); | ||
114 | } | ||
115 | |||
116 | static inline int sb_has_quota_active(struct super_block *sb, int type) | ||
117 | { | ||
118 | return sb_has_quota_loaded(sb, type) && | ||
119 | !sb_has_quota_suspended(sb, type); | ||
120 | } | ||
121 | |||
122 | static inline int sb_any_quota_active(struct super_block *sb) | ||
123 | { | ||
124 | return sb_has_quota_active(sb, USRQUOTA) || | ||
125 | sb_has_quota_active(sb, GRPQUOTA); | ||
126 | } | ||
127 | |||
93 | /* | 128 | /* |
94 | * Operations supported for diskquotas. | 129 | * Operations supported for diskquotas. |
95 | */ | 130 | */ |
@@ -104,7 +139,7 @@ extern struct quotactl_ops vfs_quotactl_ops; | |||
104 | static inline void vfs_dq_init(struct inode *inode) | 139 | static inline void vfs_dq_init(struct inode *inode) |
105 | { | 140 | { |
106 | BUG_ON(!inode->i_sb); | 141 | BUG_ON(!inode->i_sb); |
107 | if (sb_any_quota_enabled(inode->i_sb) && !IS_NOQUOTA(inode)) | 142 | if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) |
108 | inode->i_sb->dq_op->initialize(inode, -1); | 143 | inode->i_sb->dq_op->initialize(inode, -1); |
109 | } | 144 | } |
110 | 145 | ||
@@ -112,7 +147,7 @@ static inline void vfs_dq_init(struct inode *inode) | |||
112 | * a transaction (deadlocks possible otherwise) */ | 147 | * a transaction (deadlocks possible otherwise) */ |
113 | static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) | 148 | static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr) |
114 | { | 149 | { |
115 | if (sb_any_quota_enabled(inode->i_sb)) { | 150 | if (sb_any_quota_active(inode->i_sb)) { |
116 | /* Used space is updated in alloc_space() */ | 151 | /* Used space is updated in alloc_space() */ |
117 | if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA) | 152 | if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA) |
118 | return 1; | 153 | return 1; |
@@ -132,7 +167,7 @@ static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr) | |||
132 | 167 | ||
133 | static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) | 168 | static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr) |
134 | { | 169 | { |
135 | if (sb_any_quota_enabled(inode->i_sb)) { | 170 | if (sb_any_quota_active(inode->i_sb)) { |
136 | /* Used space is updated in alloc_space() */ | 171 | /* Used space is updated in alloc_space() */ |
137 | if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA) | 172 | if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA) |
138 | return 1; | 173 | return 1; |
@@ -152,7 +187,7 @@ static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr) | |||
152 | 187 | ||
153 | static inline int vfs_dq_alloc_inode(struct inode *inode) | 188 | static inline int vfs_dq_alloc_inode(struct inode *inode) |
154 | { | 189 | { |
155 | if (sb_any_quota_enabled(inode->i_sb)) { | 190 | if (sb_any_quota_active(inode->i_sb)) { |
156 | vfs_dq_init(inode); | 191 | vfs_dq_init(inode); |
157 | if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) | 192 | if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) |
158 | return 1; | 193 | return 1; |
@@ -162,7 +197,7 @@ static inline int vfs_dq_alloc_inode(struct inode *inode) | |||
162 | 197 | ||
163 | static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) | 198 | static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr) |
164 | { | 199 | { |
165 | if (sb_any_quota_enabled(inode->i_sb)) | 200 | if (sb_any_quota_active(inode->i_sb)) |
166 | inode->i_sb->dq_op->free_space(inode, nr); | 201 | inode->i_sb->dq_op->free_space(inode, nr); |
167 | else | 202 | else |
168 | inode_sub_bytes(inode, nr); | 203 | inode_sub_bytes(inode, nr); |
@@ -176,7 +211,7 @@ static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr) | |||
176 | 211 | ||
177 | static inline void vfs_dq_free_inode(struct inode *inode) | 212 | static inline void vfs_dq_free_inode(struct inode *inode) |
178 | { | 213 | { |
179 | if (sb_any_quota_enabled(inode->i_sb)) | 214 | if (sb_any_quota_active(inode->i_sb)) |
180 | inode->i_sb->dq_op->free_inode(inode, 1); | 215 | inode->i_sb->dq_op->free_inode(inode, 1); |
181 | } | 216 | } |
182 | 217 | ||
@@ -197,12 +232,12 @@ static inline int vfs_dq_off(struct super_block *sb, int remount) | |||
197 | 232 | ||
198 | #else | 233 | #else |
199 | 234 | ||
200 | static inline int sb_has_quota_enabled(struct super_block *sb, int type) | 235 | static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) |
201 | { | 236 | { |
202 | return 0; | 237 | return 0; |
203 | } | 238 | } |
204 | 239 | ||
205 | static inline int sb_any_quota_enabled(struct super_block *sb) | 240 | static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) |
206 | { | 241 | { |
207 | return 0; | 242 | return 0; |
208 | } | 243 | } |
@@ -217,6 +252,27 @@ static inline int sb_any_quota_suspended(struct super_block *sb) | |||
217 | return 0; | 252 | return 0; |
218 | } | 253 | } |
219 | 254 | ||
255 | /* Does kernel know about any quota information for given sb + type? */ | ||
256 | static inline int sb_has_quota_loaded(struct super_block *sb, int type) | ||
257 | { | ||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | static inline int sb_any_quota_loaded(struct super_block *sb) | ||
262 | { | ||
263 | return 0; | ||
264 | } | ||
265 | |||
266 | static inline int sb_has_quota_active(struct super_block *sb, int type) | ||
267 | { | ||
268 | return 0; | ||
269 | } | ||
270 | |||
271 | static inline int sb_any_quota_active(struct super_block *sb) | ||
272 | { | ||
273 | return 0; | ||
274 | } | ||
275 | |||
220 | /* | 276 | /* |
221 | * NO-OP when quota not configured. | 277 | * NO-OP when quota not configured. |
222 | */ | 278 | */ |
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index a916c6660dfa..355f6e80db0d 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
@@ -136,7 +136,7 @@ do { \ | |||
136 | */ | 136 | */ |
137 | static inline void *radix_tree_deref_slot(void **pslot) | 137 | static inline void *radix_tree_deref_slot(void **pslot) |
138 | { | 138 | { |
139 | void *ret = *pslot; | 139 | void *ret = rcu_dereference(*pslot); |
140 | if (unlikely(radix_tree_is_indirect_ptr(ret))) | 140 | if (unlikely(radix_tree_is_indirect_ptr(ret))) |
141 | ret = RADIX_TREE_RETRY; | 141 | ret = RADIX_TREE_RETRY; |
142 | return ret; | 142 | return ret; |
diff --git a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h index 8fc909ef6787..9743e4dbc918 100644 --- a/include/linux/raid/md_k.h +++ b/include/linux/raid/md_k.h | |||
@@ -137,6 +137,9 @@ struct mddev_s | |||
137 | struct gendisk *gendisk; | 137 | struct gendisk *gendisk; |
138 | 138 | ||
139 | struct kobject kobj; | 139 | struct kobject kobj; |
140 | int hold_active; | ||
141 | #define UNTIL_IOCTL 1 | ||
142 | #define UNTIL_STOP 2 | ||
140 | 143 | ||
141 | /* Superblock information */ | 144 | /* Superblock information */ |
142 | int major_version, | 145 | int major_version, |
@@ -215,6 +218,9 @@ struct mddev_s | |||
215 | #define MD_RECOVERY_FROZEN 9 | 218 | #define MD_RECOVERY_FROZEN 9 |
216 | 219 | ||
217 | unsigned long recovery; | 220 | unsigned long recovery; |
221 | int recovery_disabled; /* if we detect that recovery | ||
222 | * will always fail, set this | ||
223 | * so we don't loop trying */ | ||
218 | 224 | ||
219 | int in_sync; /* know to not need resync */ | 225 | int in_sync; /* know to not need resync */ |
220 | struct mutex reconfig_mutex; | 226 | struct mutex reconfig_mutex; |
@@ -244,6 +250,9 @@ struct mddev_s | |||
244 | struct sysfs_dirent *sysfs_state; /* handle for 'array_state' | 250 | struct sysfs_dirent *sysfs_state; /* handle for 'array_state' |
245 | * file in sysfs. | 251 | * file in sysfs. |
246 | */ | 252 | */ |
253 | struct sysfs_dirent *sysfs_action; /* handle for 'sync_action' */ | ||
254 | |||
255 | struct work_struct del_work; /* used for delayed sysfs removal */ | ||
247 | 256 | ||
248 | spinlock_t write_lock; | 257 | spinlock_t write_lock; |
249 | wait_queue_head_t sb_wait; /* for waiting on superblock updates */ | 258 | wait_queue_head_t sb_wait; /* for waiting on superblock updates */ |
@@ -334,17 +343,14 @@ static inline char * mdname (mddev_t * mddev) | |||
334 | * iterates through some rdev ringlist. It's safe to remove the | 343 | * iterates through some rdev ringlist. It's safe to remove the |
335 | * current 'rdev'. Dont touch 'tmp' though. | 344 | * current 'rdev'. Dont touch 'tmp' though. |
336 | */ | 345 | */ |
337 | #define rdev_for_each_list(rdev, tmp, list) \ | 346 | #define rdev_for_each_list(rdev, tmp, head) \ |
338 | \ | 347 | list_for_each_entry_safe(rdev, tmp, head, same_set) |
339 | for ((tmp) = (list).next; \ | 348 | |
340 | (rdev) = (list_entry((tmp), mdk_rdev_t, same_set)), \ | ||
341 | (tmp) = (tmp)->next, (tmp)->prev != &(list) \ | ||
342 | ; ) | ||
343 | /* | 349 | /* |
344 | * iterates through the 'same array disks' ringlist | 350 | * iterates through the 'same array disks' ringlist |
345 | */ | 351 | */ |
346 | #define rdev_for_each(rdev, tmp, mddev) \ | 352 | #define rdev_for_each(rdev, tmp, mddev) \ |
347 | rdev_for_each_list(rdev, tmp, (mddev)->disks) | 353 | list_for_each_entry_safe(rdev, tmp, &((mddev)->disks), same_set) |
348 | 354 | ||
349 | #define rdev_for_each_rcu(rdev, mddev) \ | 355 | #define rdev_for_each_rcu(rdev, mddev) \ |
350 | list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set) | 356 | list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set) |
diff --git a/include/linux/raid/md_p.h b/include/linux/raid/md_p.h index 8b4de4a41ff1..9491026afe66 100644 --- a/include/linux/raid/md_p.h +++ b/include/linux/raid/md_p.h | |||
@@ -194,6 +194,8 @@ static inline __u64 md_event(mdp_super_t *sb) { | |||
194 | return (ev<<32)| sb->events_lo; | 194 | return (ev<<32)| sb->events_lo; |
195 | } | 195 | } |
196 | 196 | ||
197 | #define MD_SUPERBLOCK_1_TIME_SEC_MASK ((1ULL<<40) - 1) | ||
198 | |||
197 | /* | 199 | /* |
198 | * The version-1 superblock : | 200 | * The version-1 superblock : |
199 | * All numeric fields are little-endian. | 201 | * All numeric fields are little-endian. |
diff --git a/include/linux/raid/raid0.h b/include/linux/raid/raid0.h index 1b2dda035f8e..fd42aa87c391 100644 --- a/include/linux/raid/raid0.h +++ b/include/linux/raid/raid0.h | |||
@@ -5,9 +5,9 @@ | |||
5 | 5 | ||
6 | struct strip_zone | 6 | struct strip_zone |
7 | { | 7 | { |
8 | sector_t zone_offset; /* Zone offset in md_dev */ | 8 | sector_t zone_start; /* Zone offset in md_dev (in sectors) */ |
9 | sector_t dev_offset; /* Zone offset in real dev */ | 9 | sector_t dev_start; /* Zone offset in real dev (in sectors) */ |
10 | sector_t size; /* Zone size */ | 10 | sector_t sectors; /* Zone size in sectors */ |
11 | int nb_dev; /* # of devices attached to the zone */ | 11 | int nb_dev; /* # of devices attached to the zone */ |
12 | mdk_rdev_t **dev; /* Devices attached to the zone */ | 12 | mdk_rdev_t **dev; /* Devices attached to the zone */ |
13 | }; | 13 | }; |
@@ -19,8 +19,8 @@ struct raid0_private_data | |||
19 | mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */ | 19 | mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */ |
20 | int nr_strip_zones; | 20 | int nr_strip_zones; |
21 | 21 | ||
22 | sector_t hash_spacing; | 22 | sector_t spacing; |
23 | int preshift; /* shift this before divide by hash_spacing */ | 23 | int sector_shift; /* shift this before divide by spacing */ |
24 | }; | 24 | }; |
25 | 25 | ||
26 | typedef struct raid0_private_data raid0_conf_t; | 26 | typedef struct raid0_private_data raid0_conf_t; |
diff --git a/include/linux/random.h b/include/linux/random.h index 36f125c0c603..407ea3646f8f 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #define _LINUX_RANDOM_H | 8 | #define _LINUX_RANDOM_H |
9 | 9 | ||
10 | #include <linux/ioctl.h> | 10 | #include <linux/ioctl.h> |
11 | #include <linux/irqnr.h> | ||
11 | 12 | ||
12 | /* ioctl()'s for the random number generator */ | 13 | /* ioctl()'s for the random number generator */ |
13 | 14 | ||
diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h index 344bc3495ddb..9c295411d01f 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h | |||
@@ -140,10 +140,10 @@ extern void rb_insert_color(struct rb_node *, struct rb_root *); | |||
140 | extern void rb_erase(struct rb_node *, struct rb_root *); | 140 | extern void rb_erase(struct rb_node *, struct rb_root *); |
141 | 141 | ||
142 | /* Find logical next and previous nodes in a tree */ | 142 | /* Find logical next and previous nodes in a tree */ |
143 | extern struct rb_node *rb_next(struct rb_node *); | 143 | extern struct rb_node *rb_next(const struct rb_node *); |
144 | extern struct rb_node *rb_prev(struct rb_node *); | 144 | extern struct rb_node *rb_prev(const struct rb_node *); |
145 | extern struct rb_node *rb_first(struct rb_root *); | 145 | extern struct rb_node *rb_first(const struct rb_root *); |
146 | extern struct rb_node *rb_last(struct rb_root *); | 146 | extern struct rb_node *rb_last(const struct rb_root *); |
147 | 147 | ||
148 | /* Fast replacement of a single node without remove/rebalance/add/rebalance */ | 148 | /* Fast replacement of a single node without remove/rebalance/add/rebalance */ |
149 | extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, | 149 | extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, |
diff --git a/include/linux/rcuclassic.h b/include/linux/rcuclassic.h index 5f89b62e6983..f3f697df1d71 100644 --- a/include/linux/rcuclassic.h +++ b/include/linux/rcuclassic.h | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <linux/seqlock.h> | 41 | #include <linux/seqlock.h> |
42 | 42 | ||
43 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 43 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
44 | #define RCU_SECONDS_TILL_STALL_CHECK ( 3 * HZ) /* for rcp->jiffies_stall */ | 44 | #define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ) /* for rcp->jiffies_stall */ |
45 | #define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ) /* for rcp->jiffies_stall */ | 45 | #define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ) /* for rcp->jiffies_stall */ |
46 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | 46 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ |
47 | 47 | ||
@@ -59,8 +59,8 @@ struct rcu_ctrlblk { | |||
59 | int signaled; | 59 | int signaled; |
60 | 60 | ||
61 | spinlock_t lock ____cacheline_internodealigned_in_smp; | 61 | spinlock_t lock ____cacheline_internodealigned_in_smp; |
62 | cpumask_t cpumask; /* CPUs that need to switch in order */ | 62 | DECLARE_BITMAP(cpumask, NR_CPUS); /* CPUs that need to switch for */ |
63 | /* for current batch to proceed. */ | 63 | /* current batch to proceed. */ |
64 | } ____cacheline_internodealigned_in_smp; | 64 | } ____cacheline_internodealigned_in_smp; |
65 | 65 | ||
66 | /* Is batch a before batch b ? */ | 66 | /* Is batch a before batch b ? */ |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 895dc9c1088c..921340a7b71c 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -52,11 +52,15 @@ struct rcu_head { | |||
52 | void (*func)(struct rcu_head *head); | 52 | void (*func)(struct rcu_head *head); |
53 | }; | 53 | }; |
54 | 54 | ||
55 | #ifdef CONFIG_CLASSIC_RCU | 55 | #if defined(CONFIG_CLASSIC_RCU) |
56 | #include <linux/rcuclassic.h> | 56 | #include <linux/rcuclassic.h> |
57 | #else /* #ifdef CONFIG_CLASSIC_RCU */ | 57 | #elif defined(CONFIG_TREE_RCU) |
58 | #include <linux/rcutree.h> | ||
59 | #elif defined(CONFIG_PREEMPT_RCU) | ||
58 | #include <linux/rcupreempt.h> | 60 | #include <linux/rcupreempt.h> |
59 | #endif /* #else #ifdef CONFIG_CLASSIC_RCU */ | 61 | #else |
62 | #error "Unknown RCU implementation specified to kernel configuration" | ||
63 | #endif /* #else #if defined(CONFIG_CLASSIC_RCU) */ | ||
60 | 64 | ||
61 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } | 65 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } |
62 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT | 66 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT |
@@ -200,18 +204,6 @@ struct rcu_synchronize { | |||
200 | 204 | ||
201 | extern void wakeme_after_rcu(struct rcu_head *head); | 205 | extern void wakeme_after_rcu(struct rcu_head *head); |
202 | 206 | ||
203 | #define synchronize_rcu_xxx(name, func) \ | ||
204 | void name(void) \ | ||
205 | { \ | ||
206 | struct rcu_synchronize rcu; \ | ||
207 | \ | ||
208 | init_completion(&rcu.completion); \ | ||
209 | /* Will wake me after RCU finished. */ \ | ||
210 | func(&rcu.head, wakeme_after_rcu); \ | ||
211 | /* Wait for it. */ \ | ||
212 | wait_for_completion(&rcu.completion); \ | ||
213 | } | ||
214 | |||
215 | /** | 207 | /** |
216 | * synchronize_sched - block until all CPUs have exited any non-preemptive | 208 | * synchronize_sched - block until all CPUs have exited any non-preemptive |
217 | * kernel code sequences. | 209 | * kernel code sequences. |
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h new file mode 100644 index 000000000000..d4368b7975c3 --- /dev/null +++ b/include/linux/rcutree.h | |||
@@ -0,0 +1,329 @@ | |||
1 | /* | ||
2 | * Read-Copy Update mechanism for mutual exclusion (tree-based version) | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | * | ||
18 | * Copyright IBM Corporation, 2008 | ||
19 | * | ||
20 | * Author: Dipankar Sarma <dipankar@in.ibm.com> | ||
21 | * Paul E. McKenney <paulmck@linux.vnet.ibm.com> Hierarchical algorithm | ||
22 | * | ||
23 | * Based on the original work by Paul McKenney <paulmck@us.ibm.com> | ||
24 | * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. | ||
25 | * | ||
26 | * For detailed explanation of Read-Copy Update mechanism see - | ||
27 | * Documentation/RCU | ||
28 | */ | ||
29 | |||
30 | #ifndef __LINUX_RCUTREE_H | ||
31 | #define __LINUX_RCUTREE_H | ||
32 | |||
33 | #include <linux/cache.h> | ||
34 | #include <linux/spinlock.h> | ||
35 | #include <linux/threads.h> | ||
36 | #include <linux/percpu.h> | ||
37 | #include <linux/cpumask.h> | ||
38 | #include <linux/seqlock.h> | ||
39 | |||
40 | /* | ||
41 | * Define shape of hierarchy based on NR_CPUS and CONFIG_RCU_FANOUT. | ||
42 | * In theory, it should be possible to add more levels straightforwardly. | ||
43 | * In practice, this has not been tested, so there is probably some | ||
44 | * bug somewhere. | ||
45 | */ | ||
46 | #define MAX_RCU_LVLS 3 | ||
47 | #define RCU_FANOUT (CONFIG_RCU_FANOUT) | ||
48 | #define RCU_FANOUT_SQ (RCU_FANOUT * RCU_FANOUT) | ||
49 | #define RCU_FANOUT_CUBE (RCU_FANOUT_SQ * RCU_FANOUT) | ||
50 | |||
51 | #if NR_CPUS <= RCU_FANOUT | ||
52 | # define NUM_RCU_LVLS 1 | ||
53 | # define NUM_RCU_LVL_0 1 | ||
54 | # define NUM_RCU_LVL_1 (NR_CPUS) | ||
55 | # define NUM_RCU_LVL_2 0 | ||
56 | # define NUM_RCU_LVL_3 0 | ||
57 | #elif NR_CPUS <= RCU_FANOUT_SQ | ||
58 | # define NUM_RCU_LVLS 2 | ||
59 | # define NUM_RCU_LVL_0 1 | ||
60 | # define NUM_RCU_LVL_1 (((NR_CPUS) + RCU_FANOUT - 1) / RCU_FANOUT) | ||
61 | # define NUM_RCU_LVL_2 (NR_CPUS) | ||
62 | # define NUM_RCU_LVL_3 0 | ||
63 | #elif NR_CPUS <= RCU_FANOUT_CUBE | ||
64 | # define NUM_RCU_LVLS 3 | ||
65 | # define NUM_RCU_LVL_0 1 | ||
66 | # define NUM_RCU_LVL_1 (((NR_CPUS) + RCU_FANOUT_SQ - 1) / RCU_FANOUT_SQ) | ||
67 | # define NUM_RCU_LVL_2 (((NR_CPUS) + (RCU_FANOUT) - 1) / (RCU_FANOUT)) | ||
68 | # define NUM_RCU_LVL_3 NR_CPUS | ||
69 | #else | ||
70 | # error "CONFIG_RCU_FANOUT insufficient for NR_CPUS" | ||
71 | #endif /* #if (NR_CPUS) <= RCU_FANOUT */ | ||
72 | |||
73 | #define RCU_SUM (NUM_RCU_LVL_0 + NUM_RCU_LVL_1 + NUM_RCU_LVL_2 + NUM_RCU_LVL_3) | ||
74 | #define NUM_RCU_NODES (RCU_SUM - NR_CPUS) | ||
75 | |||
76 | /* | ||
77 | * Dynticks per-CPU state. | ||
78 | */ | ||
79 | struct rcu_dynticks { | ||
80 | int dynticks_nesting; /* Track nesting level, sort of. */ | ||
81 | int dynticks; /* Even value for dynticks-idle, else odd. */ | ||
82 | int dynticks_nmi; /* Even value for either dynticks-idle or */ | ||
83 | /* not in nmi handler, else odd. So this */ | ||
84 | /* remains even for nmi from irq handler. */ | ||
85 | }; | ||
86 | |||
87 | /* | ||
88 | * Definition for node within the RCU grace-period-detection hierarchy. | ||
89 | */ | ||
90 | struct rcu_node { | ||
91 | spinlock_t lock; | ||
92 | unsigned long qsmask; /* CPUs or groups that need to switch in */ | ||
93 | /* order for current grace period to proceed.*/ | ||
94 | unsigned long qsmaskinit; | ||
95 | /* Per-GP initialization for qsmask. */ | ||
96 | unsigned long grpmask; /* Mask to apply to parent qsmask. */ | ||
97 | int grplo; /* lowest-numbered CPU or group here. */ | ||
98 | int grphi; /* highest-numbered CPU or group here. */ | ||
99 | u8 grpnum; /* CPU/group number for next level up. */ | ||
100 | u8 level; /* root is at level 0. */ | ||
101 | struct rcu_node *parent; | ||
102 | } ____cacheline_internodealigned_in_smp; | ||
103 | |||
104 | /* Index values for nxttail array in struct rcu_data. */ | ||
105 | #define RCU_DONE_TAIL 0 /* Also RCU_WAIT head. */ | ||
106 | #define RCU_WAIT_TAIL 1 /* Also RCU_NEXT_READY head. */ | ||
107 | #define RCU_NEXT_READY_TAIL 2 /* Also RCU_NEXT head. */ | ||
108 | #define RCU_NEXT_TAIL 3 | ||
109 | #define RCU_NEXT_SIZE 4 | ||
110 | |||
111 | /* Per-CPU data for read-copy update. */ | ||
112 | struct rcu_data { | ||
113 | /* 1) quiescent-state and grace-period handling : */ | ||
114 | long completed; /* Track rsp->completed gp number */ | ||
115 | /* in order to detect GP end. */ | ||
116 | long gpnum; /* Highest gp number that this CPU */ | ||
117 | /* is aware of having started. */ | ||
118 | long passed_quiesc_completed; | ||
119 | /* Value of completed at time of qs. */ | ||
120 | bool passed_quiesc; /* User-mode/idle loop etc. */ | ||
121 | bool qs_pending; /* Core waits for quiesc state. */ | ||
122 | bool beenonline; /* CPU online at least once. */ | ||
123 | struct rcu_node *mynode; /* This CPU's leaf of hierarchy */ | ||
124 | unsigned long grpmask; /* Mask to apply to leaf qsmask. */ | ||
125 | |||
126 | /* 2) batch handling */ | ||
127 | /* | ||
128 | * If nxtlist is not NULL, it is partitioned as follows. | ||
129 | * Any of the partitions might be empty, in which case the | ||
130 | * pointer to that partition will be equal to the pointer for | ||
131 | * the following partition. When the list is empty, all of | ||
132 | * the nxttail elements point to nxtlist, which is NULL. | ||
133 | * | ||
134 | * [*nxttail[RCU_NEXT_READY_TAIL], NULL = *nxttail[RCU_NEXT_TAIL]): | ||
135 | * Entries that might have arrived after current GP ended | ||
136 | * [*nxttail[RCU_WAIT_TAIL], *nxttail[RCU_NEXT_READY_TAIL]): | ||
137 | * Entries known to have arrived before current GP ended | ||
138 | * [*nxttail[RCU_DONE_TAIL], *nxttail[RCU_WAIT_TAIL]): | ||
139 | * Entries that batch # <= ->completed - 1: waiting for current GP | ||
140 | * [nxtlist, *nxttail[RCU_DONE_TAIL]): | ||
141 | * Entries that batch # <= ->completed | ||
142 | * The grace period for these entries has completed, and | ||
143 | * the other grace-period-completed entries may be moved | ||
144 | * here temporarily in rcu_process_callbacks(). | ||
145 | */ | ||
146 | struct rcu_head *nxtlist; | ||
147 | struct rcu_head **nxttail[RCU_NEXT_SIZE]; | ||
148 | long qlen; /* # of queued callbacks */ | ||
149 | long blimit; /* Upper limit on a processed batch */ | ||
150 | |||
151 | #ifdef CONFIG_NO_HZ | ||
152 | /* 3) dynticks interface. */ | ||
153 | struct rcu_dynticks *dynticks; /* Shared per-CPU dynticks state. */ | ||
154 | int dynticks_snap; /* Per-GP tracking for dynticks. */ | ||
155 | int dynticks_nmi_snap; /* Per-GP tracking for dynticks_nmi. */ | ||
156 | #endif /* #ifdef CONFIG_NO_HZ */ | ||
157 | |||
158 | /* 4) reasons this CPU needed to be kicked by force_quiescent_state */ | ||
159 | #ifdef CONFIG_NO_HZ | ||
160 | unsigned long dynticks_fqs; /* Kicked due to dynticks idle. */ | ||
161 | #endif /* #ifdef CONFIG_NO_HZ */ | ||
162 | unsigned long offline_fqs; /* Kicked due to being offline. */ | ||
163 | unsigned long resched_ipi; /* Sent a resched IPI. */ | ||
164 | |||
165 | /* 5) state to allow this CPU to force_quiescent_state on others */ | ||
166 | long n_rcu_pending; /* rcu_pending() calls since boot. */ | ||
167 | long n_rcu_pending_force_qs; /* when to force quiescent states. */ | ||
168 | |||
169 | int cpu; | ||
170 | }; | ||
171 | |||
172 | /* Values for signaled field in struct rcu_state. */ | ||
173 | #define RCU_GP_INIT 0 /* Grace period being initialized. */ | ||
174 | #define RCU_SAVE_DYNTICK 1 /* Need to scan dyntick state. */ | ||
175 | #define RCU_FORCE_QS 2 /* Need to force quiescent state. */ | ||
176 | #ifdef CONFIG_NO_HZ | ||
177 | #define RCU_SIGNAL_INIT RCU_SAVE_DYNTICK | ||
178 | #else /* #ifdef CONFIG_NO_HZ */ | ||
179 | #define RCU_SIGNAL_INIT RCU_FORCE_QS | ||
180 | #endif /* #else #ifdef CONFIG_NO_HZ */ | ||
181 | |||
182 | #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ | ||
183 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||
184 | #define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ) /* for rsp->jiffies_stall */ | ||
185 | #define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ) /* for rsp->jiffies_stall */ | ||
186 | #define RCU_STALL_RAT_DELAY 2 /* Allow other CPUs time */ | ||
187 | /* to take at least one */ | ||
188 | /* scheduling clock irq */ | ||
189 | /* before ratting on them. */ | ||
190 | |||
191 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | ||
192 | |||
193 | /* | ||
194 | * RCU global state, including node hierarchy. This hierarchy is | ||
195 | * represented in "heap" form in a dense array. The root (first level) | ||
196 | * of the hierarchy is in ->node[0] (referenced by ->level[0]), the second | ||
197 | * level in ->node[1] through ->node[m] (->node[1] referenced by ->level[1]), | ||
198 | * and the third level in ->node[m+1] and following (->node[m+1] referenced | ||
199 | * by ->level[2]). The number of levels is determined by the number of | ||
200 | * CPUs and by CONFIG_RCU_FANOUT. Small systems will have a "hierarchy" | ||
201 | * consisting of a single rcu_node. | ||
202 | */ | ||
203 | struct rcu_state { | ||
204 | struct rcu_node node[NUM_RCU_NODES]; /* Hierarchy. */ | ||
205 | struct rcu_node *level[NUM_RCU_LVLS]; /* Hierarchy levels. */ | ||
206 | u32 levelcnt[MAX_RCU_LVLS + 1]; /* # nodes in each level. */ | ||
207 | u8 levelspread[NUM_RCU_LVLS]; /* kids/node in each level. */ | ||
208 | struct rcu_data *rda[NR_CPUS]; /* array of rdp pointers. */ | ||
209 | |||
210 | /* The following fields are guarded by the root rcu_node's lock. */ | ||
211 | |||
212 | u8 signaled ____cacheline_internodealigned_in_smp; | ||
213 | /* Force QS state. */ | ||
214 | long gpnum; /* Current gp number. */ | ||
215 | long completed; /* # of last completed gp. */ | ||
216 | spinlock_t onofflock; /* exclude on/offline and */ | ||
217 | /* starting new GP. */ | ||
218 | spinlock_t fqslock; /* Only one task forcing */ | ||
219 | /* quiescent states. */ | ||
220 | unsigned long jiffies_force_qs; /* Time at which to invoke */ | ||
221 | /* force_quiescent_state(). */ | ||
222 | unsigned long n_force_qs; /* Number of calls to */ | ||
223 | /* force_quiescent_state(). */ | ||
224 | unsigned long n_force_qs_lh; /* ~Number of calls leaving */ | ||
225 | /* due to lock unavailable. */ | ||
226 | unsigned long n_force_qs_ngp; /* Number of calls leaving */ | ||
227 | /* due to no GP active. */ | ||
228 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||
229 | unsigned long gp_start; /* Time at which GP started, */ | ||
230 | /* but in jiffies. */ | ||
231 | unsigned long jiffies_stall; /* Time at which to check */ | ||
232 | /* for CPU stalls. */ | ||
233 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | ||
234 | #ifdef CONFIG_NO_HZ | ||
235 | long dynticks_completed; /* Value of completed @ snap. */ | ||
236 | #endif /* #ifdef CONFIG_NO_HZ */ | ||
237 | }; | ||
238 | |||
239 | extern struct rcu_state rcu_state; | ||
240 | DECLARE_PER_CPU(struct rcu_data, rcu_data); | ||
241 | |||
242 | extern struct rcu_state rcu_bh_state; | ||
243 | DECLARE_PER_CPU(struct rcu_data, rcu_bh_data); | ||
244 | |||
245 | /* | ||
246 | * Increment the quiescent state counter. | ||
247 | * The counter is a bit degenerated: We do not need to know | ||
248 | * how many quiescent states passed, just if there was at least | ||
249 | * one since the start of the grace period. Thus just a flag. | ||
250 | */ | ||
251 | static inline void rcu_qsctr_inc(int cpu) | ||
252 | { | ||
253 | struct rcu_data *rdp = &per_cpu(rcu_data, cpu); | ||
254 | rdp->passed_quiesc = 1; | ||
255 | rdp->passed_quiesc_completed = rdp->completed; | ||
256 | } | ||
257 | static inline void rcu_bh_qsctr_inc(int cpu) | ||
258 | { | ||
259 | struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu); | ||
260 | rdp->passed_quiesc = 1; | ||
261 | rdp->passed_quiesc_completed = rdp->completed; | ||
262 | } | ||
263 | |||
264 | extern int rcu_pending(int cpu); | ||
265 | extern int rcu_needs_cpu(int cpu); | ||
266 | |||
267 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
268 | extern struct lockdep_map rcu_lock_map; | ||
269 | # define rcu_read_acquire() \ | ||
270 | lock_acquire(&rcu_lock_map, 0, 0, 2, 1, NULL, _THIS_IP_) | ||
271 | # define rcu_read_release() lock_release(&rcu_lock_map, 1, _THIS_IP_) | ||
272 | #else | ||
273 | # define rcu_read_acquire() do { } while (0) | ||
274 | # define rcu_read_release() do { } while (0) | ||
275 | #endif | ||
276 | |||
277 | static inline void __rcu_read_lock(void) | ||
278 | { | ||
279 | preempt_disable(); | ||
280 | __acquire(RCU); | ||
281 | rcu_read_acquire(); | ||
282 | } | ||
283 | static inline void __rcu_read_unlock(void) | ||
284 | { | ||
285 | rcu_read_release(); | ||
286 | __release(RCU); | ||
287 | preempt_enable(); | ||
288 | } | ||
289 | static inline void __rcu_read_lock_bh(void) | ||
290 | { | ||
291 | local_bh_disable(); | ||
292 | __acquire(RCU_BH); | ||
293 | rcu_read_acquire(); | ||
294 | } | ||
295 | static inline void __rcu_read_unlock_bh(void) | ||
296 | { | ||
297 | rcu_read_release(); | ||
298 | __release(RCU_BH); | ||
299 | local_bh_enable(); | ||
300 | } | ||
301 | |||
302 | #define __synchronize_sched() synchronize_rcu() | ||
303 | |||
304 | #define call_rcu_sched(head, func) call_rcu(head, func) | ||
305 | |||
306 | static inline void rcu_init_sched(void) | ||
307 | { | ||
308 | } | ||
309 | |||
310 | extern void __rcu_init(void); | ||
311 | extern void rcu_check_callbacks(int cpu, int user); | ||
312 | extern void rcu_restart_cpu(int cpu); | ||
313 | |||
314 | extern long rcu_batches_completed(void); | ||
315 | extern long rcu_batches_completed_bh(void); | ||
316 | |||
317 | #ifdef CONFIG_NO_HZ | ||
318 | void rcu_enter_nohz(void); | ||
319 | void rcu_exit_nohz(void); | ||
320 | #else /* CONFIG_NO_HZ */ | ||
321 | static inline void rcu_enter_nohz(void) | ||
322 | { | ||
323 | } | ||
324 | static inline void rcu_exit_nohz(void) | ||
325 | { | ||
326 | } | ||
327 | #endif /* CONFIG_NO_HZ */ | ||
328 | |||
329 | #endif /* __LINUX_RCUTREE_H */ | ||
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index afdc4558bb94..801bf77ff4e2 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h | |||
@@ -104,10 +104,10 @@ struct regulator; | |||
104 | /** | 104 | /** |
105 | * struct regulator_bulk_data - Data used for bulk regulator operations. | 105 | * struct regulator_bulk_data - Data used for bulk regulator operations. |
106 | * | 106 | * |
107 | * @supply The name of the supply. Initialised by the user before | 107 | * @supply: The name of the supply. Initialised by the user before |
108 | * using the bulk regulator APIs. | 108 | * using the bulk regulator APIs. |
109 | * @consumer The regulator consumer for the supply. This will be managed | 109 | * @consumer: The regulator consumer for the supply. This will be managed |
110 | * by the bulk API. | 110 | * by the bulk API. |
111 | * | 111 | * |
112 | * The regulator APIs provide a series of regulator_bulk_() API calls as | 112 | * The regulator APIs provide a series of regulator_bulk_() API calls as |
113 | * a convenience to consumers which require multiple supplies. This | 113 | * a convenience to consumers which require multiple supplies. This |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index e37d80561985..2dae05705f13 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
@@ -24,7 +24,33 @@ struct regulator_init_data; | |||
24 | /** | 24 | /** |
25 | * struct regulator_ops - regulator operations. | 25 | * struct regulator_ops - regulator operations. |
26 | * | 26 | * |
27 | * This struct describes regulator operations. | 27 | * This struct describes regulator operations which can be implemented by |
28 | * regulator chip drivers. | ||
29 | * | ||
30 | * @enable: Enable the regulator. | ||
31 | * @disable: Disable the regulator. | ||
32 | * @is_enabled: Return 1 if the regulator is enabled, 0 otherwise. | ||
33 | * | ||
34 | * @set_voltage: Set the voltage for the regulator within the range specified. | ||
35 | * The driver should select the voltage closest to min_uV. | ||
36 | * @get_voltage: Return the currently configured voltage for the regulator. | ||
37 | * | ||
38 | * @set_current_limit: Configure a limit for a current-limited regulator. | ||
39 | * @get_current_limit: Get the limit for a current-limited regulator. | ||
40 | * | ||
41 | * @set_mode: Set the operating mode for the regulator. | ||
42 | * @get_mode: Get the current operating mode for the regulator. | ||
43 | * @get_optimum_mode: Get the most efficient operating mode for the regulator | ||
44 | * when running with the specified parameters. | ||
45 | * | ||
46 | * @set_suspend_voltage: Set the voltage for the regulator when the system | ||
47 | * is suspended. | ||
48 | * @set_suspend_enable: Mark the regulator as enabled when the system is | ||
49 | * suspended. | ||
50 | * @set_suspend_disable: Mark the regulator as disabled when the system is | ||
51 | * suspended. | ||
52 | * @set_suspend_mode: Set the operating mode for the regulator when the | ||
53 | * system is suspended. | ||
28 | */ | 54 | */ |
29 | struct regulator_ops { | 55 | struct regulator_ops { |
30 | 56 | ||
@@ -75,6 +101,15 @@ enum regulator_type { | |||
75 | /** | 101 | /** |
76 | * struct regulator_desc - Regulator descriptor | 102 | * struct regulator_desc - Regulator descriptor |
77 | * | 103 | * |
104 | * Each regulator registered with the core is described with a structure of | ||
105 | * this type. | ||
106 | * | ||
107 | * @name: Identifying name for the regulator. | ||
108 | * @id: Numerical identifier for the regulator. | ||
109 | * @ops: Regulator operations table. | ||
110 | * @irq: Interrupt number for the regulator. | ||
111 | * @type: Indicates if the regulator is a voltage or current regulator. | ||
112 | * @owner: Module providing the regulator, used for refcounting. | ||
78 | */ | 113 | */ |
79 | struct regulator_desc { | 114 | struct regulator_desc { |
80 | const char *name; | 115 | const char *name; |
diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index c6d69331a81e..3794773b23d2 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h | |||
@@ -44,6 +44,10 @@ struct regulator; | |||
44 | * struct regulator_state - regulator state during low power syatem states | 44 | * struct regulator_state - regulator state during low power syatem states |
45 | * | 45 | * |
46 | * This describes a regulators state during a system wide low power state. | 46 | * This describes a regulators state during a system wide low power state. |
47 | * | ||
48 | * @uV: Operating voltage during suspend. | ||
49 | * @mode: Operating mode during suspend. | ||
50 | * @enabled: Enabled during suspend. | ||
47 | */ | 51 | */ |
48 | struct regulator_state { | 52 | struct regulator_state { |
49 | int uV; /* suspend voltage */ | 53 | int uV; /* suspend voltage */ |
@@ -55,6 +59,30 @@ struct regulator_state { | |||
55 | * struct regulation_constraints - regulator operating constraints. | 59 | * struct regulation_constraints - regulator operating constraints. |
56 | * | 60 | * |
57 | * This struct describes regulator and board/machine specific constraints. | 61 | * This struct describes regulator and board/machine specific constraints. |
62 | * | ||
63 | * @name: Descriptive name for the constraints, used for display purposes. | ||
64 | * | ||
65 | * @min_uV: Smallest voltage consumers may set. | ||
66 | * @max_uV: Largest voltage consumers may set. | ||
67 | * | ||
68 | * @min_uA: Smallest consumers consumers may set. | ||
69 | * @max_uA: Largest current consumers may set. | ||
70 | * | ||
71 | * @valid_modes_mask: Mask of modes which may be configured by consumers. | ||
72 | * @valid_ops_mask: Operations which may be performed by consumers. | ||
73 | * | ||
74 | * @always_on: Set if the regulator should never be disabled. | ||
75 | * @boot_on: Set if the regulator is enabled when the system is initially | ||
76 | * started. | ||
77 | * @apply_uV: Apply the voltage constraint when initialising. | ||
78 | * | ||
79 | * @input_uV: Input voltage for regulator when supplied by another regulator. | ||
80 | * | ||
81 | * @state_disk: State for regulator when system is suspended in disk mode. | ||
82 | * @state_mem: State for regulator when system is suspended in mem mode. | ||
83 | * @state_standby: State for regulator when system is suspended in standby | ||
84 | * mode. | ||
85 | * @initial_state: Suspend state to set by default. | ||
58 | */ | 86 | */ |
59 | struct regulation_constraints { | 87 | struct regulation_constraints { |
60 | 88 | ||
@@ -93,6 +121,9 @@ struct regulation_constraints { | |||
93 | * struct regulator_consumer_supply - supply -> device mapping | 121 | * struct regulator_consumer_supply - supply -> device mapping |
94 | * | 122 | * |
95 | * This maps a supply name to a device. | 123 | * This maps a supply name to a device. |
124 | * | ||
125 | * @dev: Device structure for the consumer. | ||
126 | * @supply: Name for the supply. | ||
96 | */ | 127 | */ |
97 | struct regulator_consumer_supply { | 128 | struct regulator_consumer_supply { |
98 | struct device *dev; /* consumer */ | 129 | struct device *dev; /* consumer */ |
@@ -103,6 +134,16 @@ struct regulator_consumer_supply { | |||
103 | * struct regulator_init_data - regulator platform initialisation data. | 134 | * struct regulator_init_data - regulator platform initialisation data. |
104 | * | 135 | * |
105 | * Initialisation constraints, our supply and consumers supplies. | 136 | * Initialisation constraints, our supply and consumers supplies. |
137 | * | ||
138 | * @supply_regulator_dev: Parent regulator (if any). | ||
139 | * | ||
140 | * @constraints: Constraints. These must be specified for the regulator to | ||
141 | * be usable. | ||
142 | * @num_consumer_supplies: Number of consumer device supplies. | ||
143 | * @consumer_supplies: Consumer device supply configuration. | ||
144 | * | ||
145 | * @regulator_init: Callback invoked when the regulator has been registered. | ||
146 | * @driver_data: Data passed to regulator_init. | ||
106 | */ | 147 | */ |
107 | struct regulator_init_data { | 148 | struct regulator_init_data { |
108 | struct device *supply_regulator_dev; /* or NULL for LINE */ | 149 | struct device *supply_regulator_dev; /* or NULL for LINE */ |
diff --git a/include/linux/res_counter.h b/include/linux/res_counter.h index 271c1c2c9f6f..dede0a2cfc45 100644 --- a/include/linux/res_counter.h +++ b/include/linux/res_counter.h | |||
@@ -43,6 +43,10 @@ struct res_counter { | |||
43 | * the routines below consider this to be IRQ-safe | 43 | * the routines below consider this to be IRQ-safe |
44 | */ | 44 | */ |
45 | spinlock_t lock; | 45 | spinlock_t lock; |
46 | /* | ||
47 | * Parent counter, used for hierarchial resource accounting | ||
48 | */ | ||
49 | struct res_counter *parent; | ||
46 | }; | 50 | }; |
47 | 51 | ||
48 | /** | 52 | /** |
@@ -87,7 +91,7 @@ enum { | |||
87 | * helpers for accounting | 91 | * helpers for accounting |
88 | */ | 92 | */ |
89 | 93 | ||
90 | void res_counter_init(struct res_counter *counter); | 94 | void res_counter_init(struct res_counter *counter, struct res_counter *parent); |
91 | 95 | ||
92 | /* | 96 | /* |
93 | * charge - try to consume more resource. | 97 | * charge - try to consume more resource. |
@@ -103,7 +107,7 @@ void res_counter_init(struct res_counter *counter); | |||
103 | int __must_check res_counter_charge_locked(struct res_counter *counter, | 107 | int __must_check res_counter_charge_locked(struct res_counter *counter, |
104 | unsigned long val); | 108 | unsigned long val); |
105 | int __must_check res_counter_charge(struct res_counter *counter, | 109 | int __must_check res_counter_charge(struct res_counter *counter, |
106 | unsigned long val); | 110 | unsigned long val, struct res_counter **limit_fail_at); |
107 | 111 | ||
108 | /* | 112 | /* |
109 | * uncharge - tell that some portion of the resource is released | 113 | * uncharge - tell that some portion of the resource is released |
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index d363467c8f13..b3b359660082 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
@@ -118,6 +118,8 @@ void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu); | |||
118 | 118 | ||
119 | unsigned long ring_buffer_entries(struct ring_buffer *buffer); | 119 | unsigned long ring_buffer_entries(struct ring_buffer *buffer); |
120 | unsigned long ring_buffer_overruns(struct ring_buffer *buffer); | 120 | unsigned long ring_buffer_overruns(struct ring_buffer *buffer); |
121 | unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu); | ||
122 | unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu); | ||
121 | 123 | ||
122 | u64 ring_buffer_time_stamp(int cpu); | 124 | u64 ring_buffer_time_stamp(int cpu); |
123 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); | 125 | void ring_buffer_normalize_time_stamp(int cpu, u64 *ts); |
diff --git a/include/linux/rio_drv.h b/include/linux/rio_drv.h index 32c0547ffafc..c93a58a40033 100644 --- a/include/linux/rio_drv.h +++ b/include/linux/rio_drv.h | |||
@@ -391,7 +391,6 @@ static inline int rio_add_inb_buffer(struct rio_mport *mport, int mbox, | |||
391 | * rio_get_inb_message - Get A RIO message from an inbound mailbox queue | 391 | * rio_get_inb_message - Get A RIO message from an inbound mailbox queue |
392 | * @mport: Master port containing the inbound mailbox | 392 | * @mport: Master port containing the inbound mailbox |
393 | * @mbox: The inbound mailbox number | 393 | * @mbox: The inbound mailbox number |
394 | * @buffer: Pointer to the message buffer | ||
395 | * | 394 | * |
396 | * Get a RIO message from an inbound mailbox queue. Returns 0 on success. | 395 | * Get a RIO message from an inbound mailbox queue. Returns 0 on success. |
397 | */ | 396 | */ |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index 89f0564b10c8..b35bc0e19cd9 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
@@ -63,16 +63,13 @@ void anon_vma_unlink(struct vm_area_struct *); | |||
63 | void anon_vma_link(struct vm_area_struct *); | 63 | void anon_vma_link(struct vm_area_struct *); |
64 | void __anon_vma_link(struct vm_area_struct *); | 64 | void __anon_vma_link(struct vm_area_struct *); |
65 | 65 | ||
66 | extern struct anon_vma *page_lock_anon_vma(struct page *page); | ||
67 | extern void page_unlock_anon_vma(struct anon_vma *anon_vma); | ||
68 | |||
69 | /* | 66 | /* |
70 | * rmap interfaces called when adding or removing pte of page | 67 | * rmap interfaces called when adding or removing pte of page |
71 | */ | 68 | */ |
72 | void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); | 69 | void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); |
73 | void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); | 70 | void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); |
74 | void page_add_file_rmap(struct page *); | 71 | void page_add_file_rmap(struct page *); |
75 | void page_remove_rmap(struct page *, struct vm_area_struct *); | 72 | void page_remove_rmap(struct page *); |
76 | 73 | ||
77 | #ifdef CONFIG_DEBUG_VM | 74 | #ifdef CONFIG_DEBUG_VM |
78 | void page_dup_rmap(struct page *page, struct vm_area_struct *vma, unsigned long address); | 75 | void page_dup_rmap(struct page *page, struct vm_area_struct *vma, unsigned long address); |
diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 91f597ad6acc..4046b75563c1 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h | |||
@@ -145,6 +145,8 @@ struct rtc_class_ops { | |||
145 | int (*irq_set_state)(struct device *, int enabled); | 145 | int (*irq_set_state)(struct device *, int enabled); |
146 | int (*irq_set_freq)(struct device *, int freq); | 146 | int (*irq_set_freq)(struct device *, int freq); |
147 | int (*read_callback)(struct device *, int data); | 147 | int (*read_callback)(struct device *, int data); |
148 | int (*alarm_irq_enable)(struct device *, unsigned int enabled); | ||
149 | int (*update_irq_enable)(struct device *, unsigned int enabled); | ||
148 | }; | 150 | }; |
149 | 151 | ||
150 | #define RTC_DEVICE_NAME_SIZE 20 | 152 | #define RTC_DEVICE_NAME_SIZE 20 |
@@ -181,7 +183,7 @@ struct rtc_device | |||
181 | struct timer_list uie_timer; | 183 | struct timer_list uie_timer; |
182 | /* Those fields are protected by rtc->irq_lock */ | 184 | /* Those fields are protected by rtc->irq_lock */ |
183 | unsigned int oldsecs; | 185 | unsigned int oldsecs; |
184 | unsigned int irq_active:1; | 186 | unsigned int uie_irq_active:1; |
185 | unsigned int stop_uie_polling:1; | 187 | unsigned int stop_uie_polling:1; |
186 | unsigned int uie_task_active:1; | 188 | unsigned int uie_task_active:1; |
187 | unsigned int uie_timer_active:1; | 189 | unsigned int uie_timer_active:1; |
@@ -216,6 +218,10 @@ extern int rtc_irq_set_state(struct rtc_device *rtc, | |||
216 | struct rtc_task *task, int enabled); | 218 | struct rtc_task *task, int enabled); |
217 | extern int rtc_irq_set_freq(struct rtc_device *rtc, | 219 | extern int rtc_irq_set_freq(struct rtc_device *rtc, |
218 | struct rtc_task *task, int freq); | 220 | struct rtc_task *task, int freq); |
221 | extern int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled); | ||
222 | extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled); | ||
223 | extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, | ||
224 | unsigned int enabled); | ||
219 | 225 | ||
220 | typedef struct rtc_task { | 226 | typedef struct rtc_task { |
221 | void (*func)(void *private_data); | 227 | void (*func)(void *private_data); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index fc2c6f3477e7..f134a0f7080a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -251,7 +251,7 @@ extern void init_idle_bootup_task(struct task_struct *idle); | |||
251 | extern int runqueue_is_locked(void); | 251 | extern int runqueue_is_locked(void); |
252 | extern void task_rq_unlock_wait(struct task_struct *p); | 252 | extern void task_rq_unlock_wait(struct task_struct *p); |
253 | 253 | ||
254 | extern cpumask_t nohz_cpu_mask; | 254 | extern cpumask_var_t nohz_cpu_mask; |
255 | #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ) | 255 | #if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ) |
256 | extern int select_nohz_load_balancer(int cpu); | 256 | extern int select_nohz_load_balancer(int cpu); |
257 | #else | 257 | #else |
@@ -285,7 +285,6 @@ long io_schedule_timeout(long timeout); | |||
285 | 285 | ||
286 | extern void cpu_init (void); | 286 | extern void cpu_init (void); |
287 | extern void trap_init(void); | 287 | extern void trap_init(void); |
288 | extern void account_process_tick(struct task_struct *task, int user); | ||
289 | extern void update_process_times(int user); | 288 | extern void update_process_times(int user); |
290 | extern void scheduler_tick(void); | 289 | extern void scheduler_tick(void); |
291 | 290 | ||
@@ -388,6 +387,9 @@ extern void arch_unmap_area_topdown(struct mm_struct *, unsigned long); | |||
388 | (mm)->hiwater_vm = (mm)->total_vm; \ | 387 | (mm)->hiwater_vm = (mm)->total_vm; \ |
389 | } while (0) | 388 | } while (0) |
390 | 389 | ||
390 | #define get_mm_hiwater_rss(mm) max((mm)->hiwater_rss, get_mm_rss(mm)) | ||
391 | #define get_mm_hiwater_vm(mm) max((mm)->hiwater_vm, (mm)->total_vm) | ||
392 | |||
391 | extern void set_dumpable(struct mm_struct *mm, int value); | 393 | extern void set_dumpable(struct mm_struct *mm, int value); |
392 | extern int get_dumpable(struct mm_struct *mm); | 394 | extern int get_dumpable(struct mm_struct *mm); |
393 | 395 | ||
@@ -759,20 +761,51 @@ enum cpu_idle_type { | |||
759 | #define SD_SERIALIZE 1024 /* Only a single load balancing instance */ | 761 | #define SD_SERIALIZE 1024 /* Only a single load balancing instance */ |
760 | #define SD_WAKE_IDLE_FAR 2048 /* Gain latency sacrificing cache hit */ | 762 | #define SD_WAKE_IDLE_FAR 2048 /* Gain latency sacrificing cache hit */ |
761 | 763 | ||
762 | #define BALANCE_FOR_MC_POWER \ | 764 | enum powersavings_balance_level { |
763 | (sched_smt_power_savings ? SD_POWERSAVINGS_BALANCE : 0) | 765 | POWERSAVINGS_BALANCE_NONE = 0, /* No power saving load balance */ |
766 | POWERSAVINGS_BALANCE_BASIC, /* Fill one thread/core/package | ||
767 | * first for long running threads | ||
768 | */ | ||
769 | POWERSAVINGS_BALANCE_WAKEUP, /* Also bias task wakeups to semi-idle | ||
770 | * cpu package for power savings | ||
771 | */ | ||
772 | MAX_POWERSAVINGS_BALANCE_LEVELS | ||
773 | }; | ||
764 | 774 | ||
765 | #define BALANCE_FOR_PKG_POWER \ | 775 | extern int sched_mc_power_savings, sched_smt_power_savings; |
766 | ((sched_mc_power_savings || sched_smt_power_savings) ? \ | ||
767 | SD_POWERSAVINGS_BALANCE : 0) | ||
768 | 776 | ||
769 | #define test_sd_parent(sd, flag) ((sd->parent && \ | 777 | static inline int sd_balance_for_mc_power(void) |
770 | (sd->parent->flags & flag)) ? 1 : 0) | 778 | { |
779 | if (sched_smt_power_savings) | ||
780 | return SD_POWERSAVINGS_BALANCE; | ||
771 | 781 | ||
782 | return 0; | ||
783 | } | ||
784 | |||
785 | static inline int sd_balance_for_package_power(void) | ||
786 | { | ||
787 | if (sched_mc_power_savings | sched_smt_power_savings) | ||
788 | return SD_POWERSAVINGS_BALANCE; | ||
789 | |||
790 | return 0; | ||
791 | } | ||
792 | |||
793 | /* | ||
794 | * Optimise SD flags for power savings: | ||
795 | * SD_BALANCE_NEWIDLE helps agressive task consolidation and power savings. | ||
796 | * Keep default SD flags if sched_{smt,mc}_power_saving=0 | ||
797 | */ | ||
798 | |||
799 | static inline int sd_power_saving_flags(void) | ||
800 | { | ||
801 | if (sched_mc_power_savings | sched_smt_power_savings) | ||
802 | return SD_BALANCE_NEWIDLE; | ||
803 | |||
804 | return 0; | ||
805 | } | ||
772 | 806 | ||
773 | struct sched_group { | 807 | struct sched_group { |
774 | struct sched_group *next; /* Must be a circular list */ | 808 | struct sched_group *next; /* Must be a circular list */ |
775 | cpumask_t cpumask; | ||
776 | 809 | ||
777 | /* | 810 | /* |
778 | * CPU power of this group, SCHED_LOAD_SCALE being max power for a | 811 | * CPU power of this group, SCHED_LOAD_SCALE being max power for a |
@@ -785,8 +818,15 @@ struct sched_group { | |||
785 | * (see include/linux/reciprocal_div.h) | 818 | * (see include/linux/reciprocal_div.h) |
786 | */ | 819 | */ |
787 | u32 reciprocal_cpu_power; | 820 | u32 reciprocal_cpu_power; |
821 | |||
822 | unsigned long cpumask[]; | ||
788 | }; | 823 | }; |
789 | 824 | ||
825 | static inline struct cpumask *sched_group_cpus(struct sched_group *sg) | ||
826 | { | ||
827 | return to_cpumask(sg->cpumask); | ||
828 | } | ||
829 | |||
790 | enum sched_domain_level { | 830 | enum sched_domain_level { |
791 | SD_LV_NONE = 0, | 831 | SD_LV_NONE = 0, |
792 | SD_LV_SIBLING, | 832 | SD_LV_SIBLING, |
@@ -810,7 +850,6 @@ struct sched_domain { | |||
810 | struct sched_domain *parent; /* top domain must be null terminated */ | 850 | struct sched_domain *parent; /* top domain must be null terminated */ |
811 | struct sched_domain *child; /* bottom domain must be null terminated */ | 851 | struct sched_domain *child; /* bottom domain must be null terminated */ |
812 | struct sched_group *groups; /* the balancing groups of the domain */ | 852 | struct sched_group *groups; /* the balancing groups of the domain */ |
813 | cpumask_t span; /* span of all CPUs in this domain */ | ||
814 | unsigned long min_interval; /* Minimum balance interval ms */ | 853 | unsigned long min_interval; /* Minimum balance interval ms */ |
815 | unsigned long max_interval; /* Maximum balance interval ms */ | 854 | unsigned long max_interval; /* Maximum balance interval ms */ |
816 | unsigned int busy_factor; /* less balancing by factor if busy */ | 855 | unsigned int busy_factor; /* less balancing by factor if busy */ |
@@ -865,18 +904,34 @@ struct sched_domain { | |||
865 | #ifdef CONFIG_SCHED_DEBUG | 904 | #ifdef CONFIG_SCHED_DEBUG |
866 | char *name; | 905 | char *name; |
867 | #endif | 906 | #endif |
907 | |||
908 | /* span of all CPUs in this domain */ | ||
909 | unsigned long span[]; | ||
868 | }; | 910 | }; |
869 | 911 | ||
870 | extern void partition_sched_domains(int ndoms_new, cpumask_t *doms_new, | 912 | static inline struct cpumask *sched_domain_span(struct sched_domain *sd) |
913 | { | ||
914 | return to_cpumask(sd->span); | ||
915 | } | ||
916 | |||
917 | extern void partition_sched_domains(int ndoms_new, struct cpumask *doms_new, | ||
871 | struct sched_domain_attr *dattr_new); | 918 | struct sched_domain_attr *dattr_new); |
872 | extern int arch_reinit_sched_domains(void); | 919 | |
920 | /* Test a flag in parent sched domain */ | ||
921 | static inline int test_sd_parent(struct sched_domain *sd, int flag) | ||
922 | { | ||
923 | if (sd->parent && (sd->parent->flags & flag)) | ||
924 | return 1; | ||
925 | |||
926 | return 0; | ||
927 | } | ||
873 | 928 | ||
874 | #else /* CONFIG_SMP */ | 929 | #else /* CONFIG_SMP */ |
875 | 930 | ||
876 | struct sched_domain_attr; | 931 | struct sched_domain_attr; |
877 | 932 | ||
878 | static inline void | 933 | static inline void |
879 | partition_sched_domains(int ndoms_new, cpumask_t *doms_new, | 934 | partition_sched_domains(int ndoms_new, struct cpumask *doms_new, |
880 | struct sched_domain_attr *dattr_new) | 935 | struct sched_domain_attr *dattr_new) |
881 | { | 936 | { |
882 | } | 937 | } |
@@ -927,7 +982,7 @@ struct sched_class { | |||
927 | void (*task_wake_up) (struct rq *this_rq, struct task_struct *task); | 982 | void (*task_wake_up) (struct rq *this_rq, struct task_struct *task); |
928 | 983 | ||
929 | void (*set_cpus_allowed)(struct task_struct *p, | 984 | void (*set_cpus_allowed)(struct task_struct *p, |
930 | const cpumask_t *newmask); | 985 | const struct cpumask *newmask); |
931 | 986 | ||
932 | void (*rq_online)(struct rq *rq); | 987 | void (*rq_online)(struct rq *rq); |
933 | void (*rq_offline)(struct rq *rq); | 988 | void (*rq_offline)(struct rq *rq); |
@@ -1582,12 +1637,12 @@ extern cputime_t task_gtime(struct task_struct *p); | |||
1582 | 1637 | ||
1583 | #ifdef CONFIG_SMP | 1638 | #ifdef CONFIG_SMP |
1584 | extern int set_cpus_allowed_ptr(struct task_struct *p, | 1639 | extern int set_cpus_allowed_ptr(struct task_struct *p, |
1585 | const cpumask_t *new_mask); | 1640 | const struct cpumask *new_mask); |
1586 | #else | 1641 | #else |
1587 | static inline int set_cpus_allowed_ptr(struct task_struct *p, | 1642 | static inline int set_cpus_allowed_ptr(struct task_struct *p, |
1588 | const cpumask_t *new_mask) | 1643 | const struct cpumask *new_mask) |
1589 | { | 1644 | { |
1590 | if (!cpu_isset(0, *new_mask)) | 1645 | if (!cpumask_test_cpu(0, new_mask)) |
1591 | return -EINVAL; | 1646 | return -EINVAL; |
1592 | return 0; | 1647 | return 0; |
1593 | } | 1648 | } |
@@ -1654,16 +1709,16 @@ extern void wake_up_idle_cpu(int cpu); | |||
1654 | static inline void wake_up_idle_cpu(int cpu) { } | 1709 | static inline void wake_up_idle_cpu(int cpu) { } |
1655 | #endif | 1710 | #endif |
1656 | 1711 | ||
1657 | #ifdef CONFIG_SCHED_DEBUG | ||
1658 | extern unsigned int sysctl_sched_latency; | 1712 | extern unsigned int sysctl_sched_latency; |
1659 | extern unsigned int sysctl_sched_min_granularity; | 1713 | extern unsigned int sysctl_sched_min_granularity; |
1660 | extern unsigned int sysctl_sched_wakeup_granularity; | 1714 | extern unsigned int sysctl_sched_wakeup_granularity; |
1715 | extern unsigned int sysctl_sched_shares_ratelimit; | ||
1716 | extern unsigned int sysctl_sched_shares_thresh; | ||
1717 | #ifdef CONFIG_SCHED_DEBUG | ||
1661 | extern unsigned int sysctl_sched_child_runs_first; | 1718 | extern unsigned int sysctl_sched_child_runs_first; |
1662 | extern unsigned int sysctl_sched_features; | 1719 | extern unsigned int sysctl_sched_features; |
1663 | extern unsigned int sysctl_sched_migration_cost; | 1720 | extern unsigned int sysctl_sched_migration_cost; |
1664 | extern unsigned int sysctl_sched_nr_migrate; | 1721 | extern unsigned int sysctl_sched_nr_migrate; |
1665 | extern unsigned int sysctl_sched_shares_ratelimit; | ||
1666 | extern unsigned int sysctl_sched_shares_thresh; | ||
1667 | 1722 | ||
1668 | int sched_nr_latency_handler(struct ctl_table *table, int write, | 1723 | int sched_nr_latency_handler(struct ctl_table *table, int write, |
1669 | struct file *file, void __user *buffer, size_t *length, | 1724 | struct file *file, void __user *buffer, size_t *length, |
@@ -2198,10 +2253,8 @@ __trace_special(void *__tr, void *__data, | |||
2198 | } | 2253 | } |
2199 | #endif | 2254 | #endif |
2200 | 2255 | ||
2201 | extern long sched_setaffinity(pid_t pid, const cpumask_t *new_mask); | 2256 | extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask); |
2202 | extern long sched_getaffinity(pid_t pid, cpumask_t *mask); | 2257 | extern long sched_getaffinity(pid_t pid, struct cpumask *mask); |
2203 | |||
2204 | extern int sched_mc_power_savings, sched_smt_power_savings; | ||
2205 | 2258 | ||
2206 | extern void normalize_rt_tasks(void); | 2259 | extern void normalize_rt_tasks(void); |
2207 | 2260 | ||
diff --git a/include/linux/security.h b/include/linux/security.h index 3416cb85e77b..1f2ab6353c00 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -48,7 +48,8 @@ struct audit_krule; | |||
48 | * These functions are in security/capability.c and are used | 48 | * These functions are in security/capability.c and are used |
49 | * as the default capabilities functions | 49 | * as the default capabilities functions |
50 | */ | 50 | */ |
51 | extern int cap_capable(struct task_struct *tsk, int cap, int audit); | 51 | extern int cap_capable(struct task_struct *tsk, const struct cred *cred, |
52 | int cap, int audit); | ||
52 | extern int cap_settime(struct timespec *ts, struct timezone *tz); | 53 | extern int cap_settime(struct timespec *ts, struct timezone *tz); |
53 | extern int cap_ptrace_may_access(struct task_struct *child, unsigned int mode); | 54 | extern int cap_ptrace_may_access(struct task_struct *child, unsigned int mode); |
54 | extern int cap_ptrace_traceme(struct task_struct *parent); | 55 | extern int cap_ptrace_traceme(struct task_struct *parent); |
@@ -335,17 +336,37 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
335 | * @dir contains the inode structure of the parent directory of the new link. | 336 | * @dir contains the inode structure of the parent directory of the new link. |
336 | * @new_dentry contains the dentry structure for the new link. | 337 | * @new_dentry contains the dentry structure for the new link. |
337 | * Return 0 if permission is granted. | 338 | * Return 0 if permission is granted. |
339 | * @path_link: | ||
340 | * Check permission before creating a new hard link to a file. | ||
341 | * @old_dentry contains the dentry structure for an existing link | ||
342 | * to the file. | ||
343 | * @new_dir contains the path structure of the parent directory of | ||
344 | * the new link. | ||
345 | * @new_dentry contains the dentry structure for the new link. | ||
346 | * Return 0 if permission is granted. | ||
338 | * @inode_unlink: | 347 | * @inode_unlink: |
339 | * Check the permission to remove a hard link to a file. | 348 | * Check the permission to remove a hard link to a file. |
340 | * @dir contains the inode structure of parent directory of the file. | 349 | * @dir contains the inode structure of parent directory of the file. |
341 | * @dentry contains the dentry structure for file to be unlinked. | 350 | * @dentry contains the dentry structure for file to be unlinked. |
342 | * Return 0 if permission is granted. | 351 | * Return 0 if permission is granted. |
352 | * @path_unlink: | ||
353 | * Check the permission to remove a hard link to a file. | ||
354 | * @dir contains the path structure of parent directory of the file. | ||
355 | * @dentry contains the dentry structure for file to be unlinked. | ||
356 | * Return 0 if permission is granted. | ||
343 | * @inode_symlink: | 357 | * @inode_symlink: |
344 | * Check the permission to create a symbolic link to a file. | 358 | * Check the permission to create a symbolic link to a file. |
345 | * @dir contains the inode structure of parent directory of the symbolic link. | 359 | * @dir contains the inode structure of parent directory of the symbolic link. |
346 | * @dentry contains the dentry structure of the symbolic link. | 360 | * @dentry contains the dentry structure of the symbolic link. |
347 | * @old_name contains the pathname of file. | 361 | * @old_name contains the pathname of file. |
348 | * Return 0 if permission is granted. | 362 | * Return 0 if permission is granted. |
363 | * @path_symlink: | ||
364 | * Check the permission to create a symbolic link to a file. | ||
365 | * @dir contains the path structure of parent directory of | ||
366 | * the symbolic link. | ||
367 | * @dentry contains the dentry structure of the symbolic link. | ||
368 | * @old_name contains the pathname of file. | ||
369 | * Return 0 if permission is granted. | ||
349 | * @inode_mkdir: | 370 | * @inode_mkdir: |
350 | * Check permissions to create a new directory in the existing directory | 371 | * Check permissions to create a new directory in the existing directory |
351 | * associated with inode strcture @dir. | 372 | * associated with inode strcture @dir. |
@@ -353,11 +374,25 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
353 | * @dentry contains the dentry structure of new directory. | 374 | * @dentry contains the dentry structure of new directory. |
354 | * @mode contains the mode of new directory. | 375 | * @mode contains the mode of new directory. |
355 | * Return 0 if permission is granted. | 376 | * Return 0 if permission is granted. |
377 | * @path_mkdir: | ||
378 | * Check permissions to create a new directory in the existing directory | ||
379 | * associated with path strcture @path. | ||
380 | * @dir containst the path structure of parent of the directory | ||
381 | * to be created. | ||
382 | * @dentry contains the dentry structure of new directory. | ||
383 | * @mode contains the mode of new directory. | ||
384 | * Return 0 if permission is granted. | ||
356 | * @inode_rmdir: | 385 | * @inode_rmdir: |
357 | * Check the permission to remove a directory. | 386 | * Check the permission to remove a directory. |
358 | * @dir contains the inode structure of parent of the directory to be removed. | 387 | * @dir contains the inode structure of parent of the directory to be removed. |
359 | * @dentry contains the dentry structure of directory to be removed. | 388 | * @dentry contains the dentry structure of directory to be removed. |
360 | * Return 0 if permission is granted. | 389 | * Return 0 if permission is granted. |
390 | * @path_rmdir: | ||
391 | * Check the permission to remove a directory. | ||
392 | * @dir contains the path structure of parent of the directory to be | ||
393 | * removed. | ||
394 | * @dentry contains the dentry structure of directory to be removed. | ||
395 | * Return 0 if permission is granted. | ||
361 | * @inode_mknod: | 396 | * @inode_mknod: |
362 | * Check permissions when creating a special file (or a socket or a fifo | 397 | * Check permissions when creating a special file (or a socket or a fifo |
363 | * file created via the mknod system call). Note that if mknod operation | 398 | * file created via the mknod system call). Note that if mknod operation |
@@ -368,6 +403,15 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
368 | * @mode contains the mode of the new file. | 403 | * @mode contains the mode of the new file. |
369 | * @dev contains the device number. | 404 | * @dev contains the device number. |
370 | * Return 0 if permission is granted. | 405 | * Return 0 if permission is granted. |
406 | * @path_mknod: | ||
407 | * Check permissions when creating a file. Note that this hook is called | ||
408 | * even if mknod operation is being done for a regular file. | ||
409 | * @dir contains the path structure of parent of the new file. | ||
410 | * @dentry contains the dentry structure of the new file. | ||
411 | * @mode contains the mode of the new file. | ||
412 | * @dev contains the undecoded device number. Use new_decode_dev() to get | ||
413 | * the decoded device number. | ||
414 | * Return 0 if permission is granted. | ||
371 | * @inode_rename: | 415 | * @inode_rename: |
372 | * Check for permission to rename a file or directory. | 416 | * Check for permission to rename a file or directory. |
373 | * @old_dir contains the inode structure for parent of the old link. | 417 | * @old_dir contains the inode structure for parent of the old link. |
@@ -375,6 +419,13 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
375 | * @new_dir contains the inode structure for parent of the new link. | 419 | * @new_dir contains the inode structure for parent of the new link. |
376 | * @new_dentry contains the dentry structure of the new link. | 420 | * @new_dentry contains the dentry structure of the new link. |
377 | * Return 0 if permission is granted. | 421 | * Return 0 if permission is granted. |
422 | * @path_rename: | ||
423 | * Check for permission to rename a file or directory. | ||
424 | * @old_dir contains the path structure for parent of the old link. | ||
425 | * @old_dentry contains the dentry structure of the old link. | ||
426 | * @new_dir contains the path structure for parent of the new link. | ||
427 | * @new_dentry contains the dentry structure of the new link. | ||
428 | * Return 0 if permission is granted. | ||
378 | * @inode_readlink: | 429 | * @inode_readlink: |
379 | * Check the permission to read the symbolic link. | 430 | * Check the permission to read the symbolic link. |
380 | * @dentry contains the dentry structure for the file link. | 431 | * @dentry contains the dentry structure for the file link. |
@@ -403,6 +454,12 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
403 | * @dentry contains the dentry structure for the file. | 454 | * @dentry contains the dentry structure for the file. |
404 | * @attr is the iattr structure containing the new file attributes. | 455 | * @attr is the iattr structure containing the new file attributes. |
405 | * Return 0 if permission is granted. | 456 | * Return 0 if permission is granted. |
457 | * @path_truncate: | ||
458 | * Check permission before truncating a file. | ||
459 | * @path contains the path structure for the file. | ||
460 | * @length is the new length of the file. | ||
461 | * @time_attrs is the flags passed to do_truncate(). | ||
462 | * Return 0 if permission is granted. | ||
406 | * @inode_getattr: | 463 | * @inode_getattr: |
407 | * Check permission before obtaining file attributes. | 464 | * Check permission before obtaining file attributes. |
408 | * @mnt is the vfsmount where the dentry was looked up | 465 | * @mnt is the vfsmount where the dentry was looked up |
@@ -1195,9 +1252,12 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
1195 | * @permitted contains the permitted capability set. | 1252 | * @permitted contains the permitted capability set. |
1196 | * Return 0 and update @new if permission is granted. | 1253 | * Return 0 and update @new if permission is granted. |
1197 | * @capable: | 1254 | * @capable: |
1198 | * Check whether the @tsk process has the @cap capability. | 1255 | * Check whether the @tsk process has the @cap capability in the indicated |
1256 | * credentials. | ||
1199 | * @tsk contains the task_struct for the process. | 1257 | * @tsk contains the task_struct for the process. |
1258 | * @cred contains the credentials to use. | ||
1200 | * @cap contains the capability <include/linux/capability.h>. | 1259 | * @cap contains the capability <include/linux/capability.h>. |
1260 | * @audit: Whether to write an audit message or not | ||
1201 | * Return 0 if the capability is granted for @tsk. | 1261 | * Return 0 if the capability is granted for @tsk. |
1202 | * @acct: | 1262 | * @acct: |
1203 | * Check permission before enabling or disabling process accounting. If | 1263 | * Check permission before enabling or disabling process accounting. If |
@@ -1290,7 +1350,8 @@ struct security_operations { | |||
1290 | const kernel_cap_t *effective, | 1350 | const kernel_cap_t *effective, |
1291 | const kernel_cap_t *inheritable, | 1351 | const kernel_cap_t *inheritable, |
1292 | const kernel_cap_t *permitted); | 1352 | const kernel_cap_t *permitted); |
1293 | int (*capable) (struct task_struct *tsk, int cap, int audit); | 1353 | int (*capable) (struct task_struct *tsk, const struct cred *cred, |
1354 | int cap, int audit); | ||
1294 | int (*acct) (struct file *file); | 1355 | int (*acct) (struct file *file); |
1295 | int (*sysctl) (struct ctl_table *table, int op); | 1356 | int (*sysctl) (struct ctl_table *table, int op); |
1296 | int (*quotactl) (int cmds, int type, int id, struct super_block *sb); | 1357 | int (*quotactl) (int cmds, int type, int id, struct super_block *sb); |
@@ -1331,6 +1392,22 @@ struct security_operations { | |||
1331 | struct super_block *newsb); | 1392 | struct super_block *newsb); |
1332 | int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts); | 1393 | int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts); |
1333 | 1394 | ||
1395 | #ifdef CONFIG_SECURITY_PATH | ||
1396 | int (*path_unlink) (struct path *dir, struct dentry *dentry); | ||
1397 | int (*path_mkdir) (struct path *dir, struct dentry *dentry, int mode); | ||
1398 | int (*path_rmdir) (struct path *dir, struct dentry *dentry); | ||
1399 | int (*path_mknod) (struct path *dir, struct dentry *dentry, int mode, | ||
1400 | unsigned int dev); | ||
1401 | int (*path_truncate) (struct path *path, loff_t length, | ||
1402 | unsigned int time_attrs); | ||
1403 | int (*path_symlink) (struct path *dir, struct dentry *dentry, | ||
1404 | const char *old_name); | ||
1405 | int (*path_link) (struct dentry *old_dentry, struct path *new_dir, | ||
1406 | struct dentry *new_dentry); | ||
1407 | int (*path_rename) (struct path *old_dir, struct dentry *old_dentry, | ||
1408 | struct path *new_dir, struct dentry *new_dentry); | ||
1409 | #endif | ||
1410 | |||
1334 | int (*inode_alloc_security) (struct inode *inode); | 1411 | int (*inode_alloc_security) (struct inode *inode); |
1335 | void (*inode_free_security) (struct inode *inode); | 1412 | void (*inode_free_security) (struct inode *inode); |
1336 | int (*inode_init_security) (struct inode *inode, struct inode *dir, | 1413 | int (*inode_init_security) (struct inode *inode, struct inode *dir, |
@@ -1556,8 +1633,9 @@ int security_capset(struct cred *new, const struct cred *old, | |||
1556 | const kernel_cap_t *effective, | 1633 | const kernel_cap_t *effective, |
1557 | const kernel_cap_t *inheritable, | 1634 | const kernel_cap_t *inheritable, |
1558 | const kernel_cap_t *permitted); | 1635 | const kernel_cap_t *permitted); |
1559 | int security_capable(struct task_struct *tsk, int cap); | 1636 | int security_capable(int cap); |
1560 | int security_capable_noaudit(struct task_struct *tsk, int cap); | 1637 | int security_real_capable(struct task_struct *tsk, int cap); |
1638 | int security_real_capable_noaudit(struct task_struct *tsk, int cap); | ||
1561 | int security_acct(struct file *file); | 1639 | int security_acct(struct file *file); |
1562 | int security_sysctl(struct ctl_table *table, int op); | 1640 | int security_sysctl(struct ctl_table *table, int op); |
1563 | int security_quotactl(int cmds, int type, int id, struct super_block *sb); | 1641 | int security_quotactl(int cmds, int type, int id, struct super_block *sb); |
@@ -1754,14 +1832,31 @@ static inline int security_capset(struct cred *new, | |||
1754 | return cap_capset(new, old, effective, inheritable, permitted); | 1832 | return cap_capset(new, old, effective, inheritable, permitted); |
1755 | } | 1833 | } |
1756 | 1834 | ||
1757 | static inline int security_capable(struct task_struct *tsk, int cap) | 1835 | static inline int security_capable(int cap) |
1836 | { | ||
1837 | return cap_capable(current, current_cred(), cap, SECURITY_CAP_AUDIT); | ||
1838 | } | ||
1839 | |||
1840 | static inline int security_real_capable(struct task_struct *tsk, int cap) | ||
1758 | { | 1841 | { |
1759 | return cap_capable(tsk, cap, SECURITY_CAP_AUDIT); | 1842 | int ret; |
1843 | |||
1844 | rcu_read_lock(); | ||
1845 | ret = cap_capable(tsk, __task_cred(tsk), cap, SECURITY_CAP_AUDIT); | ||
1846 | rcu_read_unlock(); | ||
1847 | return ret; | ||
1760 | } | 1848 | } |
1761 | 1849 | ||
1762 | static inline int security_capable_noaudit(struct task_struct *tsk, int cap) | 1850 | static inline |
1851 | int security_real_capable_noaudit(struct task_struct *tsk, int cap) | ||
1763 | { | 1852 | { |
1764 | return cap_capable(tsk, cap, SECURITY_CAP_NOAUDIT); | 1853 | int ret; |
1854 | |||
1855 | rcu_read_lock(); | ||
1856 | ret = cap_capable(tsk, __task_cred(tsk), cap, | ||
1857 | SECURITY_CAP_NOAUDIT); | ||
1858 | rcu_read_unlock(); | ||
1859 | return ret; | ||
1765 | } | 1860 | } |
1766 | 1861 | ||
1767 | static inline int security_acct(struct file *file) | 1862 | static inline int security_acct(struct file *file) |
@@ -2705,6 +2800,71 @@ static inline void security_skb_classify_flow(struct sk_buff *skb, struct flowi | |||
2705 | 2800 | ||
2706 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ | 2801 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ |
2707 | 2802 | ||
2803 | #ifdef CONFIG_SECURITY_PATH | ||
2804 | int security_path_unlink(struct path *dir, struct dentry *dentry); | ||
2805 | int security_path_mkdir(struct path *dir, struct dentry *dentry, int mode); | ||
2806 | int security_path_rmdir(struct path *dir, struct dentry *dentry); | ||
2807 | int security_path_mknod(struct path *dir, struct dentry *dentry, int mode, | ||
2808 | unsigned int dev); | ||
2809 | int security_path_truncate(struct path *path, loff_t length, | ||
2810 | unsigned int time_attrs); | ||
2811 | int security_path_symlink(struct path *dir, struct dentry *dentry, | ||
2812 | const char *old_name); | ||
2813 | int security_path_link(struct dentry *old_dentry, struct path *new_dir, | ||
2814 | struct dentry *new_dentry); | ||
2815 | int security_path_rename(struct path *old_dir, struct dentry *old_dentry, | ||
2816 | struct path *new_dir, struct dentry *new_dentry); | ||
2817 | #else /* CONFIG_SECURITY_PATH */ | ||
2818 | static inline int security_path_unlink(struct path *dir, struct dentry *dentry) | ||
2819 | { | ||
2820 | return 0; | ||
2821 | } | ||
2822 | |||
2823 | static inline int security_path_mkdir(struct path *dir, struct dentry *dentry, | ||
2824 | int mode) | ||
2825 | { | ||
2826 | return 0; | ||
2827 | } | ||
2828 | |||
2829 | static inline int security_path_rmdir(struct path *dir, struct dentry *dentry) | ||
2830 | { | ||
2831 | return 0; | ||
2832 | } | ||
2833 | |||
2834 | static inline int security_path_mknod(struct path *dir, struct dentry *dentry, | ||
2835 | int mode, unsigned int dev) | ||
2836 | { | ||
2837 | return 0; | ||
2838 | } | ||
2839 | |||
2840 | static inline int security_path_truncate(struct path *path, loff_t length, | ||
2841 | unsigned int time_attrs) | ||
2842 | { | ||
2843 | return 0; | ||
2844 | } | ||
2845 | |||
2846 | static inline int security_path_symlink(struct path *dir, struct dentry *dentry, | ||
2847 | const char *old_name) | ||
2848 | { | ||
2849 | return 0; | ||
2850 | } | ||
2851 | |||
2852 | static inline int security_path_link(struct dentry *old_dentry, | ||
2853 | struct path *new_dir, | ||
2854 | struct dentry *new_dentry) | ||
2855 | { | ||
2856 | return 0; | ||
2857 | } | ||
2858 | |||
2859 | static inline int security_path_rename(struct path *old_dir, | ||
2860 | struct dentry *old_dentry, | ||
2861 | struct path *new_dir, | ||
2862 | struct dentry *new_dentry) | ||
2863 | { | ||
2864 | return 0; | ||
2865 | } | ||
2866 | #endif /* CONFIG_SECURITY_PATH */ | ||
2867 | |||
2708 | #ifdef CONFIG_KEYS | 2868 | #ifdef CONFIG_KEYS |
2709 | #ifdef CONFIG_SECURITY | 2869 | #ifdef CONFIG_SECURITY |
2710 | 2870 | ||
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index b3dfa72f13b9..40ea5058c2ec 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h | |||
@@ -50,10 +50,11 @@ int seq_path(struct seq_file *, struct path *, char *); | |||
50 | int seq_dentry(struct seq_file *, struct dentry *, char *); | 50 | int seq_dentry(struct seq_file *, struct dentry *, char *); |
51 | int seq_path_root(struct seq_file *m, struct path *path, struct path *root, | 51 | int seq_path_root(struct seq_file *m, struct path *path, struct path *root, |
52 | char *esc); | 52 | char *esc); |
53 | int seq_bitmap(struct seq_file *m, unsigned long *bits, unsigned int nr_bits); | 53 | int seq_bitmap(struct seq_file *m, const unsigned long *bits, |
54 | static inline int seq_cpumask(struct seq_file *m, cpumask_t *mask) | 54 | unsigned int nr_bits); |
55 | static inline int seq_cpumask(struct seq_file *m, const struct cpumask *mask) | ||
55 | { | 56 | { |
56 | return seq_bitmap(m, mask->bits, NR_CPUS); | 57 | return seq_bitmap(m, mask->bits, nr_cpu_ids); |
57 | } | 58 | } |
58 | 59 | ||
59 | static inline int seq_nodemask(struct seq_file *m, nodemask_t *mask) | 60 | static inline int seq_nodemask(struct seq_file *m, nodemask_t *mask) |
diff --git a/include/linux/serial.h b/include/linux/serial.h index 1ea8d9265bf6..9136cc5608c3 100644 --- a/include/linux/serial.h +++ b/include/linux/serial.h | |||
@@ -10,8 +10,9 @@ | |||
10 | #ifndef _LINUX_SERIAL_H | 10 | #ifndef _LINUX_SERIAL_H |
11 | #define _LINUX_SERIAL_H | 11 | #define _LINUX_SERIAL_H |
12 | 12 | ||
13 | #ifdef __KERNEL__ | ||
14 | #include <linux/types.h> | 13 | #include <linux/types.h> |
14 | |||
15 | #ifdef __KERNEL__ | ||
15 | #include <asm/page.h> | 16 | #include <asm/page.h> |
16 | 17 | ||
17 | /* | 18 | /* |
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 3d37c94abbc8..d4d2a78ad43e 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
@@ -28,6 +28,9 @@ struct plat_serial8250_port { | |||
28 | unsigned char iotype; /* UPIO_* */ | 28 | unsigned char iotype; /* UPIO_* */ |
29 | unsigned char hub6; | 29 | unsigned char hub6; |
30 | upf_t flags; /* UPF_* flags */ | 30 | upf_t flags; /* UPF_* flags */ |
31 | unsigned int type; /* If UPF_FIXED_TYPE */ | ||
32 | unsigned int (*serial_in)(struct uart_port *, int); | ||
33 | void (*serial_out)(struct uart_port *, int, int); | ||
31 | }; | 34 | }; |
32 | 35 | ||
33 | /* | 36 | /* |
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 4e4f1277f3bf..90bbbf0b1161 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
@@ -40,7 +40,8 @@ | |||
40 | #define PORT_NS16550A 14 | 40 | #define PORT_NS16550A 14 |
41 | #define PORT_XSCALE 15 | 41 | #define PORT_XSCALE 15 |
42 | #define PORT_RM9000 16 /* PMC-Sierra RM9xxx internal UART */ | 42 | #define PORT_RM9000 16 /* PMC-Sierra RM9xxx internal UART */ |
43 | #define PORT_MAX_8250 16 /* max port ID */ | 43 | #define PORT_OCTEON 17 /* Cavium OCTEON internal UART */ |
44 | #define PORT_MAX_8250 17 /* max port ID */ | ||
44 | 45 | ||
45 | /* | 46 | /* |
46 | * ARM specific type numbers. These are not currently guaranteed | 47 | * ARM specific type numbers. These are not currently guaranteed |
@@ -158,6 +159,11 @@ | |||
158 | /* SH-SCI */ | 159 | /* SH-SCI */ |
159 | #define PORT_SCIFA 83 | 160 | #define PORT_SCIFA 83 |
160 | 161 | ||
162 | #define PORT_S3C6400 84 | ||
163 | |||
164 | /* NWPSERIAL */ | ||
165 | #define PORT_NWPSERIAL 85 | ||
166 | |||
161 | #ifdef __KERNEL__ | 167 | #ifdef __KERNEL__ |
162 | 168 | ||
163 | #include <linux/compiler.h> | 169 | #include <linux/compiler.h> |
@@ -246,6 +252,8 @@ struct uart_port { | |||
246 | spinlock_t lock; /* port lock */ | 252 | spinlock_t lock; /* port lock */ |
247 | unsigned long iobase; /* in/out[bwl] */ | 253 | unsigned long iobase; /* in/out[bwl] */ |
248 | unsigned char __iomem *membase; /* read/write[bwl] */ | 254 | unsigned char __iomem *membase; /* read/write[bwl] */ |
255 | unsigned int (*serial_in)(struct uart_port *, int); | ||
256 | void (*serial_out)(struct uart_port *, int, int); | ||
249 | unsigned int irq; /* irq number */ | 257 | unsigned int irq; /* irq number */ |
250 | unsigned int uartclk; /* base uart clock */ | 258 | unsigned int uartclk; /* base uart clock */ |
251 | unsigned int fifosize; /* tx fifo size */ | 259 | unsigned int fifosize; /* tx fifo size */ |
@@ -291,6 +299,8 @@ struct uart_port { | |||
291 | #define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16)) | 299 | #define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16)) |
292 | #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) | 300 | #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) |
293 | #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) | 301 | #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) |
302 | /* The exact UART type is known and should not be probed. */ | ||
303 | #define UPF_FIXED_TYPE ((__force upf_t) (1 << 27)) | ||
294 | #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) | 304 | #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) |
295 | #define UPF_FIXED_PORT ((__force upf_t) (1 << 29)) | 305 | #define UPF_FIXED_PORT ((__force upf_t) (1 << 29)) |
296 | #define UPF_DEAD ((__force upf_t) (1 << 30)) | 306 | #define UPF_DEAD ((__force upf_t) (1 << 30)) |
@@ -314,35 +324,13 @@ struct uart_port { | |||
314 | }; | 324 | }; |
315 | 325 | ||
316 | /* | 326 | /* |
317 | * This is the state information which is persistent across opens. | ||
318 | * The low level driver must not to touch any elements contained | ||
319 | * within. | ||
320 | */ | ||
321 | struct uart_state { | ||
322 | unsigned int close_delay; /* msec */ | ||
323 | unsigned int closing_wait; /* msec */ | ||
324 | |||
325 | #define USF_CLOSING_WAIT_INF (0) | ||
326 | #define USF_CLOSING_WAIT_NONE (~0U) | ||
327 | |||
328 | int count; | ||
329 | int pm_state; | ||
330 | struct uart_info *info; | ||
331 | struct uart_port *port; | ||
332 | |||
333 | struct mutex mutex; | ||
334 | }; | ||
335 | |||
336 | #define UART_XMIT_SIZE PAGE_SIZE | ||
337 | |||
338 | typedef unsigned int __bitwise__ uif_t; | ||
339 | |||
340 | /* | ||
341 | * This is the state information which is only valid when the port | 327 | * This is the state information which is only valid when the port |
342 | * is open; it may be freed by the core driver once the device has | 328 | * is open; it may be cleared the core driver once the device has |
343 | * been closed. Either the low level driver or the core can modify | 329 | * been closed. Either the low level driver or the core can modify |
344 | * stuff here. | 330 | * stuff here. |
345 | */ | 331 | */ |
332 | typedef unsigned int __bitwise__ uif_t; | ||
333 | |||
346 | struct uart_info { | 334 | struct uart_info { |
347 | struct tty_port port; | 335 | struct tty_port port; |
348 | struct circ_buf xmit; | 336 | struct circ_buf xmit; |
@@ -364,6 +352,29 @@ struct uart_info { | |||
364 | wait_queue_head_t delta_msr_wait; | 352 | wait_queue_head_t delta_msr_wait; |
365 | }; | 353 | }; |
366 | 354 | ||
355 | /* | ||
356 | * This is the state information which is persistent across opens. | ||
357 | * The low level driver must not to touch any elements contained | ||
358 | * within. | ||
359 | */ | ||
360 | struct uart_state { | ||
361 | unsigned int close_delay; /* msec */ | ||
362 | unsigned int closing_wait; /* msec */ | ||
363 | |||
364 | #define USF_CLOSING_WAIT_INF (0) | ||
365 | #define USF_CLOSING_WAIT_NONE (~0U) | ||
366 | |||
367 | int count; | ||
368 | int pm_state; | ||
369 | struct uart_info info; | ||
370 | struct uart_port *port; | ||
371 | |||
372 | struct mutex mutex; | ||
373 | }; | ||
374 | |||
375 | #define UART_XMIT_SIZE PAGE_SIZE | ||
376 | |||
377 | |||
367 | /* number of characters left in xmit buffer before we ask for more */ | 378 | /* number of characters left in xmit buffer before we ask for more */ |
368 | #define WAKEUP_CHARS 256 | 379 | #define WAKEUP_CHARS 256 |
369 | 380 | ||
@@ -437,8 +448,13 @@ int uart_resume_port(struct uart_driver *reg, struct uart_port *port); | |||
437 | #define uart_circ_chars_free(circ) \ | 448 | #define uart_circ_chars_free(circ) \ |
438 | (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE)) | 449 | (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE)) |
439 | 450 | ||
440 | #define uart_tx_stopped(portp) \ | 451 | static inline int uart_tx_stopped(struct uart_port *port) |
441 | ((portp)->info->port.tty->stopped || (portp)->info->port.tty->hw_stopped) | 452 | { |
453 | struct tty_struct *tty = port->info->port.tty; | ||
454 | if(tty->stopped || tty->hw_stopped) | ||
455 | return 1; | ||
456 | return 0; | ||
457 | } | ||
442 | 458 | ||
443 | /* | 459 | /* |
444 | * The following are helper functions for the low level drivers. | 460 | * The following are helper functions for the low level drivers. |
@@ -449,7 +465,7 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) | |||
449 | #ifdef SUPPORT_SYSRQ | 465 | #ifdef SUPPORT_SYSRQ |
450 | if (port->sysrq) { | 466 | if (port->sysrq) { |
451 | if (ch && time_before(jiffies, port->sysrq)) { | 467 | if (ch && time_before(jiffies, port->sysrq)) { |
452 | handle_sysrq(ch, port->info ? port->info->port.tty : NULL); | 468 | handle_sysrq(ch, port->info->port.tty); |
453 | port->sysrq = 0; | 469 | port->sysrq = 0; |
454 | return 1; | 470 | return 1; |
455 | } | 471 | } |
diff --git a/include/linux/serio.h b/include/linux/serio.h index 25641d9e0ea8..1bcb357a01a1 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
@@ -213,5 +213,6 @@ static inline void serio_unpin_driver(struct serio *serio) | |||
213 | #define SERIO_ZHENHUA 0x36 | 213 | #define SERIO_ZHENHUA 0x36 |
214 | #define SERIO_INEXIO 0x37 | 214 | #define SERIO_INEXIO 0x37 |
215 | #define SERIO_TOUCHIT213 0x37 | 215 | #define SERIO_TOUCHIT213 0x37 |
216 | #define SERIO_W8001 0x39 | ||
216 | 217 | ||
217 | #endif | 218 | #endif |
diff --git a/include/linux/slab.h b/include/linux/slab.h index 000da12b5cf0..f96d13c281e8 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -253,9 +253,9 @@ static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep, | |||
253 | * request comes from. | 253 | * request comes from. |
254 | */ | 254 | */ |
255 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) | 255 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) |
256 | extern void *__kmalloc_track_caller(size_t, gfp_t, void*); | 256 | extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long); |
257 | #define kmalloc_track_caller(size, flags) \ | 257 | #define kmalloc_track_caller(size, flags) \ |
258 | __kmalloc_track_caller(size, flags, __builtin_return_address(0)) | 258 | __kmalloc_track_caller(size, flags, _RET_IP_) |
259 | #else | 259 | #else |
260 | #define kmalloc_track_caller(size, flags) \ | 260 | #define kmalloc_track_caller(size, flags) \ |
261 | __kmalloc(size, flags) | 261 | __kmalloc(size, flags) |
@@ -271,10 +271,10 @@ extern void *__kmalloc_track_caller(size_t, gfp_t, void*); | |||
271 | * allocation request comes from. | 271 | * allocation request comes from. |
272 | */ | 272 | */ |
273 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) | 273 | #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) |
274 | extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, void *); | 274 | extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long); |
275 | #define kmalloc_node_track_caller(size, flags, node) \ | 275 | #define kmalloc_node_track_caller(size, flags, node) \ |
276 | __kmalloc_node_track_caller(size, flags, node, \ | 276 | __kmalloc_node_track_caller(size, flags, node, \ |
277 | __builtin_return_address(0)) | 277 | _RET_IP_) |
278 | #else | 278 | #else |
279 | #define kmalloc_node_track_caller(size, flags, node) \ | 279 | #define kmalloc_node_track_caller(size, flags, node) \ |
280 | __kmalloc_node(size, flags, node) | 280 | __kmalloc_node(size, flags, node) |
@@ -285,7 +285,7 @@ extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, void *); | |||
285 | #define kmalloc_node_track_caller(size, flags, node) \ | 285 | #define kmalloc_node_track_caller(size, flags, node) \ |
286 | kmalloc_track_caller(size, flags) | 286 | kmalloc_track_caller(size, flags) |
287 | 287 | ||
288 | #endif /* DEBUG_SLAB */ | 288 | #endif /* CONFIG_NUMA */ |
289 | 289 | ||
290 | /* | 290 | /* |
291 | * Shortcuts | 291 | * Shortcuts |
diff --git a/include/linux/smp.h b/include/linux/smp.h index 6e7ba16ff454..b82466968101 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
@@ -21,6 +21,9 @@ struct call_single_data { | |||
21 | u16 priv; | 21 | u16 priv; |
22 | }; | 22 | }; |
23 | 23 | ||
24 | /* total number of cpus in this system (may exceed NR_CPUS) */ | ||
25 | extern unsigned int total_cpus; | ||
26 | |||
24 | #ifdef CONFIG_SMP | 27 | #ifdef CONFIG_SMP |
25 | 28 | ||
26 | #include <linux/preempt.h> | 29 | #include <linux/preempt.h> |
@@ -64,15 +67,16 @@ extern void smp_cpus_done(unsigned int max_cpus); | |||
64 | * Call a function on all other processors | 67 | * Call a function on all other processors |
65 | */ | 68 | */ |
66 | int smp_call_function(void(*func)(void *info), void *info, int wait); | 69 | int smp_call_function(void(*func)(void *info), void *info, int wait); |
67 | /* Deprecated: use smp_call_function_many() which uses a cpumask ptr. */ | 70 | void smp_call_function_many(const struct cpumask *mask, |
68 | int smp_call_function_mask(cpumask_t mask, void(*func)(void *info), void *info, | 71 | void (*func)(void *info), void *info, bool wait); |
69 | int wait); | ||
70 | 72 | ||
71 | static inline void smp_call_function_many(const struct cpumask *mask, | 73 | /* Deprecated: Use smp_call_function_many which takes a pointer to the mask. */ |
72 | void (*func)(void *info), void *info, | 74 | static inline int |
73 | int wait) | 75 | smp_call_function_mask(cpumask_t mask, void(*func)(void *info), void *info, |
76 | int wait) | ||
74 | { | 77 | { |
75 | smp_call_function_mask(*mask, func, info, wait); | 78 | smp_call_function_many(&mask, func, info, wait); |
79 | return 0; | ||
76 | } | 80 | } |
77 | 81 | ||
78 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, | 82 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, |
diff --git a/include/linux/spi/mmc_spi.h b/include/linux/spi/mmc_spi.h index a3626aedaec9..0f4eb165f254 100644 --- a/include/linux/spi/mmc_spi.h +++ b/include/linux/spi/mmc_spi.h | |||
@@ -1,9 +1,10 @@ | |||
1 | #ifndef __LINUX_SPI_MMC_SPI_H | 1 | #ifndef __LINUX_SPI_MMC_SPI_H |
2 | #define __LINUX_SPI_MMC_SPI_H | 2 | #define __LINUX_SPI_MMC_SPI_H |
3 | 3 | ||
4 | #include <linux/device.h> | ||
5 | #include <linux/spi/spi.h> | ||
4 | #include <linux/interrupt.h> | 6 | #include <linux/interrupt.h> |
5 | 7 | ||
6 | struct device; | ||
7 | struct mmc_host; | 8 | struct mmc_host; |
8 | 9 | ||
9 | /* Put this in platform_data of a device being used to manage an MMC/SD | 10 | /* Put this in platform_data of a device being used to manage an MMC/SD |
@@ -41,4 +42,16 @@ struct mmc_spi_platform_data { | |||
41 | void (*setpower)(struct device *, unsigned int maskval); | 42 | void (*setpower)(struct device *, unsigned int maskval); |
42 | }; | 43 | }; |
43 | 44 | ||
45 | #ifdef CONFIG_OF | ||
46 | extern struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi); | ||
47 | extern void mmc_spi_put_pdata(struct spi_device *spi); | ||
48 | #else | ||
49 | static inline struct mmc_spi_platform_data * | ||
50 | mmc_spi_get_pdata(struct spi_device *spi) | ||
51 | { | ||
52 | return spi->dev.platform_data; | ||
53 | } | ||
54 | static inline void mmc_spi_put_pdata(struct spi_device *spi) {} | ||
55 | #endif /* CONFIG_OF */ | ||
56 | |||
44 | #endif /* __LINUX_SPI_MMC_SPI_H */ | 57 | #endif /* __LINUX_SPI_MMC_SPI_H */ |
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 4be01bb44377..68bb1c501d0d 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -19,6 +19,8 @@ | |||
19 | #ifndef __LINUX_SPI_H | 19 | #ifndef __LINUX_SPI_H |
20 | #define __LINUX_SPI_H | 20 | #define __LINUX_SPI_H |
21 | 21 | ||
22 | #include <linux/device.h> | ||
23 | |||
22 | /* | 24 | /* |
23 | * INTERFACES between SPI master-side drivers and SPI infrastructure. | 25 | * INTERFACES between SPI master-side drivers and SPI infrastructure. |
24 | * (There's no SPI slave support for Linux yet...) | 26 | * (There's no SPI slave support for Linux yet...) |
@@ -325,9 +327,9 @@ extern struct spi_master *spi_busnum_to_master(u16 busnum); | |||
325 | * @tx_dma: DMA address of tx_buf, if @spi_message.is_dma_mapped | 327 | * @tx_dma: DMA address of tx_buf, if @spi_message.is_dma_mapped |
326 | * @rx_dma: DMA address of rx_buf, if @spi_message.is_dma_mapped | 328 | * @rx_dma: DMA address of rx_buf, if @spi_message.is_dma_mapped |
327 | * @len: size of rx and tx buffers (in bytes) | 329 | * @len: size of rx and tx buffers (in bytes) |
328 | * @speed_hz: Select a speed other then the device default for this | 330 | * @speed_hz: Select a speed other than the device default for this |
329 | * transfer. If 0 the default (from @spi_device) is used. | 331 | * transfer. If 0 the default (from @spi_device) is used. |
330 | * @bits_per_word: select a bits_per_word other then the device default | 332 | * @bits_per_word: select a bits_per_word other than the device default |
331 | * for this transfer. If 0 the default (from @spi_device) is used. | 333 | * for this transfer. If 0 the default (from @spi_device) is used. |
332 | * @cs_change: affects chipselect after this transfer completes | 334 | * @cs_change: affects chipselect after this transfer completes |
333 | * @delay_usecs: microseconds to delay after this transfer before | 335 | * @delay_usecs: microseconds to delay after this transfer before |
diff --git a/include/linux/spi/spi_gpio.h b/include/linux/spi/spi_gpio.h new file mode 100644 index 000000000000..0f01a0f1f40c --- /dev/null +++ b/include/linux/spi/spi_gpio.h | |||
@@ -0,0 +1,60 @@ | |||
1 | #ifndef __LINUX_SPI_GPIO_H | ||
2 | #define __LINUX_SPI_GPIO_H | ||
3 | |||
4 | /* | ||
5 | * For each bitbanged SPI bus, set up a platform_device node with: | ||
6 | * - name "spi_gpio" | ||
7 | * - id the same as the SPI bus number it implements | ||
8 | * - dev.platform data pointing to a struct spi_gpio_platform_data | ||
9 | * | ||
10 | * Or, see the driver code for information about speedups that are | ||
11 | * possible on platforms that support inlined access for GPIOs (no | ||
12 | * spi_gpio_platform_data is used). | ||
13 | * | ||
14 | * Use spi_board_info with these busses in the usual way, being sure | ||
15 | * that the controller_data being the GPIO used for each device's | ||
16 | * chipselect: | ||
17 | * | ||
18 | * static struct spi_board_info ... [] = { | ||
19 | * ... | ||
20 | * // this slave uses GPIO 42 for its chipselect | ||
21 | * .controller_data = (void *) 42, | ||
22 | * ... | ||
23 | * // this one uses GPIO 86 for its chipselect | ||
24 | * .controller_data = (void *) 86, | ||
25 | * ... | ||
26 | * }; | ||
27 | * | ||
28 | * If the bitbanged bus is later switched to a "native" controller, | ||
29 | * that platform_device and controller_data should be removed. | ||
30 | */ | ||
31 | |||
32 | /** | ||
33 | * struct spi_gpio_platform_data - parameter for bitbanged SPI master | ||
34 | * @sck: number of the GPIO used for clock output | ||
35 | * @mosi: number of the GPIO used for Master Output, Slave In (MOSI) data | ||
36 | * @miso: number of the GPIO used for Master Input, Slave Output (MISO) data | ||
37 | * @num_chipselect: how many slaves to allow | ||
38 | * | ||
39 | * All GPIO signals used with the SPI bus managed through this driver | ||
40 | * (chipselects, MOSI, MISO, SCK) must be configured as GPIOs, instead | ||
41 | * of some alternate function. | ||
42 | * | ||
43 | * It can be convenient to use this driver with pins that have alternate | ||
44 | * functions associated with a "native" SPI controller if a driver for that | ||
45 | * controller is not available, or is missing important functionality. | ||
46 | * | ||
47 | * On platforms which can do so, configure MISO with a weak pullup unless | ||
48 | * there's an external pullup on that signal. That saves power by avoiding | ||
49 | * floating signals. (A weak pulldown would save power too, but many | ||
50 | * drivers expect to see all-ones data as the no slave "response".) | ||
51 | */ | ||
52 | struct spi_gpio_platform_data { | ||
53 | unsigned sck; | ||
54 | unsigned mosi; | ||
55 | unsigned miso; | ||
56 | |||
57 | u16 num_chipselect; | ||
58 | }; | ||
59 | |||
60 | #endif /* __LINUX_SPI_GPIO_H */ | ||
diff --git a/include/linux/spi/tdo24m.h b/include/linux/spi/tdo24m.h new file mode 100644 index 000000000000..7572d4e1fe76 --- /dev/null +++ b/include/linux/spi/tdo24m.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef __TDO24M_H__ | ||
2 | #define __TDO24M_H__ | ||
3 | |||
4 | enum tdo24m_model { | ||
5 | TDO24M, | ||
6 | TDO35S, | ||
7 | }; | ||
8 | |||
9 | struct tdo24m_platform_data { | ||
10 | enum tdo24m_model model; | ||
11 | }; | ||
12 | |||
13 | #endif /* __TDO24M_H__ */ | ||
diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h index faf1519b5adc..baba3a23a814 100644 --- a/include/linux/stop_machine.h +++ b/include/linux/stop_machine.h | |||
@@ -23,7 +23,7 @@ | |||
23 | * | 23 | * |
24 | * This can be thought of as a very heavy write lock, equivalent to | 24 | * This can be thought of as a very heavy write lock, equivalent to |
25 | * grabbing every spinlock in the kernel. */ | 25 | * grabbing every spinlock in the kernel. */ |
26 | int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); | 26 | int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); |
27 | 27 | ||
28 | /** | 28 | /** |
29 | * __stop_machine: freeze the machine on all CPUs and run this function | 29 | * __stop_machine: freeze the machine on all CPUs and run this function |
@@ -34,11 +34,29 @@ int stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); | |||
34 | * Description: This is a special version of the above, which assumes cpus | 34 | * Description: This is a special version of the above, which assumes cpus |
35 | * won't come or go while it's being called. Used by hotplug cpu. | 35 | * won't come or go while it's being called. Used by hotplug cpu. |
36 | */ | 36 | */ |
37 | int __stop_machine(int (*fn)(void *), void *data, const cpumask_t *cpus); | 37 | int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus); |
38 | |||
39 | /** | ||
40 | * stop_machine_create: create all stop_machine threads | ||
41 | * | ||
42 | * Description: This causes all stop_machine threads to be created before | ||
43 | * stop_machine actually gets called. This can be used by subsystems that | ||
44 | * need a non failing stop_machine infrastructure. | ||
45 | */ | ||
46 | int stop_machine_create(void); | ||
47 | |||
48 | /** | ||
49 | * stop_machine_destroy: destroy all stop_machine threads | ||
50 | * | ||
51 | * Description: This causes all stop_machine threads which were created with | ||
52 | * stop_machine_create to be destroyed again. | ||
53 | */ | ||
54 | void stop_machine_destroy(void); | ||
55 | |||
38 | #else | 56 | #else |
39 | 57 | ||
40 | static inline int stop_machine(int (*fn)(void *), void *data, | 58 | static inline int stop_machine(int (*fn)(void *), void *data, |
41 | const cpumask_t *cpus) | 59 | const struct cpumask *cpus) |
42 | { | 60 | { |
43 | int ret; | 61 | int ret; |
44 | local_irq_disable(); | 62 | local_irq_disable(); |
@@ -46,5 +64,9 @@ static inline int stop_machine(int (*fn)(void *), void *data, | |||
46 | local_irq_enable(); | 64 | local_irq_enable(); |
47 | return ret; | 65 | return ret; |
48 | } | 66 | } |
67 | |||
68 | static inline int stop_machine_create(void) { return 0; } | ||
69 | static inline void stop_machine_destroy(void) { } | ||
70 | |||
49 | #endif /* CONFIG_SMP */ | 71 | #endif /* CONFIG_SMP */ |
50 | #endif /* _LINUX_STOP_MACHINE */ | 72 | #endif /* _LINUX_STOP_MACHINE */ |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 6f0ee1b84a4f..c39a21040dcb 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -58,6 +58,7 @@ struct rpc_clnt { | |||
58 | struct rpc_timeout cl_timeout_default; | 58 | struct rpc_timeout cl_timeout_default; |
59 | struct rpc_program * cl_program; | 59 | struct rpc_program * cl_program; |
60 | char cl_inline_name[32]; | 60 | char cl_inline_name[32]; |
61 | char *cl_principal; /* target to authenticate to */ | ||
61 | }; | 62 | }; |
62 | 63 | ||
63 | /* | 64 | /* |
@@ -108,6 +109,7 @@ struct rpc_create_args { | |||
108 | u32 version; | 109 | u32 version; |
109 | rpc_authflavor_t authflavor; | 110 | rpc_authflavor_t authflavor; |
110 | unsigned long flags; | 111 | unsigned long flags; |
112 | char *client_name; | ||
111 | }; | 113 | }; |
112 | 114 | ||
113 | /* Values for "flags" field */ | 115 | /* Values for "flags" field */ |
diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index 51b977a4ca20..cea764c2359f 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h | |||
@@ -15,6 +15,7 @@ struct rpc_pipe_ops { | |||
15 | ssize_t (*upcall)(struct file *, struct rpc_pipe_msg *, char __user *, size_t); | 15 | ssize_t (*upcall)(struct file *, struct rpc_pipe_msg *, char __user *, size_t); |
16 | ssize_t (*downcall)(struct file *, const char __user *, size_t); | 16 | ssize_t (*downcall)(struct file *, const char __user *, size_t); |
17 | void (*release_pipe)(struct inode *); | 17 | void (*release_pipe)(struct inode *); |
18 | int (*open_pipe)(struct inode *); | ||
18 | void (*destroy_msg)(struct rpc_pipe_msg *); | 19 | void (*destroy_msg)(struct rpc_pipe_msg *); |
19 | }; | 20 | }; |
20 | 21 | ||
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 3afe7fb403b2..3435d24bfe55 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h | |||
@@ -58,10 +58,13 @@ struct svc_serv { | |||
58 | struct svc_stat * sv_stats; /* RPC statistics */ | 58 | struct svc_stat * sv_stats; /* RPC statistics */ |
59 | spinlock_t sv_lock; | 59 | spinlock_t sv_lock; |
60 | unsigned int sv_nrthreads; /* # of server threads */ | 60 | unsigned int sv_nrthreads; /* # of server threads */ |
61 | unsigned int sv_maxconn; /* max connections allowed or | ||
62 | * '0' causing max to be based | ||
63 | * on number of threads. */ | ||
64 | |||
61 | unsigned int sv_max_payload; /* datagram payload size */ | 65 | unsigned int sv_max_payload; /* datagram payload size */ |
62 | unsigned int sv_max_mesg; /* max_payload + 1 page for overheads */ | 66 | unsigned int sv_max_mesg; /* max_payload + 1 page for overheads */ |
63 | unsigned int sv_xdrsize; /* XDR buffer size */ | 67 | unsigned int sv_xdrsize; /* XDR buffer size */ |
64 | |||
65 | struct list_head sv_permsocks; /* all permanent sockets */ | 68 | struct list_head sv_permsocks; /* all permanent sockets */ |
66 | struct list_head sv_tempsocks; /* all temporary sockets */ | 69 | struct list_head sv_tempsocks; /* all temporary sockets */ |
67 | int sv_tmpcnt; /* count of temporary sockets */ | 70 | int sv_tmpcnt; /* count of temporary sockets */ |
diff --git a/include/linux/sunrpc/svcauth_gss.h b/include/linux/sunrpc/svcauth_gss.h index c9165d9771a8..ca7d725861fc 100644 --- a/include/linux/sunrpc/svcauth_gss.h +++ b/include/linux/sunrpc/svcauth_gss.h | |||
@@ -20,6 +20,7 @@ int gss_svc_init(void); | |||
20 | void gss_svc_shutdown(void); | 20 | void gss_svc_shutdown(void); |
21 | int svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name); | 21 | int svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name); |
22 | u32 svcauth_gss_flavor(struct auth_domain *dom); | 22 | u32 svcauth_gss_flavor(struct auth_domain *dom); |
23 | char *svc_gss_principal(struct svc_rqst *); | ||
23 | 24 | ||
24 | #endif /* __KERNEL__ */ | 25 | #endif /* __KERNEL__ */ |
25 | #endif /* _LINUX_SUNRPC_SVCAUTH_GSS_H */ | 26 | #endif /* _LINUX_SUNRPC_SVCAUTH_GSS_H */ |
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index e4057d729f03..49e1eb454465 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h | |||
@@ -37,21 +37,6 @@ struct xdr_netobj { | |||
37 | typedef int (*kxdrproc_t)(void *rqstp, __be32 *data, void *obj); | 37 | typedef int (*kxdrproc_t)(void *rqstp, __be32 *data, void *obj); |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * We're still requiring the BKL in the xdr code until it's been | ||
41 | * more carefully audited, at which point this wrapper will become | ||
42 | * unnecessary. | ||
43 | */ | ||
44 | static inline int rpc_call_xdrproc(kxdrproc_t xdrproc, void *rqstp, __be32 *data, void *obj) | ||
45 | { | ||
46 | int ret; | ||
47 | |||
48 | lock_kernel(); | ||
49 | ret = xdrproc(rqstp, data, obj); | ||
50 | unlock_kernel(); | ||
51 | return ret; | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * Basic structure for transmission/reception of a client XDR message. | 40 | * Basic structure for transmission/reception of a client XDR message. |
56 | * Features a header (for a linear buffer containing RPC headers | 41 | * Features a header (for a linear buffer containing RPC headers |
57 | * and the data payload for short messages), and then an array of | 42 | * and the data payload for short messages), and then an array of |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 4d80a118d538..11fc71d50c1e 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -76,8 +76,7 @@ struct rpc_rqst { | |||
76 | struct list_head rq_list; | 76 | struct list_head rq_list; |
77 | 77 | ||
78 | __u32 * rq_buffer; /* XDR encode buffer */ | 78 | __u32 * rq_buffer; /* XDR encode buffer */ |
79 | size_t rq_bufsize, | 79 | size_t rq_callsize, |
80 | rq_callsize, | ||
81 | rq_rcvsize; | 80 | rq_rcvsize; |
82 | 81 | ||
83 | struct xdr_buf rq_private_buf; /* The receive buffer | 82 | struct xdr_buf rq_private_buf; /* The receive buffer |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 2ce8207686e2..2b409c44db83 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
@@ -232,6 +232,11 @@ extern unsigned long get_safe_page(gfp_t gfp_mask); | |||
232 | 232 | ||
233 | extern void hibernation_set_ops(struct platform_hibernation_ops *ops); | 233 | extern void hibernation_set_ops(struct platform_hibernation_ops *ops); |
234 | extern int hibernate(void); | 234 | extern int hibernate(void); |
235 | extern int hibernate_nvs_register(unsigned long start, unsigned long size); | ||
236 | extern int hibernate_nvs_alloc(void); | ||
237 | extern void hibernate_nvs_free(void); | ||
238 | extern void hibernate_nvs_save(void); | ||
239 | extern void hibernate_nvs_restore(void); | ||
235 | #else /* CONFIG_HIBERNATION */ | 240 | #else /* CONFIG_HIBERNATION */ |
236 | static inline int swsusp_page_is_forbidden(struct page *p) { return 0; } | 241 | static inline int swsusp_page_is_forbidden(struct page *p) { return 0; } |
237 | static inline void swsusp_set_page_free(struct page *p) {} | 242 | static inline void swsusp_set_page_free(struct page *p) {} |
@@ -239,6 +244,14 @@ static inline void swsusp_unset_page_free(struct page *p) {} | |||
239 | 244 | ||
240 | static inline void hibernation_set_ops(struct platform_hibernation_ops *ops) {} | 245 | static inline void hibernation_set_ops(struct platform_hibernation_ops *ops) {} |
241 | static inline int hibernate(void) { return -ENOSYS; } | 246 | static inline int hibernate(void) { return -ENOSYS; } |
247 | static inline int hibernate_nvs_register(unsigned long a, unsigned long b) | ||
248 | { | ||
249 | return 0; | ||
250 | } | ||
251 | static inline int hibernate_nvs_alloc(void) { return 0; } | ||
252 | static inline void hibernate_nvs_free(void) {} | ||
253 | static inline void hibernate_nvs_save(void) {} | ||
254 | static inline void hibernate_nvs_restore(void) {} | ||
242 | #endif /* CONFIG_HIBERNATION */ | 255 | #endif /* CONFIG_HIBERNATION */ |
243 | 256 | ||
244 | #ifdef CONFIG_PM_SLEEP | 257 | #ifdef CONFIG_PM_SLEEP |
diff --git a/include/linux/swab.h b/include/linux/swab.h index bbed279f3b32..be5284d4a053 100644 --- a/include/linux/swab.h +++ b/include/linux/swab.h | |||
@@ -9,17 +9,17 @@ | |||
9 | * casts are necessary for constants, because we never know how for sure | 9 | * casts are necessary for constants, because we never know how for sure |
10 | * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way. | 10 | * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way. |
11 | */ | 11 | */ |
12 | #define __const_swab16(x) ((__u16)( \ | 12 | #define ___constant_swab16(x) ((__u16)( \ |
13 | (((__u16)(x) & (__u16)0x00ffU) << 8) | \ | 13 | (((__u16)(x) & (__u16)0x00ffU) << 8) | \ |
14 | (((__u16)(x) & (__u16)0xff00U) >> 8))) | 14 | (((__u16)(x) & (__u16)0xff00U) >> 8))) |
15 | 15 | ||
16 | #define __const_swab32(x) ((__u32)( \ | 16 | #define ___constant_swab32(x) ((__u32)( \ |
17 | (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ | 17 | (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \ |
18 | (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \ | 18 | (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \ |
19 | (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \ | 19 | (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \ |
20 | (((__u32)(x) & (__u32)0xff000000UL) >> 24))) | 20 | (((__u32)(x) & (__u32)0xff000000UL) >> 24))) |
21 | 21 | ||
22 | #define __const_swab64(x) ((__u64)( \ | 22 | #define ___constant_swab64(x) ((__u64)( \ |
23 | (((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \ | 23 | (((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \ |
24 | (((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \ | 24 | (((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \ |
25 | (((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \ | 25 | (((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \ |
@@ -29,11 +29,11 @@ | |||
29 | (((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \ | 29 | (((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \ |
30 | (((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56))) | 30 | (((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56))) |
31 | 31 | ||
32 | #define __const_swahw32(x) ((__u32)( \ | 32 | #define ___constant_swahw32(x) ((__u32)( \ |
33 | (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ | 33 | (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ |
34 | (((__u32)(x) & (__u32)0xffff0000UL) >> 16))) | 34 | (((__u32)(x) & (__u32)0xffff0000UL) >> 16))) |
35 | 35 | ||
36 | #define __const_swahb32(x) ((__u32)( \ | 36 | #define ___constant_swahb32(x) ((__u32)( \ |
37 | (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ | 37 | (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ |
38 | (((__u32)(x) & (__u32)0xff00ff00UL) >> 8))) | 38 | (((__u32)(x) & (__u32)0xff00ff00UL) >> 8))) |
39 | 39 | ||
@@ -43,52 +43,52 @@ | |||
43 | * ___swab16, ___swab32, ___swab64, ___swahw32, ___swahb32 | 43 | * ___swab16, ___swab32, ___swab64, ___swahw32, ___swahb32 |
44 | */ | 44 | */ |
45 | 45 | ||
46 | static inline __attribute_const__ __u16 ___swab16(__u16 val) | 46 | static inline __attribute_const__ __u16 __fswab16(__u16 val) |
47 | { | 47 | { |
48 | #ifdef __arch_swab16 | 48 | #ifdef __arch_swab16 |
49 | return __arch_swab16(val); | 49 | return __arch_swab16(val); |
50 | #else | 50 | #else |
51 | return __const_swab16(val); | 51 | return ___constant_swab16(val); |
52 | #endif | 52 | #endif |
53 | } | 53 | } |
54 | 54 | ||
55 | static inline __attribute_const__ __u32 ___swab32(__u32 val) | 55 | static inline __attribute_const__ __u32 __fswab32(__u32 val) |
56 | { | 56 | { |
57 | #ifdef __arch_swab32 | 57 | #ifdef __arch_swab32 |
58 | return __arch_swab32(val); | 58 | return __arch_swab32(val); |
59 | #else | 59 | #else |
60 | return __const_swab32(val); | 60 | return ___constant_swab32(val); |
61 | #endif | 61 | #endif |
62 | } | 62 | } |
63 | 63 | ||
64 | static inline __attribute_const__ __u64 ___swab64(__u64 val) | 64 | static inline __attribute_const__ __u64 __fswab64(__u64 val) |
65 | { | 65 | { |
66 | #ifdef __arch_swab64 | 66 | #ifdef __arch_swab64 |
67 | return __arch_swab64(val); | 67 | return __arch_swab64(val); |
68 | #elif defined(__SWAB_64_THRU_32__) | 68 | #elif defined(__SWAB_64_THRU_32__) |
69 | __u32 h = val >> 32; | 69 | __u32 h = val >> 32; |
70 | __u32 l = val & ((1ULL << 32) - 1); | 70 | __u32 l = val & ((1ULL << 32) - 1); |
71 | return (((__u64)___swab32(l)) << 32) | ((__u64)(___swab32(h))); | 71 | return (((__u64)__fswab32(l)) << 32) | ((__u64)(__fswab32(h))); |
72 | #else | 72 | #else |
73 | return __const_swab64(val); | 73 | return ___constant_swab64(val); |
74 | #endif | 74 | #endif |
75 | } | 75 | } |
76 | 76 | ||
77 | static inline __attribute_const__ __u32 ___swahw32(__u32 val) | 77 | static inline __attribute_const__ __u32 __fswahw32(__u32 val) |
78 | { | 78 | { |
79 | #ifdef __arch_swahw32 | 79 | #ifdef __arch_swahw32 |
80 | return __arch_swahw32(val); | 80 | return __arch_swahw32(val); |
81 | #else | 81 | #else |
82 | return __const_swahw32(val); | 82 | return ___constant_swahw32(val); |
83 | #endif | 83 | #endif |
84 | } | 84 | } |
85 | 85 | ||
86 | static inline __attribute_const__ __u32 ___swahb32(__u32 val) | 86 | static inline __attribute_const__ __u32 __fswahb32(__u32 val) |
87 | { | 87 | { |
88 | #ifdef __arch_swahb32 | 88 | #ifdef __arch_swahb32 |
89 | return __arch_swahb32(val); | 89 | return __arch_swahb32(val); |
90 | #else | 90 | #else |
91 | return __const_swahb32(val); | 91 | return ___constant_swahb32(val); |
92 | #endif | 92 | #endif |
93 | } | 93 | } |
94 | 94 | ||
@@ -98,8 +98,8 @@ static inline __attribute_const__ __u32 ___swahb32(__u32 val) | |||
98 | */ | 98 | */ |
99 | #define __swab16(x) \ | 99 | #define __swab16(x) \ |
100 | (__builtin_constant_p((__u16)(x)) ? \ | 100 | (__builtin_constant_p((__u16)(x)) ? \ |
101 | __const_swab16((x)) : \ | 101 | ___constant_swab16(x) : \ |
102 | ___swab16((x))) | 102 | __fswab16(x)) |
103 | 103 | ||
104 | /** | 104 | /** |
105 | * __swab32 - return a byteswapped 32-bit value | 105 | * __swab32 - return a byteswapped 32-bit value |
@@ -107,8 +107,8 @@ static inline __attribute_const__ __u32 ___swahb32(__u32 val) | |||
107 | */ | 107 | */ |
108 | #define __swab32(x) \ | 108 | #define __swab32(x) \ |
109 | (__builtin_constant_p((__u32)(x)) ? \ | 109 | (__builtin_constant_p((__u32)(x)) ? \ |
110 | __const_swab32((x)) : \ | 110 | ___constant_swab32(x) : \ |
111 | ___swab32((x))) | 111 | __fswab32(x)) |
112 | 112 | ||
113 | /** | 113 | /** |
114 | * __swab64 - return a byteswapped 64-bit value | 114 | * __swab64 - return a byteswapped 64-bit value |
@@ -116,8 +116,8 @@ static inline __attribute_const__ __u32 ___swahb32(__u32 val) | |||
116 | */ | 116 | */ |
117 | #define __swab64(x) \ | 117 | #define __swab64(x) \ |
118 | (__builtin_constant_p((__u64)(x)) ? \ | 118 | (__builtin_constant_p((__u64)(x)) ? \ |
119 | __const_swab64((x)) : \ | 119 | ___constant_swab64(x) : \ |
120 | ___swab64((x))) | 120 | __fswab64(x)) |
121 | 121 | ||
122 | /** | 122 | /** |
123 | * __swahw32 - return a word-swapped 32-bit value | 123 | * __swahw32 - return a word-swapped 32-bit value |
@@ -127,8 +127,8 @@ static inline __attribute_const__ __u32 ___swahb32(__u32 val) | |||
127 | */ | 127 | */ |
128 | #define __swahw32(x) \ | 128 | #define __swahw32(x) \ |
129 | (__builtin_constant_p((__u32)(x)) ? \ | 129 | (__builtin_constant_p((__u32)(x)) ? \ |
130 | __const_swahw32((x)) : \ | 130 | ___constant_swahw32(x) : \ |
131 | ___swahw32((x))) | 131 | __fswahw32(x)) |
132 | 132 | ||
133 | /** | 133 | /** |
134 | * __swahb32 - return a high and low byte-swapped 32-bit value | 134 | * __swahb32 - return a high and low byte-swapped 32-bit value |
@@ -138,8 +138,8 @@ static inline __attribute_const__ __u32 ___swahb32(__u32 val) | |||
138 | */ | 138 | */ |
139 | #define __swahb32(x) \ | 139 | #define __swahb32(x) \ |
140 | (__builtin_constant_p((__u32)(x)) ? \ | 140 | (__builtin_constant_p((__u32)(x)) ? \ |
141 | __const_swahb32((x)) : \ | 141 | ___constant_swahb32(x) : \ |
142 | ___swahb32((x))) | 142 | __fswahb32(x)) |
143 | 143 | ||
144 | /** | 144 | /** |
145 | * __swab16p - return a byteswapped 16-bit value from a pointer | 145 | * __swab16p - return a byteswapped 16-bit value from a pointer |
diff --git a/include/linux/swap.h b/include/linux/swap.h index a3af95b2cb6d..d30215578877 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -120,7 +120,9 @@ struct swap_extent { | |||
120 | enum { | 120 | enum { |
121 | SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ | 121 | SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ |
122 | SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ | 122 | SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ |
123 | SWP_ACTIVE = (SWP_USED | SWP_WRITEOK), | 123 | SWP_DISCARDABLE = (1 << 2), /* blkdev supports discard */ |
124 | SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ | ||
125 | SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ | ||
124 | /* add others here before... */ | 126 | /* add others here before... */ |
125 | SWP_SCANNING = (1 << 8), /* refcount in scan_swap_map */ | 127 | SWP_SCANNING = (1 << 8), /* refcount in scan_swap_map */ |
126 | }; | 128 | }; |
@@ -134,22 +136,24 @@ enum { | |||
134 | * The in-memory structure used to track swap areas. | 136 | * The in-memory structure used to track swap areas. |
135 | */ | 137 | */ |
136 | struct swap_info_struct { | 138 | struct swap_info_struct { |
137 | unsigned int flags; | 139 | unsigned long flags; |
138 | int prio; /* swap priority */ | 140 | int prio; /* swap priority */ |
141 | int next; /* next entry on swap list */ | ||
139 | struct file *swap_file; | 142 | struct file *swap_file; |
140 | struct block_device *bdev; | 143 | struct block_device *bdev; |
141 | struct list_head extent_list; | 144 | struct list_head extent_list; |
142 | struct swap_extent *curr_swap_extent; | 145 | struct swap_extent *curr_swap_extent; |
143 | unsigned old_block_size; | 146 | unsigned short *swap_map; |
144 | unsigned short * swap_map; | ||
145 | unsigned int lowest_bit; | 147 | unsigned int lowest_bit; |
146 | unsigned int highest_bit; | 148 | unsigned int highest_bit; |
149 | unsigned int lowest_alloc; /* while preparing discard cluster */ | ||
150 | unsigned int highest_alloc; /* while preparing discard cluster */ | ||
147 | unsigned int cluster_next; | 151 | unsigned int cluster_next; |
148 | unsigned int cluster_nr; | 152 | unsigned int cluster_nr; |
149 | unsigned int pages; | 153 | unsigned int pages; |
150 | unsigned int max; | 154 | unsigned int max; |
151 | unsigned int inuse_pages; | 155 | unsigned int inuse_pages; |
152 | int next; /* next entry on swap list */ | 156 | unsigned int old_block_size; |
153 | }; | 157 | }; |
154 | 158 | ||
155 | struct swap_list_t { | 159 | struct swap_list_t { |
@@ -163,7 +167,6 @@ struct swap_list_t { | |||
163 | /* linux/mm/page_alloc.c */ | 167 | /* linux/mm/page_alloc.c */ |
164 | extern unsigned long totalram_pages; | 168 | extern unsigned long totalram_pages; |
165 | extern unsigned long totalreserve_pages; | 169 | extern unsigned long totalreserve_pages; |
166 | extern long nr_swap_pages; | ||
167 | extern unsigned int nr_free_buffer_pages(void); | 170 | extern unsigned int nr_free_buffer_pages(void); |
168 | extern unsigned int nr_free_pagecache_pages(void); | 171 | extern unsigned int nr_free_pagecache_pages(void); |
169 | 172 | ||
@@ -174,8 +177,6 @@ extern unsigned int nr_free_pagecache_pages(void); | |||
174 | /* linux/mm/swap.c */ | 177 | /* linux/mm/swap.c */ |
175 | extern void __lru_cache_add(struct page *, enum lru_list lru); | 178 | extern void __lru_cache_add(struct page *, enum lru_list lru); |
176 | extern void lru_cache_add_lru(struct page *, enum lru_list lru); | 179 | extern void lru_cache_add_lru(struct page *, enum lru_list lru); |
177 | extern void lru_cache_add_active_or_unevictable(struct page *, | ||
178 | struct vm_area_struct *); | ||
179 | extern void activate_page(struct page *); | 180 | extern void activate_page(struct page *); |
180 | extern void mark_page_accessed(struct page *); | 181 | extern void mark_page_accessed(struct page *); |
181 | extern void lru_add_drain(void); | 182 | extern void lru_add_drain(void); |
@@ -213,7 +214,8 @@ static inline void lru_cache_add_active_file(struct page *page) | |||
213 | extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order, | 214 | extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order, |
214 | gfp_t gfp_mask); | 215 | gfp_t gfp_mask); |
215 | extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem, | 216 | extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem, |
216 | gfp_t gfp_mask); | 217 | gfp_t gfp_mask, bool noswap, |
218 | unsigned int swappiness); | ||
217 | extern int __isolate_lru_page(struct page *page, int mode, int file); | 219 | extern int __isolate_lru_page(struct page *page, int mode, int file); |
218 | extern unsigned long shrink_all_memory(unsigned long nr_pages); | 220 | extern unsigned long shrink_all_memory(unsigned long nr_pages); |
219 | extern int vm_swappiness; | 221 | extern int vm_swappiness; |
@@ -280,7 +282,7 @@ extern void end_swap_bio_read(struct bio *bio, int err); | |||
280 | extern struct address_space swapper_space; | 282 | extern struct address_space swapper_space; |
281 | #define total_swapcache_pages swapper_space.nrpages | 283 | #define total_swapcache_pages swapper_space.nrpages |
282 | extern void show_swap_cache_info(void); | 284 | extern void show_swap_cache_info(void); |
283 | extern int add_to_swap(struct page *, gfp_t); | 285 | extern int add_to_swap(struct page *); |
284 | extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t); | 286 | extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t); |
285 | extern void __delete_from_swap_cache(struct page *); | 287 | extern void __delete_from_swap_cache(struct page *); |
286 | extern void delete_from_swap_cache(struct page *); | 288 | extern void delete_from_swap_cache(struct page *); |
@@ -293,6 +295,7 @@ extern struct page *swapin_readahead(swp_entry_t, gfp_t, | |||
293 | struct vm_area_struct *vma, unsigned long addr); | 295 | struct vm_area_struct *vma, unsigned long addr); |
294 | 296 | ||
295 | /* linux/mm/swapfile.c */ | 297 | /* linux/mm/swapfile.c */ |
298 | extern long nr_swap_pages; | ||
296 | extern long total_swap_pages; | 299 | extern long total_swap_pages; |
297 | extern void si_swapinfo(struct sysinfo *); | 300 | extern void si_swapinfo(struct sysinfo *); |
298 | extern swp_entry_t get_swap_page(void); | 301 | extern swp_entry_t get_swap_page(void); |
@@ -300,15 +303,14 @@ extern swp_entry_t get_swap_page_of_type(int); | |||
300 | extern int swap_duplicate(swp_entry_t); | 303 | extern int swap_duplicate(swp_entry_t); |
301 | extern int valid_swaphandles(swp_entry_t, unsigned long *); | 304 | extern int valid_swaphandles(swp_entry_t, unsigned long *); |
302 | extern void swap_free(swp_entry_t); | 305 | extern void swap_free(swp_entry_t); |
303 | extern void free_swap_and_cache(swp_entry_t); | 306 | extern int free_swap_and_cache(swp_entry_t); |
304 | extern int swap_type_of(dev_t, sector_t, struct block_device **); | 307 | extern int swap_type_of(dev_t, sector_t, struct block_device **); |
305 | extern unsigned int count_swap_pages(int, int); | 308 | extern unsigned int count_swap_pages(int, int); |
306 | extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t); | 309 | extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t); |
307 | extern sector_t swapdev_block(int, pgoff_t); | 310 | extern sector_t swapdev_block(int, pgoff_t); |
308 | extern struct swap_info_struct *get_swap_info_struct(unsigned); | 311 | extern struct swap_info_struct *get_swap_info_struct(unsigned); |
309 | extern int can_share_swap_page(struct page *); | 312 | extern int reuse_swap_page(struct page *); |
310 | extern int remove_exclusive_swap_page(struct page *); | 313 | extern int try_to_free_swap(struct page *); |
311 | extern int remove_exclusive_swap_page_ref(struct page *); | ||
312 | struct backing_dev_info; | 314 | struct backing_dev_info; |
313 | 315 | ||
314 | /* linux/mm/thrash.c */ | 316 | /* linux/mm/thrash.c */ |
@@ -332,9 +334,26 @@ static inline void disable_swap_token(void) | |||
332 | put_swap_token(swap_token_mm); | 334 | put_swap_token(swap_token_mm); |
333 | } | 335 | } |
334 | 336 | ||
337 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR | ||
338 | extern void mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent); | ||
339 | #else | ||
340 | static inline void | ||
341 | mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent) | ||
342 | { | ||
343 | } | ||
344 | #endif | ||
345 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | ||
346 | extern void mem_cgroup_uncharge_swap(swp_entry_t ent); | ||
347 | #else | ||
348 | static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) | ||
349 | { | ||
350 | } | ||
351 | #endif | ||
352 | |||
335 | #else /* CONFIG_SWAP */ | 353 | #else /* CONFIG_SWAP */ |
336 | 354 | ||
337 | #define total_swap_pages 0 | 355 | #define nr_swap_pages 0L |
356 | #define total_swap_pages 0L | ||
338 | #define total_swapcache_pages 0UL | 357 | #define total_swapcache_pages 0UL |
339 | 358 | ||
340 | #define si_swapinfo(val) \ | 359 | #define si_swapinfo(val) \ |
@@ -350,14 +369,8 @@ static inline void show_swap_cache_info(void) | |||
350 | { | 369 | { |
351 | } | 370 | } |
352 | 371 | ||
353 | static inline void free_swap_and_cache(swp_entry_t swp) | 372 | #define free_swap_and_cache(swp) is_migration_entry(swp) |
354 | { | 373 | #define swap_duplicate(swp) is_migration_entry(swp) |
355 | } | ||
356 | |||
357 | static inline int swap_duplicate(swp_entry_t swp) | ||
358 | { | ||
359 | return 0; | ||
360 | } | ||
361 | 374 | ||
362 | static inline void swap_free(swp_entry_t swp) | 375 | static inline void swap_free(swp_entry_t swp) |
363 | { | 376 | { |
@@ -374,7 +387,10 @@ static inline struct page *lookup_swap_cache(swp_entry_t swp) | |||
374 | return NULL; | 387 | return NULL; |
375 | } | 388 | } |
376 | 389 | ||
377 | #define can_share_swap_page(p) (page_mapcount(p) == 1) | 390 | static inline int add_to_swap(struct page *page) |
391 | { | ||
392 | return 0; | ||
393 | } | ||
378 | 394 | ||
379 | static inline int add_to_swap_cache(struct page *page, swp_entry_t entry, | 395 | static inline int add_to_swap_cache(struct page *page, swp_entry_t entry, |
380 | gfp_t gfp_mask) | 396 | gfp_t gfp_mask) |
@@ -390,14 +406,9 @@ static inline void delete_from_swap_cache(struct page *page) | |||
390 | { | 406 | { |
391 | } | 407 | } |
392 | 408 | ||
393 | #define swap_token_default_timeout 0 | 409 | #define reuse_swap_page(page) (page_mapcount(page) == 1) |
394 | 410 | ||
395 | static inline int remove_exclusive_swap_page(struct page *p) | 411 | static inline int try_to_free_swap(struct page *page) |
396 | { | ||
397 | return 0; | ||
398 | } | ||
399 | |||
400 | static inline int remove_exclusive_swap_page_ref(struct page *page) | ||
401 | { | 412 | { |
402 | return 0; | 413 | return 0; |
403 | } | 414 | } |
@@ -415,6 +426,12 @@ static inline swp_entry_t get_swap_page(void) | |||
415 | #define has_swap_token(x) 0 | 426 | #define has_swap_token(x) 0 |
416 | #define disable_swap_token() do { } while(0) | 427 | #define disable_swap_token() do { } while(0) |
417 | 428 | ||
429 | static inline int mem_cgroup_cache_charge_swapin(struct page *page, | ||
430 | struct mm_struct *mm, gfp_t mask, bool locked) | ||
431 | { | ||
432 | return 0; | ||
433 | } | ||
434 | |||
418 | #endif /* CONFIG_SWAP */ | 435 | #endif /* CONFIG_SWAP */ |
419 | #endif /* __KERNEL__*/ | 436 | #endif /* __KERNEL__*/ |
420 | #endif /* _LINUX_SWAP_H */ | 437 | #endif /* _LINUX_SWAP_H */ |
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index b18ec5533e8c..dedd3c0cfe30 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h | |||
@@ -7,9 +7,32 @@ struct device; | |||
7 | struct dma_attrs; | 7 | struct dma_attrs; |
8 | struct scatterlist; | 8 | struct scatterlist; |
9 | 9 | ||
10 | /* | ||
11 | * Maximum allowable number of contiguous slabs to map, | ||
12 | * must be a power of 2. What is the appropriate value ? | ||
13 | * The complexity of {map,unmap}_single is linearly dependent on this value. | ||
14 | */ | ||
15 | #define IO_TLB_SEGSIZE 128 | ||
16 | |||
17 | |||
18 | /* | ||
19 | * log of the size of each IO TLB slab. The number of slabs is command line | ||
20 | * controllable. | ||
21 | */ | ||
22 | #define IO_TLB_SHIFT 11 | ||
23 | |||
10 | extern void | 24 | extern void |
11 | swiotlb_init(void); | 25 | swiotlb_init(void); |
12 | 26 | ||
27 | extern void *swiotlb_alloc_boot(size_t bytes, unsigned long nslabs); | ||
28 | extern void *swiotlb_alloc(unsigned order, unsigned long nslabs); | ||
29 | |||
30 | extern dma_addr_t swiotlb_phys_to_bus(struct device *hwdev, | ||
31 | phys_addr_t address); | ||
32 | extern phys_addr_t swiotlb_bus_to_phys(dma_addr_t address); | ||
33 | |||
34 | extern int swiotlb_arch_range_needs_mapping(void *ptr, size_t size); | ||
35 | |||
13 | extern void | 36 | extern void |
14 | *swiotlb_alloc_coherent(struct device *hwdev, size_t size, | 37 | *swiotlb_alloc_coherent(struct device *hwdev, size_t size, |
15 | dma_addr_t *dma_handle, gfp_t flags); | 38 | dma_addr_t *dma_handle, gfp_t flags); |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index a549678b7c3c..a1d177ce0a08 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -550,7 +550,7 @@ asmlinkage long sys_inotify_init(void); | |||
550 | asmlinkage long sys_inotify_init1(int flags); | 550 | asmlinkage long sys_inotify_init1(int flags); |
551 | asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, | 551 | asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, |
552 | u32 mask); | 552 | u32 mask); |
553 | asmlinkage long sys_inotify_rm_watch(int fd, u32 wd); | 553 | asmlinkage long sys_inotify_rm_watch(int fd, __s32 wd); |
554 | 554 | ||
555 | asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, | 555 | asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, |
556 | __u32 __user *ustatus); | 556 | __u32 __user *ustatus); |
diff --git a/include/linux/threads.h b/include/linux/threads.h index 38d1a5d6568e..052b12bec8bd 100644 --- a/include/linux/threads.h +++ b/include/linux/threads.h | |||
@@ -8,17 +8,17 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | /* | 10 | /* |
11 | * Maximum supported processors that can run under SMP. This value is | 11 | * Maximum supported processors. Setting this smaller saves quite a |
12 | * set via configure setting. The maximum is equal to the size of the | 12 | * bit of memory. Use nr_cpu_ids instead of this except for static bitmaps. |
13 | * bitmasks used on that platform, i.e. 32 or 64. Setting this smaller | ||
14 | * saves quite a bit of memory. | ||
15 | */ | 13 | */ |
16 | #ifdef CONFIG_SMP | 14 | #ifndef CONFIG_NR_CPUS |
17 | #define NR_CPUS CONFIG_NR_CPUS | 15 | /* FIXME: This should be fixed in the arch's Kconfig */ |
18 | #else | 16 | #define CONFIG_NR_CPUS 1 |
19 | #define NR_CPUS 1 | ||
20 | #endif | 17 | #endif |
21 | 18 | ||
19 | /* Places which use this should consider cpumask_var_t. */ | ||
20 | #define NR_CPUS CONFIG_NR_CPUS | ||
21 | |||
22 | #define MIN_THREADS_LEFT_FOR_ROOT 4 | 22 | #define MIN_THREADS_LEFT_FOR_ROOT 4 |
23 | 23 | ||
24 | /* | 24 | /* |
diff --git a/include/linux/tick.h b/include/linux/tick.h index b6ec8189ac0c..469b82d88b3b 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h | |||
@@ -84,10 +84,10 @@ static inline void tick_cancel_sched_timer(int cpu) { } | |||
84 | 84 | ||
85 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 85 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST |
86 | extern struct tick_device *tick_get_broadcast_device(void); | 86 | extern struct tick_device *tick_get_broadcast_device(void); |
87 | extern cpumask_t *tick_get_broadcast_mask(void); | 87 | extern struct cpumask *tick_get_broadcast_mask(void); |
88 | 88 | ||
89 | # ifdef CONFIG_TICK_ONESHOT | 89 | # ifdef CONFIG_TICK_ONESHOT |
90 | extern cpumask_t *tick_get_broadcast_oneshot_mask(void); | 90 | extern struct cpumask *tick_get_broadcast_oneshot_mask(void); |
91 | # endif | 91 | # endif |
92 | 92 | ||
93 | # endif /* BROADCAST */ | 93 | # endif /* BROADCAST */ |
diff --git a/include/linux/time.h b/include/linux/time.h index ce321ac5c8f8..fbbd2a1c92ba 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -105,6 +105,7 @@ extern unsigned long read_persistent_clock(void); | |||
105 | extern int update_persistent_clock(struct timespec now); | 105 | extern int update_persistent_clock(struct timespec now); |
106 | extern int no_sync_cmos_clock __read_mostly; | 106 | extern int no_sync_cmos_clock __read_mostly; |
107 | void timekeeping_init(void); | 107 | void timekeeping_init(void); |
108 | extern int timekeeping_suspended; | ||
108 | 109 | ||
109 | unsigned long get_seconds(void); | 110 | unsigned long get_seconds(void); |
110 | struct timespec current_kernel_time(void); | 111 | struct timespec current_kernel_time(void); |
diff --git a/include/linux/timex.h b/include/linux/timex.h index 9007313b5b71..998a55d80acf 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
@@ -53,47 +53,11 @@ | |||
53 | #ifndef _LINUX_TIMEX_H | 53 | #ifndef _LINUX_TIMEX_H |
54 | #define _LINUX_TIMEX_H | 54 | #define _LINUX_TIMEX_H |
55 | 55 | ||
56 | #include <linux/compiler.h> | ||
57 | #include <linux/time.h> | 56 | #include <linux/time.h> |
58 | 57 | ||
59 | #include <asm/param.h> | ||
60 | |||
61 | #define NTP_API 4 /* NTP API version */ | 58 | #define NTP_API 4 /* NTP API version */ |
62 | 59 | ||
63 | /* | 60 | /* |
64 | * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen | ||
65 | * for a slightly underdamped convergence characteristic. SHIFT_KH | ||
66 | * establishes the damping of the FLL and is chosen by wisdom and black | ||
67 | * art. | ||
68 | * | ||
69 | * MAXTC establishes the maximum time constant of the PLL. With the | ||
70 | * SHIFT_KG and SHIFT_KF values given and a time constant range from | ||
71 | * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours, | ||
72 | * respectively. | ||
73 | */ | ||
74 | #define SHIFT_PLL 4 /* PLL frequency factor (shift) */ | ||
75 | #define SHIFT_FLL 2 /* FLL frequency factor (shift) */ | ||
76 | #define MAXTC 10 /* maximum time constant (shift) */ | ||
77 | |||
78 | /* | ||
79 | * SHIFT_USEC defines the scaling (shift) of the time_freq and | ||
80 | * time_tolerance variables, which represent the current frequency | ||
81 | * offset and maximum frequency tolerance. | ||
82 | */ | ||
83 | #define SHIFT_USEC 16 /* frequency offset scale (shift) */ | ||
84 | #define PPM_SCALE (NSEC_PER_USEC << (NTP_SCALE_SHIFT - SHIFT_USEC)) | ||
85 | #define PPM_SCALE_INV_SHIFT 19 | ||
86 | #define PPM_SCALE_INV ((1ll << (PPM_SCALE_INV_SHIFT + NTP_SCALE_SHIFT)) / \ | ||
87 | PPM_SCALE + 1) | ||
88 | |||
89 | #define MAXPHASE 500000000l /* max phase error (ns) */ | ||
90 | #define MAXFREQ 500000 /* max frequency error (ns/s) */ | ||
91 | #define MAXFREQ_SCALED ((s64)MAXFREQ << NTP_SCALE_SHIFT) | ||
92 | #define MINSEC 256 /* min interval between updates (s) */ | ||
93 | #define MAXSEC 2048 /* max interval between updates (s) */ | ||
94 | #define NTP_PHASE_LIMIT ((MAXPHASE / NSEC_PER_USEC) << 5) /* beyond max. dispersion */ | ||
95 | |||
96 | /* | ||
97 | * syscall interface - used (mainly by NTP daemon) | 61 | * syscall interface - used (mainly by NTP daemon) |
98 | * to discipline kernel clock oscillator | 62 | * to discipline kernel clock oscillator |
99 | */ | 63 | */ |
@@ -199,9 +163,46 @@ struct timex { | |||
199 | #define TIME_BAD TIME_ERROR /* bw compat */ | 163 | #define TIME_BAD TIME_ERROR /* bw compat */ |
200 | 164 | ||
201 | #ifdef __KERNEL__ | 165 | #ifdef __KERNEL__ |
166 | #include <linux/compiler.h> | ||
167 | #include <linux/types.h> | ||
168 | #include <linux/param.h> | ||
169 | |||
202 | #include <asm/timex.h> | 170 | #include <asm/timex.h> |
203 | 171 | ||
204 | /* | 172 | /* |
173 | * SHIFT_KG and SHIFT_KF establish the damping of the PLL and are chosen | ||
174 | * for a slightly underdamped convergence characteristic. SHIFT_KH | ||
175 | * establishes the damping of the FLL and is chosen by wisdom and black | ||
176 | * art. | ||
177 | * | ||
178 | * MAXTC establishes the maximum time constant of the PLL. With the | ||
179 | * SHIFT_KG and SHIFT_KF values given and a time constant range from | ||
180 | * zero to MAXTC, the PLL will converge in 15 minutes to 16 hours, | ||
181 | * respectively. | ||
182 | */ | ||
183 | #define SHIFT_PLL 4 /* PLL frequency factor (shift) */ | ||
184 | #define SHIFT_FLL 2 /* FLL frequency factor (shift) */ | ||
185 | #define MAXTC 10 /* maximum time constant (shift) */ | ||
186 | |||
187 | /* | ||
188 | * SHIFT_USEC defines the scaling (shift) of the time_freq and | ||
189 | * time_tolerance variables, which represent the current frequency | ||
190 | * offset and maximum frequency tolerance. | ||
191 | */ | ||
192 | #define SHIFT_USEC 16 /* frequency offset scale (shift) */ | ||
193 | #define PPM_SCALE (NSEC_PER_USEC << (NTP_SCALE_SHIFT - SHIFT_USEC)) | ||
194 | #define PPM_SCALE_INV_SHIFT 19 | ||
195 | #define PPM_SCALE_INV ((1ll << (PPM_SCALE_INV_SHIFT + NTP_SCALE_SHIFT)) / \ | ||
196 | PPM_SCALE + 1) | ||
197 | |||
198 | #define MAXPHASE 500000000l /* max phase error (ns) */ | ||
199 | #define MAXFREQ 500000 /* max frequency error (ns/s) */ | ||
200 | #define MAXFREQ_SCALED ((s64)MAXFREQ << NTP_SCALE_SHIFT) | ||
201 | #define MINSEC 256 /* min interval between updates (s) */ | ||
202 | #define MAXSEC 2048 /* max interval between updates (s) */ | ||
203 | #define NTP_PHASE_LIMIT ((MAXPHASE / NSEC_PER_USEC) << 5) /* beyond max. dispersion */ | ||
204 | |||
205 | /* | ||
205 | * kernel variables | 206 | * kernel variables |
206 | * Note: maximum error = NTP synch distance = dispersion + delay / 2; | 207 | * Note: maximum error = NTP synch distance = dispersion + delay / 2; |
207 | * estimated error = NTP dispersion. | 208 | * estimated error = NTP dispersion. |
diff --git a/include/linux/topology.h b/include/linux/topology.h index 0c5b5ac36d8e..e632d29f0544 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
@@ -125,7 +125,8 @@ int arch_update_cpu_topology(void); | |||
125 | | SD_WAKE_AFFINE \ | 125 | | SD_WAKE_AFFINE \ |
126 | | SD_WAKE_BALANCE \ | 126 | | SD_WAKE_BALANCE \ |
127 | | SD_SHARE_PKG_RESOURCES\ | 127 | | SD_SHARE_PKG_RESOURCES\ |
128 | | BALANCE_FOR_MC_POWER, \ | 128 | | sd_balance_for_mc_power()\ |
129 | | sd_power_saving_flags(),\ | ||
129 | .last_balance = jiffies, \ | 130 | .last_balance = jiffies, \ |
130 | .balance_interval = 1, \ | 131 | .balance_interval = 1, \ |
131 | } | 132 | } |
@@ -150,7 +151,8 @@ int arch_update_cpu_topology(void); | |||
150 | | SD_BALANCE_FORK \ | 151 | | SD_BALANCE_FORK \ |
151 | | SD_WAKE_AFFINE \ | 152 | | SD_WAKE_AFFINE \ |
152 | | SD_WAKE_BALANCE \ | 153 | | SD_WAKE_BALANCE \ |
153 | | BALANCE_FOR_PKG_POWER,\ | 154 | | sd_balance_for_package_power()\ |
155 | | sd_power_saving_flags(),\ | ||
154 | .last_balance = jiffies, \ | 156 | .last_balance = jiffies, \ |
155 | .balance_interval = 1, \ | 157 | .balance_interval = 1, \ |
156 | } | 158 | } |
diff --git a/include/linux/tty.h b/include/linux/tty.h index 3f4954c55e53..fc39db95499f 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -180,8 +180,17 @@ struct signal_struct; | |||
180 | * until a hangup so don't use the wrong path. | 180 | * until a hangup so don't use the wrong path. |
181 | */ | 181 | */ |
182 | 182 | ||
183 | struct tty_port; | ||
184 | |||
185 | struct tty_port_operations { | ||
186 | /* Return 1 if the carrier is raised */ | ||
187 | int (*carrier_raised)(struct tty_port *port); | ||
188 | void (*raise_dtr_rts)(struct tty_port *port); | ||
189 | }; | ||
190 | |||
183 | struct tty_port { | 191 | struct tty_port { |
184 | struct tty_struct *tty; /* Back pointer */ | 192 | struct tty_struct *tty; /* Back pointer */ |
193 | const struct tty_port_operations *ops; /* Port operations */ | ||
185 | spinlock_t lock; /* Lock protecting tty field */ | 194 | spinlock_t lock; /* Lock protecting tty field */ |
186 | int blocked_open; /* Waiting to open */ | 195 | int blocked_open; /* Waiting to open */ |
187 | int count; /* Usage count */ | 196 | int count; /* Usage count */ |
@@ -253,6 +262,7 @@ struct tty_struct { | |||
253 | unsigned int column; | 262 | unsigned int column; |
254 | unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1; | 263 | unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1; |
255 | unsigned char closing:1; | 264 | unsigned char closing:1; |
265 | unsigned char echo_overrun:1; | ||
256 | unsigned short minimum_to_wake; | 266 | unsigned short minimum_to_wake; |
257 | unsigned long overrun_time; | 267 | unsigned long overrun_time; |
258 | int num_overrun; | 268 | int num_overrun; |
@@ -262,11 +272,16 @@ struct tty_struct { | |||
262 | int read_tail; | 272 | int read_tail; |
263 | int read_cnt; | 273 | int read_cnt; |
264 | unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))]; | 274 | unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))]; |
275 | unsigned char *echo_buf; | ||
276 | unsigned int echo_pos; | ||
277 | unsigned int echo_cnt; | ||
265 | int canon_data; | 278 | int canon_data; |
266 | unsigned long canon_head; | 279 | unsigned long canon_head; |
267 | unsigned int canon_column; | 280 | unsigned int canon_column; |
268 | struct mutex atomic_read_lock; | 281 | struct mutex atomic_read_lock; |
269 | struct mutex atomic_write_lock; | 282 | struct mutex atomic_write_lock; |
283 | struct mutex output_lock; | ||
284 | struct mutex echo_lock; | ||
270 | unsigned char *write_buf; | 285 | unsigned char *write_buf; |
271 | int write_cnt; | 286 | int write_cnt; |
272 | spinlock_t read_lock; | 287 | spinlock_t read_lock; |
@@ -295,6 +310,7 @@ struct tty_struct { | |||
295 | #define TTY_PUSH 6 /* n_tty private */ | 310 | #define TTY_PUSH 6 /* n_tty private */ |
296 | #define TTY_CLOSING 7 /* ->close() in progress */ | 311 | #define TTY_CLOSING 7 /* ->close() in progress */ |
297 | #define TTY_LDISC 9 /* Line discipline attached */ | 312 | #define TTY_LDISC 9 /* Line discipline attached */ |
313 | #define TTY_LDISC_CHANGING 10 /* Line discipline changing */ | ||
298 | #define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */ | 314 | #define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */ |
299 | #define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */ | 315 | #define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */ |
300 | #define TTY_PTY_LOCK 16 /* pty private */ | 316 | #define TTY_PTY_LOCK 16 /* pty private */ |
@@ -354,8 +370,7 @@ extern int tty_write_room(struct tty_struct *tty); | |||
354 | extern void tty_driver_flush_buffer(struct tty_struct *tty); | 370 | extern void tty_driver_flush_buffer(struct tty_struct *tty); |
355 | extern void tty_throttle(struct tty_struct *tty); | 371 | extern void tty_throttle(struct tty_struct *tty); |
356 | extern void tty_unthrottle(struct tty_struct *tty); | 372 | extern void tty_unthrottle(struct tty_struct *tty); |
357 | extern int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, | 373 | extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws); |
358 | struct winsize *ws); | ||
359 | extern void tty_shutdown(struct tty_struct *tty); | 374 | extern void tty_shutdown(struct tty_struct *tty); |
360 | extern void tty_free_termios(struct tty_struct *tty); | 375 | extern void tty_free_termios(struct tty_struct *tty); |
361 | extern int is_current_pgrp_orphaned(void); | 376 | extern int is_current_pgrp_orphaned(void); |
@@ -421,6 +436,14 @@ extern int tty_port_alloc_xmit_buf(struct tty_port *port); | |||
421 | extern void tty_port_free_xmit_buf(struct tty_port *port); | 436 | extern void tty_port_free_xmit_buf(struct tty_port *port); |
422 | extern struct tty_struct *tty_port_tty_get(struct tty_port *port); | 437 | extern struct tty_struct *tty_port_tty_get(struct tty_port *port); |
423 | extern void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty); | 438 | extern void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty); |
439 | extern int tty_port_carrier_raised(struct tty_port *port); | ||
440 | extern void tty_port_raise_dtr_rts(struct tty_port *port); | ||
441 | extern void tty_port_hangup(struct tty_port *port); | ||
442 | extern int tty_port_block_til_ready(struct tty_port *port, | ||
443 | struct tty_struct *tty, struct file *filp); | ||
444 | extern int tty_port_close_start(struct tty_port *port, | ||
445 | struct tty_struct *tty, struct file *filp); | ||
446 | extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty); | ||
424 | 447 | ||
425 | extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc); | 448 | extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc); |
426 | extern int tty_unregister_ldisc(int disc); | 449 | extern int tty_unregister_ldisc(int disc); |
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index 78416b901589..08e088334dba 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
@@ -196,8 +196,7 @@ | |||
196 | * Optional: If not provided then the write method is called under | 196 | * Optional: If not provided then the write method is called under |
197 | * the atomic write lock to keep it serialized with the ldisc. | 197 | * the atomic write lock to keep it serialized with the ldisc. |
198 | * | 198 | * |
199 | * int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty, | 199 | * int (*resize)(struct tty_struct *tty, struct winsize *ws) |
200 | * unsigned int rows, unsigned int cols); | ||
201 | * | 200 | * |
202 | * Called when a termios request is issued which changes the | 201 | * Called when a termios request is issued which changes the |
203 | * requested terminal geometry. | 202 | * requested terminal geometry. |
@@ -258,8 +257,7 @@ struct tty_operations { | |||
258 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 257 | int (*tiocmget)(struct tty_struct *tty, struct file *file); |
259 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 258 | int (*tiocmset)(struct tty_struct *tty, struct file *file, |
260 | unsigned int set, unsigned int clear); | 259 | unsigned int set, unsigned int clear); |
261 | int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty, | 260 | int (*resize)(struct tty_struct *tty, struct winsize *ws); |
262 | struct winsize *ws); | ||
263 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); | 261 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); |
264 | #ifdef CONFIG_CONSOLE_POLL | 262 | #ifdef CONFIG_CONSOLE_POLL |
265 | int (*poll_init)(struct tty_driver *driver, int line, char *options); | 263 | int (*poll_init)(struct tty_driver *driver, int line, char *options); |
diff --git a/include/linux/types.h b/include/linux/types.h index 1d98330b1f2c..712ca53bc348 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -135,19 +135,14 @@ typedef __s64 int64_t; | |||
135 | * | 135 | * |
136 | * Linux always considers sectors to be 512 bytes long independently | 136 | * Linux always considers sectors to be 512 bytes long independently |
137 | * of the devices real block size. | 137 | * of the devices real block size. |
138 | * | ||
139 | * blkcnt_t is the type of the inode's block count. | ||
138 | */ | 140 | */ |
139 | #ifdef CONFIG_LBD | 141 | #ifdef CONFIG_LBD |
140 | typedef u64 sector_t; | 142 | typedef u64 sector_t; |
141 | #else | ||
142 | typedef unsigned long sector_t; | ||
143 | #endif | ||
144 | |||
145 | /* | ||
146 | * The type of the inode's block count. | ||
147 | */ | ||
148 | #ifdef CONFIG_LSF | ||
149 | typedef u64 blkcnt_t; | 143 | typedef u64 blkcnt_t; |
150 | #else | 144 | #else |
145 | typedef unsigned long sector_t; | ||
151 | typedef unsigned long blkcnt_t; | 146 | typedef unsigned long blkcnt_t; |
152 | #endif | 147 | #endif |
153 | 148 | ||
@@ -181,10 +176,9 @@ typedef __u16 __bitwise __le16; | |||
181 | typedef __u16 __bitwise __be16; | 176 | typedef __u16 __bitwise __be16; |
182 | typedef __u32 __bitwise __le32; | 177 | typedef __u32 __bitwise __le32; |
183 | typedef __u32 __bitwise __be32; | 178 | typedef __u32 __bitwise __be32; |
184 | #if defined(__GNUC__) | ||
185 | typedef __u64 __bitwise __le64; | 179 | typedef __u64 __bitwise __le64; |
186 | typedef __u64 __bitwise __be64; | 180 | typedef __u64 __bitwise __be64; |
187 | #endif | 181 | |
188 | typedef __u16 __bitwise __sum16; | 182 | typedef __u16 __bitwise __sum16; |
189 | typedef __u32 __bitwise __wsum; | 183 | typedef __u32 __bitwise __wsum; |
190 | 184 | ||
@@ -200,6 +194,16 @@ typedef u32 phys_addr_t; | |||
200 | 194 | ||
201 | typedef phys_addr_t resource_size_t; | 195 | typedef phys_addr_t resource_size_t; |
202 | 196 | ||
197 | typedef struct { | ||
198 | volatile int counter; | ||
199 | } atomic_t; | ||
200 | |||
201 | #ifdef CONFIG_64BIT | ||
202 | typedef struct { | ||
203 | volatile long counter; | ||
204 | } atomic64_t; | ||
205 | #endif | ||
206 | |||
203 | struct ustat { | 207 | struct ustat { |
204 | __kernel_daddr_t f_tfree; | 208 | __kernel_daddr_t f_tfree; |
205 | __kernel_ino_t f_tinode; | 209 | __kernel_ino_t f_tinode; |
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h index fec6decfb983..6b58367d145e 100644 --- a/include/linux/uaccess.h +++ b/include/linux/uaccess.h | |||
@@ -78,7 +78,7 @@ static inline unsigned long __copy_from_user_nocache(void *to, | |||
78 | \ | 78 | \ |
79 | set_fs(KERNEL_DS); \ | 79 | set_fs(KERNEL_DS); \ |
80 | pagefault_disable(); \ | 80 | pagefault_disable(); \ |
81 | ret = __get_user(retval, (__force typeof(retval) __user *)(addr)); \ | 81 | ret = __copy_from_user_inatomic(&(retval), (__force typeof(retval) __user *)(addr), sizeof(retval)); \ |
82 | pagefault_enable(); \ | 82 | pagefault_enable(); \ |
83 | set_fs(old_fs); \ | 83 | set_fs(old_fs); \ |
84 | ret; \ | 84 | ret; \ |
diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h index cdf338d94b7f..a0bb6bd2e5c1 100644 --- a/include/linux/uio_driver.h +++ b/include/linux/uio_driver.h | |||
@@ -38,6 +38,24 @@ struct uio_mem { | |||
38 | 38 | ||
39 | #define MAX_UIO_MAPS 5 | 39 | #define MAX_UIO_MAPS 5 |
40 | 40 | ||
41 | struct uio_portio; | ||
42 | |||
43 | /** | ||
44 | * struct uio_port - description of a UIO port region | ||
45 | * @start: start of port region | ||
46 | * @size: size of port region | ||
47 | * @porttype: type of port (see UIO_PORT_* below) | ||
48 | * @portio: for use by the UIO core only. | ||
49 | */ | ||
50 | struct uio_port { | ||
51 | unsigned long start; | ||
52 | unsigned long size; | ||
53 | int porttype; | ||
54 | struct uio_portio *portio; | ||
55 | }; | ||
56 | |||
57 | #define MAX_UIO_PORT_REGIONS 5 | ||
58 | |||
41 | struct uio_device; | 59 | struct uio_device; |
42 | 60 | ||
43 | /** | 61 | /** |
@@ -46,6 +64,7 @@ struct uio_device; | |||
46 | * @name: device name | 64 | * @name: device name |
47 | * @version: device driver version | 65 | * @version: device driver version |
48 | * @mem: list of mappable memory regions, size==0 for end of list | 66 | * @mem: list of mappable memory regions, size==0 for end of list |
67 | * @port: list of port regions, size==0 for end of list | ||
49 | * @irq: interrupt number or UIO_IRQ_CUSTOM | 68 | * @irq: interrupt number or UIO_IRQ_CUSTOM |
50 | * @irq_flags: flags for request_irq() | 69 | * @irq_flags: flags for request_irq() |
51 | * @priv: optional private data | 70 | * @priv: optional private data |
@@ -57,9 +76,10 @@ struct uio_device; | |||
57 | */ | 76 | */ |
58 | struct uio_info { | 77 | struct uio_info { |
59 | struct uio_device *uio_dev; | 78 | struct uio_device *uio_dev; |
60 | char *name; | 79 | const char *name; |
61 | char *version; | 80 | const char *version; |
62 | struct uio_mem mem[MAX_UIO_MAPS]; | 81 | struct uio_mem mem[MAX_UIO_MAPS]; |
82 | struct uio_port port[MAX_UIO_PORT_REGIONS]; | ||
63 | long irq; | 83 | long irq; |
64 | unsigned long irq_flags; | 84 | unsigned long irq_flags; |
65 | void *priv; | 85 | void *priv; |
@@ -92,4 +112,10 @@ extern void uio_event_notify(struct uio_info *info); | |||
92 | #define UIO_MEM_LOGICAL 2 | 112 | #define UIO_MEM_LOGICAL 2 |
93 | #define UIO_MEM_VIRTUAL 3 | 113 | #define UIO_MEM_VIRTUAL 3 |
94 | 114 | ||
115 | /* defines for uio_port->porttype */ | ||
116 | #define UIO_PORT_NONE 0 | ||
117 | #define UIO_PORT_X86 1 | ||
118 | #define UIO_PORT_GPIO 2 | ||
119 | #define UIO_PORT_OTHER 3 | ||
120 | |||
95 | #endif /* _LINUX_UIO_DRIVER_H_ */ | 121 | #endif /* _LINUX_UIO_DRIVER_H_ */ |
diff --git a/include/linux/unwind.h b/include/linux/unwind.h deleted file mode 100644 index 7760860fa170..000000000000 --- a/include/linux/unwind.h +++ /dev/null | |||
@@ -1,68 +0,0 @@ | |||
1 | #ifndef _LINUX_UNWIND_H | ||
2 | #define _LINUX_UNWIND_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 2002-2006 Novell, Inc. | ||
6 | * Jan Beulich <jbeulich@novell.com> | ||
7 | * This code is released under version 2 of the GNU GPL. | ||
8 | * | ||
9 | * A simple API for unwinding kernel stacks. This is used for | ||
10 | * debugging and error reporting purposes. The kernel doesn't need | ||
11 | * full-blown stack unwinding with all the bells and whistles, so there | ||
12 | * is not much point in implementing the full Dwarf2 unwind API. | ||
13 | */ | ||
14 | |||
15 | struct module; | ||
16 | |||
17 | struct unwind_frame_info {}; | ||
18 | |||
19 | static inline void unwind_init(void) {} | ||
20 | static inline void unwind_setup(void) {} | ||
21 | |||
22 | #ifdef CONFIG_MODULES | ||
23 | |||
24 | static inline void *unwind_add_table(struct module *mod, | ||
25 | const void *table_start, | ||
26 | unsigned long table_size) | ||
27 | { | ||
28 | return NULL; | ||
29 | } | ||
30 | |||
31 | static inline void unwind_remove_table(void *handle, int init_only) | ||
32 | { | ||
33 | } | ||
34 | |||
35 | #endif | ||
36 | |||
37 | static inline int unwind_init_frame_info(struct unwind_frame_info *info, | ||
38 | struct task_struct *tsk, | ||
39 | const struct pt_regs *regs) | ||
40 | { | ||
41 | return -ENOSYS; | ||
42 | } | ||
43 | |||
44 | static inline int unwind_init_blocked(struct unwind_frame_info *info, | ||
45 | struct task_struct *tsk) | ||
46 | { | ||
47 | return -ENOSYS; | ||
48 | } | ||
49 | |||
50 | static inline int unwind_init_running(struct unwind_frame_info *info, | ||
51 | asmlinkage int (*cb)(struct unwind_frame_info *, | ||
52 | void *arg), | ||
53 | void *arg) | ||
54 | { | ||
55 | return -ENOSYS; | ||
56 | } | ||
57 | |||
58 | static inline int unwind(struct unwind_frame_info *info) | ||
59 | { | ||
60 | return -ENOSYS; | ||
61 | } | ||
62 | |||
63 | static inline int unwind_to_user(struct unwind_frame_info *info) | ||
64 | { | ||
65 | return -ENOSYS; | ||
66 | } | ||
67 | |||
68 | #endif /* _LINUX_UNWIND_H */ | ||
diff --git a/include/linux/usb.h b/include/linux/usb.h index f72aa51f7bcd..85ee9be9361e 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -108,6 +108,7 @@ enum usb_interface_condition { | |||
108 | * (in probe()), bound to a driver, or unbinding (in disconnect()) | 108 | * (in probe()), bound to a driver, or unbinding (in disconnect()) |
109 | * @is_active: flag set when the interface is bound and not suspended. | 109 | * @is_active: flag set when the interface is bound and not suspended. |
110 | * @sysfs_files_created: sysfs attributes exist | 110 | * @sysfs_files_created: sysfs attributes exist |
111 | * @ep_devs_created: endpoint child pseudo-devices exist | ||
111 | * @unregistering: flag set when the interface is being unregistered | 112 | * @unregistering: flag set when the interface is being unregistered |
112 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup | 113 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup |
113 | * capability during autosuspend. | 114 | * capability during autosuspend. |
@@ -120,6 +121,11 @@ enum usb_interface_condition { | |||
120 | * to the sysfs representation for that device. | 121 | * to the sysfs representation for that device. |
121 | * @pm_usage_cnt: PM usage counter for this interface; autosuspend is not | 122 | * @pm_usage_cnt: PM usage counter for this interface; autosuspend is not |
122 | * allowed unless the counter is 0. | 123 | * allowed unless the counter is 0. |
124 | * @reset_ws: Used for scheduling resets from atomic context. | ||
125 | * @reset_running: set to 1 if the interface is currently running a | ||
126 | * queued reset so that usb_cancel_queued_reset() doesn't try to | ||
127 | * remove from the workqueue when running inside the worker | ||
128 | * thread. See __usb_queue_reset_device(). | ||
123 | * | 129 | * |
124 | * USB device drivers attach to interfaces on a physical device. Each | 130 | * USB device drivers attach to interfaces on a physical device. Each |
125 | * interface encapsulates a single high level function, such as feeding | 131 | * interface encapsulates a single high level function, such as feeding |
@@ -164,14 +170,17 @@ struct usb_interface { | |||
164 | enum usb_interface_condition condition; /* state of binding */ | 170 | enum usb_interface_condition condition; /* state of binding */ |
165 | unsigned is_active:1; /* the interface is not suspended */ | 171 | unsigned is_active:1; /* the interface is not suspended */ |
166 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ | 172 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ |
173 | unsigned ep_devs_created:1; /* endpoint "devices" exist */ | ||
167 | unsigned unregistering:1; /* unregistration is in progress */ | 174 | unsigned unregistering:1; /* unregistration is in progress */ |
168 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ | 175 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ |
169 | unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ | 176 | unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ |
170 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ | 177 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ |
178 | unsigned reset_running:1; | ||
171 | 179 | ||
172 | struct device dev; /* interface specific device info */ | 180 | struct device dev; /* interface specific device info */ |
173 | struct device *usb_dev; | 181 | struct device *usb_dev; |
174 | int pm_usage_cnt; /* usage counter for autosuspend */ | 182 | int pm_usage_cnt; /* usage counter for autosuspend */ |
183 | struct work_struct reset_ws; /* for resets in atomic context */ | ||
175 | }; | 184 | }; |
176 | #define to_usb_interface(d) container_of(d, struct usb_interface, dev) | 185 | #define to_usb_interface(d) container_of(d, struct usb_interface, dev) |
177 | #define interface_to_usbdev(intf) \ | 186 | #define interface_to_usbdev(intf) \ |
@@ -329,7 +338,7 @@ struct usb_bus { | |||
329 | #endif | 338 | #endif |
330 | struct device *dev; /* device for this bus */ | 339 | struct device *dev; /* device for this bus */ |
331 | 340 | ||
332 | #if defined(CONFIG_USB_MON) | 341 | #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) |
333 | struct mon_bus *mon_bus; /* non-null when associated */ | 342 | struct mon_bus *mon_bus; /* non-null when associated */ |
334 | int monitored; /* non-zero when monitored */ | 343 | int monitored; /* non-zero when monitored */ |
335 | #endif | 344 | #endif |
@@ -398,6 +407,7 @@ struct usb_tt; | |||
398 | * @urbnum: number of URBs submitted for the whole device | 407 | * @urbnum: number of URBs submitted for the whole device |
399 | * @active_duration: total time device is not suspended | 408 | * @active_duration: total time device is not suspended |
400 | * @autosuspend: for delayed autosuspends | 409 | * @autosuspend: for delayed autosuspends |
410 | * @autoresume: for autoresumes requested while in_interrupt | ||
401 | * @pm_mutex: protects PM operations | 411 | * @pm_mutex: protects PM operations |
402 | * @last_busy: time of last use | 412 | * @last_busy: time of last use |
403 | * @autosuspend_delay: in jiffies | 413 | * @autosuspend_delay: in jiffies |
@@ -476,6 +486,7 @@ struct usb_device { | |||
476 | 486 | ||
477 | #ifdef CONFIG_PM | 487 | #ifdef CONFIG_PM |
478 | struct delayed_work autosuspend; | 488 | struct delayed_work autosuspend; |
489 | struct work_struct autoresume; | ||
479 | struct mutex pm_mutex; | 490 | struct mutex pm_mutex; |
480 | 491 | ||
481 | unsigned long last_busy; | 492 | unsigned long last_busy; |
@@ -505,6 +516,7 @@ extern int usb_lock_device_for_reset(struct usb_device *udev, | |||
505 | 516 | ||
506 | /* USB port reset for device reinitialization */ | 517 | /* USB port reset for device reinitialization */ |
507 | extern int usb_reset_device(struct usb_device *dev); | 518 | extern int usb_reset_device(struct usb_device *dev); |
519 | extern void usb_queue_reset_device(struct usb_interface *dev); | ||
508 | 520 | ||
509 | extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); | 521 | extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); |
510 | 522 | ||
@@ -513,6 +525,8 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); | |||
513 | extern int usb_autopm_set_interface(struct usb_interface *intf); | 525 | extern int usb_autopm_set_interface(struct usb_interface *intf); |
514 | extern int usb_autopm_get_interface(struct usb_interface *intf); | 526 | extern int usb_autopm_get_interface(struct usb_interface *intf); |
515 | extern void usb_autopm_put_interface(struct usb_interface *intf); | 527 | extern void usb_autopm_put_interface(struct usb_interface *intf); |
528 | extern int usb_autopm_get_interface_async(struct usb_interface *intf); | ||
529 | extern void usb_autopm_put_interface_async(struct usb_interface *intf); | ||
516 | 530 | ||
517 | static inline void usb_autopm_enable(struct usb_interface *intf) | 531 | static inline void usb_autopm_enable(struct usb_interface *intf) |
518 | { | 532 | { |
@@ -539,8 +553,13 @@ static inline int usb_autopm_set_interface(struct usb_interface *intf) | |||
539 | static inline int usb_autopm_get_interface(struct usb_interface *intf) | 553 | static inline int usb_autopm_get_interface(struct usb_interface *intf) |
540 | { return 0; } | 554 | { return 0; } |
541 | 555 | ||
556 | static inline int usb_autopm_get_interface_async(struct usb_interface *intf) | ||
557 | { return 0; } | ||
558 | |||
542 | static inline void usb_autopm_put_interface(struct usb_interface *intf) | 559 | static inline void usb_autopm_put_interface(struct usb_interface *intf) |
543 | { } | 560 | { } |
561 | static inline void usb_autopm_put_interface_async(struct usb_interface *intf) | ||
562 | { } | ||
544 | static inline void usb_autopm_enable(struct usb_interface *intf) | 563 | static inline void usb_autopm_enable(struct usb_interface *intf) |
545 | { } | 564 | { } |
546 | static inline void usb_autopm_disable(struct usb_interface *intf) | 565 | static inline void usb_autopm_disable(struct usb_interface *intf) |
@@ -1050,7 +1069,7 @@ struct usb_device_driver { | |||
1050 | void (*disconnect) (struct usb_device *udev); | 1069 | void (*disconnect) (struct usb_device *udev); |
1051 | 1070 | ||
1052 | int (*suspend) (struct usb_device *udev, pm_message_t message); | 1071 | int (*suspend) (struct usb_device *udev, pm_message_t message); |
1053 | int (*resume) (struct usb_device *udev); | 1072 | int (*resume) (struct usb_device *udev, pm_message_t message); |
1054 | struct usbdrv_wrap drvwrap; | 1073 | struct usbdrv_wrap drvwrap; |
1055 | unsigned int supports_autosuspend:1; | 1074 | unsigned int supports_autosuspend:1; |
1056 | }; | 1075 | }; |
@@ -1321,7 +1340,7 @@ struct urb { | |||
1321 | struct kref kref; /* reference count of the URB */ | 1340 | struct kref kref; /* reference count of the URB */ |
1322 | void *hcpriv; /* private data for host controller */ | 1341 | void *hcpriv; /* private data for host controller */ |
1323 | atomic_t use_count; /* concurrent submissions counter */ | 1342 | atomic_t use_count; /* concurrent submissions counter */ |
1324 | u8 reject; /* submissions will fail */ | 1343 | atomic_t reject; /* submissions will fail */ |
1325 | int unlinked; /* unlink error code */ | 1344 | int unlinked; /* unlink error code */ |
1326 | 1345 | ||
1327 | /* public: documented fields in the urb that can be used by drivers */ | 1346 | /* public: documented fields in the urb that can be used by drivers */ |
@@ -1466,6 +1485,7 @@ extern void usb_poison_urb(struct urb *urb); | |||
1466 | extern void usb_unpoison_urb(struct urb *urb); | 1485 | extern void usb_unpoison_urb(struct urb *urb); |
1467 | extern void usb_kill_anchored_urbs(struct usb_anchor *anchor); | 1486 | extern void usb_kill_anchored_urbs(struct usb_anchor *anchor); |
1468 | extern void usb_poison_anchored_urbs(struct usb_anchor *anchor); | 1487 | extern void usb_poison_anchored_urbs(struct usb_anchor *anchor); |
1488 | extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor); | ||
1469 | extern void usb_unlink_anchored_urbs(struct usb_anchor *anchor); | 1489 | extern void usb_unlink_anchored_urbs(struct usb_anchor *anchor); |
1470 | extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor); | 1490 | extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor); |
1471 | extern void usb_unanchor_urb(struct urb *urb); | 1491 | extern void usb_unanchor_urb(struct urb *urb); |
@@ -1722,10 +1742,6 @@ extern void usb_unregister_notify(struct notifier_block *nb); | |||
1722 | 1742 | ||
1723 | #define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \ | 1743 | #define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \ |
1724 | format "\n" , ## arg) | 1744 | format "\n" , ## arg) |
1725 | #define info(format, arg...) printk(KERN_INFO KBUILD_MODNAME ": " \ | ||
1726 | format "\n" , ## arg) | ||
1727 | #define warn(format, arg...) printk(KERN_WARNING KBUILD_MODNAME ": " \ | ||
1728 | format "\n" , ## arg) | ||
1729 | 1745 | ||
1730 | #endif /* __KERNEL__ */ | 1746 | #endif /* __KERNEL__ */ |
1731 | 1747 | ||
diff --git a/include/linux/usb/association.h b/include/linux/usb/association.h index 07c5e3cf5898..0a4a18b3c1bb 100644 --- a/include/linux/usb/association.h +++ b/include/linux/usb/association.h | |||
@@ -28,17 +28,17 @@ struct wusb_am_attr { | |||
28 | }; | 28 | }; |
29 | 29 | ||
30 | /* Different fields defined by the spec */ | 30 | /* Different fields defined by the spec */ |
31 | #define WUSB_AR_AssociationTypeId { .id = 0x0000, .len = 2 } | 31 | #define WUSB_AR_AssociationTypeId { .id = cpu_to_le16(0x0000), .len = cpu_to_le16(2) } |
32 | #define WUSB_AR_AssociationSubTypeId { .id = 0x0001, .len = 2 } | 32 | #define WUSB_AR_AssociationSubTypeId { .id = cpu_to_le16(0x0001), .len = cpu_to_le16(2) } |
33 | #define WUSB_AR_Length { .id = 0x0002, .len = 4 } | 33 | #define WUSB_AR_Length { .id = cpu_to_le16(0x0002), .len = cpu_to_le16(4) } |
34 | #define WUSB_AR_AssociationStatus { .id = 0x0004, .len = 4 } | 34 | #define WUSB_AR_AssociationStatus { .id = cpu_to_le16(0x0004), .len = cpu_to_le16(4) } |
35 | #define WUSB_AR_LangID { .id = 0x0008, .len = 2 } | 35 | #define WUSB_AR_LangID { .id = cpu_to_le16(0x0008), .len = cpu_to_le16(2) } |
36 | #define WUSB_AR_DeviceFriendlyName { .id = 0x000b, .len = 64 } /* max */ | 36 | #define WUSB_AR_DeviceFriendlyName { .id = cpu_to_le16(0x000b), .len = cpu_to_le16(64) } /* max */ |
37 | #define WUSB_AR_HostFriendlyName { .id = 0x000c, .len = 64 } /* max */ | 37 | #define WUSB_AR_HostFriendlyName { .id = cpu_to_le16(0x000c), .len = cpu_to_le16(64) } /* max */ |
38 | #define WUSB_AR_CHID { .id = 0x1000, .len = 16 } | 38 | #define WUSB_AR_CHID { .id = cpu_to_le16(0x1000), .len = cpu_to_le16(16) } |
39 | #define WUSB_AR_CDID { .id = 0x1001, .len = 16 } | 39 | #define WUSB_AR_CDID { .id = cpu_to_le16(0x1001), .len = cpu_to_le16(16) } |
40 | #define WUSB_AR_ConnectionContext { .id = 0x1002, .len = 48 } | 40 | #define WUSB_AR_ConnectionContext { .id = cpu_to_le16(0x1002), .len = cpu_to_le16(48) } |
41 | #define WUSB_AR_BandGroups { .id = 0x1004, .len = 2 } | 41 | #define WUSB_AR_BandGroups { .id = cpu_to_le16(0x1004), .len = cpu_to_le16(2) } |
42 | 42 | ||
43 | /* CBAF Control Requests (AMS1.0[T4-1] */ | 43 | /* CBAF Control Requests (AMS1.0[T4-1] */ |
44 | enum { | 44 | enum { |
diff --git a/include/linux/usb/gpio_vbus.h b/include/linux/usb/gpio_vbus.h new file mode 100644 index 000000000000..d9f03ccc2d60 --- /dev/null +++ b/include/linux/usb/gpio_vbus.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * A simple GPIO VBUS sensing driver for B peripheral only devices | ||
3 | * with internal transceivers. | ||
4 | * Optionally D+ pullup can be controlled by a second GPIO. | ||
5 | * | ||
6 | * Copyright (c) 2008 Philipp Zabel <philipp.zabel@gmail.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | /** | ||
15 | * struct gpio_vbus_mach_info - configuration for gpio_vbus | ||
16 | * @gpio_vbus: VBUS sensing GPIO | ||
17 | * @gpio_pullup: optional D+ or D- pullup GPIO (else negative/invalid) | ||
18 | * @gpio_vbus_inverted: true if gpio_vbus is active low | ||
19 | * @gpio_pullup_inverted: true if gpio_pullup is active low | ||
20 | * | ||
21 | * The VBUS sensing GPIO should have a pulldown, which will normally be | ||
22 | * part of a resistor ladder turning a 4.0V-5.25V level on VBUS into a | ||
23 | * value the GPIO detects as active. Some systems will use comparators. | ||
24 | */ | ||
25 | struct gpio_vbus_mach_info { | ||
26 | int gpio_vbus; | ||
27 | int gpio_pullup; | ||
28 | bool gpio_vbus_inverted; | ||
29 | bool gpio_pullup_inverted; | ||
30 | }; | ||
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h index 630962c04ca4..d6aad0ea6033 100644 --- a/include/linux/usb/musb.h +++ b/include/linux/usb/musb.h | |||
@@ -47,6 +47,11 @@ struct musb_hdrc_config { | |||
47 | u8 ram_bits; /* ram address size */ | 47 | u8 ram_bits; /* ram address size */ |
48 | 48 | ||
49 | struct musb_hdrc_eps_bits *eps_bits; | 49 | struct musb_hdrc_eps_bits *eps_bits; |
50 | #ifdef CONFIG_BLACKFIN | ||
51 | /* A GPIO controlling VRSEL in Blackfin */ | ||
52 | unsigned int gpio_vrsel; | ||
53 | #endif | ||
54 | |||
50 | }; | 55 | }; |
51 | 56 | ||
52 | struct musb_hdrc_platform_data { | 57 | struct musb_hdrc_platform_data { |
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index 1db25d152ad8..94df4fe6c6c0 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h | |||
@@ -84,6 +84,7 @@ extern int otg_set_transceiver(struct otg_transceiver *); | |||
84 | 84 | ||
85 | /* for usb host and peripheral controller drivers */ | 85 | /* for usb host and peripheral controller drivers */ |
86 | extern struct otg_transceiver *otg_get_transceiver(void); | 86 | extern struct otg_transceiver *otg_get_transceiver(void); |
87 | extern void otg_put_transceiver(struct otg_transceiver *); | ||
87 | 88 | ||
88 | static inline int | 89 | static inline int |
89 | otg_start_hnp(struct otg_transceiver *otg) | 90 | otg_start_hnp(struct otg_transceiver *otg) |
diff --git a/include/linux/usb/wusb-wa.h b/include/linux/usb/wusb-wa.h index a102561e7026..fb7c359bdfba 100644 --- a/include/linux/usb/wusb-wa.h +++ b/include/linux/usb/wusb-wa.h | |||
@@ -51,6 +51,7 @@ enum { | |||
51 | WUSB_REQ_GET_TIME = 25, | 51 | WUSB_REQ_GET_TIME = 25, |
52 | WUSB_REQ_SET_STREAM_IDX = 26, | 52 | WUSB_REQ_SET_STREAM_IDX = 26, |
53 | WUSB_REQ_SET_WUSB_MAS = 27, | 53 | WUSB_REQ_SET_WUSB_MAS = 27, |
54 | WUSB_REQ_CHAN_STOP = 28, | ||
54 | }; | 55 | }; |
55 | 56 | ||
56 | 57 | ||
diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h index d9a3bbe38e6b..1eea1ab68dc4 100644 --- a/include/linux/usb_usual.h +++ b/include/linux/usb_usual.h | |||
@@ -52,8 +52,11 @@ | |||
52 | US_FLAG(MAX_SECTORS_MIN,0x00002000) \ | 52 | US_FLAG(MAX_SECTORS_MIN,0x00002000) \ |
53 | /* Sets max_sectors to arch min */ \ | 53 | /* Sets max_sectors to arch min */ \ |
54 | US_FLAG(BULK_IGNORE_TAG,0x00004000) \ | 54 | US_FLAG(BULK_IGNORE_TAG,0x00004000) \ |
55 | /* Ignore tag mismatch in bulk operations */ | 55 | /* Ignore tag mismatch in bulk operations */ \ |
56 | 56 | US_FLAG(SANE_SENSE, 0x00008000) \ | |
57 | /* Sane Sense (> 18 bytes) */ \ | ||
58 | US_FLAG(CAPACITY_OK, 0x00010000) \ | ||
59 | /* READ CAPACITY response is correct */ | ||
57 | 60 | ||
58 | #define US_FLAG(name, value) US_FL_##name = value , | 61 | #define US_FLAG(name, value) US_FL_##name = value , |
59 | enum { US_DO_ALL_FLAGS }; | 62 | enum { US_DO_ALL_FLAGS }; |
diff --git a/include/linux/uwb.h b/include/linux/uwb.h index f9ccbd9a2ced..c02128991ff7 100644 --- a/include/linux/uwb.h +++ b/include/linux/uwb.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/device.h> | 30 | #include <linux/device.h> |
31 | #include <linux/mutex.h> | 31 | #include <linux/mutex.h> |
32 | #include <linux/timer.h> | 32 | #include <linux/timer.h> |
33 | #include <linux/wait.h> | ||
33 | #include <linux/workqueue.h> | 34 | #include <linux/workqueue.h> |
34 | #include <linux/uwb/spec.h> | 35 | #include <linux/uwb/spec.h> |
35 | 36 | ||
@@ -66,6 +67,7 @@ struct uwb_dev { | |||
66 | struct uwb_dev_addr dev_addr; | 67 | struct uwb_dev_addr dev_addr; |
67 | int beacon_slot; | 68 | int beacon_slot; |
68 | DECLARE_BITMAP(streams, UWB_NUM_STREAMS); | 69 | DECLARE_BITMAP(streams, UWB_NUM_STREAMS); |
70 | DECLARE_BITMAP(last_availability_bm, UWB_NUM_MAS); | ||
69 | }; | 71 | }; |
70 | #define to_uwb_dev(d) container_of(d, struct uwb_dev, dev) | 72 | #define to_uwb_dev(d) container_of(d, struct uwb_dev, dev) |
71 | 73 | ||
@@ -86,12 +88,31 @@ struct uwb_notifs_chain { | |||
86 | struct mutex mutex; | 88 | struct mutex mutex; |
87 | }; | 89 | }; |
88 | 90 | ||
91 | /* Beacon cache list */ | ||
92 | struct uwb_beca { | ||
93 | struct list_head list; | ||
94 | size_t entries; | ||
95 | struct mutex mutex; | ||
96 | }; | ||
97 | |||
98 | /* Event handling thread. */ | ||
99 | struct uwbd { | ||
100 | int pid; | ||
101 | struct task_struct *task; | ||
102 | wait_queue_head_t wq; | ||
103 | struct list_head event_list; | ||
104 | spinlock_t event_list_lock; | ||
105 | }; | ||
106 | |||
89 | /** | 107 | /** |
90 | * struct uwb_mas_bm - a bitmap of all MAS in a superframe | 108 | * struct uwb_mas_bm - a bitmap of all MAS in a superframe |
91 | * @bm: a bitmap of length #UWB_NUM_MAS | 109 | * @bm: a bitmap of length #UWB_NUM_MAS |
92 | */ | 110 | */ |
93 | struct uwb_mas_bm { | 111 | struct uwb_mas_bm { |
94 | DECLARE_BITMAP(bm, UWB_NUM_MAS); | 112 | DECLARE_BITMAP(bm, UWB_NUM_MAS); |
113 | DECLARE_BITMAP(unsafe_bm, UWB_NUM_MAS); | ||
114 | int safe; | ||
115 | int unsafe; | ||
95 | }; | 116 | }; |
96 | 117 | ||
97 | /** | 118 | /** |
@@ -117,14 +138,24 @@ struct uwb_mas_bm { | |||
117 | * FIXME: further target states TBD. | 138 | * FIXME: further target states TBD. |
118 | */ | 139 | */ |
119 | enum uwb_rsv_state { | 140 | enum uwb_rsv_state { |
120 | UWB_RSV_STATE_NONE, | 141 | UWB_RSV_STATE_NONE = 0, |
121 | UWB_RSV_STATE_O_INITIATED, | 142 | UWB_RSV_STATE_O_INITIATED, |
122 | UWB_RSV_STATE_O_PENDING, | 143 | UWB_RSV_STATE_O_PENDING, |
123 | UWB_RSV_STATE_O_MODIFIED, | 144 | UWB_RSV_STATE_O_MODIFIED, |
124 | UWB_RSV_STATE_O_ESTABLISHED, | 145 | UWB_RSV_STATE_O_ESTABLISHED, |
146 | UWB_RSV_STATE_O_TO_BE_MOVED, | ||
147 | UWB_RSV_STATE_O_MOVE_EXPANDING, | ||
148 | UWB_RSV_STATE_O_MOVE_COMBINING, | ||
149 | UWB_RSV_STATE_O_MOVE_REDUCING, | ||
125 | UWB_RSV_STATE_T_ACCEPTED, | 150 | UWB_RSV_STATE_T_ACCEPTED, |
126 | UWB_RSV_STATE_T_DENIED, | 151 | UWB_RSV_STATE_T_DENIED, |
152 | UWB_RSV_STATE_T_CONFLICT, | ||
127 | UWB_RSV_STATE_T_PENDING, | 153 | UWB_RSV_STATE_T_PENDING, |
154 | UWB_RSV_STATE_T_EXPANDING_ACCEPTED, | ||
155 | UWB_RSV_STATE_T_EXPANDING_CONFLICT, | ||
156 | UWB_RSV_STATE_T_EXPANDING_PENDING, | ||
157 | UWB_RSV_STATE_T_EXPANDING_DENIED, | ||
158 | UWB_RSV_STATE_T_RESIZED, | ||
128 | 159 | ||
129 | UWB_RSV_STATE_LAST, | 160 | UWB_RSV_STATE_LAST, |
130 | }; | 161 | }; |
@@ -149,6 +180,12 @@ struct uwb_rsv_target { | |||
149 | }; | 180 | }; |
150 | }; | 181 | }; |
151 | 182 | ||
183 | struct uwb_rsv_move { | ||
184 | struct uwb_mas_bm final_mas; | ||
185 | struct uwb_ie_drp *companion_drp_ie; | ||
186 | struct uwb_mas_bm companion_mas; | ||
187 | }; | ||
188 | |||
152 | /* | 189 | /* |
153 | * Number of streams reserved for reservations targeted at DevAddrs. | 190 | * Number of streams reserved for reservations targeted at DevAddrs. |
154 | */ | 191 | */ |
@@ -186,6 +223,7 @@ typedef void (*uwb_rsv_cb_f)(struct uwb_rsv *rsv); | |||
186 | * | 223 | * |
187 | * @status: negotiation status | 224 | * @status: negotiation status |
188 | * @stream: stream index allocated for this reservation | 225 | * @stream: stream index allocated for this reservation |
226 | * @tiebreaker: conflict tiebreaker for this reservation | ||
189 | * @mas: reserved MAS | 227 | * @mas: reserved MAS |
190 | * @drp_ie: the DRP IE | 228 | * @drp_ie: the DRP IE |
191 | * @ie_valid: true iff the DRP IE matches the reservation parameters | 229 | * @ie_valid: true iff the DRP IE matches the reservation parameters |
@@ -201,25 +239,29 @@ struct uwb_rsv { | |||
201 | struct uwb_rc *rc; | 239 | struct uwb_rc *rc; |
202 | struct list_head rc_node; | 240 | struct list_head rc_node; |
203 | struct list_head pal_node; | 241 | struct list_head pal_node; |
242 | struct kref kref; | ||
204 | 243 | ||
205 | struct uwb_dev *owner; | 244 | struct uwb_dev *owner; |
206 | struct uwb_rsv_target target; | 245 | struct uwb_rsv_target target; |
207 | enum uwb_drp_type type; | 246 | enum uwb_drp_type type; |
208 | int max_mas; | 247 | int max_mas; |
209 | int min_mas; | 248 | int min_mas; |
210 | int sparsity; | 249 | int max_interval; |
211 | bool is_multicast; | 250 | bool is_multicast; |
212 | 251 | ||
213 | uwb_rsv_cb_f callback; | 252 | uwb_rsv_cb_f callback; |
214 | void *pal_priv; | 253 | void *pal_priv; |
215 | 254 | ||
216 | enum uwb_rsv_state state; | 255 | enum uwb_rsv_state state; |
256 | bool needs_release_companion_mas; | ||
217 | u8 stream; | 257 | u8 stream; |
258 | u8 tiebreaker; | ||
218 | struct uwb_mas_bm mas; | 259 | struct uwb_mas_bm mas; |
219 | struct uwb_ie_drp *drp_ie; | 260 | struct uwb_ie_drp *drp_ie; |
261 | struct uwb_rsv_move mv; | ||
220 | bool ie_valid; | 262 | bool ie_valid; |
221 | struct timer_list timer; | 263 | struct timer_list timer; |
222 | bool expired; | 264 | struct work_struct handle_timeout_work; |
223 | }; | 265 | }; |
224 | 266 | ||
225 | static const | 267 | static const |
@@ -261,6 +303,13 @@ struct uwb_drp_avail { | |||
261 | bool ie_valid; | 303 | bool ie_valid; |
262 | }; | 304 | }; |
263 | 305 | ||
306 | struct uwb_drp_backoff_win { | ||
307 | u8 window; | ||
308 | u8 n; | ||
309 | int total_expired; | ||
310 | struct timer_list timer; | ||
311 | bool can_reserve_extra_mases; | ||
312 | }; | ||
264 | 313 | ||
265 | const char *uwb_rsv_state_str(enum uwb_rsv_state state); | 314 | const char *uwb_rsv_state_str(enum uwb_rsv_state state); |
266 | const char *uwb_rsv_type_str(enum uwb_drp_type type); | 315 | const char *uwb_rsv_type_str(enum uwb_drp_type type); |
@@ -276,6 +325,8 @@ void uwb_rsv_terminate(struct uwb_rsv *rsv); | |||
276 | 325 | ||
277 | void uwb_rsv_accept(struct uwb_rsv *rsv, uwb_rsv_cb_f cb, void *pal_priv); | 326 | void uwb_rsv_accept(struct uwb_rsv *rsv, uwb_rsv_cb_f cb, void *pal_priv); |
278 | 327 | ||
328 | void uwb_rsv_get_usable_mas(struct uwb_rsv *orig_rsv, struct uwb_mas_bm *mas); | ||
329 | |||
279 | /** | 330 | /** |
280 | * Radio Control Interface instance | 331 | * Radio Control Interface instance |
281 | * | 332 | * |
@@ -337,23 +388,33 @@ struct uwb_rc { | |||
337 | u8 ctx_roll; | 388 | u8 ctx_roll; |
338 | 389 | ||
339 | int beaconing; /* Beaconing state [channel number] */ | 390 | int beaconing; /* Beaconing state [channel number] */ |
391 | int beaconing_forced; | ||
340 | int scanning; | 392 | int scanning; |
341 | enum uwb_scan_type scan_type:3; | 393 | enum uwb_scan_type scan_type:3; |
342 | unsigned ready:1; | 394 | unsigned ready:1; |
343 | struct uwb_notifs_chain notifs_chain; | 395 | struct uwb_notifs_chain notifs_chain; |
396 | struct uwb_beca uwb_beca; | ||
397 | |||
398 | struct uwbd uwbd; | ||
344 | 399 | ||
400 | struct uwb_drp_backoff_win bow; | ||
345 | struct uwb_drp_avail drp_avail; | 401 | struct uwb_drp_avail drp_avail; |
346 | struct list_head reservations; | 402 | struct list_head reservations; |
403 | struct list_head cnflt_alien_list; | ||
404 | struct uwb_mas_bm cnflt_alien_bitmap; | ||
347 | struct mutex rsvs_mutex; | 405 | struct mutex rsvs_mutex; |
406 | spinlock_t rsvs_lock; | ||
348 | struct workqueue_struct *rsv_workq; | 407 | struct workqueue_struct *rsv_workq; |
349 | struct work_struct rsv_update_work; | ||
350 | 408 | ||
409 | struct delayed_work rsv_update_work; | ||
410 | struct delayed_work rsv_alien_bp_work; | ||
411 | int set_drp_ie_pending; | ||
351 | struct mutex ies_mutex; | 412 | struct mutex ies_mutex; |
352 | struct uwb_rc_cmd_set_ie *ies; | 413 | struct uwb_rc_cmd_set_ie *ies; |
353 | size_t ies_capacity; | 414 | size_t ies_capacity; |
354 | 415 | ||
355 | spinlock_t pal_lock; | ||
356 | struct list_head pals; | 416 | struct list_head pals; |
417 | int active_pals; | ||
357 | 418 | ||
358 | struct uwb_dbg *dbg; | 419 | struct uwb_dbg *dbg; |
359 | }; | 420 | }; |
@@ -361,11 +422,19 @@ struct uwb_rc { | |||
361 | 422 | ||
362 | /** | 423 | /** |
363 | * struct uwb_pal - a UWB PAL | 424 | * struct uwb_pal - a UWB PAL |
364 | * @name: descriptive name for this PAL (wushc, wlp, etc.). | 425 | * @name: descriptive name for this PAL (wusbhc, wlp, etc.). |
365 | * @device: a device for the PAL. Used to link the PAL and the radio | 426 | * @device: a device for the PAL. Used to link the PAL and the radio |
366 | * controller in sysfs. | 427 | * controller in sysfs. |
428 | * @rc: the radio controller the PAL uses. | ||
429 | * @channel_changed: called when the channel used by the radio changes. | ||
430 | * A channel of -1 means the channel has been stopped. | ||
367 | * @new_rsv: called when a peer requests a reservation (may be NULL if | 431 | * @new_rsv: called when a peer requests a reservation (may be NULL if |
368 | * the PAL cannot accept reservation requests). | 432 | * the PAL cannot accept reservation requests). |
433 | * @channel: channel being used by the PAL; 0 if the PAL isn't using | ||
434 | * the radio; -1 if the PAL wishes to use the radio but | ||
435 | * cannot. | ||
436 | * @debugfs_dir: a debugfs directory which the PAL can use for its own | ||
437 | * debugfs files. | ||
369 | * | 438 | * |
370 | * A Protocol Adaptation Layer (PAL) is a user of the WiMedia UWB | 439 | * A Protocol Adaptation Layer (PAL) is a user of the WiMedia UWB |
371 | * radio platform (e.g., WUSB, WLP or Bluetooth UWB AMP). | 440 | * radio platform (e.g., WUSB, WLP or Bluetooth UWB AMP). |
@@ -384,12 +453,21 @@ struct uwb_pal { | |||
384 | struct list_head node; | 453 | struct list_head node; |
385 | const char *name; | 454 | const char *name; |
386 | struct device *device; | 455 | struct device *device; |
387 | void (*new_rsv)(struct uwb_rsv *rsv); | 456 | struct uwb_rc *rc; |
457 | |||
458 | void (*channel_changed)(struct uwb_pal *pal, int channel); | ||
459 | void (*new_rsv)(struct uwb_pal *pal, struct uwb_rsv *rsv); | ||
460 | |||
461 | int channel; | ||
462 | struct dentry *debugfs_dir; | ||
388 | }; | 463 | }; |
389 | 464 | ||
390 | void uwb_pal_init(struct uwb_pal *pal); | 465 | void uwb_pal_init(struct uwb_pal *pal); |
391 | int uwb_pal_register(struct uwb_rc *rc, struct uwb_pal *pal); | 466 | int uwb_pal_register(struct uwb_pal *pal); |
392 | void uwb_pal_unregister(struct uwb_rc *rc, struct uwb_pal *pal); | 467 | void uwb_pal_unregister(struct uwb_pal *pal); |
468 | |||
469 | int uwb_radio_start(struct uwb_pal *pal); | ||
470 | void uwb_radio_stop(struct uwb_pal *pal); | ||
393 | 471 | ||
394 | /* | 472 | /* |
395 | * General public API | 473 | * General public API |
@@ -443,8 +521,6 @@ ssize_t uwb_rc_vcmd(struct uwb_rc *rc, const char *cmd_name, | |||
443 | struct uwb_rccb *cmd, size_t cmd_size, | 521 | struct uwb_rccb *cmd, size_t cmd_size, |
444 | u8 expected_type, u16 expected_event, | 522 | u8 expected_type, u16 expected_event, |
445 | struct uwb_rceb **preply); | 523 | struct uwb_rceb **preply); |
446 | ssize_t uwb_rc_get_ie(struct uwb_rc *, struct uwb_rc_evt_get_ie **); | ||
447 | int uwb_bg_joined(struct uwb_rc *rc); | ||
448 | 524 | ||
449 | size_t __uwb_addr_print(char *, size_t, const unsigned char *, int); | 525 | size_t __uwb_addr_print(char *, size_t, const unsigned char *, int); |
450 | 526 | ||
@@ -520,6 +596,8 @@ void uwb_rc_rm(struct uwb_rc *); | |||
520 | void uwb_rc_neh_grok(struct uwb_rc *, void *, size_t); | 596 | void uwb_rc_neh_grok(struct uwb_rc *, void *, size_t); |
521 | void uwb_rc_neh_error(struct uwb_rc *, int); | 597 | void uwb_rc_neh_error(struct uwb_rc *, int); |
522 | void uwb_rc_reset_all(struct uwb_rc *rc); | 598 | void uwb_rc_reset_all(struct uwb_rc *rc); |
599 | void uwb_rc_pre_reset(struct uwb_rc *rc); | ||
600 | void uwb_rc_post_reset(struct uwb_rc *rc); | ||
523 | 601 | ||
524 | /** | 602 | /** |
525 | * uwb_rsv_is_owner - is the owner of this reservation the RC? | 603 | * uwb_rsv_is_owner - is the owner of this reservation the RC? |
@@ -531,7 +609,9 @@ static inline bool uwb_rsv_is_owner(struct uwb_rsv *rsv) | |||
531 | } | 609 | } |
532 | 610 | ||
533 | /** | 611 | /** |
534 | * Events generated by UWB that can be passed to any listeners | 612 | * enum uwb_notifs - UWB events that can be passed to any listeners |
613 | * @UWB_NOTIF_ONAIR: a new neighbour has joined the beacon group. | ||
614 | * @UWB_NOTIF_OFFAIR: a neighbour has left the beacon group. | ||
535 | * | 615 | * |
536 | * Higher layers can register callback functions with the radio | 616 | * Higher layers can register callback functions with the radio |
537 | * controller using uwb_notifs_register(). The radio controller | 617 | * controller using uwb_notifs_register(). The radio controller |
@@ -539,8 +619,6 @@ static inline bool uwb_rsv_is_owner(struct uwb_rsv *rsv) | |||
539 | * nodes when an event occurs. | 619 | * nodes when an event occurs. |
540 | */ | 620 | */ |
541 | enum uwb_notifs { | 621 | enum uwb_notifs { |
542 | UWB_NOTIF_BG_JOIN = 0, /* radio controller joined a beacon group */ | ||
543 | UWB_NOTIF_BG_LEAVE = 1, /* radio controller left a beacon group */ | ||
544 | UWB_NOTIF_ONAIR, | 622 | UWB_NOTIF_ONAIR, |
545 | UWB_NOTIF_OFFAIR, | 623 | UWB_NOTIF_OFFAIR, |
546 | }; | 624 | }; |
@@ -652,22 +730,9 @@ static inline int edc_inc(struct edc *err_hist, u16 max_err, u16 timeframe) | |||
652 | 730 | ||
653 | /* Information Element handling */ | 731 | /* Information Element handling */ |
654 | 732 | ||
655 | /* For representing the state of writing to a buffer when iterating */ | ||
656 | struct uwb_buf_ctx { | ||
657 | char *buf; | ||
658 | size_t bytes, size; | ||
659 | }; | ||
660 | |||
661 | typedef int (*uwb_ie_f)(struct uwb_dev *, const struct uwb_ie_hdr *, | ||
662 | size_t, void *); | ||
663 | struct uwb_ie_hdr *uwb_ie_next(void **ptr, size_t *len); | 733 | struct uwb_ie_hdr *uwb_ie_next(void **ptr, size_t *len); |
664 | ssize_t uwb_ie_for_each(struct uwb_dev *uwb_dev, uwb_ie_f fn, void *data, | 734 | int uwb_rc_ie_add(struct uwb_rc *uwb_rc, const struct uwb_ie_hdr *ies, size_t size); |
665 | const void *buf, size_t size); | 735 | int uwb_rc_ie_rm(struct uwb_rc *uwb_rc, enum uwb_ie element_id); |
666 | int uwb_ie_dump_hex(struct uwb_dev *, const struct uwb_ie_hdr *, | ||
667 | size_t, void *); | ||
668 | int uwb_rc_set_ie(struct uwb_rc *, struct uwb_rc_cmd_set_ie *); | ||
669 | struct uwb_ie_hdr *uwb_ie_next(void **ptr, size_t *len); | ||
670 | |||
671 | 736 | ||
672 | /* | 737 | /* |
673 | * Transmission statistics | 738 | * Transmission statistics |
diff --git a/include/linux/uwb/debug-cmd.h b/include/linux/uwb/debug-cmd.h index 1141f41bab5c..8da004e25628 100644 --- a/include/linux/uwb/debug-cmd.h +++ b/include/linux/uwb/debug-cmd.h | |||
@@ -32,6 +32,10 @@ | |||
32 | enum uwb_dbg_cmd_type { | 32 | enum uwb_dbg_cmd_type { |
33 | UWB_DBG_CMD_RSV_ESTABLISH = 1, | 33 | UWB_DBG_CMD_RSV_ESTABLISH = 1, |
34 | UWB_DBG_CMD_RSV_TERMINATE = 2, | 34 | UWB_DBG_CMD_RSV_TERMINATE = 2, |
35 | UWB_DBG_CMD_IE_ADD = 3, | ||
36 | UWB_DBG_CMD_IE_RM = 4, | ||
37 | UWB_DBG_CMD_RADIO_START = 5, | ||
38 | UWB_DBG_CMD_RADIO_STOP = 6, | ||
35 | }; | 39 | }; |
36 | 40 | ||
37 | struct uwb_dbg_cmd_rsv_establish { | 41 | struct uwb_dbg_cmd_rsv_establish { |
@@ -39,18 +43,25 @@ struct uwb_dbg_cmd_rsv_establish { | |||
39 | __u8 type; | 43 | __u8 type; |
40 | __u16 max_mas; | 44 | __u16 max_mas; |
41 | __u16 min_mas; | 45 | __u16 min_mas; |
42 | __u8 sparsity; | 46 | __u8 max_interval; |
43 | }; | 47 | }; |
44 | 48 | ||
45 | struct uwb_dbg_cmd_rsv_terminate { | 49 | struct uwb_dbg_cmd_rsv_terminate { |
46 | int index; | 50 | int index; |
47 | }; | 51 | }; |
48 | 52 | ||
53 | struct uwb_dbg_cmd_ie { | ||
54 | __u8 data[128]; | ||
55 | int len; | ||
56 | }; | ||
57 | |||
49 | struct uwb_dbg_cmd { | 58 | struct uwb_dbg_cmd { |
50 | __u32 type; | 59 | __u32 type; |
51 | union { | 60 | union { |
52 | struct uwb_dbg_cmd_rsv_establish rsv_establish; | 61 | struct uwb_dbg_cmd_rsv_establish rsv_establish; |
53 | struct uwb_dbg_cmd_rsv_terminate rsv_terminate; | 62 | struct uwb_dbg_cmd_rsv_terminate rsv_terminate; |
63 | struct uwb_dbg_cmd_ie ie_add; | ||
64 | struct uwb_dbg_cmd_ie ie_rm; | ||
54 | }; | 65 | }; |
55 | }; | 66 | }; |
56 | 67 | ||
diff --git a/include/linux/uwb/debug.h b/include/linux/uwb/debug.h deleted file mode 100644 index a86a73fe303f..000000000000 --- a/include/linux/uwb/debug.h +++ /dev/null | |||
@@ -1,82 +0,0 @@ | |||
1 | /* | ||
2 | * Ultra Wide Band | ||
3 | * Debug Support | ||
4 | * | ||
5 | * Copyright (C) 2005-2006 Intel Corporation | ||
6 | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License version | ||
10 | * 2 as published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
20 | * 02110-1301, USA. | ||
21 | * | ||
22 | * | ||
23 | * FIXME: doc | ||
24 | * Invoke like: | ||
25 | * | ||
26 | * #define D_LOCAL 4 | ||
27 | * #include <linux/uwb/debug.h> | ||
28 | * | ||
29 | * At the end of your include files. | ||
30 | */ | ||
31 | #include <linux/types.h> | ||
32 | |||
33 | struct device; | ||
34 | extern void dump_bytes(struct device *dev, const void *_buf, size_t rsize); | ||
35 | |||
36 | /* Master debug switch; !0 enables, 0 disables */ | ||
37 | #define D_MASTER (!0) | ||
38 | |||
39 | /* Local (per-file) debug switch; #define before #including */ | ||
40 | #ifndef D_LOCAL | ||
41 | #define D_LOCAL 0 | ||
42 | #endif | ||
43 | |||
44 | #undef __d_printf | ||
45 | #undef d_fnstart | ||
46 | #undef d_fnend | ||
47 | #undef d_printf | ||
48 | #undef d_dump | ||
49 | |||
50 | #define __d_printf(l, _tag, _dev, f, a...) \ | ||
51 | do { \ | ||
52 | struct device *__dev = (_dev); \ | ||
53 | if (D_MASTER && D_LOCAL >= (l)) { \ | ||
54 | char __head[64] = ""; \ | ||
55 | if (_dev != NULL) { \ | ||
56 | if ((unsigned long)__dev < 4096) \ | ||
57 | printk(KERN_ERR "E: Corrupt dev %p\n", \ | ||
58 | __dev); \ | ||
59 | else \ | ||
60 | snprintf(__head, sizeof(__head), \ | ||
61 | "%s %s: ", \ | ||
62 | dev_driver_string(__dev), \ | ||
63 | __dev->bus_id); \ | ||
64 | } \ | ||
65 | printk(KERN_ERR "%s%s" _tag ": " f, __head, \ | ||
66 | __func__, ## a); \ | ||
67 | } \ | ||
68 | } while (0 && _dev) | ||
69 | |||
70 | #define d_fnstart(l, _dev, f, a...) \ | ||
71 | __d_printf(l, " FNSTART", _dev, f, ## a) | ||
72 | #define d_fnend(l, _dev, f, a...) \ | ||
73 | __d_printf(l, " FNEND", _dev, f, ## a) | ||
74 | #define d_printf(l, _dev, f, a...) \ | ||
75 | __d_printf(l, "", _dev, f, ## a) | ||
76 | #define d_dump(l, _dev, ptr, size) \ | ||
77 | do { \ | ||
78 | struct device *__dev = _dev; \ | ||
79 | if (D_MASTER && D_LOCAL >= (l)) \ | ||
80 | dump_bytes(__dev, ptr, size); \ | ||
81 | } while (0 && _dev) | ||
82 | #define d_test(l) (D_MASTER && D_LOCAL >= (l)) | ||
diff --git a/include/linux/uwb/spec.h b/include/linux/uwb/spec.h index 198c15f8e251..b52e44f1bd33 100644 --- a/include/linux/uwb/spec.h +++ b/include/linux/uwb/spec.h | |||
@@ -59,6 +59,11 @@ enum { UWB_NUM_ZONES = 16 }; | |||
59 | #define UWB_MAS_PER_ZONE (UWB_NUM_MAS / UWB_NUM_ZONES) | 59 | #define UWB_MAS_PER_ZONE (UWB_NUM_MAS / UWB_NUM_ZONES) |
60 | 60 | ||
61 | /* | 61 | /* |
62 | * Number of MAS required before a row can be considered available. | ||
63 | */ | ||
64 | #define UWB_USABLE_MAS_PER_ROW (UWB_NUM_ZONES - 1) | ||
65 | |||
66 | /* | ||
62 | * Number of streams per DRP reservation between a pair of devices. | 67 | * Number of streams per DRP reservation between a pair of devices. |
63 | * | 68 | * |
64 | * [ECMA-368] section 16.8.6. | 69 | * [ECMA-368] section 16.8.6. |
@@ -94,6 +99,26 @@ enum { UWB_BEACON_SLOT_LENGTH_US = 85 }; | |||
94 | enum { UWB_MAX_LOST_BEACONS = 3 }; | 99 | enum { UWB_MAX_LOST_BEACONS = 3 }; |
95 | 100 | ||
96 | /* | 101 | /* |
102 | * mDRPBackOffWinMin | ||
103 | * | ||
104 | * The minimum number of superframes to wait before trying to reserve | ||
105 | * extra MAS. | ||
106 | * | ||
107 | * [ECMA-368] section 17.16 | ||
108 | */ | ||
109 | enum { UWB_DRP_BACKOFF_WIN_MIN = 2 }; | ||
110 | |||
111 | /* | ||
112 | * mDRPBackOffWinMax | ||
113 | * | ||
114 | * The maximum number of superframes to wait before trying to reserve | ||
115 | * extra MAS. | ||
116 | * | ||
117 | * [ECMA-368] section 17.16 | ||
118 | */ | ||
119 | enum { UWB_DRP_BACKOFF_WIN_MAX = 16 }; | ||
120 | |||
121 | /* | ||
97 | * Length of a superframe in microseconds. | 122 | * Length of a superframe in microseconds. |
98 | */ | 123 | */ |
99 | #define UWB_SUPERFRAME_LENGTH_US (UWB_MAS_LENGTH_US * UWB_NUM_MAS) | 124 | #define UWB_SUPERFRAME_LENGTH_US (UWB_MAS_LENGTH_US * UWB_NUM_MAS) |
@@ -200,6 +225,12 @@ enum uwb_drp_reason { | |||
200 | UWB_DRP_REASON_MODIFIED, | 225 | UWB_DRP_REASON_MODIFIED, |
201 | }; | 226 | }; |
202 | 227 | ||
228 | /** Relinquish Request Reason Codes ([ECMA-368] table 113) */ | ||
229 | enum uwb_relinquish_req_reason { | ||
230 | UWB_RELINQUISH_REQ_REASON_NON_SPECIFIC = 0, | ||
231 | UWB_RELINQUISH_REQ_REASON_OVER_ALLOCATION, | ||
232 | }; | ||
233 | |||
203 | /** | 234 | /** |
204 | * DRP Notification Reason Codes (WHCI 0.95 [3.1.4.9]) | 235 | * DRP Notification Reason Codes (WHCI 0.95 [3.1.4.9]) |
205 | */ | 236 | */ |
@@ -252,6 +283,7 @@ enum uwb_ie { | |||
252 | UWB_APP_SPEC_PROBE_IE = 15, | 283 | UWB_APP_SPEC_PROBE_IE = 15, |
253 | UWB_IDENTIFICATION_IE = 19, | 284 | UWB_IDENTIFICATION_IE = 19, |
254 | UWB_MASTER_KEY_ID_IE = 20, | 285 | UWB_MASTER_KEY_ID_IE = 20, |
286 | UWB_RELINQUISH_REQUEST_IE = 21, | ||
255 | UWB_IE_WLP = 250, /* WiMedia Logical Link Control Protocol WLP 0.99 */ | 287 | UWB_IE_WLP = 250, /* WiMedia Logical Link Control Protocol WLP 0.99 */ |
256 | UWB_APP_SPEC_IE = 255, | 288 | UWB_APP_SPEC_IE = 255, |
257 | }; | 289 | }; |
@@ -365,6 +397,27 @@ struct uwb_ie_drp_avail { | |||
365 | DECLARE_BITMAP(bmp, UWB_NUM_MAS); | 397 | DECLARE_BITMAP(bmp, UWB_NUM_MAS); |
366 | } __attribute__((packed)); | 398 | } __attribute__((packed)); |
367 | 399 | ||
400 | /* Relinqish Request IE ([ECMA-368] section 16.8.19). */ | ||
401 | struct uwb_relinquish_request_ie { | ||
402 | struct uwb_ie_hdr hdr; | ||
403 | __le16 relinquish_req_control; | ||
404 | struct uwb_dev_addr dev_addr; | ||
405 | struct uwb_drp_alloc allocs[]; | ||
406 | } __attribute__((packed)); | ||
407 | |||
408 | static inline int uwb_ie_relinquish_req_reason_code(struct uwb_relinquish_request_ie *ie) | ||
409 | { | ||
410 | return (le16_to_cpu(ie->relinquish_req_control) >> 0) & 0xf; | ||
411 | } | ||
412 | |||
413 | static inline void uwb_ie_relinquish_req_set_reason_code(struct uwb_relinquish_request_ie *ie, | ||
414 | int reason_code) | ||
415 | { | ||
416 | u16 ctrl = le16_to_cpu(ie->relinquish_req_control); | ||
417 | ctrl = (ctrl & ~(0xf << 0)) | (reason_code << 0); | ||
418 | ie->relinquish_req_control = cpu_to_le16(ctrl); | ||
419 | } | ||
420 | |||
368 | /** | 421 | /** |
369 | * The Vendor ID is set to an OUI that indicates the vendor of the device. | 422 | * The Vendor ID is set to an OUI that indicates the vendor of the device. |
370 | * ECMA-368 [16.8.10] | 423 | * ECMA-368 [16.8.10] |
diff --git a/include/linux/uwb/umc.h b/include/linux/uwb/umc.h index 36a39e34f8d7..4b4fc0f43855 100644 --- a/include/linux/uwb/umc.h +++ b/include/linux/uwb/umc.h | |||
@@ -89,6 +89,8 @@ struct umc_driver { | |||
89 | void (*remove)(struct umc_dev *); | 89 | void (*remove)(struct umc_dev *); |
90 | int (*suspend)(struct umc_dev *, pm_message_t state); | 90 | int (*suspend)(struct umc_dev *, pm_message_t state); |
91 | int (*resume)(struct umc_dev *); | 91 | int (*resume)(struct umc_dev *); |
92 | int (*pre_reset)(struct umc_dev *); | ||
93 | int (*post_reset)(struct umc_dev *); | ||
92 | 94 | ||
93 | struct device_driver driver; | 95 | struct device_driver driver; |
94 | }; | 96 | }; |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 4669d7e72e75..5571dbe1c0ad 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -293,6 +293,7 @@ struct v4l2_pix_format { | |||
293 | #define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y', 'V', '1', '2') /* 12 YVU 4:2:0 */ | 293 | #define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y', 'V', '1', '2') /* 12 YVU 4:2:0 */ |
294 | #define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y', 'U', 'Y', 'V') /* 16 YUV 4:2:2 */ | 294 | #define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y', 'U', 'Y', 'V') /* 16 YUV 4:2:2 */ |
295 | #define V4L2_PIX_FMT_UYVY v4l2_fourcc('U', 'Y', 'V', 'Y') /* 16 YUV 4:2:2 */ | 295 | #define V4L2_PIX_FMT_UYVY v4l2_fourcc('U', 'Y', 'V', 'Y') /* 16 YUV 4:2:2 */ |
296 | #define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y') /* 16 YUV 4:2:2 */ | ||
296 | #define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P') /* 16 YVU422 planar */ | 297 | #define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P') /* 16 YVU422 planar */ |
297 | #define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P') /* 16 YVU411 planar */ | 298 | #define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P') /* 16 YVU411 planar */ |
298 | #define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y', '4', '1', 'P') /* 12 YUV 4:1:1 */ | 299 | #define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y', '4', '1', 'P') /* 12 YUV 4:1:1 */ |
@@ -304,6 +305,8 @@ struct v4l2_pix_format { | |||
304 | /* two planes -- one Y, one Cr + Cb interleaved */ | 305 | /* two planes -- one Y, one Cr + Cb interleaved */ |
305 | #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2') /* 12 Y/CbCr 4:2:0 */ | 306 | #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2') /* 12 Y/CbCr 4:2:0 */ |
306 | #define V4L2_PIX_FMT_NV21 v4l2_fourcc('N', 'V', '2', '1') /* 12 Y/CrCb 4:2:0 */ | 307 | #define V4L2_PIX_FMT_NV21 v4l2_fourcc('N', 'V', '2', '1') /* 12 Y/CrCb 4:2:0 */ |
308 | #define V4L2_PIX_FMT_NV16 v4l2_fourcc('N', 'V', '1', '6') /* 16 Y/CbCr 4:2:2 */ | ||
309 | #define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1') /* 16 Y/CrCb 4:2:2 */ | ||
307 | 310 | ||
308 | /* The following formats are not defined in the V4L2 specification */ | 311 | /* The following formats are not defined in the V4L2 specification */ |
309 | #define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9') /* 9 YUV 4:1:0 */ | 312 | #define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9') /* 9 YUV 4:1:0 */ |
@@ -1050,7 +1053,7 @@ enum v4l2_mpeg_video_bitrate_mode { | |||
1050 | #define V4L2_CID_MPEG_VIDEO_MUTE (V4L2_CID_MPEG_BASE+210) | 1053 | #define V4L2_CID_MPEG_VIDEO_MUTE (V4L2_CID_MPEG_BASE+210) |
1051 | #define V4L2_CID_MPEG_VIDEO_MUTE_YUV (V4L2_CID_MPEG_BASE+211) | 1054 | #define V4L2_CID_MPEG_VIDEO_MUTE_YUV (V4L2_CID_MPEG_BASE+211) |
1052 | 1055 | ||
1053 | /* MPEG-class control IDs specific to the CX2584x driver as defined by V4L2 */ | 1056 | /* MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */ |
1054 | #define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000) | 1057 | #define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000) |
1055 | #define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+0) | 1058 | #define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE+0) |
1056 | enum v4l2_mpeg_cx2341x_video_spatial_filter_mode { | 1059 | enum v4l2_mpeg_cx2341x_video_spatial_filter_mode { |
@@ -1117,6 +1120,12 @@ enum v4l2_exposure_auto_type { | |||
1117 | #define V4L2_CID_FOCUS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+11) | 1120 | #define V4L2_CID_FOCUS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+11) |
1118 | #define V4L2_CID_FOCUS_AUTO (V4L2_CID_CAMERA_CLASS_BASE+12) | 1121 | #define V4L2_CID_FOCUS_AUTO (V4L2_CID_CAMERA_CLASS_BASE+12) |
1119 | 1122 | ||
1123 | #define V4L2_CID_ZOOM_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+13) | ||
1124 | #define V4L2_CID_ZOOM_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+14) | ||
1125 | #define V4L2_CID_ZOOM_CONTINUOUS (V4L2_CID_CAMERA_CLASS_BASE+15) | ||
1126 | |||
1127 | #define V4L2_CID_PRIVACY (V4L2_CID_CAMERA_CLASS_BASE+16) | ||
1128 | |||
1120 | /* | 1129 | /* |
1121 | * T U N I N G | 1130 | * T U N I N G |
1122 | */ | 1131 | */ |
@@ -1361,24 +1370,41 @@ struct v4l2_streamparm { | |||
1361 | /* | 1370 | /* |
1362 | * A D V A N C E D D E B U G G I N G | 1371 | * A D V A N C E D D E B U G G I N G |
1363 | * | 1372 | * |
1364 | * NOTE: EXPERIMENTAL API | 1373 | * NOTE: EXPERIMENTAL API, NEVER RELY ON THIS IN APPLICATIONS! |
1374 | * FOR DEBUGGING, TESTING AND INTERNAL USE ONLY! | ||
1365 | */ | 1375 | */ |
1366 | 1376 | ||
1367 | /* VIDIOC_DBG_G_REGISTER and VIDIOC_DBG_S_REGISTER */ | 1377 | /* VIDIOC_DBG_G_REGISTER and VIDIOC_DBG_S_REGISTER */ |
1368 | 1378 | ||
1369 | #define V4L2_CHIP_MATCH_HOST 0 /* Match against chip ID on host (0 for the host) */ | 1379 | #define V4L2_CHIP_MATCH_HOST 0 /* Match against chip ID on host (0 for the host) */ |
1370 | #define V4L2_CHIP_MATCH_I2C_DRIVER 1 /* Match against I2C driver ID */ | 1380 | #define V4L2_CHIP_MATCH_I2C_DRIVER 1 /* Match against I2C driver name */ |
1371 | #define V4L2_CHIP_MATCH_I2C_ADDR 2 /* Match against I2C 7-bit address */ | 1381 | #define V4L2_CHIP_MATCH_I2C_ADDR 2 /* Match against I2C 7-bit address */ |
1382 | #define V4L2_CHIP_MATCH_AC97 3 /* Match against anciliary AC97 chip */ | ||
1383 | |||
1384 | struct v4l2_dbg_match { | ||
1385 | __u32 type; /* Match type */ | ||
1386 | union { /* Match this chip, meaning determined by type */ | ||
1387 | __u32 addr; | ||
1388 | char name[32]; | ||
1389 | }; | ||
1390 | } __attribute__ ((packed)); | ||
1372 | 1391 | ||
1373 | struct v4l2_register { | 1392 | struct v4l2_dbg_register { |
1374 | __u32 match_type; /* Match type */ | 1393 | struct v4l2_dbg_match match; |
1375 | __u32 match_chip; /* Match this chip, meaning determined by match_type */ | 1394 | __u32 size; /* register size in bytes */ |
1376 | __u64 reg; | 1395 | __u64 reg; |
1377 | __u64 val; | 1396 | __u64 val; |
1378 | }; | 1397 | } __attribute__ ((packed)); |
1379 | 1398 | ||
1380 | /* VIDIOC_G_CHIP_IDENT */ | 1399 | /* VIDIOC_DBG_G_CHIP_IDENT */ |
1381 | struct v4l2_chip_ident { | 1400 | struct v4l2_dbg_chip_ident { |
1401 | struct v4l2_dbg_match match; | ||
1402 | __u32 ident; /* chip identifier as specified in <media/v4l2-chip-ident.h> */ | ||
1403 | __u32 revision; /* chip revision, chip specific */ | ||
1404 | } __attribute__ ((packed)); | ||
1405 | |||
1406 | /* VIDIOC_G_CHIP_IDENT_OLD: Deprecated, do not use */ | ||
1407 | struct v4l2_chip_ident_old { | ||
1382 | __u32 match_type; /* Match type */ | 1408 | __u32 match_type; /* Match type */ |
1383 | __u32 match_chip; /* Match this chip, meaning determined by match_type */ | 1409 | __u32 match_chip; /* Match this chip, meaning determined by match_type */ |
1384 | __u32 ident; /* chip identifier as specified in <media/v4l2-chip-ident.h> */ | 1410 | __u32 ident; /* chip identifier as specified in <media/v4l2-chip-ident.h> */ |
@@ -1450,14 +1476,25 @@ struct v4l2_chip_ident { | |||
1450 | #define VIDIOC_G_ENC_INDEX _IOR('V', 76, struct v4l2_enc_idx) | 1476 | #define VIDIOC_G_ENC_INDEX _IOR('V', 76, struct v4l2_enc_idx) |
1451 | #define VIDIOC_ENCODER_CMD _IOWR('V', 77, struct v4l2_encoder_cmd) | 1477 | #define VIDIOC_ENCODER_CMD _IOWR('V', 77, struct v4l2_encoder_cmd) |
1452 | #define VIDIOC_TRY_ENCODER_CMD _IOWR('V', 78, struct v4l2_encoder_cmd) | 1478 | #define VIDIOC_TRY_ENCODER_CMD _IOWR('V', 78, struct v4l2_encoder_cmd) |
1479 | #endif | ||
1453 | 1480 | ||
1454 | /* Experimental, only implemented if CONFIG_VIDEO_ADV_DEBUG is defined */ | 1481 | #if 1 |
1455 | #define VIDIOC_DBG_S_REGISTER _IOW('V', 79, struct v4l2_register) | 1482 | /* Experimental, meant for debugging, testing and internal use. |
1456 | #define VIDIOC_DBG_G_REGISTER _IOWR('V', 80, struct v4l2_register) | 1483 | Only implemented if CONFIG_VIDEO_ADV_DEBUG is defined. |
1457 | 1484 | You must be root to use these ioctls. Never use these in applications! */ | |
1458 | #define VIDIOC_G_CHIP_IDENT _IOWR('V', 81, struct v4l2_chip_ident) | 1485 | #define VIDIOC_DBG_S_REGISTER _IOW('V', 79, struct v4l2_dbg_register) |
1486 | #define VIDIOC_DBG_G_REGISTER _IOWR('V', 80, struct v4l2_dbg_register) | ||
1487 | |||
1488 | /* Experimental, meant for debugging, testing and internal use. | ||
1489 | Never use this ioctl in applications! */ | ||
1490 | #define VIDIOC_DBG_G_CHIP_IDENT _IOWR('V', 81, struct v4l2_dbg_chip_ident) | ||
1491 | /* This is deprecated and will go away in 2.6.30 */ | ||
1492 | #define VIDIOC_G_CHIP_IDENT_OLD _IOWR('V', 81, struct v4l2_chip_ident_old) | ||
1459 | #endif | 1493 | #endif |
1494 | |||
1460 | #define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek) | 1495 | #define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek) |
1496 | /* Reminder: when adding new ioctls please add support for them to | ||
1497 | drivers/media/video/v4l2-compat-ioctl32.c as well! */ | ||
1461 | 1498 | ||
1462 | #ifdef __OLD_VIDIOC_ | 1499 | #ifdef __OLD_VIDIOC_ |
1463 | /* for compatibility, will go away some day */ | 1500 | /* for compatibility, will go away some day */ |
diff --git a/include/linux/virtio_balloon.h b/include/linux/virtio_balloon.h index c30c7bfbf39b..8726ff77763e 100644 --- a/include/linux/virtio_balloon.h +++ b/include/linux/virtio_balloon.h | |||
@@ -10,6 +10,9 @@ | |||
10 | /* The feature bitmap for virtio balloon */ | 10 | /* The feature bitmap for virtio balloon */ |
11 | #define VIRTIO_BALLOON_F_MUST_TELL_HOST 0 /* Tell before reclaiming pages */ | 11 | #define VIRTIO_BALLOON_F_MUST_TELL_HOST 0 /* Tell before reclaiming pages */ |
12 | 12 | ||
13 | /* Size of a PFN in the balloon interface. */ | ||
14 | #define VIRTIO_BALLOON_PFN_SHIFT 12 | ||
15 | |||
13 | struct virtio_balloon_config | 16 | struct virtio_balloon_config |
14 | { | 17 | { |
15 | /* Number of pages host wants Guest to give up. */ | 18 | /* Number of pages host wants Guest to give up. */ |
diff --git a/include/linux/virtio_console.h b/include/linux/virtio_console.h index 19a0da0dba41..7615ffcdd555 100644 --- a/include/linux/virtio_console.h +++ b/include/linux/virtio_console.h | |||
@@ -7,6 +7,17 @@ | |||
7 | /* The ID for virtio console */ | 7 | /* The ID for virtio console */ |
8 | #define VIRTIO_ID_CONSOLE 3 | 8 | #define VIRTIO_ID_CONSOLE 3 |
9 | 9 | ||
10 | /* Feature bits */ | ||
11 | #define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */ | ||
12 | |||
13 | struct virtio_console_config { | ||
14 | /* colums of the screens */ | ||
15 | __u16 cols; | ||
16 | /* rows of the screens */ | ||
17 | __u16 rows; | ||
18 | } __attribute__((packed)); | ||
19 | |||
20 | |||
10 | #ifdef __KERNEL__ | 21 | #ifdef __KERNEL__ |
11 | int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int)); | 22 | int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int)); |
12 | #endif /* __KERNEL__ */ | 23 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/virtio_pci.h b/include/linux/virtio_pci.h index cdef35742932..cd0fd5d181a6 100644 --- a/include/linux/virtio_pci.h +++ b/include/linux/virtio_pci.h | |||
@@ -53,4 +53,12 @@ | |||
53 | 53 | ||
54 | /* Virtio ABI version, this must match exactly */ | 54 | /* Virtio ABI version, this must match exactly */ |
55 | #define VIRTIO_PCI_ABI_VERSION 0 | 55 | #define VIRTIO_PCI_ABI_VERSION 0 |
56 | |||
57 | /* How many bits to shift physical queue address written to QUEUE_PFN. | ||
58 | * 12 is historical, and due to x86 page size. */ | ||
59 | #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 | ||
60 | |||
61 | /* The alignment to use between consumer and producer parts of vring. | ||
62 | * x86 pagesize again. */ | ||
63 | #define VIRTIO_PCI_VRING_ALIGN 4096 | ||
56 | #endif | 64 | #endif |
diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index c4a598fb3826..71e03722fb59 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h | |||
@@ -83,7 +83,7 @@ struct vring { | |||
83 | * __u16 avail_idx; | 83 | * __u16 avail_idx; |
84 | * __u16 available[num]; | 84 | * __u16 available[num]; |
85 | * | 85 | * |
86 | * // Padding to the next page boundary. | 86 | * // Padding to the next align boundary. |
87 | * char pad[]; | 87 | * char pad[]; |
88 | * | 88 | * |
89 | * // A ring of used descriptor heads with free-running index. | 89 | * // A ring of used descriptor heads with free-running index. |
@@ -93,19 +93,19 @@ struct vring { | |||
93 | * }; | 93 | * }; |
94 | */ | 94 | */ |
95 | static inline void vring_init(struct vring *vr, unsigned int num, void *p, | 95 | static inline void vring_init(struct vring *vr, unsigned int num, void *p, |
96 | unsigned long pagesize) | 96 | unsigned long align) |
97 | { | 97 | { |
98 | vr->num = num; | 98 | vr->num = num; |
99 | vr->desc = p; | 99 | vr->desc = p; |
100 | vr->avail = p + num*sizeof(struct vring_desc); | 100 | vr->avail = p + num*sizeof(struct vring_desc); |
101 | vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + pagesize-1) | 101 | vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1) |
102 | & ~(pagesize - 1)); | 102 | & ~(align - 1)); |
103 | } | 103 | } |
104 | 104 | ||
105 | static inline unsigned vring_size(unsigned int num, unsigned long pagesize) | 105 | static inline unsigned vring_size(unsigned int num, unsigned long align) |
106 | { | 106 | { |
107 | return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num) | 107 | return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (2 + num) |
108 | + pagesize - 1) & ~(pagesize - 1)) | 108 | + align - 1) & ~(align - 1)) |
109 | + sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num; | 109 | + sizeof(__u16) * 2 + sizeof(struct vring_used_elem) * num; |
110 | } | 110 | } |
111 | 111 | ||
@@ -115,6 +115,7 @@ struct virtio_device; | |||
115 | struct virtqueue; | 115 | struct virtqueue; |
116 | 116 | ||
117 | struct virtqueue *vring_new_virtqueue(unsigned int num, | 117 | struct virtqueue *vring_new_virtqueue(unsigned int num, |
118 | unsigned int vring_align, | ||
118 | struct virtio_device *vdev, | 119 | struct virtio_device *vdev, |
119 | void *pages, | 120 | void *pages, |
120 | void (*notify)(struct virtqueue *vq), | 121 | void (*notify)(struct virtqueue *vq), |
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 307b88577eaa..506e7620a986 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -97,6 +97,10 @@ extern void unmap_kernel_range(unsigned long addr, unsigned long size); | |||
97 | extern struct vm_struct *alloc_vm_area(size_t size); | 97 | extern struct vm_struct *alloc_vm_area(size_t size); |
98 | extern void free_vm_area(struct vm_struct *area); | 98 | extern void free_vm_area(struct vm_struct *area); |
99 | 99 | ||
100 | /* for /dev/kmem */ | ||
101 | extern long vread(char *buf, char *addr, unsigned long count); | ||
102 | extern long vwrite(char *buf, char *addr, unsigned long count); | ||
103 | |||
100 | /* | 104 | /* |
101 | * Internals. Dont't use.. | 105 | * Internals. Dont't use.. |
102 | */ | 106 | */ |
diff --git a/include/linux/wimax.h b/include/linux/wimax.h new file mode 100644 index 000000000000..c89de7f4e5b9 --- /dev/null +++ b/include/linux/wimax.h | |||
@@ -0,0 +1,234 @@ | |||
1 | /* | ||
2 | * Linux WiMax | ||
3 | * API for user space | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * | ||
12 | * * Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * * Redistributions in binary form must reproduce the above copyright | ||
15 | * notice, this list of conditions and the following disclaimer in | ||
16 | * the documentation and/or other materials provided with the | ||
17 | * distribution. | ||
18 | * * Neither the name of Intel Corporation nor the names of its | ||
19 | * contributors may be used to endorse or promote products derived | ||
20 | * from this software without specific prior written permission. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
23 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
24 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
25 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
26 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
27 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
28 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
29 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
30 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
32 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | * | ||
34 | * | ||
35 | * Intel Corporation <linux-wimax@intel.com> | ||
36 | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | ||
37 | * - Initial implementation | ||
38 | * | ||
39 | * | ||
40 | * This file declares the user/kernel protocol that is spoken over | ||
41 | * Generic Netlink, as well as any type declaration that is to be used | ||
42 | * by kernel and user space. | ||
43 | * | ||
44 | * It is intended for user space to clone it verbatim to use it as a | ||
45 | * primary reference for definitions. | ||
46 | * | ||
47 | * Stuff intended for kernel usage as well as full protocol and stack | ||
48 | * documentation is rooted in include/net/wimax.h. | ||
49 | */ | ||
50 | |||
51 | #ifndef __LINUX__WIMAX_H__ | ||
52 | #define __LINUX__WIMAX_H__ | ||
53 | |||
54 | #include <linux/types.h> | ||
55 | |||
56 | enum { | ||
57 | /** | ||
58 | * Version of the interface (unsigned decimal, MMm, max 25.5) | ||
59 | * M - Major: change if removing or modifying an existing call. | ||
60 | * m - minor: change when adding a new call | ||
61 | */ | ||
62 | WIMAX_GNL_VERSION = 00, | ||
63 | /* Generic NetLink attributes */ | ||
64 | WIMAX_GNL_ATTR_INVALID = 0x00, | ||
65 | WIMAX_GNL_ATTR_MAX = 10, | ||
66 | }; | ||
67 | |||
68 | |||
69 | /* | ||
70 | * Generic NetLink operations | ||
71 | * | ||
72 | * Most of these map to an API call; _OP_ stands for operation, _RP_ | ||
73 | * for reply and _RE_ for report (aka: signal). | ||
74 | */ | ||
75 | enum { | ||
76 | WIMAX_GNL_OP_MSG_FROM_USER, /* User to kernel message */ | ||
77 | WIMAX_GNL_OP_MSG_TO_USER, /* Kernel to user message */ | ||
78 | WIMAX_GNL_OP_RFKILL, /* Run wimax_rfkill() */ | ||
79 | WIMAX_GNL_OP_RESET, /* Run wimax_rfkill() */ | ||
80 | WIMAX_GNL_RE_STATE_CHANGE, /* Report: status change */ | ||
81 | }; | ||
82 | |||
83 | |||
84 | /* Message from user / to user */ | ||
85 | enum { | ||
86 | WIMAX_GNL_MSG_IFIDX = 1, | ||
87 | WIMAX_GNL_MSG_PIPE_NAME, | ||
88 | WIMAX_GNL_MSG_DATA, | ||
89 | }; | ||
90 | |||
91 | |||
92 | /* | ||
93 | * wimax_rfkill() | ||
94 | * | ||
95 | * The state of the radio (ON/OFF) is mapped to the rfkill subsystem's | ||
96 | * switch state (DISABLED/ENABLED). | ||
97 | */ | ||
98 | enum wimax_rf_state { | ||
99 | WIMAX_RF_OFF = 0, /* Radio is off, rfkill on/enabled */ | ||
100 | WIMAX_RF_ON = 1, /* Radio is on, rfkill off/disabled */ | ||
101 | WIMAX_RF_QUERY = 2, | ||
102 | }; | ||
103 | |||
104 | /* Attributes */ | ||
105 | enum { | ||
106 | WIMAX_GNL_RFKILL_IFIDX = 1, | ||
107 | WIMAX_GNL_RFKILL_STATE, | ||
108 | }; | ||
109 | |||
110 | |||
111 | /* Attributes for wimax_reset() */ | ||
112 | enum { | ||
113 | WIMAX_GNL_RESET_IFIDX = 1, | ||
114 | }; | ||
115 | |||
116 | |||
117 | /* | ||
118 | * Attributes for the Report State Change | ||
119 | * | ||
120 | * For now we just have the old and new states; new attributes might | ||
121 | * be added later on. | ||
122 | */ | ||
123 | enum { | ||
124 | WIMAX_GNL_STCH_IFIDX = 1, | ||
125 | WIMAX_GNL_STCH_STATE_OLD, | ||
126 | WIMAX_GNL_STCH_STATE_NEW, | ||
127 | }; | ||
128 | |||
129 | |||
130 | /** | ||
131 | * enum wimax_st - The different states of a WiMAX device | ||
132 | * @__WIMAX_ST_NULL: The device structure has been allocated and zeroed, | ||
133 | * but still wimax_dev_add() hasn't been called. There is no state. | ||
134 | * | ||
135 | * @WIMAX_ST_DOWN: The device has been registered with the WiMAX and | ||
136 | * networking stacks, but it is not initialized (normally that is | ||
137 | * done with 'ifconfig DEV up' [or equivalent], which can upload | ||
138 | * firmware and enable communications with the device). | ||
139 | * In this state, the device is powered down and using as less | ||
140 | * power as possible. | ||
141 | * This state is the default after a call to wimax_dev_add(). It | ||
142 | * is ok to have drivers move directly to %WIMAX_ST_UNINITIALIZED | ||
143 | * or %WIMAX_ST_RADIO_OFF in _probe() after the call to | ||
144 | * wimax_dev_add(). | ||
145 | * It is recommended that the driver leaves this state when | ||
146 | * calling 'ifconfig DEV up' and enters it back on 'ifconfig DEV | ||
147 | * down'. | ||
148 | * | ||
149 | * @__WIMAX_ST_QUIESCING: The device is being torn down, so no API | ||
150 | * operations are allowed to proceed except the ones needed to | ||
151 | * complete the device clean up process. | ||
152 | * | ||
153 | * @WIMAX_ST_UNINITIALIZED: [optional] Communication with the device | ||
154 | * is setup, but the device still requires some configuration | ||
155 | * before being operational. | ||
156 | * Some WiMAX API calls might work. | ||
157 | * | ||
158 | * @WIMAX_ST_RADIO_OFF: The device is fully up; radio is off (wether | ||
159 | * by hardware or software switches). | ||
160 | * It is recommended to always leave the device in this state | ||
161 | * after initialization. | ||
162 | * | ||
163 | * @WIMAX_ST_READY: The device is fully up and radio is on. | ||
164 | * | ||
165 | * @WIMAX_ST_SCANNING: [optional] The device has been instructed to | ||
166 | * scan. In this state, the device cannot be actively connected to | ||
167 | * a network. | ||
168 | * | ||
169 | * @WIMAX_ST_CONNECTING: The device is connecting to a network. This | ||
170 | * state exists because in some devices, the connect process can | ||
171 | * include a number of negotiations between user space, kernel | ||
172 | * space and the device. User space needs to know what the device | ||
173 | * is doing. If the connect sequence in a device is atomic and | ||
174 | * fast, the device can transition directly to CONNECTED | ||
175 | * | ||
176 | * @WIMAX_ST_CONNECTED: The device is connected to a network. | ||
177 | * | ||
178 | * @__WIMAX_ST_INVALID: This is an invalid state used to mark the | ||
179 | * maximum numeric value of states. | ||
180 | * | ||
181 | * Description: | ||
182 | * | ||
183 | * Transitions from one state to another one are atomic and can only | ||
184 | * be caused in kernel space with wimax_state_change(). To read the | ||
185 | * state, use wimax_state_get(). | ||
186 | * | ||
187 | * States starting with __ are internal and shall not be used or | ||
188 | * referred to by drivers or userspace. They look ugly, but that's the | ||
189 | * point -- if any use is made non-internal to the stack, it is easier | ||
190 | * to catch on review. | ||
191 | * | ||
192 | * All API operations [with well defined exceptions] will take the | ||
193 | * device mutex before starting and then check the state. If the state | ||
194 | * is %__WIMAX_ST_NULL, %WIMAX_ST_DOWN, %WIMAX_ST_UNINITIALIZED or | ||
195 | * %__WIMAX_ST_QUIESCING, it will drop the lock and quit with | ||
196 | * -%EINVAL, -%ENOMEDIUM, -%ENOTCONN or -%ESHUTDOWN. | ||
197 | * | ||
198 | * The order of the definitions is important, so we can do numerical | ||
199 | * comparisons (eg: < %WIMAX_ST_RADIO_OFF means the device is not ready | ||
200 | * to operate). | ||
201 | */ | ||
202 | /* | ||
203 | * The allowed state transitions are described in the table below | ||
204 | * (states in rows can go to states in columns where there is an X): | ||
205 | * | ||
206 | * UNINI RADIO READY SCAN CONNEC CONNEC | ||
207 | * NULL DOWN QUIESCING TIALIZED OFF NING TING TED | ||
208 | * NULL - x | ||
209 | * DOWN - x x x | ||
210 | * QUIESCING x - | ||
211 | * UNINITIALIZED x - x | ||
212 | * RADIO_OFF x - x | ||
213 | * READY x x - x x x | ||
214 | * SCANNING x x x - x x | ||
215 | * CONNECTING x x x x - x | ||
216 | * CONNECTED x x x - | ||
217 | * | ||
218 | * This table not available in kernel-doc because the formatting messes it up. | ||
219 | */ | ||
220 | enum wimax_st { | ||
221 | __WIMAX_ST_NULL = 0, | ||
222 | WIMAX_ST_DOWN, | ||
223 | __WIMAX_ST_QUIESCING, | ||
224 | WIMAX_ST_UNINITIALIZED, | ||
225 | WIMAX_ST_RADIO_OFF, | ||
226 | WIMAX_ST_READY, | ||
227 | WIMAX_ST_SCANNING, | ||
228 | WIMAX_ST_CONNECTING, | ||
229 | WIMAX_ST_CONNECTED, | ||
230 | __WIMAX_ST_INVALID /* Always keep last */ | ||
231 | }; | ||
232 | |||
233 | |||
234 | #endif /* #ifndef __LINUX__WIMAX_H__ */ | ||
diff --git a/include/linux/wimax/Kbuild b/include/linux/wimax/Kbuild new file mode 100644 index 000000000000..3cb4f269bb09 --- /dev/null +++ b/include/linux/wimax/Kbuild | |||
@@ -0,0 +1 @@ | |||
header-y += i2400m.h | |||
diff --git a/include/linux/wimax/debug.h b/include/linux/wimax/debug.h new file mode 100644 index 000000000000..ba0c49399a83 --- /dev/null +++ b/include/linux/wimax/debug.h | |||
@@ -0,0 +1,453 @@ | |||
1 | /* | ||
2 | * Linux WiMAX | ||
3 | * Collection of tools to manage debug operations. | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2005-2007 Intel Corporation | ||
7 | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License version | ||
11 | * 2 as published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
21 | * 02110-1301, USA. | ||
22 | * | ||
23 | * | ||
24 | * Don't #include this file directly, read on! | ||
25 | * | ||
26 | * | ||
27 | * EXECUTING DEBUGGING ACTIONS OR NOT | ||
28 | * | ||
29 | * The main thing this framework provides is decission power to take a | ||
30 | * debug action (like printing a message) if the current debug level | ||
31 | * allows it. | ||
32 | * | ||
33 | * The decission power is at two levels: at compile-time (what does | ||
34 | * not make it is compiled out) and at run-time. The run-time | ||
35 | * selection is done per-submodule (as they are declared by the user | ||
36 | * of the framework). | ||
37 | * | ||
38 | * A call to d_test(L) (L being the target debug level) returns true | ||
39 | * if the action should be taken because the current debug levels | ||
40 | * allow it (both compile and run time). | ||
41 | * | ||
42 | * It follows that a call to d_test() that can be determined to be | ||
43 | * always false at compile time will get the code depending on it | ||
44 | * compiled out by optimization. | ||
45 | * | ||
46 | * | ||
47 | * DEBUG LEVELS | ||
48 | * | ||
49 | * It is up to the caller to define how much a debugging level is. | ||
50 | * | ||
51 | * Convention sets 0 as "no debug" (so an action marked as debug level 0 | ||
52 | * will always be taken). The increasing debug levels are used for | ||
53 | * increased verbosity. | ||
54 | * | ||
55 | * | ||
56 | * USAGE | ||
57 | * | ||
58 | * Group the code in modules and submodules inside each module [which | ||
59 | * in most cases maps to Linux modules and .c files that compose | ||
60 | * those]. | ||
61 | * | ||
62 | * | ||
63 | * For each module, there is: | ||
64 | * | ||
65 | * - a MODULENAME (single word, legal C identifier) | ||
66 | * | ||
67 | * - a debug-levels.h header file that declares the list of | ||
68 | * submodules and that is included by all .c files that use | ||
69 | * the debugging tools. The file name can be anything. | ||
70 | * | ||
71 | * - some (optional) .c code to manipulate the runtime debug levels | ||
72 | * through debugfs. | ||
73 | * | ||
74 | * The debug-levels.h file would look like: | ||
75 | * | ||
76 | * #ifndef __debug_levels__h__ | ||
77 | * #define __debug_levels__h__ | ||
78 | * | ||
79 | * #define D_MODULENAME modulename | ||
80 | * #define D_MASTER 10 | ||
81 | * | ||
82 | * #include <linux/wimax/debug.h> | ||
83 | * | ||
84 | * enum d_module { | ||
85 | * D_SUBMODULE_DECLARE(submodule_1), | ||
86 | * D_SUBMODULE_DECLARE(submodule_2), | ||
87 | * ... | ||
88 | * D_SUBMODULE_DECLARE(submodule_N) | ||
89 | * }; | ||
90 | * | ||
91 | * #endif | ||
92 | * | ||
93 | * D_MASTER is the maximum compile-time debug level; any debug actions | ||
94 | * above this will be out. D_MODULENAME is the module name (legal C | ||
95 | * identifier), which has to be unique for each module (to avoid | ||
96 | * namespace collisions during linkage). Note those #defines need to | ||
97 | * be done before #including debug.h | ||
98 | * | ||
99 | * We declare N different submodules whose debug level can be | ||
100 | * independently controlled during runtime. | ||
101 | * | ||
102 | * In a .c file of the module (and only in one of them), define the | ||
103 | * following code: | ||
104 | * | ||
105 | * struct d_level D_LEVEL[] = { | ||
106 | * D_SUBMODULE_DEFINE(submodule_1), | ||
107 | * D_SUBMODULE_DEFINE(submodule_2), | ||
108 | * ... | ||
109 | * D_SUBMODULE_DEFINE(submodule_N), | ||
110 | * }; | ||
111 | * size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL); | ||
112 | * | ||
113 | * Externs for d_level_MODULENAME and d_level_size_MODULENAME are used | ||
114 | * and declared in this file using the D_LEVEL and D_LEVEL_SIZE macros | ||
115 | * #defined also in this file. | ||
116 | * | ||
117 | * To manipulate from user space the levels, create a debugfs dentry | ||
118 | * and then register each submodule with: | ||
119 | * | ||
120 | * result = d_level_register_debugfs("PREFIX_", submodule_X, parent); | ||
121 | * if (result < 0) | ||
122 | * goto error; | ||
123 | * | ||
124 | * Where PREFIX_ is a name of your chosing. This will create debugfs | ||
125 | * file with a single numeric value that can be use to tweak it. To | ||
126 | * remove the entires, just use debugfs_remove_recursive() on 'parent'. | ||
127 | * | ||
128 | * NOTE: remember that even if this will show attached to some | ||
129 | * particular instance of a device, the settings are *global*. | ||
130 | * | ||
131 | * | ||
132 | * On each submodule (for example, .c files), the debug infrastructure | ||
133 | * should be included like this: | ||
134 | * | ||
135 | * #define D_SUBMODULE submodule_x // matches one in debug-levels.h | ||
136 | * #include "debug-levels.h" | ||
137 | * | ||
138 | * after #including all your include files. | ||
139 | * | ||
140 | * | ||
141 | * Now you can use the d_*() macros below [d_test(), d_fnstart(), | ||
142 | * d_fnend(), d_printf(), d_dump()]. | ||
143 | * | ||
144 | * If their debug level is greater than D_MASTER, they will be | ||
145 | * compiled out. | ||
146 | * | ||
147 | * If their debug level is lower or equal than D_MASTER but greater | ||
148 | * than the current debug level of their submodule, they'll be | ||
149 | * ignored. | ||
150 | * | ||
151 | * Otherwise, the action will be performed. | ||
152 | */ | ||
153 | #ifndef __debug__h__ | ||
154 | #define __debug__h__ | ||
155 | |||
156 | #include <linux/types.h> | ||
157 | #include <linux/device.h> | ||
158 | |||
159 | |||
160 | /* Backend stuff */ | ||
161 | |||
162 | /* | ||
163 | * Debug backend: generate a message header from a 'struct device' | ||
164 | * | ||
165 | * @head: buffer where to place the header | ||
166 | * @head_size: length of @head | ||
167 | * @dev: pointer to device used to generate a header from. If NULL, | ||
168 | * an empty ("") header is generated. | ||
169 | */ | ||
170 | static inline | ||
171 | void __d_head(char *head, size_t head_size, | ||
172 | struct device *dev) | ||
173 | { | ||
174 | if (dev == NULL) | ||
175 | head[0] = 0; | ||
176 | else if ((unsigned long)dev < 4096) { | ||
177 | printk(KERN_ERR "E: Corrupt dev %p\n", dev); | ||
178 | WARN_ON(1); | ||
179 | } else | ||
180 | snprintf(head, head_size, "%s %s: ", | ||
181 | dev_driver_string(dev), dev->bus_id); | ||
182 | } | ||
183 | |||
184 | |||
185 | /* | ||
186 | * Debug backend: log some message if debugging is enabled | ||
187 | * | ||
188 | * @l: intended debug level | ||
189 | * @tag: tag to prefix the message with | ||
190 | * @dev: 'struct device' associated to this message | ||
191 | * @f: printf-like format and arguments | ||
192 | * | ||
193 | * Note this is optimized out if it doesn't pass the compile-time | ||
194 | * check; however, it is *always* compiled. This is useful to make | ||
195 | * sure the printf-like formats and variables are always checked and | ||
196 | * they don't get bit rot if you have all the debugging disabled. | ||
197 | */ | ||
198 | #define _d_printf(l, tag, dev, f, a...) \ | ||
199 | do { \ | ||
200 | char head[64]; \ | ||
201 | if (!d_test(l)) \ | ||
202 | break; \ | ||
203 | __d_head(head, sizeof(head), dev); \ | ||
204 | printk(KERN_ERR "%s%s%s: " f, head, __func__, tag, ##a); \ | ||
205 | } while (0) | ||
206 | |||
207 | |||
208 | /* | ||
209 | * CPP sintatic sugar to generate A_B like symbol names when one of | ||
210 | * the arguments is a a preprocessor #define. | ||
211 | */ | ||
212 | #define __D_PASTE__(varname, modulename) varname##_##modulename | ||
213 | #define __D_PASTE(varname, modulename) (__D_PASTE__(varname, modulename)) | ||
214 | #define _D_SUBMODULE_INDEX(_name) (D_SUBMODULE_DECLARE(_name)) | ||
215 | |||
216 | |||
217 | /* | ||
218 | * Store a submodule's runtime debug level and name | ||
219 | */ | ||
220 | struct d_level { | ||
221 | u8 level; | ||
222 | const char *name; | ||
223 | }; | ||
224 | |||
225 | |||
226 | /* | ||
227 | * List of available submodules and their debug levels | ||
228 | * | ||
229 | * We call them d_level_MODULENAME and d_level_size_MODULENAME; the | ||
230 | * macros D_LEVEL and D_LEVEL_SIZE contain the name already for | ||
231 | * convenience. | ||
232 | * | ||
233 | * This array and the size are defined on some .c file that is part of | ||
234 | * the current module. | ||
235 | */ | ||
236 | #define D_LEVEL __D_PASTE(d_level, D_MODULENAME) | ||
237 | #define D_LEVEL_SIZE __D_PASTE(d_level_size, D_MODULENAME) | ||
238 | |||
239 | extern struct d_level D_LEVEL[]; | ||
240 | extern size_t D_LEVEL_SIZE; | ||
241 | |||
242 | |||
243 | /* | ||
244 | * Frontend stuff | ||
245 | * | ||
246 | * | ||
247 | * Stuff you need to declare prior to using the actual "debug" actions | ||
248 | * (defined below). | ||
249 | */ | ||
250 | |||
251 | #ifndef D_MODULENAME | ||
252 | #error D_MODULENAME is not defined in your debug-levels.h file | ||
253 | /** | ||
254 | * D_MODULE - Name of the current module | ||
255 | * | ||
256 | * #define in your module's debug-levels.h, making sure it is | ||
257 | * unique. This has to be a legal C identifier. | ||
258 | */ | ||
259 | #define D_MODULENAME undefined_modulename | ||
260 | #endif | ||
261 | |||
262 | |||
263 | #ifndef D_MASTER | ||
264 | #warning D_MASTER not defined, but debug.h included! [see docs] | ||
265 | /** | ||
266 | * D_MASTER - Compile time maximum debug level | ||
267 | * | ||
268 | * #define in your debug-levels.h file to the maximum debug level the | ||
269 | * runtime code will be allowed to have. This allows you to provide a | ||
270 | * main knob. | ||
271 | * | ||
272 | * Anything above that level will be optimized out of the compile. | ||
273 | * | ||
274 | * Defaults to zero (no debug code compiled in). | ||
275 | * | ||
276 | * Maximum one definition per module (at the debug-levels.h file). | ||
277 | */ | ||
278 | #define D_MASTER 0 | ||
279 | #endif | ||
280 | |||
281 | #ifndef D_SUBMODULE | ||
282 | #error D_SUBMODULE not defined, but debug.h included! [see docs] | ||
283 | /** | ||
284 | * D_SUBMODULE - Name of the current submodule | ||
285 | * | ||
286 | * #define in your submodule .c file before #including debug-levels.h | ||
287 | * to the name of the current submodule as previously declared and | ||
288 | * defined with D_SUBMODULE_DECLARE() (in your module's | ||
289 | * debug-levels.h) and D_SUBMODULE_DEFINE(). | ||
290 | * | ||
291 | * This is used to provide runtime-control over the debug levels. | ||
292 | * | ||
293 | * Maximum one per .c file! Can be shared among different .c files | ||
294 | * (meaning they belong to the same submodule categorization). | ||
295 | */ | ||
296 | #define D_SUBMODULE undefined_module | ||
297 | #endif | ||
298 | |||
299 | |||
300 | /** | ||
301 | * D_SUBMODULE_DECLARE - Declare a submodule for runtime debug level control | ||
302 | * | ||
303 | * @_name: name of the submodule, restricted to the chars that make up a | ||
304 | * valid C identifier ([a-zA-Z0-9_]). | ||
305 | * | ||
306 | * Declare in the module's debug-levels.h header file as: | ||
307 | * | ||
308 | * enum d_module { | ||
309 | * D_SUBMODULE_DECLARE(submodule_1), | ||
310 | * D_SUBMODULE_DECLARE(submodule_2), | ||
311 | * D_SUBMODULE_DECLARE(submodule_3), | ||
312 | * }; | ||
313 | * | ||
314 | * Some corresponding .c file needs to have a matching | ||
315 | * D_SUBMODULE_DEFINE(). | ||
316 | */ | ||
317 | #define D_SUBMODULE_DECLARE(_name) __D_SUBMODULE_##_name | ||
318 | |||
319 | |||
320 | /** | ||
321 | * D_SUBMODULE_DEFINE - Define a submodule for runtime debug level control | ||
322 | * | ||
323 | * @_name: name of the submodule, restricted to the chars that make up a | ||
324 | * valid C identifier ([a-zA-Z0-9_]). | ||
325 | * | ||
326 | * Use once per module (in some .c file) as: | ||
327 | * | ||
328 | * static | ||
329 | * struct d_level d_level_SUBMODULENAME[] = { | ||
330 | * D_SUBMODULE_DEFINE(submodule_1), | ||
331 | * D_SUBMODULE_DEFINE(submodule_2), | ||
332 | * D_SUBMODULE_DEFINE(submodule_3), | ||
333 | * }; | ||
334 | * size_t d_level_size_SUBDMODULENAME = ARRAY_SIZE(d_level_SUBDMODULENAME); | ||
335 | * | ||
336 | * Matching D_SUBMODULE_DECLARE()s have to be present in a | ||
337 | * debug-levels.h header file. | ||
338 | */ | ||
339 | #define D_SUBMODULE_DEFINE(_name) \ | ||
340 | [__D_SUBMODULE_##_name] = { \ | ||
341 | .level = 0, \ | ||
342 | .name = #_name \ | ||
343 | } | ||
344 | |||
345 | |||
346 | |||
347 | /* The actual "debug" operations */ | ||
348 | |||
349 | |||
350 | /** | ||
351 | * d_test - Returns true if debugging should be enabled | ||
352 | * | ||
353 | * @l: intended debug level (unsigned) | ||
354 | * | ||
355 | * If the master debug switch is enabled and the current settings are | ||
356 | * higher or equal to the requested level, then debugging | ||
357 | * output/actions should be enabled. | ||
358 | * | ||
359 | * NOTE: | ||
360 | * | ||
361 | * This needs to be coded so that it can be evaluated in compile | ||
362 | * time; this is why the ugly BUG_ON() is placed in there, so the | ||
363 | * D_MASTER evaluation compiles all out if it is compile-time false. | ||
364 | */ | ||
365 | #define d_test(l) \ | ||
366 | ({ \ | ||
367 | unsigned __l = l; /* type enforcer */ \ | ||
368 | (D_MASTER) >= __l \ | ||
369 | && ({ \ | ||
370 | BUG_ON(_D_SUBMODULE_INDEX(D_SUBMODULE) >= D_LEVEL_SIZE);\ | ||
371 | D_LEVEL[_D_SUBMODULE_INDEX(D_SUBMODULE)].level >= __l; \ | ||
372 | }); \ | ||
373 | }) | ||
374 | |||
375 | |||
376 | /** | ||
377 | * d_fnstart - log message at function start if debugging enabled | ||
378 | * | ||
379 | * @l: intended debug level | ||
380 | * @_dev: 'struct device' pointer, NULL if none (for context) | ||
381 | * @f: printf-like format and arguments | ||
382 | */ | ||
383 | #define d_fnstart(l, _dev, f, a...) _d_printf(l, " FNSTART", _dev, f, ## a) | ||
384 | |||
385 | |||
386 | /** | ||
387 | * d_fnend - log message at function end if debugging enabled | ||
388 | * | ||
389 | * @l: intended debug level | ||
390 | * @_dev: 'struct device' pointer, NULL if none (for context) | ||
391 | * @f: printf-like format and arguments | ||
392 | */ | ||
393 | #define d_fnend(l, _dev, f, a...) _d_printf(l, " FNEND", _dev, f, ## a) | ||
394 | |||
395 | |||
396 | /** | ||
397 | * d_printf - log message if debugging enabled | ||
398 | * | ||
399 | * @l: intended debug level | ||
400 | * @_dev: 'struct device' pointer, NULL if none (for context) | ||
401 | * @f: printf-like format and arguments | ||
402 | */ | ||
403 | #define d_printf(l, _dev, f, a...) _d_printf(l, "", _dev, f, ## a) | ||
404 | |||
405 | |||
406 | /** | ||
407 | * d_dump - log buffer hex dump if debugging enabled | ||
408 | * | ||
409 | * @l: intended debug level | ||
410 | * @_dev: 'struct device' pointer, NULL if none (for context) | ||
411 | * @f: printf-like format and arguments | ||
412 | */ | ||
413 | #define d_dump(l, dev, ptr, size) \ | ||
414 | do { \ | ||
415 | char head[64]; \ | ||
416 | if (!d_test(l)) \ | ||
417 | break; \ | ||
418 | __d_head(head, sizeof(head), dev); \ | ||
419 | print_hex_dump(KERN_ERR, head, 0, 16, 1, \ | ||
420 | ((void *) ptr), (size), 0); \ | ||
421 | } while (0) | ||
422 | |||
423 | |||
424 | /** | ||
425 | * Export a submodule's debug level over debugfs as PREFIXSUBMODULE | ||
426 | * | ||
427 | * @prefix: string to prefix the name with | ||
428 | * @submodule: name of submodule (not a string, just the name) | ||
429 | * @dentry: debugfs parent dentry | ||
430 | * | ||
431 | * Returns: 0 if ok, < 0 errno on error. | ||
432 | * | ||
433 | * For removing, just use debugfs_remove_recursive() on the parent. | ||
434 | */ | ||
435 | #define d_level_register_debugfs(prefix, name, parent) \ | ||
436 | ({ \ | ||
437 | int rc; \ | ||
438 | struct dentry *fd; \ | ||
439 | struct dentry *verify_parent_type = parent; \ | ||
440 | fd = debugfs_create_u8( \ | ||
441 | prefix #name, 0600, verify_parent_type, \ | ||
442 | &(D_LEVEL[__D_SUBMODULE_ ## name].level)); \ | ||
443 | rc = PTR_ERR(fd); \ | ||
444 | if (IS_ERR(fd) && rc != -ENODEV) \ | ||
445 | printk(KERN_ERR "%s: Can't create debugfs entry %s: " \ | ||
446 | "%d\n", __func__, prefix #name, rc); \ | ||
447 | else \ | ||
448 | rc = 0; \ | ||
449 | rc; \ | ||
450 | }) | ||
451 | |||
452 | |||
453 | #endif /* #ifndef __debug__h__ */ | ||
diff --git a/include/linux/wimax/i2400m.h b/include/linux/wimax/i2400m.h new file mode 100644 index 000000000000..74198f5bb4dc --- /dev/null +++ b/include/linux/wimax/i2400m.h | |||
@@ -0,0 +1,512 @@ | |||
1 | /* | ||
2 | * Intel Wireless WiMax Connection 2400m | ||
3 | * Host-Device protocol interface definitions | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * | ||
12 | * * Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * * Redistributions in binary form must reproduce the above copyright | ||
15 | * notice, this list of conditions and the following disclaimer in | ||
16 | * the documentation and/or other materials provided with the | ||
17 | * distribution. | ||
18 | * * Neither the name of Intel Corporation nor the names of its | ||
19 | * contributors may be used to endorse or promote products derived | ||
20 | * from this software without specific prior written permission. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
23 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
24 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
25 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
26 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
27 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
28 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
29 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
30 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
32 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | * | ||
34 | * | ||
35 | * Intel Corporation <linux-wimax@intel.com> | ||
36 | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | ||
37 | * - Initial implementation | ||
38 | * | ||
39 | * | ||
40 | * This header defines the data structures and constants used to | ||
41 | * communicate with the device. | ||
42 | * | ||
43 | * BOOTMODE/BOOTROM/FIRMWARE UPLOAD PROTOCOL | ||
44 | * | ||
45 | * The firmware upload protocol is quite simple and only requires a | ||
46 | * handful of commands. See drivers/net/wimax/i2400m/fw.c for more | ||
47 | * details. | ||
48 | * | ||
49 | * The BCF data structure is for the firmware file header. | ||
50 | * | ||
51 | * | ||
52 | * THE DATA / CONTROL PROTOCOL | ||
53 | * | ||
54 | * This is the normal protocol spoken with the device once the | ||
55 | * firmware is uploaded. It transports data payloads and control | ||
56 | * messages back and forth. | ||
57 | * | ||
58 | * It consists 'messages' that pack one or more payloads each. The | ||
59 | * format is described in detail in drivers/net/wimax/i2400m/rx.c and | ||
60 | * tx.c. | ||
61 | * | ||
62 | * | ||
63 | * THE L3L4 PROTOCOL | ||
64 | * | ||
65 | * The term L3L4 refers to Layer 3 (the device), Layer 4 (the | ||
66 | * driver/host software). | ||
67 | * | ||
68 | * This is the control protocol used by the host to control the i2400m | ||
69 | * device (scan, connect, disconnect...). This is sent to / received | ||
70 | * as control frames. These frames consist of a header and zero or | ||
71 | * more TLVs with information. We call each control frame a "message". | ||
72 | * | ||
73 | * Each message is composed of: | ||
74 | * | ||
75 | * HEADER | ||
76 | * [TLV0 + PAYLOAD0] | ||
77 | * [TLV1 + PAYLOAD1] | ||
78 | * [...] | ||
79 | * [TLVN + PAYLOADN] | ||
80 | * | ||
81 | * The HEADER is defined by 'struct i2400m_l3l4_hdr'. The payloads are | ||
82 | * defined by a TLV structure (Type Length Value) which is a 'header' | ||
83 | * (struct i2400m_tlv_hdr) and then the payload. | ||
84 | * | ||
85 | * All integers are represented as Little Endian. | ||
86 | * | ||
87 | * - REQUESTS AND EVENTS | ||
88 | * | ||
89 | * The requests can be clasified as follows: | ||
90 | * | ||
91 | * COMMAND: implies a request from the host to the device requesting | ||
92 | * an action being performed. The device will reply with a | ||
93 | * message (with the same type as the command), status and | ||
94 | * no (TLV) payload. Execution of a command might cause | ||
95 | * events (of different type) to be sent later on as | ||
96 | * device's state changes. | ||
97 | * | ||
98 | * GET/SET: similar to COMMAND, but will not cause other | ||
99 | * EVENTs. The reply, in the case of GET, will contain | ||
100 | * TLVs with the requested information. | ||
101 | * | ||
102 | * EVENT: asynchronous messages sent from the device, maybe as a | ||
103 | * consequence of previous COMMANDs but disassociated from | ||
104 | * them. | ||
105 | * | ||
106 | * Only one request might be pending at the same time (ie: don't | ||
107 | * parallelize nor post another GET request before the previous | ||
108 | * COMMAND has been acknowledged with it's corresponding reply by the | ||
109 | * device). | ||
110 | * | ||
111 | * The different requests and their formats are described below: | ||
112 | * | ||
113 | * I2400M_MT_* Message types | ||
114 | * I2400M_MS_* Message status (for replies, events) | ||
115 | * i2400m_tlv_* TLVs | ||
116 | * | ||
117 | * data types are named 'struct i2400m_msg_OPNAME', OPNAME matching the | ||
118 | * operation. | ||
119 | */ | ||
120 | |||
121 | #ifndef __LINUX__WIMAX__I2400M_H__ | ||
122 | #define __LINUX__WIMAX__I2400M_H__ | ||
123 | |||
124 | #include <linux/types.h> | ||
125 | |||
126 | |||
127 | /* | ||
128 | * Host Device Interface (HDI) common to all busses | ||
129 | */ | ||
130 | |||
131 | /* Boot-mode (firmware upload mode) commands */ | ||
132 | |||
133 | /* Header for the firmware file */ | ||
134 | struct i2400m_bcf_hdr { | ||
135 | __le32 module_type; | ||
136 | __le32 header_len; | ||
137 | __le32 header_version; | ||
138 | __le32 module_id; | ||
139 | __le32 module_vendor; | ||
140 | __le32 date; /* BCD YYYMMDD */ | ||
141 | __le32 size; | ||
142 | __le32 key_size; /* in dwords */ | ||
143 | __le32 modulus_size; /* in dwords */ | ||
144 | __le32 exponent_size; /* in dwords */ | ||
145 | __u8 reserved[88]; | ||
146 | } __attribute__ ((packed)); | ||
147 | |||
148 | /* Boot mode opcodes */ | ||
149 | enum i2400m_brh_opcode { | ||
150 | I2400M_BRH_READ = 1, | ||
151 | I2400M_BRH_WRITE = 2, | ||
152 | I2400M_BRH_JUMP = 3, | ||
153 | I2400M_BRH_SIGNED_JUMP = 8, | ||
154 | I2400M_BRH_HASH_PAYLOAD_ONLY = 9, | ||
155 | }; | ||
156 | |||
157 | /* Boot mode command masks and stuff */ | ||
158 | enum i2400m_brh { | ||
159 | I2400M_BRH_SIGNATURE = 0xcbbc0000, | ||
160 | I2400M_BRH_SIGNATURE_MASK = 0xffff0000, | ||
161 | I2400M_BRH_SIGNATURE_SHIFT = 16, | ||
162 | I2400M_BRH_OPCODE_MASK = 0x0000000f, | ||
163 | I2400M_BRH_RESPONSE_MASK = 0x000000f0, | ||
164 | I2400M_BRH_RESPONSE_SHIFT = 4, | ||
165 | I2400M_BRH_DIRECT_ACCESS = 0x00000400, | ||
166 | I2400M_BRH_RESPONSE_REQUIRED = 0x00000200, | ||
167 | I2400M_BRH_USE_CHECKSUM = 0x00000100, | ||
168 | }; | ||
169 | |||
170 | |||
171 | /* Constants for bcf->module_id */ | ||
172 | enum i2400m_bcf_mod_id { | ||
173 | /* Firmware file carries its own pokes -- pokes are a set of | ||
174 | * magical values that have to be written in certain memory | ||
175 | * addresses to get the device up and ready for firmware | ||
176 | * download when it is in non-signed boot mode. */ | ||
177 | I2400M_BCF_MOD_ID_POKES = 0x000000001, | ||
178 | }; | ||
179 | |||
180 | |||
181 | /** | ||
182 | * i2400m_bootrom_header - Header for a boot-mode command | ||
183 | * | ||
184 | * @cmd: the above command descriptor | ||
185 | * @target_addr: where on the device memory should the action be performed. | ||
186 | * @data_size: for read/write, amount of data to be read/written | ||
187 | * @block_checksum: checksum value (if applicable) | ||
188 | * @payload: the beginning of data attached to this header | ||
189 | */ | ||
190 | struct i2400m_bootrom_header { | ||
191 | __le32 command; /* Compose with enum i2400_brh */ | ||
192 | __le32 target_addr; | ||
193 | __le32 data_size; | ||
194 | __le32 block_checksum; | ||
195 | char payload[0]; | ||
196 | } __attribute__ ((packed)); | ||
197 | |||
198 | |||
199 | /* | ||
200 | * Data / control protocol | ||
201 | */ | ||
202 | |||
203 | /* Packet types for the host-device interface */ | ||
204 | enum i2400m_pt { | ||
205 | I2400M_PT_DATA = 0, | ||
206 | I2400M_PT_CTRL, | ||
207 | I2400M_PT_TRACE, /* For device debug */ | ||
208 | I2400M_PT_RESET_WARM, /* device reset */ | ||
209 | I2400M_PT_RESET_COLD, /* USB[transport] reset, like reconnect */ | ||
210 | I2400M_PT_ILLEGAL | ||
211 | }; | ||
212 | |||
213 | |||
214 | /* | ||
215 | * Payload for a data packet | ||
216 | * | ||
217 | * This is prefixed to each and every outgoing DATA type. | ||
218 | */ | ||
219 | struct i2400m_pl_data_hdr { | ||
220 | __le32 reserved; | ||
221 | } __attribute__((packed)); | ||
222 | |||
223 | |||
224 | /* Misc constants */ | ||
225 | enum { | ||
226 | I2400M_PL_PAD = 16, /* Payload data size alignment */ | ||
227 | I2400M_PL_SIZE_MAX = 0x3EFF, | ||
228 | I2400M_MAX_PLS_IN_MSG = 60, | ||
229 | /* protocol barkers: sync sequences; for notifications they | ||
230 | * are sent in groups of four. */ | ||
231 | I2400M_H2D_PREVIEW_BARKER = 0xcafe900d, | ||
232 | I2400M_COLD_RESET_BARKER = 0xc01dc01d, | ||
233 | I2400M_WARM_RESET_BARKER = 0x50f750f7, | ||
234 | I2400M_NBOOT_BARKER = 0xdeadbeef, | ||
235 | I2400M_SBOOT_BARKER = 0x0ff1c1a1, | ||
236 | I2400M_ACK_BARKER = 0xfeedbabe, | ||
237 | I2400M_D2H_MSG_BARKER = 0xbeefbabe, | ||
238 | }; | ||
239 | |||
240 | |||
241 | /* | ||
242 | * Hardware payload descriptor | ||
243 | * | ||
244 | * Bitfields encoded in a struct to enforce typing semantics. | ||
245 | * | ||
246 | * Look in rx.c and tx.c for a full description of the format. | ||
247 | */ | ||
248 | struct i2400m_pld { | ||
249 | __le32 val; | ||
250 | } __attribute__ ((packed)); | ||
251 | |||
252 | #define I2400M_PLD_SIZE_MASK 0x00003fff | ||
253 | #define I2400M_PLD_TYPE_SHIFT 16 | ||
254 | #define I2400M_PLD_TYPE_MASK 0x000f0000 | ||
255 | |||
256 | /* | ||
257 | * Header for a TX message or RX message | ||
258 | * | ||
259 | * @barker: preamble | ||
260 | * @size: used for management of the FIFO queue buffer; before | ||
261 | * sending, this is converted to be a real preamble. This | ||
262 | * indicates the real size of the TX message that starts at this | ||
263 | * point. If the highest bit is set, then this message is to be | ||
264 | * skipped. | ||
265 | * @sequence: sequence number of this message | ||
266 | * @offset: offset where the message itself starts -- see the comments | ||
267 | * in the file header about message header and payload descriptor | ||
268 | * alignment. | ||
269 | * @num_pls: number of payloads in this message | ||
270 | * @padding: amount of padding bytes at the end of the message to make | ||
271 | * it be of block-size aligned | ||
272 | * | ||
273 | * Look in rx.c and tx.c for a full description of the format. | ||
274 | */ | ||
275 | struct i2400m_msg_hdr { | ||
276 | union { | ||
277 | __le32 barker; | ||
278 | __u32 size; /* same size type as barker!! */ | ||
279 | }; | ||
280 | union { | ||
281 | __le32 sequence; | ||
282 | __u32 offset; /* same size type as barker!! */ | ||
283 | }; | ||
284 | __le16 num_pls; | ||
285 | __le16 rsv1; | ||
286 | __le16 padding; | ||
287 | __le16 rsv2; | ||
288 | struct i2400m_pld pld[0]; | ||
289 | } __attribute__ ((packed)); | ||
290 | |||
291 | |||
292 | |||
293 | /* | ||
294 | * L3/L4 control protocol | ||
295 | */ | ||
296 | |||
297 | enum { | ||
298 | /* Interface version */ | ||
299 | I2400M_L3L4_VERSION = 0x0100, | ||
300 | }; | ||
301 | |||
302 | /* Message types */ | ||
303 | enum i2400m_mt { | ||
304 | I2400M_MT_RESERVED = 0x0000, | ||
305 | I2400M_MT_INVALID = 0xffff, | ||
306 | I2400M_MT_REPORT_MASK = 0x8000, | ||
307 | |||
308 | I2400M_MT_GET_SCAN_RESULT = 0x4202, | ||
309 | I2400M_MT_SET_SCAN_PARAM = 0x4402, | ||
310 | I2400M_MT_CMD_RF_CONTROL = 0x4602, | ||
311 | I2400M_MT_CMD_SCAN = 0x4603, | ||
312 | I2400M_MT_CMD_CONNECT = 0x4604, | ||
313 | I2400M_MT_CMD_DISCONNECT = 0x4605, | ||
314 | I2400M_MT_CMD_EXIT_IDLE = 0x4606, | ||
315 | I2400M_MT_GET_LM_VERSION = 0x5201, | ||
316 | I2400M_MT_GET_DEVICE_INFO = 0x5202, | ||
317 | I2400M_MT_GET_LINK_STATUS = 0x5203, | ||
318 | I2400M_MT_GET_STATISTICS = 0x5204, | ||
319 | I2400M_MT_GET_STATE = 0x5205, | ||
320 | I2400M_MT_GET_MEDIA_STATUS = 0x5206, | ||
321 | I2400M_MT_SET_INIT_CONFIG = 0x5404, | ||
322 | I2400M_MT_CMD_INIT = 0x5601, | ||
323 | I2400M_MT_CMD_TERMINATE = 0x5602, | ||
324 | I2400M_MT_CMD_MODE_OF_OP = 0x5603, | ||
325 | I2400M_MT_CMD_RESET_DEVICE = 0x5604, | ||
326 | I2400M_MT_CMD_MONITOR_CONTROL = 0x5605, | ||
327 | I2400M_MT_CMD_ENTER_POWERSAVE = 0x5606, | ||
328 | I2400M_MT_GET_TLS_OPERATION_RESULT = 0x6201, | ||
329 | I2400M_MT_SET_EAP_SUCCESS = 0x6402, | ||
330 | I2400M_MT_SET_EAP_FAIL = 0x6403, | ||
331 | I2400M_MT_SET_EAP_KEY = 0x6404, | ||
332 | I2400M_MT_CMD_SEND_EAP_RESPONSE = 0x6602, | ||
333 | I2400M_MT_REPORT_SCAN_RESULT = 0xc002, | ||
334 | I2400M_MT_REPORT_STATE = 0xd002, | ||
335 | I2400M_MT_REPORT_POWERSAVE_READY = 0xd005, | ||
336 | I2400M_MT_REPORT_EAP_REQUEST = 0xe002, | ||
337 | I2400M_MT_REPORT_EAP_RESTART = 0xe003, | ||
338 | I2400M_MT_REPORT_ALT_ACCEPT = 0xe004, | ||
339 | I2400M_MT_REPORT_KEY_REQUEST = 0xe005, | ||
340 | }; | ||
341 | |||
342 | |||
343 | /* | ||
344 | * Message Ack Status codes | ||
345 | * | ||
346 | * When a message is replied-to, this status is reported. | ||
347 | */ | ||
348 | enum i2400m_ms { | ||
349 | I2400M_MS_DONE_OK = 0, | ||
350 | I2400M_MS_DONE_IN_PROGRESS = 1, | ||
351 | I2400M_MS_INVALID_OP = 2, | ||
352 | I2400M_MS_BAD_STATE = 3, | ||
353 | I2400M_MS_ILLEGAL_VALUE = 4, | ||
354 | I2400M_MS_MISSING_PARAMS = 5, | ||
355 | I2400M_MS_VERSION_ERROR = 6, | ||
356 | I2400M_MS_ACCESSIBILITY_ERROR = 7, | ||
357 | I2400M_MS_BUSY = 8, | ||
358 | I2400M_MS_CORRUPTED_TLV = 9, | ||
359 | I2400M_MS_UNINITIALIZED = 10, | ||
360 | I2400M_MS_UNKNOWN_ERROR = 11, | ||
361 | I2400M_MS_PRODUCTION_ERROR = 12, | ||
362 | I2400M_MS_NO_RF = 13, | ||
363 | I2400M_MS_NOT_READY_FOR_POWERSAVE = 14, | ||
364 | I2400M_MS_THERMAL_CRITICAL = 15, | ||
365 | I2400M_MS_MAX | ||
366 | }; | ||
367 | |||
368 | |||
369 | /** | ||
370 | * i2400m_tlv - enumeration of the different types of TLVs | ||
371 | * | ||
372 | * TLVs stand for type-length-value and are the header for a payload | ||
373 | * composed of almost anything. Each payload has a type assigned | ||
374 | * and a length. | ||
375 | */ | ||
376 | enum i2400m_tlv { | ||
377 | I2400M_TLV_L4_MESSAGE_VERSIONS = 129, | ||
378 | I2400M_TLV_SYSTEM_STATE = 141, | ||
379 | I2400M_TLV_MEDIA_STATUS = 161, | ||
380 | I2400M_TLV_RF_OPERATION = 162, | ||
381 | I2400M_TLV_RF_STATUS = 163, | ||
382 | I2400M_TLV_DEVICE_RESET_TYPE = 132, | ||
383 | I2400M_TLV_CONFIG_IDLE_PARAMETERS = 601, | ||
384 | }; | ||
385 | |||
386 | |||
387 | struct i2400m_tlv_hdr { | ||
388 | __le16 type; | ||
389 | __le16 length; /* payload's */ | ||
390 | __u8 pl[0]; | ||
391 | } __attribute__((packed)); | ||
392 | |||
393 | |||
394 | struct i2400m_l3l4_hdr { | ||
395 | __le16 type; | ||
396 | __le16 length; /* payload's */ | ||
397 | __le16 version; | ||
398 | __le16 resv1; | ||
399 | __le16 status; | ||
400 | __le16 resv2; | ||
401 | struct i2400m_tlv_hdr pl[0]; | ||
402 | } __attribute__((packed)); | ||
403 | |||
404 | |||
405 | /** | ||
406 | * i2400m_system_state - different states of the device | ||
407 | */ | ||
408 | enum i2400m_system_state { | ||
409 | I2400M_SS_UNINITIALIZED = 1, | ||
410 | I2400M_SS_INIT, | ||
411 | I2400M_SS_READY, | ||
412 | I2400M_SS_SCAN, | ||
413 | I2400M_SS_STANDBY, | ||
414 | I2400M_SS_CONNECTING, | ||
415 | I2400M_SS_WIMAX_CONNECTED, | ||
416 | I2400M_SS_DATA_PATH_CONNECTED, | ||
417 | I2400M_SS_IDLE, | ||
418 | I2400M_SS_DISCONNECTING, | ||
419 | I2400M_SS_OUT_OF_ZONE, | ||
420 | I2400M_SS_SLEEPACTIVE, | ||
421 | I2400M_SS_PRODUCTION, | ||
422 | I2400M_SS_CONFIG, | ||
423 | I2400M_SS_RF_OFF, | ||
424 | I2400M_SS_RF_SHUTDOWN, | ||
425 | I2400M_SS_DEVICE_DISCONNECT, | ||
426 | I2400M_SS_MAX, | ||
427 | }; | ||
428 | |||
429 | |||
430 | /** | ||
431 | * i2400m_tlv_system_state - report on the state of the system | ||
432 | * | ||
433 | * @state: see enum i2400m_system_state | ||
434 | */ | ||
435 | struct i2400m_tlv_system_state { | ||
436 | struct i2400m_tlv_hdr hdr; | ||
437 | __le32 state; | ||
438 | } __attribute__((packed)); | ||
439 | |||
440 | |||
441 | struct i2400m_tlv_l4_message_versions { | ||
442 | struct i2400m_tlv_hdr hdr; | ||
443 | __le16 major; | ||
444 | __le16 minor; | ||
445 | __le16 branch; | ||
446 | __le16 reserved; | ||
447 | } __attribute__((packed)); | ||
448 | |||
449 | |||
450 | struct i2400m_tlv_detailed_device_info { | ||
451 | struct i2400m_tlv_hdr hdr; | ||
452 | __u8 reserved1[400]; | ||
453 | __u8 mac_address[6]; | ||
454 | __u8 reserved2[2]; | ||
455 | } __attribute__((packed)); | ||
456 | |||
457 | |||
458 | enum i2400m_rf_switch_status { | ||
459 | I2400M_RF_SWITCH_ON = 1, | ||
460 | I2400M_RF_SWITCH_OFF = 2, | ||
461 | }; | ||
462 | |||
463 | struct i2400m_tlv_rf_switches_status { | ||
464 | struct i2400m_tlv_hdr hdr; | ||
465 | __u8 sw_rf_switch; /* 1 ON, 2 OFF */ | ||
466 | __u8 hw_rf_switch; /* 1 ON, 2 OFF */ | ||
467 | __u8 reserved[2]; | ||
468 | } __attribute__((packed)); | ||
469 | |||
470 | |||
471 | enum { | ||
472 | i2400m_rf_operation_on = 1, | ||
473 | i2400m_rf_operation_off = 2 | ||
474 | }; | ||
475 | |||
476 | struct i2400m_tlv_rf_operation { | ||
477 | struct i2400m_tlv_hdr hdr; | ||
478 | __le32 status; /* 1 ON, 2 OFF */ | ||
479 | } __attribute__((packed)); | ||
480 | |||
481 | |||
482 | enum i2400m_tlv_reset_type { | ||
483 | I2400M_RESET_TYPE_COLD = 1, | ||
484 | I2400M_RESET_TYPE_WARM | ||
485 | }; | ||
486 | |||
487 | struct i2400m_tlv_device_reset_type { | ||
488 | struct i2400m_tlv_hdr hdr; | ||
489 | __le32 reset_type; | ||
490 | } __attribute__((packed)); | ||
491 | |||
492 | |||
493 | struct i2400m_tlv_config_idle_parameters { | ||
494 | struct i2400m_tlv_hdr hdr; | ||
495 | __le32 idle_timeout; /* 100 to 300000 ms [5min], 100 increments | ||
496 | * 0 disabled */ | ||
497 | __le32 idle_paging_interval; /* frames */ | ||
498 | } __attribute__((packed)); | ||
499 | |||
500 | |||
501 | enum i2400m_media_status { | ||
502 | I2400M_MEDIA_STATUS_LINK_UP = 1, | ||
503 | I2400M_MEDIA_STATUS_LINK_DOWN, | ||
504 | I2400M_MEDIA_STATUS_LINK_RENEW, | ||
505 | }; | ||
506 | |||
507 | struct i2400m_tlv_media_status { | ||
508 | struct i2400m_tlv_hdr hdr; | ||
509 | __le32 media_status; | ||
510 | } __attribute__((packed)); | ||
511 | |||
512 | #endif /* #ifndef __LINUX__WIMAX__I2400M_H__ */ | ||
diff --git a/include/linux/wlp.h b/include/linux/wlp.h index 033545e145c7..ac95ce6606ac 100644 --- a/include/linux/wlp.h +++ b/include/linux/wlp.h | |||
@@ -646,6 +646,7 @@ struct wlp_wss { | |||
646 | struct wlp { | 646 | struct wlp { |
647 | struct mutex mutex; | 647 | struct mutex mutex; |
648 | struct uwb_rc *rc; /* UWB radio controller */ | 648 | struct uwb_rc *rc; /* UWB radio controller */ |
649 | struct net_device *ndev; | ||
649 | struct uwb_pal pal; | 650 | struct uwb_pal pal; |
650 | struct wlp_eda eda; | 651 | struct wlp_eda eda; |
651 | struct wlp_uuid uuid; | 652 | struct wlp_uuid uuid; |
@@ -675,7 +676,7 @@ struct wlp_wss_attribute { | |||
675 | static struct wlp_wss_attribute wss_attr_##_name = __ATTR(_name, _mode, \ | 676 | static struct wlp_wss_attribute wss_attr_##_name = __ATTR(_name, _mode, \ |
676 | _show, _store) | 677 | _show, _store) |
677 | 678 | ||
678 | extern int wlp_setup(struct wlp *, struct uwb_rc *); | 679 | extern int wlp_setup(struct wlp *, struct uwb_rc *, struct net_device *ndev); |
679 | extern void wlp_remove(struct wlp *); | 680 | extern void wlp_remove(struct wlp *); |
680 | extern ssize_t wlp_neighborhood_show(struct wlp *, char *); | 681 | extern ssize_t wlp_neighborhood_show(struct wlp *, char *); |
681 | extern int wlp_wss_setup(struct net_device *, struct wlp_wss *); | 682 | extern int wlp_wss_setup(struct net_device *, struct wlp_wss *); |
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index e585657e9831..7300ecdc480c 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
@@ -30,7 +30,6 @@ static inline int task_is_pdflush(struct task_struct *task) | |||
30 | enum writeback_sync_modes { | 30 | enum writeback_sync_modes { |
31 | WB_SYNC_NONE, /* Don't wait on anything */ | 31 | WB_SYNC_NONE, /* Don't wait on anything */ |
32 | WB_SYNC_ALL, /* Wait on every mapping */ | 32 | WB_SYNC_ALL, /* Wait on every mapping */ |
33 | WB_SYNC_HOLD, /* Hold the inode on sb_dirty for sys_sync() */ | ||
34 | }; | 33 | }; |
35 | 34 | ||
36 | /* | 35 | /* |
@@ -107,7 +106,9 @@ void throttle_vm_writeout(gfp_t gfp_mask); | |||
107 | 106 | ||
108 | /* These are exported to sysctl. */ | 107 | /* These are exported to sysctl. */ |
109 | extern int dirty_background_ratio; | 108 | extern int dirty_background_ratio; |
109 | extern unsigned long dirty_background_bytes; | ||
110 | extern int vm_dirty_ratio; | 110 | extern int vm_dirty_ratio; |
111 | extern unsigned long vm_dirty_bytes; | ||
111 | extern int dirty_writeback_interval; | 112 | extern int dirty_writeback_interval; |
112 | extern int dirty_expire_interval; | 113 | extern int dirty_expire_interval; |
113 | extern int vm_highmem_is_dirtyable; | 114 | extern int vm_highmem_is_dirtyable; |
@@ -116,17 +117,26 @@ extern int laptop_mode; | |||
116 | 117 | ||
117 | extern unsigned long determine_dirtyable_memory(void); | 118 | extern unsigned long determine_dirtyable_memory(void); |
118 | 119 | ||
120 | extern int dirty_background_ratio_handler(struct ctl_table *table, int write, | ||
121 | struct file *filp, void __user *buffer, size_t *lenp, | ||
122 | loff_t *ppos); | ||
123 | extern int dirty_background_bytes_handler(struct ctl_table *table, int write, | ||
124 | struct file *filp, void __user *buffer, size_t *lenp, | ||
125 | loff_t *ppos); | ||
119 | extern int dirty_ratio_handler(struct ctl_table *table, int write, | 126 | extern int dirty_ratio_handler(struct ctl_table *table, int write, |
120 | struct file *filp, void __user *buffer, size_t *lenp, | 127 | struct file *filp, void __user *buffer, size_t *lenp, |
121 | loff_t *ppos); | 128 | loff_t *ppos); |
129 | extern int dirty_bytes_handler(struct ctl_table *table, int write, | ||
130 | struct file *filp, void __user *buffer, size_t *lenp, | ||
131 | loff_t *ppos); | ||
122 | 132 | ||
123 | struct ctl_table; | 133 | struct ctl_table; |
124 | struct file; | 134 | struct file; |
125 | int dirty_writeback_centisecs_handler(struct ctl_table *, int, struct file *, | 135 | int dirty_writeback_centisecs_handler(struct ctl_table *, int, struct file *, |
126 | void __user *, size_t *, loff_t *); | 136 | void __user *, size_t *, loff_t *); |
127 | 137 | ||
128 | void get_dirty_limits(long *pbackground, long *pdirty, long *pbdi_dirty, | 138 | void get_dirty_limits(unsigned long *pbackground, unsigned long *pdirty, |
129 | struct backing_dev_info *bdi); | 139 | unsigned long *pbdi_dirty, struct backing_dev_info *bdi); |
130 | 140 | ||
131 | void page_writeback_init(void); | 141 | void page_writeback_init(void); |
132 | void balance_dirty_pages_ratelimited_nr(struct address_space *mapping, | 142 | void balance_dirty_pages_ratelimited_nr(struct address_space *mapping, |
diff --git a/include/media/i2c-addr.h b/include/media/i2c-addr.h index e7ff44a35ca0..5d0f56054d26 100644 --- a/include/media/i2c-addr.h +++ b/include/media/i2c-addr.h | |||
@@ -12,8 +12,6 @@ | |||
12 | /* bttv address list */ | 12 | /* bttv address list */ |
13 | #define I2C_ADDR_TSA5522 0xc2 | 13 | #define I2C_ADDR_TSA5522 0xc2 |
14 | #define I2C_ADDR_TDA7432 0x8a | 14 | #define I2C_ADDR_TDA7432 0x8a |
15 | #define I2C_ADDR_BT832_ALT1 0x88 | ||
16 | #define I2C_ADDR_BT832_ALT2 0x8a // alternate setting | ||
17 | #define I2C_ADDR_TDA8425 0x82 | 15 | #define I2C_ADDR_TDA8425 0x82 |
18 | #define I2C_ADDR_TDA9840 0x84 | 16 | #define I2C_ADDR_TDA9840 0x84 |
19 | #define I2C_ADDR_TDA9850 0xb6 /* also used by 9855,9873 */ | 17 | #define I2C_ADDR_TDA9850 0xb6 /* also used by 9855,9873 */ |
diff --git a/include/media/ir-common.h b/include/media/ir-common.h index 38f2d93c3957..5bf2ea00678c 100644 --- a/include/media/ir-common.h +++ b/include/media/ir-common.h | |||
@@ -157,6 +157,8 @@ extern IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE]; | |||
157 | extern IR_KEYTAB_TYPE ir_codes_encore_enltv_fm53[IR_KEYTAB_SIZE]; | 157 | extern IR_KEYTAB_TYPE ir_codes_encore_enltv_fm53[IR_KEYTAB_SIZE]; |
158 | extern IR_KEYTAB_TYPE ir_codes_real_audio_220_32_keys[IR_KEYTAB_SIZE]; | 158 | extern IR_KEYTAB_TYPE ir_codes_real_audio_220_32_keys[IR_KEYTAB_SIZE]; |
159 | extern IR_KEYTAB_TYPE ir_codes_msi_tvanywhere_plus[IR_KEYTAB_SIZE]; | 159 | extern IR_KEYTAB_TYPE ir_codes_msi_tvanywhere_plus[IR_KEYTAB_SIZE]; |
160 | extern IR_KEYTAB_TYPE ir_codes_ati_tv_wonder_hd_600[IR_KEYTAB_SIZE]; | ||
161 | extern IR_KEYTAB_TYPE ir_codes_kworld_plus_tv_analog[IR_KEYTAB_SIZE]; | ||
160 | #endif | 162 | #endif |
161 | 163 | ||
162 | /* | 164 | /* |
diff --git a/include/media/ov772x.h b/include/media/ov772x.h new file mode 100644 index 000000000000..e391d55edb95 --- /dev/null +++ b/include/media/ov772x.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* ov772x Camera | ||
2 | * | ||
3 | * Copyright (C) 2008 Renesas Solutions Corp. | ||
4 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #ifndef __OV772X_H__ | ||
12 | #define __OV772X_H__ | ||
13 | |||
14 | #include <media/soc_camera.h> | ||
15 | |||
16 | struct ov772x_camera_info { | ||
17 | unsigned long buswidth; | ||
18 | struct soc_camera_link link; | ||
19 | }; | ||
20 | |||
21 | #endif /* __OV772X_H__ */ | ||
diff --git a/include/media/saa7146_vv.h b/include/media/saa7146_vv.h index 1d104096619c..c8d0b23fde29 100644 --- a/include/media/saa7146_vv.h +++ b/include/media/saa7146_vv.h | |||
@@ -177,9 +177,9 @@ struct saa7146_ext_vv | |||
177 | int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *); | 177 | int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *); |
178 | 178 | ||
179 | struct saa7146_extension_ioctls *ioctls; | 179 | struct saa7146_extension_ioctls *ioctls; |
180 | int (*ioctl)(struct saa7146_fh*, unsigned int cmd, void *arg); | 180 | long (*ioctl)(struct saa7146_fh *, unsigned int cmd, void *arg); |
181 | 181 | ||
182 | struct file_operations vbi_fops; | 182 | struct v4l2_file_operations vbi_fops; |
183 | }; | 183 | }; |
184 | 184 | ||
185 | struct saa7146_use_ops { | 185 | struct saa7146_use_ops { |
@@ -216,8 +216,7 @@ void saa7146_set_gpio(struct saa7146_dev *saa, u8 pin, u8 data); | |||
216 | extern struct saa7146_use_ops saa7146_video_uops; | 216 | extern struct saa7146_use_ops saa7146_video_uops; |
217 | int saa7146_start_preview(struct saa7146_fh *fh); | 217 | int saa7146_start_preview(struct saa7146_fh *fh); |
218 | int saa7146_stop_preview(struct saa7146_fh *fh); | 218 | int saa7146_stop_preview(struct saa7146_fh *fh); |
219 | int saa7146_video_do_ioctl(struct inode *inode, struct file *file, | 219 | long saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg); |
220 | unsigned int cmd, void *arg); | ||
221 | 220 | ||
222 | /* from saa7146_vbi.c */ | 221 | /* from saa7146_vbi.c */ |
223 | extern struct saa7146_use_ops saa7146_vbi_uops; | 222 | extern struct saa7146_use_ops saa7146_vbi_uops; |
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index c5de7bb19fda..7440d9250665 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h | |||
@@ -12,9 +12,10 @@ | |||
12 | #ifndef SOC_CAMERA_H | 12 | #ifndef SOC_CAMERA_H |
13 | #define SOC_CAMERA_H | 13 | #define SOC_CAMERA_H |
14 | 14 | ||
15 | #include <linux/mutex.h> | ||
16 | #include <linux/pm.h> | ||
15 | #include <linux/videodev2.h> | 17 | #include <linux/videodev2.h> |
16 | #include <media/videobuf-core.h> | 18 | #include <media/videobuf-core.h> |
17 | #include <linux/pm.h> | ||
18 | 19 | ||
19 | struct soc_camera_device { | 20 | struct soc_camera_device { |
20 | struct list_head list; | 21 | struct list_head list; |
@@ -36,14 +37,19 @@ struct soc_camera_device { | |||
36 | unsigned char iface; /* Host number */ | 37 | unsigned char iface; /* Host number */ |
37 | unsigned char devnum; /* Device number per host */ | 38 | unsigned char devnum; /* Device number per host */ |
38 | unsigned char buswidth; /* See comment in .c */ | 39 | unsigned char buswidth; /* See comment in .c */ |
40 | struct soc_camera_sense *sense; /* See comment in struct definition */ | ||
39 | struct soc_camera_ops *ops; | 41 | struct soc_camera_ops *ops; |
40 | struct video_device *vdev; | 42 | struct video_device *vdev; |
41 | const struct soc_camera_data_format *current_fmt; | 43 | const struct soc_camera_data_format *current_fmt; |
42 | const struct soc_camera_data_format *formats; | 44 | const struct soc_camera_data_format *formats; |
43 | int num_formats; | 45 | int num_formats; |
46 | struct soc_camera_format_xlate *user_formats; | ||
47 | int num_user_formats; | ||
44 | struct module *owner; | 48 | struct module *owner; |
45 | /* soc_camera.c private count. Only accessed with video_lock held */ | 49 | void *host_priv; /* Per-device host private data */ |
50 | /* soc_camera.c private count. Only accessed with .video_lock held */ | ||
46 | int use_count; | 51 | int use_count; |
52 | struct mutex video_lock; /* Protects device data */ | ||
47 | }; | 53 | }; |
48 | 54 | ||
49 | struct soc_camera_file { | 55 | struct soc_camera_file { |
@@ -56,7 +62,7 @@ struct soc_camera_host { | |||
56 | struct device dev; | 62 | struct device dev; |
57 | unsigned char nr; /* Host number */ | 63 | unsigned char nr; /* Host number */ |
58 | void *priv; | 64 | void *priv; |
59 | char *drv_name; | 65 | const char *drv_name; |
60 | struct soc_camera_host_ops *ops; | 66 | struct soc_camera_host_ops *ops; |
61 | }; | 67 | }; |
62 | 68 | ||
@@ -64,25 +70,33 @@ struct soc_camera_host_ops { | |||
64 | struct module *owner; | 70 | struct module *owner; |
65 | int (*add)(struct soc_camera_device *); | 71 | int (*add)(struct soc_camera_device *); |
66 | void (*remove)(struct soc_camera_device *); | 72 | void (*remove)(struct soc_camera_device *); |
67 | int (*suspend)(struct soc_camera_device *, pm_message_t state); | 73 | int (*suspend)(struct soc_camera_device *, pm_message_t); |
68 | int (*resume)(struct soc_camera_device *); | 74 | int (*resume)(struct soc_camera_device *); |
69 | int (*set_fmt_cap)(struct soc_camera_device *, __u32, | 75 | int (*get_formats)(struct soc_camera_device *, int, |
70 | struct v4l2_rect *); | 76 | struct soc_camera_format_xlate *); |
71 | int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *); | 77 | int (*set_fmt)(struct soc_camera_device *, __u32, struct v4l2_rect *); |
78 | int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *); | ||
72 | void (*init_videobuf)(struct videobuf_queue *, | 79 | void (*init_videobuf)(struct videobuf_queue *, |
73 | struct soc_camera_device *); | 80 | struct soc_camera_device *); |
74 | int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *); | 81 | int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *); |
75 | int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); | 82 | int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); |
76 | int (*try_bus_param)(struct soc_camera_device *, __u32); | ||
77 | int (*set_bus_param)(struct soc_camera_device *, __u32); | 83 | int (*set_bus_param)(struct soc_camera_device *, __u32); |
78 | unsigned int (*poll)(struct file *, poll_table *); | 84 | unsigned int (*poll)(struct file *, poll_table *); |
79 | }; | 85 | }; |
80 | 86 | ||
87 | #define SOCAM_SENSOR_INVERT_PCLK (1 << 0) | ||
88 | #define SOCAM_SENSOR_INVERT_MCLK (1 << 1) | ||
89 | #define SOCAM_SENSOR_INVERT_HSYNC (1 << 2) | ||
90 | #define SOCAM_SENSOR_INVERT_VSYNC (1 << 3) | ||
91 | #define SOCAM_SENSOR_INVERT_DATA (1 << 4) | ||
92 | |||
81 | struct soc_camera_link { | 93 | struct soc_camera_link { |
82 | /* Camera bus id, used to match a camera and a bus */ | 94 | /* Camera bus id, used to match a camera and a bus */ |
83 | int bus_id; | 95 | int bus_id; |
84 | /* GPIO number to switch between 8 and 10 bit modes */ | 96 | /* GPIO number to switch between 8 and 10 bit modes */ |
85 | unsigned int gpio; | 97 | unsigned int gpio; |
98 | /* Per camera SOCAM_SENSOR_* bus flags */ | ||
99 | unsigned long flags; | ||
86 | /* Optional callbacks to power on or off and reset the sensor */ | 100 | /* Optional callbacks to power on or off and reset the sensor */ |
87 | int (*power)(struct device *, int); | 101 | int (*power)(struct device *, int); |
88 | int (*reset)(struct device *); | 102 | int (*reset)(struct device *); |
@@ -106,13 +120,35 @@ extern void soc_camera_device_unregister(struct soc_camera_device *icd); | |||
106 | extern int soc_camera_video_start(struct soc_camera_device *icd); | 120 | extern int soc_camera_video_start(struct soc_camera_device *icd); |
107 | extern void soc_camera_video_stop(struct soc_camera_device *icd); | 121 | extern void soc_camera_video_stop(struct soc_camera_device *icd); |
108 | 122 | ||
123 | extern const struct soc_camera_data_format *soc_camera_format_by_fourcc( | ||
124 | struct soc_camera_device *icd, unsigned int fourcc); | ||
125 | extern const struct soc_camera_format_xlate *soc_camera_xlate_by_fourcc( | ||
126 | struct soc_camera_device *icd, unsigned int fourcc); | ||
127 | |||
109 | struct soc_camera_data_format { | 128 | struct soc_camera_data_format { |
110 | char *name; | 129 | const char *name; |
111 | unsigned int depth; | 130 | unsigned int depth; |
112 | __u32 fourcc; | 131 | __u32 fourcc; |
113 | enum v4l2_colorspace colorspace; | 132 | enum v4l2_colorspace colorspace; |
114 | }; | 133 | }; |
115 | 134 | ||
135 | /** | ||
136 | * struct soc_camera_format_xlate - match between host and sensor formats | ||
137 | * @cam_fmt: sensor format provided by the sensor | ||
138 | * @host_fmt: host format after host translation from cam_fmt | ||
139 | * @buswidth: bus width for this format | ||
140 | * | ||
141 | * Host and sensor translation structure. Used in table of host and sensor | ||
142 | * formats matchings in soc_camera_device. A host can override the generic list | ||
143 | * generation by implementing get_formats(), and use it for format checks and | ||
144 | * format setup. | ||
145 | */ | ||
146 | struct soc_camera_format_xlate { | ||
147 | const struct soc_camera_data_format *cam_fmt; | ||
148 | const struct soc_camera_data_format *host_fmt; | ||
149 | unsigned char buswidth; | ||
150 | }; | ||
151 | |||
116 | struct soc_camera_ops { | 152 | struct soc_camera_ops { |
117 | struct module *owner; | 153 | struct module *owner; |
118 | int (*probe)(struct soc_camera_device *); | 154 | int (*probe)(struct soc_camera_device *); |
@@ -123,16 +159,17 @@ struct soc_camera_ops { | |||
123 | int (*release)(struct soc_camera_device *); | 159 | int (*release)(struct soc_camera_device *); |
124 | int (*start_capture)(struct soc_camera_device *); | 160 | int (*start_capture)(struct soc_camera_device *); |
125 | int (*stop_capture)(struct soc_camera_device *); | 161 | int (*stop_capture)(struct soc_camera_device *); |
126 | int (*set_fmt_cap)(struct soc_camera_device *, __u32, | 162 | int (*set_fmt)(struct soc_camera_device *, __u32, struct v4l2_rect *); |
127 | struct v4l2_rect *); | 163 | int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *); |
128 | int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *); | ||
129 | unsigned long (*query_bus_param)(struct soc_camera_device *); | 164 | unsigned long (*query_bus_param)(struct soc_camera_device *); |
130 | int (*set_bus_param)(struct soc_camera_device *, unsigned long); | 165 | int (*set_bus_param)(struct soc_camera_device *, unsigned long); |
131 | int (*get_chip_id)(struct soc_camera_device *, | 166 | int (*get_chip_id)(struct soc_camera_device *, |
132 | struct v4l2_chip_ident *); | 167 | struct v4l2_dbg_chip_ident *); |
168 | int (*set_std)(struct soc_camera_device *, v4l2_std_id *); | ||
169 | int (*enum_input)(struct soc_camera_device *, struct v4l2_input *); | ||
133 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 170 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
134 | int (*get_register)(struct soc_camera_device *, struct v4l2_register *); | 171 | int (*get_register)(struct soc_camera_device *, struct v4l2_dbg_register *); |
135 | int (*set_register)(struct soc_camera_device *, struct v4l2_register *); | 172 | int (*set_register)(struct soc_camera_device *, struct v4l2_dbg_register *); |
136 | #endif | 173 | #endif |
137 | int (*get_control)(struct soc_camera_device *, struct v4l2_control *); | 174 | int (*get_control)(struct soc_camera_device *, struct v4l2_control *); |
138 | int (*set_control)(struct soc_camera_device *, struct v4l2_control *); | 175 | int (*set_control)(struct soc_camera_device *, struct v4l2_control *); |
@@ -140,6 +177,32 @@ struct soc_camera_ops { | |||
140 | int num_controls; | 177 | int num_controls; |
141 | }; | 178 | }; |
142 | 179 | ||
180 | #define SOCAM_SENSE_PCLK_CHANGED (1 << 0) | ||
181 | |||
182 | /** | ||
183 | * This struct can be attached to struct soc_camera_device by the host driver | ||
184 | * to request sense from the camera, for example, when calling .set_fmt(). The | ||
185 | * host then can check which flags are set and verify respective values if any. | ||
186 | * For example, if SOCAM_SENSE_PCLK_CHANGED is set, it means, pixclock has | ||
187 | * changed during this operation. After completion the host should detach sense. | ||
188 | * | ||
189 | * @flags ored SOCAM_SENSE_* flags | ||
190 | * @master_clock if the host wants to be informed about pixel-clock | ||
191 | * change, it better set master_clock. | ||
192 | * @pixel_clock_max maximum pixel clock frequency supported by the host, | ||
193 | * camera is not allowed to exceed this. | ||
194 | * @pixel_clock if the camera driver changed pixel clock during this | ||
195 | * operation, it sets SOCAM_SENSE_PCLK_CHANGED, uses | ||
196 | * master_clock to calculate the new pixel-clock and | ||
197 | * sets this field. | ||
198 | */ | ||
199 | struct soc_camera_sense { | ||
200 | unsigned long flags; | ||
201 | unsigned long master_clock; | ||
202 | unsigned long pixel_clock_max; | ||
203 | unsigned long pixel_clock; | ||
204 | }; | ||
205 | |||
143 | static inline struct v4l2_queryctrl const *soc_camera_find_qctrl( | 206 | static inline struct v4l2_queryctrl const *soc_camera_find_qctrl( |
144 | struct soc_camera_ops *ops, int id) | 207 | struct soc_camera_ops *ops, int id) |
145 | { | 208 | { |
@@ -158,15 +221,20 @@ static inline struct v4l2_queryctrl const *soc_camera_find_qctrl( | |||
158 | #define SOCAM_HSYNC_ACTIVE_LOW (1 << 3) | 221 | #define SOCAM_HSYNC_ACTIVE_LOW (1 << 3) |
159 | #define SOCAM_VSYNC_ACTIVE_HIGH (1 << 4) | 222 | #define SOCAM_VSYNC_ACTIVE_HIGH (1 << 4) |
160 | #define SOCAM_VSYNC_ACTIVE_LOW (1 << 5) | 223 | #define SOCAM_VSYNC_ACTIVE_LOW (1 << 5) |
161 | #define SOCAM_DATAWIDTH_8 (1 << 6) | 224 | #define SOCAM_DATAWIDTH_4 (1 << 6) |
162 | #define SOCAM_DATAWIDTH_9 (1 << 7) | 225 | #define SOCAM_DATAWIDTH_8 (1 << 7) |
163 | #define SOCAM_DATAWIDTH_10 (1 << 8) | 226 | #define SOCAM_DATAWIDTH_9 (1 << 8) |
164 | #define SOCAM_DATAWIDTH_16 (1 << 9) | 227 | #define SOCAM_DATAWIDTH_10 (1 << 9) |
165 | #define SOCAM_PCLK_SAMPLE_RISING (1 << 10) | 228 | #define SOCAM_DATAWIDTH_15 (1 << 10) |
166 | #define SOCAM_PCLK_SAMPLE_FALLING (1 << 11) | 229 | #define SOCAM_DATAWIDTH_16 (1 << 11) |
230 | #define SOCAM_PCLK_SAMPLE_RISING (1 << 12) | ||
231 | #define SOCAM_PCLK_SAMPLE_FALLING (1 << 13) | ||
232 | #define SOCAM_DATA_ACTIVE_HIGH (1 << 14) | ||
233 | #define SOCAM_DATA_ACTIVE_LOW (1 << 15) | ||
167 | 234 | ||
168 | #define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_9 | \ | 235 | #define SOCAM_DATAWIDTH_MASK (SOCAM_DATAWIDTH_4 | SOCAM_DATAWIDTH_8 | \ |
169 | SOCAM_DATAWIDTH_10 | SOCAM_DATAWIDTH_16) | 236 | SOCAM_DATAWIDTH_9 | SOCAM_DATAWIDTH_10 | \ |
237 | SOCAM_DATAWIDTH_15 | SOCAM_DATAWIDTH_16) | ||
170 | 238 | ||
171 | static inline unsigned long soc_camera_bus_param_compatible( | 239 | static inline unsigned long soc_camera_bus_param_compatible( |
172 | unsigned long camera_flags, unsigned long bus_flags) | 240 | unsigned long camera_flags, unsigned long bus_flags) |
@@ -182,4 +250,7 @@ static inline unsigned long soc_camera_bus_param_compatible( | |||
182 | return (!hsync || !vsync || !pclk) ? 0 : common_flags; | 250 | return (!hsync || !vsync || !pclk) ? 0 : common_flags; |
183 | } | 251 | } |
184 | 252 | ||
253 | extern unsigned long soc_camera_apply_sensor_flags(struct soc_camera_link *icl, | ||
254 | unsigned long flags); | ||
255 | |||
185 | #endif | 256 | #endif |
diff --git a/include/media/tvp514x.h b/include/media/tvp514x.h new file mode 100644 index 000000000000..5e7ee968c6dc --- /dev/null +++ b/include/media/tvp514x.h | |||
@@ -0,0 +1,118 @@ | |||
1 | /* | ||
2 | * drivers/media/video/tvp514x.h | ||
3 | * | ||
4 | * Copyright (C) 2008 Texas Instruments Inc | ||
5 | * Author: Vaibhav Hiremath <hvaibhav@ti.com> | ||
6 | * | ||
7 | * Contributors: | ||
8 | * Sivaraj R <sivaraj@ti.com> | ||
9 | * Brijesh R Jadav <brijesh.j@ti.com> | ||
10 | * Hardik Shah <hardik.shah@ti.com> | ||
11 | * Manjunath Hadli <mrh@ti.com> | ||
12 | * Karicheri Muralidharan <m-karicheri2@ti.com> | ||
13 | * | ||
14 | * This package is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | * | ||
18 | * This program is distributed in the hope that it will be useful, | ||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | * GNU General Public License for more details. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; if not, write to the Free Software | ||
25 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | * | ||
27 | */ | ||
28 | |||
29 | #ifndef _TVP514X_H | ||
30 | #define _TVP514X_H | ||
31 | |||
32 | /* | ||
33 | * Other macros | ||
34 | */ | ||
35 | #define TVP514X_MODULE_NAME "tvp514x" | ||
36 | |||
37 | #define TVP514X_XCLK_BT656 (27000000) | ||
38 | |||
39 | /* Number of pixels and number of lines per frame for different standards */ | ||
40 | #define NTSC_NUM_ACTIVE_PIXELS (720) | ||
41 | #define NTSC_NUM_ACTIVE_LINES (480) | ||
42 | #define PAL_NUM_ACTIVE_PIXELS (720) | ||
43 | #define PAL_NUM_ACTIVE_LINES (576) | ||
44 | |||
45 | /** | ||
46 | * enum tvp514x_input - enum for different decoder input pin | ||
47 | * configuration. | ||
48 | */ | ||
49 | enum tvp514x_input { | ||
50 | /* | ||
51 | * CVBS input selection | ||
52 | */ | ||
53 | INPUT_CVBS_VI1A = 0x0, | ||
54 | INPUT_CVBS_VI1B, | ||
55 | INPUT_CVBS_VI1C, | ||
56 | INPUT_CVBS_VI2A = 0x04, | ||
57 | INPUT_CVBS_VI2B, | ||
58 | INPUT_CVBS_VI2C, | ||
59 | INPUT_CVBS_VI3A = 0x08, | ||
60 | INPUT_CVBS_VI3B, | ||
61 | INPUT_CVBS_VI3C, | ||
62 | INPUT_CVBS_VI4A = 0x0C, | ||
63 | /* | ||
64 | * S-Video input selection | ||
65 | */ | ||
66 | INPUT_SVIDEO_VI2A_VI1A = 0x44, | ||
67 | INPUT_SVIDEO_VI2B_VI1B, | ||
68 | INPUT_SVIDEO_VI2C_VI1C, | ||
69 | INPUT_SVIDEO_VI2A_VI3A = 0x54, | ||
70 | INPUT_SVIDEO_VI2B_VI3B, | ||
71 | INPUT_SVIDEO_VI2C_VI3C, | ||
72 | INPUT_SVIDEO_VI4A_VI1A = 0x4C, | ||
73 | INPUT_SVIDEO_VI4A_VI1B, | ||
74 | INPUT_SVIDEO_VI4A_VI1C, | ||
75 | INPUT_SVIDEO_VI4A_VI3A = 0x5C, | ||
76 | INPUT_SVIDEO_VI4A_VI3B, | ||
77 | INPUT_SVIDEO_VI4A_VI3C, | ||
78 | |||
79 | /* Need to add entries for | ||
80 | * RGB, YPbPr and SCART. | ||
81 | */ | ||
82 | INPUT_INVALID | ||
83 | }; | ||
84 | |||
85 | /** | ||
86 | * enum tvp514x_output - enum for output format | ||
87 | * supported. | ||
88 | * | ||
89 | */ | ||
90 | enum tvp514x_output { | ||
91 | OUTPUT_10BIT_422_EMBEDDED_SYNC = 0, | ||
92 | OUTPUT_20BIT_422_SEPERATE_SYNC, | ||
93 | OUTPUT_10BIT_422_SEPERATE_SYNC = 3, | ||
94 | OUTPUT_INVALID | ||
95 | }; | ||
96 | |||
97 | /** | ||
98 | * struct tvp514x_platform_data - Platform data values and access functions. | ||
99 | * @power_set: Power state access function, zero is off, non-zero is on. | ||
100 | * @ifparm: Interface parameters access function. | ||
101 | * @priv_data_set: Device private data (pointer) access function. | ||
102 | * @clk_polarity: Clock polarity of the current interface. | ||
103 | * @ hs_polarity: HSYNC Polarity configuration for current interface. | ||
104 | * @ vs_polarity: VSYNC Polarity configuration for current interface. | ||
105 | */ | ||
106 | struct tvp514x_platform_data { | ||
107 | char *master; | ||
108 | int (*power_set) (enum v4l2_power on); | ||
109 | int (*ifparm) (struct v4l2_ifparm *p); | ||
110 | int (*priv_data_set) (void *); | ||
111 | /* Interface control params */ | ||
112 | bool clk_polarity; | ||
113 | bool hs_polarity; | ||
114 | bool vs_polarity; | ||
115 | }; | ||
116 | |||
117 | |||
118 | #endif /* ifndef _TVP514X_H */ | ||
diff --git a/include/media/tw9910.h b/include/media/tw9910.h new file mode 100644 index 000000000000..73231e7880d8 --- /dev/null +++ b/include/media/tw9910.h | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * tw9910 Driver header | ||
3 | * | ||
4 | * Copyright (C) 2008 Renesas Solutions Corp. | ||
5 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
6 | * | ||
7 | * Based on ov772x.h | ||
8 | * | ||
9 | * Copyright (C) Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #ifndef __TW9910_H__ | ||
17 | #define __TW9910_H__ | ||
18 | |||
19 | #include <media/soc_camera.h> | ||
20 | |||
21 | enum tw9910_mpout_pin { | ||
22 | TW9910_MPO_VLOSS, | ||
23 | TW9910_MPO_HLOCK, | ||
24 | TW9910_MPO_SLOCK, | ||
25 | TW9910_MPO_VLOCK, | ||
26 | TW9910_MPO_MONO, | ||
27 | TW9910_MPO_DET50, | ||
28 | TW9910_MPO_FIELD, | ||
29 | TW9910_MPO_RTCO, | ||
30 | }; | ||
31 | |||
32 | struct tw9910_video_info { | ||
33 | unsigned long buswidth; | ||
34 | enum tw9910_mpout_pin mpout; | ||
35 | struct soc_camera_link link; | ||
36 | }; | ||
37 | |||
38 | |||
39 | #endif /* __TW9910_H__ */ | ||
diff --git a/include/media/v4l2-chip-ident.h b/include/media/v4l2-chip-ident.h index d73a8e9028a5..9aaf652b20ef 100644 --- a/include/media/v4l2-chip-ident.h +++ b/include/media/v4l2-chip-ident.h | |||
@@ -2,7 +2,7 @@ | |||
2 | v4l2 chip identifiers header | 2 | v4l2 chip identifiers header |
3 | 3 | ||
4 | This header provides a list of chip identifiers that can be returned | 4 | This header provides a list of chip identifiers that can be returned |
5 | through the VIDIOC_G_CHIP_IDENT ioctl. | 5 | through the VIDIOC_DBG_G_CHIP_IDENT ioctl. |
6 | 6 | ||
7 | Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> | 7 | Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> |
8 | 8 | ||
@@ -24,7 +24,7 @@ | |||
24 | #ifndef V4L2_CHIP_IDENT_H_ | 24 | #ifndef V4L2_CHIP_IDENT_H_ |
25 | #define V4L2_CHIP_IDENT_H_ | 25 | #define V4L2_CHIP_IDENT_H_ |
26 | 26 | ||
27 | /* VIDIOC_G_CHIP_IDENT: identifies the actual chip installed on the board */ | 27 | /* VIDIOC_DBG_G_CHIP_IDENT: identifies the actual chip installed on the board */ |
28 | enum { | 28 | enum { |
29 | /* general idents: reserved range 0-49 */ | 29 | /* general idents: reserved range 0-49 */ |
30 | V4L2_IDENT_NONE = 0, /* No chip matched */ | 30 | V4L2_IDENT_NONE = 0, /* No chip matched */ |
@@ -60,6 +60,8 @@ enum { | |||
60 | 60 | ||
61 | /* OmniVision sensors: reserved range 250-299 */ | 61 | /* OmniVision sensors: reserved range 250-299 */ |
62 | V4L2_IDENT_OV7670 = 250, | 62 | V4L2_IDENT_OV7670 = 250, |
63 | V4L2_IDENT_OV7720 = 251, | ||
64 | V4L2_IDENT_OV7725 = 252, | ||
63 | 65 | ||
64 | /* Conexant MPEG encoder/decoders: reserved range 410-420 */ | 66 | /* Conexant MPEG encoder/decoders: reserved range 410-420 */ |
65 | V4L2_IDENT_CX23415 = 415, | 67 | V4L2_IDENT_CX23415 = 415, |
@@ -69,6 +71,9 @@ enum { | |||
69 | /* module vp27smpx: just ident 2700 */ | 71 | /* module vp27smpx: just ident 2700 */ |
70 | V4L2_IDENT_VP27SMPX = 2700, | 72 | V4L2_IDENT_VP27SMPX = 2700, |
71 | 73 | ||
74 | /* module tvp5150 */ | ||
75 | V4L2_IDENT_TVP5150 = 5150, | ||
76 | |||
72 | /* module cs5345: just ident 5345 */ | 77 | /* module cs5345: just ident 5345 */ |
73 | V4L2_IDENT_CS5345 = 5345, | 78 | V4L2_IDENT_CS5345 = 5345, |
74 | 79 | ||
@@ -82,6 +87,9 @@ enum { | |||
82 | /* module wm8775: just ident 8775 */ | 87 | /* module wm8775: just ident 8775 */ |
83 | V4L2_IDENT_WM8775 = 8775, | 88 | V4L2_IDENT_WM8775 = 8775, |
84 | 89 | ||
90 | /* module tw9910: just ident 9910 */ | ||
91 | V4L2_IDENT_TW9910 = 9910, | ||
92 | |||
85 | /* module cs53132a: just ident 53132 */ | 93 | /* module cs53132a: just ident 53132 */ |
86 | V4L2_IDENT_CS53l32A = 53132, | 94 | V4L2_IDENT_CS53l32A = 53132, |
87 | 95 | ||
@@ -166,8 +174,10 @@ enum { | |||
166 | V4L2_IDENT_MT9M001C12ST = 45000, | 174 | V4L2_IDENT_MT9M001C12ST = 45000, |
167 | V4L2_IDENT_MT9M001C12STM = 45005, | 175 | V4L2_IDENT_MT9M001C12STM = 45005, |
168 | V4L2_IDENT_MT9M111 = 45007, | 176 | V4L2_IDENT_MT9M111 = 45007, |
177 | V4L2_IDENT_MT9M112 = 45008, | ||
169 | V4L2_IDENT_MT9V022IX7ATC = 45010, /* No way to detect "normal" I77ATx */ | 178 | V4L2_IDENT_MT9V022IX7ATC = 45010, /* No way to detect "normal" I77ATx */ |
170 | V4L2_IDENT_MT9V022IX7ATM = 45015, /* and "lead free" IA7ATx chips */ | 179 | V4L2_IDENT_MT9V022IX7ATM = 45015, /* and "lead free" IA7ATx chips */ |
180 | V4L2_IDENT_MT9T031 = 45020, | ||
171 | }; | 181 | }; |
172 | 182 | ||
173 | #endif | 183 | #endif |
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 2f8719abf5cb..95e74f1874e1 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h | |||
@@ -57,6 +57,29 @@ | |||
57 | 57 | ||
58 | /* ------------------------------------------------------------------------- */ | 58 | /* ------------------------------------------------------------------------- */ |
59 | 59 | ||
60 | /* These printk constructs can be used with v4l2_device and v4l2_subdev */ | ||
61 | #define v4l2_printk(level, dev, fmt, arg...) \ | ||
62 | printk(level "%s: " fmt, (dev)->name , ## arg) | ||
63 | |||
64 | #define v4l2_err(dev, fmt, arg...) \ | ||
65 | v4l2_printk(KERN_ERR, dev, fmt , ## arg) | ||
66 | |||
67 | #define v4l2_warn(dev, fmt, arg...) \ | ||
68 | v4l2_printk(KERN_WARNING, dev, fmt , ## arg) | ||
69 | |||
70 | #define v4l2_info(dev, fmt, arg...) \ | ||
71 | v4l2_printk(KERN_INFO, dev, fmt , ## arg) | ||
72 | |||
73 | /* These three macros assume that the debug level is set with a module | ||
74 | parameter called 'debug'. */ | ||
75 | #define v4l2_dbg(level, debug, dev, fmt, arg...) \ | ||
76 | do { \ | ||
77 | if (debug >= (level)) \ | ||
78 | v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); \ | ||
79 | } while (0) | ||
80 | |||
81 | /* ------------------------------------------------------------------------- */ | ||
82 | |||
60 | /* Priority helper functions */ | 83 | /* Priority helper functions */ |
61 | 84 | ||
62 | struct v4l2_prio_state { | 85 | struct v4l2_prio_state { |
@@ -91,10 +114,10 @@ u32 v4l2_ctrl_next(const u32 * const *ctrl_classes, u32 id); | |||
91 | /* Register/chip ident helper function */ | 114 | /* Register/chip ident helper function */ |
92 | 115 | ||
93 | struct i2c_client; /* forward reference */ | 116 | struct i2c_client; /* forward reference */ |
94 | int v4l2_chip_match_i2c_client(struct i2c_client *c, u32 id_type, u32 chip_id); | 117 | int v4l2_chip_match_i2c_client(struct i2c_client *c, const struct v4l2_dbg_match *match); |
95 | int v4l2_chip_ident_i2c_client(struct i2c_client *c, struct v4l2_chip_ident *chip, | 118 | int v4l2_chip_ident_i2c_client(struct i2c_client *c, struct v4l2_dbg_chip_ident *chip, |
96 | u32 ident, u32 revision); | 119 | u32 ident, u32 revision); |
97 | int v4l2_chip_match_host(u32 id_type, u32 chip_id); | 120 | int v4l2_chip_match_host(const struct v4l2_dbg_match *match); |
98 | 121 | ||
99 | /* ------------------------------------------------------------------------- */ | 122 | /* ------------------------------------------------------------------------- */ |
100 | 123 | ||
@@ -104,11 +127,29 @@ struct i2c_driver; | |||
104 | struct i2c_adapter; | 127 | struct i2c_adapter; |
105 | struct i2c_client; | 128 | struct i2c_client; |
106 | struct i2c_device_id; | 129 | struct i2c_device_id; |
130 | struct v4l2_device; | ||
131 | struct v4l2_subdev; | ||
132 | struct v4l2_subdev_ops; | ||
107 | 133 | ||
108 | int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver, | 134 | int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver, |
109 | const char *name, | 135 | const char *name, |
110 | int (*probe)(struct i2c_client *, const struct i2c_device_id *)); | 136 | int (*probe)(struct i2c_client *, const struct i2c_device_id *)); |
111 | 137 | ||
138 | /* Load an i2c module and return an initialized v4l2_subdev struct. | ||
139 | Only call request_module if module_name != NULL. | ||
140 | The client_type argument is the name of the chip that's on the adapter. */ | ||
141 | struct v4l2_subdev *v4l2_i2c_new_subdev(struct i2c_adapter *adapter, | ||
142 | const char *module_name, const char *client_type, u8 addr); | ||
143 | /* Probe and load an i2c module and return an initialized v4l2_subdev struct. | ||
144 | Only call request_module if module_name != NULL. | ||
145 | The client_type argument is the name of the chip that's on the adapter. */ | ||
146 | struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct i2c_adapter *adapter, | ||
147 | const char *module_name, const char *client_type, | ||
148 | const unsigned short *addrs); | ||
149 | /* Initialize an v4l2_subdev with data from an i2c_client struct */ | ||
150 | void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client, | ||
151 | const struct v4l2_subdev_ops *ops); | ||
152 | |||
112 | /* ------------------------------------------------------------------------- */ | 153 | /* ------------------------------------------------------------------------- */ |
113 | 154 | ||
114 | /* Internal ioctls */ | 155 | /* Internal ioctls */ |
diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h index a0a6b41c5e09..e36faab8459b 100644 --- a/include/media/v4l2-dev.h +++ b/include/media/v4l2-dev.h | |||
@@ -25,6 +25,25 @@ | |||
25 | #define VFL_TYPE_MAX 4 | 25 | #define VFL_TYPE_MAX 4 |
26 | 26 | ||
27 | struct v4l2_ioctl_callbacks; | 27 | struct v4l2_ioctl_callbacks; |
28 | struct video_device; | ||
29 | struct v4l2_device; | ||
30 | |||
31 | /* Flag to mark the video_device struct as unregistered. | ||
32 | Drivers can set this flag if they want to block all future | ||
33 | device access. It is set by video_unregister_device. */ | ||
34 | #define V4L2_FL_UNREGISTERED (0) | ||
35 | |||
36 | struct v4l2_file_operations { | ||
37 | struct module *owner; | ||
38 | ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); | ||
39 | ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); | ||
40 | unsigned int (*poll) (struct file *, struct poll_table_struct *); | ||
41 | long (*ioctl) (struct file *, unsigned int, unsigned long); | ||
42 | long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); | ||
43 | int (*mmap) (struct file *, struct vm_area_struct *); | ||
44 | int (*open) (struct file *); | ||
45 | int (*release) (struct file *); | ||
46 | }; | ||
28 | 47 | ||
29 | /* | 48 | /* |
30 | * Newer version of video_device, handled by videodev2.c | 49 | * Newer version of video_device, handled by videodev2.c |
@@ -35,19 +54,24 @@ struct v4l2_ioctl_callbacks; | |||
35 | struct video_device | 54 | struct video_device |
36 | { | 55 | { |
37 | /* device ops */ | 56 | /* device ops */ |
38 | const struct file_operations *fops; | 57 | const struct v4l2_file_operations *fops; |
39 | 58 | ||
40 | /* sysfs */ | 59 | /* sysfs */ |
41 | struct device dev; /* v4l device */ | 60 | struct device dev; /* v4l device */ |
42 | struct cdev cdev; /* character device */ | 61 | struct cdev *cdev; /* character device */ |
43 | void (*cdev_release)(struct kobject *kobj); | 62 | |
63 | /* Set either parent or v4l2_dev if your driver uses v4l2_device */ | ||
44 | struct device *parent; /* device parent */ | 64 | struct device *parent; /* device parent */ |
65 | struct v4l2_device *v4l2_dev; /* v4l2_device parent */ | ||
45 | 66 | ||
46 | /* device info */ | 67 | /* device info */ |
47 | char name[32]; | 68 | char name[32]; |
48 | int vfl_type; | 69 | int vfl_type; |
70 | /* 'minor' is set to -1 if the registration failed */ | ||
49 | int minor; | 71 | int minor; |
50 | u16 num; | 72 | u16 num; |
73 | /* use bitops to set/clear/test flags */ | ||
74 | unsigned long flags; | ||
51 | /* attribute to differentiate multiple indices on one physical device */ | 75 | /* attribute to differentiate multiple indices on one physical device */ |
52 | int index; | 76 | int index; |
53 | 77 | ||
@@ -58,7 +82,7 @@ struct video_device | |||
58 | v4l2_std_id current_norm; /* Current tvnorm */ | 82 | v4l2_std_id current_norm; /* Current tvnorm */ |
59 | 83 | ||
60 | /* callbacks */ | 84 | /* callbacks */ |
61 | void (*release)(struct video_device *vfd); | 85 | void (*release)(struct video_device *vdev); |
62 | 86 | ||
63 | /* ioctl callbacks */ | 87 | /* ioctl callbacks */ |
64 | const struct v4l2_ioctl_ops *ioctl_ops; | 88 | const struct v4l2_ioctl_ops *ioctl_ops; |
@@ -67,36 +91,41 @@ struct video_device | |||
67 | /* dev to video-device */ | 91 | /* dev to video-device */ |
68 | #define to_video_device(cd) container_of(cd, struct video_device, dev) | 92 | #define to_video_device(cd) container_of(cd, struct video_device, dev) |
69 | 93 | ||
70 | /* Register and unregister devices. Note that if video_register_device fails, | 94 | /* Register video devices. Note that if video_register_device fails, |
71 | the release() callback of the video_device structure is *not* called, so | 95 | the release() callback of the video_device structure is *not* called, so |
72 | the caller is responsible for freeing any data. Usually that means that | 96 | the caller is responsible for freeing any data. Usually that means that |
73 | you call video_device_release() on failure. */ | 97 | you call video_device_release() on failure. |
74 | int __must_check video_register_device(struct video_device *vfd, int type, int nr); | 98 | |
75 | int __must_check video_register_device_index(struct video_device *vfd, | 99 | Also note that vdev->minor is set to -1 if the registration failed. */ |
100 | int __must_check video_register_device(struct video_device *vdev, int type, int nr); | ||
101 | int __must_check video_register_device_index(struct video_device *vdev, | ||
76 | int type, int nr, int index); | 102 | int type, int nr, int index); |
77 | void video_unregister_device(struct video_device *vfd); | 103 | |
104 | /* Unregister video devices. Will do nothing if vdev == NULL or | ||
105 | vdev->minor < 0. */ | ||
106 | void video_unregister_device(struct video_device *vdev); | ||
78 | 107 | ||
79 | /* helper functions to alloc/release struct video_device, the | 108 | /* helper functions to alloc/release struct video_device, the |
80 | latter can also be used for video_device->release(). */ | 109 | latter can also be used for video_device->release(). */ |
81 | struct video_device * __must_check video_device_alloc(void); | 110 | struct video_device * __must_check video_device_alloc(void); |
82 | 111 | ||
83 | /* this release function frees the vfd pointer */ | 112 | /* this release function frees the vdev pointer */ |
84 | void video_device_release(struct video_device *vfd); | 113 | void video_device_release(struct video_device *vdev); |
85 | 114 | ||
86 | /* this release function does nothing, use when the video_device is a | 115 | /* this release function does nothing, use when the video_device is a |
87 | static global struct. Note that having a static video_device is | 116 | static global struct. Note that having a static video_device is |
88 | a dubious construction at best. */ | 117 | a dubious construction at best. */ |
89 | void video_device_release_empty(struct video_device *vfd); | 118 | void video_device_release_empty(struct video_device *vdev); |
90 | 119 | ||
91 | /* helper functions to access driver private data. */ | 120 | /* helper functions to access driver private data. */ |
92 | static inline void *video_get_drvdata(struct video_device *dev) | 121 | static inline void *video_get_drvdata(struct video_device *vdev) |
93 | { | 122 | { |
94 | return dev_get_drvdata(&dev->dev); | 123 | return dev_get_drvdata(&vdev->dev); |
95 | } | 124 | } |
96 | 125 | ||
97 | static inline void video_set_drvdata(struct video_device *dev, void *data) | 126 | static inline void video_set_drvdata(struct video_device *vdev, void *data) |
98 | { | 127 | { |
99 | dev_set_drvdata(&dev->dev, data); | 128 | dev_set_drvdata(&vdev->dev, data); |
100 | } | 129 | } |
101 | 130 | ||
102 | struct video_device *video_devdata(struct file *file); | 131 | struct video_device *video_devdata(struct file *file); |
@@ -108,4 +137,9 @@ static inline void *video_drvdata(struct file *file) | |||
108 | return video_get_drvdata(video_devdata(file)); | 137 | return video_get_drvdata(video_devdata(file)); |
109 | } | 138 | } |
110 | 139 | ||
140 | static inline int video_is_unregistered(struct video_device *vdev) | ||
141 | { | ||
142 | return test_bit(V4L2_FL_UNREGISTERED, &vdev->flags); | ||
143 | } | ||
144 | |||
111 | #endif /* _V4L2_DEV_H */ | 145 | #endif /* _V4L2_DEV_H */ |
diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h new file mode 100644 index 000000000000..9bf4ccc93dbf --- /dev/null +++ b/include/media/v4l2-device.h | |||
@@ -0,0 +1,109 @@ | |||
1 | /* | ||
2 | V4L2 device support header. | ||
3 | |||
4 | Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl> | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef _V4L2_DEVICE_H | ||
22 | #define _V4L2_DEVICE_H | ||
23 | |||
24 | #include <media/v4l2-subdev.h> | ||
25 | |||
26 | /* Each instance of a V4L2 device should create the v4l2_device struct, | ||
27 | either stand-alone or embedded in a larger struct. | ||
28 | |||
29 | It allows easy access to sub-devices (see v4l2-subdev.h) and provides | ||
30 | basic V4L2 device-level support. | ||
31 | */ | ||
32 | |||
33 | #define V4L2_DEVICE_NAME_SIZE (BUS_ID_SIZE + 16) | ||
34 | |||
35 | struct v4l2_device { | ||
36 | /* dev->driver_data points to this struct */ | ||
37 | struct device *dev; | ||
38 | /* used to keep track of the registered subdevs */ | ||
39 | struct list_head subdevs; | ||
40 | /* lock this struct; can be used by the driver as well if this | ||
41 | struct is embedded into a larger struct. */ | ||
42 | spinlock_t lock; | ||
43 | /* unique device name, by default the driver name + bus ID */ | ||
44 | char name[V4L2_DEVICE_NAME_SIZE]; | ||
45 | }; | ||
46 | |||
47 | /* Initialize v4l2_dev and make dev->driver_data point to v4l2_dev */ | ||
48 | int __must_check v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev); | ||
49 | /* Set v4l2_dev->dev->driver_data to NULL and unregister all sub-devices */ | ||
50 | void v4l2_device_unregister(struct v4l2_device *v4l2_dev); | ||
51 | |||
52 | /* Register a subdev with a v4l2 device. While registered the subdev module | ||
53 | is marked as in-use. An error is returned if the module is no longer | ||
54 | loaded when you attempt to register it. */ | ||
55 | int __must_check v4l2_device_register_subdev(struct v4l2_device *dev, struct v4l2_subdev *sd); | ||
56 | /* Unregister a subdev with a v4l2 device. Can also be called if the subdev | ||
57 | wasn't registered. In that case it will do nothing. */ | ||
58 | void v4l2_device_unregister_subdev(struct v4l2_subdev *sd); | ||
59 | |||
60 | /* Iterate over all subdevs. */ | ||
61 | #define v4l2_device_for_each_subdev(sd, dev) \ | ||
62 | list_for_each_entry(sd, &(dev)->subdevs, list) | ||
63 | |||
64 | /* Call the specified callback for all subdevs matching the condition. | ||
65 | Ignore any errors. Note that you cannot add or delete a subdev | ||
66 | while walking the subdevs list. */ | ||
67 | #define __v4l2_device_call_subdevs(dev, cond, o, f, args...) \ | ||
68 | do { \ | ||
69 | struct v4l2_subdev *sd; \ | ||
70 | \ | ||
71 | list_for_each_entry(sd, &(dev)->subdevs, list) \ | ||
72 | if ((cond) && sd->ops->o && sd->ops->o->f) \ | ||
73 | sd->ops->o->f(sd , ##args); \ | ||
74 | } while (0) | ||
75 | |||
76 | /* Call the specified callback for all subdevs matching the condition. | ||
77 | If the callback returns an error other than 0 or -ENOIOCTLCMD, then | ||
78 | return with that error code. Note that you cannot add or delete a | ||
79 | subdev while walking the subdevs list. */ | ||
80 | #define __v4l2_device_call_subdevs_until_err(dev, cond, o, f, args...) \ | ||
81 | ({ \ | ||
82 | struct v4l2_subdev *sd; \ | ||
83 | long err = 0; \ | ||
84 | \ | ||
85 | list_for_each_entry(sd, &(dev)->subdevs, list) { \ | ||
86 | if ((cond) && sd->ops->o && sd->ops->o->f) \ | ||
87 | err = sd->ops->o->f(sd , ##args); \ | ||
88 | if (err && err != -ENOIOCTLCMD) \ | ||
89 | break; \ | ||
90 | } \ | ||
91 | (err == -ENOIOCTLCMD) ? 0 : err; \ | ||
92 | }) | ||
93 | |||
94 | /* Call the specified callback for all subdevs matching grp_id (if 0, then | ||
95 | match them all). Ignore any errors. Note that you cannot add or delete | ||
96 | a subdev while walking the subdevs list. */ | ||
97 | #define v4l2_device_call_all(dev, grp_id, o, f, args...) \ | ||
98 | __v4l2_device_call_subdevs(dev, \ | ||
99 | !(grp_id) || sd->grp_id == (grp_id), o, f , ##args) | ||
100 | |||
101 | /* Call the specified callback for all subdevs matching grp_id (if 0, then | ||
102 | match them all). If the callback returns an error other than 0 or | ||
103 | -ENOIOCTLCMD, then return with that error code. Note that you cannot | ||
104 | add or delete a subdev while walking the subdevs list. */ | ||
105 | #define v4l2_device_call_until_err(dev, grp_id, o, f, args...) \ | ||
106 | __v4l2_device_call_subdevs_until_err(dev, \ | ||
107 | !(grp_id) || sd->grp_id == (grp_id), o, f , ##args) | ||
108 | |||
109 | #endif | ||
diff --git a/include/media/v4l2-int-device.h b/include/media/v4l2-int-device.h index 9c2df41dbf92..fbf585561570 100644 --- a/include/media/v4l2-int-device.h +++ b/include/media/v4l2-int-device.h | |||
@@ -183,6 +183,9 @@ enum v4l2_int_ioctl_num { | |||
183 | vidioc_int_s_crop_num, | 183 | vidioc_int_s_crop_num, |
184 | vidioc_int_g_parm_num, | 184 | vidioc_int_g_parm_num, |
185 | vidioc_int_s_parm_num, | 185 | vidioc_int_s_parm_num, |
186 | vidioc_int_querystd_num, | ||
187 | vidioc_int_s_std_num, | ||
188 | vidioc_int_s_video_routing_num, | ||
186 | 189 | ||
187 | /* | 190 | /* |
188 | * | 191 | * |
@@ -216,7 +219,7 @@ enum v4l2_int_ioctl_num { | |||
216 | vidioc_int_reset_num, | 219 | vidioc_int_reset_num, |
217 | /* VIDIOC_INT_INIT */ | 220 | /* VIDIOC_INT_INIT */ |
218 | vidioc_int_init_num, | 221 | vidioc_int_init_num, |
219 | /* VIDIOC_INT_G_CHIP_IDENT */ | 222 | /* VIDIOC_DBG_G_CHIP_IDENT */ |
220 | vidioc_int_g_chip_ident_num, | 223 | vidioc_int_g_chip_ident_num, |
221 | 224 | ||
222 | /* | 225 | /* |
@@ -284,6 +287,9 @@ V4L2_INT_WRAPPER_1(g_crop, struct v4l2_crop, *); | |||
284 | V4L2_INT_WRAPPER_1(s_crop, struct v4l2_crop, *); | 287 | V4L2_INT_WRAPPER_1(s_crop, struct v4l2_crop, *); |
285 | V4L2_INT_WRAPPER_1(g_parm, struct v4l2_streamparm, *); | 288 | V4L2_INT_WRAPPER_1(g_parm, struct v4l2_streamparm, *); |
286 | V4L2_INT_WRAPPER_1(s_parm, struct v4l2_streamparm, *); | 289 | V4L2_INT_WRAPPER_1(s_parm, struct v4l2_streamparm, *); |
290 | V4L2_INT_WRAPPER_1(querystd, v4l2_std_id, *); | ||
291 | V4L2_INT_WRAPPER_1(s_std, v4l2_std_id, *); | ||
292 | V4L2_INT_WRAPPER_1(s_video_routing, struct v4l2_routing, *); | ||
287 | 293 | ||
288 | V4L2_INT_WRAPPER_0(dev_init); | 294 | V4L2_INT_WRAPPER_0(dev_init); |
289 | V4L2_INT_WRAPPER_0(dev_exit); | 295 | V4L2_INT_WRAPPER_0(dev_exit); |
diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h index e6ba25b3d7c8..b01c044868d0 100644 --- a/include/media/v4l2-ioctl.h +++ b/include/media/v4l2-ioctl.h | |||
@@ -225,15 +225,21 @@ struct v4l2_ioctl_ops { | |||
225 | /* Debugging ioctls */ | 225 | /* Debugging ioctls */ |
226 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 226 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
227 | int (*vidioc_g_register) (struct file *file, void *fh, | 227 | int (*vidioc_g_register) (struct file *file, void *fh, |
228 | struct v4l2_register *reg); | 228 | struct v4l2_dbg_register *reg); |
229 | int (*vidioc_s_register) (struct file *file, void *fh, | 229 | int (*vidioc_s_register) (struct file *file, void *fh, |
230 | struct v4l2_register *reg); | 230 | struct v4l2_dbg_register *reg); |
231 | #endif | 231 | #endif |
232 | int (*vidioc_g_chip_ident) (struct file *file, void *fh, | 232 | int (*vidioc_g_chip_ident) (struct file *file, void *fh, |
233 | struct v4l2_chip_ident *chip); | 233 | struct v4l2_dbg_chip_ident *chip); |
234 | |||
235 | int (*vidioc_enum_framesizes) (struct file *file, void *fh, | ||
236 | struct v4l2_frmsizeenum *fsize); | ||
237 | |||
238 | int (*vidioc_enum_frameintervals) (struct file *file, void *fh, | ||
239 | struct v4l2_frmivalenum *fival); | ||
234 | 240 | ||
235 | /* For other private ioctls */ | 241 | /* For other private ioctls */ |
236 | int (*vidioc_default) (struct file *file, void *fh, | 242 | long (*vidioc_default) (struct file *file, void *fh, |
237 | int cmd, void *arg); | 243 | int cmd, void *arg); |
238 | }; | 244 | }; |
239 | 245 | ||
@@ -271,38 +277,27 @@ extern const char *v4l2_field_names[]; | |||
271 | extern const char *v4l2_type_names[]; | 277 | extern const char *v4l2_type_names[]; |
272 | 278 | ||
273 | /* Compatibility layer interface -- v4l1-compat module */ | 279 | /* Compatibility layer interface -- v4l1-compat module */ |
274 | typedef int (*v4l2_kioctl)(struct file *file, | 280 | typedef long (*v4l2_kioctl)(struct file *file, |
275 | unsigned int cmd, void *arg); | 281 | unsigned int cmd, void *arg); |
276 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | 282 | #ifdef CONFIG_VIDEO_V4L1_COMPAT |
277 | int v4l_compat_translate_ioctl(struct file *file, | 283 | long v4l_compat_translate_ioctl(struct file *file, |
278 | int cmd, void *arg, v4l2_kioctl driver_ioctl); | 284 | int cmd, void *arg, v4l2_kioctl driver_ioctl); |
279 | #else | 285 | #else |
280 | #define v4l_compat_translate_ioctl(file, cmd, arg, ioctl) (-EINVAL) | 286 | #define v4l_compat_translate_ioctl(file, cmd, arg, ioctl) (-EINVAL) |
281 | #endif | 287 | #endif |
282 | 288 | ||
289 | #ifdef CONFIG_COMPAT | ||
283 | /* 32 Bits compatibility layer for 64 bits processors */ | 290 | /* 32 Bits compatibility layer for 64 bits processors */ |
284 | extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd, | 291 | extern long v4l2_compat_ioctl32(struct file *file, unsigned int cmd, |
285 | unsigned long arg); | 292 | unsigned long arg); |
293 | #endif | ||
286 | 294 | ||
287 | /* Include support for obsoleted stuff */ | 295 | /* Include support for obsoleted stuff */ |
288 | extern int video_usercopy(struct inode *inode, struct file *file, | 296 | extern long video_usercopy(struct file *file, unsigned int cmd, |
289 | unsigned int cmd, unsigned long arg, | 297 | unsigned long arg, v4l2_kioctl func); |
290 | int (*func)(struct inode *inode, struct file *file, | ||
291 | unsigned int cmd, void *arg)); | ||
292 | 298 | ||
293 | /* Standard handlers for V4L ioctl's */ | 299 | /* Standard handlers for V4L ioctl's */ |
294 | 300 | extern long video_ioctl2(struct file *file, | |
295 | /* This prototype is used on fops.unlocked_ioctl */ | ||
296 | extern int __video_ioctl2(struct file *file, | ||
297 | unsigned int cmd, unsigned long arg); | ||
298 | |||
299 | /* This prototype is used on fops.ioctl | ||
300 | * Since fops.ioctl enables Kernel Big Lock, it is preferred | ||
301 | * to use __video_ioctl2 instead. | ||
302 | * It should be noticed that there's no lock code inside | ||
303 | * video_ioctl2(). | ||
304 | */ | ||
305 | extern int video_ioctl2(struct inode *inode, struct file *file, | ||
306 | unsigned int cmd, unsigned long arg); | 301 | unsigned int cmd, unsigned long arg); |
307 | 302 | ||
308 | #endif /* _V4L2_IOCTL_H */ | 303 | #endif /* _V4L2_IOCTL_H */ |
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h new file mode 100644 index 000000000000..37b09e56e943 --- /dev/null +++ b/include/media/v4l2-subdev.h | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | V4L2 sub-device support header. | ||
3 | |||
4 | Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl> | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef _V4L2_SUBDEV_H | ||
22 | #define _V4L2_SUBDEV_H | ||
23 | |||
24 | #include <media/v4l2-common.h> | ||
25 | |||
26 | struct v4l2_device; | ||
27 | struct v4l2_subdev; | ||
28 | struct tuner_setup; | ||
29 | |||
30 | /* Sub-devices are devices that are connected somehow to the main bridge | ||
31 | device. These devices are usually audio/video muxers/encoders/decoders or | ||
32 | sensors and webcam controllers. | ||
33 | |||
34 | Usually these devices are controlled through an i2c bus, but other busses | ||
35 | may also be used. | ||
36 | |||
37 | The v4l2_subdev struct provides a way of accessing these devices in a | ||
38 | generic manner. Most operations that these sub-devices support fall in | ||
39 | a few categories: core ops, audio ops, video ops and tuner ops. | ||
40 | |||
41 | More categories can be added if needed, although this should remain a | ||
42 | limited set (no more than approx. 8 categories). | ||
43 | |||
44 | Each category has its own set of ops that subdev drivers can implement. | ||
45 | |||
46 | A subdev driver can leave the pointer to the category ops NULL if | ||
47 | it does not implement them (e.g. an audio subdev will generally not | ||
48 | implement the video category ops). The exception is the core category: | ||
49 | this must always be present. | ||
50 | |||
51 | These ops are all used internally so it is no problem to change, remove | ||
52 | or add ops or move ops from one to another category. Currently these | ||
53 | ops are based on the original ioctls, but since ops are not limited to | ||
54 | one argument there is room for improvement here once all i2c subdev | ||
55 | drivers are converted to use these ops. | ||
56 | */ | ||
57 | |||
58 | /* Core ops: it is highly recommended to implement at least these ops: | ||
59 | |||
60 | g_chip_ident | ||
61 | log_status | ||
62 | g_register | ||
63 | s_register | ||
64 | |||
65 | This provides basic debugging support. | ||
66 | |||
67 | The ioctl ops is meant for generic ioctl-like commands. Depending on | ||
68 | the use-case it might be better to use subdev-specific ops (currently | ||
69 | not yet implemented) since ops provide proper type-checking. | ||
70 | */ | ||
71 | struct v4l2_subdev_core_ops { | ||
72 | int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip); | ||
73 | int (*log_status)(struct v4l2_subdev *sd); | ||
74 | int (*init)(struct v4l2_subdev *sd, u32 val); | ||
75 | int (*s_standby)(struct v4l2_subdev *sd, u32 standby); | ||
76 | int (*reset)(struct v4l2_subdev *sd, u32 val); | ||
77 | int (*s_gpio)(struct v4l2_subdev *sd, u32 val); | ||
78 | int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc); | ||
79 | int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl); | ||
80 | int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl); | ||
81 | int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm); | ||
82 | long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg); | ||
83 | #ifdef CONFIG_VIDEO_ADV_DEBUG | ||
84 | int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); | ||
85 | int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); | ||
86 | #endif | ||
87 | }; | ||
88 | |||
89 | struct v4l2_subdev_tuner_ops { | ||
90 | int (*s_mode)(struct v4l2_subdev *sd, enum v4l2_tuner_type); | ||
91 | int (*s_radio)(struct v4l2_subdev *sd); | ||
92 | int (*s_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq); | ||
93 | int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq); | ||
94 | int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt); | ||
95 | int (*s_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt); | ||
96 | int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm); | ||
97 | int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type); | ||
98 | int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config); | ||
99 | }; | ||
100 | |||
101 | struct v4l2_subdev_audio_ops { | ||
102 | int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq); | ||
103 | int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq); | ||
104 | int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route); | ||
105 | }; | ||
106 | |||
107 | struct v4l2_subdev_video_ops { | ||
108 | int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route); | ||
109 | int (*s_crystal_freq)(struct v4l2_subdev *sd, struct v4l2_crystal_freq *freq); | ||
110 | int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line); | ||
111 | int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data); | ||
112 | int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data); | ||
113 | int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap); | ||
114 | int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std); | ||
115 | int (*s_stream)(struct v4l2_subdev *sd, int enable); | ||
116 | int (*s_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | ||
117 | int (*g_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | ||
118 | }; | ||
119 | |||
120 | struct v4l2_subdev_ops { | ||
121 | const struct v4l2_subdev_core_ops *core; | ||
122 | const struct v4l2_subdev_tuner_ops *tuner; | ||
123 | const struct v4l2_subdev_audio_ops *audio; | ||
124 | const struct v4l2_subdev_video_ops *video; | ||
125 | }; | ||
126 | |||
127 | #define V4L2_SUBDEV_NAME_SIZE 32 | ||
128 | |||
129 | /* Each instance of a subdev driver should create this struct, either | ||
130 | stand-alone or embedded in a larger struct. | ||
131 | */ | ||
132 | struct v4l2_subdev { | ||
133 | struct list_head list; | ||
134 | struct module *owner; | ||
135 | struct v4l2_device *dev; | ||
136 | const struct v4l2_subdev_ops *ops; | ||
137 | /* name must be unique */ | ||
138 | char name[V4L2_SUBDEV_NAME_SIZE]; | ||
139 | /* can be used to group similar subdevs, value is driver-specific */ | ||
140 | u32 grp_id; | ||
141 | /* pointer to private data */ | ||
142 | void *priv; | ||
143 | }; | ||
144 | |||
145 | static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) | ||
146 | { | ||
147 | sd->priv = p; | ||
148 | } | ||
149 | |||
150 | static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd) | ||
151 | { | ||
152 | return sd->priv; | ||
153 | } | ||
154 | |||
155 | /* Convert an ioctl-type command to the proper v4l2_subdev_ops function call. | ||
156 | This is used by subdev modules that can be called by both old-style ioctl | ||
157 | commands and through the v4l2_subdev_ops. | ||
158 | |||
159 | The ioctl API of the subdev driver can call this function to call the | ||
160 | right ops based on the ioctl cmd and arg. | ||
161 | |||
162 | Once all subdev drivers have been converted and all drivers no longer | ||
163 | use the ioctl interface, then this function can be removed. | ||
164 | */ | ||
165 | int v4l2_subdev_command(struct v4l2_subdev *sd, unsigned cmd, void *arg); | ||
166 | |||
167 | static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | ||
168 | const struct v4l2_subdev_ops *ops) | ||
169 | { | ||
170 | INIT_LIST_HEAD(&sd->list); | ||
171 | /* ops->core MUST be set */ | ||
172 | BUG_ON(!ops || !ops->core); | ||
173 | sd->ops = ops; | ||
174 | sd->dev = NULL; | ||
175 | sd->name[0] = '\0'; | ||
176 | sd->grp_id = 0; | ||
177 | sd->priv = NULL; | ||
178 | } | ||
179 | |||
180 | /* Call an ops of a v4l2_subdev, doing the right checks against | ||
181 | NULL pointers. | ||
182 | |||
183 | Example: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip); | ||
184 | */ | ||
185 | #define v4l2_subdev_call(sd, o, f, args...) \ | ||
186 | (!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \ | ||
187 | (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) | ||
188 | |||
189 | #endif | ||
diff --git a/include/mtd/ubi-user.h b/include/mtd/ubi-user.h index ccdc562e444e..2dc2eb2b8e22 100644 --- a/include/mtd/ubi-user.h +++ b/include/mtd/ubi-user.h | |||
@@ -253,7 +253,7 @@ struct ubi_mkvol_req { | |||
253 | * | 253 | * |
254 | * Re-sizing is possible for both dynamic and static volumes. But while dynamic | 254 | * Re-sizing is possible for both dynamic and static volumes. But while dynamic |
255 | * volumes may be re-sized arbitrarily, static volumes cannot be made to be | 255 | * volumes may be re-sized arbitrarily, static volumes cannot be made to be |
256 | * smaller then the number of bytes they bear. To arbitrarily shrink a static | 256 | * smaller than the number of bytes they bear. To arbitrarily shrink a static |
257 | * volume, it must be wiped out first (by means of volume update operation with | 257 | * volume, it must be wiped out first (by means of volume update operation with |
258 | * zero number of bytes). | 258 | * zero number of bytes). |
259 | */ | 259 | */ |
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h index 9909774eb998..bedc7f62e35d 100644 --- a/include/net/cipso_ipv4.h +++ b/include/net/cipso_ipv4.h | |||
@@ -131,7 +131,8 @@ extern int cipso_v4_rbm_strictvalid; | |||
131 | */ | 131 | */ |
132 | 132 | ||
133 | #ifdef CONFIG_NETLABEL | 133 | #ifdef CONFIG_NETLABEL |
134 | int cipso_v4_doi_add(struct cipso_v4_doi *doi_def); | 134 | int cipso_v4_doi_add(struct cipso_v4_doi *doi_def, |
135 | struct netlbl_audit *audit_info); | ||
135 | void cipso_v4_doi_free(struct cipso_v4_doi *doi_def); | 136 | void cipso_v4_doi_free(struct cipso_v4_doi *doi_def); |
136 | int cipso_v4_doi_remove(u32 doi, struct netlbl_audit *audit_info); | 137 | int cipso_v4_doi_remove(u32 doi, struct netlbl_audit *audit_info); |
137 | struct cipso_v4_doi *cipso_v4_doi_getdef(u32 doi); | 138 | struct cipso_v4_doi *cipso_v4_doi_getdef(u32 doi); |
@@ -140,7 +141,8 @@ int cipso_v4_doi_walk(u32 *skip_cnt, | |||
140 | int (*callback) (struct cipso_v4_doi *doi_def, void *arg), | 141 | int (*callback) (struct cipso_v4_doi *doi_def, void *arg), |
141 | void *cb_arg); | 142 | void *cb_arg); |
142 | #else | 143 | #else |
143 | static inline int cipso_v4_doi_add(struct cipso_v4_doi *doi_def) | 144 | static inline int cipso_v4_doi_add(struct cipso_v4_doi *doi_def, |
145 | struct netlbl_audit *audit_info) | ||
144 | { | 146 | { |
145 | return -ENOSYS; | 147 | return -ENOSYS; |
146 | } | 148 | } |
diff --git a/include/net/ndisc.h b/include/net/ndisc.h index ce532f2222ce..1459ed3e2697 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h | |||
@@ -155,9 +155,9 @@ static inline struct neighbour * ndisc_get_neigh(struct net_device *dev, const s | |||
155 | { | 155 | { |
156 | 156 | ||
157 | if (dev) | 157 | if (dev) |
158 | return __neigh_lookup(&nd_tbl, addr, dev, 1); | 158 | return __neigh_lookup_errno(&nd_tbl, addr, dev); |
159 | 159 | ||
160 | return NULL; | 160 | return ERR_PTR(-ENODEV); |
161 | } | 161 | } |
162 | 162 | ||
163 | 163 | ||
diff --git a/include/net/netdma.h b/include/net/netdma.h index f28c6e064e8f..8ba8ce284eeb 100644 --- a/include/net/netdma.h +++ b/include/net/netdma.h | |||
@@ -24,17 +24,6 @@ | |||
24 | #include <linux/dmaengine.h> | 24 | #include <linux/dmaengine.h> |
25 | #include <linux/skbuff.h> | 25 | #include <linux/skbuff.h> |
26 | 26 | ||
27 | static inline struct dma_chan *get_softnet_dma(void) | ||
28 | { | ||
29 | struct dma_chan *chan; | ||
30 | rcu_read_lock(); | ||
31 | chan = rcu_dereference(__get_cpu_var(softnet_data).net_dma); | ||
32 | if (chan) | ||
33 | dma_chan_get(chan); | ||
34 | rcu_read_unlock(); | ||
35 | return chan; | ||
36 | } | ||
37 | |||
38 | int dma_skb_copy_datagram_iovec(struct dma_chan* chan, | 27 | int dma_skb_copy_datagram_iovec(struct dma_chan* chan, |
39 | struct sk_buff *skb, int offset, struct iovec *to, | 28 | struct sk_buff *skb, int offset, struct iovec *to, |
40 | size_t len, struct dma_pinned_list *pinned_list); | 29 | size_t len, struct dma_pinned_list *pinned_list); |
diff --git a/include/net/netlabel.h b/include/net/netlabel.h index 17c442a4514e..749011eedc0b 100644 --- a/include/net/netlabel.h +++ b/include/net/netlabel.h | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <linux/types.h> | 33 | #include <linux/types.h> |
34 | #include <linux/net.h> | 34 | #include <linux/net.h> |
35 | #include <linux/skbuff.h> | 35 | #include <linux/skbuff.h> |
36 | #include <linux/in.h> | ||
37 | #include <linux/in6.h> | ||
36 | #include <net/netlink.h> | 38 | #include <net/netlink.h> |
37 | #include <asm/atomic.h> | 39 | #include <asm/atomic.h> |
38 | 40 | ||
@@ -353,13 +355,37 @@ static inline void netlbl_secattr_free(struct netlbl_lsm_secattr *secattr) | |||
353 | /* | 355 | /* |
354 | * LSM configuration operations | 356 | * LSM configuration operations |
355 | */ | 357 | */ |
356 | int netlbl_cfg_map_del(const char *domain, struct netlbl_audit *audit_info); | 358 | int netlbl_cfg_map_del(const char *domain, |
357 | int netlbl_cfg_unlbl_add_map(const char *domain, | 359 | u16 family, |
360 | const void *addr, | ||
361 | const void *mask, | ||
362 | struct netlbl_audit *audit_info); | ||
363 | int netlbl_cfg_unlbl_map_add(const char *domain, | ||
364 | u16 family, | ||
365 | const void *addr, | ||
366 | const void *mask, | ||
358 | struct netlbl_audit *audit_info); | 367 | struct netlbl_audit *audit_info); |
359 | int netlbl_cfg_cipsov4_add_map(struct cipso_v4_doi *doi_def, | 368 | int netlbl_cfg_unlbl_static_add(struct net *net, |
369 | const char *dev_name, | ||
370 | const void *addr, | ||
371 | const void *mask, | ||
372 | u16 family, | ||
373 | u32 secid, | ||
374 | struct netlbl_audit *audit_info); | ||
375 | int netlbl_cfg_unlbl_static_del(struct net *net, | ||
376 | const char *dev_name, | ||
377 | const void *addr, | ||
378 | const void *mask, | ||
379 | u16 family, | ||
380 | struct netlbl_audit *audit_info); | ||
381 | int netlbl_cfg_cipsov4_add(struct cipso_v4_doi *doi_def, | ||
382 | struct netlbl_audit *audit_info); | ||
383 | void netlbl_cfg_cipsov4_del(u32 doi, struct netlbl_audit *audit_info); | ||
384 | int netlbl_cfg_cipsov4_map_add(u32 doi, | ||
360 | const char *domain, | 385 | const char *domain, |
386 | const struct in_addr *addr, | ||
387 | const struct in_addr *mask, | ||
361 | struct netlbl_audit *audit_info); | 388 | struct netlbl_audit *audit_info); |
362 | |||
363 | /* | 389 | /* |
364 | * LSM security attribute operations | 390 | * LSM security attribute operations |
365 | */ | 391 | */ |
@@ -401,19 +427,62 @@ void netlbl_skbuff_err(struct sk_buff *skb, int error, int gateway); | |||
401 | void netlbl_cache_invalidate(void); | 427 | void netlbl_cache_invalidate(void); |
402 | int netlbl_cache_add(const struct sk_buff *skb, | 428 | int netlbl_cache_add(const struct sk_buff *skb, |
403 | const struct netlbl_lsm_secattr *secattr); | 429 | const struct netlbl_lsm_secattr *secattr); |
430 | |||
431 | /* | ||
432 | * Protocol engine operations | ||
433 | */ | ||
434 | struct audit_buffer *netlbl_audit_start(int type, | ||
435 | struct netlbl_audit *audit_info); | ||
404 | #else | 436 | #else |
405 | static inline int netlbl_cfg_map_del(const char *domain, | 437 | static inline int netlbl_cfg_map_del(const char *domain, |
438 | u16 family, | ||
439 | const void *addr, | ||
440 | const void *mask, | ||
406 | struct netlbl_audit *audit_info) | 441 | struct netlbl_audit *audit_info) |
407 | { | 442 | { |
408 | return -ENOSYS; | 443 | return -ENOSYS; |
409 | } | 444 | } |
410 | static inline int netlbl_cfg_unlbl_add_map(const char *domain, | 445 | static inline int netlbl_cfg_unlbl_map_add(const char *domain, |
446 | u16 family, | ||
447 | void *addr, | ||
448 | void *mask, | ||
411 | struct netlbl_audit *audit_info) | 449 | struct netlbl_audit *audit_info) |
412 | { | 450 | { |
413 | return -ENOSYS; | 451 | return -ENOSYS; |
414 | } | 452 | } |
415 | static inline int netlbl_cfg_cipsov4_add_map(struct cipso_v4_doi *doi_def, | 453 | static inline int netlbl_cfg_unlbl_static_add(struct net *net, |
454 | const char *dev_name, | ||
455 | const void *addr, | ||
456 | const void *mask, | ||
457 | u16 family, | ||
458 | u32 secid, | ||
459 | struct netlbl_audit *audit_info) | ||
460 | { | ||
461 | return -ENOSYS; | ||
462 | } | ||
463 | static inline int netlbl_cfg_unlbl_static_del(struct net *net, | ||
464 | const char *dev_name, | ||
465 | const void *addr, | ||
466 | const void *mask, | ||
467 | u16 family, | ||
468 | struct netlbl_audit *audit_info) | ||
469 | { | ||
470 | return -ENOSYS; | ||
471 | } | ||
472 | static inline int netlbl_cfg_cipsov4_add(struct cipso_v4_doi *doi_def, | ||
473 | struct netlbl_audit *audit_info) | ||
474 | { | ||
475 | return -ENOSYS; | ||
476 | } | ||
477 | static inline void netlbl_cfg_cipsov4_del(u32 doi, | ||
478 | struct netlbl_audit *audit_info) | ||
479 | { | ||
480 | return; | ||
481 | } | ||
482 | static inline int netlbl_cfg_cipsov4_map_add(u32 doi, | ||
416 | const char *domain, | 483 | const char *domain, |
484 | const struct in_addr *addr, | ||
485 | const struct in_addr *mask, | ||
417 | struct netlbl_audit *audit_info) | 486 | struct netlbl_audit *audit_info) |
418 | { | 487 | { |
419 | return -ENOSYS; | 488 | return -ENOSYS; |
@@ -495,6 +564,11 @@ static inline int netlbl_cache_add(const struct sk_buff *skb, | |||
495 | { | 564 | { |
496 | return 0; | 565 | return 0; |
497 | } | 566 | } |
567 | static inline struct audit_buffer *netlbl_audit_start(int type, | ||
568 | struct netlbl_audit *audit_info) | ||
569 | { | ||
570 | return NULL; | ||
571 | } | ||
498 | #endif /* CONFIG_NETLABEL */ | 572 | #endif /* CONFIG_NETLABEL */ |
499 | 573 | ||
500 | #endif /* _NETLABEL_H */ | 574 | #endif /* _NETLABEL_H */ |
diff --git a/include/net/protocol.h b/include/net/protocol.h index cb2965aa1b62..ffa5b8b1f1df 100644 --- a/include/net/protocol.h +++ b/include/net/protocol.h | |||
@@ -59,6 +59,9 @@ struct inet6_protocol | |||
59 | int (*gso_send_check)(struct sk_buff *skb); | 59 | int (*gso_send_check)(struct sk_buff *skb); |
60 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | 60 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
61 | int features); | 61 | int features); |
62 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | ||
63 | struct sk_buff *skb); | ||
64 | int (*gro_complete)(struct sk_buff *skb); | ||
62 | 65 | ||
63 | unsigned int flags; /* INET6_PROTO_xxx */ | 66 | unsigned int flags; /* INET6_PROTO_xxx */ |
64 | }; | 67 | }; |
diff --git a/include/net/wimax.h b/include/net/wimax.h new file mode 100644 index 000000000000..073809ce94f8 --- /dev/null +++ b/include/net/wimax.h | |||
@@ -0,0 +1,523 @@ | |||
1 | /* | ||
2 | * Linux WiMAX | ||
3 | * Kernel space API for accessing WiMAX devices | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2007-2008 Intel Corporation <linux-wimax@intel.com> | ||
7 | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License version | ||
11 | * 2 as published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
21 | * 02110-1301, USA. | ||
22 | * | ||
23 | * | ||
24 | * The WiMAX stack provides an API for controlling and managing the | ||
25 | * system's WiMAX devices. This API affects the control plane; the | ||
26 | * data plane is accessed via the network stack (netdev). | ||
27 | * | ||
28 | * Parts of the WiMAX stack API and notifications are exported to | ||
29 | * user space via Generic Netlink. In user space, libwimax (part of | ||
30 | * the wimax-tools package) provides a shim layer for accessing those | ||
31 | * calls. | ||
32 | * | ||
33 | * The API is standarized for all WiMAX devices and different drivers | ||
34 | * implement the backend support for it. However, device-specific | ||
35 | * messaging pipes are provided that can be used to issue commands and | ||
36 | * receive notifications in free form. | ||
37 | * | ||
38 | * Currently the messaging pipes are the only means of control as it | ||
39 | * is not known (due to the lack of more devices in the market) what | ||
40 | * will be a good abstraction layer. Expect this to change as more | ||
41 | * devices show in the market. This API is designed to be growable in | ||
42 | * order to address this problem. | ||
43 | * | ||
44 | * USAGE | ||
45 | * | ||
46 | * Embed a `struct wimax_dev` at the beginning of the the device's | ||
47 | * private structure, initialize and register it. For details, see | ||
48 | * `struct wimax_dev`s documentation. | ||
49 | * | ||
50 | * Once this is done, wimax-tools's libwimaxll can be used to | ||
51 | * communicate with the driver from user space. You user space | ||
52 | * application does not have to forcibily use libwimaxll and can talk | ||
53 | * the generic netlink protocol directly if desired. | ||
54 | * | ||
55 | * Remember this is a very low level API that will to provide all of | ||
56 | * WiMAX features. Other daemons and services running in user space | ||
57 | * are the expected clients of it. They offer a higher level API that | ||
58 | * applications should use (an example of this is the Intel's WiMAX | ||
59 | * Network Service for the i2400m). | ||
60 | * | ||
61 | * DESIGN | ||
62 | * | ||
63 | * Although not set on final stone, this very basic interface is | ||
64 | * mostly completed. Remember this is meant to grow as new common | ||
65 | * operations are decided upon. New operations will be added to the | ||
66 | * interface, intent being on keeping backwards compatibility as much | ||
67 | * as possible. | ||
68 | * | ||
69 | * This layer implements a set of calls to control a WiMAX device, | ||
70 | * exposing a frontend to the rest of the kernel and user space (via | ||
71 | * generic netlink) and a backend implementation in the driver through | ||
72 | * function pointers. | ||
73 | * | ||
74 | * WiMAX devices have a state, and a kernel-only API allows the | ||
75 | * drivers to manipulate that state. State transitions are atomic, and | ||
76 | * only some of them are allowed (see `enum wimax_st`). | ||
77 | * | ||
78 | * Most API calls will set the state automatically; in most cases | ||
79 | * drivers have to only report state changes due to external | ||
80 | * conditions. | ||
81 | * | ||
82 | * All API operations are 'atomic', serialized thorough a mutex in the | ||
83 | * `struct wimax_dev`. | ||
84 | * | ||
85 | * EXPORTING TO USER SPACE THROUGH GENERIC NETLINK | ||
86 | * | ||
87 | * The API is exported to user space using generic netlink (other | ||
88 | * methods can be added as needed). | ||
89 | * | ||
90 | * There is a Generic Netlink Family named "WiMAX", where interfaces | ||
91 | * supporting the WiMAX interface receive commands and broadcast their | ||
92 | * signals over a multicast group named "msg". | ||
93 | * | ||
94 | * Mapping to the source/destination interface is done by an interface | ||
95 | * index attribute. | ||
96 | * | ||
97 | * For user-to-kernel traffic (commands) we use a function call | ||
98 | * marshalling mechanism, where a message X with attributes A, B, C | ||
99 | * sent from user space to kernel space means executing the WiMAX API | ||
100 | * call wimax_X(A, B, C), sending the results back as a message. | ||
101 | * | ||
102 | * Kernel-to-user (notifications or signals) communication is sent | ||
103 | * over multicast groups. This allows to have multiple applications | ||
104 | * monitoring them. | ||
105 | * | ||
106 | * Each command/signal gets assigned it's own attribute policy. This | ||
107 | * way the validator will verify that all the attributes in there are | ||
108 | * only the ones that should be for each command/signal. Thing of an | ||
109 | * attribute mapping to a type+argumentname for each command/signal. | ||
110 | * | ||
111 | * If we had a single policy for *all* commands/signals, after running | ||
112 | * the validator we'd have to check "does this attribute belong in | ||
113 | * here"? for each one. It can be done manually, but it's just easier | ||
114 | * to have the validator do that job with multiple policies. As well, | ||
115 | * it makes it easier to later expand each command/signal signature | ||
116 | * without affecting others and keeping the namespace more or less | ||
117 | * sane. Not that it is too complicated, but it makes it even easier. | ||
118 | * | ||
119 | * No state information is maintained in the kernel for each user | ||
120 | * space connection (the connection is stateless). | ||
121 | * | ||
122 | * TESTING FOR THE INTERFACE AND VERSIONING | ||
123 | * | ||
124 | * If network interface X is a WiMAX device, there will be a Generic | ||
125 | * Netlink family named "WiMAX X" and the device will present a | ||
126 | * "wimax" directory in it's network sysfs directory | ||
127 | * (/sys/class/net/DEVICE/wimax) [used by HAL]. | ||
128 | * | ||
129 | * The inexistence of any of these means the device does not support | ||
130 | * this WiMAX API. | ||
131 | * | ||
132 | * By querying the generic netlink controller, versioning information | ||
133 | * and the multicast groups available can be found. Applications using | ||
134 | * the interface can either rely on that or use the generic netlink | ||
135 | * controller to figure out which generic netlink commands/signals are | ||
136 | * supported. | ||
137 | * | ||
138 | * NOTE: this versioning is a last resort to avoid hard | ||
139 | * incompatibilities. It is the intention of the design of this | ||
140 | * stack not to introduce backward incompatible changes. | ||
141 | * | ||
142 | * The version code has to fit in one byte (restrictions imposed by | ||
143 | * generic netlink); we use `version / 10` for the major version and | ||
144 | * `version % 10` for the minor. This gives 9 minors for each major | ||
145 | * and 25 majors. | ||
146 | * | ||
147 | * The version change protocol is as follow: | ||
148 | * | ||
149 | * - Major versions: needs to be increased if an existing message/API | ||
150 | * call is changed or removed. Doesn't need to be changed if a new | ||
151 | * message is added. | ||
152 | * | ||
153 | * - Minor version: needs to be increased if new messages/API calls are | ||
154 | * being added or some other consideration that doesn't impact the | ||
155 | * user-kernel interface too much (like some kind of bug fix) and | ||
156 | * that is kind of left up in the air to common sense. | ||
157 | * | ||
158 | * User space code should not try to work if the major version it was | ||
159 | * compiled for differs from what the kernel offers. As well, if the | ||
160 | * minor version of the kernel interface is lower than the one user | ||
161 | * space is expecting (the one it was compiled for), the kernel | ||
162 | * might be missing API calls; user space shall be ready to handle | ||
163 | * said condition. Use the generic netlink controller operations to | ||
164 | * find which ones are supported and which not. | ||
165 | * | ||
166 | * libwimaxll:wimaxll_open() takes care of checking versions. | ||
167 | * | ||
168 | * THE OPERATIONS: | ||
169 | * | ||
170 | * Each operation is defined in its on file (drivers/net/wimax/op-*.c) | ||
171 | * for clarity. The parts needed for an operation are: | ||
172 | * | ||
173 | * - a function pointer in `struct wimax_dev`: optional, as the | ||
174 | * operation might be implemented by the stack and not by the | ||
175 | * driver. | ||
176 | * | ||
177 | * All function pointers are named wimax_dev->op_*(), and drivers | ||
178 | * must implement them except where noted otherwise. | ||
179 | * | ||
180 | * - When exported to user space, a `struct nla_policy` to define the | ||
181 | * attributes of the generic netlink command and a `struct genl_ops` | ||
182 | * to define the operation. | ||
183 | * | ||
184 | * All the declarations for the operation codes (WIMAX_GNL_OP_<NAME>) | ||
185 | * and generic netlink attributes (WIMAX_GNL_<NAME>_*) are declared in | ||
186 | * include/linux/wimax.h; this file is intended to be cloned by user | ||
187 | * space to gain access to those declarations. | ||
188 | * | ||
189 | * A few caveats to remember: | ||
190 | * | ||
191 | * - Need to define attribute numbers starting in 1; otherwise it | ||
192 | * fails. | ||
193 | * | ||
194 | * - the `struct genl_family` requires a maximum attribute id; when | ||
195 | * defining the `struct nla_policy` for each message, it has to have | ||
196 | * an array size of WIMAX_GNL_ATTR_MAX+1. | ||
197 | * | ||
198 | * THE PIPE INTERFACE: | ||
199 | * | ||
200 | * This interface is kept intentionally simple. The driver can send | ||
201 | * and receive free-form messages to/from user space through a | ||
202 | * pipe. See drivers/net/wimax/op-msg.c for details. | ||
203 | * | ||
204 | * The kernel-to-user messages are sent with | ||
205 | * wimax_msg(). user-to-kernel messages are delivered via | ||
206 | * wimax_dev->op_msg_from_user(). | ||
207 | * | ||
208 | * RFKILL: | ||
209 | * | ||
210 | * RFKILL support is built into the wimax_dev layer; the driver just | ||
211 | * needs to call wimax_report_rfkill_{hw,sw}() to inform of changes in | ||
212 | * the hardware or software RF kill switches. When the stack wants to | ||
213 | * turn the radio off, it will call wimax_dev->op_rfkill_sw_toggle(), | ||
214 | * which the driver implements. | ||
215 | * | ||
216 | * User space can set the software RF Kill switch by calling | ||
217 | * wimax_rfkill(). | ||
218 | * | ||
219 | * The code for now only supports devices that don't require polling; | ||
220 | * If the device needs to be polled, create a self-rearming delayed | ||
221 | * work struct for polling or look into adding polled support to the | ||
222 | * WiMAX stack. | ||
223 | * | ||
224 | * When initializing the hardware (_probe), after calling | ||
225 | * wimax_dev_add(), query the device for it's RF Kill switches status | ||
226 | * and feed it back to the WiMAX stack using | ||
227 | * wimax_report_rfkill_{hw,sw}(). If any switch is missing, always | ||
228 | * report it as ON. | ||
229 | * | ||
230 | * NOTE: the wimax stack uses an inverted terminology to that of the | ||
231 | * RFKILL subsystem: | ||
232 | * | ||
233 | * - ON: radio is ON, RFKILL is DISABLED or OFF. | ||
234 | * - OFF: radio is OFF, RFKILL is ENABLED or ON. | ||
235 | * | ||
236 | * MISCELLANEOUS OPS: | ||
237 | * | ||
238 | * wimax_reset() can be used to reset the device to power on state; by | ||
239 | * default it issues a warm reset that maintains the same device | ||
240 | * node. If that is not possible, it falls back to a cold reset | ||
241 | * (device reconnect). The driver implements the backend to this | ||
242 | * through wimax_dev->op_reset(). | ||
243 | */ | ||
244 | |||
245 | #ifndef __NET__WIMAX_H__ | ||
246 | #define __NET__WIMAX_H__ | ||
247 | #ifdef __KERNEL__ | ||
248 | |||
249 | #include <linux/wimax.h> | ||
250 | #include <net/genetlink.h> | ||
251 | #include <linux/netdevice.h> | ||
252 | |||
253 | struct net_device; | ||
254 | struct genl_info; | ||
255 | struct wimax_dev; | ||
256 | struct input_dev; | ||
257 | |||
258 | /** | ||
259 | * struct wimax_dev - Generic WiMAX device | ||
260 | * | ||
261 | * @net_dev: [fill] Pointer to the &struct net_device this WiMAX | ||
262 | * device implements. | ||
263 | * | ||
264 | * @op_msg_from_user: [fill] Driver-specific operation to | ||
265 | * handle a raw message from user space to the driver. The | ||
266 | * driver can send messages to user space using with | ||
267 | * wimax_msg_to_user(). | ||
268 | * | ||
269 | * @op_rfkill_sw_toggle: [fill] Driver-specific operation to act on | ||
270 | * userspace (or any other agent) requesting the WiMAX device to | ||
271 | * change the RF Kill software switch (WIMAX_RF_ON or | ||
272 | * WIMAX_RF_OFF). | ||
273 | * If such hardware support is not present, it is assumed the | ||
274 | * radio cannot be switched off and it is always on (and the stack | ||
275 | * will error out when trying to switch it off). In such case, | ||
276 | * this function pointer can be left as NULL. | ||
277 | * | ||
278 | * @op_reset: [fill] Driver specific operation to reset the | ||
279 | * device. | ||
280 | * This operation should always attempt first a warm reset that | ||
281 | * does not disconnect the device from the bus and return 0. | ||
282 | * If that fails, it should resort to some sort of cold or bus | ||
283 | * reset (even if it implies a bus disconnection and device | ||
284 | * dissapearance). In that case, -ENODEV should be returned to | ||
285 | * indicate the device is gone. | ||
286 | * This operation has to be synchronous, and return only when the | ||
287 | * reset is complete. In case of having had to resort to bus/cold | ||
288 | * reset implying a device disconnection, the call is allowed to | ||
289 | * return inmediately. | ||
290 | * NOTE: wimax_dev->mutex is NOT locked when this op is being | ||
291 | * called; however, wimax_dev->mutex_reset IS locked to ensure | ||
292 | * serialization of calls to wimax_reset(). | ||
293 | * See wimax_reset()'s documentation. | ||
294 | * | ||
295 | * @name: [fill] A way to identify this device. We need to register a | ||
296 | * name with many subsystems (input for RFKILL, workqueue | ||
297 | * creation, etc). We can't use the network device name as that | ||
298 | * might change and in some instances we don't know it yet (until | ||
299 | * we don't call register_netdev()). So we generate an unique one | ||
300 | * using the driver name and device bus id, place it here and use | ||
301 | * it across the board. Recommended naming: | ||
302 | * DRIVERNAME-BUSNAME:BUSID (dev->bus->name, dev->bus_id). | ||
303 | * | ||
304 | * @id_table_node: [private] link to the list of wimax devices kept by | ||
305 | * id-table.c. Protected by it's own spinlock. | ||
306 | * | ||
307 | * @mutex: [private] Serializes all concurrent access and execution of | ||
308 | * operations. | ||
309 | * | ||
310 | * @mutex_reset: [private] Serializes reset operations. Needs to be a | ||
311 | * different mutex because as part of the reset operation, the | ||
312 | * driver has to call back into the stack to do things such as | ||
313 | * state change, that require wimax_dev->mutex. | ||
314 | * | ||
315 | * @state: [private] Current state of the WiMAX device. | ||
316 | * | ||
317 | * @rfkill: [private] integration into the RF-Kill infrastructure. | ||
318 | * | ||
319 | * @rfkill_input: [private] virtual input device to process the | ||
320 | * hardware RF Kill switches. | ||
321 | * | ||
322 | * @rf_sw: [private] State of the software radio switch (OFF/ON) | ||
323 | * | ||
324 | * @rf_hw: [private] State of the hardware radio switch (OFF/ON) | ||
325 | * | ||
326 | * @debufs_dentry: [private] Used to hook up a debugfs entry. This | ||
327 | * shows up in the debugfs root as wimax:DEVICENAME. | ||
328 | * | ||
329 | * Description: | ||
330 | * This structure defines a common interface to access all WiMAX | ||
331 | * devices from different vendors and provides a common API as well as | ||
332 | * a free-form device-specific messaging channel. | ||
333 | * | ||
334 | * Usage: | ||
335 | * 1. Embed a &struct wimax_dev at *the beginning* the network | ||
336 | * device structure so that netdev_priv() points to it. | ||
337 | * | ||
338 | * 2. memset() it to zero | ||
339 | * | ||
340 | * 3. Initialize with wimax_dev_init(). This will leave the WiMAX | ||
341 | * device in the %__WIMAX_ST_NULL state. | ||
342 | * | ||
343 | * 4. Fill all the fields marked with [fill]; once called | ||
344 | * wimax_dev_add(), those fields CANNOT be modified. | ||
345 | * | ||
346 | * 5. Call wimax_dev_add() *after* registering the network | ||
347 | * device. This will leave the WiMAX device in the %WIMAX_ST_DOWN | ||
348 | * state. | ||
349 | * Protect the driver's net_device->open() against succeeding if | ||
350 | * the wimax device state is lower than %WIMAX_ST_DOWN. | ||
351 | * | ||
352 | * 6. Select when the device is going to be turned on/initialized; | ||
353 | * for example, it could be initialized on 'ifconfig up' (when the | ||
354 | * netdev op 'open()' is called on the driver). | ||
355 | * | ||
356 | * When the device is initialized (at `ifconfig up` time, or right | ||
357 | * after calling wimax_dev_add() from _probe(), make sure the | ||
358 | * following steps are taken | ||
359 | * | ||
360 | * a. Move the device to %WIMAX_ST_UNINITIALIZED. This is needed so | ||
361 | * some API calls that shouldn't work until the device is ready | ||
362 | * can be blocked. | ||
363 | * | ||
364 | * b. Initialize the device. Make sure to turn the SW radio switch | ||
365 | * off and move the device to state %WIMAX_ST_RADIO_OFF when | ||
366 | * done. When just initialized, a device should be left in RADIO | ||
367 | * OFF state until user space devices to turn it on. | ||
368 | * | ||
369 | * c. Query the device for the state of the hardware rfkill switch | ||
370 | * and call wimax_rfkill_report_hw() and wimax_rfkill_report_sw() | ||
371 | * as needed. See below. | ||
372 | * | ||
373 | * wimax_dev_rm() undoes before unregistering the network device. Once | ||
374 | * wimax_dev_add() is called, the driver can get called on the | ||
375 | * wimax_dev->op_* function pointers | ||
376 | * | ||
377 | * CONCURRENCY: | ||
378 | * | ||
379 | * The stack provides a mutex for each device that will disallow API | ||
380 | * calls happening concurrently; thus, op calls into the driver | ||
381 | * through the wimax_dev->op*() function pointers will always be | ||
382 | * serialized and *never* concurrent. | ||
383 | * | ||
384 | * For locking, take wimax_dev->mutex is taken; (most) operations in | ||
385 | * the API have to check for wimax_dev_is_ready() to return 0 before | ||
386 | * continuing (this is done internally). | ||
387 | * | ||
388 | * REFERENCE COUNTING: | ||
389 | * | ||
390 | * The WiMAX device is reference counted by the associated network | ||
391 | * device. The only operation that can be used to reference the device | ||
392 | * is wimax_dev_get_by_genl_info(), and the reference it acquires has | ||
393 | * to be released with dev_put(wimax_dev->net_dev). | ||
394 | * | ||
395 | * RFKILL: | ||
396 | * | ||
397 | * At startup, both HW and SW radio switchess are assumed to be off. | ||
398 | * | ||
399 | * At initialization time [after calling wimax_dev_add()], have the | ||
400 | * driver query the device for the status of the software and hardware | ||
401 | * RF kill switches and call wimax_report_rfkill_hw() and | ||
402 | * wimax_rfkill_report_sw() to indicate their state. If any is | ||
403 | * missing, just call it to indicate it is ON (radio always on). | ||
404 | * | ||
405 | * Whenever the driver detects a change in the state of the RF kill | ||
406 | * switches, it should call wimax_report_rfkill_hw() or | ||
407 | * wimax_report_rfkill_sw() to report it to the stack. | ||
408 | */ | ||
409 | struct wimax_dev { | ||
410 | struct net_device *net_dev; | ||
411 | struct list_head id_table_node; | ||
412 | struct mutex mutex; /* Protects all members and API calls */ | ||
413 | struct mutex mutex_reset; | ||
414 | enum wimax_st state; | ||
415 | |||
416 | int (*op_msg_from_user)(struct wimax_dev *wimax_dev, | ||
417 | const char *, | ||
418 | const void *, size_t, | ||
419 | const struct genl_info *info); | ||
420 | int (*op_rfkill_sw_toggle)(struct wimax_dev *wimax_dev, | ||
421 | enum wimax_rf_state); | ||
422 | int (*op_reset)(struct wimax_dev *wimax_dev); | ||
423 | |||
424 | struct rfkill *rfkill; | ||
425 | struct input_dev *rfkill_input; | ||
426 | unsigned rf_hw; | ||
427 | unsigned rf_sw; | ||
428 | char name[32]; | ||
429 | |||
430 | struct dentry *debugfs_dentry; | ||
431 | }; | ||
432 | |||
433 | |||
434 | |||
435 | /* | ||
436 | * WiMAX stack public API for device drivers | ||
437 | * ----------------------------------------- | ||
438 | * | ||
439 | * These functions are not exported to user space. | ||
440 | */ | ||
441 | extern void wimax_dev_init(struct wimax_dev *); | ||
442 | extern int wimax_dev_add(struct wimax_dev *, struct net_device *); | ||
443 | extern void wimax_dev_rm(struct wimax_dev *); | ||
444 | |||
445 | static inline | ||
446 | struct wimax_dev *net_dev_to_wimax(struct net_device *net_dev) | ||
447 | { | ||
448 | return netdev_priv(net_dev); | ||
449 | } | ||
450 | |||
451 | static inline | ||
452 | struct device *wimax_dev_to_dev(struct wimax_dev *wimax_dev) | ||
453 | { | ||
454 | return wimax_dev->net_dev->dev.parent; | ||
455 | } | ||
456 | |||
457 | extern void wimax_state_change(struct wimax_dev *, enum wimax_st); | ||
458 | extern enum wimax_st wimax_state_get(struct wimax_dev *); | ||
459 | |||
460 | /* | ||
461 | * Radio Switch state reporting. | ||
462 | * | ||
463 | * enum wimax_rf_state is declared in linux/wimax.h so the exports | ||
464 | * to user space can use it. | ||
465 | */ | ||
466 | extern void wimax_report_rfkill_hw(struct wimax_dev *, enum wimax_rf_state); | ||
467 | extern void wimax_report_rfkill_sw(struct wimax_dev *, enum wimax_rf_state); | ||
468 | |||
469 | |||
470 | /* | ||
471 | * Free-form messaging to/from user space | ||
472 | * | ||
473 | * Sending a message: | ||
474 | * | ||
475 | * wimax_msg(wimax_dev, pipe_name, buf, buf_size, GFP_KERNEL); | ||
476 | * | ||
477 | * Broken up: | ||
478 | * | ||
479 | * skb = wimax_msg_alloc(wimax_dev, pipe_name, buf_size, GFP_KERNEL); | ||
480 | * ...fill up skb... | ||
481 | * wimax_msg_send(wimax_dev, pipe_name, skb); | ||
482 | * | ||
483 | * Be sure not to modify skb->data in the middle (ie: don't use | ||
484 | * skb_push()/skb_pull()/skb_reserve() on the skb). | ||
485 | * | ||
486 | * "pipe_name" is any string, than can be interpreted as the name of | ||
487 | * the pipe or destinatary; the interpretation of it is driver | ||
488 | * specific, so the recipient can multiplex it as wished. It can be | ||
489 | * NULL, it won't be used - an example is using a "diagnostics" tag to | ||
490 | * send diagnostics information that a device-specific diagnostics | ||
491 | * tool would be interested in. | ||
492 | */ | ||
493 | extern struct sk_buff *wimax_msg_alloc(struct wimax_dev *, const char *, | ||
494 | const void *, size_t, gfp_t); | ||
495 | extern int wimax_msg_send(struct wimax_dev *, struct sk_buff *); | ||
496 | extern int wimax_msg(struct wimax_dev *, const char *, | ||
497 | const void *, size_t, gfp_t); | ||
498 | |||
499 | extern const void *wimax_msg_data_len(struct sk_buff *, size_t *); | ||
500 | extern const void *wimax_msg_data(struct sk_buff *); | ||
501 | extern ssize_t wimax_msg_len(struct sk_buff *); | ||
502 | |||
503 | |||
504 | /* | ||
505 | * WiMAX stack user space API | ||
506 | * -------------------------- | ||
507 | * | ||
508 | * This API is what gets exported to user space for general | ||
509 | * operations. As well, they can be called from within the kernel, | ||
510 | * (with a properly referenced `struct wimax_dev`). | ||
511 | * | ||
512 | * Properly referenced means: the 'struct net_device' that embeds the | ||
513 | * device's control structure and (as such) the 'struct wimax_dev' is | ||
514 | * referenced by the caller. | ||
515 | */ | ||
516 | extern int wimax_rfkill(struct wimax_dev *, enum wimax_rf_state); | ||
517 | extern int wimax_reset(struct wimax_dev *); | ||
518 | |||
519 | #else | ||
520 | /* You might be looking for linux/wimax.h */ | ||
521 | #error This file should not be included from user space. | ||
522 | #endif /* #ifdef __KERNEL__ */ | ||
523 | #endif /* #ifndef __NET__WIMAX_H__ */ | ||
diff --git a/include/scsi/fc/fc_els.h b/include/scsi/fc/fc_els.h new file mode 100644 index 000000000000..195ca014d3ce --- /dev/null +++ b/include/scsi/fc/fc_els.h | |||
@@ -0,0 +1,816 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_ELS_H_ | ||
21 | #define _FC_ELS_H_ | ||
22 | |||
23 | /* | ||
24 | * Fibre Channel Switch - Enhanced Link Services definitions. | ||
25 | * From T11 FC-LS Rev 1.2 June 7, 2005. | ||
26 | */ | ||
27 | |||
28 | /* | ||
29 | * ELS Command codes - byte 0 of the frame payload | ||
30 | */ | ||
31 | enum fc_els_cmd { | ||
32 | ELS_LS_RJT = 0x01, /* ESL reject */ | ||
33 | ELS_LS_ACC = 0x02, /* ESL Accept */ | ||
34 | ELS_PLOGI = 0x03, /* N_Port login */ | ||
35 | ELS_FLOGI = 0x04, /* F_Port login */ | ||
36 | ELS_LOGO = 0x05, /* Logout */ | ||
37 | ELS_ABTX = 0x06, /* Abort exchange - obsolete */ | ||
38 | ELS_RCS = 0x07, /* read connection status */ | ||
39 | ELS_RES = 0x08, /* read exchange status block */ | ||
40 | ELS_RSS = 0x09, /* read sequence status block */ | ||
41 | ELS_RSI = 0x0a, /* read sequence initiative */ | ||
42 | ELS_ESTS = 0x0b, /* establish streaming */ | ||
43 | ELS_ESTC = 0x0c, /* estimate credit */ | ||
44 | ELS_ADVC = 0x0d, /* advise credit */ | ||
45 | ELS_RTV = 0x0e, /* read timeout value */ | ||
46 | ELS_RLS = 0x0f, /* read link error status block */ | ||
47 | ELS_ECHO = 0x10, /* echo */ | ||
48 | ELS_TEST = 0x11, /* test */ | ||
49 | ELS_RRQ = 0x12, /* reinstate recovery qualifier */ | ||
50 | ELS_REC = 0x13, /* read exchange concise */ | ||
51 | ELS_SRR = 0x14, /* sequence retransmission request */ | ||
52 | ELS_PRLI = 0x20, /* process login */ | ||
53 | ELS_PRLO = 0x21, /* process logout */ | ||
54 | ELS_SCN = 0x22, /* state change notification */ | ||
55 | ELS_TPLS = 0x23, /* test process login state */ | ||
56 | ELS_TPRLO = 0x24, /* third party process logout */ | ||
57 | ELS_LCLM = 0x25, /* login control list mgmt (obs) */ | ||
58 | ELS_GAID = 0x30, /* get alias_ID */ | ||
59 | ELS_FACT = 0x31, /* fabric activate alias_id */ | ||
60 | ELS_FDACDT = 0x32, /* fabric deactivate alias_id */ | ||
61 | ELS_NACT = 0x33, /* N-port activate alias_id */ | ||
62 | ELS_NDACT = 0x34, /* N-port deactivate alias_id */ | ||
63 | ELS_QOSR = 0x40, /* quality of service request */ | ||
64 | ELS_RVCS = 0x41, /* read virtual circuit status */ | ||
65 | ELS_PDISC = 0x50, /* discover N_port service params */ | ||
66 | ELS_FDISC = 0x51, /* discover F_port service params */ | ||
67 | ELS_ADISC = 0x52, /* discover address */ | ||
68 | ELS_RNC = 0x53, /* report node cap (obs) */ | ||
69 | ELS_FARP_REQ = 0x54, /* FC ARP request */ | ||
70 | ELS_FARP_REPL = 0x55, /* FC ARP reply */ | ||
71 | ELS_RPS = 0x56, /* read port status block */ | ||
72 | ELS_RPL = 0x57, /* read port list */ | ||
73 | ELS_RPBC = 0x58, /* read port buffer condition */ | ||
74 | ELS_FAN = 0x60, /* fabric address notification */ | ||
75 | ELS_RSCN = 0x61, /* registered state change notification */ | ||
76 | ELS_SCR = 0x62, /* state change registration */ | ||
77 | ELS_RNFT = 0x63, /* report node FC-4 types */ | ||
78 | ELS_CSR = 0x68, /* clock synch. request */ | ||
79 | ELS_CSU = 0x69, /* clock synch. update */ | ||
80 | ELS_LINIT = 0x70, /* loop initialize */ | ||
81 | ELS_LSTS = 0x72, /* loop status */ | ||
82 | ELS_RNID = 0x78, /* request node ID data */ | ||
83 | ELS_RLIR = 0x79, /* registered link incident report */ | ||
84 | ELS_LIRR = 0x7a, /* link incident record registration */ | ||
85 | ELS_SRL = 0x7b, /* scan remote loop */ | ||
86 | ELS_SBRP = 0x7c, /* set bit-error reporting params */ | ||
87 | ELS_RPSC = 0x7d, /* report speed capabilities */ | ||
88 | ELS_QSA = 0x7e, /* query security attributes */ | ||
89 | ELS_EVFP = 0x7f, /* exchange virt. fabrics params */ | ||
90 | ELS_LKA = 0x80, /* link keep-alive */ | ||
91 | ELS_AUTH_ELS = 0x90, /* authentication ELS */ | ||
92 | }; | ||
93 | |||
94 | /* | ||
95 | * Initializer useful for decoding table. | ||
96 | * Please keep this in sync with the above definitions. | ||
97 | */ | ||
98 | #define FC_ELS_CMDS_INIT { \ | ||
99 | [ELS_LS_RJT] = "LS_RJT", \ | ||
100 | [ELS_LS_ACC] = "LS_ACC", \ | ||
101 | [ELS_PLOGI] = "PLOGI", \ | ||
102 | [ELS_FLOGI] = "FLOGI", \ | ||
103 | [ELS_LOGO] = "LOGO", \ | ||
104 | [ELS_ABTX] = "ABTX", \ | ||
105 | [ELS_RCS] = "RCS", \ | ||
106 | [ELS_RES] = "RES", \ | ||
107 | [ELS_RSS] = "RSS", \ | ||
108 | [ELS_RSI] = "RSI", \ | ||
109 | [ELS_ESTS] = "ESTS", \ | ||
110 | [ELS_ESTC] = "ESTC", \ | ||
111 | [ELS_ADVC] = "ADVC", \ | ||
112 | [ELS_RTV] = "RTV", \ | ||
113 | [ELS_RLS] = "RLS", \ | ||
114 | [ELS_ECHO] = "ECHO", \ | ||
115 | [ELS_TEST] = "TEST", \ | ||
116 | [ELS_RRQ] = "RRQ", \ | ||
117 | [ELS_REC] = "REC", \ | ||
118 | [ELS_SRR] = "SRR", \ | ||
119 | [ELS_PRLI] = "PRLI", \ | ||
120 | [ELS_PRLO] = "PRLO", \ | ||
121 | [ELS_SCN] = "SCN", \ | ||
122 | [ELS_TPLS] = "TPLS", \ | ||
123 | [ELS_TPRLO] = "TPRLO", \ | ||
124 | [ELS_LCLM] = "LCLM", \ | ||
125 | [ELS_GAID] = "GAID", \ | ||
126 | [ELS_FACT] = "FACT", \ | ||
127 | [ELS_FDACDT] = "FDACDT", \ | ||
128 | [ELS_NACT] = "NACT", \ | ||
129 | [ELS_NDACT] = "NDACT", \ | ||
130 | [ELS_QOSR] = "QOSR", \ | ||
131 | [ELS_RVCS] = "RVCS", \ | ||
132 | [ELS_PDISC] = "PDISC", \ | ||
133 | [ELS_FDISC] = "FDISC", \ | ||
134 | [ELS_ADISC] = "ADISC", \ | ||
135 | [ELS_RNC] = "RNC", \ | ||
136 | [ELS_FARP_REQ] = "FARP_REQ", \ | ||
137 | [ELS_FARP_REPL] = "FARP_REPL", \ | ||
138 | [ELS_RPS] = "RPS", \ | ||
139 | [ELS_RPL] = "RPL", \ | ||
140 | [ELS_RPBC] = "RPBC", \ | ||
141 | [ELS_FAN] = "FAN", \ | ||
142 | [ELS_RSCN] = "RSCN", \ | ||
143 | [ELS_SCR] = "SCR", \ | ||
144 | [ELS_RNFT] = "RNFT", \ | ||
145 | [ELS_CSR] = "CSR", \ | ||
146 | [ELS_CSU] = "CSU", \ | ||
147 | [ELS_LINIT] = "LINIT", \ | ||
148 | [ELS_LSTS] = "LSTS", \ | ||
149 | [ELS_RNID] = "RNID", \ | ||
150 | [ELS_RLIR] = "RLIR", \ | ||
151 | [ELS_LIRR] = "LIRR", \ | ||
152 | [ELS_SRL] = "SRL", \ | ||
153 | [ELS_SBRP] = "SBRP", \ | ||
154 | [ELS_RPSC] = "RPSC", \ | ||
155 | [ELS_QSA] = "QSA", \ | ||
156 | [ELS_EVFP] = "EVFP", \ | ||
157 | [ELS_LKA] = "LKA", \ | ||
158 | [ELS_AUTH_ELS] = "AUTH_ELS", \ | ||
159 | } | ||
160 | |||
161 | /* | ||
162 | * LS_ACC payload. | ||
163 | */ | ||
164 | struct fc_els_ls_acc { | ||
165 | __u8 la_cmd; /* command code ELS_LS_ACC */ | ||
166 | __u8 la_resv[3]; /* reserved */ | ||
167 | }; | ||
168 | |||
169 | /* | ||
170 | * ELS reject payload. | ||
171 | */ | ||
172 | struct fc_els_ls_rjt { | ||
173 | __u8 er_cmd; /* command code ELS_LS_RJT */ | ||
174 | __u8 er_resv[4]; /* reserved must be zero */ | ||
175 | __u8 er_reason; /* reason (enum fc_els_rjt_reason below) */ | ||
176 | __u8 er_explan; /* explanation (enum fc_els_rjt_explan below) */ | ||
177 | __u8 er_vendor; /* vendor specific code */ | ||
178 | }; | ||
179 | |||
180 | /* | ||
181 | * ELS reject reason codes (er_reason). | ||
182 | */ | ||
183 | enum fc_els_rjt_reason { | ||
184 | ELS_RJT_NONE = 0, /* no reject - not to be sent */ | ||
185 | ELS_RJT_INVAL = 0x01, /* invalid ELS command code */ | ||
186 | ELS_RJT_LOGIC = 0x03, /* logical error */ | ||
187 | ELS_RJT_BUSY = 0x05, /* logical busy */ | ||
188 | ELS_RJT_PROT = 0x07, /* protocol error */ | ||
189 | ELS_RJT_UNAB = 0x09, /* unable to perform command request */ | ||
190 | ELS_RJT_UNSUP = 0x0b, /* command not supported */ | ||
191 | ELS_RJT_INPROG = 0x0e, /* command already in progress */ | ||
192 | ELS_RJT_VENDOR = 0xff, /* vendor specific error */ | ||
193 | }; | ||
194 | |||
195 | |||
196 | /* | ||
197 | * reason code explanation (er_explan). | ||
198 | */ | ||
199 | enum fc_els_rjt_explan { | ||
200 | ELS_EXPL_NONE = 0x00, /* No additional explanation */ | ||
201 | ELS_EXPL_SPP_OPT_ERR = 0x01, /* service parameter error - options */ | ||
202 | ELS_EXPL_SPP_ICTL_ERR = 0x03, /* service parm error - initiator ctl */ | ||
203 | ELS_EXPL_AH = 0x11, /* invalid association header */ | ||
204 | ELS_EXPL_AH_REQ = 0x13, /* association_header required */ | ||
205 | ELS_EXPL_SID = 0x15, /* invalid originator S_ID */ | ||
206 | ELS_EXPL_OXID_RXID = 0x17, /* invalid OX_ID-RX_ID combination */ | ||
207 | ELS_EXPL_INPROG = 0x19, /* Request already in progress */ | ||
208 | ELS_EXPL_PLOGI_REQD = 0x1e, /* N_Port login required */ | ||
209 | ELS_EXPL_INSUF_RES = 0x29, /* insufficient resources */ | ||
210 | ELS_EXPL_UNAB_DATA = 0x2a, /* unable to supply requested data */ | ||
211 | ELS_EXPL_UNSUPR = 0x2c, /* Request not supported */ | ||
212 | ELS_EXPL_INV_LEN = 0x2d, /* Invalid payload length */ | ||
213 | /* TBD - above definitions incomplete */ | ||
214 | }; | ||
215 | |||
216 | /* | ||
217 | * Common service parameters (N ports). | ||
218 | */ | ||
219 | struct fc_els_csp { | ||
220 | __u8 sp_hi_ver; /* highest version supported (obs.) */ | ||
221 | __u8 sp_lo_ver; /* highest version supported (obs.) */ | ||
222 | __be16 sp_bb_cred; /* buffer-to-buffer credits */ | ||
223 | __be16 sp_features; /* common feature flags */ | ||
224 | __be16 sp_bb_data; /* b-b state number and data field sz */ | ||
225 | union { | ||
226 | struct { | ||
227 | __be16 _sp_tot_seq; /* total concurrent sequences */ | ||
228 | __be16 _sp_rel_off; /* rel. offset by info cat */ | ||
229 | } sp_plogi; | ||
230 | struct { | ||
231 | __be32 _sp_r_a_tov; /* resource alloc. timeout msec */ | ||
232 | } sp_flogi_acc; | ||
233 | } sp_u; | ||
234 | __be32 sp_e_d_tov; /* error detect timeout value */ | ||
235 | }; | ||
236 | #define sp_tot_seq sp_u.sp_plogi._sp_tot_seq | ||
237 | #define sp_rel_off sp_u.sp_plogi._sp_rel_off | ||
238 | #define sp_r_a_tov sp_u.sp_flogi_acc._sp_r_a_tov | ||
239 | |||
240 | #define FC_SP_BB_DATA_MASK 0xfff /* mask for data field size in sp_bb_data */ | ||
241 | |||
242 | /* | ||
243 | * Minimum and maximum values for max data field size in service parameters. | ||
244 | */ | ||
245 | #define FC_SP_MIN_MAX_PAYLOAD FC_MIN_MAX_PAYLOAD | ||
246 | #define FC_SP_MAX_MAX_PAYLOAD FC_MAX_PAYLOAD | ||
247 | |||
248 | /* | ||
249 | * sp_features | ||
250 | */ | ||
251 | #define FC_SP_FT_CIRO 0x8000 /* continuously increasing rel. off. */ | ||
252 | #define FC_SP_FT_CLAD 0x8000 /* clean address (in FLOGI LS_ACC) */ | ||
253 | #define FC_SP_FT_RAND 0x4000 /* random relative offset */ | ||
254 | #define FC_SP_FT_VAL 0x2000 /* valid vendor version level */ | ||
255 | #define FC_SP_FT_FPORT 0x1000 /* F port (1) vs. N port (0) */ | ||
256 | #define FC_SP_FT_ABB 0x0800 /* alternate BB_credit management */ | ||
257 | #define FC_SP_FT_EDTR 0x0400 /* E_D_TOV Resolution is nanoseconds */ | ||
258 | #define FC_SP_FT_MCAST 0x0200 /* multicast */ | ||
259 | #define FC_SP_FT_BCAST 0x0100 /* broadcast */ | ||
260 | #define FC_SP_FT_HUNT 0x0080 /* hunt group */ | ||
261 | #define FC_SP_FT_SIMP 0x0040 /* dedicated simplex */ | ||
262 | #define FC_SP_FT_SEC 0x0020 /* reserved for security */ | ||
263 | #define FC_SP_FT_CSYN 0x0010 /* clock synch. supported */ | ||
264 | #define FC_SP_FT_RTTOV 0x0008 /* R_T_TOV value 100 uS, else 100 mS */ | ||
265 | #define FC_SP_FT_HALF 0x0004 /* dynamic half duplex */ | ||
266 | #define FC_SP_FT_SEQC 0x0002 /* SEQ_CNT */ | ||
267 | #define FC_SP_FT_PAYL 0x0001 /* FLOGI payload length 256, else 116 */ | ||
268 | |||
269 | /* | ||
270 | * Class-specific service parameters. | ||
271 | */ | ||
272 | struct fc_els_cssp { | ||
273 | __be16 cp_class; /* class flags */ | ||
274 | __be16 cp_init; /* initiator flags */ | ||
275 | __be16 cp_recip; /* recipient flags */ | ||
276 | __be16 cp_rdfs; /* receive data field size */ | ||
277 | __be16 cp_con_seq; /* concurrent sequences */ | ||
278 | __be16 cp_ee_cred; /* N-port end-to-end credit */ | ||
279 | __u8 cp_resv1; /* reserved */ | ||
280 | __u8 cp_open_seq; /* open sequences per exchange */ | ||
281 | __u8 _cp_resv2[2]; /* reserved */ | ||
282 | }; | ||
283 | |||
284 | /* | ||
285 | * cp_class flags. | ||
286 | */ | ||
287 | #define FC_CPC_VALID 0x8000 /* class valid */ | ||
288 | #define FC_CPC_IMIX 0x4000 /* intermix mode */ | ||
289 | #define FC_CPC_SEQ 0x0800 /* sequential delivery */ | ||
290 | #define FC_CPC_CAMP 0x0200 /* camp-on */ | ||
291 | #define FC_CPC_PRI 0x0080 /* priority */ | ||
292 | |||
293 | /* | ||
294 | * cp_init flags. | ||
295 | * (TBD: not all flags defined here). | ||
296 | */ | ||
297 | #define FC_CPI_CSYN 0x0010 /* clock synch. capable */ | ||
298 | |||
299 | /* | ||
300 | * cp_recip flags. | ||
301 | */ | ||
302 | #define FC_CPR_CSYN 0x0008 /* clock synch. capable */ | ||
303 | |||
304 | /* | ||
305 | * NFC_ELS_FLOGI: Fabric login request. | ||
306 | * NFC_ELS_PLOGI: Port login request (same format). | ||
307 | */ | ||
308 | struct fc_els_flogi { | ||
309 | __u8 fl_cmd; /* command */ | ||
310 | __u8 _fl_resvd[3]; /* must be zero */ | ||
311 | struct fc_els_csp fl_csp; /* common service parameters */ | ||
312 | __be64 fl_wwpn; /* port name */ | ||
313 | __be64 fl_wwnn; /* node name */ | ||
314 | struct fc_els_cssp fl_cssp[4]; /* class 1-4 service parameters */ | ||
315 | __u8 fl_vend[16]; /* vendor version level */ | ||
316 | } __attribute__((__packed__)); | ||
317 | |||
318 | /* | ||
319 | * Process login service parameter page. | ||
320 | */ | ||
321 | struct fc_els_spp { | ||
322 | __u8 spp_type; /* type code or common service params */ | ||
323 | __u8 spp_type_ext; /* type code extension */ | ||
324 | __u8 spp_flags; | ||
325 | __u8 _spp_resvd; | ||
326 | __be32 spp_orig_pa; /* originator process associator */ | ||
327 | __be32 spp_resp_pa; /* responder process associator */ | ||
328 | __be32 spp_params; /* service parameters */ | ||
329 | }; | ||
330 | |||
331 | /* | ||
332 | * spp_flags. | ||
333 | */ | ||
334 | #define FC_SPP_OPA_VAL 0x80 /* originator proc. assoc. valid */ | ||
335 | #define FC_SPP_RPA_VAL 0x40 /* responder proc. assoc. valid */ | ||
336 | #define FC_SPP_EST_IMG_PAIR 0x20 /* establish image pair */ | ||
337 | #define FC_SPP_RESP_MASK 0x0f /* mask for response code (below) */ | ||
338 | |||
339 | /* | ||
340 | * SPP response code in spp_flags - lower 4 bits. | ||
341 | */ | ||
342 | enum fc_els_spp_resp { | ||
343 | FC_SPP_RESP_ACK = 1, /* request executed */ | ||
344 | FC_SPP_RESP_RES = 2, /* unable due to lack of resources */ | ||
345 | FC_SPP_RESP_INIT = 3, /* initialization not complete */ | ||
346 | FC_SPP_RESP_NO_PA = 4, /* unknown process associator */ | ||
347 | FC_SPP_RESP_CONF = 5, /* configuration precludes image pair */ | ||
348 | FC_SPP_RESP_COND = 6, /* request completed conditionally */ | ||
349 | FC_SPP_RESP_MULT = 7, /* unable to handle multiple SPPs */ | ||
350 | FC_SPP_RESP_INVL = 8, /* SPP is invalid */ | ||
351 | }; | ||
352 | |||
353 | /* | ||
354 | * ELS_RRQ - Reinstate Recovery Qualifier | ||
355 | */ | ||
356 | struct fc_els_rrq { | ||
357 | __u8 rrq_cmd; /* command (0x12) */ | ||
358 | __u8 rrq_zero[3]; /* specified as zero - part of cmd */ | ||
359 | __u8 rrq_resvd; /* reserved */ | ||
360 | __u8 rrq_s_id[3]; /* originator FID */ | ||
361 | __be16 rrq_ox_id; /* originator exchange ID */ | ||
362 | __be16 rrq_rx_id; /* responders exchange ID */ | ||
363 | }; | ||
364 | |||
365 | /* | ||
366 | * ELS_REC - Read exchange concise. | ||
367 | */ | ||
368 | struct fc_els_rec { | ||
369 | __u8 rec_cmd; /* command (0x13) */ | ||
370 | __u8 rec_zero[3]; /* specified as zero - part of cmd */ | ||
371 | __u8 rec_resvd; /* reserved */ | ||
372 | __u8 rec_s_id[3]; /* originator FID */ | ||
373 | __be16 rec_ox_id; /* originator exchange ID */ | ||
374 | __be16 rec_rx_id; /* responders exchange ID */ | ||
375 | }; | ||
376 | |||
377 | /* | ||
378 | * ELS_REC LS_ACC payload. | ||
379 | */ | ||
380 | struct fc_els_rec_acc { | ||
381 | __u8 reca_cmd; /* accept (0x02) */ | ||
382 | __u8 reca_zero[3]; /* specified as zero - part of cmd */ | ||
383 | __be16 reca_ox_id; /* originator exchange ID */ | ||
384 | __be16 reca_rx_id; /* responders exchange ID */ | ||
385 | __u8 reca_resvd1; /* reserved */ | ||
386 | __u8 reca_ofid[3]; /* originator FID */ | ||
387 | __u8 reca_resvd2; /* reserved */ | ||
388 | __u8 reca_rfid[3]; /* responder FID */ | ||
389 | __be32 reca_fc4value; /* FC4 value */ | ||
390 | __be32 reca_e_stat; /* ESB (exchange status block) status */ | ||
391 | }; | ||
392 | |||
393 | /* | ||
394 | * ELS_PRLI - Process login request and response. | ||
395 | */ | ||
396 | struct fc_els_prli { | ||
397 | __u8 prli_cmd; /* command */ | ||
398 | __u8 prli_spp_len; /* length of each serv. parm. page */ | ||
399 | __be16 prli_len; /* length of entire payload */ | ||
400 | /* service parameter pages follow */ | ||
401 | }; | ||
402 | |||
403 | /* | ||
404 | * ELS_ADISC payload | ||
405 | */ | ||
406 | struct fc_els_adisc { | ||
407 | __u8 adisc_cmd; | ||
408 | __u8 adisc_resv[3]; | ||
409 | __u8 adisc_resv1; | ||
410 | __u8 adisc_hard_addr[3]; | ||
411 | __be64 adisc_wwpn; | ||
412 | __be64 adisc_wwnn; | ||
413 | __u8 adisc_resv2; | ||
414 | __u8 adisc_port_id[3]; | ||
415 | } __attribute__((__packed__)); | ||
416 | |||
417 | /* | ||
418 | * ELS_LOGO - process or fabric logout. | ||
419 | */ | ||
420 | struct fc_els_logo { | ||
421 | __u8 fl_cmd; /* command code */ | ||
422 | __u8 fl_zero[3]; /* specified as zero - part of cmd */ | ||
423 | __u8 fl_resvd; /* reserved */ | ||
424 | __u8 fl_n_port_id[3];/* N port ID */ | ||
425 | __be64 fl_n_port_wwn; /* port name */ | ||
426 | }; | ||
427 | |||
428 | /* | ||
429 | * ELS_RTV - read timeout value. | ||
430 | */ | ||
431 | struct fc_els_rtv { | ||
432 | __u8 rtv_cmd; /* command code 0x0e */ | ||
433 | __u8 rtv_zero[3]; /* specified as zero - part of cmd */ | ||
434 | }; | ||
435 | |||
436 | /* | ||
437 | * LS_ACC for ELS_RTV - read timeout value. | ||
438 | */ | ||
439 | struct fc_els_rtv_acc { | ||
440 | __u8 rtv_cmd; /* command code 0x02 */ | ||
441 | __u8 rtv_zero[3]; /* specified as zero - part of cmd */ | ||
442 | __be32 rtv_r_a_tov; /* resource allocation timeout value */ | ||
443 | __be32 rtv_e_d_tov; /* error detection timeout value */ | ||
444 | __be32 rtv_toq; /* timeout qualifier (see below) */ | ||
445 | }; | ||
446 | |||
447 | /* | ||
448 | * rtv_toq bits. | ||
449 | */ | ||
450 | #define FC_ELS_RTV_EDRES (1 << 26) /* E_D_TOV resolution is nS else mS */ | ||
451 | #define FC_ELS_RTV_RTTOV (1 << 19) /* R_T_TOV is 100 uS else 100 mS */ | ||
452 | |||
453 | /* | ||
454 | * ELS_SCR - state change registration payload. | ||
455 | */ | ||
456 | struct fc_els_scr { | ||
457 | __u8 scr_cmd; /* command code */ | ||
458 | __u8 scr_resv[6]; /* reserved */ | ||
459 | __u8 scr_reg_func; /* registration function (see below) */ | ||
460 | }; | ||
461 | |||
462 | enum fc_els_scr_func { | ||
463 | ELS_SCRF_FAB = 1, /* fabric-detected registration */ | ||
464 | ELS_SCRF_NPORT = 2, /* Nx_Port-detected registration */ | ||
465 | ELS_SCRF_FULL = 3, /* full registration */ | ||
466 | ELS_SCRF_CLEAR = 255, /* remove any current registrations */ | ||
467 | }; | ||
468 | |||
469 | /* | ||
470 | * ELS_RSCN - registered state change notification payload. | ||
471 | */ | ||
472 | struct fc_els_rscn { | ||
473 | __u8 rscn_cmd; /* RSCN opcode (0x61) */ | ||
474 | __u8 rscn_page_len; /* page length (4) */ | ||
475 | __be16 rscn_plen; /* payload length including this word */ | ||
476 | |||
477 | /* followed by 4-byte generic affected Port_ID pages */ | ||
478 | }; | ||
479 | |||
480 | struct fc_els_rscn_page { | ||
481 | __u8 rscn_page_flags; /* event and address format */ | ||
482 | __u8 rscn_fid[3]; /* fabric ID */ | ||
483 | }; | ||
484 | |||
485 | #define ELS_RSCN_EV_QUAL_BIT 2 /* shift count for event qualifier */ | ||
486 | #define ELS_RSCN_EV_QUAL_MASK 0xf /* mask for event qualifier */ | ||
487 | #define ELS_RSCN_ADDR_FMT_BIT 0 /* shift count for address format */ | ||
488 | #define ELS_RSCN_ADDR_FMT_MASK 0x3 /* mask for address format */ | ||
489 | |||
490 | enum fc_els_rscn_ev_qual { | ||
491 | ELS_EV_QUAL_NONE = 0, /* unspecified */ | ||
492 | ELS_EV_QUAL_NS_OBJ = 1, /* changed name server object */ | ||
493 | ELS_EV_QUAL_PORT_ATTR = 2, /* changed port attribute */ | ||
494 | ELS_EV_QUAL_SERV_OBJ = 3, /* changed service object */ | ||
495 | ELS_EV_QUAL_SW_CONFIG = 4, /* changed switch configuration */ | ||
496 | ELS_EV_QUAL_REM_OBJ = 5, /* removed object */ | ||
497 | }; | ||
498 | |||
499 | enum fc_els_rscn_addr_fmt { | ||
500 | ELS_ADDR_FMT_PORT = 0, /* rscn_fid is a port address */ | ||
501 | ELS_ADDR_FMT_AREA = 1, /* rscn_fid is a area address */ | ||
502 | ELS_ADDR_FMT_DOM = 2, /* rscn_fid is a domain address */ | ||
503 | ELS_ADDR_FMT_FAB = 3, /* anything on fabric may have changed */ | ||
504 | }; | ||
505 | |||
506 | /* | ||
507 | * ELS_RNID - request Node ID. | ||
508 | */ | ||
509 | struct fc_els_rnid { | ||
510 | __u8 rnid_cmd; /* RNID opcode (0x78) */ | ||
511 | __u8 rnid_resv[3]; /* reserved */ | ||
512 | __u8 rnid_fmt; /* data format */ | ||
513 | __u8 rnid_resv2[3]; /* reserved */ | ||
514 | }; | ||
515 | |||
516 | /* | ||
517 | * Node Identification Data formats (rnid_fmt) | ||
518 | */ | ||
519 | enum fc_els_rnid_fmt { | ||
520 | ELS_RNIDF_NONE = 0, /* no specific identification data */ | ||
521 | ELS_RNIDF_GEN = 0xdf, /* general topology discovery format */ | ||
522 | }; | ||
523 | |||
524 | /* | ||
525 | * ELS_RNID response. | ||
526 | */ | ||
527 | struct fc_els_rnid_resp { | ||
528 | __u8 rnid_cmd; /* response code (LS_ACC) */ | ||
529 | __u8 rnid_resv[3]; /* reserved */ | ||
530 | __u8 rnid_fmt; /* data format */ | ||
531 | __u8 rnid_cid_len; /* common ID data length */ | ||
532 | __u8 rnid_resv2; /* reserved */ | ||
533 | __u8 rnid_sid_len; /* specific ID data length */ | ||
534 | }; | ||
535 | |||
536 | struct fc_els_rnid_cid { | ||
537 | __be64 rnid_wwpn; /* N port name */ | ||
538 | __be64 rnid_wwnn; /* node name */ | ||
539 | }; | ||
540 | |||
541 | struct fc_els_rnid_gen { | ||
542 | __u8 rnid_vend_id[16]; /* vendor-unique ID */ | ||
543 | __be32 rnid_atype; /* associated type (see below) */ | ||
544 | __be32 rnid_phys_port; /* physical port number */ | ||
545 | __be32 rnid_att_nodes; /* number of attached nodes */ | ||
546 | __u8 rnid_node_mgmt; /* node management (see below) */ | ||
547 | __u8 rnid_ip_ver; /* IP version (see below) */ | ||
548 | __be16 rnid_prot_port; /* UDP / TCP port number */ | ||
549 | __be32 rnid_ip_addr[4]; /* IP address */ | ||
550 | __u8 rnid_resvd[2]; /* reserved */ | ||
551 | __be16 rnid_vend_spec; /* vendor-specific field */ | ||
552 | }; | ||
553 | |||
554 | enum fc_els_rnid_atype { | ||
555 | ELS_RNIDA_UNK = 0x01, /* unknown */ | ||
556 | ELS_RNIDA_OTHER = 0x02, /* none of the following */ | ||
557 | ELS_RNIDA_HUB = 0x03, | ||
558 | ELS_RNIDA_SWITCH = 0x04, | ||
559 | ELS_RNIDA_GATEWAY = 0x05, | ||
560 | ELS_RNIDA_CONV = 0x06, /* Obsolete, do not use this value */ | ||
561 | ELS_RNIDA_HBA = 0x07, /* Obsolete, do not use this value */ | ||
562 | ELS_RNIDA_PROXY = 0x08, /* Obsolete, do not use this value */ | ||
563 | ELS_RNIDA_STORAGE = 0x09, | ||
564 | ELS_RNIDA_HOST = 0x0a, | ||
565 | ELS_RNIDA_SUBSYS = 0x0b, /* storage subsystem (e.g., RAID) */ | ||
566 | ELS_RNIDA_ACCESS = 0x0e, /* access device (e.g. media changer) */ | ||
567 | ELS_RNIDA_NAS = 0x11, /* NAS server */ | ||
568 | ELS_RNIDA_BRIDGE = 0x12, /* bridge */ | ||
569 | ELS_RNIDA_VIRT = 0x13, /* virtualization device */ | ||
570 | ELS_RNIDA_MF = 0xff, /* multifunction device (bits below) */ | ||
571 | ELS_RNIDA_MF_HUB = 1UL << 31, /* hub */ | ||
572 | ELS_RNIDA_MF_SW = 1UL << 30, /* switch */ | ||
573 | ELS_RNIDA_MF_GW = 1UL << 29, /* gateway */ | ||
574 | ELS_RNIDA_MF_ST = 1UL << 28, /* storage */ | ||
575 | ELS_RNIDA_MF_HOST = 1UL << 27, /* host */ | ||
576 | ELS_RNIDA_MF_SUB = 1UL << 26, /* storage subsystem */ | ||
577 | ELS_RNIDA_MF_ACC = 1UL << 25, /* storage access dev */ | ||
578 | ELS_RNIDA_MF_WDM = 1UL << 24, /* wavelength division mux */ | ||
579 | ELS_RNIDA_MF_NAS = 1UL << 23, /* NAS server */ | ||
580 | ELS_RNIDA_MF_BR = 1UL << 22, /* bridge */ | ||
581 | ELS_RNIDA_MF_VIRT = 1UL << 21, /* virtualization device */ | ||
582 | }; | ||
583 | |||
584 | enum fc_els_rnid_mgmt { | ||
585 | ELS_RNIDM_SNMP = 0, | ||
586 | ELS_RNIDM_TELNET = 1, | ||
587 | ELS_RNIDM_HTTP = 2, | ||
588 | ELS_RNIDM_HTTPS = 3, | ||
589 | ELS_RNIDM_XML = 4, /* HTTP + XML */ | ||
590 | }; | ||
591 | |||
592 | enum fc_els_rnid_ipver { | ||
593 | ELS_RNIDIP_NONE = 0, /* no IP support or node mgmt. */ | ||
594 | ELS_RNIDIP_V4 = 1, /* IPv4 */ | ||
595 | ELS_RNIDIP_V6 = 2, /* IPv6 */ | ||
596 | }; | ||
597 | |||
598 | /* | ||
599 | * ELS RPL - Read Port List. | ||
600 | */ | ||
601 | struct fc_els_rpl { | ||
602 | __u8 rpl_cmd; /* command */ | ||
603 | __u8 rpl_resv[5]; /* reserved - must be zero */ | ||
604 | __be16 rpl_max_size; /* maximum response size or zero */ | ||
605 | __u8 rpl_resv1; /* reserved - must be zero */ | ||
606 | __u8 rpl_index[3]; /* starting index */ | ||
607 | }; | ||
608 | |||
609 | /* | ||
610 | * Port number block in RPL response. | ||
611 | */ | ||
612 | struct fc_els_pnb { | ||
613 | __be32 pnb_phys_pn; /* physical port number */ | ||
614 | __u8 pnb_resv; /* reserved */ | ||
615 | __u8 pnb_port_id[3]; /* port ID */ | ||
616 | __be64 pnb_wwpn; /* port name */ | ||
617 | }; | ||
618 | |||
619 | /* | ||
620 | * RPL LS_ACC response. | ||
621 | */ | ||
622 | struct fc_els_rpl_resp { | ||
623 | __u8 rpl_cmd; /* ELS_LS_ACC */ | ||
624 | __u8 rpl_resv1; /* reserved - must be zero */ | ||
625 | __be16 rpl_plen; /* payload length */ | ||
626 | __u8 rpl_resv2; /* reserved - must be zero */ | ||
627 | __u8 rpl_llen[3]; /* list length */ | ||
628 | __u8 rpl_resv3; /* reserved - must be zero */ | ||
629 | __u8 rpl_index[3]; /* starting index */ | ||
630 | struct fc_els_pnb rpl_pnb[1]; /* variable number of PNBs */ | ||
631 | }; | ||
632 | |||
633 | /* | ||
634 | * Link Error Status Block. | ||
635 | */ | ||
636 | struct fc_els_lesb { | ||
637 | __be32 lesb_link_fail; /* link failure count */ | ||
638 | __be32 lesb_sync_loss; /* loss of synchronization count */ | ||
639 | __be32 lesb_sig_loss; /* loss of signal count */ | ||
640 | __be32 lesb_prim_err; /* primitive sequence error count */ | ||
641 | __be32 lesb_inv_word; /* invalid transmission word count */ | ||
642 | __be32 lesb_inv_crc; /* invalid CRC count */ | ||
643 | }; | ||
644 | |||
645 | /* | ||
646 | * ELS RPS - Read Port Status Block request. | ||
647 | */ | ||
648 | struct fc_els_rps { | ||
649 | __u8 rps_cmd; /* command */ | ||
650 | __u8 rps_resv[2]; /* reserved - must be zero */ | ||
651 | __u8 rps_flag; /* flag - see below */ | ||
652 | __be64 rps_port_spec; /* port selection */ | ||
653 | }; | ||
654 | |||
655 | enum fc_els_rps_flag { | ||
656 | FC_ELS_RPS_DID = 0x00, /* port identified by D_ID of req. */ | ||
657 | FC_ELS_RPS_PPN = 0x01, /* port_spec is physical port number */ | ||
658 | FC_ELS_RPS_WWPN = 0x02, /* port_spec is port WWN */ | ||
659 | }; | ||
660 | |||
661 | /* | ||
662 | * ELS RPS LS_ACC response. | ||
663 | */ | ||
664 | struct fc_els_rps_resp { | ||
665 | __u8 rps_cmd; /* command - LS_ACC */ | ||
666 | __u8 rps_resv[2]; /* reserved - must be zero */ | ||
667 | __u8 rps_flag; /* flag - see below */ | ||
668 | __u8 rps_resv2[2]; /* reserved */ | ||
669 | __be16 rps_status; /* port status - see below */ | ||
670 | struct fc_els_lesb rps_lesb; /* link error status block */ | ||
671 | }; | ||
672 | |||
673 | enum fc_els_rps_resp_flag { | ||
674 | FC_ELS_RPS_LPEV = 0x01, /* L_port extension valid */ | ||
675 | }; | ||
676 | |||
677 | enum fc_els_rps_resp_status { | ||
678 | FC_ELS_RPS_PTP = 1 << 5, /* point-to-point connection */ | ||
679 | FC_ELS_RPS_LOOP = 1 << 4, /* loop mode */ | ||
680 | FC_ELS_RPS_FAB = 1 << 3, /* fabric present */ | ||
681 | FC_ELS_RPS_NO_SIG = 1 << 2, /* loss of signal */ | ||
682 | FC_ELS_RPS_NO_SYNC = 1 << 1, /* loss of synchronization */ | ||
683 | FC_ELS_RPS_RESET = 1 << 0, /* in link reset protocol */ | ||
684 | }; | ||
685 | |||
686 | /* | ||
687 | * ELS LIRR - Link Incident Record Registration request. | ||
688 | */ | ||
689 | struct fc_els_lirr { | ||
690 | __u8 lirr_cmd; /* command */ | ||
691 | __u8 lirr_resv[3]; /* reserved - must be zero */ | ||
692 | __u8 lirr_func; /* registration function */ | ||
693 | __u8 lirr_fmt; /* FC-4 type of RLIR requested */ | ||
694 | __u8 lirr_resv2[2]; /* reserved - must be zero */ | ||
695 | }; | ||
696 | |||
697 | enum fc_els_lirr_func { | ||
698 | ELS_LIRR_SET_COND = 0x01, /* set - conditionally receive */ | ||
699 | ELS_LIRR_SET_UNCOND = 0x02, /* set - unconditionally receive */ | ||
700 | ELS_LIRR_CLEAR = 0xff /* clear registration */ | ||
701 | }; | ||
702 | |||
703 | /* | ||
704 | * ELS SRL - Scan Remote Loop request. | ||
705 | */ | ||
706 | struct fc_els_srl { | ||
707 | __u8 srl_cmd; /* command */ | ||
708 | __u8 srl_resv[3]; /* reserved - must be zero */ | ||
709 | __u8 srl_flag; /* flag - see below */ | ||
710 | __u8 srl_flag_param[3]; /* flag parameter */ | ||
711 | }; | ||
712 | |||
713 | enum fc_els_srl_flag { | ||
714 | FC_ELS_SRL_ALL = 0x00, /* scan all FL ports */ | ||
715 | FC_ELS_SRL_ONE = 0x01, /* scan specified loop */ | ||
716 | FC_ELS_SRL_EN_PER = 0x02, /* enable periodic scanning (param) */ | ||
717 | FC_ELS_SRL_DIS_PER = 0x03, /* disable periodic scanning */ | ||
718 | }; | ||
719 | |||
720 | /* | ||
721 | * ELS RLS - Read Link Error Status Block request. | ||
722 | */ | ||
723 | struct fc_els_rls { | ||
724 | __u8 rls_cmd; /* command */ | ||
725 | __u8 rls_resv[4]; /* reserved - must be zero */ | ||
726 | __u8 rls_port_id[3]; /* port ID */ | ||
727 | }; | ||
728 | |||
729 | /* | ||
730 | * ELS RLS LS_ACC Response. | ||
731 | */ | ||
732 | struct fc_els_rls_resp { | ||
733 | __u8 rls_cmd; /* ELS_LS_ACC */ | ||
734 | __u8 rls_resv[3]; /* reserved - must be zero */ | ||
735 | struct fc_els_lesb rls_lesb; /* link error status block */ | ||
736 | }; | ||
737 | |||
738 | /* | ||
739 | * ELS RLIR - Registered Link Incident Report. | ||
740 | * This is followed by the CLIR and the CLID, described below. | ||
741 | */ | ||
742 | struct fc_els_rlir { | ||
743 | __u8 rlir_cmd; /* command */ | ||
744 | __u8 rlir_resv[3]; /* reserved - must be zero */ | ||
745 | __u8 rlir_fmt; /* format (FC4-type if type specific) */ | ||
746 | __u8 rlir_clr_len; /* common link incident record length */ | ||
747 | __u8 rlir_cld_len; /* common link incident desc. length */ | ||
748 | __u8 rlir_slr_len; /* spec. link incident record length */ | ||
749 | }; | ||
750 | |||
751 | /* | ||
752 | * CLIR - Common Link Incident Record Data. - Sent via RLIR. | ||
753 | */ | ||
754 | struct fc_els_clir { | ||
755 | __be64 clir_wwpn; /* incident port name */ | ||
756 | __be64 clir_wwnn; /* incident port node name */ | ||
757 | __u8 clir_port_type; /* incident port type */ | ||
758 | __u8 clir_port_id[3]; /* incident port ID */ | ||
759 | |||
760 | __be64 clir_conn_wwpn; /* connected port name */ | ||
761 | __be64 clir_conn_wwnn; /* connected node name */ | ||
762 | __be64 clir_fab_name; /* fabric name */ | ||
763 | __be32 clir_phys_port; /* physical port number */ | ||
764 | __be32 clir_trans_id; /* transaction ID */ | ||
765 | __u8 clir_resv[3]; /* reserved */ | ||
766 | __u8 clir_ts_fmt; /* time stamp format */ | ||
767 | __be64 clir_timestamp; /* time stamp */ | ||
768 | }; | ||
769 | |||
770 | /* | ||
771 | * CLIR clir_ts_fmt - time stamp format values. | ||
772 | */ | ||
773 | enum fc_els_clir_ts_fmt { | ||
774 | ELS_CLIR_TS_UNKNOWN = 0, /* time stamp field unknown */ | ||
775 | ELS_CLIR_TS_SEC_FRAC = 1, /* time in seconds and fractions */ | ||
776 | ELS_CLIR_TS_CSU = 2, /* time in clock synch update format */ | ||
777 | }; | ||
778 | |||
779 | /* | ||
780 | * Common Link Incident Descriptor - sent via RLIR. | ||
781 | */ | ||
782 | struct fc_els_clid { | ||
783 | __u8 clid_iq; /* incident qualifier flags */ | ||
784 | __u8 clid_ic; /* incident code */ | ||
785 | __be16 clid_epai; /* domain/area of ISL */ | ||
786 | }; | ||
787 | |||
788 | /* | ||
789 | * CLID incident qualifier flags. | ||
790 | */ | ||
791 | enum fc_els_clid_iq { | ||
792 | ELS_CLID_SWITCH = 0x20, /* incident port is a switch node */ | ||
793 | ELS_CLID_E_PORT = 0x10, /* incident is an ISL (E) port */ | ||
794 | ELS_CLID_SEV_MASK = 0x0c, /* severity 2-bit field mask */ | ||
795 | ELS_CLID_SEV_INFO = 0x00, /* report is informational */ | ||
796 | ELS_CLID_SEV_INOP = 0x08, /* link not operational */ | ||
797 | ELS_CLID_SEV_DEG = 0x04, /* link degraded but operational */ | ||
798 | ELS_CLID_LASER = 0x02, /* subassembly is a laser */ | ||
799 | ELS_CLID_FRU = 0x01, /* format can identify a FRU */ | ||
800 | }; | ||
801 | |||
802 | /* | ||
803 | * CLID incident code. | ||
804 | */ | ||
805 | enum fc_els_clid_ic { | ||
806 | ELS_CLID_IC_IMPL = 1, /* implicit incident */ | ||
807 | ELS_CLID_IC_BER = 2, /* bit-error-rate threshold exceeded */ | ||
808 | ELS_CLID_IC_LOS = 3, /* loss of synch or signal */ | ||
809 | ELS_CLID_IC_NOS = 4, /* non-operational primitive sequence */ | ||
810 | ELS_CLID_IC_PST = 5, /* primitive sequence timeout */ | ||
811 | ELS_CLID_IC_INVAL = 6, /* invalid primitive sequence */ | ||
812 | ELS_CLID_IC_LOOP_TO = 7, /* loop initialization time out */ | ||
813 | ELS_CLID_IC_LIP = 8, /* receiving LIP */ | ||
814 | }; | ||
815 | |||
816 | #endif /* _FC_ELS_H_ */ | ||
diff --git a/include/scsi/fc/fc_encaps.h b/include/scsi/fc/fc_encaps.h new file mode 100644 index 000000000000..f180c3e16220 --- /dev/null +++ b/include/scsi/fc/fc_encaps.h | |||
@@ -0,0 +1,138 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | #ifndef _FC_ENCAPS_H_ | ||
20 | #define _FC_ENCAPS_H_ | ||
21 | |||
22 | /* | ||
23 | * Protocol definitions from RFC 3643 - Fibre Channel Frame Encapsulation. | ||
24 | * | ||
25 | * Note: The frame length field is the number of 32-bit words in | ||
26 | * the encapsulation including the fcip_encaps_header, CRC and EOF words. | ||
27 | * The minimum frame length value in bytes is (32 + 24 + 4 + 4) * 4 = 64. | ||
28 | * The maximum frame length value in bytes is (32 + 24 + 2112 + 4 + 4) = 2172. | ||
29 | */ | ||
30 | #define FC_ENCAPS_MIN_FRAME_LEN 64 /* min frame len (bytes) (see above) */ | ||
31 | #define FC_ENCAPS_MAX_FRAME_LEN (FC_ENCAPS_MIN_FRAME_LEN + FC_MAX_PAYLOAD) | ||
32 | |||
33 | #define FC_ENCAPS_VER 1 /* current version number */ | ||
34 | |||
35 | struct fc_encaps_hdr { | ||
36 | __u8 fc_proto; /* protocol number */ | ||
37 | __u8 fc_ver; /* version of encapsulation */ | ||
38 | __u8 fc_proto_n; /* ones complement of protocol */ | ||
39 | __u8 fc_ver_n; /* ones complement of version */ | ||
40 | |||
41 | unsigned char fc_proto_data[8]; /* protocol specific data */ | ||
42 | |||
43 | __be16 fc_len_flags; /* 10-bit length/4 w/ 6 flag bits */ | ||
44 | __be16 fc_len_flags_n; /* ones complement of length / flags */ | ||
45 | |||
46 | /* | ||
47 | * Offset 0x10 | ||
48 | */ | ||
49 | __be32 fc_time[2]; /* time stamp: seconds and fraction */ | ||
50 | __be32 fc_crc; /* CRC */ | ||
51 | __be32 fc_sof; /* start of frame (see FC_SOF below) */ | ||
52 | |||
53 | /* 0x20 - FC frame content followed by EOF word */ | ||
54 | }; | ||
55 | |||
56 | #define FCIP_ENCAPS_HDR_LEN 0x20 /* expected length for asserts */ | ||
57 | |||
58 | /* | ||
59 | * Macro's for making redundant copies of EOF and SOF. | ||
60 | */ | ||
61 | #define FC_XY(x, y) ((((x) & 0xff) << 8) | ((y) & 0xff)) | ||
62 | #define FC_XYXY(x, y) ((FCIP_XY(x, y) << 16) | FCIP_XY(x, y)) | ||
63 | #define FC_XYNN(x, y) (FCIP_XYXY(x, y) ^ 0xffff) | ||
64 | |||
65 | #define FC_SOF_ENCODE(n) FC_XYNN(n, n) | ||
66 | #define FC_EOF_ENCODE(n) FC_XYNN(n, n) | ||
67 | |||
68 | /* | ||
69 | * SOF / EOF bytes. | ||
70 | */ | ||
71 | enum fc_sof { | ||
72 | FC_SOF_F = 0x28, /* fabric */ | ||
73 | FC_SOF_I4 = 0x29, /* initiate class 4 */ | ||
74 | FC_SOF_I2 = 0x2d, /* initiate class 2 */ | ||
75 | FC_SOF_I3 = 0x2e, /* initiate class 3 */ | ||
76 | FC_SOF_N4 = 0x31, /* normal class 4 */ | ||
77 | FC_SOF_N2 = 0x35, /* normal class 2 */ | ||
78 | FC_SOF_N3 = 0x36, /* normal class 3 */ | ||
79 | FC_SOF_C4 = 0x39, /* activate class 4 */ | ||
80 | } __attribute__((packed)); | ||
81 | |||
82 | enum fc_eof { | ||
83 | FC_EOF_N = 0x41, /* normal (not last frame of seq) */ | ||
84 | FC_EOF_T = 0x42, /* terminate (last frame of sequence) */ | ||
85 | FC_EOF_RT = 0x44, | ||
86 | FC_EOF_DT = 0x46, /* disconnect-terminate class-1 */ | ||
87 | FC_EOF_NI = 0x49, /* normal-invalid */ | ||
88 | FC_EOF_DTI = 0x4e, /* disconnect-terminate-invalid */ | ||
89 | FC_EOF_RTI = 0x4f, | ||
90 | FC_EOF_A = 0x50, /* abort */ | ||
91 | } __attribute__((packed)); | ||
92 | |||
93 | #define FC_SOF_CLASS_MASK 0x06 /* mask for class of service in SOF */ | ||
94 | |||
95 | /* | ||
96 | * Define classes in terms of the SOF code (initial). | ||
97 | */ | ||
98 | enum fc_class { | ||
99 | FC_CLASS_NONE = 0, /* software value indicating no class */ | ||
100 | FC_CLASS_2 = FC_SOF_I2, | ||
101 | FC_CLASS_3 = FC_SOF_I3, | ||
102 | FC_CLASS_4 = FC_SOF_I4, | ||
103 | FC_CLASS_F = FC_SOF_F, | ||
104 | }; | ||
105 | |||
106 | /* | ||
107 | * Determine whether SOF code indicates the need for a BLS ACK. | ||
108 | */ | ||
109 | static inline int fc_sof_needs_ack(enum fc_sof sof) | ||
110 | { | ||
111 | return (~sof) & 0x02; /* true for class 1, 2, 4, 6, or F */ | ||
112 | } | ||
113 | |||
114 | /* | ||
115 | * Given an fc_class, return the normal (non-initial) SOF value. | ||
116 | */ | ||
117 | static inline enum fc_sof fc_sof_normal(enum fc_class class) | ||
118 | { | ||
119 | return class + FC_SOF_N3 - FC_SOF_I3; /* diff is always 8 */ | ||
120 | } | ||
121 | |||
122 | /* | ||
123 | * Compute class from SOF value. | ||
124 | */ | ||
125 | static inline enum fc_class fc_sof_class(enum fc_sof sof) | ||
126 | { | ||
127 | return (sof & 0x7) | FC_SOF_F; | ||
128 | } | ||
129 | |||
130 | /* | ||
131 | * Determine whether SOF is for the initial frame of a sequence. | ||
132 | */ | ||
133 | static inline int fc_sof_is_init(enum fc_sof sof) | ||
134 | { | ||
135 | return sof < 0x30; | ||
136 | } | ||
137 | |||
138 | #endif /* _FC_ENCAPS_H_ */ | ||
diff --git a/include/scsi/fc/fc_fc2.h b/include/scsi/fc/fc_fc2.h new file mode 100644 index 000000000000..cff8a8c22f50 --- /dev/null +++ b/include/scsi/fc/fc_fc2.h | |||
@@ -0,0 +1,124 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_FC2_H_ | ||
21 | #define _FC_FC2_H_ | ||
22 | |||
23 | /* | ||
24 | * Fibre Channel Exchanges and Sequences. | ||
25 | */ | ||
26 | #ifndef PACKED | ||
27 | #define PACKED __attribute__ ((__packed__)) | ||
28 | #endif /* PACKED */ | ||
29 | |||
30 | |||
31 | /* | ||
32 | * Sequence Status Block. | ||
33 | * This format is set by the FC-FS standard and is sent over the wire. | ||
34 | * Note that the fields aren't all naturally aligned. | ||
35 | */ | ||
36 | struct fc_ssb { | ||
37 | __u8 ssb_seq_id; /* sequence ID */ | ||
38 | __u8 _ssb_resvd; | ||
39 | __be16 ssb_low_seq_cnt; /* lowest SEQ_CNT */ | ||
40 | |||
41 | __be16 ssb_high_seq_cnt; /* highest SEQ_CNT */ | ||
42 | __be16 ssb_s_stat; /* sequence status flags */ | ||
43 | |||
44 | __be16 ssb_err_seq_cnt; /* error SEQ_CNT */ | ||
45 | __u8 ssb_fh_cs_ctl; /* frame header CS_CTL */ | ||
46 | __be16 ssb_fh_ox_id; /* frame header OX_ID */ | ||
47 | __be16 ssb_rx_id; /* responder's exchange ID */ | ||
48 | __u8 _ssb_resvd2[2]; | ||
49 | } PACKED; | ||
50 | |||
51 | /* | ||
52 | * The SSB should be 17 bytes. Since it's layout is somewhat strange, | ||
53 | * we define the size here so that code can ASSERT that the size comes out | ||
54 | * correct. | ||
55 | */ | ||
56 | #define FC_SSB_SIZE 17 /* length of fc_ssb for assert */ | ||
57 | |||
58 | /* | ||
59 | * ssb_s_stat - flags from FC-FS-2 T11/1619-D Rev 0.90. | ||
60 | */ | ||
61 | #define SSB_ST_RESP (1 << 15) /* sequence responder */ | ||
62 | #define SSB_ST_ACTIVE (1 << 14) /* sequence is active */ | ||
63 | #define SSB_ST_ABNORMAL (1 << 12) /* abnormal ending condition */ | ||
64 | |||
65 | #define SSB_ST_REQ_MASK (3 << 10) /* ACK, abort sequence condition */ | ||
66 | #define SSB_ST_REQ_CONT (0 << 10) | ||
67 | #define SSB_ST_REQ_ABORT (1 << 10) | ||
68 | #define SSB_ST_REQ_STOP (2 << 10) | ||
69 | #define SSB_ST_REQ_RETRANS (3 << 10) | ||
70 | |||
71 | #define SSB_ST_ABTS (1 << 9) /* ABTS protocol completed */ | ||
72 | #define SSB_ST_RETRANS (1 << 8) /* retransmission completed */ | ||
73 | #define SSB_ST_TIMEOUT (1 << 7) /* sequence timed out by recipient */ | ||
74 | #define SSB_ST_P_RJT (1 << 6) /* P_RJT transmitted */ | ||
75 | |||
76 | #define SSB_ST_CLASS_BIT 4 /* class of service field LSB */ | ||
77 | #define SSB_ST_CLASS_MASK 3 /* class of service mask */ | ||
78 | #define SSB_ST_ACK (1 << 3) /* ACK (EOFt or EOFdt) transmitted */ | ||
79 | |||
80 | /* | ||
81 | * Exchange Status Block. | ||
82 | * This format is set by the FC-FS standard and is sent over the wire. | ||
83 | * Note that the fields aren't all naturally aligned. | ||
84 | */ | ||
85 | struct fc_esb { | ||
86 | __u8 esb_cs_ctl; /* CS_CTL for frame header */ | ||
87 | __be16 esb_ox_id; /* originator exchange ID */ | ||
88 | __be16 esb_rx_id; /* responder exchange ID */ | ||
89 | __be32 esb_orig_fid; /* fabric ID of originator */ | ||
90 | __be32 esb_resp_fid; /* fabric ID of responder */ | ||
91 | __be32 esb_e_stat; /* status */ | ||
92 | __u8 _esb_resvd[4]; | ||
93 | __u8 esb_service_params[112]; /* TBD */ | ||
94 | __u8 esb_seq_status[8]; /* sequence statuses, 8 bytes each */ | ||
95 | } __attribute__((packed));; | ||
96 | |||
97 | |||
98 | /* | ||
99 | * Define expected size for ASSERTs. | ||
100 | * See comments on FC_SSB_SIZE. | ||
101 | */ | ||
102 | #define FC_ESB_SIZE (1 + 5*4 + 112 + 8) /* expected size */ | ||
103 | |||
104 | /* | ||
105 | * esb_e_stat - flags from FC-FS-2 T11/1619-D Rev 0.90. | ||
106 | */ | ||
107 | #define ESB_ST_RESP (1 << 31) /* responder to exchange */ | ||
108 | #define ESB_ST_SEQ_INIT (1 << 30) /* port holds sequence initiaive */ | ||
109 | #define ESB_ST_COMPLETE (1 << 29) /* exchange is complete */ | ||
110 | #define ESB_ST_ABNORMAL (1 << 28) /* abnormal ending condition */ | ||
111 | #define ESB_ST_REC_QUAL (1 << 26) /* recovery qualifier active */ | ||
112 | |||
113 | #define ESB_ST_ERRP_BIT 24 /* LSB for error policy */ | ||
114 | #define ESB_ST_ERRP_MASK (3 << 24) /* mask for error policy */ | ||
115 | #define ESB_ST_ERRP_MULT (0 << 24) /* abort, discard multiple sequences */ | ||
116 | #define ESB_ST_ERRP_SING (1 << 24) /* abort, discard single sequence */ | ||
117 | #define ESB_ST_ERRP_INF (2 << 24) /* process with infinite buffers */ | ||
118 | #define ESB_ST_ERRP_IMM (3 << 24) /* discard mult. with immed. retran. */ | ||
119 | |||
120 | #define ESB_ST_OX_ID_INVL (1 << 23) /* originator XID invalid */ | ||
121 | #define ESB_ST_RX_ID_INVL (1 << 22) /* responder XID invalid */ | ||
122 | #define ESB_ST_PRI_INUSE (1 << 21) /* priority / preemption in use */ | ||
123 | |||
124 | #endif /* _FC_FC2_H_ */ | ||
diff --git a/include/scsi/fc/fc_fcoe.h b/include/scsi/fc/fc_fcoe.h new file mode 100644 index 000000000000..57aaa8f0d613 --- /dev/null +++ b/include/scsi/fc/fc_fcoe.h | |||
@@ -0,0 +1,114 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_FCOE_H_ | ||
21 | #define _FC_FCOE_H_ | ||
22 | |||
23 | /* | ||
24 | * FCoE - Fibre Channel over Ethernet. | ||
25 | */ | ||
26 | |||
27 | /* | ||
28 | * The FCoE ethertype eventually goes in net/if_ether.h. | ||
29 | */ | ||
30 | #ifndef ETH_P_FCOE | ||
31 | #define ETH_P_FCOE 0x8906 /* FCOE ether type */ | ||
32 | #endif | ||
33 | |||
34 | #ifndef ETH_P_8021Q | ||
35 | #define ETH_P_8021Q 0x8100 | ||
36 | #endif | ||
37 | |||
38 | /* | ||
39 | * FC_FCOE_OUI hasn't been standardized yet. XXX TBD. | ||
40 | */ | ||
41 | #ifndef FC_FCOE_OUI | ||
42 | #define FC_FCOE_OUI 0x0efc00 /* upper 24 bits of FCOE dest MAC TBD */ | ||
43 | #endif | ||
44 | |||
45 | /* | ||
46 | * The destination MAC address for the fabric login may get a different OUI. | ||
47 | * This isn't standardized yet. | ||
48 | */ | ||
49 | #ifndef FC_FCOE_FLOGI_MAC | ||
50 | /* gateway MAC - TBD */ | ||
51 | #define FC_FCOE_FLOGI_MAC { 0x0e, 0xfc, 0x00, 0xff, 0xff, 0xfe } | ||
52 | #endif | ||
53 | |||
54 | #define FC_FCOE_VER 0 /* version */ | ||
55 | |||
56 | /* | ||
57 | * Ethernet Addresses based on FC S_ID and D_ID. | ||
58 | * Generated by FC_FCOE_OUI | S_ID/D_ID | ||
59 | */ | ||
60 | #define FC_FCOE_ENCAPS_ID(n) (((u64) FC_FCOE_OUI << 24) | (n)) | ||
61 | #define FC_FCOE_DECAPS_ID(n) ((n) >> 24) | ||
62 | |||
63 | /* | ||
64 | * FCoE frame header - 14 bytes | ||
65 | * | ||
66 | * This is the August 2007 version of the FCoE header as defined by T11. | ||
67 | * This follows the VLAN header, which includes the ethertype. | ||
68 | */ | ||
69 | struct fcoe_hdr { | ||
70 | __u8 fcoe_ver; /* version field - upper 4 bits */ | ||
71 | __u8 fcoe_resvd[12]; /* reserved - send zero and ignore */ | ||
72 | __u8 fcoe_sof; /* start of frame per RFC 3643 */ | ||
73 | }; | ||
74 | |||
75 | #define FC_FCOE_DECAPS_VER(hp) ((hp)->fcoe_ver >> 4) | ||
76 | #define FC_FCOE_ENCAPS_VER(hp, ver) ((hp)->fcoe_ver = (ver) << 4) | ||
77 | |||
78 | /* | ||
79 | * FCoE CRC & EOF - 8 bytes. | ||
80 | */ | ||
81 | struct fcoe_crc_eof { | ||
82 | __le32 fcoe_crc32; /* CRC for FC packet */ | ||
83 | __u8 fcoe_eof; /* EOF from RFC 3643 */ | ||
84 | __u8 fcoe_resvd[3]; /* reserved - send zero and ignore */ | ||
85 | } __attribute__((packed)); | ||
86 | |||
87 | /* | ||
88 | * Minimum FCoE + FC header length | ||
89 | * 14 bytes FCoE header + 24 byte FC header = 38 bytes | ||
90 | */ | ||
91 | #define FCOE_HEADER_LEN 38 | ||
92 | |||
93 | /* | ||
94 | * Minimum FCoE frame size | ||
95 | * 14 bytes FCoE header + 24 byte FC header + 8 byte FCoE trailer = 46 bytes | ||
96 | */ | ||
97 | #define FCOE_MIN_FRAME 46 | ||
98 | |||
99 | /* | ||
100 | * fc_fcoe_set_mac - Store OUI + DID into MAC address field. | ||
101 | * @mac: mac address to be set | ||
102 | * @did: fc dest id to use | ||
103 | */ | ||
104 | static inline void fc_fcoe_set_mac(u8 *mac, u8 *did) | ||
105 | { | ||
106 | mac[0] = (u8) (FC_FCOE_OUI >> 16); | ||
107 | mac[1] = (u8) (FC_FCOE_OUI >> 8); | ||
108 | mac[2] = (u8) FC_FCOE_OUI; | ||
109 | mac[3] = did[0]; | ||
110 | mac[4] = did[1]; | ||
111 | mac[5] = did[2]; | ||
112 | } | ||
113 | |||
114 | #endif /* _FC_FCOE_H_ */ | ||
diff --git a/include/scsi/fc/fc_fcp.h b/include/scsi/fc/fc_fcp.h new file mode 100644 index 000000000000..5d38f1989f37 --- /dev/null +++ b/include/scsi/fc/fc_fcp.h | |||
@@ -0,0 +1,199 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_FCP_H_ | ||
21 | #define _FC_FCP_H_ | ||
22 | |||
23 | /* | ||
24 | * Fibre Channel Protocol for SCSI. | ||
25 | * From T10 FCP-3, T10 project 1560-D Rev 4, Sept. 13, 2005. | ||
26 | */ | ||
27 | |||
28 | /* | ||
29 | * fc/fs.h defines FC_TYPE_FCP. | ||
30 | */ | ||
31 | |||
32 | /* | ||
33 | * Service parameter page parameters (word 3 bits) for Process Login. | ||
34 | */ | ||
35 | #define FCP_SPPF_TASK_RETRY_ID 0x0200 /* task retry ID requested */ | ||
36 | #define FCP_SPPF_RETRY 0x0100 /* retry supported */ | ||
37 | #define FCP_SPPF_CONF_COMPL 0x0080 /* confirmed completion allowed */ | ||
38 | #define FCP_SPPF_OVLY_ALLOW 0x0040 /* data overlay allowed */ | ||
39 | #define FCP_SPPF_INIT_FCN 0x0020 /* initiator function */ | ||
40 | #define FCP_SPPF_TARG_FCN 0x0010 /* target function */ | ||
41 | #define FCP_SPPF_RD_XRDY_DIS 0x0002 /* disable XFER_RDY for reads */ | ||
42 | #define FCP_SPPF_WR_XRDY_DIS 0x0001 /* disable XFER_RDY for writes */ | ||
43 | |||
44 | /* | ||
45 | * FCP_CMND IU Payload. | ||
46 | */ | ||
47 | struct fcp_cmnd { | ||
48 | __u8 fc_lun[8]; /* logical unit number */ | ||
49 | __u8 fc_cmdref; /* commmand reference number */ | ||
50 | __u8 fc_pri_ta; /* priority and task attribute */ | ||
51 | __u8 fc_tm_flags; /* task management flags */ | ||
52 | __u8 fc_flags; /* additional len & flags */ | ||
53 | __u8 fc_cdb[16]; /* base CDB */ | ||
54 | __be32 fc_dl; /* data length (must follow fc_cdb) */ | ||
55 | }; | ||
56 | |||
57 | #define FCP_CMND_LEN 32 /* expected length of structure */ | ||
58 | |||
59 | struct fcp_cmnd32 { | ||
60 | __u8 fc_lun[8]; /* logical unit number */ | ||
61 | __u8 fc_cmdref; /* commmand reference number */ | ||
62 | __u8 fc_pri_ta; /* priority and task attribute */ | ||
63 | __u8 fc_tm_flags; /* task management flags */ | ||
64 | __u8 fc_flags; /* additional len & flags */ | ||
65 | __u8 fc_cdb[32]; /* base CDB */ | ||
66 | __be32 fc_dl; /* data length (must follow fc_cdb) */ | ||
67 | }; | ||
68 | |||
69 | #define FCP_CMND32_LEN 48 /* expected length of structure */ | ||
70 | #define FCP_CMND32_ADD_LEN (16 / 4) /* Additional cdb length */ | ||
71 | |||
72 | /* | ||
73 | * fc_pri_ta. | ||
74 | */ | ||
75 | #define FCP_PTA_SIMPLE 0 /* simple task attribute */ | ||
76 | #define FCP_PTA_HEADQ 1 /* head of queue task attribute */ | ||
77 | #define FCP_PTA_ORDERED 2 /* ordered task attribute */ | ||
78 | #define FCP_PTA_ACA 4 /* auto. contigent allegiance */ | ||
79 | #define FCP_PRI_SHIFT 3 /* priority field starts in bit 3 */ | ||
80 | #define FCP_PRI_RESVD_MASK 0x80 /* reserved bits in priority field */ | ||
81 | |||
82 | /* | ||
83 | * fc_tm_flags - task management flags field. | ||
84 | */ | ||
85 | #define FCP_TMF_CLR_ACA 0x40 /* clear ACA condition */ | ||
86 | #define FCP_TMF_LUN_RESET 0x10 /* logical unit reset task management */ | ||
87 | #define FCP_TMF_CLR_TASK_SET 0x04 /* clear task set */ | ||
88 | #define FCP_TMF_ABT_TASK_SET 0x02 /* abort task set */ | ||
89 | |||
90 | /* | ||
91 | * fc_flags. | ||
92 | * Bits 7:2 are the additional FCP_CDB length / 4. | ||
93 | */ | ||
94 | #define FCP_CFL_LEN_MASK 0xfc /* mask for additional length */ | ||
95 | #define FCP_CFL_LEN_SHIFT 2 /* shift bits for additional length */ | ||
96 | #define FCP_CFL_RDDATA 0x02 /* read data */ | ||
97 | #define FCP_CFL_WRDATA 0x01 /* write data */ | ||
98 | |||
99 | /* | ||
100 | * FCP_TXRDY IU - transfer ready payload. | ||
101 | */ | ||
102 | struct fcp_txrdy { | ||
103 | __be32 ft_data_ro; /* data relative offset */ | ||
104 | __be32 ft_burst_len; /* burst length */ | ||
105 | __u8 _ft_resvd[4]; /* reserved */ | ||
106 | }; | ||
107 | |||
108 | #define FCP_TXRDY_LEN 12 /* expected length of structure */ | ||
109 | |||
110 | /* | ||
111 | * FCP_RESP IU - response payload. | ||
112 | * | ||
113 | * The response payload comes in three parts: the flags/status, the | ||
114 | * sense/response lengths and the sense data/response info section. | ||
115 | * | ||
116 | * From FCP3r04, note 6 of section 9.5.13: | ||
117 | * | ||
118 | * Some early implementations presented the FCP_RSP IU without the FCP_RESID, | ||
119 | * FCP_SNS_LEN, and FCP_RSP_LEN fields if the FCP_RESID_UNDER, FCP_RESID_OVER, | ||
120 | * FCP_SNS_LEN_VALID, and FCP_RSP_LEN_VALID bits were all set to zero. This | ||
121 | * non-standard behavior should be tolerated. | ||
122 | * | ||
123 | * All response frames will always contain the fcp_resp template. Some | ||
124 | * will also include the fcp_resp_len template. | ||
125 | */ | ||
126 | struct fcp_resp { | ||
127 | __u8 _fr_resvd[8]; /* reserved */ | ||
128 | __be16 fr_retry_delay; /* retry delay timer */ | ||
129 | __u8 fr_flags; /* flags */ | ||
130 | __u8 fr_status; /* SCSI status code */ | ||
131 | }; | ||
132 | |||
133 | #define FCP_RESP_LEN 12 /* expected length of structure */ | ||
134 | |||
135 | struct fcp_resp_ext { | ||
136 | __be32 fr_resid; /* Residual value */ | ||
137 | __be32 fr_sns_len; /* SCSI Sense length */ | ||
138 | __be32 fr_rsp_len; /* Response Info length */ | ||
139 | |||
140 | /* | ||
141 | * Optionally followed by RSP info and/or SNS info and/or | ||
142 | * bidirectional read residual length, if any. | ||
143 | */ | ||
144 | }; | ||
145 | |||
146 | #define FCP_RESP_EXT_LEN 12 /* expected length of the structure */ | ||
147 | |||
148 | struct fcp_resp_rsp_info { | ||
149 | __u8 _fr_resvd[3]; /* reserved */ | ||
150 | __u8 rsp_code; /* Response Info Code */ | ||
151 | __u8 _fr_resvd2[4]; /* reserved */ | ||
152 | }; | ||
153 | |||
154 | struct fcp_resp_with_ext { | ||
155 | struct fcp_resp resp; | ||
156 | struct fcp_resp_ext ext; | ||
157 | }; | ||
158 | |||
159 | #define FCP_RESP_WITH_EXT (FCP_RESP_LEN + FCP_RESP_EXT_LEN) | ||
160 | |||
161 | /* | ||
162 | * fr_flags. | ||
163 | */ | ||
164 | #define FCP_BIDI_RSP 0x80 /* bidirectional read response */ | ||
165 | #define FCP_BIDI_READ_UNDER 0x40 /* bidir. read less than requested */ | ||
166 | #define FCP_BIDI_READ_OVER 0x20 /* DL insufficient for full transfer */ | ||
167 | #define FCP_CONF_REQ 0x10 /* confirmation requested */ | ||
168 | #define FCP_RESID_UNDER 0x08 /* transfer shorter than expected */ | ||
169 | #define FCP_RESID_OVER 0x04 /* DL insufficient for full transfer */ | ||
170 | #define FCP_SNS_LEN_VAL 0x02 /* SNS_LEN field is valid */ | ||
171 | #define FCP_RSP_LEN_VAL 0x01 /* RSP_LEN field is valid */ | ||
172 | |||
173 | /* | ||
174 | * rsp_codes | ||
175 | */ | ||
176 | enum fcp_resp_rsp_codes { | ||
177 | FCP_TMF_CMPL = 0, | ||
178 | FCP_DATA_LEN_INVALID = 1, | ||
179 | FCP_CMND_FIELDS_INVALID = 2, | ||
180 | FCP_DATA_PARAM_MISMATCH = 3, | ||
181 | FCP_TMF_REJECTED = 4, | ||
182 | FCP_TMF_FAILED = 5, | ||
183 | FCP_TMF_INVALID_LUN = 9, | ||
184 | }; | ||
185 | |||
186 | /* | ||
187 | * FCP SRR Link Service request - Sequence Retransmission Request. | ||
188 | */ | ||
189 | struct fcp_srr { | ||
190 | __u8 srr_op; /* opcode ELS_SRR */ | ||
191 | __u8 srr_resvd[3]; /* opcode / reserved - must be zero */ | ||
192 | __be16 srr_ox_id; /* OX_ID of failed command */ | ||
193 | __be16 srr_rx_id; /* RX_ID of failed command */ | ||
194 | __be32 srr_rel_off; /* relative offset */ | ||
195 | __u8 srr_r_ctl; /* r_ctl for the information unit */ | ||
196 | __u8 srr_resvd2[3]; /* reserved */ | ||
197 | }; | ||
198 | |||
199 | #endif /* _FC_FCP_H_ */ | ||
diff --git a/include/scsi/fc/fc_fs.h b/include/scsi/fc/fc_fs.h new file mode 100644 index 000000000000..3e4801d2bdbb --- /dev/null +++ b/include/scsi/fc/fc_fs.h | |||
@@ -0,0 +1,340 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_FS_H_ | ||
21 | #define _FC_FS_H_ | ||
22 | |||
23 | /* | ||
24 | * Fibre Channel Framing and Signalling definitions. | ||
25 | * From T11 FC-FS-2 Rev 0.90 - 9 August 2005. | ||
26 | */ | ||
27 | |||
28 | /* | ||
29 | * Frame header | ||
30 | */ | ||
31 | struct fc_frame_header { | ||
32 | __u8 fh_r_ctl; /* routing control */ | ||
33 | __u8 fh_d_id[3]; /* Destination ID */ | ||
34 | |||
35 | __u8 fh_cs_ctl; /* class of service control / pri */ | ||
36 | __u8 fh_s_id[3]; /* Source ID */ | ||
37 | |||
38 | __u8 fh_type; /* see enum fc_fh_type below */ | ||
39 | __u8 fh_f_ctl[3]; /* frame control */ | ||
40 | |||
41 | __u8 fh_seq_id; /* sequence ID */ | ||
42 | __u8 fh_df_ctl; /* data field control */ | ||
43 | __be16 fh_seq_cnt; /* sequence count */ | ||
44 | |||
45 | __be16 fh_ox_id; /* originator exchange ID */ | ||
46 | __be16 fh_rx_id; /* responder exchange ID */ | ||
47 | __be32 fh_parm_offset; /* parameter or relative offset */ | ||
48 | }; | ||
49 | |||
50 | #define FC_FRAME_HEADER_LEN 24 /* expected length of structure */ | ||
51 | |||
52 | #define FC_MAX_PAYLOAD 2112U /* max payload length in bytes */ | ||
53 | #define FC_MIN_MAX_PAYLOAD 256U /* lower limit on max payload */ | ||
54 | |||
55 | #define FC_MAX_FRAME (FC_MAX_PAYLOAD + FC_FRAME_HEADER_LEN) | ||
56 | #define FC_MIN_MAX_FRAME (FC_MIN_MAX_PAYLOAD + FC_FRAME_HEADER_LEN) | ||
57 | |||
58 | /* | ||
59 | * fh_r_ctl - Routing control definitions. | ||
60 | */ | ||
61 | /* | ||
62 | * FC-4 device_data. | ||
63 | */ | ||
64 | enum fc_rctl { | ||
65 | FC_RCTL_DD_UNCAT = 0x00, /* uncategorized information */ | ||
66 | FC_RCTL_DD_SOL_DATA = 0x01, /* solicited data */ | ||
67 | FC_RCTL_DD_UNSOL_CTL = 0x02, /* unsolicited control */ | ||
68 | FC_RCTL_DD_SOL_CTL = 0x03, /* solicited control or reply */ | ||
69 | FC_RCTL_DD_UNSOL_DATA = 0x04, /* unsolicited data */ | ||
70 | FC_RCTL_DD_DATA_DESC = 0x05, /* data descriptor */ | ||
71 | FC_RCTL_DD_UNSOL_CMD = 0x06, /* unsolicited command */ | ||
72 | FC_RCTL_DD_CMD_STATUS = 0x07, /* command status */ | ||
73 | |||
74 | #define FC_RCTL_ILS_REQ FC_RCTL_DD_UNSOL_CTL /* ILS request */ | ||
75 | #define FC_RCTL_ILS_REP FC_RCTL_DD_SOL_CTL /* ILS reply */ | ||
76 | |||
77 | /* | ||
78 | * Extended Link_Data | ||
79 | */ | ||
80 | FC_RCTL_ELS_REQ = 0x22, /* extended link services request */ | ||
81 | FC_RCTL_ELS_REP = 0x23, /* extended link services reply */ | ||
82 | FC_RCTL_ELS4_REQ = 0x32, /* FC-4 ELS request */ | ||
83 | FC_RCTL_ELS4_REP = 0x33, /* FC-4 ELS reply */ | ||
84 | /* | ||
85 | * Optional Extended Headers | ||
86 | */ | ||
87 | FC_RCTL_VFTH = 0x50, /* virtual fabric tagging header */ | ||
88 | FC_RCTL_IFRH = 0x51, /* inter-fabric routing header */ | ||
89 | FC_RCTL_ENCH = 0x52, /* encapsulation header */ | ||
90 | /* | ||
91 | * Basic Link Services fh_r_ctl values. | ||
92 | */ | ||
93 | FC_RCTL_BA_NOP = 0x80, /* basic link service NOP */ | ||
94 | FC_RCTL_BA_ABTS = 0x81, /* basic link service abort */ | ||
95 | FC_RCTL_BA_RMC = 0x82, /* remove connection */ | ||
96 | FC_RCTL_BA_ACC = 0x84, /* basic accept */ | ||
97 | FC_RCTL_BA_RJT = 0x85, /* basic reject */ | ||
98 | FC_RCTL_BA_PRMT = 0x86, /* dedicated connection preempted */ | ||
99 | /* | ||
100 | * Link Control Information. | ||
101 | */ | ||
102 | FC_RCTL_ACK_1 = 0xc0, /* acknowledge_1 */ | ||
103 | FC_RCTL_ACK_0 = 0xc1, /* acknowledge_0 */ | ||
104 | FC_RCTL_P_RJT = 0xc2, /* port reject */ | ||
105 | FC_RCTL_F_RJT = 0xc3, /* fabric reject */ | ||
106 | FC_RCTL_P_BSY = 0xc4, /* port busy */ | ||
107 | FC_RCTL_F_BSY = 0xc5, /* fabric busy to data frame */ | ||
108 | FC_RCTL_F_BSYL = 0xc6, /* fabric busy to link control frame */ | ||
109 | FC_RCTL_LCR = 0xc7, /* link credit reset */ | ||
110 | FC_RCTL_END = 0xc9, /* end */ | ||
111 | }; | ||
112 | /* incomplete list of definitions */ | ||
113 | |||
114 | /* | ||
115 | * R_CTL names initializer. | ||
116 | * Please keep this matching the above definitions. | ||
117 | */ | ||
118 | #define FC_RCTL_NAMES_INIT { \ | ||
119 | [FC_RCTL_DD_UNCAT] = "uncat", \ | ||
120 | [FC_RCTL_DD_SOL_DATA] = "sol data", \ | ||
121 | [FC_RCTL_DD_UNSOL_CTL] = "unsol ctl", \ | ||
122 | [FC_RCTL_DD_SOL_CTL] = "sol ctl/reply", \ | ||
123 | [FC_RCTL_DD_UNSOL_DATA] = "unsol data", \ | ||
124 | [FC_RCTL_DD_DATA_DESC] = "data desc", \ | ||
125 | [FC_RCTL_DD_UNSOL_CMD] = "unsol cmd", \ | ||
126 | [FC_RCTL_DD_CMD_STATUS] = "cmd status", \ | ||
127 | [FC_RCTL_ELS_REQ] = "ELS req", \ | ||
128 | [FC_RCTL_ELS_REP] = "ELS rep", \ | ||
129 | [FC_RCTL_ELS4_REQ] = "FC-4 ELS req", \ | ||
130 | [FC_RCTL_ELS4_REP] = "FC-4 ELS rep", \ | ||
131 | [FC_RCTL_BA_NOP] = "BLS NOP", \ | ||
132 | [FC_RCTL_BA_ABTS] = "BLS abort", \ | ||
133 | [FC_RCTL_BA_RMC] = "BLS remove connection", \ | ||
134 | [FC_RCTL_BA_ACC] = "BLS accept", \ | ||
135 | [FC_RCTL_BA_RJT] = "BLS reject", \ | ||
136 | [FC_RCTL_BA_PRMT] = "BLS dedicated connection preempted", \ | ||
137 | [FC_RCTL_ACK_1] = "LC ACK_1", \ | ||
138 | [FC_RCTL_ACK_0] = "LC ACK_0", \ | ||
139 | [FC_RCTL_P_RJT] = "LC port reject", \ | ||
140 | [FC_RCTL_F_RJT] = "LC fabric reject", \ | ||
141 | [FC_RCTL_P_BSY] = "LC port busy", \ | ||
142 | [FC_RCTL_F_BSY] = "LC fabric busy to data frame", \ | ||
143 | [FC_RCTL_F_BSYL] = "LC fabric busy to link control frame",\ | ||
144 | [FC_RCTL_LCR] = "LC link credit reset", \ | ||
145 | [FC_RCTL_END] = "LC end", \ | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | * Well-known fabric addresses. | ||
150 | */ | ||
151 | enum fc_well_known_fid { | ||
152 | FC_FID_BCAST = 0xffffff, /* broadcast */ | ||
153 | FC_FID_FLOGI = 0xfffffe, /* fabric login */ | ||
154 | FC_FID_FCTRL = 0xfffffd, /* fabric controller */ | ||
155 | FC_FID_DIR_SERV = 0xfffffc, /* directory server */ | ||
156 | FC_FID_TIME_SERV = 0xfffffb, /* time server */ | ||
157 | FC_FID_MGMT_SERV = 0xfffffa, /* management server */ | ||
158 | FC_FID_QOS = 0xfffff9, /* QoS Facilitator */ | ||
159 | FC_FID_ALIASES = 0xfffff8, /* alias server (FC-PH2) */ | ||
160 | FC_FID_SEC_KEY = 0xfffff7, /* Security key dist. server */ | ||
161 | FC_FID_CLOCK = 0xfffff6, /* clock synch server */ | ||
162 | FC_FID_MCAST_SERV = 0xfffff5, /* multicast server */ | ||
163 | }; | ||
164 | |||
165 | #define FC_FID_WELL_KNOWN_MAX 0xffffff /* highest well-known fabric ID */ | ||
166 | #define FC_FID_WELL_KNOWN_BASE 0xfffff5 /* start of well-known fabric ID */ | ||
167 | |||
168 | /* | ||
169 | * Other well-known addresses, outside the above contiguous range. | ||
170 | */ | ||
171 | #define FC_FID_DOM_MGR 0xfffc00 /* domain manager base */ | ||
172 | |||
173 | /* | ||
174 | * Fabric ID bytes. | ||
175 | */ | ||
176 | #define FC_FID_DOMAIN 0 | ||
177 | #define FC_FID_PORT 1 | ||
178 | #define FC_FID_LINK 2 | ||
179 | |||
180 | /* | ||
181 | * fh_type codes | ||
182 | */ | ||
183 | enum fc_fh_type { | ||
184 | FC_TYPE_BLS = 0x00, /* basic link service */ | ||
185 | FC_TYPE_ELS = 0x01, /* extended link service */ | ||
186 | FC_TYPE_IP = 0x05, /* IP over FC, RFC 4338 */ | ||
187 | FC_TYPE_FCP = 0x08, /* SCSI FCP */ | ||
188 | FC_TYPE_CT = 0x20, /* Fibre Channel Services (FC-CT) */ | ||
189 | FC_TYPE_ILS = 0x22, /* internal link service */ | ||
190 | }; | ||
191 | |||
192 | /* | ||
193 | * FC_TYPE names initializer. | ||
194 | * Please keep this matching the above definitions. | ||
195 | */ | ||
196 | #define FC_TYPE_NAMES_INIT { \ | ||
197 | [FC_TYPE_BLS] = "BLS", \ | ||
198 | [FC_TYPE_ELS] = "ELS", \ | ||
199 | [FC_TYPE_IP] = "IP", \ | ||
200 | [FC_TYPE_FCP] = "FCP", \ | ||
201 | [FC_TYPE_CT] = "CT", \ | ||
202 | [FC_TYPE_ILS] = "ILS", \ | ||
203 | } | ||
204 | |||
205 | /* | ||
206 | * Exchange IDs. | ||
207 | */ | ||
208 | #define FC_XID_UNKNOWN 0xffff /* unknown exchange ID */ | ||
209 | #define FC_XID_MIN 0x0 /* supported min exchange ID */ | ||
210 | #define FC_XID_MAX 0xfffe /* supported max exchange ID */ | ||
211 | |||
212 | /* | ||
213 | * fh_f_ctl - Frame control flags. | ||
214 | */ | ||
215 | #define FC_FC_EX_CTX (1 << 23) /* sent by responder to exchange */ | ||
216 | #define FC_FC_SEQ_CTX (1 << 22) /* sent by responder to sequence */ | ||
217 | #define FC_FC_FIRST_SEQ (1 << 21) /* first sequence of this exchange */ | ||
218 | #define FC_FC_LAST_SEQ (1 << 20) /* last sequence of this exchange */ | ||
219 | #define FC_FC_END_SEQ (1 << 19) /* last frame of sequence */ | ||
220 | #define FC_FC_END_CONN (1 << 18) /* end of class 1 connection pending */ | ||
221 | #define FC_FC_RES_B17 (1 << 17) /* reserved */ | ||
222 | #define FC_FC_SEQ_INIT (1 << 16) /* transfer of sequence initiative */ | ||
223 | #define FC_FC_X_ID_REASS (1 << 15) /* exchange ID has been changed */ | ||
224 | #define FC_FC_X_ID_INVAL (1 << 14) /* exchange ID invalidated */ | ||
225 | |||
226 | #define FC_FC_ACK_1 (1 << 12) /* 13:12 = 1: ACK_1 expected */ | ||
227 | #define FC_FC_ACK_N (2 << 12) /* 13:12 = 2: ACK_N expected */ | ||
228 | #define FC_FC_ACK_0 (3 << 12) /* 13:12 = 3: ACK_0 expected */ | ||
229 | |||
230 | #define FC_FC_RES_B11 (1 << 11) /* reserved */ | ||
231 | #define FC_FC_RES_B10 (1 << 10) /* reserved */ | ||
232 | #define FC_FC_RETX_SEQ (1 << 9) /* retransmitted sequence */ | ||
233 | #define FC_FC_UNI_TX (1 << 8) /* unidirectional transmit (class 1) */ | ||
234 | #define FC_FC_CONT_SEQ(i) ((i) << 6) | ||
235 | #define FC_FC_ABT_SEQ(i) ((i) << 4) | ||
236 | #define FC_FC_REL_OFF (1 << 3) /* parameter is relative offset */ | ||
237 | #define FC_FC_RES2 (1 << 2) /* reserved */ | ||
238 | #define FC_FC_FILL(i) ((i) & 3) /* 1:0: bytes of trailing fill */ | ||
239 | |||
240 | /* | ||
241 | * BA_ACC payload. | ||
242 | */ | ||
243 | struct fc_ba_acc { | ||
244 | __u8 ba_seq_id_val; /* SEQ_ID validity */ | ||
245 | #define FC_BA_SEQ_ID_VAL 0x80 | ||
246 | __u8 ba_seq_id; /* SEQ_ID of seq last deliverable */ | ||
247 | __u8 ba_resvd[2]; /* reserved */ | ||
248 | __be16 ba_ox_id; /* OX_ID for aborted seq or exch */ | ||
249 | __be16 ba_rx_id; /* RX_ID for aborted seq or exch */ | ||
250 | __be16 ba_low_seq_cnt; /* low SEQ_CNT of aborted seq */ | ||
251 | __be16 ba_high_seq_cnt; /* high SEQ_CNT of aborted seq */ | ||
252 | }; | ||
253 | |||
254 | /* | ||
255 | * BA_RJT: Basic Reject payload. | ||
256 | */ | ||
257 | struct fc_ba_rjt { | ||
258 | __u8 br_resvd; /* reserved */ | ||
259 | __u8 br_reason; /* reason code */ | ||
260 | __u8 br_explan; /* reason explanation */ | ||
261 | __u8 br_vendor; /* vendor unique code */ | ||
262 | }; | ||
263 | |||
264 | /* | ||
265 | * BA_RJT reason codes. | ||
266 | * From FS-2. | ||
267 | */ | ||
268 | enum fc_ba_rjt_reason { | ||
269 | FC_BA_RJT_NONE = 0, /* in software this means no reject */ | ||
270 | FC_BA_RJT_INVL_CMD = 0x01, /* invalid command code */ | ||
271 | FC_BA_RJT_LOG_ERR = 0x03, /* logical error */ | ||
272 | FC_BA_RJT_LOG_BUSY = 0x05, /* logical busy */ | ||
273 | FC_BA_RJT_PROTO_ERR = 0x07, /* protocol error */ | ||
274 | FC_BA_RJT_UNABLE = 0x09, /* unable to perform request */ | ||
275 | FC_BA_RJT_VENDOR = 0xff, /* vendor-specific (see br_vendor) */ | ||
276 | }; | ||
277 | |||
278 | /* | ||
279 | * BA_RJT reason code explanations. | ||
280 | */ | ||
281 | enum fc_ba_rjt_explan { | ||
282 | FC_BA_RJT_EXP_NONE = 0x00, /* no additional expanation */ | ||
283 | FC_BA_RJT_INV_XID = 0x03, /* invalid OX_ID-RX_ID combination */ | ||
284 | FC_BA_RJT_ABT = 0x05, /* sequence aborted, no seq info */ | ||
285 | }; | ||
286 | |||
287 | /* | ||
288 | * P_RJT or F_RJT: Port Reject or Fabric Reject parameter field. | ||
289 | */ | ||
290 | struct fc_pf_rjt { | ||
291 | __u8 rj_action; /* reserved */ | ||
292 | __u8 rj_reason; /* reason code */ | ||
293 | __u8 rj_resvd; /* reserved */ | ||
294 | __u8 rj_vendor; /* vendor unique code */ | ||
295 | }; | ||
296 | |||
297 | /* | ||
298 | * P_RJT and F_RJT reject reason codes. | ||
299 | */ | ||
300 | enum fc_pf_rjt_reason { | ||
301 | FC_RJT_NONE = 0, /* non-reject (reserved by standard) */ | ||
302 | FC_RJT_INVL_DID = 0x01, /* invalid destination ID */ | ||
303 | FC_RJT_INVL_SID = 0x02, /* invalid source ID */ | ||
304 | FC_RJT_P_UNAV_T = 0x03, /* port unavailable, temporary */ | ||
305 | FC_RJT_P_UNAV = 0x04, /* port unavailable, permanent */ | ||
306 | FC_RJT_CLS_UNSUP = 0x05, /* class not supported */ | ||
307 | FC_RJT_DEL_USAGE = 0x06, /* delimiter usage error */ | ||
308 | FC_RJT_TYPE_UNSUP = 0x07, /* type not supported */ | ||
309 | FC_RJT_LINK_CTL = 0x08, /* invalid link control */ | ||
310 | FC_RJT_R_CTL = 0x09, /* invalid R_CTL field */ | ||
311 | FC_RJT_F_CTL = 0x0a, /* invalid F_CTL field */ | ||
312 | FC_RJT_OX_ID = 0x0b, /* invalid originator exchange ID */ | ||
313 | FC_RJT_RX_ID = 0x0c, /* invalid responder exchange ID */ | ||
314 | FC_RJT_SEQ_ID = 0x0d, /* invalid sequence ID */ | ||
315 | FC_RJT_DF_CTL = 0x0e, /* invalid DF_CTL field */ | ||
316 | FC_RJT_SEQ_CNT = 0x0f, /* invalid SEQ_CNT field */ | ||
317 | FC_RJT_PARAM = 0x10, /* invalid parameter field */ | ||
318 | FC_RJT_EXCH_ERR = 0x11, /* exchange error */ | ||
319 | FC_RJT_PROTO = 0x12, /* protocol error */ | ||
320 | FC_RJT_LEN = 0x13, /* incorrect length */ | ||
321 | FC_RJT_UNEXP_ACK = 0x14, /* unexpected ACK */ | ||
322 | FC_RJT_FAB_CLASS = 0x15, /* class unsupported by fabric entity */ | ||
323 | FC_RJT_LOGI_REQ = 0x16, /* login required */ | ||
324 | FC_RJT_SEQ_XS = 0x17, /* excessive sequences attempted */ | ||
325 | FC_RJT_EXCH_EST = 0x18, /* unable to establish exchange */ | ||
326 | FC_RJT_FAB_UNAV = 0x1a, /* fabric unavailable */ | ||
327 | FC_RJT_VC_ID = 0x1b, /* invalid VC_ID (class 4) */ | ||
328 | FC_RJT_CS_CTL = 0x1c, /* invalid CS_CTL field */ | ||
329 | FC_RJT_INSUF_RES = 0x1d, /* insuff. resources for VC (Class 4) */ | ||
330 | FC_RJT_INVL_CLS = 0x1f, /* invalid class of service */ | ||
331 | FC_RJT_PREEMT_RJT = 0x20, /* preemption request rejected */ | ||
332 | FC_RJT_PREEMT_DIS = 0x21, /* preemption not enabled */ | ||
333 | FC_RJT_MCAST_ERR = 0x22, /* multicast error */ | ||
334 | FC_RJT_MCAST_ET = 0x23, /* multicast error terminate */ | ||
335 | FC_RJT_PRLI_REQ = 0x24, /* process login required */ | ||
336 | FC_RJT_INVL_ATT = 0x25, /* invalid attachment */ | ||
337 | FC_RJT_VENDOR = 0xff, /* vendor specific reject */ | ||
338 | }; | ||
339 | |||
340 | #endif /* _FC_FS_H_ */ | ||
diff --git a/include/scsi/fc/fc_gs.h b/include/scsi/fc/fc_gs.h new file mode 100644 index 000000000000..ffab0272c65a --- /dev/null +++ b/include/scsi/fc/fc_gs.h | |||
@@ -0,0 +1,93 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_GS_H_ | ||
21 | #define _FC_GS_H_ | ||
22 | |||
23 | /* | ||
24 | * Fibre Channel Services - Common Transport. | ||
25 | * From T11.org FC-GS-2 Rev 5.3 November 1998. | ||
26 | */ | ||
27 | |||
28 | struct fc_ct_hdr { | ||
29 | __u8 ct_rev; /* revision */ | ||
30 | __u8 ct_in_id[3]; /* N_Port ID of original requestor */ | ||
31 | __u8 ct_fs_type; /* type of fibre channel service */ | ||
32 | __u8 ct_fs_subtype; /* subtype */ | ||
33 | __u8 ct_options; | ||
34 | __u8 _ct_resvd1; | ||
35 | __be16 ct_cmd; /* command / response code */ | ||
36 | __be16 ct_mr_size; /* maximum / residual size */ | ||
37 | __u8 _ct_resvd2; | ||
38 | __u8 ct_reason; /* reject reason */ | ||
39 | __u8 ct_explan; /* reason code explanation */ | ||
40 | __u8 ct_vendor; /* vendor unique data */ | ||
41 | }; | ||
42 | |||
43 | #define FC_CT_HDR_LEN 16 /* expected sizeof (struct fc_ct_hdr) */ | ||
44 | |||
45 | enum fc_ct_rev { | ||
46 | FC_CT_REV = 1 /* common transport revision */ | ||
47 | }; | ||
48 | |||
49 | /* | ||
50 | * ct_fs_type values. | ||
51 | */ | ||
52 | enum fc_ct_fs_type { | ||
53 | FC_FST_ALIAS = 0xf8, /* alias service */ | ||
54 | FC_FST_MGMT = 0xfa, /* management service */ | ||
55 | FC_FST_TIME = 0xfb, /* time service */ | ||
56 | FC_FST_DIR = 0xfc, /* directory service */ | ||
57 | }; | ||
58 | |||
59 | /* | ||
60 | * ct_cmd: Command / response codes | ||
61 | */ | ||
62 | enum fc_ct_cmd { | ||
63 | FC_FS_RJT = 0x8001, /* reject */ | ||
64 | FC_FS_ACC = 0x8002, /* accept */ | ||
65 | }; | ||
66 | |||
67 | /* | ||
68 | * FS_RJT reason codes. | ||
69 | */ | ||
70 | enum fc_ct_reason { | ||
71 | FC_FS_RJT_CMD = 0x01, /* invalid command code */ | ||
72 | FC_FS_RJT_VER = 0x02, /* invalid version level */ | ||
73 | FC_FS_RJT_LOG = 0x03, /* logical error */ | ||
74 | FC_FS_RJT_IUSIZ = 0x04, /* invalid IU size */ | ||
75 | FC_FS_RJT_BSY = 0x05, /* logical busy */ | ||
76 | FC_FS_RJT_PROTO = 0x07, /* protocol error */ | ||
77 | FC_FS_RJT_UNABL = 0x09, /* unable to perform command request */ | ||
78 | FC_FS_RJT_UNSUP = 0x0b, /* command not supported */ | ||
79 | }; | ||
80 | |||
81 | /* | ||
82 | * FS_RJT reason code explanations. | ||
83 | */ | ||
84 | enum fc_ct_explan { | ||
85 | FC_FS_EXP_NONE = 0x00, /* no additional explanation */ | ||
86 | FC_FS_EXP_PID = 0x01, /* port ID not registered */ | ||
87 | FC_FS_EXP_PNAM = 0x02, /* port name not registered */ | ||
88 | FC_FS_EXP_NNAM = 0x03, /* node name not registered */ | ||
89 | FC_FS_EXP_COS = 0x04, /* class of service not registered */ | ||
90 | /* definitions not complete */ | ||
91 | }; | ||
92 | |||
93 | #endif /* _FC_GS_H_ */ | ||
diff --git a/include/scsi/fc/fc_ns.h b/include/scsi/fc/fc_ns.h new file mode 100644 index 000000000000..790d7b97d4bc --- /dev/null +++ b/include/scsi/fc/fc_ns.h | |||
@@ -0,0 +1,159 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_NS_H_ | ||
21 | #define _FC_NS_H_ | ||
22 | |||
23 | /* | ||
24 | * Fibre Channel Services - Name Service (dNS) | ||
25 | * From T11.org FC-GS-2 Rev 5.3 November 1998. | ||
26 | */ | ||
27 | |||
28 | /* | ||
29 | * Common-transport sub-type for Name Server. | ||
30 | */ | ||
31 | #define FC_NS_SUBTYPE 2 /* fs_ct_hdr.ct_fs_subtype */ | ||
32 | |||
33 | /* | ||
34 | * Name server Requests. | ||
35 | * Note: this is an incomplete list, some unused requests are omitted. | ||
36 | */ | ||
37 | enum fc_ns_req { | ||
38 | FC_NS_GA_NXT = 0x0100, /* get all next */ | ||
39 | FC_NS_GI_A = 0x0101, /* get identifiers - scope */ | ||
40 | FC_NS_GPN_ID = 0x0112, /* get port name by ID */ | ||
41 | FC_NS_GNN_ID = 0x0113, /* get node name by ID */ | ||
42 | FC_NS_GID_PN = 0x0121, /* get ID for port name */ | ||
43 | FC_NS_GID_NN = 0x0131, /* get IDs for node name */ | ||
44 | FC_NS_GID_FT = 0x0171, /* get IDs by FC4 type */ | ||
45 | FC_NS_GPN_FT = 0x0172, /* get port names by FC4 type */ | ||
46 | FC_NS_GID_PT = 0x01a1, /* get IDs by port type */ | ||
47 | FC_NS_RFT_ID = 0x0217, /* reg FC4 type for ID */ | ||
48 | FC_NS_RPN_ID = 0x0212, /* reg port name for ID */ | ||
49 | FC_NS_RNN_ID = 0x0213, /* reg node name for ID */ | ||
50 | }; | ||
51 | |||
52 | /* | ||
53 | * Port type values. | ||
54 | */ | ||
55 | enum fc_ns_pt { | ||
56 | FC_NS_UNID_PORT = 0x00, /* unidentified */ | ||
57 | FC_NS_N_PORT = 0x01, /* N port */ | ||
58 | FC_NS_NL_PORT = 0x02, /* NL port */ | ||
59 | FC_NS_FNL_PORT = 0x03, /* F/NL port */ | ||
60 | FC_NS_NX_PORT = 0x7f, /* Nx port */ | ||
61 | FC_NS_F_PORT = 0x81, /* F port */ | ||
62 | FC_NS_FL_PORT = 0x82, /* FL port */ | ||
63 | FC_NS_E_PORT = 0x84, /* E port */ | ||
64 | FC_NS_B_PORT = 0x85, /* B port */ | ||
65 | }; | ||
66 | |||
67 | /* | ||
68 | * Port type object. | ||
69 | */ | ||
70 | struct fc_ns_pt_obj { | ||
71 | __u8 pt_type; | ||
72 | }; | ||
73 | |||
74 | /* | ||
75 | * Port ID object | ||
76 | */ | ||
77 | struct fc_ns_fid { | ||
78 | __u8 fp_flags; /* flags for responses only */ | ||
79 | __u8 fp_fid[3]; | ||
80 | }; | ||
81 | |||
82 | /* | ||
83 | * fp_flags in port ID object, for responses only. | ||
84 | */ | ||
85 | #define FC_NS_FID_LAST 0x80 /* last object */ | ||
86 | |||
87 | /* | ||
88 | * FC4-types object. | ||
89 | */ | ||
90 | #define FC_NS_TYPES 256 /* number of possible FC-4 types */ | ||
91 | #define FC_NS_BPW 32 /* bits per word in bitmap */ | ||
92 | |||
93 | struct fc_ns_fts { | ||
94 | __be32 ff_type_map[FC_NS_TYPES / FC_NS_BPW]; /* bitmap of FC-4 types */ | ||
95 | }; | ||
96 | |||
97 | /* | ||
98 | * GID_PT request. | ||
99 | */ | ||
100 | struct fc_ns_gid_pt { | ||
101 | __u8 fn_pt_type; | ||
102 | __u8 fn_domain_id_scope; | ||
103 | __u8 fn_area_id_scope; | ||
104 | __u8 fn_resvd; | ||
105 | }; | ||
106 | |||
107 | /* | ||
108 | * GID_FT or GPN_FT request. | ||
109 | */ | ||
110 | struct fc_ns_gid_ft { | ||
111 | __u8 fn_resvd; | ||
112 | __u8 fn_domain_id_scope; | ||
113 | __u8 fn_area_id_scope; | ||
114 | __u8 fn_fc4_type; | ||
115 | }; | ||
116 | |||
117 | /* | ||
118 | * GPN_FT response. | ||
119 | */ | ||
120 | struct fc_gpn_ft_resp { | ||
121 | __u8 fp_flags; /* see fp_flags definitions above */ | ||
122 | __u8 fp_fid[3]; /* port ID */ | ||
123 | __be32 fp_resvd; | ||
124 | __be64 fp_wwpn; /* port name */ | ||
125 | }; | ||
126 | |||
127 | /* | ||
128 | * GID_PN request | ||
129 | */ | ||
130 | struct fc_ns_gid_pn { | ||
131 | __be64 fn_wwpn; /* port name */ | ||
132 | }; | ||
133 | |||
134 | /* | ||
135 | * GID_PN response | ||
136 | */ | ||
137 | struct fc_gid_pn_resp { | ||
138 | __u8 fp_resvd; | ||
139 | __u8 fp_fid[3]; /* port ID */ | ||
140 | }; | ||
141 | |||
142 | /* | ||
143 | * RFT_ID request - register FC-4 types for ID. | ||
144 | */ | ||
145 | struct fc_ns_rft_id { | ||
146 | struct fc_ns_fid fr_fid; /* port ID object */ | ||
147 | struct fc_ns_fts fr_fts; /* FC-4 types object */ | ||
148 | }; | ||
149 | |||
150 | /* | ||
151 | * RPN_ID request - register port name for ID. | ||
152 | * RNN_ID request - register node name for ID. | ||
153 | */ | ||
154 | struct fc_ns_rn_id { | ||
155 | struct fc_ns_fid fr_fid; /* port ID object */ | ||
156 | __be64 fr_wwn; /* node name or port name */ | ||
157 | } __attribute__((__packed__)); | ||
158 | |||
159 | #endif /* _FC_NS_H_ */ | ||
diff --git a/include/scsi/fc_encode.h b/include/scsi/fc_encode.h new file mode 100644 index 000000000000..6300f556bce5 --- /dev/null +++ b/include/scsi/fc_encode.h | |||
@@ -0,0 +1,309 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2008 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_ENCODE_H_ | ||
21 | #define _FC_ENCODE_H_ | ||
22 | #include <asm/unaligned.h> | ||
23 | |||
24 | struct fc_ns_rft { | ||
25 | struct fc_ns_fid fid; /* port ID object */ | ||
26 | struct fc_ns_fts fts; /* FC4-types object */ | ||
27 | }; | ||
28 | |||
29 | struct fc_ct_req { | ||
30 | struct fc_ct_hdr hdr; | ||
31 | union { | ||
32 | struct fc_ns_gid_ft gid; | ||
33 | struct fc_ns_rn_id rn; | ||
34 | struct fc_ns_rft rft; | ||
35 | } payload; | ||
36 | }; | ||
37 | |||
38 | /** | ||
39 | * fill FC header fields in specified fc_frame | ||
40 | */ | ||
41 | static inline void fc_fill_fc_hdr(struct fc_frame *fp, enum fc_rctl r_ctl, | ||
42 | u32 did, u32 sid, enum fc_fh_type type, | ||
43 | u32 f_ctl, u32 parm_offset) | ||
44 | { | ||
45 | struct fc_frame_header *fh; | ||
46 | |||
47 | fh = fc_frame_header_get(fp); | ||
48 | WARN_ON(r_ctl == 0); | ||
49 | fh->fh_r_ctl = r_ctl; | ||
50 | hton24(fh->fh_d_id, did); | ||
51 | hton24(fh->fh_s_id, sid); | ||
52 | fh->fh_type = type; | ||
53 | hton24(fh->fh_f_ctl, f_ctl); | ||
54 | fh->fh_cs_ctl = 0; | ||
55 | fh->fh_df_ctl = 0; | ||
56 | fh->fh_parm_offset = htonl(parm_offset); | ||
57 | } | ||
58 | |||
59 | /** | ||
60 | * fc_ct_hdr_fill- fills ct header and reset ct payload | ||
61 | * returns pointer to ct request. | ||
62 | */ | ||
63 | static inline struct fc_ct_req *fc_ct_hdr_fill(const struct fc_frame *fp, | ||
64 | unsigned int op, size_t req_size) | ||
65 | { | ||
66 | struct fc_ct_req *ct; | ||
67 | size_t ct_plen; | ||
68 | |||
69 | ct_plen = sizeof(struct fc_ct_hdr) + req_size; | ||
70 | ct = fc_frame_payload_get(fp, ct_plen); | ||
71 | memset(ct, 0, ct_plen); | ||
72 | ct->hdr.ct_rev = FC_CT_REV; | ||
73 | ct->hdr.ct_fs_type = FC_FST_DIR; | ||
74 | ct->hdr.ct_fs_subtype = FC_NS_SUBTYPE; | ||
75 | ct->hdr.ct_cmd = htons((u16) op); | ||
76 | return ct; | ||
77 | } | ||
78 | |||
79 | /** | ||
80 | * fc_ct_fill - Fill in a name service request frame | ||
81 | */ | ||
82 | static inline int fc_ct_fill(struct fc_lport *lport, struct fc_frame *fp, | ||
83 | unsigned int op, enum fc_rctl *r_ctl, u32 *did, | ||
84 | enum fc_fh_type *fh_type) | ||
85 | { | ||
86 | struct fc_ct_req *ct; | ||
87 | |||
88 | switch (op) { | ||
89 | case FC_NS_GPN_FT: | ||
90 | ct = fc_ct_hdr_fill(fp, op, sizeof(struct fc_ns_gid_ft)); | ||
91 | ct->payload.gid.fn_fc4_type = FC_TYPE_FCP; | ||
92 | break; | ||
93 | |||
94 | case FC_NS_RFT_ID: | ||
95 | ct = fc_ct_hdr_fill(fp, op, sizeof(struct fc_ns_rft)); | ||
96 | hton24(ct->payload.rft.fid.fp_fid, | ||
97 | fc_host_port_id(lport->host)); | ||
98 | ct->payload.rft.fts = lport->fcts; | ||
99 | break; | ||
100 | |||
101 | case FC_NS_RPN_ID: | ||
102 | ct = fc_ct_hdr_fill(fp, op, sizeof(struct fc_ns_rn_id)); | ||
103 | hton24(ct->payload.rn.fr_fid.fp_fid, | ||
104 | fc_host_port_id(lport->host)); | ||
105 | ct->payload.rft.fts = lport->fcts; | ||
106 | put_unaligned_be64(lport->wwpn, &ct->payload.rn.fr_wwn); | ||
107 | break; | ||
108 | |||
109 | default: | ||
110 | FC_DBG("Invalid op code %x \n", op); | ||
111 | return -EINVAL; | ||
112 | } | ||
113 | *r_ctl = FC_RCTL_DD_UNSOL_CTL; | ||
114 | *did = FC_FID_DIR_SERV; | ||
115 | *fh_type = FC_TYPE_CT; | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | /** | ||
120 | * fc_plogi_fill - Fill in plogi request frame | ||
121 | */ | ||
122 | static inline void fc_plogi_fill(struct fc_lport *lport, struct fc_frame *fp, | ||
123 | unsigned int op) | ||
124 | { | ||
125 | struct fc_els_flogi *plogi; | ||
126 | struct fc_els_csp *csp; | ||
127 | struct fc_els_cssp *cp; | ||
128 | |||
129 | plogi = fc_frame_payload_get(fp, sizeof(*plogi)); | ||
130 | memset(plogi, 0, sizeof(*plogi)); | ||
131 | plogi->fl_cmd = (u8) op; | ||
132 | put_unaligned_be64(lport->wwpn, &plogi->fl_wwpn); | ||
133 | put_unaligned_be64(lport->wwnn, &plogi->fl_wwnn); | ||
134 | |||
135 | csp = &plogi->fl_csp; | ||
136 | csp->sp_hi_ver = 0x20; | ||
137 | csp->sp_lo_ver = 0x20; | ||
138 | csp->sp_bb_cred = htons(10); /* this gets set by gateway */ | ||
139 | csp->sp_bb_data = htons((u16) lport->mfs); | ||
140 | cp = &plogi->fl_cssp[3 - 1]; /* class 3 parameters */ | ||
141 | cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ); | ||
142 | csp->sp_features = htons(FC_SP_FT_CIRO); | ||
143 | csp->sp_tot_seq = htons(255); /* seq. we accept */ | ||
144 | csp->sp_rel_off = htons(0x1f); | ||
145 | csp->sp_e_d_tov = htonl(lport->e_d_tov); | ||
146 | |||
147 | cp->cp_rdfs = htons((u16) lport->mfs); | ||
148 | cp->cp_con_seq = htons(255); | ||
149 | cp->cp_open_seq = 1; | ||
150 | } | ||
151 | |||
152 | /** | ||
153 | * fc_flogi_fill - Fill in a flogi request frame. | ||
154 | */ | ||
155 | static inline void fc_flogi_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
156 | { | ||
157 | struct fc_els_csp *sp; | ||
158 | struct fc_els_cssp *cp; | ||
159 | struct fc_els_flogi *flogi; | ||
160 | |||
161 | flogi = fc_frame_payload_get(fp, sizeof(*flogi)); | ||
162 | memset(flogi, 0, sizeof(*flogi)); | ||
163 | flogi->fl_cmd = (u8) ELS_FLOGI; | ||
164 | put_unaligned_be64(lport->wwpn, &flogi->fl_wwpn); | ||
165 | put_unaligned_be64(lport->wwnn, &flogi->fl_wwnn); | ||
166 | sp = &flogi->fl_csp; | ||
167 | sp->sp_hi_ver = 0x20; | ||
168 | sp->sp_lo_ver = 0x20; | ||
169 | sp->sp_bb_cred = htons(10); /* this gets set by gateway */ | ||
170 | sp->sp_bb_data = htons((u16) lport->mfs); | ||
171 | cp = &flogi->fl_cssp[3 - 1]; /* class 3 parameters */ | ||
172 | cp->cp_class = htons(FC_CPC_VALID | FC_CPC_SEQ); | ||
173 | } | ||
174 | |||
175 | /** | ||
176 | * fc_logo_fill - Fill in a logo request frame. | ||
177 | */ | ||
178 | static inline void fc_logo_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
179 | { | ||
180 | struct fc_els_logo *logo; | ||
181 | |||
182 | logo = fc_frame_payload_get(fp, sizeof(*logo)); | ||
183 | memset(logo, 0, sizeof(*logo)); | ||
184 | logo->fl_cmd = ELS_LOGO; | ||
185 | hton24(logo->fl_n_port_id, fc_host_port_id(lport->host)); | ||
186 | logo->fl_n_port_wwn = htonll(lport->wwpn); | ||
187 | } | ||
188 | |||
189 | /** | ||
190 | * fc_rtv_fill - Fill in RTV (read timeout value) request frame. | ||
191 | */ | ||
192 | static inline void fc_rtv_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
193 | { | ||
194 | struct fc_els_rtv *rtv; | ||
195 | |||
196 | rtv = fc_frame_payload_get(fp, sizeof(*rtv)); | ||
197 | memset(rtv, 0, sizeof(*rtv)); | ||
198 | rtv->rtv_cmd = ELS_RTV; | ||
199 | } | ||
200 | |||
201 | /** | ||
202 | * fc_rec_fill - Fill in rec request frame | ||
203 | */ | ||
204 | static inline void fc_rec_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
205 | { | ||
206 | struct fc_els_rec *rec; | ||
207 | struct fc_exch *ep = fc_seq_exch(fr_seq(fp)); | ||
208 | |||
209 | rec = fc_frame_payload_get(fp, sizeof(*rec)); | ||
210 | memset(rec, 0, sizeof(*rec)); | ||
211 | rec->rec_cmd = ELS_REC; | ||
212 | hton24(rec->rec_s_id, fc_host_port_id(lport->host)); | ||
213 | rec->rec_ox_id = htons(ep->oxid); | ||
214 | rec->rec_rx_id = htons(ep->rxid); | ||
215 | } | ||
216 | |||
217 | /** | ||
218 | * fc_prli_fill - Fill in prli request frame | ||
219 | */ | ||
220 | static inline void fc_prli_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
221 | { | ||
222 | struct { | ||
223 | struct fc_els_prli prli; | ||
224 | struct fc_els_spp spp; | ||
225 | } *pp; | ||
226 | |||
227 | pp = fc_frame_payload_get(fp, sizeof(*pp)); | ||
228 | memset(pp, 0, sizeof(*pp)); | ||
229 | pp->prli.prli_cmd = ELS_PRLI; | ||
230 | pp->prli.prli_spp_len = sizeof(struct fc_els_spp); | ||
231 | pp->prli.prli_len = htons(sizeof(*pp)); | ||
232 | pp->spp.spp_type = FC_TYPE_FCP; | ||
233 | pp->spp.spp_flags = FC_SPP_EST_IMG_PAIR; | ||
234 | pp->spp.spp_params = htonl(lport->service_params); | ||
235 | } | ||
236 | |||
237 | /** | ||
238 | * fc_scr_fill - Fill in a scr request frame. | ||
239 | */ | ||
240 | static inline void fc_scr_fill(struct fc_lport *lport, struct fc_frame *fp) | ||
241 | { | ||
242 | struct fc_els_scr *scr; | ||
243 | |||
244 | scr = fc_frame_payload_get(fp, sizeof(*scr)); | ||
245 | memset(scr, 0, sizeof(*scr)); | ||
246 | scr->scr_cmd = ELS_SCR; | ||
247 | scr->scr_reg_func = ELS_SCRF_FULL; | ||
248 | } | ||
249 | |||
250 | /** | ||
251 | * fc_els_fill - Fill in an ELS request frame | ||
252 | */ | ||
253 | static inline int fc_els_fill(struct fc_lport *lport, struct fc_rport *rport, | ||
254 | struct fc_frame *fp, unsigned int op, | ||
255 | enum fc_rctl *r_ctl, u32 *did, enum fc_fh_type *fh_type) | ||
256 | { | ||
257 | switch (op) { | ||
258 | case ELS_PLOGI: | ||
259 | fc_plogi_fill(lport, fp, ELS_PLOGI); | ||
260 | *did = rport->port_id; | ||
261 | break; | ||
262 | |||
263 | case ELS_FLOGI: | ||
264 | fc_flogi_fill(lport, fp); | ||
265 | *did = FC_FID_FLOGI; | ||
266 | break; | ||
267 | |||
268 | case ELS_LOGO: | ||
269 | fc_logo_fill(lport, fp); | ||
270 | *did = FC_FID_FLOGI; | ||
271 | /* | ||
272 | * if rport is valid then it | ||
273 | * is port logo, therefore | ||
274 | * set did to rport id. | ||
275 | */ | ||
276 | if (rport) | ||
277 | *did = rport->port_id; | ||
278 | break; | ||
279 | |||
280 | case ELS_RTV: | ||
281 | fc_rtv_fill(lport, fp); | ||
282 | *did = rport->port_id; | ||
283 | break; | ||
284 | |||
285 | case ELS_REC: | ||
286 | fc_rec_fill(lport, fp); | ||
287 | *did = rport->port_id; | ||
288 | break; | ||
289 | |||
290 | case ELS_PRLI: | ||
291 | fc_prli_fill(lport, fp); | ||
292 | *did = rport->port_id; | ||
293 | break; | ||
294 | |||
295 | case ELS_SCR: | ||
296 | fc_scr_fill(lport, fp); | ||
297 | *did = FC_FID_FCTRL; | ||
298 | break; | ||
299 | |||
300 | default: | ||
301 | FC_DBG("Invalid op code %x \n", op); | ||
302 | return -EINVAL; | ||
303 | } | ||
304 | |||
305 | *r_ctl = FC_RCTL_ELS_REQ; | ||
306 | *fh_type = FC_TYPE_ELS; | ||
307 | return 0; | ||
308 | } | ||
309 | #endif /* _FC_ENCODE_H_ */ | ||
diff --git a/include/scsi/fc_frame.h b/include/scsi/fc_frame.h new file mode 100644 index 000000000000..04d34a71355f --- /dev/null +++ b/include/scsi/fc_frame.h | |||
@@ -0,0 +1,242 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _FC_FRAME_H_ | ||
21 | #define _FC_FRAME_H_ | ||
22 | |||
23 | #include <linux/scatterlist.h> | ||
24 | #include <linux/skbuff.h> | ||
25 | #include <scsi/scsi_cmnd.h> | ||
26 | |||
27 | #include <scsi/fc/fc_fs.h> | ||
28 | #include <scsi/fc/fc_fcp.h> | ||
29 | #include <scsi/fc/fc_encaps.h> | ||
30 | |||
31 | /* | ||
32 | * The fc_frame interface is used to pass frame data between functions. | ||
33 | * The frame includes the data buffer, length, and SOF / EOF delimiter types. | ||
34 | * A pointer to the port structure of the receiving port is also includeded. | ||
35 | */ | ||
36 | |||
37 | #define FC_FRAME_HEADROOM 32 /* headroom for VLAN + FCoE headers */ | ||
38 | #define FC_FRAME_TAILROOM 8 /* trailer space for FCoE */ | ||
39 | |||
40 | /* | ||
41 | * Information about an individual fibre channel frame received or to be sent. | ||
42 | * The buffer may be in up to 4 additional non-contiguous sections, | ||
43 | * but the linear section must hold the frame header. | ||
44 | */ | ||
45 | #define FC_FRAME_SG_LEN 4 /* scatter/gather list maximum length */ | ||
46 | |||
47 | #define fp_skb(fp) (&((fp)->skb)) | ||
48 | #define fr_hdr(fp) ((fp)->skb.data) | ||
49 | #define fr_len(fp) ((fp)->skb.len) | ||
50 | #define fr_cb(fp) ((struct fcoe_rcv_info *)&((fp)->skb.cb[0])) | ||
51 | #define fr_dev(fp) (fr_cb(fp)->fr_dev) | ||
52 | #define fr_seq(fp) (fr_cb(fp)->fr_seq) | ||
53 | #define fr_sof(fp) (fr_cb(fp)->fr_sof) | ||
54 | #define fr_eof(fp) (fr_cb(fp)->fr_eof) | ||
55 | #define fr_flags(fp) (fr_cb(fp)->fr_flags) | ||
56 | #define fr_max_payload(fp) (fr_cb(fp)->fr_max_payload) | ||
57 | #define fr_cmd(fp) (fr_cb(fp)->fr_cmd) | ||
58 | #define fr_dir(fp) (fr_cmd(fp)->sc_data_direction) | ||
59 | #define fr_crc(fp) (fr_cb(fp)->fr_crc) | ||
60 | |||
61 | struct fc_frame { | ||
62 | struct sk_buff skb; | ||
63 | }; | ||
64 | |||
65 | struct fcoe_rcv_info { | ||
66 | struct packet_type *ptype; | ||
67 | struct fc_lport *fr_dev; /* transport layer private pointer */ | ||
68 | struct fc_seq *fr_seq; /* for use with exchange manager */ | ||
69 | struct scsi_cmnd *fr_cmd; /* for use of scsi command */ | ||
70 | u32 fr_crc; | ||
71 | u16 fr_max_payload; /* max FC payload */ | ||
72 | enum fc_sof fr_sof; /* start of frame delimiter */ | ||
73 | enum fc_eof fr_eof; /* end of frame delimiter */ | ||
74 | u8 fr_flags; /* flags - see below */ | ||
75 | }; | ||
76 | |||
77 | |||
78 | /* | ||
79 | * Get fc_frame pointer for an skb that's already been imported. | ||
80 | */ | ||
81 | static inline struct fcoe_rcv_info *fcoe_dev_from_skb(const struct sk_buff *skb) | ||
82 | { | ||
83 | BUILD_BUG_ON(sizeof(struct fcoe_rcv_info) > sizeof(skb->cb)); | ||
84 | return (struct fcoe_rcv_info *) skb->cb; | ||
85 | } | ||
86 | |||
87 | /* | ||
88 | * fr_flags. | ||
89 | */ | ||
90 | #define FCPHF_CRC_UNCHECKED 0x01 /* CRC not computed, still appended */ | ||
91 | |||
92 | /* | ||
93 | * Initialize a frame. | ||
94 | * We don't do a complete memset here for performance reasons. | ||
95 | * The caller must set fr_free, fr_hdr, fr_len, fr_sof, and fr_eof eventually. | ||
96 | */ | ||
97 | static inline void fc_frame_init(struct fc_frame *fp) | ||
98 | { | ||
99 | fr_dev(fp) = NULL; | ||
100 | fr_seq(fp) = NULL; | ||
101 | fr_flags(fp) = 0; | ||
102 | } | ||
103 | |||
104 | struct fc_frame *fc_frame_alloc_fill(struct fc_lport *, size_t payload_len); | ||
105 | |||
106 | struct fc_frame *__fc_frame_alloc(size_t payload_len); | ||
107 | |||
108 | /* | ||
109 | * Get frame for sending via port. | ||
110 | */ | ||
111 | static inline struct fc_frame *_fc_frame_alloc(struct fc_lport *dev, | ||
112 | size_t payload_len) | ||
113 | { | ||
114 | return __fc_frame_alloc(payload_len); | ||
115 | } | ||
116 | |||
117 | /* | ||
118 | * Allocate fc_frame structure and buffer. Set the initial length to | ||
119 | * payload_size + sizeof (struct fc_frame_header). | ||
120 | */ | ||
121 | static inline struct fc_frame *fc_frame_alloc(struct fc_lport *dev, size_t len) | ||
122 | { | ||
123 | struct fc_frame *fp; | ||
124 | |||
125 | /* | ||
126 | * Note: Since len will often be a constant multiple of 4, | ||
127 | * this check will usually be evaluated and eliminated at compile time. | ||
128 | */ | ||
129 | if ((len % 4) != 0) | ||
130 | fp = fc_frame_alloc_fill(dev, len); | ||
131 | else | ||
132 | fp = _fc_frame_alloc(dev, len); | ||
133 | return fp; | ||
134 | } | ||
135 | |||
136 | /* | ||
137 | * Free the fc_frame structure and buffer. | ||
138 | */ | ||
139 | static inline void fc_frame_free(struct fc_frame *fp) | ||
140 | { | ||
141 | kfree_skb(fp_skb(fp)); | ||
142 | } | ||
143 | |||
144 | static inline int fc_frame_is_linear(struct fc_frame *fp) | ||
145 | { | ||
146 | return !skb_is_nonlinear(fp_skb(fp)); | ||
147 | } | ||
148 | |||
149 | /* | ||
150 | * Get frame header from message in fc_frame structure. | ||
151 | * This hides a cast and provides a place to add some checking. | ||
152 | */ | ||
153 | static inline | ||
154 | struct fc_frame_header *fc_frame_header_get(const struct fc_frame *fp) | ||
155 | { | ||
156 | WARN_ON(fr_len(fp) < sizeof(struct fc_frame_header)); | ||
157 | return (struct fc_frame_header *) fr_hdr(fp); | ||
158 | } | ||
159 | |||
160 | /* | ||
161 | * Get frame payload from message in fc_frame structure. | ||
162 | * This hides a cast and provides a place to add some checking. | ||
163 | * The len parameter is the minimum length for the payload portion. | ||
164 | * Returns NULL if the frame is too short. | ||
165 | * | ||
166 | * This assumes the interesting part of the payload is in the first part | ||
167 | * of the buffer for received data. This may not be appropriate to use for | ||
168 | * buffers being transmitted. | ||
169 | */ | ||
170 | static inline void *fc_frame_payload_get(const struct fc_frame *fp, | ||
171 | size_t len) | ||
172 | { | ||
173 | void *pp = NULL; | ||
174 | |||
175 | if (fr_len(fp) >= sizeof(struct fc_frame_header) + len) | ||
176 | pp = fc_frame_header_get(fp) + 1; | ||
177 | return pp; | ||
178 | } | ||
179 | |||
180 | /* | ||
181 | * Get frame payload opcode (first byte) from message in fc_frame structure. | ||
182 | * This hides a cast and provides a place to add some checking. Return 0 | ||
183 | * if the frame has no payload. | ||
184 | */ | ||
185 | static inline u8 fc_frame_payload_op(const struct fc_frame *fp) | ||
186 | { | ||
187 | u8 *cp; | ||
188 | |||
189 | cp = fc_frame_payload_get(fp, sizeof(u8)); | ||
190 | if (!cp) | ||
191 | return 0; | ||
192 | return *cp; | ||
193 | |||
194 | } | ||
195 | |||
196 | /* | ||
197 | * Get FC class from frame. | ||
198 | */ | ||
199 | static inline enum fc_class fc_frame_class(const struct fc_frame *fp) | ||
200 | { | ||
201 | return fc_sof_class(fr_sof(fp)); | ||
202 | } | ||
203 | |||
204 | /* | ||
205 | * Check the CRC in a frame. | ||
206 | * The CRC immediately follows the last data item *AFTER* the length. | ||
207 | * The return value is zero if the CRC matches. | ||
208 | */ | ||
209 | u32 fc_frame_crc_check(struct fc_frame *); | ||
210 | |||
211 | static inline u8 fc_frame_rctl(const struct fc_frame *fp) | ||
212 | { | ||
213 | return fc_frame_header_get(fp)->fh_r_ctl; | ||
214 | } | ||
215 | |||
216 | static inline bool fc_frame_is_cmd(const struct fc_frame *fp) | ||
217 | { | ||
218 | return fc_frame_rctl(fp) == FC_RCTL_DD_UNSOL_CMD; | ||
219 | } | ||
220 | |||
221 | static inline bool fc_frame_is_read(const struct fc_frame *fp) | ||
222 | { | ||
223 | if (fc_frame_is_cmd(fp) && fr_cmd(fp)) | ||
224 | return fr_dir(fp) == DMA_FROM_DEVICE; | ||
225 | return false; | ||
226 | } | ||
227 | |||
228 | static inline bool fc_frame_is_write(const struct fc_frame *fp) | ||
229 | { | ||
230 | if (fc_frame_is_cmd(fp) && fr_cmd(fp)) | ||
231 | return fr_dir(fp) == DMA_TO_DEVICE; | ||
232 | return false; | ||
233 | } | ||
234 | |||
235 | /* | ||
236 | * Check for leaks. | ||
237 | * Print the frame header of any currently allocated frame, assuming there | ||
238 | * should be none at this point. | ||
239 | */ | ||
240 | void fc_frame_leak_check(void); | ||
241 | |||
242 | #endif /* _FC_FRAME_H_ */ | ||
diff --git a/include/scsi/fc_transport_fcoe.h b/include/scsi/fc_transport_fcoe.h new file mode 100644 index 000000000000..8dca2af14ffc --- /dev/null +++ b/include/scsi/fc_transport_fcoe.h | |||
@@ -0,0 +1,54 @@ | |||
1 | #ifndef FC_TRANSPORT_FCOE_H | ||
2 | #define FC_TRANSPORT_FCOE_H | ||
3 | |||
4 | #include <linux/device.h> | ||
5 | #include <linux/netdevice.h> | ||
6 | #include <scsi/scsi_host.h> | ||
7 | #include <scsi/libfc.h> | ||
8 | |||
9 | /** | ||
10 | * struct fcoe_transport - FCoE transport struct for generic transport | ||
11 | * for Ethernet devices as well as pure HBAs | ||
12 | * | ||
13 | * @name: name for thsi transport | ||
14 | * @bus: physical bus type (pci_bus_type) | ||
15 | * @driver: physical bus driver for network device | ||
16 | * @create: entry create function | ||
17 | * @destroy: exit destroy function | ||
18 | * @list: list of transports | ||
19 | */ | ||
20 | struct fcoe_transport { | ||
21 | char *name; | ||
22 | unsigned short vendor; | ||
23 | unsigned short device; | ||
24 | struct bus_type *bus; | ||
25 | struct device_driver *driver; | ||
26 | int (*create)(struct net_device *device); | ||
27 | int (*destroy)(struct net_device *device); | ||
28 | bool (*match)(struct net_device *device); | ||
29 | struct list_head list; | ||
30 | struct list_head devlist; | ||
31 | struct mutex devlock; | ||
32 | }; | ||
33 | |||
34 | /** | ||
35 | * MODULE_ALIAS_FCOE_PCI | ||
36 | * | ||
37 | * some care must be taken with this, vendor and device MUST be a hex value | ||
38 | * preceded with 0x and with letters in lower case (0x12ab, not 0x12AB or 12AB) | ||
39 | */ | ||
40 | #define MODULE_ALIAS_FCOE_PCI(vendor, device) \ | ||
41 | MODULE_ALIAS("fcoe-pci-" __stringify(vendor) "-" __stringify(device)) | ||
42 | |||
43 | /* exported funcs */ | ||
44 | int fcoe_transport_attach(struct net_device *netdev); | ||
45 | int fcoe_transport_release(struct net_device *netdev); | ||
46 | int fcoe_transport_register(struct fcoe_transport *t); | ||
47 | int fcoe_transport_unregister(struct fcoe_transport *t); | ||
48 | int fcoe_load_transport_driver(struct net_device *netdev); | ||
49 | int __init fcoe_transport_init(void); | ||
50 | int __exit fcoe_transport_exit(void); | ||
51 | |||
52 | /* fcow_sw is the default transport */ | ||
53 | extern struct fcoe_transport fcoe_sw_transport; | ||
54 | #endif /* FC_TRANSPORT_FCOE_H */ | ||
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h index 0c9514de5df7..d0ed5226f8c4 100644 --- a/include/scsi/iscsi_if.h +++ b/include/scsi/iscsi_if.h | |||
@@ -333,8 +333,11 @@ enum iscsi_host_param { | |||
333 | #define CAP_TEXT_NEGO 0x80 | 333 | #define CAP_TEXT_NEGO 0x80 |
334 | #define CAP_MARKERS 0x100 | 334 | #define CAP_MARKERS 0x100 |
335 | #define CAP_FW_DB 0x200 | 335 | #define CAP_FW_DB 0x200 |
336 | #define CAP_SENDTARGETS_OFFLOAD 0x400 | 336 | #define CAP_SENDTARGETS_OFFLOAD 0x400 /* offload discovery process */ |
337 | #define CAP_DATA_PATH_OFFLOAD 0x800 | 337 | #define CAP_DATA_PATH_OFFLOAD 0x800 /* offload entire IO path */ |
338 | #define CAP_DIGEST_OFFLOAD 0x1000 /* offload hdr and data digests */ | ||
339 | #define CAP_PADDING_OFFLOAD 0x2000 /* offload padding insertion, removal, | ||
340 | and verification */ | ||
338 | 341 | ||
339 | /* | 342 | /* |
340 | * These flags describes reason of stop_conn() call | 343 | * These flags describes reason of stop_conn() call |
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h new file mode 100644 index 000000000000..9f2876397dda --- /dev/null +++ b/include/scsi/libfc.h | |||
@@ -0,0 +1,938 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _LIBFC_H_ | ||
21 | #define _LIBFC_H_ | ||
22 | |||
23 | #include <linux/timer.h> | ||
24 | #include <linux/if.h> | ||
25 | |||
26 | #include <scsi/scsi_transport.h> | ||
27 | #include <scsi/scsi_transport_fc.h> | ||
28 | |||
29 | #include <scsi/fc/fc_fcp.h> | ||
30 | #include <scsi/fc/fc_ns.h> | ||
31 | #include <scsi/fc/fc_els.h> | ||
32 | #include <scsi/fc/fc_gs.h> | ||
33 | |||
34 | #include <scsi/fc_frame.h> | ||
35 | |||
36 | #define LIBFC_DEBUG | ||
37 | |||
38 | #ifdef LIBFC_DEBUG | ||
39 | /* Log messages */ | ||
40 | #define FC_DBG(fmt, args...) \ | ||
41 | do { \ | ||
42 | printk(KERN_INFO "%s " fmt, __func__, ##args); \ | ||
43 | } while (0) | ||
44 | #else | ||
45 | #define FC_DBG(fmt, args...) | ||
46 | #endif | ||
47 | |||
48 | /* | ||
49 | * libfc error codes | ||
50 | */ | ||
51 | #define FC_NO_ERR 0 /* no error */ | ||
52 | #define FC_EX_TIMEOUT 1 /* Exchange timeout */ | ||
53 | #define FC_EX_CLOSED 2 /* Exchange closed */ | ||
54 | |||
55 | /* some helpful macros */ | ||
56 | |||
57 | #define ntohll(x) be64_to_cpu(x) | ||
58 | #define htonll(x) cpu_to_be64(x) | ||
59 | |||
60 | #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2])) | ||
61 | |||
62 | #define hton24(p, v) do { \ | ||
63 | p[0] = (((v) >> 16) & 0xFF); \ | ||
64 | p[1] = (((v) >> 8) & 0xFF); \ | ||
65 | p[2] = ((v) & 0xFF); \ | ||
66 | } while (0) | ||
67 | |||
68 | /* | ||
69 | * FC HBA status | ||
70 | */ | ||
71 | #define FC_PAUSE (1 << 1) | ||
72 | #define FC_LINK_UP (1 << 0) | ||
73 | |||
74 | enum fc_lport_state { | ||
75 | LPORT_ST_NONE = 0, | ||
76 | LPORT_ST_FLOGI, | ||
77 | LPORT_ST_DNS, | ||
78 | LPORT_ST_RPN_ID, | ||
79 | LPORT_ST_RFT_ID, | ||
80 | LPORT_ST_SCR, | ||
81 | LPORT_ST_READY, | ||
82 | LPORT_ST_LOGO, | ||
83 | LPORT_ST_RESET | ||
84 | }; | ||
85 | |||
86 | enum fc_disc_event { | ||
87 | DISC_EV_NONE = 0, | ||
88 | DISC_EV_SUCCESS, | ||
89 | DISC_EV_FAILED | ||
90 | }; | ||
91 | |||
92 | enum fc_rport_state { | ||
93 | RPORT_ST_NONE = 0, | ||
94 | RPORT_ST_INIT, /* initialized */ | ||
95 | RPORT_ST_PLOGI, /* waiting for PLOGI completion */ | ||
96 | RPORT_ST_PRLI, /* waiting for PRLI completion */ | ||
97 | RPORT_ST_RTV, /* waiting for RTV completion */ | ||
98 | RPORT_ST_READY, /* ready for use */ | ||
99 | RPORT_ST_LOGO, /* port logout sent */ | ||
100 | }; | ||
101 | |||
102 | enum fc_rport_trans_state { | ||
103 | FC_PORTSTATE_ROGUE, | ||
104 | FC_PORTSTATE_REAL, | ||
105 | }; | ||
106 | |||
107 | /** | ||
108 | * struct fc_disc_port - temporary discovery port to hold rport identifiers | ||
109 | * @lp: Fibre Channel host port instance | ||
110 | * @peers: node for list management during discovery and RSCN processing | ||
111 | * @ids: identifiers structure to pass to fc_remote_port_add() | ||
112 | * @rport_work: work struct for starting the rport state machine | ||
113 | */ | ||
114 | struct fc_disc_port { | ||
115 | struct fc_lport *lp; | ||
116 | struct list_head peers; | ||
117 | struct fc_rport_identifiers ids; | ||
118 | struct work_struct rport_work; | ||
119 | }; | ||
120 | |||
121 | enum fc_rport_event { | ||
122 | RPORT_EV_NONE = 0, | ||
123 | RPORT_EV_CREATED, | ||
124 | RPORT_EV_FAILED, | ||
125 | RPORT_EV_STOP, | ||
126 | RPORT_EV_LOGO | ||
127 | }; | ||
128 | |||
129 | struct fc_rport_operations { | ||
130 | void (*event_callback)(struct fc_lport *, struct fc_rport *, | ||
131 | enum fc_rport_event); | ||
132 | }; | ||
133 | |||
134 | /** | ||
135 | * struct fc_rport_libfc_priv - libfc internal information about a remote port | ||
136 | * @local_port: Fibre Channel host port instance | ||
137 | * @rp_state: state tracks progress of PLOGI, PRLI, and RTV exchanges | ||
138 | * @flags: REC and RETRY supported flags | ||
139 | * @max_seq: maximum number of concurrent sequences | ||
140 | * @retries: retry count in current state | ||
141 | * @e_d_tov: error detect timeout value (in msec) | ||
142 | * @r_a_tov: resource allocation timeout value (in msec) | ||
143 | * @rp_mutex: mutex protects rport | ||
144 | * @retry_work: | ||
145 | * @event_callback: Callback for rport READY, FAILED or LOGO | ||
146 | */ | ||
147 | struct fc_rport_libfc_priv { | ||
148 | struct fc_lport *local_port; | ||
149 | enum fc_rport_state rp_state; | ||
150 | u16 flags; | ||
151 | #define FC_RP_FLAGS_REC_SUPPORTED (1 << 0) | ||
152 | #define FC_RP_FLAGS_RETRY (1 << 1) | ||
153 | u16 max_seq; | ||
154 | unsigned int retries; | ||
155 | unsigned int e_d_tov; | ||
156 | unsigned int r_a_tov; | ||
157 | enum fc_rport_trans_state trans_state; | ||
158 | struct mutex rp_mutex; | ||
159 | struct delayed_work retry_work; | ||
160 | enum fc_rport_event event; | ||
161 | struct fc_rport_operations *ops; | ||
162 | struct list_head peers; | ||
163 | struct work_struct event_work; | ||
164 | }; | ||
165 | |||
166 | #define PRIV_TO_RPORT(x) \ | ||
167 | (struct fc_rport *)((void *)x - sizeof(struct fc_rport)); | ||
168 | #define RPORT_TO_PRIV(x) \ | ||
169 | (struct fc_rport_libfc_priv *)((void *)x + sizeof(struct fc_rport)); | ||
170 | |||
171 | struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *); | ||
172 | |||
173 | static inline void fc_rport_set_name(struct fc_rport *rport, u64 wwpn, u64 wwnn) | ||
174 | { | ||
175 | rport->node_name = wwnn; | ||
176 | rport->port_name = wwpn; | ||
177 | } | ||
178 | |||
179 | /* | ||
180 | * fcoe stats structure | ||
181 | */ | ||
182 | struct fcoe_dev_stats { | ||
183 | u64 SecondsSinceLastReset; | ||
184 | u64 TxFrames; | ||
185 | u64 TxWords; | ||
186 | u64 RxFrames; | ||
187 | u64 RxWords; | ||
188 | u64 ErrorFrames; | ||
189 | u64 DumpedFrames; | ||
190 | u64 LinkFailureCount; | ||
191 | u64 LossOfSignalCount; | ||
192 | u64 InvalidTxWordCount; | ||
193 | u64 InvalidCRCCount; | ||
194 | u64 InputRequests; | ||
195 | u64 OutputRequests; | ||
196 | u64 ControlRequests; | ||
197 | u64 InputMegabytes; | ||
198 | u64 OutputMegabytes; | ||
199 | }; | ||
200 | |||
201 | /* | ||
202 | * els data is used for passing ELS respone specific | ||
203 | * data to send ELS response mainly using infomation | ||
204 | * in exchange and sequence in EM layer. | ||
205 | */ | ||
206 | struct fc_seq_els_data { | ||
207 | struct fc_frame *fp; | ||
208 | enum fc_els_rjt_reason reason; | ||
209 | enum fc_els_rjt_explan explan; | ||
210 | }; | ||
211 | |||
212 | /* | ||
213 | * FCP request structure, one for each scsi cmd request | ||
214 | */ | ||
215 | struct fc_fcp_pkt { | ||
216 | /* | ||
217 | * housekeeping stuff | ||
218 | */ | ||
219 | struct fc_lport *lp; /* handle to hba struct */ | ||
220 | u16 state; /* scsi_pkt state state */ | ||
221 | u16 tgt_flags; /* target flags */ | ||
222 | atomic_t ref_cnt; /* fcp pkt ref count */ | ||
223 | spinlock_t scsi_pkt_lock; /* Must be taken before the host lock | ||
224 | * if both are held at the same time */ | ||
225 | /* | ||
226 | * SCSI I/O related stuff | ||
227 | */ | ||
228 | struct scsi_cmnd *cmd; /* scsi command pointer. set/clear | ||
229 | * under host lock */ | ||
230 | struct list_head list; /* tracks queued commands. access under | ||
231 | * host lock */ | ||
232 | /* | ||
233 | * timeout related stuff | ||
234 | */ | ||
235 | struct timer_list timer; /* command timer */ | ||
236 | struct completion tm_done; | ||
237 | int wait_for_comp; | ||
238 | unsigned long start_time; /* start jiffie */ | ||
239 | unsigned long end_time; /* end jiffie */ | ||
240 | unsigned long last_pkt_time; /* jiffies of last frame received */ | ||
241 | |||
242 | /* | ||
243 | * scsi cmd and data transfer information | ||
244 | */ | ||
245 | u32 data_len; | ||
246 | /* | ||
247 | * transport related veriables | ||
248 | */ | ||
249 | struct fcp_cmnd cdb_cmd; | ||
250 | size_t xfer_len; | ||
251 | u32 xfer_contig_end; /* offset of end of contiguous xfer */ | ||
252 | u16 max_payload; /* max payload size in bytes */ | ||
253 | |||
254 | /* | ||
255 | * scsi/fcp return status | ||
256 | */ | ||
257 | u32 io_status; /* SCSI result upper 24 bits */ | ||
258 | u8 cdb_status; | ||
259 | u8 status_code; /* FCP I/O status */ | ||
260 | /* bit 3 Underrun bit 2: overrun */ | ||
261 | u8 scsi_comp_flags; | ||
262 | u32 req_flags; /* bit 0: read bit:1 write */ | ||
263 | u32 scsi_resid; /* residule length */ | ||
264 | |||
265 | struct fc_rport *rport; /* remote port pointer */ | ||
266 | struct fc_seq *seq_ptr; /* current sequence pointer */ | ||
267 | /* | ||
268 | * Error Processing | ||
269 | */ | ||
270 | u8 recov_retry; /* count of recovery retries */ | ||
271 | struct fc_seq *recov_seq; /* sequence for REC or SRR */ | ||
272 | }; | ||
273 | |||
274 | /* | ||
275 | * Structure and function definitions for managing Fibre Channel Exchanges | ||
276 | * and Sequences | ||
277 | * | ||
278 | * fc_exch holds state for one exchange and links to its active sequence. | ||
279 | * | ||
280 | * fc_seq holds the state for an individual sequence. | ||
281 | */ | ||
282 | |||
283 | struct fc_exch_mgr; | ||
284 | |||
285 | /* | ||
286 | * Sequence. | ||
287 | */ | ||
288 | struct fc_seq { | ||
289 | u8 id; /* seq ID */ | ||
290 | u16 ssb_stat; /* status flags for sequence status block */ | ||
291 | u16 cnt; /* frames sent so far on sequence */ | ||
292 | u32 rec_data; /* FC-4 value for REC */ | ||
293 | }; | ||
294 | |||
295 | #define FC_EX_DONE (1 << 0) /* ep is completed */ | ||
296 | #define FC_EX_RST_CLEANUP (1 << 1) /* reset is forcing completion */ | ||
297 | |||
298 | /* | ||
299 | * Exchange. | ||
300 | * | ||
301 | * Locking notes: The ex_lock protects following items: | ||
302 | * state, esb_stat, f_ctl, seq.ssb_stat | ||
303 | * seq_id | ||
304 | * sequence allocation | ||
305 | */ | ||
306 | struct fc_exch { | ||
307 | struct fc_exch_mgr *em; /* exchange manager */ | ||
308 | u32 state; /* internal driver state */ | ||
309 | u16 xid; /* our exchange ID */ | ||
310 | struct list_head ex_list; /* free or busy list linkage */ | ||
311 | spinlock_t ex_lock; /* lock covering exchange state */ | ||
312 | atomic_t ex_refcnt; /* reference counter */ | ||
313 | struct delayed_work timeout_work; /* timer for upper level protocols */ | ||
314 | struct fc_lport *lp; /* fc device instance */ | ||
315 | u16 oxid; /* originator's exchange ID */ | ||
316 | u16 rxid; /* responder's exchange ID */ | ||
317 | u32 oid; /* originator's FCID */ | ||
318 | u32 sid; /* source FCID */ | ||
319 | u32 did; /* destination FCID */ | ||
320 | u32 esb_stat; /* exchange status for ESB */ | ||
321 | u32 r_a_tov; /* r_a_tov from rport (msec) */ | ||
322 | u8 seq_id; /* next sequence ID to use */ | ||
323 | u32 f_ctl; /* F_CTL flags for sequences */ | ||
324 | u8 fh_type; /* frame type */ | ||
325 | enum fc_class class; /* class of service */ | ||
326 | struct fc_seq seq; /* single sequence */ | ||
327 | /* | ||
328 | * Handler for responses to this current exchange. | ||
329 | */ | ||
330 | void (*resp)(struct fc_seq *, struct fc_frame *, void *); | ||
331 | void (*destructor)(struct fc_seq *, void *); | ||
332 | /* | ||
333 | * arg is passed as void pointer to exchange | ||
334 | * resp and destructor handlers | ||
335 | */ | ||
336 | void *arg; | ||
337 | }; | ||
338 | #define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq) | ||
339 | |||
340 | struct libfc_function_template { | ||
341 | |||
342 | /** | ||
343 | * Mandatory Fields | ||
344 | * | ||
345 | * These handlers must be implemented by the LLD. | ||
346 | */ | ||
347 | |||
348 | /* | ||
349 | * Interface to send a FC frame | ||
350 | */ | ||
351 | int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp); | ||
352 | |||
353 | /** | ||
354 | * Optional Fields | ||
355 | * | ||
356 | * The LLD may choose to implement any of the following handlers. | ||
357 | * If LLD doesn't specify hander and leaves its pointer NULL then | ||
358 | * the default libfc function will be used for that handler. | ||
359 | */ | ||
360 | |||
361 | /** | ||
362 | * ELS/CT interfaces | ||
363 | */ | ||
364 | |||
365 | /* | ||
366 | * elsct_send - sends ELS/CT frame | ||
367 | */ | ||
368 | struct fc_seq *(*elsct_send)(struct fc_lport *lport, | ||
369 | struct fc_rport *rport, | ||
370 | struct fc_frame *fp, | ||
371 | unsigned int op, | ||
372 | void (*resp)(struct fc_seq *, | ||
373 | struct fc_frame *fp, | ||
374 | void *arg), | ||
375 | void *arg, u32 timer_msec); | ||
376 | /** | ||
377 | * Exhance Manager interfaces | ||
378 | */ | ||
379 | |||
380 | /* | ||
381 | * Send the FC frame payload using a new exchange and sequence. | ||
382 | * | ||
383 | * The frame pointer with some of the header's fields must be | ||
384 | * filled before calling exch_seq_send(), those fields are, | ||
385 | * | ||
386 | * - routing control | ||
387 | * - FC port did | ||
388 | * - FC port sid | ||
389 | * - FC header type | ||
390 | * - frame control | ||
391 | * - parameter or relative offset | ||
392 | * | ||
393 | * The exchange response handler is set in this routine to resp() | ||
394 | * function pointer. It can be called in two scenarios: if a timeout | ||
395 | * occurs or if a response frame is received for the exchange. The | ||
396 | * fc_frame pointer in response handler will also indicate timeout | ||
397 | * as error using IS_ERR related macros. | ||
398 | * | ||
399 | * The exchange destructor handler is also set in this routine. | ||
400 | * The destructor handler is invoked by EM layer when exchange | ||
401 | * is about to free, this can be used by caller to free its | ||
402 | * resources along with exchange free. | ||
403 | * | ||
404 | * The arg is passed back to resp and destructor handler. | ||
405 | * | ||
406 | * The timeout value (in msec) for an exchange is set if non zero | ||
407 | * timer_msec argument is specified. The timer is canceled when | ||
408 | * it fires or when the exchange is done. The exchange timeout handler | ||
409 | * is registered by EM layer. | ||
410 | */ | ||
411 | struct fc_seq *(*exch_seq_send)(struct fc_lport *lp, | ||
412 | struct fc_frame *fp, | ||
413 | void (*resp)(struct fc_seq *sp, | ||
414 | struct fc_frame *fp, | ||
415 | void *arg), | ||
416 | void (*destructor)(struct fc_seq *sp, | ||
417 | void *arg), | ||
418 | void *arg, unsigned int timer_msec); | ||
419 | |||
420 | /* | ||
421 | * send a frame using existing sequence and exchange. | ||
422 | */ | ||
423 | int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp, | ||
424 | struct fc_frame *fp); | ||
425 | |||
426 | /* | ||
427 | * Send ELS response using mainly infomation | ||
428 | * in exchange and sequence in EM layer. | ||
429 | */ | ||
430 | void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd, | ||
431 | struct fc_seq_els_data *els_data); | ||
432 | |||
433 | /* | ||
434 | * Abort an exchange and sequence. Generally called because of a | ||
435 | * exchange timeout or an abort from the upper layer. | ||
436 | * | ||
437 | * A timer_msec can be specified for abort timeout, if non-zero | ||
438 | * timer_msec value is specified then exchange resp handler | ||
439 | * will be called with timeout error if no response to abort. | ||
440 | */ | ||
441 | int (*seq_exch_abort)(const struct fc_seq *req_sp, | ||
442 | unsigned int timer_msec); | ||
443 | |||
444 | /* | ||
445 | * Indicate that an exchange/sequence tuple is complete and the memory | ||
446 | * allocated for the related objects may be freed. | ||
447 | */ | ||
448 | void (*exch_done)(struct fc_seq *sp); | ||
449 | |||
450 | /* | ||
451 | * Assigns a EM and a free XID for an new exchange and then | ||
452 | * allocates a new exchange and sequence pair. | ||
453 | * The fp can be used to determine free XID. | ||
454 | */ | ||
455 | struct fc_exch *(*exch_get)(struct fc_lport *lp, struct fc_frame *fp); | ||
456 | |||
457 | /* | ||
458 | * Release previously assigned XID by exch_get API. | ||
459 | * The LLD may implement this if XID is assigned by LLD | ||
460 | * in exch_get(). | ||
461 | */ | ||
462 | void (*exch_put)(struct fc_lport *lp, struct fc_exch_mgr *mp, | ||
463 | u16 ex_id); | ||
464 | |||
465 | /* | ||
466 | * Start a new sequence on the same exchange/sequence tuple. | ||
467 | */ | ||
468 | struct fc_seq *(*seq_start_next)(struct fc_seq *sp); | ||
469 | |||
470 | /* | ||
471 | * Reset an exchange manager, completing all sequences and exchanges. | ||
472 | * If s_id is non-zero, reset only exchanges originating from that FID. | ||
473 | * If d_id is non-zero, reset only exchanges sending to that FID. | ||
474 | */ | ||
475 | void (*exch_mgr_reset)(struct fc_exch_mgr *, | ||
476 | u32 s_id, u32 d_id); | ||
477 | |||
478 | void (*rport_flush_queue)(void); | ||
479 | /** | ||
480 | * Local Port interfaces | ||
481 | */ | ||
482 | |||
483 | /* | ||
484 | * Receive a frame to a local port. | ||
485 | */ | ||
486 | void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp, | ||
487 | struct fc_frame *fp); | ||
488 | |||
489 | int (*lport_reset)(struct fc_lport *); | ||
490 | |||
491 | /** | ||
492 | * Remote Port interfaces | ||
493 | */ | ||
494 | |||
495 | /* | ||
496 | * Initiates the RP state machine. It is called from the LP module. | ||
497 | * This function will issue the following commands to the N_Port | ||
498 | * identified by the FC ID provided. | ||
499 | * | ||
500 | * - PLOGI | ||
501 | * - PRLI | ||
502 | * - RTV | ||
503 | */ | ||
504 | int (*rport_login)(struct fc_rport *rport); | ||
505 | |||
506 | /* | ||
507 | * Logoff, and remove the rport from the transport if | ||
508 | * it had been added. This will send a LOGO to the target. | ||
509 | */ | ||
510 | int (*rport_logoff)(struct fc_rport *rport); | ||
511 | |||
512 | /* | ||
513 | * Recieve a request from a remote port. | ||
514 | */ | ||
515 | void (*rport_recv_req)(struct fc_seq *, struct fc_frame *, | ||
516 | struct fc_rport *); | ||
517 | |||
518 | struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32); | ||
519 | |||
520 | /** | ||
521 | * FCP interfaces | ||
522 | */ | ||
523 | |||
524 | /* | ||
525 | * Send a fcp cmd from fsp pkt. | ||
526 | * Called with the SCSI host lock unlocked and irqs disabled. | ||
527 | * | ||
528 | * The resp handler is called when FCP_RSP received. | ||
529 | * | ||
530 | */ | ||
531 | int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp, | ||
532 | void (*resp)(struct fc_seq *, struct fc_frame *fp, | ||
533 | void *arg)); | ||
534 | |||
535 | /* | ||
536 | * Used at least durring linkdown and reset | ||
537 | */ | ||
538 | void (*fcp_cleanup)(struct fc_lport *lp); | ||
539 | |||
540 | /* | ||
541 | * Abort all I/O on a local port | ||
542 | */ | ||
543 | void (*fcp_abort_io)(struct fc_lport *lp); | ||
544 | |||
545 | /** | ||
546 | * Discovery interfaces | ||
547 | */ | ||
548 | |||
549 | void (*disc_recv_req)(struct fc_seq *, | ||
550 | struct fc_frame *, struct fc_lport *); | ||
551 | |||
552 | /* | ||
553 | * Start discovery for a local port. | ||
554 | */ | ||
555 | void (*disc_start)(void (*disc_callback)(struct fc_lport *, | ||
556 | enum fc_disc_event), | ||
557 | struct fc_lport *); | ||
558 | |||
559 | /* | ||
560 | * Stop discovery for a given lport. This will remove | ||
561 | * all discovered rports | ||
562 | */ | ||
563 | void (*disc_stop) (struct fc_lport *); | ||
564 | |||
565 | /* | ||
566 | * Stop discovery for a given lport. This will block | ||
567 | * until all discovered rports are deleted from the | ||
568 | * FC transport class | ||
569 | */ | ||
570 | void (*disc_stop_final) (struct fc_lport *); | ||
571 | }; | ||
572 | |||
573 | /* information used by the discovery layer */ | ||
574 | struct fc_disc { | ||
575 | unsigned char retry_count; | ||
576 | unsigned char delay; | ||
577 | unsigned char pending; | ||
578 | unsigned char requested; | ||
579 | unsigned short seq_count; | ||
580 | unsigned char buf_len; | ||
581 | enum fc_disc_event event; | ||
582 | |||
583 | void (*disc_callback)(struct fc_lport *, | ||
584 | enum fc_disc_event); | ||
585 | |||
586 | struct list_head rports; | ||
587 | struct fc_lport *lport; | ||
588 | struct mutex disc_mutex; | ||
589 | struct fc_gpn_ft_resp partial_buf; /* partial name buffer */ | ||
590 | struct delayed_work disc_work; | ||
591 | }; | ||
592 | |||
593 | struct fc_lport { | ||
594 | struct list_head list; | ||
595 | |||
596 | /* Associations */ | ||
597 | struct Scsi_Host *host; | ||
598 | struct fc_exch_mgr *emp; | ||
599 | struct fc_rport *dns_rp; | ||
600 | struct fc_rport *ptp_rp; | ||
601 | void *scsi_priv; | ||
602 | struct fc_disc disc; | ||
603 | |||
604 | /* Operational Information */ | ||
605 | struct libfc_function_template tt; | ||
606 | u16 link_status; | ||
607 | enum fc_lport_state state; | ||
608 | unsigned long boot_time; | ||
609 | |||
610 | struct fc_host_statistics host_stats; | ||
611 | struct fcoe_dev_stats *dev_stats[NR_CPUS]; | ||
612 | u64 wwpn; | ||
613 | u64 wwnn; | ||
614 | u8 retry_count; | ||
615 | |||
616 | /* Capabilities */ | ||
617 | u32 sg_supp:1; /* scatter gather supported */ | ||
618 | u32 seq_offload:1; /* seq offload supported */ | ||
619 | u32 crc_offload:1; /* crc offload supported */ | ||
620 | u32 lro_enabled:1; /* large receive offload */ | ||
621 | u32 mfs; /* max FC payload size */ | ||
622 | unsigned int service_params; | ||
623 | unsigned int e_d_tov; | ||
624 | unsigned int r_a_tov; | ||
625 | u8 max_retry_count; | ||
626 | u16 link_speed; | ||
627 | u16 link_supported_speeds; | ||
628 | u16 lro_xid; /* max xid for fcoe lro */ | ||
629 | struct fc_ns_fts fcts; /* FC-4 type masks */ | ||
630 | struct fc_els_rnid_gen rnid_gen; /* RNID information */ | ||
631 | |||
632 | /* Semaphores */ | ||
633 | struct mutex lp_mutex; | ||
634 | |||
635 | /* Miscellaneous */ | ||
636 | struct delayed_work retry_work; | ||
637 | struct delayed_work disc_work; | ||
638 | }; | ||
639 | |||
640 | /** | ||
641 | * FC_LPORT HELPER FUNCTIONS | ||
642 | *****************************/ | ||
643 | static inline void *lport_priv(const struct fc_lport *lp) | ||
644 | { | ||
645 | return (void *)(lp + 1); | ||
646 | } | ||
647 | |||
648 | static inline int fc_lport_test_ready(struct fc_lport *lp) | ||
649 | { | ||
650 | return lp->state == LPORT_ST_READY; | ||
651 | } | ||
652 | |||
653 | static inline void fc_set_wwnn(struct fc_lport *lp, u64 wwnn) | ||
654 | { | ||
655 | lp->wwnn = wwnn; | ||
656 | } | ||
657 | |||
658 | static inline void fc_set_wwpn(struct fc_lport *lp, u64 wwnn) | ||
659 | { | ||
660 | lp->wwpn = wwnn; | ||
661 | } | ||
662 | |||
663 | static inline void fc_lport_state_enter(struct fc_lport *lp, | ||
664 | enum fc_lport_state state) | ||
665 | { | ||
666 | if (state != lp->state) | ||
667 | lp->retry_count = 0; | ||
668 | lp->state = state; | ||
669 | } | ||
670 | |||
671 | |||
672 | /** | ||
673 | * LOCAL PORT LAYER | ||
674 | *****************************/ | ||
675 | int fc_lport_init(struct fc_lport *lp); | ||
676 | |||
677 | /* | ||
678 | * Destroy the specified local port by finding and freeing all | ||
679 | * fc_rports associated with it and then by freeing the fc_lport | ||
680 | * itself. | ||
681 | */ | ||
682 | int fc_lport_destroy(struct fc_lport *lp); | ||
683 | |||
684 | /* | ||
685 | * Logout the specified local port from the fabric | ||
686 | */ | ||
687 | int fc_fabric_logoff(struct fc_lport *lp); | ||
688 | |||
689 | /* | ||
690 | * Initiate the LP state machine. This handler will use fc_host_attr | ||
691 | * to store the FLOGI service parameters, so fc_host_attr must be | ||
692 | * initialized before calling this handler. | ||
693 | */ | ||
694 | int fc_fabric_login(struct fc_lport *lp); | ||
695 | |||
696 | /* | ||
697 | * The link is up for the given local port. | ||
698 | */ | ||
699 | void fc_linkup(struct fc_lport *); | ||
700 | |||
701 | /* | ||
702 | * Link is down for the given local port. | ||
703 | */ | ||
704 | void fc_linkdown(struct fc_lport *); | ||
705 | |||
706 | /* | ||
707 | * Pause and unpause traffic. | ||
708 | */ | ||
709 | void fc_pause(struct fc_lport *); | ||
710 | void fc_unpause(struct fc_lport *); | ||
711 | |||
712 | /* | ||
713 | * Configure the local port. | ||
714 | */ | ||
715 | int fc_lport_config(struct fc_lport *); | ||
716 | |||
717 | /* | ||
718 | * Reset the local port. | ||
719 | */ | ||
720 | int fc_lport_reset(struct fc_lport *); | ||
721 | |||
722 | /* | ||
723 | * Set the mfs or reset | ||
724 | */ | ||
725 | int fc_set_mfs(struct fc_lport *lp, u32 mfs); | ||
726 | |||
727 | |||
728 | /** | ||
729 | * REMOTE PORT LAYER | ||
730 | *****************************/ | ||
731 | int fc_rport_init(struct fc_lport *lp); | ||
732 | void fc_rport_terminate_io(struct fc_rport *rp); | ||
733 | |||
734 | /** | ||
735 | * DISCOVERY LAYER | ||
736 | *****************************/ | ||
737 | int fc_disc_init(struct fc_lport *lp); | ||
738 | |||
739 | |||
740 | /** | ||
741 | * SCSI LAYER | ||
742 | *****************************/ | ||
743 | /* | ||
744 | * Initialize the SCSI block of libfc | ||
745 | */ | ||
746 | int fc_fcp_init(struct fc_lport *); | ||
747 | |||
748 | /* | ||
749 | * This section provides an API which allows direct interaction | ||
750 | * with the SCSI-ml. Each of these functions satisfies a function | ||
751 | * pointer defined in Scsi_Host and therefore is always called | ||
752 | * directly from the SCSI-ml. | ||
753 | */ | ||
754 | int fc_queuecommand(struct scsi_cmnd *sc_cmd, | ||
755 | void (*done)(struct scsi_cmnd *)); | ||
756 | |||
757 | /* | ||
758 | * complete processing of a fcp packet | ||
759 | * | ||
760 | * This function may sleep if a fsp timer is pending. | ||
761 | * The host lock must not be held by caller. | ||
762 | */ | ||
763 | void fc_fcp_complete(struct fc_fcp_pkt *fsp); | ||
764 | |||
765 | /* | ||
766 | * Send an ABTS frame to the target device. The sc_cmd argument | ||
767 | * is a pointer to the SCSI command to be aborted. | ||
768 | */ | ||
769 | int fc_eh_abort(struct scsi_cmnd *sc_cmd); | ||
770 | |||
771 | /* | ||
772 | * Reset a LUN by sending send the tm cmd to the target. | ||
773 | */ | ||
774 | int fc_eh_device_reset(struct scsi_cmnd *sc_cmd); | ||
775 | |||
776 | /* | ||
777 | * Reset the host adapter. | ||
778 | */ | ||
779 | int fc_eh_host_reset(struct scsi_cmnd *sc_cmd); | ||
780 | |||
781 | /* | ||
782 | * Check rport status. | ||
783 | */ | ||
784 | int fc_slave_alloc(struct scsi_device *sdev); | ||
785 | |||
786 | /* | ||
787 | * Adjust the queue depth. | ||
788 | */ | ||
789 | int fc_change_queue_depth(struct scsi_device *sdev, int qdepth); | ||
790 | |||
791 | /* | ||
792 | * Change the tag type. | ||
793 | */ | ||
794 | int fc_change_queue_type(struct scsi_device *sdev, int tag_type); | ||
795 | |||
796 | /* | ||
797 | * Free memory pools used by the FCP layer. | ||
798 | */ | ||
799 | void fc_fcp_destroy(struct fc_lport *); | ||
800 | |||
801 | /** | ||
802 | * ELS/CT interface | ||
803 | *****************************/ | ||
804 | /* | ||
805 | * Initializes ELS/CT interface | ||
806 | */ | ||
807 | int fc_elsct_init(struct fc_lport *lp); | ||
808 | |||
809 | |||
810 | /** | ||
811 | * EXCHANGE MANAGER LAYER | ||
812 | *****************************/ | ||
813 | /* | ||
814 | * Initializes Exchange Manager related | ||
815 | * function pointers in struct libfc_function_template. | ||
816 | */ | ||
817 | int fc_exch_init(struct fc_lport *lp); | ||
818 | |||
819 | /* | ||
820 | * Allocates an Exchange Manager (EM). | ||
821 | * | ||
822 | * The EM manages exchanges for their allocation and | ||
823 | * free, also allows exchange lookup for received | ||
824 | * frame. | ||
825 | * | ||
826 | * The class is used for initializing FC class of | ||
827 | * allocated exchange from EM. | ||
828 | * | ||
829 | * The min_xid and max_xid will limit new | ||
830 | * exchange ID (XID) within this range for | ||
831 | * a new exchange. | ||
832 | * The LLD may choose to have multiple EMs, | ||
833 | * e.g. one EM instance per CPU receive thread in LLD. | ||
834 | * The LLD can use exch_get() of struct libfc_function_template | ||
835 | * to specify XID for a new exchange within | ||
836 | * a specified EM instance. | ||
837 | * | ||
838 | * The em_idx to uniquely identify an EM instance. | ||
839 | */ | ||
840 | struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lp, | ||
841 | enum fc_class class, | ||
842 | u16 min_xid, | ||
843 | u16 max_xid); | ||
844 | |||
845 | /* | ||
846 | * Free an exchange manager. | ||
847 | */ | ||
848 | void fc_exch_mgr_free(struct fc_exch_mgr *mp); | ||
849 | |||
850 | /* | ||
851 | * Receive a frame on specified local port and exchange manager. | ||
852 | */ | ||
853 | void fc_exch_recv(struct fc_lport *lp, struct fc_exch_mgr *mp, | ||
854 | struct fc_frame *fp); | ||
855 | |||
856 | /* | ||
857 | * This function is for exch_seq_send function pointer in | ||
858 | * struct libfc_function_template, see comment block on | ||
859 | * exch_seq_send for description of this function. | ||
860 | */ | ||
861 | struct fc_seq *fc_exch_seq_send(struct fc_lport *lp, | ||
862 | struct fc_frame *fp, | ||
863 | void (*resp)(struct fc_seq *sp, | ||
864 | struct fc_frame *fp, | ||
865 | void *arg), | ||
866 | void (*destructor)(struct fc_seq *sp, | ||
867 | void *arg), | ||
868 | void *arg, u32 timer_msec); | ||
869 | |||
870 | /* | ||
871 | * send a frame using existing sequence and exchange. | ||
872 | */ | ||
873 | int fc_seq_send(struct fc_lport *lp, struct fc_seq *sp, struct fc_frame *fp); | ||
874 | |||
875 | /* | ||
876 | * Send ELS response using mainly infomation | ||
877 | * in exchange and sequence in EM layer. | ||
878 | */ | ||
879 | void fc_seq_els_rsp_send(struct fc_seq *sp, enum fc_els_cmd els_cmd, | ||
880 | struct fc_seq_els_data *els_data); | ||
881 | |||
882 | /* | ||
883 | * This function is for seq_exch_abort function pointer in | ||
884 | * struct libfc_function_template, see comment block on | ||
885 | * seq_exch_abort for description of this function. | ||
886 | */ | ||
887 | int fc_seq_exch_abort(const struct fc_seq *req_sp, unsigned int timer_msec); | ||
888 | |||
889 | /* | ||
890 | * Indicate that an exchange/sequence tuple is complete and the memory | ||
891 | * allocated for the related objects may be freed. | ||
892 | */ | ||
893 | void fc_exch_done(struct fc_seq *sp); | ||
894 | |||
895 | /* | ||
896 | * Assigns a EM and XID for a frame and then allocates | ||
897 | * a new exchange and sequence pair. | ||
898 | * The fp can be used to determine free XID. | ||
899 | */ | ||
900 | struct fc_exch *fc_exch_get(struct fc_lport *lp, struct fc_frame *fp); | ||
901 | |||
902 | /* | ||
903 | * Allocate a new exchange and sequence pair. | ||
904 | * if ex_id is zero then next free exchange id | ||
905 | * from specified exchange manger mp will be assigned. | ||
906 | */ | ||
907 | struct fc_exch *fc_exch_alloc(struct fc_exch_mgr *mp, | ||
908 | struct fc_frame *fp, u16 ex_id); | ||
909 | /* | ||
910 | * Start a new sequence on the same exchange as the supplied sequence. | ||
911 | */ | ||
912 | struct fc_seq *fc_seq_start_next(struct fc_seq *sp); | ||
913 | |||
914 | /* | ||
915 | * Reset an exchange manager, completing all sequences and exchanges. | ||
916 | * If s_id is non-zero, reset only exchanges originating from that FID. | ||
917 | * If d_id is non-zero, reset only exchanges sending to that FID. | ||
918 | */ | ||
919 | void fc_exch_mgr_reset(struct fc_exch_mgr *, u32 s_id, u32 d_id); | ||
920 | |||
921 | /* | ||
922 | * Functions for fc_functions_template | ||
923 | */ | ||
924 | void fc_get_host_speed(struct Scsi_Host *shost); | ||
925 | void fc_get_host_port_type(struct Scsi_Host *shost); | ||
926 | void fc_get_host_port_state(struct Scsi_Host *shost); | ||
927 | void fc_set_rport_loss_tmo(struct fc_rport *rport, u32 timeout); | ||
928 | struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *); | ||
929 | |||
930 | /* | ||
931 | * module setup functions. | ||
932 | */ | ||
933 | int fc_setup_exch_mgr(void); | ||
934 | void fc_destroy_exch_mgr(void); | ||
935 | int fc_setup_rport(void); | ||
936 | void fc_destroy_rport(void); | ||
937 | |||
938 | #endif /* _LIBFC_H_ */ | ||
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h new file mode 100644 index 000000000000..89fdbb9a6a1b --- /dev/null +++ b/include/scsi/libfcoe.h | |||
@@ -0,0 +1,176 @@ | |||
1 | /* | ||
2 | * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms and conditions of the GNU General Public License, | ||
6 | * version 2, as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
11 | * more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along with | ||
14 | * this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
16 | * | ||
17 | * Maintained at www.Open-FCoE.org | ||
18 | */ | ||
19 | |||
20 | #ifndef _LIBFCOE_H | ||
21 | #define _LIBFCOE_H | ||
22 | |||
23 | #include <linux/netdevice.h> | ||
24 | #include <linux/skbuff.h> | ||
25 | #include <scsi/fc/fc_fcoe.h> | ||
26 | #include <scsi/libfc.h> | ||
27 | |||
28 | /* | ||
29 | * this percpu struct for fcoe | ||
30 | */ | ||
31 | struct fcoe_percpu_s { | ||
32 | int cpu; | ||
33 | struct task_struct *thread; | ||
34 | struct sk_buff_head fcoe_rx_list; | ||
35 | struct page *crc_eof_page; | ||
36 | int crc_eof_offset; | ||
37 | }; | ||
38 | |||
39 | /* | ||
40 | * the fcoe sw transport private data | ||
41 | */ | ||
42 | struct fcoe_softc { | ||
43 | struct list_head list; | ||
44 | struct fc_lport *lp; | ||
45 | struct net_device *real_dev; | ||
46 | struct net_device *phys_dev; /* device with ethtool_ops */ | ||
47 | struct packet_type fcoe_packet_type; | ||
48 | struct sk_buff_head fcoe_pending_queue; | ||
49 | |||
50 | u8 dest_addr[ETH_ALEN]; | ||
51 | u8 ctl_src_addr[ETH_ALEN]; | ||
52 | u8 data_src_addr[ETH_ALEN]; | ||
53 | /* | ||
54 | * fcoe protocol address learning related stuff | ||
55 | */ | ||
56 | u16 flogi_oxid; | ||
57 | u8 flogi_progress; | ||
58 | u8 address_mode; | ||
59 | }; | ||
60 | |||
61 | static inline struct fcoe_softc *fcoe_softc( | ||
62 | const struct fc_lport *lp) | ||
63 | { | ||
64 | return (struct fcoe_softc *)lport_priv(lp); | ||
65 | } | ||
66 | |||
67 | static inline struct net_device *fcoe_netdev( | ||
68 | const struct fc_lport *lp) | ||
69 | { | ||
70 | return fcoe_softc(lp)->real_dev; | ||
71 | } | ||
72 | |||
73 | static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb) | ||
74 | { | ||
75 | return (struct fcoe_hdr *)skb_network_header(skb); | ||
76 | } | ||
77 | |||
78 | static inline int skb_fcoe_offset(const struct sk_buff *skb) | ||
79 | { | ||
80 | return skb_network_offset(skb); | ||
81 | } | ||
82 | |||
83 | static inline struct fc_frame_header *skb_fc_header(const struct sk_buff *skb) | ||
84 | { | ||
85 | return (struct fc_frame_header *)skb_transport_header(skb); | ||
86 | } | ||
87 | |||
88 | static inline int skb_fc_offset(const struct sk_buff *skb) | ||
89 | { | ||
90 | return skb_transport_offset(skb); | ||
91 | } | ||
92 | |||
93 | static inline void skb_reset_fc_header(struct sk_buff *skb) | ||
94 | { | ||
95 | skb_reset_network_header(skb); | ||
96 | skb_set_transport_header(skb, skb_network_offset(skb) + | ||
97 | sizeof(struct fcoe_hdr)); | ||
98 | } | ||
99 | |||
100 | static inline bool skb_fc_is_data(const struct sk_buff *skb) | ||
101 | { | ||
102 | return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_SOL_DATA; | ||
103 | } | ||
104 | |||
105 | static inline bool skb_fc_is_cmd(const struct sk_buff *skb) | ||
106 | { | ||
107 | return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_UNSOL_CMD; | ||
108 | } | ||
109 | |||
110 | static inline bool skb_fc_has_exthdr(const struct sk_buff *skb) | ||
111 | { | ||
112 | return (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_VFTH) || | ||
113 | (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_IFRH) || | ||
114 | (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_ENCH); | ||
115 | } | ||
116 | |||
117 | static inline bool skb_fc_is_roff(const struct sk_buff *skb) | ||
118 | { | ||
119 | return skb_fc_header(skb)->fh_f_ctl[2] & FC_FC_REL_OFF; | ||
120 | } | ||
121 | |||
122 | static inline u16 skb_fc_oxid(const struct sk_buff *skb) | ||
123 | { | ||
124 | return be16_to_cpu(skb_fc_header(skb)->fh_ox_id); | ||
125 | } | ||
126 | |||
127 | static inline u16 skb_fc_rxid(const struct sk_buff *skb) | ||
128 | { | ||
129 | return be16_to_cpu(skb_fc_header(skb)->fh_rx_id); | ||
130 | } | ||
131 | |||
132 | /* FIXME - DMA_BIDIRECTIONAL ? */ | ||
133 | #define skb_cb(skb) ((struct fcoe_rcv_info *)&((skb)->cb[0])) | ||
134 | #define skb_cmd(skb) (skb_cb(skb)->fr_cmd) | ||
135 | #define skb_dir(skb) (skb_cmd(skb)->sc_data_direction) | ||
136 | static inline bool skb_fc_is_read(const struct sk_buff *skb) | ||
137 | { | ||
138 | if (skb_fc_is_cmd(skb) && skb_cmd(skb)) | ||
139 | return skb_dir(skb) == DMA_FROM_DEVICE; | ||
140 | return false; | ||
141 | } | ||
142 | |||
143 | static inline bool skb_fc_is_write(const struct sk_buff *skb) | ||
144 | { | ||
145 | if (skb_fc_is_cmd(skb) && skb_cmd(skb)) | ||
146 | return skb_dir(skb) == DMA_TO_DEVICE; | ||
147 | return false; | ||
148 | } | ||
149 | |||
150 | /* libfcoe funcs */ | ||
151 | int fcoe_reset(struct Scsi_Host *shost); | ||
152 | u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], | ||
153 | unsigned int scheme, unsigned int port); | ||
154 | |||
155 | u32 fcoe_fc_crc(struct fc_frame *fp); | ||
156 | int fcoe_xmit(struct fc_lport *, struct fc_frame *); | ||
157 | int fcoe_rcv(struct sk_buff *, struct net_device *, | ||
158 | struct packet_type *, struct net_device *); | ||
159 | |||
160 | int fcoe_percpu_receive_thread(void *arg); | ||
161 | void fcoe_clean_pending_queue(struct fc_lport *lp); | ||
162 | void fcoe_percpu_clean(struct fc_lport *lp); | ||
163 | void fcoe_watchdog(ulong vp); | ||
164 | int fcoe_link_ok(struct fc_lport *lp); | ||
165 | |||
166 | struct fc_lport *fcoe_hostlist_lookup(const struct net_device *); | ||
167 | int fcoe_hostlist_add(const struct fc_lport *); | ||
168 | int fcoe_hostlist_remove(const struct fc_lport *); | ||
169 | |||
170 | struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *, int); | ||
171 | int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *); | ||
172 | |||
173 | /* fcoe sw hba */ | ||
174 | int __init fcoe_sw_init(void); | ||
175 | int __exit fcoe_sw_exit(void); | ||
176 | #endif /* _LIBFCOE_H */ | ||
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 61e53f14f7e1..7360e1916e75 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/workqueue.h> | 30 | #include <linux/workqueue.h> |
31 | #include <scsi/iscsi_proto.h> | 31 | #include <scsi/iscsi_proto.h> |
32 | #include <scsi/iscsi_if.h> | 32 | #include <scsi/iscsi_if.h> |
33 | #include <scsi/scsi_transport_iscsi.h> | ||
33 | 34 | ||
34 | struct scsi_transport_template; | 35 | struct scsi_transport_template; |
35 | struct scsi_host_template; | 36 | struct scsi_host_template; |
@@ -70,12 +71,12 @@ enum { | |||
70 | /* Connection suspend "bit" */ | 71 | /* Connection suspend "bit" */ |
71 | #define ISCSI_SUSPEND_BIT 1 | 72 | #define ISCSI_SUSPEND_BIT 1 |
72 | 73 | ||
73 | #define ISCSI_ITT_MASK (0x1fff) | 74 | #define ISCSI_ITT_MASK 0x1fff |
74 | #define ISCSI_TOTAL_CMDS_MAX 4096 | 75 | #define ISCSI_TOTAL_CMDS_MAX 4096 |
75 | /* this must be a power of two greater than ISCSI_MGMT_CMDS_MAX */ | 76 | /* this must be a power of two greater than ISCSI_MGMT_CMDS_MAX */ |
76 | #define ISCSI_TOTAL_CMDS_MIN 16 | 77 | #define ISCSI_TOTAL_CMDS_MIN 16 |
77 | #define ISCSI_AGE_SHIFT 28 | 78 | #define ISCSI_AGE_SHIFT 28 |
78 | #define ISCSI_AGE_MASK (0xf << ISCSI_AGE_SHIFT) | 79 | #define ISCSI_AGE_MASK 0xf |
79 | 80 | ||
80 | #define ISCSI_ADDRESS_BUF_LEN 64 | 81 | #define ISCSI_ADDRESS_BUF_LEN 64 |
81 | 82 | ||
@@ -93,24 +94,38 @@ enum { | |||
93 | ISCSI_TASK_RUNNING, | 94 | ISCSI_TASK_RUNNING, |
94 | }; | 95 | }; |
95 | 96 | ||
97 | struct iscsi_r2t_info { | ||
98 | __be32 ttt; /* copied from R2T */ | ||
99 | __be32 exp_statsn; /* copied from R2T */ | ||
100 | uint32_t data_length; /* copied from R2T */ | ||
101 | uint32_t data_offset; /* copied from R2T */ | ||
102 | int data_count; /* DATA-Out payload progress */ | ||
103 | int datasn; | ||
104 | /* LLDs should set/update these values */ | ||
105 | int sent; /* R2T sequence progress */ | ||
106 | }; | ||
107 | |||
96 | struct iscsi_task { | 108 | struct iscsi_task { |
97 | /* | 109 | /* |
98 | * Because LLDs allocate their hdr differently, this is a pointer | 110 | * Because LLDs allocate their hdr differently, this is a pointer |
99 | * and length to that storage. It must be setup at session | 111 | * and length to that storage. It must be setup at session |
100 | * creation time. | 112 | * creation time. |
101 | */ | 113 | */ |
102 | struct iscsi_cmd *hdr; | 114 | struct iscsi_hdr *hdr; |
103 | unsigned short hdr_max; | 115 | unsigned short hdr_max; |
104 | unsigned short hdr_len; /* accumulated size of hdr used */ | 116 | unsigned short hdr_len; /* accumulated size of hdr used */ |
117 | /* copied values in case we need to send tmfs */ | ||
118 | itt_t hdr_itt; | ||
119 | __be32 cmdsn; | ||
120 | uint8_t lun[8]; | ||
121 | |||
105 | int itt; /* this ITT */ | 122 | int itt; /* this ITT */ |
106 | 123 | ||
107 | uint32_t unsol_datasn; | ||
108 | unsigned imm_count; /* imm-data (bytes) */ | 124 | unsigned imm_count; /* imm-data (bytes) */ |
109 | unsigned unsol_count; /* unsolicited (bytes)*/ | ||
110 | /* offset in unsolicited stream (bytes); */ | 125 | /* offset in unsolicited stream (bytes); */ |
111 | unsigned unsol_offset; | 126 | struct iscsi_r2t_info unsol_r2t; |
112 | unsigned data_count; /* remaining Data-Out */ | ||
113 | char *data; /* mgmt payload */ | 127 | char *data; /* mgmt payload */ |
128 | unsigned data_count; | ||
114 | struct scsi_cmnd *sc; /* associated SCSI cmd*/ | 129 | struct scsi_cmnd *sc; /* associated SCSI cmd*/ |
115 | struct iscsi_conn *conn; /* used connection */ | 130 | struct iscsi_conn *conn; /* used connection */ |
116 | 131 | ||
@@ -121,6 +136,11 @@ struct iscsi_task { | |||
121 | void *dd_data; /* driver/transport data */ | 136 | void *dd_data; /* driver/transport data */ |
122 | }; | 137 | }; |
123 | 138 | ||
139 | static inline int iscsi_task_has_unsol_data(struct iscsi_task *task) | ||
140 | { | ||
141 | return task->unsol_r2t.data_length > task->unsol_r2t.sent; | ||
142 | } | ||
143 | |||
124 | static inline void* iscsi_next_hdr(struct iscsi_task *task) | 144 | static inline void* iscsi_next_hdr(struct iscsi_task *task) |
125 | { | 145 | { |
126 | return (void*)task->hdr + task->hdr_len; | 146 | return (void*)task->hdr + task->hdr_len; |
@@ -376,8 +396,9 @@ extern void iscsi_suspend_tx(struct iscsi_conn *conn); | |||
376 | * pdu and task processing | 396 | * pdu and task processing |
377 | */ | 397 | */ |
378 | extern void iscsi_update_cmdsn(struct iscsi_session *, struct iscsi_nopin *); | 398 | extern void iscsi_update_cmdsn(struct iscsi_session *, struct iscsi_nopin *); |
379 | extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_task *, | 399 | extern void iscsi_prep_data_out_pdu(struct iscsi_task *task, |
380 | struct iscsi_data *hdr); | 400 | struct iscsi_r2t_info *r2t, |
401 | struct iscsi_data *hdr); | ||
381 | extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *, | 402 | extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *, |
382 | char *, uint32_t); | 403 | char *, uint32_t); |
383 | extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *, | 404 | extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *, |
diff --git a/include/scsi/libiscsi_tcp.h b/include/scsi/libiscsi_tcp.h new file mode 100644 index 000000000000..83e32f6d7859 --- /dev/null +++ b/include/scsi/libiscsi_tcp.h | |||
@@ -0,0 +1,132 @@ | |||
1 | /* | ||
2 | * iSCSI over TCP/IP Data-Path lib | ||
3 | * | ||
4 | * Copyright (C) 2008 Mike Christie | ||
5 | * Copyright (C) 2008 Red Hat, Inc. All rights reserved. | ||
6 | * maintained by open-iscsi@googlegroups.com | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published | ||
10 | * by the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, but | ||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * General Public License for more details. | ||
17 | * | ||
18 | * See the file COPYING included with this distribution for more details. | ||
19 | */ | ||
20 | |||
21 | #ifndef LIBISCSI_TCP_H | ||
22 | #define LIBISCSI_TCP_H | ||
23 | |||
24 | #include <scsi/libiscsi.h> | ||
25 | |||
26 | struct iscsi_tcp_conn; | ||
27 | struct iscsi_segment; | ||
28 | struct sk_buff; | ||
29 | struct hash_desc; | ||
30 | |||
31 | typedef int iscsi_segment_done_fn_t(struct iscsi_tcp_conn *, | ||
32 | struct iscsi_segment *); | ||
33 | |||
34 | struct iscsi_segment { | ||
35 | unsigned char *data; | ||
36 | unsigned int size; | ||
37 | unsigned int copied; | ||
38 | unsigned int total_size; | ||
39 | unsigned int total_copied; | ||
40 | |||
41 | struct hash_desc *hash; | ||
42 | unsigned char recv_digest[ISCSI_DIGEST_SIZE]; | ||
43 | unsigned char digest[ISCSI_DIGEST_SIZE]; | ||
44 | unsigned int digest_len; | ||
45 | |||
46 | struct scatterlist *sg; | ||
47 | void *sg_mapped; | ||
48 | unsigned int sg_offset; | ||
49 | |||
50 | iscsi_segment_done_fn_t *done; | ||
51 | }; | ||
52 | |||
53 | /* Socket connection recieve helper */ | ||
54 | struct iscsi_tcp_recv { | ||
55 | struct iscsi_hdr *hdr; | ||
56 | struct iscsi_segment segment; | ||
57 | |||
58 | /* Allocate buffer for BHS + AHS */ | ||
59 | uint32_t hdr_buf[64]; | ||
60 | |||
61 | /* copied and flipped values */ | ||
62 | int datalen; | ||
63 | }; | ||
64 | |||
65 | struct iscsi_tcp_conn { | ||
66 | struct iscsi_conn *iscsi_conn; | ||
67 | void *dd_data; | ||
68 | int stop_stage; /* conn_stop() flag: * | ||
69 | * stop to recover, * | ||
70 | * stop to terminate */ | ||
71 | /* control data */ | ||
72 | struct iscsi_tcp_recv in; /* TCP receive context */ | ||
73 | /* CRC32C (Rx) LLD should set this is they do not offload */ | ||
74 | struct hash_desc *rx_hash; | ||
75 | }; | ||
76 | |||
77 | struct iscsi_tcp_task { | ||
78 | uint32_t exp_datasn; /* expected target's R2TSN/DataSN */ | ||
79 | int data_offset; | ||
80 | struct iscsi_r2t_info *r2t; /* in progress solict R2T */ | ||
81 | struct iscsi_pool r2tpool; | ||
82 | struct kfifo *r2tqueue; | ||
83 | void *dd_data; | ||
84 | }; | ||
85 | |||
86 | enum { | ||
87 | ISCSI_TCP_SEGMENT_DONE, /* curr seg has been processed */ | ||
88 | ISCSI_TCP_SKB_DONE, /* skb is out of data */ | ||
89 | ISCSI_TCP_CONN_ERR, /* iscsi layer has fired a conn err */ | ||
90 | ISCSI_TCP_SUSPENDED, /* conn is suspended */ | ||
91 | }; | ||
92 | |||
93 | extern void iscsi_tcp_hdr_recv_prep(struct iscsi_tcp_conn *tcp_conn); | ||
94 | extern int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb, | ||
95 | unsigned int offset, bool offloaded, int *status); | ||
96 | extern void iscsi_tcp_cleanup_task(struct iscsi_task *task); | ||
97 | extern int iscsi_tcp_task_init(struct iscsi_task *task); | ||
98 | extern int iscsi_tcp_task_xmit(struct iscsi_task *task); | ||
99 | |||
100 | /* segment helpers */ | ||
101 | extern int iscsi_tcp_recv_segment_is_hdr(struct iscsi_tcp_conn *tcp_conn); | ||
102 | extern int iscsi_tcp_segment_done(struct iscsi_tcp_conn *tcp_conn, | ||
103 | struct iscsi_segment *segment, int recv, | ||
104 | unsigned copied); | ||
105 | extern void iscsi_tcp_segment_unmap(struct iscsi_segment *segment); | ||
106 | |||
107 | extern void iscsi_segment_init_linear(struct iscsi_segment *segment, | ||
108 | void *data, size_t size, | ||
109 | iscsi_segment_done_fn_t *done, | ||
110 | struct hash_desc *hash); | ||
111 | extern int | ||
112 | iscsi_segment_seek_sg(struct iscsi_segment *segment, | ||
113 | struct scatterlist *sg_list, unsigned int sg_count, | ||
114 | unsigned int offset, size_t size, | ||
115 | iscsi_segment_done_fn_t *done, struct hash_desc *hash); | ||
116 | |||
117 | /* digest helpers */ | ||
118 | extern void iscsi_tcp_dgst_header(struct hash_desc *hash, const void *hdr, | ||
119 | size_t hdrlen, | ||
120 | unsigned char digest[ISCSI_DIGEST_SIZE]); | ||
121 | extern struct iscsi_cls_conn * | ||
122 | iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size, | ||
123 | uint32_t conn_idx); | ||
124 | extern void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn); | ||
125 | |||
126 | /* misc helpers */ | ||
127 | extern int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session); | ||
128 | extern void iscsi_tcp_r2tpool_free(struct iscsi_session *session); | ||
129 | |||
130 | extern void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn, | ||
131 | struct iscsi_stats *stats); | ||
132 | #endif /* LIBISCSI_TCP_H */ | ||
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index a37a8148a310..01a4c58f8bad 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -159,8 +159,6 @@ struct scsi_device { | |||
159 | atomic_t iodone_cnt; | 159 | atomic_t iodone_cnt; |
160 | atomic_t ioerr_cnt; | 160 | atomic_t ioerr_cnt; |
161 | 161 | ||
162 | int timeout; | ||
163 | |||
164 | struct device sdev_gendev, | 162 | struct device sdev_gendev, |
165 | sdev_dev; | 163 | sdev_dev; |
166 | 164 | ||
@@ -367,10 +365,11 @@ extern int scsi_is_target_device(const struct device *); | |||
367 | extern int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, | 365 | extern int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, |
368 | int data_direction, void *buffer, unsigned bufflen, | 366 | int data_direction, void *buffer, unsigned bufflen, |
369 | unsigned char *sense, int timeout, int retries, | 367 | unsigned char *sense, int timeout, int retries, |
370 | int flag); | 368 | int flag, int *resid); |
371 | extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd, | 369 | extern int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd, |
372 | int data_direction, void *buffer, unsigned bufflen, | 370 | int data_direction, void *buffer, unsigned bufflen, |
373 | struct scsi_sense_hdr *, int timeout, int retries); | 371 | struct scsi_sense_hdr *, int timeout, int retries, |
372 | int *resid); | ||
374 | extern int scsi_execute_async(struct scsi_device *sdev, | 373 | extern int scsi_execute_async(struct scsi_device *sdev, |
375 | const unsigned char *cmd, int cmd_len, int data_direction, | 374 | const unsigned char *cmd, int cmd_len, int data_direction, |
376 | void *buffer, unsigned bufflen, int use_sg, | 375 | void *buffer, unsigned bufflen, int use_sg, |
diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 6e04e6fe79c7..c9184f756cad 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h | |||
@@ -358,6 +358,7 @@ struct fc_rport { /* aka fc_starget_attrs */ | |||
358 | #define FC_RPORT_DEVLOSS_PENDING 0x01 | 358 | #define FC_RPORT_DEVLOSS_PENDING 0x01 |
359 | #define FC_RPORT_SCAN_PENDING 0x02 | 359 | #define FC_RPORT_SCAN_PENDING 0x02 |
360 | #define FC_RPORT_FAST_FAIL_TIMEDOUT 0x04 | 360 | #define FC_RPORT_FAST_FAIL_TIMEDOUT 0x04 |
361 | #define FC_RPORT_DEVLOSS_CALLBK_DONE 0x08 | ||
361 | 362 | ||
362 | #define dev_to_rport(d) \ | 363 | #define dev_to_rport(d) \ |
363 | container_of(d, struct fc_rport, dev) | 364 | container_of(d, struct fc_rport, dev) |
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index c667cc396545..b50aabe2861e 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -113,10 +113,18 @@ struct iscsi_transport { | |||
113 | char *data, uint32_t data_size); | 113 | char *data, uint32_t data_size); |
114 | void (*get_stats) (struct iscsi_cls_conn *conn, | 114 | void (*get_stats) (struct iscsi_cls_conn *conn, |
115 | struct iscsi_stats *stats); | 115 | struct iscsi_stats *stats); |
116 | |||
116 | int (*init_task) (struct iscsi_task *task); | 117 | int (*init_task) (struct iscsi_task *task); |
117 | int (*xmit_task) (struct iscsi_task *task); | 118 | int (*xmit_task) (struct iscsi_task *task); |
118 | void (*cleanup_task) (struct iscsi_conn *conn, | 119 | void (*cleanup_task) (struct iscsi_task *task); |
119 | struct iscsi_task *task); | 120 | |
121 | int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode); | ||
122 | int (*xmit_pdu) (struct iscsi_task *task); | ||
123 | int (*init_pdu) (struct iscsi_task *task, unsigned int offset, | ||
124 | unsigned int count); | ||
125 | void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt, | ||
126 | int *index, int *age); | ||
127 | |||
120 | void (*session_recovery_timedout) (struct iscsi_cls_session *session); | 128 | void (*session_recovery_timedout) (struct iscsi_cls_session *session); |
121 | struct iscsi_endpoint *(*ep_connect) (struct sockaddr *dst_addr, | 129 | struct iscsi_endpoint *(*ep_connect) (struct sockaddr *dst_addr, |
122 | int non_blocking); | 130 | int non_blocking); |
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 7ee2f70ca42e..4af1083e3287 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
@@ -85,6 +85,10 @@ | |||
85 | #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \ | 85 | #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \ |
86 | { .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \ | 86 | { .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \ |
87 | .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1} | 87 | .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1} |
88 | #define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \ | ||
89 | { .id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \ | ||
90 | .shift = wshift, .invert = winvert, .kcontrols = wcontrols, \ | ||
91 | .num_kcontrols = 1} | ||
88 | 92 | ||
89 | /* path domain with event - event handler must return 0 for success */ | 93 | /* path domain with event - event handler must return 0 for success */ |
90 | #define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \ | 94 | #define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \ |
@@ -172,6 +176,12 @@ | |||
172 | .get = snd_soc_dapm_get_enum_double, \ | 176 | .get = snd_soc_dapm_get_enum_double, \ |
173 | .put = snd_soc_dapm_put_enum_double, \ | 177 | .put = snd_soc_dapm_put_enum_double, \ |
174 | .private_value = (unsigned long)&xenum } | 178 | .private_value = (unsigned long)&xenum } |
179 | #define SOC_DAPM_VALUE_ENUM(xname, xenum) \ | ||
180 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ | ||
181 | .info = snd_soc_info_value_enum_double, \ | ||
182 | .get = snd_soc_dapm_get_value_enum_double, \ | ||
183 | .put = snd_soc_dapm_put_value_enum_double, \ | ||
184 | .private_value = (unsigned long)&xenum } | ||
175 | 185 | ||
176 | /* dapm stream operations */ | 186 | /* dapm stream operations */ |
177 | #define SND_SOC_DAPM_STREAM_NOP 0x0 | 187 | #define SND_SOC_DAPM_STREAM_NOP 0x0 |
@@ -214,6 +224,10 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol, | |||
214 | struct snd_ctl_elem_value *ucontrol); | 224 | struct snd_ctl_elem_value *ucontrol); |
215 | int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, | 225 | int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, |
216 | struct snd_ctl_elem_value *ucontrol); | 226 | struct snd_ctl_elem_value *ucontrol); |
227 | int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol, | ||
228 | struct snd_ctl_elem_value *ucontrol); | ||
229 | int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol, | ||
230 | struct snd_ctl_elem_value *ucontrol); | ||
217 | int snd_soc_dapm_new_control(struct snd_soc_codec *codec, | 231 | int snd_soc_dapm_new_control(struct snd_soc_codec *codec, |
218 | const struct snd_soc_dapm_widget *widget); | 232 | const struct snd_soc_dapm_widget *widget); |
219 | int snd_soc_dapm_new_controls(struct snd_soc_codec *codec, | 233 | int snd_soc_dapm_new_controls(struct snd_soc_codec *codec, |
@@ -247,6 +261,7 @@ enum snd_soc_dapm_type { | |||
247 | snd_soc_dapm_input = 0, /* input pin */ | 261 | snd_soc_dapm_input = 0, /* input pin */ |
248 | snd_soc_dapm_output, /* output pin */ | 262 | snd_soc_dapm_output, /* output pin */ |
249 | snd_soc_dapm_mux, /* selects 1 analog signal from many inputs */ | 263 | snd_soc_dapm_mux, /* selects 1 analog signal from many inputs */ |
264 | snd_soc_dapm_value_mux, /* selects 1 analog signal from many inputs */ | ||
250 | snd_soc_dapm_mixer, /* mixes several analog signals together */ | 265 | snd_soc_dapm_mixer, /* mixes several analog signals together */ |
251 | snd_soc_dapm_pga, /* programmable gain/attenuation (volume) */ | 266 | snd_soc_dapm_pga, /* programmable gain/attenuation (volume) */ |
252 | snd_soc_dapm_adc, /* analog to digital converter */ | 267 | snd_soc_dapm_adc, /* analog to digital converter */ |
diff --git a/include/sound/soc.h b/include/sound/soc.h index f86e455d3828..9b930d342116 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -94,11 +94,22 @@ | |||
94 | SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmax, xtexts) | 94 | SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmax, xtexts) |
95 | #define SOC_ENUM_SINGLE_EXT(xmax, xtexts) \ | 95 | #define SOC_ENUM_SINGLE_EXT(xmax, xtexts) \ |
96 | { .max = xmax, .texts = xtexts } | 96 | { .max = xmax, .texts = xtexts } |
97 | #define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xmax, xtexts, xvalues) \ | ||
98 | { .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \ | ||
99 | .mask = xmask, .max = xmax, .texts = xtexts, .values = xvalues} | ||
100 | #define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xmax, xtexts, xvalues) \ | ||
101 | SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xmax, xtexts, xvalues) | ||
97 | #define SOC_ENUM(xname, xenum) \ | 102 | #define SOC_ENUM(xname, xenum) \ |
98 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\ | 103 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\ |
99 | .info = snd_soc_info_enum_double, \ | 104 | .info = snd_soc_info_enum_double, \ |
100 | .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \ | 105 | .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \ |
101 | .private_value = (unsigned long)&xenum } | 106 | .private_value = (unsigned long)&xenum } |
107 | #define SOC_VALUE_ENUM(xname, xenum) \ | ||
108 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\ | ||
109 | .info = snd_soc_info_value_enum_double, \ | ||
110 | .get = snd_soc_get_value_enum_double, \ | ||
111 | .put = snd_soc_put_value_enum_double, \ | ||
112 | .private_value = (unsigned long)&xenum } | ||
102 | #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\ | 113 | #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\ |
103 | xhandler_get, xhandler_put) \ | 114 | xhandler_get, xhandler_put) \ |
104 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ | 115 | { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ |
@@ -200,6 +211,12 @@ int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol, | |||
200 | struct snd_ctl_elem_value *ucontrol); | 211 | struct snd_ctl_elem_value *ucontrol); |
201 | int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol, | 212 | int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol, |
202 | struct snd_ctl_elem_value *ucontrol); | 213 | struct snd_ctl_elem_value *ucontrol); |
214 | int snd_soc_info_value_enum_double(struct snd_kcontrol *kcontrol, | ||
215 | struct snd_ctl_elem_info *uinfo); | ||
216 | int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol, | ||
217 | struct snd_ctl_elem_value *ucontrol); | ||
218 | int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol, | ||
219 | struct snd_ctl_elem_value *ucontrol); | ||
203 | int snd_soc_info_volsw(struct snd_kcontrol *kcontrol, | 220 | int snd_soc_info_volsw(struct snd_kcontrol *kcontrol, |
204 | struct snd_ctl_elem_info *uinfo); | 221 | struct snd_ctl_elem_info *uinfo); |
205 | int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol, | 222 | int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol, |
@@ -406,6 +423,19 @@ struct soc_enum { | |||
406 | void *dapm; | 423 | void *dapm; |
407 | }; | 424 | }; |
408 | 425 | ||
426 | /* semi enumerated kcontrol */ | ||
427 | struct soc_value_enum { | ||
428 | unsigned short reg; | ||
429 | unsigned short reg2; | ||
430 | unsigned char shift_l; | ||
431 | unsigned char shift_r; | ||
432 | unsigned int max; | ||
433 | unsigned int mask; | ||
434 | const char **texts; | ||
435 | const unsigned int *values; | ||
436 | void *dapm; | ||
437 | }; | ||
438 | |||
409 | #include <sound/soc-dai.h> | 439 | #include <sound/soc-dai.h> |
410 | 440 | ||
411 | #endif | 441 | #endif |
diff --git a/include/sound/tea575x-tuner.h b/include/sound/tea575x-tuner.h index b6870cbaf2b3..426899e529c5 100644 --- a/include/sound/tea575x-tuner.h +++ b/include/sound/tea575x-tuner.h | |||
@@ -36,7 +36,7 @@ struct snd_tea575x_ops { | |||
36 | struct snd_tea575x { | 36 | struct snd_tea575x { |
37 | struct snd_card *card; | 37 | struct snd_card *card; |
38 | struct video_device vd; /* video device */ | 38 | struct video_device vd; /* video device */ |
39 | struct file_operations fops; | 39 | struct v4l2_file_operations fops; |
40 | int dev_nr; /* requested device number + 1 */ | 40 | int dev_nr; /* requested device number + 1 */ |
41 | int vd_registered; /* video device is registered */ | 41 | int vd_registered; /* video device is registered */ |
42 | int tea5759; /* 5759 chip is present */ | 42 | int tea5759; /* 5759 chip is present */ |
diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h index 6369d89c25d5..f87f9614844d 100644 --- a/include/xen/xenbus.h +++ b/include/xen/xenbus.h | |||
@@ -136,8 +136,6 @@ struct xenbus_transaction | |||
136 | /* Nil transaction ID. */ | 136 | /* Nil transaction ID. */ |
137 | #define XBT_NIL ((struct xenbus_transaction) { 0 }) | 137 | #define XBT_NIL ((struct xenbus_transaction) { 0 }) |
138 | 138 | ||
139 | int __init xenbus_dev_init(void); | ||
140 | |||
141 | char **xenbus_directory(struct xenbus_transaction t, | 139 | char **xenbus_directory(struct xenbus_transaction t, |
142 | const char *dir, const char *node, unsigned int *num); | 140 | const char *dir, const char *node, unsigned int *num); |
143 | void *xenbus_read(struct xenbus_transaction t, | 141 | void *xenbus_read(struct xenbus_transaction t, |