03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The contents of this file are subject to the terms of the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Common Development and Distribution License (the "License").
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You may not use this file except in compliance with the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * or http://www.opensolaris.org/os/licensing.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
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 *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/types.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/cmn_err.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/conf.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/ddi_impldefs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/autoconf.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/systm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/modctl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/ddi.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sunddi.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sunndi.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/ndi_impldefs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/promif.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/stat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/kmem.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/promif.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/conf.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/obpdefs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/cpuvar.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <vm/seg_kmem.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/prom_plat.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/machsystm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/note.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/memlist.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/ssm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbd_ioctl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbdp_priv.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbdp_mem.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sbdp_error.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/serengeti.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sgsbbc.h> /* To get fn_t type definition */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Config information
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baesteveluint_t sbdp_debug = 0x0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* DEBUG */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Enable or disable dr
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint sbdp_dr_available = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* name properties for some Serengeti device nodes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CMP_DEVNAME "cmp"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define MEM_DEVNAME "memory"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define CPU_DEVNAME "cpu"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define IO_PCI_DEVNAME "pci"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define IO_SGHSC_DEVNAME "sghsc"
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define IO_WCI_DEVNAME "wci"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sbd_devattr_t sbdp_devattr[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel { CMP_DEVNAME, "cmp", SBD_COMP_CMP },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { MEM_DEVNAME, "memory-controller", SBD_COMP_MEM },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { CPU_DEVNAME, "cpu", SBD_COMP_CPU },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { IO_PCI_DEVNAME, "pci", SBD_COMP_IO },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { IO_SGHSC_DEVNAME, "sghsc", SBD_COMP_IO },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { IO_WCI_DEVNAME, "wci", SBD_COMP_IO },
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* last item must be blank */
03831d35f7499c87d51205817c93e9a8d42c4baestevel { NULL, NULL, SBD_COMP_UNKNOWN }
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * In the case of a busy mbox, if a status cmd comes in we return a cached
03831d35f7499c87d51205817c93e9a8d42c4baestevel * copy. This cache is a link list of wnodes that contains bd structs with
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the appropriate info. When a new wnode is created a whole entry is added
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to the list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_wnode_t *first_node = NULL; /* first wnode. Entry to the link list */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint cur_num_wnodes = 0; /* how many nodes are currently running */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Macros to access fields in the previous array */
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SBDP_CT(i) sbdp_devattr[i].s_dnodetype
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SBDP_DEVNAME(i) sbdp_devattr[(i)].s_devname
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SBDP_OTYPE(i) sbdp_devattr[(i)].s_obp_type
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Prototypes
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_wnode_t *sbdp_get_wnodep(int);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Module linkage information for the kernel.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct modlmisc modlmisc = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel &mod_miscops,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Serengeti sbdp",
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct modlinkage modlinkage = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel MODREV_1,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void *)&modlmisc,
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * VA area used during CPU shutdown.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelcaddr_t sbdp_shutdown_va;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Mutex to protect our inventory
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelkmutex_t sbdp_wnode_mutex;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevel_init(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int e;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel e = mod_install(&modlinkage);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (e != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (e);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_shutdown_va = vmem_alloc(heap_arena, PAGESIZE, VM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(sbdp_shutdown_va != NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_valp = (uint64_t *)vmem_alloc(static_alloc_arena,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sizeof (uint64_t), VM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&sbdp_wnode_mutex, NULL, MUTEX_DRIVER, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (e);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevel_fini(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int e;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Remove the module.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel e = mod_remove(&modlinkage);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (e != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (e);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel vmem_free(heap_arena, sbdp_shutdown_va, PAGESIZE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_shutdown_va = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel vmem_free(static_alloc_arena, (void *)sbdp_valp, sizeof (uint64_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_valp = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_destroy(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (e);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevel_info(struct modinfo *modinfop)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (mod_info(&modlinkage, modinfop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_bd_and_wnode_num(pnode_t nodeid, int *bd, int *wnode)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int portid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_get_bd_and_wnode_num";
03831d35f7499c87d51205817c93e9a8d42c4baestevel extern int get_portid(pnode_t node, pnode_t *cmpp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_is_node_bad(nodeid))
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((portid = get_portid(nodeid, NULL)) == -1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * decode the board number
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel *bd = SG_PORTID_TO_BOARD_NUM(portid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel *wnode = SG_PORTID_TO_NODEID(portid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_board_num(sbdp_handle_t *hp, dev_info_t *dip)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel _NOTE(ARGUNUSED(hp))
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode_t nodeid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int bd, wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_get_board_num";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dip == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel nodeid = ddi_get_nodeid(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Portid has encoded the nodeid and the agent id. The top
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 4 bits are correspond to the wcnodeid and the lower 5 are the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * agent id.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Each agent id represents a physical location hence we can
03831d35f7499c87d51205817c93e9a8d42c4baestevel * obtain the board number
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_bd_and_wnode_num(nodeid, &bd, &wnode) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (bd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbd_devattr_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_devattr(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (&sbdp_devattr[0]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_portid_to_cpu_unit(int cmp, int core)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SG_PORTID_TO_CPU_UNIT(cmp, core));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_unit_num(sbdp_handle_t *hp, dev_info_t *dip)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int unit = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int portid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel processorid_t cpuid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbd_comp_type_t type;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char dev_type[OBP_MAXPROPNAME];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pnode_t nodeid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_get_unit_num";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dip == NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel nodeid = ddi_get_nodeid(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_is_node_bad(nodeid))
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(nodeid, "device_type", (caddr_t)dev_type) < 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("%s: couldn't get device_type\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; SBDP_CT(i) != SBD_COMP_UNKNOWN; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(dev_type, SBDP_OTYPE(i)) != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel type = SBDP_CT(i);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (type) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SBD_COMP_CPU:
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((cpuid = sbdp_get_cpuid(hp, dip)) != -1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit = SG_CPUID_TO_CPU_UNIT(cpuid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SBD_COMP_MEM:
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SBD_COMP_IO: {
03831d35f7499c87d51205817c93e9a8d42c4baestevel regspace_t regs[3];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int len = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check to see if this is a cpci node
03831d35f7499c87d51205817c93e9a8d42c4baestevel * cpci nodes are assign unit nums of 5 for now
03831d35f7499c87d51205817c93e9a8d42c4baestevel * So they don't conflict with the pci unit nums
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(dev_type, "sghsc") == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("it is a sghsc\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (4);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(nodeid, "portid", (caddr_t)&portid) <= 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("%s: couldn't get portid\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel len = prom_getproplen(nodeid, "reg");
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (len <= 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("%s: couldn't get length\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(nodeid, "reg", (caddr_t)regs) < 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("%s: couldn't get registers\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((portid % 2) != 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((regs[0].regspec_addr_lo & 0x700000) ==
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki 0x700000)
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((regs[0].regspec_addr_lo & 0x700000) ==
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0x700000)
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit = 2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel unit = 3;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("unit is %d\n", unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstruct sbdp_mem_dip {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_mem_dip(pnode_t node, void *arg, uint_t flags)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel _NOTE(ARGUNUSED(flags))
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct sbdp_mem_dip *smdp = (struct sbdp_mem_dip *)arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem_op_t mem = {0};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (node == OBP_NONODE || node == OBP_BADNODE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_FAILURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem.nodes = smdp->bdp->nodes;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem.board = smdp->bdp->bd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mem.nmem = smdp->bdp->nnum;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sbdp_is_mem(node, &mem);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We need to find the dip only for the first nodeid
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (smdp->bdp->nnum == 0 && mem.nmem == 1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(smdp->dip == NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel smdp->dip = e_ddi_nodeid_to_dip(node);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel smdp->bdp->nnum = mem.nmem;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Update the board info. Required after a copy rename
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_update_bd_info(sbdp_bd_t *bdp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel attach_pkt_t apkt, *apktp = &apkt;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct sbdp_mem_dip smd = {0};
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_update_bd_info";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bdp == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Grab the lock
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&bdp->bd_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * we get the top nodes here. This will have a side effect of
03831d35f7499c87d51205817c93e9a8d42c4baestevel * updating the present bit for cpus
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel apktp->node = bdp->wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel apktp->board = bdp->bd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel apktp->num_of_nodes = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel apktp->flags = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_walk_prom_tree(prom_rootnode(), sbdp_select_top_nodes,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void *) apktp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We need to clear nnum since we are looking again for the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * nodes
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->nnum = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel smd.bdp = bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If a dip is found by sbdp_get_mem_dip(), it will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * returned held
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_walk_prom_tree(prom_rootnode(), sbdp_get_mem_dip, &smd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (smd.dip != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_handle_t *hp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp = kmem_zalloc(sizeof (sbdp_handle_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp->h_board = bdp->bd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp->h_wnode = bdp->wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp->h_err = kmem_zalloc(sizeof (*hp->h_err), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bdp->ml != NULL) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) sbdp_del_memlist(hp, bdp->ml);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->ml = sbdp_get_memlist(hp, (dev_info_t *)NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if the board doesn't have banks initialize them,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * otherwise we assume they have been updated if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * necessary
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bdp->banks == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_init_bd_banks(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_print_bd_banks(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdphw_get_base_physaddr(hp, smd.dip, &bdp->bpa))
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->bpa = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ddi_release_devi(smd.dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(hp->h_err, sizeof (*hp->h_err));
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(hp, sizeof (sbdp_handle_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&bdp->bd_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Initialize the board struct. This remains cached. We update it
03831d35f7499c87d51205817c93e9a8d42c4baestevel * every time we have a successful show_board and after a copy-rename
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_bd_init(sbdp_bd_t *bdp, int bd, int wnode)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_bd_init";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->bd = bd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->wnode = wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_UNSET_ALL_CPUS_IN_RESET(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->cpus_present = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_update_bd_info(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&bdp->bd_mutex, NULL, MUTEX_DRIVER, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->bd_sc = (show_board_t *)kmem_zalloc(sizeof (show_board_t),
03831d35f7499c87d51205817c93e9a8d42c4baestevel KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->valid_cp = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This entry is going away. Clean up
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_bd_fini(sbdp_bd_t *bdp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_bd_fini";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_cleanup_bd(bdp->wnode, bdp->bd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(bdp->bd_sc, sizeof (show_board_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->bd_sc = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_destroy(&bdp->bd_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_print_all_segs();
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * A new wnode has arrived. Initialize the struct and create
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the board structures.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_wnode_init(sbdp_wnode_t *wnodep, int wnode, int boards)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_wnode_init";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->wnode = wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->nbds = boards;
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->bds = kmem_zalloc(sizeof (sbdp_bd_t) * boards, KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->next = wnodep->prev = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < boards; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_init(&wnodep->bds[i], i, wnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Wnode got DRed out. Clean up all the node stuff including the boards
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_wnode_fini(sbdp_wnode_t *wnodep)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int boards;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_wnode_fini";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel boards = wnodep->nbds;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < boards; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_fini(&wnodep->bds[i]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(wnodep->bds, sizeof (sbdp_bd_t) * boards);
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->next = wnodep->prev = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(wnodep, sizeof (sbdp_wnode_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Add all the necessary fields to this board's struct
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_add_new_bd_info(int wnode, int board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_add_new_bd_info";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = sbdp_get_wnodep(wnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("adding new board info %d\n", board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_update_bd_info(&cur->bds[board]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This board has gone away. Clean the necessary fields
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_cleanup_bd(int wnode, int board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_handle_t handle, *hp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_cleanup_bd";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = sbdp_get_wnodep(wnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("cleaning up bd info for bd %d\n", board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("cur is null\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &cur->bds[board];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Grab the lock
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&bdp->bd_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < bdp->nnum; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->nodes[i] = (pnode_t)0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->nnum = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_fini_bd_banks(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp = &handle;
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp->h_board = bdp->bd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp->h_wnode = bdp->wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (bdp->ml) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) sbdp_del_memlist(hp, bdp->ml);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->ml = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->bpa = -1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_cpu_in_reset(wnode, bdp->bd, SBDP_ALL_CPUS, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp->cpus_present = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&bdp->bd_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Traverse the list looking for wnode. Return it when found
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_wnode_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_wnodep(int wnode)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_get_wnodep";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, cur = first_node; i < cur_num_wnodes; i++,
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = cur->next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur->wnode == wnode) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (cur);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Insert this brand new node into our master list. It leaves it all
03831d35f7499c87d51205817c93e9a8d42c4baestevel * initialized
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_insert_wnode(int wnode, int max_boards)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *wnodep;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_insert_wnode";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep = kmem_zalloc(sizeof (sbdp_wnode_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (first_node == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel first_node = wnodep;
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur_num_wnodes++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = first_node + cur_num_wnodes++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur->next = wnodep;
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->prev = cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_init(wnodep, wnode, max_boards);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This node is gone. Remove it from the list and also clean up
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_remove_wnode(sbdp_wnode_t *wnodep)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_remove_wnode";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (wnodep != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_fini(wnodep);
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (first_node == wnodep)
03831d35f7499c87d51205817c93e9a8d42c4baestevel first_node = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = wnodep->prev;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur->next = wnodep->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (wnodep->next != NULL)
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep->next->prev = cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur_num_wnodes--;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sbdp_wnode_mutex);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Entry point from sbd. This is called when a new node is added. We
03831d35f7499c87d51205817c93e9a8d42c4baestevel * create an entry in our inventory and initialize all the stuff that will be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * needed
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_setup_instance(caddr_t arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel ssm_sbdp_info_t *sbdp_info;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int instance;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int max_boards;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_setup_instance";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We get this directly from ssm
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_info = (ssm_sbdp_info_t *)arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel instance = sbdp_info->instance;
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnode = sbdp_info->wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_boards = plat_max_boards();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("sbdp_setup_instance: instance %d wnode %d\n", instance,
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_info->wnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_wnodep(wnode) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This node has not been instanstiated
03831d35f7499c87d51205817c93e9a8d42c4baestevel * create one
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_insert_wnode(wnode, max_boards);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Entry point from sbd. This is called when a node has been removed (or is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * going away. We do all the necessary cleanup
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_teardown_instance(caddr_t arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel ssm_sbdp_info_t *sbdp_info;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int instance;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *wnodep;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_teardown_instance";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * ssm should have set this up
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_info = (ssm_sbdp_info_t *)arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel instance = sbdp_info->instance;
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnode = sbdp_info->wnode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("sbdp_teardown_instance: instance %d wnode %d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel instance, wnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Find this node and then remove it
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((wnodep = sbdp_get_wnodep(wnode)) != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_remove_wnode(wnodep);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_SUCCESS);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_disabled_component(sbdp_handle_t *hp)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef lint
03831d35f7499c87d51205817c93e9a8d42c4baestevel hp = hp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_release_component(sbdp_handle_t *hp, dev_info_t *dip)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_set_err(sbd_error_t *ep, int ecode, char *rsc)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_set_err";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(ep != NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ep->e_code = ecode;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rsc != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy((caddr_t)(ep->e_rsc), (caddr_t)rsc);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Serengeti DR passthrus are for debugging purposes only.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct {
03831d35f7499c87d51205817c93e9a8d42c4baestevel const char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int (*handler)(sbdp_handle_t *, void *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel} sbdp_passthrus[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel { "readmem", sbdp_passthru_readmem },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { "prep-script", sbdp_passthru_prep_script },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { "test-quiesce", sbdp_passthru_test_quiesce },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { "inject-error", sbdp_passthru_inject_error },
03831d35f7499c87d51205817c93e9a8d42c4baestevel { "reset-error", sbdp_passthru_reset_error },
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* the following line must always be last */
03831d35f7499c87d51205817c93e9a8d42c4baestevel { NULL, NULL }
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_ioctl(sbdp_handle_t *hp, sbdp_ioctl_arg_t *sbdpi)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel char buf[512];
03831d35f7499c87d51205817c93e9a8d42c4baestevel int rv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbd_ioctl_arg_t *sbdi = (sbd_ioctl_arg_t *)sbdpi->h_iap;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_ioctl";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdi->i_len >= sizeof (buf) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel ddi_copyin(sbdi->i_opts, buf, sbdi->i_len, sbdpi->h_mode)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_set_err(hp->h_err, ESBD_FAULT, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel i = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (sbdp_passthrus[i].name != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int len;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel len = strlen(sbdp_passthrus[i].name);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(sbdp_passthrus[i].name, buf, len) == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel i++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_passthrus[i].name == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_set_err(hp->h_err, ESBD_INVAL, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = EIO;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = (*sbdp_passthrus[i].handler)(hp, buf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != ESBD_NOERROR) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_set_err(hp->h_err, rv, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = EIO;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (rv);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check the dnode we obtained. Need to find a better way to determine
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if the node has the correct starting address
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_is_node_bad(pnode_t node)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_is_node_bad";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return ((node == OBP_NONODE) || (node == OBP_BADNODE) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((node & 0x80000000u) != 0x80000000u));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Retrieve the information we have on this board from
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the inventory
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_bd_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_bd_info(int wnode, int board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *wnodep;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int max_bds;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_get_bd_info";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel wnodep = sbdp_get_wnodep(wnode);
03831d35f7499c87d51205817c93e9a8d42c4baestevel max_bds = plat_max_boards();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((wnodep == NULL) || ((board < 0) && (board > max_bds))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &wnodep->bds[board];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We might not have the complete bd info. With cheetah we
03831d35f7499c87d51205817c93e9a8d42c4baestevel * cannot access the memory decode registers when then cpu is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in reset. If the mem info is incomplete, then we try to gather it
03831d35f7499c87d51205817c93e9a8d42c4baestevel * here
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_update_bd_info(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * There are certain cases where obp marks components as failed
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the status is ok the node won't have any status property. It
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is only there if the status is other than ok.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbd_cond_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_comp_status(pnode_t nodeid)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel char status_buf[OBP_MAXPROPNAME];
03831d35f7499c87d51205817c93e9a8d42c4baestevel static const char *status = "status";
03831d35f7499c87d51205817c93e9a8d42c4baestevel static const char *failed = "fail";
03831d35f7499c87d51205817c93e9a8d42c4baestevel static const char *disabled = "disabled";
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_get_comp_status";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_is_node_bad(nodeid)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_STATE("node is not ok\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBD_COND_UNKNOWN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getproplen(nodeid, (char *)status) <= 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_STATE("status is ok\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBD_COND_OK);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(nodeid, (char *)status, status_buf) < 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_STATE("status is unknown\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBD_COND_UNKNOWN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strncmp(status_buf, failed, strlen(failed)) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_STATE("status of failed\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBD_COND_FAILED);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(status_buf, disabled) == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_STATE("status of unusable\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBD_COND_UNUSABLE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBD_COND_OK);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_cpu_in_reset(int node, int bd, int unit, int reset)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_cpu_in_reset";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((unit < -1) || (bd < 0) || (node < 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = sbdp_get_wnodep(node);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MISC("marking cpu %d %s for board %d\n", unit,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (reset) ? "in reset" : "out of reset", bd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &cur->bds[bd];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (unit == SBDP_ALL_CPUS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (reset == 1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_SET_ALL_CPUS_IN_RESET(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_UNSET_ALL_CPUS_IN_RESET(bdp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (reset == 1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_SET_CPU_IN_RESET(bdp, unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_UNSET_CPU_IN_RESET(bdp, unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_set_cpu_present(int node, int bd, int unit)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_set_cpu_present";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((unit < 0) || (bd < 0) || (node < 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = sbdp_get_wnodep(node);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &cur->bds[bd];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_SET_CPU_PRESENT(bdp, unit);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_is_cpu_present(int node, int bd, int unit)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_is_cpu_present";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((unit < 0) || (bd < 0) || (node < 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = sbdp_get_wnodep(node);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &cur->bds[bd];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBDP_IS_CPU_PRESENT(bdp, unit));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_is_cpu_in_reset(int node, int bd, int unit)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_wnode_t *cur;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_bd_t *bdp;
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_is_cpu_in_reset";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((unit < 0) || (bd < 0) || (node < 0)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur = sbdp_get_wnodep(node);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cur == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bdp = &cur->bds[bd];
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (SBDP_IS_CPU_IN_RESET(bdp, unit));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_dr_avail(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel static fn_t f = "sbdp_dr_avail";
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_FUNC("%s\n", f);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_dr_available)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sg_prom_sb_dr_check() == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}