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