Dear Ayaz, all,

Is there any news about PCI implementation on RISCV FS?

Best regards,
Nikos


Quoting Ayaz Akram <yazak...@ucdavis.edu>:

Hi Nikolaos,

Thanks for bringing this to our attention. We are looking at this problem
here at Davis and will try to respond soon.

-Ayaz

On Sat, Apr 10, 2021 at 4:42 AM Νικόλαος Ταμπουρατζής via gem5-users <
gem5-users@gem5.org> wrote:


Dear Gem5 community,

I try to add PCI interface in RISCV arch doing the following steps
(similar with ARM RealView - I use the gem5-v21):

1) Create a file gem5/src/dev/riscv/pci_host.cc with the following code:

#include "dev/riscv/pci_host.hh"
#include "params/GenericRiscvPciHost.hh"

GenericRiscvPciHost::GenericRiscvPciHost(const GenericRiscvPciHostParams
&p)
     : GenericPciHost(p), intBase(p.int_base), intCount(p.int_count)
{
}

uint32_t
GenericRiscvPciHost::mapPciInterrupt(
     const PciBusAddr &addr, PciIntPin pin) const
{

     fatal_if(pin == PciIntPin::NO_INT,
              "%02x:%02x.%i: Interrupt from a device without interrupts\n",
              addr.bus, addr.dev, addr.func);

     return intBase + (addr.dev % intCount);
}

2) Create a file gem5/src/dev/riscv/pci_host.hh with the following code:

#ifndef __DEV_RISCV_PCI_HOST_HH__
#define __DEV_RISCV_PCI_HOST_HH__

#include "dev/pci/host.hh"

struct GenericRiscvPciHostParams;

class GenericRiscvPciHost : public GenericPciHost
{
   private:
     const uint32_t intBase;
     const uint32_t intCount;

   public:
     GenericRiscvPciHost(const GenericRiscvPciHostParams &p);
     virtual ~GenericRiscvPciHost() {}

   protected:
     uint32_t mapPciInterrupt(const PciBusAddr &addr,
                              PciIntPin pin) const override;
};

#endif // __DEV_RISCV_PCI_HOST_HH__

3) Add the "Source('pci_host.cc')" to gem5/src/dev/riscv/SConscript

4) Add the following code in gem5/src/dev/riscv/HiFive.py according to
RealView GenericArmPciHost:

from m5.objects.Ethernet import NSGigE, IGbE_igb, IGbE_e1000

from m5.objects.Device import BasicPioDevice
from m5.objects.PciHost import *
from m5.SimObject import SimObject

class GenericRiscvPciHost(GenericPciHost): #Add this class (PCI)
     type = 'GenericRiscvPciHost'
     cxx_header = "dev/riscv/pci_host.hh"
     int_base   = Param.Unsigned("PCI interrupt base")
     int_count  = Param.Unsigned("Maximum number of interrupts used by
this host")

     # This python parameter can be used in configuration scripts to turn
     # on/off the fdt dma-coherent flag when doing dtb autogeneration
     _dma_coherent = True

     def generateDeviceTree(self, state):
         local_state = FdtState(
             addr_cells=3, size_cells=2,
             cpu_cells=1, interrupt_cells=1)

         node = FdtNode("pci")

         if int(self.conf_device_bits) == 8:
             node.appendCompatible("pci-host-cam-generic")
         elif int(self.conf_device_bits) == 12:
             node.appendCompatible("pci-host-ecam-generic")
         else:
             m5.fatal("No compatibility string for the set
conf_device_width")

         node.append(FdtPropertyStrings("device_type", ["pci"]))

         # Cell sizes of child nodes/peripherals
         node.append(local_state.addrCellsProperty())
         node.append(local_state.sizeCellsProperty())
         node.append(local_state.interruptCellsProperty())
         # PCI address for CPU
         node.append(FdtPropertyWords("reg",
             state.addrCells(self.conf_base) +
             state.sizeCells(self.conf_size) ))

         # Ranges mapping
         # For now some of this is hard coded, because the PCI module does
not
         # have a proper full understanding of the memory map, but
adapting the
         # PCI module is beyond the scope of what I'm trying to do here.
         # Values are taken from the VExpress_GEM5_V1 platform.
         ranges = []
         # Pio address range
         ranges += self.pciFdtAddr(space=1, addr=0)
         ranges += state.addrCells(self.pci_pio_base)
         ranges += local_state.sizeCells(0x10000)  # Fixed size

         # AXI memory address range
         ranges += self.pciFdtAddr(space=2, addr=0)
         ranges += state.addrCells(self.pci_mem_base)
         ranges += local_state.sizeCells(0x40000000) # Fixed size
         node.append(FdtPropertyWords("ranges", ranges))

         if True:
       #Change this to True because Realview calls always
ARM_PCI_INT_DEV
             plic = self._parent.unproxy(self).plic
             int_phandle = state.phandle(plic)
             # Interrupt mapping
             interrupts = []

             # child interrupt specifier
             child_interrupt = local_state.interruptCells(0x0)

             # parent unit address
             parent_addr = 0x0
       #get this from /gem5/system/arm/dt/platforms file

             for i in range(int(self.int_count)):
                 parent_interrupt = int(self.int_base) + i
       #RISCV uses only 1 interrupt_cell in plic

                 interrupts += self.pciFdtAddr(device=i, addr=0) + \
                     child_interrupt + [int_phandle] + [parent_addr] + \
                     [parent_interrupt]

             node.append(FdtPropertyWords("interrupt-map", interrupts))

             int_count = int(self.int_count)
             if int_count & (int_count - 1):
                 fatal("PCI interrupt count should be power of 2")

             intmask = self.pciFdtAddr(device=int_count - 1, addr=0) +
[0x0]
             node.append(FdtPropertyWords("interrupt-map-mask", intmask))
         else:
             m5.fatal("Unsupported PCI interrupt policy " +
                      "for Device Tree generation")

         if self._dma_coherent:
             node.append(FdtProperty("dma-coherent"))

         yield node

class HiFive(Platform):
.........
        pci_host = GenericRiscvPciHost(

               #Add these 3 lines (PCI)
         conf_base=0x30000000, conf_size='256MiB', conf_device_bits=12,
         pci_pio_base=0x2f000000, pci_mem_base=0x40000000,
int_base=100, int_count=4)

        ethernet = IGbE_e1000(pci_bus=0, pci_dev=0, pci_func=0,

               #Add IGbE_e1000 PCI device (PCI)
                                    InterruptLine=1, InterruptPin=1)

        def attachPlic(self):
         """Count number of PLIC interrupt sources
         """
         plic_srcs = [self.uart_int_id]
         plic_srcs.append(self.pci_host.int_base)  #Add this line (PCI)
         for device in self._off_chip_devices():
             if hasattr(device, "interrupt_id"):
                 plic_srcs.append(device.interrupt_id)
         self.plic.n_src = max(plic_srcs) + 1

5) Add the following code in gem5/configs/example/riscv/fs_linux.py     :

#system.bridge.ranges = system.platform._off_chip_ranges() #Replaced
from 3 lines below

range_list = system.platform._off_chip_ranges()
range_list.append(AddrRange(0x2f000000, 0x80000000))
system.bridge.ranges = range_list

system.platform.pci_host.pio = system.iobus.mem_side_ports
system.platform.ethernet.host = system.platform.pci_host
system.platform.ethernet.pio = system.iobus.mem_side_ports
system.platform.ethernet.dma = system.iobus.cpu_side_ports


6) To be noticed that I use the prebuilt files from here:
https://github.com/ppeetteerrs/gem5-RISC-V-FS-Linux/. In addition, I
add the PCI and e1000 drivers to kernel.config and build the Linux
Kernel v5.10 according to this github:
CONFIG_PCI_SYSCALL=y
CONFIG_PCI_STUB=y
CONFIG_PCI_HOST_GENERIC=y
CONFIG_NET_VENDOR_INTEL=y
CONFIG_E1000=y
CONFIG_E1000E=y
CONFIG_IGB=y
CONFIG_NET_VENDOR_I825XX=y

However, when I try to execute the gem5 (build/RISCV/gem5.opt -d
$RISCV/logs configs/example/riscv/fs_linux.py --kernel=$OUT/bbl
--caches --mem-size=1024MB --mem-type=DDR4_2400_8x8
--cpu-type=AtomicSimpleCPU --disk-image=$OUT/riscv_parsec_disk -n 1) I
get the following panic:

info: Entering event queue @ 0.  Starting simulation...
1086842500: system.platform.terminal: attach terminal 0
panic: invalid access size(?) for PCI configspace!
Memory Usage: 437656 KBytes
Program aborted at tick 18474133000

Please help me to add PCI interface correctly! I think that it will be
very useful to gem5 community in order to add a wide range of PCI
devices!

You can find the files with the above changes here:
https://www.dropbox.com/s/pf4iu3z31zy88vr/riscv_pci.tar.xz

Best regards,
Nikolaos

_______________________________________________
gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s



_______________________________________________
gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s
  • [gem5-users] FS R... Νικόλαος Ταμπουρατζής via gem5-users
    • [gem5-users]... Ayaz Akram via gem5-users
      • [gem5-us... Νικόλαος Ταμπουρατζής via gem5-users

Reply via email to