25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * CDDL HEADER START
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * The contents of this file are subject to the terms of the
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Common Development and Distribution License (the "License").
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * You may not use this file except in compliance with the License.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * or http://www.opensolaris.org/os/licensing.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * See the License for the specific language governing permissions
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * and limitations under the License.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * When distributing Covered Code, include this CDDL HEADER in each
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * If applicable, add the following below this CDDL HEADER, with the
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * fields enclosed by brackets "[]" replaced with your own identifying
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * information: Portions Copyright [yyyy] [name of copyright owner]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * CDDL HEADER END
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
e98fafb9956429b59c817d4fbd27720c73879203jl * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Use is subject to license terms.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#ifndef _SYS_OPL_CFG_H
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define _SYS_OPL_CFG_H
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#pragma ident "%Z%%M% %I% %E% SMI"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#ifdef __cplusplus
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern "C" {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#endif
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Hardware Descriptor.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/opl_hwdesc.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PSB_MODE 0x0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_XSB_MODE 0x1
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_LSBID_MASK 0x1f
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * CPU device portid:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 1 0 0 0 0 0 0 0 0 0 0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 0 9 8 7 6 5 4 3 2 1 0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * ---------------------------------------
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * | 1 | LSB ID | CHIP | CORE | CPU |
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * ---------------------------------------
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CPUID_TO_LSB(devid) ((devid >> 5) & OPL_LSBID_MASK)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CPU_CHIP(devid) ((devid >> 3) & 0x3)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CORE(devid) ((devid >> 1) & 0x3)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CPU(devid) ((devid & 0x001))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PORTID(board, chip) ((1 << 10) | (board << 5) | (chip << 3))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CPUID(board, chip, core, cpu) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((board << 5) | (chip << 3) | (core << 1) | (cpu))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Dummy address space for a chip.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PROC_AS(board, chip) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((1ULL << 46) | ((uint64_t)board << 40) | (1ULL << 39) | \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (1ULL << 33) | ((uint64_t)chip << 4))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * pseudo-mc portid:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 1 0 0 0 0 0 0 0 0 0 0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 0 9 8 7 6 5 4 3 2 1 0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -------------------------------------
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * | 0 | 1 | LSB ID | 0 |
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -------------------------------------
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_LSB_TO_PSEUDOMC_PORTID(board) ((1 << 9) | (board << 4))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Dummy address space for a pseudo memory node
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_MC_AS(board) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((1ULL << 46) | ((uint64_t)board << 40) | (1ULL << 39) | \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (1ULL << 33))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Defines used by the Jupiter bus-specific library (lfc_jupiter.so).
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * This library gets loaded into the user-level fcode interpreter
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * and provides bus-specific methods that are used by the Oberon
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * and the CMU-channel fcode drivers.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * IO port id:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 1 0 0 0 0 0 0 0 0 0 0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 0 9 8 7 6 5 4 3 2 1 0
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * ---------------------------------------
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * | 0 0 | LSB ID | IO CHAN | LEAF |
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * ---------------------------------------
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PORTID_MASK 0x7FF
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_IO_PORTID_TO_LSB(portid) (((portid) >> 4) & OPL_LSBID_MASK)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PORTID_TO_CHANNEL(portid) (((portid) >> 1) & 0x7)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PORTID_TO_LEAF(portid) ((portid) & 0x1)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_IO_PORTID(lsb, ch, leaf) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (((lsb & OPL_LSBID_MASK) << 4) | ((ch & 0x7) << 1) | (leaf & 0x1))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_ADDR_TO_LSB(hi) (((hi) >> 8) & OPL_LSBID_MASK)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_ADDR_TO_CHANNEL(hi) (((hi) >> 5) & 0x7)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_ADDR_TO_LEAF(hi, lo) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (!(((hi) >> 7) & 0x1) && (((lo) >> 20) == 0x7))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_ADDR_HI(lsb, ch) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((1 << 14) | ((lsb & OPL_LSBID_MASK) << 8) | ((ch & 0x7) << 5))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CMU_CHANNEL 4
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_OBERON_CHANNEL(ch) ((ch >= 0) && (ch <= 3))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_VALID_CHANNEL(ch) ((ch >= 0) && (ch <= 4))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_VALID_LEAF(leaf) ((leaf == 0) || (leaf == 1))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#if defined(_KERNEL)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * We store the pointers to the following device nodes in this structure:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * "pseudo-mc"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * "cmp"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * "pci"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * These nodes represent the different branches we create in the device
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * tree for each board during probe. We store them so that when a board
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * is unprobed, we can easily locate the branches and destroy them.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef struct {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dev_info_t *cfg_pseudo_mc;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dev_info_t *cfg_cpu_chips[HWD_CPU_CHIPS_PER_CMU];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dev_info_t *cfg_cmuch_leaf;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl fco_handle_t cfg_cmuch_handle;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char *cfg_cmuch_probe_str;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dev_info_t *cfg_pcich_leaf[HWD_PCI_CHANNELS_PER_SB]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl [HWD_LEAVES_PER_PCI_CHANNEL];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl fco_handle_t cfg_pcich_handle[HWD_PCI_CHANNELS_PER_SB]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl [HWD_LEAVES_PER_PCI_CHANNEL];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char *cfg_pcich_probe_str[HWD_PCI_CHANNELS_PER_SB]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl [HWD_LEAVES_PER_PCI_CHANNEL];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl void *cfg_hwd;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl} opl_board_cfg_t;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Prototypes for the callback functions used in the DDI functions
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * used to perform device tree operations.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * init functions are used to find device nodes that are created
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * by Solaris during boot.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * create functions are used to initialize device nodes during DR.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef int (*opl_init_func_t)(dev_info_t *, char *, int);
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef int (*opl_create_func_t)(dev_info_t *, void *, uint_t);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * The following probe structure carries all the information required
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * at various points during probe. This structure serves two purposes:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 1. It allows us to streamline functions and have them accept just
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * a single argument.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * 2. It allows us to pass information to the DDI callbacks. DDI
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * callbacks are allowed only one argument. It also allows
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * us to return information from those callbacks.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * The probe structure carries a snapshot of the hardware descriptor
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * taken at the beginning of a probe.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef struct {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl hwd_header_t *pr_hdr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl hwd_sb_status_t *pr_sb_status;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl hwd_domain_info_t *pr_dinfo;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl hwd_sb_t *pr_sb;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_board;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_cpu_chip;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_core;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_cpu;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_channel;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_channel_status;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_leaf;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_leaf_status;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl opl_create_func_t pr_create;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dev_info_t *pr_parent;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dev_info_t *pr_node;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int pr_hold;
e98fafb9956429b59c817d4fbd27720c73879203jl unsigned pr_cpu_impl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl} opl_probe_t;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_STR_LEN 256
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_HI(value) ((uint32_t)((uint64_t)(value) >> 32))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_LO(value) ((uint32_t)(value))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef struct {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t addr_hi;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t addr_lo;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl} opl_addr_t;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef struct {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t rg_addr_hi;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t rg_addr_lo;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t rg_size_hi;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t rg_size_lo;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl} opl_range_t;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef struct {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int mc_bank;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t mc_hi;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uint32_t mc_lo;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl} opl_mc_addr_t;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Convenience macros for DDI property operations. The functions that
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * DDI provides for getting and updating properties are not symmetric
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * either in their names or in the number of arguments. These macros
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * hide the gory details and provide a symmetric way to get and
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * set properties.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define opl_prop_get_string(dip, name, bufp, lenp) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ddi_getlongprop(DDI_DEV_T_ANY, dip, \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl DDI_PROP_DONTPASS, name, (caddr_t)bufp, lenp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define opl_prop_get_int(dip, name, value, defvalue) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl( \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *(value) = ddi_getprop(DDI_DEV_T_ANY, dip, \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl DDI_PROP_DONTPASS, name, defvalue), \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*(value) == defvalue) ? DDI_PROP_NOT_FOUND : DDI_PROP_SUCCESS \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define opl_prop_get_int_array(dip, name, data, nelems) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl DDI_PROP_DONTPASS, name, (int **)&data, (uint_t *)&nelems)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_GET_PROP(type, dip, name, value, arg) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl opl_prop_get_##type(dip, name, value, arg)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_GET_PROP_ARRAY(type, dip, name, values, nvalues) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl opl_prop_get_##type##_array(dip, name, values, nvalues)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_FREE_PROP(data) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ddi_prop_free((void *)data)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_UPDATE_PROP_ERR(ret, name) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ret != DDI_PROP_SUCCESS) { \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "%s (%d): %s update property error (%d)",\
25cf1a301a396c38e8adf52c15f537b80d2483f7jl __FILE__, __LINE__, name, ret); \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (DDI_WALK_ERROR); \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_UPDATE_PROP(type, dip, name, value) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ret = ndi_prop_update_##type(DDI_DEV_T_NONE, dip, name, value); \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPL_UPDATE_PROP_ERR(ret, name)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_UPDATE_PROP_ARRAY(type, dip, name, values, nvalues) \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ret = ndi_prop_update_##type##_array(DDI_DEV_T_NONE, dip, \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl name, values, nvalues); \
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPL_UPDATE_PROP_ERR(ret, name)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Node names for the different nodes supported in OPL.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PSEUDO_MC_NODE "pseudo-mc"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CPU_CHIP_NODE "cmp"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CORE_NODE "core"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_CPU_NODE "cpu"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#define OPL_PCI_LEAF_NODE "pci"
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jltypedef struct {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char *fc_service;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl fc_ops_t *fc_op;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl} opl_fc_ops_t;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Functions used by drmach
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
e98fafb9956429b59c817d4fbd27720c73879203jlextern int opl_probe_sb(int, unsigned *);
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern int opl_unprobe_sb(int);
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern int opl_read_hwd(int, hwd_header_t **, hwd_sb_status_t **,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl hwd_domain_info_t **, hwd_sb_t **);
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern void opl_hold_devtree(void);
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern void opl_release_devtree(void);
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern int oplcfg_pa_swap(int from, int to);
25cf1a301a396c38e8adf52c15f537b80d2483f7jlextern int opl_init_cfg();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#endif /* _KERNEL */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#ifdef __cplusplus
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#endif
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#endif /* _SYS_OPL_CFG_H */