18472SSean.Ye@Sun.COM /*
28472SSean.Ye@Sun.COM * CDDL HEADER START
38472SSean.Ye@Sun.COM *
48472SSean.Ye@Sun.COM * The contents of this file are subject to the terms of the
58472SSean.Ye@Sun.COM * Common Development and Distribution License (the "License").
68472SSean.Ye@Sun.COM * You may not use this file except in compliance with the License.
78472SSean.Ye@Sun.COM *
88472SSean.Ye@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
98472SSean.Ye@Sun.COM * or http://www.opensolaris.org/os/licensing.
108472SSean.Ye@Sun.COM * See the License for the specific language governing permissions
118472SSean.Ye@Sun.COM * and limitations under the License.
128472SSean.Ye@Sun.COM *
138472SSean.Ye@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
148472SSean.Ye@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
158472SSean.Ye@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
168472SSean.Ye@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
178472SSean.Ye@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
188472SSean.Ye@Sun.COM *
198472SSean.Ye@Sun.COM * CDDL HEADER END
208472SSean.Ye@Sun.COM */
218472SSean.Ye@Sun.COM
228472SSean.Ye@Sun.COM /*
238472SSean.Ye@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
248472SSean.Ye@Sun.COM * Use is subject to license terms.
258472SSean.Ye@Sun.COM */
268472SSean.Ye@Sun.COM
278472SSean.Ye@Sun.COM #include <sys/types.h>
288472SSean.Ye@Sun.COM #include <sys/cmn_err.h>
298472SSean.Ye@Sun.COM #include <sys/errno.h>
308472SSean.Ye@Sun.COM #include <sys/log.h>
318472SSean.Ye@Sun.COM #include <sys/systm.h>
328472SSean.Ye@Sun.COM #include <sys/modctl.h>
338472SSean.Ye@Sun.COM #include <sys/errorq.h>
348472SSean.Ye@Sun.COM #include <sys/controlregs.h>
358472SSean.Ye@Sun.COM #include <sys/fm/util.h>
368472SSean.Ye@Sun.COM #include <sys/fm/protocol.h>
378472SSean.Ye@Sun.COM #include <sys/sysevent.h>
388472SSean.Ye@Sun.COM #include <sys/pghw.h>
398472SSean.Ye@Sun.COM #include <sys/cyclic.h>
408472SSean.Ye@Sun.COM #include <sys/pci_cfgspace.h>
418472SSean.Ye@Sun.COM #include <sys/mc_intel.h>
428472SSean.Ye@Sun.COM #include <sys/cpu_module_impl.h>
438472SSean.Ye@Sun.COM #include <sys/smbios.h>
448472SSean.Ye@Sun.COM #include <sys/pci.h>
458472SSean.Ye@Sun.COM #include "intel_nhm.h"
468472SSean.Ye@Sun.COM #include "nhm_log.h"
478472SSean.Ye@Sun.COM
488472SSean.Ye@Sun.COM errorq_t *nhm_queue;
498472SSean.Ye@Sun.COM kmutex_t nhm_mutex;
508472SSean.Ye@Sun.COM uint32_t nhm_chipset;
518472SSean.Ye@Sun.COM
528472SSean.Ye@Sun.COM nhm_dimm_t **nhm_dimms;
538472SSean.Ye@Sun.COM
548472SSean.Ye@Sun.COM uint64_t nhm_memory_on_ctl[MAX_MEMORY_CONTROLLERS];
558472SSean.Ye@Sun.COM int nhm_patrol_scrub;
568472SSean.Ye@Sun.COM int nhm_demand_scrub;
578472SSean.Ye@Sun.COM int nhm_no_smbios;
588472SSean.Ye@Sun.COM int nhm_smbios_serial;
598472SSean.Ye@Sun.COM int nhm_smbios_manufacturer;
608472SSean.Ye@Sun.COM int nhm_smbios_part_number;
618472SSean.Ye@Sun.COM int nhm_smbios_version;
628472SSean.Ye@Sun.COM int nhm_smbios_label;
638472SSean.Ye@Sun.COM
648472SSean.Ye@Sun.COM extern char ecc_enabled;
658472SSean.Ye@Sun.COM extern void mem_reg_init(void);
668472SSean.Ye@Sun.COM
678472SSean.Ye@Sun.COM static void
check_serial_number()688472SSean.Ye@Sun.COM check_serial_number()
698472SSean.Ye@Sun.COM {
708472SSean.Ye@Sun.COM nhm_dimm_t *dimmp, *tp;
718472SSean.Ye@Sun.COM nhm_dimm_t **dimmpp, **tpp;
728472SSean.Ye@Sun.COM nhm_dimm_t **end;
738472SSean.Ye@Sun.COM int not_unique;
748472SSean.Ye@Sun.COM
758472SSean.Ye@Sun.COM end = &nhm_dimms[MAX_MEMORY_CONTROLLERS *
768472SSean.Ye@Sun.COM CHANNELS_PER_MEMORY_CONTROLLER * MAX_DIMMS_PER_CHANNEL];
778472SSean.Ye@Sun.COM for (dimmpp = nhm_dimms; dimmpp < end; dimmpp++) {
788472SSean.Ye@Sun.COM dimmp = *dimmpp;
798472SSean.Ye@Sun.COM if (dimmp == NULL)
808472SSean.Ye@Sun.COM continue;
818472SSean.Ye@Sun.COM not_unique = 0;
828472SSean.Ye@Sun.COM for (tpp = dimmpp + 1; tpp < end; tpp++) {
838472SSean.Ye@Sun.COM tp = *tpp;
848472SSean.Ye@Sun.COM if (tp == NULL)
858472SSean.Ye@Sun.COM continue;
868472SSean.Ye@Sun.COM if (strncmp(dimmp->serial_number, tp->serial_number,
878472SSean.Ye@Sun.COM sizeof (dimmp->serial_number)) == 0) {
888472SSean.Ye@Sun.COM not_unique = 1;
898472SSean.Ye@Sun.COM tp->serial_number[0] = 0;
908472SSean.Ye@Sun.COM }
918472SSean.Ye@Sun.COM }
928472SSean.Ye@Sun.COM if (not_unique)
938472SSean.Ye@Sun.COM dimmp->serial_number[0] = 0;
948472SSean.Ye@Sun.COM }
958472SSean.Ye@Sun.COM }
968472SSean.Ye@Sun.COM
978472SSean.Ye@Sun.COM static void
dimm_manufacture_data(smbios_hdl_t * shp,id_t id,nhm_dimm_t * dimmp)988472SSean.Ye@Sun.COM dimm_manufacture_data(smbios_hdl_t *shp, id_t id, nhm_dimm_t *dimmp)
998472SSean.Ye@Sun.COM {
1008472SSean.Ye@Sun.COM smbios_info_t cd;
1018472SSean.Ye@Sun.COM
1028472SSean.Ye@Sun.COM if (smbios_info_common(shp, id, &cd) == 0) {
1038472SSean.Ye@Sun.COM if (cd.smbi_serial && nhm_smbios_serial) {
1048472SSean.Ye@Sun.COM (void) strncpy(dimmp->serial_number, cd.smbi_serial,
1058472SSean.Ye@Sun.COM sizeof (dimmp->serial_number));
1068472SSean.Ye@Sun.COM }
1078472SSean.Ye@Sun.COM if (cd.smbi_manufacturer && nhm_smbios_manufacturer) {
1088472SSean.Ye@Sun.COM (void) strncpy(dimmp->manufacturer,
1098472SSean.Ye@Sun.COM cd.smbi_manufacturer,
1108472SSean.Ye@Sun.COM sizeof (dimmp->manufacturer));
1118472SSean.Ye@Sun.COM }
1128472SSean.Ye@Sun.COM if (cd.smbi_part && nhm_smbios_part_number) {
1138472SSean.Ye@Sun.COM (void) strncpy(dimmp->part_number, cd.smbi_part,
1148472SSean.Ye@Sun.COM sizeof (dimmp->part_number));
1158472SSean.Ye@Sun.COM }
1168472SSean.Ye@Sun.COM if (cd.smbi_version && nhm_smbios_version) {
1178472SSean.Ye@Sun.COM (void) strncpy(dimmp->revision, cd.smbi_version,
1188472SSean.Ye@Sun.COM sizeof (dimmp->revision));
1198472SSean.Ye@Sun.COM }
1208472SSean.Ye@Sun.COM }
1218472SSean.Ye@Sun.COM }
1228472SSean.Ye@Sun.COM
1238472SSean.Ye@Sun.COM struct dimm_slot {
1248472SSean.Ye@Sun.COM int controller;
1258472SSean.Ye@Sun.COM int channel;
1268472SSean.Ye@Sun.COM int dimm;
1278472SSean.Ye@Sun.COM int max_dimm;
1288472SSean.Ye@Sun.COM };
1298472SSean.Ye@Sun.COM
1308472SSean.Ye@Sun.COM static int
dimm_label(smbios_hdl_t * shp,const smbios_struct_t * sp,void * arg)1318472SSean.Ye@Sun.COM dimm_label(smbios_hdl_t *shp, const smbios_struct_t *sp, void *arg)
1328472SSean.Ye@Sun.COM {
1338472SSean.Ye@Sun.COM nhm_dimm_t *dimmp;
1348472SSean.Ye@Sun.COM smbios_memdevice_t md;
1358472SSean.Ye@Sun.COM int slot;
1368472SSean.Ye@Sun.COM int last_slot;
1378472SSean.Ye@Sun.COM struct dimm_slot *dsp = (struct dimm_slot *)arg;
1388472SSean.Ye@Sun.COM
1398472SSean.Ye@Sun.COM slot = (dsp->controller * CHANNELS_PER_MEMORY_CONTROLLER *
1408472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL) + (dsp->channel * MAX_DIMMS_PER_CHANNEL) +
1418472SSean.Ye@Sun.COM dsp->dimm;
1428472SSean.Ye@Sun.COM last_slot = MAX_MEMORY_CONTROLLERS * CHANNELS_PER_MEMORY_CONTROLLER *
1438472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL;
1448472SSean.Ye@Sun.COM if (slot >= last_slot)
1458472SSean.Ye@Sun.COM return (0);
1468472SSean.Ye@Sun.COM dimmp = nhm_dimms[slot];
1478472SSean.Ye@Sun.COM if (sp->smbstr_type == SMB_TYPE_MEMDEVICE) {
1488472SSean.Ye@Sun.COM if (smbios_info_memdevice(shp, sp->smbstr_id,
1498472SSean.Ye@Sun.COM &md) == 0 && md.smbmd_dloc != NULL) {
1508472SSean.Ye@Sun.COM if (dimmp == NULL && md.smbmd_size) {
1518472SSean.Ye@Sun.COM /* skip non existent slot */
1528472SSean.Ye@Sun.COM dsp->channel++;
1538472SSean.Ye@Sun.COM if (dsp->dimm == 2)
1548472SSean.Ye@Sun.COM dsp->max_dimm = 2;
1558472SSean.Ye@Sun.COM dsp->dimm = 0;
1568472SSean.Ye@Sun.COM slot = (dsp->controller *
1578472SSean.Ye@Sun.COM CHANNELS_PER_MEMORY_CONTROLLER *
1588472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL) +
1598472SSean.Ye@Sun.COM (dsp->channel * MAX_DIMMS_PER_CHANNEL);
1608472SSean.Ye@Sun.COM if (slot >= last_slot)
1618472SSean.Ye@Sun.COM return (0);
1628472SSean.Ye@Sun.COM
1638472SSean.Ye@Sun.COM dimmp = nhm_dimms[slot];
1648472SSean.Ye@Sun.COM
1658472SSean.Ye@Sun.COM if (dimmp == NULL) {
1668472SSean.Ye@Sun.COM dsp->channel++;
1678472SSean.Ye@Sun.COM if (dsp->channel ==
1688472SSean.Ye@Sun.COM CHANNELS_PER_MEMORY_CONTROLLER) {
1698472SSean.Ye@Sun.COM dsp->channel = 0;
1708472SSean.Ye@Sun.COM dsp->controller++;
1718472SSean.Ye@Sun.COM }
1728472SSean.Ye@Sun.COM slot = (dsp->controller *
1738472SSean.Ye@Sun.COM CHANNELS_PER_MEMORY_CONTROLLER *
1748472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL) +
1758472SSean.Ye@Sun.COM (dsp->channel *
1768472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL);
1778472SSean.Ye@Sun.COM if (slot >= last_slot)
1788472SSean.Ye@Sun.COM return (0);
1798472SSean.Ye@Sun.COM dimmp = nhm_dimms[slot];
1808472SSean.Ye@Sun.COM }
1818472SSean.Ye@Sun.COM }
1828472SSean.Ye@Sun.COM if (dimmp) {
1838472SSean.Ye@Sun.COM if (nhm_smbios_label)
1848472SSean.Ye@Sun.COM (void) snprintf(dimmp->label,
1858472SSean.Ye@Sun.COM sizeof (dimmp->label), "%s",
1868472SSean.Ye@Sun.COM md.smbmd_dloc);
1878472SSean.Ye@Sun.COM dimm_manufacture_data(shp, sp->smbstr_id,
1888472SSean.Ye@Sun.COM dimmp);
1898472SSean.Ye@Sun.COM }
1908472SSean.Ye@Sun.COM }
1918472SSean.Ye@Sun.COM dsp->dimm++;
1928472SSean.Ye@Sun.COM if (dsp->dimm == dsp->max_dimm) {
1938472SSean.Ye@Sun.COM dsp->dimm = 0;
1948472SSean.Ye@Sun.COM dsp->channel++;
1958472SSean.Ye@Sun.COM if (dsp->channel == CHANNELS_PER_MEMORY_CONTROLLER) {
1968472SSean.Ye@Sun.COM dsp->channel = 0;
1978472SSean.Ye@Sun.COM dsp->controller++;
1988472SSean.Ye@Sun.COM }
1998472SSean.Ye@Sun.COM }
2008472SSean.Ye@Sun.COM }
2018472SSean.Ye@Sun.COM return (0);
2028472SSean.Ye@Sun.COM }
2038472SSean.Ye@Sun.COM
2048472SSean.Ye@Sun.COM void
nhm_smbios()2058472SSean.Ye@Sun.COM nhm_smbios()
2068472SSean.Ye@Sun.COM {
2078472SSean.Ye@Sun.COM struct dimm_slot ds;
2088472SSean.Ye@Sun.COM
2098472SSean.Ye@Sun.COM if (ksmbios != NULL && nhm_no_smbios == 0) {
2108472SSean.Ye@Sun.COM ds.dimm = 0;
2118472SSean.Ye@Sun.COM ds.channel = 0;
2128472SSean.Ye@Sun.COM ds.controller = 0;
2138472SSean.Ye@Sun.COM ds.max_dimm = MAX_DIMMS_PER_CHANNEL;
2148472SSean.Ye@Sun.COM (void) smbios_iter(ksmbios, dimm_label, &ds);
2158472SSean.Ye@Sun.COM check_serial_number();
2168472SSean.Ye@Sun.COM }
2178472SSean.Ye@Sun.COM }
2188472SSean.Ye@Sun.COM
2198472SSean.Ye@Sun.COM static void
dimm_prop(nhm_dimm_t * dimmp,uint32_t dod)2208472SSean.Ye@Sun.COM dimm_prop(nhm_dimm_t *dimmp, uint32_t dod)
2218472SSean.Ye@Sun.COM {
2228472SSean.Ye@Sun.COM dimmp->dimm_size = DIMMSIZE(dod);
2238472SSean.Ye@Sun.COM dimmp->nranks = NUMRANK(dod);
2248472SSean.Ye@Sun.COM dimmp->nbanks = NUMBANK(dod);
2258472SSean.Ye@Sun.COM dimmp->ncolumn = NUMCOL(dod);
2268472SSean.Ye@Sun.COM dimmp->nrow = NUMROW(dod);
2278472SSean.Ye@Sun.COM dimmp->width = DIMMWIDTH;
2288472SSean.Ye@Sun.COM }
2298472SSean.Ye@Sun.COM
2308472SSean.Ye@Sun.COM void
nhm_scrubber_enable()2318472SSean.Ye@Sun.COM nhm_scrubber_enable()
2328472SSean.Ye@Sun.COM {
2338472SSean.Ye@Sun.COM uint32_t mc_ssrcontrol;
2348472SSean.Ye@Sun.COM uint32_t mc_dimm_clk_ratio_status;
2358472SSean.Ye@Sun.COM uint64_t cycle_time;
2368472SSean.Ye@Sun.COM uint32_t interval;
237*10556SAdrian.Frost@Sun.COM uint32_t id;
2388472SSean.Ye@Sun.COM int i;
2398472SSean.Ye@Sun.COM int hw_scrub = 0;
2408472SSean.Ye@Sun.COM
2418472SSean.Ye@Sun.COM if (ecc_enabled && (nhm_patrol_scrub || nhm_demand_scrub)) {
2428472SSean.Ye@Sun.COM for (i = 0; i < MAX_MEMORY_CONTROLLERS; i++) {
243*10556SAdrian.Frost@Sun.COM id = MC_CPU_RAS_RD(i);
244*10556SAdrian.Frost@Sun.COM if ((id != NHM_CPU_RAS && id != NHM_JF_CPU_RAS &&
245*10556SAdrian.Frost@Sun.COM id != NHM_WM_CPU_RAS) || nhm_memory_on_ctl[i] == 0)
2468472SSean.Ye@Sun.COM continue;
2478472SSean.Ye@Sun.COM mc_ssrcontrol = MC_SSR_CONTROL_RD(i);
2488472SSean.Ye@Sun.COM if (nhm_demand_scrub &&
2498472SSean.Ye@Sun.COM (mc_ssrcontrol & DEMAND_SCRUB_ENABLE) == 0) {
2508472SSean.Ye@Sun.COM mc_ssrcontrol |= DEMAND_SCRUB_ENABLE;
2518472SSean.Ye@Sun.COM MC_SSR_CONTROL_WR(i, mc_ssrcontrol);
2528472SSean.Ye@Sun.COM }
2538472SSean.Ye@Sun.COM if (nhm_patrol_scrub == 0)
2548472SSean.Ye@Sun.COM continue;
2558472SSean.Ye@Sun.COM if (SSR_MODE(mc_ssrcontrol) == SSR_IDLE) {
2568472SSean.Ye@Sun.COM mc_dimm_clk_ratio_status =
2578472SSean.Ye@Sun.COM MC_DIMM_CLK_RATIO_STATUS(i);
2588472SSean.Ye@Sun.COM cycle_time =
2598472SSean.Ye@Sun.COM MAX_DIMM_CLK_RATIO(mc_dimm_clk_ratio_status)
2608472SSean.Ye@Sun.COM * 80000000;
2618472SSean.Ye@Sun.COM interval = (uint32_t)((36400ULL * cycle_time) /
2628472SSean.Ye@Sun.COM (nhm_memory_on_ctl[i]/64));
2638472SSean.Ye@Sun.COM MC_SCRUB_CONTROL_WR(i, STARTSCRUB | interval);
2648472SSean.Ye@Sun.COM MC_SSR_CONTROL_WR(i, mc_ssrcontrol | SSR_SCRUB);
2658472SSean.Ye@Sun.COM } else if (SSR_MODE(mc_ssrcontrol) == SSR_SPARE) {
2668472SSean.Ye@Sun.COM hw_scrub = 0;
2678472SSean.Ye@Sun.COM break;
2688472SSean.Ye@Sun.COM }
2698472SSean.Ye@Sun.COM hw_scrub = 1;
2708472SSean.Ye@Sun.COM }
2718472SSean.Ye@Sun.COM if (hw_scrub)
2728472SSean.Ye@Sun.COM cmi_mc_sw_memscrub_disable();
2738472SSean.Ye@Sun.COM }
2748472SSean.Ye@Sun.COM }
2758472SSean.Ye@Sun.COM
2768472SSean.Ye@Sun.COM void
init_dimms()2778472SSean.Ye@Sun.COM init_dimms()
2788472SSean.Ye@Sun.COM {
2798472SSean.Ye@Sun.COM int i, j, k;
2808472SSean.Ye@Sun.COM nhm_dimm_t **dimmpp;
2818472SSean.Ye@Sun.COM nhm_dimm_t *dimmp;
2828472SSean.Ye@Sun.COM uint32_t dod;
2838977SAdrian.Frost@Sun.COM uint32_t did;
2848472SSean.Ye@Sun.COM
2858472SSean.Ye@Sun.COM nhm_dimms = (nhm_dimm_t **)kmem_zalloc(sizeof (nhm_dimm_t *) *
2868472SSean.Ye@Sun.COM MAX_MEMORY_CONTROLLERS * CHANNELS_PER_MEMORY_CONTROLLER *
2878472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL, KM_SLEEP);
2888472SSean.Ye@Sun.COM dimmpp = nhm_dimms;
2898472SSean.Ye@Sun.COM for (i = 0; i < MAX_MEMORY_CONTROLLERS; i++) {
2908977SAdrian.Frost@Sun.COM did = CPU_ID_RD(i);
291*10556SAdrian.Frost@Sun.COM if (did != NHM_EP_CPU && did != NHM_WS_CPU &&
292*10556SAdrian.Frost@Sun.COM did != NHM_JF_CPU && did != NHM_WM_CPU) {
2938472SSean.Ye@Sun.COM dimmpp += CHANNELS_PER_MEMORY_CONTROLLER *
2948472SSean.Ye@Sun.COM MAX_DIMMS_PER_CHANNEL;
2958472SSean.Ye@Sun.COM continue;
2968472SSean.Ye@Sun.COM }
2978472SSean.Ye@Sun.COM for (j = 0; j < CHANNELS_PER_MEMORY_CONTROLLER; j++) {
2988472SSean.Ye@Sun.COM for (k = 0; k < MAX_DIMMS_PER_CHANNEL; k++) {
2998472SSean.Ye@Sun.COM dod = MC_DOD_RD(i, j, k);
3008472SSean.Ye@Sun.COM if (DIMMPRESENT(dod)) {
3018472SSean.Ye@Sun.COM dimmp = (nhm_dimm_t *)
3028472SSean.Ye@Sun.COM kmem_zalloc(sizeof (nhm_dimm_t),
3038472SSean.Ye@Sun.COM KM_SLEEP);
3048472SSean.Ye@Sun.COM dimm_prop(dimmp, dod);
3058472SSean.Ye@Sun.COM (void) snprintf(dimmp->label,
3068472SSean.Ye@Sun.COM sizeof (dimmp->label),
3078472SSean.Ye@Sun.COM "Socket %d channel %d dimm %d",
3088472SSean.Ye@Sun.COM i, j, k);
3098472SSean.Ye@Sun.COM *dimmpp = dimmp;
3108472SSean.Ye@Sun.COM nhm_memory_on_ctl[i] +=
3118472SSean.Ye@Sun.COM dimmp->dimm_size;
3128472SSean.Ye@Sun.COM }
3138472SSean.Ye@Sun.COM dimmpp++;
3148472SSean.Ye@Sun.COM }
3158472SSean.Ye@Sun.COM }
3168472SSean.Ye@Sun.COM }
3178472SSean.Ye@Sun.COM }
3188472SSean.Ye@Sun.COM
3198472SSean.Ye@Sun.COM
3208472SSean.Ye@Sun.COM int
nhm_init(void)3218472SSean.Ye@Sun.COM nhm_init(void)
3228472SSean.Ye@Sun.COM {
3238472SSean.Ye@Sun.COM int slot;
3248472SSean.Ye@Sun.COM
3258472SSean.Ye@Sun.COM /* return ENOTSUP if there is no PCI config space support. */
3268472SSean.Ye@Sun.COM if (pci_getl_func == NULL)
3278472SSean.Ye@Sun.COM return (ENOTSUP);
3288472SSean.Ye@Sun.COM for (slot = 0; slot < MAX_CPU_NODES; slot++) {
3298472SSean.Ye@Sun.COM nhm_chipset = CPU_ID_RD(slot);
330*10556SAdrian.Frost@Sun.COM if (nhm_chipset == NHM_EP_CPU || nhm_chipset == NHM_WS_CPU ||
331*10556SAdrian.Frost@Sun.COM nhm_chipset == NHM_JF_CPU || nhm_chipset == NHM_WM_CPU)
3328472SSean.Ye@Sun.COM break;
3338472SSean.Ye@Sun.COM }
334*10556SAdrian.Frost@Sun.COM if (slot == MAX_CPU_NODES) {
3358472SSean.Ye@Sun.COM return (ENOTSUP);
3368472SSean.Ye@Sun.COM }
3378472SSean.Ye@Sun.COM mem_reg_init();
3388472SSean.Ye@Sun.COM return (0);
3398472SSean.Ye@Sun.COM }
3408472SSean.Ye@Sun.COM
3418472SSean.Ye@Sun.COM int
nhm_reinit(void)3428472SSean.Ye@Sun.COM nhm_reinit(void)
3438472SSean.Ye@Sun.COM {
3448472SSean.Ye@Sun.COM mem_reg_init();
3458472SSean.Ye@Sun.COM return (0);
3468472SSean.Ye@Sun.COM }
3478472SSean.Ye@Sun.COM
3488472SSean.Ye@Sun.COM int
nhm_dev_init()3498472SSean.Ye@Sun.COM nhm_dev_init()
3508472SSean.Ye@Sun.COM {
3518472SSean.Ye@Sun.COM return (0);
3528472SSean.Ye@Sun.COM }
3538472SSean.Ye@Sun.COM
3548472SSean.Ye@Sun.COM void
nhm_dev_reinit()3558472SSean.Ye@Sun.COM nhm_dev_reinit()
3568472SSean.Ye@Sun.COM {
3578472SSean.Ye@Sun.COM }
3588472SSean.Ye@Sun.COM
3598472SSean.Ye@Sun.COM void
nhm_unload()3608472SSean.Ye@Sun.COM nhm_unload()
3618472SSean.Ye@Sun.COM {
3628472SSean.Ye@Sun.COM }
363