1aa2aa9a6SDana Myers /******************************************************************************
2aa2aa9a6SDana Myers  *
3aa2aa9a6SDana Myers  * Module Name: hwxface - Public ACPICA hardware interfaces
4aa2aa9a6SDana Myers  *
5aa2aa9a6SDana Myers  *****************************************************************************/
6aa2aa9a6SDana Myers 
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi  *
9*35786f68SRobert Mustacchi  * 1. Copyright Notice
10*35786f68SRobert Mustacchi  *
11*35786f68SRobert Mustacchi  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
12aa2aa9a6SDana Myers  * All rights reserved.
13aa2aa9a6SDana Myers  *
14*35786f68SRobert Mustacchi  * 2. License
15*35786f68SRobert Mustacchi  *
16*35786f68SRobert Mustacchi  * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi  * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi  * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi  * property rights.
20*35786f68SRobert Mustacchi  *
21*35786f68SRobert Mustacchi  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi  * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi  * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi  * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi  *
28*35786f68SRobert Mustacchi  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi  * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi  * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi  * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi  * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi  * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi  * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi  *
37*35786f68SRobert Mustacchi  * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi  * conditions are met:
39*35786f68SRobert Mustacchi  *
40*35786f68SRobert Mustacchi  * 3. Conditions
41*35786f68SRobert Mustacchi  *
42*35786f68SRobert Mustacchi  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi  * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi  * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi  * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi  * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi  * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi  * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi  * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi  * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi  * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi  *
54*35786f68SRobert Mustacchi  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi  * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi  * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi  * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi  * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi  * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi  * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi  * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi  * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi  * make.
65*35786f68SRobert Mustacchi  *
66*35786f68SRobert Mustacchi  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi  * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi  * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi  * distribution.
71*35786f68SRobert Mustacchi  *
72*35786f68SRobert Mustacchi  * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi  * Intel Code.
74*35786f68SRobert Mustacchi  *
75*35786f68SRobert Mustacchi  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi  * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi  * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi  *
80*35786f68SRobert Mustacchi  * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi  *
82*35786f68SRobert Mustacchi  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi  * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi  *
90*35786f68SRobert Mustacchi  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi  * LIMITED REMEDY.
98*35786f68SRobert Mustacchi  *
99*35786f68SRobert Mustacchi  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi  * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi  * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi  * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi  * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi  * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi  * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi  * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi  * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi  * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi  * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi  * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi  * such license, approval or letter.
113*35786f68SRobert Mustacchi  *
114*35786f68SRobert Mustacchi  *****************************************************************************
115*35786f68SRobert Mustacchi  *
116*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi  * following license:
118*35786f68SRobert Mustacchi  *
11926f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
12026f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
12126f3cdf0SGordon Ross  * are met:
12226f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
12326f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
12426f3cdf0SGordon Ross  *    without modification.
12526f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12626f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
12726f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
12826f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
12926f3cdf0SGordon Ross  *    binary redistribution.
13026f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
13126f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
13226f3cdf0SGordon Ross  *    from this software without specific prior written permission.
13326f3cdf0SGordon Ross  *
13426f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13526f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13726f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi  *
146*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
147*35786f68SRobert Mustacchi  * GNU General Public License ("GPL") version 2 as published by the Free
148*35786f68SRobert Mustacchi  * Software Foundation.
149*35786f68SRobert Mustacchi  *
150*35786f68SRobert Mustacchi  *****************************************************************************/
151aa2aa9a6SDana Myers 
1527b1019a6SJerry Jelinek #define EXPORT_ACPI_INTERFACES
1537b1019a6SJerry Jelinek 
154aa2aa9a6SDana Myers #include "acpi.h"
155aa2aa9a6SDana Myers #include "accommon.h"
156aa2aa9a6SDana Myers #include "acnamesp.h"
157aa2aa9a6SDana Myers 
158aa2aa9a6SDana Myers #define _COMPONENT          ACPI_HARDWARE
159aa2aa9a6SDana Myers         ACPI_MODULE_NAME    ("hwxface")
160aa2aa9a6SDana Myers 
161aa2aa9a6SDana Myers 
162aa2aa9a6SDana Myers /******************************************************************************
163aa2aa9a6SDana Myers  *
164aa2aa9a6SDana Myers  * FUNCTION:    AcpiReset
165aa2aa9a6SDana Myers  *
166aa2aa9a6SDana Myers  * PARAMETERS:  None
167aa2aa9a6SDana Myers  *
168aa2aa9a6SDana Myers  * RETURN:      Status
169aa2aa9a6SDana Myers  *
170aa2aa9a6SDana Myers  * DESCRIPTION: Set reset register in memory or IO space. Note: Does not
171aa2aa9a6SDana Myers  *              support reset register in PCI config space, this must be
172aa2aa9a6SDana Myers  *              handled separately.
173aa2aa9a6SDana Myers  *
174aa2aa9a6SDana Myers  ******************************************************************************/
175aa2aa9a6SDana Myers 
176aa2aa9a6SDana Myers ACPI_STATUS
AcpiReset(void)177aa2aa9a6SDana Myers AcpiReset (
178aa2aa9a6SDana Myers     void)
179aa2aa9a6SDana Myers {
180aa2aa9a6SDana Myers     ACPI_GENERIC_ADDRESS    *ResetReg;
181aa2aa9a6SDana Myers     ACPI_STATUS             Status;
182aa2aa9a6SDana Myers 
183aa2aa9a6SDana Myers 
184aa2aa9a6SDana Myers     ACPI_FUNCTION_TRACE (AcpiReset);
185aa2aa9a6SDana Myers 
186aa2aa9a6SDana Myers 
187aa2aa9a6SDana Myers     ResetReg = &AcpiGbl_FADT.ResetRegister;
188aa2aa9a6SDana Myers 
189aa2aa9a6SDana Myers     /* Check if the reset register is supported */
190aa2aa9a6SDana Myers 
191aa2aa9a6SDana Myers     if (!(AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER) ||
192aa2aa9a6SDana Myers         !ResetReg->Address)
193aa2aa9a6SDana Myers     {
194aa2aa9a6SDana Myers         return_ACPI_STATUS (AE_NOT_EXIST);
195aa2aa9a6SDana Myers     }
196aa2aa9a6SDana Myers 
1974cf02d40SSaurabh Misra     if (ResetReg->SpaceId == ACPI_ADR_SPACE_SYSTEM_IO)
1984cf02d40SSaurabh Misra     {
1994cf02d40SSaurabh Misra         /*
2004cf02d40SSaurabh Misra          * For I/O space, write directly to the OSL. This bypasses the port
2014cf02d40SSaurabh Misra          * validation mechanism, which may block a valid write to the reset
20257190917SDana Myers          * register.
2037b1019a6SJerry Jelinek          *
2047b1019a6SJerry Jelinek          * NOTE:
2057b1019a6SJerry Jelinek          * The ACPI spec requires the reset register width to be 8, so we
2067b1019a6SJerry Jelinek          * hardcode it here and ignore the FADT value. This maintains
2077b1019a6SJerry Jelinek          * compatibility with other ACPI implementations that have allowed
2087b1019a6SJerry Jelinek          * BIOS code with bad register width values to go unnoticed.
20957190917SDana Myers          */
2104cf02d40SSaurabh Misra         Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) ResetReg->Address,
2117b1019a6SJerry Jelinek             AcpiGbl_FADT.ResetValue, ACPI_RESET_REGISTER_WIDTH);
2124cf02d40SSaurabh Misra     }
2134cf02d40SSaurabh Misra     else
2144cf02d40SSaurabh Misra     {
21557190917SDana Myers         /* Write the reset value to the reset register */
2164cf02d40SSaurabh Misra 
21757190917SDana Myers         Status = AcpiHwWrite (AcpiGbl_FADT.ResetValue, ResetReg);
2184cf02d40SSaurabh Misra     }
219aa2aa9a6SDana Myers 
220aa2aa9a6SDana Myers     return_ACPI_STATUS (Status);
221aa2aa9a6SDana Myers }
222aa2aa9a6SDana Myers 
ACPI_EXPORT_SYMBOL(AcpiReset)223aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiReset)
224aa2aa9a6SDana Myers 
225aa2aa9a6SDana Myers 
226aa2aa9a6SDana Myers /******************************************************************************
227aa2aa9a6SDana Myers  *
228aa2aa9a6SDana Myers  * FUNCTION:    AcpiRead
229aa2aa9a6SDana Myers  *
230aa2aa9a6SDana Myers  * PARAMETERS:  Value               - Where the value is returned
231aa2aa9a6SDana Myers  *              Reg                 - GAS register structure
232aa2aa9a6SDana Myers  *
233aa2aa9a6SDana Myers  * RETURN:      Status
234aa2aa9a6SDana Myers  *
235aa2aa9a6SDana Myers  * DESCRIPTION: Read from either memory or IO space.
236aa2aa9a6SDana Myers  *
23757190917SDana Myers  * LIMITATIONS: <These limitations also apply to AcpiWrite>
23857190917SDana Myers  *      BitWidth must be exactly 8, 16, 32, or 64.
23957190917SDana Myers  *      SpaceID must be SystemMemory or SystemIO.
24057190917SDana Myers  *      BitOffset and AccessWidth are currently ignored, as there has
24157190917SDana Myers  *          not been a need to implement these.
24257190917SDana Myers  *
243aa2aa9a6SDana Myers  ******************************************************************************/
244aa2aa9a6SDana Myers 
245aa2aa9a6SDana Myers ACPI_STATUS
246aa2aa9a6SDana Myers AcpiRead (
24757190917SDana Myers     UINT64                  *ReturnValue,
248aa2aa9a6SDana Myers     ACPI_GENERIC_ADDRESS    *Reg)
249aa2aa9a6SDana Myers {
250aa2aa9a6SDana Myers     ACPI_STATUS             Status;
251aa2aa9a6SDana Myers 
252aa2aa9a6SDana Myers 
253aa2aa9a6SDana Myers     ACPI_FUNCTION_NAME (AcpiRead);
254aa2aa9a6SDana Myers 
255aa2aa9a6SDana Myers 
256*35786f68SRobert Mustacchi     Status = AcpiHwRead (ReturnValue, Reg);
257*35786f68SRobert Mustacchi     return (Status);
258aa2aa9a6SDana Myers }
259aa2aa9a6SDana Myers 
ACPI_EXPORT_SYMBOL(AcpiRead)260aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiRead)
261aa2aa9a6SDana Myers 
262aa2aa9a6SDana Myers 
263aa2aa9a6SDana Myers /******************************************************************************
264aa2aa9a6SDana Myers  *
265aa2aa9a6SDana Myers  * FUNCTION:    AcpiWrite
266aa2aa9a6SDana Myers  *
26757190917SDana Myers  * PARAMETERS:  Value               - Value to be written
268aa2aa9a6SDana Myers  *              Reg                 - GAS register structure
269aa2aa9a6SDana Myers  *
270aa2aa9a6SDana Myers  * RETURN:      Status
271aa2aa9a6SDana Myers  *
272aa2aa9a6SDana Myers  * DESCRIPTION: Write to either memory or IO space.
273aa2aa9a6SDana Myers  *
274aa2aa9a6SDana Myers  ******************************************************************************/
275aa2aa9a6SDana Myers 
276aa2aa9a6SDana Myers ACPI_STATUS
277aa2aa9a6SDana Myers AcpiWrite (
27857190917SDana Myers     UINT64                  Value,
279aa2aa9a6SDana Myers     ACPI_GENERIC_ADDRESS    *Reg)
280aa2aa9a6SDana Myers {
281aa2aa9a6SDana Myers     ACPI_STATUS             Status;
282aa2aa9a6SDana Myers 
283aa2aa9a6SDana Myers 
284aa2aa9a6SDana Myers     ACPI_FUNCTION_NAME (AcpiWrite);
285aa2aa9a6SDana Myers 
286aa2aa9a6SDana Myers 
287*35786f68SRobert Mustacchi     Status = AcpiHwWrite (Value, Reg);
288aa2aa9a6SDana Myers     return (Status);
289aa2aa9a6SDana Myers }
290aa2aa9a6SDana Myers 
ACPI_EXPORT_SYMBOL(AcpiWrite)291aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiWrite)
292aa2aa9a6SDana Myers 
293aa2aa9a6SDana Myers 
2947b1019a6SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE)
295aa2aa9a6SDana Myers /*******************************************************************************
296aa2aa9a6SDana Myers  *
297aa2aa9a6SDana Myers  * FUNCTION:    AcpiReadBitRegister
298aa2aa9a6SDana Myers  *
299aa2aa9a6SDana Myers  * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access
300aa2aa9a6SDana Myers  *              ReturnValue     - Value that was read from the register,
301aa2aa9a6SDana Myers  *                                normalized to bit position zero.
302aa2aa9a6SDana Myers  *
303aa2aa9a6SDana Myers  * RETURN:      Status and the value read from the specified Register. Value
304aa2aa9a6SDana Myers  *              returned is normalized to bit0 (is shifted all the way right)
305aa2aa9a6SDana Myers  *
306aa2aa9a6SDana Myers  * DESCRIPTION: ACPI BitRegister read function. Does not acquire the HW lock.
307aa2aa9a6SDana Myers  *
308aa2aa9a6SDana Myers  * SUPPORTS:    Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
309aa2aa9a6SDana Myers  *              PM2 Control.
310aa2aa9a6SDana Myers  *
311aa2aa9a6SDana Myers  * Note: The hardware lock is not required when reading the ACPI bit registers
312aa2aa9a6SDana Myers  *       since almost all of them are single bit and it does not matter that
313aa2aa9a6SDana Myers  *       the parent hardware register can be split across two physical
314aa2aa9a6SDana Myers  *       registers. The only multi-bit field is SLP_TYP in the PM1 control
315aa2aa9a6SDana Myers  *       register, but this field does not cross an 8-bit boundary (nor does
316aa2aa9a6SDana Myers  *       it make much sense to actually read this field.)
317aa2aa9a6SDana Myers  *
318aa2aa9a6SDana Myers  ******************************************************************************/
319aa2aa9a6SDana Myers 
320aa2aa9a6SDana Myers ACPI_STATUS
321aa2aa9a6SDana Myers AcpiReadBitRegister (
322aa2aa9a6SDana Myers     UINT32                  RegisterId,
323aa2aa9a6SDana Myers     UINT32                  *ReturnValue)
324aa2aa9a6SDana Myers {
325aa2aa9a6SDana Myers     ACPI_BIT_REGISTER_INFO  *BitRegInfo;
326aa2aa9a6SDana Myers     UINT32                  RegisterValue;
327aa2aa9a6SDana Myers     UINT32                  Value;
328aa2aa9a6SDana Myers     ACPI_STATUS             Status;
329aa2aa9a6SDana Myers 
330aa2aa9a6SDana Myers 
331aa2aa9a6SDana Myers     ACPI_FUNCTION_TRACE_U32 (AcpiReadBitRegister, RegisterId);
332aa2aa9a6SDana Myers 
333aa2aa9a6SDana Myers 
334aa2aa9a6SDana Myers     /* Get the info structure corresponding to the requested ACPI Register */
335aa2aa9a6SDana Myers 
336aa2aa9a6SDana Myers     BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
337aa2aa9a6SDana Myers     if (!BitRegInfo)
338aa2aa9a6SDana Myers     {
339aa2aa9a6SDana Myers         return_ACPI_STATUS (AE_BAD_PARAMETER);
340aa2aa9a6SDana Myers     }
341aa2aa9a6SDana Myers 
342aa2aa9a6SDana Myers     /* Read the entire parent register */
343aa2aa9a6SDana Myers 
344aa2aa9a6SDana Myers     Status = AcpiHwRegisterRead (BitRegInfo->ParentRegister,
3457b1019a6SJerry Jelinek         &RegisterValue);
346aa2aa9a6SDana Myers     if (ACPI_FAILURE (Status))
347aa2aa9a6SDana Myers     {
348aa2aa9a6SDana Myers         return_ACPI_STATUS (Status);
349aa2aa9a6SDana Myers     }
350aa2aa9a6SDana Myers 
351aa2aa9a6SDana Myers     /* Normalize the value that was read, mask off other bits */
352aa2aa9a6SDana Myers 
353aa2aa9a6SDana Myers     Value = ((RegisterValue & BitRegInfo->AccessBitMask)
3547b1019a6SJerry Jelinek         >> BitRegInfo->BitPosition);
355aa2aa9a6SDana Myers 
356aa2aa9a6SDana Myers     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
357aa2aa9a6SDana Myers         "BitReg %X, ParentReg %X, Actual %8.8X, ReturnValue %8.8X\n",
358aa2aa9a6SDana Myers         RegisterId, BitRegInfo->ParentRegister, RegisterValue, Value));
359aa2aa9a6SDana Myers 
360aa2aa9a6SDana Myers     *ReturnValue = Value;
361aa2aa9a6SDana Myers     return_ACPI_STATUS (AE_OK);
362aa2aa9a6SDana Myers }
363aa2aa9a6SDana Myers 
ACPI_EXPORT_SYMBOL(AcpiReadBitRegister)364aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiReadBitRegister)
365aa2aa9a6SDana Myers 
366aa2aa9a6SDana Myers 
367aa2aa9a6SDana Myers /*******************************************************************************
368aa2aa9a6SDana Myers  *
369aa2aa9a6SDana Myers  * FUNCTION:    AcpiWriteBitRegister
370aa2aa9a6SDana Myers  *
371aa2aa9a6SDana Myers  * PARAMETERS:  RegisterId      - ID of ACPI Bit Register to access
372aa2aa9a6SDana Myers  *              Value           - Value to write to the register, in bit
3737b1019a6SJerry Jelinek  *                                position zero. The bit is automatically
374aa2aa9a6SDana Myers  *                                shifted to the correct position.
375aa2aa9a6SDana Myers  *
376aa2aa9a6SDana Myers  * RETURN:      Status
377aa2aa9a6SDana Myers  *
378aa2aa9a6SDana Myers  * DESCRIPTION: ACPI Bit Register write function. Acquires the hardware lock
379aa2aa9a6SDana Myers  *              since most operations require a read/modify/write sequence.
380aa2aa9a6SDana Myers  *
381aa2aa9a6SDana Myers  * SUPPORTS:    Bit fields in PM1 Status, PM1 Enable, PM1 Control, and
382aa2aa9a6SDana Myers  *              PM2 Control.
383aa2aa9a6SDana Myers  *
384aa2aa9a6SDana Myers  * Note that at this level, the fact that there may be actually two
385aa2aa9a6SDana Myers  * hardware registers (A and B - and B may not exist) is abstracted.
386aa2aa9a6SDana Myers  *
387aa2aa9a6SDana Myers  ******************************************************************************/
388aa2aa9a6SDana Myers 
389aa2aa9a6SDana Myers ACPI_STATUS
390aa2aa9a6SDana Myers AcpiWriteBitRegister (
391aa2aa9a6SDana Myers     UINT32                  RegisterId,
392aa2aa9a6SDana Myers     UINT32                  Value)
393aa2aa9a6SDana Myers {
394aa2aa9a6SDana Myers     ACPI_BIT_REGISTER_INFO  *BitRegInfo;
395aa2aa9a6SDana Myers     ACPI_CPU_FLAGS          LockFlags;
396aa2aa9a6SDana Myers     UINT32                  RegisterValue;
397aa2aa9a6SDana Myers     ACPI_STATUS             Status = AE_OK;
398aa2aa9a6SDana Myers 
399aa2aa9a6SDana Myers 
400aa2aa9a6SDana Myers     ACPI_FUNCTION_TRACE_U32 (AcpiWriteBitRegister, RegisterId);
401aa2aa9a6SDana Myers 
402aa2aa9a6SDana Myers 
403aa2aa9a6SDana Myers     /* Get the info structure corresponding to the requested ACPI Register */
404aa2aa9a6SDana Myers 
405aa2aa9a6SDana Myers     BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
406aa2aa9a6SDana Myers     if (!BitRegInfo)
407aa2aa9a6SDana Myers     {
408aa2aa9a6SDana Myers         return_ACPI_STATUS (AE_BAD_PARAMETER);
409aa2aa9a6SDana Myers     }
410aa2aa9a6SDana Myers 
411aa2aa9a6SDana Myers     LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
412aa2aa9a6SDana Myers 
413aa2aa9a6SDana Myers     /*
414aa2aa9a6SDana Myers      * At this point, we know that the parent register is one of the
415aa2aa9a6SDana Myers      * following: PM1 Status, PM1 Enable, PM1 Control, or PM2 Control
416aa2aa9a6SDana Myers      */
417aa2aa9a6SDana Myers     if (BitRegInfo->ParentRegister != ACPI_REGISTER_PM1_STATUS)
418aa2aa9a6SDana Myers     {
419aa2aa9a6SDana Myers         /*
420aa2aa9a6SDana Myers          * 1) Case for PM1 Enable, PM1 Control, and PM2 Control
421aa2aa9a6SDana Myers          *
422aa2aa9a6SDana Myers          * Perform a register read to preserve the bits that we are not
423aa2aa9a6SDana Myers          * interested in
424aa2aa9a6SDana Myers          */
425aa2aa9a6SDana Myers         Status = AcpiHwRegisterRead (BitRegInfo->ParentRegister,
4267b1019a6SJerry Jelinek             &RegisterValue);
427aa2aa9a6SDana Myers         if (ACPI_FAILURE (Status))
428aa2aa9a6SDana Myers         {
429aa2aa9a6SDana Myers             goto UnlockAndExit;
430aa2aa9a6SDana Myers         }
431aa2aa9a6SDana Myers 
432aa2aa9a6SDana Myers         /*
433aa2aa9a6SDana Myers          * Insert the input bit into the value that was just read
434aa2aa9a6SDana Myers          * and write the register
435aa2aa9a6SDana Myers          */
436aa2aa9a6SDana Myers         ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
437aa2aa9a6SDana Myers             BitRegInfo->AccessBitMask, Value);
438aa2aa9a6SDana Myers 
439aa2aa9a6SDana Myers         Status = AcpiHwRegisterWrite (BitRegInfo->ParentRegister,
4407b1019a6SJerry Jelinek             RegisterValue);
441aa2aa9a6SDana Myers     }
442aa2aa9a6SDana Myers     else
443aa2aa9a6SDana Myers     {
444aa2aa9a6SDana Myers         /*
445aa2aa9a6SDana Myers          * 2) Case for PM1 Status
446aa2aa9a6SDana Myers          *
447aa2aa9a6SDana Myers          * The Status register is different from the rest. Clear an event
448aa2aa9a6SDana Myers          * by writing 1, writing 0 has no effect. So, the only relevant
449aa2aa9a6SDana Myers          * information is the single bit we're interested in, all others
450aa2aa9a6SDana Myers          * should be written as 0 so they will be left unchanged.
451aa2aa9a6SDana Myers          */
452aa2aa9a6SDana Myers         RegisterValue = ACPI_REGISTER_PREPARE_BITS (Value,
453aa2aa9a6SDana Myers             BitRegInfo->BitPosition, BitRegInfo->AccessBitMask);
454aa2aa9a6SDana Myers 
455aa2aa9a6SDana Myers         /* No need to write the register if value is all zeros */
456aa2aa9a6SDana Myers 
457aa2aa9a6SDana Myers         if (RegisterValue)
458aa2aa9a6SDana Myers         {
459aa2aa9a6SDana Myers             Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_STATUS,
4607b1019a6SJerry Jelinek                 RegisterValue);
461aa2aa9a6SDana Myers         }
462aa2aa9a6SDana Myers     }
463aa2aa9a6SDana Myers 
464aa2aa9a6SDana Myers     ACPI_DEBUG_PRINT ((ACPI_DB_IO,
465aa2aa9a6SDana Myers         "BitReg %X, ParentReg %X, Value %8.8X, Actual %8.8X\n",
466aa2aa9a6SDana Myers         RegisterId, BitRegInfo->ParentRegister, Value, RegisterValue));
467aa2aa9a6SDana Myers 
468aa2aa9a6SDana Myers 
469aa2aa9a6SDana Myers UnlockAndExit:
470aa2aa9a6SDana Myers 
471aa2aa9a6SDana Myers     AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
472aa2aa9a6SDana Myers     return_ACPI_STATUS (Status);
473aa2aa9a6SDana Myers }
474aa2aa9a6SDana Myers 
ACPI_EXPORT_SYMBOL(AcpiWriteBitRegister)475aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiWriteBitRegister)
476aa2aa9a6SDana Myers 
4777b1019a6SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */
4787b1019a6SJerry Jelinek 
479aa2aa9a6SDana Myers 
480aa2aa9a6SDana Myers /*******************************************************************************
481aa2aa9a6SDana Myers  *
482aa2aa9a6SDana Myers  * FUNCTION:    AcpiGetSleepTypeData
483aa2aa9a6SDana Myers  *
484aa2aa9a6SDana Myers  * PARAMETERS:  SleepState          - Numeric sleep state
485aa2aa9a6SDana Myers  *              *SleepTypeA         - Where SLP_TYPa is returned
486aa2aa9a6SDana Myers  *              *SleepTypeB         - Where SLP_TYPb is returned
487aa2aa9a6SDana Myers  *
4887b1019a6SJerry Jelinek  * RETURN:      Status
4897b1019a6SJerry Jelinek  *
4907b1019a6SJerry Jelinek  * DESCRIPTION: Obtain the SLP_TYPa and SLP_TYPb values for the requested
4917b1019a6SJerry Jelinek  *              sleep state via the appropriate \_Sx object.
4927b1019a6SJerry Jelinek  *
4937b1019a6SJerry Jelinek  *  The sleep state package returned from the corresponding \_Sx_ object
4947b1019a6SJerry Jelinek  *  must contain at least one integer.
4957b1019a6SJerry Jelinek  *
4967b1019a6SJerry Jelinek  *  March 2005:
4977b1019a6SJerry Jelinek  *  Added support for a package that contains two integers. This
4987b1019a6SJerry Jelinek  *  goes against the ACPI specification which defines this object as a
4997b1019a6SJerry Jelinek  *  package with one encoded DWORD integer. However, existing practice
5007b1019a6SJerry Jelinek  *  by many BIOS vendors is to return a package with 2 or more integer
5017b1019a6SJerry Jelinek  *  elements, at least one per sleep type (A/B).
5027b1019a6SJerry Jelinek  *
5037b1019a6SJerry Jelinek  *  January 2013:
5047b1019a6SJerry Jelinek  *  Therefore, we must be prepared to accept a package with either a
5057b1019a6SJerry Jelinek  *  single integer or multiple integers.
5067b1019a6SJerry Jelinek  *
5077b1019a6SJerry Jelinek  *  The single integer DWORD format is as follows:
5087b1019a6SJerry Jelinek  *      BYTE 0 - Value for the PM1A SLP_TYP register
5097b1019a6SJerry Jelinek  *      BYTE 1 - Value for the PM1B SLP_TYP register
5107b1019a6SJerry Jelinek  *      BYTE 2-3 - Reserved
511aa2aa9a6SDana Myers  *
5127b1019a6SJerry Jelinek  *  The dual integer format is as follows:
5137b1019a6SJerry Jelinek  *      Integer 0 - Value for the PM1A SLP_TYP register
5147b1019a6SJerry Jelinek  *      Integer 1 - Value for the PM1A SLP_TYP register
515aa2aa9a6SDana Myers  *
516aa2aa9a6SDana Myers  ******************************************************************************/
517aa2aa9a6SDana Myers 
518aa2aa9a6SDana Myers ACPI_STATUS
519aa2aa9a6SDana Myers AcpiGetSleepTypeData (
520aa2aa9a6SDana Myers     UINT8                   SleepState,
521aa2aa9a6SDana Myers     UINT8                   *SleepTypeA,
522aa2aa9a6SDana Myers     UINT8                   *SleepTypeB)
523aa2aa9a6SDana Myers {
5247b1019a6SJerry Jelinek     ACPI_STATUS             Status;
525aa2aa9a6SDana Myers     ACPI_EVALUATE_INFO      *Info;
5267b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     **Elements;
527aa2aa9a6SDana Myers 
528aa2aa9a6SDana Myers 
529aa2aa9a6SDana Myers     ACPI_FUNCTION_TRACE (AcpiGetSleepTypeData);
530aa2aa9a6SDana Myers 
531aa2aa9a6SDana Myers 
532aa2aa9a6SDana Myers     /* Validate parameters */
533aa2aa9a6SDana Myers 
534aa2aa9a6SDana Myers     if ((SleepState > ACPI_S_STATES_MAX) ||
5357b1019a6SJerry Jelinek         !SleepTypeA || !SleepTypeB)
536aa2aa9a6SDana Myers     {
537aa2aa9a6SDana Myers         return_ACPI_STATUS (AE_BAD_PARAMETER);
538aa2aa9a6SDana Myers     }
539aa2aa9a6SDana Myers 
540aa2aa9a6SDana Myers     /* Allocate the evaluation information block */
541aa2aa9a6SDana Myers 
542aa2aa9a6SDana Myers     Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
543aa2aa9a6SDana Myers     if (!Info)
544aa2aa9a6SDana Myers     {
545aa2aa9a6SDana Myers         return_ACPI_STATUS (AE_NO_MEMORY);
546aa2aa9a6SDana Myers     }
547aa2aa9a6SDana Myers 
5487b1019a6SJerry Jelinek     /*
5497b1019a6SJerry Jelinek      * Evaluate the \_Sx namespace object containing the register values
5507b1019a6SJerry Jelinek      * for this state
5517b1019a6SJerry Jelinek      */
5527b1019a6SJerry Jelinek     Info->RelativePathname = AcpiGbl_SleepStateNames[SleepState];
553aa2aa9a6SDana Myers 
554aa2aa9a6SDana Myers     Status = AcpiNsEvaluate (Info);
555aa2aa9a6SDana Myers     if (ACPI_FAILURE (Status))
556aa2aa9a6SDana Myers     {
5577b1019a6SJerry Jelinek         if (Status == AE_NOT_FOUND)
5587b1019a6SJerry Jelinek         {
5597b1019a6SJerry Jelinek             /* The _Sx states are optional, ignore NOT_FOUND */
5607b1019a6SJerry Jelinek 
5617b1019a6SJerry Jelinek             goto FinalCleanup;
5627b1019a6SJerry Jelinek         }
563aa2aa9a6SDana Myers 
5647b1019a6SJerry Jelinek         goto WarningCleanup;
565aa2aa9a6SDana Myers     }
566aa2aa9a6SDana Myers 
567aa2aa9a6SDana Myers     /* Must have a return object */
568aa2aa9a6SDana Myers 
569aa2aa9a6SDana Myers     if (!Info->ReturnObject)
570aa2aa9a6SDana Myers     {
571aa2aa9a6SDana Myers         ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]",
5727b1019a6SJerry Jelinek             Info->RelativePathname));
5737b1019a6SJerry Jelinek         Status = AE_AML_NO_RETURN_VALUE;
5747b1019a6SJerry Jelinek         goto WarningCleanup;
575aa2aa9a6SDana Myers     }
576aa2aa9a6SDana Myers 
5777b1019a6SJerry Jelinek     /* Return object must be of type Package */
578aa2aa9a6SDana Myers 
5797b1019a6SJerry Jelinek     if (Info->ReturnObject->Common.Type != ACPI_TYPE_PACKAGE)
580aa2aa9a6SDana Myers     {
581aa2aa9a6SDana Myers         ACPI_ERROR ((AE_INFO, "Sleep State return object is not a Package"));
582aa2aa9a6SDana Myers         Status = AE_AML_OPERAND_TYPE;
5837b1019a6SJerry Jelinek         goto ReturnValueCleanup;
584aa2aa9a6SDana Myers     }
585aa2aa9a6SDana Myers 
586aa2aa9a6SDana Myers     /*
5877b1019a6SJerry Jelinek      * Any warnings about the package length or the object types have
5887b1019a6SJerry Jelinek      * already been issued by the predefined name module -- there is no
5897b1019a6SJerry Jelinek      * need to repeat them here.
590aa2aa9a6SDana Myers      */
5917b1019a6SJerry Jelinek     Elements = Info->ReturnObject->Package.Elements;
5927b1019a6SJerry Jelinek     switch (Info->ReturnObject->Package.Count)
593aa2aa9a6SDana Myers     {
5947b1019a6SJerry Jelinek     case 0:
595aa2aa9a6SDana Myers 
5967b1019a6SJerry Jelinek         Status = AE_AML_PACKAGE_LIMIT;
5977b1019a6SJerry Jelinek         break;
598aa2aa9a6SDana Myers 
5997b1019a6SJerry Jelinek     case 1:
6007b1019a6SJerry Jelinek 
6017b1019a6SJerry Jelinek         if (Elements[0]->Common.Type != ACPI_TYPE_INTEGER)
6027b1019a6SJerry Jelinek         {
6037b1019a6SJerry Jelinek             Status = AE_AML_OPERAND_TYPE;
6047b1019a6SJerry Jelinek             break;
6057b1019a6SJerry Jelinek         }
6067b1019a6SJerry Jelinek 
6077b1019a6SJerry Jelinek         /* A valid _Sx_ package with one integer */
6087b1019a6SJerry Jelinek 
6097b1019a6SJerry Jelinek         *SleepTypeA = (UINT8) Elements[0]->Integer.Value;
6107b1019a6SJerry Jelinek         *SleepTypeB = (UINT8) (Elements[0]->Integer.Value >> 8);
6117b1019a6SJerry Jelinek         break;
612aa2aa9a6SDana Myers 
6137b1019a6SJerry Jelinek     case 2:
6147b1019a6SJerry Jelinek     default:
6157b1019a6SJerry Jelinek 
6167b1019a6SJerry Jelinek         if ((Elements[0]->Common.Type != ACPI_TYPE_INTEGER) ||
6177b1019a6SJerry Jelinek             (Elements[1]->Common.Type != ACPI_TYPE_INTEGER))
6187b1019a6SJerry Jelinek         {
6197b1019a6SJerry Jelinek             Status = AE_AML_OPERAND_TYPE;
6207b1019a6SJerry Jelinek             break;
6217b1019a6SJerry Jelinek         }
6227b1019a6SJerry Jelinek 
6237b1019a6SJerry Jelinek         /* A valid _Sx_ package with two integers */
6247b1019a6SJerry Jelinek 
6257b1019a6SJerry Jelinek         *SleepTypeA = (UINT8) Elements[0]->Integer.Value;
6267b1019a6SJerry Jelinek         *SleepTypeB = (UINT8) Elements[1]->Integer.Value;
6277b1019a6SJerry Jelinek         break;
628aa2aa9a6SDana Myers     }
629aa2aa9a6SDana Myers 
6307b1019a6SJerry Jelinek ReturnValueCleanup:
6317b1019a6SJerry Jelinek     AcpiUtRemoveReference (Info->ReturnObject);
6327b1019a6SJerry Jelinek 
6337b1019a6SJerry Jelinek WarningCleanup:
634aa2aa9a6SDana Myers     if (ACPI_FAILURE (Status))
635aa2aa9a6SDana Myers     {
636aa2aa9a6SDana Myers         ACPI_EXCEPTION ((AE_INFO, Status,
6377b1019a6SJerry Jelinek             "While evaluating Sleep State [%s]",
6387b1019a6SJerry Jelinek             Info->RelativePathname));
639aa2aa9a6SDana Myers     }
640aa2aa9a6SDana Myers 
6417b1019a6SJerry Jelinek FinalCleanup:
642aa2aa9a6SDana Myers     ACPI_FREE (Info);
643aa2aa9a6SDana Myers     return_ACPI_STATUS (Status);
644aa2aa9a6SDana Myers }
645aa2aa9a6SDana Myers 
646aa2aa9a6SDana Myers ACPI_EXPORT_SYMBOL (AcpiGetSleepTypeData)
647