diff options
author | Damien Zammit <damien@zamaudio.com> | 2016-09-15 03:44:52 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2016-09-15 03:44:52 +1000 |
commit | 757f1ddc2ce24b33449743c5cbaff7285ebd75ac (patch) | |
tree | afdc87ccd7f2e8cda0a8b91543a7ee9ea18225b9 | |
parent | 35e206f5a1f9689104759ee895ac9044928d82c2 (diff) |
Verified another 10x service request functions:
x SERVICE_CONF_LPMx
x SERVICE_ADJ_LOADLINE
x x16e90
x x1b65c
x x1b5c4
x SERVICE_CONF_VOLTAGE
x SERVICE_CONF_THERMAL
x SERVICE_CASCADE_PLL_ON
x x196e0
x SERVICE_DDI_PHY_ON
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r-- | firmware/servicereq.c | 288 | ||||
-rw-r--r-- | firmware/smu.h | 1 |
2 files changed, 133 insertions, 156 deletions
diff --git a/firmware/servicereq.c b/firmware/servicereq.c index 1f7df77..39a8f18 100644 --- a/firmware/servicereq.c +++ b/firmware/servicereq.c @@ -5,12 +5,11 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - *- + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * See <http://www.gnu.org/licenses/>.- */ #include "smu.h" @@ -68,20 +67,20 @@ static u32 thermal_params[38] = { 0x0000, 0x710f, // TDC/HTC 0x0000, // TDC/HTC - 0x7110, - 0x0000, - 0x7111, - 0x0000, - 0x7112, - 0x0000, - 0x7113, - 0x0000, + 0x7110, // LPMx + 0x0000, // LPMx + 0x7111, // LPMx + 0x0000, // LPMx + 0x7112, // LPMx + 0x0000, // LPMx + 0x7113, // LPMx + 0x0000, // LPMx 0x715c, // VPC/BAPM 0x0000, // VPC/BAPM 0x715d, // VPC 0x0000, - 0x7162, - 0x0000, + 0x7162, // LOADLINE + 0x0000, // LOADLINE 0x7117, // BAPM 0x0000, // BAPM 0x7157, @@ -96,6 +95,21 @@ static void set_interrupts(int onoff) //asm volatile ("wcsr ie, %0"::"r"(onoff)); } +static void x16fb0(u32 r1, u32 r2) +{ + u32 r3 = 0x80080000; + write32(r3+160, r1); + write32(r3+164, r2); +} + +static void x16fd8(u32 r1, u32 r2) +{ + u32 r3 = 0x80080000; + write32(r3+160, r1); + r1 = read32(r3+164) | r2; + write32(r3+164, r1); +} + static void x1c300(u32 r1) { u32 reg, r3; @@ -138,19 +152,17 @@ x16ea8: return r4; } -static void x1b65c(u32 rr1) +static void set_loadline(u8 rr1) { - u32 r1, r2, r3, r4, r5, r6; + u32 r1, r2, r3, r5, r6; u32 r11, r12, r13; - r13 = rr1 & 0xff; - r1 = (u32)&thermal_params[0]; + r13 = rr1; r11 = 0x1d989; - r4 = rr1; r1 = read8(r11+10); if (r1 == r13) goto end; - r5 = 0xe000; + r5 = 0xe0000000; r2 = r5 | 0x21b4; x1b698: r1 = read32(r2); @@ -170,12 +182,13 @@ x1b698: r1 = (r1 != 1); if (r1 != 0) goto x1b6f8; - r2 = read32(r4+124); - r3 = -4; - r1 = read32(r4+120); + r2 = thermal_params[31]; + r3 = ~0x3; + r1 = thermal_params[30]; r2 &= r3; r2 |= 1; - write32(r4+124, r2); + thermal_params[31] = r2; + r1 <<= 2; r3 = 0xe0400000; r1 += r3; @@ -201,15 +214,15 @@ x1b71c: r1 = r6; r1 |= 0x08d8; r2 = read32(r1+32); - r3 = r5; - r3 |= 0x21b4; + r3 = 0xe00021b4; r1 = 0x1869f; if (r1 >= r2) goto x1b764; - r2 = read32(r4+124); - r1 = read32(r4+120); - r2 |= 3; - write32(r4+124, r2); + r1 = thermal_params[30]; + r2 = thermal_params[31]; + r2 |= 0x3; + thermal_params[31] = r2; + r1 <<= 2; r3 = 0xe0400000; r1 += r3; @@ -261,8 +274,7 @@ x16f34: goto x16f64; r1 = x16e90(r1); - r1 = r1 & 0xff; - x1b65c(r1); + set_loadline(r1 & 0xff); r1 = 0x1f608; write32(r1, r13); @@ -445,7 +457,7 @@ static void x196e0(void) goto end; r2 = 0x1f604; r1 = read32(r2); - r1 |= 2; + r1 |= 0x2; write32(r2, r1); adjust_loadline(); r1 = 0xe0300000; @@ -461,13 +473,14 @@ static void x196e0(void) r11 = r16; r11 |= 0xc; r4 = read32(r11); - r2 = -5; + r2 = ~0x4; r1 = 0x01328014; r4 = r4 & r2; r2 = 0x20000000; r3 = 0xf0000000; write32(r11, r4); r4 = 0x80080000; + write32(r4+160, r1); r1 = read32(r4+164); r3 = ~r3; @@ -476,64 +489,46 @@ static void x196e0(void) write32(r4+164, r1); r1 = read32(r11); - r15 = -2; + r15 = ~1; r2 = 0x1f3a0; - r1 = r1 & r15; + r1 &= r15; write32(r11, r1); r2 = read32(r2); r1 = 0x0131fff0; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r2 = read32(r13); r1 = 0x01110012; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r2 = read32(r13+4); r1 = 0x01110013; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r2 = read32(r13+8); r1 = 0x02110012; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r2 = read32(r13+12); r1 = 0x02110013; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r1 = 0x01318040; r2 = 1; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r1 = 0x01318041; r2 = 1; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r1 = 0x01318042; r2 = 1; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r1 = 0x01318043; r2 = 1; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r2 = read8(r12+61); r3 = read8(r12+69); @@ -541,10 +536,7 @@ static void x196e0(void) r2 |= r3; r2 = ~r2; r2 = r2 & 0xff; - r3 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164) | r2; - write32(r3+164, r1); + x16fd8(r1, r2); r1 = read8(r12+61); r13 = 0; @@ -556,24 +548,18 @@ static void x196e0(void) skip0: r1 = 0x01110010; r2 = 1; - r3 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164) | r2; - write32(r3+164, r1); + x16fd8(r1, r2); goto x198d8; skip1: r1 = 0x01110002; r2 = 0xff; - r1 |= 2; - r3 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164) | r2; - write32(r3+164, r1); + x16fd8(r1, r2); r1 = 0x01318070; r2 = r15; r13 = 1; + r3 = 0x80080000; write32(r3+160, r1); r1 = read32(r3+164); @@ -587,10 +573,7 @@ x198d8: r2 |= r3; r2 = ~r2; r2 &= 0xff; - r3 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164) | r2; - write32(r3+164, r1); + x16fd8(r1, r2); r1 = read8(r12+62); if (r1 != 0) @@ -600,7 +583,8 @@ x198d8: goto x1991c; r1 = 0x01318074; - r2 = -2; + r2 = ~1; + r3 = 0x80080000; write32(r3+160, r1); r1 = read32(r3+164); @@ -613,25 +597,20 @@ x1991c: r1 = 0x02110010; r11 = (r13 == 0); r2 = 1; - r3 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164) | r2; - write32(r3+164, r1); + x16fd8(r1, r2); if (r11 != 0) goto x19944; x19934: r1 = 0x01318062; r2 = 0xa000; - r3 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164) | r2; - write32(r3+164, r1); + x16fd8(r1, r2); x19944: r1 = 0x01328014; r3 = 0xf0000000; r2 = 0; + r4 = 0x80080000; write32(r4+160, r1); r1 = read32(r4+164); @@ -643,6 +622,7 @@ x19944: r1 = 0x01308014; r3 = 0xf0000000; r2 = 0; + r4 = 0x80080000; write32(r4+160, r1); r1 = read32(r4+164); @@ -654,11 +634,12 @@ x19944: r2 = r16; r2 |= 0xc; r3 = read32(r2); - r4 = -3; + r4 = ~0x2; r1 = 0x01318060; r3 &= r4; write32(r2, r3); r2 = 4; + r3 = 0x80080000; write32(r3+160, r1); x17040: @@ -671,6 +652,7 @@ x17040: goto x199b4; r1 = 0x01318062; r2 = 0xffff5fff; + r3 = 0x80080000; write32(r3+160, r1); r1 = read32(r3+164); @@ -680,21 +662,17 @@ x17040: x199b4: r1 = 0x03110011; r2 = 0x300; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r1 = 0x01318023; r2 = 0; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r3 = 0x1f6c4; r2 = read32(r3); - r14 = r14 | 0xffff; + r14 = 0xff00ffff; r1 = 0x10000; - r2 = r2 & r14; + r2 &= r14; r2 |= r1; write32(r3, r2); @@ -702,9 +680,14 @@ end: return; } +static void auth(void) +{ + write32(0x1f380, (read32(0x1f380) + 0x01000000)); +} + static void halt(void) { - return; + // NO-OP } static void x1a200(void) @@ -2599,7 +2582,7 @@ x18af4: return; } -static void x180f0(phy_t *phy, u32 rr2) +static void x180f0(phy_t *phy, u32 rr1, u32 rr2) { u32 r1, r2, r3, r4, r5, r6, r7, r8, r9; u32 r11, r12, r13, r14, r15, r16, r17, r18, r19, r20; @@ -3045,14 +3028,15 @@ x1a70c: r6 = r2; r1 <<= 2; r12 = r2 & 0xffff; - r1 &= 8; + r1 += 8; r1 &= 0xff; r2 = r1 << 16; - r3 = 0xff000000; - r5 >>= r16; + r3 = 0xff00ffff; + r5 = r5 & r4; + r5 >>= 16; r12 &= r3; r1 <<= 24; - r6 = r6 >> 16; + r4 = r6 >> 16; r12 |= r2; r14 = 0x1f6c8; r12 |= r1; @@ -3064,6 +3048,7 @@ x19b34: r2 = r4 >> r11; r1++; r1 &= 0xff; + r11++; r2 &= 1; r1 <<= 16; r5 = (r11 > 3); @@ -3112,7 +3097,7 @@ x19bd8: r1 = (r1 > 3); if (r1 != 0) goto x19c14; - r1 = r12 & 7; + r1 = r12 & 0x7; if (r1 == 0) goto x19c14; r2 = r12 >> 16; @@ -3132,7 +3117,7 @@ x19bd8: goto x17d50; r5 = 1; x17d50: - r1 = r2 | r2; + r1 = r5 | r2; r1 = (r1 == 0); if (r1 == 0) goto x17d84; @@ -3148,7 +3133,6 @@ x17d64: r1 &= 0xffff; r2 |= r1; write32(r7, r2); - x17d84: r1 = 0x1f39c; @@ -3159,21 +3143,21 @@ x17d84: x196e0(); x19c14: - r1 = r12 & 3; + r1 = r12 & 0x3; if (r1 == 0) goto x19cec; r1 = 0x1f39c; r1 = read32(r1); - r1 &= 8; + r1 &= 0x8; if (r1 != 0) goto x19cec; r1 = (u32)&(dp->d.d1); //sp+36 r2 = r12; - //x17d88 +//x17d88 { r5 = r2 >> 16; - r1 = r2 >> 24; + r11 = r2 >> 24; r9 = r2; r12 = 0x1f6c8; r2 = -r11; @@ -3244,6 +3228,7 @@ x17e74: r1 = (r6 > 4); if (r1 == 0) goto x17e1c; +// } r11 = 1; r5 = (u32)&(dp->d.d6); @@ -3278,37 +3263,31 @@ x19c94: goto x19c48; r1 = 0x01318014; + r2 = 0x80080000; - write32(r3+160, r1); - r1 = read32(r3+164); - r1 |= r2; - write32(r3+164, r1); + write32(r2+160, r1); + r1 = read32(r2+164); r11 = r1; r1 = 0x01318014; - r2 = -61; + r2 = ~0x3c; r2 = r11 & r2; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); + r1 = r13; r2 = r12; - x18d04(&(dp->p), r2, r3); - - r2 = r12; - x180f0(&(dp->p), r2); + x18d04(&(dp->p), r1, r2); + x180f0(&(dp->p), r1, r2); r1 = 0x01318014; r2 = r11; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); x19cec: r1 = 0x1f39c; r1 = read32(r1); r1 &= 0x10; - if (r1 == 0) + if (r1 != 0) goto end; r13 = 0x01318010; @@ -3327,9 +3306,7 @@ x19d34: r2 = read32(r12); r1 = r13 + r11; r11++; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); + x16fb0(r1, r2); r1 = (r11 > 7); r12 += 4; @@ -3338,10 +3315,7 @@ x19d34: r1 = 0x1f6a8; r2 = read32(r1); r1 = 0x02010011; - r3 = 0x80080000; - write32(r3+160, r1); - write32(r3+164, r2); - + x16fb0(r1, r2); break; } @@ -3558,7 +3532,7 @@ x17e74: r2 = read32(r13); r1 = r12; - x180f0(&(dp->p), r2); + x180f0(&(dp->p), r1, r2); r2 = read32(r13); r1 = r12; @@ -3711,12 +3685,12 @@ x11d34: r2 = 1; if (r3 == 0) goto x11d68; - //x1b5c4(); + r12 = 0x1d989; r3 = read8(r12+11); r11 = r1 & 0xff; r13 = r2 & 0xff; - if (r1 >= r3) + if (r11 >= r3) goto x1b5f4; r11 = r3; x1b5f4: @@ -4629,18 +4603,13 @@ static void config_lpmx(void) u32 r11, r12, r13, r14, r15, r16, r17, r18, r19, r20; u32 r21, r22; - r1 = (u32)&thermal_params[0]; - r12 = r1; - r1 = 0x1dd94; r11 = r1; - r1 = 0x1d8f0; - r1 = read32(r1); - + r1 = read32(0x1d8f0); r15 = r1; r1 = 0x1dcf4; - r14 = r1; + r3 = 0x1dff4; r1 = read32(r3+28); r2 = 0x1f850; @@ -4679,35 +4648,39 @@ x1c610: r16 |= 0xf644; r22 |= 0xf64c; r20 |= 0xf3fc; - r6 &= 8; + r6 &= 0x8; if (r6 == 0) goto x15d68; r1 = read8(r7); write8(r14+8, r1); r7 = read8(r7); write8(r15+8, r7); - r1 = read32(r12+72); + r1 = thermal_params[18]; + r1 <<= 2; r2 = 0xe0400000; r1 += r2; r1 = read32(r1); - write32(r12+76, r1); - r1 = read32(r12+80); + thermal_params[19] = r1; + r1 = thermal_params[20]; + r1 <<= 2; r2 = 0xe0400000; r1 += r2; r1 = read32(r1); - write32(r12+84, r1); - r1 = read32(r12+88); + thermal_params[21] = r1; + r1 = thermal_params[22]; + r1 <<= 2; r2 = 0xe0400000; r1 += r2; r1 = read32(r1); - write32(r12+92, r1); - r1 = read32(r12+96); + thermal_params[23] = r1; + r1 = thermal_params[24]; + r1 <<= 2; r2 = 0xe0400000; r1 += r2; @@ -4715,7 +4688,7 @@ x1c610: r7 = 0x10000; r6 = r7; - write32(r12+100, r1); + thermal_params[25] = r1; r7 |= 0xdee0; r8 = r13; r6 |= 0xdee8; @@ -4808,11 +4781,11 @@ x15c18: x15c74: r1 = r5 + r5; r1 = r1 + r14; - r2 = read8(r1); + r2 = read16(r1); r3 = 0; if (r2 == r3) goto x15ce8; - r1 = read8(r1+2); + r1 = read16(r1+2); r6 = r2 - r1; if (r1 == r3) goto x15ce8; @@ -4938,21 +4911,21 @@ x1b918: r3 = read8(r12+11); r11 = r1 & 0xff; r13 = r2 & 0xff; - if (r1 >= r3) + if (r11 >= r3) goto x1b5f4; r11 = r3; x1b5f4: r2 = 0xe00021b4; x1b5fc: r1 = read32(r2); - r1 = r1 & 1; + r1 &= 1; if (r1 == 0) goto x1b5fc; write8(r12+9, r11); adjust_loadline(); r1 = read8(r12+10); r2 = 0xe00021b0; - r1 = r11 + r1; + r1 += r11; r1 <<= 1; r3 = 0xe00021b4; r1 |= r13; @@ -5659,6 +5632,9 @@ void smu_service_request(unsigned int e3) SMU_POST(requestid); switch(requestid) { + case SMC_MSG_AUTH: + auth(); + break; case SMC_MSG_HALT: halt(); break; diff --git a/firmware/smu.h b/firmware/smu.h index 6b52daf..7fb1192 100644 --- a/firmware/smu.h +++ b/firmware/smu.h @@ -22,6 +22,7 @@ typedef unsigned int u32; #define SMU_POST(x) write32(0xe0003024, (x & 0xff)) +#define SMC_MSG_AUTH 0 #define SMC_MSG_HALT 1 #define SMC_MSG_PHY_LN_OFF 2 #define SMC_MSG_PHY_LN_ON 3 |