1239332Sjkim/******************************************************************************
2239332Sjkim *
3239332Sjkim * Name: acbuffer.h - Support for buffers returned by ACPI predefined names
4239332Sjkim *
5239332Sjkim *****************************************************************************/
6239332Sjkim
7239332Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9239332Sjkim * All rights reserved.
10239332Sjkim *
11239332Sjkim * Redistribution and use in source and binary forms, with or without
12239332Sjkim * modification, are permitted provided that the following conditions
13239332Sjkim * are met:
14239332Sjkim * 1. Redistributions of source code must retain the above copyright
15239332Sjkim *    notice, this list of conditions, and the following disclaimer,
16239332Sjkim *    without modification.
17239332Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18239332Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19239332Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20239332Sjkim *    including a substantially similar Disclaimer requirement for further
21239332Sjkim *    binary redistribution.
22239332Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23239332Sjkim *    of any contributors may be used to endorse or promote products derived
24239332Sjkim *    from this software without specific prior written permission.
25239332Sjkim *
26239332Sjkim * Alternatively, this software may be distributed under the terms of the
27239332Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28239332Sjkim * Software Foundation.
29239332Sjkim *
30239332Sjkim * NO WARRANTY
31239332Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32239332Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33239332Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34239332Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35239332Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36239332Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37239332Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38239332Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39239332Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40239332Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41239332Sjkim * POSSIBILITY OF SUCH DAMAGES.
42239332Sjkim */
43239332Sjkim
44239332Sjkim#ifndef __ACBUFFER_H__
45239332Sjkim#define __ACBUFFER_H__
46239332Sjkim
47239332Sjkim/*
48239332Sjkim * Contains buffer structures for these predefined names:
49239332Sjkim * _FDE, _GRT, _GTM, _PLD, _SRT
50239332Sjkim */
51239332Sjkim
52239332Sjkim/*
53239332Sjkim * Note: C bitfields are not used for this reason:
54239332Sjkim *
55239332Sjkim * "Bitfields are great and easy to read, but unfortunately the C language
56239332Sjkim * does not specify the layout of bitfields in memory, which means they are
57239332Sjkim * essentially useless for dealing with packed data in on-disk formats or
58239332Sjkim * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me,
59239332Sjkim * this decision was a design error in C. Ritchie could have picked an order
60239332Sjkim * and stuck with it." Norman Ramsey.
61239332Sjkim * See http://stackoverflow.com/a/1053662/41661
62239332Sjkim */
63239332Sjkim
64239332Sjkim
65239332Sjkim/* _FDE return value */
66239332Sjkim
67239332Sjkimtypedef struct acpi_fde_info
68239332Sjkim{
69239332Sjkim    UINT32              Floppy0;
70239332Sjkim    UINT32              Floppy1;
71239332Sjkim    UINT32              Floppy2;
72239332Sjkim    UINT32              Floppy3;
73239332Sjkim    UINT32              Tape;
74239332Sjkim
75239332Sjkim} ACPI_FDE_INFO;
76239332Sjkim
77239332Sjkim/*
78239332Sjkim * _GRT return value
79239332Sjkim * _SRT input value
80239332Sjkim */
81239332Sjkimtypedef struct acpi_grt_info
82239332Sjkim{
83239332Sjkim    UINT16              Year;
84239332Sjkim    UINT8               Month;
85239332Sjkim    UINT8               Day;
86239332Sjkim    UINT8               Hour;
87239332Sjkim    UINT8               Minute;
88239332Sjkim    UINT8               Second;
89239332Sjkim    UINT8               Valid;
90239332Sjkim    UINT16              Milliseconds;
91239332Sjkim    UINT16              Timezone;
92239332Sjkim    UINT8               Daylight;
93239332Sjkim    UINT8               Reserved[3];
94239332Sjkim
95239332Sjkim} ACPI_GRT_INFO;
96239332Sjkim
97239332Sjkim/* _GTM return value */
98239332Sjkim
99239332Sjkimtypedef struct acpi_gtm_info
100239332Sjkim{
101239332Sjkim    UINT32              PioSpeed0;
102239332Sjkim    UINT32              DmaSpeed0;
103239332Sjkim    UINT32              PioSpeed1;
104239332Sjkim    UINT32              DmaSpeed1;
105239332Sjkim    UINT32              Flags;
106239332Sjkim
107239332Sjkim} ACPI_GTM_INFO;
108239332Sjkim
109239332Sjkim/*
110239332Sjkim * Formatted _PLD return value. The minimum size is a package containing
111239332Sjkim * one buffer.
112239332Sjkim * Revision 1: Buffer is 16 bytes (128 bits)
113239332Sjkim * Revision 2: Buffer is 20 bytes (160 bits)
114239332Sjkim *
115239332Sjkim * Note: This structure is returned from the AcpiDecodePldBuffer
116239332Sjkim * interface.
117239332Sjkim */
118239332Sjkimtypedef struct acpi_pld_info
119239332Sjkim{
120239332Sjkim    UINT8               Revision;
121239332Sjkim    UINT8               IgnoreColor;
122281075Sdim    UINT8               Red;
123281075Sdim    UINT8               Green;
124281075Sdim    UINT8               Blue;
125239332Sjkim    UINT16              Width;
126239332Sjkim    UINT16              Height;
127239332Sjkim    UINT8               UserVisible;
128239332Sjkim    UINT8               Dock;
129239332Sjkim    UINT8               Lid;
130239332Sjkim    UINT8               Panel;
131239332Sjkim    UINT8               VerticalPosition;
132239332Sjkim    UINT8               HorizontalPosition;
133239332Sjkim    UINT8               Shape;
134239332Sjkim    UINT8               GroupOrientation;
135239332Sjkim    UINT8               GroupToken;
136239332Sjkim    UINT8               GroupPosition;
137239332Sjkim    UINT8               Bay;
138239332Sjkim    UINT8               Ejectable;
139239332Sjkim    UINT8               OspmEjectRequired;
140239332Sjkim    UINT8               CabinetNumber;
141239332Sjkim    UINT8               CardCageNumber;
142239332Sjkim    UINT8               Reference;
143239332Sjkim    UINT8               Rotation;
144239332Sjkim    UINT8               Order;
145239332Sjkim    UINT8               Reserved;
146239332Sjkim    UINT16              VerticalOffset;
147239332Sjkim    UINT16              HorizontalOffset;
148239332Sjkim
149239332Sjkim} ACPI_PLD_INFO;
150239332Sjkim
151239332Sjkim
152239332Sjkim/*
153239332Sjkim * Macros to:
154239332Sjkim *     1) Convert a _PLD buffer to internal ACPI_PLD_INFO format - ACPI_PLD_GET*
155239332Sjkim *        (Used by AcpiDecodePldBuffer)
156239332Sjkim *     2) Construct a _PLD buffer - ACPI_PLD_SET*
157239332Sjkim *        (Intended for BIOS use only)
158239332Sjkim */
159239332Sjkim#define ACPI_PLD_REV1_BUFFER_SIZE               16 /* For Revision 1 of the buffer (From ACPI spec) */
160306536Sjkim#define ACPI_PLD_REV2_BUFFER_SIZE               20 /* For Revision 2 of the buffer (From ACPI spec) */
161239332Sjkim#define ACPI_PLD_BUFFER_SIZE                    20 /* For Revision 2 of the buffer (From ACPI spec) */
162239332Sjkim
163239332Sjkim/* First 32-bit dword, bits 0:32 */
164239332Sjkim
165239332Sjkim#define ACPI_PLD_GET_REVISION(dword)            ACPI_GET_BITS (dword, 0, ACPI_7BIT_MASK)
166239332Sjkim#define ACPI_PLD_SET_REVISION(dword,value)      ACPI_SET_BITS (dword, 0, ACPI_7BIT_MASK, value)     /* Offset 0, Len 7 */
167239332Sjkim
168239332Sjkim#define ACPI_PLD_GET_IGNORE_COLOR(dword)        ACPI_GET_BITS (dword, 7, ACPI_1BIT_MASK)
169239332Sjkim#define ACPI_PLD_SET_IGNORE_COLOR(dword,value)  ACPI_SET_BITS (dword, 7, ACPI_1BIT_MASK, value)     /* Offset 7, Len 1 */
170239332Sjkim
171281075Sdim#define ACPI_PLD_GET_RED(dword)                 ACPI_GET_BITS (dword, 8, ACPI_8BIT_MASK)
172281075Sdim#define ACPI_PLD_SET_RED(dword,value)           ACPI_SET_BITS (dword, 8, ACPI_8BIT_MASK, value)    /* Offset 8, Len 8 */
173239332Sjkim
174281075Sdim#define ACPI_PLD_GET_GREEN(dword)               ACPI_GET_BITS (dword, 16, ACPI_8BIT_MASK)
175281075Sdim#define ACPI_PLD_SET_GREEN(dword,value)         ACPI_SET_BITS (dword, 16, ACPI_8BIT_MASK, value)    /* Offset 16, Len 8 */
176281075Sdim
177281075Sdim#define ACPI_PLD_GET_BLUE(dword)                ACPI_GET_BITS (dword, 24, ACPI_8BIT_MASK)
178281075Sdim#define ACPI_PLD_SET_BLUE(dword,value)          ACPI_SET_BITS (dword, 24, ACPI_8BIT_MASK, value)    /* Offset 24, Len 8 */
179281075Sdim
180239332Sjkim/* Second 32-bit dword, bits 33:63 */
181239332Sjkim
182239332Sjkim#define ACPI_PLD_GET_WIDTH(dword)               ACPI_GET_BITS (dword, 0, ACPI_16BIT_MASK)
183239332Sjkim#define ACPI_PLD_SET_WIDTH(dword,value)         ACPI_SET_BITS (dword, 0, ACPI_16BIT_MASK, value)    /* Offset 32+0=32, Len 16 */
184239332Sjkim
185239332Sjkim#define ACPI_PLD_GET_HEIGHT(dword)              ACPI_GET_BITS (dword, 16, ACPI_16BIT_MASK)
186239332Sjkim#define ACPI_PLD_SET_HEIGHT(dword,value)        ACPI_SET_BITS (dword, 16, ACPI_16BIT_MASK, value)   /* Offset 32+16=48, Len 16 */
187239332Sjkim
188239332Sjkim/* Third 32-bit dword, bits 64:95 */
189239332Sjkim
190239332Sjkim#define ACPI_PLD_GET_USER_VISIBLE(dword)        ACPI_GET_BITS (dword, 0, ACPI_1BIT_MASK)
191239332Sjkim#define ACPI_PLD_SET_USER_VISIBLE(dword,value)  ACPI_SET_BITS (dword, 0, ACPI_1BIT_MASK, value)     /* Offset 64+0=64, Len 1 */
192239332Sjkim
193239332Sjkim#define ACPI_PLD_GET_DOCK(dword)                ACPI_GET_BITS (dword, 1, ACPI_1BIT_MASK)
194239332Sjkim#define ACPI_PLD_SET_DOCK(dword,value)          ACPI_SET_BITS (dword, 1, ACPI_1BIT_MASK, value)     /* Offset 64+1=65, Len 1 */
195239332Sjkim
196239332Sjkim#define ACPI_PLD_GET_LID(dword)                 ACPI_GET_BITS (dword, 2, ACPI_1BIT_MASK)
197239332Sjkim#define ACPI_PLD_SET_LID(dword,value)           ACPI_SET_BITS (dword, 2, ACPI_1BIT_MASK, value)     /* Offset 64+2=66, Len 1 */
198239332Sjkim
199239332Sjkim#define ACPI_PLD_GET_PANEL(dword)               ACPI_GET_BITS (dword, 3, ACPI_3BIT_MASK)
200239332Sjkim#define ACPI_PLD_SET_PANEL(dword,value)         ACPI_SET_BITS (dword, 3, ACPI_3BIT_MASK, value)     /* Offset 64+3=67, Len 3 */
201239332Sjkim
202239332Sjkim#define ACPI_PLD_GET_VERTICAL(dword)            ACPI_GET_BITS (dword, 6, ACPI_2BIT_MASK)
203239332Sjkim#define ACPI_PLD_SET_VERTICAL(dword,value)      ACPI_SET_BITS (dword, 6, ACPI_2BIT_MASK, value)     /* Offset 64+6=70, Len 2 */
204239332Sjkim
205239332Sjkim#define ACPI_PLD_GET_HORIZONTAL(dword)          ACPI_GET_BITS (dword, 8, ACPI_2BIT_MASK)
206239332Sjkim#define ACPI_PLD_SET_HORIZONTAL(dword,value)    ACPI_SET_BITS (dword, 8, ACPI_2BIT_MASK, value)     /* Offset 64+8=72, Len 2 */
207239332Sjkim
208239332Sjkim#define ACPI_PLD_GET_SHAPE(dword)               ACPI_GET_BITS (dword, 10, ACPI_4BIT_MASK)
209239332Sjkim#define ACPI_PLD_SET_SHAPE(dword,value)         ACPI_SET_BITS (dword, 10, ACPI_4BIT_MASK, value)    /* Offset 64+10=74, Len 4 */
210239332Sjkim
211239332Sjkim#define ACPI_PLD_GET_ORIENTATION(dword)         ACPI_GET_BITS (dword, 14, ACPI_1BIT_MASK)
212239332Sjkim#define ACPI_PLD_SET_ORIENTATION(dword,value)   ACPI_SET_BITS (dword, 14, ACPI_1BIT_MASK, value)    /* Offset 64+14=78, Len 1 */
213239332Sjkim
214239332Sjkim#define ACPI_PLD_GET_TOKEN(dword)               ACPI_GET_BITS (dword, 15, ACPI_8BIT_MASK)
215239332Sjkim#define ACPI_PLD_SET_TOKEN(dword,value)         ACPI_SET_BITS (dword, 15, ACPI_8BIT_MASK, value)    /* Offset 64+15=79, Len 8 */
216239332Sjkim
217239332Sjkim#define ACPI_PLD_GET_POSITION(dword)            ACPI_GET_BITS (dword, 23, ACPI_8BIT_MASK)
218239332Sjkim#define ACPI_PLD_SET_POSITION(dword,value)      ACPI_SET_BITS (dword, 23, ACPI_8BIT_MASK, value)    /* Offset 64+23=87, Len 8 */
219239332Sjkim
220239332Sjkim#define ACPI_PLD_GET_BAY(dword)                 ACPI_GET_BITS (dword, 31, ACPI_1BIT_MASK)
221239332Sjkim#define ACPI_PLD_SET_BAY(dword,value)           ACPI_SET_BITS (dword, 31, ACPI_1BIT_MASK, value)    /* Offset 64+31=95, Len 1 */
222239332Sjkim
223239332Sjkim/* Fourth 32-bit dword, bits 96:127 */
224239332Sjkim
225239332Sjkim#define ACPI_PLD_GET_EJECTABLE(dword)           ACPI_GET_BITS (dword, 0, ACPI_1BIT_MASK)
226239332Sjkim#define ACPI_PLD_SET_EJECTABLE(dword,value)     ACPI_SET_BITS (dword, 0, ACPI_1BIT_MASK, value)     /* Offset 96+0=96, Len 1 */
227239332Sjkim
228239332Sjkim#define ACPI_PLD_GET_OSPM_EJECT(dword)          ACPI_GET_BITS (dword, 1, ACPI_1BIT_MASK)
229239332Sjkim#define ACPI_PLD_SET_OSPM_EJECT(dword,value)    ACPI_SET_BITS (dword, 1, ACPI_1BIT_MASK, value)     /* Offset 96+1=97, Len 1 */
230239332Sjkim
231239332Sjkim#define ACPI_PLD_GET_CABINET(dword)             ACPI_GET_BITS (dword, 2, ACPI_8BIT_MASK)
232239332Sjkim#define ACPI_PLD_SET_CABINET(dword,value)       ACPI_SET_BITS (dword, 2, ACPI_8BIT_MASK, value)     /* Offset 96+2=98, Len 8 */
233239332Sjkim
234239332Sjkim#define ACPI_PLD_GET_CARD_CAGE(dword)           ACPI_GET_BITS (dword, 10, ACPI_8BIT_MASK)
235239332Sjkim#define ACPI_PLD_SET_CARD_CAGE(dword,value)     ACPI_SET_BITS (dword, 10, ACPI_8BIT_MASK, value)    /* Offset 96+10=106, Len 8 */
236239332Sjkim
237239332Sjkim#define ACPI_PLD_GET_REFERENCE(dword)           ACPI_GET_BITS (dword, 18, ACPI_1BIT_MASK)
238239332Sjkim#define ACPI_PLD_SET_REFERENCE(dword,value)     ACPI_SET_BITS (dword, 18, ACPI_1BIT_MASK, value)    /* Offset 96+18=114, Len 1 */
239239332Sjkim
240239332Sjkim#define ACPI_PLD_GET_ROTATION(dword)            ACPI_GET_BITS (dword, 19, ACPI_4BIT_MASK)
241239332Sjkim#define ACPI_PLD_SET_ROTATION(dword,value)      ACPI_SET_BITS (dword, 19, ACPI_4BIT_MASK, value)    /* Offset 96+19=115, Len 4 */
242239332Sjkim
243239332Sjkim#define ACPI_PLD_GET_ORDER(dword)               ACPI_GET_BITS (dword, 23, ACPI_5BIT_MASK)
244239332Sjkim#define ACPI_PLD_SET_ORDER(dword,value)         ACPI_SET_BITS (dword, 23, ACPI_5BIT_MASK, value)    /* Offset 96+23=119, Len 5 */
245239332Sjkim
246239332Sjkim/* Fifth 32-bit dword, bits 128:159 (Revision 2 of _PLD only) */
247239332Sjkim
248239332Sjkim#define ACPI_PLD_GET_VERT_OFFSET(dword)         ACPI_GET_BITS (dword, 0, ACPI_16BIT_MASK)
249239332Sjkim#define ACPI_PLD_SET_VERT_OFFSET(dword,value)   ACPI_SET_BITS (dword, 0, ACPI_16BIT_MASK, value)    /* Offset 128+0=128, Len 16 */
250239332Sjkim
251239332Sjkim#define ACPI_PLD_GET_HORIZ_OFFSET(dword)        ACPI_GET_BITS (dword, 16, ACPI_16BIT_MASK)
252239332Sjkim#define ACPI_PLD_SET_HORIZ_OFFSET(dword,value)  ACPI_SET_BITS (dword, 16, ACPI_16BIT_MASK, value)   /* Offset 128+16=144, Len 16 */
253239332Sjkim
254239332Sjkim
255239332Sjkim#endif /* ACBUFFER_H */
256