diff options
author | Matthias Hopf <mhopf@suse.de> | 2009-07-02 21:14:02 +0200 |
---|---|---|
committer | Matthias Hopf <mhopf@suse.de> | 2009-07-02 21:14:02 +0200 |
commit | 153734580d1583a9fb3e50edb9b6fe3fc55e4fdc (patch) | |
tree | 47835b28d3ec023979997dc6de3fd14e3f0c5511 | |
parent | 602043797836006abda6dddd9f96e840b6ab1990 (diff) |
Make (almost) all dumpers dynamic.
-rw-r--r-- | atombios_rev.h | 79 | ||||
-rw-r--r-- | datastructs.c | 12 |
2 files changed, 85 insertions, 6 deletions
diff --git a/atombios_rev.h b/atombios_rev.h index a146ef5..db6359c 100644 --- a/atombios_rev.h +++ b/atombios_rev.h @@ -29,8 +29,87 @@ typedef struct } U24; #define _U24(x) (((x).u[2]<<16)|((x).u[1]<<8)|(x).u[0]) +#include <stddef.h> /* offsetof() */ +#define COUNT_REMAINDER(s,m,e) ((((ATOM_COMMON_TABLE_HEADER*)d)->usStructureSize-offsetof(s,m)) / sizeof(e)) +#define RETURN_REMAINDER(s,m,e) (d ? (offsetof(s,m) + COUNT_REMAINDER(s,m,e) * sizeof(e)) : 0) +#define COUNT_ALL(s,e) ((((ATOM_COMMON_TABLE_HEADER*)d)->usStructureSize-sizeof(ATOM_COMMON_TABLE_HEADER)) / sizeof(e)) +#define RETURN_ALL(s,e) (d ? (sizeof(ATOM_COMMON_TABLE_HEADER) + COUNT_ALL(s,e) * sizeof(e)) : 0) + + +/* + * Dynamic additions to generic atombios.h + */ +#pragma count ATOM_GPIO_I2C_INFO asGPIO_Info COUNT_ALL (ATOM_GPIO_I2C_INFO, ATOM_GPIO_I2C_ASSIGMENT) +#pragma return ATOM_GPIO_I2C_INFO asGPIO_Info RETURN_ALL (ATOM_GPIO_I2C_INFO, ATOM_GPIO_I2C_ASSIGMENT) + +#pragma count ATOM_GPIO_PIN_LUT asGPIO_Pin COUNT_ALL (ATOM_GPIO_PIN_LUT, ATOM_GPIO_PIN_ASSIGNMENT) +#pragma return ATOM_GPIO_PIN_LUT asGPIO_Pin RETURN_ALL (ATOM_GPIO_PIN_LUT, ATOM_GPIO_PIN_ASSIGNMENT) + +#pragma count ATOM_VESA_TO_INTENAL_MODE_LUT asVESA_ToExtendedModeInfo COUNT_ALL (ATOM_VESA_TO_INTENAL_MODE_LUT, ATOM_VESA_TO_EXTENDED_MODE) +#pragma return ATOM_VESA_TO_INTENAL_MODE_LUT asVESA_ToExtendedModeInfo RETURN_ALL (ATOM_VESA_TO_INTENAL_MODE_LUT, ATOM_VESA_TO_EXTENDED_MODE) + +#pragma count ATOM_COMPONENT_VIDEO_INFO aWbGpioStateBlock (d->ucNumOfWbGpioBlocks) +#pragma count ATOM_COMPONENT_VIDEO_INFO aModeTimings COUNT_REMAINDER (ATOM_COMPONENT_VIDEO_INFO, aModeTimings[0], ATOM_DTD_FORMAT) +#pragma return ATOM_COMPONENT_VIDEO_INFO - RETURN_REMAINDER (ATOM_COMPONENT_VIDEO_INFO, aModeTimings[0], ATOM_DTD_FORMAT) +#pragma count ATOM_COMPONENT_VIDEO_INFO_V21 aWbGpioStateBlock (d->ucNumOfWbGpioBlocks) +#pragma count ATOM_COMPONENT_VIDEO_INFO_V21 aModeTimings COUNT_REMAINDER (ATOM_COMPONENT_VIDEO_INFO_V21, aModeTimings[0], ATOM_DTD_FORMAT) +#pragma return ATOM_COMPONENT_VIDEO_INFO_V21 - RETURN_REMAINDER (ATOM_COMPONENT_VIDEO_INFO_V21, aModeTimings[0], ATOM_DTD_FORMAT) + +#pragma count INDIRECT_IO_ACCESS IOAccessSequence -1 /* No useful information */ +#pragma return INDIRECT_IO_ACCESS IOAccessSequence RETURN_ALL (ATOM_INDIRECT_IO_ACCESS, UCHAR) + +#pragma offset ATOM_VRAM_INFO_V3 aVramInfo *(offset_ATOM_VRAM_INFO_V3_aVramInfo(d,i)) +#pragma count ATOM_VRAM_INFO_V3 aVramInfo (count_ATOM_VRAM_INFO_V3_aVramInfo(d)) +#pragma offset ATOM_VRAM_INFO_V3 asMemPatch *(data + d->usMemClkPatchTblOffset) +// Needs more love +#pragma return ATOM_VRAM_INFO_V3 - 0 + +// Doesn't look completely reasonable, but seems ok... +#pragma count ATOM_ASIC_PROFILE_VOLTAGE asLeakVol ((d->usSize - offsetof(ATOM_ASIC_PROFILE_VOLTAGE,asLeakVol)) / sizeof(ATOM_LEAKID_VOLTAGE)) + +#pragma count ATOM_VOLTAGE_FORMULA ucVIDAdjustEntries (d->ucNumOfVoltageEntries) +#pragma offset ATOM_VOLTAGE_OBJECT_INFO asVoltageObj *(offset_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(d,i)) +#pragma count ATOM_VOLTAGE_OBJECT_INFO asVoltageObj (count_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(d)) +#pragma return ATOM_VOLTAGE_OBJECT_INFO - 0 + +#pragma count ATOM_POWER_SOURCE_INFO asPwrObj COUNT_REMAINDER (ATOM_POWER_SOURCE_INFO, asPwrObj[0], ATOM_POWER_SOURCE_OBJECT) +#pragma return ATOM_POWER_SOURCE_INFO - RETURN_REMAINDER (ATOM_POWER_SOURCE_INFO, asPwrObj[0], ATOM_POWER_SOURCE_OBJECT) + +/* + * Generic atombios.h + */ #include "atombios.h" +static inline char *offset_ATOM_VRAM_INFO_V3_aVramInfo(ATOM_VRAM_INFO_V3 *d, int i) { + char *r = (char *)&d->aVramInfo[0]; + while (i-- > 0) + r += ((ATOM_VRAM_MODULE_V3 *)r)->usSize; + return r; +} +static inline int count_ATOM_VRAM_INFO_V3_aVramInfo(ATOM_VRAM_INFO_V3 *d) { + int i=0; + while (offset_ATOM_VRAM_INFO_V3_aVramInfo(d,i)-(char*)d < d->usMemAdjustTblOffset) + i++; + return i; +} +static inline char *offset_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(ATOM_VOLTAGE_OBJECT_INFO *d, int i) { + char *r = (char *)&d->asVoltageObj[0]; + while (i-- > 0) + r += ((ATOM_VOLTAGE_OBJECT *)r)->ucSize; + return r; +} +static inline int count_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(ATOM_VOLTAGE_OBJECT_INFO *d) { + int i=0; + while (offset_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(d,i)-(char*)d < d->sHeader.usStructureSize) + i++; + return i; +} + + +/* + * Reverse engineered tables + */ + //ucTableFormatRevision=4 //ucTableContentRevision=1 diff --git a/datastructs.c b/datastructs.c index 9a3d5a0..6b13082 100644 --- a/datastructs.c +++ b/datastructs.c @@ -39,7 +39,7 @@ data_dumper_struct_t data_dumpers[] = { #ifdef USE_ATOMBIOS_RELATED_STUFF { 1, 0, 0, ATOM_MULTIMEDIA_CAPABILITY_INFO_dumper, NULL }, { 2, 0, 0, ATOM_MULTIMEDIA_CONFIG_INFO_dumper, NULL }, - { 3, 0, 0, ATOM_STANDARD_VESA_TIMING_dumper, NULL }, + { 3, 0, 0, ATOM_STANDARD_VESA_TIMING_dumper, "Apparently broken" }, { 4, 1, 1, ATOM_FIRMWARE_INFO_dumper, NULL }, { 4, 1, 2, ATOM_FIRMWARE_INFO_V1_2_dumper, NULL }, { 4, 1, 3, ATOM_FIRMWARE_INFO_V1_3_dumper, NULL }, @@ -68,18 +68,18 @@ data_dumper_struct_t data_dumpers[] = { { 19, 0, 0, ATOM_OEM_INFO_dumper, NULL }, { 20, 0, 0, ATOM_XTMDS_INFO_dumper, NULL }, { 21, 0, 0, NULL /*ATOM_MCLK_SS_INFO_dumper*/, NULL }, - { 22, 0, 0, ATOM_OBJECT_HEADER_dumper, NULL }, - { 23, 0, 0, INDIRECT_IO_ACCESS_dumper, NULL }, + { 22, 0, 0, ATOM_OBJECT_HEADER_dumper, "Data part see radeonhd" }, + { 23, 0, 0, INDIRECT_IO_ACCESS_dumper, "Binary data part skipped" }, { 24, 0, 0, NULL /*ATOM_MC_INIT_PARAMETER_dumper*/, NULL }, { 25, 0, 0, NULL /*ATOM_ASIC_VDDC_INFO_dumper*/, NULL }, { 26, 0, 0, ATOM_ASIC_INTERNAL_SS_INFO_dumper, NULL }, { 27, 0, 0, NULL /*ATOM_TV_VIDEO_MODE_dumper*/, NULL }, { 28, 1, 2, ATOM_VRAM_INFO_V2_dumper, "Completely untested" }, - { 28, 1, 3, ATOM_VRAM_INFO_V3_dumper, "Apparently broken" }, - { 29, 0, 0, ATOM_MEMORY_TRAINING_INFO_dumper, NULL }, + { 28, 1, 3, ATOM_VRAM_INFO_V3_dumper, "Only partially supported" }, + { 29, 0, 0, ATOM_MEMORY_TRAINING_INFO_dumper, "No dynamic dumper yet" }, { 30, 0, 1, ATOM_INTEGRATED_SYSTEM_INFO_dumper, NULL }, { 30, 0, 2, ATOM_INTEGRATED_SYSTEM_INFO_V2_dumper, NULL }, - { 31, 0, 0, ATOM_ASIC_PROFILING_INFO_dumper, NULL }, + { 31, 0, 0, ATOM_ASIC_PROFILING_INFO_dumper, "Partially unknown" }, { 32, 0, 0, ATOM_VOLTAGE_OBJECT_INFO_dumper, NULL }, { 33, 0, 0, ATOM_POWER_SOURCE_INFO_dumper, NULL }, { -1, 0, 0, NULL } |