xref: /rk3399_rockchip-uboot/arch/arm/mach-keystone/msmc.c (revision b9cb64825b5e6efeb715abd8b48d9b12f98973e9)
1*39a72345SMasahiro Yamada /*
2*39a72345SMasahiro Yamada  * MSMC controller utilities
3*39a72345SMasahiro Yamada  *
4*39a72345SMasahiro Yamada  * (C) Copyright 2012-2014
5*39a72345SMasahiro Yamada  *     Texas Instruments Incorporated, <www.ti.com>
6*39a72345SMasahiro Yamada  *
7*39a72345SMasahiro Yamada  * SPDX-License-Identifier:     GPL-2.0+
8*39a72345SMasahiro Yamada  */
9*39a72345SMasahiro Yamada 
10*39a72345SMasahiro Yamada #include <common.h>
11*39a72345SMasahiro Yamada #include <asm/arch/msmc.h>
12*39a72345SMasahiro Yamada 
13*39a72345SMasahiro Yamada struct mpax {
14*39a72345SMasahiro Yamada 	u32	mpaxl;
15*39a72345SMasahiro Yamada 	u32	mpaxh;
16*39a72345SMasahiro Yamada };
17*39a72345SMasahiro Yamada 
18*39a72345SMasahiro Yamada struct msms_regs {
19*39a72345SMasahiro Yamada 	u32	pid;
20*39a72345SMasahiro Yamada 	u32	_res_04;
21*39a72345SMasahiro Yamada 	u32	smcerrar;
22*39a72345SMasahiro Yamada 	u32	smcerrxr;
23*39a72345SMasahiro Yamada 	u32	smedcc;
24*39a72345SMasahiro Yamada 	u32	smcea;
25*39a72345SMasahiro Yamada 	u32	smsecc;
26*39a72345SMasahiro Yamada 	u32	smpfar;
27*39a72345SMasahiro Yamada 	u32	smpfxr;
28*39a72345SMasahiro Yamada 	u32	smpfr;
29*39a72345SMasahiro Yamada 	u32	smpfcr;
30*39a72345SMasahiro Yamada 	u32	_res_2c;
31*39a72345SMasahiro Yamada 	u32	sbndc[8];
32*39a72345SMasahiro Yamada 	u32	sbndm;
33*39a72345SMasahiro Yamada 	u32	sbnde;
34*39a72345SMasahiro Yamada 	u32	_res_58;
35*39a72345SMasahiro Yamada 	u32	cfglck;
36*39a72345SMasahiro Yamada 	u32	cfgulck;
37*39a72345SMasahiro Yamada 	u32	cfglckstat;
38*39a72345SMasahiro Yamada 	u32	sms_mpax_lck;
39*39a72345SMasahiro Yamada 	u32	sms_mpax_ulck;
40*39a72345SMasahiro Yamada 	u32	sms_mpax_lckstat;
41*39a72345SMasahiro Yamada 	u32	ses_mpax_lck;
42*39a72345SMasahiro Yamada 	u32	ses_mpax_ulck;
43*39a72345SMasahiro Yamada 	u32	ses_mpax_lckstat;
44*39a72345SMasahiro Yamada 	u32	smestat;
45*39a72345SMasahiro Yamada 	u32	smirstat;
46*39a72345SMasahiro Yamada 	u32	smirc;
47*39a72345SMasahiro Yamada 	u32	smiestat;
48*39a72345SMasahiro Yamada 	u32	smiec;
49*39a72345SMasahiro Yamada 	u32	_res_94_c0[12];
50*39a72345SMasahiro Yamada 	u32	smncerrar;
51*39a72345SMasahiro Yamada 	u32	smncerrxr;
52*39a72345SMasahiro Yamada 	u32	smncea;
53*39a72345SMasahiro Yamada 	u32	_res_d0_1fc[76];
54*39a72345SMasahiro Yamada 	struct mpax sms[16][8];
55*39a72345SMasahiro Yamada 	struct mpax ses[16][8];
56*39a72345SMasahiro Yamada };
57*39a72345SMasahiro Yamada 
58*39a72345SMasahiro Yamada 
msmc_share_all_segments(int priv_id)59*39a72345SMasahiro Yamada void msmc_share_all_segments(int priv_id)
60*39a72345SMasahiro Yamada {
61*39a72345SMasahiro Yamada 	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
62*39a72345SMasahiro Yamada 	int j;
63*39a72345SMasahiro Yamada 
64*39a72345SMasahiro Yamada 	for (j = 0; j < 8; j++) {
65*39a72345SMasahiro Yamada 		msmc->sms[priv_id][j].mpaxh &= 0xffffff7ful;
66*39a72345SMasahiro Yamada 		msmc->ses[priv_id][j].mpaxh &= 0xffffff7ful;
67*39a72345SMasahiro Yamada 	}
68*39a72345SMasahiro Yamada }
69*39a72345SMasahiro Yamada 
msmc_map_ses_segment(int priv_id,int ses_pair,u32 src_pfn,u32 dst_pfn,enum mpax_seg_size size)70*39a72345SMasahiro Yamada void msmc_map_ses_segment(int priv_id, int ses_pair,
71*39a72345SMasahiro Yamada 			  u32 src_pfn, u32 dst_pfn, enum mpax_seg_size size)
72*39a72345SMasahiro Yamada {
73*39a72345SMasahiro Yamada 	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
74*39a72345SMasahiro Yamada 
75*39a72345SMasahiro Yamada 	msmc->ses[priv_id][ses_pair].mpaxh = src_pfn << 12 |
76*39a72345SMasahiro Yamada 					     (size & 0x1f) | 0x80;
77*39a72345SMasahiro Yamada 	msmc->ses[priv_id][ses_pair].mpaxl = dst_pfn << 8 | 0x3f;
78*39a72345SMasahiro Yamada }
79*39a72345SMasahiro Yamada 
msmc_get_ses_mpax(int priv_id,int ses_pair,u32 * mpax)80*39a72345SMasahiro Yamada void msmc_get_ses_mpax(int priv_id, int ses_pair, u32 *mpax)
81*39a72345SMasahiro Yamada {
82*39a72345SMasahiro Yamada 	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
83*39a72345SMasahiro Yamada 
84*39a72345SMasahiro Yamada 	*mpax++ = msmc->ses[priv_id][ses_pair].mpaxl;
85*39a72345SMasahiro Yamada 	*mpax = msmc->ses[priv_id][ses_pair].mpaxh;
86*39a72345SMasahiro Yamada }
87*39a72345SMasahiro Yamada 
msmc_set_ses_mpax(int priv_id,int ses_pair,u32 * mpax)88*39a72345SMasahiro Yamada void msmc_set_ses_mpax(int priv_id, int ses_pair, u32 *mpax)
89*39a72345SMasahiro Yamada {
90*39a72345SMasahiro Yamada 	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
91*39a72345SMasahiro Yamada 
92*39a72345SMasahiro Yamada 	msmc->ses[priv_id][ses_pair].mpaxl = *mpax++;
93*39a72345SMasahiro Yamada 	msmc->ses[priv_id][ses_pair].mpaxh = *mpax;
94*39a72345SMasahiro Yamada }
95