prep_setup.c 6.7 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 *  linux/arch/ppc/kernel/setup.c
 *
 *  Copyright (C) 1995  Linus Torvalds
 *  Adapted from 'alpha' version by Gary Thomas
 *  Modified by Cort Dougan (cort@cs.nmt.edu)
 */

/*
 * bootup setup stuff..
 */

#include <linux/config.h>
Linus Torvalds's avatar
Linus Torvalds committed
14
#include <linux/module.h>
Linus Torvalds's avatar
Linus Torvalds committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/ptrace.h>
#include <linux/malloc.h>
#include <linux/user.h>
#include <linux/a.out.h>
#include <linux/tty.h>
#include <linux/major.h>
#include <linux/interrupt.h>
#include <linux/reboot.h>
#include <linux/init.h>
Linus Torvalds's avatar
Linus Torvalds committed
30 31
#include <linux/blk.h>
#include <linux/ioport.h>
Linus Torvalds's avatar
Linus Torvalds committed
32
#include <linux/console.h>
Linus Torvalds's avatar
Linus Torvalds committed
33 34 35 36 37 38

#include <asm/mmu.h>
#include <asm/processor.h>
#include <asm/residual.h>
#include <asm/io.h>
#include <asm/pgtable.h>
Linus Torvalds's avatar
Linus Torvalds committed
39
#include <asm/ide.h>
Linus Torvalds's avatar
Linus Torvalds committed
40
#include <asm/cache.h>
Linus Torvalds's avatar
Linus Torvalds committed
41

Linus Torvalds's avatar
Linus Torvalds committed
42
#if defined(CONFIG_SOUND) || defined(CONFIG_SOUND_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
43 44 45 46
#include <../drivers/sound/sound_config.h>
#include <../drivers/sound/dev_table.h>
#endif

Linus Torvalds's avatar
Linus Torvalds committed
47 48
/* for the mac fs */
kdev_t boot_dev;
Linus Torvalds's avatar
Linus Torvalds committed
49 50 51
/* used in nasty hack for sound - see prep_setup_arch() -- Cort */
long ppc_cs4232_dma, ppc_cs4232_dma2;
unsigned long empty_zero_page[1024];
Linus Torvalds's avatar
Linus Torvalds committed
52 53 54 55 56

extern PTE *Hash, *Hash_end;
extern unsigned long Hash_size, Hash_mask;
extern int probingmem;
extern unsigned long loops_per_sec;
Linus Torvalds's avatar
Linus Torvalds committed
57
extern unsigned char aux_device_present;
Linus Torvalds's avatar
Linus Torvalds committed
58 59 60 61 62 63 64

#ifdef CONFIG_BLK_DEV_RAM
extern int rd_doload;		/* 1 = load ramdisk, 0 = don't load */
extern int rd_prompt;		/* 1 = prompt for ramdisk, 0 = don't prompt */
extern int rd_image_start;	/* starting block # of image */
#endif

Linus Torvalds's avatar
Linus Torvalds committed
65
__prep
Linus Torvalds's avatar
Linus Torvalds committed
66
int
Linus Torvalds's avatar
Linus Torvalds committed
67
prep_get_cpuinfo(char *buffer)
Linus Torvalds's avatar
Linus Torvalds committed
68 69
{
	extern char *Motherboard_map_name;
70
	int len, i;
Linus Torvalds's avatar
Linus Torvalds committed
71 72 73 74 75 76 77
  
#ifdef __SMP__
#define CD(X)		(cpu_data[n].X)  
#else
#define CD(X) (X)
#endif
  
Linus Torvalds's avatar
Linus Torvalds committed
78
	len = sprintf(buffer,"machine\t\t: PReP %s\n",Motherboard_map_name);
Linus Torvalds's avatar
Linus Torvalds committed
79

Linus Torvalds's avatar
Linus Torvalds committed
80
	
Linus Torvalds's avatar
Linus Torvalds committed
81
	switch ( _prep_type )
Linus Torvalds's avatar
Linus Torvalds committed
82
	{
Linus Torvalds's avatar
Linus Torvalds committed
83 84 85 86 87 88 89 90 91 92 93 94 95
	case _PREP_IBM:
		if ((*(unsigned char *)0x8000080c) & (1<<6))
			len += sprintf(buffer+len,"Upgrade CPU\n");
		len += sprintf(buffer+len,"L2\t\t: ");
		if ((*(unsigned char *)0x8000080c) & (1<<7))
		{
			len += sprintf(buffer+len,"not present\n");
			goto no_l2;
		}
		len += sprintf(buffer+len,"%sKb,",
			       (((*(unsigned char *)0x8000080d)>>2)&1)?"512":"256");
		len += sprintf(buffer+len,"%sync\n",
			       ((*(unsigned char *)0x8000080d)>>7) ? "":"a");
Linus Torvalds's avatar
Linus Torvalds committed
96
		break;
Linus Torvalds's avatar
Linus Torvalds committed
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
	case _PREP_Motorola:
		len += sprintf(buffer+len,"L2\t\t: ");
		switch(*((unsigned char *)CACHECRBA) & L2CACHE_MASK)
		{
		case L2CACHE_512KB:
			len += sprintf(buffer+len,"512Kb");
			break;
		case L2CACHE_256KB:
			len += sprintf(buffer+len,"256Kb");
			break;
		case L2CACHE_1MB:
			len += sprintf(buffer+len,"1MB");
			break;
		case L2CACHE_NONE:
			len += sprintf(buffer+len,"none\n");
			goto no_l2;
			break;
		default:
			len += sprintf(buffer+len, "%x\n",
				       *((unsigned char *)CACHECRBA));
		}
		
		len += sprintf(buffer+len,",parity %s",
			       (*((unsigned char *)CACHECRBA) & L2CACHE_PARITY) ?
			       "enabled" : "disabled");
		
		len += sprintf(buffer+len, " SRAM:");
		
		switch ( ((*((unsigned char *)CACHECRBA) & 0xf0) >> 4) & ~(0x3) )
		{
		case 1: len += sprintf(buffer+len,
				       "synchronous,parity,flow-through\n");
			break;
		case 2: len += sprintf(buffer+len,"asynchronous,no parity\n");
			break;
		case 3: len += sprintf(buffer+len,"asynchronous,parity\n");
			break;
		default:len += sprintf(buffer+len,
				       "synchronous,pipelined,no parity\n");
			break;
		}
Linus Torvalds's avatar
Linus Torvalds committed
138 139
		break;
	}
Linus Torvalds's avatar
Linus Torvalds committed
140 141 142
	
	
no_l2:	
Linus Torvalds's avatar
Linus Torvalds committed
143
	if ( res->ResidualLength == 0 )
Linus Torvalds's avatar
Linus Torvalds committed
144
		return len;
145
	
Linus Torvalds's avatar
Linus Torvalds committed
146 147
	/* print info about SIMMs */
	len += sprintf(buffer+len,"simms\t\t: ");
Linus Torvalds's avatar
Linus Torvalds committed
148
	for ( i = 0 ; (res->ActualNumMemories) && (i < MAX_MEMS) ; i++ )
Linus Torvalds's avatar
Linus Torvalds committed
149
	{
Linus Torvalds's avatar
Linus Torvalds committed
150
		if ( res->Memories[i].SIMMSize != 0 )
Linus Torvalds's avatar
Linus Torvalds committed
151
			len += sprintf(buffer+len,"%d:%ldM ",i,
Linus Torvalds's avatar
Linus Torvalds committed
152 153 154
				       (res->Memories[i].SIMMSize > 1024) ?
				       res->Memories[i].SIMMSize>>20 :
				       res->Memories[i].SIMMSize);
Linus Torvalds's avatar
Linus Torvalds committed
155 156 157 158 159 160 161
	}
	len += sprintf(buffer+len,"\n");

	return len;
}

__initfunc(void
Linus Torvalds's avatar
Linus Torvalds committed
162
prep_setup_arch(unsigned long * memory_start_p, unsigned long * memory_end_p))
Linus Torvalds's avatar
Linus Torvalds committed
163 164
{
	extern char cmd_line[];
Linus Torvalds's avatar
Linus Torvalds committed
165
	unsigned char reg;
Linus Torvalds's avatar
Linus Torvalds committed
166 167 168 169 170

	/* init to some ~sane value until calibrate_delay() runs */
	loops_per_sec = 50000000;
	
	aux_device_present = 0xaa;
Linus Torvalds's avatar
Linus Torvalds committed
171 172 173 174 175 176
	/* Set up floppy in PS/2 mode */
	outb(0x09, SIO_CONFIG_RA);
	reg = inb(SIO_CONFIG_RD);
	reg = (reg & 0x3F) | 0x40;
	outb(reg, SIO_CONFIG_RD);
	outb(reg, SIO_CONFIG_RD);	/* Have to write twice to change! */
Linus Torvalds's avatar
Linus Torvalds committed
177 178 179

	/* we should determine this according to what we find! -- Cort */
	switch ( _prep_type )
Linus Torvalds's avatar
Linus Torvalds committed
180
	{
Linus Torvalds's avatar
Linus Torvalds committed
181
	case _PREP_IBM:
Linus Torvalds's avatar
Linus Torvalds committed
182 183
		ROOT_DEV = to_kdev_t(0x0301); /* hda1 */
		break;
Linus Torvalds's avatar
Linus Torvalds committed
184
	case _PREP_Motorola:
Linus Torvalds's avatar
Linus Torvalds committed
185 186 187
		ROOT_DEV = to_kdev_t(0x0801); /* sda1 */
		break;
	}
Linus Torvalds's avatar
Linus Torvalds committed
188 189 190

	/* Enable L2.  Assume we don't need to flush -- Cort*/
	*(unsigned char *)(0x8000081c) = *(unsigned char *)(0x8000081c)|3;
Linus Torvalds's avatar
Linus Torvalds committed
191
	
192 193 194 195 196
	/* make the serial port the console */
	/* strcat(cmd_line,"console=ttyS0,9600n8"); */
	/* use the normal console but send output to the serial port, too */
	/*strcat(cmd_line,"console=tty0 console=ttyS0,9600n8");*/
        sprintf(cmd_line,"%s console=tty0 console=ttyS0,9600n8", cmd_line);
Linus Torvalds's avatar
Linus Torvalds committed
197
	printk("Boot arguments: %s\n", cmd_line);
Linus Torvalds's avatar
Linus Torvalds committed
198 199 200 201 202 203 204 205 206 207 208 209 210
	
#ifdef CONFIG_CS4232
	/*
	 * setup proper values for the cs4232 driver so we don't have
	 * to recompile for the motorola or ibm workstations sound systems.
	 * This is a really nasty hack, but unless we change the driver
	 * it's the only way to support both addrs from one binary.
	 * -- Cort
	 */
	if ( is_prep )
	{
		extern struct card_info snd_installed_cards[];
		struct card_info  *snd_ptr;
Linus Torvalds's avatar
Linus Torvalds committed
211

Linus Torvalds's avatar
Linus Torvalds committed
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
		for ( snd_ptr = snd_installed_cards; 
		      snd_ptr < &snd_installed_cards[num_sound_cards];
		      snd_ptr++ )
		{
			if ( snd_ptr->card_type == SNDCARD_CS4232 )
			{
				if ( _prep_type == _PREP_Motorola )
				{
					snd_ptr->config.io_base = 0x830;
					snd_ptr->config.irq = 10;
					snd_ptr->config.dma = ppc_cs4232_dma = 6;
					snd_ptr->config.dma2 = ppc_cs4232_dma2 = 7;
				}
				if ( _prep_type == _PREP_IBM )
				{
					snd_ptr->config.io_base = 0x530;
					snd_ptr->config.irq =  5;
					snd_ptr->config.dma = ppc_cs4232_dma = 1;
					/* this is wrong - but leave it for now */
					snd_ptr->config.dma2 = ppc_cs4232_dma2 = 7;
				}
			}
		}
	}
#endif /* CONFIG_CS4232 */	
Linus Torvalds's avatar
Linus Torvalds committed
237
	
Linus Torvalds's avatar
Linus Torvalds committed
238 239 240

	/*print_residual_device_info();*/
        request_region(0x20,0x20,"pic1");
Linus Torvalds's avatar
Linus Torvalds committed
241 242 243 244 245
	request_region(0xa0,0x20,"pic2");
	request_region(0x00,0x20,"dma1");
	request_region(0x40,0x20,"timer");
	request_region(0x80,0x10,"dma page reg");
	request_region(0xc0,0x20,"dma2");
Linus Torvalds's avatar
Linus Torvalds committed
246 247 248 249

#ifdef CONFIG_VGA_CONSOLE
        conswitchp = &vga_con;
#endif
Linus Torvalds's avatar
Linus Torvalds committed
250
}
Linus Torvalds's avatar
Linus Torvalds committed
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267

__initfunc(void prep_ide_init_hwif_ports (ide_ioreg_t *p, ide_ioreg_t base, int *irq))
{
	ide_ioreg_t port = base;
	int i = 8;

	while (i--)
		*p++ = port++;
	*p++ = base + 0x206;
	if (irq != NULL)
		*irq = 0;
}

#ifdef CONFIG_SOUND_MODULE
EXPORT_SYMBOL(ppc_cs4232_dma);
EXPORT_SYMBOL(ppc_cs4232_dma2);
#endif