diff options
author | Evan Lojewski <github@meklort.com> | 2019-04-06 15:36:56 -0600 |
---|---|---|
committer | Evan Lojewski <github@meklort.com> | 2019-04-06 15:36:56 -0600 |
commit | b32a91df1d5c353c5d85bd902537b0cb7cad464f (patch) | |
tree | f1e9e2eca5efc9b33b8dc20784f51be2254990e8 /simulator/bcm5719_MII_sim.cpp | |
parent | 21ea9c57a64656173e03b0d43286a2136aff78cd (diff) | |
download | bcm5719-ortega-b32a91df1d5c353c5d85bd902537b0cb7cad464f.tar.gz bcm5719-ortega-b32a91df1d5c353c5d85bd902537b0cb7cad464f.zip |
Add initial indeirect APE read support for the host cxxsim code.
Diffstat (limited to 'simulator/bcm5719_MII_sim.cpp')
-rw-r--r-- | simulator/bcm5719_MII_sim.cpp | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/simulator/bcm5719_MII_sim.cpp b/simulator/bcm5719_MII_sim.cpp new file mode 100644 index 0000000..8ca9b11 --- /dev/null +++ b/simulator/bcm5719_MII_sim.cpp @@ -0,0 +1,225 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file bcm5719_MII_sim.cpp +/// +/// @project bcm5719 +/// +/// @brief bcm5719_MII_sim +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @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 <organization> 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 <stdint.h> +#include <utility> +#include <bcm5719_MII.h> + +#ifdef __ppc64__ +#define BARRIER() do { asm volatile ("sync 0\neieio\n" ::: "memory"); } while(0) +#else +#define BARRIER() do { asm volatile ("" ::: "memory"); } while(0) +#endif + +static uint32_t read_from_ram(uint32_t val, uint32_t offset, void *args) +{ + uint8_t *base = (uint8_t *)args; + base += offset; + + BARRIER(); + return *(uint32_t *)base; +} + +static uint32_t write_to_ram(uint32_t val, uint32_t offset, void *args) +{ + uint8_t *base = (uint8_t *)args; + base += offset; + + BARRIER(); + *(uint32_t *)base = val; + BARRIER(); + return val; +} + +void init_bcm5719_MII_sim(void *base) +{ + MII.mIndexReadCallback = read_from_ram; + MII.mIndexReadCallbackArgs = base; + + MII.mIndexWriteCallback = write_to_ram; + MII.mIndexWriteCallbackArgs = base; + + /** @brief Component Registers for @ref MII. */ + /** @brief Bitmap for @ref MII_t.Control. */ + MII.Control.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.Control.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.Status. */ + MII.Status.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.Status.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.PhyIdHigh. */ + MII.PhyIdHigh.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.PhyIdHigh.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.PhyIdLow. */ + MII.PhyIdLow.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.PhyIdLow.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AutonegotiationAdvertisement. */ + MII.AutonegotiationAdvertisement.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AutonegotiationAdvertisement.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AutonegotiationLinkPartnerAbilityBasePage. */ + MII.AutonegotiationLinkPartnerAbilityBasePage.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AutonegotiationLinkPartnerAbilityBasePage.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AutonegotiationExpansion. */ + MII.AutonegotiationExpansion.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AutonegotiationExpansion.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AutonegotiationNextPageTransmit. */ + MII.AutonegotiationNextPageTransmit.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AutonegotiationNextPageTransmit.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AutonegotiationLinkPartnerAbilityNextPage. */ + MII.AutonegotiationLinkPartnerAbilityNextPage.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AutonegotiationLinkPartnerAbilityNextPage.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.1000baseTControl. */ + MII._1000baseTControl.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII._1000baseTControl.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.1000baseTStatus. */ + MII._1000baseTStatus.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII._1000baseTStatus.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.BroadreachLreAccess. */ + MII.BroadreachLreAccess.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.BroadreachLreAccess.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.IeeeExtendedStatus. */ + MII.IeeeExtendedStatus.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.IeeeExtendedStatus.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.PhyExtendedControl. */ + MII.PhyExtendedControl.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.PhyExtendedControl.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.PhyExtendedStatus. */ + MII.PhyExtendedStatus.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.PhyExtendedStatus.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.ReceiveErrorCounter. */ + MII.ReceiveErrorCounter.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.ReceiveErrorCounter.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.FalseCarrierSenseCounter. */ + MII.FalseCarrierSenseCounter.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.FalseCarrierSenseCounter.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.LocalRemoteReceiverNotOkCounter. */ + MII.LocalRemoteReceiverNotOkCounter.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.LocalRemoteReceiverNotOkCounter.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AuxiliaryControl. */ + MII.AuxiliaryControl.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AuxiliaryControl.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.AuxiliaryStatusSummary. */ + MII.AuxiliaryStatusSummary.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.AuxiliaryStatusSummary.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.InterruptStatus. */ + MII.InterruptStatus.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.InterruptStatus.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.InterruptMask. */ + MII.InterruptMask.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.InterruptMask.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.CabletronLed. */ + MII.CabletronLed.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.CabletronLed.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.Test1. */ + MII.Test1.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.Test1.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.BlockSelect. */ + MII.BlockSelect.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.BlockSelect.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.10baseT. */ + MII._10baseT.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII._10baseT.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.DllSelection. */ + MII.DllSelection.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.DllSelection.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.PowerAndMiiControl. */ + MII.PowerAndMiiControl.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.PowerAndMiiControl.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.SpareControl1. */ + MII.SpareControl1.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.SpareControl1.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.ClockAlignmentControl. */ + MII.ClockAlignmentControl.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.ClockAlignmentControl.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.MiscTest1. */ + MII.MiscTest1.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.MiscTest1.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.SpareControl2. */ + MII.SpareControl2.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.SpareControl2.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.MiscTest2. */ + MII.MiscTest2.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.MiscTest2.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.SpareControl3. */ + MII.SpareControl3.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.SpareControl3.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + /** @brief Bitmap for @ref MII_t.MiscellaneousControl. */ + MII.MiscellaneousControl.r16.installReadCallback(read_from_ram, (uint8_t *)base); + MII.MiscellaneousControl.r16.installWriteCallback(write_to_ram, (uint8_t *)base); + + +} |