18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci */
48c2ecf20Sopenharmony_ci#include <linux/fs.h>
58c2ecf20Sopenharmony_ci#include <linux/fcntl.h>
68c2ecf20Sopenharmony_ci#include <linux/memblock.h>
78c2ecf20Sopenharmony_ci#include <linux/mm.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <asm/bootinfo.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <loongson.h>
128c2ecf20Sopenharmony_ci#include <mem.h>
138c2ecf20Sopenharmony_ci#include <pci.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ciu32 memsize, highmemsize;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_civoid __init prom_init_memory(void)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	memblock_add(0x0, (memsize << 20));
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_SUPPORTS_ADDRWINCFG
238c2ecf20Sopenharmony_ci	{
248c2ecf20Sopenharmony_ci		int bit;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci		bit = fls(memsize + highmemsize);
278c2ecf20Sopenharmony_ci		if (bit != ffs(memsize + highmemsize))
288c2ecf20Sopenharmony_ci			bit += 20;
298c2ecf20Sopenharmony_ci		else
308c2ecf20Sopenharmony_ci			bit = bit + 20 - 1;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci		/* set cpu window3 to map CPU to DDR: 2G -> 2G */
338c2ecf20Sopenharmony_ci		LOONGSON_ADDRWIN_CPUTODDR(ADDRWIN_WIN3, 0x80000000ul,
348c2ecf20Sopenharmony_ci					  0x80000000ul, (1 << bit));
358c2ecf20Sopenharmony_ci		mmiowb();
368c2ecf20Sopenharmony_ci	}
378c2ecf20Sopenharmony_ci#endif /* !CONFIG_CPU_SUPPORTS_ADDRWINCFG */
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT
408c2ecf20Sopenharmony_ci	if (highmemsize > 0)
418c2ecf20Sopenharmony_ci		memblock_add(LOONGSON_HIGHMEM_START, highmemsize << 20);
428c2ecf20Sopenharmony_ci#endif /* !CONFIG_64BIT */
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci/* override of arch/mips/mm/cache.c: __uncached_access */
468c2ecf20Sopenharmony_ciint __uncached_access(struct file *file, unsigned long addr)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	if (file->f_flags & O_DSYNC)
498c2ecf20Sopenharmony_ci		return 1;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	return addr >= __pa(high_memory) ||
528c2ecf20Sopenharmony_ci		((addr >= LOONGSON_MMIO_MEM_START) &&
538c2ecf20Sopenharmony_ci		 (addr < LOONGSON_MMIO_MEM_END));
548c2ecf20Sopenharmony_ci}
55