[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 04/30] hw/arm/raspi: Extract the RAM size from the board revis
From: |
Philippe Mathieu-Daudé |
Subject: |
[PATCH v2 04/30] hw/arm/raspi: Extract the RAM size from the board revision |
Date: |
Thu, 6 Feb 2020 02:17:30 +0100 |
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 <address@hidden>
Signed-off-by: Philippe Mathieu-Daudé <address@hidden>
---
Cc: Alistair Francis <address@hidden>
hw/arm/raspi.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 13d41dfce6..2f5cd32c5e 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -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"
@@ -48,6 +49,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 */
@@ -190,15 +197,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("This machine can only be used with %s", size_str);
+ g_free(size_str);
exit(1);
}
--
2.21.1
- [PATCH v2 00/30] hw/arm/raspi: Dynamically create machines based on the board revision, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 04/30] hw/arm/raspi: Extract the RAM size from the board revision,
Philippe Mathieu-Daudé <=
- [PATCH v2 05/30] hw/arm/raspi: Extract the processor type from the board revision, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 06/30] hw/arm/raspi: Trivial code movement, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 07/30] hw/arm/raspi: Make machines children of abstract RaspiMachineClass, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 08/30] hw/arm/raspi: Make board_rev a field of RaspiMachineClass, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 10/30] hw/arm/raspi: Set default RAM size to size encoded in board revision, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 09/30] hw/arm/raspi: Let class_init() directly call raspi_machine_init(), Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 11/30] hw/arm/raspi: Extract the board model from the board revision, Philippe Mathieu-Daudé, 2020/02/05
- [PATCH v2 12/30] hw/arm/raspi: Use a unique raspi_machine_class_init() method, Philippe Mathieu-Daudé, 2020/02/05