summaryrefslogtreecommitdiffstats
path: root/libs/NCSI
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/NCSI
parentf3bcf9a4af7ada743fae84c3572d9e4cc1d44ae5 (diff)
downloadbcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.tar.gz
bcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.zip
Begin cleaning up tx/rx code
Diffstat (limited to 'libs/NCSI')
-rw-r--r--libs/NCSI/CMakeLists.txt3
-rw-r--r--libs/NCSI/include/Ethernet.h21
-rw-r--r--libs/NCSI/ncsi.c95
3 files changed, 67 insertions, 52 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];
-}
OpenPOWER on IntegriCloud