Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/components/tables/tbxfload.c
48400 views
1
/******************************************************************************
2
*
3
* Module Name: tbxfload - Table load/unload external interfaces
4
*
5
*****************************************************************************/
6
7
/******************************************************************************
8
*
9
* 1. Copyright Notice
10
*
11
* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
12
* All rights reserved.
13
*
14
* 2. License
15
*
16
* 2.1. This is your license from Intel Corp. under its intellectual property
17
* rights. You may have additional license terms from the party that provided
18
* you this software, covering your right to use that party's intellectual
19
* property rights.
20
*
21
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22
* copy of the source code appearing in this file ("Covered Code") an
23
* irrevocable, perpetual, worldwide license under Intel's copyrights in the
24
* base code distributed originally by Intel ("Original Intel Code") to copy,
25
* make derivatives, distribute, use and display any portion of the Covered
26
* Code in any form, with the right to sublicense such rights; and
27
*
28
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29
* license (with the right to sublicense), under only those claims of Intel
30
* patents that are infringed by the Original Intel Code, to make, use, sell,
31
* offer to sell, and import the Covered Code and derivative works thereof
32
* solely to the minimum extent necessary to exercise the above copyright
33
* license, and in no event shall the patent license extend to any additions
34
* to or modifications of the Original Intel Code. No other license or right
35
* is granted directly or by implication, estoppel or otherwise;
36
*
37
* The above copyright and patent license is granted only if the following
38
* conditions are met:
39
*
40
* 3. Conditions
41
*
42
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
43
* Redistribution of source code of any substantial portion of the Covered
44
* Code or modification with rights to further distribute source must include
45
* the above Copyright Notice, the above License, this list of Conditions,
46
* and the following Disclaimer and Export Compliance provision. In addition,
47
* Licensee must cause all Covered Code to which Licensee contributes to
48
* contain a file documenting the changes Licensee made to create that Covered
49
* Code and the date of any change. Licensee must include in that file the
50
* documentation of any changes made by any predecessor Licensee. Licensee
51
* must include a prominent statement that the modification is derived,
52
* directly or indirectly, from Original Intel Code.
53
*
54
* 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55
* Redistribution of source code of any substantial portion of the Covered
56
* Code or modification without rights to further distribute source must
57
* include the following Disclaimer and Export Compliance provision in the
58
* documentation and/or other materials provided with distribution. In
59
* addition, Licensee may not authorize further sublicense of source of any
60
* portion of the Covered Code, and must include terms to the effect that the
61
* license from Licensee to its licensee is limited to the intellectual
62
* property embodied in the software Licensee provides to its licensee, and
63
* not to intellectual property embodied in modifications its licensee may
64
* make.
65
*
66
* 3.3. Redistribution of Executable. Redistribution in executable form of any
67
* substantial portion of the Covered Code or modification must reproduce the
68
* above Copyright Notice, and the following Disclaimer and Export Compliance
69
* provision in the documentation and/or other materials provided with the
70
* distribution.
71
*
72
* 3.4. Intel retains all right, title, and interest in and to the Original
73
* Intel Code.
74
*
75
* 3.5. Neither the name Intel nor any other trademark owned or controlled by
76
* Intel shall be used in advertising or otherwise to promote the sale, use or
77
* other dealings in products derived from or relating to the Covered Code
78
* without prior written authorization from Intel.
79
*
80
* 4. Disclaimer and Export Compliance
81
*
82
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
* PARTICULAR PURPOSE.
89
*
90
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
* LIMITED REMEDY.
98
*
99
* 4.3. Licensee shall not export, either directly or indirectly, any of this
100
* software or system incorporating such software without first obtaining any
101
* required license or other approval from the U. S. Department of Commerce or
102
* any other agency or department of the United States Government. In the
103
* event Licensee exports any such software from the United States or
104
* re-exports any such software from a foreign destination, Licensee shall
105
* ensure that the distribution and export/re-export of the software is in
106
* compliance with all laws, regulations, orders, or other restrictions of the
107
* U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
* any of its subsidiaries will export/re-export any technical data, process,
109
* software, or service, directly or indirectly, to any country for which the
110
* United States government or any agency thereof requires an export license,
111
* other governmental approval, or letter of assurance, without first obtaining
112
* such license, approval or letter.
113
*
114
*****************************************************************************
115
*
116
* Alternatively, you may choose to be licensed under the terms of the
117
* following license:
118
*
119
* Redistribution and use in source and binary forms, with or without
120
* modification, are permitted provided that the following conditions
121
* are met:
122
* 1. Redistributions of source code must retain the above copyright
123
* notice, this list of conditions, and the following disclaimer,
124
* without modification.
125
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
126
* substantially similar to the "NO WARRANTY" disclaimer below
127
* ("Disclaimer") and any redistribution must be conditioned upon
128
* including a substantially similar Disclaimer requirement for further
129
* binary redistribution.
130
* 3. Neither the names of the above-listed copyright holders nor the names
131
* of any contributors may be used to endorse or promote products derived
132
* from this software without specific prior written permission.
133
*
134
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145
*
146
* Alternatively, you may choose to be licensed under the terms of the
147
* GNU General Public License ("GPL") version 2 as published by the Free
148
* Software Foundation.
149
*
150
*****************************************************************************/
151
152
#define EXPORT_ACPI_INTERFACES
153
154
#include <contrib/dev/acpica/include/acpi.h>
155
#include <contrib/dev/acpica/include/accommon.h>
156
#include <contrib/dev/acpica/include/acnamesp.h>
157
#include <contrib/dev/acpica/include/actables.h>
158
#include <contrib/dev/acpica/include/acevents.h>
159
160
#define _COMPONENT ACPI_TABLES
161
ACPI_MODULE_NAME ("tbxfload")
162
163
164
/*******************************************************************************
165
*
166
* FUNCTION: AcpiLoadTables
167
*
168
* PARAMETERS: None
169
*
170
* RETURN: Status
171
*
172
* DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
173
*
174
******************************************************************************/
175
176
ACPI_STATUS ACPI_INIT_FUNCTION
177
AcpiLoadTables (
178
void)
179
{
180
ACPI_STATUS Status;
181
182
183
ACPI_FUNCTION_TRACE (AcpiLoadTables);
184
185
186
/*
187
* Install the default operation region handlers. These are the
188
* handlers that are defined by the ACPI specification to be
189
* "always accessible" -- namely, SystemMemory, SystemIO, and
190
* PCI_Config. This also means that no _REG methods need to be
191
* run for these address spaces. We need to have these handlers
192
* installed before any AML code can be executed, especially any
193
* module-level code (11/2015).
194
* Note that we allow OSPMs to install their own region handlers
195
* between AcpiInitializeSubsystem() and AcpiLoadTables() to use
196
* their customized default region handlers.
197
*/
198
Status = AcpiEvInstallRegionHandlers ();
199
if (ACPI_FAILURE (Status))
200
{
201
ACPI_EXCEPTION ((AE_INFO, Status, "During Region initialization"));
202
return_ACPI_STATUS (Status);
203
}
204
205
/* Load the namespace from the tables */
206
207
Status = AcpiTbLoadNamespace ();
208
209
/* Don't let single failures abort the load */
210
211
if (Status == AE_CTRL_TERMINATE)
212
{
213
Status = AE_OK;
214
}
215
216
if (ACPI_FAILURE (Status))
217
{
218
ACPI_EXCEPTION ((AE_INFO, Status,
219
"While loading namespace from ACPI tables"));
220
}
221
222
/*
223
* Initialize the objects in the namespace that remain uninitialized.
224
* This runs the executable AML that may be part of the declaration of
225
* these name objects:
226
* OperationRegions, BufferFields, Buffers, and Packages.
227
*
228
*/
229
Status = AcpiNsInitializeObjects ();
230
if (ACPI_SUCCESS (Status))
231
{
232
AcpiGbl_NamespaceInitialized = TRUE;
233
}
234
235
return_ACPI_STATUS (Status);
236
}
237
238
ACPI_EXPORT_SYMBOL_INIT (AcpiLoadTables)
239
240
241
/*******************************************************************************
242
*
243
* FUNCTION: AcpiTbLoadNamespace
244
*
245
* PARAMETERS: None
246
*
247
* RETURN: Status
248
*
249
* DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
250
* the RSDT/XSDT.
251
*
252
******************************************************************************/
253
254
ACPI_STATUS
255
AcpiTbLoadNamespace (
256
void)
257
{
258
ACPI_STATUS Status;
259
UINT32 i;
260
ACPI_TABLE_HEADER *NewDsdt;
261
ACPI_TABLE_DESC *Table;
262
UINT32 TablesLoaded = 0;
263
UINT32 TablesFailed = 0;
264
265
266
ACPI_FUNCTION_TRACE (TbLoadNamespace);
267
268
269
(void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
270
271
/*
272
* Load the namespace. The DSDT is required, but any SSDT and
273
* PSDT tables are optional. Verify the DSDT.
274
*/
275
Table = &AcpiGbl_RootTableList.Tables[AcpiGbl_DsdtIndex];
276
277
if (!AcpiGbl_RootTableList.CurrentTableCount ||
278
!ACPI_COMPARE_NAMESEG (Table->Signature.Ascii, ACPI_SIG_DSDT) ||
279
ACPI_FAILURE (AcpiTbValidateTable (Table)))
280
{
281
Status = AE_NO_ACPI_TABLES;
282
goto UnlockAndExit;
283
}
284
285
/*
286
* Save the DSDT pointer for simple access. This is the mapped memory
287
* address. We must take care here because the address of the .Tables
288
* array can change dynamically as tables are loaded at run-time. Note:
289
* .Pointer field is not validated until after call to AcpiTbValidateTable.
290
*/
291
AcpiGbl_DSDT = Table->Pointer;
292
293
/*
294
* Optionally copy the entire DSDT to local memory (instead of simply
295
* mapping it.) There are some BIOSs that corrupt or replace the original
296
* DSDT, creating the need for this option. Default is FALSE, do not copy
297
* the DSDT.
298
*/
299
if (AcpiGbl_CopyDsdtLocally)
300
{
301
NewDsdt = AcpiTbCopyDsdt (AcpiGbl_DsdtIndex);
302
if (NewDsdt)
303
{
304
AcpiGbl_DSDT = NewDsdt;
305
}
306
}
307
308
/*
309
* Save the original DSDT header for detection of table corruption
310
* and/or replacement of the DSDT from outside the OS.
311
*/
312
memcpy (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
313
sizeof (ACPI_TABLE_HEADER));
314
315
/* Load and parse tables */
316
317
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
318
Status = AcpiNsLoadTable (AcpiGbl_DsdtIndex, AcpiGbl_RootNode);
319
(void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
320
if (ACPI_FAILURE (Status))
321
{
322
ACPI_EXCEPTION ((AE_INFO, Status, "[DSDT] table load failed"));
323
TablesFailed++;
324
}
325
else
326
{
327
TablesLoaded++;
328
}
329
330
/* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
331
332
for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
333
{
334
Table = &AcpiGbl_RootTableList.Tables[i];
335
336
if (!Table->Address ||
337
(!ACPI_COMPARE_NAMESEG (Table->Signature.Ascii, ACPI_SIG_SSDT) &&
338
!ACPI_COMPARE_NAMESEG (Table->Signature.Ascii, ACPI_SIG_PSDT) &&
339
!ACPI_COMPARE_NAMESEG (Table->Signature.Ascii, ACPI_SIG_OSDT)) ||
340
ACPI_FAILURE (AcpiTbValidateTable (Table)))
341
{
342
continue;
343
}
344
345
/* Ignore errors while loading tables, get as many as possible */
346
347
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
348
Status = AcpiNsLoadTable (i, AcpiGbl_RootNode);
349
(void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
350
if (ACPI_FAILURE (Status))
351
{
352
ACPI_EXCEPTION ((AE_INFO, Status, "(%4.4s:%8.8s) while loading table",
353
Table->Signature.Ascii, Table->Pointer->OemTableId));
354
355
TablesFailed++;
356
357
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
358
"Table [%4.4s:%8.8s] (id FF) - Table namespace load failed\n\n",
359
Table->Signature.Ascii, Table->Pointer->OemTableId));
360
}
361
else
362
{
363
TablesLoaded++;
364
}
365
}
366
367
if (!TablesFailed)
368
{
369
ACPI_INFO ((
370
"%u ACPI AML tables successfully acquired and loaded",
371
TablesLoaded));
372
}
373
else
374
{
375
ACPI_ERROR ((AE_INFO,
376
"%u table load failures, %u successful",
377
TablesFailed, TablesLoaded));
378
379
/* Indicate at least one failure */
380
381
Status = AE_CTRL_TERMINATE;
382
}
383
384
#ifdef ACPI_APPLICATION
385
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "\n"));
386
#endif
387
388
389
UnlockAndExit:
390
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
391
return_ACPI_STATUS (Status);
392
}
393
394
395
/*******************************************************************************
396
*
397
* FUNCTION: AcpiInstallTable
398
*
399
* PARAMETERS: Table - Pointer to the ACPI table to be installed.
400
*
401
* RETURN: Status
402
*
403
* DESCRIPTION: Dynamically install an ACPI table.
404
* Note: This function should only be invoked after
405
* AcpiInitializeTables() and before AcpiLoadTables().
406
*
407
******************************************************************************/
408
409
ACPI_STATUS ACPI_INIT_FUNCTION
410
AcpiInstallTable (
411
ACPI_TABLE_HEADER *Table)
412
{
413
ACPI_STATUS Status;
414
UINT32 TableIndex;
415
416
417
ACPI_FUNCTION_TRACE (AcpiInstallTable);
418
419
420
Status = AcpiTbInstallStandardTable (ACPI_PTR_TO_PHYSADDR (Table),
421
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, FALSE, &TableIndex);
422
423
return_ACPI_STATUS (Status);
424
}
425
426
ACPI_EXPORT_SYMBOL_INIT (AcpiInstallTable)
427
428
429
/*******************************************************************************
430
*
431
* FUNCTION: AcpiInstallPhysicalTable
432
*
433
* PARAMETERS: Address - Address of the ACPI table to be installed.
434
*
435
* RETURN: Status
436
*
437
* DESCRIPTION: Dynamically install an ACPI table.
438
* Note: This function should only be invoked after
439
* AcpiInitializeTables() and before AcpiLoadTables().
440
*
441
******************************************************************************/
442
443
ACPI_STATUS ACPI_INIT_FUNCTION
444
AcpiInstallPhysicalTable (
445
ACPI_PHYSICAL_ADDRESS Address)
446
{
447
ACPI_STATUS Status;
448
UINT32 TableIndex;
449
450
451
ACPI_FUNCTION_TRACE (AcpiInstallPhysicalTable);
452
453
454
Status = AcpiTbInstallStandardTable (Address,
455
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, NULL, FALSE, FALSE, &TableIndex);
456
457
return_ACPI_STATUS (Status);
458
}
459
460
ACPI_EXPORT_SYMBOL_INIT (AcpiInstallPhysicalTable)
461
462
463
/*******************************************************************************
464
*
465
* FUNCTION: AcpiLoadTable
466
*
467
* PARAMETERS: Table - Pointer to a buffer containing the ACPI
468
* table to be loaded.
469
* TableIdx - Pointer to a UINT32 for storing the table
470
* index, might be NULL
471
*
472
* RETURN: Status
473
*
474
* DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
475
* be a valid ACPI table with a valid ACPI table header.
476
* Note1: Mainly intended to support hotplug addition of SSDTs.
477
* Note2: Does not copy the incoming table. User is responsible
478
* to ensure that the table is not deleted or unmapped.
479
*
480
******************************************************************************/
481
482
ACPI_STATUS
483
AcpiLoadTable (
484
ACPI_TABLE_HEADER *Table,
485
UINT32 *TableIdx)
486
{
487
ACPI_STATUS Status;
488
UINT32 TableIndex;
489
490
491
ACPI_FUNCTION_TRACE (AcpiLoadTable);
492
493
494
/* Parameter validation */
495
496
if (!Table)
497
{
498
return_ACPI_STATUS (AE_BAD_PARAMETER);
499
}
500
501
/* Install the table and load it into the namespace */
502
503
ACPI_INFO (("Host-directed Dynamic ACPI Table Load:"));
504
Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),
505
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, Table, FALSE, &TableIndex);
506
if (TableIdx)
507
{
508
*TableIdx = TableIndex;
509
}
510
511
if (ACPI_SUCCESS (Status))
512
{
513
/* Complete the initialization/resolution of new objects */
514
515
AcpiNsInitializeObjects ();
516
}
517
518
return_ACPI_STATUS (Status);
519
}
520
521
ACPI_EXPORT_SYMBOL (AcpiLoadTable)
522
523
524
/*******************************************************************************
525
*
526
* FUNCTION: AcpiUnloadParentTable
527
*
528
* PARAMETERS: Object - Handle to any namespace object owned by
529
* the table to be unloaded
530
*
531
* RETURN: Status
532
*
533
* DESCRIPTION: Via any namespace object within an SSDT or OEMx table, unloads
534
* the table and deletes all namespace objects associated with
535
* that table. Unloading of the DSDT is not allowed.
536
* Note: Mainly intended to support hotplug removal of SSDTs.
537
*
538
******************************************************************************/
539
540
ACPI_STATUS
541
AcpiUnloadParentTable (
542
ACPI_HANDLE Object)
543
{
544
ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Object);
545
ACPI_STATUS Status = AE_NOT_EXIST;
546
ACPI_OWNER_ID OwnerId;
547
UINT32 i;
548
549
550
ACPI_FUNCTION_TRACE (AcpiUnloadParentTable);
551
552
553
/* Parameter validation */
554
555
if (!Object)
556
{
557
return_ACPI_STATUS (AE_BAD_PARAMETER);
558
}
559
560
/*
561
* The node OwnerId is currently the same as the parent table ID.
562
* However, this could change in the future.
563
*/
564
OwnerId = Node->OwnerId;
565
if (!OwnerId)
566
{
567
/* OwnerId==0 means DSDT is the owner. DSDT cannot be unloaded */
568
569
return_ACPI_STATUS (AE_TYPE);
570
}
571
572
/* Must acquire the table lock during this operation */
573
574
Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
575
if (ACPI_FAILURE (Status))
576
{
577
return_ACPI_STATUS (Status);
578
}
579
580
/* Find the table in the global table list */
581
582
for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
583
{
584
if (OwnerId != AcpiGbl_RootTableList.Tables[i].OwnerId)
585
{
586
continue;
587
}
588
589
/*
590
* Allow unload of SSDT and OEMx tables only. Do not allow unload
591
* of the DSDT. No other types of tables should get here, since
592
* only these types can contain AML and thus are the only types
593
* that can create namespace objects.
594
*/
595
if (ACPI_COMPARE_NAMESEG (
596
AcpiGbl_RootTableList.Tables[i].Signature.Ascii,
597
ACPI_SIG_DSDT))
598
{
599
Status = AE_TYPE;
600
break;
601
}
602
603
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
604
Status = AcpiTbUnloadTable (i);
605
(void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
606
break;
607
}
608
609
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
610
return_ACPI_STATUS (Status);
611
}
612
613
ACPI_EXPORT_SYMBOL (AcpiUnloadParentTable)
614
615
616
/*******************************************************************************
617
*
618
* FUNCTION: AcpiUnloadTable
619
*
620
* PARAMETERS: TableIndex - Index as returned by AcpiLoadTable
621
*
622
* RETURN: Status
623
*
624
* DESCRIPTION: Via the TableIndex representing an SSDT or OEMx table, unloads
625
* the table and deletes all namespace objects associated with
626
* that table. Unloading of the DSDT is not allowed.
627
* Note: Mainly intended to support hotplug removal of SSDTs.
628
*
629
******************************************************************************/
630
631
ACPI_STATUS
632
AcpiUnloadTable (
633
UINT32 TableIndex)
634
{
635
ACPI_STATUS Status;
636
637
638
ACPI_FUNCTION_TRACE (AcpiUnloadTable);
639
640
641
if (TableIndex == 1)
642
{
643
/* TableIndex==1 means DSDT is the owner. DSDT cannot be unloaded */
644
645
return_ACPI_STATUS (AE_TYPE);
646
}
647
648
Status = AcpiTbUnloadTable (TableIndex);
649
return_ACPI_STATUS (Status);
650
}
651
652
ACPI_EXPORT_SYMBOL (AcpiUnloadTable)
653
654