1*7785e8eaSSergey Kambalin /* 2*7785e8eaSSergey Kambalin * Raspberry Pi 4B emulation 3*7785e8eaSSergey Kambalin * 4*7785e8eaSSergey Kambalin * Copyright (C) 2022 Ovchinnikov Vitalii <vitalii.ovchinnikov@auriga.com> 5*7785e8eaSSergey Kambalin * 6*7785e8eaSSergey Kambalin * SPDX-License-Identifier: GPL-2.0-or-later 7*7785e8eaSSergey Kambalin */ 8*7785e8eaSSergey Kambalin 9*7785e8eaSSergey Kambalin #include "qemu/osdep.h" 10*7785e8eaSSergey Kambalin #include "qemu/units.h" 11*7785e8eaSSergey Kambalin #include "qemu/cutils.h" 12*7785e8eaSSergey Kambalin #include "qapi/error.h" 13*7785e8eaSSergey Kambalin #include "qapi/visitor.h" 14*7785e8eaSSergey Kambalin #include "hw/arm/raspi_platform.h" 15*7785e8eaSSergey Kambalin #include "hw/display/bcm2835_fb.h" 16*7785e8eaSSergey Kambalin #include "hw/registerfields.h" 17*7785e8eaSSergey Kambalin #include "qemu/error-report.h" 18*7785e8eaSSergey Kambalin #include "sysemu/device_tree.h" 19*7785e8eaSSergey Kambalin #include "hw/boards.h" 20*7785e8eaSSergey Kambalin #include "hw/loader.h" 21*7785e8eaSSergey Kambalin #include "hw/arm/boot.h" 22*7785e8eaSSergey Kambalin #include "qom/object.h" 23*7785e8eaSSergey Kambalin #include "hw/arm/bcm2838.h" 24*7785e8eaSSergey Kambalin 25*7785e8eaSSergey Kambalin #define TYPE_RASPI4B_MACHINE MACHINE_TYPE_NAME("raspi4b") 26*7785e8eaSSergey Kambalin OBJECT_DECLARE_SIMPLE_TYPE(Raspi4bMachineState, RASPI4B_MACHINE) 27*7785e8eaSSergey Kambalin 28*7785e8eaSSergey Kambalin struct Raspi4bMachineState { 29*7785e8eaSSergey Kambalin RaspiBaseMachineState parent_obj; 30*7785e8eaSSergey Kambalin BCM2838State soc; 31*7785e8eaSSergey Kambalin }; 32*7785e8eaSSergey Kambalin 33*7785e8eaSSergey Kambalin static void raspi4b_machine_init(MachineState *machine) 34*7785e8eaSSergey Kambalin { 35*7785e8eaSSergey Kambalin Raspi4bMachineState *s = RASPI4B_MACHINE(machine); 36*7785e8eaSSergey Kambalin RaspiBaseMachineState *s_base = RASPI_BASE_MACHINE(machine); 37*7785e8eaSSergey Kambalin RaspiBaseMachineClass *mc = RASPI_BASE_MACHINE_GET_CLASS(machine); 38*7785e8eaSSergey Kambalin BCM2838State *soc = &s->soc; 39*7785e8eaSSergey Kambalin 40*7785e8eaSSergey Kambalin s_base->binfo.board_id = mc->board_rev; 41*7785e8eaSSergey Kambalin 42*7785e8eaSSergey Kambalin object_initialize_child(OBJECT(machine), "soc", soc, 43*7785e8eaSSergey Kambalin board_soc_type(mc->board_rev)); 44*7785e8eaSSergey Kambalin 45*7785e8eaSSergey Kambalin raspi_base_machine_init(machine, &soc->parent_obj); 46*7785e8eaSSergey Kambalin } 47*7785e8eaSSergey Kambalin 48*7785e8eaSSergey Kambalin static void raspi4b_machine_class_init(ObjectClass *oc, void *data) 49*7785e8eaSSergey Kambalin { 50*7785e8eaSSergey Kambalin MachineClass *mc = MACHINE_CLASS(oc); 51*7785e8eaSSergey Kambalin RaspiBaseMachineClass *rmc = RASPI_BASE_MACHINE_CLASS(oc); 52*7785e8eaSSergey Kambalin 53*7785e8eaSSergey Kambalin rmc->board_rev = 0xb03115; /* Revision 1.5, 2 Gb RAM */ 54*7785e8eaSSergey Kambalin raspi_machine_class_common_init(mc, rmc->board_rev); 55*7785e8eaSSergey Kambalin mc->init = raspi4b_machine_init; 56*7785e8eaSSergey Kambalin } 57*7785e8eaSSergey Kambalin 58*7785e8eaSSergey Kambalin static const TypeInfo raspi4b_machine_type = { 59*7785e8eaSSergey Kambalin .name = TYPE_RASPI4B_MACHINE, 60*7785e8eaSSergey Kambalin .parent = TYPE_RASPI_BASE_MACHINE, 61*7785e8eaSSergey Kambalin .instance_size = sizeof(Raspi4bMachineState), 62*7785e8eaSSergey Kambalin .class_init = raspi4b_machine_class_init, 63*7785e8eaSSergey Kambalin }; 64*7785e8eaSSergey Kambalin 65*7785e8eaSSergey Kambalin static void raspi4b_machine_register_type(void) 66*7785e8eaSSergey Kambalin { 67*7785e8eaSSergey Kambalin type_register_static(&raspi4b_machine_type); 68*7785e8eaSSergey Kambalin } 69*7785e8eaSSergey Kambalin 70*7785e8eaSSergey Kambalin type_init(raspi4b_machine_register_type) 71