firmware/br-ext-chip-ingenic/board/t40/kernel/patches/00000-arch_mips_kernel_setu...

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)