sram.c revision 89b43686db1fe9681d80a7cf5662730cb9378cae
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
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use is subject to license terms.
89b43686db1fe9681d80a7cf5662730cb9378caeBayard Bell * Copyright (c) 2011 Bayard G. Bell. All rights reserved.
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Useful debugging Stuff */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Function protoypes
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int sram_attach(dev_info_t *, ddi_attach_cmd_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int sram_detach(dev_info_t *, ddi_detach_cmd_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic void sram_add_kstats(struct sram_soft_state *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Configuration data structures
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0, /* streamtab */
03831d35f7499c87d51205817c93e9a8d42c4baestevel D_MP | D_NEW | D_HOTPLUG, /* Driver compatibility flag */
03831d35f7499c87d51205817c93e9a8d42c4baestevel 0, /* refcnt */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Driver globals
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic int reset_info_created = 0;
03831d35f7499c87d51205817c93e9a8d42c4baestevel &mod_driverops, /* Type of module. This one is a driver */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * These are the module initialization routines.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (ddi_soft_state_zalloc(sramp, instance) != DDI_SUCCESS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Set the dip in the soft state */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get the board number from this devices parent. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((softsp->board = (int)ddi_getprop(DDI_DEV_T_ANY, softsp->pdip,
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sram%d: unable to retrieve %s property",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki " softsp=0x%p\n", instance, (void *)devi, (void *)softsp));
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* map in the registers for this device. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* nothing to suspend/resume here */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* create the kstats for this device. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* ARGSUSED */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get the instance of this devi */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* get the soft state pointer for this device node */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* FALLTHROUGH */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We do not remove the kstat here. There is only one instance for
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the whole machine, and it must remain in existence while the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * system is running.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* unmap the registers */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* free the soft state structure */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The Reset-info structure passed up by POST has it's own kstat.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * It only needs to get created once. So the first sram instance
03831d35f7499c87d51205817c93e9a8d42c4baestevel * that gets created will check for the OBP property 'reset-info'
03831d35f7499c87d51205817c93e9a8d42c4baestevel * in the root node of the OBP device tree. If this property exists,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * then the reset-info kstat will get created. Otherwise it will
03831d35f7499c87d51205817c93e9a8d42c4baestevel * not get created. This will inform users whether or not a fatal
03831d35f7499c87d51205817c93e9a8d42c4baestevel * hardware reset has recently occurred.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * only one reset_info kstat per system, so don't create it if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * it exists already.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* mark that this code has been run. */
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* does the root node have a 'fatal-reset-info' property? */
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (prom_getprop(prom_rootnode(), "fatal-reset-info",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* XXX - workaround for OBP bug */
03831d35f7499c87d51205817c93e9a8d42c4baestevel softsp->reset_info = softsp->sram_base + softsp->offset;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * First read size. In case FW has not word aligned structure,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * copy the unsigned int into a 4 byte union, then read it out as
03831d35f7499c87d51205817c93e9a8d42c4baestevel * an inteeger.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0, srptr = softsp->reset_info; i < 4; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the reset size is zero, then POST did not
03831d35f7499c87d51205817c93e9a8d42c4baestevel * record any info.
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Check for illegal size values. */
193974072f41a843678abf5f61979c748687e66bSherry Moore "reset_size: 0x%x",
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* create the reset-info kstat */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * now copy the data into kstat. Don't use block
03831d35f7499c87d51205817c93e9a8d42c4baestevel * copy, the local space sram does not support this.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < reset_size; i++) {