- Define some new parameters of DDR3 SPD ROM.

- Use fine timebase parameters for time calculation on DDR3. This change
  makes PC3-XXXX vaule more correctly on newer DDR3.
This commit is contained in:
msaitoh 2020-03-24 03:45:25 +00:00
parent 81751ae509
commit f2e2af514d
2 changed files with 49 additions and 18 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: spdmem.c,v 1.33 2020/03/24 03:35:25 msaitoh Exp $ */
/* $NetBSD: spdmem.c,v 1.34 2020/03/24 03:45:25 msaitoh Exp $ */
/*
* Copyright (c) 2007 Nicolas Joly
@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.33 2020/03/24 03:35:25 msaitoh Exp $");
__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.34 2020/03/24 03:45:25 msaitoh Exp $");
#include <sys/param.h>
#include <sys/device.h>
@ -756,6 +756,30 @@ print_part(const char *part, size_t pnsize)
aprint_normal(": %.*s\n", (int)(p - part), part);
}
static u_int
ddr3_value_pico(struct spdmem *s, uint8_t txx_mtb, uint8_t txx_ftb)
{
u_int mtb, ftb; /* in picoseconds */
intmax_t signed_txx_ftb;
u_int val;
mtb = (u_int)s->sm_ddr3.ddr3_mtb_dividend * 1000 /
s->sm_ddr3.ddr3_mtb_divisor;
ftb = (u_int)s->sm_ddr3.ddr3_ftb_dividend * 1000 /
s->sm_ddr3.ddr3_ftb_divisor;
/* tXX_ftb is signed value */
signed_txx_ftb = (int8_t)txx_ftb;
val = txx_mtb * mtb +
((txx_ftb > 127) ? signed_txx_ftb : txx_ftb) * ftb / 1000;
return val;
}
#define __DDR3_VALUE_PICO(s, field) \
ddr3_value_pico(s, s->sm_ddr3.ddr3_##field##_mtb, \
s->sm_ddr3.ddr3_##field##_ftb)
static void
decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s)
{
@ -786,10 +810,7 @@ decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s)
(s->sm_ddr3.ddr3_chipwidth + 2);
dimm_size = (1 << dimm_size) * (s->sm_ddr3.ddr3_physbanks + 1);
cycle_time = (1000 * s->sm_ddr3.ddr3_mtb_dividend +
(s->sm_ddr3.ddr3_mtb_divisor / 2)) /
s->sm_ddr3.ddr3_mtb_divisor;
cycle_time *= s->sm_ddr3.ddr3_tCKmin;
cycle_time = __DDR3_VALUE_PICO(s, tCKmin);
bits = 1 << (s->sm_ddr3.ddr3_datawidth + 3);
decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, FALSE,
"PC3", 0);
@ -802,12 +823,15 @@ decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s)
s->sm_ddr3.ddr3_physbanks + 1,
cycle_time/1000, cycle_time % 1000);
#define __DDR3_CYCLES(field) (s->sm_ddr3.field / s->sm_ddr3.ddr3_tCKmin)
#define __DDR3_CYCLES(val) \
((val / cycle_time) + ((val % cycle_time) ? 1 : 0))
aprint_verbose_dev(self, LATENCY, __DDR3_CYCLES(ddr3_tAAmin),
__DDR3_CYCLES(ddr3_tRCDmin), __DDR3_CYCLES(ddr3_tRPmin),
aprint_verbose_dev(self, LATENCY,
__DDR3_CYCLES(__DDR3_VALUE_PICO(s, tAAmin)),
__DDR3_CYCLES(__DDR3_VALUE_PICO(s, tRCDmin)),
__DDR3_CYCLES(__DDR3_VALUE_PICO(s, tRPmin)),
(s->sm_ddr3.ddr3_tRAS_msb * 256 + s->sm_ddr3.ddr3_tRAS_lsb) /
s->sm_ddr3.ddr3_tCKmin);
s->sm_ddr3.ddr3_tCKmin_mtb);
#undef __DDR3_CYCLES

View File

@ -1,4 +1,4 @@
/* $NetBSD: spdmemvar.h,v 1.14 2018/12/27 02:54:00 msaitoh Exp $ */
/* $NetBSD: spdmemvar.h,v 1.15 2020/03/24 03:45:25 msaitoh Exp $ */
/*
* Copyright (c) 2007 Paul Goyette
@ -463,20 +463,20 @@ struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */
);
uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */
uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */
uint8_t ddr3_tCKmin; /* in terms of mtb */
uint8_t ddr3_tCKmin_mtb;
uint8_t ddr3_unused3;
uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */
uint8_t ddr3_tAAmin; /* in terms of mtb */
uint8_t ddr3_tAAmin_mtb;
uint8_t ddr3_tWRmin;
uint8_t ddr3_tRCDmin;
uint8_t ddr3_tRCDmin_mtb;
uint8_t ddr3_tRRDmin;
uint8_t ddr3_tRPmin;
uint8_t ddr3_tRPmin_mtb;
SPD_BITFIELD( \
uint8_t ddr3_tRAS_msb:4, \
uint8_t ddr3_tRC_msb:4, , \
uint8_t ddr3_tRCmin_mtb_msb:4, , \
);
uint8_t ddr3_tRAS_lsb;
uint8_t ddr3_tRC_lsb;
uint8_t ddr3_tRCmin_mtb_lsb;
uint8_t ddr3_tRFCmin_lsb;
uint8_t ddr3_tRFCmin_msb;
uint8_t ddr3_tWTRmin;
@ -502,7 +502,14 @@ struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */
uint8_t ddr3_non_std_devtype:7, \
uint8_t ddr3_std_device:1, , \
);
uint8_t ddr3_unused4[26];
uint8_t ddr3_tCKmin_ftb;
uint8_t ddr3_tAAmin_ftb;
uint8_t ddr3_tRCDmin_ftb;
uint8_t ddr3_tRPmin_ftb;
uint8_t ddr3_tRCmin_ftb;
uint8_t ddr3_unused4[2];
uint8_t ddr3_MAC;
uint8_t ddr3_unused4a[17];
uint8_t ddr3_mod_height;
uint8_t ddr3_mod_thickness;
uint8_t ddr3_ref_card;