The Toshiba Z20t-C is a really nice, silent convertible with a long battery runtime. It’s CPU is held back though by cooling issues. The Intel m7-6Y75 performs especially bad, running even slower than its cheaper m5-6Y57 / m5-6Y54 counterparts due to cooling. Though the CPU could clock at 2.9 GHz for two loaded cores, it will clock down to 1.6GHz really fast during benchmarks and then just sit there…
Look mum, no heat sink!
I had a Z20t-C with a broken touchscreen lying around, so I decided to check what better cooling could do. Opening the device up revealed the sad, but understandable truth considering the small / mobile form factor:
I needed to increase the heat sink surface area significantly to provide more cooling headroom for the CPU, but it does not make much sense to do it only inside of the enclosure, because then heat can’t escape.
Using the back cover as a heat sink
I tried scratching the back cover, as it looked metallic from the inside and voila it is mostly metal (probably aluminum). It is perfect for cooling the CPU with its big surface area and I didn’t expect the cover to heat up too much to be a problem.
So the next step was to remove the heat sink and clean everything up nicely.
The heat sink is made of copper, so it can be easily soldered to another piece of copper to distribute heat. I found a thin 0.2mm copper sheet in my scrap box and choose the dimensions by rule of thumb. This sheet will be glued to the back cover later using thermally conductive glue.
Now there are two ways to go about this. Mount the copper plate from the inside (needs only two holes in the back cover for the heat sink screws), or mount it from the outside for easier positioning and better cooling due to extra convection (means cutting a bigger hole into the back cover). I went down the second path, to allow for better cooling and because I couldn’t figure out a way to reliably position the thing inside the enclosure.
It is hard to make sure the heat sink surface stays even in the process. This will worsen the heat transfer, so it would have been better to create a small custom copper heat sink part on an end mill or the like and solder that to the copper sheet. Add two holes for screws, add springs for proper heat sink pressure. Next time…
I punched two holes for the screws into the copper sheet in the right positions, then applied some flux to the heat sink and copper sheet, positioned the heat sink on the copper sheet and soldered it down. This needed a lot of heat (which is a good sign) and it took quite some time to heat it up using my rework station.
After everything cooled down I reattached the back cover, cleaned it and screwed down the heat sink to make sure it was in the right place. I marked the position of the heat sink for positioning, then removed it and the back cover again.
Now I glued the copper sheet to the back cover using EC360 glue white. This is a thermally conductive glue that is slightly flexible. You need work fast, as the glue starts to harden after ~ 5min. After having attached the copper sheet, I quickly flipped the whole thing over, put it on a flat surface and placed a heavy weight on the back cover from the inside, so the copper sheet will be glued to the back cover totally flush. Make sure you distribute the weight evenly and wait for at least 2 hours before touching the thing again.
After the glue had dried I added some filler to the border of the copper sheet, sanded that, and the whole back cover down and applied black spray paint.
Success! Sort of…
The performance gain according to the Phoronix suite benchmark results was ~11-12% and the 6Y75 finally outperformed the 6Y57 like it was supposed to – not bad. The core temperature sat around 60-65°C and the back cover got moderately warm. The heat is primarily distributed by the copper sheet. The back cover gets warm too, especially close to the copper sheet borders, so the thermal glue ist working, but heat transfer is not stellar. Still, I had the feeling there was plenty of thermal headroom now and wanted to push the machine a bit more.
To find out what was limiting the machine I downloaded the “Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 4: Model-Specific Registers” and used the msr-tools Linux package, specifically rdmsr to check the MSR values of my CPU. This gist is also pretty useful as it sums up the core idea.
I checked whether the CPU was thermally throttling due to critical temperatures. MSR_CORE_PERF_LIMIT_REASONS (0x64F) Bits 23:21 are the thermal limit log bits that get set when core temperatures become critical and the CPU has to throttle. They were 0, meaning temperatures were within limits. Instead Bits 27:26 were set, meaning the power limit had been reached. Also IA32_THERM_STATUS (0x19C) Bits 1/3/5/7/9 were all 0, meaning critical temperatures had not been reached, but instead Bit 11 was set meaning the power limit had been reached.
To find out the power limit set for the CPU we need to consult “Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3B: System Programming Guide, Part 2“. I checked MSR_PKG_POWER_LIMIT (0x610) Bit 15, which was 1, telling us that package power limiting is on (according to “14.9.3 Package RAPL Domain”). Bits 14:0 contain the actual power limit and returned 56 decimal. Checking MSR_RAPL_POWER_UNIT (0x606) Bits 3:0 tells us which unit that value is in. It returned 3, which according to “14.9.1 RAPL Interfaces” means 1/2^3=1/8W increments. Thus the system has 56*1/8=7W package power. This is in line with the 7W cTPD-up that is mentioned in ChipWiki for the 6Y57.
The time unit in MSR_RAPL_POWER_UNIT (0x606) Bits 19:16 is 10, meaning 1/2^10s=1/1024s. That multiplied by the time windows for Power Limit #1 and #2 found in MSR_PKG_POWER_LIMIT (0x610) Bits 23:17 and 55:49 tells us that the states will be held for 0,0117s resp. 0,0322s. Maybe we could increase those as the system as a much higher heat capacity now. It might make the system a bit “snappier”, but it won’t help us with longer running tasks like benchmarks.
Increasing the power limit can be done by writing to MSR_PKG_POWER_LIMIT (0x610) Bits 14:0. I tried 64*1/8=8W and even 9W, but this didn’t do anything… I also tried increasing power limit #2 in Bits 46:32 from 15 to 16 and 17W, but that didn’t help either. Probably this is because of the cTDP levels set by the BIOS or the platform power limit is holding the CPU back.
MSR_PLATFORM_INFO (0xCE) Bits 29:28 state that we have programmable TDP and ratios limits for Turbo mode. Bits 34:33 tell us that we have two additional TDP levels available. MSR_CONFIG_TDP_LEVEL2 (0x64A) configures additional TDP level 2. Bits 14:0 return 56 (our 7W) again, but there’s no way of changing them as they are read-only for us (the BIOS can write them).
There’s also MSR_PLATFORM_POWER_LIMIT (0x65C) which defines the long and short term power limits of the platform. The long term platform power limit (#1) is 36*1/8=4.5W (the TDP mentioned here) and the short term limit is 45/8=5,625W. I tried increasing these values too, but that again didn’t change anything.
So… I’m a bit at loss what to try next. If you have ideas, let me know by leaving a comment or sending an email.