Merge "libc: Add support for itoa and string reverse functions."
diff --git a/arch/arm/crt0.S b/arch/arm/crt0.S
index ce823c1..7f1ad16 100644
--- a/arch/arm/crt0.S
+++ b/arch/arm/crt0.S
@@ -187,14 +187,3 @@
abort_stack:
.skip 1024
abort_stack_top:
-
-.rodata:
-.align 2
-
-/* define the heap end as read-only data containing the end defined in the
- * linker script. other archs that use dynamic memory length discovery can make
- * this read-write and update it during init.
- */
-.global _heap_end
-_heap_end:
- .int _end_of_ram
diff --git a/lib/heap/heap.c b/lib/heap/heap.c
index 71b6fa4..a3a35fb 100644
--- a/lib/heap/heap.c
+++ b/lib/heap/heap.c
@@ -52,10 +52,10 @@
extern int _end;
// end of memory
-extern int _heap_end;
+extern int _end_of_ram;
#define HEAP_START ((unsigned long)&_end)
-#define HEAP_LEN ((size_t)_heap_end - (size_t)&_end)
+#define HEAP_LEN ((size_t)&_end_of_ram - (size_t)&_end)
#endif
struct free_heap_chunk {
diff --git a/platform/msm_shared/mmc.c b/platform/msm_shared/mmc.c
index 0f70b53..b504c35 100644
--- a/platform/msm_shared/mmc.c
+++ b/platform/msm_shared/mmc.c
@@ -2659,45 +2659,49 @@
unsigned int mmc_count = 0;
unsigned int write_error = MMC_BOOT_MCI_STAT_DATA_CRC_FAIL |
MMC_BOOT_MCI_STAT_DATA_TIMEOUT | MMC_BOOT_MCI_STAT_TX_UNDRUN;
+ unsigned int count = 0;
+ unsigned int sz = 0;
/* Write the transfer data to SDCC3 FIFO */
do {
- mmc_ret = MMC_BOOT_E_SUCCESS;
mmc_status = readl(MMC_BOOT_MCI_STATUS);
- if (mmc_status & write_error) {
- mmc_ret = mmc_boot_status_error(mmc_status);
- break;
- }
+ /* Bytes left to write */
+ count = data_len - mmc_count;
- /* Write the data in MCI_FIFO register as long as TXFIFO_FULL bit of
- MCI_STATUS register is 0. Continue the writes until the whole
- transfer data is written. */
- if (((data_len - mmc_count) >= MMC_BOOT_MCI_FIFO_SIZE / 2) &&
- (mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_HFULL)) {
- for (int i = 0; i < MMC_BOOT_MCI_HFIFO_COUNT; i++) {
- /* FIFO contains 16 32-bit data buffer on 16 sequential addresses */
- writel(*mmc_ptr, MMC_BOOT_MCI_FIFO +
- (mmc_count % MMC_BOOT_MCI_FIFO_SIZE));
+ /* Break if whole data is transferred */
+ if (!count)
+ break;
+
+ /* Write half FIFO or less (remaining) words in MCI_FIFO as long as either
+ TX_FIFO_EMPTY or TX_FIFO_HFULL bits of MCI_STATUS register are set. */
+ if ((mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_EMPTY) ||
+ (mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_HFULL)) {
+
+ /* Write minimum of half FIFO and remaining words */
+ sz = ((count >> 2) > MMC_BOOT_MCI_HFIFO_COUNT) \
+ ? MMC_BOOT_MCI_HFIFO_COUNT : (count >> 2);
+
+ for (int i = 0; i < sz; i++) {
+ writel(*mmc_ptr, MMC_BOOT_MCI_FIFO);
mmc_ptr++;
/* increase mmc_count by word size */
mmc_count += sizeof(unsigned int);
}
-
- } else if (!(mmc_status & MMC_BOOT_MCI_STAT_TX_FIFO_FULL)
- && (mmc_count != data_len)) {
- /* FIFO contains 16 32-bit data buffer on 16 sequential addresses */
- writel(*mmc_ptr, MMC_BOOT_MCI_FIFO +
- (mmc_count % MMC_BOOT_MCI_FIFO_SIZE));
- mmc_ptr++;
- /* increase mmc_count by word size */
- mmc_count += sizeof(unsigned int);
- } else if ((mmc_status & MMC_BOOT_MCI_STAT_DATA_END)) {
- break; //success
}
-
}
while (1);
+
+ do
+ {
+ mmc_status = readl(MMC_BOOT_MCI_STATUS);
+ if (mmc_status & write_error) {
+ mmc_ret = mmc_boot_status_error(mmc_status);
+ break;
+ }
+ }
+ while (!(mmc_status & MMC_BOOT_MCI_STAT_DATA_END));
+
return mmc_ret;
}
diff --git a/target/copper/atags.c b/target/copper/atags.c
deleted file mode 100644
index 174ae77..0000000
--- a/target/copper/atags.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Copyright (c) 2009-2012, Code Aurora Forum. 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 Code Aurora 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, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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.
- *
- */
-
-#if !DEVICE_TREE /* If not using device tree */
-
-#include <reg.h>
-#include <debug.h>
-#include <smem.h>
-#include <platform/iomap.h>
-#include <stdint.h>
-
-#define SIZE_1M (1024 * 1024)
-#define SIZE_2M (2 * SIZE_1M)
-#define SIZE_256M (256 * SIZE_1M)
-#define SIZE_512M (512 * SIZE_1M)
-
-#define ATAG_MEM 0x54410002
-
-typedef struct {
- uint32_t size;
- uint32_t start_addr;
-}mem_info;
-
-
-mem_info copper_default_first_512M[] = {
- { .size = (250 * SIZE_1M),
- .start_addr = SDRAM_START_ADDR
- },
- { .size = (240 * SIZE_1M),
- .start_addr = SDRAM_START_ADDR +
- (16 * SIZE_1M) +
- (256 * SIZE_1M)
- }
-};
-
-unsigned *target_mem_atag_create(unsigned *ptr, uint32_t size, uint32_t addr)
-{
- *ptr++ = 4;
- *ptr++ = ATAG_MEM;
- *ptr++ = size;
- *ptr++ = addr;
-
- return ptr;
-}
-
-
-unsigned *target_atag_create(unsigned *ptr,
- mem_info usable_mem_map[], unsigned num_regions)
-{
- unsigned int i;
-
- ASSERT(num_regions);
-
- dprintf(SPEW, "Number of HLOS regions in 1st bank = %u\n", num_regions);
-
- for (i = 0; i < num_regions; i++)
- {
- ptr = target_mem_atag_create(ptr,
- usable_mem_map[i].size,
- usable_mem_map[i].start_addr);
- }
- return ptr;
-}
-
-unsigned *target_atag_mem(unsigned *ptr)
-{
- struct smem_ram_ptable ram_ptable;
- uint8_t i = 0;
-
- /* Make sure RAM partition table is initialized */
- ASSERT(smem_ram_ptable_init(&ram_ptable));
-
- for (i = 0; i < ram_ptable.len; i++)
- {
- if (ram_ptable.parts[i].category == SDRAM &&
- (ram_ptable.parts[i].type == SYS_MEMORY) &&
- (ram_ptable.parts[i].start == SDRAM_START_ADDR))
- {
- ASSERT(ram_ptable.parts[i].size >= SIZE_512M);
-
- if (ram_ptable.parts[i].start == SDRAM_START_ADDR)
- ptr = target_atag_create(ptr,
- copper_default_first_512M,
- ARRAY_SIZE(copper_default_first_512M));
-
- }
-
- /* Pass along all other usable memory regions to Linux */
- if (ram_ptable.parts[i].category == SDRAM &&
- (ram_ptable.parts[i].type == SYS_MEMORY) &&
- (ram_ptable.parts[i].start != SDRAM_START_ADDR))
- {
- ptr = target_mem_atag_create(ptr,
- ram_ptable.parts[i].size,
- ram_ptable.parts[i].start);
- }
- }
-
- return ptr;
-}
-
-void *target_get_scratch_address(void)
-{
- return ((void *)SCRATCH_ADDR);
-}
-
-#endif /* DEVICE_TREE */
-
diff --git a/target/copper/rules.mk b/target/copper/rules.mk
index 238dbe9..73eb416 100644
--- a/target/copper/rules.mk
+++ b/target/copper/rules.mk
@@ -32,5 +32,4 @@
OBJS += \
$(LOCAL_DIR)/init.o \
- $(LOCAL_DIR)/atags.o \
$(LOCAL_DIR)/meminfo.o
diff --git a/target/mdm9615/init.c b/target/mdm9615/init.c
index 653986b..daedbc3 100644
--- a/target/mdm9615/init.c
+++ b/target/mdm9615/init.c
@@ -287,6 +287,7 @@
ptentry_ptr[ptn_index].name[i] =
tolower(ptentry_ptr[ptn_index].name[i]);
}
+ ptentry_ptr[ptn_index].type = TYPE_APPS_PARTITION;
}
}