static int amd_dramchan_create(topo_mod_t *mod, tnode_t *pnode, const char *name, nvlist_t *auth) { tnode_t *chnode; nvlist_t *fmri; char *socket; int i, nchan; nvlist_t *pfmri = NULL; int err, nerr = 0; /* * We will enumerate the number of channels present even if only * channel A is in use (i.e., running in 64-bit mode). Only * the socket 754 package has a single channel. */ if (topo_prop_get_string(pnode, PGNAME(MCT), "socket", &socket, &err) == 0 && strcmp(socket, "Socket 754") == 0) nchan = 1; else nchan = 2; topo_mod_strfree(mod, socket); if (topo_node_range_create(mod, pnode, name, 0, nchan - 1) < 0) return (-1); (void) topo_node_fru(pnode, &pfmri, NULL, &err); for (i = 0; i < nchan; i++) { if (mkrsrc(mod, pnode, name, i, auth, &fmri) != 0) { whinge(mod, &nerr, "amd_dramchan_create: mkrsrc " "failed\n"); continue; } if ((chnode = topo_node_bind(mod, pnode, name, i, fmri)) == NULL) { nvlist_free(fmri); whinge(mod, &nerr, "amd_dramchan_create: node bind " "failed\n"); continue; } (void) topo_node_asru_set(chnode, fmri, 0, &err); if (pfmri) (void) topo_node_fru_set(chnode, pfmri, 0, &err); nvlist_free(fmri); (void) topo_pgroup_create(chnode, &chan_pgroup, &err); (void) topo_prop_set_string(chnode, PGNAME(CHAN), "channel", TOPO_PROP_IMMUTABLE, i == 0 ? "A" : "B", &err); } nvlist_free(pfmri); return (nerr == 0 ? 0 : -1); }
static void print_node(topo_hdl_t *thp, tnode_t *node, nvlist_t *nvl, const char *fmri) { int err, ret; (void) printf("%s\n", (char *)fmri); if (opt_p && !(pcnt > 0 || opt_V || opt_all)) { char *aname = NULL, *fname = NULL, *lname = NULL; nvlist_t *asru = NULL; nvlist_t *fru = NULL; if (topo_node_asru(node, &asru, NULL, &err) == 0) (void) topo_fmri_nvl2str(thp, asru, &aname, &err); if (topo_node_fru(node, &fru, NULL, &err) == 0) (void) topo_fmri_nvl2str(thp, fru, &fname, &err); (void) topo_node_label(node, &lname, &err); if (aname != NULL) { nvlist_free(asru); (void) printf("\tASRU: %s\n", aname); topo_hdl_strfree(thp, aname); } else { (void) printf("\tASRU: -\n"); } if (fname != NULL) { nvlist_free(fru); (void) printf("\tFRU: %s\n", fname); topo_hdl_strfree(thp, fname); } else { (void) printf("\tFRU: -\n"); } if (lname != NULL) { (void) printf("\tLabel: %s\n", lname); topo_hdl_strfree(thp, lname); } else { (void) printf("\tLabel: -\n"); } } if (opt_S) { if ((ret = topo_fmri_present(thp, nvl, &err)) < 0) (void) printf("\tPresent: -\n"); else (void) printf("\tPresent: %s\n", ret ? "true" : "false"); if ((ret = topo_fmri_unusable(thp, nvl, &err)) < 0) (void) printf("\tUnusable: -\n"); else (void) printf("\tUnusable: %s\n", ret ? "true" : "false"); } }
/*ARGSUSED*/ static int fru_by_label_cb(topo_hdl_t *thp, tnode_t *node, void *arg) { char *lbl; int err; char *target = (char *)arg; if (topo_node_label(node, &lbl, &err) < 0) return (TOPO_WALK_NEXT); /* no label, try next */ if ((strcmp(target, lbl) == 0) && (topo_node_fru(node, &br_memb_nvl, NULL, &err) == 0)) { topo_hdl_strfree(thp, lbl); return (TOPO_WALK_TERMINATE); } topo_hdl_strfree(thp, lbl); return (TOPO_WALK_NEXT); }
static int use_predecessor_fru(tnode_t *tn, char *mod_name) { tnode_t *pnode = NULL; nvlist_t *fru = NULL; int err = 0; if ((pnode = find_predecessor(tn, mod_name)) == NULL) return (-1); if ((pnode = topo_node_parent(pnode)) == NULL) return (-1); if (topo_node_fru(pnode, &fru, NULL, &err) != 0) return (-1); (void) topo_node_fru_set(tn, fru, 0, &err); nvlist_free(fru); return (0); }
/*ARGSUSED*/ static int get_prop(topo_hdl_t *thp, tnode_t *node, void *pdata) { struct rsrc *rsp = (struct rsrc *)pdata; if (rsp->rs_flag == 0) { if (topo_node_asru(node, rsp->rs_fprop, rsp->rs_priv, &rsp->rs_err) < 0) return (-1); return (0); } else { if (topo_node_fru(node, rsp->rs_fprop, rsp->rs_priv, &rsp->rs_err) < 0) return (-1); return (0); } }
/*ARGSUSED*/ static int find_dimm_sn_hc(topo_hdl_t *thp, tnode_t *node, void *arg) { int err; nvlist_t *fru; char *sn; if (topo_node_fru(node, &fru, 0, &err) < 0) { return (TOPO_WALK_NEXT); /* no fru, try next */ } if (nvlist_lookup_string(fru, FM_FMRI_HC_SERIAL_ID, &sn) != 0) { nvlist_free(fru); return (TOPO_WALK_NEXT); } if (strcmp(sn, (char *)arg) != 0) { nvlist_free(fru); return (TOPO_WALK_NEXT); } (void) nvlist_dup(fru, &dimm_nvl, NV_UNIQUE_NAME); nvlist_free(fru); return (TOPO_WALK_TERMINATE); /* if no space, give up */ }