Browse Source

Merge the enabling by default of ARM_PATCH_PHYS_VIRT

Conflicts:
	arch/arm/mach-msm/board-msm7x30.c
Nicolas Pitre 14 years ago
parent
commit
96f90c7915

+ 7 - 11
arch/arm/Kconfig

@@ -195,7 +195,8 @@ config VECTORS_BASE
 	  The base address of exception vectors.
 	  The base address of exception vectors.
 
 
 config ARM_PATCH_PHYS_VIRT
 config ARM_PATCH_PHYS_VIRT
-	bool "Patch physical to virtual translations at runtime"
+	bool "Patch physical to virtual translations at runtime" if EMBEDDED
+	default y
 	depends on !XIP_KERNEL && MMU
 	depends on !XIP_KERNEL && MMU
 	depends on !ARCH_REALVIEW || !SPARSEMEM
 	depends on !ARCH_REALVIEW || !SPARSEMEM
 	help
 	help
@@ -204,16 +205,12 @@ config ARM_PATCH_PHYS_VIRT
 	  kernel in system memory.
 	  kernel in system memory.
 
 
 	  This can only be used with non-XIP MMU kernels where the base
 	  This can only be used with non-XIP MMU kernels where the base
-	  of physical memory is at a 16MB boundary, or theoretically 64K
-	  for the MSM machine class.
+	  of physical memory is at a 16MB boundary.
+
+	  Only disable this option if you know that you do not require
+	  this feature (eg, building a kernel for a single machine) and
+	  you need to shrink the kernel to the minimal size.
 
 
-config ARM_PATCH_PHYS_VIRT_16BIT
-	def_bool y
-	depends on ARM_PATCH_PHYS_VIRT && ARCH_MSM
-	help
-	  This option extends the physical to virtual translation patching
-	  to allow physical memory down to a theoretical minimum of 64K
-	  boundaries.
 
 
 source "init/Kconfig"
 source "init/Kconfig"
 
 
@@ -301,7 +298,6 @@ config ARCH_AT91
 	select ARCH_REQUIRE_GPIOLIB
 	select ARCH_REQUIRE_GPIOLIB
 	select HAVE_CLK
 	select HAVE_CLK
 	select CLKDEV_LOOKUP
 	select CLKDEV_LOOKUP
-	select ARM_PATCH_PHYS_VIRT if MMU
 	help
 	help
 	  This enables support for systems based on the Atmel AT91RM9200,
 	  This enables support for systems based on the Atmel AT91RM9200,
 	  AT91SAM9 and AT91CAP9 processors.
 	  AT91SAM9 and AT91CAP9 processors.

+ 3 - 0
arch/arm/Makefile

@@ -128,6 +128,9 @@ textofs-$(CONFIG_PM_H1940)      := 0x00108000
 ifeq ($(CONFIG_ARCH_SA1100),y)
 ifeq ($(CONFIG_ARCH_SA1100),y)
 textofs-$(CONFIG_SA1111) := 0x00208000
 textofs-$(CONFIG_SA1111) := 0x00208000
 endif
 endif
+textofs-$(CONFIG_ARCH_MSM7X30) := 0x00208000
+textofs-$(CONFIG_ARCH_MSM8X60) := 0x00208000
+textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
 
 
 # Machine directory name.  This list is sorted alphanumerically
 # Machine directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
 # by CONFIG_* macro name.

+ 0 - 7
arch/arm/include/asm/memory.h

@@ -151,7 +151,6 @@
  * so that all we need to do is modify the 8-bit constant field.
  * so that all we need to do is modify the 8-bit constant field.
  */
  */
 #define __PV_BITS_31_24	0x81000000
 #define __PV_BITS_31_24	0x81000000
-#define __PV_BITS_23_16	0x00810000
 
 
 extern unsigned long __pv_phys_offset;
 extern unsigned long __pv_phys_offset;
 #define PHYS_OFFSET __pv_phys_offset
 #define PHYS_OFFSET __pv_phys_offset
@@ -169,9 +168,6 @@ static inline unsigned long __virt_to_phys(unsigned long x)
 {
 {
 	unsigned long t;
 	unsigned long t;
 	__pv_stub(x, t, "add", __PV_BITS_31_24);
 	__pv_stub(x, t, "add", __PV_BITS_31_24);
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
-	__pv_stub(t, t, "add", __PV_BITS_23_16);
-#endif
 	return t;
 	return t;
 }
 }
 
 
@@ -179,9 +175,6 @@ static inline unsigned long __phys_to_virt(unsigned long x)
 {
 {
 	unsigned long t;
 	unsigned long t;
 	__pv_stub(x, t, "sub", __PV_BITS_31_24);
 	__pv_stub(x, t, "sub", __PV_BITS_31_24);
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
-	__pv_stub(t, t, "sub", __PV_BITS_23_16);
-#endif
 	return t;
 	return t;
 }
 }
 #else
 #else

+ 0 - 4
arch/arm/include/asm/module.h

@@ -31,11 +31,7 @@ struct mod_arch_specific {
 
 
 /* Add __virt_to_phys patching state as well */
 /* Add __virt_to_phys patching state as well */
 #ifdef CONFIG_ARM_PATCH_PHYS_VIRT
 #ifdef CONFIG_ARM_PATCH_PHYS_VIRT
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
-#define MODULE_ARCH_VERMAGIC_P2V "p2v16 "
-#else
 #define MODULE_ARCH_VERMAGIC_P2V "p2v8 "
 #define MODULE_ARCH_VERMAGIC_P2V "p2v8 "
-#endif
 #else
 #else
 #define MODULE_ARCH_VERMAGIC_P2V ""
 #define MODULE_ARCH_VERMAGIC_P2V ""
 #endif
 #endif

+ 13 - 48
arch/arm/kernel/head.S

@@ -488,13 +488,8 @@ __fixup_pv_table:
 	add	r5, r5, r3	@ adjust table end address
 	add	r5, r5, r3	@ adjust table end address
 	add	r7, r7, r3	@ adjust __pv_phys_offset address
 	add	r7, r7, r3	@ adjust __pv_phys_offset address
 	str	r8, [r7]	@ save computed PHYS_OFFSET to __pv_phys_offset
 	str	r8, [r7]	@ save computed PHYS_OFFSET to __pv_phys_offset
-#ifndef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
 	mov	r6, r3, lsr #24	@ constant for add/sub instructions
 	mov	r6, r3, lsr #24	@ constant for add/sub instructions
 	teq	r3, r6, lsl #24 @ must be 16MiB aligned
 	teq	r3, r6, lsl #24 @ must be 16MiB aligned
-#else
-	mov	r6, r3, lsr #16	@ constant for add/sub instructions
-	teq	r3, r6, lsl #16	@ must be 64kiB aligned
-#endif
 THUMB(	it	ne		@ cross section branch )
 THUMB(	it	ne		@ cross section branch )
 	bne	__error
 	bne	__error
 	str	r6, [r7, #4]	@ save to __pv_offset
 	str	r6, [r7, #4]	@ save to __pv_offset
@@ -510,20 +505,8 @@ ENDPROC(__fixup_pv_table)
 	.text
 	.text
 __fixup_a_pv_table:
 __fixup_a_pv_table:
 #ifdef CONFIG_THUMB2_KERNEL
 #ifdef CONFIG_THUMB2_KERNEL
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
-	lsls	r0, r6, #24
-	lsr	r6, #8
-	beq	1f
-	clz	r7, r0
-	lsr	r0, #24
-	lsl	r0, r7
-	bic	r0, 0x0080
-	lsrs	r7, #1
-	orrcs   r0, #0x0080
-	orr	r0, r0, r7, lsl #12
-#endif
-1:	lsls	r6, #24
-	beq	4f
+	lsls	r6, #24
+	beq	2f
 	clz	r7, r6
 	clz	r7, r6
 	lsr	r6, #24
 	lsr	r6, #24
 	lsl	r6, r7
 	lsl	r6, r7
@@ -532,43 +515,25 @@ __fixup_a_pv_table:
 	orrcs	r6, #0x0080
 	orrcs	r6, #0x0080
 	orr	r6, r6, r7, lsl #12
 	orr	r6, r6, r7, lsl #12
 	orr	r6, #0x4000
 	orr	r6, #0x4000
-	b	4f
-2:	@ at this point the C flag is always clear
-	add     r7, r3
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
-	ldrh	ip, [r7]
-	tst	ip, 0x0400	@ the i bit tells us LS or MS byte
-	beq	3f
-	cmp	r0, #0		@ set C flag, and ...
-	biceq	ip, 0x0400	@ immediate zero value has a special encoding
-	streqh	ip, [r7]	@ that requires the i bit cleared
-#endif
-3:	ldrh	ip, [r7, #2]
+	b	2f
+1:	add     r7, r3
+	ldrh	ip, [r7, #2]
 	and	ip, 0x8f00
 	and	ip, 0x8f00
-	orrcc	ip, r6	@ mask in offset bits 31-24
-	orrcs	ip, r0	@ mask in offset bits 23-16
+	orr	ip, r6	@ mask in offset bits 31-24
 	strh	ip, [r7, #2]
 	strh	ip, [r7, #2]
-4:	cmp	r4, r5
+2:	cmp	r4, r5
 	ldrcc	r7, [r4], #4	@ use branch for delay slot
 	ldrcc	r7, [r4], #4	@ use branch for delay slot
-	bcc	2b
+	bcc	1b
 	bx	lr
 	bx	lr
 #else
 #else
-#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
-	and	r0, r6, #255	@ offset bits 23-16
-	mov	r6, r6, lsr #8	@ offset bits 31-24
-#else
-	mov	r0, #0		@ just in case...
-#endif
-	b	3f
-2:	ldr	ip, [r7, r3]
+	b	2f
+1:	ldr	ip, [r7, r3]
 	bic	ip, ip, #0x000000ff
 	bic	ip, ip, #0x000000ff
-	tst	ip, #0x400	@ rotate shift tells us LS or MS byte
-	orrne	ip, ip, r6	@ mask in offset bits 31-24
-	orreq	ip, ip, r0	@ mask in offset bits 23-16
+	orr	ip, ip, r6	@ mask in offset bits 31-24
 	str	ip, [r7, r3]
 	str	ip, [r7, r3]
-3:	cmp	r4, r5
+2:	cmp	r4, r5
 	ldrcc	r7, [r4], #4	@ use branch for delay slot
 	ldrcc	r7, [r4], #4	@ use branch for delay slot
-	bcc	2b
+	bcc	1b
 	mov	pc, lr
 	mov	pc, lr
 #endif
 #endif
 ENDPROC(__fixup_a_pv_table)
 ENDPROC(__fixup_a_pv_table)

+ 22 - 0
arch/arm/mach-msm/board-msm7x30.c

@@ -24,6 +24,7 @@
 #include <linux/smsc911x.h>
 #include <linux/smsc911x.h>
 #include <linux/usb/msm_hsusb.h>
 #include <linux/usb/msm_hsusb.h>
 #include <linux/clkdev.h>
 #include <linux/clkdev.h>
+#include <linux/memblock.h>
 
 
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/arch.h>
@@ -42,6 +43,21 @@
 
 
 extern struct sys_timer msm_timer;
 extern struct sys_timer msm_timer;
 
 
+static void __init msm7x30_fixup(struct machine_desc *desc, struct tag *tag,
+			 char **cmdline, struct meminfo *mi)
+{
+	for (; tag->hdr.size; tag = tag_next(tag))
+		if (tag->hdr.tag == ATAG_MEM && tag->u.mem.start == 0x200000) {
+			tag->u.mem.start = 0;
+			tag->u.mem.size += SZ_2M;
+		}
+}
+
+static void __init msm7x30_reserve(void)
+{
+	memblock_remove(0x0, SZ_2M);
+}
+
 static int hsusb_phy_init_seq[] = {
 static int hsusb_phy_init_seq[] = {
 	0x30, 0x32,	/* Enable and set Pre-Emphasis Depth to 20% */
 	0x30, 0x32,	/* Enable and set Pre-Emphasis Depth to 20% */
 	0x02, 0x36,	/* Disable CDR Auto Reset feature */
 	0x02, 0x36,	/* Disable CDR Auto Reset feature */
@@ -107,6 +123,8 @@ static void __init msm7x30_map_io(void)
 
 
 MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
 MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
 	.atag_offset = 0x100,
 	.atag_offset = 0x100,
+	.fixup = msm7x30_fixup,
+	.reserve = msm7x30_reserve,
 	.map_io = msm7x30_map_io,
 	.map_io = msm7x30_map_io,
 	.init_irq = msm7x30_init_irq,
 	.init_irq = msm7x30_init_irq,
 	.init_machine = msm7x30_init,
 	.init_machine = msm7x30_init,
@@ -115,6 +133,8 @@ MACHINE_END
 
 
 MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
 MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
 	.atag_offset = 0x100,
 	.atag_offset = 0x100,
+	.fixup = msm7x30_fixup,
+	.reserve = msm7x30_reserve,
 	.map_io = msm7x30_map_io,
 	.map_io = msm7x30_map_io,
 	.init_irq = msm7x30_init_irq,
 	.init_irq = msm7x30_init_irq,
 	.init_machine = msm7x30_init,
 	.init_machine = msm7x30_init,
@@ -123,6 +143,8 @@ MACHINE_END
 
 
 MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
 MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
 	.atag_offset = 0x100,
 	.atag_offset = 0x100,
+	.fixup = msm7x30_fixup,
+	.reserve = msm7x30_reserve,
 	.map_io = msm7x30_map_io,
 	.map_io = msm7x30_map_io,
 	.init_irq = msm7x30_init_irq,
 	.init_irq = msm7x30_init_irq,
 	.init_machine = msm7x30_init,
 	.init_machine = msm7x30_init,

+ 22 - 0
arch/arm/mach-msm/board-msm8960.c

@@ -20,16 +20,34 @@
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
 #include <linux/clkdev.h>
 #include <linux/clkdev.h>
+#include <linux/memblock.h>
 
 
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/arch.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/gic.h>
+#include <asm/setup.h>
 
 
 #include <mach/board.h>
 #include <mach/board.h>
 #include <mach/msm_iomap.h>
 #include <mach/msm_iomap.h>
 
 
 #include "devices.h"
 #include "devices.h"
 
 
+static void __init msm8960_fixup(struct machine_desc *desc, struct tag *tag,
+			 char **cmdline, struct meminfo *mi)
+{
+	for (; tag->hdr.size; tag = tag_next(tag))
+		if (tag->hdr.tag == ATAG_MEM &&
+				tag->u.mem.start == 0x40200000) {
+			tag->u.mem.start = 0x40000000;
+			tag->u.mem.size += SZ_2M;
+		}
+}
+
+static void __init msm8960_reserve(void)
+{
+	memblock_remove(0x40000000, SZ_2M);
+}
+
 static void __init msm8960_map_io(void)
 static void __init msm8960_map_io(void)
 {
 {
 	msm_map_msm8960_io();
 	msm_map_msm8960_io();
@@ -76,6 +94,8 @@ static void __init msm8960_rumi3_init(void)
 }
 }
 
 
 MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
 MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
+	.fixup = msm8960_fixup,
+	.reserve = msm8960_reserve,
 	.map_io = msm8960_map_io,
 	.map_io = msm8960_map_io,
 	.init_irq = msm8960_init_irq,
 	.init_irq = msm8960_init_irq,
 	.timer = &msm_timer,
 	.timer = &msm_timer,
@@ -83,6 +103,8 @@ MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
 MACHINE_END
 MACHINE_END
 
 
 MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3")
 MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3")
+	.fixup = msm8960_fixup,
+	.reserve = msm8960_reserve,
 	.map_io = msm8960_map_io,
 	.map_io = msm8960_map_io,
 	.init_irq = msm8960_init_irq,
 	.init_irq = msm8960_init_irq,
 	.timer = &msm_timer,
 	.timer = &msm_timer,

+ 25 - 0
arch/arm/mach-msm/board-msm8x60.c

@@ -20,14 +20,31 @@
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/irq.h>
+#include <linux/memblock.h>
 
 
 #include <asm/mach-types.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/arch.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/gic.h>
+#include <asm/setup.h>
 
 
 #include <mach/board.h>
 #include <mach/board.h>
 #include <mach/msm_iomap.h>
 #include <mach/msm_iomap.h>
 
 
+static void __init msm8x60_fixup(struct machine_desc *desc, struct tag *tag,
+			 char **cmdline, struct meminfo *mi)
+{
+	for (; tag->hdr.size; tag = tag_next(tag))
+		if (tag->hdr.tag == ATAG_MEM &&
+				tag->u.mem.start == 0x40200000) {
+			tag->u.mem.start = 0x40000000;
+			tag->u.mem.size += SZ_2M;
+		}
+}
+
+static void __init msm8x60_reserve(void)
+{
+	memblock_remove(0x40000000, SZ_2M);
+}
 
 
 static void __init msm8x60_map_io(void)
 static void __init msm8x60_map_io(void)
 {
 {
@@ -65,6 +82,8 @@ static void __init msm8x60_init(void)
 }
 }
 
 
 MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3")
 MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3")
+	.fixup = msm8x60_fixup,
+	.reserve = msm8x60_reserve,
 	.map_io = msm8x60_map_io,
 	.map_io = msm8x60_map_io,
 	.init_irq = msm8x60_init_irq,
 	.init_irq = msm8x60_init_irq,
 	.init_machine = msm8x60_init,
 	.init_machine = msm8x60_init,
@@ -72,6 +91,8 @@ MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3")
 MACHINE_END
 MACHINE_END
 
 
 MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF")
 MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF")
+	.fixup = msm8x60_fixup,
+	.reserve = msm8x60_reserve,
 	.map_io = msm8x60_map_io,
 	.map_io = msm8x60_map_io,
 	.init_irq = msm8x60_init_irq,
 	.init_irq = msm8x60_init_irq,
 	.init_machine = msm8x60_init,
 	.init_machine = msm8x60_init,
@@ -79,6 +100,8 @@ MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF")
 MACHINE_END
 MACHINE_END
 
 
 MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR")
 MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR")
+	.fixup = msm8x60_fixup,
+	.reserve = msm8x60_reserve,
 	.map_io = msm8x60_map_io,
 	.map_io = msm8x60_map_io,
 	.init_irq = msm8x60_init_irq,
 	.init_irq = msm8x60_init_irq,
 	.init_machine = msm8x60_init,
 	.init_machine = msm8x60_init,
@@ -86,6 +109,8 @@ MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR")
 MACHINE_END
 MACHINE_END
 
 
 MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA")
 MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA")
+	.fixup = msm8x60_fixup,
+	.reserve = msm8x60_reserve,
 	.map_io = msm8x60_map_io,
 	.map_io = msm8x60_map_io,
 	.init_irq = msm8x60_init_irq,
 	.init_irq = msm8x60_init_irq,
 	.init_machine = msm8x60_init,
 	.init_machine = msm8x60_init,

+ 3 - 3
arch/arm/mach-msm/include/mach/memory.h

@@ -22,11 +22,11 @@
 #elif defined(CONFIG_ARCH_QSD8X50)
 #elif defined(CONFIG_ARCH_QSD8X50)
 #define PLAT_PHYS_OFFSET		UL(0x20000000)
 #define PLAT_PHYS_OFFSET		UL(0x20000000)
 #elif defined(CONFIG_ARCH_MSM7X30)
 #elif defined(CONFIG_ARCH_MSM7X30)
-#define PLAT_PHYS_OFFSET		UL(0x00200000)
+#define PLAT_PHYS_OFFSET		UL(0x00000000)
 #elif defined(CONFIG_ARCH_MSM8X60)
 #elif defined(CONFIG_ARCH_MSM8X60)
-#define PLAT_PHYS_OFFSET		UL(0x40200000)
+#define PLAT_PHYS_OFFSET		UL(0x40000000)
 #elif defined(CONFIG_ARCH_MSM8960)
 #elif defined(CONFIG_ARCH_MSM8960)
-#define PLAT_PHYS_OFFSET		UL(0x40200000)
+#define PLAT_PHYS_OFFSET		UL(0x40000000)
 #else
 #else
 #define PLAT_PHYS_OFFSET		UL(0x10000000)
 #define PLAT_PHYS_OFFSET		UL(0x10000000)
 #endif
 #endif