[PATCH v4 10/12] hw/ppc/pegasos2: Add bus frequency to machine state

BALATON Zoltan posted 12 patches 2 weeks, 2 days ago
Maintainers: BALATON Zoltan <balaton@eik.bme.hu>, Alexey Kardashevskiy <aik@ozlabs.ru>
[PATCH v4 10/12] hw/ppc/pegasos2: Add bus frequency to machine state
Posted by BALATON Zoltan 2 weeks, 2 days ago
Store the bus frequency in the machine state and set it from instance
init method.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 hw/ppc/pegasos2.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
index f5b56c0e94..7eaefcf9a0 100644
--- a/hw/ppc/pegasos2.c
+++ b/hw/ppc/pegasos2.c
@@ -55,8 +55,6 @@
 #define H_PRIVILEGE  -3  /* Caller not privileged */
 #define H_PARAMETER  -4  /* Parameter invalid, out-of-range or conflicting */
 
-#define BUS_FREQ_HZ 133333333
-
 #define TYPE_PEGASOS_MACHINE MACHINE_TYPE_NAME("pegasos")
 OBJECT_DECLARE_SIMPLE_TYPE(PegasosMachineState, PEGASOS_MACHINE)
 
@@ -66,6 +64,7 @@ struct PegasosMachineState {
     PowerPCCPU *cpu;
     DeviceState *nb; /* north bridge */
     DeviceState *sb; /* south bridge */
+    int bus_freq_hz;
     IRQState pci_irqs[PCI_NUM_PINS];
     OrIRQState orirq[PCI_NUM_PINS];
     qemu_irq mv_pirq[PCI_NUM_PINS];
@@ -135,7 +134,7 @@ static void pegasos2_setup_pci_irq(PegasosMachineState *pm)
                                 qdev_get_gpio_in_named(pm->nb, "gpp", 31));
 }
 
-static void pegasos2_init(MachineState *machine)
+static void pegasos_init(MachineState *machine)
 {
     PegasosMachineState *pm = PEGASOS_MACHINE(machine);
     CPUPPCState *env;
@@ -158,7 +157,7 @@ static void pegasos2_init(MachineState *machine)
     }
 
     /* Set time-base frequency */
-    cpu_ppc_tb_init(env, BUS_FREQ_HZ / 4);
+    cpu_ppc_tb_init(env, pm->bus_freq_hz / 4);
     qemu_register_reset(pegasos2_cpu_reset, pm->cpu);
 
     /* RAM */
@@ -610,7 +609,7 @@ static void pegasos2_machine_class_init(ObjectClass *oc, const void *data)
     VofMachineIfClass *vmc = VOF_MACHINE_CLASS(oc);
 
     mc->desc = "Genesi/bPlan Pegasos II";
-    mc->init = pegasos2_init;
+    mc->init = pegasos_init;
     mc->reset = pegasos2_machine_reset;
     mc->block_default_type = IF_IDE;
     mc->default_boot_order = "cd";
@@ -629,6 +628,13 @@ static void pegasos2_machine_class_init(ObjectClass *oc, const void *data)
     vmc->setprop = pegasos2_setprop;
 }
 
+static void pegasos2_init(Object *obj)
+{
+    PegasosMachineState *pm = PEGASOS_MACHINE(obj);
+
+    pm->bus_freq_hz = 133333333;
+}
+
 static const TypeInfo pegasos_machine_types[] = {
     {
         .name          = TYPE_PEGASOS_MACHINE,
@@ -645,6 +651,7 @@ static const TypeInfo pegasos_machine_types[] = {
         .name          = MACHINE_TYPE_NAME("pegasos2"),
         .parent        = TYPE_PEGASOS_MACHINE,
         .class_init    = pegasos2_machine_class_init,
+        .instance_init = pegasos2_init,
     },
 };
 
@@ -777,7 +784,7 @@ static void add_pci_device(PCIBus *bus, PCIDevice *d, void *opaque)
     g_string_free(node, TRUE);
 }
 
-static void add_cpu_info(void *fdt, PowerPCCPU *cpu)
+static void add_cpu_info(void *fdt, PowerPCCPU *cpu, int bus_freq)
 {
     uint32_t cells[2];
 
@@ -824,8 +831,8 @@ static void add_cpu_info(void *fdt, PowerPCCPU *cpu)
     qemu_fdt_setprop_cell(fdt, cp, "reservation-granule-size", 4);
     qemu_fdt_setprop_cell(fdt, cp, "timebase-frequency",
                           cpu->env.tb_env->tb_freq);
-    qemu_fdt_setprop_cell(fdt, cp, "bus-frequency", BUS_FREQ_HZ);
-    qemu_fdt_setprop_cell(fdt, cp, "clock-frequency", BUS_FREQ_HZ * 7.5);
+    qemu_fdt_setprop_cell(fdt, cp, "bus-frequency", bus_freq);
+    qemu_fdt_setprop_cell(fdt, cp, "clock-frequency", bus_freq * 7.5);
     qemu_fdt_setprop_cell(fdt, cp, "cpu-version", cpu->env.spr[SPR_PVR]);
     cells[0] = 0;
     cells[1] = 0;
@@ -860,7 +867,7 @@ static void *pegasos2_build_fdt(PegasosMachineState *pm, int *fdt_size)
     }
     qemu_fdt_setprop_string(fdt, "/", "name", "bplan,Pegasos2");
 
-    add_cpu_info(fdt, pm->cpu);
+    add_cpu_info(fdt, pm->cpu, pm->bus_freq_hz);
 
     fi.fdt = fdt;
     fi.path = "/pci@c0000000";
-- 
2.41.3
Re: [PATCH v4 10/12] hw/ppc/pegasos2: Add bus frequency to machine state
Posted by Philippe Mathieu-Daudé 2 weeks, 2 days ago
On 23/10/25 02:06, BALATON Zoltan wrote:
> Store the bus frequency in the machine state and set it from instance
> init method.
> 
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> ---
>   hw/ppc/pegasos2.c | 25 ++++++++++++++++---------
>   1 file changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
> index f5b56c0e94..7eaefcf9a0 100644
> --- a/hw/ppc/pegasos2.c
> +++ b/hw/ppc/pegasos2.c
> @@ -55,8 +55,6 @@
>   #define H_PRIVILEGE  -3  /* Caller not privileged */
>   #define H_PARAMETER  -4  /* Parameter invalid, out-of-range or conflicting */
>   
> -#define BUS_FREQ_HZ 133333333


> -static void pegasos2_init(MachineState *machine)
> +static void pegasos_init(MachineState *machine)
>   {
>       PegasosMachineState *pm = PEGASOS_MACHINE(machine);
>       CPUPPCState *env;
> @@ -158,7 +157,7 @@ static void pegasos2_init(MachineState *machine)
>       }
>   
>       /* Set time-base frequency */
> -    cpu_ppc_tb_init(env, BUS_FREQ_HZ / 4);
> +    cpu_ppc_tb_init(env, pm->bus_freq_hz / 4);

As a future cleanup patch on top, please replace the magic '4' value ...
> -static void add_cpu_info(void *fdt, PowerPCCPU *cpu)
> +static void add_cpu_info(void *fdt, PowerPCCPU *cpu, int bus_freq)
>   {
>       uint32_t cells[2];
>   
> @@ -824,8 +831,8 @@ static void add_cpu_info(void *fdt, PowerPCCPU *cpu)
>       qemu_fdt_setprop_cell(fdt, cp, "reservation-granule-size", 4);
>       qemu_fdt_setprop_cell(fdt, cp, "timebase-frequency",
>                             cpu->env.tb_env->tb_freq);
> -    qemu_fdt_setprop_cell(fdt, cp, "bus-frequency", BUS_FREQ_HZ);
> -    qemu_fdt_setprop_cell(fdt, cp, "clock-frequency", BUS_FREQ_HZ * 7.5);
> +    qemu_fdt_setprop_cell(fdt, cp, "bus-frequency", bus_freq);
> +    qemu_fdt_setprop_cell(fdt, cp, "clock-frequency", bus_freq * 7.5);
... and this '7.5' one by descriptive definitions.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>


Re: [PATCH v4 10/12] hw/ppc/pegasos2: Add bus frequency to machine state
Posted by BALATON Zoltan 2 weeks, 2 days ago
On Thu, 23 Oct 2025, Philippe Mathieu-Daudé wrote:
> On 23/10/25 02:06, BALATON Zoltan wrote:
>> Store the bus frequency in the machine state and set it from instance
>> init method.
>> 
>> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>> ---
>>   hw/ppc/pegasos2.c | 25 ++++++++++++++++---------
>>   1 file changed, 16 insertions(+), 9 deletions(-)
>> 
>> diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
>> index f5b56c0e94..7eaefcf9a0 100644
>> --- a/hw/ppc/pegasos2.c
>> +++ b/hw/ppc/pegasos2.c
>> @@ -55,8 +55,6 @@
>>   #define H_PRIVILEGE  -3  /* Caller not privileged */
>>   #define H_PARAMETER  -4  /* Parameter invalid, out-of-range or 
>> conflicting */
>>   -#define BUS_FREQ_HZ 133333333
>
>
>> -static void pegasos2_init(MachineState *machine)
>> +static void pegasos_init(MachineState *machine)
>>   {
>>       PegasosMachineState *pm = PEGASOS_MACHINE(machine);
>>       CPUPPCState *env;
>> @@ -158,7 +157,7 @@ static void pegasos2_init(MachineState *machine)
>>       }
>>         /* Set time-base frequency */
>> -    cpu_ppc_tb_init(env, BUS_FREQ_HZ / 4);
>> +    cpu_ppc_tb_init(env, pm->bus_freq_hz / 4);
>
> As a future cleanup patch on top, please replace the magic '4' value ...
>> -static void add_cpu_info(void *fdt, PowerPCCPU *cpu)
>> +static void add_cpu_info(void *fdt, PowerPCCPU *cpu, int bus_freq)
>>   {
>>       uint32_t cells[2];
>>   @@ -824,8 +831,8 @@ static void add_cpu_info(void *fdt, PowerPCCPU *cpu)
>>       qemu_fdt_setprop_cell(fdt, cp, "reservation-granule-size", 4);
>>       qemu_fdt_setprop_cell(fdt, cp, "timebase-frequency",
>>                             cpu->env.tb_env->tb_freq);
>> -    qemu_fdt_setprop_cell(fdt, cp, "bus-frequency", BUS_FREQ_HZ);
>> -    qemu_fdt_setprop_cell(fdt, cp, "clock-frequency", BUS_FREQ_HZ * 7.5);
>> +    qemu_fdt_setprop_cell(fdt, cp, "bus-frequency", bus_freq);
>> +    qemu_fdt_setprop_cell(fdt, cp, "clock-frequency", bus_freq * 7.5);
> ... and this '7.5' one by descriptive definitions.

These are just clock multipliers. The time-base often runs at quarter of 
the bus freq on PPC and I don't think we have a define for that anywhere 
else. The 7.5 is a CPU clock to bus clock multiplier that should be fairly 
obvious fron the above without a define.

> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>

Thanks,
BALATON Zoltan