1
/*
2
* QEMU Sun4m & Sun4d & Sun4c System Emulator
ths
authored
18 years ago
3
*
4
* Copyright ( c ) 2003 - 2005 Fabrice Bellard
ths
authored
18 years ago
5
*
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the "Software" ), to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*/
24
# include "sysbus.h"
25
26
27
28
29
30
31
32
# include "qemu-timer.h"
# include "sun4m.h"
# include "nvram.h"
# include "sparc32_dma.h"
# include "fdc.h"
# include "sysemu.h"
# include "net.h"
# include "boards.h"
33
# include "firmware_abi.h"
34
# include "scsi.h"
35
36
# include "pc.h"
# include "isa.h"
37
# include "fw_cfg.h"
38
# include "escc.h"
39
40
// # define DEBUG_IRQ
41
42
43
44
45
/*
* Sun4m architecture was used in the following machines :
*
* SPARCserver 6 xxMP / xx
46
47
* SPARCclassic ( SPARCclassic Server )( SPARCstation LC ) ( 4 / 15 ),
* SPARCclassic X ( 4 / 10 )
48
49
50
51
52
53
54
* SPARCstation LX / ZX ( 4 / 30 )
* SPARCstation Voyager
* SPARCstation 10 / xx , SPARCserver 10 / xx
* SPARCstation 5 , SPARCserver 5
* SPARCstation 20 / xx , SPARCserver 20
* SPARCstation 4
*
55
56
57
58
59
* Sun4d architecture was used in the following machines :
*
* SPARCcenter 2000
* SPARCserver 1000
*
60
61
62
63
64
65
66
* Sun4c architecture was used in the following machines :
* SPARCstation 1 / 1 + , SPARCserver 1 / 1 +
* SPARCstation SLC
* SPARCstation IPC
* SPARCstation ELC
* SPARCstation IPX
*
67
68
69
* See for example : http :// www . sunhelp . org / faq / sunref1 . html
*/
70
# ifdef DEBUG_IRQ
71
72
# define DPRINTF ( fmt , ...) \
do { printf ( "CPUIRQ: " fmt , ## __VA_ARGS__ ); } while ( 0 )
73
# else
74
# define DPRINTF ( fmt , ...)
75
76
# endif
77
# define KERNEL_LOAD_ADDR 0x00004000
78
# define CMDLINE_ADDR 0x007ff000
79
# define INITRD_LOAD_ADDR 0x00800000
80
# define PROM_SIZE_MAX ( 1024 * 1024 )
81
# define PROM_VADDR 0xffd00000
82
# define PROM_FILENAME "openbios-sparc32"
83
# define CFG_ADDR 0xd00000510ULL
84
# define FW_CFG_SUN4M_DEPTH ( FW_CFG_ARCH_LOCAL + 0x00 )
85
86
# define MAX_CPUS 16
87
# define MAX_PILS 16
88
89
90
# define ESCC_CLOCK 4915200
91
struct sun4m_hwdef {
92
93
94
target_phys_addr_t iommu_base , slavio_base ;
target_phys_addr_t intctl_base , counter_base , nvram_base , ms_kb_base ;
target_phys_addr_t serial_base , fd_base ;
95
target_phys_addr_t idreg_base , dma_base , esp_base , le_base ;
96
target_phys_addr_t tcx_base , cs_base , apc_base , aux1_base , aux2_base ;
97
98
target_phys_addr_t ecc_base ;
uint32_t ecc_version ;
99
long vram_size , nvram_size ;
100
// IRQ numbers are not PIL ones , but master interrupt controller
101
// register bit numbers
102
int esp_irq , le_irq , clock_irq , clock1_irq ;
103
int ser_irq , ms_kb_irq , fd_irq , me_irq , cs_irq , ecc_irq ;
104
105
uint8_t nvram_machine_id ;
uint16_t machine_id ;
106
uint32_t iommu_version ;
107
uint32_t intbit_to_level [ 32 ];
108
109
uint64_t max_mem ;
const char * const default_cpu_model ;
110
111
};
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# define MAX_IOUNITS 5
struct sun4d_hwdef {
target_phys_addr_t iounit_bases [ MAX_IOUNITS ], slavio_base ;
target_phys_addr_t counter_base , nvram_base , ms_kb_base ;
target_phys_addr_t serial_base ;
target_phys_addr_t espdma_base , esp_base ;
target_phys_addr_t ledma_base , le_base ;
target_phys_addr_t tcx_base ;
target_phys_addr_t sbi_base ;
unsigned long vram_size , nvram_size ;
// IRQ numbers are not PIL ones , but SBI register bit numbers
int esp_irq , le_irq , clock_irq , clock1_irq ;
int ser_irq , ms_kb_irq , me_irq ;
126
127
uint8_t nvram_machine_id ;
uint16_t machine_id ;
128
129
130
131
132
uint32_t iounit_version ;
uint64_t max_mem ;
const char * const default_cpu_model ;
};
133
134
135
136
137
struct sun4c_hwdef {
target_phys_addr_t iommu_base , slavio_base ;
target_phys_addr_t intctl_base , counter_base , nvram_base , ms_kb_base ;
target_phys_addr_t serial_base , fd_base ;
target_phys_addr_t idreg_base , dma_base , esp_base , le_base ;
138
target_phys_addr_t tcx_base , aux1_base ;
139
140
141
long vram_size , nvram_size ;
// IRQ numbers are not PIL ones , but master interrupt controller
// register bit numbers
142
143
int esp_irq , le_irq , clock_irq , clock1_irq ;
int ser_irq , ms_kb_irq , fd_irq , me_irq ;
144
145
146
147
148
149
150
151
uint8_t nvram_machine_id ;
uint16_t machine_id ;
uint32_t iommu_version ;
uint32_t intbit_to_level [ 32 ];
uint64_t max_mem ;
const char * const default_cpu_model ;
};
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
int DMA_get_channel_mode ( int nchan )
{
return 0 ;
}
int DMA_read_memory ( int nchan , void * buf , int pos , int size )
{
return 0 ;
}
int DMA_write_memory ( int nchan , void * buf , int pos , int size )
{
return 0 ;
}
void DMA_hold_DREQ ( int nchan ) {}
void DMA_release_DREQ ( int nchan ) {}
void DMA_schedule ( int nchan ) {}
void DMA_init ( int high_page_enable ) {}
void DMA_register_channel ( int nchan ,
DMA_transfer_handler transfer_handler ,
void * opaque )
{
}
174
static int fw_cfg_boot_set ( void * opaque , const char * boot_device )
175
{
176
fw_cfg_add_i16 ( opaque , FW_CFG_BOOT_DEVICE , boot_device [ 0 ]);
177
178
179
return 0 ;
}
180
static void nvram_init ( m48t59_t * nvram , uint8_t * macaddr , const char * cmdline ,
181
const char * boot_devices , ram_addr_t RAM_size ,
182
183
uint32_t kernel_size ,
int width , int height , int depth ,
184
int nvram_machine_id , const char * arch )
185
{
186
unsigned int i ;
187
uint32_t start , end ;
188
189
190
191
uint8_t image [ 0x1ff0 ];
struct OpenBIOS_nvpart_v1 * part_header ;
memset ( image , '\0' , sizeof ( image ));
192
193
start = 0 ;
194
195
196
// OpenBIOS nvram variables
// Variable partition
197
198
part_header = ( struct OpenBIOS_nvpart_v1 * ) & image [ start ];
part_header -> signature = OPENBIOS_PART_SYSTEM ;
199
pstrcpy ( part_header -> name , sizeof ( part_header -> name ), "system" );
200
201
end = start + sizeof ( struct OpenBIOS_nvpart_v1 );
202
for ( i = 0 ; i < nb_prom_envs ; i ++ )
203
204
205
206
end = OpenBIOS_set_var ( image , end , prom_envs [ i ]);
// End marker
image [ end ++ ] = '\0' ;
207
208
end = start + (( end - start + 15 ) & ~ 15 );
209
OpenBIOS_finish_partition ( part_header , end - start );
210
211
212
// free partition
start = end ;
213
214
part_header = ( struct OpenBIOS_nvpart_v1 * ) & image [ start ];
part_header -> signature = OPENBIOS_PART_FREE ;
215
pstrcpy ( part_header -> name , sizeof ( part_header -> name ), "free" );
216
217
end = 0x1fd0 ;
218
219
OpenBIOS_finish_partition ( part_header , end - start );
220
221
Sun_init_header (( struct Sun_nvram * ) & image [ 0x1fd8 ], macaddr ,
nvram_machine_id );
222
223
224
for ( i = 0 ; i < sizeof ( image ); i ++ )
m48t59_write ( nvram , i , image [ i ]);
225
226
227
228
}
static void * slavio_intctl ;
229
void pic_info ( Monitor * mon )
230
{
231
if ( slavio_intctl )
232
slavio_pic_info ( mon , slavio_intctl );
233
234
}
235
void irq_info ( Monitor * mon )
236
{
237
if ( slavio_intctl )
238
slavio_irq_info ( mon , slavio_intctl );
239
240
}
241
242
243
244
245
246
247
248
249
250
251
void cpu_check_irqs ( CPUState * env )
{
if ( env -> pil_in && ( env -> interrupt_index == 0 ||
( env -> interrupt_index & ~ 15 ) == TT_EXTINT )) {
unsigned int i ;
for ( i = 15 ; i > 0 ; i -- ) {
if ( env -> pil_in & ( 1 << i )) {
int old_interrupt = env -> interrupt_index ;
env -> interrupt_index = TT_EXTINT | i ;
252
253
if ( old_interrupt != env -> interrupt_index ) {
DPRINTF ( "Set CPU IRQ %d \n " , i );
254
cpu_interrupt ( env , CPU_INTERRUPT_HARD );
255
}
256
257
258
259
break ;
}
}
} else if ( ! env -> pil_in && ( env -> interrupt_index & ~ 15 ) == TT_EXTINT ) {
260
DPRINTF ( "Reset CPU IRQ %d \n " , env -> interrupt_index & 15 );
261
262
263
264
265
env -> interrupt_index = 0 ;
cpu_reset_interrupt ( env , CPU_INTERRUPT_HARD );
}
}
266
267
268
269
270
271
272
static void cpu_set_irq ( void * opaque , int irq , int level )
{
CPUState * env = opaque ;
if ( level ) {
DPRINTF ( "Raise CPU IRQ %d \n " , irq );
env -> halted = 0 ;
273
274
env -> pil_in |= 1 << irq ;
cpu_check_irqs ( env );
275
276
} else {
DPRINTF ( "Lower CPU IRQ %d \n " , irq );
277
278
env -> pil_in &= ~ ( 1 << irq );
cpu_check_irqs ( env );
279
280
281
282
283
284
285
}
}
static void dummy_cpu_set_irq ( void * opaque , int irq , int level )
{
}
286
287
288
289
290
291
292
static void * slavio_misc ;
void qemu_system_powerdown ( void )
{
slavio_set_power_fail ( slavio_misc , 1 );
}
293
294
295
static void main_cpu_reset ( void * opaque )
{
CPUState * env = opaque ;
296
297
298
299
300
301
302
303
304
cpu_reset ( env );
env -> halted = 0 ;
}
static void secondary_cpu_reset ( void * opaque )
{
CPUState * env = opaque ;
305
cpu_reset ( env );
306
env -> halted = 1 ;
307
308
}
309
310
311
312
313
314
static void cpu_halt_signal ( void * opaque , int irq , int level )
{
if ( level && cpu_single_env )
cpu_interrupt ( cpu_single_env , CPU_INTERRUPT_HALT );
}
315
static unsigned long sun4m_load_kernel ( const char * kernel_filename ,
316
317
const char * initrd_filename ,
ram_addr_t RAM_size )
318
319
320
321
322
323
324
325
326
327
328
329
{
int linux_boot ;
unsigned int i ;
long initrd_size , kernel_size ;
linux_boot = ( kernel_filename != NULL );
kernel_size = 0 ;
if ( linux_boot ) {
kernel_size = load_elf ( kernel_filename , - 0xf0000000ULL , NULL , NULL ,
NULL );
if ( kernel_size < 0 )
330
331
kernel_size = load_aout ( kernel_filename , KERNEL_LOAD_ADDR ,
RAM_size - KERNEL_LOAD_ADDR );
332
if ( kernel_size < 0 )
333
334
335
kernel_size = load_image_targphys ( kernel_filename ,
KERNEL_LOAD_ADDR ,
RAM_size - KERNEL_LOAD_ADDR );
336
337
338
339
340
341
342
343
344
if ( kernel_size < 0 ) {
fprintf ( stderr , "qemu: could not load kernel '%s' \n " ,
kernel_filename );
exit ( 1 );
}
/* load initrd */
initrd_size = 0 ;
if ( initrd_filename ) {
345
346
347
initrd_size = load_image_targphys ( initrd_filename ,
INITRD_LOAD_ADDR ,
RAM_size - INITRD_LOAD_ADDR );
348
349
350
351
352
353
354
355
if ( initrd_size < 0 ) {
fprintf ( stderr , "qemu: could not load initial ram disk '%s' \n " ,
initrd_filename );
exit ( 1 );
}
}
if ( initrd_size > 0 ) {
for ( i = 0 ; i < 64 * TARGET_PAGE_SIZE ; i += TARGET_PAGE_SIZE ) {
356
357
358
if ( ldl_phys ( KERNEL_LOAD_ADDR + i ) == 0x48647253 ) { // HdrS
stl_phys ( KERNEL_LOAD_ADDR + i + 16 , INITRD_LOAD_ADDR );
stl_phys ( KERNEL_LOAD_ADDR + i + 20 , initrd_size );
359
360
361
362
363
364
365
366
break ;
}
}
}
}
return kernel_size ;
}
367
368
369
370
371
372
373
374
375
static void lance_init ( NICInfo * nd , target_phys_addr_t leaddr ,
void * dma_opaque , qemu_irq irq , qemu_irq * reset )
{
DeviceState * dev ;
SysBusDevice * s ;
qemu_check_nic_model ( & nd_table [ 0 ], "lance" );
dev = qdev_create ( NULL , "lance" );
376
dev -> nd = nd ;
377
qdev_prop_set_ptr ( dev , "dma" , dma_opaque );
378
379
380
381
qdev_init ( dev );
s = sysbus_from_qdev ( dev );
sysbus_mmio_map ( s , 0 , leaddr );
sysbus_connect_irq ( s , 0 , irq );
382
* reset = qdev_get_gpio_in ( dev , 0 );
383
384
}
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
/* NCR89C100/MACIO Internal ID register */
static const uint8_t idreg_data [] = { 0xfe , 0x81 , 0x01 , 0x03 };
static void idreg_init ( target_phys_addr_t addr )
{
DeviceState * dev ;
SysBusDevice * s ;
dev = qdev_create ( NULL , "macio_idreg" );
qdev_init ( dev );
s = sysbus_from_qdev ( dev );
sysbus_mmio_map ( s , 0 , addr );
cpu_physical_memory_write_rom ( addr , idreg_data , sizeof ( idreg_data ));
}
static void idreg_init1 ( SysBusDevice * dev )
{
ram_addr_t idreg_offset ;
idreg_offset = qemu_ram_alloc ( sizeof ( idreg_data ));
sysbus_init_mmio ( dev , sizeof ( idreg_data ), idreg_offset | IO_MEM_ROM );
}
static SysBusDeviceInfo idreg_info = {
. init = idreg_init1 ,
. qdev . name = "macio_idreg" ,
. qdev . size = sizeof ( SysBusDevice ),
};
static void idreg_register_devices ( void )
{
sysbus_register_withprop ( & idreg_info );
}
device_init ( idreg_register_devices );
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
/* Boot PROM (OpenBIOS) */
static void prom_init ( target_phys_addr_t addr , const char * bios_name )
{
DeviceState * dev ;
SysBusDevice * s ;
char * filename ;
int ret ;
dev = qdev_create ( NULL , "openprom" );
qdev_init ( dev );
s = sysbus_from_qdev ( dev );
sysbus_mmio_map ( s , 0 , addr );
/* load boot prom */
if ( bios_name == NULL ) {
bios_name = PROM_FILENAME ;
}
filename = qemu_find_file ( QEMU_FILE_TYPE_BIOS , bios_name );
if ( filename ) {
ret = load_elf ( filename , addr - PROM_VADDR , NULL , NULL , NULL );
if ( ret < 0 || ret > PROM_SIZE_MAX ) {
ret = load_image_targphys ( filename , addr , PROM_SIZE_MAX );
}
qemu_free ( filename );
} else {
ret = - 1 ;
}
if ( ret < 0 || ret > PROM_SIZE_MAX ) {
fprintf ( stderr , "qemu: could not load prom '%s' \n " , bios_name );
exit ( 1 );
}
}
static void prom_init1 ( SysBusDevice * dev )
{
ram_addr_t prom_offset ;
prom_offset = qemu_ram_alloc ( PROM_SIZE_MAX );
sysbus_init_mmio ( dev , PROM_SIZE_MAX , prom_offset | IO_MEM_ROM );
}
static SysBusDeviceInfo prom_info = {
. init = prom_init1 ,
. qdev . name = "openprom" ,
. qdev . size = sizeof ( SysBusDevice ),
468
469
. qdev . props = ( Property []) {
{ /* end of property list */ }
470
471
472
473
474
475
476
477
478
479
}
};
static void prom_register_devices ( void )
{
sysbus_register_withprop ( & prom_info );
}
device_init ( prom_register_devices );
480
481
482
typedef struct RamDevice
{
SysBusDevice busdev ;
483
uint64_t size ;
484
485
} RamDevice ;
486
487
488
489
/* System RAM */
static void ram_init1 ( SysBusDevice * dev )
{
ram_addr_t RAM_size , ram_offset ;
490
RamDevice * d = FROM_SYSBUS ( RamDevice , dev );
491
492
RAM_size = d -> size ;
493
494
495
496
497
498
499
500
501
502
ram_offset = qemu_ram_alloc ( RAM_size );
sysbus_init_mmio ( dev , RAM_size , ram_offset );
}
static void ram_init ( target_phys_addr_t addr , ram_addr_t RAM_size ,
uint64_t max_mem )
{
DeviceState * dev ;
SysBusDevice * s ;
503
RamDevice * d ;
504
505
506
507
508
509
510
511
512
513
514
515
/* allocate RAM */
if (( uint64_t ) RAM_size > max_mem ) {
fprintf ( stderr ,
"qemu: Too much memory for this machine: %d, maximum %d \n " ,
( unsigned int )( RAM_size / ( 1024 * 1024 )),
( unsigned int )( max_mem / ( 1024 * 1024 )));
exit ( 1 );
}
dev = qdev_create ( NULL , "memory" );
s = sysbus_from_qdev ( dev );
516
517
d = FROM_SYSBUS ( RamDevice , s );
d -> size = RAM_size ;
518
qdev_init ( dev );
519
520
521
522
523
524
525
sysbus_mmio_map ( s , 0 , addr );
}
static SysBusDeviceInfo ram_info = {
. init = ram_init1 ,
. qdev . name = "memory" ,
526
527
528
529
. qdev . size = sizeof ( RamDevice ),
. qdev . props = ( Property []) {
{
. name = "size" ,
530
. info = & qdev_prop_uint64 ,
531
532
533
. offset = offsetof ( RamDevice , size ),
},
{ /* end of property list */ }
534
535
536
537
538
539
540
541
542
543
}
};
static void ram_register_devices ( void )
{
sysbus_register_withprop ( & ram_info );
}
device_init ( ram_register_devices );
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
static CPUState * cpu_devinit ( const char * cpu_model , unsigned int id ,
uint64_t prom_addr , qemu_irq ** cpu_irqs )
{
CPUState * env ;
env = cpu_init ( cpu_model );
if ( ! env ) {
fprintf ( stderr , "qemu: Unable to find Sparc CPU definition \n " );
exit ( 1 );
}
cpu_sparc_set_id ( env , id );
if ( id == 0 ) {
qemu_register_reset ( main_cpu_reset , env );
} else {
qemu_register_reset ( secondary_cpu_reset , env );
env -> halted = 1 ;
}
* cpu_irqs = qemu_allocate_irqs ( cpu_set_irq , env , MAX_PILS );
env -> prom_addr = prom_addr ;
return env ;
}
568
static void sun4m_hw_init ( const struct sun4m_hwdef * hwdef , ram_addr_t RAM_size ,
569
const char * boot_device ,
570
const char * kernel_filename ,
571
572
const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
573
{
574
CPUState * envs [ MAX_CPUS ];
575
unsigned int i ;
576
void * iommu , * espdma , * ledma , * nvram ;
577
qemu_irq * cpu_irqs [ MAX_CPUS ], slavio_irq [ 32 ], slavio_cpu_irq [ MAX_CPUS ],
578
espdma_irq , ledma_irq ;
579
qemu_irq * esp_reset , * le_reset ;
580
qemu_irq fdc_tc ;
581
qemu_irq * cpu_halt ;
582
unsigned long kernel_size ;
ths
authored
17 years ago
583
BlockDriverState * fd [ MAX_FD ];
584
void * fw_cfg ;
585
DeviceState * dev ;
586
DriveInfo * dinfo ;
587
588
/* init CPUs */
589
590
if ( ! cpu_model )
cpu_model = hwdef -> default_cpu_model ;
591
592
for ( i = 0 ; i < smp_cpus ; i ++ ) {
593
envs [ i ] = cpu_devinit ( cpu_model , i , hwdef -> slavio_base , & cpu_irqs [ i ]);
594
}
595
596
597
598
for ( i = smp_cpus ; i < MAX_CPUS ; i ++ )
cpu_irqs [ i ] = qemu_allocate_irqs ( dummy_cpu_set_irq , NULL , MAX_PILS );
599
600
/* set up devices */
601
602
ram_init ( 0 , RAM_size , hwdef -> max_mem );
603
604
prom_init ( hwdef -> slavio_base , bios_name );
605
606
607
608
609
610
611
612
613
614
615
616
dev = slavio_intctl_init ( hwdef -> intctl_base ,
hwdef -> intctl_base + 0x10000ULL ,
& hwdef -> intbit_to_level [ 0 ],
cpu_irqs ,
hwdef -> clock_irq );
for ( i = 0 ; i < 32 ; i ++ ) {
slavio_irq [ i ] = qdev_get_gpio_in ( dev , i );
}
for ( i = 0 ; i < MAX_CPUS ; i ++ ) {
slavio_cpu_irq [ i ] = qdev_get_gpio_in ( dev , 32 + i );
}
617
618
if ( hwdef -> idreg_base ) {
619
idreg_init ( hwdef -> idreg_base );
620
621
}
622
623
624
iommu = iommu_init ( hwdef -> iommu_base , hwdef -> iommu_version ,
slavio_irq [ hwdef -> me_irq ]);
625
espdma = sparc32_dma_init ( hwdef -> dma_base , slavio_irq [ hwdef -> esp_irq ],
626
627
iommu , & espdma_irq , & esp_reset );
628
ledma = sparc32_dma_init ( hwdef -> dma_base + 16ULL ,
629
630
slavio_irq [ hwdef -> le_irq ], iommu , & ledma_irq ,
& le_reset );
631
632
633
634
635
if ( graphic_depth != 8 && graphic_depth != 24 ) {
fprintf ( stderr , "qemu: Unsupported depth: %d \n " , graphic_depth );
exit ( 1 );
}
636
637
tcx_init ( hwdef -> tcx_base , hwdef -> vram_size , graphic_width , graphic_height ,
graphic_depth );
638
639
lance_init ( & nd_table [ 0 ], hwdef -> le_base , ledma , ledma_irq , le_reset );
640
641
642
nvram = m48t59_init ( slavio_irq [ 0 ], hwdef -> nvram_base , 0 ,
hwdef -> nvram_size , 8 );
643
644
slavio_timer_init_all ( hwdef -> counter_base , slavio_irq [ hwdef -> clock1_irq ],
645
slavio_cpu_irq , smp_cpus );
646
647
slavio_serial_ms_kbd_init ( hwdef -> ms_kb_base , slavio_irq [ hwdef -> ms_kb_irq ],
648
display_type == DT_NOGRAPHIC , ESCC_CLOCK , 1 );
649
650
// Slavio TTYA ( base + 4 , Linux ttyS0 ) is the first Qemu serial device
// Slavio TTYB ( base + 0 , Linux ttyS1 ) is the second Qemu serial device
651
652
escc_init ( hwdef -> serial_base , slavio_irq [ hwdef -> ser_irq ], slavio_irq [ hwdef -> ser_irq ],
serial_hds [ 0 ], serial_hds [ 1 ], ESCC_CLOCK , 1 );
653
654
cpu_halt = qemu_allocate_irqs ( cpu_halt_signal , NULL , 1 );
655
slavio_misc = slavio_misc_init ( hwdef -> slavio_base ,
656
hwdef -> aux1_base , hwdef -> aux2_base ,
657
658
659
660
slavio_irq [ hwdef -> me_irq ], fdc_tc );
if ( hwdef -> apc_base ) {
apc_init ( hwdef -> apc_base , cpu_halt [ 0 ]);
}
661
662
if ( hwdef -> fd_base ) {
ths
authored
17 years ago
663
/* there is zero or one floppy drive */
664
memset ( fd , 0 , sizeof ( fd ));
665
666
667
dinfo = drive_get ( IF_FLOPPY , 0 , 0 );
if ( dinfo )
fd [ 0 ] = dinfo -> bdrv ;
668
669
sun4m_fdctrl_init ( slavio_irq [ hwdef -> fd_irq ], hwdef -> fd_base , fd ,
670
& fdc_tc );
ths
authored
17 years ago
671
672
673
674
675
676
677
}
if ( drive_get_max_bus ( IF_SCSI ) > 0 ) {
fprintf ( stderr , "qemu: too many SCSI bus \n " );
exit ( 1 );
}
678
679
esp_init ( hwdef -> esp_base , 2 ,
espdma_memory_read , espdma_memory_write ,
680
espdma , espdma_irq , esp_reset );
ths
authored
18 years ago
681
682
683
684
685
if ( hwdef -> cs_base ) {
sysbus_create_simple ( "SUNW,CS4231" , hwdef -> cs_base ,
slavio_irq [ hwdef -> cs_irq ]);
}
686
687
688
kernel_size = sun4m_load_kernel ( kernel_filename , initrd_filename ,
RAM_size );
689
690
nvram_init ( nvram , ( uint8_t * ) & nd_table [ 0 ]. macaddr , kernel_cmdline ,
691
boot_device , RAM_size , kernel_size , graphic_width ,
692
693
graphic_height , graphic_depth , hwdef -> nvram_machine_id ,
"Sun4m" );
694
695
if ( hwdef -> ecc_base )
696
697
ecc_init ( hwdef -> ecc_base , slavio_irq [ hwdef -> ecc_irq ],
hwdef -> ecc_version );
698
699
700
fw_cfg = fw_cfg_init ( 0 , 0 , CFG_ADDR , CFG_ADDR + 2 );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_ID , 1 );
701
702
fw_cfg_add_i64 ( fw_cfg , FW_CFG_RAM_SIZE , ( uint64_t ) ram_size );
fw_cfg_add_i16 ( fw_cfg , FW_CFG_MACHINE_ID , hwdef -> machine_id );
703
fw_cfg_add_i16 ( fw_cfg , FW_CFG_SUN4M_DEPTH , graphic_depth );
704
705
706
707
708
709
710
711
712
713
714
715
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_ADDR , KERNEL_LOAD_ADDR );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_SIZE , kernel_size );
if ( kernel_cmdline ) {
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_CMDLINE , CMDLINE_ADDR );
pstrcpy_targphys ( CMDLINE_ADDR , TARGET_PAGE_SIZE , kernel_cmdline );
} else {
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_CMDLINE , 0 );
}
fw_cfg_add_i32 ( fw_cfg , FW_CFG_INITRD_ADDR , INITRD_LOAD_ADDR );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_INITRD_SIZE , 0 ); // not used
fw_cfg_add_i16 ( fw_cfg , FW_CFG_BOOT_DEVICE , boot_device [ 0 ]);
qemu_register_boot_set ( fw_cfg_boot_set , fw_cfg );
716
717
}
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
enum {
ss2_id = 0 ,
ss5_id = 32 ,
vger_id ,
lx_id ,
ss4_id ,
scls_id ,
sbook_id ,
ss10_id = 64 ,
ss20_id ,
ss600mp_id ,
ss1000_id = 96 ,
ss2000_id ,
};
733
static const struct sun4m_hwdef sun4m_hwdefs [] = {
734
735
736
737
738
/* SS-5 */
{
. iommu_base = 0x10000000 ,
. tcx_base = 0x50000000 ,
. cs_base = 0x6c000000 ,
739
. slavio_base = 0x70000000 ,
740
741
742
743
744
745
. ms_kb_base = 0x71000000 ,
. serial_base = 0x71100000 ,
. nvram_base = 0x71200000 ,
. fd_base = 0x71400000 ,
. counter_base = 0x71d00000 ,
. intctl_base = 0x71e00000 ,
746
. idreg_base = 0x78000000 ,
747
748
749
. dma_base = 0x78400000 ,
. esp_base = 0x78800000 ,
. le_base = 0x78c00000 ,
750
. apc_base = 0x6a000000 ,
751
752
. aux1_base = 0x71900000 ,
. aux2_base = 0x71910000 ,
753
754
755
756
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
757
. clock_irq = 7 ,
758
759
760
761
762
763
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
. cs_irq = 5 ,
764
765
. nvram_machine_id = 0x80 ,
. machine_id = ss5_id ,
766
. iommu_version = 0x05000000 ,
767
. intbit_to_level = {
768
769
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
770
},
771
772
. max_mem = 0x10000000 ,
. default_cpu_model = "Fujitsu MB86904" ,
773
774
775
},
/* SS-10 */
{
776
777
778
779
780
781
782
783
784
. iommu_base = 0xfe0000000ULL ,
. tcx_base = 0xe20000000ULL ,
. slavio_base = 0xff0000000ULL ,
. ms_kb_base = 0xff1000000ULL ,
. serial_base = 0xff1100000ULL ,
. nvram_base = 0xff1200000ULL ,
. fd_base = 0xff1700000ULL ,
. counter_base = 0xff1300000ULL ,
. intctl_base = 0xff1400000ULL ,
785
. idreg_base = 0xef0000000ULL ,
786
787
788
. dma_base = 0xef0400000ULL ,
. esp_base = 0xef0800000ULL ,
. le_base = 0xef0c00000ULL ,
789
. apc_base = 0xefa000000ULL , // XXX should not exist
790
791
. aux1_base = 0xff1800000ULL ,
. aux2_base = 0xff1a01000ULL ,
792
793
. ecc_base = 0xf00000000ULL ,
. ecc_version = 0x10000000 , // version 0 , implementation 1
794
795
796
797
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
798
. clock_irq = 7 ,
799
800
801
802
803
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
804
. ecc_irq = 28 ,
805
806
. nvram_machine_id = 0x72 ,
. machine_id = ss10_id ,
807
. iommu_version = 0x03000000 ,
808
. intbit_to_level = {
809
810
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
811
},
812
. max_mem = 0xf00000000ULL ,
813
. default_cpu_model = "TI SuperSparc II" ,
814
},
815
816
817
818
819
820
821
822
823
824
825
826
827
/* SS-600MP */
{
. iommu_base = 0xfe0000000ULL ,
. tcx_base = 0xe20000000ULL ,
. slavio_base = 0xff0000000ULL ,
. ms_kb_base = 0xff1000000ULL ,
. serial_base = 0xff1100000ULL ,
. nvram_base = 0xff1200000ULL ,
. counter_base = 0xff1300000ULL ,
. intctl_base = 0xff1400000ULL ,
. dma_base = 0xef0081000ULL ,
. esp_base = 0xef0080000ULL ,
. le_base = 0xef0060000ULL ,
828
. apc_base = 0xefa000000ULL , // XXX should not exist
829
830
. aux1_base = 0xff1800000ULL ,
. aux2_base = 0xff1a01000ULL , // XXX should not exist
831
832
. ecc_base = 0xf00000000ULL ,
. ecc_version = 0x00000000 , // version 0 , implementation 0
833
834
835
836
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
837
. clock_irq = 7 ,
838
839
840
841
842
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
843
. ecc_irq = 28 ,
844
845
. nvram_machine_id = 0x71 ,
. machine_id = ss600mp_id ,
846
. iommu_version = 0x01000000 ,
847
848
849
850
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
851
. max_mem = 0xf00000000ULL ,
852
. default_cpu_model = "TI SuperSparc II" ,
853
},
854
855
856
857
858
859
860
861
862
863
864
/* SS-20 */
{
. iommu_base = 0xfe0000000ULL ,
. tcx_base = 0xe20000000ULL ,
. slavio_base = 0xff0000000ULL ,
. ms_kb_base = 0xff1000000ULL ,
. serial_base = 0xff1100000ULL ,
. nvram_base = 0xff1200000ULL ,
. fd_base = 0xff1700000ULL ,
. counter_base = 0xff1300000ULL ,
. intctl_base = 0xff1400000ULL ,
865
. idreg_base = 0xef0000000ULL ,
866
867
868
. dma_base = 0xef0400000ULL ,
. esp_base = 0xef0800000ULL ,
. le_base = 0xef0c00000ULL ,
869
. apc_base = 0xefa000000ULL , // XXX should not exist
870
871
. aux1_base = 0xff1800000ULL ,
. aux2_base = 0xff1a01000ULL ,
872
873
874
875
876
877
. ecc_base = 0xf00000000ULL ,
. ecc_version = 0x20000000 , // version 0 , implementation 2
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
878
. clock_irq = 7 ,
879
880
881
882
883
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
884
. ecc_irq = 28 ,
885
886
. nvram_machine_id = 0x72 ,
. machine_id = ss20_id ,
887
888
889
890
891
. iommu_version = 0x13000000 ,
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
892
. max_mem = 0xf00000000ULL ,
893
894
. default_cpu_model = "TI SuperSparc II" ,
},
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
/* Voyager */
{
. iommu_base = 0x10000000 ,
. tcx_base = 0x50000000 ,
. slavio_base = 0x70000000 ,
. ms_kb_base = 0x71000000 ,
. serial_base = 0x71100000 ,
. nvram_base = 0x71200000 ,
. fd_base = 0x71400000 ,
. counter_base = 0x71d00000 ,
. intctl_base = 0x71e00000 ,
. idreg_base = 0x78000000 ,
. dma_base = 0x78400000 ,
. esp_base = 0x78800000 ,
. le_base = 0x78c00000 ,
. apc_base = 0x71300000 , // pmc
. aux1_base = 0x71900000 ,
. aux2_base = 0x71910000 ,
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
. clock_irq = 7 ,
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
923
924
. nvram_machine_id = 0x80 ,
. machine_id = vger_id ,
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
. iommu_version = 0x05000000 ,
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
. max_mem = 0x10000000 ,
. default_cpu_model = "Fujitsu MB86904" ,
},
/* LX */
{
. iommu_base = 0x10000000 ,
. tcx_base = 0x50000000 ,
. slavio_base = 0x70000000 ,
. ms_kb_base = 0x71000000 ,
. serial_base = 0x71100000 ,
. nvram_base = 0x71200000 ,
. fd_base = 0x71400000 ,
. counter_base = 0x71d00000 ,
. intctl_base = 0x71e00000 ,
. idreg_base = 0x78000000 ,
. dma_base = 0x78400000 ,
. esp_base = 0x78800000 ,
. le_base = 0x78c00000 ,
. aux1_base = 0x71900000 ,
. aux2_base = 0x71910000 ,
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
. clock_irq = 7 ,
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
960
961
. nvram_machine_id = 0x80 ,
. machine_id = lx_id ,
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
. iommu_version = 0x04000000 ,
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
. max_mem = 0x10000000 ,
. default_cpu_model = "TI MicroSparc I" ,
},
/* SS-4 */
{
. iommu_base = 0x10000000 ,
. tcx_base = 0x50000000 ,
. cs_base = 0x6c000000 ,
. slavio_base = 0x70000000 ,
. ms_kb_base = 0x71000000 ,
. serial_base = 0x71100000 ,
. nvram_base = 0x71200000 ,
. fd_base = 0x71400000 ,
. counter_base = 0x71d00000 ,
. intctl_base = 0x71e00000 ,
. idreg_base = 0x78000000 ,
. dma_base = 0x78400000 ,
. esp_base = 0x78800000 ,
. le_base = 0x78c00000 ,
. apc_base = 0x6a000000 ,
. aux1_base = 0x71900000 ,
. aux2_base = 0x71910000 ,
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
. clock_irq = 7 ,
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
. cs_irq = 5 ,
1000
1001
. nvram_machine_id = 0x80 ,
. machine_id = ss4_id ,
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
. iommu_version = 0x05000000 ,
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
. max_mem = 0x10000000 ,
. default_cpu_model = "Fujitsu MB86904" ,
},
/* SPARCClassic */
{
. iommu_base = 0x10000000 ,
. tcx_base = 0x50000000 ,
. slavio_base = 0x70000000 ,
. ms_kb_base = 0x71000000 ,
. serial_base = 0x71100000 ,
. nvram_base = 0x71200000 ,
. fd_base = 0x71400000 ,
. counter_base = 0x71d00000 ,
. intctl_base = 0x71e00000 ,
. idreg_base = 0x78000000 ,
. dma_base = 0x78400000 ,
. esp_base = 0x78800000 ,
. le_base = 0x78c00000 ,
. apc_base = 0x6a000000 ,
. aux1_base = 0x71900000 ,
. aux2_base = 0x71910000 ,
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
. clock_irq = 7 ,
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
1038
1039
. nvram_machine_id = 0x80 ,
. machine_id = scls_id ,
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
. iommu_version = 0x05000000 ,
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
. max_mem = 0x10000000 ,
. default_cpu_model = "TI MicroSparc I" ,
},
/* SPARCbook */
{
. iommu_base = 0x10000000 ,
. tcx_base = 0x50000000 , // XXX
. slavio_base = 0x70000000 ,
. ms_kb_base = 0x71000000 ,
. serial_base = 0x71100000 ,
. nvram_base = 0x71200000 ,
. fd_base = 0x71400000 ,
. counter_base = 0x71d00000 ,
. intctl_base = 0x71e00000 ,
. idreg_base = 0x78000000 ,
. dma_base = 0x78400000 ,
. esp_base = 0x78800000 ,
. le_base = 0x78c00000 ,
. apc_base = 0x6a000000 ,
. aux1_base = 0x71900000 ,
. aux2_base = 0x71910000 ,
. vram_size = 0x00100000 ,
. nvram_size = 0x2000 ,
. esp_irq = 18 ,
. le_irq = 16 ,
. clock_irq = 7 ,
. clock1_irq = 19 ,
. ms_kb_irq = 14 ,
. ser_irq = 15 ,
. fd_irq = 22 ,
. me_irq = 30 ,
1076
1077
. nvram_machine_id = 0x80 ,
. machine_id = sbook_id ,
1078
1079
1080
1081
1082
1083
1084
1085
. iommu_version = 0x05000000 ,
. intbit_to_level = {
2 , 3 , 5 , 7 , 9 , 11 , 0 , 14 , 3 , 5 , 7 , 9 , 11 , 13 , 12 , 12 ,
6 , 0 , 4 , 10 , 8 , 0 , 11 , 0 , 0 , 0 , 0 , 0 , 15 , 0 , 15 , 0 ,
},
. max_mem = 0x10000000 ,
. default_cpu_model = "TI MicroSparc I" ,
},
1086
1087
1088
};
/* SPARCstation 5 hardware initialisation */
1089
static void ss5_init ( ram_addr_t RAM_size ,
1090
const char * boot_device ,
1091
1092
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
1093
{
1094
sun4m_hw_init ( & sun4m_hwdefs [ 0 ], RAM_size , boot_device , kernel_filename ,
1095
kernel_cmdline , initrd_filename , cpu_model );
1096
}
1097
1098
/* SPARCstation 10 hardware initialisation */
1099
static void ss10_init ( ram_addr_t RAM_size ,
1100
const char * boot_device ,
1101
1102
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
1103
{
1104
sun4m_hw_init ( & sun4m_hwdefs [ 1 ], RAM_size , boot_device , kernel_filename ,
1105
kernel_cmdline , initrd_filename , cpu_model );
1106
1107
}
1108
/* SPARCserver 600MP hardware initialisation */
1109
static void ss600mp_init ( ram_addr_t RAM_size ,
1110
const char * boot_device ,
1111
1112
const char * kernel_filename ,
const char * kernel_cmdline ,
1113
1114
const char * initrd_filename , const char * cpu_model )
{
1115
sun4m_hw_init ( & sun4m_hwdefs [ 2 ], RAM_size , boot_device , kernel_filename ,
1116
kernel_cmdline , initrd_filename , cpu_model );
1117
1118
}
1119
/* SPARCstation 20 hardware initialisation */
1120
static void ss20_init ( ram_addr_t RAM_size ,
1121
const char * boot_device ,
1122
1123
1124
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1125
sun4m_hw_init ( & sun4m_hwdefs [ 3 ], RAM_size , boot_device , kernel_filename ,
1126
1127
1128
kernel_cmdline , initrd_filename , cpu_model );
}
1129
/* SPARCstation Voyager hardware initialisation */
1130
static void vger_init ( ram_addr_t RAM_size ,
1131
const char * boot_device ,
1132
1133
1134
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1135
sun4m_hw_init ( & sun4m_hwdefs [ 4 ], RAM_size , boot_device , kernel_filename ,
1136
1137
1138
1139
kernel_cmdline , initrd_filename , cpu_model );
}
/* SPARCstation LX hardware initialisation */
1140
static void ss_lx_init ( ram_addr_t RAM_size ,
1141
const char * boot_device ,
1142
1143
1144
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1145
sun4m_hw_init ( & sun4m_hwdefs [ 5 ], RAM_size , boot_device , kernel_filename ,
1146
1147
1148
1149
kernel_cmdline , initrd_filename , cpu_model );
}
/* SPARCstation 4 hardware initialisation */
1150
static void ss4_init ( ram_addr_t RAM_size ,
1151
const char * boot_device ,
1152
1153
1154
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1155
sun4m_hw_init ( & sun4m_hwdefs [ 6 ], RAM_size , boot_device , kernel_filename ,
1156
1157
1158
1159
kernel_cmdline , initrd_filename , cpu_model );
}
/* SPARCClassic hardware initialisation */
1160
static void scls_init ( ram_addr_t RAM_size ,
1161
const char * boot_device ,
1162
1163
1164
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1165
sun4m_hw_init ( & sun4m_hwdefs [ 7 ], RAM_size , boot_device , kernel_filename ,
1166
1167
1168
1169
kernel_cmdline , initrd_filename , cpu_model );
}
/* SPARCbook hardware initialisation */
1170
static void sbook_init ( ram_addr_t RAM_size ,
1171
const char * boot_device ,
1172
1173
1174
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1175
sun4m_hw_init ( & sun4m_hwdefs [ 8 ], RAM_size , boot_device , kernel_filename ,
1176
1177
1178
kernel_cmdline , initrd_filename , cpu_model );
}
1179
static QEMUMachine ss5_machine = {
1180
1181
1182
. name = "SS-5" ,
. desc = "Sun4m platform, SPARCstation 5" ,
. init = ss5_init ,
1183
. use_scsi = 1 ,
1184
. is_default = 1 ,
1185
};
1186
1187
static QEMUMachine ss10_machine = {
1188
1189
1190
. name = "SS-10" ,
. desc = "Sun4m platform, SPARCstation 10" ,
. init = ss10_init ,
1191
. use_scsi = 1 ,
1192
. max_cpus = 4 ,
1193
};
1194
1195
static QEMUMachine ss600mp_machine = {
1196
1197
1198
. name = "SS-600MP" ,
. desc = "Sun4m platform, SPARCserver 600MP" ,
. init = ss600mp_init ,
1199
. use_scsi = 1 ,
1200
. max_cpus = 4 ,
1201
};
1202
1203
static QEMUMachine ss20_machine = {
1204
1205
1206
. name = "SS-20" ,
. desc = "Sun4m platform, SPARCstation 20" ,
. init = ss20_init ,
1207
. use_scsi = 1 ,
1208
. max_cpus = 4 ,
1209
1210
};
1211
static QEMUMachine voyager_machine = {
1212
1213
1214
. name = "Voyager" ,
. desc = "Sun4m platform, SPARCstation Voyager" ,
. init = vger_init ,
1215
. use_scsi = 1 ,
1216
1217
};
1218
static QEMUMachine ss_lx_machine = {
1219
1220
1221
. name = "LX" ,
. desc = "Sun4m platform, SPARCstation LX" ,
. init = ss_lx_init ,
1222
. use_scsi = 1 ,
1223
1224
};
1225
static QEMUMachine ss4_machine = {
1226
1227
1228
. name = "SS-4" ,
. desc = "Sun4m platform, SPARCstation 4" ,
. init = ss4_init ,
1229
. use_scsi = 1 ,
1230
1231
};
1232
static QEMUMachine scls_machine = {
1233
1234
1235
. name = "SPARCClassic" ,
. desc = "Sun4m platform, SPARCClassic" ,
. init = scls_init ,
1236
. use_scsi = 1 ,
1237
1238
};
1239
static QEMUMachine sbook_machine = {
1240
1241
1242
. name = "SPARCbook" ,
. desc = "Sun4m platform, SPARCbook" ,
. init = sbook_init ,
1243
. use_scsi = 1 ,
1244
1245
};
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
static const struct sun4d_hwdef sun4d_hwdefs [] = {
/* SS-1000 */
{
. iounit_bases = {
0xfe0200000ULL ,
0xfe1200000ULL ,
0xfe2200000ULL ,
0xfe3200000ULL ,
- 1 ,
},
. tcx_base = 0x820000000ULL ,
. slavio_base = 0xf00000000ULL ,
. ms_kb_base = 0xf00240000ULL ,
. serial_base = 0xf00200000ULL ,
. nvram_base = 0xf00280000ULL ,
. counter_base = 0xf00300000ULL ,
. espdma_base = 0x800081000ULL ,
. esp_base = 0x800080000ULL ,
. ledma_base = 0x800040000ULL ,
. le_base = 0x800060000ULL ,
. sbi_base = 0xf02800000ULL ,
1267
. vram_size = 0x00100000 ,
1268
1269
1270
1271
1272
1273
1274
. nvram_size = 0x2000 ,
. esp_irq = 3 ,
. le_irq = 4 ,
. clock_irq = 14 ,
. clock1_irq = 10 ,
. ms_kb_irq = 12 ,
. ser_irq = 12 ,
1275
1276
. nvram_machine_id = 0x80 ,
. machine_id = ss1000_id ,
1277
. iounit_version = 0x03000000 ,
1278
. max_mem = 0xf00000000ULL ,
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
. default_cpu_model = "TI SuperSparc II" ,
},
/* SS-2000 */
{
. iounit_bases = {
0xfe0200000ULL ,
0xfe1200000ULL ,
0xfe2200000ULL ,
0xfe3200000ULL ,
0xfe4200000ULL ,
},
. tcx_base = 0x820000000ULL ,
. slavio_base = 0xf00000000ULL ,
. ms_kb_base = 0xf00240000ULL ,
. serial_base = 0xf00200000ULL ,
. nvram_base = 0xf00280000ULL ,
. counter_base = 0xf00300000ULL ,
. espdma_base = 0x800081000ULL ,
. esp_base = 0x800080000ULL ,
. ledma_base = 0x800040000ULL ,
. le_base = 0x800060000ULL ,
. sbi_base = 0xf02800000ULL ,
1301
. vram_size = 0x00100000 ,
1302
1303
1304
1305
1306
1307
1308
. nvram_size = 0x2000 ,
. esp_irq = 3 ,
. le_irq = 4 ,
. clock_irq = 14 ,
. clock1_irq = 10 ,
. ms_kb_irq = 12 ,
. ser_irq = 12 ,
1309
1310
. nvram_machine_id = 0x80 ,
. machine_id = ss2000_id ,
1311
. iounit_version = 0x03000000 ,
1312
. max_mem = 0xf00000000ULL ,
1313
1314
1315
1316
. default_cpu_model = "TI SuperSparc II" ,
},
};
1317
static void sun4d_hw_init ( const struct sun4d_hwdef * hwdef , ram_addr_t RAM_size ,
1318
const char * boot_device ,
1319
const char * kernel_filename ,
1320
1321
1322
const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1323
CPUState * envs [ MAX_CPUS ];
1324
unsigned int i ;
1325
1326
void * iounits [ MAX_IOUNITS ], * espdma , * ledma , * nvram ;
qemu_irq * cpu_irqs [ MAX_CPUS ], sbi_irq [ 32 ], sbi_cpu_irq [ MAX_CPUS ],
1327
espdma_irq , ledma_irq ;
1328
qemu_irq * esp_reset , * le_reset ;
1329
unsigned long kernel_size ;
1330
void * fw_cfg ;
1331
DeviceState * dev ;
1332
1333
1334
1335
1336
/* init CPUs */
if ( ! cpu_model )
cpu_model = hwdef -> default_cpu_model ;
1337
1338
for ( i = 0 ; i < smp_cpus ; i ++ ) {
envs [ i ] = cpu_devinit ( cpu_model , i , hwdef -> slavio_base , & cpu_irqs [ i ]);
1339
1340
1341
1342
1343
1344
}
for ( i = smp_cpus ; i < MAX_CPUS ; i ++ )
cpu_irqs [ i ] = qemu_allocate_irqs ( dummy_cpu_set_irq , NULL , MAX_PILS );
/* set up devices */
1345
1346
ram_init ( 0 , RAM_size , hwdef -> max_mem );
1347
1348
prom_init ( hwdef -> slavio_base , bios_name );
1349
1350
1351
1352
1353
1354
1355
1356
dev = sbi_init ( hwdef -> sbi_base , cpu_irqs );
for ( i = 0 ; i < 32 ; i ++ ) {
sbi_irq [ i ] = qdev_get_gpio_in ( dev , i );
}
for ( i = 0 ; i < MAX_CPUS ; i ++ ) {
sbi_cpu_irq [ i ] = qdev_get_gpio_in ( dev , 32 + i );
}
1357
1358
1359
for ( i = 0 ; i < MAX_IOUNITS ; i ++ )
if ( hwdef -> iounit_bases [ i ] != ( target_phys_addr_t ) - 1 )
1360
1361
1362
iounits [ i ] = iommu_init ( hwdef -> iounit_bases [ i ],
hwdef -> iounit_version ,
sbi_irq [ hwdef -> me_irq ]);
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
espdma = sparc32_dma_init ( hwdef -> espdma_base , sbi_irq [ hwdef -> esp_irq ],
iounits [ 0 ], & espdma_irq , & esp_reset );
ledma = sparc32_dma_init ( hwdef -> ledma_base , sbi_irq [ hwdef -> le_irq ],
iounits [ 0 ], & ledma_irq , & le_reset );
if ( graphic_depth != 8 && graphic_depth != 24 ) {
fprintf ( stderr , "qemu: Unsupported depth: %d \n " , graphic_depth );
exit ( 1 );
}
1374
1375
tcx_init ( hwdef -> tcx_base , hwdef -> vram_size , graphic_width , graphic_height ,
graphic_depth );
1376
1377
lance_init ( & nd_table [ 0 ], hwdef -> le_base , ledma , ledma_irq , le_reset );
1378
1379
1380
1381
1382
1383
1384
1385
nvram = m48t59_init ( sbi_irq [ 0 ], hwdef -> nvram_base , 0 ,
hwdef -> nvram_size , 8 );
slavio_timer_init_all ( hwdef -> counter_base , sbi_irq [ hwdef -> clock1_irq ],
sbi_cpu_irq , smp_cpus );
slavio_serial_ms_kbd_init ( hwdef -> ms_kb_base , sbi_irq [ hwdef -> ms_kb_irq ],
1386
display_type == DT_NOGRAPHIC , ESCC_CLOCK , 1 );
1387
1388
// Slavio TTYA ( base + 4 , Linux ttyS0 ) is the first Qemu serial device
// Slavio TTYB ( base + 0 , Linux ttyS1 ) is the second Qemu serial device
1389
1390
escc_init ( hwdef -> serial_base , sbi_irq [ hwdef -> ser_irq ], sbi_irq [ hwdef -> ser_irq ],
serial_hds [ 0 ], serial_hds [ 1 ], ESCC_CLOCK , 1 );
1391
1392
1393
1394
1395
1396
if ( drive_get_max_bus ( IF_SCSI ) > 0 ) {
fprintf ( stderr , "qemu: too many SCSI bus \n " );
exit ( 1 );
}
1397
1398
esp_init ( hwdef -> esp_base , 2 ,
espdma_memory_read , espdma_memory_write ,
1399
espdma , espdma_irq , esp_reset );
1400
1401
1402
kernel_size = sun4m_load_kernel ( kernel_filename , initrd_filename ,
RAM_size );
1403
1404
1405
nvram_init ( nvram , ( uint8_t * ) & nd_table [ 0 ]. macaddr , kernel_cmdline ,
boot_device , RAM_size , kernel_size , graphic_width ,
1406
1407
graphic_height , graphic_depth , hwdef -> nvram_machine_id ,
"Sun4d" );
1408
1409
1410
fw_cfg = fw_cfg_init ( 0 , 0 , CFG_ADDR , CFG_ADDR + 2 );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_ID , 1 );
1411
1412
fw_cfg_add_i64 ( fw_cfg , FW_CFG_RAM_SIZE , ( uint64_t ) ram_size );
fw_cfg_add_i16 ( fw_cfg , FW_CFG_MACHINE_ID , hwdef -> machine_id );
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
fw_cfg_add_i16 ( fw_cfg , FW_CFG_SUN4M_DEPTH , graphic_depth );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_ADDR , KERNEL_LOAD_ADDR );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_SIZE , kernel_size );
if ( kernel_cmdline ) {
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_CMDLINE , CMDLINE_ADDR );
pstrcpy_targphys ( CMDLINE_ADDR , TARGET_PAGE_SIZE , kernel_cmdline );
} else {
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_CMDLINE , 0 );
}
fw_cfg_add_i32 ( fw_cfg , FW_CFG_INITRD_ADDR , INITRD_LOAD_ADDR );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_INITRD_SIZE , 0 ); // not used
fw_cfg_add_i16 ( fw_cfg , FW_CFG_BOOT_DEVICE , boot_device [ 0 ]);
qemu_register_boot_set ( fw_cfg_boot_set , fw_cfg );
1426
1427
1428
}
/* SPARCserver 1000 hardware initialisation */
1429
static void ss1000_init ( ram_addr_t RAM_size ,
1430
const char * boot_device ,
1431
1432
1433
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1434
sun4d_hw_init ( & sun4d_hwdefs [ 0 ], RAM_size , boot_device , kernel_filename ,
1435
1436
1437
1438
kernel_cmdline , initrd_filename , cpu_model );
}
/* SPARCcenter 2000 hardware initialisation */
1439
static void ss2000_init ( ram_addr_t RAM_size ,
1440
const char * boot_device ,
1441
1442
1443
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1444
sun4d_hw_init ( & sun4d_hwdefs [ 1 ], RAM_size , boot_device , kernel_filename ,
1445
1446
1447
kernel_cmdline , initrd_filename , cpu_model );
}
1448
static QEMUMachine ss1000_machine = {
1449
1450
1451
. name = "SS-1000" ,
. desc = "Sun4d platform, SPARCserver 1000" ,
. init = ss1000_init ,
1452
. use_scsi = 1 ,
1453
. max_cpus = 8 ,
1454
1455
};
1456
static QEMUMachine ss2000_machine = {
1457
1458
1459
. name = "SS-2000" ,
. desc = "Sun4d platform, SPARCcenter 2000" ,
. init = ss2000_init ,
1460
. use_scsi = 1 ,
1461
. max_cpus = 20 ,
1462
};
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
static const struct sun4c_hwdef sun4c_hwdefs [] = {
/* SS-2 */
{
. iommu_base = 0xf8000000 ,
. tcx_base = 0xfe000000 ,
. slavio_base = 0xf6000000 ,
. intctl_base = 0xf5000000 ,
. counter_base = 0xf3000000 ,
. ms_kb_base = 0xf0000000 ,
. serial_base = 0xf1000000 ,
. nvram_base = 0xf2000000 ,
. fd_base = 0xf7200000 ,
. dma_base = 0xf8400000 ,
. esp_base = 0xf8800000 ,
. le_base = 0xf8c00000 ,
. aux1_base = 0xf7400003 ,
. vram_size = 0x00100000 ,
. nvram_size = 0x800 ,
. esp_irq = 2 ,
. le_irq = 3 ,
. clock_irq = 5 ,
. clock1_irq = 7 ,
. ms_kb_irq = 1 ,
. ser_irq = 1 ,
. fd_irq = 1 ,
. me_irq = 1 ,
. nvram_machine_id = 0x55 ,
. machine_id = ss2_id ,
. max_mem = 0x10000000 ,
. default_cpu_model = "Cypress CY7C601" ,
},
};
static void sun4c_hw_init ( const struct sun4c_hwdef * hwdef , ram_addr_t RAM_size ,
const char * boot_device ,
1499
const char * kernel_filename ,
1500
1501
1502
1503
const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
CPUState * env ;
1504
void * iommu , * espdma , * ledma , * nvram ;
1505
qemu_irq * cpu_irqs , slavio_irq [ 8 ], espdma_irq , ledma_irq ;
1506
qemu_irq * esp_reset , * le_reset ;
1507
qemu_irq fdc_tc ;
1508
unsigned long kernel_size ;
1509
1510
BlockDriverState * fd [ MAX_FD ];
void * fw_cfg ;
1511
1512
DeviceState * dev ;
unsigned int i ;
1513
DriveInfo * dinfo ;
1514
1515
1516
1517
1518
/* init CPU */
if ( ! cpu_model )
cpu_model = hwdef -> default_cpu_model ;
1519
env = cpu_devinit ( cpu_model , 0 , hwdef -> slavio_base , & cpu_irqs );
1520
1521
/* set up devices */
1522
1523
ram_init ( 0 , RAM_size , hwdef -> max_mem );
1524
1525
prom_init ( hwdef -> slavio_base , bios_name );
1526
1527
1528
1529
1530
dev = sun4c_intctl_init ( hwdef -> intctl_base , cpu_irqs );
for ( i = 0 ; i < 8 ; i ++ ) {
slavio_irq [ i ] = qdev_get_gpio_in ( dev , i );
}
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
iommu = iommu_init ( hwdef -> iommu_base , hwdef -> iommu_version ,
slavio_irq [ hwdef -> me_irq ]);
espdma = sparc32_dma_init ( hwdef -> dma_base , slavio_irq [ hwdef -> esp_irq ],
iommu , & espdma_irq , & esp_reset );
ledma = sparc32_dma_init ( hwdef -> dma_base + 16ULL ,
slavio_irq [ hwdef -> le_irq ], iommu , & ledma_irq ,
& le_reset );
if ( graphic_depth != 8 && graphic_depth != 24 ) {
fprintf ( stderr , "qemu: Unsupported depth: %d \n " , graphic_depth );
exit ( 1 );
}
1546
1547
tcx_init ( hwdef -> tcx_base , hwdef -> vram_size , graphic_width , graphic_height ,
graphic_depth );
1548
1549
lance_init ( & nd_table [ 0 ], hwdef -> le_base , ledma , ledma_irq , le_reset );
1550
1551
1552
1553
1554
nvram = m48t59_init ( slavio_irq [ 0 ], hwdef -> nvram_base , 0 ,
hwdef -> nvram_size , 2 );
slavio_serial_ms_kbd_init ( hwdef -> ms_kb_base , slavio_irq [ hwdef -> ms_kb_irq ],
1555
display_type == DT_NOGRAPHIC , ESCC_CLOCK , 1 );
1556
1557
// Slavio TTYA ( base + 4 , Linux ttyS0 ) is the first Qemu serial device
// Slavio TTYB ( base + 0 , Linux ttyS1 ) is the second Qemu serial device
1558
1559
1560
escc_init ( hwdef -> serial_base , slavio_irq [ hwdef -> ser_irq ],
slavio_irq [ hwdef -> ser_irq ], serial_hds [ 0 ], serial_hds [ 1 ],
ESCC_CLOCK , 1 );
1561
1562
1563
slavio_misc = slavio_misc_init ( 0 , hwdef -> aux1_base , 0 ,
slavio_irq [ hwdef -> me_irq ], fdc_tc );
1564
1565
1566
if ( hwdef -> fd_base != ( target_phys_addr_t ) - 1 ) {
/* there is zero or one floppy drive */
1567
memset ( fd , 0 , sizeof ( fd ));
1568
1569
1570
dinfo = drive_get ( IF_FLOPPY , 0 , 0 );
if ( dinfo )
fd [ 0 ] = dinfo -> bdrv ;
1571
1572
sun4m_fdctrl_init ( slavio_irq [ hwdef -> fd_irq ], hwdef -> fd_base , fd ,
1573
& fdc_tc );
1574
1575
1576
1577
1578
1579
1580
}
if ( drive_get_max_bus ( IF_SCSI ) > 0 ) {
fprintf ( stderr , "qemu: too many SCSI bus \n " );
exit ( 1 );
}
1581
1582
esp_init ( hwdef -> esp_base , 2 ,
espdma_memory_read , espdma_memory_write ,
1583
espdma , espdma_irq , esp_reset );
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
kernel_size = sun4m_load_kernel ( kernel_filename , initrd_filename ,
RAM_size );
nvram_init ( nvram , ( uint8_t * ) & nd_table [ 0 ]. macaddr , kernel_cmdline ,
boot_device , RAM_size , kernel_size , graphic_width ,
graphic_height , graphic_depth , hwdef -> nvram_machine_id ,
"Sun4c" );
fw_cfg = fw_cfg_init ( 0 , 0 , CFG_ADDR , CFG_ADDR + 2 );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_ID , 1 );
fw_cfg_add_i64 ( fw_cfg , FW_CFG_RAM_SIZE , ( uint64_t ) ram_size );
fw_cfg_add_i16 ( fw_cfg , FW_CFG_MACHINE_ID , hwdef -> machine_id );
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
fw_cfg_add_i16 ( fw_cfg , FW_CFG_SUN4M_DEPTH , graphic_depth );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_ADDR , KERNEL_LOAD_ADDR );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_SIZE , kernel_size );
if ( kernel_cmdline ) {
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_CMDLINE , CMDLINE_ADDR );
pstrcpy_targphys ( CMDLINE_ADDR , TARGET_PAGE_SIZE , kernel_cmdline );
} else {
fw_cfg_add_i32 ( fw_cfg , FW_CFG_KERNEL_CMDLINE , 0 );
}
fw_cfg_add_i32 ( fw_cfg , FW_CFG_INITRD_ADDR , INITRD_LOAD_ADDR );
fw_cfg_add_i32 ( fw_cfg , FW_CFG_INITRD_SIZE , 0 ); // not used
fw_cfg_add_i16 ( fw_cfg , FW_CFG_BOOT_DEVICE , boot_device [ 0 ]);
qemu_register_boot_set ( fw_cfg_boot_set , fw_cfg );
1610
1611
1612
}
/* SPARCstation 2 hardware initialisation */
1613
static void ss2_init ( ram_addr_t RAM_size ,
1614
const char * boot_device ,
1615
1616
1617
const char * kernel_filename , const char * kernel_cmdline ,
const char * initrd_filename , const char * cpu_model )
{
1618
sun4c_hw_init ( & sun4c_hwdefs [ 0 ], RAM_size , boot_device , kernel_filename ,
1619
1620
1621
kernel_cmdline , initrd_filename , cpu_model );
}
1622
static QEMUMachine ss2_machine = {
1623
1624
1625
1626
1627
. name = "SS-2" ,
. desc = "Sun4c platform, SPARCstation 2" ,
. init = ss2_init ,
. use_scsi = 1 ,
};
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
static void ss2_machine_init ( void )
{
qemu_register_machine ( & ss5_machine );
qemu_register_machine ( & ss10_machine );
qemu_register_machine ( & ss600mp_machine );
qemu_register_machine ( & ss20_machine );
qemu_register_machine ( & voyager_machine );
qemu_register_machine ( & ss_lx_machine );
qemu_register_machine ( & ss4_machine );
qemu_register_machine ( & scls_machine );
qemu_register_machine ( & sbook_machine );
qemu_register_machine ( & ss1000_machine );
qemu_register_machine ( & ss2000_machine );
qemu_register_machine ( & ss2_machine );
}
machine_init ( ss2_machine_init );