13325Ssd77468 /*
23325Ssd77468 * CDDL HEADER START
33325Ssd77468 *
43325Ssd77468 * The contents of this file are subject to the terms of the
53325Ssd77468 * Common Development and Distribution License (the "License").
63325Ssd77468 * You may not use this file except in compliance with the License.
73325Ssd77468 *
83325Ssd77468 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93325Ssd77468 * or http://www.opensolaris.org/os/licensing.
103325Ssd77468 * See the License for the specific language governing permissions
113325Ssd77468 * and limitations under the License.
123325Ssd77468 *
133325Ssd77468 * When distributing Covered Code, include this CDDL HEADER in each
143325Ssd77468 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153325Ssd77468 * If applicable, add the following below this CDDL HEADER, with the
163325Ssd77468 * fields enclosed by brackets "[]" replaced with your own identifying
173325Ssd77468 * information: Portions Copyright [yyyy] [name of copyright owner]
183325Ssd77468 *
193325Ssd77468 * CDDL HEADER END
203325Ssd77468 */
213325Ssd77468
223325Ssd77468 /*
23*10462SSean.Ye@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
243325Ssd77468 * Use is subject to license terms.
253325Ssd77468 */
263325Ssd77468
273325Ssd77468 #include <stdio.h>
283681Svn83148 #include <stdlib.h>
293325Ssd77468 #include <strings.h>
303325Ssd77468 #include <sys/types.h>
313325Ssd77468 #include <fm/topo_mod.h>
326828Stsien #include <fm/topo_hc.h>
333325Ssd77468 #include <sys/fm/protocol.h>
343325Ssd77468
353325Ssd77468 #include <unistd.h>
363325Ssd77468 #include <sys/param.h>
373325Ssd77468 #include <sys/stat.h>
383325Ssd77468 #include <fcntl.h>
393325Ssd77468 #include <umem.h>
403325Ssd77468
413681Svn83148 #include <cpu_mdesc.h>
423325Ssd77468
433325Ssd77468
443325Ssd77468 /*
453325Ssd77468 * Enumerates the processing chips, or sockets, (as distinct from cores) in a
463325Ssd77468 * system. For each chip found, the necessary nodes (one or more cores, and
473325Ssd77468 * possibly a memory controller) are constructed underneath.
483325Ssd77468 */
493325Ssd77468
503325Ssd77468 #define CHIP_VERSION TOPO_VERSION
513325Ssd77468 #define CPU_NODE_NAME "cpu"
523325Ssd77468 #define CHIP_NODE_NAME "chip"
533325Ssd77468
548221SSean.Ye@Sun.COM extern topo_method_t pi_cpu_methods[];
558221SSean.Ye@Sun.COM
563325Ssd77468 /* Forward declaration */
573325Ssd77468 static int chip_enum(topo_mod_t *, tnode_t *, const char *, topo_instance_t,
583325Ssd77468 topo_instance_t, void *, void *);
593325Ssd77468 static void chip_release(topo_mod_t *, tnode_t *);
603325Ssd77468
613325Ssd77468 static const topo_modops_t chip_ops =
623325Ssd77468 { chip_enum, chip_release };
633325Ssd77468 static const topo_modinfo_t chip_info =
643325Ssd77468 { "chip", FM_FMRI_SCHEME_HC, CHIP_VERSION, &chip_ops };
653325Ssd77468
663325Ssd77468
673325Ssd77468 static const topo_pgroup_info_t chip_auth_pgroup = {
683325Ssd77468 FM_FMRI_AUTHORITY,
693325Ssd77468 TOPO_STABILITY_PRIVATE,
703325Ssd77468 TOPO_STABILITY_PRIVATE,
713325Ssd77468 1
723325Ssd77468 };
733325Ssd77468
743325Ssd77468 int
_topo_init(topo_mod_t * mod)753325Ssd77468 _topo_init(topo_mod_t *mod)
763325Ssd77468 {
773681Svn83148 md_info_t *chip;
783325Ssd77468
793325Ssd77468 if (getenv("TOPOCHIPDBG"))
803325Ssd77468 topo_mod_setdebug(mod);
813325Ssd77468 topo_mod_dprintf(mod, "initializing chip enumerator\n");
823325Ssd77468
833681Svn83148 if ((chip = topo_mod_zalloc(mod, sizeof (md_info_t))) == NULL)
843325Ssd77468 return (-1);
853325Ssd77468
863325Ssd77468 if (cpu_mdesc_init(mod, chip) != 0) {
873325Ssd77468 topo_mod_dprintf(mod, "failed to get cpus from the PRI/MD\n");
883681Svn83148 topo_mod_free(mod, chip, sizeof (md_info_t));
893325Ssd77468 return (-1);
903325Ssd77468 }
913325Ssd77468
923681Svn83148 topo_mod_setspecific(mod, (void *)chip);
933681Svn83148
943325Ssd77468 if (topo_mod_register(mod, &chip_info, TOPO_VERSION) != 0) {
953325Ssd77468 topo_mod_dprintf(mod, "failed to register hc: "
963325Ssd77468 "%s\n", topo_mod_errmsg(mod));
973681Svn83148 cpu_mdesc_fini(mod, chip);
983681Svn83148 topo_mod_free(mod, chip, sizeof (md_info_t));
993325Ssd77468 return (-1);
1003325Ssd77468 }
1013325Ssd77468
1023325Ssd77468 topo_mod_dprintf(mod, "chip enumerator inited\n");
1033325Ssd77468
1043325Ssd77468 return (0);
1053325Ssd77468 }
1063325Ssd77468
1073325Ssd77468 void
_topo_fini(topo_mod_t * mod)1083325Ssd77468 _topo_fini(topo_mod_t *mod)
1093325Ssd77468 {
1103681Svn83148 md_info_t *chip;
1113325Ssd77468
1123681Svn83148 chip = (md_info_t *)topo_mod_getspecific(mod);
1133325Ssd77468
1143681Svn83148 cpu_mdesc_fini(mod, chip);
1153325Ssd77468
1163681Svn83148 topo_mod_free(mod, chip, sizeof (md_info_t));
1173325Ssd77468
1183325Ssd77468 topo_mod_unregister(mod);
1193325Ssd77468 }
1203325Ssd77468
1213325Ssd77468 static tnode_t *
chip_tnode_create(topo_mod_t * mod,tnode_t * parent,const char * name,topo_instance_t i,char * serial,nvlist_t * fru,char * label,void * priv)1223325Ssd77468 chip_tnode_create(topo_mod_t *mod, tnode_t *parent,
1233530Srb144127 const char *name, topo_instance_t i, char *serial,
1243530Srb144127 nvlist_t *fru, char *label, void *priv)
1253325Ssd77468 {
1263325Ssd77468 int err;
1273325Ssd77468 nvlist_t *fmri;
1283325Ssd77468 tnode_t *ntn;
129*10462SSean.Ye@Sun.COM char *prod = NULL, *psn = NULL, *csn = NULL, *server = NULL;
1303325Ssd77468 nvlist_t *auth = NULL;
1313325Ssd77468
1323325Ssd77468 if (topo_mod_nvalloc(mod, &auth, NV_UNIQUE_NAME) == 0) {
1333325Ssd77468 if (topo_prop_get_string(parent, FM_FMRI_AUTHORITY,
1344655Svn83148 FM_FMRI_AUTH_PRODUCT, &prod, &err) == 0) {
1353681Svn83148 (void) nvlist_add_string(auth, FM_FMRI_AUTH_PRODUCT,
1364655Svn83148 prod);
1373681Svn83148 topo_mod_strfree(mod, prod);
1383681Svn83148 }
1393325Ssd77468 if (topo_prop_get_string(parent, FM_FMRI_AUTHORITY,
140*10462SSean.Ye@Sun.COM FM_FMRI_AUTH_PRODUCT_SN, &psn, &err) == 0) {
141*10462SSean.Ye@Sun.COM (void) nvlist_add_string(auth, FM_FMRI_AUTH_PRODUCT_SN,
142*10462SSean.Ye@Sun.COM psn);
143*10462SSean.Ye@Sun.COM topo_mod_strfree(mod, psn);
144*10462SSean.Ye@Sun.COM }
145*10462SSean.Ye@Sun.COM if (topo_prop_get_string(parent, FM_FMRI_AUTHORITY,
1464655Svn83148 FM_FMRI_AUTH_SERVER, &server, &err) == 0) {
1473325Ssd77468 (void) nvlist_add_string(auth, FM_FMRI_AUTH_SERVER,
1484655Svn83148 server);
1493681Svn83148 topo_mod_strfree(mod, server);
1503681Svn83148 }
1513325Ssd77468 if (topo_prop_get_string(parent, FM_FMRI_AUTHORITY,
1524655Svn83148 FM_FMRI_AUTH_CHASSIS, &csn, &err) == 0) {
1533325Ssd77468 (void) nvlist_add_string(auth, FM_FMRI_AUTH_CHASSIS,
1544655Svn83148 csn);
1553681Svn83148 topo_mod_strfree(mod, csn);
1563681Svn83148 }
1573325Ssd77468 }
1583325Ssd77468
1593325Ssd77468
1603325Ssd77468 fmri = topo_mod_hcfmri(mod, parent, FM_HC_SCHEME_VERSION, name, i,
1613325Ssd77468 NULL, auth, NULL, NULL, serial);
1623325Ssd77468 nvlist_free(auth);
1633325Ssd77468 if (fmri == NULL) {
1643325Ssd77468 topo_mod_dprintf(mod,
1653325Ssd77468 "Unable to make nvlist for %s bind: %s.\n",
1663325Ssd77468 name, topo_mod_errmsg(mod));
1673325Ssd77468 return (NULL);
1683325Ssd77468 }
1693325Ssd77468
1703325Ssd77468 ntn = topo_node_bind(mod, parent, name, i, fmri);
1713325Ssd77468 if (ntn == NULL) {
1723325Ssd77468 topo_mod_dprintf(mod,
1733325Ssd77468 "topo_node_bind (%s%d/%s%d) failed: %s\n",
1743325Ssd77468 topo_node_name(parent), topo_node_instance(parent),
1753325Ssd77468 name, i,
1763325Ssd77468 topo_strerror(topo_mod_errno(mod)));
1773325Ssd77468 nvlist_free(fmri);
1783325Ssd77468 return (NULL);
1793325Ssd77468 }
1803325Ssd77468 nvlist_free(fmri);
1813325Ssd77468 topo_node_setspecific(ntn, priv);
1823325Ssd77468
1833325Ssd77468 if (topo_pgroup_create(ntn, &chip_auth_pgroup, &err) == 0) {
1843325Ssd77468 (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
1853325Ssd77468 FM_FMRI_AUTH_PRODUCT, &err);
1863325Ssd77468 (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
187*10462SSean.Ye@Sun.COM FM_FMRI_AUTH_PRODUCT_SN, &err);
188*10462SSean.Ye@Sun.COM (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
1893325Ssd77468 FM_FMRI_AUTH_CHASSIS, &err);
1903325Ssd77468 (void) topo_prop_inherit(ntn, FM_FMRI_AUTHORITY,
1913325Ssd77468 FM_FMRI_AUTH_SERVER, &err);
1923325Ssd77468 }
1933325Ssd77468
1943325Ssd77468 /* Inherit the Label FRU fields from the parent */
1953530Srb144127 (void) topo_node_label_set(ntn, label, &err);
1963530Srb144127 (void) topo_node_fru_set(ntn, fru, 0, &err);
1973325Ssd77468
1988221SSean.Ye@Sun.COM /* Register retire methods */
1998221SSean.Ye@Sun.COM if (topo_method_register(mod, ntn, pi_cpu_methods) < 0)
2008221SSean.Ye@Sun.COM topo_mod_dprintf(mod, "Unsable to register retire methods "
2018221SSean.Ye@Sun.COM "for %s%d/%s%d: %s\n",
2028221SSean.Ye@Sun.COM topo_node_name(parent), topo_node_instance(parent),
2038221SSean.Ye@Sun.COM name, i, topo_mod_errmsg(mod));
2048221SSean.Ye@Sun.COM
2053325Ssd77468 return (ntn);
2063325Ssd77468 }
2073325Ssd77468
2083325Ssd77468 static nvlist_t *
cpu_fmri_create(topo_mod_t * mod,uint32_t cpuid,char * serial,uint8_t cpumask)2093325Ssd77468 cpu_fmri_create(topo_mod_t *mod, uint32_t cpuid, char *serial, uint8_t cpumask)
2103325Ssd77468 {
2113325Ssd77468 int err;
2123325Ssd77468 nvlist_t *fmri;
2133325Ssd77468
2143325Ssd77468 if (topo_mod_nvalloc(mod, &fmri, NV_UNIQUE_NAME) != 0)
2153325Ssd77468 return (NULL);
2163325Ssd77468 err = nvlist_add_uint8(fmri, FM_VERSION, FM_CPU_SCHEME_VERSION);
2173325Ssd77468 err |= nvlist_add_string(fmri, FM_FMRI_SCHEME, FM_FMRI_SCHEME_CPU);
2183325Ssd77468 err |= nvlist_add_uint32(fmri, FM_FMRI_CPU_ID, cpuid);
2193325Ssd77468 err |= nvlist_add_uint8(fmri, FM_FMRI_CPU_MASK, cpumask);
2203325Ssd77468 if (serial != NULL)
2213325Ssd77468 err |= nvlist_add_string(fmri, FM_FMRI_CPU_SERIAL_ID, serial);
2223325Ssd77468 if (err != 0) {
2233325Ssd77468 nvlist_free(fmri);
2243325Ssd77468 (void) topo_mod_seterrno(mod, EMOD_FMRI_NVL);
2253325Ssd77468 return (NULL);
2263325Ssd77468 }
2273325Ssd77468
2283325Ssd77468 return (fmri);
2293325Ssd77468 }
2303325Ssd77468
2313325Ssd77468 /*ARGSUSED*/
2323325Ssd77468 static int
cpu_create(topo_mod_t * mod,tnode_t * rnode,const char * name,md_info_t * chip,uint64_t serial)2333681Svn83148 cpu_create(topo_mod_t *mod, tnode_t *rnode, const char *name, md_info_t *chip,
2345430Ssd77468 uint64_t serial)
2353325Ssd77468 {
2363325Ssd77468 int i;
2373325Ssd77468 int min = -1;
2383325Ssd77468 int max = -1;
2393325Ssd77468 int err;
2403325Ssd77468 int nerr = 0;
2413325Ssd77468 int pid;
2423325Ssd77468 char sbuf[32];
2433325Ssd77468 tnode_t *cnode;
2443325Ssd77468 nvlist_t *asru;
2453681Svn83148 md_cpumap_t *mcmp;
2463325Ssd77468
2473325Ssd77468 topo_mod_dprintf(mod, "enumerating cpus\n");
2483325Ssd77468
2493325Ssd77468 /*
2503325Ssd77468 * find the min/max id of cpus per this cmp and create a cpu range
2513325Ssd77468 */
2523681Svn83148 for (i = 0, mcmp = chip->cpus; i < chip->ncpus; i++, mcmp++) {
2535430Ssd77468 if (mcmp->cpumap_serialno != serial)
2543325Ssd77468 continue;
2553681Svn83148 if ((min < 0) || (mcmp->cpumap_pid < min))
2563681Svn83148 min = mcmp->cpumap_pid;
2573681Svn83148 if ((max < 0) || (mcmp->cpumap_pid > max))
2583681Svn83148 max = mcmp->cpumap_pid;
2593325Ssd77468 }
2605430Ssd77468 if (min < 0 || max < 0) {
2615430Ssd77468 topo_mod_dprintf(mod, "Invalid cpu range(%d,%d)\n", min, max);
2623325Ssd77468 return (-1);
2635430Ssd77468 }
2643325Ssd77468 if (topo_node_range_create(mod, rnode, name, 0, max+1) < 0) {
2653325Ssd77468 topo_mod_dprintf(mod, "failed to create cpu range[0,%d]: %s\n",
2664655Svn83148 max, topo_mod_errmsg(mod));
2673325Ssd77468 return (-1);
2683325Ssd77468 }
2693325Ssd77468
2705430Ssd77468 (void) snprintf(sbuf, sizeof (sbuf), "%llx", serial);
2713325Ssd77468
2723325Ssd77468 /*
2735430Ssd77468 * Create the cpu[i] nodes of a given cmp i
2743325Ssd77468 */
2753681Svn83148 for (i = 0, mcmp = chip->cpus; i < chip->ncpus; i++, mcmp++) {
2763325Ssd77468
2775430Ssd77468 if (mcmp->cpumap_serialno == 0 ||
2785430Ssd77468 mcmp->cpumap_serialno != serial) {
2793325Ssd77468 continue;
2803325Ssd77468 }
2813325Ssd77468
2823325Ssd77468 /* physical cpuid */
2833681Svn83148 pid = mcmp->cpumap_pid;
2843325Ssd77468 cnode = chip_tnode_create(mod, rnode, name,
2854655Svn83148 (topo_instance_t)pid, sbuf, NULL, NULL, NULL);
2863325Ssd77468 if (cnode == NULL) {
2873325Ssd77468 topo_mod_dprintf(mod,
2884655Svn83148 "failed to create a cpu=%d node: %s\n",
2894655Svn83148 pid, topo_mod_errmsg(mod));
2903325Ssd77468 nerr++;
2913325Ssd77468 continue;
2923325Ssd77468 }
2933325Ssd77468
2943325Ssd77468 if ((asru = cpu_fmri_create(mod, pid, sbuf, 0)) != NULL) {
2953325Ssd77468 (void) topo_node_asru_set(cnode, asru, 0, &err);
2963325Ssd77468 nvlist_free(asru);
2973325Ssd77468 } else {
2983325Ssd77468 nerr++;
2993325Ssd77468 }
3003325Ssd77468 }
3013325Ssd77468
3023325Ssd77468 if (nerr != 0)
3033325Ssd77468 (void) topo_mod_seterrno(mod, EMOD_PARTIAL_ENUM);
3043325Ssd77468
3053325Ssd77468 return (0);
3063325Ssd77468 }
3073325Ssd77468
3086828Stsien static int
dimm_instantiate(tnode_t * parent,const char * name,topo_mod_t * mod)3096828Stsien dimm_instantiate(tnode_t *parent, const char *name, topo_mod_t *mod)
3106828Stsien {
3116828Stsien if (strcmp(name, CHIP) != 0) {
3126828Stsien topo_mod_dprintf(mod,
3136828Stsien "Currently only know how to enumerate %s components.\n",
3146828Stsien CHIP);
3156828Stsien return (0);
3166828Stsien }
3176828Stsien topo_mod_dprintf(mod,
3186828Stsien "Calling dimm_enum\n");
3196828Stsien if (topo_mod_enumerate(mod,
3206828Stsien parent, DIMM, DIMM, 0, 0, NULL) != 0) {
3216828Stsien return (topo_mod_seterrno(mod, EMOD_PARTIAL_ENUM));
3226828Stsien }
3236828Stsien return (0);
3246828Stsien }
3256828Stsien
3266828Stsien static topo_mod_t *
dimm_enum_load(topo_mod_t * mp)3276828Stsien dimm_enum_load(topo_mod_t *mp)
3286828Stsien {
3296828Stsien topo_mod_t *rp = NULL;
3306828Stsien
3316828Stsien topo_mod_dprintf(mp, "dimm_enum_load: %s\n", CHIP);
3326828Stsien if ((rp = topo_mod_load(mp, DIMM, TOPO_VERSION)) == NULL) {
3336828Stsien topo_mod_dprintf(mp,
3346828Stsien "%s enumerator could not load %s enum. (%d: %s)\n",
3356828Stsien CHIP, DIMM, errno, strerror(errno));
3366828Stsien }
3376828Stsien topo_mod_dprintf(mp, "dimm_enum_load(EXIT): %s, rp=%p\n", CHIP, rp);
3386828Stsien return (rp);
3396828Stsien }
3406828Stsien
3413325Ssd77468 /*ARGSUSED*/
3423325Ssd77468 static int
chip_create(topo_mod_t * mod,tnode_t * rnode,const char * name,topo_instance_t min,topo_instance_t max,md_info_t * chip)3433325Ssd77468 chip_create(topo_mod_t *mod, tnode_t *rnode, const char *name,
3443681Svn83148 topo_instance_t min, topo_instance_t max, md_info_t *chip)
3453325Ssd77468 {
3463325Ssd77468 int nerr = 0;
3473325Ssd77468 int err;
3485430Ssd77468 int i;
3493325Ssd77468 char sbuf[32];
3503325Ssd77468 tnode_t *cnode;
3513530Srb144127 nvlist_t *fru = NULL;
3523530Srb144127 char *label = NULL;
3533681Svn83148 md_proc_t *procp;
3543325Ssd77468
3553325Ssd77468 topo_mod_dprintf(mod, "enumerating cmp chip\n");
3565430Ssd77468 if (min < 0 || max < 0 || min > max) {
3575430Ssd77468 topo_mod_dprintf(mod, "Invalid chip range(%d,%d)\n", min, max);
3585430Ssd77468 return (-1);
3595430Ssd77468 }
3603325Ssd77468
3616828Stsien if (dimm_enum_load(mod) == NULL)
3626828Stsien return (-1);
3636828Stsien
3643325Ssd77468 /*
3653325Ssd77468 * Create the chip[i] nodes, one for each CMP chip uniquely identified
3663325Ssd77468 * by the serial number.
3673325Ssd77468 */
3685430Ssd77468 for (i = min; i <= max; i++) {
3695430Ssd77468
3705430Ssd77468 /* Skip the processors with no serial number */
3715430Ssd77468 if ((procp = cpu_find_proc(chip, i)) == NULL) {
3725430Ssd77468 continue;
3735430Ssd77468 }
3743681Svn83148 if (procp->serialno == 0) {
3753681Svn83148 continue;
3763681Svn83148 }
3773325Ssd77468
3785430Ssd77468 (void) snprintf(sbuf, sizeof (sbuf), "%llx", procp->serialno);
3795430Ssd77468 topo_mod_dprintf(mod, "node chip[%d], sn=%s\n", i, sbuf);
3803325Ssd77468
3815430Ssd77468 cnode = chip_tnode_create(mod, rnode, name, (topo_instance_t)i,
3825430Ssd77468 sbuf, fru, label, NULL);
3833325Ssd77468 if (cnode == NULL) {
3843325Ssd77468 topo_mod_dprintf(mod, "failed to create a chip node: "
3854655Svn83148 "%s\n", topo_mod_errmsg(mod));
3863325Ssd77468 nerr++;
3873325Ssd77468 continue;
3883325Ssd77468 }
3893325Ssd77468
3903325Ssd77468 /* Enumerate all cpu strands of this CMP chip */
3915430Ssd77468 err = cpu_create(mod, cnode, CPU_NODE_NAME, chip,
3925430Ssd77468 procp->serialno);
3933325Ssd77468 if (err != 0) {
3943325Ssd77468 nerr++;
3953325Ssd77468 }
3966828Stsien
3976828Stsien /* Enumerate all DIMMs belonging to this chip */
3986828Stsien if (dimm_instantiate(cnode, CHIP, mod) < 0) {
3996828Stsien topo_mod_dprintf(mod, "Enumeration of dimm "
4006828Stsien "failed %s\n", topo_mod_errmsg(mod));
4016828Stsien return (-1);
4026828Stsien }
4033325Ssd77468 }
4043325Ssd77468
4053325Ssd77468 if (nerr != 0)
4063325Ssd77468 (void) topo_mod_seterrno(mod, EMOD_PARTIAL_ENUM);
4073325Ssd77468
4083325Ssd77468 return (0);
4093325Ssd77468 }
4103325Ssd77468
4113325Ssd77468 /*ARGSUSED*/
4123325Ssd77468 static int
chip_enum(topo_mod_t * mod,tnode_t * rnode,const char * name,topo_instance_t min,topo_instance_t max,void * arg,void * notused)4133325Ssd77468 chip_enum(topo_mod_t *mod, tnode_t *rnode, const char *name,
4143325Ssd77468 topo_instance_t min, topo_instance_t max, void *arg, void *notused)
4153325Ssd77468 {
4163681Svn83148 md_info_t *chip = (md_info_t *)arg;
4173325Ssd77468
4183325Ssd77468 if (strcmp(name, CHIP_NODE_NAME) == 0)
4193325Ssd77468 return (chip_create(mod, rnode, name, min, max, chip));
4203325Ssd77468
4213325Ssd77468 return (0);
4223325Ssd77468 }
4233325Ssd77468
4243325Ssd77468 /*ARGSUSED*/
4253325Ssd77468 static void
chip_release(topo_mod_t * mp,tnode_t * node)4263325Ssd77468 chip_release(topo_mod_t *mp, tnode_t *node)
4273325Ssd77468 {
4283325Ssd77468 }
429