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