dev-arm: Fix GICv3 ITS cmdq wrapping
Change-Id: I979e8d1378d5b5d2647158798479cf4238f2c349 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20633 Tested-by: kokoro <noreply+kokoro@google.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
@@ -1065,19 +1065,30 @@ Gicv3Its::incrementReadPointer()
|
||||
gitsCreadr.offset = gitsCreadr.offset + 1;
|
||||
|
||||
// Check for wrapping
|
||||
auto queue_end = (4096 * (gitsCbaser.size + 1));
|
||||
|
||||
if (gitsCreadr.offset == queue_end) {
|
||||
if (gitsCreadr.offset == maxCommands()) {
|
||||
gitsCreadr.offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t
|
||||
Gicv3Its::maxCommands() const
|
||||
{
|
||||
return (4096 * (gitsCbaser.size + 1)) / sizeof(ItsCommand::CommandEntry);
|
||||
}
|
||||
|
||||
void
|
||||
Gicv3Its::checkCommandQueue()
|
||||
{
|
||||
if (!gitsControl.enabled || !gitsCbaser.valid)
|
||||
return;
|
||||
|
||||
// If GITS_CWRITER gets set by sw to a value bigger than the
|
||||
// allowed one, the command queue should stop processing commands
|
||||
// until the register gets reset to an allowed one
|
||||
if (gitsCwriter.offset >= maxCommands()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gitsCwriter.offset != gitsCreadr.offset) {
|
||||
// writer and reader pointing to different command
|
||||
// entries: queue not empty.
|
||||
|
||||
@@ -257,6 +257,7 @@ class Gicv3Its : public BasicPioDevice
|
||||
bool lpiOutOfRange(uint32_t intid) const;
|
||||
|
||||
private: // Command
|
||||
uint64_t maxCommands() const;
|
||||
void checkCommandQueue();
|
||||
void incrementReadPointer();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user