diff options
author | Damien Zammit <damien@zamaudio.com> | 2015-09-18 16:21:40 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2015-09-18 16:21:40 +1000 |
commit | 8f8b86de19e1a704ffe7b7275485cfb4e497142c (patch) | |
tree | 071423e9163f9694166a6293bea90b2f3d9a1a57 | |
parent | 7f0a28524e2c71a9d0d04af1ead44d02df52e531 (diff) |
Added enable bapm
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r-- | firmware/servicereq.c | 150 |
1 files changed, 147 insertions, 3 deletions
diff --git a/firmware/servicereq.c b/firmware/servicereq.c index cf93bdd..0953cfa 100644 --- a/firmware/servicereq.c +++ b/firmware/servicereq.c @@ -3199,13 +3199,157 @@ static void pciepllswitch() write32(reg, read32(reg) & 0xfffd); } -static void set_bapm(int onoff) +static void set_bapm(int onoff, u32 *value) { + u32 r1, r2, r3, r4, r5, r6, r11, r12, r13; + switch (onoff) { + case ON: + // disable interrupts (already off) + r1 = 0x1d9a4; + r11 = r1; + r1 = 0x1dd8b; + r1 = read8(r1); + r12 = 0x1f160; + r1 = (r1 != 1); + if (r1 == 0) + goto end; + r1 = read32(r11+128); + r13 = 0xfffe; + r1 <<= 2; + r2 = 0xe0400000; + r1 += r2; + r1 = read32(r1); + + r3 = r1; + r1 = 0x1dd8a; + write32(r11+132, r3); + r2 = 0xfffc; + r3 = r3 & r2; + r1 &= 3; + r3 |= r1; + r1 = 0x1dd89; + write32(r11+132, r3); + r2 = read8(r1); + r1 = 0xff7f; + r2 &= 1; + r3 &= r1; + r2 <<= 7; + r1 = read32(r1+128); + r3 |= r2; + r2 = r3; + write32(r11+132, r3); + r1 <<= 2; + r3 = 0xe0400000; + r1 += r3; + write32(r1, r2); + + r1 = read32(r11+104); + r1 <<= 2; + r2 = 0xe0400000; + r1 += r2; + r1 = read32(r1); + + r2 = r1; + r1 = 0x1dd88; + write32(r11+108, r2); + r3 = read8(r1); + r1 = 0xf1ff; + r3 &= 7; + r3 <<= 9; + r2 &= r1; + r1 = read32(r11+104); + r2 |= r3; + write32(r11+108, r2); + r1 <<= 2; + r3 = 0xe0400000; + r1 += r3; + write32(r1, r2); + + r6 = 0x1f428; + r1 = read32(r6); + r5 = 0x1ddec; + *value = r1; // arg? sp + r3 = read8(r5+3); + r2 = 0xfffd; + r4 = 0x1dd8c; + r1 = ((*value) >> 24) & 0xff; // sp+23 + r3 &= 2; + r1 &= r2; + r1 |= r3; + *value = (*value & ~0xff000000) | ((r1 & 0xff) << 24); + r2 = read8(r5+3); + r4 = read8(r4); + r1 = ((*value) >> 24) & 0xff; + r2 &= 1; + r1 &= r13; + r1 |= r2; + *value = (*value & ~0xff000000) | ((r1 & 0xff) << 24); + r3 = read8(r5+3); + r2 = 0xfff7; + r1 = ((*value) >> 24) & 0xff; + r3 &= 8; + r1 &= r2; + r1 |= r3; + *value = (*value & ~0xff000000) | ((r1 & 0xff) << 24); + r3 = read8(r5+3); + r2 = 0xfffb; + r1 = ((*value) >> 24) & 0xff; + r3 &= 4; + r1 &= r2; + r1 |= r3; + *value = (*value & ~0xff000000) | ((r1 & 0xff) << 24); + if (r4 != 0) + goto x14e24; + r1 = ((*value) >> 24) & 0xff; + r2 = 0xffef; + r1 &= r2; + *value = (*value & ~0xff000000) | ((r1 & 0xff) << 24); +x14e24: + r1 = *value; + r11 = 1; + write32(r6, r1); + + config_htc(); + config_vpc(); + config_lpmx(); + config_tdc(); + config_tdp(); + config_bapm(); + + r2 = 0x80010800; + write8(r12+3, r11); + r1 = read32(r2); + r3 = 0x80010810; + r1 &= r13; + write32(r2, r1); + r1 = read32(r2); + r4 = 0x1d940; + r1 |= 0x100; + write32(r2, r1); + r1 = read32(r3); + r1 = read32(r4); + write32(r3, r1); + r1 = read32(r2); + r1 &= r13; + r1 |= r11; + write32(r2, r1); + r1 = 0x1d95c; + + write8(r1+8, r11); + // enable interrupts (disabled) + break; + case OFF: + break; + } +end: + return; } void smu_service_request(void) { + static u32 bapm = 0; int requestid; + write32(0xe0003004, 1); requestid = read32(0xe0003000); requestid &= 0x1fffe; @@ -3291,10 +3435,10 @@ void smu_service_request(void) pciepllswitch(); break; case SMC_MSG_ENABLE_BAPM: - set_bapm(ON); + set_bapm(ON, &bapm); break; case SMC_MSG_DISABLE_BAPM: - set_bapm(OFF); + set_bapm(OFF, &bapm); break; default: break; |