[3/3] PPC: SPAPR: Use KVM function for time info

Submitted by Alexander Graf on Aug. 9, 2011, 4:39 p.m.

Details

Message ID 1312907970-15440-4-git-send-email-agraf@suse.de
State New
Headers show

Commit Message

Alexander Graf Aug. 9, 2011, 4:39 p.m.
One of the things we can't fake on PPC is the timer speed. So
we need to extract the frequency information from the host and
put it back into the guest device tree.

Luckily, we already have functions for that from the non-pseries
targets, so all we need to do is to connect the dots and the guest
suddenly gets to know its real timer speeds.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/spapr.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

Comments

David Gibson Aug. 10, 2011, 3:35 a.m.
On Tue, Aug 09, 2011 at 06:39:30PM +0200, Alexander Graf wrote:
> One of the things we can't fake on PPC is the timer speed. So
> we need to extract the frequency information from the host and
> put it back into the guest device tree.
> 
> Luckily, we already have functions for that from the non-pseries
> targets, so all we need to do is to connect the dots and the guest
> suddenly gets to know its real timer speeds.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  hw/spapr.c |    8 ++++----
>  1 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/spapr.c b/hw/spapr.c
> index d56697a..a73f38a 100644
> --- a/hw/spapr.c
> +++ b/hw/spapr.c
> @@ -140,6 +140,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
>          char *nodename;
>          uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
>                             0xffffffff, 0xffffffff};
> +        uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ;
> +        uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;

Um.. I see the kvmppc_get_tbfreq() function but not the
kvmppc_get_clockfreq() function in my tree (pulled from upstream this
morning).  Is that something new in your ppc patch queue?

>          if (asprintf(&nodename, "%s@%x", modelname, index) < 0) {
>              fprintf(stderr, "Allocation failure\n");
> @@ -158,10 +160,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
>                                  env->dcache_line_size)));
>          _FDT((fdt_property_cell(fdt, "icache-block-size",
>                                  env->icache_line_size)));
> -        _FDT((fdt_property_cell(fdt, "timebase-frequency", TIMEBASE_FREQ)));
> -        /* Hardcode CPU frequency for now.  It's kind of arbitrary on
> -         * full emu, for kvm we should copy it from the host */
> -        _FDT((fdt_property_cell(fdt, "clock-frequency", 1000000000)));
> +        _FDT((fdt_property_cell(fdt, "timebase-frequency", tbfreq)));
> +        _FDT((fdt_property_cell(fdt, "clock-frequency", cpufreq)));
>          _FDT((fdt_property_cell(fdt, "ibm,slb-size", env->slb_nr)));
>          _FDT((fdt_property(fdt, "ibm,pft-size",
>                             pft_size_prop, sizeof(pft_size_prop))));
Alexander Graf Aug. 10, 2011, 7:50 a.m.
Am 10.08.2011 um 05:35 schrieb David Gibson <david@gibson.dropbear.id.au>:

> On Tue, Aug 09, 2011 at 06:39:30PM +0200, Alexander Graf wrote:
>> One of the things we can't fake on PPC is the timer speed. So
>> we need to extract the frequency information from the host and
>> put it back into the guest device tree.
>> 
>> Luckily, we already have functions for that from the non-pseries
>> targets, so all we need to do is to connect the dots and the guest
>> suddenly gets to know its real timer speeds.
>> 
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>> ---
>> hw/spapr.c |    8 ++++----
>> 1 files changed, 4 insertions(+), 4 deletions(-)
>> 
>> diff --git a/hw/spapr.c b/hw/spapr.c
>> index d56697a..a73f38a 100644
>> --- a/hw/spapr.c
>> +++ b/hw/spapr.c
>> @@ -140,6 +140,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
>>         char *nodename;
>>         uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
>>                            0xffffffff, 0xffffffff};
>> +        uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ;
>> +        uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;
> 
> Um.. I see the kvmppc_get_tbfreq() function but not the
> kvmppc_get_clockfreq() function in my tree (pulled from upstream this
> morning).  Is that something new in your ppc patch queue?

Yes, it's part of the SMP patch set for e500 :)

Alex

>

Patch hide | download patch | download mbox

diff --git a/hw/spapr.c b/hw/spapr.c
index d56697a..a73f38a 100644
--- a/hw/spapr.c
+++ b/hw/spapr.c
@@ -140,6 +140,8 @@  static void *spapr_create_fdt_skel(const char *cpu_model,
         char *nodename;
         uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
                            0xffffffff, 0xffffffff};
+        uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ;
+        uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : 1000000000;
 
         if (asprintf(&nodename, "%s@%x", modelname, index) < 0) {
             fprintf(stderr, "Allocation failure\n");
@@ -158,10 +160,8 @@  static void *spapr_create_fdt_skel(const char *cpu_model,
                                 env->dcache_line_size)));
         _FDT((fdt_property_cell(fdt, "icache-block-size",
                                 env->icache_line_size)));
-        _FDT((fdt_property_cell(fdt, "timebase-frequency", TIMEBASE_FREQ)));
-        /* Hardcode CPU frequency for now.  It's kind of arbitrary on
-         * full emu, for kvm we should copy it from the host */
-        _FDT((fdt_property_cell(fdt, "clock-frequency", 1000000000)));
+        _FDT((fdt_property_cell(fdt, "timebase-frequency", tbfreq)));
+        _FDT((fdt_property_cell(fdt, "clock-frequency", cpufreq)));
         _FDT((fdt_property_cell(fdt, "ibm,slb-size", env->slb_nr)));
         _FDT((fdt_property(fdt, "ibm,pft-size",
                            pft_size_prop, sizeof(pft_size_prop))));