diff --git a/src/add-ons/accelerants/intel_extreme/accelerant.cpp b/src/add-ons/accelerants/intel_extreme/accelerant.cpp index 947ba0097e..994cf89bdf 100644 --- a/src/add-ons/accelerants/intel_extreme/accelerant.cpp +++ b/src/add-ons/accelerants/intel_extreme/accelerant.cpp @@ -37,6 +37,7 @@ struct accelerant_info* gInfo; +uint32 gDumpCount; class AreaCloner { @@ -89,6 +90,36 @@ AreaCloner::Keep() // #pragma mark - +// intel_reg --mmio=ie-0001.bin --devid=27a2 dump +void +dump_registers() +{ + char filename[255]; + + sprintf(filename, "/boot/system/cache/tmp/ie-%04" B_PRId32 ".bin", + gDumpCount); + + ERROR("%s: Taking register dump #%" B_PRId32 "\n", __func__, gDumpCount); + + int fd = open(filename, O_CREAT | O_WRONLY, 0644); + uint32 data = 0; + if (fd >= 0) { + for (int32 i = 0; i < 0x80000; i += sizeof(data)) { + //char line[512]; + //int length = sprintf(line, "%05" B_PRIx32 ": " + // "%08" B_PRIx32 " %08" B_PRIx32 " %08" B_PRIx32 " %08" B_PRIx32 "\n", + // i, read32(i), read32(i + 4), read32(i + 8), read32(i + 12)); + data = read32(i); + write(fd, &data, sizeof(data)); + } + close(fd); + sync(); + } + + gDumpCount++; +} + + /*! This is the common accelerant_info initializer. It is called by both, the first accelerant and all clones. */ @@ -97,6 +128,9 @@ init_common(int device, bool isClone) { // initialize global accelerant info structure + // Number of register dumps we have... taken. + gDumpCount = 0; + gInfo = (accelerant_info*)malloc(sizeof(accelerant_info)); if (gInfo == NULL) return B_NO_MEMORY; diff --git a/src/add-ons/accelerants/intel_extreme/accelerant.h b/src/add-ons/accelerants/intel_extreme/accelerant.h index 2f34eb4f12..cda9523c87 100644 --- a/src/add-ons/accelerants/intel_extreme/accelerant.h +++ b/src/add-ons/accelerants/intel_extreme/accelerant.h @@ -101,6 +101,7 @@ write32(uint32 encodedRegister, uint32 value) + REGISTER_REGISTER(encodedRegister)) = value; } +void dump_registers(void); // dpms.cpp extern void enable_display_plane(bool enable); diff --git a/src/add-ons/accelerants/intel_extreme/mode.cpp b/src/add-ons/accelerants/intel_extreme/mode.cpp index 8d7ddc6434..6c6ee2097b 100644 --- a/src/add-ons/accelerants/intel_extreme/mode.cpp +++ b/src/add-ons/accelerants/intel_extreme/mode.cpp @@ -470,27 +470,12 @@ intel_set_display_mode(display_mode* mode) // This would avoid the screen being off when switching workspaces when they // have the same resolution. -#if 0 -static bool first = true; -if (first) { - int fd = open("/boot/home/ie_.regs", O_CREAT | O_WRONLY, 0644); - if (fd >= 0) { - for (int32 i = 0; i < 0x80000; i += 16) { - char line[512]; - int length = sprintf(line, "%05lx: %08lx %08lx %08lx %08lx\n", - i, read32(i), read32(i + 4), read32(i + 8), read32(i + 12)); - write(fd, line, length); - } - close(fd); - sync(); - } - first = false; -} -#endif - intel_shared_info &sharedInfo = *gInfo->shared_info; Autolock locker(sharedInfo.accelerant_lock); + // First register dump + dump_registers(); + // TODO: This may not be neccesary set_display_power_mode(B_DPMS_OFF); @@ -640,6 +625,9 @@ if (first) { set_frame_buffer_base(); // triggers writing back double-buffered registers + // Second register dump + dump_registers(); + return B_OK; }