gem5  v22.1.0.0
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
gem5::AMDMMIOReader Class Reference

Helper class to read Linux kernel MMIO trace from amdgpu modprobes. More...

#include <mmio_reader.hh>

Classes

struct  MmioTrace
 

Public Member Functions

 AMDMMIOReader ()
 
 ~AMDMMIOReader ()
 
void readMMIOTrace (std::string trace_file)
 Read an MMIO trace gathered from a real system and place the MMIO values read and written into the MMIO trace entry map. More...
 
void readFromTrace (PacketPtr pkt, int barnum, Addr offset)
 Get the next MMIO read from the trace file to an offset in a BAR and write the value to the packet provided. More...
 
void writeFromTrace (PacketPtr pkt, int barnum, Addr offset)
 Get the next MMIO write from the trace file to an offset in a BAR and compare the value with the data in the packet provided. More...
 

Private Types

typedef std::tuple< uint64_t, std::tuple< char, uint64_t > > trace_entry_t
 The information we want from each relevant line of trace are: (1) The BAR number where the accessed address is mapped to. More...
 
typedef std::unordered_map< uint32_t, std::list< trace_entry_t > > trace_BAR_t
 

Private Member Functions

bool traceIsRead (std::vector< std::string > tokens) const
 
bool traceIsWrite (std::vector< std::string > tokens) const
 
bool traceIsUnknown (std::vector< std::string > tokens) const
 
bool isIO (std::vector< std::string > tokens) const
 
bool isRelevant (std::vector< std::string > tokens)
 
uint8_t traceGetBAR (uint64_t addr)
 
uint64_t traceGetOffset (uint64_t addr)
 
void traceParseTokens (std::vector< std::string > tokens)
 
void recordMtrace ()
 

Private Attributes

const uint64_t BAR0 = 0x2400000000
 These are the BAR values from the system where the trace is collected. More...
 
const uint64_t BAR2 = 0x2200000000
 
const uint32_t BAR5 = 0xecf00000
 
const uint32_t ROM = 0xc0000
 
const uint64_t BAR0_SIZE = 0x400000000
 
const uint64_t BAR2_SIZE = 0x200000
 
const uint32_t BAR5_SIZE = 0x80000
 
const uint32_t ROM_SIZE = 0x20000
 
trace_BAR_t trace_BARs [6]
 
uint64_t trace_index = 0
 
uint64_t trace_final_index = 0
 
uint64_t trace_cur_index = 0
 
struct gem5::AMDMMIOReader::MmioTrace mtrace
 

Detailed Description

Helper class to read Linux kernel MMIO trace from amdgpu modprobes.

This class is used rather than implementing MMIOs in code as it is easier to update to never kernel versions this way. It also helps with setting values for registers which are not documented.

The class is designed to be able to read both raw MMIO input traces as well as traces that have been filtered by the util script to reduce the file size.

An MMIO trace is provided with the gem5 release. To see instructions on how to generate the file yourself, see the documentation on the MMIO trace generation script provided in util.

Definition at line 62 of file mmio_reader.hh.

Member Typedef Documentation

◆ trace_BAR_t

typedef std::unordered_map<uint32_t, std::list<trace_entry_t> > gem5::AMDMMIOReader::trace_BAR_t
private

Definition at line 94 of file mmio_reader.hh.

◆ trace_entry_t

typedef std::tuple<uint64_t, std::tuple<char, uint64_t> > gem5::AMDMMIOReader::trace_entry_t
private

The information we want from each relevant line of trace are: (1) The BAR number where the accessed address is mapped to.

(2) The offset from the BAR. (3) Type of the access, if it's Read/Write/Unknown (4) Data from the access if available (not for Unknown). (5) An index representing the order of trace.

Definition at line 91 of file mmio_reader.hh.

Constructor & Destructor Documentation

◆ AMDMMIOReader()

gem5::AMDMMIOReader::AMDMMIOReader ( )
inline

Definition at line 217 of file mmio_reader.hh.

◆ ~AMDMMIOReader()

gem5::AMDMMIOReader::~AMDMMIOReader ( )
inline

Definition at line 218 of file mmio_reader.hh.

Member Function Documentation

◆ isIO()

bool gem5::AMDMMIOReader::isIO ( std::vector< std::string >  tokens) const
inlineprivate

Definition at line 136 of file mmio_reader.hh.

◆ isRelevant()

bool gem5::AMDMMIOReader::isRelevant ( std::vector< std::string >  tokens)
inlineprivate

Definition at line 143 of file mmio_reader.hh.

References gem5::X86ISA::addr, and traceGetBAR().

Referenced by readMMIOTrace().

◆ readFromTrace()

void gem5::AMDMMIOReader::readFromTrace ( PacketPtr  pkt,
int  barnum,
Addr  offset 
)

Get the next MMIO read from the trace file to an offset in a BAR and write the value to the packet provided.

Parameters
pktPacket to write the MMIO trace value
barnumThe BAR of the MMIO read
offsetThe offset in the BAR of the MMIO read.

Definition at line 76 of file mmio_reader.cc.

References gem5::X86ISA::count, DPRINTF, gem5::ArmISA::offset, gem5::Packet::setUintX(), trace_BARs, trace_cur_index, and trace_final_index.

Referenced by gem5::AMDGPUDevice::readDoorbell(), and gem5::AMDGPUDevice::readMMIO().

◆ readMMIOTrace()

void gem5::AMDMMIOReader::readMMIOTrace ( std::string  trace_file)

Read an MMIO trace gathered from a real system and place the MMIO values read and written into the MMIO trace entry map.

Parameters
trace_fileAbsolute path of MMIO trace file to read.

Definition at line 44 of file mmio_reader.cc.

References gem5::AMDMMIOReader::MmioTrace::addr, gem5::AMDMMIOReader::MmioTrace::bar, gem5::AMDMMIOReader::MmioTrace::data, gem5::AMDMMIOReader::MmioTrace::event, isRelevant(), gem5::VegaISA::l, mtrace, recordMtrace(), gem5::AMDMMIOReader::MmioTrace::size, gem5::scmi::token, trace_cur_index, trace_final_index, trace_index, traceIsRead(), and traceParseTokens().

Referenced by gem5::AMDGPUDevice::AMDGPUDevice().

◆ recordMtrace()

void gem5::AMDMMIOReader::recordMtrace ( )
inlineprivate

◆ traceGetBAR()

uint8_t gem5::AMDMMIOReader::traceGetBAR ( uint64_t  addr)
inlineprivate

Definition at line 151 of file mmio_reader.hh.

References gem5::X86ISA::addr, BAR0, BAR0_SIZE, BAR2, BAR2_SIZE, BAR5, BAR5_SIZE, ROM, and ROM_SIZE.

Referenced by isRelevant(), and traceParseTokens().

◆ traceGetOffset()

uint64_t gem5::AMDMMIOReader::traceGetOffset ( uint64_t  addr)
inlineprivate

Definition at line 167 of file mmio_reader.hh.

References gem5::X86ISA::addr, BAR0, BAR0_SIZE, BAR2, BAR2_SIZE, BAR5, BAR5_SIZE, panic, ROM, and ROM_SIZE.

Referenced by recordMtrace().

◆ traceIsRead()

bool gem5::AMDMMIOReader::traceIsRead ( std::vector< std::string >  tokens) const
inlineprivate

Definition at line 117 of file mmio_reader.hh.

Referenced by readMMIOTrace(), and traceParseTokens().

◆ traceIsUnknown()

bool gem5::AMDMMIOReader::traceIsUnknown ( std::vector< std::string >  tokens) const
inlineprivate

Definition at line 129 of file mmio_reader.hh.

Referenced by traceParseTokens().

◆ traceIsWrite()

bool gem5::AMDMMIOReader::traceIsWrite ( std::vector< std::string >  tokens) const
inlineprivate

Definition at line 123 of file mmio_reader.hh.

Referenced by traceParseTokens().

◆ traceParseTokens()

void gem5::AMDMMIOReader::traceParseTokens ( std::vector< std::string >  tokens)
inlineprivate

◆ writeFromTrace()

void gem5::AMDMMIOReader::writeFromTrace ( PacketPtr  pkt,
int  barnum,
Addr  offset 
)

Get the next MMIO write from the trace file to an offset in a BAR and compare the value with the data in the packet provided.

This is only used for debugging and is otherwise intercepted by MMIO interface.

Parameters
pktPacket to write the MMIO trace value
barnumThe BAR of the MMIO read
offsetThe offset in the BAR of the MMIO read.

Definition at line 102 of file mmio_reader.cc.

References gem5::X86ISA::count, DPRINTF, gem5::ArmISA::offset, trace_BARs, trace_cur_index, and trace_final_index.

Member Data Documentation

◆ BAR0

const uint64_t gem5::AMDMMIOReader::BAR0 = 0x2400000000
private

These are the BAR values from the system where the trace is collected.

If you have collected your own trace, you may need to change these BARs for the MMIO trace to be read correctly!

Definition at line 70 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ BAR0_SIZE

const uint64_t gem5::AMDMMIOReader::BAR0_SIZE = 0x400000000
private

Definition at line 76 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ BAR2

const uint64_t gem5::AMDMMIOReader::BAR2 = 0x2200000000
private

Definition at line 71 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ BAR2_SIZE

const uint64_t gem5::AMDMMIOReader::BAR2_SIZE = 0x200000
private

Definition at line 77 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ BAR5

const uint32_t gem5::AMDMMIOReader::BAR5 = 0xecf00000
private

Definition at line 72 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ BAR5_SIZE

const uint32_t gem5::AMDMMIOReader::BAR5_SIZE = 0x80000
private

Definition at line 78 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ mtrace

struct gem5::AMDMMIOReader::MmioTrace gem5::AMDMMIOReader::mtrace
private

◆ ROM

const uint32_t gem5::AMDMMIOReader::ROM = 0xc0000
private

Definition at line 73 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ ROM_SIZE

const uint32_t gem5::AMDMMIOReader::ROM_SIZE = 0x20000
private

Definition at line 79 of file mmio_reader.hh.

Referenced by traceGetBAR(), and traceGetOffset().

◆ trace_BARs

trace_BAR_t gem5::AMDMMIOReader::trace_BARs[6]
private

Definition at line 97 of file mmio_reader.hh.

Referenced by readFromTrace(), recordMtrace(), and writeFromTrace().

◆ trace_cur_index

uint64_t gem5::AMDMMIOReader::trace_cur_index = 0
private

Definition at line 102 of file mmio_reader.hh.

Referenced by readFromTrace(), readMMIOTrace(), and writeFromTrace().

◆ trace_final_index

uint64_t gem5::AMDMMIOReader::trace_final_index = 0
private

Definition at line 101 of file mmio_reader.hh.

Referenced by readFromTrace(), readMMIOTrace(), and writeFromTrace().

◆ trace_index

uint64_t gem5::AMDMMIOReader::trace_index = 0
private

Definition at line 100 of file mmio_reader.hh.

Referenced by readMMIOTrace(), and traceParseTokens().


The documentation for this class was generated from the following files:

Generated on Wed Dec 21 2022 10:23:16 for gem5 by doxygen 1.9.1