summaryrefslogtreecommitdiff
path: root/arch/arm/include/asm/arch-tegra/ap20.h
blob: 3d834e678d9ab6d2be9f5ddb5a99ab466aa80f9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * (C) Copyright 2010-2011
 * NVIDIA Corporation <www.nvidia.com>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * 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., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
#include <asm/types.h>

/* Stabilization delays, in usec */
#define PLL_STABILIZATION_DELAY (300)
#define IO_STABILIZATION_DELAY	(1000)

#define NVBL_PLLP_KHZ	(216000)

#define PLLX_ENABLED		(1 << 30)
#define CCLK_BURST_POLICY	0x20008888
#define SUPER_CCLK_DIVIDER	0x80000000

/* Calculate clock fractional divider value from ref and target frequencies */
#define CLK_DIVIDER(REF, FREQ)  ((((REF) * 2) / FREQ) - 2)

/* Calculate clock frequency value from reference and clock divider value */
#define CLK_FREQUENCY(REF, REG)  (((REF) * 2) / (REG + 2))

/* AVP/CPU ID */
#define PG_UP_TAG_0_PID_CPU	0x55555555	/* CPU aka "a9" aka "mpcore" */
#define PG_UP_TAG_0             0x0

#define CORESIGHT_UNLOCK	0xC5ACCE55;

/* AP20-Specific Base Addresses */

/* AP20 Base physical address of SDRAM. */
#define AP20_BASE_PA_SDRAM      0x00000000
/* AP20 Base physical address of internal SRAM. */
#define AP20_BASE_PA_SRAM       0x40000000
/* AP20 Size of internal SRAM (256KB). */
#define AP20_BASE_PA_SRAM_SIZE  0x00040000
/* AP20 Base physical address of flash. */
#define AP20_BASE_PA_NOR_FLASH  0xD0000000
/* AP20 Base physical address of boot information table. */
#define AP20_BASE_PA_BOOT_INFO  AP20_BASE_PA_SRAM

/*
 * Super-temporary stacks for EXTREMELY early startup. The values chosen for
 * these addresses must be valid on ALL SOCs because this value is used before
 * we are able to differentiate between the SOC types.
 *
 * NOTE: The since CPU's stack will eventually be moved from IRAM to SDRAM, its
 *       stack is placed below the AVP stack. Once the CPU stack has been moved,
 *       the AVP is free to use the IRAM the CPU stack previously occupied if
 *       it should need to do so.
 *
 * NOTE: In multi-processor CPU complex configurations, each processor will have
 *       its own stack of size CPU_EARLY_BOOT_STACK_SIZE. CPU 0 will have a
 *       limit of CPU_EARLY_BOOT_STACK_LIMIT. Each successive CPU will have a
 *       stack limit that is CPU_EARLY_BOOT_STACK_SIZE less then the previous
 *       CPU.
 */

/* Common AVP early boot stack limit */
#define AVP_EARLY_BOOT_STACK_LIMIT	\
	(AP20_BASE_PA_SRAM + (AP20_BASE_PA_SRAM_SIZE/2))
/* Common AVP early boot stack size */
#define AVP_EARLY_BOOT_STACK_SIZE	0x1000
/* Common CPU early boot stack limit */
#define CPU_EARLY_BOOT_STACK_LIMIT	\
	(AVP_EARLY_BOOT_STACK_LIMIT - AVP_EARLY_BOOT_STACK_SIZE)
/* Common CPU early boot stack size */
#define CPU_EARLY_BOOT_STACK_SIZE	0x1000

#define EXCEP_VECTOR_CPU_RESET_VECTOR	(NV_PA_EVP_BASE + 0x100)
#define CSITE_CPU_DBG0_LAR		(NV_PA_CSITE_BASE + 0x10FB0)
#define CSITE_CPU_DBG1_LAR		(NV_PA_CSITE_BASE + 0x12FB0)

#define FLOW_CTLR_HALT_COP_EVENTS	(NV_PA_FLOW_BASE + 4)
#define FLOW_MODE_NONE			0
#define FLOW_MODE_STOP			2
#define HALT_COP_EVENT_JTAG		(1 << 28)
#define HALT_COP_EVENT_IRQ_1		(1 << 11)
#define HALT_COP_EVENT_FIQ_1		(1 << 9)

/* Called by the ARM7 to start up the Cortex-A9, and by the A9 to do init */
void tegra_start(void);

/* Returns 1 if the current CPU executing is a Cortex-A9, else 0 */
int ap20_cpu_is_cortexa9(void);

/**
 * Init the PLLX which clocks the CPU.
 *
 * The 'slow' option is used when the CPU voltage has not yet been increased
 * to allow running at full speed.
 *
 * @param slow	1 to run in safe/slow mode, 0 to run at full speed
 */
void ap20_init_pllx(int slow);

/**
 * Returns the number of CPUs supported by the SOC
 *
 * @return number of CPUs (1-4)
 */
int ap20_get_num_cpus(void);

/**
 * Works out the SOC type used for clocks settings
 *
 * Note that T30 will return TEGRA_SOC_T30 until we have the fdt set up,
 * when it may change to TEGRA_SOC_T30_408MHZ depending on what we set PLLP
 * to.
 *
 * @return	SOC type - see TEGRA_SOC...
 */
int tegra_get_chip_type(void);

/**
 * Update any clocks that need to be adjusted after the fdt is available
 */
void tegra_update_clocks(void);