diff --git a/src/rhd_pm.c b/src/rhd_pm.c index 5fea157..f74804a 100644 --- a/src/rhd_pm.c +++ b/src/rhd_pm.c @@ -130,6 +130,61 @@ RHDPmRestore(RHDPtr rhdPtr) unsigned long RHDGetEngineClock(RHDPtr rhdPtr) { + if (rhdPtr->ChipSet == RHD_M82) { + /* 0006: 370000 SET_ATI_PORT 0000 (INDIRECT_IO_MM) */ + + /* 0009: 0308008001 MOVE work[00] [..XX] <- reg[0180] [..XX] */ + long work = RHDRegRead(rhdPtr, 0x0600) & 0x0000ffff; + + /* 000e: 090d00e01f AND work[00] [..XX] <- 1fe0 */ + work &= 0xffff1fe0; + + /* 0013: 1b0d0005 SHIFT_RIGHT work[00] [..XX] by 05 */ + work = work >> 5; + + /* 0017: 561800 CLEAR work[00] [XX..] */ + work &= 0x0000ffff; + + /* 001a: 036000f501 MOVE work[00] [..X.] <- reg[01f5] [...X] */ + work = (work & 0xffff00ff) | ((RHDRegRead(rhdPtr, 0x07D4) << 4) & 0x0000ff00); + + /* 001f: 092500fe AND work[00] [...X] <- fe */ + work &= 0xfffffffe; + + /* 0023: 15050001 SHIFT_LEFT work[00] [XXXX] by 01 */ + work = work << 1; + + /* 0027: 2105008c0a0000 MUL work[00] [XXXX] <- 00000a8c */ + work *= 0xa8c; + + /* 002e: 27054008000000 DIV WS_QUOT/LOW32 [XXXX] <- 00000008 */ + work /= 0x8; + + /* 0035: 4ae5800101 TEST reg[0180] [X...] <- 01 */ + /* 003a: 445500 JUMP_Equal 0055 */ + if ((RHDRegRead(rhdPtr, 0x0600) & 0xff000000) != 0x01) { + /* 003d: 560041 CLEAR WS_REMIND/HI32 [XXXX] */ + + /* 0040: 0330418001 MOVE WS_REMIND/HI32 [...X] <- reg[0180] [.X..] */ + long remind = (RHDRegRead(rhdPtr, 0x0600) >> 16) & 0x000000ff; + + /* 0045: 0925410f AND WS_REMIND/HI32 [...X] <- 0f */ + remind &= 0xffffff0f; + + /* 0049: 15254101 SHIFT_LEFT WS_REMIND/HI32 [...X] by 01 */ + remind = (remind & 0xffffff00) | ((remind << 1) & 0x000000ff); + + /* 004d: 2d254102 ADD WS_REMIND/HI32 [...X] <- 02 */ + remind = (remind & 0xffffff00) | ((remind + 2) & 0x000000ff); + + /* 0051: 27024041 DIV WS_QUOT/LOW32 [XXXX] <- WS_REMIND/HI32 [XXXX] */ + work /= remind; + } + + /* 0055: 02020040 MOVE param[00] [XXXX] <- WS_QUOT/LOW32 [XXXX] */ + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Maybe Engine Clock is %ld\n", work); + } + #ifdef ATOM_BIOS union AtomBiosArg data; if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS,