[U-Boot] [PATCH v5 075/101] spi: ich: Add TPL support

Simon Glass sjg at chromium.org
Thu Nov 28 02:22:57 UTC 2019


Hi Bin,

On Wed, 27 Nov 2019 at 00:16, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi Simon,
>
> On Mon, Nov 25, 2019 at 12:12 PM Simon Glass <sjg at chromium.org> wrote:
> >
> > In TPL we want to reduce code size and support running with CONFIG_PCI
> > disabled. Add special code to handle this using a fixed BAR programmed
> > into the SPI on boot. Also cache the SPI flash to speed up boot.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > Changes in v5: None
> > Changes in v4: None
> > Changes in v3: None
> > Changes in v2: None
> >
> >  drivers/spi/ich.c | 46 ++++++++++++++++++++++++++++++++++++++++++----
> >  1 file changed, 42 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/spi/ich.c b/drivers/spi/ich.c
> > index ebf369f215..02601e9125 100644
> > --- a/drivers/spi/ich.c
> > +++ b/drivers/spi/ich.c
> > @@ -19,8 +19,10 @@
> >  #include <spi.h>
> >  #include <spi_flash.h>
> >  #include <spi-mem.h>
> > +#include <spl.h>
> >  #include <asm/fast_spi.h>
> >  #include <asm/io.h>
> > +#include <asm/mtrr.h>
> >
> >  #include "ich.h"
> >
> > @@ -115,6 +117,8 @@ static bool ich9_can_do_33mhz(struct udevice *dev)
> >         struct ich_spi_priv *priv = dev_get_priv(dev);
> >         u32 fdod, speed;
> >
> > +       if (!CONFIG_IS_ENABLED(PCI))
> > +               return false;
> >         /* Observe SPI Descriptor Component Section 0 */
> >         dm_pci_write_config32(priv->pch, 0xb0, 0x1000);
> >
> > @@ -706,6 +710,15 @@ static int ich_init_controller(struct udevice *dev,
> >                                struct ich_spi_platdata *plat,
> >                                struct ich_spi_priv *ctlr)
> >  {
> > +       if (spl_phase() == PHASE_TPL) {
> > +               struct ich_spi_platdata *plat = dev_get_platdata(dev);
> > +               int ret;
> > +
> > +               ret = fast_spi_early_init(plat->bdf, plat->mmio_base);
> > +               if (ret)
> > +                       return ret;
> > +       }
> > +
> >         ctlr->base = (void *)plat->mmio_base;
> >         if (plat->ich_version == ICHV_7) {
> >                 struct ich7_spi_regs *ich7_spi = ctlr->base;
> > @@ -754,6 +767,25 @@ static int ich_init_controller(struct udevice *dev,
> >         return 0;
> >  }
> >
> > +static int ich_cache_bios_region(struct udevice *dev)
> > +{
> > +       ulong map_base;
> > +       uint map_size;
> > +       uint offset;
> > +       ulong base;
> > +       int ret;
> > +
> > +       ret = ich_get_mmap_bus(dev, &map_base, &map_size, &offset);
> > +       if (ret)
> > +               return ret;
> > +
> > +       base = (4ULL << 30) - map_size;
>
> Can we define a macro for this? MEM_4G?

OK.

>
> > +       mtrr_set_next_var(MTRR_TYPE_WRPROT, base, map_size);
>
> Should this be MTRR_TYPE_WRBACK?

Well you are not supposed to write to SPI flash, at least not in these
early stages. I think the hardware sequencer supports it though.


>
> > +       log_debug("BIOS cache base=%lx, size=%x\n", base, (uint)map_size);
> > +
> > +       return 0;
> > +}
> > +
> >  static int ich_spi_probe(struct udevice *dev)
> >  {
> >         struct ich_spi_platdata *plat = dev_get_platdata(dev);
> > @@ -764,10 +796,16 @@ static int ich_spi_probe(struct udevice *dev)
> >         if (ret)
> >                 return ret;
> >
> > -       ret = ich_protect_lockdown(dev);
> > -       if (ret)
> > -               return ret;
> > -
> > +       if (spl_phase() == PHASE_TPL) {
> > +               /* Cache the BIOS to speed things up */
> > +               ret = ich_cache_bios_region(dev);
> > +               if (ret)
> > +                       return ret;
> > +       } else {
> > +               ret = ich_protect_lockdown(dev);
> > +               if (ret)
> > +                       return ret;
> > +       }
> >         priv->cur_speed = priv->max_speed;
> >
> >         return 0;
> > --
>

Regards,
Simon


More information about the U-Boot mailing list