Riding the Flow

musings from the shire

Is Thinkpad W701 MXM? Kind of. Upgradeable? Nope :(

When I've chosen Thinkpad W701 as a laptop, one of the potential pluses I've considered is the usage of MXM 3.0 Type B slot for video card. Because MXM is a standard like PCIe, it would have potentially enabled upgrading to more powerful third-party graphics card. The Quadro 2800M is still quite respectable, but recent-gen like AMD 6970M already does better.

Of course I did realise this was a potential, not guarantee, but it still worth to try. In my previous blog post I've described details of mechanical tinkering, you can read it here - Thinkpad W701–anatomy of MXM video module

Since I've established that mechanically and electrically almost any MXM card would be accepted, all that remained is to try the actual card(s) - I was prepared to try several different ones starting from most powerful in case it would not work.

First try was the Radeon HD6970M I've got from http://www.mxm-upgrade.com/
Mechanically the card did fit perfectly, but laptop just refused to boot. It didn't even pass POST test with new card - just stayed here on black screen, one long beep, two short beeps - means "either video or system board failure". Basically means that BIOS didn't initialise in time so watchdog time triggered the beeping.

Just in case I've tried lower-gen but same family HD5870. Absolutely the same result - mechanically perfect fit, but refuses to boot.

This prompted for deeper investigation into system BIOS, to check for any black/whitelisting for "authorised cards only". I didn't find any "whitelists for the sake of whitelisting", but I've found that the VBIOS on the actual MXM card is not even tried to being used by SBIOS. Instead, SBIOS contains 4 VBIOS files (for all variations of Quadros these Thinkpads could ship from Lenovo), the correct VBIOS being picked based on match with ID contained on card, and then it tries to use this. Obviously with any third-party card this will just not find any matching VBIOS and by default will simply refuse to initialise it.

On to of this biggest issue I've found several other dubious things:
  • filling ACPI MXM3 structure only if NVidia card is detected. Shouldn't affect boot up, but could create problems on the long run
  • checking, which MXM structure to present to the card based on installed display panel ID being read from EDID. Problem is that EDID being read using VBIOS, and this is coded to execute inside MXM structure query callback, which is executed before VBIOS even initialised. How this ever supposed to work, I have no idea, but I assume it either just worked with VBIOSes provided or they were customised with this in mind

So, I knew that I was able to hack around these limitations, by doing some BIOS hacking. It was quite dangerous though, because on particular Thinkpad models there are absolutely no boot-block recovery against corrupt BIOS - if it doesn't boot, its bricked. So I had to be sure that every change I do will be 100% fail-proof in any imaginable scenario (just by simulating them on the drawing board). No surprise it took quite a time, better to be safe then sorry. Tricky enough, just disabling the white-listing wasn't enough - I had to actually disable VBIOS shadowing (in SBIOS) and make laptop use VBIOS contained in the MXM card ROM, which required quite some reverse-engineering and modifications all in very low-level assembly.

The result - I was able to make it use VBIOS from HD 6970M and this time it finally started booting from it! But - display just kept being black, nothing was being output to it (even when OS did finish booting, just with no video output at all). Backlight wasn't activated at all.
So after several tries I deemed it as a fail, plugged the original 2800M in - and surprise, display didn't work anymore, even with original card! Backlight was activated, but display just kept cycling through R-G-B-W test colours forever. By attaching external monitor I've found that external output and card was still working, just internal display never did.
Finally I have found out that lucking none of the internal circuits were damaged. What in fact happened, is several first bytes of internal LCD panel EDID EEPROM were corrupt, overridden with some garbage. No doubt this happened while HD6970M was connected. This did happen because EDID EEPROM on particular RGB LED 1920x1200 panel lacks any kind of protection, and if you just issue "write" I2C command instead of "read", the data will be written to EEPROM containing all the data which needed by graphics card to communicate with the panel (resolution, frequencies, etc).
In my case luckily only about 3 bytes at the start were corrupted, and this is just the EDID header. So none of actual panel parameters were lost, I've restored the header and brought laptop fully back to life. But this is an important lesson - you can actually damage your laptop by trying a third-party MXM board in it, even if laptop appears to have a MXM slot.

It showed the fact that while HD6970M indeed did partially work, some essential communication channels were broken (like I2C). These channels are no less important than actual video signal, since they control all supplementary functions like backlight, power, EDID reads, etc. Fail.

So the last try was to try the up the Quadro to 3800M. This card model is supported by W701 by default, so I assumed this upgrade option will always be fallback if nothing else works. How wrong I was.
I've purchased a 3800M which was originally a HP part. Well, it didn't boot with original BIOS. Same symptom - does not pass POST, one long beep, two short. Visual inspection proved that:
  • Lenovo own "proper" parts have different VBIOS version on them (so VBIOS check won't pass)
  • With Lenovo own "proper" parts the actual board looks slightly differently. So it's different even in hardware
I've tried to boot with hacked BIOS, but it still didn't boot. Hacked BIOS forced it to use on board HP VBIOS, and this still didn't work.

So, in a nutshell - a complete fail. Lenovo is indeed using MXM 3.0 Type B slot electrically, but they seem to customise it quite heavily - mostly around VBIOS/SBIOS interaction and also subtle but vital things like supplementary communication with other hardware like RGB LED backlighting. To make this customisations work, their cards have a VBIOS specifically customized by NVidia for them. This precludes the use of any third-party MXM cards. A shame, since W701 is a great hardware platform in every other respect.


Post a comment