xref: /openbmc/linux/arch/m68k/atari/config.c (revision 1da177e4)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  *  linux/arch/m68k/atari/config.c
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  *  Copyright (C) 1994 Bjoern Brauel
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  *  5/2/94 Roman Hodek:
71da177e4SLinus Torvalds  *    Added setting of time_adj to get a better clock.
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  *  5/14/94 Roman Hodek:
101da177e4SLinus Torvalds  *    gettod() for TT
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  *  5/15/94 Roman Hodek:
131da177e4SLinus Torvalds  *    hard_reset_now() for Atari (and others?)
141da177e4SLinus Torvalds  *
151da177e4SLinus Torvalds  *  94/12/30 Andreas Schwab:
161da177e4SLinus Torvalds  *    atari_sched_init fixed to get precise clock.
171da177e4SLinus Torvalds  *
181da177e4SLinus Torvalds  * This file is subject to the terms and conditions of the GNU General Public
191da177e4SLinus Torvalds  * License.  See the file COPYING in the main directory of this archive
201da177e4SLinus Torvalds  * for more details.
211da177e4SLinus Torvalds  */
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds /*
241da177e4SLinus Torvalds  * Miscellaneous atari stuff
251da177e4SLinus Torvalds  */
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds #include <linux/config.h>
281da177e4SLinus Torvalds #include <linux/types.h>
291da177e4SLinus Torvalds #include <linux/mm.h>
301da177e4SLinus Torvalds #include <linux/console.h>
311da177e4SLinus Torvalds #include <linux/init.h>
321da177e4SLinus Torvalds #include <linux/delay.h>
331da177e4SLinus Torvalds #include <linux/ioport.h>
341da177e4SLinus Torvalds #include <linux/vt_kern.h>
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds #include <asm/bootinfo.h>
371da177e4SLinus Torvalds #include <asm/setup.h>
381da177e4SLinus Torvalds #include <asm/atarihw.h>
391da177e4SLinus Torvalds #include <asm/atariints.h>
401da177e4SLinus Torvalds #include <asm/atari_stram.h>
411da177e4SLinus Torvalds #include <asm/system.h>
421da177e4SLinus Torvalds #include <asm/machdep.h>
431da177e4SLinus Torvalds #include <asm/hwtest.h>
441da177e4SLinus Torvalds #include <asm/io.h>
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds u_long atari_mch_cookie;
471da177e4SLinus Torvalds u_long atari_mch_type;
481da177e4SLinus Torvalds struct atari_hw_present atari_hw_present;
491da177e4SLinus Torvalds u_long atari_switches;
501da177e4SLinus Torvalds int atari_dont_touch_floppy_select;
511da177e4SLinus Torvalds int atari_rtc_year_offset;
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds /* local function prototypes */
541da177e4SLinus Torvalds static void atari_reset( void );
551da177e4SLinus Torvalds #ifdef CONFIG_ATARI_FLOPPY
561da177e4SLinus Torvalds extern void atari_floppy_setup(char *, int *);
571da177e4SLinus Torvalds #endif
581da177e4SLinus Torvalds static void atari_get_model(char *model);
591da177e4SLinus Torvalds static int atari_get_hardware_list(char *buffer);
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds /* atari specific irq functions */
621da177e4SLinus Torvalds extern void atari_init_IRQ (void);
631da177e4SLinus Torvalds extern int atari_request_irq (unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),
641da177e4SLinus Torvalds                               unsigned long flags, const char *devname, void *dev_id);
651da177e4SLinus Torvalds extern void atari_free_irq (unsigned int irq, void *dev_id);
661da177e4SLinus Torvalds extern void atari_enable_irq (unsigned int);
671da177e4SLinus Torvalds extern void atari_disable_irq (unsigned int);
681da177e4SLinus Torvalds extern int show_atari_interrupts (struct seq_file *, void *);
691da177e4SLinus Torvalds extern void atari_mksound( unsigned int count, unsigned int ticks );
701da177e4SLinus Torvalds #ifdef CONFIG_HEARTBEAT
711da177e4SLinus Torvalds static void atari_heartbeat( int on );
721da177e4SLinus Torvalds #endif
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds /* atari specific timer functions (in time.c) */
751da177e4SLinus Torvalds extern void atari_sched_init(irqreturn_t (*)(int, void *, struct pt_regs *));
761da177e4SLinus Torvalds extern unsigned long atari_gettimeoffset (void);
771da177e4SLinus Torvalds extern int atari_mste_hwclk (int, struct rtc_time *);
781da177e4SLinus Torvalds extern int atari_tt_hwclk (int, struct rtc_time *);
791da177e4SLinus Torvalds extern int atari_mste_set_clock_mmss (unsigned long);
801da177e4SLinus Torvalds extern int atari_tt_set_clock_mmss (unsigned long);
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds /* atari specific debug functions (in debug.c) */
831da177e4SLinus Torvalds extern void atari_debug_init(void);
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds /* I've moved hwreg_present() and hwreg_present_bywrite() out into
871da177e4SLinus Torvalds  * mm/hwtest.c, to avoid having multiple copies of the same routine
881da177e4SLinus Torvalds  * in the kernel [I wanted them in hp300 and they were already used
891da177e4SLinus Torvalds  * in the nubus code. NB: I don't have an Atari so this might (just
901da177e4SLinus Torvalds  * conceivably) break something.
911da177e4SLinus Torvalds  * I've preserved the #if 0 version of hwreg_present_bywrite() here
921da177e4SLinus Torvalds  * for posterity.
931da177e4SLinus Torvalds  *   -- Peter Maydell <pmaydell@chiark.greenend.org.uk>, 05/1998
941da177e4SLinus Torvalds  */
951da177e4SLinus Torvalds 
961da177e4SLinus Torvalds #if 0
971da177e4SLinus Torvalds static int __init
981da177e4SLinus Torvalds hwreg_present_bywrite(volatile void *regp, unsigned char val)
991da177e4SLinus Torvalds {
1001da177e4SLinus Torvalds     int		ret;
1011da177e4SLinus Torvalds     long	save_sp, save_vbr;
1021da177e4SLinus Torvalds     static long tmp_vectors[3] = { [2] = (long)&&after_test };
1031da177e4SLinus Torvalds 
1041da177e4SLinus Torvalds     __asm__ __volatile__
1051da177e4SLinus Torvalds 	(	"movec	%/vbr,%2\n\t"	/* save vbr value            */
1061da177e4SLinus Torvalds                 "movec	%4,%/vbr\n\t"	/* set up temporary vectors  */
1071da177e4SLinus Torvalds 		"movel	%/sp,%1\n\t"	/* save sp                   */
1081da177e4SLinus Torvalds 		"moveq	#0,%0\n\t"	/* assume not present        */
1091da177e4SLinus Torvalds 		"moveb	%5,%3@\n\t"	/* write the hardware reg    */
1101da177e4SLinus Torvalds 		"cmpb	%3@,%5\n\t"	/* compare it                */
1111da177e4SLinus Torvalds 		"seq	%0"		/* comes here only if reg    */
1121da177e4SLinus Torvalds                                         /* is present                */
1131da177e4SLinus Torvalds 		: "=d&" (ret), "=r&" (save_sp), "=r&" (save_vbr)
1141da177e4SLinus Torvalds 		: "a" (regp), "r" (tmp_vectors), "d" (val)
1151da177e4SLinus Torvalds                 );
1161da177e4SLinus Torvalds   after_test:
1171da177e4SLinus Torvalds     __asm__ __volatile__
1181da177e4SLinus Torvalds       (	"movel	%0,%/sp\n\t"		/* restore sp                */
1191da177e4SLinus Torvalds         "movec	%1,%/vbr"			/* restore vbr               */
1201da177e4SLinus Torvalds         : : "r" (save_sp), "r" (save_vbr) : "sp"
1211da177e4SLinus Torvalds 	);
1221da177e4SLinus Torvalds 
1231da177e4SLinus Torvalds     return( ret );
1241da177e4SLinus Torvalds }
1251da177e4SLinus Torvalds #endif
1261da177e4SLinus Torvalds 
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds /* ++roman: This is a more elaborate test for an SCC chip, since the plain
1291da177e4SLinus Torvalds  * Medusa board generates DTACK at the SCC's standard addresses, but a SCC
1301da177e4SLinus Torvalds  * board in the Medusa is possible. Also, the addresses where the ST_ESCC
1311da177e4SLinus Torvalds  * resides generate DTACK without the chip, too.
1321da177e4SLinus Torvalds  * The method is to write values into the interrupt vector register, that
1331da177e4SLinus Torvalds  * should be readable without trouble (from channel A!).
1341da177e4SLinus Torvalds  */
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds static int __init scc_test( volatile char *ctla )
1371da177e4SLinus Torvalds {
1381da177e4SLinus Torvalds 	if (!hwreg_present( ctla ))
1391da177e4SLinus Torvalds 		return( 0 );
1401da177e4SLinus Torvalds 	MFPDELAY();
1411da177e4SLinus Torvalds 
1421da177e4SLinus Torvalds 	*ctla = 2; MFPDELAY();
1431da177e4SLinus Torvalds 	*ctla = 0x40; MFPDELAY();
1441da177e4SLinus Torvalds 
1451da177e4SLinus Torvalds 	*ctla = 2; MFPDELAY();
1461da177e4SLinus Torvalds 	if (*ctla != 0x40) return( 0 );
1471da177e4SLinus Torvalds 	MFPDELAY();
1481da177e4SLinus Torvalds 
1491da177e4SLinus Torvalds 	*ctla = 2; MFPDELAY();
1501da177e4SLinus Torvalds 	*ctla = 0x60; MFPDELAY();
1511da177e4SLinus Torvalds 
1521da177e4SLinus Torvalds 	*ctla = 2; MFPDELAY();
1531da177e4SLinus Torvalds 	if (*ctla != 0x60) return( 0 );
1541da177e4SLinus Torvalds 
1551da177e4SLinus Torvalds 	return( 1 );
1561da177e4SLinus Torvalds }
1571da177e4SLinus Torvalds 
1581da177e4SLinus Torvalds 
1591da177e4SLinus Torvalds     /*
1601da177e4SLinus Torvalds      *  Parse an Atari-specific record in the bootinfo
1611da177e4SLinus Torvalds      */
1621da177e4SLinus Torvalds 
1631da177e4SLinus Torvalds int __init atari_parse_bootinfo(const struct bi_record *record)
1641da177e4SLinus Torvalds {
1651da177e4SLinus Torvalds     int unknown = 0;
1661da177e4SLinus Torvalds     const u_long *data = record->data;
1671da177e4SLinus Torvalds 
1681da177e4SLinus Torvalds     switch (record->tag) {
1691da177e4SLinus Torvalds 	case BI_ATARI_MCH_COOKIE:
1701da177e4SLinus Torvalds 	    atari_mch_cookie = *data;
1711da177e4SLinus Torvalds 	    break;
1721da177e4SLinus Torvalds 	case BI_ATARI_MCH_TYPE:
1731da177e4SLinus Torvalds 	    atari_mch_type = *data;
1741da177e4SLinus Torvalds 	    break;
1751da177e4SLinus Torvalds 	default:
1761da177e4SLinus Torvalds 	    unknown = 1;
1771da177e4SLinus Torvalds     }
1781da177e4SLinus Torvalds     return(unknown);
1791da177e4SLinus Torvalds }
1801da177e4SLinus Torvalds 
1811da177e4SLinus Torvalds 
1821da177e4SLinus Torvalds /* Parse the Atari-specific switches= option. */
1831da177e4SLinus Torvalds void __init atari_switches_setup( const char *str, unsigned len )
1841da177e4SLinus Torvalds {
1851da177e4SLinus Torvalds     char switches[len+1];
1861da177e4SLinus Torvalds     char *p;
1871da177e4SLinus Torvalds     int ovsc_shift;
1881da177e4SLinus Torvalds     char *args = switches;
1891da177e4SLinus Torvalds 
1901da177e4SLinus Torvalds     /* copy string to local array, strsep works destructively... */
1911da177e4SLinus Torvalds     strlcpy( switches, str, sizeof(switches) );
1921da177e4SLinus Torvalds     atari_switches = 0;
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds     /* parse the options */
1951da177e4SLinus Torvalds     while ((p = strsep(&args, ",")) != NULL) {
1961da177e4SLinus Torvalds 	if (!*p) continue;
1971da177e4SLinus Torvalds 	ovsc_shift = 0;
1981da177e4SLinus Torvalds 	if (strncmp( p, "ov_", 3 ) == 0) {
1991da177e4SLinus Torvalds 	    p += 3;
2001da177e4SLinus Torvalds 	    ovsc_shift = ATARI_SWITCH_OVSC_SHIFT;
2011da177e4SLinus Torvalds 	}
2021da177e4SLinus Torvalds 
2031da177e4SLinus Torvalds 	if (strcmp( p, "ikbd" ) == 0) {
2041da177e4SLinus Torvalds 	    /* RTS line of IKBD ACIA */
2051da177e4SLinus Torvalds 	    atari_switches |= ATARI_SWITCH_IKBD << ovsc_shift;
2061da177e4SLinus Torvalds 	}
2071da177e4SLinus Torvalds 	else if (strcmp( p, "midi" ) == 0) {
2081da177e4SLinus Torvalds 	    /* RTS line of MIDI ACIA */
2091da177e4SLinus Torvalds 	    atari_switches |= ATARI_SWITCH_MIDI << ovsc_shift;
2101da177e4SLinus Torvalds 	}
2111da177e4SLinus Torvalds 	else if (strcmp( p, "snd6" ) == 0) {
2121da177e4SLinus Torvalds 	    atari_switches |= ATARI_SWITCH_SND6 << ovsc_shift;
2131da177e4SLinus Torvalds 	}
2141da177e4SLinus Torvalds 	else if (strcmp( p, "snd7" ) == 0) {
2151da177e4SLinus Torvalds 	    atari_switches |= ATARI_SWITCH_SND7 << ovsc_shift;
2161da177e4SLinus Torvalds 	}
2171da177e4SLinus Torvalds     }
2181da177e4SLinus Torvalds }
2191da177e4SLinus Torvalds 
2201da177e4SLinus Torvalds 
2211da177e4SLinus Torvalds     /*
2221da177e4SLinus Torvalds      *  Setup the Atari configuration info
2231da177e4SLinus Torvalds      */
2241da177e4SLinus Torvalds 
2251da177e4SLinus Torvalds void __init config_atari(void)
2261da177e4SLinus Torvalds {
2271da177e4SLinus Torvalds     unsigned short tos_version;
2281da177e4SLinus Torvalds 
2291da177e4SLinus Torvalds     memset(&atari_hw_present, 0, sizeof(atari_hw_present));
2301da177e4SLinus Torvalds 
2311da177e4SLinus Torvalds     atari_debug_init();
2321da177e4SLinus Torvalds 
2331da177e4SLinus Torvalds     ioport_resource.end  = 0xFFFFFFFF;  /* Change size of I/O space from 64KB
2341da177e4SLinus Torvalds                                            to 4GB. */
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds     mach_sched_init      = atari_sched_init;
2371da177e4SLinus Torvalds     mach_init_IRQ        = atari_init_IRQ;
2381da177e4SLinus Torvalds     mach_request_irq     = atari_request_irq;
2391da177e4SLinus Torvalds     mach_free_irq        = atari_free_irq;
2401da177e4SLinus Torvalds     enable_irq           = atari_enable_irq;
2411da177e4SLinus Torvalds     disable_irq          = atari_disable_irq;
2421da177e4SLinus Torvalds     mach_get_model	 = atari_get_model;
2431da177e4SLinus Torvalds     mach_get_hardware_list = atari_get_hardware_list;
2441da177e4SLinus Torvalds     mach_get_irq_list	 = show_atari_interrupts;
2451da177e4SLinus Torvalds     mach_gettimeoffset   = atari_gettimeoffset;
2461da177e4SLinus Torvalds     mach_reset           = atari_reset;
2471da177e4SLinus Torvalds #ifdef CONFIG_ATARI_FLOPPY
2481da177e4SLinus Torvalds     mach_floppy_setup	 = atari_floppy_setup;
2491da177e4SLinus Torvalds #endif
2501da177e4SLinus Torvalds #ifdef CONFIG_DUMMY_CONSOLE
2511da177e4SLinus Torvalds     conswitchp	         = &dummy_con;
2521da177e4SLinus Torvalds #endif
2531da177e4SLinus Torvalds     mach_max_dma_address = 0xffffff;
2541da177e4SLinus Torvalds #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
2551da177e4SLinus Torvalds     mach_beep          = atari_mksound;
2561da177e4SLinus Torvalds #endif
2571da177e4SLinus Torvalds #ifdef CONFIG_HEARTBEAT
2581da177e4SLinus Torvalds     mach_heartbeat = atari_heartbeat;
2591da177e4SLinus Torvalds #endif
2601da177e4SLinus Torvalds 
2611da177e4SLinus Torvalds     /* Set switches as requested by the user */
2621da177e4SLinus Torvalds     if (atari_switches & ATARI_SWITCH_IKBD)
2631da177e4SLinus Torvalds 	acia.key_ctrl = ACIA_DIV64 | ACIA_D8N1S | ACIA_RHTID;
2641da177e4SLinus Torvalds     if (atari_switches & ATARI_SWITCH_MIDI)
2651da177e4SLinus Torvalds 	acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | ACIA_RHTID;
2661da177e4SLinus Torvalds     if (atari_switches & (ATARI_SWITCH_SND6|ATARI_SWITCH_SND7)) {
2671da177e4SLinus Torvalds 	sound_ym.rd_data_reg_sel = 14;
2681da177e4SLinus Torvalds 	sound_ym.wd_data = sound_ym.rd_data_reg_sel |
2691da177e4SLinus Torvalds 			   ((atari_switches&ATARI_SWITCH_SND6) ? 0x40 : 0) |
2701da177e4SLinus Torvalds 			   ((atari_switches&ATARI_SWITCH_SND7) ? 0x80 : 0);
2711da177e4SLinus Torvalds     }
2721da177e4SLinus Torvalds 
2731da177e4SLinus Torvalds     /* ++bjoern:
2741da177e4SLinus Torvalds      * Determine hardware present
2751da177e4SLinus Torvalds      */
2761da177e4SLinus Torvalds 
2771da177e4SLinus Torvalds     printk( "Atari hardware found: " );
2781da177e4SLinus Torvalds     if (MACH_IS_MEDUSA || MACH_IS_HADES) {
2791da177e4SLinus Torvalds         /* There's no Atari video hardware on the Medusa, but all the
2801da177e4SLinus Torvalds          * addresses below generate a DTACK so no bus error occurs! */
2811da177e4SLinus Torvalds     }
2821da177e4SLinus Torvalds     else if (hwreg_present( f030_xreg )) {
2831da177e4SLinus Torvalds 	ATARIHW_SET(VIDEL_SHIFTER);
2841da177e4SLinus Torvalds         printk( "VIDEL " );
2851da177e4SLinus Torvalds         /* This is a temporary hack: If there is Falcon video
2861da177e4SLinus Torvalds          * hardware, we assume that the ST-DMA serves SCSI instead of
2871da177e4SLinus Torvalds          * ACSI. In the future, there should be a better method for
2881da177e4SLinus Torvalds          * this...
2891da177e4SLinus Torvalds          */
2901da177e4SLinus Torvalds 	ATARIHW_SET(ST_SCSI);
2911da177e4SLinus Torvalds         printk( "STDMA-SCSI " );
2921da177e4SLinus Torvalds     }
2931da177e4SLinus Torvalds     else if (hwreg_present( tt_palette )) {
2941da177e4SLinus Torvalds 	ATARIHW_SET(TT_SHIFTER);
2951da177e4SLinus Torvalds         printk( "TT_SHIFTER " );
2961da177e4SLinus Torvalds     }
2971da177e4SLinus Torvalds     else if (hwreg_present( &shifter.bas_hi )) {
2981da177e4SLinus Torvalds         if (hwreg_present( &shifter.bas_lo ) &&
2991da177e4SLinus Torvalds 	    (shifter.bas_lo = 0x0aau, shifter.bas_lo == 0x0aau)) {
3001da177e4SLinus Torvalds 	    ATARIHW_SET(EXTD_SHIFTER);
3011da177e4SLinus Torvalds             printk( "EXTD_SHIFTER " );
3021da177e4SLinus Torvalds         }
3031da177e4SLinus Torvalds         else {
3041da177e4SLinus Torvalds 	    ATARIHW_SET(STND_SHIFTER);
3051da177e4SLinus Torvalds             printk( "STND_SHIFTER " );
3061da177e4SLinus Torvalds         }
3071da177e4SLinus Torvalds     }
3081da177e4SLinus Torvalds     if (hwreg_present( &mfp.par_dt_reg )) {
3091da177e4SLinus Torvalds 	ATARIHW_SET(ST_MFP);
3101da177e4SLinus Torvalds         printk( "ST_MFP " );
3111da177e4SLinus Torvalds     }
3121da177e4SLinus Torvalds     if (hwreg_present( &tt_mfp.par_dt_reg )) {
3131da177e4SLinus Torvalds 	ATARIHW_SET(TT_MFP);
3141da177e4SLinus Torvalds         printk( "TT_MFP " );
3151da177e4SLinus Torvalds     }
3161da177e4SLinus Torvalds     if (hwreg_present( &tt_scsi_dma.dma_addr_hi )) {
3171da177e4SLinus Torvalds 	ATARIHW_SET(SCSI_DMA);
3181da177e4SLinus Torvalds         printk( "TT_SCSI_DMA " );
3191da177e4SLinus Torvalds     }
3201da177e4SLinus Torvalds     if (!MACH_IS_HADES && hwreg_present( &st_dma.dma_hi )) {
3211da177e4SLinus Torvalds 	ATARIHW_SET(STND_DMA);
3221da177e4SLinus Torvalds         printk( "STND_DMA " );
3231da177e4SLinus Torvalds     }
3241da177e4SLinus Torvalds     if (MACH_IS_MEDUSA || /* The ST-DMA address registers aren't readable
3251da177e4SLinus Torvalds 			   * on all Medusas, so the test below may fail */
3261da177e4SLinus Torvalds         (hwreg_present( &st_dma.dma_vhi ) &&
3271da177e4SLinus Torvalds          (st_dma.dma_vhi = 0x55) && (st_dma.dma_hi = 0xaa) &&
3281da177e4SLinus Torvalds          st_dma.dma_vhi == 0x55 && st_dma.dma_hi == 0xaa &&
3291da177e4SLinus Torvalds          (st_dma.dma_vhi = 0xaa) && (st_dma.dma_hi = 0x55) &&
3301da177e4SLinus Torvalds          st_dma.dma_vhi == 0xaa && st_dma.dma_hi == 0x55)) {
3311da177e4SLinus Torvalds 	ATARIHW_SET(EXTD_DMA);
3321da177e4SLinus Torvalds         printk( "EXTD_DMA " );
3331da177e4SLinus Torvalds     }
3341da177e4SLinus Torvalds     if (hwreg_present( &tt_scsi.scsi_data )) {
3351da177e4SLinus Torvalds 	ATARIHW_SET(TT_SCSI);
3361da177e4SLinus Torvalds         printk( "TT_SCSI " );
3371da177e4SLinus Torvalds     }
3381da177e4SLinus Torvalds     if (hwreg_present( &sound_ym.rd_data_reg_sel )) {
3391da177e4SLinus Torvalds 	ATARIHW_SET(YM_2149);
3401da177e4SLinus Torvalds         printk( "YM2149 " );
3411da177e4SLinus Torvalds     }
3421da177e4SLinus Torvalds     if (!MACH_IS_MEDUSA && !MACH_IS_HADES &&
3431da177e4SLinus Torvalds 	hwreg_present( &tt_dmasnd.ctrl )) {
3441da177e4SLinus Torvalds 	ATARIHW_SET(PCM_8BIT);
3451da177e4SLinus Torvalds         printk( "PCM " );
3461da177e4SLinus Torvalds     }
3471da177e4SLinus Torvalds     if (!MACH_IS_HADES && hwreg_present( &falcon_codec.unused5 )) {
3481da177e4SLinus Torvalds 	ATARIHW_SET(CODEC);
3491da177e4SLinus Torvalds         printk( "CODEC " );
3501da177e4SLinus Torvalds     }
3511da177e4SLinus Torvalds     if (hwreg_present( &dsp56k_host_interface.icr )) {
3521da177e4SLinus Torvalds 	ATARIHW_SET(DSP56K);
3531da177e4SLinus Torvalds         printk( "DSP56K " );
3541da177e4SLinus Torvalds     }
3551da177e4SLinus Torvalds     if (hwreg_present( &tt_scc_dma.dma_ctrl ) &&
3561da177e4SLinus Torvalds #if 0
3571da177e4SLinus Torvalds 	/* This test sucks! Who knows some better? */
3581da177e4SLinus Torvalds 	(tt_scc_dma.dma_ctrl = 0x01, (tt_scc_dma.dma_ctrl & 1) == 1) &&
3591da177e4SLinus Torvalds 	(tt_scc_dma.dma_ctrl = 0x00, (tt_scc_dma.dma_ctrl & 1) == 0)
3601da177e4SLinus Torvalds #else
3611da177e4SLinus Torvalds 	!MACH_IS_MEDUSA && !MACH_IS_HADES
3621da177e4SLinus Torvalds #endif
3631da177e4SLinus Torvalds 	) {
3641da177e4SLinus Torvalds 	ATARIHW_SET(SCC_DMA);
3651da177e4SLinus Torvalds         printk( "SCC_DMA " );
3661da177e4SLinus Torvalds     }
3671da177e4SLinus Torvalds     if (scc_test( &scc.cha_a_ctrl )) {
3681da177e4SLinus Torvalds 	ATARIHW_SET(SCC);
3691da177e4SLinus Torvalds         printk( "SCC " );
3701da177e4SLinus Torvalds     }
3711da177e4SLinus Torvalds     if (scc_test( &st_escc.cha_b_ctrl )) {
3721da177e4SLinus Torvalds 	ATARIHW_SET( ST_ESCC );
3731da177e4SLinus Torvalds 	printk( "ST_ESCC " );
3741da177e4SLinus Torvalds     }
3751da177e4SLinus Torvalds     if (MACH_IS_HADES)
3761da177e4SLinus Torvalds     {
3771da177e4SLinus Torvalds         ATARIHW_SET( VME );
3781da177e4SLinus Torvalds         printk( "VME " );
3791da177e4SLinus Torvalds     }
3801da177e4SLinus Torvalds     else if (hwreg_present( &tt_scu.sys_mask )) {
3811da177e4SLinus Torvalds 	ATARIHW_SET(SCU);
3821da177e4SLinus Torvalds 	/* Assume a VME bus if there's a SCU */
3831da177e4SLinus Torvalds 	ATARIHW_SET( VME );
3841da177e4SLinus Torvalds         printk( "VME SCU " );
3851da177e4SLinus Torvalds     }
3861da177e4SLinus Torvalds     if (hwreg_present( (void *)(0xffff9210) )) {
3871da177e4SLinus Torvalds 	ATARIHW_SET(ANALOG_JOY);
3881da177e4SLinus Torvalds         printk( "ANALOG_JOY " );
3891da177e4SLinus Torvalds     }
3901da177e4SLinus Torvalds     if (!MACH_IS_HADES && hwreg_present( blitter.halftone )) {
3911da177e4SLinus Torvalds 	ATARIHW_SET(BLITTER);
3921da177e4SLinus Torvalds         printk( "BLITTER " );
3931da177e4SLinus Torvalds     }
3941da177e4SLinus Torvalds     if (hwreg_present((void *)0xfff00039)) {
3951da177e4SLinus Torvalds 	ATARIHW_SET(IDE);
3961da177e4SLinus Torvalds         printk( "IDE " );
3971da177e4SLinus Torvalds     }
3981da177e4SLinus Torvalds #if 1 /* This maybe wrong */
3991da177e4SLinus Torvalds     if (!MACH_IS_MEDUSA && !MACH_IS_HADES &&
4001da177e4SLinus Torvalds 	hwreg_present( &tt_microwire.data ) &&
4011da177e4SLinus Torvalds 	hwreg_present( &tt_microwire.mask ) &&
4021da177e4SLinus Torvalds 	(tt_microwire.mask = 0x7ff,
4031da177e4SLinus Torvalds 	 udelay(1),
4041da177e4SLinus Torvalds 	 tt_microwire.data = MW_LM1992_PSG_HIGH | MW_LM1992_ADDR,
4051da177e4SLinus Torvalds 	 udelay(1),
4061da177e4SLinus Torvalds 	 tt_microwire.data != 0)) {
4071da177e4SLinus Torvalds 	ATARIHW_SET(MICROWIRE);
4081da177e4SLinus Torvalds 	while (tt_microwire.mask != 0x7ff) ;
4091da177e4SLinus Torvalds         printk( "MICROWIRE " );
4101da177e4SLinus Torvalds     }
4111da177e4SLinus Torvalds #endif
4121da177e4SLinus Torvalds     if (hwreg_present( &tt_rtc.regsel )) {
4131da177e4SLinus Torvalds 	ATARIHW_SET(TT_CLK);
4141da177e4SLinus Torvalds         printk( "TT_CLK " );
4151da177e4SLinus Torvalds         mach_hwclk = atari_tt_hwclk;
4161da177e4SLinus Torvalds         mach_set_clock_mmss = atari_tt_set_clock_mmss;
4171da177e4SLinus Torvalds     }
4181da177e4SLinus Torvalds     if (!MACH_IS_HADES && hwreg_present( &mste_rtc.sec_ones)) {
4191da177e4SLinus Torvalds 	ATARIHW_SET(MSTE_CLK);
4201da177e4SLinus Torvalds         printk( "MSTE_CLK ");
4211da177e4SLinus Torvalds         mach_hwclk = atari_mste_hwclk;
4221da177e4SLinus Torvalds         mach_set_clock_mmss = atari_mste_set_clock_mmss;
4231da177e4SLinus Torvalds     }
4241da177e4SLinus Torvalds     if (!MACH_IS_MEDUSA && !MACH_IS_HADES &&
4251da177e4SLinus Torvalds 	hwreg_present( &dma_wd.fdc_speed ) &&
4261da177e4SLinus Torvalds 	hwreg_write( &dma_wd.fdc_speed, 0 )) {
4271da177e4SLinus Torvalds 	    ATARIHW_SET(FDCSPEED);
4281da177e4SLinus Torvalds 	    printk( "FDC_SPEED ");
4291da177e4SLinus Torvalds     }
4301da177e4SLinus Torvalds     if (!MACH_IS_HADES && !ATARIHW_PRESENT(ST_SCSI)) {
4311da177e4SLinus Torvalds 	ATARIHW_SET(ACSI);
4321da177e4SLinus Torvalds         printk( "ACSI " );
4331da177e4SLinus Torvalds     }
4341da177e4SLinus Torvalds     printk("\n");
4351da177e4SLinus Torvalds 
4361da177e4SLinus Torvalds     if (CPU_IS_040_OR_060)
4371da177e4SLinus Torvalds         /* Now it seems to be safe to turn of the tt0 transparent
4381da177e4SLinus Torvalds          * translation (the one that must not be turned off in
4391da177e4SLinus Torvalds          * head.S...)
4401da177e4SLinus Torvalds          */
4411da177e4SLinus Torvalds         __asm__ volatile ("moveq #0,%/d0\n\t"
4421da177e4SLinus Torvalds                           ".chip 68040\n\t"
4431da177e4SLinus Torvalds 			  "movec %%d0,%%itt0\n\t"
4441da177e4SLinus Torvalds 			  "movec %%d0,%%dtt0\n\t"
4451da177e4SLinus Torvalds 			  ".chip 68k"
4461da177e4SLinus Torvalds 						  : /* no outputs */
4471da177e4SLinus Torvalds 						  : /* no inputs */
4481da177e4SLinus Torvalds 						  : "d0");
4491da177e4SLinus Torvalds 
4501da177e4SLinus Torvalds     /* allocator for memory that must reside in st-ram */
4511da177e4SLinus Torvalds     atari_stram_init ();
4521da177e4SLinus Torvalds 
4531da177e4SLinus Torvalds     /* Set up a mapping for the VMEbus address region:
4541da177e4SLinus Torvalds      *
4551da177e4SLinus Torvalds      * VME is either at phys. 0xfexxxxxx (TT) or 0xa00000..0xdfffff
4561da177e4SLinus Torvalds      * (MegaSTE) In both cases, the whole 16 MB chunk is mapped at
4571da177e4SLinus Torvalds      * 0xfe000000 virt., because this can be done with a single
4581da177e4SLinus Torvalds      * transparent translation. On the 68040, lots of often unused
4591da177e4SLinus Torvalds      * page tables would be needed otherwise. On a MegaSTE or similar,
4601da177e4SLinus Torvalds      * the highest byte is stripped off by hardware due to the 24 bit
4611da177e4SLinus Torvalds      * design of the bus.
4621da177e4SLinus Torvalds      */
4631da177e4SLinus Torvalds 
4641da177e4SLinus Torvalds     if (CPU_IS_020_OR_030) {
4651da177e4SLinus Torvalds         unsigned long	tt1_val;
4661da177e4SLinus Torvalds         tt1_val = 0xfe008543;	/* Translate 0xfexxxxxx, enable, cache
4671da177e4SLinus Torvalds                                  * inhibit, read and write, FDC mask = 3,
4681da177e4SLinus Torvalds                                  * FDC val = 4 -> Supervisor only */
4691da177e4SLinus Torvalds         __asm__ __volatile__ ( ".chip 68030\n\t"
4701da177e4SLinus Torvalds 				"pmove	%0@,%/tt1\n\t"
4711da177e4SLinus Torvalds 				".chip 68k"
4721da177e4SLinus Torvalds 				: : "a" (&tt1_val) );
4731da177e4SLinus Torvalds     }
4741da177e4SLinus Torvalds     else {
4751da177e4SLinus Torvalds         __asm__ __volatile__
4761da177e4SLinus Torvalds             ( "movel %0,%/d0\n\t"
4771da177e4SLinus Torvalds 	      ".chip 68040\n\t"
4781da177e4SLinus Torvalds 	      "movec %%d0,%%itt1\n\t"
4791da177e4SLinus Torvalds 	      "movec %%d0,%%dtt1\n\t"
4801da177e4SLinus Torvalds 	      ".chip 68k"
4811da177e4SLinus Torvalds               :
4821da177e4SLinus Torvalds               : "g" (0xfe00a040)	/* Translate 0xfexxxxxx, enable,
4831da177e4SLinus Torvalds                                          * supervisor only, non-cacheable/
4841da177e4SLinus Torvalds                                          * serialized, writable */
4851da177e4SLinus Torvalds               : "d0" );
4861da177e4SLinus Torvalds 
4871da177e4SLinus Torvalds     }
4881da177e4SLinus Torvalds 
4891da177e4SLinus Torvalds     /* Fetch tos version at Physical 2 */
4901da177e4SLinus Torvalds     /* We my not be able to access this address if the kernel is
4911da177e4SLinus Torvalds        loaded to st ram, since the first page is unmapped.  On the
4921da177e4SLinus Torvalds        Medusa this is always the case and there is nothing we can do
4931da177e4SLinus Torvalds        about this, so we just assume the smaller offset.  For the TT
4941da177e4SLinus Torvalds        we use the fact that in head.S we have set up a mapping
4951da177e4SLinus Torvalds        0xFFxxxxxx -> 0x00xxxxxx, so that the first 16MB is accessible
4961da177e4SLinus Torvalds        in the last 16MB of the address space. */
4971da177e4SLinus Torvalds     tos_version = (MACH_IS_MEDUSA || MACH_IS_HADES) ?
4981da177e4SLinus Torvalds 		  0xfff : *(unsigned short *)0xff000002;
4991da177e4SLinus Torvalds     atari_rtc_year_offset = (tos_version < 0x306) ? 70 : 68;
5001da177e4SLinus Torvalds }
5011da177e4SLinus Torvalds 
5021da177e4SLinus Torvalds #ifdef CONFIG_HEARTBEAT
5031da177e4SLinus Torvalds static void atari_heartbeat( int on )
5041da177e4SLinus Torvalds {
5051da177e4SLinus Torvalds     unsigned char tmp;
5061da177e4SLinus Torvalds     unsigned long flags;
5071da177e4SLinus Torvalds 
5081da177e4SLinus Torvalds     if (atari_dont_touch_floppy_select)
5091da177e4SLinus Torvalds 	return;
5101da177e4SLinus Torvalds 
5111da177e4SLinus Torvalds     local_irq_save(flags);
5121da177e4SLinus Torvalds     sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */
5131da177e4SLinus Torvalds     tmp = sound_ym.rd_data_reg_sel;
5141da177e4SLinus Torvalds     sound_ym.wd_data = on ? (tmp & ~0x02) : (tmp | 0x02);
5151da177e4SLinus Torvalds     local_irq_restore(flags);
5161da177e4SLinus Torvalds }
5171da177e4SLinus Torvalds #endif
5181da177e4SLinus Torvalds 
5191da177e4SLinus Torvalds /* ++roman:
5201da177e4SLinus Torvalds  *
5211da177e4SLinus Torvalds  * This function does a reset on machines that lack the ability to
5221da177e4SLinus Torvalds  * assert the processor's _RESET signal somehow via hardware. It is
5231da177e4SLinus Torvalds  * based on the fact that you can find the initial SP and PC values
5241da177e4SLinus Torvalds  * after a reset at physical addresses 0 and 4. This works pretty well
5251da177e4SLinus Torvalds  * for Atari machines, since the lowest 8 bytes of physical memory are
5261da177e4SLinus Torvalds  * really ROM (mapped by hardware). For other 680x0 machines: don't
5271da177e4SLinus Torvalds  * know if it works...
5281da177e4SLinus Torvalds  *
5291da177e4SLinus Torvalds  * To get the values at addresses 0 and 4, the MMU better is turned
5301da177e4SLinus Torvalds  * off first. After that, we have to jump into physical address space
5311da177e4SLinus Torvalds  * (the PC before the pmove statement points to the virtual address of
5321da177e4SLinus Torvalds  * the code). Getting that physical address is not hard, but the code
5331da177e4SLinus Torvalds  * becomes a bit complex since I've tried to ensure that the jump
5341da177e4SLinus Torvalds  * statement after the pmove is in the cache already (otherwise the
5351da177e4SLinus Torvalds  * processor can't fetch it!). For that, the code first jumps to the
5361da177e4SLinus Torvalds  * jump statement with the (virtual) address of the pmove section in
5371da177e4SLinus Torvalds  * an address register . The jump statement is surely in the cache
5381da177e4SLinus Torvalds  * now. After that, that physical address of the reset code is loaded
5391da177e4SLinus Torvalds  * into the same address register, pmove is done and the same jump
5401da177e4SLinus Torvalds  * statements goes to the reset code. Since there are not many
5411da177e4SLinus Torvalds  * statements between the two jumps, I hope it stays in the cache.
5421da177e4SLinus Torvalds  *
5431da177e4SLinus Torvalds  * The C code makes heavy use of the GCC features that you can get the
5441da177e4SLinus Torvalds  * address of a C label. No hope to compile this with another compiler
5451da177e4SLinus Torvalds  * than GCC!
5461da177e4SLinus Torvalds  */
5471da177e4SLinus Torvalds 
5481da177e4SLinus Torvalds /* ++andreas: no need for complicated code, just depend on prefetch */
5491da177e4SLinus Torvalds 
5501da177e4SLinus Torvalds static void atari_reset (void)
5511da177e4SLinus Torvalds {
5521da177e4SLinus Torvalds     long tc_val = 0;
5531da177e4SLinus Torvalds     long reset_addr;
5541da177e4SLinus Torvalds 
5551da177e4SLinus Torvalds     /* On the Medusa, phys. 0x4 may contain garbage because it's no
5561da177e4SLinus Torvalds        ROM.  See above for explanation why we cannot use PTOV(4). */
5571da177e4SLinus Torvalds     reset_addr = MACH_IS_HADES ? 0x7fe00030 :
5581da177e4SLinus Torvalds                  MACH_IS_MEDUSA || MACH_IS_AB40 ? 0xe00030 :
5591da177e4SLinus Torvalds 		 *(unsigned long *) 0xff000004;
5601da177e4SLinus Torvalds 
5611da177e4SLinus Torvalds     /* reset ACIA for switch off OverScan, if it's active */
5621da177e4SLinus Torvalds     if (atari_switches & ATARI_SWITCH_OVSC_IKBD)
5631da177e4SLinus Torvalds 	acia.key_ctrl = ACIA_RESET;
5641da177e4SLinus Torvalds     if (atari_switches & ATARI_SWITCH_OVSC_MIDI)
5651da177e4SLinus Torvalds 	acia.mid_ctrl = ACIA_RESET;
5661da177e4SLinus Torvalds 
5671da177e4SLinus Torvalds     /* processor independent: turn off interrupts and reset the VBR;
5681da177e4SLinus Torvalds      * the caches must be left enabled, else prefetching the final jump
5691da177e4SLinus Torvalds      * instruction doesn't work. */
5701da177e4SLinus Torvalds     local_irq_disable();
5711da177e4SLinus Torvalds     __asm__ __volatile__
5721da177e4SLinus Torvalds 	("moveq	#0,%/d0\n\t"
5731da177e4SLinus Torvalds 	 "movec	%/d0,%/vbr"
5741da177e4SLinus Torvalds 	 : : : "d0" );
5751da177e4SLinus Torvalds 
5761da177e4SLinus Torvalds     if (CPU_IS_040_OR_060) {
5771da177e4SLinus Torvalds         unsigned long jmp_addr040 = virt_to_phys(&&jmp_addr_label040);
5781da177e4SLinus Torvalds 	if (CPU_IS_060) {
5791da177e4SLinus Torvalds 	    /* 68060: clear PCR to turn off superscalar operation */
5801da177e4SLinus Torvalds 	    __asm__ __volatile__
5811da177e4SLinus Torvalds 		("moveq	#0,%/d0\n\t"
5821da177e4SLinus Torvalds 		 ".chip 68060\n\t"
5831da177e4SLinus Torvalds 		 "movec %%d0,%%pcr\n\t"
5841da177e4SLinus Torvalds 		 ".chip 68k"
5851da177e4SLinus Torvalds 		 : : : "d0" );
5861da177e4SLinus Torvalds 	}
5871da177e4SLinus Torvalds 
5881da177e4SLinus Torvalds         __asm__ __volatile__
5891da177e4SLinus Torvalds             ("movel    %0,%/d0\n\t"
5901da177e4SLinus Torvalds              "andl     #0xff000000,%/d0\n\t"
5911da177e4SLinus Torvalds              "orw      #0xe020,%/d0\n\t"   /* map 16 MB, enable, cacheable */
5921da177e4SLinus Torvalds              ".chip 68040\n\t"
5931da177e4SLinus Torvalds 	     "movec    %%d0,%%itt0\n\t"
5941da177e4SLinus Torvalds              "movec    %%d0,%%dtt0\n\t"
5951da177e4SLinus Torvalds 	     ".chip 68k\n\t"
5961da177e4SLinus Torvalds              "jmp   %0@\n\t"
5971da177e4SLinus Torvalds              : /* no outputs */
5981da177e4SLinus Torvalds              : "a" (jmp_addr040)
5991da177e4SLinus Torvalds              : "d0" );
6001da177e4SLinus Torvalds       jmp_addr_label040:
6011da177e4SLinus Torvalds         __asm__ __volatile__
6021da177e4SLinus Torvalds           ("moveq #0,%/d0\n\t"
6031da177e4SLinus Torvalds 	   "nop\n\t"
6041da177e4SLinus Torvalds 	   ".chip 68040\n\t"
6051da177e4SLinus Torvalds 	   "cinva %%bc\n\t"
6061da177e4SLinus Torvalds 	   "nop\n\t"
6071da177e4SLinus Torvalds 	   "pflusha\n\t"
6081da177e4SLinus Torvalds 	   "nop\n\t"
6091da177e4SLinus Torvalds 	   "movec %%d0,%%tc\n\t"
6101da177e4SLinus Torvalds 	   "nop\n\t"
6111da177e4SLinus Torvalds 	   /* the following setup of transparent translations is needed on the
6121da177e4SLinus Torvalds 	    * Afterburner040 to successfully reboot. Other machines shouldn't
6131da177e4SLinus Torvalds 	    * care about a different tt regs setup, they also didn't care in
6141da177e4SLinus Torvalds 	    * the past that the regs weren't turned off. */
6151da177e4SLinus Torvalds 	   "movel #0xffc000,%%d0\n\t" /* whole insn space cacheable */
6161da177e4SLinus Torvalds 	   "movec %%d0,%%itt0\n\t"
6171da177e4SLinus Torvalds 	   "movec %%d0,%%itt1\n\t"
6181da177e4SLinus Torvalds 	   "orw   #0x40,%/d0\n\t" /* whole data space non-cacheable/ser. */
6191da177e4SLinus Torvalds 	   "movec %%d0,%%dtt0\n\t"
6201da177e4SLinus Torvalds 	   "movec %%d0,%%dtt1\n\t"
6211da177e4SLinus Torvalds 	   ".chip 68k\n\t"
6221da177e4SLinus Torvalds            "jmp %0@"
6231da177e4SLinus Torvalds            : /* no outputs */
6241da177e4SLinus Torvalds            : "a" (reset_addr)
6251da177e4SLinus Torvalds            : "d0");
6261da177e4SLinus Torvalds     }
6271da177e4SLinus Torvalds     else
6281da177e4SLinus Torvalds         __asm__ __volatile__
6291da177e4SLinus Torvalds             ("pmove %0@,%/tc\n\t"
6301da177e4SLinus Torvalds              "jmp %1@"
6311da177e4SLinus Torvalds              : /* no outputs */
6321da177e4SLinus Torvalds              : "a" (&tc_val), "a" (reset_addr));
6331da177e4SLinus Torvalds }
6341da177e4SLinus Torvalds 
6351da177e4SLinus Torvalds 
6361da177e4SLinus Torvalds static void atari_get_model(char *model)
6371da177e4SLinus Torvalds {
6381da177e4SLinus Torvalds     strcpy(model, "Atari ");
6391da177e4SLinus Torvalds     switch (atari_mch_cookie >> 16) {
6401da177e4SLinus Torvalds 	case ATARI_MCH_ST:
6411da177e4SLinus Torvalds 	    if (ATARIHW_PRESENT(MSTE_CLK))
6421da177e4SLinus Torvalds 		strcat (model, "Mega ST");
6431da177e4SLinus Torvalds 	    else
6441da177e4SLinus Torvalds 		strcat (model, "ST");
6451da177e4SLinus Torvalds 	    break;
6461da177e4SLinus Torvalds 	case ATARI_MCH_STE:
6471da177e4SLinus Torvalds 	    if (MACH_IS_MSTE)
6481da177e4SLinus Torvalds 		strcat (model, "Mega STE");
6491da177e4SLinus Torvalds 	    else
6501da177e4SLinus Torvalds 		strcat (model, "STE");
6511da177e4SLinus Torvalds 	    break;
6521da177e4SLinus Torvalds 	case ATARI_MCH_TT:
6531da177e4SLinus Torvalds 	    if (MACH_IS_MEDUSA)
6541da177e4SLinus Torvalds 		/* Medusa has TT _MCH cookie */
6551da177e4SLinus Torvalds 		strcat (model, "Medusa");
6561da177e4SLinus Torvalds 	    else if (MACH_IS_HADES)
6571da177e4SLinus Torvalds 		strcat(model, "Hades");
6581da177e4SLinus Torvalds 	    else
6591da177e4SLinus Torvalds 		strcat (model, "TT");
6601da177e4SLinus Torvalds 	    break;
6611da177e4SLinus Torvalds 	case ATARI_MCH_FALCON:
6621da177e4SLinus Torvalds 	    strcat (model, "Falcon");
6631da177e4SLinus Torvalds 	    if (MACH_IS_AB40)
6641da177e4SLinus Torvalds 		strcat (model, " (with Afterburner040)");
6651da177e4SLinus Torvalds 	    break;
6661da177e4SLinus Torvalds 	default:
6671da177e4SLinus Torvalds 	    sprintf (model + strlen (model), "(unknown mach cookie 0x%lx)",
6681da177e4SLinus Torvalds 		     atari_mch_cookie);
6691da177e4SLinus Torvalds 	    break;
6701da177e4SLinus Torvalds     }
6711da177e4SLinus Torvalds }
6721da177e4SLinus Torvalds 
6731da177e4SLinus Torvalds 
6741da177e4SLinus Torvalds static int atari_get_hardware_list(char *buffer)
6751da177e4SLinus Torvalds {
6761da177e4SLinus Torvalds     int len = 0, i;
6771da177e4SLinus Torvalds 
6781da177e4SLinus Torvalds     for (i = 0; i < m68k_num_memory; i++)
6791da177e4SLinus Torvalds 	len += sprintf (buffer+len, "\t%3ld MB at 0x%08lx (%s)\n",
6801da177e4SLinus Torvalds 			m68k_memory[i].size >> 20, m68k_memory[i].addr,
6811da177e4SLinus Torvalds 			(m68k_memory[i].addr & 0xff000000 ?
6821da177e4SLinus Torvalds 			 "alternate RAM" : "ST-RAM"));
6831da177e4SLinus Torvalds 
6841da177e4SLinus Torvalds #define ATARIHW_ANNOUNCE(name,str)				\
6851da177e4SLinus Torvalds     if (ATARIHW_PRESENT(name))			\
6861da177e4SLinus Torvalds 	len += sprintf (buffer + len, "\t%s\n", str)
6871da177e4SLinus Torvalds 
6881da177e4SLinus Torvalds     len += sprintf (buffer + len, "Detected hardware:\n");
6891da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(STND_SHIFTER, "ST Shifter");
6901da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(EXTD_SHIFTER, "STe Shifter");
6911da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(TT_SHIFTER, "TT Shifter");
6921da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(VIDEL_SHIFTER, "Falcon Shifter");
6931da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(YM_2149, "Programmable Sound Generator");
6941da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(PCM_8BIT, "PCM 8 Bit Sound");
6951da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(CODEC, "CODEC Sound");
6961da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(TT_SCSI, "SCSI Controller NCR5380 (TT style)");
6971da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(ST_SCSI, "SCSI Controller NCR5380 (Falcon style)");
6981da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(ACSI, "ACSI Interface");
6991da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(IDE, "IDE Interface");
7001da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(FDCSPEED, "8/16 Mhz Switch for FDC");
7011da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(ST_MFP, "Multi Function Peripheral MFP 68901");
7021da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(TT_MFP, "Second Multi Function Peripheral MFP 68901");
7031da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(SCC, "Serial Communications Controller SCC 8530");
7041da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(ST_ESCC, "Extended Serial Communications Controller SCC 85230");
7051da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(ANALOG_JOY, "Paddle Interface");
7061da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(MICROWIRE, "MICROWIRE(tm) Interface");
7071da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(STND_DMA, "DMA Controller (24 bit)");
7081da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(EXTD_DMA, "DMA Controller (32 bit)");
7091da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(SCSI_DMA, "DMA Controller for NCR5380");
7101da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(SCC_DMA, "DMA Controller for SCC");
7111da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(TT_CLK, "Clock Chip MC146818A");
7121da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(MSTE_CLK, "Clock Chip RP5C15");
7131da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(SCU, "System Control Unit");
7141da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(BLITTER, "Blitter");
7151da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(VME, "VME Bus");
7161da177e4SLinus Torvalds     ATARIHW_ANNOUNCE(DSP56K, "DSP56001 processor");
7171da177e4SLinus Torvalds 
7181da177e4SLinus Torvalds     return(len);
7191da177e4SLinus Torvalds }
7201da177e4SLinus Torvalds 
7211da177e4SLinus Torvalds /*
7221da177e4SLinus Torvalds  * Local variables:
7231da177e4SLinus Torvalds  *  c-indent-level: 4
7241da177e4SLinus Torvalds  *  tab-width: 8
7251da177e4SLinus Torvalds  * End:
7261da177e4SLinus Torvalds  */
727