mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	Also adds helper functions for DDR1/2 to verify the checksum. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright 2008 Freescale Semiconductor, Inc.
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * Version 2 as published by the Free Software Foundation.
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <ddr_spd.h>
 | |
| 
 | |
| /* used for ddr1 and ddr2 spd */
 | |
| static int
 | |
| spd_check(const u8 *buf, u8 spd_rev, u8 spd_cksum)
 | |
| {
 | |
| 	unsigned int cksum = 0;
 | |
| 	unsigned int i;
 | |
| 
 | |
| 	/*
 | |
| 	 * Check SPD revision supported
 | |
| 	 * Rev 1.2 or less supported by this code
 | |
| 	 */
 | |
| 	if (spd_rev > 0x12) {
 | |
| 		printf("SPD revision %02X not supported by this code\n",
 | |
| 		       spd_rev);
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Calculate checksum
 | |
| 	 */
 | |
| 	for (i = 0; i < 63; i++) {
 | |
| 		cksum += *buf++;
 | |
| 	}
 | |
| 	cksum &= 0xFF;
 | |
| 
 | |
| 	if (cksum != spd_cksum) {
 | |
| 		printf("SPD checksum unexpected. "
 | |
| 			"Checksum in SPD = %02X, computed SPD = %02X\n",
 | |
| 			spd_cksum, cksum);
 | |
| 		return 1;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| unsigned int
 | |
| ddr1_spd_check(const ddr1_spd_eeprom_t *spd)
 | |
| {
 | |
| 	const u8 *p = (const u8 *)spd;
 | |
| 
 | |
| 	return spd_check(p, spd->spd_rev, spd->cksum);
 | |
| }
 | |
| 
 | |
| unsigned int
 | |
| ddr2_spd_check(const ddr2_spd_eeprom_t *spd)
 | |
| {
 | |
| 	const u8 *p = (const u8 *)spd;
 | |
| 
 | |
| 	return spd_check(p, spd->spd_rev, spd->cksum);
 | |
| }
 |