1214501Srpaulo/* $NetBSD: pci_eb64plus.c,v 1.29 2021/07/04 22:42:36 thorpej Exp $ */
2214501Srpaulo
3214501Srpaulo/*-
4214501Srpaulo * Copyright (c) 1998 The NetBSD Foundation, Inc.
5214501Srpaulo * All rights reserved.
6252190Srpaulo *
7252190Srpaulo * This code is derived from software contributed to The NetBSD Foundation
8214501Srpaulo * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9214501Srpaulo * NASA Ames Research Center.
10214501Srpaulo *
11214501Srpaulo * Redistribution and use in source and binary forms, with or without
12214501Srpaulo * modification, are permitted provided that the following conditions
13252190Srpaulo * are met:
14252190Srpaulo * 1. Redistributions of source code must retain the above copyright
15252190Srpaulo *    notice, this list of conditions and the following disclaimer.
16214501Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
17214501Srpaulo *    notice, this list of conditions and the following disclaimer in the
18214501Srpaulo *    documentation and/or other materials provided with the distribution.
19214501Srpaulo *
20214501Srpaulo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21214501Srpaulo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22214501Srpaulo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23214501Srpaulo * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24214501Srpaulo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25214501Srpaulo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26214501Srpaulo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27214501Srpaulo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28214501Srpaulo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29252190Srpaulo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30252190Srpaulo * POSSIBILITY OF SUCH DAMAGE.
31252190Srpaulo */
32214501Srpaulo
33214501Srpaulo/*
34214501Srpaulo * Copyright (c) 1995, 1996 Carnegie-Mellon University.
35214501Srpaulo * All rights reserved.
36214501Srpaulo *
37214501Srpaulo * Author: Chris G. Demetriou
38214501Srpaulo *
39214501Srpaulo * Permission to use, copy, modify and distribute this software and
40214501Srpaulo * its documentation is hereby granted, provided that both the copyright
41214501Srpaulo * notice and this permission notice appear in all copies of the
42252190Srpaulo * software, derivative works or modified versions, and any portions
43214501Srpaulo * thereof, and that both notices appear in supporting documentation.
44214501Srpaulo *
45214501Srpaulo * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
46214501Srpaulo * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
47214501Srpaulo * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
48214501Srpaulo *
49214501Srpaulo * Carnegie Mellon requests users of this software to return to
50214501Srpaulo *
51214501Srpaulo *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
52214501Srpaulo *  School of Computer Science
53214501Srpaulo *  Carnegie Mellon University
54214501Srpaulo *  Pittsburgh PA 15213-3890
55214501Srpaulo *
56214501Srpaulo * any improvements or extensions that they make and grant Carnegie the
57214501Srpaulo * rights to redistribute these changes.
58214501Srpaulo */
59214501Srpaulo
60214501Srpaulo#include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
61214501Srpaulo
62252190Srpaulo__KERNEL_RCSID(0, "$NetBSD: pci_eb64plus.c,v 1.29 2021/07/04 22:42:36 thorpej Exp $");
63252190Srpaulo
64214501Srpaulo#include <sys/types.h>
65252190Srpaulo#include <sys/param.h>
66252190Srpaulo#include <sys/time.h>
67252190Srpaulo#include <sys/systm.h>
68252190Srpaulo#include <sys/errno.h>
69252190Srpaulo#include <sys/device.h>
70252190Srpaulo#include <sys/syslog.h>
71252190Srpaulo
72252190Srpaulo#include <machine/autoconf.h>
73252190Srpaulo#include <machine/rpb.h>
74252190Srpaulo
75252190Srpaulo#include <dev/pci/pcireg.h>
76252190Srpaulo#include <dev/pci/pcivar.h>
77252190Srpaulo
78252190Srpaulo#include <alpha/pci/apecsreg.h>
79252190Srpaulo#include <alpha/pci/apecsvar.h>
80252190Srpaulo
81252190Srpaulo#include "sio.h"
82252190Srpaulo#if NSIO
83252190Srpaulo#include <alpha/pci/siovar.h>
84252190Srpaulo#endif
85252190Srpaulo
86214501Srpaulo#define	EB64PLUS_MAX_IRQ	32
87214501Srpaulo#define	PCI_STRAY_MAX		5
88214501Srpaulo
89214501Srpaulostatic bus_space_tag_t eb64plus_intrgate_iot;
90214501Srpaulostatic bus_space_handle_t eb64plus_intrgate_ioh;
91214501Srpaulo
92214501Srpaulo/* See pci_eb64plus_intr.s */
93214501Srpauloextern void	eb64plus_intr_enable(pci_chipset_tag_t, int irq);
94214501Srpauloextern void	eb64plus_intr_disable(pci_chipset_tag_t, int irq);
95214501Srpaulo
96214501Srpaulostatic void
97214501Srpaulopci_eb64plus_pickintr(void *core, bus_space_tag_t iot, bus_space_tag_t memt,
98214501Srpaulo    pci_chipset_tag_t pc)
99214501Srpaulo{
100214501Srpaulo	int i;
101214501Srpaulo
102252190Srpaulo	pc->pc_intr_v = core;
103252190Srpaulo	pc->pc_intr_map = alpha_pci_generic_intr_map;
104252190Srpaulo	pc->pc_intr_string = alpha_pci_generic_intr_string;
105252190Srpaulo	pc->pc_intr_evcnt = alpha_pci_generic_intr_evcnt;
106252190Srpaulo	pc->pc_intr_establish = alpha_pci_generic_intr_establish;
107252190Srpaulo	pc->pc_intr_disestablish = alpha_pci_generic_intr_disestablish;
108252190Srpaulo
109214501Srpaulo	/* Not supported on the EB64+. */
110214501Srpaulo	pc->pc_pciide_compat_intr_establish = NULL;
111214501Srpaulo
112214501Srpaulo	eb64plus_intrgate_iot = iot;
113214501Srpaulo	if (bus_space_map(eb64plus_intrgate_iot, 0x804, 3, 0,
114252190Srpaulo	    &eb64plus_intrgate_ioh) != 0)
115252190Srpaulo		panic("pci_eb64plus_pickintr: couldn't map interrupt PLD");
116252190Srpaulo
117252190Srpaulo	pc->pc_intr_desc = "eb64+";
118252190Srpaulo	pc->pc_vecbase = 0x900;
119252190Srpaulo	pc->pc_nirq = EB64PLUS_MAX_IRQ;
120214501Srpaulo
121252190Srpaulo	pc->pc_intr_enable = eb64plus_intr_enable;
122252190Srpaulo	pc->pc_intr_disable = eb64plus_intr_disable;
123252190Srpaulo
124252190Srpaulo	for (i = 0; i < EB64PLUS_MAX_IRQ; i++) {
125252190Srpaulo		eb64plus_intr_disable(pc, i);
126214501Srpaulo	}
127214501Srpaulo
128214501Srpaulo	alpha_pci_intr_alloc(pc, PCI_STRAY_MAX);
129214501Srpaulo
130214501Srpaulo#if NSIO
131214501Srpaulo	sio_intr_setup(pc, iot);
132214501Srpaulo#endif
133214501Srpaulo}
134214501SrpauloALPHA_PCI_INTR_INIT(ST_EB64P, pci_eb64plus_pickintr)
135214501Srpaulo
136214501Srpaulo#if 0		/* THIS DOES NOT WORK!  see pci_eb64plus_intr.S. */
137214501Srpaulouint8_t eb64plus_intr_mask[3] = { 0xff, 0xff, 0xff };
138214501Srpaulo
139214501Srpaulovoid
140214501Srpauloeb64plus_intr_enable(pci_chipset_tag_t pc __unused, int irq)
141252190Srpaulo{
142252190Srpaulo	int byte = (irq / 8), bit = (irq % 8);
143252190Srpaulo
144252190Srpaulo#if 1
145214501Srpaulo	printf("eb64plus_intr_enable: enabling %d (%d:%d)\n", irq, byte, bit);
146214501Srpaulo#endif
147214501Srpaulo	eb64plus_intr_mask[byte] &= ~(1 << bit);
148214501Srpaulo
149214501Srpaulo	bus_space_write_1(eb64plus_intrgate_iot, eb64plus_intrgate_ioh, byte,
150214501Srpaulo	    eb64plus_intr_mask[byte]);
151214501Srpaulo}
152214501Srpaulo
153214501Srpaulovoid
154214501Srpauloeb64plus_intr_disable(pci_chipset_tag_t pc __unused, int irq)
155214501Srpaulo{
156214501Srpaulo	int byte = (irq / 8), bit = (irq % 8);
157214501Srpaulo
158214501Srpaulo#if 1
159214501Srpaulo	printf("eb64plus_intr_disable: disabling %d (%d:%d)\n", irq, byte, bit);
160214501Srpaulo#endif
161214501Srpaulo	eb64plus_intr_mask[byte] |= (1 << bit);
162214501Srpaulo
163214501Srpaulo	bus_space_write_1(eb64plus_intrgate_iot, eb64plus_intrgate_ioh, byte,
164214501Srpaulo	    eb64plus_intr_mask[byte]);
165214501Srpaulo}
166214501Srpaulo#endif
167214501Srpaulo