xref: /netbsd-src/sys/external/bsd/acpica/dist/tools/examples/examples.c (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
128c506b8Sjruoho /******************************************************************************
228c506b8Sjruoho  *
3ff4a156dSchristos  * Module Name: examples - Example ACPICA initialization and execution code
428c506b8Sjruoho  *
528c506b8Sjruoho  *****************************************************************************/
628c506b8Sjruoho 
7124f4c82Sjruoho /*
8*046a2985Schristos  * Copyright (C) 2000 - 2023, Intel Corp.
928c506b8Sjruoho  * All rights reserved.
1028c506b8Sjruoho  *
11124f4c82Sjruoho  * Redistribution and use in source and binary forms, with or without
12124f4c82Sjruoho  * modification, are permitted provided that the following conditions
13124f4c82Sjruoho  * are met:
14124f4c82Sjruoho  * 1. Redistributions of source code must retain the above copyright
15124f4c82Sjruoho  *    notice, this list of conditions, and the following disclaimer,
16124f4c82Sjruoho  *    without modification.
17124f4c82Sjruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18124f4c82Sjruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
19124f4c82Sjruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
20124f4c82Sjruoho  *    including a substantially similar Disclaimer requirement for further
21124f4c82Sjruoho  *    binary redistribution.
22124f4c82Sjruoho  * 3. Neither the names of the above-listed copyright holders nor the names
23124f4c82Sjruoho  *    of any contributors may be used to endorse or promote products derived
24124f4c82Sjruoho  *    from this software without specific prior written permission.
2528c506b8Sjruoho  *
26124f4c82Sjruoho  * Alternatively, this software may be distributed under the terms of the
27124f4c82Sjruoho  * GNU General Public License ("GPL") version 2 as published by the Free
28124f4c82Sjruoho  * Software Foundation.
2928c506b8Sjruoho  *
30124f4c82Sjruoho  * NO WARRANTY
31124f4c82Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32124f4c82Sjruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3346a330b4Schristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34124f4c82Sjruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35124f4c82Sjruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36124f4c82Sjruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37124f4c82Sjruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38124f4c82Sjruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39124f4c82Sjruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40124f4c82Sjruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41124f4c82Sjruoho  * POSSIBILITY OF SUCH DAMAGES.
42124f4c82Sjruoho  */
4328c506b8Sjruoho 
44ff4a156dSchristos #include "examples.h"
4528c506b8Sjruoho 
4628c506b8Sjruoho #define _COMPONENT          ACPI_EXAMPLE
4728c506b8Sjruoho         ACPI_MODULE_NAME    ("examples")
4828c506b8Sjruoho 
4928c506b8Sjruoho 
5028c506b8Sjruoho /******************************************************************************
5128c506b8Sjruoho  *
5228c506b8Sjruoho  * ACPICA Example Code
5328c506b8Sjruoho  *
5428c506b8Sjruoho  * This module contains examples of how the host OS should interface to the
5528c506b8Sjruoho  * ACPICA subsystem.
5628c506b8Sjruoho  *
5728c506b8Sjruoho  * 1) How to use the platform/acenv.h file and how to set configuration
5828c506b8Sjruoho  *      options.
5928c506b8Sjruoho  *
6028c506b8Sjruoho  * 2) main - using the debug output mechanism and the error/warning output
6128c506b8Sjruoho  *      macros.
6228c506b8Sjruoho  *
6328c506b8Sjruoho  * 3) Two examples of the ACPICA initialization sequence. The first is a
6428c506b8Sjruoho  *      initialization with no "early" ACPI table access. The second shows
6528c506b8Sjruoho  *      how to use ACPICA to obtain the tables very early during kernel
6628c506b8Sjruoho  *      initialization, even before dynamic memory is available.
6728c506b8Sjruoho  *
6828c506b8Sjruoho  * 4) How to invoke a control method, including argument setup and how to
6928c506b8Sjruoho  *      access the return value.
7028c506b8Sjruoho  *
7128c506b8Sjruoho  *****************************************************************************/
7228c506b8Sjruoho 
7328c506b8Sjruoho 
7428c506b8Sjruoho /* Local Prototypes */
7528c506b8Sjruoho 
76ff4a156dSchristos static ACPI_STATUS
77ff4a156dSchristos InitializeFullAcpica (void);
7828c506b8Sjruoho 
79ff4a156dSchristos static ACPI_STATUS
8028c506b8Sjruoho InstallHandlers (void);
8128c506b8Sjruoho 
82ff4a156dSchristos static void
83ff4a156dSchristos NotifyHandler (
84ff4a156dSchristos     ACPI_HANDLE             Device,
85ff4a156dSchristos     UINT32                  Value,
86ff4a156dSchristos     void                    *Context);
87ff4a156dSchristos 
88460301d4Schristos static ACPI_STATUS
89460301d4Schristos RegionHandler (
90460301d4Schristos     UINT32                  Function,
91460301d4Schristos     ACPI_PHYSICAL_ADDRESS   Address,
92460301d4Schristos     UINT32                  BitWidth,
93460301d4Schristos     UINT64                  *Value,
94460301d4Schristos     void                    *HandlerContext,
95460301d4Schristos     void                    *RegionContext);
96460301d4Schristos 
97460301d4Schristos static ACPI_STATUS
98460301d4Schristos RegionInit (
99460301d4Schristos     ACPI_HANDLE             RegionHandle,
100460301d4Schristos     UINT32                  Function,
101460301d4Schristos     void                    *HandlerContext,
102460301d4Schristos     void                    **RegionContext);
103460301d4Schristos 
104ff4a156dSchristos static void
105ff4a156dSchristos ExecuteMAIN (void);
106ff4a156dSchristos 
107ff4a156dSchristos ACPI_STATUS
108ff4a156dSchristos InitializeAcpiTables (
109ff4a156dSchristos     void);
110ff4a156dSchristos 
111ff4a156dSchristos ACPI_STATUS
112ff4a156dSchristos InitializeAcpi (
113ff4a156dSchristos     void);
114ff4a156dSchristos 
11528c506b8Sjruoho 
11628c506b8Sjruoho /******************************************************************************
11728c506b8Sjruoho  *
11828c506b8Sjruoho  * FUNCTION:    main
11928c506b8Sjruoho  *
12028c506b8Sjruoho  * PARAMETERS:  argc, argv
12128c506b8Sjruoho  *
12228c506b8Sjruoho  * RETURN:      Status
12328c506b8Sjruoho  *
12428c506b8Sjruoho  * DESCRIPTION: Main routine. Shows the use of the various output macros, as
12528c506b8Sjruoho  *              well as the use of the debug layer/level globals.
12628c506b8Sjruoho  *
12728c506b8Sjruoho  *****************************************************************************/
12828c506b8Sjruoho 
12928c506b8Sjruoho int ACPI_SYSTEM_XFACE
main(int argc,char ** argv)13028c506b8Sjruoho main (
13128c506b8Sjruoho     int                     argc,
13228c506b8Sjruoho     char                    **argv)
13328c506b8Sjruoho {
13428c506b8Sjruoho 
135ff4a156dSchristos     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
13628c506b8Sjruoho 
137ff4a156dSchristos     printf (ACPI_COMMON_SIGNON ("ACPI Example Code"));
13828c506b8Sjruoho 
139ff4a156dSchristos     /* Initialize the local ACPI tables (RSDP/RSDT/XSDT/FADT/DSDT/FACS) */
14028c506b8Sjruoho 
141ff4a156dSchristos     ExInitializeAcpiTables ();
142ff4a156dSchristos 
143ff4a156dSchristos     /* Initialize the ACPICA subsystem */
144ff4a156dSchristos 
145ff4a156dSchristos     InitializeFullAcpica ();
14628c506b8Sjruoho 
14728c506b8Sjruoho     /* Example warning and error output */
14828c506b8Sjruoho 
149cfbb7280Schristos     ACPI_INFO        (("Example ACPICA info message"));
150ff4a156dSchristos     ACPI_WARNING     ((AE_INFO, "Example ACPICA warning message"));
151ff4a156dSchristos     ACPI_ERROR       ((AE_INFO, "Example ACPICA error message"));
15271e38f1dSchristos     ACPI_EXCEPTION   ((AE_INFO, AE_AML_OPERAND_TYPE,
15371e38f1dSchristos         "Example ACPICA exception message"));
15428c506b8Sjruoho 
155b406f703Schristos     ExecuteOSI (NULL, 0);
156ff4a156dSchristos     ExecuteMAIN ();
15728c506b8Sjruoho     return (0);
15828c506b8Sjruoho }
15928c506b8Sjruoho 
16028c506b8Sjruoho 
16128c506b8Sjruoho /******************************************************************************
16228c506b8Sjruoho  *
16328c506b8Sjruoho  * Example ACPICA initialization code. This shows a full initialization with
16428c506b8Sjruoho  * no early ACPI table access.
16528c506b8Sjruoho  *
16628c506b8Sjruoho  *****************************************************************************/
16728c506b8Sjruoho 
168ff4a156dSchristos static ACPI_STATUS
InitializeFullAcpica(void)169ff4a156dSchristos InitializeFullAcpica (void)
17028c506b8Sjruoho {
17128c506b8Sjruoho     ACPI_STATUS             Status;
17228c506b8Sjruoho 
17328c506b8Sjruoho 
17428c506b8Sjruoho     /* Initialize the ACPICA subsystem */
17528c506b8Sjruoho 
17628c506b8Sjruoho     Status = AcpiInitializeSubsystem ();
17728c506b8Sjruoho     if (ACPI_FAILURE (Status))
17828c506b8Sjruoho     {
17928c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While initializing ACPICA"));
18028c506b8Sjruoho         return (Status);
18128c506b8Sjruoho     }
18228c506b8Sjruoho 
18328c506b8Sjruoho     /* Initialize the ACPICA Table Manager and get all ACPI tables */
18428c506b8Sjruoho 
185cfbb7280Schristos     ACPI_INFO (("Loading ACPI tables"));
186ff4a156dSchristos 
18728c506b8Sjruoho     Status = AcpiInitializeTables (NULL, 16, FALSE);
18828c506b8Sjruoho     if (ACPI_FAILURE (Status))
18928c506b8Sjruoho     {
19028c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While initializing Table Manager"));
19128c506b8Sjruoho         return (Status);
19228c506b8Sjruoho     }
19328c506b8Sjruoho 
19428c506b8Sjruoho     /* Install local handlers */
19528c506b8Sjruoho 
19628c506b8Sjruoho     Status = InstallHandlers ();
19728c506b8Sjruoho     if (ACPI_FAILURE (Status))
19828c506b8Sjruoho     {
19928c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While installing handlers"));
20028c506b8Sjruoho         return (Status);
20128c506b8Sjruoho     }
20228c506b8Sjruoho 
20328c506b8Sjruoho     /* Initialize the ACPI hardware */
20428c506b8Sjruoho 
20528c506b8Sjruoho     Status = AcpiEnableSubsystem (ACPI_FULL_INITIALIZATION);
20628c506b8Sjruoho     if (ACPI_FAILURE (Status))
20728c506b8Sjruoho     {
20828c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While enabling ACPICA"));
20928c506b8Sjruoho         return (Status);
21028c506b8Sjruoho     }
21128c506b8Sjruoho 
21271e38f1dSchristos     /* Create the ACPI namespace from ACPI tables */
21371e38f1dSchristos 
21471e38f1dSchristos     Status = AcpiLoadTables ();
21571e38f1dSchristos     if (ACPI_FAILURE (Status))
21671e38f1dSchristos     {
21771e38f1dSchristos         ACPI_EXCEPTION ((AE_INFO, Status, "While loading ACPI tables"));
21871e38f1dSchristos         return (Status);
21971e38f1dSchristos     }
22071e38f1dSchristos 
22128c506b8Sjruoho     /* Complete the ACPI namespace object initialization */
22228c506b8Sjruoho 
22328c506b8Sjruoho     Status = AcpiInitializeObjects (ACPI_FULL_INITIALIZATION);
22428c506b8Sjruoho     if (ACPI_FAILURE (Status))
22528c506b8Sjruoho     {
22628c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While initializing ACPICA objects"));
22728c506b8Sjruoho         return (Status);
22828c506b8Sjruoho     }
22928c506b8Sjruoho 
23028c506b8Sjruoho     return (AE_OK);
23128c506b8Sjruoho }
23228c506b8Sjruoho 
23328c506b8Sjruoho 
23428c506b8Sjruoho /******************************************************************************
23528c506b8Sjruoho  *
23628c506b8Sjruoho  * Example ACPICA initialization code with early ACPI table access. This shows
23728c506b8Sjruoho  * an initialization that requires early access to ACPI tables (before
23828c506b8Sjruoho  * kernel dynamic memory is available)
23928c506b8Sjruoho  *
24028c506b8Sjruoho  *****************************************************************************/
24128c506b8Sjruoho 
24228c506b8Sjruoho /*
24328c506b8Sjruoho  * The purpose of this static table array is to avoid the use of kernel
24428c506b8Sjruoho  * dynamic memory which may not be available during early ACPI table
24528c506b8Sjruoho  * access.
24628c506b8Sjruoho  */
24728c506b8Sjruoho #define ACPI_MAX_INIT_TABLES    16
24828c506b8Sjruoho static ACPI_TABLE_DESC      TableArray[ACPI_MAX_INIT_TABLES];
24928c506b8Sjruoho 
25028c506b8Sjruoho 
25128c506b8Sjruoho /*
25228c506b8Sjruoho  * This function would be called early in kernel initialization. After this
25328c506b8Sjruoho  * is called, all ACPI tables are available to the host.
25428c506b8Sjruoho  */
25528c506b8Sjruoho ACPI_STATUS
InitializeAcpiTables(void)256ff4a156dSchristos InitializeAcpiTables (
257ff4a156dSchristos     void)
25828c506b8Sjruoho {
25928c506b8Sjruoho     ACPI_STATUS             Status;
26028c506b8Sjruoho 
26128c506b8Sjruoho 
26228c506b8Sjruoho     /* Initialize the ACPICA Table Manager and get all ACPI tables */
26328c506b8Sjruoho 
26428c506b8Sjruoho     Status = AcpiInitializeTables (TableArray, ACPI_MAX_INIT_TABLES, TRUE);
26528c506b8Sjruoho     return (Status);
26628c506b8Sjruoho }
26728c506b8Sjruoho 
26828c506b8Sjruoho 
26928c506b8Sjruoho /*
27028c506b8Sjruoho  * This function would be called after the kernel is initialized and
27128c506b8Sjruoho  * dynamic/virtual memory is available. It completes the initialization of
27228c506b8Sjruoho  * the ACPICA subsystem.
27328c506b8Sjruoho  */
27428c506b8Sjruoho ACPI_STATUS
InitializeAcpi(void)275ff4a156dSchristos InitializeAcpi (
276ff4a156dSchristos     void)
27728c506b8Sjruoho {
27828c506b8Sjruoho     ACPI_STATUS             Status;
27928c506b8Sjruoho 
28028c506b8Sjruoho 
28128c506b8Sjruoho     /* Initialize the ACPICA subsystem */
28228c506b8Sjruoho 
28328c506b8Sjruoho     Status = AcpiInitializeSubsystem ();
28428c506b8Sjruoho     if (ACPI_FAILURE (Status))
28528c506b8Sjruoho     {
28628c506b8Sjruoho         return (Status);
28728c506b8Sjruoho     }
28828c506b8Sjruoho 
28928c506b8Sjruoho     /* Copy the root table list to dynamic memory */
29028c506b8Sjruoho 
29128c506b8Sjruoho     Status = AcpiReallocateRootTable ();
29228c506b8Sjruoho     if (ACPI_FAILURE (Status))
29328c506b8Sjruoho     {
29428c506b8Sjruoho         return (Status);
29528c506b8Sjruoho     }
29628c506b8Sjruoho 
29728c506b8Sjruoho     /* Install local handlers */
29828c506b8Sjruoho 
29928c506b8Sjruoho     Status = InstallHandlers ();
30028c506b8Sjruoho     if (ACPI_FAILURE (Status))
30128c506b8Sjruoho     {
30228c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While installing handlers"));
30328c506b8Sjruoho         return (Status);
30428c506b8Sjruoho     }
30528c506b8Sjruoho 
30628c506b8Sjruoho     /* Initialize the ACPI hardware */
30728c506b8Sjruoho 
30828c506b8Sjruoho     Status = AcpiEnableSubsystem (ACPI_FULL_INITIALIZATION);
30928c506b8Sjruoho     if (ACPI_FAILURE (Status))
31028c506b8Sjruoho     {
31128c506b8Sjruoho         return (Status);
31228c506b8Sjruoho     }
31328c506b8Sjruoho 
31471e38f1dSchristos     /* Create the ACPI namespace from ACPI tables */
31571e38f1dSchristos 
31671e38f1dSchristos     Status = AcpiLoadTables ();
31771e38f1dSchristos     if (ACPI_FAILURE (Status))
31871e38f1dSchristos     {
31971e38f1dSchristos         return (Status);
32071e38f1dSchristos     }
32171e38f1dSchristos 
32228c506b8Sjruoho     /* Complete the ACPI namespace object initialization */
32328c506b8Sjruoho 
32428c506b8Sjruoho     Status = AcpiInitializeObjects (ACPI_FULL_INITIALIZATION);
32528c506b8Sjruoho     if (ACPI_FAILURE (Status))
32628c506b8Sjruoho     {
32728c506b8Sjruoho         return (Status);
32828c506b8Sjruoho     }
32928c506b8Sjruoho 
33028c506b8Sjruoho     return (AE_OK);
33128c506b8Sjruoho }
33228c506b8Sjruoho 
33328c506b8Sjruoho 
33428c506b8Sjruoho /******************************************************************************
33528c506b8Sjruoho  *
33628c506b8Sjruoho  * Example ACPICA handler and handler installation
33728c506b8Sjruoho  *
33828c506b8Sjruoho  *****************************************************************************/
33928c506b8Sjruoho 
340ff4a156dSchristos static void
NotifyHandler(ACPI_HANDLE Device,UINT32 Value,void * Context)34128c506b8Sjruoho NotifyHandler (
34228c506b8Sjruoho     ACPI_HANDLE                 Device,
34328c506b8Sjruoho     UINT32                      Value,
34428c506b8Sjruoho     void                        *Context)
34528c506b8Sjruoho {
34628c506b8Sjruoho 
347cfbb7280Schristos     ACPI_INFO (("Received a notify 0x%X", Value));
34828c506b8Sjruoho }
34928c506b8Sjruoho 
35028c506b8Sjruoho 
351ff4a156dSchristos static ACPI_STATUS
RegionInit(ACPI_HANDLE RegionHandle,UINT32 Function,void * HandlerContext,void ** RegionContext)352460301d4Schristos RegionInit (
353460301d4Schristos     ACPI_HANDLE                 RegionHandle,
354460301d4Schristos     UINT32                      Function,
355460301d4Schristos     void                        *HandlerContext,
356460301d4Schristos     void                        **RegionContext)
357460301d4Schristos {
358460301d4Schristos 
359460301d4Schristos     if (Function == ACPI_REGION_DEACTIVATE)
360460301d4Schristos     {
361460301d4Schristos         *RegionContext = NULL;
362460301d4Schristos     }
363460301d4Schristos     else
364460301d4Schristos     {
365460301d4Schristos         *RegionContext = RegionHandle;
366460301d4Schristos     }
367460301d4Schristos 
368460301d4Schristos     return (AE_OK);
369460301d4Schristos }
370460301d4Schristos 
371460301d4Schristos 
372460301d4Schristos static ACPI_STATUS
RegionHandler(UINT32 Function,ACPI_PHYSICAL_ADDRESS Address,UINT32 BitWidth,UINT64 * Value,void * HandlerContext,void * RegionContext)373460301d4Schristos RegionHandler (
374460301d4Schristos     UINT32                      Function,
375460301d4Schristos     ACPI_PHYSICAL_ADDRESS       Address,
376460301d4Schristos     UINT32                      BitWidth,
377460301d4Schristos     UINT64                      *Value,
378460301d4Schristos     void                        *HandlerContext,
379460301d4Schristos     void                        *RegionContext)
380460301d4Schristos {
381460301d4Schristos 
382cfbb7280Schristos     ACPI_INFO (("Received a region access"));
383460301d4Schristos 
384460301d4Schristos     return (AE_OK);
385460301d4Schristos }
386460301d4Schristos 
387460301d4Schristos 
388460301d4Schristos static ACPI_STATUS
InstallHandlers(void)38928c506b8Sjruoho InstallHandlers (void)
39028c506b8Sjruoho {
39128c506b8Sjruoho     ACPI_STATUS             Status;
39228c506b8Sjruoho 
39328c506b8Sjruoho 
39428c506b8Sjruoho     /* Install global notify handler */
39528c506b8Sjruoho 
39671e38f1dSchristos     Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT,
39771e38f1dSchristos         ACPI_SYSTEM_NOTIFY, NotifyHandler, NULL);
39828c506b8Sjruoho     if (ACPI_FAILURE (Status))
39928c506b8Sjruoho     {
40028c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While installing Notify handler"));
40128c506b8Sjruoho         return (Status);
40228c506b8Sjruoho     }
40328c506b8Sjruoho 
40471e38f1dSchristos     Status = AcpiInstallAddressSpaceHandler (ACPI_ROOT_OBJECT,
40571e38f1dSchristos         ACPI_ADR_SPACE_SYSTEM_MEMORY, RegionHandler, RegionInit, NULL);
406460301d4Schristos     if (ACPI_FAILURE (Status))
407460301d4Schristos     {
408460301d4Schristos         ACPI_EXCEPTION ((AE_INFO, Status, "While installing an OpRegion handler"));
409460301d4Schristos         return (Status);
410460301d4Schristos     }
411460301d4Schristos 
41228c506b8Sjruoho     return (AE_OK);
41328c506b8Sjruoho }
41428c506b8Sjruoho 
41528c506b8Sjruoho 
41628c506b8Sjruoho /******************************************************************************
41728c506b8Sjruoho  *
418ff4a156dSchristos  * Examples of control method execution.
41928c506b8Sjruoho  *
42028c506b8Sjruoho  * _OSI is a predefined method that is implemented internally within ACPICA.
42128c506b8Sjruoho  *
42228c506b8Sjruoho  * Shows the following elements:
42328c506b8Sjruoho  *
42428c506b8Sjruoho  * 1) How to setup a control method argument and argument list
42528c506b8Sjruoho  * 2) How to setup the return value object
42628c506b8Sjruoho  * 3) How to invoke AcpiEvaluateObject
42728c506b8Sjruoho  * 4) How to check the returned ACPI_STATUS
42828c506b8Sjruoho  * 5) How to analyze the return value
42928c506b8Sjruoho  *
43028c506b8Sjruoho  *****************************************************************************/
43128c506b8Sjruoho 
432b406f703Schristos ACPI_STATUS
ExecuteOSI(char * OsiString,UINT64 ExpectedResult)433b406f703Schristos ExecuteOSI (
434b406f703Schristos     char                    *OsiString,
435b406f703Schristos     UINT64                  ExpectedResult)
43628c506b8Sjruoho {
43728c506b8Sjruoho     ACPI_STATUS             Status;
43828c506b8Sjruoho     ACPI_OBJECT_LIST        ArgList;
43928c506b8Sjruoho     ACPI_OBJECT             Arg[1];
44028c506b8Sjruoho     ACPI_BUFFER             ReturnValue;
44128c506b8Sjruoho     ACPI_OBJECT             *Object;
44228c506b8Sjruoho 
44328c506b8Sjruoho 
444cfbb7280Schristos     ACPI_INFO (("Executing _OSI reserved method"));
44528c506b8Sjruoho 
44628c506b8Sjruoho     /* Setup input argument */
44728c506b8Sjruoho 
44828c506b8Sjruoho     ArgList.Count = 1;
44928c506b8Sjruoho     ArgList.Pointer = Arg;
45028c506b8Sjruoho 
45128c506b8Sjruoho     Arg[0].Type = ACPI_TYPE_STRING;
45228c506b8Sjruoho     Arg[0].String.Pointer = "Windows 2001";
45328c506b8Sjruoho     Arg[0].String.Length = strlen (Arg[0].String.Pointer);
45428c506b8Sjruoho 
45528c506b8Sjruoho     /* Ask ACPICA to allocate space for the return object */
45628c506b8Sjruoho 
45728c506b8Sjruoho     ReturnValue.Length = ACPI_ALLOCATE_BUFFER;
45828c506b8Sjruoho 
45928c506b8Sjruoho     Status = AcpiEvaluateObject (NULL, "\\_OSI", &ArgList, &ReturnValue);
46028c506b8Sjruoho     if (ACPI_FAILURE (Status))
46128c506b8Sjruoho     {
46228c506b8Sjruoho         ACPI_EXCEPTION ((AE_INFO, Status, "While executing _OSI"));
463b406f703Schristos         return (AE_OK);
46428c506b8Sjruoho     }
46528c506b8Sjruoho 
46628c506b8Sjruoho     /* Ensure that the return object is large enough */
46728c506b8Sjruoho 
46828c506b8Sjruoho     if (ReturnValue.Length < sizeof (ACPI_OBJECT))
46928c506b8Sjruoho     {
47028c506b8Sjruoho         AcpiOsPrintf ("Return value from _OSI method too small, %.8X\n",
471783af925Schristos             (UINT32) ReturnValue.Length);
472ff4a156dSchristos         goto ErrorExit;
47328c506b8Sjruoho     }
47428c506b8Sjruoho 
47528c506b8Sjruoho     /* Expect an integer return value from execution of _OSI */
47628c506b8Sjruoho 
47728c506b8Sjruoho     Object = ReturnValue.Pointer;
47828c506b8Sjruoho     if (Object->Type != ACPI_TYPE_INTEGER)
47928c506b8Sjruoho     {
48028c506b8Sjruoho         AcpiOsPrintf ("Invalid return type from _OSI, %.2X\n", Object->Type);
48128c506b8Sjruoho     }
48228c506b8Sjruoho 
483cfbb7280Schristos     ACPI_INFO (("_OSI returned 0x%8.8X",
48471e38f1dSchristos         (UINT32) Object->Integer.Value));
485ff4a156dSchristos 
486ff4a156dSchristos 
487ff4a156dSchristos ErrorExit:
488ff4a156dSchristos 
489ff4a156dSchristos     /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
490ff4a156dSchristos 
491ff4a156dSchristos     AcpiOsFree (ReturnValue.Pointer);
492b406f703Schristos     return (AE_OK);
49328c506b8Sjruoho }
49428c506b8Sjruoho 
49528c506b8Sjruoho 
49628c506b8Sjruoho /******************************************************************************
49728c506b8Sjruoho  *
498ff4a156dSchristos  * Execute an actual control method in the DSDT (MAIN)
49928c506b8Sjruoho  *
50028c506b8Sjruoho  *****************************************************************************/
50128c506b8Sjruoho 
502ff4a156dSchristos static void
ExecuteMAIN(void)503ff4a156dSchristos ExecuteMAIN (void)
50428c506b8Sjruoho {
505ff4a156dSchristos     ACPI_STATUS             Status;
506ff4a156dSchristos     ACPI_OBJECT_LIST        ArgList;
507ff4a156dSchristos     ACPI_OBJECT             Arg[1];
508ff4a156dSchristos     ACPI_BUFFER             ReturnValue;
509ff4a156dSchristos     ACPI_OBJECT             *Object;
51028c506b8Sjruoho 
511ff4a156dSchristos 
512cfbb7280Schristos     ACPI_INFO (("Executing MAIN method"));
513ff4a156dSchristos 
514ff4a156dSchristos     /* Setup input argument */
515ff4a156dSchristos 
516ff4a156dSchristos     ArgList.Count = 1;
517ff4a156dSchristos     ArgList.Pointer = Arg;
518ff4a156dSchristos 
519ff4a156dSchristos     Arg[0].Type = ACPI_TYPE_STRING;
520ff4a156dSchristos     Arg[0].String.Pointer = "Method [MAIN] is executing";
521ff4a156dSchristos     Arg[0].String.Length = strlen (Arg[0].String.Pointer);
522ff4a156dSchristos 
523ff4a156dSchristos     /* Ask ACPICA to allocate space for the return object */
524ff4a156dSchristos 
525ff4a156dSchristos     ReturnValue.Length = ACPI_ALLOCATE_BUFFER;
526ff4a156dSchristos 
527ff4a156dSchristos     Status = AcpiEvaluateObject (NULL, "\\MAIN", &ArgList, &ReturnValue);
528ff4a156dSchristos     if (ACPI_FAILURE (Status))
529ff4a156dSchristos     {
530ff4a156dSchristos         ACPI_EXCEPTION ((AE_INFO, Status, "While executing MAIN"));
531ff4a156dSchristos         return;
53228c506b8Sjruoho     }
53328c506b8Sjruoho 
534ff4a156dSchristos     if (ReturnValue.Pointer)
535a8e4c046Sjruoho     {
536ff4a156dSchristos         /* Obtain and validate the returned ACPI_OBJECT */
537ff4a156dSchristos 
538ff4a156dSchristos         Object = ReturnValue.Pointer;
539ff4a156dSchristos         if (Object->Type == ACPI_TYPE_STRING)
540ff4a156dSchristos         {
54171e38f1dSchristos             AcpiOsPrintf ("Method [MAIN] returned: \"%s\"\n",
54271e38f1dSchristos                 Object->String.Pointer);
543a8e4c046Sjruoho         }
544a8e4c046Sjruoho 
545ff4a156dSchristos         ACPI_FREE (ReturnValue.Pointer);
546ff4a156dSchristos     }
547a8e4c046Sjruoho }
548