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.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Starcat Specific Glue for Safari Configurator
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define SC_DEBUG(level, args) if (sc_gptwocfg_debug >= level) cmn_err args
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic sc_gptwocfg_cookie_t sc_configure(uint_t, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic gptwo_new_nodes_t *sc_gptwocfg_configure_axq(dev_info_t *, uint_t, int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic gptwocfg_config_t *sc_gptwocfg_unconfigure_axq(gptwocfg_config_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic uint_t sc_get_agent_id(spcd_t *, uint_t, uint_t, uint_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern gptwo_new_nodes_t *gptwocfg_allocate_node_list(int);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern void gptwocfg_free_node_list(gptwo_new_nodes_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern int iosram_rd(uint32_t, uint32_t, uint32_t, caddr_t);
03831d35f7499c87d51205817c93e9a8d42c4baestevelextern void gptwocfg_devi_attach_to_parent(dev_info_t *);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Module control operations
f500b19684bd0346ac05bec02a50af07f369da1aRichard Bean "Sun Fire 15000 gptwocfg"
03831d35f7499c87d51205817c93e9a8d42c4baestevel mutex_init(&sc_gptwo_config_list_lock, NULL, MUTEX_DRIVER, NULL);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * CPU/PCI devices are already registered by their respective modules,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * so all we need to do now is install.
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_gptwocfg failed to load, error=%d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_gptwocfg has been loaded.\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_get_common_pcd() expander=%d prd_slot=%d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd = (gdcd_t *)kmem_zalloc(sizeof (gdcd_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the Starcat Specific Global DCD Structure from the golden
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (iosram_rd(GDCD_MAGIC, 0, sizeof (gdcd_t), (caddr_t)gdcd)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "From IOSRAM\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: GDCD Bad Magic 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel "GDCD Version 0x%x Expecting 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd = (spcd_t *)kmem_zalloc(sizeof (spcd_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Copy various information from the platform specific Port
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Resource Descriptor (PRD) To the platform independent
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Port Configuration Descriptor.
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_ptype = gdcd->dcd_prd[expander][prd_slot].prd_ptype;
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_ver_reg = gdcd->dcd_prd[expander][prd_slot].prd_ver_reg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This will calculate the cpu speed based on the
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the actual frequency ratio * interconnect frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel * converted to Mhz.
03831d35f7499c87d51205817c93e9a8d42c4baestevel (uint16_t)((gdcd->dcd_intercon_freq + 500000) / 1000000);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * For non-cpu devices, just pass through the frequency
03831d35f7499c87d51205817c93e9a8d42c4baestevel * unchanged.
03831d35f7499c87d51205817c93e9a8d42c4baestevel pcd->spcd_cache = gdcd->dcd_prd[expander][prd_slot].prd_cache;
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "Safari Device Status status=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in the entire port status.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (RSV_GOOD(gdcd->dcd_prd[expander][prd_slot].prd_prsv)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in the per agent status.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gdcd->dcd_prd[expander][prd_slot].prd_agent[1] == RSV_UNKNOWN) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If this is a CPU device calculate the cpuid for it. For Starcat
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the cpuid is in the following format.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * EEEEEPPAPP
03831d35f7499c87d51205817c93e9a8d42c4baestevel * where: EEEEE is the expander
03831d35f7499c87d51205817c93e9a8d42c4baestevel * PP_PP is the portid
03831d35f7499c87d51205817c93e9a8d42c4baestevel * __A__ is the sub-agent identifier.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Starcat does not have ports with UPA devices so
03831d35f7499c87d51205817c93e9a8d42c4baestevel * spcd_upadev structure will not be filled in.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in IO Bus Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < IOBUS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "bus=%d status=0x%x\n", i,
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_iobus_rsv[i]));
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_iobus_rsv[i])) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < IOCARD_PER_BUS; j++)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in IO Card Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < IOCARD_PER_BUS; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "slot=%d status=0x%x\n", i, j,
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (j == 1)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (j == 0)
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If POST marked the card as GOOD or if the slot
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is empty, we want to probe for the device.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Fill in WIC Link Status
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < LINKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel gdcd->dcd_prd[expander][prd_slot].prd_wic_links[i])) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get data for the "bank-status" property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[0][0]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[1][0]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[0][1]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rsv_string(gdcd->dcd_prd[expander][prd_slot].prd_bank_rsv[1][1]);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < PMBANKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (j = 0; j < DIMMS_PER_PMBANK; j++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get data for the "ecache-dimm-label" property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Right now it is hardcoded, but we should eventually get this
03831d35f7499c87d51205817c93e9a8d42c4baestevel * from the SC.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Maxcat labels.
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(pcd->sprd_ecache_dimm_label[i], label1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel (void) strcpy(pcd->sprd_ecache_dimm_label[i], label2);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_WARN, "sc_free_common_pcd pcd=%p\n", (void *)pcd));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_free_common_pcd: memory_layout %p "
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(pcd->memory_layout, pcd->memory_layout_size);
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_BANKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_DIMMS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel struct sc_gptwocfg_config *board_config, *last, *new;
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: board=%d, create_nodes=%d\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: exp=0x%x slot=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the Attachment Point. For Starcat the parent of all
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Safari children is root node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Get the agent id of the AXQ.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Look to see if the board is already configured by searching for
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (create_nodes && (axq_dip = sc_find_axq_node(agent_id))) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "Board %d AXQ is already configured\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Probe AXQ first
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Probing AXQ exp=0x%x brd=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The generic gptwocfg does not support the AXQ, so we need
03831d35f7499c87d51205817c93e9a8d42c4baestevel * to configure it. The AXQ branch is returned held.
03831d35f7499c87d51205817c93e9a8d42c4baestevel new_nodes = sc_gptwocfg_configure_axq(ap, agent_id, create_nodes);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Can not probe AXQ\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel port_cookie = kmem_zalloc(sizeof (gptwocfg_config_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Build a cookie for the AXQ.
03831d35f7499c87d51205817c93e9a8d42c4baestevel board_config = kmem_zalloc(sizeof (sc_gptwocfg_config_t), KM_SLEEP);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: AXQ Probing Complete. "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "%d nodes added\n", new_nodes->gptwo_number_of_nodes));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine the starting ending slots of the PRD array.
03831d35f7499c87d51205817c93e9a8d42c4baestevel case 0: /* Full Bandwidth Slot */
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Can not probe\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * For each valid PRD entry, determine the agent id which is based
03831d35f7499c87d51205817c93e9a8d42c4baestevel * on what type of device is described by the slot, and then
03831d35f7499c87d51205817c93e9a8d42c4baestevel * call the safari configurator.
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (prd_slot = prd_slot_start; prd_slot <= prd_slot_end; prd_slot++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * We can not get a PCD for this port so skip it.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "expander 0x%x prd slot 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Only configure good devices.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Determine the agent id.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Call Platform Independent gptwo configurator to
03831d35f7499c87d51205817c93e9a8d42c4baestevel * create node and properties.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * XXX Shouldn't port_cookie be NULL if
03831d35f7499c87d51205817c93e9a8d42c4baestevel * !create_nodes ?
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Exp=0x%x PRD Slot=0x%x prsv Status=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel } /* for loop */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: GPTWO Devices failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_configure: Returning 0x%p\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwocfg_config_t *board_config, *axq_config, *prior_config;
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_WARN, "sc_unprobe_board: board=%d\n", board));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Configure the board without creating nodes.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Unable to unconfigure board %d - board is not "
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Walk the link of ports on this board and unconfigure them.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Save the AXQ for last.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "calling gptwocfg_unconfigure(ap=0x%p portid=0x%x)\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void *)ddi_root_node(), board_config->portid));
03831d35f7499c87d51205817c93e9a8d42c4baestevel "gptwocfg_unconfigure returned cookie=0x%p\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Can be removed from list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(board_config, sizeof (sc_gptwocfg_config_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If all the other Safari devices have been successfully
03831d35f7499c87d51205817c93e9a8d42c4baestevel * unconfigured, then the AXQ can be unconfigured.
03831d35f7499c87d51205817c93e9a8d42c4baestevel sc_gptwocfg_unconfigure_axq(axq_config->port_cookie);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If the AXQ was successfully unconfigured, then
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the board is removed from the configured list.
03831d35f7499c87d51205817c93e9a8d42c4baestevel kmem_free(axq_config, sizeof (sc_gptwocfg_config_t));
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_next_node(sc_gptwocfg_cookie_t c, dev_info_t *previous, dev_info_t **next)
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "(c=0x%p, previous=0x%p, next=0x%p)\n", (void *)c,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Invalid Cookie\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Start with the AXQ node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gptwocfg_next_node(cookie->port_cookie, NULL, &dip)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (gptwocfg_next_node(cookie->port_cookie, previous, &dip)) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (1);
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* dip == NULL */
03831d35f7499c87d51205817c93e9a8d42c4baestevel return (0);
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "sc_find_axq_node: id=0x%x\n", axq_id));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Hold root node busy to walk its child list
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "Searching dip=0x%p for our AXQ\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This node does not have a name property.
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dip=0x%p name=%s\n", (void *)dip, name));
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This node is not a AXQ node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This AXQ node does not have a reg property.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This is the wrong AXQ node.
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "dip=0x%p Wrong node id=0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The correct AXQ node was found.
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dip=0x%p Found AXQ Node\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "sc_find_axq_node: Returning 0x%p\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelaxq_set_prop(dev_info_t *axq_dip, void *arg, uint_t flags)
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create name property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel "device_type", "address-extender-queue") != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create device_type property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create compatible property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create portid property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel (sizeof (gptwo_regspec_t) * 2)/sizeof (int)) != DDI_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_pci: failed "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "to create reg property\n"));
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*ARGSUSED*/
03831d35f7499c87d51205817c93e9a8d42c4baestevelget_axq_dip(dev_info_t *rdip, void *arg, uint_t flags)
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_gptwocfg_configure_axq(dev_info_t *ap, uint_t id, int create_nodes)
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "gptwocfg_configure_axq: id=0x%x "
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Release hold from sc_find_axq_node()
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = e_ddi_branch_create(ap, &b, &fdip, DEVI_BRANCH_CONFIGURE);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If non-NULL, fdip is held and must be released.
03831d35f7499c87d51205817c93e9a8d42c4baestevel "path=%s, dip=%p, rv=%d", path, fdip ? (void *)fdip :
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_gptwocfg_unconfigure_axq(gptwocfg_config_t *config)
03831d35f7499c87d51205817c93e9a8d42c4baestevel cmn_err(CE_WARN, "sc_gptwocfg: sc_gptwocfg_unconfigure_axq: "
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Invalid AXQ\n");
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < config->gptwo_nodes->gptwo_number_of_nodes; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * If non-NULL, fdip is held and must be released.
03831d35f7499c87d51205817c93e9a8d42c4baestevelsc_get_agent_id(spcd_t *pcd, uint_t expander, uint_t slot, uint_t prd_slot)
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (slot == 0) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Type 0x%x Slot 0x%x\n",
03831d35f7499c87d51205817c93e9a8d42c4baestevel } /* switch */
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "sc_get_agent_id(pcd=0x%p, expander=0x%x, "
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki "prd_slot=0x%x) Returning agent_id=0x%x\n", (void *)pcd, expander,
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dump_config 0x%p", (void *)board_config));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, "************* 0x%p ************\n",
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki SC_DEBUG(1, (CE_CONT, "dump_pcd 0x%p", (void *)pcd));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " magic - 0x%x\n", pcd->spcd_magic));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " version - 0x%x\n", pcd->spcd_version));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " ver.reg - 0x%lx\n", pcd->spcd_ver_reg));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " afreq - %d\n", pcd->spcd_afreq));
03831d35f7499c87d51205817c93e9a8d42c4baestevel SC_DEBUG(1, (CE_CONT, " cache - %d\n", pcd->spcd_cache));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel "- SPCD_RSV_PASS\n", i));
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < AGENTS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_BANKS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_DIMMS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel for (i = 0; i < MAX_DIMMS_PER_PORT; i++) {
03831d35f7499c87d51205817c93e9a8d42c4baesteveltypedef struct {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Use 2 bits to represent each bit at a cache line. The table
03831d35f7499c87d51205817c93e9a8d42c4baestevel * is in big endian order, i.e.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * dimmtable[0], ... , dimmtable[143]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Q0:data-bits[127 126 125 124], ... , MtagEcc[3 2 1 0]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Q3:data-bits[127 126 125 124], ... , MtagEcc[3 2 1 0]
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Jnumber */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x4a, 0x31, 0x33, 0x33, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x4a, 0x31, 0x33, 0x34, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0x4a, 0x31, 0x33, 0x35, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x4a, 0x31, 0x33, 0x36, 0x30, 0x30, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 4 */ 0x4a, 0x31, 0x33, 0x33, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 5 */ 0x4a, 0x31, 0x33, 0x34, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 6 */ 0x4a, 0x31, 0x33, 0x35, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 7 */ 0x4a, 0x31, 0x33, 0x36, 0x30, 0x31, 0x00, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q0 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q1 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q2 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q3 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 0 */ 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa, 0xff,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 1 */ 0x00, 0xaa, 0xff, 0x00, 0x56, 0xaf, 0x00, 0x55,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 2 */ 0xaa, 0x55, 0xaf, 0xc0, 0x55, 0xaa, 0xff, 0x00,
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* 3 */ 0x55, 0xff, 0x00, 0x55, 0xaa, 0xff, 0x6d, 0x80,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * In the following order
03831d35f7499c87d51205817c93e9a8d42c4baestevel * pintable[0], ..., pintable[575]
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Quadword3, Quadword2, Quadword1, Quadword0
03831d35f7499c87d51205817c93e9a8d42c4baestevel * MtagEcc, Mtag, Ecc, Data
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q3 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q2 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q1 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* -- Q0 -- */
03831d35f7499c87d51205817c93e9a8d42c4baestevel * This table is for internal reference
03831d35f7499c87d51205817c93e9a8d42c4baestevel * pintable_internal[]= {
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 0 143,143,143,143,139,139,139,35
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 1 35,51,39,135,91,95,95,95
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 2 139,135,131,135,135,131,131,131
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 3 127,123,119,115,127,123,119,115
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 4 127,123,119,115,127,123,119,115
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 5 111,107,103,99,79,75,71,67
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 6 79,75,71,67,63,59,55,51
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 7 63,59,55,51,63,59,55,51
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 8 63,59,55,47,43,39,47,43
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 9 47,43,39,35,111,107,103,99
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 10 111,107,103,99,111,107,103,99
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 11 87,83,91,87,83,91,87,83
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 12 95,91,87,83,79,75,71,67
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 13 79,75,71,67,47,43,39,35
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 14 31,27,23,19,31,27,23,19
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 15 31,27,23,19,31,27,23,19
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 16 15,11,7,3,15,11,7,3
03831d35f7499c87d51205817c93e9a8d42c4baestevel * 17 15,11,7,3,15,11,7,3
03831d35f7499c87d51205817c93e9a8d42c4baestevel if ((LayoutBuf = (m_layout *)kmem_zalloc(sizeof (m_layout),
03831d35f7499c87d51205817c93e9a8d42c4baestevel bcopy(J_dimm_pinTable, LayoutBuf, sizeof (m_layout));
03831d35f7499c87d51205817c93e9a8d42c4baestevel bcopy(dimm_Jno[cpuid << 3], LayoutBuf->Jnumber[0], 64);
03831d35f7499c87d51205817c93e9a8d42c4baestevelstatic char *