qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH] ssi: xilinx_spips: Filter the non spi registers transactions


From: Sai Pavan Boddu
Subject: RE: [PATCH] ssi: xilinx_spips: Filter the non spi registers transactions
Date: Thu, 17 Oct 2019 06:57:42 +0000

Hi Alistair,

> -----Original Message-----
> From: Alistair Francis <address@hidden>
> Sent: Thursday, October 17, 2019 4:39 AM
> To: Sai Pavan Boddu <address@hidden>
> Cc: Alistair Francis <address@hidden>; Peter Maydell
> <address@hidden>; address@hidden Developers <qemu-
> address@hidden>
> Subject: Re: [PATCH] ssi: xilinx_spips: Filter the non spi registers 
> transactions
> 
> On Sun, Oct 13, 2019 at 11:51 PM Sai Pavan Boddu
> <address@hidden> wrote:
> >
> > ZynqMP/Versal specific qspi registers should be handled inside
> > zynqmp_qspi_read/write calls. When few of these transactions are
> > handled by spi hooks we see state change in spi bus unexpectedly.
> >
> > Signed-off-by: Sai Pavan Boddu <address@hidden>
> > ---
> >  hw/ssi/xilinx_spips.c | 26 ++++++++++++++++++++++++--
> >  1 file changed, 24 insertions(+), 2 deletions(-)
> >
> > diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c index
> > a309c71..4f9f8e0 100644
> > --- a/hw/ssi/xilinx_spips.c
> > +++ b/hw/ssi/xilinx_spips.c
> > @@ -109,6 +109,7 @@
> >  #define R_GPIO              (0x30 / 4)
> >  #define R_LPBK_DLY_ADJ      (0x38 / 4)
> >  #define R_LPBK_DLY_ADJ_RESET (0x33)
> > +#define R_IOU_TAPDLY_BYPASS (0x3C / 4)
> >  #define R_TXD1              (0x80 / 4)
> >  #define R_TXD2              (0x84 / 4)
> >  #define R_TXD3              (0x88 / 4)
> > @@ -139,6 +140,8 @@
> >  #define R_LQSPI_STS         (0xA4 / 4)
> >  #define LQSPI_STS_WR_RECVD      (1 << 1)
> >
> > +#define R_DUMMY_CYCLE_EN    (0xC8 / 4)
> > +#define R_ECO               (0xF8 / 4)
> >  #define R_MOD_ID            (0xFC / 4)
> >
> >  #define R_GQSPI_SELECT          (0x144 / 4)
> > @@ -938,7 +941,16 @@ static uint64_t xlnx_zynqmp_qspips_read(void
> *opaque,
> >      int shortfall;
> >
> >      if (reg <= R_MOD_ID) {
> > -        return xilinx_spips_read(opaque, addr, size);
> > +        switch (addr) {
> > +        case R_GPIO:
> > +        case R_LPBK_DLY_ADJ:
> > +        case R_IOU_TAPDLY_BYPASS:
> > +        case R_DUMMY_CYCLE_EN:
> > +        case R_ECO:
> > +            return s->regs[addr / 4];
> > +        default:
> > +            return xilinx_spips_read(opaque, addr, size);
> 
> This doesn't seem right. This should have no functional change for the read
> function and has the consequence of not printing the memory accesses. If
> you try to debug this code now you won't see all of these operations in the
> log.
[Sai Pavan Boddu] Yeah reads do not have any issue. But I see your point of 
debug prints.
> 
> > +        }
> >      } else {
> >          switch (reg) {
> >          case R_GQSPI_RXD:
> > @@ -1063,7 +1075,17 @@ static void xlnx_zynqmp_qspips_write(void
> *opaque, hwaddr addr,
> >      uint32_t reg = addr / 4;
> >
> >      if (reg <= R_MOD_ID) {
> > -        xilinx_qspips_write(opaque, addr, value, size);
> > +        switch (reg) {
> > +        case R_GPIO:
> > +        case R_LPBK_DLY_ADJ:
> > +        case R_IOU_TAPDLY_BYPASS:
> > +        case R_DUMMY_CYCLE_EN:
> > +        case R_ECO:
> > +            s->regs[addr] = value;
> > +            break;
> > +        default:
> > +            xilinx_qspips_write(opaque, addr, value, size);
> > +        }
> 
> For the write code it looks like this skips the "no_reg_update" goto.
> Maybe that is the issue that you are seeing?
[Sai Pavan Boddu] yes, no_reg_update triggers update of cs lines.
We can also put a check there to skip no_reg_update when it’s a zynqmp qspi.
I will try that and send a V2.

Thanks
Sai Pavan
> 
> Alistair
> 
> >      } else {
> >          switch (reg) {
> >          case R_GQSPI_CNFG:
> > --
> > 2.7.4
> >
> >

reply via email to

[Prev in Thread] Current Thread [Next in Thread]