Print the part number for DDR3 modules.

Also closes PR kern/44665.
This commit is contained in:
soren 2013-07-19 01:02:49 +00:00
parent a940e06527
commit 4da9f6dd54
2 changed files with 49 additions and 21 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: spdmem.c,v 1.7 2012/10/27 17:18:22 chs Exp $ */
/* $NetBSD: spdmem.c,v 1.8 2013/07/19 01:02:49 soren Exp $ */
/*
* Copyright (c) 2007 Nicolas Joly
@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.7 2012/10/27 17:18:22 chs Exp $");
__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.8 2013/07/19 01:02:49 soren Exp $");
#include <sys/param.h>
#include <sys/device.h>
@ -259,19 +259,6 @@ spdmem_common_attach(struct spdmem_softc *sc, device_t self)
for (i = 3; i < spd_len; i++)
((uint8_t *)s)[i] = (sc->sc_read)(sc, i);
#ifdef DEBUG
for (i = 0; i < spd_len; i += 16) {
unsigned int j, k;
aprint_debug("\n");
aprint_debug_dev(self, "0x%02x:", i);
k = (spd_len > i + 16) ? spd_len : i + 16;
for (j = i; j < k; j++)
aprint_debug(" %02x", ((uint8_t *)s)[j]);
}
aprint_debug("\n");
aprint_debug_dev(self, "");
#endif
/*
* Setup our sysctl subtree, hw.spdmemN
*/
@ -336,9 +323,6 @@ spdmem_common_attach(struct spdmem_softc *sc, device_t self)
}
}
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", type);
strlcpy(sc->sc_type, type, SPDMEM_TYPE_MAXLEN);
if (node != NULL)
sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
@ -349,7 +333,9 @@ spdmem_common_attach(struct spdmem_softc *sc, device_t self)
CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
if (IS_RAMBUS_TYPE) {
aprint_normal(", SPD Revision %s", rambus_rev);
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s, SPD Revision %s", type, rambus_rev);
dimm_size = 1 << (s->sm_rdr.rdr_rows + s->sm_rdr.rdr_cols - 13);
if (dimm_size >= 1024)
aprint_normal(", %dGB\n", dimm_size / 1024);
@ -384,6 +370,16 @@ spdmem_common_attach(struct spdmem_softc *sc, device_t self)
decode_fbdimm(node, self, s);
break;
}
/* Dump SPD */
for (i = 0; i < spd_len; i += 16) {
unsigned int j, k;
aprint_debug_dev(self, "0x%02x:", i);
k = (spd_len > (i + 16)) ? i + 16 : spd_len;
for (j = i; j < k; j++)
aprint_debug(" %02x", ((uint8_t *)s)[j]);
aprint_debug("\n");
}
}
int
@ -487,6 +483,10 @@ decode_voltage_refresh(device_t self, struct spdmem *s)
static void
decode_edofpm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
aprint_normal("\n");
aprint_verbose_dev(self,
"%d rows, %d cols, %d banks, %dns tRAC, %dns tCAC\n",
@ -496,6 +496,10 @@ decode_edofpm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
static void
decode_rom(const struct sysctlnode *node, device_t self, struct spdmem *s) {
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
aprint_normal("\n");
aprint_verbose_dev(self, "%d rows, %d cols, %d banks\n",
s->sm_rom.rom_rows, s->sm_rom.rom_cols, s->sm_rom.rom_banks);
@ -506,6 +510,10 @@ decode_sdram(const struct sysctlnode *node, device_t self, struct spdmem *s,
int spd_len) {
int dimm_size, cycle_time, bits, tAA, i, speed, freq;
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
aprint_normal("%s, %s, ",
(s->sm_sdr.sdr_mod_attrs & SPDMEM_SDR_MASK_REG)?
" (registered)":"",
@ -566,6 +574,10 @@ static void
decode_ddr(const struct sysctlnode *node, device_t self, struct spdmem *s) {
int dimm_size, cycle_time, bits, tAA, i;
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
aprint_normal("%s, %s, ",
(s->sm_ddr.ddr_mod_attrs & SPDMEM_DDR_MASK_REG)?
" (registered)":"",
@ -610,6 +622,10 @@ static void
decode_ddr2(const struct sysctlnode *node, device_t self, struct spdmem *s) {
int dimm_size, cycle_time, bits, tAA, i;
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
aprint_normal("%s, %s, ",
(s->sm_ddr2.ddr2_mod_attrs & SPDMEM_DDR2_MASK_REG)?
" (registered)":"",
@ -654,6 +670,10 @@ static void
decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s) {
int dimm_size, cycle_time, bits;
aprint_naive("\n");
aprint_normal(": %18s\n", s->sm_ddr3.ddr3_part);
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
if (s->sm_ddr3.ddr3_mod_type ==
SPDMEM_DDR3_TYPE_MINI_RDIMM ||
s->sm_ddr3.ddr3_mod_type == SPDMEM_DDR3_TYPE_RDIMM)
@ -705,6 +725,10 @@ static void
decode_fbdimm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
int dimm_size, cycle_time, bits;
aprint_naive("\n");
aprint_normal("\n");
aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
/*
* FB-DIMM module size calculation is very much like DDR3
*/

View File

@ -1,4 +1,4 @@
/* $NetBSD: spdmemvar.h,v 1.2 2011/08/01 03:49:52 pgoyette Exp $ */
/* $NetBSD: spdmemvar.h,v 1.3 2013/07/19 01:02:49 soren Exp $ */
/*
* Copyright (c) 2007 Paul Goyette
@ -478,6 +478,11 @@ struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */
uint8_t ddr3_mfg_week;
uint8_t ddr3_serial[4];
uint16_t ddr3_crc;
uint8_t ddr3_part[18];
uint8_t ddr3_rev[2];
uint8_t ddr3_dram_mfgID_lsb;
uint8_t ddr3_dram_mfgID_msb;
uint8_t ddr3_vendor[26];
} __packed;
struct spdmem {
@ -494,7 +499,6 @@ struct spdmem {
struct spdmem_rom u1_rom;
struct spdmem_ddr3 u1_ddr3;
} sm_u1;
uint8_t sm_extension[128];
} __packed;
#define sm_fbd sm_u1.u1_fbd
#define sm_fpm sm_u1.u1_fpm