Blame view
common/ddr_spd.c
2.26 KB
0f2cbe3f5 Add proper SPD de... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* * 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 |
c7fd27ccf mpc8xxx: DDR2/DDR... |
21 |
* Rev 1.X or less supported by this code |
0f2cbe3f5 Add proper SPD de... |
22 |
*/ |
bcb6c2bb8 Enabled support f... |
23 |
if (spd_rev >= 0x20) { |
0f2cbe3f5 Add proper SPD de... |
24 25 26 27 28 |
printf("SPD revision %02X not supported by this code ", spd_rev); return 1; } |
bcb6c2bb8 Enabled support f... |
29 30 31 32 33 |
if (spd_rev > 0x13) { printf("SPD revision %02X not verified by this code ", spd_rev); } |
0f2cbe3f5 Add proper SPD de... |
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* * 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 ", 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); } |
c360ceac0 fsl-ddr: add the ... |
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
/* * CRC16 compute for DDR3 SPD * Copied from DDR3 SPD spec. */ static int crc16(char *ptr, int count) { int crc, i; crc = 0; while (--count >= 0) { crc = crc ^ (int)*ptr++ << 8; for (i = 0; i < 8; ++i) if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; } return crc & 0xffff; } unsigned int ddr3_spd_check(const ddr3_spd_eeprom_t *spd) { char *p = (char *)spd; int csum16; int len; char crc_lsb; /* byte 126 */ char crc_msb; /* byte 127 */ /* * SPD byte0[7] - CRC coverage * 0 = CRC covers bytes 0~125 * 1 = CRC covers bytes 0~116 */ len = !(spd->info_size_crc & 0x80) ? 126 : 117; csum16 = crc16(p, len); crc_lsb = (char) (csum16 & 0xff); crc_msb = (char) (csum16 >> 8); if (spd->crc[0] == crc_lsb && spd->crc[1] == crc_msb) { return 0; } else { printf("SPD checksum unexpected. " "Checksum lsb in SPD = %02X, computed SPD = %02X " "Checksum msb in SPD = %02X, computed SPD = %02X ", spd->crc[0], crc_lsb, spd->crc[1], crc_msb); return 1; } } |