[coreboot] [PATCH 1/2] flashrom: add support for AMD CS5536 devices with boot flash

Mart Raudsepp mart.raudsepp at artecdesign.ee
Wed Feb 6 17:30:23 CET 2008


This implements support for devices using AMD Geode companion chip
CS5536 that have the Boot ROM on NOR flash that is directly connected to
FLASH_CS3 (Boot Flash Chip Select).
We need to write enable it in the NORF_CTL MSR register for flashrom to
be able to write to it, including JEDEC probe commands.

Signed-off-by: Mart Raudsepp <mart.raudsepp at artecdesign.ee>
---
This patch allows us to stop using AMD gx_utils.ko for BIOS flashing on the DBE61

 chipset_enable.c |   43 +++++++++++++++++++++++++++++++++----------
 1 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/chipset_enable.c b/chipset_enable.c
index 4cbb941..d6ef92e 100644
--- a/chipset_enable.c
+++ b/chipset_enable.c
@@ -228,6 +228,8 @@ static int enable_flash_cs5530(struct pci_dev *dev, const char *name)
 
 static int enable_flash_cs5536(struct pci_dev *dev, const char *name)
 {
+	#define MSR_NORF_CTL	0x51400018
+
 	int fd_msr;
 	unsigned char buf[8];
 	unsigned int addr = 0x1808;
@@ -243,34 +245,55 @@ static int enable_flash_cs5536(struct pci_dev *dev, const char *name)
 	 * could have potential problems on SMP machines since it
 	 * assumes cpu0, but it is safe on the Geode which is not SMP.
 	 *
+	 * Geode systems also write protects the NOR flash chip itself
+	 * via MSR_NORF_CTL. To enable write to NOR Boot flash for the
+	 * benefit of systems that have such a setup, raise
+	 * MSR 0x51400018 WE_CS3 (write enable Boot Flash Chip Select).
+	 *
 	 * This is probably not portable beyond Linux.
 	 */
 
-	fd_msr = open("/dev/cpu/0/msr", O_RDONLY);
+	fd_msr = open("/dev/cpu/0/msr", O_RDWR);
 	if (!fd_msr) {
 		perror("open msr");
 		return -1;
 	}
 	lseek64(fd_msr, (off64_t) addr, SEEK_SET);
 	read(fd_msr, buf, 8);
-	close(fd_msr);
+
+	printf("Enabling Geode MSR to write to flash.\n");
+
 	if (buf[7] != 0x22) {
-		printf("Enabling Geode MSR to write to flash.\n");
 		buf[7] &= 0xFB;
-		fd_msr = open("/dev/cpu/0/msr", O_WRONLY);
-		if (!fd_msr) {
-			perror("open msr");
-			return -1;
-		}
 		lseek64(fd_msr, (off64_t) addr, SEEK_SET);
 		if (write(fd_msr, buf, 8) < 0) {
 			perror("msr write");
 			printf
-			    ("Cannot write to MSR.  Make sure msr kernel is loaded: 'modprobe msr'\n");
+			    ("Cannot write to MSR.  Make sure the msr kernel module is loaded: 'modprobe msr'\n");
 			return -1;
 		}
-		close(fd_msr);
 	}
+
+	lseek64(fd_msr, (off64_t) MSR_NORF_CTL, SEEK_SET);
+	if (read(fd_msr, buf, 8) != 8) {
+		perror("read msr");
+		return -1;
+	}
+
+	/* Raise WE_CS3 bit */
+	buf[0] |= 0x08;
+
+	lseek64(fd_msr, (off64_t) MSR_NORF_CTL, SEEK_SET);
+	if (write(fd_msr, buf, 8) < 0) {
+		perror("msr write");
+		printf
+		    ("Cannot write to MSR.  Make sure the msr kernel module is loaded: 'modprobe msr'\n");
+		return -1;
+	}
+
+	close(fd_msr);
+
+	#undef MSR_NORF_CTL
 	return 0;
 }
 
-- 
1.5.4





More information about the coreboot mailing list