mbox series

[v4,00/16] Basic StarFive JH7100 RISC-V SoC support

Message ID 20211116150119.2171-1-kernel@esmil.dk
Headers show
Series Basic StarFive JH7100 RISC-V SoC support | expand

Message

Emil Renner Berthing Nov. 16, 2021, 3:01 p.m. UTC
This series adds support for the StarFive JH7100 RISC-V SoC. The SoC has
many devices that need non-coherent dma operations to work which isn't
upstream yet[1], so this just adds basic support to boot up, get a
serial console, blink an LED and reboot itself. Unlike the Allwinner D1
this chip doesn't use any extra pagetable bits, but instead the DDR RAM
appears twice in the memory map, with and without the cache.

The JH7100 is a test chip for the upcoming JH7110 and about 300 BeagleV
Starlight Beta boards were sent out with them as part of a now cancelled
BeagleBoard.org project. However StarFive has produced more of the
JH7100s and more boards will be available[2] to buy. I've seen pictures
of the new boards now, so hopefully before the end of the year.

This series is also available at
https://github.com/esmil/linux/commits/starlight-minimal
..but a more complete kernel including drivers for non-coherent
peripherals based on this series can be found at
https://github.com/starfive-tech/linux/tree/visionfive

[1]: https://lore.kernel.org/linux-riscv/20210723214031.3251801-2-atish.patra@wdc.com/
[2]: https://www.linkedin.com/pulse/starfive-release-open-source-single-board-platform-q3-2021-starfive/

/Emil

Changes since v3:
- The reset driver now uses 64bit read/write on the registers so we can
  use the regular bitmap macros. Requested by Andy.
- The pinctrl driver no longer resets the GPIO irq handler to
  handle_bad_irq on errors, uses reverse xmas tree order where possible
  and other nits by Andy.

Changes since v2:
- Ahmad and Geert agreed to switch the license of the clock and reset dt
  headers to GPL-2.0 OR MIT, so that both headers and device tree files
  can all use the same license.
  Bindings are still GPL-2.0-only OR BSD-2-Clause as recommended.
- Clock and reset drivers now set .suppress_bind_attrs = true and use
  builtin_platform_driver_probe to make sure the probe function is only
  called at init time so we can use __init and __initconst.
- The clock driver now uses devm_clk_hw_register and .parent_data when
  registering clocks. This way we can use the dt clock indexes rather
  than strings for parent lists and decrease the amount of static data
  needed considerably.
- Various dt binding cleanups from Rob
- Reworked description in the pinctrl dt binding.
- Pinctrl driver now depends on CONFIG_OF again since it uses
  pinconf_generic_parse_dt_config which is otherwise not defined.
- Pinctrl no longer devm_kfree's data that won't be referenced
  if dt pinconf parsing fails before registering groups and function,
  and other nits by Andy.
- The dw8250 quirk no longer needs a skip_clk_set_rate bit, but sets
  port->set_termios to the function called after clk_set_rate.

Changes since v1:
- Let SOC_STARFIVE select RESET_CONTROLLER but drop SERIAL_8250_DW
- Add missing Signed-of-by to clock dt-binding header
- Use builtin_platform_driver macro for the clock driver, add explicit
  comment to the determine_rate callback and other small nits from Andy
- Use reset-controller for node names in documentation and device tree
- Use readl_poll_timeout in reset driver to avoid hanging forever if a
  driver leaves the associated clock gated and sort Kconfig and Makefile
  entries properly.
- In the pinctrl driver align register names with documentation, remove
  invalid __init tag from probe function, use of_property_* functions to
  parse device tree, hoist pinmux unpacking into helper function to
  better document what's going on, bail on invalid signal group in
  device tree and fix many other nits from Andy.
- Refactor and rebase 8250_dw quirk on tty-next

Emil Renner Berthing (12):
  RISC-V: Add StarFive SoC Kconfig option
  dt-bindings: timer: Add StarFive JH7100 clint
  dt-bindings: interrupt-controller: Add StarFive JH7100 plic
  dt-bindings: reset: Add Starfive JH7100 reset bindings
  reset: starfive-jh7100: Add StarFive JH7100 reset driver
  dt-bindings: pinctrl: Add StarFive pinctrl definitions
  dt-bindings: pinctrl: Add StarFive JH7100 bindings
  pinctrl: starfive: Add pinctrl driver for StarFive SoCs
  dt-bindings: serial: snps-dw-apb-uart: Add JH7100 uarts
  serial: 8250_dw: Add StarFive JH7100 quirk
  RISC-V: Add initial StarFive JH7100 device tree
  RISC-V: Add BeagleV Starlight Beta device tree

Geert Uytterhoeven (4):
  dt-bindings: clock: starfive: Add JH7100 clock definitions
  dt-bindings: clock: starfive: Add JH7100 bindings
  clk: starfive: Add JH7100 clock generator driver
  dt-bindings: reset: Add StarFive JH7100 reset definitions

 .../clock/starfive,jh7100-clkgen.yaml         |   56 +
 .../sifive,plic-1.0.0.yaml                    |    1 +
 .../pinctrl/starfive,jh7100-pinctrl.yaml      |  307 ++++
 .../bindings/reset/starfive,jh7100-reset.yaml |   38 +
 .../bindings/serial/snps-dw-apb-uart.yaml     |    5 +
 .../bindings/timer/sifive,clint.yaml          |    1 +
 MAINTAINERS                                   |   22 +
 arch/riscv/Kconfig.socs                       |    8 +
 arch/riscv/boot/dts/Makefile                  |    1 +
 arch/riscv/boot/dts/starfive/Makefile         |    2 +
 .../dts/starfive/jh7100-beaglev-starlight.dts |  164 ++
 arch/riscv/boot/dts/starfive/jh7100.dtsi      |  230 +++
 drivers/clk/Kconfig                           |    1 +
 drivers/clk/Makefile                          |    1 +
 drivers/clk/starfive/Kconfig                  |    9 +
 drivers/clk/starfive/Makefile                 |    3 +
 drivers/clk/starfive/clk-starfive-jh7100.c    |  689 +++++++++
 drivers/pinctrl/Kconfig                       |   17 +
 drivers/pinctrl/Makefile                      |    1 +
 drivers/pinctrl/pinctrl-starfive.c            | 1354 +++++++++++++++++
 drivers/reset/Kconfig                         |    7 +
 drivers/reset/Makefile                        |    1 +
 drivers/reset/reset-starfive-jh7100.c         |  176 +++
 drivers/tty/serial/8250/8250_dw.c             |    3 +
 include/dt-bindings/clock/starfive-jh7100.h   |  202 +++
 .../dt-bindings/pinctrl/pinctrl-starfive.h    |  275 ++++
 include/dt-bindings/reset/starfive-jh7100.h   |  126 ++
 27 files changed, 3700 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/starfive,jh7100-clkgen.yaml
 create mode 100644 Documentation/devicetree/bindings/pinctrl/starfive,jh7100-pinctrl.yaml
 create mode 100644 Documentation/devicetree/bindings/reset/starfive,jh7100-reset.yaml
 create mode 100644 arch/riscv/boot/dts/starfive/Makefile
 create mode 100644 arch/riscv/boot/dts/starfive/jh7100-beaglev-starlight.dts
 create mode 100644 arch/riscv/boot/dts/starfive/jh7100.dtsi
 create mode 100644 drivers/clk/starfive/Kconfig
 create mode 100644 drivers/clk/starfive/Makefile
 create mode 100644 drivers/clk/starfive/clk-starfive-jh7100.c
 create mode 100644 drivers/pinctrl/pinctrl-starfive.c
 create mode 100644 drivers/reset/reset-starfive-jh7100.c
 create mode 100644 include/dt-bindings/clock/starfive-jh7100.h
 create mode 100644 include/dt-bindings/pinctrl/pinctrl-starfive.h
 create mode 100644 include/dt-bindings/reset/starfive-jh7100.h

Comments

Arnd Bergmann Nov. 16, 2021, 4:07 p.m. UTC | #1
On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:
>
> This series adds support for the StarFive JH7100 RISC-V SoC. The SoC has
> many devices that need non-coherent dma operations to work which isn't
> upstream yet[1], so this just adds basic support to boot up, get a
> serial console, blink an LED and reboot itself. Unlike the Allwinner D1
> this chip doesn't use any extra pagetable bits, but instead the DDR RAM
> appears twice in the memory map, with and without the cache.
>
> The JH7100 is a test chip for the upcoming JH7110 and about 300 BeagleV
> Starlight Beta boards were sent out with them as part of a now cancelled
> BeagleBoard.org project. However StarFive has produced more of the
> JH7100s and more boards will be available[2] to buy. I've seen pictures
> of the new boards now, so hopefully before the end of the year.
>
> This series is also available at
> https://github.com/esmil/linux/commits/starlight-minimal
> ..but a more complete kernel including drivers for non-coherent
> peripherals based on this series can be found at
> https://github.com/starfive-tech/linux/tree/visionfive
>
> [1]: https://lore.kernel.org/linux-riscv/20210723214031.3251801-2-atish.patra@wdc.com/
> [2]: https://www.linkedin.com/pulse/starfive-release-open-source-single-board-platform-q3-2021-starfive/

Thanks for adding me to Cc, I've had a look at the series and didn't
see anything
wrong with it, and I'm happy to merge it through the SoC tree for the
initial support
in 5.17, provided you get an Ack from the arch/riscv maintainers for it.

One general (minor) comment about the patches: please put your own
'Signed-off-by'
into the last line of the patch description, below all the lines you
took from other people, so
instead of:

| Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>
| Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
| Acked-by: Rob Herring <robh@kernel.org>

do this:

| Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
| Acked-by: Rob Herring <robh@kernel.org>
| Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>

Regarding the coherency issue, it's a bit sad to see yet another hacky
workaround
in the hardware, but as you say this is unrelated to the driver
series. I'd actually
argue that this one isn't that different from the other hack you
describe, except
this steals the pagetable bits from the address instead of the reserved flags...

          Arnd
Andy Shevchenko Nov. 16, 2021, 4:13 p.m. UTC | #2
On Tue, Nov 16, 2021 at 6:09 PM Arnd Bergmann <arnd@arndb.de> wrote:
> On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:

...

> One general (minor) comment about the patches: please put your own
> 'Signed-off-by'
> into the last line of the patch description, below all the lines you
> took from other people, so
> instead of:
>
> | Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>
> | Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
> | Acked-by: Rob Herring <robh@kernel.org>
>
> do this:
>
> | Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
> | Acked-by: Rob Herring <robh@kernel.org>
> | Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>

Why?
Submitting Patches tells about chronological order and last SoB to be
from the submitter.
These both are correct. Note the difference between 'last SoB' and
'SoB to be last [line]'.

Here is the excerpt:
"Notably, the last Signed-off-by: must always be that of the developer
submitting the patch."
Arnd Bergmann Nov. 16, 2021, 4:44 p.m. UTC | #3
On Tue, Nov 16, 2021 at 5:13 PM Andy Shevchenko
<andy.shevchenko@gmail.com> wrote:
> On Tue, Nov 16, 2021 at 6:09 PM Arnd Bergmann <arnd@arndb.de> wrote:
> > On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:
>
> Why?
> Submitting Patches tells about chronological order and last SoB to be
> from the submitter.
> These both are correct. Note the difference between 'last SoB' and
> 'SoB to be last [line]'.
>
> Here is the excerpt:
> "Notably, the last Signed-off-by: must always be that of the developer
> submitting the patch."

I think having the S-o-b in the final line is far more common, and it does
help identify who added the other tags, i.e. the person signing off
immediately below. I don't reject patches that do this the other way round,
but it's something that felt unusual here.

         Arnd
Emil Renner Berthing Nov. 16, 2021, 5:01 p.m. UTC | #4
On Tue, 16 Nov 2021 at 17:44, Arnd Bergmann <arnd@arndb.de> wrote:
> On Tue, Nov 16, 2021 at 5:13 PM Andy Shevchenko
> <andy.shevchenko@gmail.com> wrote:
> > On Tue, Nov 16, 2021 at 6:09 PM Arnd Bergmann <arnd@arndb.de> wrote:
> > > On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:
> >
> > Why?
> > Submitting Patches tells about chronological order and last SoB to be
> > from the submitter.
> > These both are correct. Note the difference between 'last SoB' and
> > 'SoB to be last [line]'.
> >
> > Here is the excerpt:
> > "Notably, the last Signed-off-by: must always be that of the developer
> > submitting the patch."
>
> I think having the S-o-b in the final line is far more common, and it does
> help identify who added the other tags, i.e. the person signing off
> immediately below. I don't reject patches that do this the other way round,
> but it's something that felt unusual here.

Then I'll stick to what's most common. In any case patch 12 and 16 got
it wrong by both conventions.

/Emil
Emil Renner Berthing Nov. 16, 2021, 5:28 p.m. UTC | #5
On Tue, 16 Nov 2021 at 17:08, Arnd Bergmann <arnd@arndb.de> wrote:
> On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:
> >
> > This series adds support for the StarFive JH7100 RISC-V SoC. The SoC has
> > many devices that need non-coherent dma operations to work which isn't
> > upstream yet[1], so this just adds basic support to boot up, get a
> > serial console, blink an LED and reboot itself. Unlike the Allwinner D1
> > this chip doesn't use any extra pagetable bits, but instead the DDR RAM
> > appears twice in the memory map, with and without the cache.
> >
> > The JH7100 is a test chip for the upcoming JH7110 and about 300 BeagleV
> > Starlight Beta boards were sent out with them as part of a now cancelled
> > BeagleBoard.org project. However StarFive has produced more of the
> > JH7100s and more boards will be available[2] to buy. I've seen pictures
> > of the new boards now, so hopefully before the end of the year.
> >
> > This series is also available at
> > https://github.com/esmil/linux/commits/starlight-minimal
> > ..but a more complete kernel including drivers for non-coherent
> > peripherals based on this series can be found at
> > https://github.com/starfive-tech/linux/tree/visionfive
> >
> > [1]: https://lore.kernel.org/linux-riscv/20210723214031.3251801-2-atish.patra@wdc.com/
> > [2]: https://www.linkedin.com/pulse/starfive-release-open-source-single-board-platform-q3-2021-starfive/
>
> Thanks for adding me to Cc, I've had a look at the series and didn't
> see anything
> wrong with it, and I'm happy to merge it through the SoC tree for the
> initial support
> in 5.17, provided you get an Ack from the arch/riscv maintainers for it.

Cool!

@Palmer, do you mind looking through this? Probably patch 1, 15 and 16
are the most relevant to you.

> Regarding the coherency issue, it's a bit sad to see yet another hacky
> workaround
> in the hardware, but as you say this is unrelated to the driver
> series. I'd actually
> argue that this one isn't that different from the other hack you
> describe, except
> this steals the pagetable bits from the address instead of the reserved flags...

Yeah, it's definitely a hack, but at least it's not using bits the
spec said was reserved. Hopefully the JH7110 will be fully coherent or
maybe implement the new Svpbmt extension.

/Emil


/Emil
Palmer Dabbelt Nov. 27, 2021, 1:30 a.m. UTC | #6
On Tue, 16 Nov 2021 09:28:41 PST (-0800), kernel@esmil.dk wrote:
> On Tue, 16 Nov 2021 at 17:08, Arnd Bergmann <arnd@arndb.de> wrote:
>> On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:
>> >
>> > This series adds support for the StarFive JH7100 RISC-V SoC. The SoC has
>> > many devices that need non-coherent dma operations to work which isn't
>> > upstream yet[1], so this just adds basic support to boot up, get a
>> > serial console, blink an LED and reboot itself. Unlike the Allwinner D1
>> > this chip doesn't use any extra pagetable bits, but instead the DDR RAM
>> > appears twice in the memory map, with and without the cache.
>> >
>> > The JH7100 is a test chip for the upcoming JH7110 and about 300 BeagleV
>> > Starlight Beta boards were sent out with them as part of a now cancelled
>> > BeagleBoard.org project. However StarFive has produced more of the
>> > JH7100s and more boards will be available[2] to buy. I've seen pictures
>> > of the new boards now, so hopefully before the end of the year.
>> >
>> > This series is also available at
>> > https://github.com/esmil/linux/commits/starlight-minimal
>> > ..but a more complete kernel including drivers for non-coherent
>> > peripherals based on this series can be found at
>> > https://github.com/starfive-tech/linux/tree/visionfive
>> >
>> > [1]: https://lore.kernel.org/linux-riscv/20210723214031.3251801-2-atish.patra@wdc.com/
>> > [2]: https://www.linkedin.com/pulse/starfive-release-open-source-single-board-platform-q3-2021-starfive/
>>
>> Thanks for adding me to Cc, I've had a look at the series and didn't
>> see anything
>> wrong with it, and I'm happy to merge it through the SoC tree for the
>> initial support
>> in 5.17, provided you get an Ack from the arch/riscv maintainers for it.
>
> Cool!
>
> @Palmer, do you mind looking through this? Probably patch 1, 15 and 16
> are the most relevant to you.
>
>> Regarding the coherency issue, it's a bit sad to see yet another hacky
>> workaround
>> in the hardware, but as you say this is unrelated to the driver
>> series. I'd actually
>> argue that this one isn't that different from the other hack you
>> describe, except
>> this steals the pagetable bits from the address instead of the reserved flags...
>
> Yeah, it's definitely a hack, but at least it's not using bits the
> spec said was reserved. Hopefully the JH7110 will be fully coherent or
> maybe implement the new Svpbmt extension.

Sorry, this had been sitting on top of my inbox because I hadn't had a 
chance to figure this stuff out.  Emil poked me on IRC about it, but I 
figured I'd just write it here so everyone can see:

IMO there's a huge difference between the StarFive-flavored non-coherent 
stuff (which relies on physical aliasing) and the T-Head-flavored stuff 
(which uses page table bits): the PA-aliasing approach is allowed by the 
ISA, while the page table bits aren't (they're marked as reserved).  IMO 
we should still figure out a way to take the T-Head stuff, as it's the 
real-ist hardware we have, but that's a whole different can of worms.

My worry with this is I've yet to actually be convinced that either of 
these approaches work.  Specifically, neither of them prevents M-mode 
from performing (either directly or as a side effect of something like 
speculation) accesses that violate the attributes we're ascribing to 
regions in Linux.  IIRC I pointed that out in the Svpmbt patch set, 
which has exactly the same set of problems.

That said, I don't really care all that much -- having something here is 
better than nothing, and we've always relied on the HW vendors just 
producing HW that works when it comes to any of the IO stuff (ie, even 
on coherent systems).  These are all drivers so it's really up to those 
folks where the bar is, so as long as everyone's on the page about that 
you're not going to get any objections from me so

Acked-by: Palmer Dabbelt <palmer@rivosinc.com>

The SOC tree works for me.  It'd be great to have a shared tag I where I 
can pull in at least the Kconfig.socs stuff, but if that's not easy then 
it's no big deal -- what's in flight there is pretty trivial on my end, 
so we can just deal with the merge conflicts.

Thanks!
Emil Renner Berthing Nov. 28, 2021, 6:19 p.m. UTC | #7
On Sat, 27 Nov 2021 at 02:30, Palmer Dabbelt <palmer@rivosinc.com> wrote:
> On Tue, 16 Nov 2021 09:28:41 PST (-0800), kernel@esmil.dk wrote:
> > On Tue, 16 Nov 2021 at 17:08, Arnd Bergmann <arnd@arndb.de> wrote:
> >> On Tue, Nov 16, 2021 at 4:01 PM Emil Renner Berthing <kernel@esmil.dk> wrote:
> >> >
> >> > This series adds support for the StarFive JH7100 RISC-V SoC. The SoC has
> >> > many devices that need non-coherent dma operations to work which isn't
> >> > upstream yet[1], so this just adds basic support to boot up, get a
> >> > serial console, blink an LED and reboot itself. Unlike the Allwinner D1
> >> > this chip doesn't use any extra pagetable bits, but instead the DDR RAM
> >> > appears twice in the memory map, with and without the cache.
> >> >
> >> > The JH7100 is a test chip for the upcoming JH7110 and about 300 BeagleV
> >> > Starlight Beta boards were sent out with them as part of a now cancelled
> >> > BeagleBoard.org project. However StarFive has produced more of the
> >> > JH7100s and more boards will be available[2] to buy. I've seen pictures
> >> > of the new boards now, so hopefully before the end of the year.
> >> >
> >> > This series is also available at
> >> > https://github.com/esmil/linux/commits/starlight-minimal
> >> > ..but a more complete kernel including drivers for non-coherent
> >> > peripherals based on this series can be found at
> >> > https://github.com/starfive-tech/linux/tree/visionfive
> >> >
> >> > [1]: https://lore.kernel.org/linux-riscv/20210723214031.3251801-2-atish.patra@wdc.com/
> >> > [2]: https://www.linkedin.com/pulse/starfive-release-open-source-single-board-platform-q3-2021-starfive/
> >>
> >> Thanks for adding me to Cc, I've had a look at the series and didn't
> >> see anything
> >> wrong with it, and I'm happy to merge it through the SoC tree for the
> >> initial support
> >> in 5.17, provided you get an Ack from the arch/riscv maintainers for it.
> >
> > Cool!
> >
> > @Palmer, do you mind looking through this? Probably patch 1, 15 and 16
> > are the most relevant to you.
> >
> >> Regarding the coherency issue, it's a bit sad to see yet another hacky
> >> workaround
> >> in the hardware, but as you say this is unrelated to the driver
> >> series. I'd actually
> >> argue that this one isn't that different from the other hack you
> >> describe, except
> >> this steals the pagetable bits from the address instead of the reserved flags...
> >
> > Yeah, it's definitely a hack, but at least it's not using bits the
> > spec said was reserved. Hopefully the JH7110 will be fully coherent or
> > maybe implement the new Svpbmt extension.
>
> Sorry, this had been sitting on top of my inbox because I hadn't had a
> chance to figure this stuff out.  Emil poked me on IRC about it, but I
> figured I'd just write it here so everyone can see:
>
> IMO there's a huge difference between the StarFive-flavored non-coherent
> stuff (which relies on physical aliasing) and the T-Head-flavored stuff
> (which uses page table bits): the PA-aliasing approach is allowed by the
> ISA, while the page table bits aren't (they're marked as reserved).  IMO
> we should still figure out a way to take the T-Head stuff, as it's the
> real-ist hardware we have, but that's a whole different can of worms.
>
> My worry with this is I've yet to actually be convinced that either of
> these approaches work.  Specifically, neither of them prevents M-mode
> from performing (either directly or as a side effect of something like
> speculation) accesses that violate the attributes we're ascribing to
> regions in Linux.  IIRC I pointed that out in the Svpmbt patch set,
> which has exactly the same set of problems.
>
> That said, I don't really care all that much -- having something here is
> better than nothing, and we've always relied on the HW vendors just
> producing HW that works when it comes to any of the IO stuff (ie, even
> on coherent systems).  These are all drivers so it's really up to those
> folks where the bar is, so as long as everyone's on the page about that
> you're not going to get any objections from me so
>
> Acked-by: Palmer Dabbelt <palmer@rivosinc.com>

Thanks! Yeah, as you say something is better than nothing. I'd think
it's helpful to have something to build and test the non-coherent dma
functionality on, and the nice thing about the Starfive-flavour is
that it will actually boot into an initramfs root and have a working
serial console even without the non-coherent dmas working.

> The SOC tree works for me.  It'd be great to have a shared tag I where I
> can pull in at least the Kconfig.socs stuff, but if that's not easy then
> it's no big deal -- what's in flight there is pretty trivial on my end,
> so we can just deal with the merge conflicts.

I guess this is for the SoC maintainers to consider. Let me know if
that's wrong and I need to do anything.

/Emil