Jae-Min Ryu
2012-Feb-13  08:03 UTC
[PATCH 11/14] arm: add files that are required to support the Tegra2 harmony board.
arm: add files that are required to support the Tegra2 harmony board.
 xen/arch/arm/tegra/Makefile        |    3 +-
 xen/arch/arm/tegra/entry.S         |   33 ++++++++
 xen/arch/arm/tegra/tegra250.c      |  330
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 xen/arch/arm/tegra/timer.c         |  110 +++++++++++++++++++++++++++
 xen/arch/arm/xen/cpu.c             |    5 +
 xen/arch/arm/xen/fault.c           |    1 -
 xen/arch/arm/xen/irq.c             |   46 +++++++++++-
 xen/arch/arm/xen/mm.c              |   24 ++++++
 xen/arch/arm/xen/setup.c           |    6 +-
 xen/arch/arm/xen/time.c            |    1 -
 xen/drivers/char/console.c         |    4 +
 xen/include/asm-arm/gic.h          |  101 +++++++++++++++++++++++++
 xen/include/asm-arm/irq.h          |    3 +-
 xen/include/asm-arm/tegra/avp.h    |  144 ++++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/tegra/config.h |    7 +-
 xen/include/asm-arm/tegra/irqs.h   |   60 +++++++++++++++
 xen/include/asm-arm/tegra/smp.h    |    7 +
 xen/include/asm-arm/tegra/tegra.h  |   75 ++++++++++++++++++
 xen/include/xen/irq.h              |    6 +
 19 files changed, 952 insertions(+), 14 deletions(-)
Signed-off-by: Jaemin Ryu <jm77.ryu@samsung.com>
diff -r 6af8a89c99cd xen/arch/arm/tegra/Makefile
--- a/xen/arch/arm/tegra/Makefile	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/tegra/Makefile	Sun Feb 12 15:04:06 2012 +0900
@@ -1,1 +1,2 @@
-obj-y += dummy.o
+obj-y += timer.o entry.o tegra250.o
+
diff -r 6af8a89c99cd xen/arch/arm/tegra/entry.S
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/arm/tegra/entry.S	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,33 @@
+/*
+ * entry.S
+ *
+ * Copyright (C) 2008 Samsung Electronics
+ *          JaeMin Ryu  <jm77.ryu@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public version 2 of License as
published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <xen/config.h> 
+#inlcude <asm/arch/irqs.h>
+#include <asm/page.h>
+#include <asm/system.h>
+#include <asm/asm-macros.h>
+#include <asm/cpu-domain.h>
+#include <asm/asm-offsets.h>
+
+	.align	5
+
+ENTRY(arch_context_switch)
+	mov	pc, lr
+
diff -r 6af8a89c99cd xen/arch/arm/tegra/tegra250.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/arm/tegra/tegra250.c	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,330 @@
+/*
+ * tegra250.c
+ *
+ * Copyright (C) 2008-2011 Samsung Electronics 
+ *         JaeMin Ryu  <jm77.ryu@samsung.com>
+ *
+ * Secure Xen on ARM architecture designed by Sang-bum Suh consists of 
+ * Xen on ARM and the associated access control.
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public version 2 of License as
published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <xen/config.h>
+#include <xen/spinlock.h>
+#include <xen/lib.h>
+#include <xen/serial.h>
+#include <xen/errno.h>
+#include <xen/smp.h>
+#include <xen/irq.h>
+#include <xen/mm.h>
+#include <asm/mmu.h>
+#include <asm/platform.h>
+#include <asm/gic.h>
+#include <asm/regs.h>
+#include <asm/io.h>
+#include <asm/flushtlb.h>
+#include <asm/arch/tegra.h>
+#include <asm/arch/irqs.h>
+
+#define TEGRA250_MEMORY_BASE     0x00000000UL
+#define TEGRA250_MEMORY_SIZE     0x40000000UL
+
+#define TEGRA250_DEV_BASE        0x50000000UL
+#define TEGRA250_DEV_SIZE        0x00300000UL
+
+DECLARE_MEMORY_MAP(tegra250) = {
+        MEMMAP_ENTRY(TEGRA250_MEMORY_BASE, TEGRA250_MEMORY_SIZE,
MEMORY_TYPE_RAM, L1E_TYPE_HYPERVISOR),
+        MEMMAP_ENTRY(TEGRA250_DEV_BASE,    TEGRA250_DEV_SIZE,   
MEMORY_TYPE_DEV, L1E_TYPE_DEVICE)
+};
+
+// Register APBDMA_IRQ_MASK_CLR_0
+#define APBDMA_IRQ_STA_CPU_0	(0x14)
+#define APBDMA_IRQ_MASK_SET_0	(0x20)
+#define APBDMA_IRQ_MASK_CLR_0	(0x24)
+
+void *tegra_gic_cpu_base[MAX_PHYS_CPUS]  = {0, 0};
+void *tegra_gic_dist_base = 0;
+
+struct tegra_irq_ctrl {
+	unsigned int irq_start;
+	void  *reg;
+};
+
+static struct tegra_irq_ctrl tegra_irq_ctrl[(INT_SYS_NR + INT_SYS_SZ - 1) /
INT_SYS_SZ];
+
+#define gic_irq(irq)	(irq)
+
+static void tegra_mask(struct irq_desc *desc)
+{
+	struct tegra_irq_ctrl *chip;
+	unsigned int irq = desc_to_irq(desc);
+	unsigned int mask = 1 << (irq % 32);
+
+	mmio_writel(mask, tegra_gic_dist_base + _ICDICER + (gic_irq(irq) / 32) * 4);
+
+	irq -= INT_PRI_BASE;
+	chip = &tegra_irq_ctrl[irq / INT_SYS_SZ];
+	mmio_writel(1 << (irq & 31), chip->reg + ICTLR_CPU_IER_CLR_0);
+}
+
+static void tegra_unmask(struct irq_desc *desc)
+{
+	struct tegra_irq_ctrl *chip;
+	unsigned int irq = desc_to_irq(desc);
+	unsigned int mask = 1 << (irq % 32);
+
+	mmio_writel(mask, tegra_gic_dist_base + _ICDISER + (gic_irq(irq) / 32) * 4);
+
+	irq -= INT_PRI_BASE;
+	chip = &tegra_irq_ctrl[irq / INT_SYS_SZ];
+	mmio_writel(1 << (irq & 31), chip->reg + ICTLR_CPU_IER_SET_0);
+}
+
+static void tegra_ack(struct irq_desc *desc)
+{
+	unsigned int irq = desc_to_irq(desc);
+	unsigned int mask = 1 << (irq % 32);
+	unsigned int cpu = smp_processor_id();
+
+	tegra_mask(desc);
+
+        mmio_writel(mask, tegra_gic_dist_base + _ICDICER + (gic_irq(irq) / 32)
* 4);
+        mmio_writel(gic_irq(irq), tegra_gic_cpu_base[cpu] + _ICCEOIR);
+}
+
+static void tegra_end(struct irq_desc *desc)
+{
+	tegra_unmask(desc);
+}
+
+hw_irq_controller tegra_irq_controller = {
+	.typename = "level",
+	.startup  = tegra_unmask,
+	.shutdown = tegra_mask,
+	.enable	  = tegra_unmask,
+	.disable  = tegra_mask,
+	.ack	  = tegra_ack,
+	.end	  = tegra_end,
+};
+
+static void tegra250_irq_init()
+{
+	unsigned int max_irq, i;
+	unsigned int cpu = smp_processor_id();
+	unsigned long cpumask = 1 << cpu;
+
+	for (i = 0; i < ARRAY_SIZE(tegra_irq_ctrl); i++) {
+		tegra_irq_ctrl[i].irq_start = INT_PRI_BASE + INT_SYS_SZ * i;
+		tegra_irq_ctrl[i].reg = IO_ADDRESS(INT_PPI_ADDRESS(i));
+		mmio_writel(0xFFFFFFFF, tegra_irq_ctrl[i].reg + ICTLR_CPU_IER_CLR_0);
+		mmio_writel(0x00000000, tegra_irq_ctrl[i].reg + ICTLR_CPU_IEP_CLASS_0);
+	}
+
+	for (i = INT_PRI_BASE; i < INT_GPIO_BASE; i++) {
+		irq_desc[i].handler = &tegra_irq_controller;
+	}
+
+	cpumask |= cpumask << 8;
+	cpumask |= cpumask << 16;
+
+	tegra_gic_dist_base = IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE);
+	tegra_gic_cpu_base[cpu] = IO_ADDRESS(TEGRA_GIC_PROC_IF_BASE);
+
+	mmio_writel(0, tegra_gic_dist_base + _ICDDCR);
+	
+        /*
+         * Find out how many interrupts are supported.
+         */
+        max_irq = mmio_readl(tegra_gic_dist_base + _ICDICTR) & 0x1f;
+        max_irq = (max_irq + 1) * 32;
+
+        /*
+         * The GIC only supports up to 1020 interrupt sources.
+         * Limit this to either the architected maximum, or the
+         * platform maximum.
+         */
+        if (max_irq > max(1020, NR_IRQS))
+                max_irq = max(1020, NR_IRQS);
+
+        /*
+         * Set all global interrupts to be level triggered, active low.
+         */
+        for (i = 32; i < max_irq; i += 16)
+                mmio_writel(0, tegra_gic_dist_base + _ICDICFR + i * 4 / 16);
+
+        /*
+         * Set all global interrupts to this CPU only.
+         */
+        for (i = 32; i < max_irq; i += 4)
+                mmio_writel(cpumask, tegra_gic_dist_base + _ICDIPTR + i * 4 /
4);
+        /*
+         * Set priority on all interrupts.
+         */
+        for (i = 0; i < max_irq; i += 4)
+                mmio_writel(0xa0a0a0a0, tegra_gic_dist_base + _ICDIPR + i * 4 /
4);
+
+        /*
+         * Disable all interrupts.
+         */
+        for (i = 0; i < max_irq; i += 32)
+                mmio_writel(0xffffffff, tegra_gic_dist_base + _ICDICER + i * 4
/ 32);
+
+        mmio_writel(1, tegra_gic_dist_base + _ICDDCR);
+
+        mmio_writel(0xf0, tegra_gic_cpu_base[cpu] + _ICCPMR);
+        mmio_writel(1, tegra_gic_cpu_base[cpu] + _ICCICR);
+
+
+}
+
+#define CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR_0  (0x344)
+#define CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0      (0x4c)
+#define CPU_CLK_STOP(cpu)                       (0x1<<(8+cpu))
+#define CPU_RESET(cpu)                          (0x1011ul<<(cpu))
+
+#define EVP_CPU_RESET_VECTOR_0          	(0x100)
+#define FLOW_CTRL_HALT_CPUx_EVENTS(cpu) 	((cpu) ? ((cpu - 1) * 0x8 + 0x14) :
0x0)
+
+
+volatile int tegra250_core_map = 1;
+
+asm(
+".type tegra250_slave_cpu_start, #function	\n"
+".global tegra250_slave_cpu_start		\n"
+"tegra250_slave_cpu_start:			\n"
+"	msr	cpsr_c, #0xD3			\n"
+"	mov	r0, #0				\n"
+"	mcr	p15, 2, r0, c0, c0, 0		\n"
+"	mrc	p15, 1, r0, c0, c0, 0		\n"
+"	ldr	r1, =0x7FFF			\n"
+"	and	r2, r1, r0, lsr #13		\n"
+"	ldr	r1, =0x3FF			\n"
+"	and	r3, r1, r0, lsr #3		\n"
+"	add	r2, r2, #1			\n"
+"	and	r0, r0, #0x07			\n"
+"	add	r0, r0, #4			\n"
+"	clz	r1, r3				\n"
+"	add	r4, r3, #1			\n"
+"1:	sub	r2, r2, #1			\n"
+"	mov	r3, r4				\n"
+"2:	subs	r3, r3, #1			\n"
+"	mov	r5, r3, lsl r1			\n"
+"	mov	r6, r2, lsl r0			\n"
+"	orr	r5, r5, r6			\n"
+"	mcr	p15, 0, r5, c7, c6, 2		\n"
+"	bgt	2b				\n"
+"	cmp	r2, #0				\n"
+"	bgt	1b				\n"
+"	dsb					\n"
+"	isb					\n"
+"	mrc	p15, 0, r0, c0, c0, 5		\n"
+"	and	r0, r0, #15			\n"
+"	adr	r4, 1f				\n"
+"	ldmia	r4, {r5, r6}			\n"
+"	sub	r4, r4, r5			\n"
+"	add	r6, r6, r4			\n"
+"	mov	r1, #1				\n"
+"	lsl	r1, r1, r0			\n"
+"spin:	ldr	r7, [r6]			\n"
+"	tst	r7, r1				\n"
+"	beq	spin				\n"
+"	b	slave_cpu_start			\n"
+"1:	.long	.				\n"
+"	.long	tegra250_core_map		\n"
+);
+
+int wakeup_cpu(unsigned int cpu)
+{
+	tegra250_core_map |= 1 <<  cpu;
+
+	cpu_flush_cache_all();
+
+	return 0;
+}
+
+extern void tegra250_slave_cpu_start(void);
+
+static void tegra250_evp_init(void)
+{
+	unsigned long r, org, loop, ctrl;
+
+	/* Initialize Snoop Control Unit */
+	ctrl = mmio_readl(IO_ADDRESS(TEGRA_SCU_BASE) + 0x0);
+	ctrl |= 1;
+	mmio_writel(ctrl, IO_ADDRESS(TEGRA_SCU_BASE) + 0x0);
+
+	org = mmio_readl(IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) +
EVP_CPU_RESET_VECTOR_0);
+
+	/* Set boot entry */
+	mmio_writel(__pa(tegra250_slave_cpu_start),
IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) + EVP_CPU_RESET_VECTOR_0);
+
+	dsb();
+	isb();
+
+	/* Halt CPU */
+	mmio_writel(0, IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) +
FLOW_CTRL_HALT_CPUx_EVENTS(1));
+
+	dsb();
+	isb();
+
+	/* CPU Clock Stop */
+	r = mmio_readl(IO_ADDRESS(TEGRA_CLK_RESET_BASE) +
CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0);
+	r &= ~CPU_CLK_STOP(1);
+	mmio_writel(r, IO_ADDRESS(TEGRA_CLK_RESET_BASE) +
CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0);
+
+	dsb();
+	isb();
+
+	/* Restart Slave CPU */
+	mmio_writel(CPU_RESET(1), IO_ADDRESS(TEGRA_CLK_RESET_BASE) +
CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR_0);
+
+	dsb();
+	isb();
+
+        /* Wait util the power unit is in stable */
+        loop = 10000;
+        while((--loop) > 0 );
+}
+
+void tegra250_ioremap(void)
+{
+	map_pages_to_xen(IO_ADDRESS(TEGRA_ARM_CPU_BASE),
+		TEGRA_ARM_CPU_BASE >> PAGE_SHIFT, 0x100000 >> PAGE_SHIFT,
+		L1E_TYPE_DEVICE);
+
+	map_pages_to_xen(IO_ADDRESS(TEGRA_PPSB_DEVICE_BASE),
+		TEGRA_PPSB_DEVICE_BASE >> PAGE_SHIFT, 0x100000 >> PAGE_SHIFT, 
+		L1E_TYPE_DEVICE);
+
+	map_pages_to_xen(IO_ADDRESS(TEGRA_APB_DEVICE_BASE),
+		TEGRA_APB_DEVICE_BASE >> PAGE_SHIFT, 0x100000 >> PAGE_SHIFT,
+		L1E_TYPE_DEVICE);
+}
+
+int machine_setup(void)
+{
+	cpu_topology_init(2);
+
+	tegra250_ioremap();
+
+	tegra250_evp_init();
+
+	tegra250_irq_init();
+
+	tegra250_timer_init();
+
+	return 0;
+}
+
diff -r 6af8a89c99cd xen/arch/arm/tegra/timer.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/arm/tegra/timer.c	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,110 @@
+/*
+ * arch/arm/mach-tegra/timer.c
+ *
+ * Timer and clock event support for NVIDIA Tegra SoCs
+ *
+ * Copyright (c) 2008-2009, NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <xen/sched.h>
+#include <xen/irq.h>
+#include <xen/init.h>
+#include <xen/softirq.h>
+#include <xen/spinlock.h>
+#include <asm/time.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/tegra.h>
+
+
+#define CLK_RST_CONTROLLER_OSC_CTRL_0	0x50
+
+#define TIMER1_OFFS			0x00  /* reserved for AVP */
+#define TIMER2_OFFS			0x08  /* reserved for AVP */
+#define TIMER3_OFFS			0x50  /* used as OS CPU event timer */
+#define TIMER4_OFFS			0x58  /* reserved as LP2 wakeup trigger */
+
+#define TIMER_TMR_PTV_0			0x0
+#define TIMER_TMR_PCR_0			0x4
+
+#define TIMERUS_OFFS			0x10
+#define TIMERUS_CNTR_1US_0		0x0
+#define TIMERUS_USEC_CFG_0		0x4
+
+#define NSEC_PER_SEC			1000000000L
+
+void tegra_clockevent_interrupt(int irq, void *dev_id, struct cpu_user_regs
*regs)
+{
+        mmio_writel(1 << 30, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER3_OFFS) +
TIMER_TMR_PCR_0);
+}
+
+static struct irqaction tegra_clockevent_irq = {
+        .name           = "Timer_event",
+        .handler        = tegra_clockevent_interrupt,
+};
+
+void tegra_lp2wake_interrupt(int irq, void *dev_id, struct cpu_user_regs *regs)
+{
+        mmio_writel(1<<30, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER4_OFFS) +
TIMER_TMR_PCR_0);
+}
+
+static struct irqaction tegra_lp2wake_irq = {
+        .name           = "timer_lp2wake",
+        .handler        = tegra_lp2wake_interrupt,
+};
+
+static unsigned long measure_input_freq(unsigned int *m, unsigned int *n)
+{
+	void *clk_rst = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
+	unsigned long osc = mmio_readl(clk_rst + CLK_RST_CONTROLLER_OSC_CTRL_0);
+	osc >>= 30;
+
+	switch (osc) {
+		case 0: if (m && n) { *m=1; *n=13; } return 13000;
+		case 1: if (m && n) { *m=5; *n=96; } return 19200;
+		case 2: if (m && n) { *m=1; *n=12; } return 12000;
+		case 3: if (m && n) { *m=1; *n=26; } return 26000;
+	}
+
+	return 0;
+}
+
+void tegra250_timer_init(void)
+{
+        void *tmr;
+        unsigned int m, n;
+        unsigned long val;
+        u32 reg;
+
+        tmr = IO_ADDRESS(TEGRA_TMR1_BASE + TIMERUS_OFFS);
+        val = measure_input_freq(&m, &n);
+
+        val = ((m-1)<<8) | (n-1);
+
+        mmio_writel(val, tmr + TIMERUS_USEC_CFG_0);
+        mmio_writel(0, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER3_OFFS)  +
TIMER_TMR_PTV_0);
+
+        reg = 0xc000270f;
+        mmio_writel(reg, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER3_OFFS) +
TIMER_TMR_PTV_0);
+
+        if (setup_irq(INT_TMR3, &tegra_clockevent_irq)) {
+                BUG();
+        }
+        if (setup_irq(INT_TMR4, &tegra_lp2wake_irq)) {
+                BUG();
+        }
+}
+
diff -r 6af8a89c99cd xen/arch/arm/xen/cpu.c
--- a/xen/arch/arm/xen/cpu.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/xen/cpu.c	Sun Feb 12 15:04:06 2012 +0900
@@ -53,6 +53,11 @@ int __cpu_up(unsigned int cpu)
 {
 	int ret = 0;
 
+	ret = wakeup_cpu(cpu);
+	if (!ret) {
+		return -EINVAL;
+	}
+
 	while(!cpu_online(cpu)) {
 		cpu_relax();
 		process_pending_softirqs();
diff -r 6af8a89c99cd xen/arch/arm/xen/fault.c
--- a/xen/arch/arm/xen/fault.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/xen/fault.c	Sun Feb 12 15:04:06 2012 +0900
@@ -33,7 +33,6 @@
 #include <asm/processor.h>
 #include <asm/guest_access.h>
 #include <asm/system.h>
-#include <asm/memory.h>
 
 asmlinkage void __div0(void)
 {
diff -r 6af8a89c99cd xen/arch/arm/xen/irq.c
--- a/xen/arch/arm/xen/irq.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/xen/irq.c	Sun Feb 12 15:04:06 2012 +0900
@@ -38,9 +38,27 @@ hw_irq_controller no_irq_type = {
 	.shutdown = irq_shutdown_none,
 	.enable   = irq_enable_none,
 	.disable  = irq_disable_none,
+	.end	  = irq_end_none,
+	.ack	  = irq_ack_none,
 };
 
-struct irq_desc *irq_desc;
+//struct irq_desc *irq_desc;
+
+irq_desc_t irq_desc[NR_IRQS] = {
+        [0 ... NR_IRQS - 1] = {
+                .status = IRQ_DISABLED,
+                .handler = &no_irq_type,
+                .action = NULL,
+                .lock = SPIN_LOCK_UNLOCKED
+        }
+};
+
+struct irq_cfg irq_cfg[NR_IRQS] = {
+        [0 ... NR_IRQS - 1] ={
+                .irq = 0
+        }
+};
+
 
 int pirq_guest_unmask(struct domain *d)
 {
@@ -75,6 +93,32 @@ struct pirq *alloc_pirq_struct(struct do
 	return NULL;
 }
 
+int setup_irq(unsigned int irq, struct irqaction *new)
+{
+	unsigned long flags;
+	struct irq_desc *desc;
+
+	if(irq >= NR_IRQS) {
+		printk("BAD IRQ = %d\n", irq);
+	}
+
+	desc = irq_to_desc(irq);
+
+	spin_lock_irqsave(&desc->lock, flags);
+	desc->action = new;
+	if (desc->handler) {
+		if (desc->handler->startup) {
+			desc->handler->startup(desc);
+		} else if(desc->handler->enable) {
+			desc->handler->enable(desc);
+		}
+	}
+
+	spin_unlock_irqrestore(&desc->lock, flags);
+
+	return 0;
+}
+
 int arch_init_one_irq_desc(struct irq_desc *desc)
 {
 	NOT_YET();
diff -r 6af8a89c99cd xen/arch/arm/xen/mm.c
--- a/xen/arch/arm/xen/mm.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/xen/mm.c	Sun Feb 12 15:04:06 2012 +0900
@@ -255,3 +255,27 @@ int alloc_page_map(unsigned long virt, u
 	return 0;
 }
 
+int map_pages_to_xen(unsigned long virt, unsigned long mfn, int nr, unsigned
long flags)
+{
+        unsigned long vaddr = round_down(virt, PAGE_SIZE);
+        unsigned long maddr = mfn << PAGE_SHIFT;
+        unsigned int end = virt + (nr << PAGE_SHIFT);
+
+        l1e_t *l1e = l1_linear_offset_xen(vaddr);
+
+        do {
+                unsigned long limit = (vaddr + SECTION_SIZE) &
(SECTION_MASK);
+                limit = (limit < end) ? limit : end;
+
+                if (((vaddr | maddr | limit) & ~SECTION_MASK) == 0) {
+                        *l1e = MK_L1E(maddr, flags);
+                        pte_sync(l1e);
+
+                        vaddr += SECTION_SIZE;
+                        maddr += SECTION_SIZE;
+                }
+        } while(l1e++, vaddr < end);
+
+        return 0;
+}
+
diff -r 6af8a89c99cd xen/arch/arm/xen/setup.c
--- a/xen/arch/arm/xen/setup.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/xen/setup.c	Sun Feb 12 15:04:06 2012 +0900
@@ -64,11 +64,11 @@ static unsigned int dom0_size = 256 * 10
 integer_param("dom0_size", dom0_size);
 
 //static unsigned long dom0_image_start = 0x40B00000UL;
-static unsigned long dom0_image_start = 0x00B00000UL;
+static unsigned long dom0_image_start = 0xA00000UL;
 integer_param("image_start", dom0_image_start);
 
 //static unsigned long dom0_image_size = 0xA00000UL;
-static unsigned long dom0_image_size = 0xA00000UL;
+static unsigned long dom0_image_size = 0x1400000UL;
 integer_param("image_length", dom0_image_size);
 
 void arch_get_xen_caps(xen_capabilities_info_t *info)
@@ -211,6 +211,8 @@ asmlinkage void start_xen(void)
 
 	tasklet_subsys_init();
 
+	machine_setup();
+
 	timer_init();
 
 	idle_domain_init();
diff -r 6af8a89c99cd xen/arch/arm/xen/time.c
--- a/xen/arch/arm/xen/time.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/arch/arm/xen/time.c	Sun Feb 12 15:04:06 2012 +0900
@@ -79,5 +79,4 @@ void domain_set_time_offset(struct domai
 
 void timekeeping_init(void)
 {
-	NOT_YET();
 }
diff -r 6af8a89c99cd xen/drivers/char/console.c
--- a/xen/drivers/char/console.c	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/drivers/char/console.c	Sun Feb 12 15:04:06 2012 +0900
@@ -412,7 +412,11 @@ long do_console_io(int cmd, int count, X
  * *****************************************************
  */
 
+#if defined(__arm__)
+static bool_t console_locks_busted = 1;
+#else
 static bool_t console_locks_busted;
+#endif
 
 static void __putstr(const char *str)
 {
diff -r 6af8a89c99cd xen/include/asm-arm/gic.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-arm/gic.h	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,101 @@
+/*
+ * gic.h
+ *
+ * Copyright (C) 2011 Samsung Electronics
+ *          Jaemin Ryu  <jm77.ryu@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public version 2 of License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __ARM_GIC_H__
+#define __ARM_GIC_H__
+
+
+/* Distributor Register Map */
+#define _ICDDCR		0x000  /* Distributor Control Register */
+#define _ICDICTR	0x004  /* Interrupt Controller Type Register */
+#define _ICDIIDR	0x008  /* Distributor Implementer Id Register */
+#define _ICDISR0	0x080  /* Interrupt Security Register */
+#define _ICDISR1	0x084  /* Interrupt Security Register */
+#define _ICDISR2	0x088  /* Interrupt Security Register */
+#define _ICDISR3	0x08c  /* Interrupt Security Register */
+#define _ICDISR4	0x090  /* Interrupt Security Register */
+#define _ICDISER	0x100  /* Interrupt Set-Enable Register */
+#define _ICDICER	0x180  /* Interrupt Clear-Enable Register */
+#define _ICDISPR	0x200  /* Interrupt Set-Pending Register */
+#define _ICDICPR	0x280  /* Interrupt Clear-Pending Register */
+#define _ICDABR		0x300  /* Active Bit Registers */
+#define _ICDIPR		0x400  /* Interrupt Priority Register */
+#define _ICDIPTR	0x800  /* Interrupt Processor Targets Registers */
+#define _ICDICFR	0xC00  /* Interrupt Configuration Registers */
+#define _ICDSGIR	0xF00  /* Software Generated Interrupt Register */
+
+#define ICDDCR()	(_ICDDCR)
+#define ICDICTR()	(_ICDICTR)
+#define ICDISR(x)	(_ICDISR0 + (x / BITS_PER_LONG) * BYTES_PER_LONG)
+#define ICDISER(x)	(_ICDISER + (x / BITS_PER_LONG) * BYTES_PER_LONG)
+#define ICDICER(x)	(_ICDICER + (x / BITS_PER_LONG) * BYTES_PER_LONG)
+#define ICDISPR(x)	(_ICDISPR + (x / BITS_PER_LONG) * BYTES_PER_LONG)
+#define ICDICPR(x)	(_ICDICPR + (x / BITS_PER_LONG) * BYTES_PER_LONG)
+#define ICDABR(x)	(_ICDABR  + (x / BITS_PER_LONG) * BYTES_PER_LONG)
+#define ICDIPR(x)	(_ICDIPR  + (x /  4) * BYTES_PER_LONG)
+#define ICDIPTR(x)	(_ICDIPTR + (x /  4) * BYTES_PER_LONG)
+#define ICDSGIR()	(_ICDSGIR)
+
+/* CPU Interface Register Map */
+#define _ICCICR		0x000  /* CPU Interface Control Register */
+#define _ICCPMR		0x004  /* Interrupt Priority Mask Register */
+#define _ICCBPR		0x008  /* Binrary Point Register */
+#define _ICCIAR		0x00C  /* Interrupt Acknowledge Register */
+#define _ICCEOIR	0x010  /* End of Interrupt Register */
+#define _ICCRPR		0x014  /* Running Priority Register */
+#define _ICCHPIR	0x018  /* Highest Pending Interrupt Register */
+#define _ICCABPR	0x01C  /* Aliased Binary Point Register */
+#define _ICCIIDR	0x0FC  /* CPU Interface Id Register */
+
+#define ICCICR()	(_ICCICR)
+#define ICCPMR()	(_ICCPMR)
+#define ICCBPR()	(_ICCBPR)
+#define ICCIAR()	(_ICCIAR)
+#define ICCEOIR()	(_ICCEOIR)
+#define ICCRPR()	(_ICCRPR)
+#define ICCHPIR()	(_ICCHPIR)
+#define ICCIIDR()	(_ICCIIDR)
+
+#define SECURE_INTERRUPT	0
+#define NONSECURE_INTERRUPT	1
+
+#define SGI(x)			(x)
+#define PPI(x)			(x + 16)
+#define SPI(x)			(x + 32)
+
+#ifndef __ASSEMBLY__
+
+#include <xen/types.h>
+
+#define GIC_DISTRIBUTOR(x)      (_gic_distributor_base + x)
+#define GIC_CPU_INTERFACE(x)    (_gic_cpu_base + x)
+
+void gic_set_cpu(unsigned int irq, unsigned int mask);
+void gic_set_irq_priority(unsigned int irq, unsigned int priority);
+void gic_ack_irq(unsigned int irq);
+void gic_mask_irq(unsigned int irq);
+void gic_unmask_irq(unsigned int irq);
+void gic_end_irq(unsigned int irq);
+void gic_change_irq_state(unsigned int irq, unsigned int state);
+
+extern void *_gic_cpu_base[NR_CPUS];
+extern void *_gic_distributor_base;
+#endif
+#endif
diff -r 6af8a89c99cd xen/include/asm-arm/irq.h
--- a/xen/include/asm-arm/irq.h	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/include/asm-arm/irq.h	Sun Feb 12 15:04:06 2012 +0900
@@ -15,6 +15,7 @@
 
 #define irq_cfg(irq)		(&irq_cfg[irq])
 #define irq_to_desc(irq)	(&irq_desc[irq])	
+#define desc_to_irq(desc)	((desc - &irq_desc[0]) / sizeof(struct
irq_desc));
 
 #define IRQ_MAX_GUESTS		7
 typedef struct {
@@ -40,8 +41,6 @@ typedef struct {
     DECLARE_BITMAP(_bits,NR_IRQS);
 } vmask_t;
 
-extern struct irq_desc *irq_desc;
-
 static inline int irq_desc_initialized(struct irq_desc *desc)
 {
 	return 0;
diff -r 6af8a89c99cd xen/include/asm-arm/tegra/avp.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-arm/tegra/avp.h	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2010 NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NVIDIA Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef INCLUDED_AVP_H
+#define INCLUDED_AVP_H
+
+#include "ap15/arictlr.h"
+#include "ap15/artimer.h"
+// FIXME: get the ararmev header
+
+// 3 controllers in contiguous memory starting at INTERRUPT_BASE, each
+// controller's aperture is INTERRUPT_SIZE large
+#define INTERRUPT_BASE 0x60004000
+#define INTERRUPT_SIZE 0x100
+#define INTERRUPT_NUM_CONTROLLERS 3
+
+#define INTERRUPT_PENDING( ctlr ) \
+    (INTERRUPT_BASE + ((ctlr) * INTERRUPT_SIZE) + ICTLR_VIRQ_COP_0)
+
+#define INTERRUPT_SET( ctlr ) \
+    (INTERRUPT_BASE + ((ctlr) * INTERRUPT_SIZE) + ICTLR_COP_IER_SET_0)
+
+#define INTERRUPT_CLR( ctlr ) \
+    (INTERRUPT_BASE + ((ctlr) * INTERRUPT_SIZE) + ICTLR_COP_IER_CLR_0)
+
+#define OSC_CTRL        ( 0x60006000 + 0x50 )
+#define OSC_FREQ_DET    ( 0x60006000 + 0x58 )
+#define OSC_DET_STATUS  ( 0x60006000 + 0x5C )
+
+#define TIMER_USEC      ( 0x60005010 )
+#define TIMER_CFG       ( 0x60005014 )
+#define TIMER_0_BASE    ( 0x60005000 )
+#define TIMER_0         ( TIMER_0_BASE + TIMER_TMR_PTV_0 )
+#define TIMER_0_CLEAR   ( TIMER_0_BASE + TIMER_TMR_PCR_0 )
+#define TIMER_1_BASE    ( 0x60005008 )
+#define TIMER_1         ( TIMER_1_BASE + TIMER_TMR_PTV_0 )
+#define TIMER_1_CLEAR   ( TIMER_1_BASE + TIMER_TMR_PCR_0 )
+
+#define CLOCK_RST_LO    (0x60006004)
+#define CLOCK_CTLR_HI   (0x60006014)
+#define CLOCK_CTLR_LO   (0x60006010)
+
+#define CACHE_CTLR      (0x6000C000)
+#define CACHE_CONTROL_0         (0x0)
+
+#define PPI_INTR_ID_TIMER_0     (0)
+#define PPI_INTR_ID_TIMER_1     (1)
+#define PPI_INTR_ID_TIMER_2     (9)
+#define PPI_INTR_ID_TIMER_3     (10)
+
+/* flow controller */
+#define FLOW_CONTROLLER     (0x60007004)
+
+/* exception vectors */
+#define VECTOR_BASE             ( 0x6000F200 )
+#define VECTOR_RESET            ( VECTOR_BASE + 0 )
+#define VECTOR_UNDEF            ( VECTOR_BASE + 4 )
+#define VECTOR_SWI              ( VECTOR_BASE + 8 )
+#define VECTOR_PREFETCH_ABORT   ( VECTOR_BASE + 12 )
+#define VECTOR_DATA_ABORT       ( VECTOR_BASE + 16 )
+#define VECTOR_IRQ              ( VECTOR_BASE + 24 )
+#define VECTOR_FIQ              ( VECTOR_BASE + 28 )
+
+#define MODE_DISABLE_INTR 0xc0
+#define MODE_USR 0x10
+#define MODE_FIQ 0x11
+#define MODE_IRQ 0x12
+#define MODE_SVC 0x13
+#define MODE_ABT 0x17
+#define MODE_UND 0x1B
+#define MODE_SYS 0x1F
+
+#define AP15_CACHE_LINE_SIZE            32
+
+#define AP15_APB_L2_CACHE_BASE 0x7000e800 
+#define AP15_APB_CLK_RST_BASE  0x60006000
+#define AP15_APB_MISC_BASE     0x70000000
+
+#define AP10_APB_CLK_RST_BASE  0x60006000
+#define AP10_APB_MISC_BASE     0x70000000
+
+#define MMU_TLB_BASE              0xf000f000
+#define MMU_TLB_CACHE_WINDOW_0    0x40
+#define MMU_TLB_CACHE_OPTIONS_0   0x44
+
+#define AP15_PINMUX_CFG_CTL_0   0x70000024
+#define AP15_AVP_JTAG_ENABLE    0xC0
+
+#define PMC_SCRATCH22_REG_LP0   0x7000e4a8
+
+#define AVP_WDT_RESET   0x2F00BAD0
+
+/* Cached to uncached offset for AVP
+ *
+ * Hardware has uncached remap aperture for AVP as AVP doesn't have MMU
+ * but still has cache (named COP cache).
+ *
+ * This aperture moved between AP15 and AP20.
+ */
+#define AP15_CACHED_TO_UNCACHED_OFFSET 0x90000000
+#define AP20_CACHED_TO_UNCACHED_OFFSET 0x80000000
+
+#define APXX_EXT_MEM_START      0x00000000
+#define APXX_EXT_MEM_END        0x40000000
+
+#define APXX_MMIO_START         0x40000000
+#define APXX_MMIO_END           0xFFF00000
+
+#define TXX_EXT_MEM_START       0x80000000
+#define TXX_EXT_MEM_END         0xc0000000
+
+#define TXX_MMIO_START          0x40000000
+#define TXX_MMIO_END            0x80000000
+
+#endif
diff -r 6af8a89c99cd xen/include/asm-arm/tegra/config.h
--- a/xen/include/asm-arm/tegra/config.h	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/include/asm-arm/tegra/config.h	Sun Feb 12 15:04:06 2012 +0900
@@ -1,11 +1,6 @@
 #ifndef __TEGRA_CONFIG_H__
 #define __TEGRA_CONFIG_H__
 
-#define HZ	100
-#define CLOCK_TICK_RATE		1000000
+#define MAX_PHYS_CPUS	2
 
-#define MAX_PHYS_CPUS		2
-
-#define BUILTIN_COMMAND_LINE_SIZE 256
-#define BUILTIN_COMMAND_LINE	""
 #endif
diff -r 6af8a89c99cd xen/include/asm-arm/tegra/irqs.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-arm/tegra/irqs.h	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,60 @@
+/*
+ * arch/arm/mach-tegra/include/mach/irqs.h
+ *
+ * Copyright (c) 2009, NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __TEGRA_IRQS_H
+#define __TEGRA_IRQS_H
+
+#define NR_IRQS			512
+
+#define INT_PRI_BASE		32
+#define INT_RTC			(INT_PRI_BASE + 2)
+#define INT_USB			(INT_PRI_BASE + 20)
+#define INT_USB2		(INT_PRI_BASE + 21)
+#define INT_APB_DMA		(INT_PRI_BASE + 26)
+
+#define INT_SEC_BASE		(INT_PRI_BASE + 32)
+#define INT_GPIO1		(INT_SEC_BASE + 0)
+#define INT_GPIO2		(INT_SEC_BASE + 1)
+#define INT_GPIO3		(INT_SEC_BASE + 2)
+#define INT_GPIO4		(INT_SEC_BASE + 3)
+#define INT_TMR3		(INT_SEC_BASE + 9)
+#define INT_TMR4		(INT_SEC_BASE + 10)
+#define INT_SYS_STATS_MON	(INT_SEC_BASE + 22)
+#define INT_GPIO5		(INT_SEC_BASE + 23)
+
+#define INT_TRI_BASE		(INT_SEC_BASE + 32)
+#define INT_KBC			(INT_TRI_BASE + 21)
+#define INT_EXTERNAL_PMU	(INT_TRI_BASE + 22)
+#define INT_GPIO6		(INT_TRI_BASE + 23)
+#define INT_GPIO7		(INT_TRI_BASE + 25)
+
+#define INT_QUAD_BASE		(INT_TRI_BASE + 32)
+#define INT_USB3		(INT_QUAD_BASE + 1)
+
+#define INT_GPIO_BASE		(INT_QUAD_BASE + 32)
+#define INT_GPIO_NR		(28*8)
+
+#define INT_APBDMA_BASE	 	(INT_GPIO_BASE + INT_GPIO_NR)
+#define INT_APBDMA_NR		(16)
+
+#define INT_SYS_NR	(INT_GPIO_BASE - INT_PRI_BASE)
+#define INT_SYS_SZ	(INT_SEC_BASE - INT_PRI_BASE)
+
+#endif
diff -r 6af8a89c99cd xen/include/asm-arm/tegra/smp.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-arm/tegra/smp.h	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,7 @@
+#ifndef ASMARM_ARCH_SMP_H
+#define ASMARM_ARCH_SMP_H
+
+
+#include <asm/gic.h>
+
+#endif
diff -r 6af8a89c99cd xen/include/asm-arm/tegra/tegra.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-arm/tegra/tegra.h	Sun Feb 12 15:04:06 2012 +0900
@@ -0,0 +1,75 @@
+#ifndef __TEGRA250_H__
+#define __TEGRA250_H__
+
+#define TEGRA_ARM_CPU_BASE		0x50000000
+#define TEGRA_PPSB_DEVICE_BASE		0x60000000
+#define TEGRA_APB_DEVICE_BASE		0x70000000
+
+#define TEGRA_ARM_PERIF_BASE		0x50040000
+#define TEGRA_ARM_PERIF_SIZE		SZ_8K
+
+#define TEGRA_SCU_BASE			0x50040000
+#define TEGRA_SCU_SIZE			SZ_256
+
+#define TEGRA_GIC_PROC_IF_BASE		0x50040100
+#define TEGRA_GIC_PROC_IF_SIZE		SZ_256
+
+#define TEGRA_ARM_INT_DIST_BASE		0x50041000
+#define TEGRA_ARM_INT_DIST_SIZE		SZ_4K
+
+#define TEGRA_PRIMARY_ICTLR_BASE	0x60004000
+#define TEGRA_PRIMARY_ICTLR_SIZE	SZ_64
+
+#define TEGRA_SECONDARY_ICTLR_BASE	0x60004100
+#define TEGRA_SECONDARY_ICTLR_SIZE	SZ_64
+
+#define TEGRA_TERTIARY_ICTLR_BASE	0x60004200
+#define TEGRA_TERTIARY_ICTLR_SIZE	SZ_64
+
+#define TEGRA_QUATERNARY_ICTLR_BASE	0x60004300
+#define TEGRA_QUATERNARY_ICTLR_SIZE	SZ_64
+
+#define TEGRA_TMR1_BASE			0x60005000
+#define TEGRA_TMR1_SIZE			SZ_8
+
+#define TEGRA_TMR2_BASE			0x60005008
+#define TEGRA_TMR2_SIZE			SZ_8
+
+#define TEGRA_TMRUS_BASE		0x60005010
+#define TEGRA_TMRUS_SIZE		SZ_64
+
+#define TEGRA_TMR3_BASE			0x60005050
+#define TEGRA_TMR3_SIZE			SZ_8
+
+#define TEGRA_TMR4_BASE			0x60005058
+#define TEGRA_TMR4_SIZE			SZ_8
+
+#define TEGRA_CLK_RESET_BASE		0x60006000
+#define TEGRA_CLK_RESET_SIZE		SZ_4K
+
+#define TEGRA_FLOW_CTRL_BASE		0x60007000
+#define TEGRA_FLOW_CTRL_SIZE		20
+
+#define TEGRA_GPIO_BASE			0x6000D000
+#define TEGRA_GPIO_SIZE			SZ_4K
+
+#define TEGRA_EXCEPTION_VECTORS_BASE    0x6000F000
+#define TEGRA_EXCEPTION_VECTORS_SIZE    SZ_4K
+
+#define ICTLR_CPU_IER_0			(0x20)
+#define ICTLR_CPU_IER_SET_0		(0x24)
+#define ICTLR_CPU_IER_CLR_0		(0x28)
+#define ICTLR_CPU_IEP_CLASS_0		(0x2C)
+#define ICTLR_COP_IER_0			(0x30)
+#define ICTLR_COP_IER_SET_0		(0x34)
+#define ICTLR_COP_IER_CLR_0		(0x38)
+#define ICTLR_COP_IEP_CLASS_0		(0x3C)
+
+#define ARM_PERIF_BASE			(0x50040000)
+
+//#define IO_ADDRESS(x)			(((((x) & 0x70000000) >> 8) + (((x) &
0x0F000000) >> 4)) |((x) & 0xFFFFF) | 0xFB000000 )
+#define IO_ADDRESS(x)			((((x) & 0xF0000000) >> 8) | ((x) &
0xFFFFF) | (0xFB000000 ))
+#define INT_PPI_ADDRESS(_inst)		(0x60004000 + (0x100 * (_inst)))
+#define INT_APBDMA_ADDRESS		(0x6000a000)
+
+#endif
diff -r 6af8a89c99cd xen/include/xen/irq.h
--- a/xen/include/xen/irq.h	Sun Feb 12 12:24:21 2012 +0900
+++ b/xen/include/xen/irq.h	Sun Feb 12 15:04:06 2012 +0900
@@ -95,6 +95,10 @@ int arch_init_one_irq_desc(struct irq_de
 
 #define irq_desc_initialized(desc) ((desc)->handler != NULL)
 
+#if defined(__arm__)
+extern irq_desc_t irq_desc[NR_IRQS];
+#endif
+
 #if defined(__ia64__)
 extern irq_desc_t irq_desc[NR_VECTORS];
 
@@ -121,6 +125,8 @@ extern void irq_actor_none(struct irq_de
 #define irq_shutdown_none irq_actor_none
 #define irq_disable_none irq_actor_none
 #define irq_enable_none irq_actor_none
+#define irq_ack_none	irq_actor_none
+#define irq_end_none	irq_actor_none
 
 struct domain;
 struct vcpu;
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel