Uncovering Intel 845 82845 cuntery

I have just been arsing around for ages trying to determine how much RAM I can really put in my Toshiba Satellite 1410 303 laptop. I wanted to find out for certain whether the apparent 512MB limit was a genuine hardware limit, or just the result of Toshiba being wankers and putting an artificial limit in the BIOS to try and force people to spend more money on a whole new laptop, in which case I could poke through the BIOS until I found said cuntery and get rid of it.

The result of my investigation was that it is indeed a hardware limit, and so it is not possible to put more than 512MB of RAM in a Toshiba Satellite 1410 303. Which is a dog's cunt, because the horrendous fucking bloatedness of websites these days causes browsers to use fuck loads of memory and 512MB is quite likely to not be enough. A few tabs of pages that take the piss with bloated javascripts and shite can easily enough make firefox or opera start pushing the system into swapping with that little memory. And such pages are painfully bleeding slow enough without that. Anyway, the point of this page is to enable other Linux users with 845 chipsets to determine whether they have a good one or a cruddy one without having to fuck about for hours like I did.

The confusion arises because of the multiple variants of the Intel 845 82845 chipset. They all have the same PCI ID of 8086:1a30 but support different amounts of RAM. This is what I get from lspci -nn:

00:00.0 Host bridge [0600]: Intel Corporation 82845 845 [Brookdale] Chipset Host Bridge [8086:1a30] (rev 05)

lspci of itself cannot distinguish between the differently-suffixed variants of the 82845 - there is plain 82845 with no suffix, 82845E, 82845MP and a bunch more besides. The especially shite one is 82845MZ which does not support more than 512MB of RAM. But they all have the same PCI ID so lspci can't tell the difference.

I have no idea whether it is possible to tell the difference from the chipset revision number. It would save a lot of hassle if the different revisions of the different variants were all given unique numbers but I have no idea whether this is true or not.

Ignoring the SDR variants because they are so old and shite that even I do not have one, the desktop variants can handle 2GB of RAM and use an ICH2 or ICH4 southbridge. The mobile variants can handle 1GB or 512MB and use an ICH3 southbridge. lspci does enable you to work out what southbridge you've got so that isn't a problem.

To determine whether you have a decent mobile version or a cruddy one, though, means reading the 32-bit little-endian value CAPID at 0xe4 in the PCI config space and looking at bit 28. This needs to be 1 to indicate the ability to handle over 512MB. If it is 0 you're fucked,

You can do this by hand if you run lspci -xxx as root (it doesn't give the whole config space if you're not root) and peering at the output, or you can use this script.

#!/bin/bash # # Script to extract and parse CAPID from Intel 82845 845 Brookdale # chipset to determine if you've got a good one or not. There are # several sub-variants of PCI ID 8086:1a30 and some are more # capable than others. In particular the MZ variant will not # support more than 512MB of RAM, so it's a bit crap (which may be # of amusement to bikers). # # References: # http://www.intel.co.uk/content/dam/doc/datasheet/845-chipset-82845-memory-controller-hub-ddr-datasheet.pdf # http://www.intel.co.uk/content/dam/doc/datasheet/mobile-845-family-chipset-datasheet.pdf # a=$(lspci -xxx -d 8086:1a30 | \ sed -n -e '/^e0: /s/^e0: \([0-9a-f][0-9a-f] \)\{4\}\(\([0-9a-f][0-9a-f] \)\{4\}\).*$/\2/p') if [ -z "$a" ]; then echo 'Failed to extract anything from "lspci -xxx -d 8086:1a30".' echo 'Either you have a non-82845 chipset, or you are not root.' exit 1 fi echo "$a" | \ sed -e 's/^\([0-9a-f][0-9a-f] \)\([0-9a-f][0-9a-f] \)\([0-9a-f][0-9a-f] \)\([0-9a-f][0-9a-f] \)[0-9a-f ]*$/CAPID: \4\3\2\1/' cat << EOF | \ grep ^$(echo "$a" | sed -e 's/^[0-9a-f ]\{9\}\([0-9a-f]\)[0-9a-f] $/\1/') | \ sed -e 's/^.//' -e 's/^\([01]\)\([01]\)\([01]\)\([01]\)$/DDR:\1 MobilePowerMgt:\2 DDR266:\3 Over512MB:\4/' 00000 10001 20010 30011 40100 50101 60110 70111 81000 91001 a1010 b1011 c1100 d1101 e1110 f1111 EOF

On my system this gives...

CAPID: c1 04 a0 09 DDR:1 MobilePowerMgt:1 DDR266:0 Over512MB:0

...which is not what I wanted to see, but there it is.

I don't think the MobilePowerMgt flag is definitive in determining whether the chipset is a mobile or desktop version. I think some of the desktop versions had this capability as well. More reliable to check the output of lspci -vvvnn and see if there is an ICH2/ICH4 southbridge (desktop) or an ICH3-M one (mobile).

Back to Pigeon's Nest

Be kind to pigeons

Valid HTML 4.01!