xref: /netbsd-src/sys/arch/hpc/stand/hpcboot/arm/arm_pxa2x0.cpp (revision 569b7f924fd547a1a14b66aa1fdab30e6ee501c2)
1*569b7f92Snonaka /*	$NetBSD: arm_pxa2x0.cpp,v 1.3 2010/04/06 16:20:28 nonaka Exp $	*/
23af75740Srafal 
33af75740Srafal /*-
43af75740Srafal  * Copyright (c) 2008 The NetBSD Foundation, Inc.
53af75740Srafal  * All rights reserved.
63af75740Srafal  *
73af75740Srafal  * This code is derived from software contributed to The NetBSD Foundation
83af75740Srafal  * by UCHIYAMA Yasushi.
93af75740Srafal  *
103af75740Srafal  * Redistribution and use in source and binary forms, with or without
113af75740Srafal  * modification, are permitted provided that the following conditions
123af75740Srafal  * are met:
133af75740Srafal  * 1. Redistributions of source code must retain the above copyright
143af75740Srafal  *    notice, this list of conditions and the following disclaimer.
153af75740Srafal  * 2. Redistributions in binary form must reproduce the above copyright
163af75740Srafal  *    notice, this list of conditions and the following disclaimer in the
173af75740Srafal  *    documentation and/or other materials provided with the distribution.
183af75740Srafal  *
193af75740Srafal  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
203af75740Srafal  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
213af75740Srafal  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
223af75740Srafal  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
233af75740Srafal  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
243af75740Srafal  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
253af75740Srafal  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
263af75740Srafal  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
273af75740Srafal  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
283af75740Srafal  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
293af75740Srafal  * POSSIBILITY OF SUCH DAMAGE.
303af75740Srafal  */
313af75740Srafal 
323af75740Srafal #include <arm/arm_arch.h>
333af75740Srafal #include <console.h>
343af75740Srafal #include <memory.h>
353af75740Srafal #include <arm/arm_pxa2x0.h>
363af75740Srafal 
373af75740Srafal /*
383af75740Srafal  * Intel XScale PXA 2x0
393af75740Srafal  */
403af75740Srafal 
413af75740Srafal #define	PAGE_SIZE		0x1000
423af75740Srafal #define	DRAM_BANK_NUM		4		/* total 256MByte */
433af75740Srafal #define	DRAM_BANK_SIZE		0x04000000	/* 64Mbyte */
443af75740Srafal 
453af75740Srafal #define	DRAM_BANK0_START	0xa0000000
463af75740Srafal #define	DRAM_BANK0_SIZE		DRAM_BANK_SIZE
473af75740Srafal #define	DRAM_BANK1_START	0xa4000000
483af75740Srafal #define	DRAM_BANK1_SIZE		DRAM_BANK_SIZE
493af75740Srafal #define	DRAM_BANK2_START	0xa8000000
503af75740Srafal #define	DRAM_BANK2_SIZE		DRAM_BANK_SIZE
513af75740Srafal #define	DRAM_BANK3_START	0xac000000
523af75740Srafal #define	DRAM_BANK3_SIZE		DRAM_BANK_SIZE
533af75740Srafal #define	ZERO_BANK_START		0xe0000000
543af75740Srafal #define	ZERO_BANK_SIZE		DRAM_BANK_SIZE
553af75740Srafal 
563af75740Srafal __BEGIN_DECLS
573af75740Srafal 
583af75740Srafal // 2nd bootloader
59*569b7f92Snonaka void boot_func_pxa2x0(kaddr_t, kaddr_t, kaddr_t, kaddr_t);
60*569b7f92Snonaka extern char boot_func_end_pxa2x0[];
61*569b7f92Snonaka #define	BOOT_FUNC_START		reinterpret_cast <vaddr_t>(boot_func_pxa2x0)
62*569b7f92Snonaka #define	BOOT_FUNC_END		reinterpret_cast <vaddr_t>(boot_func_end_pxa2x0)
633af75740Srafal 
643af75740Srafal /* jump to 2nd loader */
65*569b7f92Snonaka void FlatJump_pxa2x0(kaddr_t, kaddr_t, kaddr_t, kaddr_t);
663af75740Srafal 
673af75740Srafal __END_DECLS
683af75740Srafal 
PXA2X0Architecture(Console * & cons,MemoryManager * & mem)693af75740Srafal PXA2X0Architecture::PXA2X0Architecture(Console *&cons, MemoryManager *&mem)
703af75740Srafal 	: ARMArchitecture(cons, mem)
713af75740Srafal {
723af75740Srafal 	DPRINTF((TEXT("PXA-2x0 CPU.\n")));
733af75740Srafal }
743af75740Srafal 
~PXA2X0Architecture(void)753af75740Srafal PXA2X0Architecture::~PXA2X0Architecture(void)
763af75740Srafal {
773af75740Srafal }
783af75740Srafal 
793af75740Srafal BOOL
init(void)803af75740Srafal PXA2X0Architecture::init(void)
813af75740Srafal {
823af75740Srafal 	if (!_mem->init()) {
833af75740Srafal 		DPRINTF((TEXT("can't initialize memory manager.\n")));
843af75740Srafal 		return FALSE;
853af75740Srafal 	}
863af75740Srafal 	// set D-RAM information
873af75740Srafal 	_mem->loadBank(DRAM_BANK0_START, DRAM_BANK_SIZE);
883af75740Srafal 	_mem->loadBank(DRAM_BANK1_START, DRAM_BANK_SIZE);
893af75740Srafal 	_mem->loadBank(DRAM_BANK2_START, DRAM_BANK_SIZE);
903af75740Srafal 	_mem->loadBank(DRAM_BANK3_START, DRAM_BANK_SIZE);
913af75740Srafal 
92*569b7f92Snonaka 	// set D-cache information
93*569b7f92Snonaka 	dcachesize = 32768 * 2;
94*569b7f92Snonaka 	DPRINTF((TEXT("D-cache size = %d\n"), dcachesize));
95*569b7f92Snonaka 
963af75740Srafal #ifdef HW_TEST
973af75740Srafal 	DPRINTF((TEXT("Testing framebuffer.\n")));
983af75740Srafal 	testFramebuffer();
993af75740Srafal 
1003af75740Srafal 	DPRINTF((TEXT("Testing UART.\n")));
1013af75740Srafal 	testUART();
1023af75740Srafal #endif
1033af75740Srafal 
104*569b7f92Snonaka #ifdef REGDUMP
105*569b7f92Snonaka 	DPRINTF((TEXT("Dump peripheral registers.\n")));
106*569b7f92Snonaka 	dumpPeripheralRegs();
107*569b7f92Snonaka #endif
108*569b7f92Snonaka 
109*569b7f92Snonaka #ifdef CS0DUMP
110*569b7f92Snonaka 	uint32_t dumpsize = 1024 * 1024; // 1MB
111*569b7f92Snonaka 	DPRINTF((TEXT("Dump CS area (size = %d)\n"), dumpsize));
112*569b7f92Snonaka 	dumpCS0(dumpsize);
113*569b7f92Snonaka #endif
114*569b7f92Snonaka 
1153af75740Srafal 	return TRUE;
1163af75740Srafal }
1173af75740Srafal 
1183af75740Srafal void
testFramebuffer(void)1193af75740Srafal PXA2X0Architecture::testFramebuffer(void)
1203af75740Srafal {
1213af75740Srafal 	DPRINTF((TEXT("No framebuffer test yet.\n")));
1223af75740Srafal }
1233af75740Srafal 
1243af75740Srafal void
testUART(void)1253af75740Srafal PXA2X0Architecture::testUART(void)
1263af75740Srafal {
1273af75740Srafal #define	COM_DATA		VOLATILE_REF8(uart + 0x00)
1283af75740Srafal #define COM_IIR			VOLATILE_REF8(uart + 0x08)
1293af75740Srafal #define	COM_LSR			VOLATILE_REF8(uart + 0x14)
1303af75740Srafal #define LSR_TXRDY		0x20
1313af75740Srafal #define	COM_TX_CHECK		while (!(COM_LSR & LSR_TXRDY))
1323af75740Srafal #define	COM_PUTCHAR(c)		(COM_DATA = (c))
1333af75740Srafal #define	COM_CLR_INTS		((void)COM_IIR)
1343af75740Srafal #define	_(c)								\
1353af75740Srafal __BEGIN_MACRO								\
1363af75740Srafal 	COM_TX_CHECK;							\
1373af75740Srafal 	COM_PUTCHAR(c);							\
1383af75740Srafal 	COM_TX_CHECK;							\
1393af75740Srafal 	COM_CLR_INTS;							\
1403af75740Srafal __END_MACRO
1413af75740Srafal 
1423af75740Srafal 	vaddr_t uart =
1433af75740Srafal 	    _mem->mapPhysicalPage(0x40100000, 0x100, PAGE_READWRITE);
1443af75740Srafal 
1453af75740Srafal 	// Don't turn on the enable-UART bit in the IER; this seems to
1463af75740Srafal 	// result in WinCE losing the port (and nothing working later).
1473af75740Srafal 	// All that should be taken care of by using WinCE to open the
1483af75740Srafal 	// port before we actually use it.
1493af75740Srafal 
1503af75740Srafal 	_('H');_('e');_('l');_('l');_('o');_(' ');
1513af75740Srafal 	_('W');_('o');_('r');_('l');_('d');_('\r');_('\n');
1523af75740Srafal 
1533af75740Srafal 	_mem->unmapPhysicalPage(uart);
1543af75740Srafal }
1553af75740Srafal 
1563af75740Srafal BOOL
setupLoader(void)1573af75740Srafal PXA2X0Architecture::setupLoader(void)
1583af75740Srafal {
1593af75740Srafal 	vaddr_t v;
1603af75740Srafal 	vsize_t sz = BOOT_FUNC_END - BOOT_FUNC_START;
1613af75740Srafal 
1623af75740Srafal 	// check 2nd bootloader size.
1633af75740Srafal 	if (sz > _mem->getPageSize()) {
1643af75740Srafal 		DPRINTF((TEXT("2nd bootloader size(%dbyte) is larger than page size(%d).\n"),
1653af75740Srafal 		    sz, _mem->getPageSize()));
1663af75740Srafal 		return FALSE;
1673af75740Srafal 	}
1683af75740Srafal 
1693af75740Srafal 	// get physical mapped page and copy loader to there.
1703af75740Srafal 	// don't writeback D-cache here. make sure to writeback before jump.
1713af75740Srafal 	if (!_mem->getPage(v , _loader_addr)) {
1723af75740Srafal 		DPRINTF((TEXT("can't get page for 2nd loader.\n")));
1733af75740Srafal 		return FALSE;
1743af75740Srafal 	}
1753af75740Srafal 	DPRINTF((TEXT("2nd bootloader vaddr=0x%08x paddr=0x%08x\n"),
1763af75740Srafal 	    (unsigned)v,(unsigned)_loader_addr));
1773af75740Srafal 
1783af75740Srafal 	memcpy(reinterpret_cast <LPVOID>(v),
1793af75740Srafal 	    reinterpret_cast <LPVOID>(BOOT_FUNC_START), sz);
1803af75740Srafal 	DPRINTF((TEXT("2nd bootloader copy done.\n")));
1813af75740Srafal 
1823af75740Srafal 	return TRUE;
1833af75740Srafal }
1843af75740Srafal 
1853af75740Srafal void
jump(paddr_t info,paddr_t pvec)1863af75740Srafal PXA2X0Architecture::jump(paddr_t info, paddr_t pvec)
1873af75740Srafal {
1883af75740Srafal 	kaddr_t sp;
1893af75740Srafal 	vaddr_t v;
1903af75740Srafal 	paddr_t p;
1913af75740Srafal 
1923af75740Srafal 	// stack for bootloader
1933af75740Srafal 	_mem->getPage(v, p);
1943af75740Srafal 	sp = ptokv(p) + _mem->getPageSize();
1953af75740Srafal 	DPRINTF((TEXT("sp for bootloader = %08x + %08x = %08x\n"),
1963af75740Srafal 	    ptokv(p), _mem->getPageSize(), sp));
1973af75740Srafal 
1983af75740Srafal 	// writeback whole D-cache
1993af75740Srafal 	WritebackDCache();
2003af75740Srafal 
2013af75740Srafal 	SetKMode(1);
202*569b7f92Snonaka 	FlatJump_pxa2x0(info, pvec, sp, _loader_addr);
2033af75740Srafal 	// NOTREACHED
204*569b7f92Snonaka 	SetKMode(0);
205*569b7f92Snonaka 	DPRINTF((TEXT("Return from FlatJump_pxa2x0.\n")));
206*569b7f92Snonaka }
207*569b7f92Snonaka 
208*569b7f92Snonaka 
209*569b7f92Snonaka //
210*569b7f92Snonaka // dump CS0
211*569b7f92Snonaka //
212*569b7f92Snonaka void
dumpCS0(uint32_t size)213*569b7f92Snonaka PXA2X0Architecture::dumpCS0(uint32_t size)
214*569b7f92Snonaka {
215*569b7f92Snonaka 	static char buf[0x1000];
216*569b7f92Snonaka 	vaddr_t mem;
217*569b7f92Snonaka 	uint32_t addr;
218*569b7f92Snonaka 	uint32_t off;
219*569b7f92Snonaka 	HANDLE fh;
220*569b7f92Snonaka 	unsigned long wrote;
221*569b7f92Snonaka 
222*569b7f92Snonaka 	fh = CreateFile(TEXT("rom.bin"), GENERIC_WRITE, FILE_SHARE_READ,
223*569b7f92Snonaka 	    0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
224*569b7f92Snonaka 	if (fh == INVALID_HANDLE_VALUE) {
225*569b7f92Snonaka 		DPRINTF((TEXT("can't open file. (%s)\n"), TEXT("rom.bin")));
226*569b7f92Snonaka 		return;
227*569b7f92Snonaka 	}
228*569b7f92Snonaka 
229*569b7f92Snonaka 	for (addr = 0; addr < size; addr += 0x1000) {
230*569b7f92Snonaka 		memset(buf, 0, sizeof(buf));
231*569b7f92Snonaka 		mem = _mem->mapPhysicalPage(addr, 0x1000, PAGE_READWRITE);
232*569b7f92Snonaka 		for (off = 0; off < 0x1000; off++) {
233*569b7f92Snonaka 			buf[off] = VOLATILE_REF8(mem + off);
234*569b7f92Snonaka 		}
235*569b7f92Snonaka 		_mem->unmapPhysicalPage(mem);
236*569b7f92Snonaka 		WriteFile(fh, buf, 0x1000, &wrote, 0);
237*569b7f92Snonaka 	}
238*569b7f92Snonaka 
239*569b7f92Snonaka 	CloseHandle(fh);
240*569b7f92Snonaka }
241*569b7f92Snonaka 
242*569b7f92Snonaka //
243*569b7f92Snonaka // dump peripheral registers.
244*569b7f92Snonaka //
245*569b7f92Snonaka 
246*569b7f92Snonaka #ifdef REGDUMP
247*569b7f92Snonaka #define	PXA250_GPIO_REG_NUM	3
248*569b7f92Snonaka #define	PXA250_GPIO_NUM		96
249*569b7f92Snonaka #define	PXA270_GPIO_REG_NUM	4
250*569b7f92Snonaka #define	PXA270_GPIO_NUM		121
251*569b7f92Snonaka 
252*569b7f92Snonaka static const TCHAR *pxa270_gpioName[PXA270_GPIO_NUM][7] =
253*569b7f92Snonaka {
254*569b7f92Snonaka /*0*/	{ TEXT("GPIO<0>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
255*569b7f92Snonaka /*1*/	{ TEXT("GPIO<1>/nRESET_GPIO"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
256*569b7f92Snonaka /*2*/	{ TEXT("SYS_EN5"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
257*569b7f92Snonaka /*3*/	{ TEXT("GPIO<3>/PWR_SCL"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
258*569b7f92Snonaka /*4*/	{ TEXT("GPIO<4>/PWR_SDA"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
259*569b7f92Snonaka /*5*/	{ TEXT("PWR_CAP<0>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
260*569b7f92Snonaka /*6*/	{ TEXT("PWR_CAP<1>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
261*569b7f92Snonaka /*7*/	{ TEXT("PWR_CAP<2>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
262*569b7f92Snonaka /*8*/	{ TEXT("PWR_CAP<3>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
263*569b7f92Snonaka /*9*/	{ TEXT("GPIO<9>"),TEXT(""),TEXT(""),TEXT("FFCTS"),TEXT("HZ_CLK"),TEXT(""),TEXT("CHOUT<0>"), },
264*569b7f92Snonaka /*10*/	{ TEXT("GPIO<10>"),TEXT("FFDCD"),TEXT(""),TEXT("USB_P3_57"),TEXT("HZ_CLK"),TEXT(""),TEXT("CHOUT<1>"), },
265*569b7f92Snonaka /*11*/	{ TEXT("GPIO<11>"),TEXT("EXT_SYNC<0>"),TEXT("SSPRXD2"),TEXT("USB_P3_1"),TEXT("CHOUT<0>"),TEXT("PWM_OUT<2>"),TEXT("48_MHz"), },
266*569b7f92Snonaka /*12*/	{ TEXT("GPIO<12>"),TEXT("EXT_SYNC<1>"),TEXT("CIF_DD<7>"),TEXT(""),TEXT("CHOUT<1>"),TEXT("PWM_OUT<3>"),TEXT("48_MHz"), },
267*569b7f92Snonaka /*13*/	{ TEXT("GPIO<13>"),TEXT("CLK_EXT"),TEXT("KP_DKIN<7>"),TEXT("KP_MKIN<7>"),TEXT("SSPTXD2"),TEXT(""),TEXT(""), },
268*569b7f92Snonaka /*14*/	{ TEXT("GPIO<14>"),TEXT("L_VSYNC"),TEXT("SSPSFRM2"),TEXT(""),TEXT(""),TEXT("SSPSFRM2"),TEXT("UCLK"), },
269*569b7f92Snonaka /*15*/	{ TEXT("GPIO<15>"),TEXT(""),TEXT(""),TEXT(""),TEXT("nPCE<1>"),TEXT("nCS<1>"),TEXT(""), },
270*569b7f92Snonaka /*16*/	{ TEXT("GPIO<16>"),TEXT("KP_MKIN<5>"),TEXT(""),TEXT(""),TEXT(""),TEXT("PWM_OUT<0>"),TEXT("FFTXD"), },
271*569b7f92Snonaka /*17*/	{ TEXT("GPIO<17>"),TEXT("KP_MKIN<6>"),TEXT("CIF_DD<6>"),TEXT(""),TEXT(""),TEXT("PWM_OUT<1>"),TEXT(""), },
272*569b7f92Snonaka /*18*/	{ TEXT("GPIO<18>"),TEXT("RDY"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
273*569b7f92Snonaka /*19*/	{ TEXT("GPIO<19>"),TEXT("SSPSCLK2"),TEXT(""),TEXT("FFRXD"),TEXT("SSPSCLK2"),TEXT("L_CS"),TEXT("nURST"), },
274*569b7f92Snonaka /*20*/	{ TEXT("GPIO<20>"),TEXT("DREQ<0>"),TEXT("MBREQ"),TEXT(""),TEXT("nSDCS<2>"),TEXT(""),TEXT(""), },
275*569b7f92Snonaka /*21*/	{ TEXT("GPIO<21>"),TEXT(""),TEXT(""),TEXT(""),TEXT("nSDCS<3>"),TEXT("DVAL<0>"),TEXT("MBGNT"), },
276*569b7f92Snonaka /*22*/	{ TEXT("GPIO<22>"),TEXT("SSPEXTCLK2"),TEXT("SSPSCLK2EN"),TEXT("SSPSCLK2"),TEXT("KP_MKOUT<7>"),TEXT("SSPSYSCLK2"),TEXT("SSPSCLK2"), },
277*569b7f92Snonaka /*23*/	{ TEXT("GPIO<23>"),TEXT(""),TEXT("SSPSCLK"),TEXT(""),TEXT("CIF_MCLK"),TEXT("SSPSCLK"),TEXT(""), },
278*569b7f92Snonaka /*24*/	{ TEXT("GPIO<24>"),TEXT("CIF_FV"),TEXT("SSPSFRM"),TEXT(""),TEXT("CIF_FV"),TEXT("SSPSFRM"),TEXT(""), },
279*569b7f92Snonaka /*25*/	{ TEXT("GPIO<25>"),TEXT("CIF_LV"),TEXT(""),TEXT(""),TEXT("CIF_LV"),TEXT("SSPTXD"),TEXT(""), },
280*569b7f92Snonaka /*26*/	{ TEXT("GPIO<26>"),TEXT("SSPRXD"),TEXT("CIF_PCLK"),TEXT("FFCTS"),TEXT(""),TEXT(""),TEXT(""), },
281*569b7f92Snonaka /*27*/	{ TEXT("GPIO<27>"),TEXT("SSPEXTCLK"),TEXT("SSPSCLKEN"),TEXT("CIF_DD<0>"),TEXT("SSPSYSCLK"),TEXT(""),TEXT("FFRTS"), },
282*569b7f92Snonaka /*28*/	{ TEXT("GPIO<28>"),TEXT("AC97_BITCLK"),TEXT("I2S_BITCLK"),TEXT("SSPSFRM"),TEXT("I2S_BITCLK"),TEXT(""),TEXT("SSPSFRM"), },
283*569b7f92Snonaka /*29*/	{ TEXT("GPIO<29>"),TEXT("AC97_SDATA_IN_0"),TEXT("I2S_SDATA_IN"),TEXT("SSPSCLK"),TEXT("SSPRXD2"),TEXT(""),TEXT("SSPSCLK"), },
284*569b7f92Snonaka /*30*/	{ TEXT("GPIO<30>"),TEXT(""),TEXT(""),TEXT(""),TEXT("I2S_SDATA_OUT"),TEXT("AC97_SDATA_OUT"),TEXT("USB_P3_2"), },
285*569b7f92Snonaka /*31*/	{ TEXT("GPIO<31>"),TEXT(""),TEXT(""),TEXT(""),TEXT("I2S_SYNC"),TEXT("AC97_SYNC"),TEXT("USB_P3_6"), },
286*569b7f92Snonaka /*32*/	{ TEXT("GPIO<32>"),TEXT(""),TEXT(""),TEXT(""),TEXT("MSSCLK"),TEXT("MMCLK"),TEXT(""), },
287*569b7f92Snonaka /*33*/	{ TEXT("GPIO<33>"),TEXT("FFRXD"),TEXT("FFDSR"),TEXT(""),TEXT("DVAL<1>"),TEXT("nCS<5>"),TEXT("MBGNT"), },
288*569b7f92Snonaka /*34*/	{ TEXT("GPIO<34>"),TEXT("FFRXD"),TEXT("KP_MKIN<3>"),TEXT("SSPSCLK3"),TEXT("USB_P2_2"),TEXT(""),TEXT("SSPSCLK3"), },
289*569b7f92Snonaka /*35*/	{ TEXT("GPIO<35>"),TEXT("FFCTS"),TEXT("USB_P2_1"),TEXT("SSPSFRM3"),TEXT(""),TEXT("KP_MKOUT<6>"),TEXT("SSPTXD3"), },
290*569b7f92Snonaka /*36*/	{ TEXT("GPIO<36>"),TEXT("FFDCD"),TEXT("SSPSCLK2"),TEXT("KP_MKIN<7>"),TEXT("USB_P2_4"),TEXT("SSPSCLK2"),TEXT(""), },
291*569b7f92Snonaka /*37*/	{ TEXT("GPIO<37>"),TEXT("FFDSR"),TEXT("SSPSFRM2"),TEXT("KP_MKIN<3>"),TEXT("USB_P2_8"),TEXT("SSPSFRM2"),TEXT("FFTXD"), },
292*569b7f92Snonaka /*38*/	{ TEXT("GPIO<38>"),TEXT("FFRI"),TEXT("KP_MKIN<4>"),TEXT("USB_P2_3"),TEXT("SSPTXD3"),TEXT("SSPTXD2"),TEXT("PWM_OUT<1>"), },
293*569b7f92Snonaka /*39*/	{ TEXT("GPIO<39>"),TEXT("KP_MKIN<4>"),TEXT(""),TEXT("SSPSFRM3"),TEXT("USB_P2_6"),TEXT("FFTXD"),TEXT("SSPSFRM3"), },
294*569b7f92Snonaka /*40*/	{ TEXT("GPIO<40>"),TEXT("SSPRXD2"),TEXT(""),TEXT("USB_P2_5"),TEXT("KP_MKOUT<6>"),TEXT("FFDTR"),TEXT("SSPSCLK3"), },
295*569b7f92Snonaka /*41*/	{ TEXT("GPIO<41>"),TEXT("FFRXD"),TEXT("USB_P2_7"),TEXT("SSPRXD3"),TEXT("KP_MKOUT<7>"),TEXT("FFRTS"),TEXT(""), },
296*569b7f92Snonaka /*42*/	{ TEXT("GPIO<42>"),TEXT("BTRXD"),TEXT("ICP_RXD"),TEXT(""),TEXT(""),TEXT(""),TEXT("CIF_MCLK"), },
297*569b7f92Snonaka /*43*/	{ TEXT("GPIO<43>"),TEXT(""),TEXT(""),TEXT("CIF_FV"),TEXT("ICP_TXD"),TEXT("BTTXD"),TEXT("CIF_FV"), },
298*569b7f92Snonaka /*44*/	{ TEXT("GPIO<44>"),TEXT("BTCTS"),TEXT(""),TEXT("CIF_LV"),TEXT(""),TEXT(""),TEXT("CIF_LV"), },
299*569b7f92Snonaka /*45*/	{ TEXT("GPIO<45>"),TEXT(""),TEXT(""),TEXT("CIF_PCLK"),TEXT("AC97_SYSCLK"),TEXT("BTRTS"),TEXT("SSPSYSCLK3"), },
300*569b7f92Snonaka /*46*/	{ TEXT("GPIO<46>"),TEXT("ICP_RXD"),TEXT("STD_RXD"),TEXT(""),TEXT(""),TEXT("PWM_OUT<2>"),TEXT(""), },
301*569b7f92Snonaka /*47*/	{ TEXT("GPIO<47>"),TEXT("CIF_DD<0>"),TEXT(""),TEXT(""),TEXT("STD_TXD"),TEXT("ICP_TXD"),TEXT("PWM_OUT<3>"), },
302*569b7f92Snonaka /*48*/	{ TEXT("GPIO<48>"),TEXT("CIF_DD<5>"),TEXT(""),TEXT(""),TEXT("BB_OB_DAT<1>"),TEXT("nPOE"),TEXT(""), },
303*569b7f92Snonaka /*49*/	{ TEXT("GPIO<49>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("nPWE"),TEXT(""), },
304*569b7f92Snonaka /*50*/	{ TEXT("GPIO<50>"),TEXT("CIF_DD<3>"),TEXT(""),TEXT("SSPSCLK2"),TEXT("BB_OB_DAT<2>"),TEXT("nPIOR"),TEXT("SSPSCLK2"), },
305*569b7f92Snonaka /*51*/	{ TEXT("GPIO<51>"),TEXT("CIF_DD<2>"),TEXT(""),TEXT(""),TEXT("BB_OB_DAT<3>"),TEXT("nPIOW"),TEXT(""), },
306*569b7f92Snonaka /*52*/	{ TEXT("GPIO<52>"),TEXT("CIF_DD<4>"),TEXT("SSPSCLK3"),TEXT(""),TEXT("BB_OB_CLK"),TEXT("SSPSCLK3"),TEXT(""), },
307*569b7f92Snonaka /*53*/	{ TEXT("GPIO<53>"),TEXT("FFRXD"),TEXT("USB_P2_3"),TEXT(""),TEXT("BB_OB_STB"),TEXT("CIF_MCLK"),TEXT("SSPSYSCLK"), },
308*569b7f92Snonaka /*54*/	{ TEXT("GPIO<54>"),TEXT(""),TEXT("BB_OB_WAIT"),TEXT("CIF_PCLK"),TEXT(""),TEXT("nPCE<2>"),TEXT(""), },
309*569b7f92Snonaka /*55*/	{ TEXT("GPIO<55>"),TEXT("CIF_DD<1>"),TEXT("BB_IB_DAT<1>"),TEXT(""),TEXT(""),TEXT("nPREG"),TEXT(""), },
310*569b7f92Snonaka /*56*/	{ TEXT("GPIO<56>"),TEXT("nPWAIT"),TEXT("BB_IB_DAT<2>"),TEXT(""),TEXT("USB_P3_4"),TEXT(""),TEXT(""), },
311*569b7f92Snonaka /*57*/	{ TEXT("GPIO<57>"),TEXT("nIOIS16"),TEXT("BB_IB_DAT<3>"),TEXT(""),TEXT(""),TEXT(""),TEXT("SSPTXD"), },
312*569b7f92Snonaka /*58*/	{ TEXT("GPIO<58>"),TEXT(""),TEXT("LDD<0>"),TEXT(""),TEXT(""),TEXT("LDD<0>"),TEXT(""), },
313*569b7f92Snonaka /*59*/	{ TEXT("GPIO<59>"),TEXT(""),TEXT("LDD<1>"),TEXT(""),TEXT(""),TEXT("LDD<1>"),TEXT(""), },
314*569b7f92Snonaka /*60*/	{ TEXT("GPIO<60>"),TEXT(""),TEXT("LDD<2>"),TEXT(""),TEXT(""),TEXT("LDD<2>"),TEXT(""), },
315*569b7f92Snonaka /*61*/	{ TEXT("GPIO<61>"),TEXT(""),TEXT("LDD<3>"),TEXT(""),TEXT(""),TEXT("LDD<3>"),TEXT(""), },
316*569b7f92Snonaka /*62*/	{ TEXT("GPIO<62>"),TEXT(""),TEXT("LDD<4>"),TEXT(""),TEXT(""),TEXT("LDD<4>"),TEXT(""), },
317*569b7f92Snonaka /*63*/	{ TEXT("GPIO<63>"),TEXT(""),TEXT("LDD<5>"),TEXT(""),TEXT(""),TEXT("LDD<5>"),TEXT(""), },
318*569b7f92Snonaka /*64*/	{ TEXT("GPIO<64>"),TEXT(""),TEXT("LDD<6>"),TEXT(""),TEXT(""),TEXT("LDD<6>"),TEXT(""), },
319*569b7f92Snonaka /*65*/	{ TEXT("GPIO<65>"),TEXT(""),TEXT("LDD<7>"),TEXT(""),TEXT(""),TEXT("LDD<7>"),TEXT(""), },
320*569b7f92Snonaka /*66*/	{ TEXT("GPIO<66>"),TEXT(""),TEXT("LDD<8>"),TEXT(""),TEXT(""),TEXT("LDD<8>"),TEXT(""), },
321*569b7f92Snonaka /*67*/	{ TEXT("GPIO<67>"),TEXT(""),TEXT("LDD<9>"),TEXT(""),TEXT(""),TEXT("LDD<9>"),TEXT(""), },
322*569b7f92Snonaka /*68*/	{ TEXT("GPIO<68>"),TEXT(""),TEXT("LDD<10>"),TEXT(""),TEXT(""),TEXT("LDD<10>"),TEXT(""), },
323*569b7f92Snonaka /*69*/	{ TEXT("GPIO<69>"),TEXT(""),TEXT("LDD<11>"),TEXT(""),TEXT(""),TEXT("LDD<11>"),TEXT(""), },
324*569b7f92Snonaka /*70*/	{ TEXT("GPIO<70>"),TEXT(""),TEXT("LDD<12>"),TEXT(""),TEXT(""),TEXT("LDD<12>"),TEXT(""), },
325*569b7f92Snonaka /*71*/	{ TEXT("GPIO<71>"),TEXT(""),TEXT("LDD<13>"),TEXT(""),TEXT(""),TEXT("LDD<13>"),TEXT(""), },
326*569b7f92Snonaka /*72*/	{ TEXT("GPIO<72>"),TEXT(""),TEXT("LDD<14>"),TEXT(""),TEXT(""),TEXT("LDD<14>"),TEXT(""), },
327*569b7f92Snonaka /*73*/	{ TEXT("GPIO<73>"),TEXT(""),TEXT("LDD<15>"),TEXT(""),TEXT(""),TEXT("LDD<15>"),TEXT(""), },
328*569b7f92Snonaka /*74*/	{ TEXT("GPIO<74>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_FCLK_RD"),TEXT(""), },
329*569b7f92Snonaka /*75*/	{ TEXT("GPIO<75>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_LCLK_A0"),TEXT(""), },
330*569b7f92Snonaka /*76*/	{ TEXT("GPIO<76>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_PCLK_WR"),TEXT(""), },
331*569b7f92Snonaka /*77*/	{ TEXT("GPIO<77>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_BIAS"),TEXT(""), },
332*569b7f92Snonaka /*78*/	{ TEXT("GPIO<78>"),TEXT(""),TEXT(""),TEXT(""),TEXT("nPCE<2>"),TEXT("nCS<2>"),TEXT(""), },
333*569b7f92Snonaka /*79*/	{ TEXT("GPIO<79>"),TEXT(""),TEXT(""),TEXT(""),TEXT("PSKTSEL"),TEXT("nCS<3>"),TEXT("PWM_OUT<2>"), },
334*569b7f92Snonaka /*80*/	{ TEXT("GPIO<80>"),TEXT("DREQ<1>"),TEXT("MBREQ"),TEXT(""),TEXT(""),TEXT("nCS<4>"),TEXT("PWM_OUT<3>"), },
335*569b7f92Snonaka /*81*/	{ TEXT("GPIO<81>"),TEXT(""),TEXT("CIF_DD<0>"),TEXT(""),TEXT("SSPTXD3"),TEXT("BB_OB_DAT<0>"),TEXT(""), },
336*569b7f92Snonaka /*82*/	{ TEXT("GPIO<82>"),TEXT("SSPRXD3"),TEXT("BB_IB_DAT<0>"),TEXT("CIF_DD<5>"),TEXT(""),TEXT(""),TEXT("FFDTR"), },
337*569b7f92Snonaka /*83*/	{ TEXT("GPIO<83>"),TEXT("SSPSFRM3"),TEXT("BB_IB_CLK"),TEXT("CIF_DD<4>"),TEXT("SSPSFRM3"),TEXT("FFTXD"),TEXT("FFRTS"), },
338*569b7f92Snonaka /*84*/	{ TEXT("GPIO<84>"),TEXT("SSPCLK3"),TEXT("BB_IB_STB"),TEXT("CIF_FV"),TEXT("SSPCLK3"),TEXT(""),TEXT("CIF_FV"), },
339*569b7f92Snonaka /*85*/	{ TEXT("GPIO<85>"),TEXT("FFRXD"),TEXT("DREQ<2>"),TEXT("CIF_LV"),TEXT("nPCE<1>"),TEXT("BB_IB_WAIT"),TEXT("CIF_LV"), },
340*569b7f92Snonaka /*86*/	{ TEXT("GPIO<86>"),TEXT("SSPRXD2"),TEXT("LDD<16>"),TEXT("USB_P3_5"),TEXT("nPCE<1>"),TEXT("LDD<16>"),TEXT(""), },
341*569b7f92Snonaka /*87*/	{ TEXT("GPIO<87>"),TEXT("nPCE<2>"),TEXT("LDD<17>"),TEXT("USB_P3_1"),TEXT("SSPTXD2"),TEXT("LDD<17>"),TEXT("SSPSFRM2"), },
342*569b7f92Snonaka /*88*/	{ TEXT("GPIO<88>"),TEXT("USBHPWR<1>"),TEXT("SSPRXD2"),TEXT("SSPSFRM2"),TEXT(""),TEXT(""),TEXT("SSPSFRM2"), },
343*569b7f92Snonaka /*89*/	{ TEXT("GPIO<89>"),TEXT("SSPRXD3"),TEXT(""),TEXT("FFRI"),TEXT("AC97_SYSCLK"),TEXT("USBHPEN<1>"),TEXT("SSPTXD2"), },
344*569b7f92Snonaka /*90*/	{ TEXT("GPIO<90>"),TEXT("KP_MKIN<5>"),TEXT("USB_P3_5"),TEXT("CIF_DD<4>"),TEXT(""),TEXT("nURST"),TEXT(""), },
345*569b7f92Snonaka /*91*/	{ TEXT("GPIO<91>"),TEXT("KP_MKIN<6>"),TEXT("USB_P3_1"),TEXT("CIF_DD<5>"),TEXT(""),TEXT("UCLK"),TEXT(""), },
346*569b7f92Snonaka /*92*/	{ TEXT("GPIO<92>"),TEXT("MMDAT<0>"),TEXT(""),TEXT(""),TEXT("MMDAT<0>"),TEXT("MSBS"),TEXT(""), },
347*569b7f92Snonaka /*93*/	{ TEXT("GPIO<93>"),TEXT("KP_DKIN<0>"),TEXT("CIF_DD<6>"),TEXT(""),TEXT("AC97_SDATA_OUT"),TEXT(""),TEXT(""), },
348*569b7f92Snonaka /*94*/	{ TEXT("GPIO<94>"),TEXT("KP_DKIN<1>"),TEXT("CIF_DD<5>"),TEXT(""),TEXT("AC97_SYNC"),TEXT(""),TEXT(""), },
349*569b7f92Snonaka /*95*/	{ TEXT("GPIO<95>"),TEXT("KP_DKIN<2>"),TEXT("CIF_DD<4>"),TEXT("KP_MKIN<6>"),TEXT("AC97_RESET_n"),TEXT(""),TEXT(""), },
350*569b7f92Snonaka /*96*/	{ TEXT("GPIO<96>"),TEXT("KP_DKIN<3>"),TEXT("MBREQ"),TEXT("FFRXD"),TEXT(""),TEXT("DVAL<1>"),TEXT("KP_MKOUT<6>"), },
351*569b7f92Snonaka /*97*/	{ TEXT("GPIO<97>"),TEXT("KP_DKIN<4>"),TEXT("DREQ<1>"),TEXT("KP_MKIN<3>"),TEXT(""),TEXT("MBGNT"),TEXT(""), },
352*569b7f92Snonaka /*98*/	{ TEXT("GPIO<98>"),TEXT("KP_DKIN<5>"),TEXT("CIF_DD<0>"),TEXT("KP_MKIN<4>"),TEXT("AC97_SYSCLK"),TEXT(""),TEXT("FFRTS"), },
353*569b7f92Snonaka /*99*/	{ TEXT("GPIO<99>"),TEXT("KP_DKIN<6>"),TEXT("AC97_SDATA_IN_1"),TEXT("KP_MKIN<5>"),TEXT(""),TEXT(""),TEXT("FFTXD"), },
354*569b7f92Snonaka /*100*/	{ TEXT("GPIO<100>"),TEXT("KP_MKIN<0>"),TEXT("DREQ<2>"),TEXT("FFCTS"),TEXT(""),TEXT(""),TEXT(""), },
355*569b7f92Snonaka /*101*/	{ TEXT("GPIO<101>"),TEXT("KP_MKIN<1>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
356*569b7f92Snonaka /*102*/	{ TEXT("GPIO<102>"),TEXT("KP_MKIN<2>"),TEXT(""),TEXT("FFRXD"),TEXT("nPCE<1>"),TEXT(""),TEXT(""), },
357*569b7f92Snonaka /*103*/	{ TEXT("GPIO<103>"),TEXT("CIF_DD<3>"),TEXT(""),TEXT(""),TEXT(""),TEXT("KP_MKOUT<0>"),TEXT(""), },
358*569b7f92Snonaka /*104*/	{ TEXT("GPIO<104>"),TEXT("CIF_DD<2>"),TEXT(""),TEXT(""),TEXT("PSKTSEL"),TEXT("KP_MKOUT<1>"),TEXT(""), },
359*569b7f92Snonaka /*105*/	{ TEXT("GPIO<105>"),TEXT("CIF_DD<1>"),TEXT(""),TEXT(""),TEXT("nPCE<2>"),TEXT("KP_MKOUT<2>"),TEXT(""), },
360*569b7f92Snonaka /*106*/	{ TEXT("GPIO<106>"),TEXT("CIF_DD<9>"),TEXT(""),TEXT(""),TEXT(""),TEXT("KP_MKOUT<3>"),TEXT(""), },
361*569b7f92Snonaka /*107*/	{ TEXT("GPIO<107>"),TEXT("CIF_DD<8>"),TEXT(""),TEXT(""),TEXT(""),TEXT("KP_MKOUT<4>"),TEXT(""), },
362*569b7f92Snonaka /*108*/	{ TEXT("GPIO<108>"),TEXT("CIF_DD<7>"),TEXT(""),TEXT(""),TEXT("CHOUT<0>"),TEXT("KP_MKOUT<5>"),TEXT(""), },
363*569b7f92Snonaka /*109*/	{ TEXT("GPIO<109>"),TEXT("MMDAT<1>"),TEXT("MSSDIO"),TEXT(""),TEXT("MMDAT<1>"),TEXT("MSSDIO"),TEXT(""), },
364*569b7f92Snonaka /*110*/	{ TEXT("GPIO<110>"),TEXT("MMDAT<2>/MMCCS<0>"),TEXT(""),TEXT(""),TEXT("MMDAT<2>/MMCCS<0>"),TEXT(""),TEXT(""), },
365*569b7f92Snonaka /*111*/	{ TEXT("GPIO<111>"),TEXT("MMDAT<3>/MMCCS<1>"),TEXT(""),TEXT(""),TEXT("MMDAT<3>/MMCCS<1>"),TEXT(""),TEXT(""), },
366*569b7f92Snonaka /*112*/	{ TEXT("GPIO<112>"),TEXT("MMCMD"),TEXT("nMSINS"),TEXT(""),TEXT("MMCMD"),TEXT(""),TEXT(""), },
367*569b7f92Snonaka /*113*/	{ TEXT("GPIO<113>"),TEXT(""),TEXT(""),TEXT("USB_P3_3"),TEXT("I2S_SYSCLK"),TEXT("AC97_RESET_n"),TEXT(""), },
368*569b7f92Snonaka /*114*/	{ TEXT("GPIO<114>"),TEXT("CIF_DD<1>"),TEXT(""),TEXT(""),TEXT("UEN"),TEXT("UVS0"),TEXT(""), },
369*569b7f92Snonaka /*115*/	{ TEXT("GPIO<115>"),TEXT("DREQ<0>"),TEXT("CIF_DD<3>"),TEXT("MBREQ"),TEXT("UEN"),TEXT("nUVS1"),TEXT("PWM_OUT<1>"), },
370*569b7f92Snonaka /*116*/	{ TEXT("GPIO<116>"),TEXT("CIF_DD<2>"),TEXT("AC97_SDATA_IN_0"),TEXT("UDET"),TEXT("DVAL<0>"),TEXT("nUVS2"),TEXT("MBGNT"), },
371*569b7f92Snonaka /*117*/	{ TEXT("GPIO<117>"),TEXT("SCL"),TEXT(""),TEXT(""),TEXT("SCL"),TEXT(""),TEXT(""), },
372*569b7f92Snonaka /*118*/	{ TEXT("GPIO<118>"),TEXT("SDA"),TEXT(""),TEXT(""),TEXT("SDA"),TEXT(""),TEXT(""), },
373*569b7f92Snonaka /*119*/	{ TEXT("GPIO<119>"),TEXT("USBHPWR<2>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
374*569b7f92Snonaka /*120*/	{ TEXT("GPIO<120>"),TEXT("USBHPEN<2>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
375*569b7f92Snonaka };
376*569b7f92Snonaka #endif
377*569b7f92Snonaka 
378*569b7f92Snonaka void
dumpPeripheralRegs(void)379*569b7f92Snonaka PXA2X0Architecture::dumpPeripheralRegs(void)
380*569b7f92Snonaka {
381*569b7f92Snonaka #ifdef REGDUMP
382*569b7f92Snonaka 	uint32_t reg;
383*569b7f92Snonaka 	bool first;
384*569b7f92Snonaka 	int i, n;
385*569b7f92Snonaka 
386*569b7f92Snonaka #define	GPIO_OFFSET(r,o) ((r == 3) ? (o + 0x100) : (o + (r * 4)))
387*569b7f92Snonaka 	// GPIO
388*569b7f92Snonaka 	if (platid_match(&platid, &platid_mask_CPU_ARM_XSCALE_PXA270))
389*569b7f92Snonaka 		n = PXA270_GPIO_REG_NUM;
390*569b7f92Snonaka 	else
391*569b7f92Snonaka 		n = PXA250_GPIO_REG_NUM;
392*569b7f92Snonaka 
393*569b7f92Snonaka 	vaddr_t gpio =
394*569b7f92Snonaka 	    _mem->mapPhysicalPage(0x40e00000, 0x1000, PAGE_READWRITE);
395*569b7f92Snonaka 	DPRINTF((TEXT("Dump GPIO registers.\n")));
396*569b7f92Snonaka 	for (i = 0; i < n; i++) {
397*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x00));
398*569b7f92Snonaka 		DPRINTF((TEXT("GPLR%d: 0x%08x\n"), i, reg));
399*569b7f92Snonaka 	}
400*569b7f92Snonaka 	for (i = 0; i < n; i++) {
401*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x0c));
402*569b7f92Snonaka 		DPRINTF((TEXT("GPDR%d: 0x%08x\n"), i, reg));
403*569b7f92Snonaka 	}
404*569b7f92Snonaka #if 0	/* write-only register */
405*569b7f92Snonaka 	for (i = 0; i < n; i++) {
406*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x18));
407*569b7f92Snonaka 		DPRINTF((TEXT("GPSR%d: 0x%08x\n"), reg));
408*569b7f92Snonaka 	}
409*569b7f92Snonaka 	for (i = 0; i < n; i++) {
410*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x24));
411*569b7f92Snonaka 		DPRINTF((TEXT("GPCR%d: 0x%08x\n"), reg));
412*569b7f92Snonaka 	}
413*569b7f92Snonaka #endif
414*569b7f92Snonaka 	for (i = 0; i < n; i++) {
415*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x30));
416*569b7f92Snonaka 		DPRINTF((TEXT("GRER%d: 0x%08x\n"), i, reg));
417*569b7f92Snonaka 	}
418*569b7f92Snonaka 	for (i = 0; i < n; i++) {
419*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x3c));
420*569b7f92Snonaka 		DPRINTF((TEXT("GFER%d: 0x%08x\n"), i, reg));
421*569b7f92Snonaka 	}
422*569b7f92Snonaka 	for (i = 0; i < n; i++) {
423*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x48));
424*569b7f92Snonaka 		DPRINTF((TEXT("GEDR%d: 0x%08x\n"), i, reg));
425*569b7f92Snonaka 	}
426*569b7f92Snonaka 	for (i = 0; i < n; i++) {
427*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + 0x54 + (i * 8));
428*569b7f92Snonaka 		DPRINTF((TEXT("GAFR%d_L: 0x%08x\n"), i, reg));
429*569b7f92Snonaka 		reg = VOLATILE_REF(gpio + 0x58 + (i * 8));
430*569b7f92Snonaka 		DPRINTF((TEXT("GAFR%d_U: 0x%08x\n"), i, reg));
431*569b7f92Snonaka 	}
432*569b7f92Snonaka 
433*569b7f92Snonaka 	//
434*569b7f92Snonaka 	// display detail
435*569b7f92Snonaka 	//
436*569b7f92Snonaka 
437*569b7f92Snonaka 	if (!platid_match(&platid, &platid_mask_CPU_ARM_XSCALE_PXA270))
438*569b7f92Snonaka 		return;
439*569b7f92Snonaka 
440*569b7f92Snonaka 	// header
441*569b7f92Snonaka 	DPRINTF((TEXT("pin#,function,name,rising,falling,status\n")));
442*569b7f92Snonaka 
443*569b7f92Snonaka 	n = PXA270_GPIO_NUM;
444*569b7f92Snonaka 	for (i = 0; i < n; i++) {
445*569b7f92Snonaka 		const TCHAR *fn_name, *pin_name;
446*569b7f92Snonaka 		uint32_t dir, altfn, redge, fedge, status;
447*569b7f92Snonaka 
448*569b7f92Snonaka 		// pin function
449*569b7f92Snonaka 		dir = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x0c));
450*569b7f92Snonaka 		dir = (dir >> (i % 32)) & 1;
451*569b7f92Snonaka 		altfn = VOLATILE_REF(gpio + 0x54 + ((i / 16) * 4));
452*569b7f92Snonaka 		altfn = (altfn >> ((i % 16) * 2)) & 3;
453*569b7f92Snonaka 		if (altfn == 0) {
454*569b7f92Snonaka 			if (dir == 0) {
455*569b7f92Snonaka 				fn_name = TEXT("GPIO_IN");
456*569b7f92Snonaka 			} else {
457*569b7f92Snonaka 				fn_name = TEXT("GPIO_OUT");
458*569b7f92Snonaka 			}
459*569b7f92Snonaka 			DPRINTF((TEXT("%d,%s,%s,"), i, fn_name,
460*569b7f92Snonaka 			    pxa270_gpioName[i][0]));
461*569b7f92Snonaka 		} else {
462*569b7f92Snonaka 			if (dir == 0) {
463*569b7f92Snonaka 				fn_name = TEXT("IN");
464*569b7f92Snonaka 				pin_name = pxa270_gpioName[i][altfn];
465*569b7f92Snonaka 			} else {
466*569b7f92Snonaka 				fn_name = TEXT("OUT");
467*569b7f92Snonaka 				pin_name = pxa270_gpioName[i][altfn+3];
468*569b7f92Snonaka 			}
469*569b7f92Snonaka 			DPRINTF((TEXT("%d,ALT_FN_%d_%s,%s,"), i, altfn,
470*569b7f92Snonaka 			    fn_name, pin_name));
471*569b7f92Snonaka 		}
472*569b7f92Snonaka 
473*569b7f92Snonaka 		// edge detect
474*569b7f92Snonaka 		redge = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x30));
475*569b7f92Snonaka 		redge = (redge >> (i % 32)) & 1;
476*569b7f92Snonaka 		fedge = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x3c));
477*569b7f92Snonaka 		fedge = (fedge >> (i % 32)) & 1;
478*569b7f92Snonaka 		DPRINTF((TEXT("%s,%s,"),
479*569b7f92Snonaka 		    redge ? TEXT("enable") : TEXT("disable"),
480*569b7f92Snonaka 		    fedge ? TEXT("enable") : TEXT("disable")));
481*569b7f92Snonaka 
482*569b7f92Snonaka 		// status
483*569b7f92Snonaka 		status = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x00));
484*569b7f92Snonaka 		status = (status >> (i % 32)) & 1;
485*569b7f92Snonaka 		DPRINTF((TEXT("%s"), status ? TEXT("high") : TEXT("low")));
486*569b7f92Snonaka 
487*569b7f92Snonaka 		DPRINTF((TEXT("\n")));
488*569b7f92Snonaka 	}
489*569b7f92Snonaka 	_mem->unmapPhysicalPage(gpio);
490*569b7f92Snonaka 
491*569b7f92Snonaka 	// LCDC
492*569b7f92Snonaka 	DPRINTF((TEXT("Dump LCDC registers.\n")));
493*569b7f92Snonaka 	vaddr_t lcdc =
494*569b7f92Snonaka 	    _mem->mapPhysicalPage(0x44000000, 0x1000, PAGE_READWRITE);
495*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x00);
496*569b7f92Snonaka 	DPRINTF((TEXT("LCCR0: 0x%08x\n"), reg));
497*569b7f92Snonaka 	DPRINTF((TEXT("-> ")));
498*569b7f92Snonaka 	first = true;
499*569b7f92Snonaka 	if (reg & (1U << 26)) {
500*569b7f92Snonaka 		DPRINTF((TEXT("%sLDDALT"), first ? TEXT("") : TEXT("/")));
501*569b7f92Snonaka 		first = false;
502*569b7f92Snonaka 	}
503*569b7f92Snonaka 	if (reg & (1U << 25)) {
504*569b7f92Snonaka 		DPRINTF((TEXT("%sOUC"), first ? TEXT("") : TEXT("/")));
505*569b7f92Snonaka 		first = false;
506*569b7f92Snonaka 	}
507*569b7f92Snonaka 	if (reg & (1U << 22)) {
508*569b7f92Snonaka 		DPRINTF((TEXT("%sLCDT"), first ? TEXT("") : TEXT("/")));
509*569b7f92Snonaka 		first = false;
510*569b7f92Snonaka 	}
511*569b7f92Snonaka 	if (reg & (1U << 9)) {
512*569b7f92Snonaka 		DPRINTF((TEXT("%sDPD"), first ? TEXT("") : TEXT("/")));
513*569b7f92Snonaka 		first = false;
514*569b7f92Snonaka 	}
515*569b7f92Snonaka 	if (reg & (1U << 7)) {
516*569b7f92Snonaka 		DPRINTF((TEXT("%sPAS"), first ? TEXT("") : TEXT("/")));
517*569b7f92Snonaka 		first = false;
518*569b7f92Snonaka 	}
519*569b7f92Snonaka 	if (reg & (1U << 2)) {
520*569b7f92Snonaka 		DPRINTF((TEXT("%sSDS"), first ? TEXT("") : TEXT("/")));
521*569b7f92Snonaka 		first = false;
522*569b7f92Snonaka 	}
523*569b7f92Snonaka 	if (reg & (1U << 1)) {
524*569b7f92Snonaka 		DPRINTF((TEXT("%sCMS"), first ? TEXT("") : TEXT("/")));
525*569b7f92Snonaka 		first = false;
526*569b7f92Snonaka 	}
527*569b7f92Snonaka 	if (reg & (1U << 0)) {
528*569b7f92Snonaka 		DPRINTF((TEXT("%sENB"), first ? TEXT("") : TEXT("/")));
529*569b7f92Snonaka 		first = false;
530*569b7f92Snonaka 	}
531*569b7f92Snonaka 	DPRINTF((TEXT("\n")));
532*569b7f92Snonaka 	DPRINTF((TEXT("-> PDD = 0x%02x\n"), (reg >> 12) & 0xff));
533*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x04);
534*569b7f92Snonaka 	DPRINTF((TEXT("LCCR1: 0x%08x\n"), reg));
535*569b7f92Snonaka 	DPRINTF((TEXT("-> BLW = 0x%02x, ELW = 0x%02x, HSW = 0x%02x, PPL = 0x%03x\n"),
536*569b7f92Snonaka 	    (reg >> 24) & 0xff, (reg >> 16) & 0xff, (reg >> 10) & 0x3f,
537*569b7f92Snonaka 	    reg & 0x3ff));
538*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x08);
539*569b7f92Snonaka 	DPRINTF((TEXT("LCCR2: 0x%08x\n"), reg));
540*569b7f92Snonaka 	DPRINTF((TEXT("-> BFW = 0x%02x, EFW = 0x%02x, VSW = 0x%02x, LPP = 0x%03x\n"),
541*569b7f92Snonaka 	    (reg >> 24) & 0xff, (reg >> 16) & 0xff, (reg >> 10) & 0x3f,
542*569b7f92Snonaka 	    reg & 0x3ff));
543*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x0c);
544*569b7f92Snonaka 	DPRINTF((TEXT("LCCR3: 0x%08x\n"), reg));
545*569b7f92Snonaka 	DPRINTF((TEXT("-> ")));
546*569b7f92Snonaka 	first = true;
547*569b7f92Snonaka 	if (reg & (1U << 27)) {
548*569b7f92Snonaka 		DPRINTF((TEXT("%sDPC"), first ? TEXT("") : TEXT("/")));
549*569b7f92Snonaka 		first = false;
550*569b7f92Snonaka 	}
551*569b7f92Snonaka 	if (reg & (1U << 23)) {
552*569b7f92Snonaka 		DPRINTF((TEXT("%sOEP"), first ? TEXT("") : TEXT("/")));
553*569b7f92Snonaka 		first = false;
554*569b7f92Snonaka 	}
555*569b7f92Snonaka 	if (reg & (1U << 22)) {
556*569b7f92Snonaka 		DPRINTF((TEXT("%sPCP"), first ? TEXT("") : TEXT("/")));
557*569b7f92Snonaka 		first = false;
558*569b7f92Snonaka 	}
559*569b7f92Snonaka 	if (reg & (1U << 21)) {
560*569b7f92Snonaka 		DPRINTF((TEXT("%sHSP"), first ? TEXT("") : TEXT("/")));
561*569b7f92Snonaka 		first = false;
562*569b7f92Snonaka 	}
563*569b7f92Snonaka 	if (reg & (1U << 20)) {
564*569b7f92Snonaka 		DPRINTF((TEXT("%sVSP"), first ? TEXT("") : TEXT("/")));
565*569b7f92Snonaka 		first = false;
566*569b7f92Snonaka 	}
567*569b7f92Snonaka 	if (reg & (1U << 19)) {
568*569b7f92Snonaka 		DPRINTF((TEXT("%sVSP"), first ? TEXT("") : TEXT("/")));
569*569b7f92Snonaka 		first = false;
570*569b7f92Snonaka 	}
571*569b7f92Snonaka 	DPRINTF((TEXT("\n")));
572*569b7f92Snonaka 	DPRINTF((TEXT("-> PDFOR = %d\n"), (reg >> 30) & 3));
573*569b7f92Snonaka 	DPRINTF((TEXT("-> BPP = 0x%02x\n"), ((reg >> 29) & 1 << 3) | ((reg >> 24) & 7)));
574*569b7f92Snonaka 	DPRINTF((TEXT("-> API = 0x%x\n"), (reg >> 16) & 0xf));
575*569b7f92Snonaka 	DPRINTF((TEXT("-> ACB = 0x%02x\n"), (reg >> 8) & 0xff));
576*569b7f92Snonaka 	DPRINTF((TEXT("-> PCD = 0x%02x\n"), reg & 0xff));
577*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x10);
578*569b7f92Snonaka 	DPRINTF((TEXT("LCCR4: 0x%08x\n"), reg));
579*569b7f92Snonaka 	DPRINTF((TEXT("-> PCDDIV = %d\n"), (reg >> 31) & 1));
580*569b7f92Snonaka 	DPRINTF((TEXT("-> PAL_FOR = %d\n"), (reg >> 15) & 3));
581*569b7f92Snonaka 	DPRINTF((TEXT("-> K3 = 0x%x, K2 = 0x%x, K1 = 0x%x\n"),
582*569b7f92Snonaka 	    (reg >> 6) & 7, (reg >> 3) & 7, reg & 7));
583*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x14);
584*569b7f92Snonaka 	DPRINTF((TEXT("LCCR5: 0x%08x\n"), reg));
585*569b7f92Snonaka 	reg = VOLATILE_REF(lcdc + 0x54);
586*569b7f92Snonaka 	DPRINTF((TEXT("LCDBSCNTR: 0x%08x\n"), reg));
587*569b7f92Snonaka 	_mem->unmapPhysicalPage(lcdc);
588*569b7f92Snonaka #endif
5893af75740Srafal }
590