1 /* 2 * Copyright 2008 Freescale Semiconductor, Inc. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * Version 2 as published by the Free Software Foundation. 7 */ 8 9 #include <common.h> 10 #include <ddr_spd.h> 11 12 /* used for ddr1 and ddr2 spd */ 13 static int 14 spd_check(const u8 *buf, u8 spd_rev, u8 spd_cksum) 15 { 16 unsigned int cksum = 0; 17 unsigned int i; 18 19 /* 20 * Check SPD revision supported 21 * Rev 1.2 or less supported by this code 22 */ 23 if (spd_rev > 0x12) { 24 printf("SPD revision %02X not supported by this code\n", 25 spd_rev); 26 return 1; 27 } 28 29 /* 30 * Calculate checksum 31 */ 32 for (i = 0; i < 63; i++) { 33 cksum += *buf++; 34 } 35 cksum &= 0xFF; 36 37 if (cksum != spd_cksum) { 38 printf("SPD checksum unexpected. " 39 "Checksum in SPD = %02X, computed SPD = %02X\n", 40 spd_cksum, cksum); 41 return 1; 42 } 43 44 return 0; 45 } 46 47 unsigned int 48 ddr1_spd_check(const ddr1_spd_eeprom_t *spd) 49 { 50 const u8 *p = (const u8 *)spd; 51 52 return spd_check(p, spd->spd_rev, spd->cksum); 53 } 54 55 unsigned int 56 ddr2_spd_check(const ddr2_spd_eeprom_t *spd) 57 { 58 const u8 *p = (const u8 *)spd; 59 60 return spd_check(p, spd->spd_rev, spd->cksum); 61 } 62