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/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Starcat Specific Glue for Safari Configurator
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/isa_defs.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/conf.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/kmem.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/debug.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/modctl.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/autoconf.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/hwconf.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/ddi_impldefs.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/safari_pcd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/gp2cfg.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/gptwo_cpu.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/gptwo_pci.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/sc_gptwocfg.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <post/scat_dcd.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include <sys/machsystm.h>
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint sc_gptwocfg_debug = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SC_DEBUG(level, args) if (sc_gptwocfg_debug >= level) cmn_err args
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct sc_gptwocfg_config {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct gptwocfg_config *port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwo_aid_t portid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct sc_gptwocfg_config *link;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct sc_gptwocfg_config *next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel} sc_gptwocfg_config_t;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic kmutex_t sc_gptwo_config_list_lock;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sc_gptwocfg_config_t *sc_gptwo_config_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic dev_info_t *sc_find_axq_node(uint_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sc_gptwocfg_cookie_t sc_configure(uint_t, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic spcd_t *sc_get_common_pcd(uint_t, uint_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void sc_free_common_pcd(spcd_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic gptwo_new_nodes_t *sc_gptwocfg_configure_axq(dev_info_t *, uint_t, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic gptwocfg_config_t *sc_gptwocfg_unconfigure_axq(gptwocfg_config_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void dump_config(sc_gptwocfg_config_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void dump_pcd(spcd_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint_t sc_get_agent_id(spcd_t *, uint_t, uint_t, uint_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *rsv_string(prdrsv_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern gptwo_new_nodes_t *gptwocfg_allocate_node_list(int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern void gptwocfg_free_node_list(gptwo_new_nodes_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint8_t *get_memlayout(uint32_t, uint32_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef NO_IOSRAM
03831d35f7499c87d51205817c93e9a8d42c4baestevelint iosram_rd(uint32_t, uint32_t, uint32_t, caddr_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#else
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern int iosram_rd(uint32_t, uint32_t, uint32_t, caddr_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern void gptwocfg_devi_attach_to_parent(dev_info_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Module control operations
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern struct mod_ops mod_miscops;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct modlmisc modlmisc = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel &mod_miscops, /* Type of module */
f500b19684bd0346ac05bec02a50af07f369da1aRichard Bean "Sun Fire 15000 gptwocfg"
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic struct modlinkage modlinkage = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel MODREV_1, (void *)&modlmisc, NULL
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevel_init()
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int err = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&sc_gptwo_config_list_lock, NULL, MUTEX_DRIVER, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwo_config_list = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CPU/PCI devices are already registered by their respective modules,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * so all we need to do now is install.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((err = mod_install(&modlinkage)) != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_gptwocfg failed to load, error=%d\n",
f500b19684bd0346ac05bec02a50af07f369da1aRichard Bean err));
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_destroy(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_gptwocfg has been loaded.\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevel_fini(void)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_destroy(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (mod_remove(&modlinkage));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevel_info(modinfop)
03831d35f7499c87d51205817c93e9a8d42c4baestevelstruct modinfo *modinfop;
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (mod_info(&modlinkage, modinfop));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic spcd_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_get_common_pcd(uint_t expander, uint_t prd_slot)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel spcd_t *pcd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd_t *gdcd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int portid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i, j, slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int dimm;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *label1, *label2;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_get_common_pcd() expander=%d prd_slot=%d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel expander, prd_slot));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd = (gdcd_t *)kmem_zalloc(sizeof (gdcd_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the Starcat Specific Global DCD Structure from the golden
03831d35f7499c87d51205817c93e9a8d42c4baestevel * IOSRAM.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (iosram_rd(GDCD_MAGIC, 0, sizeof (gdcd_t), (caddr_t)gdcd)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: Unable To Read GDCD "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "From IOSRAM\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(gdcd, sizeof (gdcd_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gdcd->h.dcd_magic != GDCD_MAGIC) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: GDCD Bad Magic 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->h.dcd_magic);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(gdcd, sizeof (gdcd_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gdcd->h.dcd_version != DCD_VERSION) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: GDCD Bad Version: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "GDCD Version 0x%x Expecting 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->h.dcd_version, DCD_VERSION);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(gdcd, sizeof (gdcd_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd = (spcd_t *)kmem_zalloc(sizeof (spcd_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy various information from the platform specific Port
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Resource Descriptor (PRD) To the platform independent
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Port Configuration Descriptor.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_magic = PCD_MAGIC;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_version = PCD_VERSION;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_ptype = gdcd->dcd_prd[expander][prd_slot].prd_ptype;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_ver_reg = gdcd->dcd_prd[expander][prd_slot].prd_ver_reg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->spcd_ptype == SAFPTYPE_CPU) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This will calculate the cpu speed based on the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the actual frequency ratio * interconnect frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel * converted to Mhz.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_afreq = gdcd->dcd_prd[expander][prd_slot].
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_afreq_ratio *
03831d35f7499c87d51205817c93e9a8d42c4baestevel (uint16_t)((gdcd->dcd_intercon_freq + 500000) / 1000000);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * For non-cpu devices, just pass through the frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel * unchanged.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_afreq =
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_afreq_ratio;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_cache = gdcd->dcd_prd[expander][prd_slot].prd_cache;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "Safari Device Status status=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_prsv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in the entire port status.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (RSV_GOOD(gdcd->dcd_prd[expander][prd_slot].prd_prsv)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_prsv = SPCD_RSV_PASS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_prsv = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in the per agent status.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gdcd->dcd_prd[expander][prd_slot].prd_agent[1] == RSV_UNKNOWN) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_agent[0] = pcd->spcd_prsv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_agent[1] = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (RSV_GOOD(
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_agent[i]))
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_agent[i] = SPCD_RSV_PASS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_agent[i] = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If this is a CPU device calculate the cpuid for it. For Starcat
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the cpuid is in the following format.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * EEEEEPPAPP
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * where: EEEEE is the expander
03831d35f7499c87d51205817c93e9a8d42c4baestevel * PP_PP is the portid
03831d35f7499c87d51205817c93e9a8d42c4baestevel * __A__ is the sub-agent identifier.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->spcd_ptype == SAFPTYPE_CPU) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (prd_slot) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 0:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 1:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 2:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 3:
03831d35f7499c87d51205817c93e9a8d42c4baestevel portid = (expander << 5) | prd_slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 4: /* Maxcat */
03831d35f7499c87d51205817c93e9a8d42c4baestevel portid = (expander << 5) | 8;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 5: /* Maxcat */
03831d35f7499c87d51205817c93e9a8d42c4baestevel portid = (expander << 5) | 9;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: invalid "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "prd_slot=%d\n", prd_slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_cpuid[i] = (i << 2) | portid;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Starcat does not have ports with UPA devices so
03831d35f7499c87d51205817c93e9a8d42c4baestevel * spcd_upadev structure will not be filled in.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in IO Bus Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < IOBUS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, " IO Bus Status "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "bus=%d status=0x%x\n", i,
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_iobus_rsv[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (RSV_GOOD(
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_iobus_rsv[i])) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_iobus_rsv[i] = SPCD_RSV_PASS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_iobus_rsv[i] = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < IOCARD_PER_BUS; j++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_iocard_rsv[i][j] = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in IO Card Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < IOCARD_PER_BUS; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, " Card Status bus=%d "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "slot=%d status=0x%x\n", i, j,
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_iocard_rsv[i][j]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (j == 1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (j == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = j;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If POST marked the card as GOOD or if the slot
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is empty, we want to probe for the device.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (RSV_GOOD(gdcd->dcd_prd[expander][prd_slot].
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_iocard_rsv[i][j]) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (gdcd->dcd_prd[expander][prd_slot].
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_iocard_rsv[i][j] == RSV_MISS) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel (gdcd->dcd_prd[expander][prd_slot].
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_iocard_rsv[i][j] == RSV_EMPTY_CASSETTE))
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_iocard_rsv[i][slot] = SPCD_RSV_PASS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel else
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_iocard_rsv[i][slot] = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in WIC Link Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < LINKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (RSV_GOOD(
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_wic_links[i])) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_wic_links[i] = SPCD_RSV_PASS;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_wic_links[i] = SPCD_RSV_FAIL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get data for the "bank-status" property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_bank_rsv[0] =
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[0][0]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_bank_rsv[1] =
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[1][0]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_bank_rsv[2] =
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[0][1]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_bank_rsv[3] =
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[1][1]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dimm = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < PMBANKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < DIMMS_PER_PMBANK; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dimm < MAX_DIMMS_PER_PORT) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_dimm[dimm] = rsv_string(
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_dimm[i][j]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel dimm++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get data for the "ecache-dimm-label" property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Right now it is hardcoded, but we should eventually get this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * from the SC.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (prd_slot) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 0:
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = "4400";
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = "4300";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 1:
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = "5400";
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = "5300";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 2:
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = "6400";
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = "6300";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 3:
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = "7400";
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = "7300";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Maxcat labels.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 4:
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = "6400";
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = "6300";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 5:
03831d35f7499c87d51205817c93e9a8d42c4baestevel label1 = "7400";
03831d35f7499c87d51205817c93e9a8d42c4baestevel label2 = "7300";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel i = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (label1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_ecache_dimm_label[i] =
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_alloc(strlen(label1) + 1, KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(pcd->sprd_ecache_dimm_label[i], label1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel i++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (label2) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_ecache_dimm_label[i] =
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_alloc(strlen(label2) + 1, KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(pcd->sprd_ecache_dimm_label[i], label2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel i++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(gdcd, sizeof (gdcd_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#ifdef DEBUG
03831d35f7499c87d51205817c93e9a8d42c4baestevel dump_pcd(pcd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (pcd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelvoid
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_free_common_pcd(spcd_t *pcd)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_WARN, "sc_free_common_pcd pcd=%p\n", (void *)pcd));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->memory_layout && pcd->memory_layout_size) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_free_common_pcd: memory_layout %p "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "size=%x", (void *)pcd->memory_layout,
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki pcd->memory_layout_size));
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(pcd->memory_layout, pcd->memory_layout_size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_BANKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->sprd_bank_rsv[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(pcd->sprd_bank_rsv[i],
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlen(pcd->sprd_bank_rsv[i]) + 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_bank_rsv[i] = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_DIMMS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->sprd_dimm[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(pcd->sprd_dimm[i],
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlen(pcd->sprd_dimm[i]) + 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_dimm[i] = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->sprd_ecache_dimm_label[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(pcd->sprd_ecache_dimm_label[i],
03831d35f7499c87d51205817c93e9a8d42c4baestevel strlen(pcd->sprd_ecache_dimm_label[i]) + 1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_ecache_dimm_label[i] = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(pcd, sizeof (spcd_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_gptwocfg_cookie_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_probe_board(uint_t board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (sc_configure(board, 1));
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sc_gptwocfg_cookie_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_configure(uint_t board, int create_nodes)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel spcd_t *pcd;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *ap, *axq_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t agent_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t prd_slot, prd_slot_start, prd_slot_end;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t expander, slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwo_new_nodes_t *new_nodes;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwocfg_config_t *port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct sc_gptwocfg_config *board_config, *last, *new;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int created_node = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint32_t size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: board=%d, create_nodes=%d\n",
f500b19684bd0346ac05bec02a50af07f369da1aRichard Bean board, create_nodes));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board > 35) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_gptwocfg - probe_board - "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "invalid board 0x%x\n", board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel slot = board & 1; /* Extract Slot Number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel expander = board >> 1; /* Extract Expander Number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: exp=0x%x slot=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel expander, slot));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the Attachment Point. For Starcat the parent of all
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Safari children is root node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap = ddi_root_node();
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the agent id of the AXQ.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = (expander << 5) | 0x1e | slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Look to see if the board is already configured by searching for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * its AXQ.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (create_nodes && (axq_dip = sc_find_axq_node(agent_id))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ddi_release_devi(axq_dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Board %d AXQ is already configured\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Probe AXQ first
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Probing AXQ exp=0x%x brd=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel expander, slot));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The generic gptwocfg does not support the AXQ, so we need
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to configure it. The AXQ branch is returned held.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_nodes = sc_gptwocfg_configure_axq(ap, agent_id, create_nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (new_nodes == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Can not probe AXQ\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie = kmem_zalloc(sizeof (gptwocfg_config_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Build a cookie for the AXQ.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie->gptwo_ap = ap;
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie->gptwo_portid = agent_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie->gptwo_nodes = new_nodes;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = kmem_zalloc(sizeof (sc_gptwocfg_config_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->port_cookie = port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->board = board;
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->portid = agent_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->link = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel last = board_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->next = sc_gptwo_config_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwo_config_list = board_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: AXQ Probing Complete. "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "%d nodes added\n", new_nodes->gptwo_number_of_nodes));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine the starting ending slots of the PRD array.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (slot) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 0: /* Full Bandwidth Slot */
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_slot_start = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_slot_end = 3;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 1: /* Half Bandwidth Slot */
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_slot_start = 4;
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_slot_end = 5;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "Unknown Board Address - "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Can not probe\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (board_config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * For each valid PRD entry, determine the agent id which is based
03831d35f7499c87d51205817c93e9a8d42c4baestevel * on what type of device is described by the slot, and then
03831d35f7499c87d51205817c93e9a8d42c4baestevel * call the safari configurator.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (prd_slot = prd_slot_start; prd_slot <= prd_slot_end; prd_slot++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd = sc_get_common_pcd(expander, prd_slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We can not get a PCD for this port so skip it.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: Can not get PCD "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "expander 0x%x prd slot 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel expander, prd_slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (board_config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Only configure good devices.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->spcd_prsv == SPCD_RSV_PASS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine the agent id.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = sc_get_agent_id(
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd, expander, slot, prd_slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->memory_layout = get_memlayout(agent_id, &size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->memory_layout_size = size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Call Platform Independent gptwo configurator to
03831d35f7499c87d51205817c93e9a8d42c4baestevel * create node and properties.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (create_nodes) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie =
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwocfg_configure(ap, pcd, agent_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (port_cookie)
03831d35f7499c87d51205817c93e9a8d42c4baestevel created_node++;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel new = kmem_zalloc
03831d35f7499c87d51205817c93e9a8d42c4baestevel (sizeof (sc_gptwocfg_config_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * XXX Shouldn't port_cookie be NULL if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * !create_nodes ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel new->port_cookie = port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel new->portid = agent_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel new->link = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel last->link = new;
03831d35f7499c87d51205817c93e9a8d42c4baestevel last = new;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Bad Agent "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Exp=0x%x PRD Slot=0x%x prsv Status=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel expander, prd_slot, pcd->spcd_prsv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_free_common_pcd(pcd);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel } /* for loop */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dump_config(board_config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (create_nodes && !created_node) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: GPTWO Devices failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to configure - unprobing board %d\n", board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = sc_unprobe_board(board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Returning 0x%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)board_config));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (board_config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_gptwocfg_cookie_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_unprobe_board(uint_t board)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwocfg_config_t *board_config, *axq_config, *prior_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwocfg_cookie_t port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_unprobe_board: board=%d\n", board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board > 35) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_unprobe_board: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "invalid board 0x%x\n", board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = sc_gptwo_config_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (board_config != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board_config->board == board) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = board_config->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board_config == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_unprobe_board: No "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "config structure board=0x%x\n", board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Configure the board without creating nodes.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = sc_configure(board, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (board_config == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: sc_unprobe_board: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Unable to unconfigure board %d - board is not "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "configured\n", board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel axq_config = board_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Walk the link of ports on this board and unconfigure them.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Save the AXQ for last.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (board_config->link != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel prior_config = board_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = board_config->link;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_unprobe_board: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "calling gptwocfg_unconfigure(ap=0x%p portid=0x%x)\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)ddi_root_node(), board_config->portid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie = gptwocfg_unconfigure(ddi_root_node(),
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->portid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_unprobe_board: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "gptwocfg_unconfigure returned cookie=0x%p\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (port_cookie == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Can be removed from list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel prior_config->link = board_config->link;
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(board_config, sizeof (sc_gptwocfg_config_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = prior_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->port_cookie = port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (axq_config->link == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If all the other Safari devices have been successfully
03831d35f7499c87d51205817c93e9a8d42c4baestevel * unconfigured, then the AXQ can be unconfigured.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel axq_config->port_cookie =
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwocfg_unconfigure_axq(axq_config->port_cookie);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (axq_config->port_cookie == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the AXQ was successfully unconfigured, then
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the board is removed from the configured list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_enter(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sc_gptwo_config_list == axq_config) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwo_config_list = axq_config->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = sc_gptwo_config_list;
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (board_config->next != axq_config) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = board_config->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->next = axq_config->next;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_exit(&sc_gptwo_config_list_lock);
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(axq_config, sizeof (sc_gptwocfg_config_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel axq_config = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel dump_config(axq_config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (axq_config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelint
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_next_node(sc_gptwocfg_cookie_t c, dev_info_t *previous, dev_info_t **next)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwocfg_config_t *cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sccfg: sccfg_next_node"
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "(c=0x%p, previous=0x%p, next=0x%p)\n", (void *)c,
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)previous, (void *)next));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cookie = (sc_gptwocfg_config_t *)c;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (cookie == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sccfg: sccfg_next_node - "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Invalid Cookie\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (previous == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Start with the AXQ node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gptwocfg_next_node(cookie->port_cookie, NULL, &dip)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *next = dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (cookie != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gptwocfg_next_node(cookie->port_cookie, previous, &dip)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((dip == NULL) && (cookie->link == NULL)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *next = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (dip != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *next = dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* dip == NULL */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel previous = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel cookie = cookie->link;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic dev_info_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_find_axq_node(uint_t axq_id)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *name;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int size;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwo_regspec_t *reg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int circ;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "sc_find_axq_node: id=0x%x\n", axq_id));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Hold root node busy to walk its child list
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ndi_devi_enter(ddi_root_node(), &circ);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dip = ddi_get_child(ddi_root_node());
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (dip != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "Searching dip=0x%p for our AXQ\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel DDI_PROP_DONTPASS, "name", (caddr_t)&name, &size)
03831d35f7499c87d51205817c93e9a8d42c4baestevel != DDI_PROP_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This node does not have a name property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "dip=0x%p does not have a "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "'name' property\n", (void *)dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dip = ddi_get_next_sibling(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dip=0x%p name=%s\n", (void *)dip, name));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (strcmp(name, "address-extender-queue")) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This node is not a AXQ node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "dip=0x%p is not an AXQ "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "node\n", (void *)dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(name, size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel dip = ddi_get_next_sibling(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(name, size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel DDI_PROP_DONTPASS, "reg", (caddr_t)&reg, &size)
03831d35f7499c87d51205817c93e9a8d42c4baestevel != DDI_PROP_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This AXQ node does not have a reg property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "dip=0x%p (AXQ Node) does "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "have a 'reg' property\n", (void *)dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel dip = ddi_get_next_sibling(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = ((reg[0].gptwo_phys_hi & 1) << 9) |
03831d35f7499c87d51205817c93e9a8d42c4baestevel ((reg[0].gptwo_phys_low & 0xff800000) >> 23);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(reg, size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (axq_id != id) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This is the wrong AXQ node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "dip=0x%p Wrong node id=0x%x\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)dip, id));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel dip = ddi_get_next_sibling(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel continue;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The correct AXQ node was found.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dip=0x%p Found AXQ Node\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel ndi_hold_devi(dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel ndi_devi_exit(ddi_root_node(), circ);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "sc_find_axq_node: Returning 0x%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstruct axq_arg {
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *axq_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int
03831d35f7499c87d51205817c93e9a8d42c4baestevelaxq_set_prop(dev_info_t *axq_dip, void *arg, uint_t flags)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct axq_arg *aqp = (struct axq_arg *)arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwo_regspec_t reg[2];
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(aqp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel id = aqp->id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ndi_prop_update_string(DDI_DEV_T_NONE, axq_dip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "name", "address-extender-queue") != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create name property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_WALK_ERROR);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ndi_prop_update_string(DDI_DEV_T_NONE, axq_dip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "device_type", "address-extender-queue") != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create device_type property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_WALK_ERROR);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ndi_prop_update_string(DDI_DEV_T_NONE, axq_dip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "compatible", "SUNW,axq") != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "sc_gptwocfg: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create compatible property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_WALK_ERROR);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ndi_prop_update_int(DDI_DEV_T_NONE, axq_dip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "portid", id) != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create portid property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_WALK_ERROR);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[0].gptwo_phys_hi = 0x400 | (id >> 9);
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[0].gptwo_phys_low = (id << 23);
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[0].gptwo_size_hi = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[0].gptwo_size_low = 0x520;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[1].gptwo_phys_hi = 0x401;
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[1].gptwo_phys_low = 0xf0000000;
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[1].gptwo_size_hi = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel reg[1].gptwo_size_low = 0x520;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ndi_prop_update_int_array(DDI_DEV_T_NONE,
03831d35f7499c87d51205817c93e9a8d42c4baestevel axq_dip, "reg", (int *)&reg,
03831d35f7499c87d51205817c93e9a8d42c4baestevel (sizeof (gptwo_regspec_t) * 2)/sizeof (int)) != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create reg property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_WALK_ERROR);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (DDI_WALK_TERMINATE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baestevelget_axq_dip(dev_info_t *rdip, void *arg, uint_t flags)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct axq_arg *aqp = (struct axq_arg *)arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(aqp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel aqp->axq_dip = rdip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic gptwo_new_nodes_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_gptwocfg_configure_axq(dev_info_t *ap, uint_t id, int create_nodes)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct axq_arg arg = {0};
03831d35f7499c87d51205817c93e9a8d42c4baestevel devi_branch_t b = {0};
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *axq_dip, *fdip = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwo_new_nodes_t *new_nodes = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int rv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_axq: id=0x%x "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "create_nodes=%d\n", id, create_nodes));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!create_nodes) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel axq_dip = sc_find_axq_node(id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (axq_dip) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_nodes = gptwocfg_allocate_node_list(1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_nodes->gptwo_nodes[0] = axq_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(!e_ddi_branch_held(axq_dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel e_ddi_branch_hold(axq_dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Release hold from sc_find_axq_node()
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel ddi_release_devi(axq_dip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_axq: "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "Returning 0x%p\n", (void *)new_nodes));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (new_nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel arg.id = id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel arg.axq_dip = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel b.arg = &arg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel b.type = DEVI_BRANCH_SID;
03831d35f7499c87d51205817c93e9a8d42c4baestevel b.create.sid_branch_create = axq_set_prop;
03831d35f7499c87d51205817c93e9a8d42c4baestevel b.devi_branch_callback = get_axq_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = e_ddi_branch_create(ap, &b, &fdip, DEVI_BRANCH_CONFIGURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *path = kmem_alloc(MAXPATHLEN, KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If non-NULL, fdip is held and must be released.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (fdip != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) ddi_pathname(fdip, path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ddi_release_devi(fdip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) ddi_pathname(ap, path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "e_ddi_branch_create failed: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "path=%s, dip=%p, rv=%d", path, fdip ? (void *)fdip :
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void *)ap, rv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(path, MAXPATHLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel axq_dip = arg.axq_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_nodes = gptwocfg_allocate_node_list(1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_nodes->gptwo_nodes[0] = axq_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (new_nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic gptwocfg_config_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_gptwocfg_unconfigure_axq(gptwocfg_config_t *config)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel int failure = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *saf_dip;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (config == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: sc_gptwocfg_unconfigure_axq: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Invalid AXQ\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < config->gptwo_nodes->gptwo_number_of_nodes; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel int rv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel dev_info_t *fdip = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel saf_dip = config->gptwo_nodes->gptwo_nodes[i];
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(e_ddi_branch_held(saf_dip));
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = e_ddi_branch_destroy(saf_dip, &fdip, 0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *path = kmem_alloc(MAXPATHLEN, KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If non-NULL, fdip is held and must be released.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (fdip != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) ddi_pathname(fdip, path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ddi_release_devi(fdip);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) ddi_pathname(saf_dip, path);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_CONT, "AXQ node removal failed: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "path=%s, dip=%p, rv=%d\n", path,
03831d35f7499c87d51205817c93e9a8d42c4baestevel fdip ? (void *)fdip : (void *)saf_dip, rv);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(path, MAXPATHLEN);
03831d35f7499c87d51205817c93e9a8d42c4baestevel failure = 1;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel config->gptwo_nodes->gptwo_nodes[i] = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!failure) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwocfg_free_node_list(config->gptwo_nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(config, sizeof (gptwocfg_config_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel config = NULL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (config);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint_t
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_get_agent_id(spcd_t *pcd, uint_t expander, uint_t slot, uint_t prd_slot)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint_t agent_id;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (pcd->spcd_ptype) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_CPU:
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (slot == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = prd_slot;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prd_slot == 4) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = 8;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = 9;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_sPCI:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_cPCI:
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_PCIX:
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prd_slot == 4) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = 0x1c;
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = 0x1d;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_WCI:
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id = 0x1d;
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: Invalid Safari Port "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Type 0x%x Slot 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_ptype, prd_slot);
03831d35f7499c87d51205817c93e9a8d42c4baestevel } /* switch */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel agent_id |= (expander << 5);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "sc_get_agent_id(pcd=0x%p, expander=0x%x, "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "prd_slot=0x%x) Returning agent_id=0x%x\n", (void *)pcd, expander,
03831d35f7499c87d51205817c93e9a8d42c4baestevel prd_slot, agent_id));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (agent_id);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baesteveldump_config(sc_gptwocfg_config_t *board_config)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel gptwocfg_config_t *port;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dump_config 0x%p", (void *)board_config));
03831d35f7499c87d51205817c93e9a8d42c4baestevel while (board_config != NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "************* 0x%p ************\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)board_config));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "port_cookie - 0x%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)board_config->port_cookie));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel port = board_config->port_cookie;
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (port) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ap - 0x%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)port->gptwo_ap));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " portid - 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel port->gptwo_portid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "portid - 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->portid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "board - 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config->board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "link - 0x%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)board_config->link));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "next - 0x%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)board_config->next));
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = board_config->link;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void
03831d35f7499c87d51205817c93e9a8d42c4baesteveldump_pcd(spcd_t *pcd)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dump_pcd 0x%p", (void *)pcd));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " magic - 0x%x\n", pcd->spcd_magic));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " version - 0x%x\n", pcd->spcd_version));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ver.reg - 0x%lx\n", pcd->spcd_ver_reg));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " afreq - %d\n", pcd->spcd_afreq));
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (pcd->spcd_ptype) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_CPU:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ptype - CPU\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_sPCI:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ptype - sPCI\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_cPCI:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ptype - cPCI\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_PCIX:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ptype - sPCI+\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case SAFPTYPE_WCI:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ptype - WIC\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ptype - 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_ptype));
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " cache - %d\n", pcd->spcd_cache));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->spcd_prsv == SPCD_RSV_PASS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " prsv - SPCD_RSV_PASS\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " prsv - 0x%x (FAIL)\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_prsv));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->spcd_agent[i] == SPCD_RSV_PASS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " agent[%d] "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "- SPCD_RSV_PASS\n", i));
03831d35f7499c87d51205817c93e9a8d42c4baestevel } else {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " agent[%d] "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "- 0x%x (FAIL)\n", i, pcd->spcd_agent[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->spcd_ptype == SAFPTYPE_CPU) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " cpuid[%d] - 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel i, pcd->spcd_cpuid[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " Banks\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_BANKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->sprd_bank_rsv[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " %d %s\n", i,
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_bank_rsv[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " Dimms\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_DIMMS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->sprd_dimm[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " %d %s\n", i,
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_dimm[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " Ecache Dimm Labels\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_DIMMS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (pcd->sprd_ecache_dimm_label[i]) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " %d %s\n", i,
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->sprd_ecache_dimm_label[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct {
03831d35f7499c87d51205817c93e9a8d42c4baestevel char Jnumber[8][8];
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t sym_flag;
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t d_dimmtable[144];
03831d35f7499c87d51205817c93e9a8d42c4baestevel uint8_t d_pintable[576];
03831d35f7499c87d51205817c93e9a8d42c4baestevel}m_layout;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use 2 bits to represent each bit at a cache line. The table
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is in big endian order, i.e.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * dimmtable[0], ... , dimmtable[143]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Q0:data-bits[127 126 125 124], ... , MtagEcc[3 2 1 0]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * .
03831d35f7499c87d51205817c93e9a8d42c4baestevel * .
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Q3:data-bits[127 126 125 124], ... , MtagEcc[3 2 1 0]
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baesteveluint8_t J_dimm_pinTable[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Jnumber */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x4a, 0x31, 0x33, 0x33, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x4a, 0x31, 0x33, 0x34, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0x4a, 0x31, 0x33, 0x35, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x4a, 0x31, 0x33, 0x36, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 0x4a, 0x31, 0x33, 0x33, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 5 */ 0x4a, 0x31, 0x33, 0x34, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 6 */ 0x4a, 0x31, 0x33, 0x35, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 7 */ 0x4a, 0x31, 0x33, 0x36, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* flag */ 0x01,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q0 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 0xe7, 0xe3, 0x9b, 0x1b,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q1 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 0xe7, 0xe3, 0x9b, 0x1b,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q2 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 0xe7, 0xe3, 0x9b, 0x1b,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q3 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 0xe7, 0xe3, 0x9b, 0x1b,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * In the following order
03831d35f7499c87d51205817c93e9a8d42c4baestevel * pintable[0], ..., pintable[575]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Quadword3, Quadword2, Quadword1, Quadword0
03831d35f7499c87d51205817c93e9a8d42c4baestevel * MtagEcc, Mtag, Ecc, Data
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q3 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 227, 227, 227, 227, 111, 111, 111, 22,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 22, 32, 138, 222, 81, 117, 117, 117,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 111, 222, 106, 222, 222, 106, 106, 106,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 217, 101, 212, 96, 217, 101, 212, 96,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 217, 101, 212, 96, 217, 101, 212, 96,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 5 */ 207, 91, 202, 86, 187, 71, 158, 42,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 6 */ 187, 71, 158, 42, 153, 37, 148, 32,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 7 */ 153, 37, 148, 32, 153, 37, 148, 32,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 8 */ 153, 37, 148, 143, 27, 138, 143, 27,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 9 */ 143, 27, 138, 22, 207, 91, 202, 86,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 10 */ 207, 91, 202, 86, 207, 91, 202, 86,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 11 */ 192, 76, 81, 192, 76, 81, 192, 76,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 12 */ 197, 81, 192, 76, 187, 71, 158, 42,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 13 */ 187, 71, 158, 42, 143, 27, 138, 22,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 14 */ 133, 17, 128, 12, 133, 17, 128, 12,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 15 */ 133, 17, 128, 12, 133, 17, 128, 12,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 16 */ 123, 07, 118, 2, 123, 07, 118, 2,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 17 */ 123, 07, 118, 2, 123, 07, 118, 2,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q2 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 228, 228, 228, 228, 112, 112, 112, 23,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 23, 33, 139, 223, 82, 118, 118, 118,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 112, 223, 107, 223, 223, 107, 107, 107,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 218, 102, 213, 97, 218, 102, 213, 97,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 218, 102, 213, 97, 218, 102, 213, 97,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 5 */ 208, 92, 203, 87, 188, 72, 159, 43,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 6 */ 188, 72, 159, 43, 154, 38, 149, 33,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 7 */ 154, 38, 149, 33, 154, 38, 149, 33,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 8 */ 154, 38, 149, 144, 28, 139, 144, 28,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 9 */ 144, 28, 139, 23, 208, 92, 203, 87,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 10 */ 208, 92, 203, 87, 208, 92, 203, 87,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 11 */ 193, 77, 82, 193, 77, 82, 193, 77,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 12 */ 198, 82, 193, 77, 188, 72, 159, 43,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 13 */ 188, 72, 159, 43, 144, 28, 139, 23,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 14 */ 134, 18, 129, 13, 134, 18, 129, 13,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 15 */ 134, 18, 129, 13, 134, 18, 129, 13,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 16 */ 124, 8, 119, 3, 124, 8, 119, 3,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 17 */ 124, 8, 119, 3, 124, 8, 119, 3,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q1 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 229, 229, 229, 229, 113, 113, 113, 24,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 24, 34, 140, 224, 83, 119, 119, 119,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 113, 224, 108, 224, 224, 108, 108, 108,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 219, 103, 214, 98, 219, 103, 214, 98,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 219, 103, 214, 98, 219, 103, 214, 98,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 5 */ 209, 93, 204, 88, 189, 73, 160, 44,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 6 */ 189, 73, 160, 44, 155, 39, 150, 34,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 7 */ 155, 39, 150, 34, 155, 39, 150, 34,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 8 */ 155, 39, 150, 145, 29, 140, 145, 29,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 9 */ 145, 29, 140, 24, 209, 93, 204, 88,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 10 */ 209, 93, 204, 88, 209, 93, 204, 88,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 11 */ 194, 78, 83, 194, 78, 83, 194, 78,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 12 */ 199, 83, 194, 78, 189, 73, 160, 44,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 13 */ 189, 73, 160, 44, 145, 29, 140, 24,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 14 */ 135, 19, 130, 14, 135, 19, 130, 14,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 15 */ 135, 19, 130, 14, 135, 19, 130, 14,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 16 */ 125, 9, 120, 4, 125, 9, 120, 4,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 17 */ 125, 9, 120, 4, 125, 9, 120, 4,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q0 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 230, 230, 230, 230, 114, 114, 114, 25,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 25, 35, 141, 225, 84, 200, 200, 200,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 114, 225, 109, 225, 225, 109, 109, 109,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 220, 104, 215, 99, 220, 104, 215, 99,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 220, 104, 215, 99, 220, 104, 215, 99,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 5 */ 210, 94, 205, 89, 190, 74, 161, 45,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 6 */ 190, 74, 161, 45, 156, 40, 151, 35,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 7 */ 156, 40, 151, 35, 156, 40, 151, 35,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 8 */ 156, 40, 151, 146, 30, 141, 146, 30,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 9 */ 146, 30, 141, 25, 210, 94, 205, 89,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 10 */ 210, 94, 205, 89, 210, 94, 205, 89,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 11 */ 195, 79, 84, 195, 79, 84, 195, 79,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 12 */ 200, 84, 195, 79, 190, 74, 161, 45,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 13 */ 190, 74, 161, 45, 146, 30, 141, 25,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 14 */ 136, 20, 131, 15, 136, 20, 131, 15,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 15 */ 136, 20, 131, 15, 136, 20, 131, 15,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 16 */ 126, 10, 121, 5, 126, 10, 121, 5,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 17 */ 126, 10, 121, 5, 126, 10, 121, 5
03831d35f7499c87d51205817c93e9a8d42c4baestevel};
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This table is for internal reference
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * pintable_internal[]= {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * -- Q0 --
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 0 143,143,143,143,139,139,139,35
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 1 35,51,39,135,91,95,95,95
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 2 139,135,131,135,135,131,131,131
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 3 127,123,119,115,127,123,119,115
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 4 127,123,119,115,127,123,119,115
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 5 111,107,103,99,79,75,71,67
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 6 79,75,71,67,63,59,55,51
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 7 63,59,55,51,63,59,55,51
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 8 63,59,55,47,43,39,47,43
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 9 47,43,39,35,111,107,103,99
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 10 111,107,103,99,111,107,103,99
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 11 87,83,91,87,83,91,87,83
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 12 95,91,87,83,79,75,71,67
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 13 79,75,71,67,47,43,39,35
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 14 31,27,23,19,31,27,23,19
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 15 31,27,23,19,31,27,23,19
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 16 15,11,7,3,15,11,7,3
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 17 15,11,7,3,15,11,7,3
03831d35f7499c87d51205817c93e9a8d42c4baestevel * }
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelchar *dimm_Jno[] = {
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* P0 */ "J13300", "J13400", "J13500", "J13600",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "J13301", "J13401", "J13501", "J13601",
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* P1 */ "J14300", "J14400", "J14500", "J14600",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "J14301", "J14401", "J14501", "J14601",
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* P2 */ "J15300", "J15400", "J15500", "J15600",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "J15301", "J15401", "J15501", "J15601",
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* P3 */ "J16300", "J16400", "J16500", "J16600",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "J16301", "J16401", "J16501", "J16601",
03831d35f7499c87d51205817c93e9a8d42c4baestevel NULL
03831d35f7499c87d51205817c93e9a8d42c4baestevel };
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint8_t *
03831d35f7499c87d51205817c93e9a8d42c4baestevelget_memlayout(uint32_t cpuid, uint32_t *len)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel m_layout *LayoutBuf;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((LayoutBuf = (m_layout *)kmem_zalloc(sizeof (m_layout),
03831d35f7499c87d51205817c93e9a8d42c4baestevel KM_SLEEP)) == NULL) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel *len = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bcopy(J_dimm_pinTable, LayoutBuf, sizeof (m_layout));
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel *len = sizeof (m_layout);
03831d35f7499c87d51205817c93e9a8d42c4baestevel cpuid &= 0x03; /* last 2 bits of a 10 bit number */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel bcopy(dimm_Jno[cpuid << 3], LayoutBuf->Jnumber[0], 64);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return ((uint8_t *)LayoutBuf);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *
03831d35f7499c87d51205817c93e9a8d42c4baestevelrsv_string(prdrsv_t rsv)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *buffer;
03831d35f7499c87d51205817c93e9a8d42c4baestevel char *status;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (rsv) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_UNKNOWN:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "unknown";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_PRESENT:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "okay";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_CRUNCH:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "disabled";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_UNDEFINED:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "undefined";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_MISS:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "missing";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_EMPTY_CASSETTE:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "disabled";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_MISCONFIG:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "misconfigured";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_FAIL_OBP:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "fail-obp";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_BLACK:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "blacklisted";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_RED:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "redlisted";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_EXCLUDED:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "disabled";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_UNCONFIG:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "disabled";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_PASS:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "okay";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel case RSV_FAIL:
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel buffer = "fail";
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel status = kmem_alloc(strlen(buffer) + 1, KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(status, buffer);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (status);
03831d35f7499c87d51205817c93e9a8d42c4baestevel}