summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2019-05-04 10:34:10 -0600
committerEvan Lojewski <github@meklort.com>2019-05-04 10:34:10 -0600
commit418c47d20e0fe1b9074490f3e16109f80355cf3b (patch)
tree89f5a6e88dc3f2b9ed2e416231e6eb1ec52b3da6 /libs
parentf3bcf9a4af7ada743fae84c3572d9e4cc1d44ae5 (diff)
downloadbcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.tar.gz
bcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.zip
Begin cleaning up tx/rx code
Diffstat (limited to 'libs')
-rw-r--r--libs/NCSI/CMakeLists.txt3
-rw-r--r--libs/NCSI/include/Ethernet.h21
-rw-r--r--libs/NCSI/ncsi.c95
-rw-r--r--libs/Network/CMakeLists.txt7
-rw-r--r--libs/Network/generic.c73
-rw-r--r--libs/Network/include/Network.h6
-rw-r--r--libs/Network/init.c6
-rw-r--r--libs/Network/tx.c19
8 files changed, 171 insertions, 59 deletions
diff --git a/libs/NCSI/CMakeLists.txt b/libs/NCSI/CMakeLists.txt
index 67e9a1e..90fa313 100644
--- a/libs/NCSI/CMakeLists.txt
+++ b/libs/NCSI/CMakeLists.txt
@@ -47,12 +47,13 @@ project(NCSI)
# Host Simulation library
simulator_add_library(${PROJECT_NAME} STATIC ncsi.c)
-target_link_libraries(${PROJECT_NAME} PRIVATE simulator)
+target_link_libraries(${PROJECT_NAME} PRIVATE simulator Network)
target_include_directories(${PROJECT_NAME} PUBLIC ../../include)
target_include_directories(${PROJECT_NAME} PUBLIC include)
# ARM Library
arm_add_library(${PROJECT_NAME}-arm STATIC ncsi.c)
+target_link_libraries(${PROJECT_NAME}-arm PRIVATE Network-arm)
target_include_directories(${PROJECT_NAME}-arm PUBLIC ../../include)
target_include_directories(${PROJECT_NAME}-arm PUBLIC include)
diff --git a/libs/NCSI/include/Ethernet.h b/libs/NCSI/include/Ethernet.h
index 358dcbf..632499b 100644
--- a/libs/NCSI/include/Ethernet.h
+++ b/libs/NCSI/include/Ethernet.h
@@ -190,6 +190,25 @@ typedef struct {
uint32_t OEMLinkSettings_Low:16;
} SetLink_t;
+typedef struct {
+ // Bytes 0 - 27
+ ControlPacketHeader_t header;
+
+ // Byte 28 - 31
+ uint32_t MAC54:16;
+ uint32_t headerPadding:16;
+
+ // Bytes 32 - 35
+ uint32_t MAC10:16;
+ uint32_t MAC32:16;
+
+ // Bytes 36 - 39
+ uint32_t pad:16;
+ uint32_t Enable:1;
+ uint32_t Rsvd:4;
+ uint32_t AT:3;
+ uint32_t MACNumber:8;
+} SetMACAddr_t;
typedef struct
@@ -297,6 +316,8 @@ typedef union {
SetLink_t setLink;
+ SetMACAddr_t setMACAddr;
+
/* Response Packets */
ResponsePacketHeader_t responsePacket;
diff --git a/libs/NCSI/ncsi.c b/libs/NCSI/ncsi.c
index b27a7e2..d490c94 100644
--- a/libs/NCSI/ncsi.c
+++ b/libs/NCSI/ncsi.c
@@ -51,6 +51,9 @@
#include <APE_SHM_CHANNEL3.h>
#include <stdbool.h>
+#include <Network.h>
+#include <types.h>
+
#define MAX_CHANNELS 4
#define PACKAGE_ID_SHIFT 5
@@ -78,7 +81,7 @@ NetworkFrame_t gResponseFrame =
{
.responsePacket = {
.DestinationAddress = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- .SourceAddress = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ .SourceAddress = {0xFF, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF},
.HeaderRevision = 1,
.ManagmentControllerID = 0,
@@ -115,10 +118,10 @@ NetworkFrame_t gLinkStatusResponseFrame =
.PayloadLength = 16,
.reserved_1 = 0,
- .ResponseCode = 0,
+ .ResponseCode = NCSI_RESPONSE_CODE_COMMAND_COMPLETE,
.reserved_4 = 0,
.LinkStatus_High = 0,
- .ReasonCode = 0,
+ .ReasonCode = NCSI_REASON_CODE_NONE,
.OtherIndications_High = 0,
.LinkStatus_Low = 0,
.OEMLinkStatus_High = 0,
@@ -424,9 +427,19 @@ static void setMACAddressHandler(NetworkFrame_t* frame)
#if CXX_SIMULATOR
int ch = frame->controlPacket.ChannelID & CHANNEL_ID_MASK;
printf("Set MAC: channel %x\n", ch);
+ printf("MAC54: 0x%04X\n", frame->setMACAddr.MAC54);
+ printf("MAC32: 0x%04X\n", frame->setMACAddr.MAC32);
+ printf("MAC10: 0x%04X\n", frame->setMACAddr.MAC10);
+ printf("Enable: 0x%04X\n", frame->setMACAddr.Enable);
+ printf("AT: 0x%04X\n", frame->setMACAddr.AT);
+ printf("MACNumber: 0x%04X\n", frame->setMACAddr.MACNumber);
#endif
// gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Enabled = false;
+ uint32_t low = (frame->setMACAddr.MAC32 << 16) | frame->setMACAddr.MAC10;
+ Network_SetMACAddr(frame->setMACAddr.MAC54, low, frame->setMACAddr.MACNumber, frame->setMACAddr.Enable);
+
+
sendNCSIResponse(
frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
@@ -593,27 +606,13 @@ void resetChannel(int ch)
channel->shm->NcsiChannelCtrlstatRx.r32 = 0;
}
-void sendNCSILinkStatusResponse(uint8_t InstanceID, uint8_t channelID, uint32_t LinkStatus, uint32_t OEMLinkStatus, uint32_t OtherIndications)
+void NCSI_TxPacket(uint32_t* packet, uint32_t packet_len)
{
- uint32_t packetSize = ETHERNET_FRAME_MIN - 4;
- uint32_t packetWords = ((packetSize + 3) / 4);
- uint32_t lastBytes = packetSize % 4;
+ uint32_t packetWords = DIVIDE_RND_UP(packet_len, sizeof(uint32_t));
RegAPE_PERIBmcToNcTxControl_t txControl;
txControl.r32 = 0;
- txControl.bits.LastByteCount = lastBytes;
-
- gLinkStatusResponseFrame.linkStatusResponse.ChannelID = channelID;
- gLinkStatusResponseFrame.linkStatusResponse.InstanceID = InstanceID;
- gLinkStatusResponseFrame.linkStatusResponse.ResponseCode = NCSI_RESPONSE_CODE_COMMAND_COMPLETE;
- gLinkStatusResponseFrame.linkStatusResponse.ReasonCode = NCSI_REASON_CODE_NONE;
-
- gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_High = LinkStatus >> 16;
- gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_Low = LinkStatus & 0xffff;
- gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_High = OEMLinkStatus >> 16;
- gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_Low = OEMLinkStatus & 0xffff;
- gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_High = OtherIndications >> 16;
- gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_Low = OtherIndications & 0xffff;
+ txControl.bits.LastByteCount = packet_len % sizeof(uint32_t);
// Wait for enough free space.
while(APE_PERI.BmcToNcTxStatus.bits.InFifo < packetWords);
@@ -622,57 +621,51 @@ void sendNCSILinkStatusResponse(uint8_t InstanceID, uint8_t channelID, uint32_t
for(int i = 0; i < packetWords-1; i++)
{
#if CXX_SIMULATOR
- printf("Transmitting word %d: 0x%08x\n", i, gLinkStatusResponseFrame.words[i]);
+ printf("Transmitting word %d: 0x%08x\n", i, packet[i]);
#endif
- APE_PERI.BmcToNcTxBuffer.r32 = gLinkStatusResponseFrame.words[i];
+ APE_PERI.BmcToNcTxBuffer.r32 = packet[i];
}
APE_PERI.BmcToNcTxControl = txControl;
#if CXX_SIMULATOR
- printf("Transmitting last word %d: 0x%08x\n", packetWords - 1, gLinkStatusResponseFrame.words[packetWords - 1]);
+ printf("Transmitting last word %d: 0x%08x\n", packetWords - 1, packet[packetWords - 1]);
#endif
+ APE_PERI.BmcToNcTxBufferLast.r32 = packet[packetWords - 1];
+}
+void sendNCSILinkStatusResponse(uint8_t InstanceID, uint8_t channelID, uint32_t LinkStatus, uint32_t OEMLinkStatus, uint32_t OtherIndications)
+{
+ uint32_t packetSize = ETHERNET_FRAME_MIN - 4;
+
+ gLinkStatusResponseFrame.linkStatusResponse.ChannelID = channelID;
+ gLinkStatusResponseFrame.linkStatusResponse.InstanceID = InstanceID;
+ gLinkStatusResponseFrame.linkStatusResponse.ResponseCode = NCSI_RESPONSE_CODE_COMMAND_COMPLETE;
+ gLinkStatusResponseFrame.linkStatusResponse.ReasonCode = NCSI_REASON_CODE_NONE;
+
+ gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_High = LinkStatus >> 16;
+ gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_Low = LinkStatus & 0xffff;
+ gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_High = OEMLinkStatus >> 16;
+ gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_Low = OEMLinkStatus & 0xffff;
+ gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_High = OtherIndications >> 16;
+ gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_Low = OtherIndications & 0xffff;
+
- APE_PERI.BmcToNcTxBufferLast.r32 = gLinkStatusResponseFrame.words[packetWords - 1];
+ NCSI_TxPacket(gLinkStatusResponseFrame.words, packetSize);
}
void sendNCSIResponse(uint8_t InstanceID, uint8_t channelID, uint16_t controlID, uint16_t response_code, uint16_t reasons_code)
{
uint32_t packetSize = ETHERNET_FRAME_MIN - 4;
- uint32_t packetWords = ((packetSize + 3) / 4);
- uint32_t lastBytes = packetSize % 4;
-
- RegAPE_PERIBmcToNcTxControl_t txControl;
- txControl.r32 = 0;
- txControl.bits.LastByteCount = lastBytes;
gResponseFrame.responsePacket.ChannelID = channelID;
gResponseFrame.responsePacket.ControlPacketType = controlID | CONTROL_PACKET_TYPE_RESPONSE;
gResponseFrame.responsePacket.InstanceID = InstanceID;
- // Payload data - 4 bytes
+
gResponseFrame.responsePacket.ResponseCode = response_code;
gResponseFrame.responsePacket.ReasonCode = reasons_code;
- // NetworkFrame_t frame;
- // frame.
-
- // Wait for enough free space.
- while(APE_PERI.BmcToNcTxStatus.bits.InFifo < packetWords);
-
- // Transmit.
- for(int i = 0; i < packetWords-1; i++)
- {
-#if CXX_SIMULATOR
- printf("Transmitting word %d: 0x%08x\n", i, gResponseFrame.words[i]);
-#endif
- APE_PERI.BmcToNcTxBuffer.r32 = gResponseFrame.words[i];
- }
- APE_PERI.BmcToNcTxControl = txControl;
+ NCSI_TxPacket(gResponseFrame.words, packetSize);
+}
-#if CXX_SIMULATOR
- printf("Transmitting last word %d: 0x%08x\n", packetWords - 1, gResponseFrame.words[packetWords - 1]);
-#endif
- APE_PERI.BmcToNcTxBufferLast.r32 = gResponseFrame.words[packetWords - 1];
-}
diff --git a/libs/Network/CMakeLists.txt b/libs/Network/CMakeLists.txt
index e5dd1a5..3618c71 100644
--- a/libs/Network/CMakeLists.txt
+++ b/libs/Network/CMakeLists.txt
@@ -46,15 +46,18 @@ project(Network)
# Host Simulation library
-simulator_add_library(${PROJECT_NAME} STATIC tx.c)
+simulator_add_library(${PROJECT_NAME} STATIC tx.c generic.c)
target_link_libraries(${PROJECT_NAME} PRIVATE simulator NCSI)
target_include_directories(${PROJECT_NAME} PUBLIC ../../include)
target_include_directories(${PROJECT_NAME} PUBLIC include)
# ARM Library
-arm_add_library(${PROJECT_NAME}-arm STATIC init.c tx.c)
+arm_add_library(${PROJECT_NAME}-arm STATIC init.c tx.c generic.c)
target_link_libraries(${PROJECT_NAME}-arm PRIVATE NCSI-arm)
target_include_directories(${PROJECT_NAME}-arm PUBLIC ../../include)
target_include_directories(${PROJECT_NAME}-arm PUBLIC include)
+ # SET_SOURCE_FILES_PROPERTIES( tx.c PROPERTIES COMPILE_FLAGS -O3 )
+
+
# add_subdirectory(tests) \ No newline at end of file
diff --git a/libs/Network/generic.c b/libs/Network/generic.c
new file mode 100644
index 0000000..ef25804
--- /dev/null
+++ b/libs/Network/generic.c
@@ -0,0 +1,73 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file init.c
+///
+/// @project
+///
+/// @brief Initialization code for TX to network / 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 <Network.h>
+
+#include <APE_DEVICE.h>
+
+void Network_SetMACAddr(uint16_t high, uint32_t low, uint32_t index, bool enabled)
+{
+ uint32_t match_high = (high << 16) | (low >> 16);
+ uint16_t match_low = (low << 16);
+ APE_PERI.BmcToNcSourceMacMatch0High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch0Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch1High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch1Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch2High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch2Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch3High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch3Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch4High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch4Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch5High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch5Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch6High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch6Low.r32 = match_low;
+ APE_PERI.BmcToNcSourceMacMatch7High.r32 = match_high;
+ APE_PERI.BmcToNcSourceMacMatch7Low.r32 = match_low;
+
+ DEVICE.PerfectMatch1High.r32 = high;
+ DEVICE.PerfectMatch1Low.r32 = low;
+
+} \ No newline at end of file
diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h
index 8bfadcf..d96d665 100644
--- a/libs/Network/include/Network.h
+++ b/libs/Network/include/Network.h
@@ -46,6 +46,8 @@
#define NETWORK_H
#include <stdint.h>
+#include <stdbool.h>
+#include <APE_APE_PERI.h>
void Network_InitTxRx(void);
@@ -53,7 +55,11 @@ uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size);
int32_t Network_TX_allocateBlock(void);
void Network_TX_transmitBePacket(uint8_t* packet, uint32_t length);
+void Network_TX_transmitLePacket(uint8_t* packet, uint32_t length);
+// void Network_TX_transmitPassthroughPacket(RegAPE_PERIBmcToNcRxStatus_t rx_status);
+
+void Network_SetMACAddr(uint16_t high, uint32_t low, uint32_t index, bool enabled);
diff --git a/libs/Network/init.c b/libs/Network/init.c
index 45be102..f9d1925 100644
--- a/libs/Network/init.c
+++ b/libs/Network/init.c
@@ -46,6 +46,8 @@
#include <APE_APE.h>
#include <APE_DEVICE.h>
+#include <Network.h>
+
typedef struct {
RegFILTERSElementConfig_t cfg;
RegFILTERSElementPattern_t pat;
@@ -672,8 +674,8 @@ void Network_InitTxRx(void)
// I recommend also setting APE_PROMISCUOUS_MODE and PROMISCUOUS_MODE,
// as these will cause you less headaches during development.
DEVICE.ReceiveMacMode.bits.Enable = 1;
- DEVICE.ReceiveMacMode.bits.PromiscuousMode = 1;
- DEVICE.ReceiveMacMode.bits.APEPromiscuousMode = 1;
+ DEVICE.ReceiveMacMode.bits.PromiscuousMode = 0;
+ DEVICE.ReceiveMacMode.bits.APEPromiscuousMode = 0;
// Ensure REG_EMAC_MODE__ENABLE_APE_{TX,RX}_PATH are set.
// *** NOTE: Both bits are set in rmu.c ***/
diff --git a/libs/Network/tx.c b/libs/Network/tx.c
index 0f4fb5d..ae78348 100644
--- a/libs/Network/tx.c
+++ b/libs/Network/tx.c
@@ -92,7 +92,7 @@ uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size)
}
#ifdef CXX_SIMULATOR
- printf("%d blocks needed for packet\n", blocks);
+ printf("%d blocks needed for packet with frame size %d\n", blocks, frame_size);
#endif
return blocks;
}
@@ -173,10 +173,16 @@ static uint32_t inline Network_TX_initFirstBlock(RegTX_PORTOut_t* block, uint32_
{
if(big_endian)
{
+#if CXX_SIMULATOR
+ printf("1st[%d] = 0x%08X\n", i, be32toh(packet[i]));
+#endif
block[TX_PORT_OUT_ALL_FIRST_PAYLOAD_WORD + i].r32 = be32toh(packet[i]);
}
else
{
+#if CXX_SIMULATOR
+ printf("1LE[%d] = 0x%08X\n", i, (packet[i]));
+#endif
block[TX_PORT_OUT_ALL_FIRST_PAYLOAD_WORD + i].r32 = (packet[i]);
}
}
@@ -241,7 +247,14 @@ static uint32_t inline Network_TX_initAdditionalBlock(RegTX_PORTOut_t* block, in
int num_words = (length + sizeof(uint32_t) - 1)/sizeof(uint32_t);
for(i = 0; i < num_words; i++)
{
- block[TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD + i].r32 = be32toh(packet[i]);
+ if(big_endian)
+ {
+ block[TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD + i].r32 = be32toh(packet[i]);
+ }
+ else
+ {
+ block[TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD + i].r32 = (packet[i]);
+ }
}
@@ -340,5 +353,5 @@ void Network_TX_transmitBePacket(uint8_t* packet, uint32_t length)
void Network_TX_transmitLePacket(uint8_t* packet, uint32_t length)
{
- Network_TX_transmitPacket(packet, length, true);
+ Network_TX_transmitPacket(packet, length, false);
} \ No newline at end of file
OpenPOWER on IntegriCloud