> Date: Fri, 7 Apr 2023 07:58:02 +1000
> From: David Gwynne <da...@gwynne.id.au>
> 
> the banana pi r2 pro has a usable sata port, but ahci wasnt finding
> anything attached to it.
> 
> the fdt glue looked like it assumed the boot loader did a lot of
> work to get things going. however, i havent figured out how to
> configure u-boot to do ahci, and quartz_uefi doesn't have ahci/sata
> working yet. the boot loaders arent quite there yet, so i tried to
> make the driver better.
> 
> the obvious tweak was to enable clocks and the phy, but that wasnt
> enough to get it working.
> 
> jared mcneill showed me the code he's been trying to get ahci working in
> quartz_uefi with, and it showed setting the ports implemented register.
> 
> the sata nodes in the rk356x device tree populates a ports-implemented
> property, which the yaml doco says can be provided if the platform/
> firmware doesnt init the register itself. i tried using that value
> instead of a PI read, and that didnt work. having the fdt glue set
> the register (like jmcneill does) before calling the bus independent
> code does work though.
> 
> so i see this now:
> 
> ahci0 at mainbus0: AHCI 1.3
> ahci0: port 0: 3.0Gb/s
> scsibus0 at ahci0: 32 targets
> sd0 at scsibus0 targ 0 lun 0: <ATA, MZ-5EA1000-0D3, AXM1> naa.5002538250006f47
> sd0: 95396MB, 512 bytes/sector, 195371568 sectors, thin
> 
> ok?

ok kettenis@

> Index: ahci_fdt.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/fdt/ahci_fdt.c,v
> retrieving revision 1.7
> diff -u -p -r1.7 ahci_fdt.c
> --- ahci_fdt.c        25 May 2022 03:03:58 -0000      1.7
> +++ ahci_fdt.c        6 Apr 2023 21:30:31 -0000
> @@ -30,6 +30,8 @@
>  #include <dev/ic/ahcivar.h>
>  
>  #include <dev/ofw/openfirm.h>
> +#include <dev/ofw/ofw_clock.h>
> +#include <dev/ofw/ofw_misc.h>
>  #include <dev/ofw/fdt.h>
>  
>  int  ahci_fdt_match(struct device *, void *, void *);
> @@ -63,6 +65,7 @@ ahci_fdt_attach(struct device *parent, s
>  {
>       struct ahci_softc *sc = (struct ahci_softc *) self;
>       struct fdt_attach_args *faa = aux;
> +     uint32_t pi;
>  
>       if (faa->fa_nreg < 1)
>               return;
> @@ -82,11 +85,19 @@ ahci_fdt_attach(struct device *parent, s
>               goto unmap;
>       }
>  
> +     clock_set_assigned(faa->fa_node);
> +     clock_enable_all(faa->fa_node);
> +     phy_enable(faa->fa_node, "sata-phy");
> +
> +     pi = OF_getpropint(faa->fa_node, "ports-implemented", 0x0);
> +     if (pi != 0)
> +             bus_space_write_4(sc->sc_iot, sc->sc_ioh, AHCI_REG_PI, pi);
> +
>       printf(":");
>  
>       if (ahci_attach(sc) != 0) {
>               /* error printed by ahci_attach */
> -             goto irq;
> +             goto irq; /* disable phy and clocks? */
>       }
>  
>       return;
> 

Reply via email to