18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * OMAP SRAM detection and management
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2005 Nokia Corporation
68c2ecf20Sopenharmony_ci * Written by Tony Lindgren <tony@atomide.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/module.h>
108c2ecf20Sopenharmony_ci#include <linux/kernel.h>
118c2ecf20Sopenharmony_ci#include <linux/init.h>
128c2ecf20Sopenharmony_ci#include <linux/io.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <asm/fncpy.h>
158c2ecf20Sopenharmony_ci#include <asm/tlb.h>
168c2ecf20Sopenharmony_ci#include <asm/cacheflush.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include <asm/mach/map.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include "soc.h"
218c2ecf20Sopenharmony_ci#include "sram.h"
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#define OMAP1_SRAM_PA		0x20000000
248c2ecf20Sopenharmony_ci#define SRAM_BOOTLOADER_SZ	0x80
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/*
278c2ecf20Sopenharmony_ci * The amount of SRAM depends on the core type.
288c2ecf20Sopenharmony_ci * Note that we cannot try to test for SRAM here because writes
298c2ecf20Sopenharmony_ci * to secure SRAM will hang the system. Also the SRAM is not
308c2ecf20Sopenharmony_ci * yet mapped at this point.
318c2ecf20Sopenharmony_ci */
328c2ecf20Sopenharmony_cistatic void __init omap_detect_and_map_sram(void)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	unsigned long omap_sram_skip = SRAM_BOOTLOADER_SZ;
358c2ecf20Sopenharmony_ci	unsigned long omap_sram_start = OMAP1_SRAM_PA;
368c2ecf20Sopenharmony_ci	unsigned long omap_sram_size;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	if (cpu_is_omap7xx())
398c2ecf20Sopenharmony_ci		omap_sram_size = 0x32000;	/* 200K */
408c2ecf20Sopenharmony_ci	else if (cpu_is_omap15xx())
418c2ecf20Sopenharmony_ci		omap_sram_size = 0x30000;	/* 192K */
428c2ecf20Sopenharmony_ci	else if (cpu_is_omap1610() || cpu_is_omap1611() ||
438c2ecf20Sopenharmony_ci			cpu_is_omap1621() || cpu_is_omap1710())
448c2ecf20Sopenharmony_ci		omap_sram_size = 0x4000;	/* 16K */
458c2ecf20Sopenharmony_ci	else {
468c2ecf20Sopenharmony_ci		pr_err("Could not detect SRAM size\n");
478c2ecf20Sopenharmony_ci		omap_sram_size = 0x4000;
488c2ecf20Sopenharmony_ci	}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	omap_map_sram(omap_sram_start, omap_sram_size,
518c2ecf20Sopenharmony_ci		omap_sram_skip, 1);
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_civoid omap_sram_reprogram_clock(u32 dpllctl, u32 ckctl)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	BUG_ON(!_omap_sram_reprogram_clock);
598c2ecf20Sopenharmony_ci	/* On 730, bit 13 must always be 1 */
608c2ecf20Sopenharmony_ci	if (cpu_is_omap7xx())
618c2ecf20Sopenharmony_ci		ckctl |= 0x2000;
628c2ecf20Sopenharmony_ci	_omap_sram_reprogram_clock(dpllctl, ckctl);
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciint __init omap_sram_init(void)
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	omap_detect_and_map_sram();
688c2ecf20Sopenharmony_ci	_omap_sram_reprogram_clock =
698c2ecf20Sopenharmony_ci			omap_sram_push(omap1_sram_reprogram_clock,
708c2ecf20Sopenharmony_ci					omap1_sram_reprogram_clock_sz);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	return 0;
738c2ecf20Sopenharmony_ci}
74