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