03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions
03831d35f7499c87d51205817c93e9a8d42c4baestevel * and limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * When distributing Covered Code, include this CDDL HEADER in each
03831d35f7499c87d51205817c93e9a8d42c4baestevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If applicable, add the following below this CDDL HEADER, with the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * fields enclosed by brackets "[]" replaced with your own identifying
03831d35f7499c87d51205817c93e9a8d42c4baestevel * information: Portions Copyright [yyyy] [name of copyright owner]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CDDL HEADER END
56f33205c9ed776c3c909e07d52e94610a675740Jonathan Adams * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * memory management for serengeti dr memory
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int sbdp_get_meminfo(pnode_t, int, uint64_t *, uint64_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sbd_cond_t mc_check_sibling_cpu(pnode_t nodeid);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void _sbdp_copy_rename_end(void);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int sbdp_copy_rename__relocatable(sbdp_cr_handle_t *,
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int sbdp_prep_rename_script(sbdp_cr_handle_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int sbdp_get_lowest_addr_in_node(pnode_t, uint64_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern void flush_ecache_il(uint64_t physaddr, size_t size, size_t linesize);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern uint64_t ldxasi_il(uint64_t physaddr, uint_t asi);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern void sbdp_exec_script_il(sbdp_rename_script_t *rsp);
03831d35f7499c87d51205817c93e9a8d42c4baestevelint sbdp_add_nodes_banks(pnode_t node, sbdp_bank_t **banks);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Head to the system segments link list
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_mem_alignment(sbdp_handle_t *hp, dev_info_t *dip, uint64_t *align)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("memlist> 0x%" PRIx64", 0x%" PRIx64"\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Returns mem dip held
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_mem_dip(pnode_t node, void *arg, uint_t flags)
03831d35f7499c87d51205817c93e9a8d42c4baestevel int i, j, skip = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel sbdp_walk_prom_tree(prom_rootnode(), sbdp_get_mem_dip, &arg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < SBDP_MAX_MCS_PER_NODE; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Release hold acquired in sbdp_get_mem_dip()
03831d35f7499c87d51205817c93e9a8d42c4baestevel * XXX - The following two lines are from existing code.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * However, this appears to be incorrect - this check should be
03831d35f7499c87d51205817c93e9a8d42c4baestevel * made for each dip in list i.e within the for(i) loop.
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_del_memlist(sbdp_handle_t *hp, struct memlist *mlist)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef enum {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cph = kmem_zalloc(sizeof (sbdp_cr_handle_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("moving memory from memory board %d to board %d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "sbdp: copy-rename funclen (%d) > PAGESIZE (%d)",
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * mempage will be page aligned, since we're calling
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kmem_alloc() with an exact multiple of PAGESIZE.
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SBDP_DBG_MEM("mempage = 0x%p\n", (void *)mempage);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy the code for the copy-rename routine into
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a page aligned piece of memory. We do this to guarantee
03831d35f7499c87d51205817c93e9a8d42c4baestevel * that we're executing within the same page and thus reduce
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the possibility of cache collisions between different
03831d35f7499c87d51205817c93e9a8d42c4baestevel bcopy((caddr_t)sbdp_copy_rename__relocatable, mempage, funclen);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SBDP_DBG_MEM("copy-rename funcp = 0x%p (len = 0x%x)\n", (void *)funcp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Prepare data page that will contain script of
03831d35f7499c87d51205817c93e9a8d42c4baestevel * operations to perform during copy-rename.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Allocate temporary buffer to hold script.
03831d35f7499c87d51205817c93e9a8d42c4baestevel size = sizeof (sbdp_rename_script_t) * SBDP_RENAME_MAXOP;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We need to make sure we don't switch cpus since we depend on the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * correct cpu processing
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni cmn_err(CE_WARN, "sbdp failed to prep for copy-rename");
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("copy-rename script length = 0x%x\n", scriptlen);
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni cmn_err(CE_WARN, "sbdp: func len (%d) + script len (%d) "
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni "+ index len (%d) > PAGESIZE (%d)", funclen, scriptlen,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Find aligned area within data page to maintain script.
03831d35f7499c87d51205817c93e9a8d42c4baestevel data_area += (ulong_t)funclen + (ulong_t)(linesize - 1);
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni cmn_err(CE_WARN, "sbdp: available len (%d) < script len (%d)",
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("copy-rename script data area = 0x%lx\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel bcopy((caddr_t)rsbuffer, (caddr_t)data_area, scriptlen);
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni index_area = data_area + (ulong_t)scriptlen + (ulong_t)(linesize - 1);
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni "sbdp: index area size (%d) > available (%d)\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SBDP_DBG_MEM("copy-rename index area = 0x%p\n", (void *)indexp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("src\n\tbd\t%d\n\tnode\t%d\n\tbpa 0x%lx\n\tnodes\t%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki s_bdp->bd, s_bdp->wnode, s_bdp->bpa, (void *)s_bdp->nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("tgt\n\tbd\t%d\n\tnode\t%d\n\tbpa 0x%lx\n\tnodes\t%p\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki t_bdp->bd, t_bdp->wnode, t_bdp->bpa, (void *)t_bdp->nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Quiesce the OS.
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni cmn_err(CE_WARN, "sbdp: failed to quiesce OS for copy-rename");
03831d35f7499c87d51205817c93e9a8d42c4baestevel * =================================
03831d35f7499c87d51205817c93e9a8d42c4baestevel * COPY-RENAME BEGIN.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * =================================
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("s_base 0x%lx t_base 0x%lx\n", cph->s_bdp->bpa,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* disable CE reporting */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* enable CE reporting */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("s_base 0x%lx t_base 0x%lx\n", cph->s_bdp->bpa,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * =================================
03831d35f7499c87d51205817c93e9a8d42c4baestevel * COPY-RENAME END.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * =================================
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Resume the OS.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "sbdp: failed to resume OS for copy-rename");
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("copy-rename elapsed time = %ld ticks (%ld secs)\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "failed to idle memory controller %s: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "unknown copy-rename error code (%d)", cr_err);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Rename memory for lgroup.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Source and target board numbers are packaged in arg.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * swap list of banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Update the cached board info for both the source and the target
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Tell the sc that we have swapped slices.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* This is dangerous. The in use slice could be re-used! */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_copy_regs(pnode_t node, uint64_t bpa, uint64_t new_base, int inval,
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("sbdp_copy_regs: failed to read source Decode "
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SBDP_MAX_MCS_PER_NODE; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Skip invalid banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((mc_decode[i] & SG_DECODE_VALID) != SG_DECODE_VALID) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We need to calculate the offset from the base pa
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to add it appropriately to the new_base.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The offset needs to be in UM relative to the mc
03831d35f7499c87d51205817c93e9a8d42c4baestevel * decode register. Since we are going from physical
03831d35f7499c87d51205817c93e9a8d42c4baestevel * address to UM, we need to shift it by PHYS2UM_SHIFT.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * To get it ready to OR it with the MC decode reg,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * we need to shift it left MC_UM_SHIFT
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Convert tmp_base into a physical address */
03831d35f7499c87d51205817c93e9a8d42c4baestevel tmp_base = (tmp_base >> MC_UM_SHIFT) << PHYS2UM_SHIFT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Convert tmp_base to be MC reg ready */
03831d35f7499c87d51205817c93e9a8d42c4baestevel tmp_base = (tmp_base >> PHYS2UM_SHIFT) << MC_UM_SHIFT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Step 1: Write source base address to the MC
03831d35f7499c87d51205817c93e9a8d42c4baestevel * with present bit off.
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsp[m].masr_addr = mc_get_addr(node, i, &rsp[m].asi);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Step 2: Now rewrite the mc reg with present bit on.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("mc_get_sibling_cpu failed: dnode=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("invalid prom_getproplen for name prop: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(cpu_node, "name", (caddr_t)namebuf) == -1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("failed to read name property for dnode=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If this is a CMP node, the child has the implementation
03831d35f7499c87d51205817c93e9a8d42c4baestevel * property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(cpu_node, "implementation#", (caddr_t)&impl) == -1) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("failed to read implementation# property for "
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("mc_get_sibling_cpu_impl: found impl=0x%x, dnode=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Provide EMU Activity Status register ASI and address. Only valid for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Panther processors.
03831d35f7499c87d51205817c93e9a8d42c4baestevelmc_get_idle_reg(pnode_t nodeid, uint64_t *addr, uint_t *asi)
03831d35f7499c87d51205817c93e9a8d42c4baestevel ASSERT(mc_get_sibling_cpu_impl(nodeid) == PANTHER_IMPL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(nodeid, "portid", (caddr_t)&portid) < 0 ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("mc_get_idle_reg: failed to read portid prop "
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("mc_get_idle_reg: failed to read reg prop "
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Local access will be via ASI 0x4a, otherwise via Safari PIO.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This assumes the copy-rename will later run on the same proc,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * hence there is an assumption we are already bound.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If non-Panther board, add phys_banks entry for each physical bank.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If Panther board, add mc_idle_regs entry for each EMU Activity Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel * register. Increment the array indices b_idx and r_idx for each entry
03831d35f7499c87d51205817c93e9a8d42c4baestevel * populated by this routine.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The caller is responsible for allocating sufficient array entries.
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_prep_mc_idle_one(sbdp_bd_t *bp, sbdp_rename_script_t phys_banks[],
03831d35f7499c87d51205817c93e9a8d42c4baestevel int *b_idx, sbdp_mc_idle_script_t mc_idle_regs[], int *r_idx)
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SBDP_MAX_MEM_NODES_PER_BOARD; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* MC should not be accessed if cpu has failed */
03831d35f7499c87d51205817c93e9a8d42c4baestevel sibling_cpu_cond = mc_check_sibling_cpu(memnodes[i]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel "board=%d, mem node=%d, condition=%d",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Initialize the board cpu type, assuming all board cpus are
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the same type. This is true of all Cheetah-based processors.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Failure to read the cpu type is considered a fatal error.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < SBDP_MAX_MCS_PER_NODE; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * For non-Panther MCs that do not support read-bypass-write, we do a read
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to each physical bank, relying on the reads to block until all outstanding
03831d35f7499c87d51205817c93e9a8d42c4baestevel * write requests have completed. This mechanism is referred to as the bus
03831d35f7499c87d51205817c93e9a8d42c4baestevel * sync list and is used for Cheetah, Cheetah+, and Jaguar processors. The
03831d35f7499c87d51205817c93e9a8d42c4baestevel * bus sync list PAs for the source and target are kept together and comprise
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Section 1 of the rename script.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * For Panther processors that support the EMU Activity Status register,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * we ensure the writes have completed by polling the MCU_ACT_STATUS
03831d35f7499c87d51205817c93e9a8d42c4baestevel * field several times to make sure the MC queues are empty. The
03831d35f7499c87d51205817c93e9a8d42c4baestevel * EMU Activity Status register PAs for the source and target are
03831d35f7499c87d51205817c93e9a8d42c4baestevel * kept together and comprise Section 2 of the rename script.
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_prep_mc_idle_script(sbdp_bd_t *s_bp, sbdp_bd_t *t_bp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* CONSTCOND */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* allocate space for both source and target */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* section 1 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < nbanks; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* section 2 */
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < nregs; i++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsp[(*rsp_idx)++] = *(sbdp_rename_script_t *)&mc_idle_regs[i];
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * code assumes single mem-unit.
03831d35f7499c87d51205817c93e9a8d42c4baestevel int m = 0, i;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Calculate the new base address for the target bd
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_base = (s_bdp->bpa >> PHYS2UM_SHIFT) << MC_UM_SHIFT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Calculate the old base address for the source bd
03831d35f7499c87d51205817c93e9a8d42c4baestevel old_base = (t_bdp->bpa >> PHYS2UM_SHIFT) << MC_UM_SHIFT;
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("new 0x%lx old_base ox%lx temp_base 0x%lx\n", new_base,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Ensure the MC queues have been idled on the source and target
03831d35f7499c87d51205817c93e9a8d42c4baestevel * following the copy.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_prep_mc_idle_script(s_bdp, t_bdp, rsp, &m) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Script section terminator
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Invalidate the base in the target mc registers
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < t_num; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_copy_regs(t_nodes[i], t_bdp->bpa, temp_base, 1, rsp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Invalidate the base in the source mc registers
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < s_num; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_copy_regs(s_nodes[i], s_bdp->bpa, temp_base, 1, rsp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy the new base into the targets mc registers
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < t_num; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_copy_regs(t_nodes[i], t_bdp->bpa, new_base, 0, rsp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy the old base into the source mc registers
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < s_num; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_copy_regs(s_nodes[i], s_bdp->bpa, old_base, 0, rsp,
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Zero masr_addr value indicates the END.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < m; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel#endif /* DEBUG */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (m * sizeof (sbdp_rename_script_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * EMU Activity Status Register needs to be read idle several times.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See Panther PRM 12.5.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Using the "__relocatable" suffix informs DTrace providers (and anything
03831d35f7499c87d51205817c93e9a8d42c4baestevel * else, for that matter) that this function's text may be manually relocated
03831d35f7499c87d51205817c93e9a8d42c4baestevel * elsewhere before it is executed. That is, it cannot be safely instrumented
03831d35f7499c87d51205817c93e9a8d42c4baestevel * with any methodology that is PC-relative.
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_copy_rename__relocatable(sbdp_cr_handle_t *hp, struct memlist *mlist,
03831d35f7499c87d51205817c93e9a8d42c4baestevel csize = (size_t)(cpunodes[CPU->cpu_id].ecache_size * 2);
03831d35f7499c87d51205817c93e9a8d42c4baestevel linesize = (size_t)(cpunodes[CPU->cpu_id].ecache_linesize);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This copy does NOT use an ASI
03831d35f7499c87d51205817c93e9a8d42c4baestevel * that avoids the Ecache, therefore
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the dst_pa addresses may remain
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in our Ecache after the dst_pa
03831d35f7499c87d51205817c93e9a8d42c4baestevel * has been removed from the system.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * A subsequent write-back to memory
03831d35f7499c87d51205817c93e9a8d42c4baestevel * will cause an ARB-stop because the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * physical address no longer exists
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in the system. Therefore we must
03831d35f7499c87d51205817c93e9a8d42c4baestevel * flush out local Ecache after we
03831d35f7499c87d51205817c93e9a8d42c4baestevel * finish the copy.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* copy 32 bytes at src_pa to dst_pa */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* increment by 32 bytes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* decrement by 32 bytes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Since bcopy32_il() does NOT use an ASI to bypass
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the Ecache, we need to flush our Ecache after
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the copy is complete.
03831d35f7499c87d51205817c93e9a8d42c4baestevel flush_ecache_il(caddr, csize, linesize); /* inline version */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Non-Panther MCs are idled by reading each physical bank.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Panther MCs are idled by polling until the MCU idle state
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is read SBDP_MCU_IDLE_READS times in succession.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SBDP_MCU_IDLE_RETRIES; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel } while (v != MCU_ACT_STATUS &&
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* bailout */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* skip terminator */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The following inline assembly routine caches
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the rename script and then caches the code that
03831d35f7499c87d51205817c93e9a8d42c4baestevel * will do the rename. This is necessary
03831d35f7499c87d51205817c93e9a8d42c4baestevel * so that we don't have any memory references during
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the reprogramming. We accomplish this by first
03831d35f7499c87d51205817c93e9a8d42c4baestevel * jumping through the code to guarantee it's cached
03831d35f7499c87d51205817c93e9a8d42c4baestevel * before we actually execute it.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * IMPORTANT: This function's location MUST be located immediately
03831d35f7499c87d51205817c93e9a8d42c4baestevel * following sbdp_copy_rename__relocatable to accurately
03831d35f7499c87d51205817c93e9a8d42c4baestevel * estimate its size. Note that this assumes (!)the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * compiler keeps these functions in the order in which
03831d35f7499c87d51205817c93e9a8d42c4baestevel * they appear :-o
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Delete when implemented
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * In Serengeti this is a nop
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * In Serengeti this is a nop
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdphw_disable_memctrl(sbdp_handle_t *hp, dev_info_t *dip)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdphw_enable_memctrl(sbdp_handle_t *hp, dev_info_t *dip)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We are assuming one memory node therefore the base address is the lowest
03831d35f7499c87d51205817c93e9a8d42c4baestevel * segment possible
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdphw_get_base_physaddr(sbdp_handle_t *hp, dev_info_t *dip, uint64_t *pa)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_bd_and_wnode_num(nodeid, &board, &wnode) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) sbdp_walk_prom_tree(prom_rootnode(), sbdp_get_mem_dip, &arg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_lowest_addr_in_node(ddi_get_nodeid(list[i]),
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Release hold acquired in sbdp_get_mem_dip()
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Record the fact that an error has occurred
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_lowest_addr_in_node(pnode_t node, uint64_t *pa)
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("sbdp_get_lowest_addr_in_node: failed to "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "read source Decode Regs\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SBDP_MAX_MCS_PER_NODE; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Make sure that this node doesn't have its status
03831d35f7499c87d51205817c93e9a8d42c4baestevel * as failed
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) prom_getprop(node, "device_type", (caddr_t)type);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_bd_and_wnode_num(node, &bd, &wnode) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Make sure we don't overwrite the array
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_get_meminfo(pnode_t nodeid, int mc, uint64_t *size, uint64_t *base_pa)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_bd_and_wnode_num(nodeid, &board, &wnode) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("sbdp_get_meminfo: failed to read source "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Decode Regs");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Calculate memory size
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Check the valid bit to see if bank is there
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Luckily for us mem nodes and cpu/CMP nodes are siblings. All we need to
03831d35f7499c87d51205817c93e9a8d42c4baestevel * do is search in the same branch as the mem node for its sibling cpu or
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CMP node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(nodeid, OBP_PORTID, (caddr_t)&portid) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * cpus and memory are siblings so we don't need to traverse
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the whole tree, just a branch
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (sbdp_find_nearby_cpu_by_portid(nodeid, portid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Given a memory node, check it's sibling cpu or CMP to see if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * access to mem will be ok. We need to search for the node and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if found get its condition.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (sbdp_get_bd_and_wnode_num(nodeid, &bd, &wnode) < 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) prom_getprop(nodeid, OBP_PORTID, (caddr_t)&portid);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Access to the memory controller should not
03831d35f7499c87d51205817c93e9a8d42c4baestevel * be attempted if any of the cores are marked
03831d35f7499c87d51205817c93e9a8d42c4baestevel * as being in reset.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl for (i = 0; i < SBDP_MAX_CORES_PER_CMP; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prom_getprop(nodeid, "portid", (caddr_t)&portid) < 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * mc should not be accessed if their corresponding cpu
03831d35f7499c87d51205817c93e9a8d42c4baestevel * has failed.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Make sure we don't switch cpus
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SG_MAX_BANKS_PER_MC; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the memory controller is local to this CPU, we use
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the special ASI to read the decode registers.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Otherwise, we load the values from a magic address in
03831d35f7499c87d51205817c93e9a8d42c4baestevel * I/O space.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((prom_getprop(nodeid, "portid", (caddr_t)&portid) < 0) ||
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Make sure we don't switch cpus
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_mem_add_span(sbdp_handle_t *hp, uint64_t address, uint64_t size)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_mem_del_span(sbdp_handle_t *hp, uint64_t address, uint64_t size)
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = kcage_range_delete_post_mem_del(basepfn, npages);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "unexpected kcage_range_delete_post_mem_del"
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine gets the size including the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * bad banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("sbdp_get_mem_size: size 0x%" PRIx64 "\n", size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This function compares the list of banks passed with the banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in the segment
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_check_seg_with_banks(sbdp_seg_t *seg, sbdp_bank_t *banks)
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (cur_bank = seg->banks; cur_bank; cur_bank = cur_bank->seg_next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("banks found = %d total banks = %d\n", i, seg->nbanks);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If we find the same num of banks that are equal, then this segment
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is not interleaved across boards
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This routine determines if any of the memory banks on the board
03831d35f7499c87d51205817c93e9a8d42c4baestevel * participate in across board memory interleaving
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_isinterleaved(sbdp_handle_t *hp, dev_info_t *dip)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the banks for this board
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Search for the first bank with valid memory
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bankp = bdp->banks; bankp; bankp = bankp->bd_next)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If there are no banks in the board, then the board is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * not interleaved across boards
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Find the segment for the first bank
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Something bad has happened.
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Make sure that this segment is only composed of the banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in this board. If one is missing or we have an extra one
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the board is interleaved across boards
03831d35f7499c87d51205817c93e9a8d42c4baestevel is_interleave = sbdp_check_seg_with_banks(seg, bdp->banks);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Each node has 4 logical banks. This routine adds all the banks (including
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the invalid ones to the passed list. Note that we use the bd list and not
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the seg list
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_add_nodes_banks(pnode_t node, sbdp_bank_t **banks)
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (-1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < SBDP_MAX_MCS_PER_NODE; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This creates the mem for the new member of the list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Insert bank into the beginning of the list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Add this bank into its corresponding
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * given the info, create a new bank node and set the info
03831d35f7499c87d51205817c93e9a8d42c4baestevel * as appropriate. We allocate the memory for the bank. It is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * up to the caller to ensure the mem is freed
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_fill_bank_info(uint64_t mc_decode, sbdp_bank_t **bank)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Each bd has the potential of having mem banks on it. The banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * may be empty or not. This routine gets all the mem banks
03831d35f7499c87d51205817c93e9a8d42c4baestevel * for this bd
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < nmem; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * swap the list of banks for the 2 boards
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_swap_list_of_banks(sbdp_bd_t *bdp1, sbdp_bd_t *bdp2)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * free all the banks on the board. Note that a bank node belongs
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to 2 lists. The first list is the board list. The second one is
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the seg list. We only need to remove the bank from both lists but only
03831d35f7499c87d51205817c93e9a8d42c4baestevel * free the node once.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Remove the bank from the seg list first
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bp = bdp->banks, i = 0; bp; bp = bp->bd_next, i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (cur_seg = sys_seg; cur_seg; cur_seg = cur_seg->next)
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (bp = seg->banks, i = 0; bp; bp = bp->seg_next, i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if we got an invalid bank just skip it
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This bank is part of a new segment, so create
03831d35f7499c87d51205817c93e9a8d42c4baestevel * a struct for it and added to the list of segments
03831d35f7499c87d51205817c93e9a8d42c4baestevel cur_seg = kmem_zalloc(sizeof (sbdp_seg_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * add to the seg list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * add bank into segs bank list. Note we add at the head
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Remove this segment from the seg list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * remove this bank from its seg list
03831d35f7499c87d51205817c93e9a8d42c4baestevel * if we got an invalid bank just skip it
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the bank doesn't belong to any seg just return
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Find bank in the seg
03831d35f7499c87d51205817c93e9a8d42c4baestevel * found node, remove it
03831d35f7499c87d51205817c93e9a8d42c4baestevel * No banks left on this segment, remove the segment
03831d35f7499c87d51205817c93e9a8d42c4baestevel SBDP_DBG_MEM("No banks left in this segment, removing it\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (cur_seg = sys_seg; cur_seg; cur_seg = cur_seg->next) {
56f33205c9ed776c3c909e07d52e94610a675740Jonathan Adams for (ml = phys_install; ml; ml = ml->ml_next) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* copy 32 bytes at src_pa to dst_pa */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* increment by 32 bytes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* decrement by 32 bytes */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (!isdigit(c = *p)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (c) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* FALLTHROUGH */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel n *= 10; /* two steps to avoid unnecessary overflow */
03831d35f7499c87d51205817c93e9a8d42c4baestevel n += '0' - c; /* accum neg to avoid surprises at MAX */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (neg ? n : -n);
03831d35f7499c87d51205817c93e9a8d42c4baestevelsbdp_passthru_prep_script(sbdp_handle_t *hp, void *arg)
03831d35f7499c87d51205817c93e9a8d42c4baestevel cph = kmem_zalloc(sizeof (sbdp_cr_handle_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel size = sizeof (sbdp_rename_script_t) * SBDP_RENAME_MAXOP;
03831d35f7499c87d51205817c93e9a8d42c4baestevel "sbdp failed to prep for copy-rename");
03831d35f7499c87d51205817c93e9a8d42c4baestevel prom_printf("SCRIPT from board %d to board %d ->\n", board, t_board);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < (scriptlen / (sizeof (sbdp_rename_script_t))); i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsbuffer[i].masr_addr, rsbuffer[i].masr, rsbuffer[i].asi);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);