kernel/eka/drivers/pbus/mmc/rpmbstack.cpp
author hgs
Mon, 11 Oct 2010 19:11:06 +0100
changeset 287 ddfd5aa0d58f
permissions -rw-r--r--
201041_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
287
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     2
// All rights reserved.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     7
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    10
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    11
// Contributors:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    12
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    13
// Description:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    14
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    15
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    16
/**
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    17
 @file
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    18
 @internalComponent
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    19
 @prototype
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    20
*/
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    21
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    22
#include <drivers/mmc.h>
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    23
#include <drivers/rpmbpacket.h>
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    24
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    25
#include "OstTraceDefinitions.h"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    26
#ifdef OST_TRACE_COMPILER_IN_USE
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    27
#include "../../../include/drivers/locmedia_ost.h"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    28
#ifdef __VC32__
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    29
#pragma warning(disable: 4127) // disabling warning "conditional expression is constant"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    30
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    31
#include "rpmbstackTraces.h"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    32
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    33
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    34
TMMCErr DMMCStack::CIMRpmbAccessSM()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    35
    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    36
enum TStates
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    37
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    38
        EStBegin,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    39
        EStEnd
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    40
        };
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    41
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    42
    DMMCSession& s=Session();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    43
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    44
    //Extract the RPMB request type from the command. JEDEC specify this to be situated
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    45
    //at offset 0 in the packet. When accessing the hardware, this is reversed and is 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    46
    //at offset 511
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    47
	TUint8 requestType = * (s.Command().iDataMemoryP + KRpmbRequestLsbOffset);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    48
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    49
	//There are 5 possible rpmb request types that can be passed through the state machines:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    50
	//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    51
	//Authentication Key programming request:     KRpmbRequestWriteKey = 0x001
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    52
	//Reading of the write counter value request: KRpmbRequestReadWriteCounter = 0x0002;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    53
	//Authenticated data write request:           KRpmbRequestWriteData = 0x0003;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    54
	//Authenticated data read request:            KRpmbRequestReadData = 0x0004;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    55
	//Result read request:                        KRpmbRequestReadResultRegister = 0x0005;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    56
	//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    57
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    58
	SMF_BEGIN
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    59
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    60
    switch (requestType)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    61
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    62
        case KRpmbRequestWriteKey:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    63
			SMF_INVOKES(CIMRpmbWriteAuthenticationKeySMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    64
        case KRpmbRequestReadWriteCounter:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    65
			SMF_INVOKES(CIMRpmbReadWrCounterSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    66
        case KRpmbRequestWriteData:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    67
			SMF_INVOKES(CIMRpmbWriteSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    68
        case KRpmbRequestReadData:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    69
 			SMF_INVOKES(CIMRpmbReadSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    70
        default:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    71
            break;   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    72
        }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    73
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    74
    SMF_END
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    75
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    76
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    77
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    78
TMMCErr DMMCStack::CIMRpmbWriteAuthenticationKeySM()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    79
    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    80
    enum TStates
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    81
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    82
        EStBegin,   // Write key request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    83
        EStSetupReadRequest,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    84
        EStReadResult,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    85
        EStError,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    86
        EStEnd
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    87
        };
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    88
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    89
    DMMCSession& s=Session();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    90
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    91
	SMF_BEGIN
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    92
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    93
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    94
        // Setup write request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    95
        // CMD23 Reliable Write = 1 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    96
        // CMD25
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    97
        // 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    98
        s.SetupRpmbSendRequest(ETrue);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    99
		//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   100
        // KMMCErrByPass is routinely thrown in the ReadWriteBlocks state machine. 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   101
        // It is thrown to indicate that the current command in the state machine is not CMD42(lock/unlock)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   102
        // We need to trap this error here to stop the RPMB state machines from unravelling and passing
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   103
        // the error upwards. 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   104
        //	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   105
		m.SetTraps(KMMCErrBypass);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   106
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   107
		OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM1, "RPMB: Write Key State Machine - send write key request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   108
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - send write key request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   109
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   110
        SMF_INVOKES(CIMReadWriteBlocksSMST, EStSetupReadRequest);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   111
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   112
    SMF_STATE(EStSetupReadRequest)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   113
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   114
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM2, "RPMB: Write Key State Machine - sent write key request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   115
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - sent write key request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   116
    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   117
		if (err != KMMCErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   118
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   119
		    OstTrace1(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM3, "RPMB: Write Key State Machine - sent write key request packet error = %d", err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   120
		    __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - sent write key request packet error = %d", err));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   121
			SMF_GOTOS(EStError);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   122
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   123
		// 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   124
        // Setup read result register request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   125
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   126
        // CMD25
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   127
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   128
		s.SetupRpmbSendReadResultRegisterRequest();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   129
		OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM4, "RPMB: Write Key State Machine - send read result register request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   130
		__KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - send read result register request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   131
        SMF_INVOKES(CIMReadWriteBlocksSMST, EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   132
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   133
    SMF_STATE(EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   134
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   135
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM5, "RPMB: Write Key State Machine - sent read result register request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   136
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - sent read result register request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   137
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   138
        if (err != KMMCErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   139
            {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   140
            OstTrace1(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM6, "RPMB: Write Key State Machine - sent read result register request packet error = %d", err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   141
            __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - sent read result register request packet error = %d", err));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   142
            SMF_GOTOS(EStError);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   143
            }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   144
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   145
        // Setup read response
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   146
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   147
        // CMD18
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   148
        //        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   149
        s.SetupRpmbReceiveResponse();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   150
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITEAUTHENTICATIONKEYSM7, "RPMB: Write Key State Machine - get read packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   151
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write Key State Machine - get read packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   152
        SMF_INVOKES(CIMReadWriteBlocksSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   153
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   154
    SMF_STATE(EStError)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   155
        SMF_RETURN(err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   156
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   157
    SMF_END
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   158
    }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   159
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   160
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   161
TMMCErr DMMCStack::CIMRpmbReadWrCounterSM()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   162
    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   163
    enum TStates
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   164
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   165
        EStBegin,   // Read counter request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   166
        EStReadResult,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   167
        EStError,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   168
        EStEnd
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   169
        };
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   170
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   171
    DMMCSession& s=Session();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   172
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   173
	SMF_BEGIN
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   174
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   175
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   176
        // Setup write request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   177
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   178
        // CMD25
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   179
        // 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   180
        s.SetupRpmbSendRequest(EFalse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   181
        m.SetTraps(KMMCErrBypass);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   182
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   183
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBREADWRCOUNTERSM1, "RPMB: Read Write Counter State Machine - send read counter request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   184
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read Write Counter State Machine - send read counter request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   185
 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   186
        SMF_INVOKES(CIMReadWriteBlocksSMST, EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   187
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   188
    SMF_STATE(EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   189
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   190
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBREADWRCOUNTERSM2, "RPMB: Read Write Counter State Machine - sent read counter request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   191
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read Write Counter State Machine - sent read counter request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   192
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   193
        if (err != KMMCErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   194
            {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   195
            OstTrace1(TRACE_FLOW, DMMCSTACK_CIMRPMBREADWRCOUNTERSM3, "RPMB: Read Write Counter State Machine - sent read counter request packet error = %d", err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   196
            __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read Write Counter State Machine - sent read counter request packet error = %d", err));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   197
            SMF_GOTOS(EStError);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   198
            }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   199
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   200
        // Setup read response
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   201
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   202
        // CMD18
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   203
        //        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   204
        s.SetupRpmbReceiveResponse();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   205
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBREADWRCOUNTERSM4, "RPMB: Read Write Counter State Machine - get read packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   206
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read Write Counter State Machine - get read packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   207
       SMF_INVOKES(CIMReadWriteBlocksSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   208
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   209
    SMF_STATE(EStError)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   210
        SMF_RETURN(err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   211
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   212
    SMF_END
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   213
    }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   214
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   215
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   216
TMMCErr DMMCStack::CIMRpmbWriteSM()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   217
    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   218
    enum TStates
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   219
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   220
        EStBegin,   // Write data request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   221
        EStSetupReadRequest,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   222
        EStReadResult,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   223
        EStError,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   224
        EStEnd
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   225
        };
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   226
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   227
    DMMCSession& s=Session();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   228
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   229
	SMF_BEGIN
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   230
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   231
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   232
        // Setup write request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   233
        // CMD23 Reliable Write = 1 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   234
        // CMD25
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   235
        // 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   236
        s.SetupRpmbSendRequest(ETrue);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   237
	    m.SetTraps(KMMCErrBypass);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   238
	    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   239
	    OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM1, "RPMB: Write State Machine - send write request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   240
	    __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - send write request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   241
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   242
	    SMF_INVOKES(CIMReadWriteBlocksSMST, EStSetupReadRequest);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   243
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   244
    SMF_STATE(EStSetupReadRequest)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   245
	    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   246
	    OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM2, "RPMB: Write State Machine - sent write request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   247
	    __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - sent write request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   248
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   249
		if (err != KMMCErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   250
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   251
		    OstTrace1(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM3, "RPMB: Write State Machine - sent write request packet error = %d", err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   252
		    __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - sent write request packet error = %d", err));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   253
			SMF_GOTOS(EStError);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   254
			}	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   255
        // 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   256
        // Setup read result register request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   257
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   258
        // CMD25
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   259
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   260
        s.SetupRpmbSendReadResultRegisterRequest();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   261
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM4, "RPMB: Write State Machine - send read result register request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   262
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - send read result register request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   263
        SMF_INVOKES(CIMReadWriteBlocksSMST, EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   264
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   265
    SMF_STATE(EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   266
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   267
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM5, "RPMB: Write State Machine - sent read result register request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   268
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - sent read result register request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   269
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   270
        if (err != KMMCErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   271
            {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   272
            OstTrace1(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM6, "RPMB: Write State Machine - sent read result register request packet error = %d", err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   273
            __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - sent read result register request packet error = %d", err));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   274
            SMF_GOTOS(EStError);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   275
            }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   276
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   277
        // Setup read response
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   278
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   279
        // CMD18
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   280
        //        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   281
        s.SetupRpmbReceiveResponse();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   282
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBWRITESM7, "RPMB: Write State Machine - get read packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   283
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Write State Machine - get read packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   284
        SMF_INVOKES(CIMReadWriteBlocksSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   285
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   286
    SMF_STATE(EStError)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   287
       SMF_RETURN(err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   288
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   289
    SMF_END
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   290
    }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   291
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   292
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   293
TMMCErr DMMCStack::CIMRpmbReadSM()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   294
    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   295
    enum TStates
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   296
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   297
        EStBegin,   // Read data request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   298
        EStReadResult,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   299
        EStError,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   300
        EStEnd
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   301
        };
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   302
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   303
    DMMCSession& s=Session();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   304
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   305
    SMF_BEGIN
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   306
         
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   307
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   308
        // Setup write request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   309
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   310
        // CMD25
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   311
        // 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   312
        s.SetupRpmbSendRequest(EFalse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   313
        m.SetTraps(KMMCErrBypass);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   314
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   315
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBREADSM1, "RPMB: Read State Machine - send read request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   316
        __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read State Machine - send read request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   317
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   318
		SMF_INVOKES(CIMReadWriteBlocksSMST, EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   319
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   320
    SMF_STATE(EStReadResult)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   321
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   322
        OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBREADSM2, "RPMB: Read State Machine - sent read request packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   323
		__KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read State Machine - sent read request packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   324
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   325
		if (err != KMMCErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   326
           {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   327
           OstTrace1(TRACE_FLOW, DMMCSTACK_CIMRPMBREADSM3, "RPMB: Read State Machine - sent read request packet error = %d", err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   328
           __KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read State Machine - sent read request packet error = %d", err));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   329
           SMF_GOTOS(EStError);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   330
           }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   331
        //
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   332
        // Setup read response
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   333
        // CMD23 Reliable Write = 0 Block Count = 1
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   334
        // CMD18
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   335
        //        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   336
		s.SetupRpmbReceiveResponse();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   337
		OstTrace0(TRACE_FLOW, DMMCSTACK_CIMRPMBREADSM4, "RPMB: Read State Machine - get read packet");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   338
		__KTRACE_OPT(KPBUS1, Kern::Printf("RPMB: Read State Machine - get read packet"));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   339
		SMF_INVOKES(CIMReadWriteBlocksSMST, EStEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   340
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   341
    SMF_STATE(EStError)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   342
        SMF_RETURN(err);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   343
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   344
    SMF_END
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   345
    }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   346
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   347
TMMCErr DMMCStack::CIMRpmbAccessSMST(TAny* aStackP)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   348
	{return(static_cast<DMMCStack*>(aStackP)->CIMRpmbAccessSM());}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   349
TMMCErr DMMCStack::CIMRpmbWriteAuthenticationKeySMST(TAny* aStackP)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   350
	{return(static_cast<DMMCStack*>(aStackP)->CIMRpmbWriteAuthenticationKeySM());}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   351
TMMCErr DMMCStack::CIMRpmbReadWrCounterSMST(TAny* aStackP)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   352
	{return(static_cast<DMMCStack*>(aStackP)->CIMRpmbReadWrCounterSM());}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   353
TMMCErr DMMCStack::CIMRpmbWriteSMST(TAny* aStackP)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   354
	{return(static_cast<DMMCStack*>(aStackP)->CIMRpmbWriteSM());}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   355
TMMCErr DMMCStack::CIMRpmbReadSMST(TAny* aStackP)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   356
	{return(static_cast<DMMCStack*>(aStackP)->CIMRpmbReadSM());}