xref: /rk3399_ARM-atf/plat/imx/common/imx_aips.c (revision 09d40e0e08283a249e7dce0e106c07c5141f9b7e)
149a64134SBryan O'Donoghue /*
249a64134SBryan O'Donoghue  * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
349a64134SBryan O'Donoghue  *
449a64134SBryan O'Donoghue  * SPDX-License-Identifier: BSD-3-Clause
549a64134SBryan O'Donoghue  */
649a64134SBryan O'Donoghue 
7*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
8*09d40e0eSAntonio Nino Diaz #include <lib/utils_def.h>
9*09d40e0eSAntonio Nino Diaz 
1049a64134SBryan O'Donoghue #include <imx_aips.h>
1149a64134SBryan O'Donoghue #include <imx_regs.h>
1249a64134SBryan O'Donoghue 
1349a64134SBryan O'Donoghue static void imx_aips_set_default_access(struct aipstz_regs *aips_regs)
1449a64134SBryan O'Donoghue {
1549a64134SBryan O'Donoghue 	int i;
1649a64134SBryan O'Donoghue 	uintptr_t addr;
1749a64134SBryan O'Donoghue 
1849a64134SBryan O'Donoghue 	/*
1949a64134SBryan O'Donoghue 	 * See section 4.7.7.1 AIPSTZ_MPR field descriptions
2049a64134SBryan O'Donoghue 	 * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1, 08/2016
2149a64134SBryan O'Donoghue 	 * 0111 ->
2249a64134SBryan O'Donoghue 	 *	0: Write Access from master not buffered
2349a64134SBryan O'Donoghue 	 *	1: Master is trusted for read access
2449a64134SBryan O'Donoghue 	 *	1: Master is trsuted for write access
2549a64134SBryan O'Donoghue 	 *	1: Access from master is not forced to user mode
2649a64134SBryan O'Donoghue 	 */
2749a64134SBryan O'Donoghue 	addr = (uintptr_t)&aips_regs->aipstz_mpr;
2849a64134SBryan O'Donoghue 	mmio_write_32(addr, 0x77777777);
2949a64134SBryan O'Donoghue 
3049a64134SBryan O'Donoghue 	/*
3149a64134SBryan O'Donoghue 	 * Helpfully the OPACR registers have the logical inversion of the above
3249a64134SBryan O'Donoghue 	 * See section 4.7.7.1 AIPSTZ_MPR field descriptions
3349a64134SBryan O'Donoghue 	 * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1, 08/2016
3449a64134SBryan O'Donoghue 	 * 0000 ->
3549a64134SBryan O'Donoghue 	 *	0: Write Access to the peripheral is not buffered by AIPSTZ
3649a64134SBryan O'Donoghue 	 *	0: The peripheral does not require supervisor priv to access
3749a64134SBryan O'Donoghue 	 *	0: Master is trsuted for write access
3849a64134SBryan O'Donoghue 	 *	0: Access from master is not forced to user mode
3949a64134SBryan O'Donoghue 	 */
4049a64134SBryan O'Donoghue 	for (i = 0; i < AIPSTZ_OAPCR_COUNT; i++) {
4149a64134SBryan O'Donoghue 		addr = (uintptr_t)&aips_regs->aipstz_opacr[i];
4249a64134SBryan O'Donoghue 		mmio_write_32(addr, 0x00000000);
4349a64134SBryan O'Donoghue 	}
4449a64134SBryan O'Donoghue }
4549a64134SBryan O'Donoghue 
4649a64134SBryan O'Donoghue void imx_aips_init(void)
4749a64134SBryan O'Donoghue {
4849a64134SBryan O'Donoghue 	int i;
4949a64134SBryan O'Donoghue 	struct aipstz_regs *aips_regs[] = {
5049a64134SBryan O'Donoghue 		(struct aipstz_regs *)(AIPS1_BASE + AIPSTZ_CONFIG_OFFSET),
5149a64134SBryan O'Donoghue 		(struct aipstz_regs *)(AIPS2_BASE + AIPSTZ_CONFIG_OFFSET),
5249a64134SBryan O'Donoghue 		(struct aipstz_regs *)(AIPS3_BASE + AIPSTZ_CONFIG_OFFSET),
5349a64134SBryan O'Donoghue 	};
5449a64134SBryan O'Donoghue 
5549a64134SBryan O'Donoghue 	for (i = 0; i < ARRAY_SIZE(aips_regs); i++)
5649a64134SBryan O'Donoghue 		imx_aips_set_default_access(aips_regs[i]);
5749a64134SBryan O'Donoghue }
58