diff --git a/src/arch/arm/SConscript b/src/arch/arm/SConscript index c7fa39e2cd..b9f8d6e6b5 100644 --- a/src/arch/arm/SConscript +++ b/src/arch/arm/SConscript @@ -93,6 +93,7 @@ Source('fs_workload.cc', tags='arm isa') Source('regs/int.cc', tags='arm isa') Source('regs/misc.cc', tags='arm isa') Source('mmu.cc', tags='arm isa') +Source('mpam.cc', tags='arm isa') Source('nativetrace.cc', tags='arm isa') Source('pagetable.cc', tags='arm isa') Source('pauth_helpers.cc', tags='arm isa') diff --git a/src/mem/cache/tags/partitioning_policies/partition_fields_extension.cc b/src/arch/arm/mpam.cc similarity index 84% rename from src/mem/cache/tags/partitioning_policies/partition_fields_extension.cc rename to src/arch/arm/mpam.cc index bbf29a00e3..b3ba44cfd9 100644 --- a/src/mem/cache/tags/partitioning_policies/partition_fields_extension.cc +++ b/src/arch/arm/mpam.cc @@ -35,12 +35,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "partition_fields_extension.hh" +#include "arch/arm/mpam.hh" -namespace gem5 -{ - -namespace partitioning_policy +namespace gem5::ArmISA::mpam { std::unique_ptr @@ -73,17 +70,4 @@ PartitionFieldExtention::setPartitionMonitoringID(uint64_t id) this->_partitionMonitoringID = id; } -uint64_t -readPacketPartitionID (PacketPtr pkt) -{ - // get partition_id from PartitionFieldExtention - std::shared_ptr ext = - pkt->req->getExtension(); - - // use default value if extension is not set - return (ext != nullptr) ? ext->getPartitionID() : DEFAULT_PARTITION_ID; -} - -} // namespace partitioning_policy - -} // namespace gem5 +} // namespace gem5::ArmISA::mpam diff --git a/src/mem/cache/tags/partitioning_policies/partition_fields_extension.hh b/src/arch/arm/mpam.hh similarity index 84% rename from src/mem/cache/tags/partitioning_policies/partition_fields_extension.hh rename to src/arch/arm/mpam.hh index b7b9dea16d..ea34b8a3c7 100644 --- a/src/mem/cache/tags/partitioning_policies/partition_fields_extension.hh +++ b/src/arch/arm/mpam.hh @@ -35,17 +35,14 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef __MEM_CACHE_TAGS_PARTITIONING_POLICIES_FIELD_EXTENTION_HH__ -#define __MEM_CACHE_TAGS_PARTITIONING_POLICIES_FIELD_EXTENTION_HH__ +#ifndef __ARCH_ARM_MPAM_HH__ +#define __ARCH_ARM_MPAM_HH__ #include "base/extensible.hh" #include "mem/packet.hh" #include "mem/request.hh" -namespace gem5 -{ - -namespace partitioning_policy +namespace gem5::ArmISA::mpam { const uint64_t DEFAULT_PARTITION_ID = 0; @@ -87,16 +84,6 @@ class PartitionFieldExtention : public Extensionreq->getExtension(); + // use default value if extension is not set + return (ext != nullptr) ? ext->getPartitionID() : + ArmISA::mpam::DEFAULT_PARTITION_ID; +} + +} // namespace gem5::mpam diff --git a/src/dev/arm/mpam.hh b/src/dev/arm/mpam.hh new file mode 100644 index 0000000000..e85bca6a2e --- /dev/null +++ b/src/dev/arm/mpam.hh @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024 Arm Limited + * All rights reserved. + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * 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_ARM_MPAM_HH__ +#define __DEV_ARM_MPAM_HH__ + +#include "mem/cache/tags/partitioning_policies/partition_manager.hh" + +namespace gem5::mpam +{ + +/** + * This class implements a simple MPAM Memory System Component (MSC) + * partitioning controller. For further info refer to: + * https://developer.arm.com/documentation/ddi0598/latest/ + */ +class MSC : public partitioning_policy::PartitionManager +{ + public: + using partitioning_policy::PartitionManager::PartitionManager; + + /** + * Helper function to retrieve PartitionID from a packet; Returns packet + * PartitionID if available or DEFAULT_PARTITION_ID if extention is not set + * @param pkt pointer to packet (PacketPtr) + * @return packet PartitionID. + */ + uint64_t readPacketPartitionID(PacketPtr pkt) const override; +}; + +} // namespace gem5::mpam + +#endif // __DEV_ARM_MPAM_HH__ diff --git a/src/mem/cache/tags/partitioning_policies/SConscript b/src/mem/cache/tags/partitioning_policies/SConscript index 8ff548d535..901ef03569 100644 --- a/src/mem/cache/tags/partitioning_policies/SConscript +++ b/src/mem/cache/tags/partitioning_policies/SConscript @@ -49,5 +49,4 @@ Source('base_pp.cc') Source('max_capacity_pp.cc') Source('way_allocation.cc') Source('way_pp.cc') -Source('partition_fields_extension.cc') Source('partition_manager.cc') diff --git a/src/mem/cache/tags/partitioning_policies/base_pp.hh b/src/mem/cache/tags/partitioning_policies/base_pp.hh index 781e2af7d9..30dc06d3fe 100644 --- a/src/mem/cache/tags/partitioning_policies/base_pp.hh +++ b/src/mem/cache/tags/partitioning_policies/base_pp.hh @@ -54,12 +54,11 @@ namespace partitioning_policy /** * A Partitioning Policy is a cache partitioning mechanism that limits the * cache block allocations in a cache based on a PartitionID identifier. This - * identifier may be set to any upstream memory request by attaching a - * PartitionFieldExtention to it as so: + * identifier may be set to any upstream memory request by attaching the + * PartitionID to it. The way the partition ID is attached/extracted + * from the request depends on the partitioning manager. * - * std::shared_ptr ext(PartitionFieldExtention); - * ext->setPartitionID(PartitionID); - * req->setExtension(ext); + * See the use of the PartitionFieldExtention in Arm as an example. * * When partitioning policies are in place, the allocatable cache blocks for * this memory request will be filtered based on its PartitionID.