162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/err.h>
362306a36Sopenharmony_ci#include <linux/module.h>
462306a36Sopenharmony_ci#include <linux/io.h>
562306a36Sopenharmony_ci#include <linux/of.h>
662306a36Sopenharmony_ci#include <linux/of_address.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "hardware.h"
962306a36Sopenharmony_ci#include "common.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciunsigned int __mxc_cpu_type;
1262306a36Sopenharmony_cistatic unsigned int imx_soc_revision;
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_civoid mxc_set_cpu_type(unsigned int type)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	__mxc_cpu_type = type;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_civoid imx_set_soc_revision(unsigned int rev)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	imx_soc_revision = rev;
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciunsigned int imx_get_soc_revision(void)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return imx_soc_revision;
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_civoid imx_print_silicon_rev(const char *cpu, int srev)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	if (srev == IMX_CHIP_REVISION_UNKNOWN)
3262306a36Sopenharmony_ci		pr_info("CPU identified as %s, unknown revision\n", cpu);
3362306a36Sopenharmony_ci	else
3462306a36Sopenharmony_ci		pr_info("CPU identified as %s, silicon rev %d.%d\n",
3562306a36Sopenharmony_ci				cpu, (srev >> 4) & 0xf, srev & 0xf);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_civoid __init imx_set_aips(void __iomem *base)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	unsigned int reg;
4162306a36Sopenharmony_ci/*
4262306a36Sopenharmony_ci * Set all MPROTx to be non-bufferable, trusted for R/W,
4362306a36Sopenharmony_ci * not forced to user-mode.
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_ci	imx_writel(0x77777777, base + 0x0);
4662306a36Sopenharmony_ci	imx_writel(0x77777777, base + 0x4);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/*
4962306a36Sopenharmony_ci * Set all OPACRx to be non-bufferable, to not require
5062306a36Sopenharmony_ci * supervisor privilege level for access, allow for
5162306a36Sopenharmony_ci * write access and untrusted master access.
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_ci	imx_writel(0x0, base + 0x40);
5462306a36Sopenharmony_ci	imx_writel(0x0, base + 0x44);
5562306a36Sopenharmony_ci	imx_writel(0x0, base + 0x48);
5662306a36Sopenharmony_ci	imx_writel(0x0, base + 0x4C);
5762306a36Sopenharmony_ci	reg = imx_readl(base + 0x50) & 0x00FFFFFF;
5862306a36Sopenharmony_ci	imx_writel(reg, base + 0x50);
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_civoid __init imx_aips_allow_unprivileged_access(
6262306a36Sopenharmony_ci		const char *compat)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	void __iomem *aips_base_addr;
6562306a36Sopenharmony_ci	struct device_node *np;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	for_each_compatible_node(np, NULL, compat) {
6862306a36Sopenharmony_ci		aips_base_addr = of_iomap(np, 0);
6962306a36Sopenharmony_ci		WARN_ON(!aips_base_addr);
7062306a36Sopenharmony_ci		imx_set_aips(aips_base_addr);
7162306a36Sopenharmony_ci	}
7262306a36Sopenharmony_ci}
73