162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci */
462306a36Sopenharmony_ci#include <linux/fs.h>
562306a36Sopenharmony_ci#include <linux/fcntl.h>
662306a36Sopenharmony_ci#include <linux/memblock.h>
762306a36Sopenharmony_ci#include <linux/mm.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <asm/bootinfo.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <loongson.h>
1262306a36Sopenharmony_ci#include <mem.h>
1362306a36Sopenharmony_ci#include <pci.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciu32 memsize, highmemsize;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_civoid __init prom_init_memory(void)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	memblock_add(0x0, (memsize << 20));
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#ifdef CONFIG_CPU_SUPPORTS_ADDRWINCFG
2362306a36Sopenharmony_ci	{
2462306a36Sopenharmony_ci		int bit;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci		bit = fls(memsize + highmemsize);
2762306a36Sopenharmony_ci		if (bit != ffs(memsize + highmemsize))
2862306a36Sopenharmony_ci			bit += 20;
2962306a36Sopenharmony_ci		else
3062306a36Sopenharmony_ci			bit = bit + 20 - 1;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci		/* set cpu window3 to map CPU to DDR: 2G -> 2G */
3362306a36Sopenharmony_ci		LOONGSON_ADDRWIN_CPUTODDR(ADDRWIN_WIN3, 0x80000000ul,
3462306a36Sopenharmony_ci					  0x80000000ul, (1 << bit));
3562306a36Sopenharmony_ci		mmiowb();
3662306a36Sopenharmony_ci	}
3762306a36Sopenharmony_ci#endif /* !CONFIG_CPU_SUPPORTS_ADDRWINCFG */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#ifdef CONFIG_64BIT
4062306a36Sopenharmony_ci	if (highmemsize > 0)
4162306a36Sopenharmony_ci		memblock_add(LOONGSON_HIGHMEM_START, highmemsize << 20);
4262306a36Sopenharmony_ci#endif /* !CONFIG_64BIT */
4362306a36Sopenharmony_ci}
44