mirror of https://github.com/OpenIPC/firmware.git
173 lines
4.4 KiB
Diff
173 lines
4.4 KiB
Diff
diff -drupN a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
|
|
--- a/arch/mips/kernel/setup.c 2017-10-21 18:09:07.000000000 +0300
|
|
+++ b/arch/mips/kernel/setup.c 2022-06-09 05:02:27.000000000 +0300
|
|
@@ -26,6 +26,7 @@
|
|
#include <linux/sizes.h>
|
|
#include <linux/device.h>
|
|
#include <linux/dma-contiguous.h>
|
|
+#include <linux/of_fdt.h>
|
|
|
|
#include <asm/addrspace.h>
|
|
#include <asm/bootinfo.h>
|
|
@@ -625,6 +626,89 @@ static void __init request_crashkernel(s
|
|
#define USE_DTB_CMDLINE IS_ENABLED(CONFIG_MIPS_CMDLINE_FROM_DTB)
|
|
#define EXTEND_WITH_PROM IS_ENABLED(CONFIG_MIPS_CMDLINE_EXTEND)
|
|
|
|
+#ifdef CONFIG_LINUX_PMEM
|
|
+static unsigned long g_pmem_total_size=0;
|
|
+static unsigned long g_pmem_start=0;
|
|
+static int g_pmem_set_by_cmdline=0;
|
|
+
|
|
+#if 0
|
|
+/* called in arch/mips/xburst2/soc-x2000-v12/setup.c */
|
|
+unsigned long set_reserved_pmem_total_size(unsigned long size)
|
|
+{
|
|
+ g_pmem_total_size = size;
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
+unsigned long get_reserved_pmem_size(void)
|
|
+{
|
|
+ return g_pmem_total_size;
|
|
+}
|
|
+
|
|
+unsigned long get_reserved_pmem_start(void)
|
|
+{
|
|
+ return g_pmem_start;
|
|
+}
|
|
+
|
|
+static int __init pmem_parse(char *str)
|
|
+{
|
|
+ char *retptr;
|
|
+ unsigned long pmem_size;
|
|
+ unsigned long pmem_base = -1;
|
|
+
|
|
+ pmem_size = memparse(str, &retptr);
|
|
+ if(pmem_size < 0) {
|
|
+ printk("pmem_size is error!\n");
|
|
+ /* pmem_size = 0x4000000; */
|
|
+ goto abort;
|
|
+ }
|
|
+
|
|
+ if (*retptr == '@')
|
|
+ pmem_base = memparse(retptr + 1, NULL);
|
|
+
|
|
+ if(pmem_base < 0) {
|
|
+ printk("pmem_base is error!\n");
|
|
+ /* pmem_base = 0xc000000; */
|
|
+ goto abort;
|
|
+ }
|
|
+
|
|
+ g_pmem_start = pmem_base;
|
|
+ g_pmem_total_size = pmem_size;
|
|
+ g_pmem_set_by_cmdline = 1;
|
|
+
|
|
+ return 1;
|
|
+abort:
|
|
+ return 0;
|
|
+}
|
|
+__setup("pmem=", pmem_parse);
|
|
+
|
|
+static unsigned int str2(unsigned int *i, const char *str, int v)
|
|
+{
|
|
+ unsigned int temp = 0;
|
|
+
|
|
+ while(*str != 0) {
|
|
+ if((*str>='0') && (*str<='9') && (v == 10))
|
|
+ temp = temp*v + (*str - '0');
|
|
+ else if ((*str>='A') && (*str<='F') && (v == 16))
|
|
+ temp = temp*v + (*str - 'A') + 10;
|
|
+ else
|
|
+ break;
|
|
+ str++;
|
|
+ }
|
|
+
|
|
+ *i = temp;
|
|
+
|
|
+ if (v == 10) {
|
|
+ if (*str == 'M')
|
|
+ return 1024 * 1024;
|
|
+ else if (*str == 'K')
|
|
+ return 1024;
|
|
+ }
|
|
+
|
|
+ return 1;
|
|
+}
|
|
+#endif /* CONFIG_LINUX_PMEM */
|
|
+
|
|
static void __init arch_mem_init(char **cmdline_p)
|
|
{
|
|
struct memblock_region *reg;
|
|
@@ -678,6 +762,59 @@ static void __init arch_mem_init(char **
|
|
pr_info("User-defined physical RAM map:\n");
|
|
print_memory_map();
|
|
}
|
|
+#ifdef CONFIG_LINUX_PMEM
|
|
+ /* reserve memory for pmem. */
|
|
+ if (g_pmem_set_by_cmdline == 0) {
|
|
+ char *str = CONFIG_PMEM_RESERVE_SIZE;
|
|
+ unsigned int size;
|
|
+
|
|
+ do {
|
|
+ if (strlen(str) == 1) {
|
|
+ g_pmem_total_size = 0;
|
|
+ break;
|
|
+ } else if ((*(str+1) == 'x') || (*(str+1) == 'X')) {
|
|
+ str2(&size, str+2, 16);
|
|
+ g_pmem_total_size = size;
|
|
+ break;
|
|
+ } else {
|
|
+ unsigned int f = str2(&size, str, 10);
|
|
+ g_pmem_total_size = size * f;
|
|
+ break;
|
|
+ }
|
|
+ } while(0);
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "reserve memory for pmem, g_pmem_total_size: %#x\n", (unsigned int)g_pmem_total_size);
|
|
+ if ( g_pmem_total_size > 0x10000 ) {
|
|
+ int i;
|
|
+ const int field = 2 * sizeof(unsigned long);
|
|
+
|
|
+ for (i = boot_mem_map.nr_map-1; i>-1; i--) {
|
|
+
|
|
+ if (BOOT_MEM_RAM == boot_mem_map.map[i].type
|
|
+ && (unsigned long)boot_mem_map.map[i].size > g_pmem_total_size) {
|
|
+
|
|
+ printk(KERN_INFO " original, memory %d: %0*Lx @ %0*Lx \n", i,
|
|
+ field, (unsigned long long) boot_mem_map.map[i].size,
|
|
+ field, (unsigned long long) boot_mem_map.map[i].addr);
|
|
+
|
|
+ boot_mem_map.map[i].size -= g_pmem_total_size;
|
|
+ g_pmem_start = (unsigned long)boot_mem_map.map[i].addr + (unsigned long)boot_mem_map.map[i].size;
|
|
+
|
|
+ printk(KERN_INFO "after reserve pmem, memory %d: %0*Lx @ %0*Lx \n", i,
|
|
+ field, (unsigned long long) boot_mem_map.map[i].size,
|
|
+ field, (unsigned long long) boot_mem_map.map[i].addr);
|
|
+
|
|
+ printk(KERN_INFO " reserve memory for pmem: %0*Lx @ %0*Lx ",
|
|
+ field, (unsigned long long) g_pmem_total_size,
|
|
+ field, (unsigned long long) g_pmem_start);
|
|
+ printk(KERN_INFO "\n");
|
|
+
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+#endif /* CONFIG_LINUX_PMEM */
|
|
|
|
bootmem_init();
|
|
#ifdef CONFIG_PROC_VMCORE
|
|
@@ -701,6 +838,10 @@ static void __init arch_mem_init(char **
|
|
plat_swiotlb_setup();
|
|
paging_init();
|
|
|
|
+
|
|
+ early_init_fdt_reserve_self();
|
|
+ early_init_fdt_scan_reserved_mem();
|
|
+
|
|
dma_contiguous_reserve(PFN_PHYS(max_low_pfn));
|
|
/* Tell bootmem about cma reserved memblock section */
|
|
for_each_memblock(reserved, reg)
|