On Mon, 22 Jul 2024 at 11:56, Philippe Mathieu-Daudé <phi...@linaro.org> wrote:
>
> On 19/7/24 22:21, Mark Cave-Ayland wrote:
> > On 19/07/2024 16:16, Philippe Mathieu-Daudé wrote:
> >
> >> FIFOs can be resized at runtime. Introduce the
> >> fifo8_change_capacity() method to do that.
> >> When capacity is changed, the FIFO must be reset.
> >>
> >> Signed-off-by: Philippe Mathieu-Daudé <phi...@linaro.org>
> >> ---
> >>   include/qemu/fifo8.h | 10 ++++++++++
> >>   util/fifo8.c         |  7 +++++++
> >>   2 files changed, 17 insertions(+)
> >>
> >> diff --git a/include/qemu/fifo8.h b/include/qemu/fifo8.h
> >> index c6295c6ff0..9fe0555a24 100644
> >> --- a/include/qemu/fifo8.h
> >> +++ b/include/qemu/fifo8.h
> >> @@ -31,6 +31,16 @@ void fifo8_create(Fifo8 *fifo, uint32_t capacity);
> >>   void fifo8_destroy(Fifo8 *fifo);
> >> +/**
> >> + * fifo8_change_capacity:
> >> + * @fifo: struct Fifo8 to change the capacity
> >> + * @capacity: new capacity of the FIFO
> >> + *
> >> + * Change a FIFO capacity to the specified size. The FIFO is reset.
> >> + */
> >> +
> >> +void fifo8_change_capacity(Fifo8 *fifo, uint32_t capacity);
> >> +
> >>   /**
> >>    * fifo8_push:
> >>    * @fifo: FIFO to push to
> >> diff --git a/util/fifo8.c b/util/fifo8.c
> >> index 2925fe5611..c453afd774 100644
> >> --- a/util/fifo8.c
> >> +++ b/util/fifo8.c
> >> @@ -34,6 +34,13 @@ void fifo8_destroy(Fifo8 *fifo)
> >>       g_free(fifo->data);
> >>   }
> >> +void fifo8_change_capacity(Fifo8 *fifo, uint32_t capacity)
> >> +{
> >> +    fifo->data = g_renew(uint8_t, fifo->data, capacity);
> >> +    fifo->capacity = capacity;
> >> +    fifo8_reset(fifo);
> >> +}
> >> +
> >>   void fifo8_push(Fifo8 *fifo, uint8_t data)
> >>   {
> >>       assert(fifo->num < fifo->capacity);
> >
> > The changes look okay, however I'm a little confused as to why this is
> > needed as generally hardware FIFOs are a fixed size? Presumably this is
> > related to the PL011 series?
>
> Indeed, this is to model trying to stay as close as possible to
> the datasheet, which states:
>
>    2.4.3 UART operation
>
>      Disabling the FIFOs
>
>        Additionally, you can disable the FIFOs. In this case,
>        the transmit and receive sides of the UART have 1-byte
>        holding registers (the bottom entry of the FIFOs). The
>        overrun bit is set when a word has been received, and
>        the previous one was not yet read. In this implementation,
>        the FIFOs are not physically disabled, but the flags are
>        manipulated to give the illusion of a 1-byte register.

Notice that in the hardware we don't actually resize the FIFO,
though -- we just only ever keep one element in it...

thanks
-- PMM

Reply via email to