Skip to content
Snippets Groups Projects
msmc.c 1.84 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * MSMC controller utilities
     *
     * (C) Copyright 2012-2014
     *     Texas Instruments Incorporated, <www.ti.com>
     *
     * SPDX-License-Identifier:     GPL-2.0+
     */
    
    #include <common.h>
    
    #include <asm/arch/msmc.h>
    
    
    struct mpax {
    	u32	mpaxl;
    	u32	mpaxh;
    };
    
    struct msms_regs {
    	u32	pid;
    	u32	_res_04;
    	u32	smcerrar;
    	u32	smcerrxr;
    	u32	smedcc;
    	u32	smcea;
    	u32	smsecc;
    	u32	smpfar;
    	u32	smpfxr;
    	u32	smpfr;
    	u32	smpfcr;
    	u32	_res_2c;
    	u32	sbndc[8];
    	u32	sbndm;
    	u32	sbnde;
    	u32	_res_58;
    	u32	cfglck;
    	u32	cfgulck;
    	u32	cfglckstat;
    	u32	sms_mpax_lck;
    	u32	sms_mpax_ulck;
    	u32	sms_mpax_lckstat;
    	u32	ses_mpax_lck;
    	u32	ses_mpax_ulck;
    	u32	ses_mpax_lckstat;
    	u32	smestat;
    	u32	smirstat;
    	u32	smirc;
    	u32	smiestat;
    	u32	smiec;
    	u32	_res_94_c0[12];
    	u32	smncerrar;
    	u32	smncerrxr;
    	u32	smncea;
    	u32	_res_d0_1fc[76];
    	struct mpax sms[16][8];
    	struct mpax ses[16][8];
    };
    
    
    
    void msmc_share_all_segments(int priv_id)
    
    	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
    
    	int j;
    
    	for (j = 0; j < 8; j++) {
    		msmc->sms[priv_id][j].mpaxh &= 0xffffff7ful;
    		msmc->ses[priv_id][j].mpaxh &= 0xffffff7ful;
    	}
    }
    
    
    void msmc_map_ses_segment(int priv_id, int ses_pair,
    			  u32 src_pfn, u32 dst_pfn, enum mpax_seg_size size)
    {
    	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
    
    	msmc->ses[priv_id][ses_pair].mpaxh = src_pfn << 12 |
    					     (size & 0x1f) | 0x80;
    	msmc->ses[priv_id][ses_pair].mpaxl = dst_pfn << 8 | 0x3f;
    }
    
    void msmc_get_ses_mpax(int priv_id, int ses_pair, u32 *mpax)
    {
    	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
    
    	*mpax++ = msmc->ses[priv_id][ses_pair].mpaxl;
    	*mpax = msmc->ses[priv_id][ses_pair].mpaxh;
    }
    
    void msmc_set_ses_mpax(int priv_id, int ses_pair, u32 *mpax)
    {
    	struct msms_regs *msmc = (struct msms_regs *)KS2_MSMC_CTRL_BASE;
    
    	msmc->ses[priv_id][ses_pair].mpaxl = *mpax++;
    	msmc->ses[priv_id][ses_pair].mpaxh = *mpax;
    }