diff mbox

[arm-devs,v2,5/8] arm/highbank: Fix CBAR intialisation

Message ID a199380a16761a709f86cff4e019cc884feace1c.1385608859.git.peter.crosthwaite@xilinx.com
State New
Headers show

Commit Message

Peter Crosthwaite Nov. 28, 2013, 3:29 a.m. UTC
Fix the CBAR initialisation by using the newly defined static property.
CBAR is now set before realization, so the intended value is now
actually used.

So I have kinda tested this. I booted an ARM kernel on Highbank with the
stock Highbank DTB. It doesnt boot (and I will be doing something
wrong), but before this patch I got this:

------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at /workspaces/pcrost/public/linux2.git/arch/arm/mm/ioremap.c:301 __arm_ioremap_pfn_caller+0x180/0x198()
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W 3.13.0-rc1-next-20131126-dirty #2
[<c0015164>] (unwind_backtrace) from [<c00118c0>] (show_stack+0x10/0x14)
[<c00118c0>] (show_stack) from [<c02bd5fc>] (dump_stack+0x78/0x90)
[<c02bd5fc>] (dump_stack) from [<c001f110>] (warn_slowpath_common+0x68/0x84)
[<c001f110>] (warn_slowpath_common) from [<c001f1f4>] (warn_slowpath_null+0x1c/0x24)
[<c001f1f4>] (warn_slowpath_null) from [<c0017c6c>] (__arm_ioremap_pfn_caller+0x180/0x198)
[<c0017c6c>] (__arm_ioremap_pfn_caller) from [<c0017cd8>] (__arm_ioremap_caller+0x54/0x5c)
[<c0017cd8>] (__arm_ioremap_caller) from [<c0017d10>] (__arm_ioremap+0x18/0x1c)
[<c0017d10>] (__arm_ioremap) from [<c03913c0>] (highbank_init_irq+0x34/0x8c)
[<c03913c0>] (highbank_init_irq) from [<c038c228>] (init_IRQ+0x28/0x2c)
[<c038c228>] (init_IRQ) from [<c03899ec>] (start_kernel+0x234/0x398)
[<c03899ec>] (start_kernel) from [<00008074>] (0x8074)
---[ end trace 3406ff24bd97382f ]---

Which dissappears with this patch.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
changed since v1:
use error report rather than fprintf(stderr

 hw/arm/highbank.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Peter Maydell Nov. 28, 2013, 7:34 p.m. UTC | #1
On 28 November 2013 03:29, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> Fix the CBAR initialisation by using the newly defined static property.
> CBAR is now set before realization, so the intended value is now
> actually used.
>
> So I have kinda tested this. I booted an ARM kernel on Highbank with the
> stock Highbank DTB. It doesnt boot (and I will be doing something
> wrong), but before this patch I got this:
>
> ------------[ cut here ]------------
> WARNING: CPU: 0 PID: 0 at /workspaces/pcrost/public/linux2.git/arch/arm/mm/ioremap.c:301 __arm_ioremap_pfn_caller+0x180/0x198()
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W 3.13.0-rc1-next-20131126-dirty #2
> [<c0015164>] (unwind_backtrace) from [<c00118c0>] (show_stack+0x10/0x14)
> [<c00118c0>] (show_stack) from [<c02bd5fc>] (dump_stack+0x78/0x90)
> [<c02bd5fc>] (dump_stack) from [<c001f110>] (warn_slowpath_common+0x68/0x84)
> [<c001f110>] (warn_slowpath_common) from [<c001f1f4>] (warn_slowpath_null+0x1c/0x24)
> [<c001f1f4>] (warn_slowpath_null) from [<c0017c6c>] (__arm_ioremap_pfn_caller+0x180/0x198)
> [<c0017c6c>] (__arm_ioremap_pfn_caller) from [<c0017cd8>] (__arm_ioremap_caller+0x54/0x5c)
> [<c0017cd8>] (__arm_ioremap_caller) from [<c0017d10>] (__arm_ioremap+0x18/0x1c)
> [<c0017d10>] (__arm_ioremap) from [<c03913c0>] (highbank_init_irq+0x34/0x8c)
> [<c03913c0>] (highbank_init_irq) from [<c038c228>] (init_IRQ+0x28/0x2c)
> [<c038c228>] (init_IRQ) from [<c03899ec>] (start_kernel+0x234/0x398)
> [<c03899ec>] (start_kernel) from [<00008074>] (0x8074)
> ---[ end trace 3406ff24bd97382f ]---
>
> Which dissappears with this patch.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
> changed since v1:
> use error report rather than fprintf(stderr
>
>  hw/arm/highbank.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
> index 1d19d8f..cb32325 100644
> --- a/hw/arm/highbank.c
> +++ b/hw/arm/highbank.c
> @@ -236,14 +236,16 @@ static void calxeda_init(QEMUMachineInitArgs *args, enum cxmachines machine)
>
>          cpu = ARM_CPU(object_new(object_class_get_name(oc)));
>
> +        object_property_set_int(OBJECT(cpu), GIC_BASE_ADDR, "reset-cbar", &err);
> +        if (err) {
> +            error_report("%s", error_get_pretty(err));
> +            exit(1);
> +        }

It's kind of sad that we need five lines of code just to
say "set this property on this object which we should
know at compile time to exist" . (I was about to argue we
should just assert, but since we don't refuse to start with
wacky user-provided cpu-model strings we can't quite get
away with that.)

More significantly, this will break midway, because
cortex-a15 doesn't have this property. Fortunately, the
actual A15 does have a CBAR register so you can just
add a patch to set the feature bit for it.

Caution, this means our semantics for reset-cbar
are "actual reset value of register", which is not
the same as "base address of peripherals", because
for A15 the register has
 [31:15] bits 31:15 of base-addr
 [14:8] reserved, zero
 [7:0] bits 39:32 of base-addr

which makes a difference if you were nutty enough to
put the GIC above the 4GB boundary.

(As with the real hardware, setting this config property
doesn't actually change where the GIC & friends live
in the address space, incidentally.)

>          object_property_set_bool(OBJECT(cpu), true, "realized", &err);
>          if (err) {
>              error_report("%s", error_get_pretty(err));
>              exit(1);
>          }
> -
> -        /* This will become a QOM property eventually */
> -        cpu->reset_cbar = GIC_BASE_ADDR;
>          cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ);
>      }

thanks
-- PMM
Peter Crosthwaite Nov. 28, 2013, 11:55 p.m. UTC | #2
On Fri, Nov 29, 2013 at 5:34 AM, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 28 November 2013 03:29, Peter Crosthwaite
> <peter.crosthwaite@xilinx.com> wrote:
>> Fix the CBAR initialisation by using the newly defined static property.
>> CBAR is now set before realization, so the intended value is now
>> actually used.
>>
>> So I have kinda tested this. I booted an ARM kernel on Highbank with the
>> stock Highbank DTB. It doesnt boot (and I will be doing something
>> wrong), but before this patch I got this:
>>
>> ------------[ cut here ]------------
>> WARNING: CPU: 0 PID: 0 at /workspaces/pcrost/public/linux2.git/arch/arm/mm/ioremap.c:301 __arm_ioremap_pfn_caller+0x180/0x198()
>> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W 3.13.0-rc1-next-20131126-dirty #2
>> [<c0015164>] (unwind_backtrace) from [<c00118c0>] (show_stack+0x10/0x14)
>> [<c00118c0>] (show_stack) from [<c02bd5fc>] (dump_stack+0x78/0x90)
>> [<c02bd5fc>] (dump_stack) from [<c001f110>] (warn_slowpath_common+0x68/0x84)
>> [<c001f110>] (warn_slowpath_common) from [<c001f1f4>] (warn_slowpath_null+0x1c/0x24)
>> [<c001f1f4>] (warn_slowpath_null) from [<c0017c6c>] (__arm_ioremap_pfn_caller+0x180/0x198)
>> [<c0017c6c>] (__arm_ioremap_pfn_caller) from [<c0017cd8>] (__arm_ioremap_caller+0x54/0x5c)
>> [<c0017cd8>] (__arm_ioremap_caller) from [<c0017d10>] (__arm_ioremap+0x18/0x1c)
>> [<c0017d10>] (__arm_ioremap) from [<c03913c0>] (highbank_init_irq+0x34/0x8c)
>> [<c03913c0>] (highbank_init_irq) from [<c038c228>] (init_IRQ+0x28/0x2c)
>> [<c038c228>] (init_IRQ) from [<c03899ec>] (start_kernel+0x234/0x398)
>> [<c03899ec>] (start_kernel) from [<00008074>] (0x8074)
>> ---[ end trace 3406ff24bd97382f ]---
>>
>> Which dissappears with this patch.
>>
>> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
>> ---
>> changed since v1:
>> use error report rather than fprintf(stderr
>>
>>  hw/arm/highbank.c | 8 +++++---
>>  1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
>> index 1d19d8f..cb32325 100644
>> --- a/hw/arm/highbank.c
>> +++ b/hw/arm/highbank.c
>> @@ -236,14 +236,16 @@ static void calxeda_init(QEMUMachineInitArgs *args, enum cxmachines machine)
>>
>>          cpu = ARM_CPU(object_new(object_class_get_name(oc)));
>>
>> +        object_property_set_int(OBJECT(cpu), GIC_BASE_ADDR, "reset-cbar", &err);
>> +        if (err) {
>> +            error_report("%s", error_get_pretty(err));
>> +            exit(1);
>> +        }
>
> It's kind of sad that we need five lines of code just to
> say "set this property on this object which we should
> know at compile time to exist" . (I was about to argue we
> should just assert, but since we don't refuse to start with
> wacky user-provided cpu-model strings we can't quite get
> away with that.)
>
> More significantly, this will break midway, because
> cortex-a15 doesn't have this property. Fortunately, the
> actual A15 does have a CBAR register so you can just
> add a patch to set the feature bit for it.
>

Ok will fix - thanks. Should I just feature CBAR for all the CPU
families you listed in v1 discussion?

> Caution, this means our semantics for reset-cbar
> are "actual reset value of register", which is not
> the same as "base address of peripherals",

That was the intended semantic.

> because
> for A15 the register has
>  [31:15] bits 31:15 of base-addr
>  [14:8] reserved, zero
>  [7:0] bits 39:32 of base-addr
>

Yes, so I i'm still of the opinion that this stuff is the
responsibility of MPCore not ARM_CPU. Ideally, we move the ARM cpus
into MPCore. Then boards set periphbase of mpcores and mpcores set
CBARs. Keeps CPUs unaware of periphbase mangling complications like
this. And keeps boards unaware of CBARs.

Regards,
Peter

> which makes a difference if you were nutty enough to
> put the GIC above the 4GB boundary.
>
> (As with the real hardware, setting this config property
> doesn't actually change where the GIC & friends live
> in the address space, incidentally.)
>
>>          object_property_set_bool(OBJECT(cpu), true, "realized", &err);
>>          if (err) {
>>              error_report("%s", error_get_pretty(err));
>>              exit(1);
>>          }
>> -
>> -        /* This will become a QOM property eventually */
>> -        cpu->reset_cbar = GIC_BASE_ADDR;
>>          cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ);
>>      }
>
> thanks
> -- PMM
>
Peter Maydell Nov. 29, 2013, 8:16 a.m. UTC | #3
On 28 November 2013 23:55, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> On Fri, Nov 29, 2013 at 5:34 AM, Peter Maydell <peter.maydell@linaro.org> wrote:
>> More significantly, this will break midway, because
>> cortex-a15 doesn't have this property. Fortunately, the
>> actual A15 does have a CBAR register so you can just
>> add a patch to set the feature bit for it.
>>
>
> Ok will fix - thanks. Should I just feature CBAR for all the CPU
> families you listed in v1 discussion?

I'm pretty sure the only two cores with CBAR that we
implement are A15 and A9. NB that the permissions on
the two registers are not the same, though -- check the
TRMs. (A15's is always r/o).

>> Caution, this means our semantics for reset-cbar
>> are "actual reset value of register", which is not
>> the same as "base address of peripherals",
>
> That was the intended semantic.
>
>> because
>> for A15 the register has
>>  [31:15] bits 31:15 of base-addr
>>  [14:8] reserved, zero
>>  [7:0] bits 39:32 of base-addr
>>
>
> Yes, so I i'm still of the opinion that this stuff is the
> responsibility of MPCore not ARM_CPU. Ideally, we move the ARM cpus
> into MPCore. Then boards set periphbase of mpcores and mpcores set
> CBARs. Keeps CPUs unaware of periphbase mangling complications like
> this. And keeps boards unaware of CBARs.

I'm in favour of eventually moving the cores
themselves into the *mpcore containers, though
I'm not entirely sure that the CBAR setting and
periphbase locations are a single setting on real
hardware config (as opposed to two different
settings that are supposed to be the same).

-- PMM
diff mbox

Patch

diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index 1d19d8f..cb32325 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -236,14 +236,16 @@  static void calxeda_init(QEMUMachineInitArgs *args, enum cxmachines machine)
 
         cpu = ARM_CPU(object_new(object_class_get_name(oc)));
 
+        object_property_set_int(OBJECT(cpu), GIC_BASE_ADDR, "reset-cbar", &err);
+        if (err) {
+            error_report("%s", error_get_pretty(err));
+            exit(1);
+        }
         object_property_set_bool(OBJECT(cpu), true, "realized", &err);
         if (err) {
             error_report("%s", error_get_pretty(err));
             exit(1);
         }
-
-        /* This will become a QOM property eventually */
-        cpu->reset_cbar = GIC_BASE_ADDR;
         cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ);
     }