dev: Added new Lupio-SYS device

This adds the LupIO system controller, in which we provide a
way to halt or reboot the system.  It is implemented as a
BasicPIODevice.

Change-Id: I0031ac65d2aaca3460dcd4c59543a75230b0b52a
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/53043
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
This commit is contained in:
Melissa Jost
2021-11-15 14:56:26 -08:00
committed by melissa jost
parent 9d64f0fd90
commit 1e5bda500d
4 changed files with 217 additions and 0 deletions

34
src/dev/lupio/LupioSYS.py Normal file
View File

@@ -0,0 +1,34 @@
# Copyright (c) 2021 The Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# 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;
# neither the name of the copyright holders 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
# OWNER 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.
from m5.objects.Device import BasicPioDevice
from m5.params import Param
class LupioSYS(BasicPioDevice):
type = 'LupioSYS'
cxx_class='gem5::LupioSYS'
cxx_header = 'dev/lupio/lupio_sys.hh'
pio_size = Param.Addr(0x1000, "PIO Size")

View File

@@ -33,6 +33,7 @@ SimObject('LupioRNG.py', tags='riscv isa')
SimObject('LupioRTC.py', tags='riscv isa')
SimObject('LupioTMR.py', tags='riscv isa')
SimObject('LupioTTY.py', tags='riscv isa')
SimObject('LupioSYS.py', tags='riscv isa')
DebugFlag('LupioBLK')
DebugFlag('LupioIPI')
@@ -41,6 +42,7 @@ DebugFlag('LupioRNG')
DebugFlag('LupioRTC')
DebugFlag('LupioTMR')
DebugFlag('LupioTTY')
DebugFlag('LupioSYS')
Source('lupio_blk.cc', tags='riscv isa')
Source('lupio_ipi.cc', tags='riscv isa')
@@ -49,3 +51,4 @@ Source('lupio_rng.cc', tags='riscv isa')
Source('lupio_rtc.cc', tags='riscv isa')
Source('lupio_tmr.cc', tags='riscv isa')
Source('lupio_tty.cc', tags='riscv isa')
Source('lupio_sys.cc', tags='riscv isa')

102
src/dev/lupio/lupio_sys.cc Normal file
View File

@@ -0,0 +1,102 @@
/*
* Copyright (c) 2021 The Regents of the University of California
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* 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;
* neither the name of the copyright holders 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
* OWNER 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.
*/
#include "dev/lupio/lupio_sys.hh"
#include "debug/LupioSYS.hh"
#include "mem/packet_access.hh"
#include "params/LupioSYS.hh"
#include "sim/sim_exit.hh"
namespace gem5
{
LupioSYS::LupioSYS(const Params &params) :
BasicPioDevice(params, params.pio_size)
{
DPRINTF(LupioSYS, "LupioSYS initalized\n");
}
uint8_t
LupioSYS::lupioSYSRead(uint8_t addr)
{
return 0;
}
void
LupioSYS::lupioSYSWrite(uint8_t addr, uint64_t val64)
{
switch (addr >> 2) {
case LUPIO_SYS_HALT:
DPRINTF(LupioSYS, "Trying to halt\n");
exitSimLoopNow("LUPIO_SYS_HALT called, exiting", val64, 0, false);
break;
case LUPIO_SYS_REBT:
DPRINTF(LupioSYS, "Trying to reboot\n");
exitSimLoopNow("LUPIO_SYS_REBT called, exiting", val64, 0, false);
break;
default:
panic("Unexpected write to the LupioRTC device at address %d!",
addr);
break;
}
}
Tick
LupioSYS::read(PacketPtr pkt)
{
Addr daddr = pkt->getAddr() - pioAddr;
DPRINTF(LupioSYS,
"Read request - addr: %#x, size: %#x\n", daddr, pkt->getSize());
uint64_t sys_read = lupioSYSRead(daddr);
DPRINTF(LupioSYS, "Packet Read: %#x\n", sys_read);
pkt->setUintX(sys_read, byteOrder);
pkt->makeResponse();
return pioDelay;
}
Tick
LupioSYS::write(PacketPtr pkt)
{
Addr daddr = pkt->getAddr() - pioAddr;
DPRINTF(LupioSYS, "Write register %#x value %#x\n", daddr,
pkt->getUintX(byteOrder));
lupioSYSWrite(daddr, pkt->getUintX(byteOrder));
DPRINTF(LupioSYS, "Packet Write Value: %d\n", pkt->getUintX(byteOrder));
pkt->makeResponse();
return pioDelay;
}
} // namespace gem5

View File

@@ -0,0 +1,78 @@
/*
* Copyright (c) 2021 The Regents of the University of California
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* 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;
* neither the name of the copyright holders 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
* OWNER 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.
*/
#ifndef __DEV_LUPIO_LUPIO_SYS_HH__
#define __DEV_LUPIO_LUPIO_SYS_HH__
#include "debug/LupioSYS.hh"
#include "dev/io_device.hh"
#include "dev/platform.hh"
#include "params/LupioSYS.hh"
#include "sim/system.hh"
namespace gem5
{
/**
* LupioSYS:
* A Real-Time System Controller virtual device which provides a way for the
* software to halt or reboot the computer system
*/
class LupioSYS : public BasicPioDevice
{
protected:
const ByteOrder byteOrder = ByteOrder::little;
// Register map
private:
enum
{
LUPIO_SYS_HALT,
LUPIO_SYS_REBT,
/* Max offset */
LUPIO_SYS_MAX,
};
uint8_t lupioSYSRead(const uint8_t addr);
void lupioSYSWrite(const uint8_t addr, const uint64_t val64);
public:
PARAMS(LupioSYS);
LupioSYS(const Params &params);
/**
* Implement BasicPioDevice virtual functions
*/
Tick read(PacketPtr pkt) override;
Tick write(PacketPtr pkt) override;
};
} // namespace gem5
#endif // __DEV_LUPIO_LUPIO_SYS_HH__