Drag to reposition cover

Lenovo Thinkcentre/ThinkStation Tiny (Project TinyMiniMicro) Reference Thread

Notice: Page may contain affiliate links for which we may earn a small commission through services like Amazon Affiliates or Skimlinks.

DouglasteR

Active Member
Dec 19, 2015
171
54
28
I saw on Reddit that a normal one supposedly works but it needs to have the 65Watt heatsink+fan. A 9900t should work without any changes as it is one of the options that Lenovo provided.
Hmmm, perhaps the unit itself detects the original 35w heatsink+fan and don´t let it boot ?

Hmmmm..
 

cromo

Active Member
Jun 6, 2019
139
46
28
Hey. Can you confirm if this supports ASPM?
I haven't purchased it, but the chip itself does, so I don't see why wouldn't this card, either:
 

totalfrequency

New Member
Aug 19, 2025
11
1
3
I wanted to detail my experience with building a Tiny gaming machine. I decided to put a Yeston RTX 3050 LP 6GB into a P360 Tiny running WIN 11 Pro.
The card is exactly the same length as the bay slot so no modification needed except removing the card slot bracket (On my m920x the bluetooth antenna bracket needed to also be removed). Since the GPU was hanging close to the usb ports and the southbridge heatsink I added a piece of electrical tape to the top side of the usb ports and theres a 5mm block of thermal pad on the southbridge heatsink to buffer against contact.

Tiny1.jpg
southbridge.jpg

I removed the dust filter from the lid to provide more adequate airflow as I was originally running 90c on both processor and GPU in initial tests.

Cover.jpg

I also used Grizzly liquid metal (thanks to a friend) between the CPU and copper heatsink. These are the system specs. I run the OS on the first disk drive and Steam on the 990 EVO Plus:

OC-Aida64.jpg

The P360 and PCIE Gen x4 slot and can maintain 75W on the PCIE card slot unlike in my M920x so initially I didn't lower the power limits, but I kept seeing temps sustain higher than I liked.
So I decided to set the lower limit and overclock the GPU.

OC-Afterburner.jpg

OC-GPU-Z.jpg

I went for stability -12% power limit, +9% GPU core overclock and +10% GPU memory overclock, ymmv but I'm sure there is more room to go. After overclock ING, I played APEX Legends, CS2 and Far Cry 4 on default settings for about 30min each. The temps stabilized around 85C CPU / 75C GPU on the high end for each game.

OC-TempsApexLegends.jpg

And these are the scores from 3dMark Steel Nomad, Projected on Battlefield V (1080p), Furmark, and Userbenchmark:

OC-SteelNomad.jpg

OC-Battlefield1080p.jpg

OC-Furmark.jpg

OC-UserBenchmark1.jpg

OC-UserBenchmark2.jpg

As you can see its not a beast for gaming but it can game reasonably well at 1080p ultra/high settings or 1440p mid/low settings. Newer AAA titles probably wont run very well unless they are squeezed to the lowest settings.

As a side note it gets pretty loud with small fans trying to keep it cool but overall it was a lot less noise then when I set the system CPU fan to full speed. Next ill be swapping for a i7-12700T to see if I can retain the relative benchmark speeds while dropping the CPU Temps.

In my next installments I will detail the RTX A1000 in a P340 and an AMD RX6400 in a M290x. I've been messing around with all three system and these GPUs and found these combos to be the most stable.
 

Attachments

Last edited:

totalfrequency

New Member
Aug 19, 2025
11
1
3
I wanted to detail my experience with building another Tiny gaming machine. This time I decided to put a Lenovo RX6400 4gb into a M920x Tiny running WIN 11 Pro.
The card is a little longer than the bay slot so the bluetooth antenna bracket needed to be removed, and the bluetooth antenna wedged between the CPU fan and the GPU.

m920x1.jpg

bracket.jpg


I was originally running 85C+ on the processor when running for extended periods and the GPU fan was hitting the dust screen so I decided to open it up. A friend of mine helped me drill some holes in the cover and I removed the dust screen, adding 3" magnetic dust screens to the top of the case.

dust.jpg

These are the system specs. I run the OS and the games/benchmarks on the same Hynix drive.

Aida.jpg

Unfortunately this GPU cant be undervolted or overclocked without only pushing the voltage (and heat) up. I tested this card stock playing Apex Legends for 30min, leveling out at a stable 63C CPU and 79C GPU average.

Temp.jpg

And these are the scores from 3dMark Steel Nomad, Steel Nomad Light, Projected on Battlefield V (1080p), Firestrike, Furmark, and Userbenchmark:

steelnomad.jpgSteelNomadLight.jpgBattlefield.jpg
firestrike.jpgfurmark.jpgUserbenchmark1.jpgUserbenchmark2.jpg

As you can see its pretty low for gaming but it can game reasonably well at 1080p with moderate/low settings. Apex Legends ran relativly smoothly, similar to other FPS Games on my Xbox One.

As a side note its relatively quiet and makes a lot less noise than the P360 does. To further push the project I'll be swapping for a i9-9900T to see if I can improve the speeds while dropping/maintaining the CPU Temps.

In my next installment I detail the RTX A1000 in a P340.
 

Attachments

Last edited:

senso

Member
Jul 17, 2022
40
23
8
I have finally soldered the first prototype of my dual PCIe slot riser, and it worked first try! Amazed that it worked without any tweaks, @WifiCable made a terrific job on his layout, I just followed his good work.

My M720q is currently running an Intel Arc A310, an LSI 3008 HBA, one nvme in the native slot and another nvme with a cheap adapter in the WiFi slot, plus a i7-9700 (non T) all with a 130W power supply.

Forgot to take photos during the soldering since I was rushing it while the kids played in the yard, but it's probably the jankyest M720q
 
Last edited:

WifiCable

Member
Dec 18, 2023
63
93
18
Netherlands
I have finally sold red the first prototype of my dual PCIe slot riser, and it worked first try.

My M720q is currently running an Intel Arc A310, an LSI 3008 HBA, one nvme in the native slot and another nvme with a cheap adapter in the WiFi slot, plus na i7-9700 (non T) all with a 130W power supply.

Forgot to take photos during the soldering since I was rushing it while the kids played in the yard, but it's probably the jankyest M720q.
Oh heck yeah, happy to hear that. Looking forward to pictures of it all together!
 
  • Like
Reactions: sw1 and senso

slybunda

Active Member
Jan 30, 2023
209
118
43
so got a 3400ge cpu to replace the athlon 300 in my m75q-1. issue is with the 3400 in i get no display and the fan just runs at full speed.
put the athlon 300ge back in and its working fine.
dud cpu or do i need to reset bios or something and try again?
 

ZombieBiceps

Member
Jan 21, 2025
78
14
8
so got a 3400ge cpu to replace the athlon 300 in my m75q-1. issue is with the 3400 in i get no display and the fan just runs at full speed.
put the athlon 300ge back in and its working fine.
dud cpu or do i need to reset bios or something and try again?
Its worth doing a bios update but you could also have ended up with a bad cpu. As far as I'm aware non of the bios updates added new cpu support but I don't think you have any thing to lose from trying.
 

totalfrequency

New Member
Aug 19, 2025
11
1
3
so got a 3400ge cpu to replace the athlon 300 in my m75q-1. issue is with the 3400 in i get no display and the fan just runs at full speed.
put the athlon 300ge back in and its working fine.
dud cpu or do i need to reset bios or something and try again?
Are you waiting at least a few minutes - when I swapped from a non T processor to a T processor on a M920x it took a good 3 minutes to see the logo screen and it said something about changing processors and then rebooted another 2 times, probably from the CPU power difference. Just make sure you are giving it enough time to actually get to post after the swap - i was being impatient and causing myself headaches.
 

slybunda

Active Member
Jan 30, 2023
209
118
43
both the athlon 300ge and ryzen 3400ge are 35w. gave it 15 mins and no boot. bad cpu sent it back for refund.
already on latest bios too
 

wesm63

New Member
Nov 9, 2018
23
5
3
Recently picked up a M75q Gen2 and cannot for the life of me get Proxmox to use the right realtek driver (the old 8169 issue). I realize this isn't a specific issue with the M75q but anyone have any thoughts?

Like it will load the 8169 driver during proxmox install. I can't even get beyond initial install. I'm about to sell it and buy something with an intel nic.
 
Last edited:

slybunda

Active Member
Jan 30, 2023
209
118
43
for proxmox and other production based stuff i find my inter m720q is by far the best option. the intel nics and platform are better supported.
 

TrevorH

Active Member
Oct 25, 2024
135
52
28
Recently picked up a M75q Gen2 and cannot for the life of me get Proxmox to use the right realtek driver (the old 8169 issue). I realize this isn't a specific issue with the M75q but anyone have any thoughts?

Like it will load the 8169 driver during proxmox install. I can't even get beyond initial install. I'm about to sell it and buy something with an intel nic.
It's linux based? Create an /etc/modprobe.d/blacklist-r8168.conf containing
blacklist r8168 (or whatever module you want to stop from loading)
 

Mark Linton

Member
Sep 28, 2018
32
14
8
TLDR: Bios unlocking and hacking to undervolt and unlock vGPU profiles

For anyone else hardware hacking on the Lenovo platform, I did a few things:

I have an m920q with an i9 9900T ES cpu, and 64GB of memory. I'm using this to host proxmox and a couple of windows and a debian VM. I wanted to have hardware accelerated environments and the Lenovo bios options leave a little to be desired.

Figured I would put some LLM tokens to good use and get it all working. Getting there wasn't easy. Lenovo locks down these boards heavily, and getting the Intel driver to cooperate took a lot of reverse engineering. Here is the step-by-step journey of how I did this.

Phase 1: Defeating the 35W Power Limit & Plundervolt

The i9-9900T ES is heavily throttled by Lenovo’s conservative 35W limits. Worse, modern BIOS updates include the "Plundervolt" microcode patches that completely lock out software undervolting.
  1. The Flash: I used a CH341A hardware flasher to dump the 8MB BIOS and 16MB BIOS chips downgraded the CPU microcode to 0x98 (pre-Plundervolt), and flashed it back.
Hardware Preparation

The Lenovo m920q uses a "split BIOS" design across two physical SPI flash chips on the motherboard (located near the PCI Slot and the WiFi slot):
  • Chip 2 (8MB): W25Q64 (Intel ME, Microcode, and Descriptor) - the one nearest to the rear of the machine labeled bios 2.
The Patching Process (Microcode Downgrade)

The goal was to replace the modern, locked microcode (e.g., 0xCA or higher) with version 0x98, which allows for software voltage control (MSR 0x150).

Tool: UEFITool. (or MMTool).

Locate the Microcode:

Opened the bios_backup.bin in UEFITool and searched for the "Microcode" volumes.

Identify CPUID:
For the i9-9900T (Coffee Lake), the CPUID is typically 906ED or 906EA.

Replace:
Downloaded the specific 0x98 microcode binary (e.g., cpu906ed_plat22_ver00000098_2018-09-03_PRD.bin) and used "Replace Body" in UEFITool to swap out the new version for the old one.

Save:
Exported the file as modded_bios_8mb.bin and flashed back to the chip. I spent some time setting the ME/AMT settings back as this was erased during the process.

Flash:
flashrom -p ch341a_spi -c "W25Q64BV/W25Q64CV/W25Q64FV" -w modded_bios_8mb.bin

  1. The Power Mod: With the microcode downgraded, I booted into a standalone UEFI shell (via USB) and used setup_var.efi to disable the Overclocking Lock EFI variable (0x7BD to 0x00).
To apply the undervolt and power limits on Proxmox, we used the intel-undervolt utility. Here are the specific configuration values and commands used to lock in the 55W performance profile.

All settings are stored in /etc/intel-undervolt.conf on the proxmox host. Below is the exact block we used for i9-9900T:

# CPU Undervolting (Offsets in mV)
# Index 0: CPU Core | Index 1: GPU | Index 2: CPU Cache
undervolt 0 'CPU Core' -100
undervolt 1 'GPU' 0
undervolt 2 'CPU Cache' -100

# Power Limits (Watts/Time)
# PL1: Sustained Power (55W)
# PL2: Burst Power (92W)
power package 0 55 92


Once the configuration file is saved, you run these commands to apply the settings and ensure they survive a reboot.

Apply the settings immediately:
intel-undervolt apply

Check the current status (to verify the -100mV took effect):
intel-undervolt read

Enable the systemd service (so it applies automatically at boot):
systemctl enable --now intel-undervolt

To prove the 55W PL1 was working, we ran a stress test and monitored the package power:

# Run a 16-thread stress test
sysbench cpu --threads=16 --time=300 run

# In another terminal, watch the power draw
watch -n 1 "intel-undervolt read | grep 'Package'"


* Before: The CPU would hit 35W and immediately throttle the clocks down to ~1.8GHz.
* After: The CPU sustained 55W continuously, maintaining much higher boost clocks (up to its 3.8GHz cap) without thermal throttling.

The Result: I used intel-undervolt in Proxmox to push PL1 to 55W and applied a -100mV core/cache undervolt. Sysbench scores jumped to 14,662 pts, outperforming a 95W i7-8700K, while peaking at only 76°C.

Phase 2: The GVT-g VRAM Wall
With the CPU unleashed, I configured Intel GVT-g to split the UHD 630 iGPU among my VMs. But when I tried to start them, Proxmox threw the dreaded error:

pci device '0000:00:02.0' has no available instances of 'i915-GVTg_V5_4'
  • The Problem: The Lenovo BIOS defaults to a measly 32MB of DVMT Pre-Allocated memory (Stolen Memory). To run a high-res V5_4 vGPU slice, you need at least 128MB.
  • The Dead Ends: I tried using common Lenovo EFI offsets (like 0x18F and 0x8F5) to increase the VRAM. The system ignored them. I then tried the Proxmox kernel parameter ignore_resource_conflict=1 hoping the Linux kernel would just overcommit the memory. It failed; the hardware driver strictly enforces the limit.
  • The Breakthrough (IFR Extraction): Lenovo shuffles hex addresses with every minor BIOS update. Guessing was useless. I took my BIOS dump, ran it through UEFIExtract to pull the Setup PE32 module, and pushed it through ifrextractor. This generated a text map of my exact BIOS. We found the real offset for DVMT Pre-Allocated was 0xA44. We set it to 0x08 (256MB).

Phase 3: The Aperture Trap
After unlocking 256MB of VRAM, I could successfully boot one VM. But starting a second one threw the "no available instances" error again. Why?
  • The Investigation: Back to the IFR text dump. The Intel driver requires "Aperture Size" (the CPU-to-GPU memory window) to map the VMs. By default, Lenovo sets this to 256MB. Each VM needs a large chunk of that window
  • The Fix: In the IFR dump, we found the hidden offsets for GTT Size (0x992) and Aperture Size (0x993). We pushed the GTT to 8MB (0x03) and commanded the Aperture to open to a massive 2048MB (0x0F)
  • The Result: Rebooted, ran lspci -v, and saw Memory at ... [size=2G]. Suddenly, the sysfs tree showed 3 available instances!
Here are the UEFI patch offsets for my platform (you're might be different if you're on a different BIOS/CPU)

SettingOffsetValueWhat it Does
Overclocking Lock0x7BD0x00Unlocks software undervolting
BIOS Lock0xB7B0x00Disables flash protection
DVMT Pre-Allocated0xA440x08Increases Stolen Memory to 256MB
GTT Size0x9920x03Increases mapping table to 8MB
Aperture Size0x9930x0FIncreases Aperture to 2048MB (2GB)
 

DouglasteR

Active Member
Dec 19, 2015
171
54
28
TLDR: Bios unlocking and hacking to undervolt and unlock vGPU profiles

For anyone else hardware hacking on the Lenovo platform, I did a few things:

I have an m920q with an i9 9900T ES cpu, and 64GB of memory. I'm using this to host proxmox and a couple of windows and a debian VM. I wanted to have hardware accelerated environments and the Lenovo bios options leave a little to be desired.

Figured I would put some LLM tokens to good use and get it all working. Getting there wasn't easy. Lenovo locks down these boards heavily, and getting the Intel driver to cooperate took a lot of reverse engineering. Here is the step-by-step journey of how I did this.

Phase 1: Defeating the 35W Power Limit & Plundervolt

The i9-9900T ES is heavily throttled by Lenovo’s conservative 35W limits. Worse, modern BIOS updates include the "Plundervolt" microcode patches that completely lock out software undervolting.
  1. The Flash: I used a CH341A hardware flasher to dump the 8MB BIOS and 16MB BIOS chips downgraded the CPU microcode to 0x98 (pre-Plundervolt), and flashed it back.
Hardware Preparation

The Lenovo m920q uses a "split BIOS" design across two physical SPI flash chips on the motherboard (located near the PCI Slot and the WiFi slot):
  • Chip 2 (8MB): W25Q64 (Intel ME, Microcode, and Descriptor) - the one nearest to the rear of the machine labeled bios 2.
The Patching Process (Microcode Downgrade)

The goal was to replace the modern, locked microcode (e.g., 0xCA or higher) with version 0x98, which allows for software voltage control (MSR 0x150).

Tool: UEFITool. (or MMTool).

Locate the Microcode:

Opened the bios_backup.bin in UEFITool and searched for the "Microcode" volumes.

Identify CPUID:
For the i9-9900T (Coffee Lake), the CPUID is typically 906ED or 906EA.

Replace:
Downloaded the specific 0x98 microcode binary (e.g., cpu906ed_plat22_ver00000098_2018-09-03_PRD.bin) and used "Replace Body" in UEFITool to swap out the new version for the old one.

Save:
Exported the file as modded_bios_8mb.bin and flashed back to the chip. I spent some time setting the ME/AMT settings back as this was erased during the process.

Flash:
flashrom -p ch341a_spi -c "W25Q64BV/W25Q64CV/W25Q64FV" -w modded_bios_8mb.bin

  1. The Power Mod: With the microcode downgraded, I booted into a standalone UEFI shell (via USB) and used setup_var.efi to disable the Overclocking Lock EFI variable (0x7BD to 0x00).
To apply the undervolt and power limits on Proxmox, we used the intel-undervolt utility. Here are the specific configuration values and commands used to lock in the 55W performance profile.

All settings are stored in /etc/intel-undervolt.conf on the proxmox host. Below is the exact block we used for i9-9900T:

# CPU Undervolting (Offsets in mV)
# Index 0: CPU Core | Index 1: GPU | Index 2: CPU Cache
undervolt 0 'CPU Core' -100
undervolt 1 'GPU' 0
undervolt 2 'CPU Cache' -100

# Power Limits (Watts/Time)
# PL1: Sustained Power (55W)
# PL2: Burst Power (92W)
power package 0 55 92


Once the configuration file is saved, you run these commands to apply the settings and ensure they survive a reboot.

Apply the settings immediately:
intel-undervolt apply

Check the current status (to verify the -100mV took effect):
intel-undervolt read

Enable the systemd service (so it applies automatically at boot):
systemctl enable --now intel-undervolt

To prove the 55W PL1 was working, we ran a stress test and monitored the package power:

# Run a 16-thread stress test
sysbench cpu --threads=16 --time=300 run

# In another terminal, watch the power draw
watch -n 1 "intel-undervolt read | grep 'Package'"


* Before: The CPU would hit 35W and immediately throttle the clocks down to ~1.8GHz.
* After: The CPU sustained 55W continuously, maintaining much higher boost clocks (up to its 3.8GHz cap) without thermal throttling.

The Result: I used intel-undervolt in Proxmox to push PL1 to 55W and applied a -100mV core/cache undervolt. Sysbench scores jumped to 14,662 pts, outperforming a 95W i7-8700K, while peaking at only 76°C.

Phase 2: The GVT-g VRAM Wall
With the CPU unleashed, I configured Intel GVT-g to split the UHD 630 iGPU among my VMs. But when I tried to start them, Proxmox threw the dreaded error:

pci device '0000:00:02.0' has no available instances of 'i915-GVTg_V5_4'
  • The Problem: The Lenovo BIOS defaults to a measly 32MB of DVMT Pre-Allocated memory (Stolen Memory). To run a high-res V5_4 vGPU slice, you need at least 128MB.
  • The Dead Ends: I tried using common Lenovo EFI offsets (like 0x18F and 0x8F5) to increase the VRAM. The system ignored them. I then tried the Proxmox kernel parameter ignore_resource_conflict=1 hoping the Linux kernel would just overcommit the memory. It failed; the hardware driver strictly enforces the limit.
  • The Breakthrough (IFR Extraction): Lenovo shuffles hex addresses with every minor BIOS update. Guessing was useless. I took my BIOS dump, ran it through UEFIExtract to pull the Setup PE32 module, and pushed it through ifrextractor. This generated a text map of my exact BIOS. We found the real offset for DVMT Pre-Allocated was 0xA44. We set it to 0x08 (256MB).

Phase 3: The Aperture Trap
After unlocking 256MB of VRAM, I could successfully boot one VM. But starting a second one threw the "no available instances" error again. Why?
  • The Investigation: Back to the IFR text dump. The Intel driver requires "Aperture Size" (the CPU-to-GPU memory window) to map the VMs. By default, Lenovo sets this to 256MB. Each VM needs a large chunk of that window
  • The Fix: In the IFR dump, we found the hidden offsets for GTT Size (0x992) and Aperture Size (0x993). We pushed the GTT to 8MB (0x03) and commanded the Aperture to open to a massive 2048MB (0x0F)
  • The Result: Rebooted, ran lspci -v, and saw Memory at ... [size=2G]. Suddenly, the sysfs tree showed 3 available instances!
Here are the UEFI patch offsets for my platform (you're might be different if you're on a different BIOS/CPU)

SettingOffsetValueWhat it Does
Overclocking Lock0x7BD0x00Unlocks software undervolting
BIOS Lock0xB7B0x00Disables flash protection
DVMT Pre-Allocated0xA440x08Increases Stolen Memory to 256MB
GTT Size0x9920x03Increases mapping table to 8MB
Aperture Size0x9930x0FIncreases Aperture to 2048MB (2GB)
Amazing finds.

Would be possible to enable a i9-9900 (not the t version) ?
 

Mark Linton

Member
Sep 28, 2018
32
14
8
Good question, I think that you can, however the power requirements are a lot higher and it would probably throttle much quicker than the T version. I don't have a CPU to test this though. If you're wondering about the undervolting and power limiting, I think you can probably adjust these using the same UEFI techniques.