stdlib: Refactor the ArmBoard for _connect_things move

Since moving `_connect_things` to a pre-init step, the ArmBoard can now
be refactored to set up things in a more logical manner. In particular,
this patch moves activity out of the `_add_disk_to_board` function and
into the `_pre_initialization` function.

Change-Id: I5d40267f28ae87cd483a0396739c09b8b2b46383
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/65052
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
This commit is contained in:
Bobby R. Bruce
2022-10-27 15:28:28 -07:00
committed by Bobby Bruce
parent 25d4fb2d91
commit 26858db854

View File

@@ -153,9 +153,6 @@ class ArmBoard(ArmSystem, AbstractBoard, KernelDiskWorkload):
# We now need to setup the dma_ports.
self._dma_ports = None
# An else part is not required as for CHI protocol, the dma_ports has
# to be set to []
# RealView sets up most of the on-chip and off-chip devices and GIC
# for the ARM board. These devices' information is also used to
# generate the dtb file. We then connect the I/O devices to the
@@ -188,19 +185,9 @@ class ArmBoard(ArmSystem, AbstractBoard, KernelDiskWorkload):
else:
raise ValueError("Memory size too big for platform capabilities")
# the image is initially set to None as a sanity check. This is
# overwritten in the method _setup_pci_devices.
self._image = None
# Calling _setup_pci_devices. DMA ports has to be setup beforehand. PCI
# devices has to be setup before adding disk to board as the dma_ports
# has to be correctly setup before incorporating ruby caches. The issue
# is that the dma_controllers can only be created correctly when we
# have the dma_ports for the PCI device. The current order of function
# calls is:
# ArmBoard AbstractBoard KernelDiskWorkload
# _setup_pci_devices() -> incorporate_cache() -> _add_disk_to_board()
self._setup_pci_devices()
# The PCI Devices. PCI devices can be added via the `_add_pci_device`
# function.
self._pci_devices = []
def _setup_io_devices(self) -> None:
"""
@@ -323,52 +310,65 @@ class ArmBoard(ArmSystem, AbstractBoard, KernelDiskWorkload):
def connect_system_port(self, port: Port) -> None:
self.system_port = port
@overrides(KernelDiskWorkload)
def get_disk_device(self):
return "/dev/vda"
@overrides(AbstractBoard)
def _pre_instantiate(self):
super()._pre_instantiate()
def _setup_pci_devices(self):
# Add the PCI devices.
self.pci_devices = self._pci_devices
# We define the image. The _image has to be None initially.
assert self._image is None
self._image = CowDiskImage(
child=RawDiskImage(read_only=True), read_only=False
)
self.pci_devices = [PciVirtIO(vio=VirtIOBlock(image=self._image))]
for device in self.pci_devices:
self.realview.attachPciDevice(
device, self.iobus, dma_ports=self.get_dma_ports()
)
@overrides(KernelDiskWorkload)
def _add_disk_to_board(self, disk_image: AbstractResource):
assert self._image is not None
# Now that the disk and workload are set, we can generate the device
# tree file. We will generate the dtb file everytime the board is
# boot-up.
self._image.child.image_file = disk_image.get_local_path()
# Specifying the dtb file location to the workload.
self.workload.dtb_filename = os.path.join(
m5.options.outdir, "device.dtb"
)
# The workload needs to know the dtb_file.
self.workload.dtb_filename = self._get_dtb_filename()
# Calling generateDtb from class ArmSystem to add memory information to
# the dtb file.
self.generateDtb(self.workload.dtb_filename)
self.generateDtb(self._get_dtb_filename())
# Finally we need to setup the bootloader for the ArmBoard. An ARM
# system requires three inputs to simulate a full system: a disk image,
# the kernel file and the bootloader file(s).
self.realview.setupBootLoader(
self, self.workload.dtb_filename, self._bootloader
self, self._get_dtb_filename(), self._bootloader
)
def _get_dtb_filename(self) -> str:
"""Returns the dtb file location.
**Note**: This may be the _expected_ file location when generated. A
file may not exist at this location when this function is called."""
return os.path.join(m5.options.outdir, "device.dtb")
def _add_pci_device(self, pci_device: PciVirtIO) -> None:
"""Attaches the PCI Device to the board. All devices will be added to
`self.pci_device` as a pre-instantiation setup.
:param pci_device: The PCI Device to add.
"""
self._pci_devices.append(pci_device)
# For every PCI device, we need to get its dma_port so that we
# can setup dma_controllers correctly.
self.realview.attachPciDevice(
pci_device, self.iobus, dma_ports=self.get_dma_ports()
)
@overrides(KernelDiskWorkload)
def get_disk_device(self):
return "/dev/vda"
@overrides(KernelDiskWorkload)
def _add_disk_to_board(self, disk_image: AbstractResource):
self._image = CowDiskImage(
child=RawDiskImage(
read_only=True, image_file=disk_image.get_local_path()
),
read_only=False,
)
self._add_pci_device(PciVirtIO(vio=VirtIOBlock(image=self._image)))
@overrides(AbstractBoard)
def _setup_memory_ranges(self) -> None:
"""