1/*
2** asm-m68k/amigahw.h -- This header defines some macros and pointers for
3**                    the various Amiga custom hardware registers.
4**                    The naming conventions used here conform to those
5**                    used in the Amiga Hardware Reference Manual, 3rd Edition
6**
7** Copyright 1992 by Greg Harp
8**
9** This file is subject to the terms and conditions of the GNU General Public
10** License.  See the file COPYING in the main directory of this archive
11** for more details.
12**
13** Created: 9/24/92 by Greg Harp
14*/
15
16#ifndef _M68K_AMIGAHW_H
17#define _M68K_AMIGAHW_H
18
19#include <linux/ioport.h>
20
21#include <asm/bootinfo-amiga.h>
22
23
24    /*
25     *  Chipsets
26     */
27
28extern unsigned long amiga_chipset;
29
30
31    /*
32     *  Miscellaneous
33     */
34
35extern unsigned long amiga_eclock;	/* 700 kHz E Peripheral Clock */
36extern unsigned long amiga_colorclock;	/* 3.5 MHz Color Clock */
37extern unsigned long amiga_chip_size;	/* Chip RAM Size (bytes) */
38extern unsigned char amiga_vblank;	/* VBLANK Frequency */
39
40
41#define AMIGAHW_DECLARE(name)	unsigned name : 1
42#define AMIGAHW_SET(name)	(amiga_hw_present.name = 1)
43#define AMIGAHW_PRESENT(name)	(amiga_hw_present.name)
44
45struct amiga_hw_present {
46    /* video hardware */
47    AMIGAHW_DECLARE(AMI_VIDEO);		/* Amiga Video */
48    AMIGAHW_DECLARE(AMI_BLITTER);	/* Amiga Blitter */
49    AMIGAHW_DECLARE(AMBER_FF);		/* Amber Flicker Fixer */
50    /* sound hardware */
51    AMIGAHW_DECLARE(AMI_AUDIO);		/* Amiga Audio */
52    /* disk storage interfaces */
53    AMIGAHW_DECLARE(AMI_FLOPPY);	/* Amiga Floppy */
54    AMIGAHW_DECLARE(A3000_SCSI);	/* SCSI (wd33c93, A3000 alike) */
55    AMIGAHW_DECLARE(A4000_SCSI);	/* SCSI (ncr53c710, A4000T alike) */
56    AMIGAHW_DECLARE(A1200_IDE);		/* IDE (A1200 alike) */
57    AMIGAHW_DECLARE(A4000_IDE);		/* IDE (A4000 alike) */
58    AMIGAHW_DECLARE(CD_ROM);		/* CD ROM drive */
59    /* other I/O hardware */
60    AMIGAHW_DECLARE(AMI_KEYBOARD);	/* Amiga Keyboard */
61    AMIGAHW_DECLARE(AMI_MOUSE);		/* Amiga Mouse */
62    AMIGAHW_DECLARE(AMI_SERIAL);	/* Amiga Serial */
63    AMIGAHW_DECLARE(AMI_PARALLEL);	/* Amiga Parallel */
64    /* real time clocks */
65    AMIGAHW_DECLARE(A2000_CLK);		/* Hardware Clock (A2000 alike) */
66    AMIGAHW_DECLARE(A3000_CLK);		/* Hardware Clock (A3000 alike) */
67    /* supporting hardware */
68    AMIGAHW_DECLARE(CHIP_RAM);		/* Chip RAM */
69    AMIGAHW_DECLARE(PAULA);		/* Paula (8364) */
70    AMIGAHW_DECLARE(DENISE);		/* Denise (8362) */
71    AMIGAHW_DECLARE(DENISE_HR);		/* Denise (8373) */
72    AMIGAHW_DECLARE(LISA);		/* Lisa (8375) */
73    AMIGAHW_DECLARE(AGNUS_PAL);		/* Normal/Fat PAL Agnus (8367/8371) */
74    AMIGAHW_DECLARE(AGNUS_NTSC);	/* Normal/Fat NTSC Agnus (8361/8370) */
75    AMIGAHW_DECLARE(AGNUS_HR_PAL);	/* Fat Hires PAL Agnus (8372) */
76    AMIGAHW_DECLARE(AGNUS_HR_NTSC);	/* Fat Hires NTSC Agnus (8372) */
77    AMIGAHW_DECLARE(ALICE_PAL);		/* PAL Alice (8374) */
78    AMIGAHW_DECLARE(ALICE_NTSC);	/* NTSC Alice (8374) */
79    AMIGAHW_DECLARE(MAGIC_REKICK);	/* A3000 Magic Hard Rekick */
80    AMIGAHW_DECLARE(PCMCIA);		/* PCMCIA Slot */
81    AMIGAHW_DECLARE(ZORRO);		/* Zorro AutoConfig */
82    AMIGAHW_DECLARE(ZORRO3);		/* Zorro III */
83};
84
85extern struct amiga_hw_present amiga_hw_present;
86
87struct CUSTOM {
88    unsigned short bltddat;
89    unsigned short dmaconr;
90    unsigned short vposr;
91    unsigned short vhposr;
92    unsigned short dskdatr;
93    unsigned short joy0dat;
94    unsigned short joy1dat;
95    unsigned short clxdat;
96    unsigned short adkconr;
97    unsigned short pot0dat;
98    unsigned short pot1dat;
99    unsigned short potgor;
100    unsigned short serdatr;
101    unsigned short dskbytr;
102    unsigned short intenar;
103    unsigned short intreqr;
104    unsigned char  *dskptr;
105    unsigned short dsklen;
106    unsigned short dskdat;
107    unsigned short refptr;
108    unsigned short vposw;
109    unsigned short vhposw;
110    unsigned short copcon;
111    unsigned short serdat;
112    unsigned short serper;
113    unsigned short potgo;
114    unsigned short joytest;
115    unsigned short strequ;
116    unsigned short strvbl;
117    unsigned short strhor;
118    unsigned short strlong;
119    unsigned short bltcon0;
120    unsigned short bltcon1;
121    unsigned short bltafwm;
122    unsigned short bltalwm;
123    unsigned char  *bltcpt;
124    unsigned char  *bltbpt;
125    unsigned char  *bltapt;
126    unsigned char  *bltdpt;
127    unsigned short bltsize;
128    unsigned char  pad2d;
129    unsigned char  bltcon0l;
130    unsigned short bltsizv;
131    unsigned short bltsizh;
132    unsigned short bltcmod;
133    unsigned short bltbmod;
134    unsigned short bltamod;
135    unsigned short bltdmod;
136    unsigned short spare2[4];
137    unsigned short bltcdat;
138    unsigned short bltbdat;
139    unsigned short bltadat;
140    unsigned short spare3[3];
141    unsigned short deniseid;
142    unsigned short dsksync;
143    unsigned short *cop1lc;
144    unsigned short *cop2lc;
145    unsigned short copjmp1;
146    unsigned short copjmp2;
147    unsigned short copins;
148    unsigned short diwstrt;
149    unsigned short diwstop;
150    unsigned short ddfstrt;
151    unsigned short ddfstop;
152    unsigned short dmacon;
153    unsigned short clxcon;
154    unsigned short intena;
155    unsigned short intreq;
156    unsigned short adkcon;
157    struct {
158	unsigned short	*audlc;
159	unsigned short audlen;
160	unsigned short audper;
161	unsigned short audvol;
162	unsigned short auddat;
163	unsigned short audspare[2];
164    } aud[4];
165    unsigned char  *bplpt[8];
166    unsigned short bplcon0;
167    unsigned short bplcon1;
168    unsigned short bplcon2;
169    unsigned short bplcon3;
170    unsigned short bpl1mod;
171    unsigned short bpl2mod;
172    unsigned short bplcon4;
173    unsigned short clxcon2;
174    unsigned short bpldat[8];
175    unsigned char  *sprpt[8];
176    struct {
177	unsigned short pos;
178	unsigned short ctl;
179	unsigned short dataa;
180	unsigned short datab;
181    } spr[8];
182    unsigned short color[32];
183    unsigned short htotal;
184    unsigned short hsstop;
185    unsigned short hbstrt;
186    unsigned short hbstop;
187    unsigned short vtotal;
188    unsigned short vsstop;
189    unsigned short vbstrt;
190    unsigned short vbstop;
191    unsigned short sprhstrt;
192    unsigned short sprhstop;
193    unsigned short bplhstrt;
194    unsigned short bplhstop;
195    unsigned short hhposw;
196    unsigned short hhposr;
197    unsigned short beamcon0;
198    unsigned short hsstrt;
199    unsigned short vsstrt;
200    unsigned short hcenter;
201    unsigned short diwhigh;
202    unsigned short spare4[11];
203    unsigned short fmode;
204};
205
206/*
207 * DMA register bits
208 */
209#define DMAF_SETCLR		(0x8000)
210#define DMAF_AUD0		(0x0001)
211#define DMAF_AUD1		(0x0002)
212#define DMAF_AUD2		(0x0004)
213#define DMAF_AUD3		(0x0008)
214#define DMAF_DISK		(0x0010)
215#define DMAF_SPRITE		(0x0020)
216#define DMAF_BLITTER		(0x0040)
217#define DMAF_COPPER		(0x0080)
218#define DMAF_RASTER		(0x0100)
219#define DMAF_MASTER		(0x0200)
220#define DMAF_BLITHOG		(0x0400)
221#define DMAF_BLTNZERO		(0x2000)
222#define DMAF_BLTDONE		(0x4000)
223#define DMAF_ALL		(0x01FF)
224
225struct CIA {
226    unsigned char pra;		char pad0[0xff];
227    unsigned char prb;		char pad1[0xff];
228    unsigned char ddra;		char pad2[0xff];
229    unsigned char ddrb;		char pad3[0xff];
230    unsigned char talo;		char pad4[0xff];
231    unsigned char tahi;		char pad5[0xff];
232    unsigned char tblo;		char pad6[0xff];
233    unsigned char tbhi;		char pad7[0xff];
234    unsigned char todlo;	char pad8[0xff];
235    unsigned char todmid;	char pad9[0xff];
236    unsigned char todhi;	char pada[0x1ff];
237    unsigned char sdr;		char padb[0xff];
238    unsigned char icr;		char padc[0xff];
239    unsigned char cra;		char padd[0xff];
240    unsigned char crb;		char pade[0xff];
241};
242
243#define zTwoBase (0x80000000)
244#define ZTWO_PADDR(x) (((unsigned long)(x))-zTwoBase)
245#define ZTWO_VADDR(x) ((void __iomem *)(((unsigned long)(x))+zTwoBase))
246
247#define CUSTOM_PHYSADDR     (0xdff000)
248#define amiga_custom ((*(volatile struct CUSTOM *)(zTwoBase+CUSTOM_PHYSADDR)))
249
250#define CIAA_PHYSADDR	  (0xbfe001)
251#define CIAB_PHYSADDR	  (0xbfd000)
252#define ciaa   ((*(volatile struct CIA *)(zTwoBase + CIAA_PHYSADDR)))
253#define ciab   ((*(volatile struct CIA *)(zTwoBase + CIAB_PHYSADDR)))
254
255#define CHIP_PHYSADDR	    (0x000000)
256
257void amiga_chip_init (void);
258void *amiga_chip_alloc(unsigned long size, const char *name);
259void *amiga_chip_alloc_res(unsigned long size, struct resource *res);
260void amiga_chip_free(void *ptr);
261unsigned long amiga_chip_avail( void ); /*MILAN*/
262extern volatile unsigned short amiga_audio_min_period;
263
264static inline void amifb_video_off(void)
265{
266	if (amiga_chipset == CS_ECS || amiga_chipset == CS_AGA) {
267		/* program Denise/Lisa for a higher maximum play rate */
268		amiga_custom.htotal = 113;        /* 31 kHz */
269		amiga_custom.vtotal = 223;        /* 70 Hz */
270		amiga_custom.beamcon0 = 0x4390;   /* HARDDIS, VAR{BEAM,VSY,HSY,CSY}EN */
271		/* suspend the monitor */
272		amiga_custom.hsstrt = amiga_custom.hsstop = 116;
273		amiga_custom.vsstrt = amiga_custom.vsstop = 226;
274		amiga_audio_min_period = 57;
275	}
276}
277
278struct tod3000 {
279  unsigned int  :28, second2:4;	/* lower digit */
280  unsigned int  :28, second1:4;	/* upper digit */
281  unsigned int  :28, minute2:4;	/* lower digit */
282  unsigned int  :28, minute1:4;	/* upper digit */
283  unsigned int  :28, hour2:4;	/* lower digit */
284  unsigned int  :28, hour1:4;	/* upper digit */
285  unsigned int  :28, weekday:4;
286  unsigned int  :28, day2:4;	/* lower digit */
287  unsigned int  :28, day1:4;	/* upper digit */
288  unsigned int  :28, month2:4;	/* lower digit */
289  unsigned int  :28, month1:4;	/* upper digit */
290  unsigned int  :28, year2:4;	/* lower digit */
291  unsigned int  :28, year1:4;	/* upper digit */
292  unsigned int  :28, cntrl1:4;	/* control-byte 1 */
293  unsigned int  :28, cntrl2:4;	/* control-byte 2 */
294  unsigned int  :28, cntrl3:4;	/* control-byte 3 */
295};
296#define TOD3000_CNTRL1_HOLD	0
297#define TOD3000_CNTRL1_FREE	9
298#define tod_3000 ((*(volatile struct tod3000 *)(zTwoBase+0xDC0000)))
299
300struct tod2000 {
301  unsigned int  :28, second2:4;	/* lower digit */
302  unsigned int  :28, second1:4;	/* upper digit */
303  unsigned int  :28, minute2:4;	/* lower digit */
304  unsigned int  :28, minute1:4;	/* upper digit */
305  unsigned int  :28, hour2:4;	/* lower digit */
306  unsigned int  :28, hour1:4;	/* upper digit */
307  unsigned int  :28, day2:4;	/* lower digit */
308  unsigned int  :28, day1:4;	/* upper digit */
309  unsigned int  :28, month2:4;	/* lower digit */
310  unsigned int  :28, month1:4;	/* upper digit */
311  unsigned int  :28, year2:4;	/* lower digit */
312  unsigned int  :28, year1:4;	/* upper digit */
313  unsigned int  :28, weekday:4;
314  unsigned int  :28, cntrl1:4;	/* control-byte 1 */
315  unsigned int  :28, cntrl2:4;	/* control-byte 2 */
316  unsigned int  :28, cntrl3:4;	/* control-byte 3 */
317};
318
319#define TOD2000_CNTRL1_HOLD	(1<<0)
320#define TOD2000_CNTRL1_BUSY	(1<<1)
321#define TOD2000_CNTRL3_24HMODE	(1<<2)
322#define TOD2000_HOUR1_PM	(1<<2)
323#define tod_2000 ((*(volatile struct tod2000 *)(zTwoBase+0xDC0000)))
324
325#endif /* _M68K_AMIGAHW_H */
326