hw/arm/raspi: Extract the RAM size from the board revision
The board revision encode the amount of RAM. Add a helper to extract the RAM size, and use it. Since the amount of RAM is fixed (it is impossible to physically modify to have more or less RAM), do not allow sizes different than the one anounced by the manufacturer. Acked-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20200208165645.15657-5-f4bug@amsat.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
cd6c9977d3
commit
f5bb124ecf
@ -13,6 +13,7 @@
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qapi/error.h"
|
||||
#include "cpu.h"
|
||||
#include "hw/arm/bcm2836.h"
|
||||
@ -49,6 +50,12 @@ FIELD(REV_CODE, MANUFACTURER, 16, 4);
|
||||
FIELD(REV_CODE, MEMORY_SIZE, 20, 3);
|
||||
FIELD(REV_CODE, STYLE, 23, 1);
|
||||
|
||||
static uint64_t board_ram_size(uint32_t board_rev)
|
||||
{
|
||||
assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
|
||||
return 256 * MiB << FIELD_EX32(board_rev, REV_CODE, MEMORY_SIZE);
|
||||
}
|
||||
|
||||
static int board_processor_id(uint32_t board_rev)
|
||||
{
|
||||
assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
|
||||
@ -191,15 +198,17 @@ static void raspi_init(MachineState *machine, uint32_t board_rev)
|
||||
{
|
||||
RasPiState *s = g_new0(RasPiState, 1);
|
||||
int version = board_version(board_rev);
|
||||
uint64_t ram_size = board_ram_size(board_rev);
|
||||
uint32_t vcram_size;
|
||||
DriveInfo *di;
|
||||
BlockBackend *blk;
|
||||
BusState *bus;
|
||||
DeviceState *carddev;
|
||||
|
||||
if (machine->ram_size > 1 * GiB) {
|
||||
error_report("Requested ram size is too large for this machine: "
|
||||
"maximum is 1GB");
|
||||
if (machine->ram_size != ram_size) {
|
||||
char *size_str = size_to_str(ram_size);
|
||||
error_report("Invalid RAM size, should be %s", size_str);
|
||||
g_free(size_str);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user