Home | History | Annotate | Line # | Download | only in sh3
sh_arch.cpp revision 1.1.2.2
      1  1.1.2.2  bouyer /*	$NetBSD: sh_arch.cpp,v 1.1.2.2 2001/02/11 19:10:12 bouyer Exp $	*/
      2  1.1.2.2  bouyer 
      3  1.1.2.2  bouyer /*-
      4  1.1.2.2  bouyer  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5  1.1.2.2  bouyer  * All rights reserved.
      6  1.1.2.2  bouyer  *
      7  1.1.2.2  bouyer  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1.2.2  bouyer  * by UCHIYAMA Yasushi.
      9  1.1.2.2  bouyer  *
     10  1.1.2.2  bouyer  * Redistribution and use in source and binary forms, with or without
     11  1.1.2.2  bouyer  * modification, are permitted provided that the following conditions
     12  1.1.2.2  bouyer  * are met:
     13  1.1.2.2  bouyer  * 1. Redistributions of source code must retain the above copyright
     14  1.1.2.2  bouyer  *    notice, this list of conditions and the following disclaimer.
     15  1.1.2.2  bouyer  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1.2.2  bouyer  *    notice, this list of conditions and the following disclaimer in the
     17  1.1.2.2  bouyer  *    documentation and/or other materials provided with the distribution.
     18  1.1.2.2  bouyer  * 3. All advertising materials mentioning features or use of this software
     19  1.1.2.2  bouyer  *    must display the following acknowledgement:
     20  1.1.2.2  bouyer  *        This product includes software developed by the NetBSD
     21  1.1.2.2  bouyer  *        Foundation, Inc. and its contributors.
     22  1.1.2.2  bouyer  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  1.1.2.2  bouyer  *    contributors may be used to endorse or promote products derived
     24  1.1.2.2  bouyer  *    from this software without specific prior written permission.
     25  1.1.2.2  bouyer  *
     26  1.1.2.2  bouyer  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  1.1.2.2  bouyer  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  1.1.2.2  bouyer  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  1.1.2.2  bouyer  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.1.2.2  bouyer  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  1.1.2.2  bouyer  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  1.1.2.2  bouyer  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  1.1.2.2  bouyer  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  1.1.2.2  bouyer  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  1.1.2.2  bouyer  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  1.1.2.2  bouyer  * POSSIBILITY OF SUCH DAMAGE.
     37  1.1.2.2  bouyer  */
     38  1.1.2.2  bouyer 
     39  1.1.2.2  bouyer #include <sh3/sh_arch.h>
     40  1.1.2.2  bouyer #include "scifreg.h"
     41  1.1.2.2  bouyer 
     42  1.1.2.2  bouyer struct SHArchitecture::intr_priority SHArchitecture::ipr_table[] = {
     43  1.1.2.2  bouyer 	{ "TMU0",	ICU_IPRA_REG16, 12 },
     44  1.1.2.2  bouyer 	{ "TMU1",	ICU_IPRA_REG16,  8 },
     45  1.1.2.2  bouyer 	{ "TMU2",	ICU_IPRA_REG16,  4 },
     46  1.1.2.2  bouyer 	{ "RTC",	ICU_IPRA_REG16,  0 },
     47  1.1.2.2  bouyer 	{ "WDT",	ICU_IPRB_REG16, 12 },
     48  1.1.2.2  bouyer 	{ "REF",	ICU_IPRB_REG16,  8 },
     49  1.1.2.2  bouyer 	{ "SCI",	ICU_IPRB_REG16,  4 },
     50  1.1.2.2  bouyer 	{ "reserve",	ICU_IPRB_REG16,  0 },
     51  1.1.2.2  bouyer 	{ "IRQ3",	ICU_IPRC_REG16, 12 },
     52  1.1.2.2  bouyer 	{ "IRQ2",	ICU_IPRC_REG16,  8 },
     53  1.1.2.2  bouyer 	{ "IRQ1",	ICU_IPRC_REG16,  4 },
     54  1.1.2.2  bouyer 	{ "IRQ0",	ICU_IPRC_REG16,  0 },
     55  1.1.2.2  bouyer 	{ "PINT0-7",	ICU_IPRD_REG16, 12 },
     56  1.1.2.2  bouyer 	{ "PINT8-15",	ICU_IPRD_REG16,  8 },
     57  1.1.2.2  bouyer 	{ "IRQ5",	ICU_IPRD_REG16,  4 },
     58  1.1.2.2  bouyer 	{ "IRQ4",	ICU_IPRD_REG16,  0 },
     59  1.1.2.2  bouyer 	{ "DMAC",	ICU_IPRE_REG16, 12 },
     60  1.1.2.2  bouyer 	{ "IrDA",	ICU_IPRE_REG16,  8 },
     61  1.1.2.2  bouyer 	{ "SCIF",	ICU_IPRE_REG16,  4 },
     62  1.1.2.2  bouyer 	{ "ADC",	ICU_IPRE_REG16,  0 },
     63  1.1.2.2  bouyer 	{ 0, 0, 0} /* terminator */
     64  1.1.2.2  bouyer };
     65  1.1.2.2  bouyer 
     66  1.1.2.2  bouyer BOOL
     67  1.1.2.2  bouyer SHArchitecture::init(void)
     68  1.1.2.2  bouyer {
     69  1.1.2.2  bouyer 	if (!_mem->init()) {
     70  1.1.2.2  bouyer 		DPRINTF((TEXT("can't initialize memory manager.\n")));
     71  1.1.2.2  bouyer 		return FALSE;
     72  1.1.2.2  bouyer 	}
     73  1.1.2.2  bouyer 	// set D-RAM information
     74  1.1.2.2  bouyer 	_mem->loadBank(DRAM_BANK0_START, DRAM_BANK_SIZE);
     75  1.1.2.2  bouyer 	_mem->loadBank(DRAM_BANK1_START, DRAM_BANK_SIZE);
     76  1.1.2.2  bouyer 
     77  1.1.2.2  bouyer 	return TRUE;
     78  1.1.2.2  bouyer }
     79  1.1.2.2  bouyer 
     80  1.1.2.2  bouyer BOOL
     81  1.1.2.2  bouyer SHArchitecture::setupLoader()
     82  1.1.2.2  bouyer {
     83  1.1.2.2  bouyer 	vaddr_t v;
     84  1.1.2.2  bouyer 
     85  1.1.2.2  bouyer 	if (!_mem->getPage(v , _loader_addr)) {
     86  1.1.2.2  bouyer 		DPRINTF((TEXT("can't get page for 2nd loader.\n")));
     87  1.1.2.2  bouyer 		return FALSE;
     88  1.1.2.2  bouyer 	}
     89  1.1.2.2  bouyer 	DPRINTF((TEXT("2nd bootloader vaddr=0x%08x paddr=0x%08x\n"),
     90  1.1.2.2  bouyer 		 (unsigned)v,(unsigned)_loader_addr));
     91  1.1.2.2  bouyer 
     92  1.1.2.2  bouyer 	memcpy(LPVOID(v), LPVOID(_boot_func), _mem->getPageSize());
     93  1.1.2.2  bouyer 	DPRINTF((TEXT("2nd bootloader copy done.\n")));
     94  1.1.2.2  bouyer 
     95  1.1.2.2  bouyer 	return TRUE;
     96  1.1.2.2  bouyer }
     97  1.1.2.2  bouyer 
     98  1.1.2.2  bouyer void
     99  1.1.2.2  bouyer SHArchitecture::jump(paddr_t info, paddr_t pvec)
    100  1.1.2.2  bouyer {
    101  1.1.2.2  bouyer 	kaddr_t sp;
    102  1.1.2.2  bouyer 	vaddr_t v;
    103  1.1.2.2  bouyer 	paddr_t p;
    104  1.1.2.2  bouyer 
    105  1.1.2.2  bouyer 	// stack for bootloader
    106  1.1.2.2  bouyer 	_mem->getPage(v, p);
    107  1.1.2.2  bouyer 	sp = ptokv(p + _mem->getPageSize() / 2);
    108  1.1.2.2  bouyer 
    109  1.1.2.2  bouyer 	info = ptokv(info);
    110  1.1.2.2  bouyer 	pvec = ptokv(pvec);
    111  1.1.2.2  bouyer 	_loader_addr = ptokv(_loader_addr);
    112  1.1.2.2  bouyer 	DPRINTF((TEXT("BootArgs 0x%08x Stack 0x%08x\nBooting kernel...\n"),
    113  1.1.2.2  bouyer 		 info, sp));
    114  1.1.2.2  bouyer 
    115  1.1.2.2  bouyer 	// Change to privilege-mode.
    116  1.1.2.2  bouyer 	SetKMode(1);
    117  1.1.2.2  bouyer 
    118  1.1.2.2  bouyer 	// Disable external interrupt.
    119  1.1.2.2  bouyer 	suspendIntr();
    120  1.1.2.2  bouyer 
    121  1.1.2.2  bouyer 	// Cache flush(for 2nd bootloader)
    122  1.1.2.2  bouyer 	cache_flush();
    123  1.1.2.2  bouyer 
    124  1.1.2.2  bouyer 	// jump to 2nd loader.(run P1) at this time I still use MMU.
    125  1.1.2.2  bouyer 	__asm("mov	r6, r15\n"
    126  1.1.2.2  bouyer 	      "jmp	@r7\n"
    127  1.1.2.2  bouyer 	      "nop\n", info, pvec, sp, _loader_addr);
    128  1.1.2.2  bouyer 	// NOTREACHED
    129  1.1.2.2  bouyer }
    130  1.1.2.2  bouyer 
    131  1.1.2.2  bouyer // disable external interrupt and save its priority.
    132  1.1.2.2  bouyer u_int32_t
    133  1.1.2.2  bouyer suspendIntr(void)
    134  1.1.2.2  bouyer {
    135  1.1.2.2  bouyer 	u_int32_t sr;
    136  1.1.2.2  bouyer 	__asm("stc	sr, r0\n"
    137  1.1.2.2  bouyer 	      "mov.l	r0, @r4\n"
    138  1.1.2.2  bouyer 	      "or	r5, r0\n"
    139  1.1.2.2  bouyer 	      "ldc	r0, sr\n", &sr, 0x000000f0);
    140  1.1.2.2  bouyer 	return sr & 0x000000f0;
    141  1.1.2.2  bouyer }
    142  1.1.2.2  bouyer 
    143  1.1.2.2  bouyer // resume external interrupt priority.
    144  1.1.2.2  bouyer void
    145  1.1.2.2  bouyer resumeIntr(u_int32_t s)
    146  1.1.2.2  bouyer {
    147  1.1.2.2  bouyer 	__asm("stc	sr, r0\n"
    148  1.1.2.2  bouyer 	      "and	r5, r0\n"
    149  1.1.2.2  bouyer 	      "or	r4, r0\n"
    150  1.1.2.2  bouyer 	      "ldc	r0, sr\n", s, 0xffffff0f);
    151  1.1.2.2  bouyer }
    152  1.1.2.2  bouyer 
    153  1.1.2.2  bouyer void
    154  1.1.2.2  bouyer SHArchitecture::print_stack_pointer(void)
    155  1.1.2.2  bouyer {
    156  1.1.2.2  bouyer 	int sp;
    157  1.1.2.2  bouyer 	__asm("mov.l	r15, @r4", &sp);
    158  1.1.2.2  bouyer 	DPRINTF((TEXT("SP 0x%08x\n"), sp));
    159  1.1.2.2  bouyer }
    160  1.1.2.2  bouyer 
    161  1.1.2.2  bouyer void
    162  1.1.2.2  bouyer SHArchitecture::systemInfo()
    163  1.1.2.2  bouyer {
    164  1.1.2.2  bouyer 	u_int32_t reg;
    165  1.1.2.2  bouyer 
    166  1.1.2.2  bouyer 	Architecture::systemInfo();
    167  1.1.2.2  bouyer 
    168  1.1.2.2  bouyer 	_kmode = SetKMode(1);
    169  1.1.2.2  bouyer 
    170  1.1.2.2  bouyer 	// Cache
    171  1.1.2.2  bouyer 	reg = VOLATILE_REF(CCR);
    172  1.1.2.2  bouyer 	DPRINTF((TEXT("Cache ")));
    173  1.1.2.2  bouyer 	if (reg & CCR_CE)
    174  1.1.2.2  bouyer 		DPRINTF((TEXT("Enabled. %s-mode, P0/U0/P3 Write-%s, P1 Write-%s\n"),
    175  1.1.2.2  bouyer 			 reg & CCR_RA ? TEXT("RAM") : TEXT("normal"),
    176  1.1.2.2  bouyer 			 reg & CCR_WT ? TEXT("Through") : TEXT("Back"),
    177  1.1.2.2  bouyer 			 reg & CCR_CB ? TEXT("Back") : TEXT("Through")));
    178  1.1.2.2  bouyer 	else
    179  1.1.2.2  bouyer 		DPRINTF((TEXT("Disabled.\n")));
    180  1.1.2.2  bouyer 
    181  1.1.2.2  bouyer 	// MMU
    182  1.1.2.2  bouyer 	reg = VOLATILE_REF(MMUCR);
    183  1.1.2.2  bouyer 	DPRINTF((TEXT("MMU ")));
    184  1.1.2.2  bouyer 	if (reg & MMUCR_AT)
    185  1.1.2.2  bouyer 		DPRINTF((TEXT("Enabled. %s index-mode, %s virtual storage mode\n"),
    186  1.1.2.2  bouyer 			 reg & MMUCR_IX
    187  1.1.2.2  bouyer 			 ? TEXT("ASID + VPN") : TEXT("VPN only"),
    188  1.1.2.2  bouyer 			 reg & MMUCR_SV ? TEXT("single") : TEXT("multiple")));
    189  1.1.2.2  bouyer 	else
    190  1.1.2.2  bouyer 		DPRINTF((TEXT("Disabled.\n")));
    191  1.1.2.2  bouyer 
    192  1.1.2.2  bouyer 	// Status register
    193  1.1.2.2  bouyer 	reg = 0;
    194  1.1.2.2  bouyer 	__asm("stc	sr, r0\n"
    195  1.1.2.2  bouyer 	      "mov.l	r0, @r4", &reg);
    196  1.1.2.2  bouyer 	DPRINTF((TEXT("SR 0x%08x\n"), reg));
    197  1.1.2.2  bouyer 
    198  1.1.2.2  bouyer 	// SCIF
    199  1.1.2.2  bouyer 	scif_dump(19200);
    200  1.1.2.2  bouyer 
    201  1.1.2.2  bouyer 	// ICU
    202  1.1.2.2  bouyer 	print_stack_pointer();
    203  1.1.2.2  bouyer 	icu_dump();
    204  1.1.2.2  bouyer 
    205  1.1.2.2  bouyer #if 0	// Frame Buffer (this test is destructive.)
    206  1.1.2.2  bouyer 	hd64461_framebuffer_test();
    207  1.1.2.2  bouyer #endif
    208  1.1.2.2  bouyer 
    209  1.1.2.2  bouyer 	SetKMode(_kmode);
    210  1.1.2.2  bouyer }
    211  1.1.2.2  bouyer 
    212  1.1.2.2  bouyer void
    213  1.1.2.2  bouyer SHArchitecture::icu_dump(void)
    214  1.1.2.2  bouyer {
    215  1.1.2.2  bouyer 	print_stack_pointer();
    216  1.1.2.2  bouyer 
    217  1.1.2.2  bouyer 	DPRINTF((TEXT("ICR0   0x%08x\n"), reg_read16(ICU_ICR0_REG16)));
    218  1.1.2.2  bouyer 	DPRINTF((TEXT("ICR1   0x%08x\n"), reg_read16(ICU_ICR1_REG16)));
    219  1.1.2.2  bouyer 	DPRINTF((TEXT("ICR2   0x%08x\n"), reg_read16(ICU_ICR2_REG16)));
    220  1.1.2.2  bouyer 	DPRINTF((TEXT("PINTER 0x%08x\n"), reg_read16(ICU_PINTER_REG16)));
    221  1.1.2.2  bouyer 	DPRINTF((TEXT("IPRA   0x%08x\n"), reg_read16(ICU_IPRA_REG16)));
    222  1.1.2.2  bouyer 	DPRINTF((TEXT("IPRB   0x%08x\n"), reg_read16(ICU_IPRB_REG16)));
    223  1.1.2.2  bouyer 	DPRINTF((TEXT("IPRC   0x%08x\n"), reg_read16(ICU_IPRC_REG16)));
    224  1.1.2.2  bouyer 	DPRINTF((TEXT("IPRD   0x%08x\n"), reg_read16(ICU_IPRD_REG16)));
    225  1.1.2.2  bouyer 	DPRINTF((TEXT("IPRE   0x%08x\n"), reg_read16(ICU_IPRE_REG16)));
    226  1.1.2.2  bouyer 	DPRINTF((TEXT("IRR0   0x%08x\n"), reg_read8(ICU_IRR0_REG8)));
    227  1.1.2.2  bouyer 	DPRINTF((TEXT("IRR1   0x%08x\n"), reg_read8(ICU_IRR1_REG8)));
    228  1.1.2.2  bouyer 	DPRINTF((TEXT("IRR2   0x%08x\n"), reg_read8(ICU_IRR2_REG8)));
    229  1.1.2.2  bouyer 	icu_control();
    230  1.1.2.2  bouyer 	icu_priority();
    231  1.1.2.2  bouyer }
    232  1.1.2.2  bouyer 
    233  1.1.2.2  bouyer void
    234  1.1.2.2  bouyer SHArchitecture::icu_priority(void)
    235  1.1.2.2  bouyer {
    236  1.1.2.2  bouyer 	struct intr_priority *tab;
    237  1.1.2.2  bouyer 	DPRINTF((TEXT("----interrupt priority----\n")));
    238  1.1.2.2  bouyer 	for (tab = ipr_table; tab->name; tab++) {
    239  1.1.2.2  bouyer 		DPRINTF((TEXT("%-10S %d\n"), tab->name,
    240  1.1.2.2  bouyer 			 (reg_read16(tab->reg) >> tab->shift) & ICU_IPR_MASK));
    241  1.1.2.2  bouyer 	}
    242  1.1.2.2  bouyer 	DPRINTF((TEXT("--------------------------\n")));
    243  1.1.2.2  bouyer }
    244  1.1.2.2  bouyer 
    245  1.1.2.2  bouyer void
    246  1.1.2.2  bouyer SHArchitecture::icu_control(void)
    247  1.1.2.2  bouyer {
    248  1.1.2.2  bouyer 	const char *sense_select[] = {
    249  1.1.2.2  bouyer 		"falling edge",
    250  1.1.2.2  bouyer 		"raising edge",
    251  1.1.2.2  bouyer 		"low level",
    252  1.1.2.2  bouyer 		"reserved",
    253  1.1.2.2  bouyer 	};
    254  1.1.2.2  bouyer 	u_int16_t r;
    255  1.1.2.2  bouyer 	// PINT0-15
    256  1.1.2.2  bouyer 	DPRINTF((TEXT("PINT enable(on |)  :")));
    257  1.1.2.2  bouyer 	bitdisp(reg_read16(ICU_PINTER_REG16));
    258  1.1.2.2  bouyer 	DPRINTF((TEXT("PINT detect(high |):")));
    259  1.1.2.2  bouyer 	bitdisp(reg_read16(ICU_ICR2_REG16));
    260  1.1.2.2  bouyer 	// NMI
    261  1.1.2.2  bouyer 	r = reg_read16(ICU_ICR0_REG16);
    262  1.1.2.2  bouyer 	DPRINTF((TEXT("NMI(%S %S-edge),"),
    263  1.1.2.2  bouyer 		 r & ICU_ICR0_NMIL ? "High" : "Low",
    264  1.1.2.2  bouyer 		 r & ICU_ICR0_NMIE ? "raising" : "falling"));
    265  1.1.2.2  bouyer 	r = reg_read16(ICU_ICR1_REG16);
    266  1.1.2.2  bouyer 	DPRINTF((TEXT(" %S maskable,"), r & ICU_ICR1_MAI ? "" : "never"));
    267  1.1.2.2  bouyer 	DPRINTF((TEXT("  SR.BL %S\n"),
    268  1.1.2.2  bouyer 		 r & ICU_ICR1_BLMSK ? "ignored" : "maskable"));
    269  1.1.2.2  bouyer 	// IRQ0-5
    270  1.1.2.2  bouyer 	DPRINTF((TEXT("IRQ[3:0] : %S source\n"),
    271  1.1.2.2  bouyer 		 r & ICU_ICR1_IRQLVL ? "IRL 15level" :
    272  1.1.2.2  bouyer 		 "dependent IRQ[0:3](IRL disabled)"));
    273  1.1.2.2  bouyer 	if (r & ICU_ICR1_IRQLVL) {
    274  1.1.2.2  bouyer 		DPRINTF((TEXT("IRLS[0:3] %S\n"),
    275  1.1.2.2  bouyer 			 r & ICU_ICR1_IRLSEN ? "enabled" : "disabled"));
    276  1.1.2.2  bouyer 	}
    277  1.1.2.2  bouyer 	// sense select
    278  1.1.2.2  bouyer 	for (int i = 5; i >= 0; i--) {
    279  1.1.2.2  bouyer 		DPRINTF((TEXT("IRQ[%d] %S\n"), i,
    280  1.1.2.2  bouyer 			 sense_select [
    281  1.1.2.2  bouyer 				 (r >>(i * 2)) & ICU_SENSE_SELECT_MASK]));
    282  1.1.2.2  bouyer 	}
    283  1.1.2.2  bouyer }
    284  1.1.2.2  bouyer 
    285  1.1.2.2  bouyer SH_BOOT_FUNC_(7709);
    286  1.1.2.2  bouyer SH_BOOT_FUNC_(7709A);
    287  1.1.2.2  bouyer 
    288  1.1.2.2  bouyer //
    289  1.1.2.2  bouyer // Debug Functions.
    290  1.1.2.2  bouyer //
    291  1.1.2.2  bouyer void
    292  1.1.2.2  bouyer SHArchitecture::scif_dump(int bps)
    293  1.1.2.2  bouyer {
    294  1.1.2.2  bouyer 	u_int16_t r16;
    295  1.1.2.2  bouyer 	u_int8_t r8;
    296  1.1.2.2  bouyer 	int n;
    297  1.1.2.2  bouyer 
    298  1.1.2.2  bouyer 	/* mode */
    299  1.1.2.2  bouyer 	r8 = SHREG_SCSMR2;
    300  1.1.2.2  bouyer 	n = 1 <<((r8 & SCSMR2_CKS) << 1);
    301  1.1.2.2  bouyer 	DPRINTF((TEXT("mode: %dbit %S-parity %d stop bit clock PCLOCK/%d\n"),
    302  1.1.2.2  bouyer 		 r8 & SCSMR2_CHR ? 7 : 8,
    303  1.1.2.2  bouyer 		 r8 & SCSMR2_PE	? r8 & SCSMR2_OE ? "odd" : "even" : "non",
    304  1.1.2.2  bouyer 		 r8 & SCSMR2_STOP ? 2 : 1,
    305  1.1.2.2  bouyer 		 n));
    306  1.1.2.2  bouyer 	/* bit rate */
    307  1.1.2.2  bouyer 	r8 = SHREG_SCBRR2;
    308  1.1.2.2  bouyer 	DPRINTF((TEXT("SCBRR=%d(%dbps) estimated PCLOCK %dHz\n"), r8, bps,
    309  1.1.2.2  bouyer 		 32 * bps *(r8 + 1) * n));
    310  1.1.2.2  bouyer 
    311  1.1.2.2  bouyer 	/* control */
    312  1.1.2.2  bouyer #define DBG_BIT_PRINT(r, m)	_dbg_bit_print(r, SCSCR2_##m, #m)
    313  1.1.2.2  bouyer 	DPRINTF((TEXT("SCSCR2: ")));
    314  1.1.2.2  bouyer 	r8 = SHREG_SCSCR2;
    315  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, TIE);
    316  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, RIE);
    317  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, TE);
    318  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, RE);
    319  1.1.2.2  bouyer 	DPRINTF((TEXT("CKE=%d\n"), r8 & SCSCR2_CKE));
    320  1.1.2.2  bouyer #undef	DBG_BIT_PRINT
    321  1.1.2.2  bouyer 
    322  1.1.2.2  bouyer 	/* status */
    323  1.1.2.2  bouyer #define DBG_BIT_PRINT(r, m)	_dbg_bit_print(r, SCSSR2_##m, #m)
    324  1.1.2.2  bouyer 	r16 = SHREG_SCSSR2;
    325  1.1.2.2  bouyer 	DPRINTF((TEXT("SCSSR2: ")));
    326  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, ER);
    327  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, TEND);
    328  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, TDFE);
    329  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, BRK);
    330  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, FER);
    331  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, PER);
    332  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, RDF);
    333  1.1.2.2  bouyer 	DBG_BIT_PRINT(r16, DR);
    334  1.1.2.2  bouyer #undef	DBG_BIT_PRINT
    335  1.1.2.2  bouyer 
    336  1.1.2.2  bouyer 	/* FIFO control */
    337  1.1.2.2  bouyer #define DBG_BIT_PRINT(r, m)	_dbg_bit_print(r, SCFCR2_##m, #m)
    338  1.1.2.2  bouyer 	r8 = SHREG_SCFCR2;
    339  1.1.2.2  bouyer 	DPRINTF((TEXT("SCFCR2: ")));
    340  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, RTRG1);
    341  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, RTRG0);
    342  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, TTRG1);
    343  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, TTRG0);
    344  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, MCE);
    345  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, TFRST);
    346  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, RFRST);
    347  1.1.2.2  bouyer 	DBG_BIT_PRINT(r8, LOOP);
    348  1.1.2.2  bouyer 	DPRINTF((TEXT("\n")));
    349  1.1.2.2  bouyer #undef	DBG_BIT_PRINT
    350  1.1.2.2  bouyer }
    351  1.1.2.2  bouyer 
    352  1.1.2.2  bouyer void
    353  1.1.2.2  bouyer SHArchitecture::hd64461_framebuffer_test()
    354  1.1.2.2  bouyer {
    355  1.1.2.2  bouyer 	DPRINTF((TEXT("frame buffer test start\n")));
    356  1.1.2.2  bouyer #if SH7709TEST
    357  1.1.2.2  bouyer 	u_int32_t sh7707_fb_dma_addr;
    358  1.1.2.2  bouyer 	u_int16_t val;
    359  1.1.2.2  bouyer 	int s;
    360  1.1.2.2  bouyer 
    361  1.1.2.2  bouyer 	s = suspendIntr();
    362  1.1.2.2  bouyer 	VOLATILE_REF16(SH7707_LCDAR_REG16) = SH7707_LCDAR_LCDDMR0;
    363  1.1.2.2  bouyer 	val = VOLATILE_REF16(SH7707_LCDDMR_REG16);
    364  1.1.2.2  bouyer 	sh7707_fb_dma_addr = val;
    365  1.1.2.2  bouyer 	VOLATILE_REF16(SH7707_LCDAR_REG16) = SH7707_LCDAR_LCDDMR1;
    366  1.1.2.2  bouyer 	val = VOLATILE_REF16(SH7707_LCDDMR_REG16);
    367  1.1.2.2  bouyer 	sh7707_fb_dma_addr |= (val << 16);
    368  1.1.2.2  bouyer 	resumeIntr(s);
    369  1.1.2.2  bouyer 
    370  1.1.2.2  bouyer 	DPRINTF((TEXT("SH7707 frame buffer dma address: 0x%08x\n"),
    371  1.1.2.2  bouyer 		 sh7707_fb_dma_addr));
    372  1.1.2.2  bouyer #else
    373  1.1.2.2  bouyer 	u_int8_t *fb = reinterpret_cast<u_int8_t *>(HD64461_FB_ADDR);
    374  1.1.2.2  bouyer 
    375  1.1.2.2  bouyer 	for (int i = 0; i < 480 * 240 * 2 / 8; i++)
    376  1.1.2.2  bouyer 		*fb++ = 0xff;
    377  1.1.2.2  bouyer #endif
    378  1.1.2.2  bouyer 	DPRINTF((TEXT("frame buffer test end\n")));
    379  1.1.2.2  bouyer }
    380