Skip to content
Permalink
Browse files
Platform/RaspberryPi: Fortify mailbox code
As part of the analysis done in:
raspberrypi/firmware#1376:
* Bump up max tries, to avoid command time-outs.
* Macro-ify RaspberryPiHelper.S some more to make code more maintainable.
* Add ".align 4" before every command buffer.

Co-authored-by: Pete Batard <pete@akeo.ie>
Co-authored-by: Andrei Warkentin <andrey.warkentin@gmail.com>
Signed-off-by: Pete Batard <pete@akeo.ie>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
  • Loading branch information
2 people authored and Ard Biesheuvel committed May 6, 2020
1 parent 725d119 commit 35a5402a718f6547749cc2b6764bfcd8ed46a032
Showing 3 changed files with 35 additions and 43 deletions.
@@ -1,5 +1,6 @@
/** @file
*
* Copyright (c) 2020, Pete Batard <pete@akeo.ie>
* Copyright (c) 2019, ARM Limited. All rights reserved.
* Copyright (c) 2017-2018, Andrei Warkentin <andrey.warkentin@gmail.com>
* Copyright (c) 2016, Linaro, Ltd. All rights reserved.
@@ -30,12 +31,6 @@
//
#define NUM_PAGES 1

//
// The number of iterations to perform when waiting for the mailbox
// status to change
//
#define MAX_TRIES 0x100000

STATIC VOID *mDmaBuffer;
STATIC VOID *mDmaBufferMapping;
STATIC UINTN mDmaBufferBusAddress;
@@ -62,7 +57,7 @@ DrainMailbox (
}
ArmDataSynchronizationBarrier ();
MmioRead32 (BCM2836_MBOX_BASE_ADDRESS + BCM2836_MBOX_READ_OFFSET);
} while (++Tries < MAX_TRIES);
} while (++Tries < RPI_MBOX_MAX_TRIES);

return FALSE;
}
@@ -86,7 +81,7 @@ MailboxWaitForStatusCleared (
return TRUE;
}
ArmDataSynchronizationBarrier ();
} while (++Tries < MAX_TRIES);
} while (++Tries < RPI_MBOX_MAX_TRIES);

return FALSE;
}
@@ -1,6 +1,6 @@
/** @file
*
* Copyright (c) 2019, Pete Batard <pete@akeo.ie>
* Copyright (c) 2019-2020, Pete Batard <pete@akeo.ie>
* Copyright (c) 2016, Linaro Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -10,6 +10,15 @@
#ifndef __RASPBERRY_PI_MAILBOX_H__
#define __RASPBERRY_PI_MAILBOX_H__

/*
* Number of iterations to perform when waiting for the mailbox.
*
* This number was arrived at empirically, following discussion
* at https://github.com/raspberrypi/firmware/issues/1376, to
* avoid mailbox time-outs on some commands.
*/
#define RPI_MBOX_MAX_TRIES 0x8000000

/* Mailbox channels */
#define RPI_MBOX_PM_CHANNEL 0
#define RPI_MBOX_FB_CHANNEL 1
@@ -1,6 +1,7 @@
/** @file
*
* Copyright (c) 2019, Pete Batard <pete@akeo.ie>
* Copyright (c) 2020, Andrei Warkentin <andrey.warkentin@gmail.com>
* Copyright (c) 2019-2020, Pete Batard <pete@akeo.ie>
* Copyright (c) 2016, Linaro Limited. All rights reserved.
* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
*
@@ -13,10 +14,8 @@
#include <IndustryStandard/Bcm2836.h>
#include <IndustryStandard/RpiMbox.h>

#define MAX_TRIES 0x100000

.macro drain
mov x5, #MAX_TRIES
mov x5, #RPI_MBOX_MAX_TRIES
0: ldr w6, [x4, #BCM2836_MBOX_STATUS_OFFSET]
tbnz w6, #BCM2836_MBOX_STATUS_EMPTY, 1f
dmb ld
@@ -27,7 +26,7 @@
.endm

.macro poll, status
mov x5, #MAX_TRIES
mov x5, #RPI_MBOX_MAX_TRIES
0: ldr w6, [x4, #BCM2836_MBOX_STATUS_OFFSET]
tbz w6, #\status, 1f
dmb ld
@@ -36,23 +35,30 @@
1:
.endm

ASM_FUNC (ArmPlatformPeiBootAction)
adr x0, .Lmeminfo_buffer
mov x1, #FixedPcdGet64 (PcdDmaDeviceOffset)
.macro run, command_buffer
adr x0, \command_buffer
orr x0, x0, #RPI_MBOX_VC_CHANNEL
// x1 holds the value of PcdDmaDeviceOffset throughout this function
add x0, x0, x1

MOV32 (x4, BCM2836_MBOX_BASE_ADDRESS)

drain
poll BCM2836_MBOX_STATUS_FULL
str w0, [x4, #BCM2836_MBOX_WRITE_OFFSET]
dmb sy
poll BCM2836_MBOX_STATUS_EMPTY
dmb sy
ldr wzr, [x4, #BCM2836_MBOX_READ_OFFSET]
dmb ld
.endm

ASM_FUNC (ArmPlatformPeiBootAction)
mov x1, #FixedPcdGet64 (PcdDmaDeviceOffset)
orr x0, x0, #RPI_MBOX_VC_CHANNEL
// x1 holds the value of PcdDmaDeviceOffset throughout this function

MOV32 (x4, BCM2836_MBOX_BASE_ADDRESS)

drain

run .Lmeminfo_buffer

ldr w0, .Lmembase
adr x2, mSystemMemoryBase
@@ -63,17 +69,7 @@ ASM_FUNC (ArmPlatformPeiBootAction)
adr x2, mSystemMemoryEnd
str x0, [x2]

adr x0, .Lvcinfo_buffer
orr x0, x0, #RPI_MBOX_VC_CHANNEL
add x0, x0, x1

poll BCM2836_MBOX_STATUS_FULL
str w0, [x4, #BCM2836_MBOX_WRITE_OFFSET]
dmb sy
poll BCM2836_MBOX_STATUS_EMPTY
dmb sy
ldr wzr, [x4, #BCM2836_MBOX_READ_OFFSET]
dmb ld
run .Lvcinfo_buffer

ldr w0, .Lvcbase
adr x2, mVideoCoreBase
@@ -83,17 +79,7 @@ ASM_FUNC (ArmPlatformPeiBootAction)
adr x2, mVideoCoreSize
str x0, [x2]

adr x0, .Lrevinfo_buffer
orr x0, x0, #RPI_MBOX_VC_CHANNEL
add x0, x0, x1

poll BCM2836_MBOX_STATUS_FULL
str w0, [x4, #BCM2836_MBOX_WRITE_OFFSET]
dmb sy
poll BCM2836_MBOX_STATUS_EMPTY
dmb sy
ldr wzr, [x4, #BCM2836_MBOX_READ_OFFSET]
dmb ld
run .Lrevinfo_buffer

ldr w0, .Lrevision
adr x2, mBoardRevision
@@ -115,6 +101,7 @@ ASM_FUNC (ArmPlatformPeiBootAction)
.long 0 // end tag
.set .Lmeminfo_size, . - .Lmeminfo_buffer

.align 4
.Lvcinfo_buffer:
.long .Lvcinfo_size
.long 0x0
@@ -128,6 +115,7 @@ ASM_FUNC (ArmPlatformPeiBootAction)
.long 0 // end tag
.set .Lvcinfo_size, . - .Lvcinfo_buffer

.align 4
.Lrevinfo_buffer:
.long .Lrevinfo_size
.long 0x0

0 comments on commit 35a5402

Please sign in to comment.