summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Hopf <mhopf@suse.de>2009-07-02 21:14:02 +0200
committerMatthias Hopf <mhopf@suse.de>2009-07-02 21:14:02 +0200
commit153734580d1583a9fb3e50edb9b6fe3fc55e4fdc (patch)
tree47835b28d3ec023979997dc6de3fd14e3f0c5511
parent602043797836006abda6dddd9f96e840b6ab1990 (diff)
Make (almost) all dumpers dynamic.
-rw-r--r--atombios_rev.h79
-rw-r--r--datastructs.c12
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 }