1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2*4882a593Smuzhiyun /****************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Name: acbuffer.h - Support for buffers returned by ACPI predefined names 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2000 - 2020, Intel Corp. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun *****************************************************************************/ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __ACBUFFER_H__ 11*4882a593Smuzhiyun #define __ACBUFFER_H__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* 14*4882a593Smuzhiyun * Contains buffer structures for these predefined names: 15*4882a593Smuzhiyun * _FDE, _GRT, _GTM, _PLD, _SRT 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* 19*4882a593Smuzhiyun * Note: C bitfields are not used for this reason: 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * "Bitfields are great and easy to read, but unfortunately the C language 22*4882a593Smuzhiyun * does not specify the layout of bitfields in memory, which means they are 23*4882a593Smuzhiyun * essentially useless for dealing with packed data in on-disk formats or 24*4882a593Smuzhiyun * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me, 25*4882a593Smuzhiyun * this decision was a design error in C. Ritchie could have picked an order 26*4882a593Smuzhiyun * and stuck with it." Norman Ramsey. 27*4882a593Smuzhiyun * See http://stackoverflow.com/a/1053662/41661 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* _FDE return value */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct acpi_fde_info { 33*4882a593Smuzhiyun u32 floppy0; 34*4882a593Smuzhiyun u32 floppy1; 35*4882a593Smuzhiyun u32 floppy2; 36*4882a593Smuzhiyun u32 floppy3; 37*4882a593Smuzhiyun u32 tape; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun * _GRT return value 42*4882a593Smuzhiyun * _SRT input value 43*4882a593Smuzhiyun */ 44*4882a593Smuzhiyun struct acpi_grt_info { 45*4882a593Smuzhiyun u16 year; 46*4882a593Smuzhiyun u8 month; 47*4882a593Smuzhiyun u8 day; 48*4882a593Smuzhiyun u8 hour; 49*4882a593Smuzhiyun u8 minute; 50*4882a593Smuzhiyun u8 second; 51*4882a593Smuzhiyun u8 valid; 52*4882a593Smuzhiyun u16 milliseconds; 53*4882a593Smuzhiyun u16 timezone; 54*4882a593Smuzhiyun u8 daylight; 55*4882a593Smuzhiyun u8 reserved[3]; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* _GTM return value */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun struct acpi_gtm_info { 61*4882a593Smuzhiyun u32 pio_speed0; 62*4882a593Smuzhiyun u32 dma_speed0; 63*4882a593Smuzhiyun u32 pio_speed1; 64*4882a593Smuzhiyun u32 dma_speed1; 65*4882a593Smuzhiyun u32 flags; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* 69*4882a593Smuzhiyun * Formatted _PLD return value. The minimum size is a package containing 70*4882a593Smuzhiyun * one buffer. 71*4882a593Smuzhiyun * Revision 1: Buffer is 16 bytes (128 bits) 72*4882a593Smuzhiyun * Revision 2: Buffer is 20 bytes (160 bits) 73*4882a593Smuzhiyun * 74*4882a593Smuzhiyun * Note: This structure is returned from the acpi_decode_pld_buffer 75*4882a593Smuzhiyun * interface. 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun struct acpi_pld_info { 78*4882a593Smuzhiyun u8 revision; 79*4882a593Smuzhiyun u8 ignore_color; 80*4882a593Smuzhiyun u8 red; 81*4882a593Smuzhiyun u8 green; 82*4882a593Smuzhiyun u8 blue; 83*4882a593Smuzhiyun u16 width; 84*4882a593Smuzhiyun u16 height; 85*4882a593Smuzhiyun u8 user_visible; 86*4882a593Smuzhiyun u8 dock; 87*4882a593Smuzhiyun u8 lid; 88*4882a593Smuzhiyun u8 panel; 89*4882a593Smuzhiyun u8 vertical_position; 90*4882a593Smuzhiyun u8 horizontal_position; 91*4882a593Smuzhiyun u8 shape; 92*4882a593Smuzhiyun u8 group_orientation; 93*4882a593Smuzhiyun u8 group_token; 94*4882a593Smuzhiyun u8 group_position; 95*4882a593Smuzhiyun u8 bay; 96*4882a593Smuzhiyun u8 ejectable; 97*4882a593Smuzhiyun u8 ospm_eject_required; 98*4882a593Smuzhiyun u8 cabinet_number; 99*4882a593Smuzhiyun u8 card_cage_number; 100*4882a593Smuzhiyun u8 reference; 101*4882a593Smuzhiyun u8 rotation; 102*4882a593Smuzhiyun u8 order; 103*4882a593Smuzhiyun u8 reserved; 104*4882a593Smuzhiyun u16 vertical_offset; 105*4882a593Smuzhiyun u16 horizontal_offset; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun /* 109*4882a593Smuzhiyun * Macros to: 110*4882a593Smuzhiyun * 1) Convert a _PLD buffer to internal struct acpi_pld_info format - ACPI_PLD_GET* 111*4882a593Smuzhiyun * (Used by acpi_decode_pld_buffer) 112*4882a593Smuzhiyun * 2) Construct a _PLD buffer - ACPI_PLD_SET* 113*4882a593Smuzhiyun * (Intended for BIOS use only) 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun #define ACPI_PLD_REV1_BUFFER_SIZE 16 /* For Revision 1 of the buffer (From ACPI spec) */ 116*4882a593Smuzhiyun #define ACPI_PLD_REV2_BUFFER_SIZE 20 /* For Revision 2 of the buffer (From ACPI spec) */ 117*4882a593Smuzhiyun #define ACPI_PLD_BUFFER_SIZE 20 /* For Revision 2 of the buffer (From ACPI spec) */ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* First 32-bit dword, bits 0:32 */ 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define ACPI_PLD_GET_REVISION(dword) ACPI_GET_BITS (dword, 0, ACPI_7BIT_MASK) 122*4882a593Smuzhiyun #define ACPI_PLD_SET_REVISION(dword,value) ACPI_SET_BITS (dword, 0, ACPI_7BIT_MASK, value) /* Offset 0, Len 7 */ 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define ACPI_PLD_GET_IGNORE_COLOR(dword) ACPI_GET_BITS (dword, 7, ACPI_1BIT_MASK) 125*4882a593Smuzhiyun #define ACPI_PLD_SET_IGNORE_COLOR(dword,value) ACPI_SET_BITS (dword, 7, ACPI_1BIT_MASK, value) /* Offset 7, Len 1 */ 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define ACPI_PLD_GET_RED(dword) ACPI_GET_BITS (dword, 8, ACPI_8BIT_MASK) 128*4882a593Smuzhiyun #define ACPI_PLD_SET_RED(dword,value) ACPI_SET_BITS (dword, 8, ACPI_8BIT_MASK, value) /* Offset 8, Len 8 */ 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define ACPI_PLD_GET_GREEN(dword) ACPI_GET_BITS (dword, 16, ACPI_8BIT_MASK) 131*4882a593Smuzhiyun #define ACPI_PLD_SET_GREEN(dword,value) ACPI_SET_BITS (dword, 16, ACPI_8BIT_MASK, value) /* Offset 16, Len 8 */ 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define ACPI_PLD_GET_BLUE(dword) ACPI_GET_BITS (dword, 24, ACPI_8BIT_MASK) 134*4882a593Smuzhiyun #define ACPI_PLD_SET_BLUE(dword,value) ACPI_SET_BITS (dword, 24, ACPI_8BIT_MASK, value) /* Offset 24, Len 8 */ 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* Second 32-bit dword, bits 33:63 */ 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #define ACPI_PLD_GET_WIDTH(dword) ACPI_GET_BITS (dword, 0, ACPI_16BIT_MASK) 139*4882a593Smuzhiyun #define ACPI_PLD_SET_WIDTH(dword,value) ACPI_SET_BITS (dword, 0, ACPI_16BIT_MASK, value) /* Offset 32+0=32, Len 16 */ 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define ACPI_PLD_GET_HEIGHT(dword) ACPI_GET_BITS (dword, 16, ACPI_16BIT_MASK) 142*4882a593Smuzhiyun #define ACPI_PLD_SET_HEIGHT(dword,value) ACPI_SET_BITS (dword, 16, ACPI_16BIT_MASK, value) /* Offset 32+16=48, Len 16 */ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* Third 32-bit dword, bits 64:95 */ 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define ACPI_PLD_GET_USER_VISIBLE(dword) ACPI_GET_BITS (dword, 0, ACPI_1BIT_MASK) 147*4882a593Smuzhiyun #define ACPI_PLD_SET_USER_VISIBLE(dword,value) ACPI_SET_BITS (dword, 0, ACPI_1BIT_MASK, value) /* Offset 64+0=64, Len 1 */ 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #define ACPI_PLD_GET_DOCK(dword) ACPI_GET_BITS (dword, 1, ACPI_1BIT_MASK) 150*4882a593Smuzhiyun #define ACPI_PLD_SET_DOCK(dword,value) ACPI_SET_BITS (dword, 1, ACPI_1BIT_MASK, value) /* Offset 64+1=65, Len 1 */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define ACPI_PLD_GET_LID(dword) ACPI_GET_BITS (dword, 2, ACPI_1BIT_MASK) 153*4882a593Smuzhiyun #define ACPI_PLD_SET_LID(dword,value) ACPI_SET_BITS (dword, 2, ACPI_1BIT_MASK, value) /* Offset 64+2=66, Len 1 */ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #define ACPI_PLD_GET_PANEL(dword) ACPI_GET_BITS (dword, 3, ACPI_3BIT_MASK) 156*4882a593Smuzhiyun #define ACPI_PLD_SET_PANEL(dword,value) ACPI_SET_BITS (dword, 3, ACPI_3BIT_MASK, value) /* Offset 64+3=67, Len 3 */ 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define ACPI_PLD_GET_VERTICAL(dword) ACPI_GET_BITS (dword, 6, ACPI_2BIT_MASK) 159*4882a593Smuzhiyun #define ACPI_PLD_SET_VERTICAL(dword,value) ACPI_SET_BITS (dword, 6, ACPI_2BIT_MASK, value) /* Offset 64+6=70, Len 2 */ 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #define ACPI_PLD_GET_HORIZONTAL(dword) ACPI_GET_BITS (dword, 8, ACPI_2BIT_MASK) 162*4882a593Smuzhiyun #define ACPI_PLD_SET_HORIZONTAL(dword,value) ACPI_SET_BITS (dword, 8, ACPI_2BIT_MASK, value) /* Offset 64+8=72, Len 2 */ 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define ACPI_PLD_GET_SHAPE(dword) ACPI_GET_BITS (dword, 10, ACPI_4BIT_MASK) 165*4882a593Smuzhiyun #define ACPI_PLD_SET_SHAPE(dword,value) ACPI_SET_BITS (dword, 10, ACPI_4BIT_MASK, value) /* Offset 64+10=74, Len 4 */ 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun #define ACPI_PLD_GET_ORIENTATION(dword) ACPI_GET_BITS (dword, 14, ACPI_1BIT_MASK) 168*4882a593Smuzhiyun #define ACPI_PLD_SET_ORIENTATION(dword,value) ACPI_SET_BITS (dword, 14, ACPI_1BIT_MASK, value) /* Offset 64+14=78, Len 1 */ 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define ACPI_PLD_GET_TOKEN(dword) ACPI_GET_BITS (dword, 15, ACPI_8BIT_MASK) 171*4882a593Smuzhiyun #define ACPI_PLD_SET_TOKEN(dword,value) ACPI_SET_BITS (dword, 15, ACPI_8BIT_MASK, value) /* Offset 64+15=79, Len 8 */ 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define ACPI_PLD_GET_POSITION(dword) ACPI_GET_BITS (dword, 23, ACPI_8BIT_MASK) 174*4882a593Smuzhiyun #define ACPI_PLD_SET_POSITION(dword,value) ACPI_SET_BITS (dword, 23, ACPI_8BIT_MASK, value) /* Offset 64+23=87, Len 8 */ 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define ACPI_PLD_GET_BAY(dword) ACPI_GET_BITS (dword, 31, ACPI_1BIT_MASK) 177*4882a593Smuzhiyun #define ACPI_PLD_SET_BAY(dword,value) ACPI_SET_BITS (dword, 31, ACPI_1BIT_MASK, value) /* Offset 64+31=95, Len 1 */ 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* Fourth 32-bit dword, bits 96:127 */ 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun #define ACPI_PLD_GET_EJECTABLE(dword) ACPI_GET_BITS (dword, 0, ACPI_1BIT_MASK) 182*4882a593Smuzhiyun #define ACPI_PLD_SET_EJECTABLE(dword,value) ACPI_SET_BITS (dword, 0, ACPI_1BIT_MASK, value) /* Offset 96+0=96, Len 1 */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #define ACPI_PLD_GET_OSPM_EJECT(dword) ACPI_GET_BITS (dword, 1, ACPI_1BIT_MASK) 185*4882a593Smuzhiyun #define ACPI_PLD_SET_OSPM_EJECT(dword,value) ACPI_SET_BITS (dword, 1, ACPI_1BIT_MASK, value) /* Offset 96+1=97, Len 1 */ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define ACPI_PLD_GET_CABINET(dword) ACPI_GET_BITS (dword, 2, ACPI_8BIT_MASK) 188*4882a593Smuzhiyun #define ACPI_PLD_SET_CABINET(dword,value) ACPI_SET_BITS (dword, 2, ACPI_8BIT_MASK, value) /* Offset 96+2=98, Len 8 */ 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define ACPI_PLD_GET_CARD_CAGE(dword) ACPI_GET_BITS (dword, 10, ACPI_8BIT_MASK) 191*4882a593Smuzhiyun #define ACPI_PLD_SET_CARD_CAGE(dword,value) ACPI_SET_BITS (dword, 10, ACPI_8BIT_MASK, value) /* Offset 96+10=106, Len 8 */ 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun #define ACPI_PLD_GET_REFERENCE(dword) ACPI_GET_BITS (dword, 18, ACPI_1BIT_MASK) 194*4882a593Smuzhiyun #define ACPI_PLD_SET_REFERENCE(dword,value) ACPI_SET_BITS (dword, 18, ACPI_1BIT_MASK, value) /* Offset 96+18=114, Len 1 */ 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #define ACPI_PLD_GET_ROTATION(dword) ACPI_GET_BITS (dword, 19, ACPI_4BIT_MASK) 197*4882a593Smuzhiyun #define ACPI_PLD_SET_ROTATION(dword,value) ACPI_SET_BITS (dword, 19, ACPI_4BIT_MASK, value) /* Offset 96+19=115, Len 4 */ 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define ACPI_PLD_GET_ORDER(dword) ACPI_GET_BITS (dword, 23, ACPI_5BIT_MASK) 200*4882a593Smuzhiyun #define ACPI_PLD_SET_ORDER(dword,value) ACPI_SET_BITS (dword, 23, ACPI_5BIT_MASK, value) /* Offset 96+23=119, Len 5 */ 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* Fifth 32-bit dword, bits 128:159 (Revision 2 of _PLD only) */ 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun #define ACPI_PLD_GET_VERT_OFFSET(dword) ACPI_GET_BITS (dword, 0, ACPI_16BIT_MASK) 205*4882a593Smuzhiyun #define ACPI_PLD_SET_VERT_OFFSET(dword,value) ACPI_SET_BITS (dword, 0, ACPI_16BIT_MASK, value) /* Offset 128+0=128, Len 16 */ 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define ACPI_PLD_GET_HORIZ_OFFSET(dword) ACPI_GET_BITS (dword, 16, ACPI_16BIT_MASK) 208*4882a593Smuzhiyun #define ACPI_PLD_SET_HORIZ_OFFSET(dword,value) ACPI_SET_BITS (dword, 16, ACPI_16BIT_MASK, value) /* Offset 128+16=144, Len 16 */ 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #endif /* ACBUFFER_H */ 211