1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #ifndef _SYS_ACEBUS_H
  28 #define _SYS_ACEBUS_H
  29 
  30 #pragma ident   "%Z%%M% %I%     %E% SMI"
  31 
  32 #ifdef  __cplusplus
  33 extern "C" {
  34 #endif
  35 
  36 /*
  37  * driver state type:
  38  */
  39 typedef enum { NEW = 0, ATTACHED, RESUMED, DETACHED,
  40                 SUSPENDED, PM_SUSPENDED } driver_state_t;
  41 
  42 /*
  43  * The i86pc specific code fragments are to support the debug of "honeynut"
  44  * and "multigrain" prototypes on i86pc platform.  Most of the fragments
  45  * deal with differences in the interrupt dispatching between the prototypes
  46  * and the cheerio ebus.  On the prototype boards, all interrupt lines are
  47  * tied together.  For this case, the nexus driver uses a common interrupt
  48  * handler to poll all of its children.
  49  */
  50 #if defined(i86pc)
  51 #define MAX_EBUS_DEVS   6
  52 
  53 /*
  54  * ebus device interrupt info;
  55  */
  56 typedef struct {
  57         char *name;
  58         uint_t inuse;
  59         uint_t (*handler)();
  60         caddr_t arg;
  61 } ebus_intr_slot_t;
  62 #endif
  63 
  64 struct ebus_intr_map {
  65         uint32_t ebus_phys_hi;
  66         uint32_t ebus_phys_low;
  67         uint32_t ebus_intr;
  68         uint32_t intr_ctlr_nodeid;
  69         uint32_t ino;
  70 };
  71 
  72 struct ebus_intr_map_mask {
  73         uint32_t ebus_phys_hi;
  74         uint32_t ebus_phys_low;
  75         uint32_t ebus_intr;
  76 };
  77 
  78 /*
  79  * driver soft state structure:
  80  */
  81 typedef struct {
  82         dev_info_t *dip;
  83         driver_state_t state;
  84         pci_regspec_t *reg;
  85         int nreg;
  86         struct ebus_pci_rangespec *rangep;
  87         int range_cnt;
  88 
  89 #if defined(i86pc)
  90         ddi_iblock_cookie_t iblock;
  91         ddi_idevice_cookie_t idevice;
  92         ebus_intr_slot_t intr_slot[MAX_EBUS_DEVS];
  93 #endif
  94 #if defined(__sparc)
  95         /* Interrupt support */
  96         int intr_map_size;
  97         struct ebus_intr_map *intr_map;
  98         struct ebus_intr_map_mask *intr_map_mask;
  99 #endif
 100 } ebus_devstate_t;
 101 
 102 /*
 103  * definition of ebus reg spec entry:
 104  */
 105 typedef struct {
 106         uint32_t addr_hi;
 107         uint32_t addr_low;
 108         uint32_t size;
 109 } ebus_regspec_t;
 110 
 111 /* EBUS range entry */
 112 struct ebus_pci_rangespec {
 113         uint32_t ebus_phys_hi;                  /* Child hi range address */
 114         uint32_t ebus_phys_low;                 /* Child low range address */
 115         uint32_t pci_phys_hi;                   /* Parent hi rng addr */
 116         uint32_t pci_phys_mid;                  /* Parent mid rng addr */
 117         uint32_t pci_phys_low;                  /* Parent low rng addr */
 118         uint32_t rng_size;                      /* Range size */
 119 };
 120 
 121 /*
 122  * use macros for soft state and driver properties:
 123  */
 124 #define get_acebus_soft_state(i)        \
 125         ((ebus_devstate_t *)ddi_get_soft_state(per_acebus_state, (i)))
 126 
 127 #define alloc_acebus_soft_state(i)      \
 128         ddi_soft_state_zalloc(per_acebus_state, (i))
 129 
 130 #define free_acebus_soft_state(i)       \
 131         ddi_soft_state_free(per_acebus_state, (i))
 132 
 133 
 134 #define getprop(dip, name, addr, intp)          \
 135                 ddi_getlongprop(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
 136                                 (name), (caddr_t)(addr), (intp))
 137 
 138 /*
 139  * register offsets and lengths:
 140  */
 141 #define TCR_OFFSET      0x710000
 142 #define TCR_LENGTH      12
 143 
 144 #define CSR_IO_RINDEX           2
 145 #define CSR_SIZE                0x00800000
 146 #define TCR1_OFF                0x00710000
 147 #define TCR2_OFF                0x00710004
 148 #define TCR3_OFF                0x00710008
 149 #define PMD_AUX_OFF             0x00728000
 150 #define FREQ_AUX_OFF            0x0072a000
 151 #define DCSR1_OFF               0x00700000
 152 #define DACR1_OFF               0x00700004
 153 #define DBCR1_OFF               0x00700008
 154 #define DCSR2_OFF               0x00702000
 155 #define DACR2_OFF               0x00702004
 156 #define DBCR2_OFF               0x00702008
 157 #define DCSR3_OFF               0x00704000
 158 #define DACR3_OFF               0x00704004
 159 #define DBCR3_OFF               0x00704008
 160 #define DCSR4_OFF               0x00706000
 161 #define DACR4_OFF               0x00706004
 162 #define DBCR4_OFF               0x00706008
 163 
 164 /*
 165  * timing control register settings:
 166  */
 167 #define TCR1            0x08101008
 168 #define TCR2            0x08100020
 169 #define TCR3            0x00000020
 170 #define TCR1_REGVAL     0xe3080808
 171 #define TCR2_REGVAL     0x0808ff20
 172 #define TCR3_REGVAL     0x91f3c420
 173 
 174 
 175 
 176 #if defined(DEBUG)
 177 #define D_IDENTIFY      0x00000001
 178 #define D_ATTACH        0x00000002
 179 #define D_DETACH        0x00000004
 180 #define D_MAP           0x00000008
 181 #define D_CTLOPS        0x00000010
 182 #define D_INTR          0x00000100
 183 
 184 #define DBG(flag, psp, fmt)     \
 185         acebus_debug(flag, psp, fmt, 0, 0, 0, 0, 0);
 186 #define DBG1(flag, psp, fmt, a1)        \
 187         acebus_debug(flag, psp, fmt, (uintptr_t)(a1), 0, 0, 0, 0);
 188 #define DBG2(flag, psp, fmt, a1, a2)    \
 189         acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), 0, 0, 0);
 190 #define DBG3(flag, psp, fmt, a1, a2, a3)        \
 191         acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), \
 192             (uintptr_t)(a3), 0, 0);
 193 #define DBG4(flag, psp, fmt, a1, a2, a3, a4)    \
 194         acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), \
 195             (uintptr_t)(a3), \
 196                 (uintptr_t)(a4), 0);
 197 #define DBG5(flag, psp, fmt, a1, a2, a3, a4, a5)        \
 198         acebus_debug(flag, psp, fmt, (uintptr_t)(a1), (uintptr_t)(a2), \
 199             (uintptr_t)(a3), \
 200                 (uintptr_t)(a4), (uintptr_t)(a5));
 201 static void
 202 acebus_debug(uint_t, ebus_devstate_t *, char *, uintptr_t, uintptr_t, uintptr_t,
 203     uintptr_t, uintptr_t);
 204 #else
 205 #define DBG(flag, psp, fmt)
 206 #define DBG1(flag, psp, fmt, a1)
 207 #define DBG2(flag, psp, fmt, a1, a2)
 208 #define DBG3(flag, psp, fmt, a1, a2, a3)
 209 #define DBG4(flag, psp, fmt, a1, a2, a3, a4)
 210 #define DBG5(flag, psp, fmt, a1, a2, a3, a4, a5)
 211 #endif
 212 
 213 #ifdef  __cplusplus
 214 }
 215 #endif
 216 
 217 #endif  /* _SYS_ACEBUS_H */