Mon Aug 1 03:49:52 2011 UTC ()
Modularize the spdmem(4) driver


(pgoyette)
diff -r1.1 -r1.2 src/sys/dev/i2c/spdmem_i2c.c
diff -r1.2 -r1.3 src/sys/dev/ic/spdmem.c
diff -r1.1 -r1.2 src/sys/dev/ic/spdmemvar.h

cvs diff -r1.1 -r1.2 src/sys/dev/i2c/spdmem_i2c.c (expand / switch to unified diff)

--- src/sys/dev/i2c/spdmem_i2c.c 2010/03/24 00:31:41 1.1
+++ src/sys/dev/i2c/spdmem_i2c.c 2011/08/01 03:49:52 1.2
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: spdmem_i2c.c,v 1.1 2010/03/24 00:31:41 pgoyette Exp $ */ 1/* $NetBSD: spdmem_i2c.c,v 1.2 2011/08/01 03:49:52 pgoyette Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2007 Nicolas Joly 4 * Copyright (c) 2007 Nicolas Joly
5 * Copyright (c) 2007 Paul Goyette 5 * Copyright (c) 2007 Paul Goyette
6 * Copyright (c) 2007 Tobias Nygren 6 * Copyright (c) 2007 Tobias Nygren
7 * All rights reserved. 7 * All rights reserved.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * 2. Redistributions in binary form must reproduce the above copyright
@@ -25,56 +25,59 @@ @@ -25,56 +25,59 @@
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE. 30 * POSSIBILITY OF SUCH DAMAGE.
31 */ 31 */
32 32
33/* 33/*
34 * Serial Presence Detect (SPD) memory identification 34 * Serial Presence Detect (SPD) memory identification
35 */ 35 */
36 36
37#include <sys/cdefs.h> 37#include <sys/cdefs.h>
38__KERNEL_RCSID(0, "$NetBSD: spdmem_i2c.c,v 1.1 2010/03/24 00:31:41 pgoyette Exp $"); 38__KERNEL_RCSID(0, "$NetBSD: spdmem_i2c.c,v 1.2 2011/08/01 03:49:52 pgoyette Exp $");
39 39
40#include <sys/param.h> 40#include <sys/param.h>
41#include <sys/device.h> 41#include <sys/device.h>
42#include <sys/endian.h> 42#include <sys/endian.h>
 43#include <sys/module.h>
43#include <sys/sysctl.h> 44#include <sys/sysctl.h>
44#include <machine/bswap.h> 45#include <machine/bswap.h>
45 46
46#include <dev/i2c/i2cvar.h> 47#include <dev/i2c/i2cvar.h>
47#include <dev/ic/spdmemreg.h> 48#include <dev/ic/spdmemreg.h>
48#include <dev/ic/spdmemvar.h> 49#include <dev/ic/spdmemvar.h>
49 50
50/* Constants for matching i2c bus address */ 51/* Constants for matching i2c bus address */
51#define SPDMEM_I2C_ADDRMASK 0x78 52#define SPDMEM_I2C_ADDRMASK 0x78
52#define SPDMEM_I2C_ADDR 0x50 53#define SPDMEM_I2C_ADDR 0x50
53 54
54struct spdmem_i2c_softc { 55struct spdmem_i2c_softc {
55 struct spdmem_softc sc_base; 56 struct spdmem_softc sc_base;
56 i2c_tag_t sc_tag; 57 i2c_tag_t sc_tag;
57 i2c_addr_t sc_addr; 58 i2c_addr_t sc_addr;
58}; 59};
59 60
60static int spdmem_i2c_match(device_t, cfdata_t, void *); 61static int spdmem_i2c_match(device_t, cfdata_t, void *);
61static void spdmem_i2c_attach(device_t, device_t, void *); 62static void spdmem_i2c_attach(device_t, device_t, void *);
62SYSCTL_SETUP_PROTO(sysctl_spdmem_setup); 63static int spdmem_i2c_detach(device_t, int);
 64
 65CFATTACH_DECL_NEW(spdmem_iic, sizeof(struct spdmem_i2c_softc),
 66 spdmem_i2c_match, spdmem_i2c_attach, spdmem_i2c_detach, NULL);
63 67
64static uint8_t spdmem_i2c_read(struct spdmem_softc *, uint8_t); 68static uint8_t spdmem_i2c_read(struct spdmem_softc *, uint8_t);
65 69
66CFATTACH_DECL_NEW(spdmem_iic, sizeof(struct spdmem_i2c_softc), 70SYSCTL_SETUP_PROTO(sysctl_spdmem_setup);
67 spdmem_i2c_match, spdmem_i2c_attach, NULL, NULL); 
68 71
69static int 72static int
70spdmem_i2c_match(device_t parent, cfdata_t match, void *aux) 73spdmem_i2c_match(device_t parent, cfdata_t match, void *aux)
71{ 74{
72 struct i2c_attach_args *ia = aux; 75 struct i2c_attach_args *ia = aux;
73 struct spdmem_i2c_softc sc; 76 struct spdmem_i2c_softc sc;
74 77
75 if (ia->ia_name) { 78 if (ia->ia_name) {
76 /* add other names as we find more firmware variations */ 79 /* add other names as we find more firmware variations */
77 if (strcmp(ia->ia_name, "dimm-spd")) 80 if (strcmp(ia->ia_name, "dimm-spd"))
78 return 0; 81 return 0;
79 } 82 }
80 83
@@ -97,26 +100,65 @@ spdmem_i2c_attach(device_t parent, devic @@ -97,26 +100,65 @@ spdmem_i2c_attach(device_t parent, devic
97 struct spdmem_i2c_softc *sc = device_private(self); 100 struct spdmem_i2c_softc *sc = device_private(self);
98 struct i2c_attach_args *ia = aux; 101 struct i2c_attach_args *ia = aux;
99 102
100 sc->sc_tag = ia->ia_tag; 103 sc->sc_tag = ia->ia_tag;
101 sc->sc_addr = ia->ia_addr; 104 sc->sc_addr = ia->ia_addr;
102 sc->sc_base.sc_read = spdmem_i2c_read; 105 sc->sc_base.sc_read = spdmem_i2c_read;
103 106
104 if (!pmf_device_register(self, NULL, NULL)) 107 if (!pmf_device_register(self, NULL, NULL))
105 aprint_error_dev(self, "couldn't establish power handler\n"); 108 aprint_error_dev(self, "couldn't establish power handler\n");
106 109
107 spdmem_common_attach(&sc->sc_base, self); 110 spdmem_common_attach(&sc->sc_base, self);
108} 111}
109 112
 113static int
 114spdmem_i2c_detach(device_t self, int flags)
 115{
 116 struct spdmem_i2c_softc *sc = device_private(self);
 117
 118 pmf_device_deregister(self);
 119
 120 return spdmem_common_detach(&sc->sc_base, self);
 121}
 122
110static uint8_t 123static uint8_t
111spdmem_i2c_read(struct spdmem_softc *softc, uint8_t reg) 124spdmem_i2c_read(struct spdmem_softc *softc, uint8_t reg)
112{ 125{
113 uint8_t val; 126 uint8_t val;
114 struct spdmem_i2c_softc *sc = (struct spdmem_i2c_softc *)softc; 127 struct spdmem_i2c_softc *sc = (struct spdmem_i2c_softc *)softc;
115 128
116 iic_acquire_bus(sc->sc_tag, 0); 129 iic_acquire_bus(sc->sc_tag, 0);
117 iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr, &reg, 1, 130 iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr, &reg, 1,
118 &val, 1, 0); 131 &val, 1, 0);
119 iic_release_bus(sc->sc_tag, 0); 132 iic_release_bus(sc->sc_tag, 0);
120 133
121 return val; 134 return val;
122} 135}
 136
 137MODULE(MODULE_CLASS_DRIVER, spdmem, NULL);
 138
 139#ifdef _MODULE
 140#include "ioconf.c"
 141#endif
 142
 143static int
 144spdmem_modcmd(modcmd_t cmd, void *opaque)
 145{
 146 int error = 0;
 147
 148 switch (cmd) {
 149 case MODULE_CMD_INIT:
 150#ifdef _MODULE
 151 error = config_init_component(cfdriver_ioconf_spdmem,
 152 cfattach_ioconf_spdmem, cfdata_ioconf_spdmem);
 153#endif
 154 return error;
 155 case MODULE_CMD_FINI:
 156#ifdef _MODULE
 157 error = config_fini_component(cfdriver_ioconf_spdmem,
 158 cfattach_ioconf_spdmem, cfdata_ioconf_spdmem);
 159#endif
 160 return error;
 161 default:
 162 return ENOTTY;
 163 }
 164}

cvs diff -r1.2 -r1.3 src/sys/dev/ic/spdmem.c (expand / switch to unified diff)

--- src/sys/dev/ic/spdmem.c 2010/06/29 04:42:30 1.2
+++ src/sys/dev/ic/spdmem.c 2011/08/01 03:49:52 1.3
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: spdmem.c,v 1.2 2010/06/29 04:42:30 pgoyette Exp $ */ 1/* $NetBSD: spdmem.c,v 1.3 2011/08/01 03:49:52 pgoyette Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2007 Nicolas Joly 4 * Copyright (c) 2007 Nicolas Joly
5 * Copyright (c) 2007 Paul Goyette 5 * Copyright (c) 2007 Paul Goyette
6 * Copyright (c) 2007 Tobias Nygren 6 * Copyright (c) 2007 Tobias Nygren
7 * All rights reserved. 7 * All rights reserved.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * 2. Redistributions in binary form must reproduce the above copyright
@@ -25,52 +25,52 @@ @@ -25,52 +25,52 @@
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE. 30 * POSSIBILITY OF SUCH DAMAGE.
31 */ 31 */
32 32
33/* 33/*
34 * Serial Presence Detect (SPD) memory identification 34 * Serial Presence Detect (SPD) memory identification
35 */ 35 */
36 36
37#include <sys/cdefs.h> 37#include <sys/cdefs.h>
38__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.2 2010/06/29 04:42:30 pgoyette Exp $"); 38__KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.3 2011/08/01 03:49:52 pgoyette Exp $");
39 39
40#include <sys/param.h> 40#include <sys/param.h>
41#include <sys/device.h> 41#include <sys/device.h>
42#include <sys/endian.h> 42#include <sys/endian.h>
43#include <sys/sysctl.h> 43#include <sys/sysctl.h>
44#include <machine/bswap.h> 44#include <machine/bswap.h>
45 45
46#include <dev/i2c/i2cvar.h> 46#include <dev/i2c/i2cvar.h>
47#include <dev/ic/spdmemreg.h> 47#include <dev/ic/spdmemreg.h>
48#include <dev/ic/spdmemvar.h> 48#include <dev/ic/spdmemvar.h>
49 49
50SYSCTL_SETUP_PROTO(sysctl_spdmem_setup); 50SYSCTL_SETUP_PROTO(sysctl_spdmem_setup);
51 51
52/* Routines for decoding spd data */ 52/* Routines for decoding spd data */
53static void decode_edofpm(const struct sysctlnode *, device_t, struct spdmem *); 53static void decode_edofpm(const struct sysctlnode *, device_t, struct spdmem *);
54static void decode_rom(const struct sysctlnode *, device_t, struct spdmem *); 54static void decode_rom(const struct sysctlnode *, device_t, struct spdmem *);
55static void decode_sdram(const struct sysctlnode *, device_t, struct spdmem *, 55static void decode_sdram(const struct sysctlnode *, device_t, struct spdmem *,
56 int); 56 int);
57static void decode_ddr(const struct sysctlnode *, device_t, struct spdmem *); 57static void decode_ddr(const struct sysctlnode *, device_t, struct spdmem *);
58static void decode_ddr2(const struct sysctlnode *, device_t, struct spdmem *); 58static void decode_ddr2(const struct sysctlnode *, device_t, struct spdmem *);
59static void decode_ddr3(const struct sysctlnode *, device_t, struct spdmem *); 59static void decode_ddr3(const struct sysctlnode *, device_t, struct spdmem *);
60static void decode_fbdimm(const struct sysctlnode *, device_t, struct spdmem *); 60static void decode_fbdimm(const struct sysctlnode *, device_t, struct spdmem *);
61 61
62static void decode_size_speed(const struct sysctlnode *, int, int, int, int, 62static void decode_size_speed(device_t, const struct sysctlnode *,
63 bool, const char *, int); 63 int, int, int, int, bool, const char *, int);
64static void decode_voltage_refresh(device_t, struct spdmem *); 64static void decode_voltage_refresh(device_t, struct spdmem *);
65 65
66#define IS_RAMBUS_TYPE (s->sm_len < 4) 66#define IS_RAMBUS_TYPE (s->sm_len < 4)
67 67
68static const char* spdmem_basic_types[] = { 68static const char* spdmem_basic_types[] = {
69 "unknown", 69 "unknown",
70 "FPM", 70 "FPM",
71 "EDO", 71 "EDO",
72 "Pipelined Nibble", 72 "Pipelined Nibble",
73 "SDRAM", 73 "SDRAM",
74 "ROM", 74 "ROM",
75 "DDR SGRAM", 75 "DDR SGRAM",
76 "DDR SDRAM", 76 "DDR SDRAM",
@@ -209,28 +209,27 @@ spdmem_common_probe(struct spdmem_softc  @@ -209,28 +209,27 @@ spdmem_common_probe(struct spdmem_softc
209 } 209 }
210 210
211 /* For unrecognized memory types, don't match at all */ 211 /* For unrecognized memory types, don't match at all */
212 return 0; 212 return 0;
213} 213}
214 214
215void 215void
216spdmem_common_attach(struct spdmem_softc *sc, device_t self) 216spdmem_common_attach(struct spdmem_softc *sc, device_t self)
217{ 217{
218 struct spdmem *s = &(sc->sc_spd_data); 218 struct spdmem *s = &(sc->sc_spd_data);
219 const char *type; 219 const char *type;
220 const char *rambus_rev = "Reserved"; 220 const char *rambus_rev = "Reserved";
221 int dimm_size; 221 int dimm_size;
222 int i; 222 unsigned int i, spd_len, spd_size;
223 unsigned int spd_len, spd_size; 
224 const struct sysctlnode *node = NULL; 223 const struct sysctlnode *node = NULL;
225 224
226 /* 225 /*
227 * FBDIMM and DDR3 (and probably all newer) have a different 226 * FBDIMM and DDR3 (and probably all newer) have a different
228 * encoding of the SPD EEPROM used/total sizes 227 * encoding of the SPD EEPROM used/total sizes
229 */ 228 */
230 s->sm_len = (sc->sc_read)(sc, 0); 229 s->sm_len = (sc->sc_read)(sc, 0);
231 s->sm_size = (sc->sc_read)(sc, 1); 230 s->sm_size = (sc->sc_read)(sc, 1);
232 s->sm_type = (sc->sc_read)(sc, 2); 231 s->sm_type = (sc->sc_read)(sc, 2);
233 232
234 if (s->sm_type >= SPDMEM_MEMTYPE_FBDIMM) { 233 if (s->sm_type >= SPDMEM_MEMTYPE_FBDIMM) {
235 spd_size = 64 << (s->sm_len & SPDMEM_SPDSIZE_MASK); 234 spd_size = 64 << (s->sm_len & SPDMEM_SPDSIZE_MASK);
236 switch (s->sm_len & SPDMEM_SPDLEN_MASK) { 235 switch (s->sm_len & SPDMEM_SPDLEN_MASK) {
@@ -252,47 +251,51 @@ spdmem_common_attach(struct spdmem_softc @@ -252,47 +251,51 @@ spdmem_common_attach(struct spdmem_softc
252 spd_len = s->sm_len; 251 spd_len = s->sm_len;
253 if (spd_len < 64) 252 if (spd_len < 64)
254 spd_len = 64; 253 spd_len = 64;
255 } 254 }
256 if (spd_len > spd_size) 255 if (spd_len > spd_size)
257 spd_len = spd_size; 256 spd_len = spd_size;
258 if (spd_len > sizeof(struct spdmem)) 257 if (spd_len > sizeof(struct spdmem))
259 spd_len = sizeof(struct spdmem); 258 spd_len = sizeof(struct spdmem);
260 for (i = 3; i < spd_len; i++) 259 for (i = 3; i < spd_len; i++)
261 ((uint8_t *)s)[i] = (sc->sc_read)(sc, i); 260 ((uint8_t *)s)[i] = (sc->sc_read)(sc, i);
262 261
263#ifdef DEBUG 262#ifdef DEBUG
264 for (i = 0; i < spd_len; i += 16) { 263 for (i = 0; i < spd_len; i += 16) {
265 int j, k; 264 unsigned int j, k;
266 aprint_debug("\n"); 265 aprint_debug("\n");
267 aprint_debug_dev(self, "0x%02x:", i); 266 aprint_debug_dev(self, "0x%02x:", i);
268 k = (spd_len > i + 16) ? spd_len : i + 16; 267 k = (spd_len > i + 16) ? spd_len : i + 16;
269 for (j = i; j < k; j++) 268 for (j = i; j < k; j++)
270 aprint_debug(" %02x", ((uint8_t *)s)[j]); 269 aprint_debug(" %02x", ((uint8_t *)s)[j]);
271 } 270 }
272 aprint_debug("\n"); 271 aprint_debug("\n");
273 aprint_debug_dev(self, ""); 272 aprint_debug_dev(self, "");
274#endif 273#endif
275 274
276 /* 275 /*
277 * Setup our sysctl subtree, hw.spdmemN 276 * Setup our sysctl subtree, hw.spdmemN
278 */ 277 */
 278 sc->sc_sysctl_log = NULL;
 279#ifdef _MODULE
 280 sysctl_spdmem_setup(&sc->sc_sysctl_log);
 281#endif
279 if (hw_node != CTL_EOL) 282 if (hw_node != CTL_EOL)
280 sysctl_createv(NULL, 0, NULL, &node, 283 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, &node,
281 0, CTLTYPE_NODE, 284 0, CTLTYPE_NODE,
282 device_xname(self), NULL, NULL, 0, NULL, 0, 285 device_xname(self), NULL, NULL, 0, NULL, 0,
283 CTL_HW, CTL_CREATE, CTL_EOL); 286 CTL_HW, CTL_CREATE, CTL_EOL);
284 if (node != NULL && spd_len != 0) 287 if (node != NULL && spd_len != 0)
285 sysctl_createv(NULL, 0, NULL, NULL, 288 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
286 0, 289 0,
287 CTLTYPE_STRUCT, "spd_data", 290 CTLTYPE_STRUCT, "spd_data",
288 SYSCTL_DESCR("raw spd data"), NULL, 291 SYSCTL_DESCR("raw spd data"), NULL,
289 0, s, spd_len, 292 0, s, spd_len,
290 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 293 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
291 294
292 /* 295 /*
293 * Decode and print key SPD contents 296 * Decode and print key SPD contents
294 */ 297 */
295 if (IS_RAMBUS_TYPE) { 298 if (IS_RAMBUS_TYPE) {
296 if (s->sm_type == SPDMEM_MEMTYPE_RAMBUS) 299 if (s->sm_type == SPDMEM_MEMTYPE_RAMBUS)
297 type = "Rambus"; 300 type = "Rambus";
298 else if (s->sm_type == SPDMEM_MEMTYPE_DIRECTRAMBUS) 301 else if (s->sm_type == SPDMEM_MEMTYPE_DIRECTRAMBUS)
@@ -331,27 +334,27 @@ spdmem_common_attach(struct spdmem_softc @@ -331,27 +334,27 @@ spdmem_common_attach(struct spdmem_softc
331 type = 334 type =
332 spdmem_superset_types[SPDMEM_SUPERSET_DDR_ESDRAM]; 335 spdmem_superset_types[SPDMEM_SUPERSET_DDR_ESDRAM];
333 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM && 336 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
334 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_ESDRAM) { 337 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_ESDRAM) {
335 type = spdmem_superset_types[SPDMEM_SUPERSET_ESDRAM]; 338 type = spdmem_superset_types[SPDMEM_SUPERSET_ESDRAM];
336 } 339 }
337 } 340 }
338 341
339 aprint_naive("\n"); 342 aprint_naive("\n");
340 aprint_normal("\n"); 343 aprint_normal("\n");
341 aprint_normal_dev(self, "%s", type); 344 aprint_normal_dev(self, "%s", type);
342 strlcpy(sc->sc_type, type, SPDMEM_TYPE_MAXLEN); 345 strlcpy(sc->sc_type, type, SPDMEM_TYPE_MAXLEN);
343 if (node != NULL) 346 if (node != NULL)
344 sysctl_createv(NULL, 0, NULL, NULL, 347 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
345 0, 348 0,
346 CTLTYPE_STRING, "mem_type", 349 CTLTYPE_STRING, "mem_type",
347 SYSCTL_DESCR("memory module type"), NULL, 350 SYSCTL_DESCR("memory module type"), NULL,
348 0, sc->sc_type, 0, 351 0, sc->sc_type, 0,
349 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 352 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
350 353
351 if (IS_RAMBUS_TYPE) { 354 if (IS_RAMBUS_TYPE) {
352 aprint_normal(", SPD Revision %s", rambus_rev); 355 aprint_normal(", SPD Revision %s", rambus_rev);
353 dimm_size = 1 << (s->sm_rdr.rdr_rows + s->sm_rdr.rdr_cols - 13); 356 dimm_size = 1 << (s->sm_rdr.rdr_rows + s->sm_rdr.rdr_cols - 13);
354 if (dimm_size >= 1024) 357 if (dimm_size >= 1024)
355 aprint_normal(", %dGB\n", dimm_size / 1024); 358 aprint_normal(", %dGB\n", dimm_size / 1024);
356 else 359 else
357 aprint_normal(", %dMB\n", dimm_size); 360 aprint_normal(", %dMB\n", dimm_size);
@@ -376,53 +379,60 @@ spdmem_common_attach(struct spdmem_softc @@ -376,53 +379,60 @@ spdmem_common_attach(struct spdmem_softc
376 case SPDMEM_MEMTYPE_DDR2SDRAM: 379 case SPDMEM_MEMTYPE_DDR2SDRAM:
377 decode_ddr2(node, self, s); 380 decode_ddr2(node, self, s);
378 break; 381 break;
379 case SPDMEM_MEMTYPE_DDR3SDRAM: 382 case SPDMEM_MEMTYPE_DDR3SDRAM:
380 decode_ddr3(node, self, s); 383 decode_ddr3(node, self, s);
381 break; 384 break;
382 case SPDMEM_MEMTYPE_FBDIMM: 385 case SPDMEM_MEMTYPE_FBDIMM:
383 case SPDMEM_MEMTYPE_FBDIMM_PROBE: 386 case SPDMEM_MEMTYPE_FBDIMM_PROBE:
384 decode_fbdimm(node, self, s); 387 decode_fbdimm(node, self, s);
385 break; 388 break;
386 } 389 }
387} 390}
388 391
 392int
 393spdmem_common_detach(struct spdmem_softc *sc, device_t self)
 394{
 395 sysctl_teardown(&sc->sc_sysctl_log);
 396
 397 return 0;
 398}
 399
389SYSCTL_SETUP(sysctl_spdmem_setup, "sysctl hw.spdmem subtree setup") 400SYSCTL_SETUP(sysctl_spdmem_setup, "sysctl hw.spdmem subtree setup")
390{ 401{
391 const struct sysctlnode *node; 402 const struct sysctlnode *node;
392 403
393 if (sysctl_createv(clog, 0, NULL, &node, 404 if (sysctl_createv(clog, 0, NULL, &node, CTLFLAG_PERMANENT,
394 CTLFLAG_PERMANENT, 405 CTLTYPE_NODE, "hw", NULL, NULL, 0, NULL, 0,
395 CTLTYPE_NODE, "hw", NULL, 406 CTL_HW, CTL_EOL) != 0)
396 NULL, 0, NULL, 0, 
397 CTL_HW, CTL_EOL) != 0) 
398 return; 407 return;
399 408
400 hw_node = node->sysctl_num; 409 hw_node = node->sysctl_num;
401} 410}
402 411
403static void 412static void
404decode_size_speed(const struct sysctlnode *node, int dimm_size, int cycle_time, 413decode_size_speed(device_t self, const struct sysctlnode *node,
405 int d_clk, int bits, bool round, const char *ddr_type_string, 414 int dimm_size, int cycle_time, int d_clk, int bits,
406 int speed) 415 bool round, const char *ddr_type_string, int speed)
407{ 416{
408 int p_clk; 417 int p_clk;
 418 struct spdmem_softc *sc = (struct spdmem_softc *)device_private(self);
409 419
410 if (dimm_size < 1024) 420 if (dimm_size < 1024)
411 aprint_normal("%dMB", dimm_size); 421 aprint_normal("%dMB", dimm_size);
412 else 422 else
413 aprint_normal("%dGB", dimm_size / 1024); 423 aprint_normal("%dGB", dimm_size / 1024);
414 if (node != NULL) 424 if (node != NULL)
415 sysctl_createv(NULL, 0, NULL, NULL, 425 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
416 CTLFLAG_IMMEDIATE, 426 CTLFLAG_IMMEDIATE,
417 CTLTYPE_INT, "size", 427 CTLTYPE_INT, "size",
418 SYSCTL_DESCR("module size in MB"), NULL, 428 SYSCTL_DESCR("module size in MB"), NULL,
419 dimm_size, NULL, 0, 429 dimm_size, NULL, 0,
420 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 430 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
421 431
422 if (cycle_time == 0) { 432 if (cycle_time == 0) {
423 aprint_normal("\n"); 433 aprint_normal("\n");
424 return; 434 return;
425 } 435 }
426 436
427 /* 437 /*
428 * Calculate p_clk first, since for DDR3 we need maximum significance. 438 * Calculate p_clk first, since for DDR3 we need maximum significance.
@@ -435,27 +445,27 @@ decode_size_speed(const struct sysctlnod @@ -435,27 +445,27 @@ decode_size_speed(const struct sysctlnod
435 if (speed) 445 if (speed)
436 p_clk = speed; 446 p_clk = speed;
437 else 447 else
438 p_clk = (d_clk * bits) / 8 / cycle_time; 448 p_clk = (d_clk * bits) / 8 / cycle_time;
439 d_clk = ((d_clk + cycle_time / 2) ) / cycle_time; 449 d_clk = ((d_clk + cycle_time / 2) ) / cycle_time;
440 if (round) { 450 if (round) {
441 if ((p_clk % 100) >= 50) 451 if ((p_clk % 100) >= 50)
442 p_clk += 50; 452 p_clk += 50;
443 p_clk -= p_clk % 100; 453 p_clk -= p_clk % 100;
444 } 454 }
445 aprint_normal(", %dMHz (%s-%d)\n", 455 aprint_normal(", %dMHz (%s-%d)\n",
446 d_clk, ddr_type_string, p_clk); 456 d_clk, ddr_type_string, p_clk);
447 if (node != NULL) 457 if (node != NULL)
448 sysctl_createv(NULL, 0, NULL, NULL, 458 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
449 CTLFLAG_IMMEDIATE, 459 CTLFLAG_IMMEDIATE,
450 CTLTYPE_INT, "speed", 460 CTLTYPE_INT, "speed",
451 SYSCTL_DESCR("memory speed in MHz"), 461 SYSCTL_DESCR("memory speed in MHz"),
452 NULL, d_clk, NULL, 0, 462 NULL, d_clk, NULL, 0,
453 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 463 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
454} 464}
455 465
456static void 466static void
457decode_voltage_refresh(device_t self, struct spdmem *s) 467decode_voltage_refresh(device_t self, struct spdmem *s)
458{ 468{
459 const char *voltage, *refresh; 469 const char *voltage, *refresh;
460 470
461 if (s->sm_voltage < __arraycount(spdmem_voltage_types)) 471 if (s->sm_voltage < __arraycount(spdmem_voltage_types))
@@ -520,28 +530,28 @@ decode_sdram(const struct sysctlnode *no @@ -520,28 +530,28 @@ decode_sdram(const struct sysctlnode *no
520 * actually report PC-100 530 * actually report PC-100
521 */ 531 */
522 case 100: 532 case 100:
523 case 133: 533 case 133:
524 if (cycle_time < 8000) 534 if (cycle_time < 8000)
525 speed = 133; 535 speed = 133;
526 else 536 else
527 speed = 100; 537 speed = 100;
528 break; 538 break;
529 case 0x66: /* Legacy DIMMs use _hex_ 66! */ 539 case 0x66: /* Legacy DIMMs use _hex_ 66! */
530 default: 540 default:
531 speed = 66; 541 speed = 66;
532 } 542 }
533 decode_size_speed(node, dimm_size, cycle_time, 1, bits, FALSE, "PC", 543 decode_size_speed(self, node, dimm_size, cycle_time, 1, bits, FALSE,
534 speed); 544 "PC", speed);
535 545
536 aprint_verbose_dev(self, 546 aprint_verbose_dev(self,
537 "%d rows, %d cols, %d banks, %d banks/chip, %d.%dns cycle time\n", 547 "%d rows, %d cols, %d banks, %d banks/chip, %d.%dns cycle time\n",
538 s->sm_sdr.sdr_rows, s->sm_sdr.sdr_cols, s->sm_sdr.sdr_banks, 548 s->sm_sdr.sdr_rows, s->sm_sdr.sdr_cols, s->sm_sdr.sdr_banks,
539 s->sm_sdr.sdr_banks_per_chip, cycle_time/1000, 549 s->sm_sdr.sdr_banks_per_chip, cycle_time/1000,
540 (cycle_time % 1000) / 100); 550 (cycle_time % 1000) / 100);
541 551
542 tAA = 0; 552 tAA = 0;
543 for (i = 0; i < 8; i++) 553 for (i = 0; i < 8; i++)
544 if (s->sm_sdr.sdr_tCAS & (1 << i)) 554 if (s->sm_sdr.sdr_tCAS & (1 << i))
545 tAA = i; 555 tAA = i;
546 tAA++; 556 tAA++;
547 aprint_verbose_dev(self, latency, tAA, s->sm_sdr.sdr_tRCD, 557 aprint_verbose_dev(self, latency, tAA, s->sm_sdr.sdr_tRCD,
@@ -558,27 +568,28 @@ decode_ddr(const struct sysctlnode *node @@ -558,27 +568,28 @@ decode_ddr(const struct sysctlnode *node
558 (s->sm_ddr.ddr_mod_attrs & SPDMEM_DDR_MASK_REG)? 568 (s->sm_ddr.ddr_mod_attrs & SPDMEM_DDR_MASK_REG)?
559 " (registered)":"", 569 " (registered)":"",
560 (s->sm_config < __arraycount(spdmem_parity_types))? 570 (s->sm_config < __arraycount(spdmem_parity_types))?
561 spdmem_parity_types[s->sm_config]:"invalid parity"); 571 spdmem_parity_types[s->sm_config]:"invalid parity");
562 572
563 dimm_size = 1 << (s->sm_ddr.ddr_rows + s->sm_ddr.ddr_cols - 17); 573 dimm_size = 1 << (s->sm_ddr.ddr_rows + s->sm_ddr.ddr_cols - 17);
564 dimm_size *= s->sm_ddr.ddr_ranks * s->sm_ddr.ddr_banks_per_chip; 574 dimm_size *= s->sm_ddr.ddr_ranks * s->sm_ddr.ddr_banks_per_chip;
565 575
566 cycle_time = s->sm_ddr.ddr_cycle_whole * 1000 + 576 cycle_time = s->sm_ddr.ddr_cycle_whole * 1000 +
567 spdmem_cycle_frac[s->sm_ddr.ddr_cycle_tenths]; 577 spdmem_cycle_frac[s->sm_ddr.ddr_cycle_tenths];
568 bits = le16toh(s->sm_ddr.ddr_datawidth); 578 bits = le16toh(s->sm_ddr.ddr_datawidth);
569 if (s->sm_config == 1 || s->sm_config == 2) 579 if (s->sm_config == 1 || s->sm_config == 2)
570 bits -= 8; 580 bits -= 8;
571 decode_size_speed(node, dimm_size, cycle_time, 2, bits, TRUE, "PC", 0); 581 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
 582 "PC", 0);
572 583
573 aprint_verbose_dev(self, 584 aprint_verbose_dev(self,
574 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%dns cycle time\n", 585 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%dns cycle time\n",
575 s->sm_ddr.ddr_rows, s->sm_ddr.ddr_cols, s->sm_ddr.ddr_ranks, 586 s->sm_ddr.ddr_rows, s->sm_ddr.ddr_cols, s->sm_ddr.ddr_ranks,
576 s->sm_ddr.ddr_banks_per_chip, cycle_time/1000, 587 s->sm_ddr.ddr_banks_per_chip, cycle_time/1000,
577 (cycle_time % 1000 + 50) / 100); 588 (cycle_time % 1000 + 50) / 100);
578 589
579 tAA = 0; 590 tAA = 0;
580 for (i = 2; i < 8; i++) 591 for (i = 2; i < 8; i++)
581 if (s->sm_ddr.ddr_tCAS & (1 << i)) 592 if (s->sm_ddr.ddr_tCAS & (1 << i))
582 tAA = i; 593 tAA = i;
583 tAA /= 2; 594 tAA /= 2;
584 595
@@ -602,27 +613,28 @@ decode_ddr2(const struct sysctlnode *nod @@ -602,27 +613,28 @@ decode_ddr2(const struct sysctlnode *nod
602 " (registered)":"", 613 " (registered)":"",
603 (s->sm_config < __arraycount(spdmem_parity_types))? 614 (s->sm_config < __arraycount(spdmem_parity_types))?
604 spdmem_parity_types[s->sm_config]:"invalid parity"); 615 spdmem_parity_types[s->sm_config]:"invalid parity");
605 616
606 dimm_size = 1 << (s->sm_ddr2.ddr2_rows + s->sm_ddr2.ddr2_cols - 17); 617 dimm_size = 1 << (s->sm_ddr2.ddr2_rows + s->sm_ddr2.ddr2_cols - 17);
607 dimm_size *= (s->sm_ddr2.ddr2_ranks + 1) * 618 dimm_size *= (s->sm_ddr2.ddr2_ranks + 1) *
608 s->sm_ddr2.ddr2_banks_per_chip; 619 s->sm_ddr2.ddr2_banks_per_chip;
609 620
610 cycle_time = s->sm_ddr2.ddr2_cycle_whole * 1000 + 621 cycle_time = s->sm_ddr2.ddr2_cycle_whole * 1000 +
611 spdmem_cycle_frac[s->sm_ddr2.ddr2_cycle_frac]; 622 spdmem_cycle_frac[s->sm_ddr2.ddr2_cycle_frac];
612 bits = s->sm_ddr2.ddr2_datawidth; 623 bits = s->sm_ddr2.ddr2_datawidth;
613 if ((s->sm_config & 0x03) != 0) 624 if ((s->sm_config & 0x03) != 0)
614 bits -= 8; 625 bits -= 8;
615 decode_size_speed(node, dimm_size, cycle_time, 2, bits, TRUE, "PC2", 0); 626 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
 627 "PC2", 0);
616 628
617 aprint_verbose_dev(self, 629 aprint_verbose_dev(self,
618 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%02dns cycle time\n", 630 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%02dns cycle time\n",
619 s->sm_ddr2.ddr2_rows, s->sm_ddr2.ddr2_cols, 631 s->sm_ddr2.ddr2_rows, s->sm_ddr2.ddr2_cols,
620 s->sm_ddr2.ddr2_ranks + 1, s->sm_ddr2.ddr2_banks_per_chip, 632 s->sm_ddr2.ddr2_ranks + 1, s->sm_ddr2.ddr2_banks_per_chip,
621 cycle_time / 1000, (cycle_time % 1000 + 5) /10 ); 633 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
622 634
623 tAA = 0; 635 tAA = 0;
624 for (i = 2; i < 8; i++) 636 for (i = 2; i < 8; i++)
625 if (s->sm_ddr2.ddr2_tCAS & (1 << i)) 637 if (s->sm_ddr2.ddr2_tCAS & (1 << i))
626 tAA = i; 638 tAA = i;
627 639
628#define __DDR2_ROUND(scale, field) \ 640#define __DDR2_ROUND(scale, field) \
@@ -656,27 +668,28 @@ decode_ddr3(const struct sysctlnode *nod @@ -656,27 +668,28 @@ decode_ddr3(const struct sysctlnode *nod
656 * external_bus_width / internal_bus_width 668 * external_bus_width / internal_bus_width
657 * We further divide by 2**20 to get our answer in MB 669 * We further divide by 2**20 to get our answer in MB
658 */ 670 */
659 dimm_size = (s->sm_ddr3.ddr3_chipsize + 28 - 20) - 3 + 671 dimm_size = (s->sm_ddr3.ddr3_chipsize + 28 - 20) - 3 +
660 (s->sm_ddr3.ddr3_datawidth + 3) - 672 (s->sm_ddr3.ddr3_datawidth + 3) -
661 (s->sm_ddr3.ddr3_chipwidth + 2); 673 (s->sm_ddr3.ddr3_chipwidth + 2);
662 dimm_size = (1 << dimm_size) * (s->sm_ddr3.ddr3_physbanks + 1); 674 dimm_size = (1 << dimm_size) * (s->sm_ddr3.ddr3_physbanks + 1);
663 675
664 cycle_time = (1000 * s->sm_ddr3.ddr3_mtb_dividend +  676 cycle_time = (1000 * s->sm_ddr3.ddr3_mtb_dividend +
665 (s->sm_ddr3.ddr3_mtb_divisor / 2)) / 677 (s->sm_ddr3.ddr3_mtb_divisor / 2)) /
666 s->sm_ddr3.ddr3_mtb_divisor; 678 s->sm_ddr3.ddr3_mtb_divisor;
667 cycle_time *= s->sm_ddr3.ddr3_tCKmin; 679 cycle_time *= s->sm_ddr3.ddr3_tCKmin;
668 bits = 1 << (s->sm_ddr3.ddr3_datawidth + 3); 680 bits = 1 << (s->sm_ddr3.ddr3_datawidth + 3);
669 decode_size_speed(node, dimm_size, cycle_time, 2, bits, FALSE, "PC3", 0); 681 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, FALSE,
 682 "PC3", 0);
670 683
671 aprint_verbose_dev(self, 684 aprint_verbose_dev(self,
672 "%d rows, %d cols, %d log. banks, %d phys. banks, " 685 "%d rows, %d cols, %d log. banks, %d phys. banks, "
673 "%d.%03dns cycle time\n", 686 "%d.%03dns cycle time\n",
674 s->sm_ddr3.ddr3_rows + 9, s->sm_ddr3.ddr3_cols + 12, 687 s->sm_ddr3.ddr3_rows + 9, s->sm_ddr3.ddr3_cols + 12,
675 1 << (s->sm_ddr3.ddr3_logbanks + 3), 688 1 << (s->sm_ddr3.ddr3_logbanks + 3),
676 s->sm_ddr3.ddr3_physbanks + 1, 689 s->sm_ddr3.ddr3_physbanks + 1,
677 cycle_time/1000, cycle_time % 1000); 690 cycle_time/1000, cycle_time % 1000);
678 691
679#define __DDR3_CYCLES(field) (s->sm_ddr3.field / s->sm_ddr3.ddr3_tCKmin) 692#define __DDR3_CYCLES(field) (s->sm_ddr3.field / s->sm_ddr3.ddr3_tCKmin)
680 693
681 aprint_verbose_dev(self, latency, __DDR3_CYCLES(ddr3_tAAmin), 694 aprint_verbose_dev(self, latency, __DDR3_CYCLES(ddr3_tAAmin),
682 __DDR3_CYCLES(ddr3_tRCDmin), __DDR3_CYCLES(ddr3_tRPmin),  695 __DDR3_CYCLES(ddr3_tRCDmin), __DDR3_CYCLES(ddr3_tRPmin),
@@ -691,27 +704,28 @@ decode_fbdimm(const struct sysctlnode *n @@ -691,27 +704,28 @@ decode_fbdimm(const struct sysctlnode *n
691 int dimm_size, cycle_time, bits; 704 int dimm_size, cycle_time, bits;
692 705
693 /* 706 /*
694 * FB-DIMM module size calculation is very much like DDR3 707 * FB-DIMM module size calculation is very much like DDR3
695 */ 708 */
696 dimm_size = s->sm_fbd.fbdimm_rows + 12 + 709 dimm_size = s->sm_fbd.fbdimm_rows + 12 +
697 s->sm_fbd.fbdimm_cols + 9 - 20 - 3; 710 s->sm_fbd.fbdimm_cols + 9 - 20 - 3;
698 dimm_size = (1 << dimm_size) * (1 << (s->sm_fbd.fbdimm_banks + 2)); 711 dimm_size = (1 << dimm_size) * (1 << (s->sm_fbd.fbdimm_banks + 2));
699 712
700 cycle_time = (1000 * s->sm_fbd.fbdimm_mtb_dividend + 713 cycle_time = (1000 * s->sm_fbd.fbdimm_mtb_dividend +
701 (s->sm_fbd.fbdimm_mtb_divisor / 2)) / 714 (s->sm_fbd.fbdimm_mtb_divisor / 2)) /
702 s->sm_fbd.fbdimm_mtb_divisor; 715 s->sm_fbd.fbdimm_mtb_divisor;
703 bits = 1 << (s->sm_fbd.fbdimm_dev_width + 2); 716 bits = 1 << (s->sm_fbd.fbdimm_dev_width + 2);
704 decode_size_speed(node, dimm_size, cycle_time, 2, bits, TRUE, "PC2", 0); 717 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
 718 "PC2", 0);
705 719
706 aprint_verbose_dev(self, 720 aprint_verbose_dev(self,
707 "%d rows, %d cols, %d banks, %d.%02dns cycle time\n", 721 "%d rows, %d cols, %d banks, %d.%02dns cycle time\n",
708 s->sm_fbd.fbdimm_rows, s->sm_fbd.fbdimm_cols, 722 s->sm_fbd.fbdimm_rows, s->sm_fbd.fbdimm_cols,
709 1 << (s->sm_fbd.fbdimm_banks + 2), 723 1 << (s->sm_fbd.fbdimm_banks + 2),
710 cycle_time / 1000, (cycle_time % 1000 + 5) /10 ); 724 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
711 725
712#define __FBDIMM_CYCLES(field) (s->sm_fbd.field / s->sm_fbd.fbdimm_tCKmin) 726#define __FBDIMM_CYCLES(field) (s->sm_fbd.field / s->sm_fbd.fbdimm_tCKmin)
713 727
714 aprint_verbose_dev(self, latency, __FBDIMM_CYCLES(fbdimm_tAAmin), 728 aprint_verbose_dev(self, latency, __FBDIMM_CYCLES(fbdimm_tAAmin),
715 __FBDIMM_CYCLES(fbdimm_tRCDmin), __FBDIMM_CYCLES(fbdimm_tRPmin),  729 __FBDIMM_CYCLES(fbdimm_tRCDmin), __FBDIMM_CYCLES(fbdimm_tRPmin),
716 (s->sm_fbd.fbdimm_tRAS_msb * 256 + 730 (s->sm_fbd.fbdimm_tRAS_msb * 256 +
717 s->sm_fbd.fbdimm_tRAS_lsb) / 731 s->sm_fbd.fbdimm_tRAS_lsb) /

cvs diff -r1.1 -r1.2 src/sys/dev/ic/spdmemvar.h (expand / switch to unified diff)

--- src/sys/dev/ic/spdmemvar.h 2010/03/24 00:31:41 1.1
+++ src/sys/dev/ic/spdmemvar.h 2011/08/01 03:49:52 1.2
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: spdmemvar.h,v 1.1 2010/03/24 00:31:41 pgoyette Exp $ */ 1/* $NetBSD: spdmemvar.h,v 1.2 2011/08/01 03:49:52 pgoyette Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2007 Paul Goyette 4 * Copyright (c) 2007 Paul Goyette
5 * Copyright (c) 2007 Tobias Nygren 5 * Copyright (c) 2007 Tobias Nygren
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
11 * 1. Redistributions of source code must retain the above copyright 11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer. 12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright 13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the 14 * notice, this list of conditions and the following disclaimer in the
@@ -508,18 +508,20 @@ struct spdmem { @@ -508,18 +508,20 @@ struct spdmem {
508/* some fields are in the same place for all memory types */ 508/* some fields are in the same place for all memory types */
509 509
510#define sm_cksum sm_fpm.fpm_cksum 510#define sm_cksum sm_fpm.fpm_cksum
511#define sm_config sm_fpm.fpm_config 511#define sm_config sm_fpm.fpm_config
512#define sm_voltage sm_fpm.fpm_voltage 512#define sm_voltage sm_fpm.fpm_voltage
513#define sm_refresh sm_fpm.fpm_refresh 513#define sm_refresh sm_fpm.fpm_refresh
514#define sm_selfrefresh sm_fpm.fpm_selfrefresh 514#define sm_selfrefresh sm_fpm.fpm_selfrefresh
515 515
516#define SPDMEM_TYPE_MAXLEN 16 516#define SPDMEM_TYPE_MAXLEN 16
517 517
518struct spdmem_softc { 518struct spdmem_softc {
519 uint8_t (*sc_read)(struct spdmem_softc *, uint8_t); 519 uint8_t (*sc_read)(struct spdmem_softc *, uint8_t);
520 struct spdmem sc_spd_data; 520 struct spdmem sc_spd_data;
 521 struct sysctllog *sc_sysctl_log;
521 char sc_type[SPDMEM_TYPE_MAXLEN]; 522 char sc_type[SPDMEM_TYPE_MAXLEN];
522}; 523};
523 524
524int spdmem_common_probe(struct spdmem_softc *); 525int spdmem_common_probe(struct spdmem_softc *);
525void spdmem_common_attach(struct spdmem_softc *, device_t); 526void spdmem_common_attach(struct spdmem_softc *, device_t);
 527int spdmem_common_detach(struct spdmem_softc *, device_t);