17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 237c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #ifndef _SYS_SBDPRIV_H 287c478bd9Sstevel@tonic-gate #define _SYS_SBDPRIV_H 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate #ifdef __cplusplus 317c478bd9Sstevel@tonic-gate extern "C" { 327c478bd9Sstevel@tonic-gate #endif 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #include <sys/processor.h> 357c478bd9Sstevel@tonic-gate #include <sys/obpdefs.h> 367c478bd9Sstevel@tonic-gate #include <sys/memlist.h> 377c478bd9Sstevel@tonic-gate #include <sys/sbd_ioctl.h> 387c478bd9Sstevel@tonic-gate #include <sys/mem_config.h> 397c478bd9Sstevel@tonic-gate #include <sys/sbd.h> 407c478bd9Sstevel@tonic-gate #ifdef DEBUG 417c478bd9Sstevel@tonic-gate #include <sys/promif.h> 427c478bd9Sstevel@tonic-gate #endif 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate /* 467c478bd9Sstevel@tonic-gate * This structure passes the information when the caller requests to 477c478bd9Sstevel@tonic-gate * reserve a portion of unconfigured memory. It is also used to release 487c478bd9Sstevel@tonic-gate * previously reserved memory 497c478bd9Sstevel@tonic-gate */ 507c478bd9Sstevel@tonic-gate struct sbd_mres { 517c478bd9Sstevel@tonic-gate uint64_t new_base_pa; /* new base addr for physintalled */ 527c478bd9Sstevel@tonic-gate uint64_t reserved_pa; /* addr of the reserved mem */ 537c478bd9Sstevel@tonic-gate uint64_t size; /* size of the reserved chunk. */ 547c478bd9Sstevel@tonic-gate }; 557c478bd9Sstevel@tonic-gate 567c478bd9Sstevel@tonic-gate int sbd_memory_reserve(dev_info_t *, uint64_t, struct sbd_mres *); 577c478bd9Sstevel@tonic-gate int sbd_memory_release(dev_info_t *, uint64_t, struct sbd_mres *); 587c478bd9Sstevel@tonic-gate 597c478bd9Sstevel@tonic-gate /* This error type is used inside sbd only */ 607c478bd9Sstevel@tonic-gate typedef struct { 617c478bd9Sstevel@tonic-gate int e_errno; 627c478bd9Sstevel@tonic-gate int e_code; 637c478bd9Sstevel@tonic-gate char e_rsc[MAXPATHLEN]; 647c478bd9Sstevel@tonic-gate } sbderror_t; 657c478bd9Sstevel@tonic-gate 667c478bd9Sstevel@tonic-gate #include <sys/sbd.h> 677c478bd9Sstevel@tonic-gate #include <sys/sbd_error.h> 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate typedef enum { 707c478bd9Sstevel@tonic-gate SBD_STATE_EMPTY = 0, 717c478bd9Sstevel@tonic-gate SBD_STATE_OCCUPIED, 727c478bd9Sstevel@tonic-gate SBD_STATE_CONNECTED, 737c478bd9Sstevel@tonic-gate SBD_STATE_UNCONFIGURED, 747c478bd9Sstevel@tonic-gate SBD_STATE_PARTIAL, 757c478bd9Sstevel@tonic-gate SBD_STATE_CONFIGURED, 767c478bd9Sstevel@tonic-gate SBD_STATE_RELEASE, 777c478bd9Sstevel@tonic-gate SBD_STATE_UNREFERENCED, 787c478bd9Sstevel@tonic-gate SBD_STATE_FATAL, 797c478bd9Sstevel@tonic-gate SBD_STATE_MAX 807c478bd9Sstevel@tonic-gate } sbd_istate_t; 817c478bd9Sstevel@tonic-gate 827c478bd9Sstevel@tonic-gate typedef struct { 837c478bd9Sstevel@tonic-gate sbderror_t *errp; 847c478bd9Sstevel@tonic-gate sbd_flags_t flags; 857c478bd9Sstevel@tonic-gate } sbd_treeinfo_t; 867c478bd9Sstevel@tonic-gate 877c478bd9Sstevel@tonic-gate /* 887c478bd9Sstevel@tonic-gate * generic flags (sbd_handle.h_flags) 897c478bd9Sstevel@tonic-gate */ 907c478bd9Sstevel@tonic-gate #define SBD_FLAG_DEVI_FORCE 0x00000001 917c478bd9Sstevel@tonic-gate 927c478bd9Sstevel@tonic-gate /* mirror of SBD_FLAG_FORCE from sbd_ioctl.h */ 937c478bd9Sstevel@tonic-gate #define SBD_IOCTL_FLAG_FORCE 0x00000004 947c478bd9Sstevel@tonic-gate 957c478bd9Sstevel@tonic-gate #define SBD_USER_FLAG_MASK 0x0000ffff 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate #define SBD_KERN_FLAG_MASK 0xffff0000 /* no flags in use */ 987c478bd9Sstevel@tonic-gate 997c478bd9Sstevel@tonic-gate /* 1007c478bd9Sstevel@tonic-gate * Translation macros for sbd->sbdp flags 1017c478bd9Sstevel@tonic-gate */ 1027c478bd9Sstevel@tonic-gate #define SBD_2_SBDP_FLAGS(f) (((f) & SBD_IOCTL_FLAG_FORCE) ? \ 1037c478bd9Sstevel@tonic-gate SBDP_IOCTL_FLAG_FORCE : 0) 1047c478bd9Sstevel@tonic-gate 1057c478bd9Sstevel@tonic-gate typedef struct sbd_handle { 1067c478bd9Sstevel@tonic-gate void *h_sbd; 1077c478bd9Sstevel@tonic-gate sbderror_t *h_err; 1087c478bd9Sstevel@tonic-gate dev_t h_dev; /* dev_t of opened device */ 1097c478bd9Sstevel@tonic-gate int h_cmd; /* ioctl argument */ 1107c478bd9Sstevel@tonic-gate int h_mode; /* device open mode */ 1117c478bd9Sstevel@tonic-gate sbd_flags_t h_flags; 1127c478bd9Sstevel@tonic-gate sbd_ioctl_arg_t *h_iap; /* points to kernel copy of ioargs */ 1137c478bd9Sstevel@tonic-gate sbdp_opts_t h_opts; /* points to the platform options */ 1147c478bd9Sstevel@tonic-gate } sbd_handle_t; 1157c478bd9Sstevel@tonic-gate 1167c478bd9Sstevel@tonic-gate #define SBD_HD2ERR(hd) ((hd)->h_err) 1177c478bd9Sstevel@tonic-gate #define SBD_GET_ERR(ep) ((ep)->e_code) 1187c478bd9Sstevel@tonic-gate #define SBD_SET_ERR(ep, ec) ((ep)->e_code = (ec)) 1197c478bd9Sstevel@tonic-gate #define SBD_GET_ERRNO(ep) ((ep)->e_errno) 1207c478bd9Sstevel@tonic-gate #define SBD_SET_ERRNO(ep, en) ((ep)->e_errno = (en)) 1217c478bd9Sstevel@tonic-gate #define SBD_GET_ERRSTR(ep) ((ep)->e_rsc) 1227c478bd9Sstevel@tonic-gate 1237c478bd9Sstevel@tonic-gate #define SBD_SET_ERRSTR(ep, es) \ 1247c478bd9Sstevel@tonic-gate { \ 1257c478bd9Sstevel@tonic-gate if ((es) && (*(es) != '\0')) \ 1267c478bd9Sstevel@tonic-gate (void) strncpy((ep)->e_rsc, (es), MAXPATHLEN); \ 1277c478bd9Sstevel@tonic-gate } 1287c478bd9Sstevel@tonic-gate 1297c478bd9Sstevel@tonic-gate #define SBD_SET_IOCTL_ERR(ierr, code, rsc) \ 1307c478bd9Sstevel@tonic-gate { \ 1317c478bd9Sstevel@tonic-gate (ierr)->e_code = (int)(code); \ 1327c478bd9Sstevel@tonic-gate if ((rsc) && (*(rsc) != '\0')) \ 1337c478bd9Sstevel@tonic-gate bcopy((caddr_t)(rsc), \ 1347c478bd9Sstevel@tonic-gate (caddr_t)(ierr)->e_rsc, \ 1357c478bd9Sstevel@tonic-gate sizeof ((ierr)->e_rsc)); \ 1367c478bd9Sstevel@tonic-gate } 1377c478bd9Sstevel@tonic-gate 1387c478bd9Sstevel@tonic-gate #define SBD_FREE_ERR(ep) \ 1397c478bd9Sstevel@tonic-gate ((ep)->e_rsc[0] = '\0') 1407c478bd9Sstevel@tonic-gate 1417c478bd9Sstevel@tonic-gate #define SBD_GET_PERR(spe, ep) \ 142*50e80301SToomas Soome { \ 1437c478bd9Sstevel@tonic-gate (ep)->e_errno = EIO; \ 1447c478bd9Sstevel@tonic-gate (ep)->e_code = (spe)->e_code; \ 1457c478bd9Sstevel@tonic-gate if (*((spe)->e_rsc) != '\0') \ 1467c478bd9Sstevel@tonic-gate bcopy((caddr_t)((spe)->e_rsc), \ 1477c478bd9Sstevel@tonic-gate (caddr_t)((ep))->e_rsc, \ 148*50e80301SToomas Soome sizeof (((ep))->e_rsc)); \ 149*50e80301SToomas Soome } 1507c478bd9Sstevel@tonic-gate 1517c478bd9Sstevel@tonic-gate /* 1527c478bd9Sstevel@tonic-gate * dev_t is shared by PIM and PSM layers. 1537c478bd9Sstevel@tonic-gate * 1547c478bd9Sstevel@tonic-gate * Format = 31......16,15.......0 1557c478bd9Sstevel@tonic-gate * | PIM | PSM | 1567c478bd9Sstevel@tonic-gate */ 1577c478bd9Sstevel@tonic-gate #define _SBD_DEVPIM_SHIFT 16 1587c478bd9Sstevel@tonic-gate #define _SBD_DEVPIM_MASK 0xffff 1597c478bd9Sstevel@tonic-gate #define _SBD_DEVPSM_MASK 0xffff 1607c478bd9Sstevel@tonic-gate 1617c478bd9Sstevel@tonic-gate #define SBD_GET_MINOR2INST(d) (((d) >> _SBD_DEVPIM_SHIFT) & _SBD_DEVPIM_MASK) 1627c478bd9Sstevel@tonic-gate #define SBD_MAKE_MINOR(i, m) \ 1637c478bd9Sstevel@tonic-gate ((((i) & _SBD_DEVPIM_MASK) << _SBD_DEVPIM_SHIFT) | \ 1647c478bd9Sstevel@tonic-gate ((m) & _SBD_DEVPSM_MASK)) 1657c478bd9Sstevel@tonic-gate 1667c478bd9Sstevel@tonic-gate #define GETSTRUCT(t, n) \ 1677c478bd9Sstevel@tonic-gate ((t *)kmem_zalloc((size_t)(n) * sizeof (t), KM_SLEEP)) 1687c478bd9Sstevel@tonic-gate #define FREESTRUCT(p, t, n) \ 1697c478bd9Sstevel@tonic-gate (kmem_free((caddr_t)(p), sizeof (t) * (size_t)(n))) 1707c478bd9Sstevel@tonic-gate 1717c478bd9Sstevel@tonic-gate #define GET_SOFTC(i) ddi_get_soft_state(sbd_g.softsp, (i)) 1727c478bd9Sstevel@tonic-gate #define ALLOC_SOFTC(i) ddi_soft_state_zalloc(sbd_g.softsp, (i)) 1737c478bd9Sstevel@tonic-gate #define FREE_SOFTC(i) ddi_soft_state_free(sbd_g.softsp, (i)) 1747c478bd9Sstevel@tonic-gate 1757c478bd9Sstevel@tonic-gate /* 1767c478bd9Sstevel@tonic-gate * Per instance soft-state structure. 1777c478bd9Sstevel@tonic-gate */ 1787c478bd9Sstevel@tonic-gate typedef struct sbd_softstate { 1797c478bd9Sstevel@tonic-gate void *sbd_boardlist; 1807c478bd9Sstevel@tonic-gate int max_boards; 1817c478bd9Sstevel@tonic-gate int wnode; 1827c478bd9Sstevel@tonic-gate } sbd_softstate_t; 1837c478bd9Sstevel@tonic-gate 1847c478bd9Sstevel@tonic-gate /* 1857c478bd9Sstevel@tonic-gate * dr Global data elements 1867c478bd9Sstevel@tonic-gate */ 1877c478bd9Sstevel@tonic-gate typedef struct { 1887c478bd9Sstevel@tonic-gate sbd_softstate_t *softsp; /* pointer to initialize soft state */ 1897c478bd9Sstevel@tonic-gate } sbd_global; 1907c478bd9Sstevel@tonic-gate 1917c478bd9Sstevel@tonic-gate typedef struct { 1927c478bd9Sstevel@tonic-gate sbderror_t dv_error; 1937c478bd9Sstevel@tonic-gate dev_info_t *dv_dip; 1947c478bd9Sstevel@tonic-gate } sbd_devlist_t; 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate extern int plat_max_io_units_per_board(); 1977c478bd9Sstevel@tonic-gate extern int plat_max_cmp_units_per_board(); 1987c478bd9Sstevel@tonic-gate extern int plat_max_cpu_units_per_board(); 1997c478bd9Sstevel@tonic-gate extern int plat_max_mem_units_per_board(); 2007c478bd9Sstevel@tonic-gate #define MAX_IO_UNITS_PER_BOARD plat_max_io_units_per_board() 2017c478bd9Sstevel@tonic-gate #define MAX_CMP_UNITS_PER_BOARD plat_max_cmp_units_per_board() 2027c478bd9Sstevel@tonic-gate #define MAX_CPU_UNITS_PER_BOARD plat_max_cpu_units_per_board() 2037c478bd9Sstevel@tonic-gate #define MAX_MEM_UNITS_PER_BOARD plat_max_mem_units_per_board() 2047c478bd9Sstevel@tonic-gate #define SBD_MAX_UNITS_PER_BOARD 8 2057c478bd9Sstevel@tonic-gate /* If any of the max units exceeds 5, this must be adjusted */ 2067c478bd9Sstevel@tonic-gate 2077c478bd9Sstevel@tonic-gate #define SBD_MAX_INSTANCES 16 2087c478bd9Sstevel@tonic-gate 2097c478bd9Sstevel@tonic-gate #define SBD_NUM_STATES ((int)SBD_STATE_MAX) 2107c478bd9Sstevel@tonic-gate 2117c478bd9Sstevel@tonic-gate #ifdef DEBUG 2127c478bd9Sstevel@tonic-gate #define SBD_DEVICE_TRANSITION(sb, nt, un, st) \ 2137c478bd9Sstevel@tonic-gate { \ 2147c478bd9Sstevel@tonic-gate int _ostate, _nstate; \ 2157c478bd9Sstevel@tonic-gate _ostate = (int)((sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state); \ 2167c478bd9Sstevel@tonic-gate _nstate = (int)(st); \ 2177c478bd9Sstevel@tonic-gate PR_STATE("BOARD %d (%s.%d) STATE: %s(%d) -> %s(%d)\n", \ 2187c478bd9Sstevel@tonic-gate (sb)->sb_num, \ 2197c478bd9Sstevel@tonic-gate sbd_ct_str[nt], (un), \ 2207c478bd9Sstevel@tonic-gate sbd_state_str[_ostate], _ostate, \ 2217c478bd9Sstevel@tonic-gate sbd_state_str[_nstate], _nstate); \ 2227c478bd9Sstevel@tonic-gate (void) drv_getparm(TIME, \ 2237c478bd9Sstevel@tonic-gate (void *)&(sb)->sb_dev[NIX(nt)][un].u_common.sbdev_time); \ 2247c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state = (st); \ 2257c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_ostate = ostate_cvt(st); \ 2267c478bd9Sstevel@tonic-gate send_event = 1; \ 2277c478bd9Sstevel@tonic-gate } 2287c478bd9Sstevel@tonic-gate #define SBD_BOARD_TRANSITION(sb, st) \ 2297c478bd9Sstevel@tonic-gate { \ 2307c478bd9Sstevel@tonic-gate PR_STATE("BOARD %d STATE: %s(%d) -> %s(%d)\n", \ 2317c478bd9Sstevel@tonic-gate (sb)->sb_num, \ 2327c478bd9Sstevel@tonic-gate sbd_state_str[(int)(sb)->sb_state], (int)(sb)->sb_state, \ 2337c478bd9Sstevel@tonic-gate sbd_state_str[(int)(st)], (int)(st)); \ 2347c478bd9Sstevel@tonic-gate (sb)->sb_pstate = (sb)->sb_state; \ 2357c478bd9Sstevel@tonic-gate (sb)->sb_state = (st); \ 2367c478bd9Sstevel@tonic-gate send_event = 1; \ 2377c478bd9Sstevel@tonic-gate } 2387c478bd9Sstevel@tonic-gate #else /* DEBUG */ 2397c478bd9Sstevel@tonic-gate #define SBD_DEVICE_TRANSITION(sb, nt, un, st) \ 2407c478bd9Sstevel@tonic-gate { \ 2417c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state = (st); \ 2427c478bd9Sstevel@tonic-gate (sb)->sb_dev[NIX(nt)][un].u_common.sbdev_ostate = ostate_cvt(st); \ 2437c478bd9Sstevel@tonic-gate (void) drv_getparm(TIME, \ 2447c478bd9Sstevel@tonic-gate (void *)&(sb)->sb_dev[NIX(nt)][un].u_common.sbdev_time); \ 2457c478bd9Sstevel@tonic-gate send_event = 1; \ 2467c478bd9Sstevel@tonic-gate } 2477c478bd9Sstevel@tonic-gate #define SBD_BOARD_TRANSITION(sb, st) \ 2487c478bd9Sstevel@tonic-gate ((sb)->sb_pstate = (sb)->sb_state, (sb)->sb_state = (st), \ 2497c478bd9Sstevel@tonic-gate send_event = 1) 2507c478bd9Sstevel@tonic-gate #endif /* DEBUG */ 2517c478bd9Sstevel@tonic-gate 2527c478bd9Sstevel@tonic-gate #define SBD_DEVICE_STATE(sb, nt, un) \ 2537c478bd9Sstevel@tonic-gate ((sb)->sb_dev[NIX(nt)][un].u_common.sbdev_state) 2547c478bd9Sstevel@tonic-gate #define SBD_BOARD_STATE(sb) \ 2557c478bd9Sstevel@tonic-gate ((sb)->sb_state) 2567c478bd9Sstevel@tonic-gate #define SBD_BOARD_PSTATE(sb) \ 2577c478bd9Sstevel@tonic-gate ((sb)->sb_pstate) 2587c478bd9Sstevel@tonic-gate 2597c478bd9Sstevel@tonic-gate typedef uint32_t sbd_devset_t; 2607c478bd9Sstevel@tonic-gate 2617c478bd9Sstevel@tonic-gate /* 2627c478bd9Sstevel@tonic-gate * sbd_priv_handle_t MUST appear first. 2637c478bd9Sstevel@tonic-gate */ 2647c478bd9Sstevel@tonic-gate typedef struct sbd_priv_handle { 2657c478bd9Sstevel@tonic-gate sbd_handle_t sh_handle; 2667c478bd9Sstevel@tonic-gate void *sh_arg; /* raw ioctl arg */ 2677c478bd9Sstevel@tonic-gate sbd_devset_t sh_devset; /* based on h_dev */ 2687c478bd9Sstevel@tonic-gate sbd_devset_t sh_orig_devset; /* what client requested */ 2697c478bd9Sstevel@tonic-gate sbderror_t sh_err; 2707c478bd9Sstevel@tonic-gate struct sbd_priv_handle *sh_next; 2717c478bd9Sstevel@tonic-gate } sbd_priv_handle_t; 2727c478bd9Sstevel@tonic-gate 2737c478bd9Sstevel@tonic-gate #define SBD_MAXNUM_NT 3 2747c478bd9Sstevel@tonic-gate #define NIX(t) (((t) == SBD_COMP_CPU) ? 0 : \ 2757c478bd9Sstevel@tonic-gate ((t) == SBD_COMP_MEM) ? 1 : \ 2767c478bd9Sstevel@tonic-gate ((t) == SBD_COMP_IO) ? 2 : \ 2777c478bd9Sstevel@tonic-gate ((t) == SBD_COMP_CMP) ? 0 : SBD_MAXNUM_NT) 2787c478bd9Sstevel@tonic-gate 2797c478bd9Sstevel@tonic-gate #define SBD_NUM_MC_PER_BOARD 4 2807c478bd9Sstevel@tonic-gate 2817c478bd9Sstevel@tonic-gate 2827c478bd9Sstevel@tonic-gate typedef struct sbd_common_unit { 2837c478bd9Sstevel@tonic-gate sbd_istate_t sbdev_state; 2847c478bd9Sstevel@tonic-gate sbd_cond_t sbdev_cond; 2857c478bd9Sstevel@tonic-gate sbd_state_t sbdev_ostate; 2867c478bd9Sstevel@tonic-gate time_t sbdev_time; 2877c478bd9Sstevel@tonic-gate int sbdev_busy; 2887c478bd9Sstevel@tonic-gate void *sbdev_sbp; 2897c478bd9Sstevel@tonic-gate int sbdev_unum; 2907c478bd9Sstevel@tonic-gate sbd_comp_type_t sbdev_type; 2917c478bd9Sstevel@tonic-gate dev_info_t *sbdev_dip; 2927c478bd9Sstevel@tonic-gate } sbd_common_unit_t; 2937c478bd9Sstevel@tonic-gate 2947c478bd9Sstevel@tonic-gate typedef struct sbd_mem_unit { 2957c478bd9Sstevel@tonic-gate sbd_common_unit_t sbm_cm; 2967c478bd9Sstevel@tonic-gate sbd_istate_t sbm_state; /* mem-unit state */ 2977c478bd9Sstevel@tonic-gate uint_t sbm_flags; 2987c478bd9Sstevel@tonic-gate pfn_t sbm_basepfn; 2997c478bd9Sstevel@tonic-gate pgcnt_t sbm_npages; 3007c478bd9Sstevel@tonic-gate pgcnt_t sbm_pageslost; 3017c478bd9Sstevel@tonic-gate /* 3027c478bd9Sstevel@tonic-gate * The following fields are used during 3037c478bd9Sstevel@tonic-gate * the memory detach process only. sbm_mlist 3047c478bd9Sstevel@tonic-gate * will be used to store the board memlist 3057c478bd9Sstevel@tonic-gate * following a detach. The memlist will be 3067c478bd9Sstevel@tonic-gate * used to re-attach the board when configuring 3077c478bd9Sstevel@tonic-gate * the unit directly after an unconfigure. 3087c478bd9Sstevel@tonic-gate */ 3097c478bd9Sstevel@tonic-gate struct sbd_mem_unit *sbm_peer; 3107c478bd9Sstevel@tonic-gate struct memlist *sbm_mlist; 3117c478bd9Sstevel@tonic-gate struct memlist *sbm_del_mlist; 3127c478bd9Sstevel@tonic-gate memhandle_t sbm_memhandle; 3137c478bd9Sstevel@tonic-gate pfn_t sbm_alignment_mask; 3147c478bd9Sstevel@tonic-gate pfn_t sbm_slice_offset; 3157c478bd9Sstevel@tonic-gate /* 3167c478bd9Sstevel@tonic-gate * The following field is used to support the 3177c478bd9Sstevel@tonic-gate * representation of all memory controllers on 3187c478bd9Sstevel@tonic-gate * a board with one sbd_mem_unit_t. 3197c478bd9Sstevel@tonic-gate */ 3207c478bd9Sstevel@tonic-gate dev_info_t *sbm_dip[SBD_NUM_MC_PER_BOARD]; 3217c478bd9Sstevel@tonic-gate /* 3227c478bd9Sstevel@tonic-gate * The following field determines if the memory on this board 3237c478bd9Sstevel@tonic-gate * is part of an interleave across boards 3247c478bd9Sstevel@tonic-gate */ 3257c478bd9Sstevel@tonic-gate int sbm_interleave; 3267c478bd9Sstevel@tonic-gate } sbd_mem_unit_t; 3277c478bd9Sstevel@tonic-gate 3287c478bd9Sstevel@tonic-gate /* 3297c478bd9Sstevel@tonic-gate * Currently only maintain state information for individual 3307c478bd9Sstevel@tonic-gate * components. 3317c478bd9Sstevel@tonic-gate */ 3327c478bd9Sstevel@tonic-gate typedef struct sbd_cpu_unit { 3337c478bd9Sstevel@tonic-gate sbd_common_unit_t sbc_cm; /* cpu-unit state */ 3347c478bd9Sstevel@tonic-gate processorid_t sbc_cpu_id; 3357c478bd9Sstevel@tonic-gate cpu_flag_t sbc_cpu_flags; 3367c478bd9Sstevel@tonic-gate ushort_t sbc_pad1; 3377c478bd9Sstevel@tonic-gate int sbc_cpu_impl; 3387c478bd9Sstevel@tonic-gate int sbc_speed; 3397c478bd9Sstevel@tonic-gate int sbc_ecache; 3407c478bd9Sstevel@tonic-gate } sbd_cpu_unit_t; 3417c478bd9Sstevel@tonic-gate 3427c478bd9Sstevel@tonic-gate typedef struct sbd_io_unit { 3437c478bd9Sstevel@tonic-gate sbd_common_unit_t sbi_cm; /* io-unit state */ 3447c478bd9Sstevel@tonic-gate } sbd_io_unit_t; 3457c478bd9Sstevel@tonic-gate 3467c478bd9Sstevel@tonic-gate typedef union { 3477c478bd9Sstevel@tonic-gate sbd_common_unit_t u_common; 3487c478bd9Sstevel@tonic-gate sbd_mem_unit_t _mu; 3497c478bd9Sstevel@tonic-gate sbd_cpu_unit_t _cu; 3507c478bd9Sstevel@tonic-gate sbd_io_unit_t _iu; 3517c478bd9Sstevel@tonic-gate } sbd_dev_unit_t; 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate typedef struct { 3547c478bd9Sstevel@tonic-gate sbd_priv_handle_t *sb_handle; 3557c478bd9Sstevel@tonic-gate int sb_ref; /* # of handle references */ 3567c478bd9Sstevel@tonic-gate int sb_num; /* board number */ 3577c478bd9Sstevel@tonic-gate void *sb_softsp; /* pointer to soft state */ 3587c478bd9Sstevel@tonic-gate dev_info_t *sb_topdip; /* top devinfo of instance */ 3597c478bd9Sstevel@tonic-gate sbd_istate_t sb_state; /* (current) board state */ 3607c478bd9Sstevel@tonic-gate sbd_istate_t sb_pstate; /* previous board state */ 3617c478bd9Sstevel@tonic-gate sbd_cond_t sb_cond; /* condition */ 3627c478bd9Sstevel@tonic-gate sbd_state_t sb_rstate; /* receptacle state */ 3637c478bd9Sstevel@tonic-gate sbd_state_t sb_ostate; /* occupant state */ 3647c478bd9Sstevel@tonic-gate /* 3657c478bd9Sstevel@tonic-gate * 0=CPU, 1=MEM, 2=IO, 3=NULL 3667c478bd9Sstevel@tonic-gate */ 3677c478bd9Sstevel@tonic-gate dev_info_t **sb_devlist[SBD_MAXNUM_NT + 1]; 3687c478bd9Sstevel@tonic-gate 3697c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_present; /* present mask */ 3707c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_attached; /* attached mask */ 3717c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_released; /* released mask */ 3727c478bd9Sstevel@tonic-gate sbd_devset_t sb_dev_unreferenced; /* unreferenced mask */ 3737c478bd9Sstevel@tonic-gate sbd_dev_unit_t *sb_dev[SBD_MAXNUM_NT]; 3747c478bd9Sstevel@tonic-gate 3757c478bd9Sstevel@tonic-gate char *sb_cpupath[SBD_MAX_UNITS_PER_BOARD]; 3767c478bd9Sstevel@tonic-gate char *sb_mempath[SBD_MAX_UNITS_PER_BOARD]; 3777c478bd9Sstevel@tonic-gate char *sb_iopath[SBD_MAX_UNITS_PER_BOARD]; 3787c478bd9Sstevel@tonic-gate 3797c478bd9Sstevel@tonic-gate int sb_ndev; /* number of devs */ 3807c478bd9Sstevel@tonic-gate int sb_errno; /* store errno */ 3817c478bd9Sstevel@tonic-gate int sb_busy; /* drain in progress */ 3827c478bd9Sstevel@tonic-gate int sb_assigned; 3837c478bd9Sstevel@tonic-gate int sb_flags; 3847c478bd9Sstevel@tonic-gate kmutex_t sb_flags_mutex; /* mutex to protect flags */ 3857c478bd9Sstevel@tonic-gate int sb_wnode; 3867c478bd9Sstevel@tonic-gate int sb_memaccess_ok; 3877c478bd9Sstevel@tonic-gate sbd_stat_t sb_stat; /* cached board status */ 3887c478bd9Sstevel@tonic-gate processorid_t sb_cpuid; /* for starfire connect */ 3897c478bd9Sstevel@tonic-gate time_t sb_time; /* time of last board op */ 3907c478bd9Sstevel@tonic-gate kmutex_t sb_mutex; 3917c478bd9Sstevel@tonic-gate kmutex_t sb_slock; /* status - unconfig, discon */ 3927c478bd9Sstevel@tonic-gate } sbd_board_t; 3937c478bd9Sstevel@tonic-gate 3947c478bd9Sstevel@tonic-gate /* definitions for sb_flags */ 3957c478bd9Sstevel@tonic-gate #define SBD_BOARD_STATUS_CACHED 1 3967c478bd9Sstevel@tonic-gate 3977c478bd9Sstevel@tonic-gate #define SBD_GET_BOARD_MEMUNIT(sb, un) \ 3987c478bd9Sstevel@tonic-gate (&((sb)->sb_dev[NIX(SBD_COMP_MEM)][un]._mu)) 3997c478bd9Sstevel@tonic-gate #define SBD_GET_BOARD_CPUUNIT(sb, un) \ 4007c478bd9Sstevel@tonic-gate (&((sb)->sb_dev[NIX(SBD_COMP_CPU)][un]._cu)) 4017c478bd9Sstevel@tonic-gate #define SBD_GET_BOARD_IOUNIT(sb, un) \ 4027c478bd9Sstevel@tonic-gate (&((sb)->sb_dev[NIX(SBD_COMP_IO)][un]._iu)) 4037c478bd9Sstevel@tonic-gate 4047c478bd9Sstevel@tonic-gate typedef ushort_t boardset_t; /* assumes 16 boards max */ 4057c478bd9Sstevel@tonic-gate 4067c478bd9Sstevel@tonic-gate #define BOARDSET(b) ((boardset_t)(1 << (b))) 4077c478bd9Sstevel@tonic-gate #define BOARD_IN_SET(bs, b) (((bs) & BOARDSET(b)) != 0) 4087c478bd9Sstevel@tonic-gate #define BOARD_ADD(bs, b) ((bs) |= BOARDSET(b)) 4097c478bd9Sstevel@tonic-gate #define BOARD_DEL(bs, b) ((bs) &= ~BOARDSET(b)) 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate /* 4127c478bd9Sstevel@tonic-gate * Format of sbd_devset_t bit masks: 4137c478bd9Sstevel@tonic-gate * 4147c478bd9Sstevel@tonic-gate * 32 16 8 4 0 4157c478bd9Sstevel@tonic-gate * |....|....|...I|IIII|....|...M|CCCC|CCCC| 4167c478bd9Sstevel@tonic-gate * 1 = indicates respective component present/attached. 4177c478bd9Sstevel@tonic-gate * I = I/O, M = Memory, C = CPU. 4187c478bd9Sstevel@tonic-gate */ 4197c478bd9Sstevel@tonic-gate #define DEVSET_ANYUNIT (-1) 4207c478bd9Sstevel@tonic-gate #define _NT2DEVPOS(t, u) ((NIX(t) << 3) + (u)) 4217c478bd9Sstevel@tonic-gate #define _DEVSET_MASK 0x001f01ff 4227c478bd9Sstevel@tonic-gate #define _CMP_DEVSET_MASK 0x11 4237c478bd9Sstevel@tonic-gate #define DEVSET(t, u) \ 4247c478bd9Sstevel@tonic-gate (((u) == DEVSET_ANYUNIT) ? \ 4257c478bd9Sstevel@tonic-gate (sbd_devset_t)((0xff << _NT2DEVPOS((t), 0)) & _DEVSET_MASK) : \ 4267c478bd9Sstevel@tonic-gate (((t) == SBD_COMP_CMP) ? \ 4277c478bd9Sstevel@tonic-gate (sbd_devset_t)(_CMP_DEVSET_MASK << _NT2DEVPOS((t), (u))) : \ 4287c478bd9Sstevel@tonic-gate (sbd_devset_t)(1 << _NT2DEVPOS((t), (u))))) 4297c478bd9Sstevel@tonic-gate 4307c478bd9Sstevel@tonic-gate #define DEVSET_IN_SET(ds, t, u) (((ds) & DEVSET((t), (u))) != 0) 4317c478bd9Sstevel@tonic-gate #define DEVSET_ADD(ds, t, u) ((ds) |= DEVSET((t), (u))) 4327c478bd9Sstevel@tonic-gate #define DEVSET_DEL(ds, t, u) ((ds) &= ~DEVSET((t), (u))) 4337c478bd9Sstevel@tonic-gate #define DEVSET_GET_UNITSET(ds, t) \ 4347c478bd9Sstevel@tonic-gate (((ds) & DEVSET((t), DEVSET_ANYUNIT)) >> _NT2DEVPOS((t), 0)) 4357c478bd9Sstevel@tonic-gate /* 4367c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_present 4377c478bd9Sstevel@tonic-gate */ 4387c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_PRESENT(bp, nt, un) \ 4397c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_present, (nt), (un)) 4407c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_PRESENT(bp, nt, un) \ 4417c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_present, (nt), (un)) 4427c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_PRESENT(bp, nt, un) \ 4437c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_present, (nt), (un)) 4447c478bd9Sstevel@tonic-gate /* 4457c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_attached 4467c478bd9Sstevel@tonic-gate */ 4477c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_ATTACHED(bp, nt, un) \ 4487c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_attached, (nt), (un)) 4497c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_ATTACHED(bp, nt, un) \ 4507c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_attached, (nt), (un)) 4517c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_ATTACHED(bp, nt, un) \ 4527c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_attached, (nt), (un)) 4537c478bd9Sstevel@tonic-gate /* 4547c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_released 4557c478bd9Sstevel@tonic-gate */ 4567c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_RELEASED(bp, nt, un) \ 4577c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_released, (nt), (un)) 4587c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_RELEASED(bp, nt, un) \ 4597c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_released, (nt), (un)) 4607c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_RELEASED(bp, nt, un) \ 4617c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_released, (nt), (un)) 4627c478bd9Sstevel@tonic-gate /* 4637c478bd9Sstevel@tonic-gate * Ops for sbd_board_t.sb_dev_unreferenced 4647c478bd9Sstevel@tonic-gate */ 4657c478bd9Sstevel@tonic-gate #define SBD_DEV_IS_UNREFERENCED(bp, nt, un) \ 4667c478bd9Sstevel@tonic-gate DEVSET_IN_SET((bp)->sb_dev_unreferenced, (nt), (un)) 4677c478bd9Sstevel@tonic-gate #define SBD_DEV_SET_UNREFERENCED(bp, nt, un) \ 4687c478bd9Sstevel@tonic-gate DEVSET_ADD((bp)->sb_dev_unreferenced, (nt), (un)) 4697c478bd9Sstevel@tonic-gate #define SBD_DEV_CLR_UNREFERENCED(bp, nt, un) \ 4707c478bd9Sstevel@tonic-gate DEVSET_DEL((bp)->sb_dev_unreferenced, (nt), (un)) 4717c478bd9Sstevel@tonic-gate 4727c478bd9Sstevel@tonic-gate #define SBD_DEVS_PRESENT(bp) \ 4737c478bd9Sstevel@tonic-gate ((bp)->sb_dev_present) 4747c478bd9Sstevel@tonic-gate #define SBD_DEVS_ATTACHED(bp) \ 4757c478bd9Sstevel@tonic-gate ((bp)->sb_dev_attached) 4767c478bd9Sstevel@tonic-gate #define SBD_DEVS_RELEASED(bp) \ 4777c478bd9Sstevel@tonic-gate ((bp)->sb_dev_released) 4787c478bd9Sstevel@tonic-gate #define SBD_DEVS_UNREFERENCED(bp) \ 4797c478bd9Sstevel@tonic-gate ((bp)->sb_dev_unreferenced) 4807c478bd9Sstevel@tonic-gate #define SBD_DEVS_UNATTACHED(bp) \ 4817c478bd9Sstevel@tonic-gate ((bp)->sb_dev_present & ~(bp)->sb_dev_attached) 4827c478bd9Sstevel@tonic-gate #define SBD_DEVS_CONFIGURE(bp, devs) \ 4837c478bd9Sstevel@tonic-gate ((bp)->sb_dev_attached = (devs)) 4847c478bd9Sstevel@tonic-gate #define SBD_DEVS_DISCONNECT(bp, devs) \ 4857c478bd9Sstevel@tonic-gate ((bp)->sb_dev_present &= ~(devs)) 4867c478bd9Sstevel@tonic-gate #define SBD_DEVS_CANCEL(bp, devs) \ 4877c478bd9Sstevel@tonic-gate ((bp)->sb_dev_released &= ~(devs), \ 4887c478bd9Sstevel@tonic-gate (bp)->sb_dev_unreferenced &= ~(devs)) 4897c478bd9Sstevel@tonic-gate 4907c478bd9Sstevel@tonic-gate /* 4917c478bd9Sstevel@tonic-gate * return values from sbd_cancel_cpu 4927c478bd9Sstevel@tonic-gate */ 4937c478bd9Sstevel@tonic-gate #define SBD_CPUERR_NONE 0 4947c478bd9Sstevel@tonic-gate #define SBD_CPUERR_RECOVERABLE -1 4957c478bd9Sstevel@tonic-gate #define SBD_CPUERR_FATAL -2 4967c478bd9Sstevel@tonic-gate 4977c478bd9Sstevel@tonic-gate /* 4987c478bd9Sstevel@tonic-gate * sbd_board_t.sbmem[].sbm_flags 4997c478bd9Sstevel@tonic-gate */ 5007c478bd9Sstevel@tonic-gate #define SBD_MFLAG_RESERVED 0x01 /* mem unit reserved for delete */ 5017c478bd9Sstevel@tonic-gate #define SBD_MFLAG_SOURCE 0x02 /* source brd of copy/rename op */ 5027c478bd9Sstevel@tonic-gate #define SBD_MFLAG_TARGET 0x04 /* board selected as target */ 5037c478bd9Sstevel@tonic-gate #define SBD_MFLAG_MEMUPSIZE 0x08 /* move from big to small board */ 5047c478bd9Sstevel@tonic-gate #define SBD_MFLAG_MEMDOWNSIZE 0x10 /* move from small to big board */ 5057c478bd9Sstevel@tonic-gate #define SBD_MFLAG_MEMRESIZE 0x18 /* move to different size board */ 5067c478bd9Sstevel@tonic-gate #define SBD_MFLAG_RELOWNER 0x20 /* memory release (delete) owner */ 5077c478bd9Sstevel@tonic-gate #define SBD_MFLAG_RELDONE 0x40 5087c478bd9Sstevel@tonic-gate 5097c478bd9Sstevel@tonic-gate typedef struct { 5107c478bd9Sstevel@tonic-gate int sfio_cmd; 5117c478bd9Sstevel@tonic-gate void *sfio_arg; 5127c478bd9Sstevel@tonic-gate } sbd_ioctl_t; 5137c478bd9Sstevel@tonic-gate 5147c478bd9Sstevel@tonic-gate /* 5157c478bd9Sstevel@tonic-gate * 32bit support for sbd_ioctl_t. 5167c478bd9Sstevel@tonic-gate */ 5177c478bd9Sstevel@tonic-gate typedef struct { 5187c478bd9Sstevel@tonic-gate int32_t sfio_cmd; 5197c478bd9Sstevel@tonic-gate uint32_t sfio_arg; 5207c478bd9Sstevel@tonic-gate } sbd_ioctl32_t; 5217c478bd9Sstevel@tonic-gate 5227c478bd9Sstevel@tonic-gate /* 5237c478bd9Sstevel@tonic-gate * PSM-DR layers are only allowed to use lower 16 bits of dev_t. 5247c478bd9Sstevel@tonic-gate * B - bottom 4 bits are for the slot number. 5257c478bd9Sstevel@tonic-gate * D - device type chosen (0 = indicates all devices in slot). 5267c478bd9Sstevel@tonic-gate * U - unit number if specific device type chosen. 5277c478bd9Sstevel@tonic-gate * X - not used. 5287c478bd9Sstevel@tonic-gate * 5297c478bd9Sstevel@tonic-gate * Upper Lower 5307c478bd9Sstevel@tonic-gate * XXXXUUUUDDDDBBBB 5317c478bd9Sstevel@tonic-gate * 5327c478bd9Sstevel@tonic-gate * Note that this format only allows attachment points to 5337c478bd9Sstevel@tonic-gate * either represent all the units on a board or one particular 5347c478bd9Sstevel@tonic-gate * unit. A more general specification would permit any combination 5357c478bd9Sstevel@tonic-gate * of specific units and types to be represented by individual 5367c478bd9Sstevel@tonic-gate * attachment points. 5377c478bd9Sstevel@tonic-gate */ 5387c478bd9Sstevel@tonic-gate #define SBD_DEV_SLOTMASK 0x000f 5397c478bd9Sstevel@tonic-gate /* 5407c478bd9Sstevel@tonic-gate * These device level definitions are primarily for unit testing. 5417c478bd9Sstevel@tonic-gate */ 5427c478bd9Sstevel@tonic-gate #define SBD_DEV_UNITMASK 0x0f00 5437c478bd9Sstevel@tonic-gate #define SBD_DEV_UNITSHIFT 8 5447c478bd9Sstevel@tonic-gate #define SBD_DEV_CPU 0x0010 5457c478bd9Sstevel@tonic-gate #define SBD_DEV_MEM 0x0020 5467c478bd9Sstevel@tonic-gate #define SBD_DEV_IO 0x0040 5477c478bd9Sstevel@tonic-gate #define SBD_DEV_TYPEMASK (SBD_DEV_CPU | SBD_DEV_MEM | SBD_DEV_IO) 5487c478bd9Sstevel@tonic-gate #define SBD_DEV_TYPESHIFT 4 5497c478bd9Sstevel@tonic-gate 5507c478bd9Sstevel@tonic-gate /* 5517c478bd9Sstevel@tonic-gate * Slot, Instance, and Minor number Macro definitions 5527c478bd9Sstevel@tonic-gate */ 5537c478bd9Sstevel@tonic-gate #define SLOT2DEV(s) ((s) & SBD_DEV_SLOTMASK) 5547c478bd9Sstevel@tonic-gate #define SBDGETSLOT(unit) ((unit) & SBD_DEV_SLOTMASK) 5557c478bd9Sstevel@tonic-gate /* 5567c478bd9Sstevel@tonic-gate * The following is primarily for unit testing. 5577c478bd9Sstevel@tonic-gate */ 5587c478bd9Sstevel@tonic-gate #define ALLCPU2DEV(s) (SBD_DEV_CPU | SLOT2DEV(s)) 5597c478bd9Sstevel@tonic-gate #define ALLMEM2DEV(s) (SBD_DEV_MEM | SLOT2DEV(s)) 5607c478bd9Sstevel@tonic-gate #define ALLIO2DEV(s) (SBD_DEV_IO | SLOT2DEV(s)) 5617c478bd9Sstevel@tonic-gate #define _UNIT2DEV(u) (((u) << SBD_DEV_UNITSHIFT) & \ 5627c478bd9Sstevel@tonic-gate SBD_DEV_UNITMASK) 5637c478bd9Sstevel@tonic-gate #define CPUUNIT2DEV(s, c) (_UNIT2DEV(c) | ALLCPU2DEV(s)) 5647c478bd9Sstevel@tonic-gate #define MEMUNIT2DEV(s, m) (_UNIT2DEV(m) | ALLMEM2DEV(s)) 5657c478bd9Sstevel@tonic-gate #define IOUNIT2DEV(s, i) (_UNIT2DEV(i) | ALLIO2DEV(s)) 5667c478bd9Sstevel@tonic-gate 5677c478bd9Sstevel@tonic-gate #define DEV_IS_ALLUNIT(d) (((d) & SBD_DEV_UNITMASK) == 0) 5687c478bd9Sstevel@tonic-gate #define _DEV_IS_ALLTYPE(d) (((d) & SBD_DEV_TYPEMASK) == 0) 5697c478bd9Sstevel@tonic-gate #define DEV_IS_ALLBOARD(d) (DEV_IS_ALLUNIT(d) && _DEV_IS_ALLTYPE(d)) 5707c478bd9Sstevel@tonic-gate #define DEV_IS_CPU(d) ((d) & SBD_DEV_CPU) 5717c478bd9Sstevel@tonic-gate #define DEV_IS_MEM(d) ((d) & SBD_DEV_MEM) 5727c478bd9Sstevel@tonic-gate #define DEV_IS_IO(d) ((d) & SBD_DEV_IO) 5737c478bd9Sstevel@tonic-gate #define DEV_IS_ALLCPU(d) (DEV_IS_ALLUNIT(d) && DEV_IS_CPU(d)) 5747c478bd9Sstevel@tonic-gate #define DEV_IS_ALLMEM(d) (DEV_IS_ALLUNIT(d) && DEV_IS_MEM(d)) 5757c478bd9Sstevel@tonic-gate #define DEV_IS_ALLIO(d) (DEV_IS_ALLUNIT(d) && DEV_IS_IO(d)) 5767c478bd9Sstevel@tonic-gate #define DEV2UNIT(d) \ 5777c478bd9Sstevel@tonic-gate ((((d) & SBD_DEV_UNITMASK) >> SBD_DEV_UNITSHIFT) - 1) 5787c478bd9Sstevel@tonic-gate #define DEV2NT(d) \ 5797c478bd9Sstevel@tonic-gate (DEV_IS_MEM(d) ? SBD_COMP_MEM : \ 5807c478bd9Sstevel@tonic-gate DEV_IS_CPU(d) ? SBD_COMP_CPU : \ 5817c478bd9Sstevel@tonic-gate DEV_IS_IO(d) ? SBD_COMP_IO : SBD_COMP_UNKNOWN) 5827c478bd9Sstevel@tonic-gate 5837c478bd9Sstevel@tonic-gate /* 5847c478bd9Sstevel@tonic-gate * Macros to cast between PIM and PSM layers of the following 5857c478bd9Sstevel@tonic-gate * structures: 5867c478bd9Sstevel@tonic-gate * board_t <-> sbd_board_t 5877c478bd9Sstevel@tonic-gate * sbd_handle_t <-> sbd_priv_handle_t 5887c478bd9Sstevel@tonic-gate * sbderror_t <-> sbderror_t 5897c478bd9Sstevel@tonic-gate * slot -> board_t 5907c478bd9Sstevel@tonic-gate * slot -> sbd_board_t 5917c478bd9Sstevel@tonic-gate * sbd_board_t -> sbd_handle_t 5927c478bd9Sstevel@tonic-gate * sbd_handle -> sbderror_t 5937c478bd9Sstevel@tonic-gate */ 5947c478bd9Sstevel@tonic-gate #define SBDH2BD(bd) ((sbd_board_t *)(bd)) 5957c478bd9Sstevel@tonic-gate 5967c478bd9Sstevel@tonic-gate #define HD2MACHHD(hd) ((sbd_priv_handle_t *)(hd)) 5977c478bd9Sstevel@tonic-gate #define MACHHD2HD(mhd) ((sbd_handle_t *)&((mhd)->sh_handle)) 5987c478bd9Sstevel@tonic-gate 5997c478bd9Sstevel@tonic-gate #define ERR2MACHERR(err) ((sbderror_t *)(err)) 6007c478bd9Sstevel@tonic-gate #define MACHERR2ERR(merr) ((sbderror_t *)(merr)) 6017c478bd9Sstevel@tonic-gate 6027c478bd9Sstevel@tonic-gate #define BSLOT2MACHBD(b) (&(sbd_boardlist[b])) 6037c478bd9Sstevel@tonic-gate #define BSLOT2BD(slot) MACHBD2BD(BSLOT2MACHBD(slot)) 6047c478bd9Sstevel@tonic-gate 6057c478bd9Sstevel@tonic-gate #define MACHBD2HD(sbp) MACHHD2HD((sbp)->sb_handle) 6067c478bd9Sstevel@tonic-gate 6077c478bd9Sstevel@tonic-gate #define HD2MACHERR(hd) ERR2MACHERR(SBD_HD2ERR(hd)) 6087c478bd9Sstevel@tonic-gate 6097c478bd9Sstevel@tonic-gate #define MACHSRHD2HD(srh) ((srh)->sr_dr_handlep) 6107c478bd9Sstevel@tonic-gate 6117c478bd9Sstevel@tonic-gate /* 6127c478bd9Sstevel@tonic-gate * CMP Specific Helpers 6137c478bd9Sstevel@tonic-gate */ 6147c478bd9Sstevel@tonic-gate #define MAX_CORES_PER_CMP 2 6157c478bd9Sstevel@tonic-gate #define SBD_CMP_CORE_UNUM(cmp, core) ((cmp + (core * 512)) 6167c478bd9Sstevel@tonic-gate #define SBD_CMP_NUM(unum) (unum & 0x3) 6177c478bd9Sstevel@tonic-gate 6187c478bd9Sstevel@tonic-gate /* 6197c478bd9Sstevel@tonic-gate * Some stuff to assist in debug. 6207c478bd9Sstevel@tonic-gate */ 6217c478bd9Sstevel@tonic-gate #ifdef DEBUG 6227c478bd9Sstevel@tonic-gate #define SBD_DBG_STATE 0x00000001 6237c478bd9Sstevel@tonic-gate #define SBD_DBG_QR 0x00000002 6247c478bd9Sstevel@tonic-gate #define SBD_DBG_CPU 0x00000004 6257c478bd9Sstevel@tonic-gate #define SBD_DBG_MEM 0x00000008 6267c478bd9Sstevel@tonic-gate #define SBD_DBG_IO 0x00000010 6277c478bd9Sstevel@tonic-gate #define SBD_DBG_HW 0x00000020 6287c478bd9Sstevel@tonic-gate #define SBD_DBG_BYP 0x00000040 6297c478bd9Sstevel@tonic-gate 6307c478bd9Sstevel@tonic-gate #define PR_ALL if (sbd_debug) printf 6317c478bd9Sstevel@tonic-gate #define PR_STATE if (sbd_debug & SBD_DBG_STATE) printf 6327c478bd9Sstevel@tonic-gate #define PR_QR if (sbd_debug & SBD_DBG_QR) prom_printf 6337c478bd9Sstevel@tonic-gate #define PR_CPU if (sbd_debug & SBD_DBG_CPU) printf 6347c478bd9Sstevel@tonic-gate #define PR_MEM if (sbd_debug & SBD_DBG_MEM) printf 6357c478bd9Sstevel@tonic-gate #define PR_IO if (sbd_debug & SBD_DBG_IO) printf 6367c478bd9Sstevel@tonic-gate #define PR_HW if (sbd_debug & SBD_DBG_HW) printf 6377c478bd9Sstevel@tonic-gate #define PR_BYP if (sbd_debug & SBD_DBG_BYP) prom_printf 6387c478bd9Sstevel@tonic-gate 6397c478bd9Sstevel@tonic-gate #define SBD_MEMLIST_DUMP(ml) memlist_dump(ml) 6407c478bd9Sstevel@tonic-gate 6417c478bd9Sstevel@tonic-gate extern uint_t sbd_debug; 6427c478bd9Sstevel@tonic-gate #else /* DEBUG */ 6437c478bd9Sstevel@tonic-gate #define PR_ALL if (0) printf 6447c478bd9Sstevel@tonic-gate #define PR_STATE PR_ALL 6457c478bd9Sstevel@tonic-gate #define PR_QR PR_ALL 6467c478bd9Sstevel@tonic-gate #define PR_CPU PR_ALL 6477c478bd9Sstevel@tonic-gate #define PR_MEM PR_ALL 6487c478bd9Sstevel@tonic-gate #define PR_IO PR_ALL 6497c478bd9Sstevel@tonic-gate #define PR_HW PR_ALL 6507c478bd9Sstevel@tonic-gate #define PR_BYP PR_ALL 6517c478bd9Sstevel@tonic-gate 6527c478bd9Sstevel@tonic-gate #define SBD_MEMLIST_DUMP(ml) 6537c478bd9Sstevel@tonic-gate #endif /* DEBUG */ 6547c478bd9Sstevel@tonic-gate extern char *sbd_state_str[]; 6557c478bd9Sstevel@tonic-gate extern char *sbd_ct_str[]; 6567c478bd9Sstevel@tonic-gate 6577c478bd9Sstevel@tonic-gate /* 6587c478bd9Sstevel@tonic-gate * event flag 6597c478bd9Sstevel@tonic-gate */ 6607c478bd9Sstevel@tonic-gate extern char send_event; 6617c478bd9Sstevel@tonic-gate 6627c478bd9Sstevel@tonic-gate /* 6637c478bd9Sstevel@tonic-gate * IMPORTANT: 6647c478bd9Sstevel@tonic-gate * The following two defines are also coded into OBP, so if they 6657c478bd9Sstevel@tonic-gate * need to change here, don't forget to change OBP also. 6667c478bd9Sstevel@tonic-gate */ 6677c478bd9Sstevel@tonic-gate #define SBD_OBP_PROBE_GOOD 0 6687c478bd9Sstevel@tonic-gate #define SBD_OBP_PROBE_BAD 1 6697c478bd9Sstevel@tonic-gate 6707c478bd9Sstevel@tonic-gate extern int sbd_setup_instance(int, dev_info_t *, int, int, 6717c478bd9Sstevel@tonic-gate caddr_t); 6727c478bd9Sstevel@tonic-gate extern int sbd_teardown_instance(int, caddr_t); 6737c478bd9Sstevel@tonic-gate extern int sbd_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, 6747c478bd9Sstevel@tonic-gate char *event); 6757c478bd9Sstevel@tonic-gate 6767c478bd9Sstevel@tonic-gate extern sbd_comp_type_t sbd_cm_type(char *name); 6777c478bd9Sstevel@tonic-gate extern sbd_state_t ostate_cvt(sbd_istate_t state); 6787c478bd9Sstevel@tonic-gate extern void sbd_cpu_set_prop(sbd_cpu_unit_t *cp, dev_info_t *dip); 6797c478bd9Sstevel@tonic-gate extern int sbd_cpu_flags(sbd_handle_t *hp, sbd_devset_t devset, 6807c478bd9Sstevel@tonic-gate sbd_dev_stat_t *dsp); 6817c478bd9Sstevel@tonic-gate extern int sbd_disconnect_cpu(sbd_handle_t *hp, int unit); 6827c478bd9Sstevel@tonic-gate extern int sbd_connect_cpu(sbd_board_t *sbp, int unit); 6837c478bd9Sstevel@tonic-gate extern int sbd_disconnect_mem(sbd_handle_t *hp, int unit); 6847c478bd9Sstevel@tonic-gate 6857c478bd9Sstevel@tonic-gate extern int sbd_pre_detach_mem(sbd_handle_t *hp, 6867c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 6877c478bd9Sstevel@tonic-gate extern int sbd_post_attach_mem(sbd_handle_t *, 6887c478bd9Sstevel@tonic-gate sbd_devlist_t *, int); 6897c478bd9Sstevel@tonic-gate extern int sbd_post_detach_mem(sbd_handle_t *, 6907c478bd9Sstevel@tonic-gate sbd_devlist_t *, int); 6917c478bd9Sstevel@tonic-gate extern int sbd_post_attach_cpu(sbd_handle_t *hp, 6927c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 6937c478bd9Sstevel@tonic-gate extern int sbd_pre_release_cpu(sbd_handle_t *hp, 6947c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 6957c478bd9Sstevel@tonic-gate extern int sbd_pre_detach_cpu(sbd_handle_t *hp, 6967c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 6977c478bd9Sstevel@tonic-gate extern int sbd_post_detach_cpu(sbd_handle_t *hp, 6987c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 6997c478bd9Sstevel@tonic-gate extern int sbd_pre_attach_mem(sbd_handle_t *hp, 7007c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 7017c478bd9Sstevel@tonic-gate extern int sbd_pre_release_mem(sbd_handle_t *hp, 7027c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 7037c478bd9Sstevel@tonic-gate extern int sbd_disconnect_io(sbd_handle_t *hp, int unit); 7047c478bd9Sstevel@tonic-gate extern void sbd_check_devices(dev_info_t *dip, int *refcount, 7057c478bd9Sstevel@tonic-gate sbd_handle_t *handle); 7067c478bd9Sstevel@tonic-gate extern struct memlist *sbd_get_memlist(sbd_mem_unit_t *mp, sbderror_t *ep); 7077c478bd9Sstevel@tonic-gate extern void sbd_init_mem_unit(sbd_board_t *sbp, int unit, 7087c478bd9Sstevel@tonic-gate sbderror_t *ep); 7097c478bd9Sstevel@tonic-gate extern void sbd_release_mem_done(sbd_handle_t *hp, int unit); 7107c478bd9Sstevel@tonic-gate extern void sbd_release_cleanup(sbd_handle_t *hp); 7117c478bd9Sstevel@tonic-gate extern int sbd_cancel_cpu(sbd_handle_t *hp, int unit); 7127c478bd9Sstevel@tonic-gate extern void sbd_init_err(sbderror_t *ep); 7137c478bd9Sstevel@tonic-gate extern int sbd_cancel_mem(sbd_handle_t *hp, int unit); 7147c478bd9Sstevel@tonic-gate extern sbd_comp_type_t sbd_get_devtype(sbd_handle_t *hp, dev_info_t *dip); 7157c478bd9Sstevel@tonic-gate extern int sbd_get_board(dev_info_t *dip); 7167c478bd9Sstevel@tonic-gate extern int sfhw_get_base_physaddr(dev_info_t *dip, 7177c478bd9Sstevel@tonic-gate uint64_t *basepa); 7187c478bd9Sstevel@tonic-gate extern int sbd_pre_attach_cpu(sbd_handle_t *hp, 7197c478bd9Sstevel@tonic-gate sbd_devlist_t *devlist, int devnum); 7207c478bd9Sstevel@tonic-gate extern int sbd_move_memory(sbd_handle_t *hp, sbd_board_t 7217c478bd9Sstevel@tonic-gate *s_bp, sbd_board_t *t_bp); 7227c478bd9Sstevel@tonic-gate extern void memlist_delete(struct memlist *mlist); 7237c478bd9Sstevel@tonic-gate extern struct memlist *memlist_dup(struct memlist *mlist); 7247c478bd9Sstevel@tonic-gate extern void memlist_dump(struct memlist *mlist); 7257c478bd9Sstevel@tonic-gate extern int memlist_intersect(struct memlist *alist, 7267c478bd9Sstevel@tonic-gate struct memlist *blist); 7277c478bd9Sstevel@tonic-gate extern int sbd_juggle_bootproc(sbd_handle_t *hp, 7287c478bd9Sstevel@tonic-gate processorid_t cpuid); 7297c478bd9Sstevel@tonic-gate 7307c478bd9Sstevel@tonic-gate extern sbd_cond_t sbd_get_comp_cond(dev_info_t *); 7317c478bd9Sstevel@tonic-gate void sbd_attach_mem(sbd_handle_t *hp, sbderror_t *ep); 7327c478bd9Sstevel@tonic-gate int sbd_release_mem(sbd_handle_t *hp, dev_info_t *dip, 7337c478bd9Sstevel@tonic-gate int unit); 7347c478bd9Sstevel@tonic-gate 7357c478bd9Sstevel@tonic-gate int sbd_get_memhandle(sbd_handle_t *hp, dev_info_t *dip, 7367c478bd9Sstevel@tonic-gate memhandle_t *mhp); 7377c478bd9Sstevel@tonic-gate int sbd_detach_memory(sbd_handle_t *hp, sbderror_t *ep, 7387c478bd9Sstevel@tonic-gate sbd_mem_unit_t *s_mp, int unit); 7397c478bd9Sstevel@tonic-gate void sbd_release_memory_done(void *arg, int error); 7407c478bd9Sstevel@tonic-gate int sbd_set_err_in_hdl(sbd_handle_t *hp, sbderror_t *ep); 7417c478bd9Sstevel@tonic-gate sbdp_handle_t *sbd_get_sbdp_handle(sbd_board_t *sbp, 7427c478bd9Sstevel@tonic-gate sbd_handle_t *hp); 7437c478bd9Sstevel@tonic-gate void sbd_release_sbdp_handle(sbdp_handle_t *hp); 7447c478bd9Sstevel@tonic-gate void sbd_reset_error_sbdph(sbdp_handle_t *hp); 7457c478bd9Sstevel@tonic-gate extern int sbd_is_cmp_child(dev_info_t *dip); 7467c478bd9Sstevel@tonic-gate 7477c478bd9Sstevel@tonic-gate typedef const char *const fn_t; 7487c478bd9Sstevel@tonic-gate 7497c478bd9Sstevel@tonic-gate #ifdef __cplusplus 7507c478bd9Sstevel@tonic-gate } 7517c478bd9Sstevel@tonic-gate #endif 7527c478bd9Sstevel@tonic-gate 7537c478bd9Sstevel@tonic-gate #endif /* _SYS_SBDPRIV_H */ 754