1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
/* $NetBSD: elroyreg.h,v 1.1 2014/02/24 07:23:42 skrll Exp $ */
/* $OpenBSD: elroyreg.h,v 1.1 2007/05/21 22:43:38 kettenis Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
struct elroy_regs {
/* std PCI bridge header */
uint32_t pci_id; /* 0x000 rw PCI_ID */
uint32_t pci_cmdstat; /* 0x004 rw PCI_COMMAND_STATUS_REG */
uint32_t pci_class; /* 0x008 ro PCI_CLASS_REG */
uint32_t pci_bhlc; /* 0x00c rw PCI_BHLC_REG */
uint32_t res0[0x30/4]; /* 0x010 */
/* HW Bridge registers */
uint32_t pci_conf_addr; /* 0x040 rw config space address */
uint32_t pad040;
uint32_t pci_conf_data; /* 0x048 rw config space data */
uint32_t pad048;
uint64_t elroy_mtlt; /* 0x050 */
uint32_t busnum; /* 0x058 bus number/scratch */
uint32_t par058;
uint64_t res1; /* 0x060 */
uint64_t rope; /* 0x068 rope parity, loopback */
uint64_t err_addr; /* 0x070 error log: address */
uint64_t suspend; /* 0x078 rw suspend control */
uint32_t arb_mask; /* 0x080 rw arbitration mask */
uint32_t pad080;
#define ELROY_ARB_ENABLE 0x01 /* enable arbitration */
#define ELROY_ARB_PCIDEVA 0x02 /* PCI device A allow */
#define ELROY_ARB_PCIDEVB 0x04 /* PCI device A allow */
#define ELROY_ARB_PCIDEVC 0x08 /* PCI device A allow */
#define ELROY_ARB_PCIDEVD 0x10 /* PCI device A allow */
#define ELROY_ARB_PCIDEVE 0x20 /* PCI device A allow */
#define ELROY_ARB_PCIDEVF 0x40 /* PCI device A allow */
#define ELROY_ARB_PCIDEVG 0x80 /* PCI device A allow */
uint64_t arb_pri; /* 0x088 arbitration priority */
uint64_t arb_mode; /* 0x090 arbitration mode */
uint64_t mtlt; /* 0x098 */
uint64_t res2[12]; /* 0x0a0 */
uint64_t mod_info; /* 0x100 */
uint32_t control; /* 0x108 */
#define ELROY_CONTROL_RF 0x01 /* reset pci */
#define ELROY_CONTROL_VE 0x08 /* VGA enable */
#define ELROY_CONTROL_CL 0x10 /* clear error log */
#define ELROY_CONTROL_CE 0x20 /* clear error log enable */
#define ELROY_CONTROL_HF 0x40 /* hard fail enable */
uint32_t status; /* 0x10c */
#define ELROY_STATUS_RC 0x01 /* reset complete */
#define ELROY_STATUS_BITS "\020\01RC"
uint64_t res3[30]; /* 0x110 */
uint64_t lmmio_base; /* 0x200 */
uint64_t lmmio_mask; /* 0x208 */
uint64_t gmmio_base; /* 0x210 */
uint64_t gmmio_mask; /* 0x218 */
uint64_t wlmmio_base; /* 0x220 */
uint64_t wlmmio_mask; /* 0x228 */
uint64_t wgmmio_base; /* 0x230 */
uint64_t wgmmio_mask; /* 0x238 */
uint32_t io_base; /* 0x240 */
uint32_t pad240;
uint32_t io_mask; /* 0x248 */
uint32_t pad248;
uint32_t res4[4]; /* 0x250 */
uint32_t eio_base; /* 0x260 */
uint32_t pad260;
uint32_t eio_mask; /* 0x268 */
uint32_t pad268;
#define ELROY_BASE_RE 0x01 /* range enable */
uint64_t res5; /* 0x270 */
uint64_t dmac_ctrl; /* 0x278 DMA connection control */
uint64_t res6[16]; /* 0x280 */
uint32_t ibase; /* 0x300 */
uint32_t pad300;
uint32_t imask; /* 0x308 */
uint32_t pad308;
uint64_t hint_cfg; /* 0x310 */
uint64_t res7[13]; /* 0x318 */
uint64_t hints[14]; /* 0x380 */
uint64_t res8[2]; /* 0x3f0 */
uint64_t res9[64]; /* 0x400 */
uint64_t pad0; /* 0x600 */
uint64_t pci_drive; /* 0x608 */
uint64_t rope_cfg; /* 0x610 */
uint64_t clk_ctl; /* 0x618 */
uint32_t pad1; /* 0x620 */
uint32_t res10[23]; /* 0x624 */
uint32_t err_cfg; /* 0x680 error config */
uint32_t pad680;
#define ELROY_ERRCFG_PW 0x01 /* PIO writes parity errors */
#define ELROY_ERRCFG_PR 0x02 /* PIO reads parity errors */
#define ELROY_ERRCFG_DW 0x04 /* DMA writes parity errors */
#define ELROY_ERRCFG_DR 0x08 /* DMA reads parity errors */
#define ELROY_ERRCFG_CM 0x10 /* no fatal on config space */
#define ELROY_ERRCFG_SMART 0x20 /* smart bus mode */
uint64_t err_stat; /* 0x688 error status */
uint64_t err_mid; /* 0x690 error log: master id */
uint64_t rope_estat; /* 0x698 rope error status */
uint64_t rope_eclr; /* 0x6a0 rope error clear */
uint64_t res11[42]; /* 0x6a8 */
uint64_t regbus; /* 0x7f8 reads 0x3ff */
uint32_t apic_addr; /* 0x800 APIC address register */
uint32_t pad800;
uint64_t res12;
uint32_t apic_data; /* 0x810 APIC data register */
uint32_t pad808;
uint64_t res13[5];
uint32_t apic_eoi; /* 0x840 APIC interrupt ack */
uint32_t pad840;
uint32_t apic_softint; /* 0x850 write generates softint */
uint32_t pad850;
uint64_t res14[123]; /* 0x858 */
/*0x1000 */
};
/* APIC registers */
#define APIC_VERSION 0x01
#define APIC_VERSION_MASK 0xff
#define APIC_VERSION_NENT 0xff0000
#define APIC_VERSION_NENT_SHIFT 16
#define APIC_ENT0(i) (0x10 + (i)*2)
#define APIC_ENT0_VEC 0x000ff
#define APIC_ENT0_MOD 0x00700 /* delivery mode */
#define APIC_ENT0_FXD 0x00000
#define APIC_ENT0_RDR 0x00100
#define APIC_ENT0_PMI 0x00200
#define APIC_ENT0_NMI 0x00400
#define APIC_ENT0_INI 0x00500
#define APIC_ENT0_EXT 0x00700
#define APIC_ENT0_PEND 0x01000 /* int is pending */
#define APIC_ENT0_LOW 0x02000 /* polarity */
#define APIC_ENT0_LEV 0x08000 /* edge/level */
#define APIC_ENT0_MASK 0x10000 /* mask int */
#define APIC_ENT1(i) (0x11 + (i)*2)
|