os/kernelhwsrv/kerneltest/e32test/hcr/d_hcrut_psl.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*/
sl@0
    12
//
sl@0
    13
// Contributors:
sl@0
    14
//
sl@0
    15
// Description:
sl@0
    16
// This file is part of the NE1_TB Variant Base Port
sl@0
    17
// Hardware Configuration Respoitory Platform Specific Layer (PSL) 
sl@0
    18
//
sl@0
    19
sl@0
    20
sl@0
    21
// -- INCLUDES ----------------------------------------------------------------
sl@0
    22
sl@0
    23
sl@0
    24
#include "hcr_debug.h"
sl@0
    25
sl@0
    26
#include "hcr_hai.h"
sl@0
    27
sl@0
    28
#include "hcr_uids.h"
sl@0
    29
sl@0
    30
#include <plat_priv.h>
sl@0
    31
#include <kernel/kernboot.h>
sl@0
    32
sl@0
    33
sl@0
    34
#ifdef __WINS__
sl@0
    35
// On WINS the EMapAttrSupRo and EMapAttrCachedMax doesn't exists
sl@0
    36
#define EMapAttrSupRo       0x01
sl@0
    37
#define EMapAttrCachedMax   0xF000
sl@0
    38
#endif
sl@0
    39
sl@0
    40
sl@0
    41
// -- GLOBALS -----------------------------------------------------------------
sl@0
    42
sl@0
    43
sl@0
    44
GLREF_C HCR::SRepositoryCompiled gRepository;
sl@0
    45
#define BUFFER_OFFSET_ZERO  0
sl@0
    46
sl@0
    47
// -- CLASSES- ----------------------------------------------------------------
sl@0
    48
sl@0
    49
sl@0
    50
class HCRVariant : public HCR::MVariant
sl@0
    51
    {    
sl@0
    52
    
sl@0
    53
public:
sl@0
    54
sl@0
    55
    HCRVariant();
sl@0
    56
    virtual ~HCRVariant();
sl@0
    57
    
sl@0
    58
public:    
sl@0
    59
    
sl@0
    60
    TInt Initialise();
sl@0
    61
    
sl@0
    62
    TBool IgnoreCoreImgRepository();
sl@0
    63
	TInt GetCompiledRepositoryAddress( TAny* & aAddr);
sl@0
    64
    TInt GetOverrideRepositoryAddress( TAny* & aAddr);
sl@0
    65
    
sl@0
    66
private:
sl@0
    67
    DChunk * iChunk;    
sl@0
    68
    };
sl@0
    69
    
sl@0
    70
    
sl@0
    71
sl@0
    72
sl@0
    73
// -- METHODS -----------------------------------------------------------------
sl@0
    74
sl@0
    75
sl@0
    76
HCRVariant::HCRVariant()
sl@0
    77
    : iChunk(0)
sl@0
    78
    {
sl@0
    79
    HCR_FUNC("HCRVariant");
sl@0
    80
    }
sl@0
    81
sl@0
    82
sl@0
    83
HCRVariant::~HCRVariant()
sl@0
    84
    {
sl@0
    85
    HCR_FUNC("~HCRVariant");
sl@0
    86
    if (iChunk != 0)
sl@0
    87
        {
sl@0
    88
        NKern::ThreadEnterCS();    
sl@0
    89
        TInt r = Kern::ChunkClose(iChunk);
sl@0
    90
        __NK_ASSERT_ALWAYS(r!=0);
sl@0
    91
        NKern::ThreadLeaveCS(); 
sl@0
    92
        }
sl@0
    93
    }
sl@0
    94
sl@0
    95
sl@0
    96
TInt HCRVariant::Initialise()
sl@0
    97
    {
sl@0
    98
    HCR_FUNC("HCRVariant::Initialise");
sl@0
    99
    
sl@0
   100
    HCR_TRACE_RETURN(KErrNone);
sl@0
   101
    }
sl@0
   102
    
sl@0
   103
    
sl@0
   104
TInt HCRVariant::GetCompiledRepositoryAddress( TAny* & aAddr)
sl@0
   105
    {
sl@0
   106
    HCR_FUNC("HCRVariant::GetCompiledRepositoryAddress");
sl@0
   107
        
sl@0
   108
    aAddr = static_cast<TAny*>(&gRepository);
sl@0
   109
    HCR_TRACE_RETURN(KErrNone);
sl@0
   110
    }
sl@0
   111
sl@0
   112
TBool HCRVariant::IgnoreCoreImgRepository()
sl@0
   113
    {
sl@0
   114
    HCR_FUNC("HCRVariant::IgnoreCoreImgRepository");
sl@0
   115
        
sl@0
   116
    HCR_TRACE_RETURN(EFalse);
sl@0
   117
    }
sl@0
   118
sl@0
   119
TInt HCRVariant::GetOverrideRepositoryAddress( TAny* & aAddr)
sl@0
   120
    {
sl@0
   121
    HCR_FUNC("HCRVariant::GetRAMRepositoryAddress");
sl@0
   122
    aAddr = 0;
sl@0
   123
sl@0
   124
	// Note: the SMR feature by which we obtain the address of the override
sl@0
   125
	// repository is only supported in the ARM bootstrap, not X86 or WINS so 
sl@0
   126
	// this test code needs conditional compilation.
sl@0
   127
#if !defined(__WINS__) && !defined(__X86__)
sl@0
   128
    
sl@0
   129
    // Note to future implementor:
sl@0
   130
	// #include <kernel\kernboot.h>
sl@0
   131
	// First check to see if SMRIB was created during boot time. 
sl@0
   132
    // If SSuperPageBase::iSmrData == KSuperPageAddressFieldUndefined (i.e. -1) 
sl@0
   133
	// it does not exist, return KErrNotSupported, SMR not support by base port
sl@0
   134
    // or it is not available due to boot scenario, i.e. boot from MMC
sl@0
   135
    //
sl@0
   136
    // If it does exist (i.e. boot from NAND) then read and process the 
sl@0
   137
	// SMR entries listed in the SMRIB looking for KHCRUID_SMRPayloadUID.
sl@0
   138
	// Next using the internal sizes from the HCR dat file within the SMR image
sl@0
   139
	// determine if the RAM holding the SMR image can be shrunk to return 
sl@0
   140
	// unused RAM pages at the end of the image.
sl@0
   141
	// 
sl@0
   142
	// Finally allocate the reserved RAM identified in the SMR entry to a 
sl@0
   143
	// DChunk and return the virtual address of the HCR data file payload
sl@0
   144
	// within the SMR image, i.e. iBase+(sizeof(SSmrRomHeader)>>2).
sl@0
   145
    // Locate SMRIB 
sl@0
   146
    const TSuperPage& superpage = Kern::SuperPage();
sl@0
   147
   	TUint32* smrIB;
sl@0
   148
   	smrIB = (TUint32 *) superpage.iSmrData;
sl@0
   149
   	
sl@0
   150
   	HCR_TRACE2("--- Superpage: 0x%08x, SMRIB: 0x%08x", &superpage, smrIB);
sl@0
   151
    
sl@0
   152
   	if( (smrIB == NULL) || (smrIB == (TUint32*)KSuperPageAddressFieldUndefined))
sl@0
   153
   	    {
sl@0
   154
        HCR_TRACE_RETURN(KErrNotSupported);   	        
sl@0
   155
   	    }
sl@0
   156
   	    
sl@0
   157
   	HCR_HEX_DUMP_ABS((TUint8 *)smrIB, 8*sizeof(SSmrBank) );
sl@0
   158
    SSmrBank * smrBank = (SSmrBank *) smrIB;
sl@0
   159
    
sl@0
   160
    // T_HCRUT designed to work ith the second HCR SMR image as the first 
sl@0
   161
	// is used by the t_hcr test suite.
sl@0
   162
    int smrInst = 2;
sl@0
   163
    
sl@0
   164
    while( smrBank->iBase != 0 ) 
sl@0
   165
        {
sl@0
   166
        HCR_TRACE2("--- smrBank: 0x%08x, smrBank->iPayloadUID: 0x%08x", smrBank, smrBank->iPayloadUID);
sl@0
   167
        
sl@0
   168
        if (smrBank->iPayloadUID == KHCRUID_SMRPayloadUID)
sl@0
   169
            {
sl@0
   170
            smrInst--;
sl@0
   171
			if (smrInst == 0) // PSL to use only the 2nd HCR SMR image
sl@0
   172
			    {
sl@0
   173
				
sl@0
   174
	            HCR_TRACE2("--- smrPhysAddr: 0x%08x, size:0x%08x", smrBank->iBase, smrBank->iSize);
sl@0
   175
	            NKern::ThreadEnterCS();
sl@0
   176
	    
sl@0
   177
	            TChunkCreateInfo info;
sl@0
   178
	            info.iType = TChunkCreateInfo::ESharedKernelSingle;
sl@0
   179
	            info.iMaxSize = smrBank->iSize;
sl@0
   180
	
sl@0
   181
	            // Enable to give supervisor read only access and maximum caching at both L1 and L2.
sl@0
   182
	            info.iMapAttr = EMapAttrSupRo|EMapAttrCachedMax;  
sl@0
   183
	
sl@0
   184
	            info.iOwnsMemory = EFalse; 
sl@0
   185
	            info.iDestroyedDfc = NULL;
sl@0
   186
	            TUint32 mapAttr;
sl@0
   187
	            TLinAddr chunkKernAddr;
sl@0
   188
	            TInt r = Kern::ChunkCreate(info, iChunk, chunkKernAddr, mapAttr);
sl@0
   189
	            if( r != KErrNone )
sl@0
   190
	                {
sl@0
   191
	                HCR_TRACE1("--- Kern::ChunkCreate failed: 0x%08x", r);
sl@0
   192
	                NKern::ThreadLeaveCS();
sl@0
   193
	                HCR_TRACE_RETURN(r);
sl@0
   194
	                }
sl@0
   195
	                
sl@0
   196
	            r = Kern::ChunkCommitPhysical(iChunk, BUFFER_OFFSET_ZERO, smrBank->iSize, smrBank->iBase);
sl@0
   197
	            if( r != KErrNone)
sl@0
   198
	                {
sl@0
   199
	                HCR_TRACE1("--- Kern::ChunkCommitPhysical failed: 0x%08x", r);
sl@0
   200
	                TInt r2 = Kern::ChunkClose(iChunk);
sl@0
   201
	                __NK_ASSERT_ALWAYS(r2!=0);
sl@0
   202
	                NKern::ThreadLeaveCS();
sl@0
   203
	                HCR_TRACE_RETURN(r);    
sl@0
   204
	                }   
sl@0
   205
	            NKern::ThreadLeaveCS();
sl@0
   206
	                
sl@0
   207
	            HCR_TRACE1("--- iChunkKernAddr: 0x%08x", chunkKernAddr);    
sl@0
   208
	            // It should contains SMR and HCR image headers and some settings
sl@0
   209
	            HCR_HEX_DUMP_ABS((TUint8 *)chunkKernAddr, 1024 );  
sl@0
   210
	            
sl@0
   211
	            // Skip the SMR header, so we return the address of the first byte in the Repository
sl@0
   212
	            aAddr = (TAny *) (chunkKernAddr + sizeof(SSmrRomHeader));  
sl@0
   213
	            
sl@0
   214
	            HCR_TRACE_RETURN(KErrNone);
sl@0
   215
	            }
sl@0
   216
	        }
sl@0
   217
         
sl@0
   218
        ++smrBank;    
sl@0
   219
        }
sl@0
   220
#endif // !__WINS__ && !__X86__
sl@0
   221
       	
sl@0
   222
    HCR_TRACE_RETURN(KErrNotSupported);
sl@0
   223
    }
sl@0
   224
sl@0
   225
 
sl@0
   226
// -- ENTRY POINTS ------------------------------------------------------------
sl@0
   227
sl@0
   228
sl@0
   229
GLDEF_C HCR::MVariant* CreateHCRVariant()
sl@0
   230
    {
sl@0
   231
    HCR_FUNC("CreateHCRVariant");
sl@0
   232
sl@0
   233
    return new HCRVariant;
sl@0
   234
    }