xref: /netbsd-src/sys/arch/mac68k/include/psc.h (revision 0ed3032a3b0d835e8f67ff7182cdda1275e7addb)
1*0ed3032aSrin /*	$NetBSD: psc.h,v 1.8 2019/07/23 15:19:07 rin Exp $	*/
2c1ed70f0Sbriggs 
3e658b8b4Sbriggs /*-
42837bf7eSwiz  * Copyright (c) 1997 David Huang <khym@azeotrope.org>
5e658b8b4Sbriggs  * All rights reserved.
6e658b8b4Sbriggs  *
7e658b8b4Sbriggs  * Redistribution and use in source and binary forms, with or without
8e658b8b4Sbriggs  * modification, are permitted provided that the following conditions
9e658b8b4Sbriggs  * are met:
10e658b8b4Sbriggs  * 1. Redistributions of source code must retain the above copyright
11e658b8b4Sbriggs  *    notice, this list of conditions and the following disclaimer.
12e658b8b4Sbriggs  * 2. The name of the author may not be used to endorse or promote products
13e658b8b4Sbriggs  *    derived from this software without specific prior written permission
14e658b8b4Sbriggs  *
15e658b8b4Sbriggs  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16e658b8b4Sbriggs  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17e658b8b4Sbriggs  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18e658b8b4Sbriggs  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19e658b8b4Sbriggs  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20e658b8b4Sbriggs  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21e658b8b4Sbriggs  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22e658b8b4Sbriggs  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23e658b8b4Sbriggs  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24e658b8b4Sbriggs  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25e658b8b4Sbriggs  *
26e658b8b4Sbriggs  */
27e658b8b4Sbriggs 
28*0ed3032aSrin #include <sys/bus.h>	/* XXX for bus_addr_t */
29*0ed3032aSrin 
30e658b8b4Sbriggs /*
31e658b8b4Sbriggs  * Some register definitions for the PSC, present only on the
32e658b8b4Sbriggs  * Centris/Quadra 660av and the Quadra 840av.
33e658b8b4Sbriggs  */
34e658b8b4Sbriggs 
35e658b8b4Sbriggs extern volatile u_int8_t *PSCBase;
36e658b8b4Sbriggs 
37e658b8b4Sbriggs #define psc_reg1(r) (*((volatile u_int8_t *)(PSCBase+r)))
38e658b8b4Sbriggs #define	psc_reg2(r) (*((volatile u_int16_t *)(PSCBase+r)))
39e658b8b4Sbriggs #define	psc_reg4(r) (*((volatile u_int32_t *)(PSCBase+r)))
40e658b8b4Sbriggs 
417acd68b1Schs void	psc_init(void);
428bcac062Sscottr 
437acd68b1Schs int	add_psc_lev3_intr(void (*)(void *), void *);
447acd68b1Schs int	add_psc_lev4_intr(int, int (*)(void *), void *);
457acd68b1Schs int	add_psc_lev5_intr(int, void (*)(void *), void *);
467acd68b1Schs int	add_psc_lev6_intr(int, void (*)(void *), void *);
47e658b8b4Sbriggs 
487acd68b1Schs int	remove_psc_lev3_intr(void);
497acd68b1Schs int	remove_psc_lev4_intr(int);
507acd68b1Schs int	remove_psc_lev5_intr(int);
517acd68b1Schs int	remove_psc_lev6_intr(int);
52e658b8b4Sbriggs 
53*0ed3032aSrin int	start_psc_dma(int, int *, bus_addr_t, uint32_t, int);
54*0ed3032aSrin int	pause_psc_dma(int);
55*0ed3032aSrin int	wait_psc_dma(int, int, uint32_t *);
56*0ed3032aSrin int	stop_psc_dma(int, int, uint32_t *, int);
57*0ed3032aSrin 
58e658b8b4Sbriggs /*
59e658b8b4Sbriggs  * Reading an interrupt status register returns a mask of the
60e658b8b4Sbriggs  * currently interrupting devices (one bit per device). Reading an
61e658b8b4Sbriggs  * interrupt enable register returns a mask of the currently enabled
62e658b8b4Sbriggs  * devices. Writing an interrupt enable register with the MSB set
63e658b8b4Sbriggs  * enables the interrupts in the lower 4 bits, while writing with the
64e658b8b4Sbriggs  * MSB clear disables the corresponding interrupts.
65e658b8b4Sbriggs  * e.g. write 0x81 to enable device 0, write 0x86 to enable devices 1
66e658b8b4Sbriggs  * and 2, write 0x02 to disable device 1.
67e658b8b4Sbriggs  *
68e658b8b4Sbriggs  * Level 3 device 0 is MACE
69e658b8b4Sbriggs  * Level 4 device 0 is 3210 DSP?
70e658b8b4Sbriggs  * Level 4 device 1 is SCC channel A (modem port)
71e658b8b4Sbriggs  * Level 4 device 2 is SCC channel B (printer port)
72e658b8b4Sbriggs  * Level 4 device 3 is MACE DMA completion
73e658b8b4Sbriggs  * Level 5 device 0 is 3210 DSP?
74e658b8b4Sbriggs  * Level 5 device 1 is 3210 DSP?
75e658b8b4Sbriggs  * Level 6 device 0 is ?
76e658b8b4Sbriggs  * Level 6 device 1 is ?
77e658b8b4Sbriggs  * Level 6 device 2 is ?
78e658b8b4Sbriggs  */
79e658b8b4Sbriggs 
80e658b8b4Sbriggs /* PSC interrupt registers */
81f9de0720Sbriggs #define PSC_ISR_BASE	0x100	/* ISR is BASE + 0x10 * level */
82f9de0720Sbriggs #define PSC_IER_BASE	0x104	/* IER is BASE + 0x10 * level */
83f9de0720Sbriggs 
84e658b8b4Sbriggs #define	PSC_LEV3_ISR	0x130	/* level 3 interrupt status register */
85e658b8b4Sbriggs #define	PSC_LEV3_IER	0x134	/* level 3 interrupt enable register */
86e658b8b4Sbriggs #define	  PSCINTR_ENET      0	/*   Ethernet interrupt */
87e658b8b4Sbriggs 
88e658b8b4Sbriggs #define	PSC_LEV4_ISR	0x140	/* level 4 interrupt status register */
89e658b8b4Sbriggs #define	PSC_LEV4_IER	0x144	/* level 4 interrupt enable register */
90e658b8b4Sbriggs #define	  PSCINTR_SCCA      1	/*   SCC channel A interrupt */
91e658b8b4Sbriggs #define	  PSCINTR_SCCB      2	/*   SCC channel B interrupt */
92e658b8b4Sbriggs #define	  PSCINTR_ENET_DMA  3	/*   Ethernet DMA completion interrupt */
93e658b8b4Sbriggs 
94e658b8b4Sbriggs #define	PSC_LEV5_ISR	0x150	/* level 5 interrupt status register */
95e658b8b4Sbriggs #define	PSC_LEV5_IER	0x154	/* level 5 interrupt enable register */
96e658b8b4Sbriggs 
97e658b8b4Sbriggs #define	PSC_LEV6_ISR	0x160	/* level 6 interrupt status register */
98e658b8b4Sbriggs #define	PSC_LEV6_IER	0x164	/* level 6 interrupt enable register */
99e658b8b4Sbriggs 
100e658b8b4Sbriggs /* PSC DMA channel control registers */
101f9de0720Sbriggs #define	PSC_CTLBASE	0xc00
102f9de0720Sbriggs 
103f9de0720Sbriggs #define	PSC_SCSI_CTL	0xc00	/* SCSI control/status */
104e658b8b4Sbriggs #define	PSC_ENETRD_CTL	0xc10	/* MACE receive DMA channel control/status */
105e658b8b4Sbriggs #define	PSC_ENETWR_CTL	0xc20	/* MACE transmit DMA channel control/status */
106f9de0720Sbriggs #define	PSC_FDC_CTL	0xc30	/* Floppy disk */
107f9de0720Sbriggs #define	PSC_SCCA_CTL	0xc40	/* SCC channel A */
108f9de0720Sbriggs #define	PSC_SCCB_CTL	0xc50	/* SCC channel B */
109f9de0720Sbriggs #define	PSC_SCCATX_CTL	0xc60	/* SCC channel A transmit */
110e658b8b4Sbriggs 
111e658b8b4Sbriggs /* PSC DMA channels */
112f9de0720Sbriggs #define	PSC_ADDRBASE	0x1000
113f9de0720Sbriggs #define	PSC_LENBASE	0x1004
114f9de0720Sbriggs #define	PSC_CMDBASE	0x1008
115f9de0720Sbriggs 
116f9de0720Sbriggs #define	PSC_SCSI_ADDR	0x1000	/* SCSI DMA address register */
117f9de0720Sbriggs #define	PSC_SCSI_LEN	0x1004	/* SCSI DMA buffer count */
118f9de0720Sbriggs #define	PSC_SCSI_CMD	0x1008	/* SCSI DMA command register */
119e658b8b4Sbriggs #define	PSC_ENETRD_ADDR	0x1020	/* MACE receive DMA address register */
120e658b8b4Sbriggs #define	PSC_ENETRD_LEN	0x1024	/* MACE receive DMA buffer count */
121e658b8b4Sbriggs #define	PSC_ENETRD_CMD	0x1028	/* MACE receive DMA command register */
122e658b8b4Sbriggs #define	PSC_ENETWR_ADDR	0x1040	/* MACE transmit DMA address register */
123e658b8b4Sbriggs #define	PSC_ENETWR_LEN	0x1044	/* MACE transmit DMA length */
124e658b8b4Sbriggs #define	PSC_ENETWR_CMD	0x1048	/* MACE transmit DMA command register */
125e658b8b4Sbriggs 
126e658b8b4Sbriggs /*
127e658b8b4Sbriggs  * PSC DMA channels are controlled by two sets of registers (see p.29
128e658b8b4Sbriggs  * of the Quadra 840av and Centris 660av Developer Note). Add the
129e658b8b4Sbriggs  * following offsets to get the desired register set.
130e658b8b4Sbriggs  */
131e658b8b4Sbriggs #define	PSC_SET0	0x00
132e658b8b4Sbriggs #define	PSC_SET1	0x10
133*0ed3032aSrin 
134*0ed3032aSrin /*
135*0ed3032aSrin  * Pseudo channels for the dma control functions
136*0ed3032aSrin  */
137*0ed3032aSrin #define	PSC_DMA_CHANNEL_SCSI	0
138*0ed3032aSrin #define	PSC_DMA_CHANNEL_ENETRD	1
139*0ed3032aSrin #define	PSC_DMA_CHANNEL_ENETWR	2
140*0ed3032aSrin #define	PSC_DMA_CHANNEL_FDC	3
141*0ed3032aSrin #define	PSC_DMA_CHANNEL_SCCA	4
142*0ed3032aSrin #define	PSC_DMA_CHANNEL_SCCB	5
143*0ed3032aSrin #define	PSC_DMA_CHANNEL_SCCATX	6
144