This is intended to be a short set of notes on successful hardware upgrades to a C700 series (C771US specifically) Compaq Presario laptop.
CPU
The system shipped with an anemic 1.86GHz Pentium-M T2390 with only 1M cache and a 533MHz FSB.
Additionally, the CPU heatsink locking mechanism relies on metal flanges which lose their tension over time and as a result allow the CPU heatsink to lose contact with the CPU package, leading to incessant fan operation and system lockups under load.
If you’re going to tear apart the laptop to fix the heatsink situation, you might as well replace the CPU while you are at it.
In my case I obtained a Core 2 Duo T9300 for about $50 which is a 2.5GHz, 6M cache monster by comparison. The specific CPU model that you obtain is not important, except that 1) it must be Socket P package; the Intel GM965 chipset in the C700 does not support greater than 800MHz bus speeds, so 2) it must be for an 800MHz or less bus; and 3) it must match the 35W thermal dissipation profile (TDP) of the T2390 to ensure that the OEM cooling hardware will be adequate.
When you install the CPU be sure to use a thicker than normal layer of Arctic Silver between the CPU and heatsink. The heatsink does not fit that well and a layer of heatsink compound will fill that gap. (Alternately you could probably use a thermal pad of some kind.)
CPU Issues
VT/Virtualization
The C700 BIOS does not enable VT virtualization acceleration, and furthermore locks the IA32_FEATURE_CONTROL MSR to prevent its enablement by the OS, so this feature is unavailable. It is possible to hack the InsydeBIOS and force-flash it via a specific type of USB thumb drive in order to enable this feature. (Similar to the procedure needed to modify the BIOS whitelist to be able to use a third-party mini-PCI WiFi card.)
SpeedStep
The C700 BIOS does not set up the ACPI Performance Supported States tables correctly for later Core 2 CPUs. As a result CPU frequency scaling (SpeedStep) does not work. The CPU boots at 2.4GHz (despite e.g. my T9300 being a 2.5GHz CPU) and stays there. ACPI CPU idling (C3 state) still works, which can be verified with the “Idle stats” tab in powertop
. Linux presents the following error in dmesg:
[Firmware Bug]: ACPI: Invalid BIOS_PSS frequency: 0x0MHz
For an in-depth solution, see below.
RAM
The C771US shipped with 2GB of PC2-5300 DDR SDRAM. The system specifications are listed as if this is the maximum the computer will support, but the GM965 chipset is capable of using up to 8GB and up to PC2-6400 speed SDRAM, so it seems to be worth a try to upgrade the RAM anyway.
I have good news: the memory can be upgraded to a total of 5GB of RAM running at 667MHz (PC2-5300 speed).
The bad news is that the reason it can only be upgraded to 5GB is that the Compaq BIOS seems to have a bug in configuring the memory that causes loss of system stability if any module of size greater than 1GB is inserted into slot 0 (the slot closest to the motherboard). This will manifest as errors/hangs in memtest86, errors in Linux under moderate utilization, etc. I assume the difference between a 1GB module that works and a 2GB module that doesn’t is in the geometry and/or the timing parameters encoded in the SPD EEPROM, which can be viewed using decode-dimms
. (Note: at least two individuals claim to have gotten unspecified 2GB modules to work in that slot; one in the comments, and one on the HP forums. I was unable to. I attempted a 2GB PC2-6400 Micron MT16HTF25664HY-800J2 as well as 2GB PC2-5300 Hynix HYMP125S64CP8-Y5 in the first slot, and in both cases memtest86 hung and the system was unstable in Linux, even though the 2GB module passed the tests when installed alone. I could not isolate any geometry or timing factor at fault.)
Another bit of bad news is that regardless of the memory module configuration and capabilities, the BIOS configures the memory controller for 667MHz 5-5-5 timing. So PC2-5300 CL5 RAM is really the fastest that is needed for this system. Additionally, it seems that according to the GM965 memory configuration datasheet, it would not be possible to use a GM965 laptop with 4GB modules at 800MHz speed, only 667MHz or lower. So there is probably nothing lost with this 5GB configuration by how the BIOS configures the memory speed.
So in order to upgrade a C700 series laptop to 5GB RAM, insert a 1GB DDR2 SO-DIMM into slot 0, the slot closest to the motherboard, and a 4GB DDR2 SO-DIMM into slot 1, the outer slot. The speeds do not need to be matched as long as the SPD EEPROM on the faster module includes timings for the fallback transfer rate (the usual case). In the image below I have mixed a PC2-5300 1GB module with a PC2-6400 4GB module and the system simply configures both to run at 667MHz.
Of note is that there is a minor performance loss from falling back from dual channel symmetric mode to dual channel asymmetric mode when running in a mismatched size configuration according to the GM965 memory configuration datasheet. Dual channel performance will only be available for the portion of the larger module that is covered by the size of the smaller module; in this case, 1GB of the 4GB module will thus enjoy dual channel performance.
Second hard disk
It is possible to replace the PATA DVD drive with an aftermarket caddy that can contain a second SATA hard disk. This interface will be somewhat slower than the main SATA hard disk since it contains a PATA-to-SATA converter.
SSDT Modification
After dumping the ACPI tables and disassembling the SSDT containing the _PSS table, I found that the _PSS table contains only three entries:
Name (_PSS, Package (0x03) // _PSS: Performance Supported States
{
Package (0x06)
{
0x00000960,
0x00007D00,
0x0000000A,
0x0000000A,
0x00000C22,
0x00000C22
},
Package (0x06)
{
0x00000960,
0x00003A98,
0x0000000A,
0x0000000A,
0x00000C22,
0x00000C22
},
Package (0x06)
{
0x00000000,
0x00000000,
0x0000000A,
0x0000000A,
0x00008000,
0x00008000
}
})
One can verify in the ACPI specification that these entries correspond respectively to a 2.4GHz, 2.4GHz, and “0 GHz” modes, the latter at which Linux complains with the 0x0 MHz error. Further, it can be observed (despite Intel’s insistence on secrecy, the register encoding scheme has been reverse engineered) that the bits [8:15] of the PERF_CTL and PERF_STATUS register values (the last two values in each frequency entry) correspond to the FSB multiplier needed to derive the target CPU frequency. So the problem here is that the Compaq BIOS has simply given us no valid entries that could possibly allow the CPU to run at any frequency other than 2.4GHz.
I solved this with the following steps.
Extract the _PSS table from the ACPI SSDT of another similar laptop (HP DV2700 series with Core 2 T7700), using acpidump > dsdt
, acpixtract -a dsdt
, and iasl -d ssdt2.dat
. This provides the following _PSS table which I will discuss:
Name (_PSS, Package (0x06) // _PSS: Performance Supported States
{
Package (0x06)
{
0x0961,
0x88B8,
0x0A,
0x0A,
0x0D30,
0x0D30
},
Package (0x06)
{
0x0960,
0x88B8,
0x0A,
0x0A,
0x0C24,
0x0C24
},
Package (0x06)
{
0x07D0,
0x6D60,
0x0A,
0x0A,
0x0A1E,
0x0A1E
},
Package (0x06)
{
0x0640,
0x55F0,
0x0A,
0x0A,
0x0818,
0x0818
},
Package (0x06)
{
0x04B0,
0x3E80,
0x0A,
0x0A,
0x0612,
0x0612
},
Package (0x06)
{
0x0320,
0x36B0,
0x0A,
0x0A,
0x880B,
0x880B
}
})
This table as constructed by the HP BIOS for the T7700 provides a range of frequencies labeled as 800MHz (0x0320) to 2401MHz (0x0961). Based on a 200MHz FSB, it will mostly step in 400MHz and 75mV increments, with a lowest voltage of .9375V.
However, the first and last entries are interesting because they break the apparent rules. The documentation for the Pentium M SpeedStep, upon which the Core 2 Duo is based, sheds some light on why. These entries are known as HFM and LFM respectively. The Core 2 Duo added a “SLFM” (Super Low Frequency Mode) which is described in the Core 2 Duo datasheet. The SLFM mode additionally uses the Dynamic FSB feature to reduce the FSB clock in half (e.g. from 200MHz to 100MHz). The Dynamic FSB bit is the leftmost bit of the PERF_CTL word according to the CoreBoot source code. So the LFM (SLFM) register value is now fully explained: 200MHz FSB / 2 = 100MHz FSB * 8 = 800MHz, at a core voltage .800V + 12.5*0x0B(11) = .9375V.
What about the first entry? It is labeled 2401MHz, which seems a bit odd because the next entry is labeled 2400MHz, provides 2400MHz at 1.25V, and the T7700 processor itself is clocked at 2.4GHz anyway. What’s even stranger is that despite being labeled 2401MHz, the multiplier actually puts it at 2600MHz, and the core voltage increases to 1.4V! Looking at the specs of the T7700, it becomes a bit clearer. The reason 2.6GHz is an available configuration is Intel Dynamic Acceleration, a precursor to the more recent Turbo Boost. With IDA, the host system can set a MSR bit that allows one or more cores to exceed design frequency and voltage specifications as long as the overall constraints (thermal, etc.) for the CPU package are met. The frequency label on the first mode is a bit of marketing trickery from what I can determine. It is set at 2401MHz, one greater than 2400MHz, to preserve relative ordering and to indicate to the OS that this is the highest frequency. A user who views his configuration will see the 2.4GHz CPU he believes he has, and the OS will believe this too, even if IDA is enabled and actively overclocking a core to 2.6GHz. In effect, this provides invisible help to workloads that cannot effectively be parallelized. The only evidence we have of what is really going on is the _PSS table, and, only for later Core 2 models, tools like CoreFreq tool which directly computes clock speed using performance counters.
So, what about the solution to enable SpeedStep on the C700? The first thing I did was to take this copied _PSS table, compile it as-is using iasl -tc
, and override the BIOS SSDT of the C700 using GRUB as described here. The ACPI table could load:
[ 0.118337] ACPI: Dynamic OEM Table Load:
[ 0.118342] ACPI: SSDT 0xFFFF880179151100 0000C4 (v01 PmRef Cpu1Ist 00003000 INTL 20051117)
And more importantly, the _PSS error was gone and frequency scaling was working immediately!
I was lucky that I had a very similar CPU with a correct _PSS table to draw from. But could we tweak it to actually match the specs of the T9300? And what about the more general case where a closely matched reference is unavailable? The c2ctl tool has some limited ability to generate a _PSS table, for example. But let’s try to create one that’s correct for the T9300.
The first challenge is the 12.5x and 13.5x multipliers needed for the 2.5GHz HFM and 2.7GHz IDA modes, which cannot be represented as a (hex) integer. The second challenge is the slightly different design voltage ranges.
For the first challenge, it is useful to observe from the Penryn core datasheet that there is a “Half-ratio (N/2)” mode for the FSB. While it provides no more details, going back to the CoreBoot source code we find that the second to leftmost bit in the register value is a “ratio nonint” bit which is commented as “add .5 to the ratio”. So we can just set that bit for the HFM and IDA modes to replace the 2.4GHz and 2.6GHz cases with 2.5GHz and 2.7GHz respectively.
For the voltage issue, we can see from the spec sheet that the voltage ranges for the T9300 are greater than those of the T7700: the highs are higher and the lows lower. Assuming the same base voltage of .800V, we’ll put .85V on the LFM mode and 1.45V on the IDA mode, leaving the rest within the range much as before. We can tweak this later if we have stability issues.
As for the rest of the values, the latency will remain the same 10uS for all Core 2 chips, and the power dissipation we can assume will scale similarly for the T9300 as it shares a 35W TDP (thermal design profile) with the T7700. For an arbitrary chip, the TDP and frequency change latency can be encoded as necessary.
So, our final T9300 _PSS table:
Name (_PSS, Package (0x06) // _PSS: Performance Supported States
{
Package (0x06)
{
2501, /* Frequency reported to OS, MHz */
35000, /* Power dissipation, mW */
10, /* Transition latency, uS */
10, /* Transition latency, uS */
0x4D34, /* PERF_CTL value (13.5x, 52 * 12.5mV + .800V = 1.45V) */
0x4D34 /* PERF_STATUS readback value */
},
Package (0x06)
{
2500,
35000,
10,
10,
0x4C28, /* 12.5x, 40 * 12.5mV + .800V = 1.3V */
0x4C28
},
Package (0x06)
{
2000,
28000,
10,
10,
0x0A1E, /* 10x, 30 * 12.5mV + .800V = 1.175V */
0x0A1E
},
Package (0x06)
{
1600,
22000,
10,
10,
0x0818, /* 8x, 24 * 12.5mV + .800V = 1.1V */
0x0818
},
Package (0x06)
{
1200,
16000,
10,
10,
0x0610, /* 6x, 16 * 12.5mV + .800V = 1V */
0x0610
},
Package (0x06)
{
800,
14000,
10,
10,
0x8804, /* Dynamic FSB (100MHz), 8x, 4 * 12.5mV + .800V = .85V */
0x8804
}
})
I then compile this with iasl -tc
, replace the /boot/dsdt.aml
with it, and reboot to check my work. (If it all goes wrong and the system is unbootable due to CPU errors, I append nocpufreq
to the Linux command line in GRUB to bypass my mistake.) Afterwards, I can see that CPU frequency scaling is working using powertop
. Now I only have to use the system heavily to see if there is any instability that could be attributed to guesswork in this modification.
A minor complication is that when the BIOS Cpu0Ist SSDT fails to load after the custom SSDT with the same-named objects has already been loaded (this is expected):
[ 0.118134] ACPI: Dynamic OEM Table Load:
[ 0.118140] ACPI: SSDT 0xFFFF880179343E00 0001EA (v01 PmRef Cpu0Ist 00003000 INTL 20051117)
[ 0.118147] ACPI Error: [_PPC] Namespace lookup failure, AE_ALREADY_EXISTS (20160108/dswload-378)
[ 0.118152] ACPI Exception: AE_ALREADY_EXISTS, During name lookup/catalog (20160108/psobject-227)
[ 0.118165] ACPI Error: Method parse/execution failed [\_PR.CPU0._OSC] (Node ffff88017a0b0f00), AE_ALREADY_EXISTS (20160108/psparse-542)
[ 0.118177] ACPI Error: Method parse/execution failed [\_PR.CPU0._PDC] (Node ffff88017a0b0ed8), AE_ALREADY_EXISTS (20160108/psparse-542)
[ 0.118338] ACPI: Dynamic OEM Table Load:
[ 0.118343] ACPI: SSDT 0xFFFF88017932DA00 0000C4 (v01 PmRef Cpu1Ist 00003000 INTL 20051117)
[ 0.118635] ACPI: Dynamic OEM Table Load:
[ 0.118639] ACPI: SSDT 0xFFFF880179337240 000083 (v01 PmRef Cpu1Cst 00003000 INTL 20051117)
After the expected failure, the ACPI interpreter also does not load the Cpu0Cst table which contains the C-state information, so ACPI idle states don’t work:
[ 1.228457] ACPI Error: [\_PR_.CPU0._CST] Namespace lookup failure, AE_NOT_FOUND (20160108/psargs-359)
[ 1.228462] ACPI Error: Method parse/execution failed [\_PR.CPU1._CST] (Node ffff88017a0a2348), AE_NOT_FOUND (20160108/psparse-542)
I fixed this by combining the hacked Cpu0Ist withe the original Cpu0Cst into one Cpu0IstCst SSDT that is then loaded with GRUB. Now everything works!
Motherboard schematic
Well, in case you needed it for some reason:
HP Compaq C700 motherboard schematics.
Hi, till now I’ve succesfully upgraded the stock RAM of my c700 to two 2gb modules, put 1 500gb hd. Will use a kingston ssd 300 60 gb in the cd/dvd bay drive using the adapter. Gonna buy a 12 cell battery and maybe try a t9300 processor.
If you have successfully gotten two 2GB modules to work, could you tell me what 1) BIOS version, 2) the full model number from the tag on bottom, and 3) what type of RAM sticks you are using?
In theory, shouldn’t a single 8gb stick work in slot 1 (nothing in slot 0) to bring it to the full 8gb?
I don’t think there is such a thing as a single 8GB DDR2 SO-DIMM.
well, I guess that would present a slight problem 😛
I think I may try a cpu upgrade, an hdd upgrade (1tb 7200 sata-ii), and I would like to find someone who can look at the BIOS and maybe fix that ram bug. That would be an awesome fix… be able to get 8GB plus VMX on this thing… 🙂
Please report back and let us know how it goes. 🙂
I am running 3GB RAM right now in my Presario C762NR with no problems. I really need to try 5GB because I run win7 64bit, and I get hang-ups when reaching my 3GB max running background programs like ad-guard. The 64bit operating system is so much faster than the 32bit that I do not want to convert back nor compromise what programs I can run at the same time. The cost for a 4GB memory stick compared to the 2GB stick is astronomical on my budget. I can’t find a 4GB for much less than $100 where as the 2GB stick was only $20, so I wanted to make sure this would work first. Has anyone else tried running 4GB + 1GB = 5GB total modules in a Presario C700 series C762NR to be exact?
T7500 processor works fine. even though its TDP is higher than the stock crap but oh well never had a issue. good luck guys!
Hi.
Did you need to run a Bios upadate to change the CPU?
Thanks in advance.
The BIOS was already the newest F.35 in my case.
confirmed upgrade:
C751NR
Win7Pro x64 SP1 (no updates)
BIOS HP F.33 and F.34
Intel Core 2 Duo T9300 2.45Ghz
slot 0 – 1GB DDR2 SO-DIMM PC2-5300 667Mhz (orig)
slot 1 – 4GB DDR2 SO-DIMM PC2-6400 800Mhz (Skill)
Intel ICH8 Express Chipset Family drivers
Intel GM965/G965/SL965 Express Chipset
Note: on first try used 1GB 800Mhz DIMM + 4GB 800Mhz. BIOS only sees 1 GB but Win7 sees 5110 MB and Win 7 System tools confirm 5GB at 667Mhz. Event log reports 1 HAL event and two Kernel-Processor-Power errors regarding power management disabled. But everything is running well with no event errors. Win 7 re-start hangs but hard boot works (some times several boots 🙂 ) but like i say: the darn machine really screams now compared to the original config. Oh, the hang is probably associated with the fact that Win 7 reports 0 Mb Reserved for hardware (BIOS?). Still, this hardware is running a couple serious DAW applications with a 7 port USB hub including a 1 TB USB HD, a USB Audio Interface and a USB Fender amp interface, simultaneously 🙂
compaq presario c700 is awesome when paired of an egpu like EXP GDC
Hello,
Could you please send me 2 screenshots of corefreq-cli running with a low then a high load (single thread) on system.
I’m improving CoreFreq for ratios enumeration when the IDA feature is enabled.
Regards
CyrIng
I finally got around to upgrade my Cpq C713NR cpu to the core2duo T9300 2.5GHz. As expected in the above discussion, the intel speedstep doesn’t work because of the BIOS code issue, stuck at 2.4GHz. Is there a step by step procedure to implement the ACPI fix discussed above within Windows without going into Linux? Also noted is that the temperature sensing is no longer accurate, stuck at whatever initial temp. Everything else works. Any help is appreciated.
Hi Guys,
My Presario C700 already has 3gb ram (2gb in the 0 slot and 1 gb in the 1 slot). I wanted to upgrade to 5 so I bought a PC2-6400 4GB and first put it in the slot 1, so I had 6gb on my laptop and when right clicked on ‘my computer’ it was 2.99.
So I changed the sequence exactly the same as this topic (1gb in the 0 slot and 4 gb in the 1 slot). I still have 2.99gb. Can anybody help?
Ciao
What does it do when you place only the 4gb in?
Note: If you’re using Windows, you must be using a PAE-supporting version to have more than 3GB available. See here: https://en.wikipedia.org/wiki/Physical_Address_Extension#Microsoft_Windows
To overide the Speedstep tables, you’d have to follow the same steps to create the patched DSDT but then you’d have to find a different procedure for loading the patched DSDT under Windows. I have no idea about that, maybe someone else can help.
Well it would be pretty interesting to see if you could find a way to make it work with 4 gb of ram. All the manuals say it’s locked to 2 gb ram only
I have two c700’s one i replaced the mobo on. the replacement mobo accepts 4gb (2x2gb) of ram fine, and a t9500 full boost speeds up to 2.6ghz
the other (stock mobo) with a t8300 only allowed 3gb with the one gb stick in the closest slot to the mobo, i have no clue what happened to the repkacement board i bought, but clearly someone reflashed it with a stock bios (if that even makes sense)
Msketch, what are the BIOS versions on each of the boards?
Hi Nemesis, Is there any way literally any way to get 2x2GB wirking as i have bought another 2 gig stick and i cant get a refund. I can do anything for it even changing bios
thanks
Not as far as I know, but if you figure it out, definitely let us know. Good luck!
but is it a bios error ? like if i get a custom bios will it support ?
I don’t know enough to say for certain, but it certainly seems like a Compaq BIOS bug since the hardware supports >1G modules in the other slot and on on other machines.
I also have, still, a C700 compaq presario working quite fine. With 3gb ram and 240gb ssd disk. Its cpu is a T8300 and the OS’s are Windows 10 pro 32 bits, linux mint and kali linux both 64 bits.
But my main concern is to make it enabled VT-x, bios is version F35, the last one I obtained from HP web.
How can I modify it or reflash in a secure way to make accesible VT-x parameter in bios?
I don’t want to brick it with such risky operation. So, I need clear and step-by-step safe instructions. Thanks in advance.
I could not figure out how to enable VT-x. I think the BIOS will have to be edited to do so.
Hello I have a C 700 COMPAQ PRESARIO with 2gb of ram dual core T 2330 1.6ghz 120GB DISK currently with win 10 home of 64 bits and I don’t know if I can update the ram to 4 gb as I saw in the comments the win got slow 10
mi moldelo es c 752 LA
late to the party, but I inherited a C751NR from my sister and thought it would be fun to see how far it can go. I can confirm with the F.35 BIOS that a T9500 processor does work (though current prices on T9500 are still pretty high IMO). Currently running 1GB Samsung SODIMM in slot 0 (PC2-5300S-55-121-A3) and a 4GB Crucial SODIMM (PC2-6400S-666-13-E1). Would like to find a combination to get 6GB total memory but so far have not been successful.
Currently running Windows 10 Pro like a champ on a 256GB SSD.
Hi Guys,
I’ve upgraded my C770ef notebook with a Crucial 4GB PC2-5300 memory in upper slot as mentionned and keeping the 1GB Samsung factory one in the other slot.
Unfortunately, windows show 2.99GB instead of 5GB.
Bios is up to date (F 35).
Any hint ?
Thanks.
You need 64-bit Windows or a 32-bit version which supports PAE, otherwise the system can’t use more than 4GB and 1GB is always reserved for PCI devices, leaving only 3GB usable.
Thanks a lot for your very fast reply , much appreciated !!
Indeed W10 32 bits is currently running, I will download a 64bit version soin and let you know.
Thanks again!
You might be able to enable PAE on 32-bit Windows, see this link (outdated for Win10 unfortunately): https://learn.microsoft.com/en-us/windows/win32/memory/physical-address-extension
Hello,
I missed your last message.
So I installed 64 bites version and now YES it does manage m’y 5GB.
Minus thé 1.5GB booked for the swap file (don’t know the exact english name sorry).
It seems pretty smooth, compare to the original 2GB experience.
However, one thing no that good : 1080p vidéo in YouTube stutter.
What could I do to improve ? Graphic car pilot seem to be the latest.
I had in mind to put a SSD but I guess it will not fix this issue.
I
You can see that GM945 hardware only supports MPEG-2 decoding: https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units#Third_generation
For everything else, the decoding is done on the CPU. You can install a faster CPU, e.g. T9500. But even with that, I think you have to reduce YT video resolution to 720p or less (it can be selected in the video pop-up settings and after a few tries eventually “sticks” as a default).
Thank you, I tested my streaming providers through Chrome and everything is amazingly smooth even in 1080p. Although Windows store apps are crap.
As you mentionned in your article, does it make sense to upgrade to a 9300 CPU to avoid incessant fan opération (and heat?).
Any user guide how to proceed?
Thx.
Upgrading CPU will probably help for two reasons: it increases amount of time the CPU spends idling so that it can be downclocked or sleep more, but the bigger reason is because it gives you a chance to apply new thermal compound and completely clean out the heatsink fins, which are the usual source of CPU running too hot and thermal throttling.