211 lines
6.1 KiB
C

/*******************************************************************************
** This file is provided under a dual BSD/GPLv2 license. When using or
** redistributing this file, you may do so under either license.
**
** GPL LICENSE SUMMARY
**
** Copyright (c) 2013 Intel Corporation All Rights Reserved
**
** This program is free software; you can redistribute it and/or modify it under
** the terms of version 2 of the GNU General Public License as published by the
** Free Software Foundation.
**
** This program is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
** details.
**
** You should have received a copy of the GNU General Public License along with
** this program; if not, write to the Free Software Foundation, Inc.,
** 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
** The full GNU General Public License is included in this distribution in the
** file called LICENSE.GPL.
**
** BSD LICENSE
**
** Copyright (c) 2013 Intel Corporation All Rights Reserved
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**
** * Redistributions of source code must retain the above copyright notice, this
** list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
** * Neither the name of Intel Corporation nor the names of its contributors may
** be used to endorse or promote products derived from this software without
** specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
**
*******************************************************************************/
#ifndef _ESIF_DATA_H_
#define _ESIF_DATA_H_
/* include enum esif_data_type, and lookup */
/* #ifdef ESIF_ATTR_USER */
#include "esif.h"
/* #endif */
#include "autogen.h"
/*
** User Decleration
*/
/*
** Agnostic Decleration
*/
/* Have ESIF Allocate Buffer */
#define ESIF_DATA_ALLOCATE 0xFFFFFFFF
#pragma pack(push,1)
/* All ESIF Data Buffers Are Of This Form */
struct esif_data {
enum esif_data_type type; /* Buffer Type */
void *buf_ptr; /* Buffer */
u32 buf_len; /* Sizeof Allocated Buffer By Memory Allocator
**/
u32 data_len; /* Sizeof Actual Data Contents */
};
/* Cooling Mode Policy */
struct esif_data_complex_scp {
u32 cooling_mode;
u32 acoustic_limit;
u32 power_limit;
};
/* Thermal Shutdown Event */
struct esif_data_complex_shutdown {
u32 temperature;
u32 tripPointTemperature;
};
/* Operating System Capabilities */
struct esif_data_complex_osc {
esif_guid_t guid;
u32 revision;
u32 count;
u32 status; /* Required */
u32 capabilities; /* Always Used By DPTF */
};
/* GUID Pair */
struct esif_data_complex_guid_pair {
esif_guid_t guid1; /* Example SUB_GROUP */
esif_guid_t guid2; /* Example Power Setting */
};
#define ESIF_TABLE_NO_REVISION 0xffff
struct esif_table_hdr {
u8 revision;
u16 rows;
u16 cols;
};
/* Variant */
/* Binary data shall be identical to what upper framework sees */
/* Pack so we end up with exactly 12 bytes always */
union esif_data_variant {
enum esif_data_type type;
/* Integer */
struct {
enum esif_data_type type; /* 4 Bytes For Most Compilers */
u64 value; /* 8 Byte Integer */
}
integer;
/* ASCII String NULL Included In Length */
struct {
enum esif_data_type type; /* 4 Bytes For Most Compilers
* */
u32 length; /* 4 Bytes */
u32 reserved; /* Align To 12 Bytes */
}
string;
/* String Data Here */
};
#pragma pack(pop)
#ifdef __cplusplus
extern "C" {
#endif
/* Allocate */
struct esif_data *esif_data_alloc(enum esif_data_type type, u32 data_len);
void esif_data_free(struct esif_data *data_ptr);
/* Init */
enum esif_rc esif_data_init(void);
void esif_data_exit(void);
#ifdef __cplusplus
}
#endif
#ifdef ESIF_ATTR_USER
typedef struct esif_data EsifData, *EsifDataPtr, **EsifDataPtrLocation;
/*
* ESIF Data is used to marshall most data between ESIF and the
* application it contains. ESIF data uses the populare TLV
* format for describing the data. It can be used to request
* specific data from an object or to identify the data type that
* is returned. While a simple structure it is very helpful. Here
* are a set of convinience initializers to make working with this
* structure easier.
*/
#define ESIF_DATA(var, type, buf_ptr, buf_len) \
EsifData var = { \
ESIF_ELEMENT(.type) type, \
ESIF_ELEMENT(.buf_ptr) buf_ptr, \
ESIF_ELEMENT(.buf_len) buf_len \
}
#define ESIF_DATA_VOID(var) \
EsifData var = { \
ESIF_ELEMENT(.type) ESIF_DATA_VOID, \
ESIF_ELEMENT(.buf_ptr) NULL, \
ESIF_ELEMENT(.buf_len) 0 \
}
#define ESIF_DATA_AUTO(var) \
EsifData var = { \
ESIF_ELEMENT(.type) ESIF_DATA_AUTO, \
ESIF_ELEMENT(.buf_ptr) ESIF_DATA_ALLOCATE, \
ESIF_ELEMENT(.buf_len) 0 \
}
#endif /* ESIF_ATTR_USER */
#endif /* _ESIF_DATA_H_ */
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/