display_sun4v.c revision db8f0877c245a884664489a7d8d1e4d8a34a8432
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Common Development and Distribution License (the "License").
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel#pragma ident "%Z%%M% %I% %E% SMI"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Additional OBP properties
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#define PICL_NODE_PHYSICAL_PLATFORM "physical-platform"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Additional picl classes
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiextern picl_errno_t sun4v_get_node_by_name(picl_nodehdl_t, char *,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/* local functions */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic int sun4v_get_first_compatible_value(picl_nodehdl_t, char **);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwstatic int openprom_callback(picl_nodehdl_t openpromh, void *arg);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_display(Sys_tree *tree, Prom_node *root, int log,
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct mem_total memory_total; /* Total memory in system */
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct grp_info grps; /* Info on all groups in system */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (sysinfo(SI_MACHINE, machine, sizeof (machine)) == -1)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (strncmp(machine, SUN4V_MACHINE, strlen(SUN4V_MACHINE)) != 0)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Now display the machine's configuration. We do this if we
03831d35f7499c87d51205817c93e9a8d42c4baestevel * are not logging.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display system banner
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(dgettext(TEXT_DOMAIN, "System Configuration: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* display system clock frequency */
03831d35f7499c87d51205817c93e9a8d42c4baestevel value = get_prop_val(find_prop(root, "clock-frequency"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the Memory Size */
03831d35f7499c87d51205817c93e9a8d42c4baestevel display_memorysize(tree, NULL, &grps, &memory_total);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the CPU devices */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display the Memory configuration */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Display all the IO cards. */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki sun4v_display_diaginfo((log || (logging)), root, plafh);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
d776656fd760148680dc0108975562197d8dfd37mb * The physical-platform node may be missing on systems with
d776656fd760148680dc0108975562197d8dfd37mb * older firmware so don't consider that an error.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (sun4v_get_node_by_name(rooth, PICL_NODE_PHYSICAL_PLATFORM,
d776656fd760148680dc0108975562197d8dfd37mb return (0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (1);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * The binding-name property encodes the bus type.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiget_bus_type(picl_nodehdl_t nodeh, struct io_card *card)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME, val,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Not perfect: process the binding-name until
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * we encounter something that we don't think would
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * be part of a bus type. This may get confused a bit
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * if a device or vendor id is encoded right after
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the bus class since there's no delimiter. If the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * id number begins with a hex digit [abcdef] then
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * this will become part of the bus type string
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * reported by prtdiag. This is all an effort to
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * print something potentially useful for bus types
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * other than PCI/PCIe.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * We do this because this code will get called for
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * non-PCI class devices like the xaui (class sun4v.)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw while (*p != '\0') {
db8f0877c245a884664489a7d8d1e4d8a34a8432fw *p = '\0';
db8f0877c245a884664489a7d8d1e4d8a34a8432fw *p = (char)_toupper((int)*p);
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Fetch the Label property for this device. If none is found then
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * search all the siblings with the same device ID for a
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Label and return that Label. The plug-in can only match the canonical
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * path from the PRI with a specific devfs path. So we take care of
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * devices with multiple functions here. A leaf device downstream of
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * a bridge should fall out of here with PICL_PROPNOTFOUND, and the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * caller can walk back up the tree in search of the slot's Label.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiget_slot_label(picl_nodehdl_t nodeh, struct io_card *card)
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * If there's a Label at this node then return it - we're
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (void) strlcpy(card->slot_str, val, sizeof (card->slot_str));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * At this point we're starting to extrapolate what the Label
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * should be since there is none at this specific node.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Note that until the value of "err" is overwritten in the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * loop below, its value should be PICL_PROPNOTFOUND.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * The device must be attached, and we can figure that out if
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the instance number is present and is not equal to -1.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * This will prevent is from returning a Label for a sibling
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * node when the node passed in would have a unique Label if the
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * device were attached. But if the device is downstream of a
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * node with a Label then pci_callback() will still find that
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * and use it.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_INSTANCE, &instance,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Narrow the search to just the one device ID.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_DEVICE_ID, &devid,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Go find the first child of the parent so we can search
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * all of the siblings.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(pnodeh, PICL_PROP_CHILD, &pnodeh,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * If the child's device ID matches, then fetch the Label and
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * return it. The first child/device ID should have a Label
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * associated with it.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw if (picl_get_propval_by_name(pnodeh, PICL_PROP_DEVICE_ID,
db8f0877c245a884664489a7d8d1e4d8a34a8432fw } while (picl_get_propval_by_name(pnodeh, PICL_PROP_PEER, &pnodeh,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkiget_slot_number(picl_nodehdl_t nodeh, struct io_card *card)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &pnodeh,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propinfo_by_name(pnodeh, OBP_PROP_SLOT_NAMES,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propval_by_name(nodeh, PICL_PROP_UNIT_ADDRESS, uaddr,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (picl_get_propval(proph, pval, pinfo.size) != PICL_SUCCESS) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < sizeof (dev_mask); i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < sizeof (uaddr) && uaddr[i] != '\0'; i++) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (x != 0) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw while (p[i++] != '\0')
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * add all io devices under pci in io list
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/* ARGSUSED */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Walk through the children */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(pcih, PICL_PROP_CHILD, &nodeh,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_CLASSNAME,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_DEVFS_PATH,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcpy(pci_card.notes, path, sizeof (pci_card.notes));
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * No Label at this node, maybe we're looking at a device
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * downstream of a bridge. Walk back up and find a Label and
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * record that node in "pnodeh".
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Can't find a Label for this device in the PCI heirarchy.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Try to synthesize a slot name from atoms. This depends
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * on the OBP slot_names property being implemented, and this
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * so far doesn't seem to be on sun4v. But just in case that
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * is resurrected, the code is here.
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * Passing in pnodeh instead of nodeh will cause prtdiag
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * to display the type of IO slot for the leaf node. For
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * built-in devices and a lot of IO cards these will be
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the same thing. But for IO cards with bridge chips or
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * for things like expansion chassis, prtdiag will report
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * the bus type of the IO slot and not the leaf, which
db8f0877c245a884664489a7d8d1e4d8a34a8432fw * could be different things.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_NAME, name,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_STATUS, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw (void) snprintf(pci_card.status, sizeof (pci_card.status),
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Get the name of this card. If binding_name is found,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * name will be <nodename>-<binding_name>.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_BINDING_NAME,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * if compatible prop is not found, name will be
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * <nodename>-<compatible>
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcpy(pci_card.name, name, sizeof (pci_card.name));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Get the model of this card */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) strlcpy(pci_card.model, model, sizeof (pci_card.model));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print NAC name */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print IO Type */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Printf Card Name */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print Card Model */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print Status */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print IO Type */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Print Parent Path */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * display_pci
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display all the PCI IO cards on this board.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* Have we printed the column headings? */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Slot +", "Bus", "Name +", "Model", 0);
aaba19e23c48a32e927f4e39464be188bfcbef37fw "-------------------------------------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_PCIEX,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_SUN4V,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * return the first compatible value
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /* get first string from table */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * print size of a memory segment
a90d965d832a5578dbfc2eadd1617e8cccf25264fw * Enumerate banks and dimms within a memory segment. We're handed
a90d965d832a5578dbfc2eadd1617e8cccf25264fw * the first bank within the segment - we assume there are dimms
a90d965d832a5578dbfc2eadd1617e8cccf25264fw * (memory-module) nodes underneath.
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (picl_get_propval_by_name(bank_nodeh, PICL_PROP_CHILD,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw } while (picl_get_propval_by_name(module_nodeh, PICL_PROP_PEER,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw } while (picl_get_propval_by_name(bank_nodeh, PICL_PROP_PEER,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Search node where _class=="memory-segment"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * print "Base Address", "Size", etc
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_memory_conf_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_BASEADDRESS,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PEER, &nodeh,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT,
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "--------------------------------------------------------------\n");
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(fmt, "Base", "Segment", "Interleave", "Bank", "Contains", 0);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw log_printf(fmt, "Address", "Size", "Factor", "Size", "Modules", 0);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "--------------------------------------------------------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(plafh, PICL_CLASS_MEMORY_SEGMENT,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the table header for CPUs . Then display the CPU
03831d35f7499c87d51205817c93e9a8d42c4baestevel * frequency, cache size, and processor revision of all cpus.
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "================================"
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw " Virtual CPUs "
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "================================"
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw "Status", 0);
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw (void) picl_walk_tree_by_class(plafh, PICL_CLASS_CPU, PICL_CLASS_CPU,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Display the CPUs present on this board.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get cpuid property and print it and the NAC name
7ae4bfcbefd6100bcc6079f530f1df87f4801110fw status = picl_get_propinfo_by_name(cpuh, OBP_PROP_CPUID, &propinfo,
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, &cpuid, sizeof (cpuid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propinfo_by_name(cpuh, "clock-frequency", &propinfo,
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, int_value, propinfo.size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Running frequency */
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) snprintf(freq_str, sizeof (freq_str), "%d MHz",
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propinfo_by_name(cpuh, "compatible", &propinfo,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Compatible Property only has 1 value
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Compatible Property has multiple values
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = picl_get_propval(proph, &tblh, propinfo.size);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw status = picl_get_propinfo_by_name(cpuh, PICL_PROP_STATE,
03831d35f7499c87d51205817c93e9a8d42c4baestevelsun4v_display_diaginfo(int flag, Prom_node *root, picl_nodehdl_t plafh)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function is intentionally empty
d776656fd760148680dc0108975562197d8dfd37mb return (0);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_sensor_callback(picl_nodehdl_t nodeh, void *args)
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (syserrlog == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * If we're here then prtdiag was invoked with "-v" or we have
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * a sensor that is beyond a threshold, so give them a book to
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * read instead of the Cliff Notes.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw /* gather up the path name for the sensor */
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) != NULL) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (loc != 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, val,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (val));
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * Get the exponent if present, and do a little math so that
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * if we need to we can print a normalized value for the
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * sensor reading.
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * Sometimes ILOM will scale a sensor reading but
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * there will be nothing to the right of the decimal
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * once that value is normalized. Setting the
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * exponent to zero will prevent the printf below
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * from printing extraneous zeros. Otherwise a
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * negative exponent is used to set the precision
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * for the printf.
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(nodeh, PICL_PROP_BASE_UNITS,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_env_print_indicator_callback(picl_nodehdl_t nodeh, void *args)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (current_val)) == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (syserrlog == 0) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * If we're here then prtdiag was invoked with "-v" or we have
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * a sensor that is beyond a threshold, so give them a book to
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw * read instead of the Cliff Notes.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) != NULL) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw if (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw while (--i > -1) {
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw for (i = 0; i < PARENT_NAMES; i++)
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, label,
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw sizeof (label));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * If there isn't any fan sensor node, return now.
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_RPM_SENSOR,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Sensor", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_RPM_INDICATOR,
aaba19e23c48a32e927f4e39464be188bfcbef37fw (void *)PICL_PROP_CONDITION, sun4v_env_print_indicator_callback);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_TEMPERATURE, sun4v_env_print_sensor_callback);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw PICL_CLASS_TEMPERATURE_INDICATOR, (void *)PICL_PROP_CONDITION,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Indicator", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_CURRENT_SENSOR,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_CURRENT, sun4v_env_print_sensor_callback);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_CURRENT_INDICATOR, (void *)PICL_PROP_CONDITION,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Indicator", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
a42ff480eab7fd4f2b53fe8e9bdb1b57f0cf64dafw PICL_CLASS_VOLTAGE_INDICATOR, (void *)PICL_PROP_CONDITION,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki log_printf(fmt, "Location", "Indicator", "Condition", 0);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_LED,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_STATE, sun4v_env_print_indicator_callback);
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, PICL_CLASS_LED,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (void *)PICL_PROP_STATE, sun4v_env_print_indicator_callback);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_fru_status_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_prop_by_name(nodeh, PICL_PROP_IS_FRU, &proph);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_LABEL, label,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (label));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_OPERATIONAL_STATUS,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_PARENT, &parenth,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if ((loc = (char *)malloc(PICL_PROPNAMELEN_MAX*PARENT_NAMES)) == NULL)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < PARENT_NAMES; i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if ((names[i] = (char *)malloc(PICL_PROPNAMELEN_MAX)) == NULL) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (--i > -1)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(parenth, PICL_PROP_NAME,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(parenth, PICL_PROP_PARENT,
4c5e0fde93352f23abc94e445999402e38b91268vivek if (--i > -1) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki while (--i > -1) {
4c5e0fde93352f23abc94e445999402e38b91268vivek (void) strlcat(loc, "/", PICL_PROPNAMELEN_MAX * PARENT_NAMES);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki for (i = 0; i < PARENT_NAMES; i++)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("------------------------------------------------------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkisun4v_print_fw_rev_callback(picl_nodehdl_t nodeh, void *args)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki err = picl_get_propval_by_name(nodeh, PICL_PROP_FW_REVISION, rev,
a90d965d832a5578dbfc2eadd1617e8cccf25264fw sizeof (rev));
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw log_printf("-------------------------------------------------"
5e3e415a5bedb7bb9ff36b225630e414258e6ecefw "-----------\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) picl_walk_tree_by_class(phyplatformh, NULL, NULL,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fwstatic void
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw log_printf("-------------------------------------------------"
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw "-----------\n");
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * display the OBP and POST prom revisions (if present)
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw/* ARGSUSED */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propinfo_by_name(openpromh, OBP_PROP_VERSION,
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * If it's a table prop, the first element is OBP revision
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * The second one is POST revision.
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw * If it's a charstring prop, the value will be only OBP revision
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw if (pinfo.type != PICL_PTYPE_TABLE) /* not supported type */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /* get first row */
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw err = picl_get_propval(rowproph, prom_version, pinfo.size);
dc6ca969834c6d8d1aac19aaea19d86c5b73cf75fw /* get second row */