summaryrefslogtreecommitdiffstats
path: root/ape/rmu.c
blob: 213a42b6d928a4f8d63a9d3643385f7532b6befb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
////////////////////////////////////////////////////////////////////////////////
///
/// @file       rx_from_network.c
///
/// @project
///
/// @brief      Initialization code for RX from network.
///
////////////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////////////
///
/// @copyright Copyright (c) 2018, Evan Lojewski
/// @cond
///
/// All rights reserved.
///
/// Redistribution and use in source and binary forms, with or without
/// modification, are permitted provided that the following conditions are met:
/// 1. Redistributions of source code must retain the above copyright notice,
/// this list of conditions and the following disclaimer.
/// 2. Redistributions in binary form must reproduce the above copyright notice,
/// this list of conditions and the following disclaimer in the documentation
/// and/or other materials provided with the distribution.
/// 3. Neither the name of the copyright holder nor the
/// names of its contributors may be used to endorse or promote products
/// derived from this software without specific prior written permission.
///
////////////////////////////////////////////////////////////////////////////////
///
/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
/// POSSIBILITY OF SUCH DAMAGE.
/// @endcond
////////////////////////////////////////////////////////////////////////////////

#include "ape.h"

#include <APE_APE.h>
#include <APE_APE_PERI.h>

void initRMU(void)
{
    RegAPEMode_t mode;
    mode.r32 = APE.Mode.r32;
    mode.bits.MemoryECC = 1;
    mode.bits.SwapATBdword = 1;
    mode.bits.SwapARBdword = 1;
    mode.bits.ICodePIPRdDisable = 1;
    APE.Mode = mode;

    // Optionally, set REG_APE__RMU_CONTROL to RST_RX|RST_TX. This can help unwedge the state machines if you wedged them previously due to a bug in your code.
    RegAPE_PERIRmuControl_t rmuControl;
    rmuControl.r32 = 0;
    rmuControl.bits.ResetTX = 1;
    rmuControl.bits.ResetRX = 1;
    APE_PERI.RmuControl = rmuControl;

    // Now set REG_APE__RMU_CONTROL to AUTO_DRV|RX|TX. Also set bits 19 and 20 (meaning unknown).
    rmuControl.r32 = 0;
    rmuControl.bits.AutoDrv = 1;
    rmuControl.bits.RX = 1;
    rmuControl.bits.TX = 1;
    rmuControl.r32 |= (1 << 19) | (1 << 20);
    APE_PERI.RmuControl = rmuControl;

    // Set REG_APE__BMC_NC_RX_CONTROL to FLOW_CONTROL=0 or 1, HWM=0x240, XON_THRESHOLD=0x201F.
    // Note: FLOW_CONTROL=1 enables the hardware to automatically send PAUSE frames to the BMC. tcpdump can detect these, so keeping flow control on gives you a way to detect when the RX state machine has gotten wedged.
    RegAPE_PERIBmcToNcRxControl_t rxControl;
    rxControl.r32 = 0;
    rxControl.bits.FlowControl = 1;
    rxControl.bits.HWM = 0x240;
    rxControl.r32 |= (0x201F << 11) ; /* XON_THRESHOLD */
    APE_PERI.BmcToNcRxControl = rxControl;

    // Set REG_APE__NC_BMC_TX_CONTROL to 0.
    RegAPE_PERIBmcToNcTxControl_t txControl;
    txControl.r32 = 0;
    APE_PERI.BmcToNcTxControl = txControl;

    // Set all eight REG_APE__BMC_NC_RX_SRC_MAC_MATCHN_{HIGH,LOW} to zero.
    APE_PERI.BmcToNcSourceMacMatch0High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch0Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch1High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch1Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch2High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch2Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch3High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch3Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch4High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch4Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch5High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch5Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch6High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch6Low.r32  = 0;
    APE_PERI.BmcToNcSourceMacMatch7High.r32 = 0;
    APE_PERI.BmcToNcSourceMacMatch7Low.r32  = 0;

    // Set REG_APE__ARB_CONTROL as desired. Suggest PACKAGE_ID=0, TKNREL=0x14, START, and setting unknown bit 26 to 1.
    RegAPE_PERIArbControl_t arbControl;
    arbControl.r32 = (1 << 26);
    arbControl.bits.PackageID = 0; /* TODO: allow to be configured as per NC-SI spec. */
    arbControl.bits.Start = 1;
    arbControl.bits.TKNREL = 0x14;
    APE_PERI.ArbControl = arbControl;
}
OpenPOWER on IntegriCloud