/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_PCMU_CB_H
#define _SYS_PCMU_CB_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
enum pcmu_cb_nintr_index {
CBNINTR_PBM = 0, /* not shared */
CBNINTR_UE = 1, /* shared */
CBNINTR_CE = 2, /* shared */
CBNINTR_POWER_FAIL = 3, /* shared */
CBNINTR_THERMAL = 4, /* shared */
CBNINTR_MAX /* max */
};
/*
* control block soft state structure:
*/
struct pcmu_cb {
pcmu_t *pcb_pcmu_p;
pcmu_ign_t pcb_ign; /* interrupt grp# */
kmutex_t pcb_intr_lock; /* guards add/rem intr and intr dist */
uint32_t pcb_no_of_inos; /* # of actual inos, including PBM */
uint32_t pcb_inos[CBNINTR_MAX]; /* subset of pcmu_p->pcmu_inos array */
uint64_t pcb_base_pa; /* PA of CSR bank, 2nd "reg" */
uint64_t pcb_map_pa; /* map reg base PA */
uint64_t pcb_clr_pa; /* clr reg base PA */
uint64_t pcb_obsta_pa; /* sta reg base PA */
uint64_t *pcb_imr_save;
caddr_t pcb_ittrans_cookie; /* intr tgt translation */
};
#define PCMU_CB_INO_TO_MONDO(pcb_p, ino) \
((pcb_p)->pcb_ign << PCMU_INO_BITS | (ino))
/*
* Prototypes.
*/
extern void pcmu_cb_create(pcmu_t *pcmu_p);
extern void pcmu_cb_destroy(pcmu_t *pcmu_p);
extern void pcmu_cb_suspend(pcmu_cb_t *cb_p);
extern void pcmu_cb_resume(pcmu_cb_t *cb_p);
extern void pcmu_cb_enable_nintr(pcmu_t *pcmu_p, pcmu_cb_nintr_index_t idx);
extern void pcmu_cb_disable_nintr(pcmu_cb_t *cb_p,
pcmu_cb_nintr_index_t idx, int wait);
extern void pcmu_cb_clear_nintr(pcmu_cb_t *cb_p, pcmu_cb_nintr_index_t idx);
extern void pcmu_cb_intr_dist(void *arg);
#ifdef __cplusplus
}
#endif
#endif /* _SYS_PCMU_CB_H */