intel_extreme: Take a register dump for intel_reg
This commit is contained in:
@@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
|
|
||||||
struct accelerant_info* gInfo;
|
struct accelerant_info* gInfo;
|
||||||
|
uint32 gDumpCount;
|
||||||
|
|
||||||
|
|
||||||
class AreaCloner {
|
class AreaCloner {
|
||||||
@@ -89,6 +90,36 @@ AreaCloner::Keep()
|
|||||||
// #pragma mark -
|
// #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
|
/*! This is the common accelerant_info initializer. It is called by
|
||||||
both, the first accelerant and all clones.
|
both, the first accelerant and all clones.
|
||||||
*/
|
*/
|
||||||
@@ -97,6 +128,9 @@ init_common(int device, bool isClone)
|
|||||||
{
|
{
|
||||||
// initialize global accelerant info structure
|
// initialize global accelerant info structure
|
||||||
|
|
||||||
|
// Number of register dumps we have... taken.
|
||||||
|
gDumpCount = 0;
|
||||||
|
|
||||||
gInfo = (accelerant_info*)malloc(sizeof(accelerant_info));
|
gInfo = (accelerant_info*)malloc(sizeof(accelerant_info));
|
||||||
if (gInfo == NULL)
|
if (gInfo == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ write32(uint32 encodedRegister, uint32 value)
|
|||||||
+ REGISTER_REGISTER(encodedRegister)) = value;
|
+ REGISTER_REGISTER(encodedRegister)) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dump_registers(void);
|
||||||
|
|
||||||
// dpms.cpp
|
// dpms.cpp
|
||||||
extern void enable_display_plane(bool enable);
|
extern void enable_display_plane(bool enable);
|
||||||
|
|||||||
@@ -470,27 +470,12 @@ intel_set_display_mode(display_mode* mode)
|
|||||||
// This would avoid the screen being off when switching workspaces when they
|
// This would avoid the screen being off when switching workspaces when they
|
||||||
// have the same resolution.
|
// 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;
|
intel_shared_info &sharedInfo = *gInfo->shared_info;
|
||||||
Autolock locker(sharedInfo.accelerant_lock);
|
Autolock locker(sharedInfo.accelerant_lock);
|
||||||
|
|
||||||
|
// First register dump
|
||||||
|
dump_registers();
|
||||||
|
|
||||||
// TODO: This may not be neccesary
|
// TODO: This may not be neccesary
|
||||||
set_display_power_mode(B_DPMS_OFF);
|
set_display_power_mode(B_DPMS_OFF);
|
||||||
|
|
||||||
@@ -640,6 +625,9 @@ if (first) {
|
|||||||
set_frame_buffer_base();
|
set_frame_buffer_base();
|
||||||
// triggers writing back double-buffered registers
|
// triggers writing back double-buffered registers
|
||||||
|
|
||||||
|
// Second register dump
|
||||||
|
dump_registers();
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user