GNU Linux-libre 4.19.242-gnu1
[releases.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         /* Complete the initialization/resolution of package objects */
178
179         status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT,
180                                         ACPI_UINT32_MAX, 0,
181                                         acpi_ns_init_one_package, NULL, NULL,
182                                         NULL);
183
184         /* Parameter Data (optional) */
185
186         if (parameter_node) {
187
188                 /* Store the parameter data into the optional parameter object */
189
190                 status = acpi_ex_store(operand[5],
191                                        ACPI_CAST_PTR(union acpi_operand_object,
192                                                      parameter_node),
193                                        walk_state);
194                 if (ACPI_FAILURE(status)) {
195                         (void)acpi_ex_unload_table(ddb_handle);
196
197                         acpi_ut_remove_reference(ddb_handle);
198                         return_ACPI_STATUS(status);
199                 }
200         }
201
202         *return_desc = ddb_handle;
203         return_ACPI_STATUS(status);
204 }
205
206 /*******************************************************************************
207  *
208  * FUNCTION:    acpi_ex_region_read
209  *
210  * PARAMETERS:  obj_desc        - Region descriptor
211  *              length          - Number of bytes to read
212  *              buffer          - Pointer to where to put the data
213  *
214  * RETURN:      Status
215  *
216  * DESCRIPTION: Read data from an operation region. The read starts from the
217  *              beginning of the region.
218  *
219  ******************************************************************************/
220
221 static acpi_status
222 acpi_ex_region_read(union acpi_operand_object *obj_desc, u32 length, u8 *buffer)
223 {
224         acpi_status status;
225         u64 value;
226         u32 region_offset = 0;
227         u32 i;
228
229         /* Bytewise reads */
230
231         for (i = 0; i < length; i++) {
232                 status =
233                     acpi_ev_address_space_dispatch(obj_desc, NULL, ACPI_READ,
234                                                    region_offset, 8, &value);
235                 if (ACPI_FAILURE(status)) {
236                         return (status);
237                 }
238
239                 *buffer = (u8)value;
240                 buffer++;
241                 region_offset++;
242         }
243
244         return (AE_OK);
245 }
246
247 /*******************************************************************************
248  *
249  * FUNCTION:    acpi_ex_load_op
250  *
251  * PARAMETERS:  obj_desc        - Region or Buffer/Field where the table will be
252  *                                obtained
253  *              target          - Where a handle to the table will be stored
254  *              walk_state      - Current state
255  *
256  * RETURN:      Status
257  *
258  * DESCRIPTION: Load an ACPI table from a field or operation region
259  *
260  * NOTE: Region Fields (Field, bank_field, index_fields) are resolved to buffer
261  *       objects before this code is reached.
262  *
263  *       If source is an operation region, it must refer to system_memory, as
264  *       per the ACPI specification.
265  *
266  ******************************************************************************/
267
268 acpi_status
269 acpi_ex_load_op(union acpi_operand_object *obj_desc,
270                 union acpi_operand_object *target,
271                 struct acpi_walk_state *walk_state)
272 {
273         union acpi_operand_object *ddb_handle;
274         struct acpi_table_header *table_header;
275         struct acpi_table_header *table;
276         u32 table_index;
277         acpi_status status;
278         u32 length;
279
280         ACPI_FUNCTION_TRACE(ex_load_op);
281
282         /* Source Object can be either an op_region or a Buffer/Field */
283
284         switch (obj_desc->common.type) {
285         case ACPI_TYPE_REGION:
286
287                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
288                                   "Load table from Region %p\n", obj_desc));
289
290                 /* Region must be system_memory (from ACPI spec) */
291
292                 if (obj_desc->region.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
293                         return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
294                 }
295
296                 /*
297                  * If the Region Address and Length have not been previously
298                  * evaluated, evaluate them now and save the results.
299                  */
300                 if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) {
301                         status = acpi_ds_get_region_arguments(obj_desc);
302                         if (ACPI_FAILURE(status)) {
303                                 return_ACPI_STATUS(status);
304                         }
305                 }
306
307                 /* Get the table header first so we can get the table length */
308
309                 table_header = ACPI_ALLOCATE(sizeof(struct acpi_table_header));
310                 if (!table_header) {
311                         return_ACPI_STATUS(AE_NO_MEMORY);
312                 }
313
314                 status =
315                     acpi_ex_region_read(obj_desc,
316                                         sizeof(struct acpi_table_header),
317                                         ACPI_CAST_PTR(u8, table_header));
318                 length = table_header->length;
319                 ACPI_FREE(table_header);
320
321                 if (ACPI_FAILURE(status)) {
322                         return_ACPI_STATUS(status);
323                 }
324
325                 /* Must have at least an ACPI table header */
326
327                 if (length < sizeof(struct acpi_table_header)) {
328                         return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
329                 }
330
331                 /*
332                  * The original implementation simply mapped the table, with no copy.
333                  * However, the memory region is not guaranteed to remain stable and
334                  * we must copy the table to a local buffer. For example, the memory
335                  * region is corrupted after suspend on some machines. Dynamically
336                  * loaded tables are usually small, so this overhead is minimal.
337                  *
338                  * The latest implementation (5/2009) does not use a mapping at all.
339                  * We use the low-level operation region interface to read the table
340                  * instead of the obvious optimization of using a direct mapping.
341                  * This maintains a consistent use of operation regions across the
342                  * entire subsystem. This is important if additional processing must
343                  * be performed in the (possibly user-installed) operation region
344                  * handler. For example, acpi_exec and ASLTS depend on this.
345                  */
346
347                 /* Allocate a buffer for the table */
348
349                 table = ACPI_ALLOCATE(length);
350                 if (!table) {
351                         return_ACPI_STATUS(AE_NO_MEMORY);
352                 }
353
354                 /* Read the entire table */
355
356                 status = acpi_ex_region_read(obj_desc, length,
357                                              ACPI_CAST_PTR(u8, table));
358                 if (ACPI_FAILURE(status)) {
359                         ACPI_FREE(table);
360                         return_ACPI_STATUS(status);
361                 }
362                 break;
363
364         case ACPI_TYPE_BUFFER:  /* Buffer or resolved region_field */
365
366                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
367                                   "Load table from Buffer or Field %p\n",
368                                   obj_desc));
369
370                 /* Must have at least an ACPI table header */
371
372                 if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
373                         return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
374                 }
375
376                 /* Get the actual table length from the table header */
377
378                 table_header =
379                     ACPI_CAST_PTR(struct acpi_table_header,
380                                   obj_desc->buffer.pointer);
381                 length = table_header->length;
382
383                 /* Table cannot extend beyond the buffer */
384
385                 if (length > obj_desc->buffer.length) {
386                         return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
387                 }
388                 if (length < sizeof(struct acpi_table_header)) {
389                         return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
390                 }
391
392                 /*
393                  * Copy the table from the buffer because the buffer could be
394                  * modified or even deleted in the future
395                  */
396                 table = ACPI_ALLOCATE(length);
397                 if (!table) {
398                         return_ACPI_STATUS(AE_NO_MEMORY);
399                 }
400
401                 memcpy(table, table_header, length);
402                 break;
403
404         default:
405
406                 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
407         }
408
409         /* Install the new table into the local data structures */
410
411         ACPI_INFO(("Dynamic OEM Table Load:"));
412         acpi_ex_exit_interpreter();
413         status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
414                                                 ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
415                                                 TRUE, &table_index);
416         acpi_ex_enter_interpreter();
417         if (ACPI_FAILURE(status)) {
418
419                 /* Delete allocated table buffer */
420
421                 ACPI_FREE(table);
422                 return_ACPI_STATUS(status);
423         }
424
425         /*
426          * Add the table to the namespace.
427          *
428          * Note: Load the table objects relative to the root of the namespace.
429          * This appears to go against the ACPI specification, but we do it for
430          * compatibility with other ACPI implementations.
431          */
432         status = acpi_ex_add_table(table_index, &ddb_handle);
433         if (ACPI_FAILURE(status)) {
434
435                 /* On error, table_ptr was deallocated above */
436
437                 return_ACPI_STATUS(status);
438         }
439
440         /* Complete the initialization/resolution of package objects */
441
442         status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT,
443                                         ACPI_UINT32_MAX, 0,
444                                         acpi_ns_init_one_package, NULL, NULL,
445                                         NULL);
446
447         /* Store the ddb_handle into the Target operand */
448
449         status = acpi_ex_store(ddb_handle, target, walk_state);
450         if (ACPI_FAILURE(status)) {
451                 (void)acpi_ex_unload_table(ddb_handle);
452
453                 /* table_ptr was deallocated above */
454
455                 acpi_ut_remove_reference(ddb_handle);
456                 return_ACPI_STATUS(status);
457         }
458
459         /* Remove the reference by added by acpi_ex_store above */
460
461         acpi_ut_remove_reference(ddb_handle);
462         return_ACPI_STATUS(status);
463 }
464
465 /*******************************************************************************
466  *
467  * FUNCTION:    acpi_ex_unload_table
468  *
469  * PARAMETERS:  ddb_handle          - Handle to a previously loaded table
470  *
471  * RETURN:      Status
472  *
473  * DESCRIPTION: Unload an ACPI table
474  *
475  ******************************************************************************/
476
477 acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
478 {
479         acpi_status status = AE_OK;
480         union acpi_operand_object *table_desc = ddb_handle;
481         u32 table_index;
482
483         ACPI_FUNCTION_TRACE(ex_unload_table);
484
485         /*
486          * Temporarily emit a warning so that the ASL for the machine can be
487          * hopefully obtained. This is to say that the Unload() operator is
488          * extremely rare if not completely unused.
489          */
490         ACPI_WARNING((AE_INFO, "Received request to unload an ACPI table"));
491
492         /*
493          * May 2018: Unload is no longer supported for the following reasons:
494          * 1) A correct implementation on some hosts may not be possible.
495          * 2) Other ACPI implementations do not correctly/fully support it.
496          * 3) It requires host device driver support which does not exist.
497          *    (To properly support namespace unload out from underneath.)
498          * 4) This AML operator has never been seen in the field.
499          */
500         ACPI_EXCEPTION((AE_INFO, AE_NOT_IMPLEMENTED,
501                         "AML Unload operator is not supported"));
502
503         /*
504          * Validate the handle
505          * Although the handle is partially validated in acpi_ex_reconfiguration()
506          * when it calls acpi_ex_resolve_operands(), the handle is more completely
507          * validated here.
508          *
509          * Handle must be a valid operand object of type reference. Also, the
510          * ddb_handle must still be marked valid (table has not been previously
511          * unloaded)
512          */
513         if ((!ddb_handle) ||
514             (ACPI_GET_DESCRIPTOR_TYPE(ddb_handle) != ACPI_DESC_TYPE_OPERAND) ||
515             (ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE) ||
516             (!(ddb_handle->common.flags & AOPOBJ_DATA_VALID))) {
517                 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
518         }
519
520         /* Get the table index from the ddb_handle */
521
522         table_index = table_desc->reference.value;
523
524         /*
525          * Release the interpreter lock so that the table lock won't have
526          * strict order requirement against it.
527          */
528         acpi_ex_exit_interpreter();
529         status = acpi_tb_unload_table(table_index);
530         acpi_ex_enter_interpreter();
531
532         /*
533          * Invalidate the handle. We do this because the handle may be stored
534          * in a named object and may not be actually deleted until much later.
535          */
536         if (ACPI_SUCCESS(status)) {
537                 ddb_handle->common.flags &= ~AOPOBJ_DATA_VALID;
538         }
539         return_ACPI_STATUS(status);
540 }