1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * CDDL HEADER START
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * The contents of this file are subject to the terms of the
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Common Development and Distribution License (the "License").
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * You may not use this file except in compliance with the License.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * or http://www.opensolaris.org/os/licensing.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * See the License for the specific language governing permissions
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * and limitations under the License.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * When distributing Covered Code, include this CDDL HEADER in each
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * If applicable, add the following below this CDDL HEADER, with the
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * fields enclosed by brackets "[]" replaced with your own identifying
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * information: Portions Copyright [yyyy] [name of copyright owner]
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * CDDL HEADER END
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
88294e09b5c27cbb12b6735e2fb247a86b76666dRichard Bean * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Use is subject to license terms.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * CPU functions to the Safari Configurator (gptwo_cpu)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/types.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/cred.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/mman.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/kmem.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/conf.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/ddi.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/sunddi.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/sunndi.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/modctl.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/stat.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/param.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/autoconf.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/ksynch.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/promif.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/ndi_impldefs.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/ddi_impldefs.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/machsystm.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/gp2cfg.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/gptwo_cpu.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#include <sys/cheetahregs.h>
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#ifdef DEBUG
1c42de6d020629af774dd9e9fc81be3f3ed9398egdint gptwo_cpu_debug = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic void debug(char *, uintptr_t, uintptr_t,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uintptr_t, uintptr_t, uintptr_t);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG0(level, flag, s) if (gptwo_cpu_debug >= level) \
1c42de6d020629af774dd9e9fc81be3f3ed9398egd cmn_err(flag, s)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG1(level, flag, fmt, a1) if (gptwo_cpu_debug >= level) \
1c42de6d020629af774dd9e9fc81be3f3ed9398egd debug(fmt, (uintptr_t)(a1), 0, 0, 0, 0);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG2(level, flag, fmt, a1, a2) if (gptwo_cpu_debug >= level) \
1c42de6d020629af774dd9e9fc81be3f3ed9398egd debug(fmt, (uintptr_t)(a1), (uintptr_t)(a2), 0, 0, 0);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG3(level, flag, fmt, a1, a2, a3) \
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (gptwo_cpu_debug >= level) \
1c42de6d020629af774dd9e9fc81be3f3ed9398egd debug(fmt, (uintptr_t)(a1), (uintptr_t)(a2), (uintptr_t)(a3), 0, 0);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#else
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG0(level, flag, s)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG1(level, flag, fmt, a1)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG2(level, flag, fmt, a1, a2)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#define GPTWO_DEBUG3(level, flag, fmt, a1, a2, a3)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#endif
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Devinfo branch create arg
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstruct bca {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd spcd_t *pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t cpuid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t coreid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dev_info_t *new_child;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd};
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic dev_info_t *gptwocfg_create_cpu_node(dev_info_t *, spcd_t *,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t, uint_t, uint_t, uint_t);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic dev_info_t *gptwocfg_create_mc_node(dev_info_t *, spcd_t *, uint_t);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic dev_info_t *gptwocfg_create_cmp_node(dev_info_t *, spcd_t *, uint_t);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int gptwocfg_create_core_node(dev_info_t *, spcd_t *, uint_t, uint_t);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int set_mc_props(dev_info_t *new_child, void *arg, uint_t flags);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int set_cmp_props(dev_info_t *new_child, void *arg, uint_t flags);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int set_cpu_props(dev_info_t *new_child, void *arg, uint_t flags);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int set_cpu_common_props(dev_info_t *new_child, struct bca *bcp);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int set_cpu_us3_props(dev_info_t *new_child, struct bca *bcp);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int set_cpu_us4_props(dev_info_t *new_child, struct bca *bcp);
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic void get_new_child(dev_info_t *rdip, void *arg, uint_t flags);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Module linkage information for the kernel.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdextern struct mod_ops mod_miscops;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic struct modlmisc modlmisc = {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd &mod_miscops, /* Type of module */
88294e09b5c27cbb12b6735e2fb247a86b76666dRichard Bean "gptwo->cpu configurator",
1c42de6d020629af774dd9e9fc81be3f3ed9398egd};
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic struct modlinkage modlinkage = {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd MODREV_1, (void *)&modlmisc, NULL
1c42de6d020629af774dd9e9fc81be3f3ed9398egd};
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdint
1c42de6d020629af774dd9e9fc81be3f3ed9398egd_init(void)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int err = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /* register device with the configurator */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwocfg_register_ops(SAFPTYPE_CPU, gptwocfg_configure_cpu, NULL);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if ((err = mod_install(&modlinkage)) != 0) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG1(1, CE_WARN, "gptwo_cpu (CPU/MC Functions) "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "failed to load, error=%d\n", err);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwocfg_unregister_ops(SAFPTYPE_CPU);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd } else {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_WARN, "gptwo_cpu (CPU/MC Functions) "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "has been loaded.\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (err);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdint
1c42de6d020629af774dd9e9fc81be3f3ed9398egd_fini(void)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /* cleanup/freeup structs with configurator */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwocfg_unregister_ops(SAFPTYPE_CPU);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (mod_remove(&modlinkage));
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdint
1c42de6d020629af774dd9e9fc81be3f3ed9398egd_info(struct modinfo *modinfop)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (mod_info(&modlinkage, modinfop));
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdgptwo_new_nodes_t *
1c42de6d020629af774dd9e9fc81be3f3ed9398egdgptwocfg_configure_cpu(dev_info_t *ap, spcd_t *pcd, uint_t portid)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dev_info_t *cpu_node[AGENTS_PER_PORT], *mc_node[AGENTS_PER_PORT];
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dev_info_t *cmp_node = NULL;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwo_new_nodes_t *new_nodes;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int nodes = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int i, j = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t implementation;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG2(1, CE_CONT, "gptwocfg_configure_cpu: portid=%x pcd=%lx\n",
1c42de6d020629af774dd9e9fc81be3f3ed9398egd portid, pcd);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd for (i = 0; i < AGENTS_PER_PORT; i++) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd cpu_node[i] = NULL;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd mc_node[i] = NULL;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd implementation = (pcd->spcd_ver_reg >> 32) & 0x000000000000ffff;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd switch (implementation) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CHEETAH_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CHEETAH_PLUS_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case JAGUAR_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case PANTHER_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd default:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd cmn_err(CE_WARN, "Unsupported cpu implementation=0x%x : "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "skipping configure of portid=0x%x", implementation,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd portid);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ASSERT(0);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (NULL);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (CPU_IMPL_IS_CMP(implementation)) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (cmp_node = gptwocfg_create_cmp_node(ap, pcd, portid))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd nodes++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd else
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (NULL);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd for (i = 0; i < AGENTS_PER_PORT; i++) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (pcd->spcd_agent[i] != SPCD_RSV_PASS)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd continue;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (cpu_node[i] = gptwocfg_create_cpu_node(cmp_node ?
1c42de6d020629af774dd9e9fc81be3f3ed9398egd cmp_node : ap, pcd, portid, pcd->spcd_cpuid[i], i,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd implementation)) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * If the CPU is a CMP, the entire branch is
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * manipulated using just the top node. Thus,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * the dips of the individual cores do not need
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * to be held or stored in the new node list.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (cmp_node) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd e_ddi_branch_rele(cpu_node[i]);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd } else {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd nodes++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /* current implementations have 1 MC node per Safari port */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (pcd->spcd_prsv == SPCD_RSV_PASS &&
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (mc_node[0] = gptwocfg_create_mc_node(ap, pcd, portid)))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd nodes++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_nodes = gptwocfg_allocate_node_list(nodes);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd j = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd for (i = 0; i < AGENTS_PER_PORT; i++) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if ((cpu_node[i] != NULL) && (!CPU_IMPL_IS_CMP(implementation)))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_nodes->gptwo_nodes[j++] = cpu_node[i];
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (mc_node[i] != NULL)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_nodes->gptwo_nodes[j++] = mc_node[i];
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (cmp_node)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_nodes->gptwo_nodes[j++] = cmp_node;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (new_nodes);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic dev_info_t *
1c42de6d020629af774dd9e9fc81be3f3ed9398egdgptwocfg_create_cmp_node(dev_info_t *ap, spcd_t *pcd, uint_t portid)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd devi_branch_t b;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.pcd = pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.portid = portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.cpuid = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.coreid = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.new_child = NULL;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.arg = &arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.type = DEVI_BRANCH_SID;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.create.sid_branch_create = set_cmp_props;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.devi_branch_callback = get_new_child;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (e_ddi_branch_create(ap, &b, NULL, 0))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (NULL);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (arg.new_child);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*ARGSUSED*/
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int
1c42de6d020629af774dd9e9fc81be3f3ed9398egdset_cmp_props(dev_info_t *new_child, void *arg, uint_t flags)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca *bap = (struct bca *)arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwo_regspec_t reg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd spcd_t *pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd pcd = bap->pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd portid = bap->portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG2(1, CE_CONT, "set_cmp_props: portid=%x pcd=%lx\n",
1c42de6d020629af774dd9e9fc81be3f3ed9398egd portid, pcd);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "name", "cmp") != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cmp_props: failed to "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "create name property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "portid", portid) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cmp_props: failed to "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "create portid property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_phys_hi = 0x400 | (portid >> 9);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_phys_low = (portid << 23);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_size_hi = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_size_low = 0x10000;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int_array(DDI_DEV_T_NONE,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_child, "reg", (int *)&reg,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd sizeof (gptwo_regspec_t) / sizeof (int)) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cmp_props: failed to "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "create reg property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_TERMINATE);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic dev_info_t *
1c42de6d020629af774dd9e9fc81be3f3ed9398egdgptwocfg_create_cpu_node(dev_info_t *ap, spcd_t *pcd, uint_t portid,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t cpuid, uint_t coreid, uint_t impl)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd devi_branch_t b = {0};
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.pcd = pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.portid = portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.cpuid = cpuid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.coreid = coreid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.impl = impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.new_child = NULL;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.arg = &arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.type = DEVI_BRANCH_SID;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.create.sid_branch_create = set_cpu_props;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.devi_branch_callback = get_new_child;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (e_ddi_branch_create(ap, &b, NULL, 0))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (NULL);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (arg.new_child);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*ARGSUSED*/
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int
1c42de6d020629af774dd9e9fc81be3f3ed9398egdset_cpu_props(dev_info_t *new_child, void *arg, uint_t flags)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca *bcp = arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t impl = bcp->impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int rc;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (set_cpu_common_props(new_child, bcp) != DDI_WALK_CONTINUE)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd switch (impl) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CHEETAH_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CHEETAH_PLUS_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd rc = set_cpu_us3_props(new_child, bcp);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case JAGUAR_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case PANTHER_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd rc = set_cpu_us4_props(new_child, bcp);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd default:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ASSERT(0);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (rc);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Set properties common to cpu (non-CMP) and core (CMP) nodes.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * cpuid
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * device_type
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * manufacturer#
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * implementation#
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * mask#
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * sparc-version
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * clock-frequency
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * #dtlb-entries
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * #itlb-entries
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int
1c42de6d020629af774dd9e9fc81be3f3ed9398egdset_cpu_common_props(dev_info_t *new_child, struct bca *bcp)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t cpuid, impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd spcd_t *pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int mask, manufacturer;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd cpuid = bcp->cpuid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd pcd = bcp->pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd impl = bcp->impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd mask = (pcd->spcd_ver_reg >> 24) & 0x00000000000000ff;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd manufacturer = (pcd->spcd_ver_reg >> 48) & 0x000000000000ffff;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "cpuid", cpuid) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create cpuid property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "device_type", "cpu") != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create device_type property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child, "manufacturer#",
1c42de6d020629af774dd9e9fc81be3f3ed9398egd manufacturer) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create manufacturer# property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child, "implementation#",
1c42de6d020629af774dd9e9fc81be3f3ed9398egd impl) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create implementation# property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child, "mask#",
1c42de6d020629af774dd9e9fc81be3f3ed9398egd mask) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create mask# property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "sparc-version", 9) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create sparc-version property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "clock-frequency", (pcd->spcd_afreq * 1000000)) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create clock-frequency property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "#dtlb-entries", 0x10) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create #dtlb-entries property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "#itlb-entries", 0x10) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_common_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create #itlb-entries property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_CONTINUE);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Set cpu node properties for Cheetah and Cheetah+.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * name
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * portid
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * reg
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * icache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * icache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * icache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * dcache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * dcache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * dcache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * ecache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * ecache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * ecache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int
1c42de6d020629af774dd9e9fc81be3f3ed9398egdset_cpu_us3_props(dev_info_t *new_child, struct bca *bcp)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd char *node_name;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwo_regspec_t reg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int ecache_size, ecache_line_size;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int dimms, ecache_assoc;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd spcd_t *pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t portid, impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd pcd = bcp->pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd portid = bcp->portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd impl = bcp->impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ASSERT(IS_CHEETAH(impl) || IS_CHEETAH_PLUS(impl));
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd switch (impl) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CHEETAH_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ecache_assoc = CH_ECACHE_NWAY;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd node_name = "SUNW,UltraSPARC-III";
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CHEETAH_PLUS_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Hard coding the ecache-associativity to 2 for Cheetah+.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * We probably should add this to the PCD.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ecache_assoc = CHP_ECACHE_NWAY;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd node_name = "SUNW,UltraSPARC-III+";
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd default:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG1(1, CE_CONT, "set_cpu_us3_props: invalid "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "implementation=0x%x\n", impl);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "name", node_name) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create name property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "portid", portid) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create portid property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_phys_hi = 0x400 | (portid >> 9);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_phys_low = (portid << 23);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_size_hi = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_size_low = 0x10000;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int_array(DDI_DEV_T_NONE,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_child, "reg", (int *)&reg,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd sizeof (gptwo_regspec_t) / sizeof (int)) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create reg property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "icache-size", CH_ICACHE_SIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create icache-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "icache-line-size", CH_ICACHE_LSIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create icache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "icache-associativity", CH_ICACHE_NWAY) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create icache-associativity property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "dcache-size", CH_DCACHE_SIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create dcache-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "dcache-line-size", CH_DCACHE_LSIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create dcache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "dcache-associativity", CH_DCACHE_NWAY) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create dcache-associativity property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Get the External Cache Size from the Common PCD.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ecache_size = pcd->spcd_cache * 0x100000;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "ecache-size", ecache_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create ecache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd switch (ecache_size) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CH_ECACHE_1M_SIZE:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ecache_line_size = 64;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CH_ECACHE_4M_SIZE:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ecache_line_size = 256;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case CH_ECACHE_8M_SIZE:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ecache_line_size = 512;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd default:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG1(1, CE_CONT, "set_cpu_us3_props: invalid "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "ecache-size 0x%x\b", ecache_size);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "ecache-line-size", ecache_line_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create ecache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "ecache-associativity", ecache_assoc) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us3_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create ecache-associativity property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Create the ecache-dimm-label property.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd while ((pcd->sprd_ecache_dimm_label[dimms] != NULL) &&
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (dimms < MAX_DIMMS_PER_PORT))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (dimms) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (void) ndi_prop_update_string_array(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "ecache-dimm-label", (char **)pcd->sprd_ecache_dimm_label,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_TERMINATE);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Set cmp core node properties for Jaguar and Panther.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * name
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * compatible
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * reg
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l1-icache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l1-icache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l1-icache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l1-dcache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l1-dcache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l1-dcache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l2-cache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l2-cache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l2-cache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l2-cache-sharing
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l3-cache-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l3-cache-line-size
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l3-cache-associativity
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * l3-cache-sharing
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int
1c42de6d020629af774dd9e9fc81be3f3ed9398egdset_cpu_us4_props(dev_info_t *new_child, struct bca *bcp)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t l1_icache_size, l1_icache_line_size;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t l2_cache_size, l2_cache_line_size, l2_cache_assoc;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t l2_cache_share;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t pcd_cache_size;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t coreid, impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd spcd_t *pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd char *compatible;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int dimms;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int i;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd pcd = bcp->pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd coreid = bcp->coreid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd impl = bcp->impl;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ASSERT(IS_JAGUAR(impl) || IS_PANTHER(impl));
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Get the External Cache Size from the Common PCD.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd pcd_cache_size = pcd->spcd_cache * 0x100000;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd switch (impl) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case JAGUAR_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd compatible = "SUNW,UltraSPARC-IV";
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l1_icache_size = CH_ICACHE_SIZE;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l1_icache_line_size = CH_ICACHE_LSIZE;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_assoc = CHP_ECACHE_NWAY;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Jaguar has no logical sharing of L2 cache, so the sharing
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * bit-map will represent this core only.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_share = coreid ? 0x2 : 0x1;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Jaguar has a split ecache, so the total ecache must be
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * divided in half to get the ecache for the individual core.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_size = pcd_cache_size / 2;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd switch (l2_cache_size) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case JG_ECACHE_4M_SIZE:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_line_size = 64;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case JG_ECACHE_8M_SIZE:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_line_size = 128;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd default:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG1(1, CE_CONT, "set_cpu_us4_props: "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "invalid l2_cache-size 0x%x\n", l2_cache_size);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd case PANTHER_IMPL:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ASSERT(pcd_cache_size == PN_L3_SIZE);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd compatible = "SUNW,UltraSPARC-IV+";
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l1_icache_size = PN_ICACHE_SIZE;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l1_icache_line_size = PN_ICACHE_LSIZE;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_size = PN_L2_SIZE;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_line_size = PN_L2_LINESIZE;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_assoc = PN_ECACHE_NWAY;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * For Panther, the L2 and L3 caches are logically shared by
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * all enabled cores, so the sharing bit-map will represent
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * all enabled cores. Panther split-mode is still considered
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * shared.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd *
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Check the PCD status to determine enabled cores.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd ASSERT(pcd->spcd_ptype == SAFPTYPE_CPU);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_share = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd for (i = 0; i < AGENTS_PER_PORT; i++) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (pcd->spcd_agent[i] == SPCD_RSV_PASS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd l2_cache_share |= (1 << i);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd break;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd default:
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG1(1, CE_CONT, "set_cpu_us4_props: invalid "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "implementation=0x%x\n", impl);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "name", "cpu") != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create name property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "compatible", compatible) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create compatible property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "reg", coreid) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create reg property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l1-icache-size", l1_icache_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l1-icache-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l1-icache-line-size", l1_icache_line_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create icache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l1-icache-associativity", CH_ICACHE_NWAY) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l1-icache-associativity property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l1-dcache-size", CH_DCACHE_SIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l1-dcache-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l1-dcache-line-size", CH_DCACHE_LSIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create dcache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l1-dcache-associativity", CH_DCACHE_NWAY) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l1-dcache-associativity property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l2-cache-size", l2_cache_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l2-cache-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l2-cache-line-size", l2_cache_line_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l2_cache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l2-cache-associativity", l2_cache_assoc) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l2-cache-associativity property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l2-cache-sharing", l2_cache_share) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create l2-cache-sharing property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Create the ecache-dimm-label property.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd while ((pcd->sprd_ecache_dimm_label[dimms] != NULL) &&
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (dimms < MAX_DIMMS_PER_PORT))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (dimms) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (void) ndi_prop_update_string_array(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "ecache-dimm-label", (char **)pcd->sprd_ecache_dimm_label,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (IS_PANTHER(impl)) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int l3_cache_share = l2_cache_share;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l3-cache-size", PN_L3_SIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "failed to create l3-cache-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l3-cache-line-size", PN_L3_LINESIZE) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "failed to create l3-cache-line-size property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l3-cache-associativity", PN_ECACHE_NWAY) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "failed to create l3-cache-associativity "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "l3-cache-sharing", l3_cache_share) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_cpu_us4_props: "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "failed to create l3-cache-sharing property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_TERMINATE);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic dev_info_t *
1c42de6d020629af774dd9e9fc81be3f3ed9398egdgptwocfg_create_mc_node(dev_info_t *ap, spcd_t *pcd, uint_t portid)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd devi_branch_t b = {0};
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.pcd = pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.portid = portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.cpuid = portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd arg.new_child = NULL;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.arg = &arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.type = DEVI_BRANCH_SID;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.create.sid_branch_create = set_mc_props;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd b.devi_branch_callback = get_new_child;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (e_ddi_branch_create(ap, &b, NULL, 0))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (NULL);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (arg.new_child);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*ARGSUSED*/
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic int
1c42de6d020629af774dd9e9fc81be3f3ed9398egdset_mc_props(dev_info_t *new_child, void *arg, uint_t flags)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca *bcp = arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd gptwo_regspec_t reg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd int banks, dimms;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd spcd_t *pcd = bcp->pcd;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t portid = bcp->portid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uint_t cpuid = bcp->cpuid;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG3(1, CE_CONT, "set_mc_props: ap=0x%lx portid=0x%x "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "cpuid=0x%x\n", ddi_get_parent(new_child), portid, cpuid);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "name", "memory-controller") != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create name property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "compatible", "SUNW,UltraSPARC-III,mc") != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create compatible property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_string(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "device_type", "memory-controller") != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create device_type property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "portid", portid) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create portid property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "cpuid", cpuid) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create cpuid property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_phys_hi = 0x400 | (portid >> 9);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_phys_low = (portid << 23) | 0x400000;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_size_hi = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd reg.gptwo_size_low = 0x48;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_int_array(DDI_DEV_T_NONE,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_child, "reg", (int *)&reg,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd sizeof (gptwo_regspec_t) / sizeof (int)) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create reg property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (pcd->memory_layout) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (ndi_prop_update_byte_array(DDI_DEV_T_NONE,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd new_child, "memory-layout", (uchar_t *)pcd->memory_layout,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd pcd->memory_layout_size) != DDI_SUCCESS) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd GPTWO_DEBUG0(1, CE_CONT, "set_mc_props: failed "
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "to create memory-layout property\n");
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_ERROR);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Create the bank-status property.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd banks = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd while ((pcd->sprd_bank_rsv[banks] != NULL) &&
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (banks < MAX_BANKS_PER_PORT))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd banks++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (banks) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (void) ndi_prop_update_string_array(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "bank-status", (char **)pcd->sprd_bank_rsv, banks);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd /*
1c42de6d020629af774dd9e9fc81be3f3ed9398egd * Create the dimm-status property.
1c42de6d020629af774dd9e9fc81be3f3ed9398egd */
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms = 0;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd while ((pcd->sprd_dimm[dimms] != NULL) &&
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (dimms < MAX_DIMMS_PER_PORT))
1c42de6d020629af774dd9e9fc81be3f3ed9398egd dimms++;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd if (dimms) {
1c42de6d020629af774dd9e9fc81be3f3ed9398egd (void) ndi_prop_update_string_array(DDI_DEV_T_NONE, new_child,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd "dimm-status", (char **)pcd->sprd_dimm, dimms);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd }
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd return (DDI_WALK_TERMINATE);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd/*ARGSUSED*/
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic void
1c42de6d020629af774dd9e9fc81be3f3ed9398egdget_new_child(dev_info_t *rdip, void *arg, uint_t flags)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd struct bca *bcp = arg;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd bcp->new_child = rdip;
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#ifdef DEBUG
1c42de6d020629af774dd9e9fc81be3f3ed9398egdstatic void
1c42de6d020629af774dd9e9fc81be3f3ed9398egddebug(char *fmt, uintptr_t a1, uintptr_t a2, uintptr_t a3,
1c42de6d020629af774dd9e9fc81be3f3ed9398egd uintptr_t a4, uintptr_t a5)
1c42de6d020629af774dd9e9fc81be3f3ed9398egd{
1c42de6d020629af774dd9e9fc81be3f3ed9398egd cmn_err(CE_CONT, fmt, a1, a2, a3, a4, a5);
1c42de6d020629af774dd9e9fc81be3f3ed9398egd}
1c42de6d020629af774dd9e9fc81be3f3ed9398egd#endif