scsi: scsi_transport_srp: Fix shost to rport translation
[linux-2.6-block.git] / drivers / acpi / acpica / exconfig.c
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /******************************************************************************
3  *
4  * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes)
5  *
6  * Copyright (C) 2000 - 2018, Intel Corp.
7  *
8  *****************************************************************************/
9
10 #include <acpi/acpi.h>
11 #include "accommon.h"
12 #include "acinterp.h"
13 #include "acnamesp.h"
14 #include "actables.h"
15 #include "acdispat.h"
16 #include "acevents.h"
17 #include "amlcode.h"
18
19 #define _COMPONENT          ACPI_EXECUTER
20 ACPI_MODULE_NAME("exconfig")
21
22 /* Local prototypes */
23 static acpi_status
24 acpi_ex_add_table(u32 table_index, union acpi_operand_object **ddb_handle);
25
26 static acpi_status
27 acpi_ex_region_read(union acpi_operand_object *obj_desc,
28                     u32 length, u8 *buffer);
29
30 /*******************************************************************************
31  *
32  * FUNCTION:    acpi_ex_add_table
33  *
34  * PARAMETERS:  table               - Pointer to raw table
35  *              parent_node         - Where to load the table (scope)
36  *              ddb_handle          - Where to return the table handle.
37  *
38  * RETURN:      Status
39  *
40  * DESCRIPTION: Common function to Install and Load an ACPI table with a
41  *              returned table handle.
42  *
43  ******************************************************************************/
44
45 static acpi_status
46 acpi_ex_add_table(u32 table_index, union acpi_operand_object **ddb_handle)
47 {
48         union acpi_operand_object *obj_desc;
49
50         ACPI_FUNCTION_TRACE(ex_add_table);
51
52         /* Create an object to be the table handle */
53
54         obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_REFERENCE);
55         if (!obj_desc) {
56                 return_ACPI_STATUS(AE_NO_MEMORY);
57         }
58
59         /* Init the table handle */
60
61         obj_desc->common.flags |= AOPOBJ_DATA_VALID;
62         obj_desc->reference.class = ACPI_REFCLASS_TABLE;
63         obj_desc->reference.value = table_index;
64         *ddb_handle = obj_desc;
65         return_ACPI_STATUS(AE_OK);
66 }
67
68 /*******************************************************************************
69  *
70  * FUNCTION:    acpi_ex_load_table_op
71  *
72  * PARAMETERS:  walk_state          - Current state with operands
73  *              return_desc         - Where to store the return object
74  *
75  * RETURN:      Status
76  *
77  * DESCRIPTION: Load an ACPI table from the RSDT/XSDT
78  *
79  ******************************************************************************/
80
81 acpi_status
82 acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
83                       union acpi_operand_object **return_desc)
84 {
85         acpi_status status;
86         union acpi_operand_object **operand = &walk_state->operands[0];
87         struct acpi_namespace_node *parent_node;
88         struct acpi_namespace_node *start_node;
89         struct acpi_namespace_node *parameter_node = NULL;
90         union acpi_operand_object *ddb_handle;
91         u32 table_index;
92
93         ACPI_FUNCTION_TRACE(ex_load_table_op);
94
95         /* Find the ACPI table in the RSDT/XSDT */
96
97         acpi_ex_exit_interpreter();
98         status = acpi_tb_find_table(operand[0]->string.pointer,
99                                     operand[1]->string.pointer,
100                                     operand[2]->string.pointer, &table_index);
101         acpi_ex_enter_interpreter();
102         if (ACPI_FAILURE(status)) {
103                 if (status != AE_NOT_FOUND) {
104                         return_ACPI_STATUS(status);
105                 }
106
107                 /* Table not found, return an Integer=0 and AE_OK */
108
109                 ddb_handle = acpi_ut_create_integer_object((u64) 0);
110                 if (!ddb_handle) {
111                         return_ACPI_STATUS(AE_NO_MEMORY);
112                 }
113
114                 *return_desc = ddb_handle;
115                 return_ACPI_STATUS(AE_OK);
116         }
117
118         /* Default nodes */
119
120         start_node = walk_state->scope_info->scope.node;
121         parent_node = acpi_gbl_root_node;
122
123         /* root_path (optional parameter) */
124
125         if (operand[3]->string.length > 0) {
126                 /*
127                  * Find the node referenced by the root_path_string. This is the
128                  * location within the namespace where the table will be loaded.
129                  */
130                 status = acpi_ns_get_node_unlocked(start_node,
131                                                    operand[3]->string.pointer,
132                                                    ACPI_NS_SEARCH_PARENT,
133                                                    &parent_node);
134                 if (ACPI_FAILURE(status)) {
135                         return_ACPI_STATUS(status);
136                 }
137         }
138
139         /* parameter_path (optional parameter) */
140
141         if (operand[4]->string.length > 0) {
142                 if ((operand[4]->string.pointer[0] != AML_ROOT_PREFIX) &&
143                     (operand[4]->string.pointer[0] != AML_PARENT_PREFIX)) {
144                         /*
145                          * Path is not absolute, so it will be relative to the node
146                          * referenced by the root_path_string (or the NS root if omitted)
147                          */
148                         start_node = parent_node;
149                 }
150
151                 /* Find the node referenced by the parameter_path_string */
152
153                 status = acpi_ns_get_node_unlocked(start_node,
154                                                    operand[4]->string.pointer,
155                                                    ACPI_NS_SEARCH_PARENT,
156                                                    &parameter_node);
157                 if (ACPI_FAILURE(status)) {
158                         return_ACPI_STATUS(status);
159                 }
160         }
161
162         /* Load the table into the namespace */
163
164         ACPI_INFO(("Dynamic OEM Table Load:"));
165         acpi_ex_exit_interpreter();
166         status = acpi_tb_load_table(table_index, parent_node);
167         acpi_ex_enter_interpreter();
168         if (ACPI_FAILURE(status)) {
169                 return_ACPI_STATUS(status);
170         }
171
172         status = acpi_ex_add_table(table_index, &ddb_handle);
173         if (ACPI_FAILURE(status)) {
174                 return_ACPI_STATUS(status);
175         }
176
177         /* Parameter Data (optional) */
178
179         if (parameter_node) {
180
181                 /* Store the parameter data into the optional parameter object */
182
183                 status = acpi_ex_store(operand[5],
184                                        ACPI_CAST_PTR(union acpi_operand_object,
185                                                      parameter_node),
186                                        walk_state);
187                 if (ACPI_FAILURE(status)) {
188                         (void)acpi_ex_unload_table(ddb_handle);
189
190                         acpi_ut_remove_reference(ddb_handle);
191                         return_ACPI_STATUS(status);
192                 }
193         }
194
195         *return_desc = ddb_handle;
196         return_ACPI_STATUS(status);
197 }
198
199 /*******************************************************************************
200  *
201  * FUNCTION:    acpi_ex_region_read
202  *
203  * PARAMETERS:  obj_desc        - Region descriptor
204  *              length          - Number of bytes to read
205  *              buffer          - Pointer to where to put the data
206  *
207  * RETURN:      Status
208  *
209  * DESCRIPTION: Read data from an operation region. The read starts from the
210  *              beginning of the region.
211  *
212  ******************************************************************************/
213
214 static acpi_status
215 acpi_ex_region_read(union acpi_operand_object *obj_desc, u32 length, u8 *buffer)
216 {
217         acpi_status status;
218         u64 value;
219         u32 region_offset = 0;
220         u32 i;
221
222         /* Bytewise reads */
223
224         for (i = 0; i < length; i++) {
225                 status =
226                     acpi_ev_address_space_dispatch(obj_desc, NULL, ACPI_READ,
227                                                    region_offset, 8, &value);
228                 if (ACPI_FAILURE(status)) {
229                         return (status);
230                 }
231
232                 *buffer = (u8)value;
233                 buffer++;
234                 region_offset++;
235         }
236
237         return (AE_OK);
238 }
239
240 /*******************************************************************************
241  *
242  * FUNCTION:    acpi_ex_load_op
243  *
244  * PARAMETERS:  obj_desc        - Region or Buffer/Field where the table will be
245  *                                obtained
246  *              target          - Where a handle to the table will be stored
247  *              walk_state      - Current state
248  *
249  * RETURN:      Status
250  *
251  * DESCRIPTION: Load an ACPI table from a field or operation region
252  *
253  * NOTE: Region Fields (Field, bank_field, index_fields) are resolved to buffer
254  *       objects before this code is reached.
255  *
256  *       If source is an operation region, it must refer to system_memory, as
257  *       per the ACPI specification.
258  *
259  ******************************************************************************/
260
261 acpi_status
262 acpi_ex_load_op(union acpi_operand_object *obj_desc,
263                 union acpi_operand_object *target,
264                 struct acpi_walk_state *walk_state)
265 {
266         union acpi_operand_object *ddb_handle;
267         struct acpi_table_header *table_header;
268         struct acpi_table_header *table;
269         u32 table_index;
270         acpi_status status;
271         u32 length;
272
273         ACPI_FUNCTION_TRACE(ex_load_op);
274
275         /* Source Object can be either an op_region or a Buffer/Field */
276
277         switch (obj_desc->common.type) {
278         case ACPI_TYPE_REGION:
279
280                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
281                                   "Load table from Region %p\n", obj_desc));
282
283                 /* Region must be system_memory (from ACPI spec) */
284
285                 if (obj_desc->region.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
286                         return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
287                 }
288
289                 /*
290                  * If the Region Address and Length have not been previously
291                  * evaluated, evaluate them now and save the results.
292                  */
293                 if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) {
294                         status = acpi_ds_get_region_arguments(obj_desc);
295                         if (ACPI_FAILURE(status)) {
296                                 return_ACPI_STATUS(status);
297                         }
298                 }
299
300                 /* Get the table header first so we can get the table length */
301
302                 table_header = ACPI_ALLOCATE(sizeof(struct acpi_table_header));
303                 if (!table_header) {
304                         return_ACPI_STATUS(AE_NO_MEMORY);
305                 }
306
307                 status =
308                     acpi_ex_region_read(obj_desc,
309                                         sizeof(struct acpi_table_header),
310                                         ACPI_CAST_PTR(u8, table_header));
311                 length = table_header->length;
312                 ACPI_FREE(table_header);
313
314                 if (ACPI_FAILURE(status)) {
315                         return_ACPI_STATUS(status);
316                 }
317
318                 /* Must have at least an ACPI table header */
319
320                 if (length < sizeof(struct acpi_table_header)) {
321                         return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
322                 }
323
324                 /*
325                  * The original implementation simply mapped the table, with no copy.
326                  * However, the memory region is not guaranteed to remain stable and
327                  * we must copy the table to a local buffer. For example, the memory
328                  * region is corrupted after suspend on some machines. Dynamically
329                  * loaded tables are usually small, so this overhead is minimal.
330                  *
331                  * The latest implementation (5/2009) does not use a mapping at all.
332                  * We use the low-level operation region interface to read the table
333                  * instead of the obvious optimization of using a direct mapping.
334                  * This maintains a consistent use of operation regions across the
335                  * entire subsystem. This is important if additional processing must
336                  * be performed in the (possibly user-installed) operation region
337                  * handler. For example, acpi_exec and ASLTS depend on this.
338                  */
339
340                 /* Allocate a buffer for the table */
341
342                 table = ACPI_ALLOCATE(length);
343                 if (!table) {
344                         return_ACPI_STATUS(AE_NO_MEMORY);
345                 }
346
347                 /* Read the entire table */
348
349                 status = acpi_ex_region_read(obj_desc, length,
350                                              ACPI_CAST_PTR(u8, table));
351                 if (ACPI_FAILURE(status)) {
352                         ACPI_FREE(table);
353                         return_ACPI_STATUS(status);
354                 }
355                 break;
356
357         case ACPI_TYPE_BUFFER:  /* Buffer or resolved region_field */
358
359                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
360                                   "Load table from Buffer or Field %p\n",
361                                   obj_desc));
362
363                 /* Must have at least an ACPI table header */
364
365                 if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
366                         return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
367                 }
368
369                 /* Get the actual table length from the table header */
370
371                 table_header =
372                     ACPI_CAST_PTR(struct acpi_table_header,
373                                   obj_desc->buffer.pointer);
374                 length = table_header->length;
375
376                 /* Table cannot extend beyond the buffer */
377
378                 if (length > obj_desc->buffer.length) {
379                         return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
380                 }
381                 if (length < sizeof(struct acpi_table_header)) {
382                         return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
383                 }
384
385                 /*
386                  * Copy the table from the buffer because the buffer could be
387                  * modified or even deleted in the future
388                  */
389                 table = ACPI_ALLOCATE(length);
390                 if (!table) {
391                         return_ACPI_STATUS(AE_NO_MEMORY);
392                 }
393
394                 memcpy(table, table_header, length);
395                 break;
396
397         default:
398
399                 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
400         }
401
402         /* Install the new table into the local data structures */
403
404         ACPI_INFO(("Dynamic OEM Table Load:"));
405         acpi_ex_exit_interpreter();
406         status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
407                                                 ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
408                                                 TRUE, &table_index);
409         acpi_ex_enter_interpreter();
410         if (ACPI_FAILURE(status)) {
411
412                 /* Delete allocated table buffer */
413
414                 ACPI_FREE(table);
415                 return_ACPI_STATUS(status);
416         }
417
418         /*
419          * Add the table to the namespace.
420          *
421          * Note: Load the table objects relative to the root of the namespace.
422          * This appears to go against the ACPI specification, but we do it for
423          * compatibility with other ACPI implementations.
424          */
425         status = acpi_ex_add_table(table_index, &ddb_handle);
426         if (ACPI_FAILURE(status)) {
427
428                 /* On error, table_ptr was deallocated above */
429
430                 return_ACPI_STATUS(status);
431         }
432
433         /* Store the ddb_handle into the Target operand */
434
435         status = acpi_ex_store(ddb_handle, target, walk_state);
436         if (ACPI_FAILURE(status)) {
437                 (void)acpi_ex_unload_table(ddb_handle);
438
439                 /* table_ptr was deallocated above */
440
441                 acpi_ut_remove_reference(ddb_handle);
442                 return_ACPI_STATUS(status);
443         }
444
445         /* Remove the reference by added by acpi_ex_store above */
446
447         acpi_ut_remove_reference(ddb_handle);
448         return_ACPI_STATUS(status);
449 }
450
451 /*******************************************************************************
452  *
453  * FUNCTION:    acpi_ex_unload_table
454  *
455  * PARAMETERS:  ddb_handle          - Handle to a previously loaded table
456  *
457  * RETURN:      Status
458  *
459  * DESCRIPTION: Unload an ACPI table
460  *
461  ******************************************************************************/
462
463 acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
464 {
465         acpi_status status = AE_OK;
466         union acpi_operand_object *table_desc = ddb_handle;
467         u32 table_index;
468
469         ACPI_FUNCTION_TRACE(ex_unload_table);
470
471         /*
472          * Temporarily emit a warning so that the ASL for the machine can be
473          * hopefully obtained. This is to say that the Unload() operator is
474          * extremely rare if not completely unused.
475          */
476         ACPI_WARNING((AE_INFO, "Received request to unload an ACPI table"));
477
478         /*
479          * Validate the handle
480          * Although the handle is partially validated in acpi_ex_reconfiguration()
481          * when it calls acpi_ex_resolve_operands(), the handle is more completely
482          * validated here.
483          *
484          * Handle must be a valid operand object of type reference. Also, the
485          * ddb_handle must still be marked valid (table has not been previously
486          * unloaded)
487          */
488         if ((!ddb_handle) ||
489             (ACPI_GET_DESCRIPTOR_TYPE(ddb_handle) != ACPI_DESC_TYPE_OPERAND) ||
490             (ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE) ||
491             (!(ddb_handle->common.flags & AOPOBJ_DATA_VALID))) {
492                 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
493         }
494
495         /* Get the table index from the ddb_handle */
496
497         table_index = table_desc->reference.value;
498
499         /*
500          * Release the interpreter lock so that the table lock won't have
501          * strict order requirement against it.
502          */
503         acpi_ex_exit_interpreter();
504         status = acpi_tb_unload_table(table_index);
505         acpi_ex_enter_interpreter();
506
507         /*
508          * Invalidate the handle. We do this because the handle may be stored
509          * in a named object and may not be actually deleted until much later.
510          */
511         if (ACPI_SUCCESS(status)) {
512                 ddb_handle->common.flags &= ~AOPOBJ_DATA_VALID;
513         }
514         return_ACPI_STATUS(status);
515 }