blob: 56c4afdad549b4d8fa2ff01fed3d220403626f60 [file] [log] [blame]
Russell Kinga09e64f2008-08-05 16:14:15 +01001/* arch/arm/mach-msm/include/mach/memory.h
2 *
3 * Copyright (C) 2007 Google, Inc.
Laura Abbott51f5d5c2013-03-14 20:08:00 -07004 * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
Russell Kinga09e64f2008-08-05 16:14:15 +01005 *
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 */
Russell Kinga09e64f2008-08-05 16:14:15 +010016#ifndef __ASM_ARCH_MEMORY_H
17#define __ASM_ARCH_MEMORY_H
Larry Bassela4414b12011-08-04 11:11:02 -070018#include <linux/types.h>
Russell Kinga09e64f2008-08-05 16:14:15 +010019
20/* physical offset of RAM */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070021#define PLAT_PHYS_OFFSET UL(CONFIG_PHYS_OFFSET)
22
23#define MAX_PHYSMEM_BITS 32
Jack Cheung0b1987e2011-11-18 13:36:29 -080024#define SECTION_SIZE_BITS 28
Larry Basselcf1fae52011-08-30 15:14:29 -070025
Jack Cheungd01fd832012-01-13 22:59:57 -080026/* Maximum number of Memory Regions
27* The largest system can have 4 memory banks, each divided into 8 regions
28*/
29#define MAX_NR_REGIONS 32
30
31/* The number of regions each memory bank is divided into */
32#define NR_REGIONS_PER_BANK 8
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070033
34/* Certain configurations of MSM7x30 have multiple memory banks.
35* One or more of these banks can contain holes in the memory map as well.
36* These macros define appropriate conversion routines between the physical
37* and virtual address domains for supporting these configurations using
38* SPARSEMEM and a 3G/1G VM split.
39*/
40
41#if defined(CONFIG_ARCH_MSM7X30)
42
43#define EBI0_PHYS_OFFSET PHYS_OFFSET
44#define EBI0_PAGE_OFFSET PAGE_OFFSET
45#define EBI0_SIZE 0x10000000
46
Pankaj Kumarac69ee62012-01-26 00:21:56 +053047#ifndef __ASSEMBLY__
48
49extern unsigned long ebi1_phys_offset;
50
51#define EBI1_PHYS_OFFSET (ebi1_phys_offset)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070052#define EBI1_PAGE_OFFSET (EBI0_PAGE_OFFSET + EBI0_SIZE)
53
54#if (defined(CONFIG_SPARSEMEM) && defined(CONFIG_VMSPLIT_3G))
55
56#define __phys_to_virt(phys) \
57 ((phys) >= EBI1_PHYS_OFFSET ? \
58 (phys) - EBI1_PHYS_OFFSET + EBI1_PAGE_OFFSET : \
59 (phys) - EBI0_PHYS_OFFSET + EBI0_PAGE_OFFSET)
60
61#define __virt_to_phys(virt) \
62 ((virt) >= EBI1_PAGE_OFFSET ? \
63 (virt) - EBI1_PAGE_OFFSET + EBI1_PHYS_OFFSET : \
64 (virt) - EBI0_PAGE_OFFSET + EBI0_PHYS_OFFSET)
65
Daniel Walker81d658a2010-05-06 14:16:04 -070066#endif
Pankaj Kumarac69ee62012-01-26 00:21:56 +053067#endif
Russell Kinga09e64f2008-08-05 16:14:15 +010068
Russell Kinga09e64f2008-08-05 16:14:15 +010069#endif
70
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070071#ifndef __ASSEMBLY__
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070072void *allocate_contiguous_ebi(unsigned long, unsigned long, int);
73unsigned long allocate_contiguous_ebi_nomap(unsigned long, unsigned long);
74void clean_and_invalidate_caches(unsigned long, unsigned long, unsigned long);
75void clean_caches(unsigned long, unsigned long, unsigned long);
76void invalidate_caches(unsigned long, unsigned long, unsigned long);
Olav Haugan92862912012-08-01 11:32:48 -070077int msm_get_memory_type_from_name(const char *memtype_name);
Chintan Pandyad71c5f92012-08-23 17:14:32 +053078unsigned long get_ddr_size(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070079
80#if defined(CONFIG_ARCH_MSM_ARM11) || defined(CONFIG_ARCH_MSM_CORTEX_A5)
81void write_to_strongly_ordered_memory(void);
82void map_page_strongly_ordered(void);
83#endif
84
85#ifdef CONFIG_CACHE_L2X0
86extern void l2x0_cache_sync(void);
87#define finish_arch_switch(prev) do { l2x0_cache_sync(); } while (0)
88#endif
89
Vikram Mulukutlac39c6092011-07-29 18:36:35 -070090#if defined(CONFIG_ARCH_MSM8X60) || defined(CONFIG_ARCH_MSM8960)
91extern void store_ttbr0(void);
92#define finish_arch_switch(prev) do { store_ttbr0(); } while (0)
93#endif
94
Neeti Desai1b2cb552012-11-01 21:57:36 -070095#define MAX_HOLE_ADDRESS (PHYS_OFFSET + 0x10000000)
Laura Abbott13b21e72013-03-18 11:50:22 -070096extern phys_addr_t memory_hole_offset;
97extern phys_addr_t memory_hole_start;
98extern phys_addr_t memory_hole_end;
Laura Abbott51f5d5c2013-03-14 20:08:00 -070099extern unsigned long memory_hole_align;
100extern unsigned long virtual_hole_start;
101extern unsigned long virtual_hole_end;
Larry Bassel150d5032011-09-20 14:32:13 -0700102#ifdef CONFIG_DONT_MAP_HOLE_AFTER_MEMBANK0
Neeti Desai1b2cb552012-11-01 21:57:36 -0700103void find_memory_hole(void);
Larry Bassel150d5032011-09-20 14:32:13 -0700104
Neeti Desai1b2cb552012-11-01 21:57:36 -0700105#define MEM_HOLE_END_PHYS_OFFSET (memory_hole_end)
Laura Abbott51f5d5c2013-03-14 20:08:00 -0700106#define MEM_HOLE_PAGE_OFFSET (PAGE_OFFSET + memory_hole_offset + \
107 memory_hole_align)
Larry Bassel150d5032011-09-20 14:32:13 -0700108
109#define __phys_to_virt(phys) \
Laura Abbott13b21e72013-03-18 11:50:22 -0700110 (unsigned long)\
Neeti Desai1b2cb552012-11-01 21:57:36 -0700111 ((MEM_HOLE_END_PHYS_OFFSET && ((phys) >= MEM_HOLE_END_PHYS_OFFSET)) ? \
112 (phys) - MEM_HOLE_END_PHYS_OFFSET + MEM_HOLE_PAGE_OFFSET : \
113 (phys) - PHYS_OFFSET + PAGE_OFFSET)
Larry Bassel150d5032011-09-20 14:32:13 -0700114
115#define __virt_to_phys(virt) \
Laura Abbott13b21e72013-03-18 11:50:22 -0700116 (unsigned long)\
Neeti Desai1b2cb552012-11-01 21:57:36 -0700117 ((MEM_HOLE_END_PHYS_OFFSET && ((virt) >= MEM_HOLE_PAGE_OFFSET)) ? \
118 (virt) - MEM_HOLE_PAGE_OFFSET + MEM_HOLE_END_PHYS_OFFSET : \
119 (virt) - PAGE_OFFSET + PHYS_OFFSET)
Larry Bassel150d5032011-09-20 14:32:13 -0700120#endif
121
Laura Abbottd8d0f772012-07-10 10:27:06 -0700122/*
123 * Need a temporary unique variable that no one will ever see to
124 * hold the compat string. Line number gives this easily.
125 * Need another layer of indirection to get __LINE__ to expand
126 * properly as opposed to appending and ending up with
127 * __compat___LINE__
128 */
129#define __CONCAT(a, b) ___CONCAT(a, b)
130#define ___CONCAT(a, b) a ## b
131
132#define EXPORT_COMPAT(com) \
133static char *__CONCAT(__compat_, __LINE__) __used \
134 __attribute((__section__(".exportcompat.init"))) = com
135
136extern char *__compat_exports_start[];
137extern char *__compat_exports_end[];
138
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700139#endif
140
141#if defined CONFIG_ARCH_MSM_SCORPION || defined CONFIG_ARCH_MSM_KRAIT
142#define arch_has_speculative_dfetch() 1
143#endif
144
145#endif
146
147/* these correspond to values known by the modem */
148#define MEMORY_DEEP_POWERDOWN 0
149#define MEMORY_SELF_REFRESH 1
150#define MEMORY_ACTIVE 2
151
152#define NPA_MEMORY_NODE_NAME "/mem/apps/ddr_dpd"
153
154#ifndef CONFIG_ARCH_MSM7X27
155#define CONSISTENT_DMA_SIZE (SZ_1M * 14)
Laura Abbottd8d0f772012-07-10 10:27:06 -0700156
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700157#endif