[Pdbg] [PATCH 13/18] libsbefifo: Update sram get/put api

Joel Stanley joel at jms.id.au
Mon Sep 28 16:02:06 AEST 2020


On Thu, 24 Sep 2020 at 04:43, Amitay Isaacs <amitay at ozlabs.org> wrote:
>
> Since occsram_{get|put} api was not used for P9, rename it as per P10
> change.
>
> Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>

Reviewed-by: Joel Stanley <joel at jms.id.au>

> ---
>  libsbefifo/cmd_memory.c      | 75 ++++++++++++++++++++++--------------
>  libsbefifo/libsbefifo.h      |  5 ++-
>  libsbefifo/sbefifo_private.h |  4 +-
>  3 files changed, 52 insertions(+), 32 deletions(-)
>
> diff --git a/libsbefifo/cmd_memory.c b/libsbefifo/cmd_memory.c
> index 47d4de7..4195a12 100644
> --- a/libsbefifo/cmd_memory.c
> +++ b/libsbefifo/cmd_memory.c
> @@ -219,11 +219,11 @@ int sbefifo_mem_put(struct sbefifo_context *sctx, uint64_t addr, uint8_t *data,
>         return rc;
>  }
>
> -static int sbefifo_occsram_get_push(uint32_t addr, uint32_t size, uint8_t mode, uint8_t **buf, uint32_t *buflen)
> +static int sbefifo_sram_get_push(uint16_t chiplet_id, uint64_t addr, uint32_t size, uint8_t mode, uint8_t **buf, uint32_t *buflen)
>  {
>         uint32_t *msg;
> -       uint32_t nwords, cmd;
> -       uint32_t start_addr, end_addr;
> +       uint32_t nwords, cmd, flags;
> +       uint64_t start_addr, end_addr;
>         uint32_t align, len;
>
>         align = 8;
> @@ -233,29 +233,32 @@ static int sbefifo_occsram_get_push(uint32_t addr, uint32_t size, uint8_t mode,
>         if (end_addr < start_addr)
>                 return EINVAL;
>
> -       nwords = 5;
> +       nwords = 6;
>         *buflen = nwords * sizeof(uint32_t);
>         msg = malloc(*buflen);
>         if (!msg)
>                 return ENOMEM;
>
> -       len = end_addr - start_addr;
> +       len = (end_addr - start_addr) / 8;
> +
> +       cmd = SBEFIFO_CMD_CLASS_MEMORY | SBEFIFO_CMD_GET_SRAM;
>
> -       cmd = SBEFIFO_CMD_CLASS_MEMORY | SBEFIFO_CMD_GET_OCCSRAM;
> +       flags = ((uint32_t)chiplet_id << 16 | (uint32_t)mode);
>
>         msg[0] = htobe32(nwords);
>         msg[1] = htobe32(cmd);
> -       msg[2] = htobe32(mode);
> -       msg[3] = htobe32(start_addr);
> -       msg[4] = htobe32(len);
> +       msg[2] = htobe32(flags);
> +       msg[3] = htobe32(start_addr >> 32);
> +       msg[4] = htobe32(start_addr & 0xffffffff);
> +       msg[5] = htobe32(len);
>
>         *buf = (uint8_t *)msg;
>         return 0;
>  }
>
> -static int sbefifo_occsram_get_pull(uint8_t *buf, uint32_t buflen, uint32_t addr, uint32_t size, uint8_t **data, uint32_t *data_len)
> +static int sbefifo_sram_get_pull(uint8_t *buf, uint32_t buflen, uint64_t addr, uint32_t size, uint8_t **data, uint32_t *data_len)
>  {
> -       uint32_t start_addr;
> +       uint64_t start_addr;
>         uint32_t align, offset;
>
>         if (buflen < 4)
> @@ -278,19 +281,22 @@ static int sbefifo_occsram_get_pull(uint8_t *buf, uint32_t buflen, uint32_t addr
>         return 0;
>  }
>
> -int sbefifo_occsram_get(struct sbefifo_context *sctx, uint32_t addr, uint32_t size, uint8_t mode, uint8_t **data, uint32_t *data_len)
> +int sbefifo_sram_get(struct sbefifo_context *sctx, uint16_t chiplet_id, uint64_t addr, uint32_t size, uint8_t mode, uint8_t **data, uint32_t *data_len)
>  {
>         uint8_t *msg, *out;
>         uint32_t msg_len, out_len;
>         uint32_t len;
>         int rc;
>
> -       rc = sbefifo_occsram_get_push(addr, size, mode, &msg, &msg_len);
> +       if (sctx->proc == SBEFIFO_PROC_P9)
> +               return ENOSYS;
> +
> +       rc = sbefifo_sram_get_push(chiplet_id, addr, size, mode, &msg, &msg_len);
>         if (rc)
>                 return rc;
>
> -       /* length is 5th word in the request */
> -       len = be32toh(*(uint32_t *)(msg + 16));
> +       /* length is 6th word in the request */
> +       len = be32toh(*(uint32_t *)(msg + 20));
>
>         out_len = len + 4;
>         rc = sbefifo_operation(sctx, msg, msg_len, &out, &out_len);
> @@ -298,18 +304,19 @@ int sbefifo_occsram_get(struct sbefifo_context *sctx, uint32_t addr, uint32_t si
>         if (rc)
>                 return rc;
>
> -       rc = sbefifo_occsram_get_pull(out, out_len, addr, size, data, data_len);
> +       rc = sbefifo_sram_get_pull(out, out_len, addr, size, data, data_len);
>         if (out)
>                 free(out);
>
>         return rc;
>  }
>
> -static int sbefifo_occsram_put_push(uint32_t addr, uint8_t *data, uint32_t data_len, uint8_t mode, uint8_t **buf, uint32_t *buflen)
> +static int sbefifo_sram_put_push(uint16_t chiplet_id, uint64_t addr, uint8_t *data, uint32_t data_len, bool multicast, uint8_t mode, uint8_t **buf, uint32_t *buflen)
>  {
>         uint32_t *msg;
> -       uint32_t nwords, cmd;
> -       uint32_t align;
> +       uint32_t nwords, cmd, flags;
> +       uint32_t align, len;
> +       uint8_t multicast_bit;
>
>         align = 8;
>
> @@ -319,26 +326,35 @@ static int sbefifo_occsram_put_push(uint32_t addr, uint8_t *data, uint32_t data_
>         if (data_len & (align-1))
>                 return EINVAL;
>
> -       nwords = 5 + data_len/4;
> +       nwords = 6 + data_len/4;
>         *buflen = nwords * sizeof(uint32_t);
>         msg = malloc(*buflen);
>         if (!msg)
>                 return ENOMEM;
>
> -       cmd = SBEFIFO_CMD_CLASS_MEMORY | SBEFIFO_CMD_PUT_OCCSRAM;
> +       multicast_bit = multicast ? 0x80 : 0x00;
> +
> +       cmd = SBEFIFO_CMD_CLASS_MEMORY | SBEFIFO_CMD_PUT_SRAM;
> +
> +       flags = ((uint32_t)chiplet_id << 16) |
> +               ((uint32_t)multicast_bit << 8) |
> +               (uint32_t)mode;
> +
> +       len = data_len / 8;
>
>         msg[0] = htobe32(nwords);
>         msg[1] = htobe32(cmd);
> -       msg[2] = htobe32(mode);
> -       msg[3] = htobe32(addr);
> -       msg[4] = htobe32(data_len);
> +       msg[2] = htobe32(flags);
> +       msg[3] = htobe32(addr >> 32);
> +       msg[4] = htobe32(addr & 0xffffffff);
> +       msg[5] = htobe32(len);
>         memcpy(&msg[5], data, data_len);
>
>         *buf = (uint8_t *)msg;
>         return 0;
>  }
>
> -static int sbefifo_occsram_put_pull(uint8_t *buf, uint32_t buflen)
> +static int sbefifo_sram_put_pull(uint8_t *buf, uint32_t buflen)
>  {
>         if (buflen != sizeof(uint32_t))
>                 return EPROTO;
> @@ -346,13 +362,16 @@ static int sbefifo_occsram_put_pull(uint8_t *buf, uint32_t buflen)
>         return 0;
>  }
>
> -int sbefifo_occsram_put(struct sbefifo_context *sctx, uint32_t addr, uint8_t *data, uint32_t data_len, uint8_t mode)
> +int sbefifo_sram_put(struct sbefifo_context *sctx, uint16_t chiplet_id, uint64_t addr, uint8_t *data, uint32_t data_len, bool multicast, uint8_t mode)
>  {
>         uint8_t *msg, *out;
>         uint32_t msg_len, out_len;
>         int rc;
>
> -       rc = sbefifo_occsram_put_push(addr, data, data_len, mode, &msg, &msg_len);
> +       if (sctx->proc == SBEFIFO_PROC_P9)
> +               return ENOSYS;
> +
> +       rc = sbefifo_sram_put_push(chiplet_id, addr, data, data_len, multicast, mode, &msg, &msg_len);
>         if (rc)
>                 return rc;
>
> @@ -362,7 +381,7 @@ int sbefifo_occsram_put(struct sbefifo_context *sctx, uint32_t addr, uint8_t *da
>         if (rc)
>                 return rc;
>
> -       rc = sbefifo_occsram_put_pull(out, out_len);
> +       rc = sbefifo_sram_put_pull(out, out_len);
>         if (out)
>                 free(out);
>
> diff --git a/libsbefifo/libsbefifo.h b/libsbefifo/libsbefifo.h
> index b464069..74ea2b3 100644
> --- a/libsbefifo/libsbefifo.h
> +++ b/libsbefifo/libsbefifo.h
> @@ -18,6 +18,7 @@
>  #define __LIBSBEFIFO_H__
>
>  #include <stdint.h>
> +#include <stdbool.h>
>
>  #define ESBEFIFO       201
>
> @@ -146,8 +147,8 @@ int sbefifo_mem_put(struct sbefifo_context *sctx, uint64_t addr, uint8_t *data,
>  #define SBEFIFO_MEMORY_MODE_DEBUG       0x02
>  #define SBEFIFO_MEMORY_MODE_CIRCULAR    0x03
>
> -int sbefifo_occsram_get(struct sbefifo_context *sctx, uint32_t addr, uint32_t size, uint8_t mode, uint8_t **data, uint32_t *data_len);
> -int sbefifo_occsram_put(struct sbefifo_context *sctx, uint32_t addr, uint8_t *data, uint32_t data_len, uint8_t mode);
> +int sbefifo_sram_get(struct sbefifo_context *sctx, uint16_t chiplet_id, uint64_t addr, uint32_t size, uint8_t mode, uint8_t **data, uint32_t *data_len);
> +int sbefifo_sram_put(struct sbefifo_context *sctx, uint16_t chiplet_id, uint64_t addr, uint8_t *data, uint32_t data_len, bool multicast, uint8_t mode);
>
>  #define SBEFIFO_REGISTER_TYPE_GPR      0x0
>  #define SBEFIFO_REGISTER_TYPE_SPR      0x1
> diff --git a/libsbefifo/sbefifo_private.h b/libsbefifo/sbefifo_private.h
> index 5c9b10a..d3f6a8b 100644
> --- a/libsbefifo/sbefifo_private.h
> +++ b/libsbefifo/sbefifo_private.h
> @@ -39,8 +39,8 @@
>  #define SBEFIFO_CMD_CLASS_MEMORY         0xA400
>  #define   SBEFIFO_CMD_GET_MEMORY           0x01
>  #define   SBEFIFO_CMD_PUT_MEMORY           0x02
> -#define   SBEFIFO_CMD_GET_OCCSRAM          0x03
> -#define   SBEFIFO_CMD_PUT_OCCSRAM          0x04
> +#define   SBEFIFO_CMD_GET_SRAM             0x03
> +#define   SBEFIFO_CMD_PUT_SRAM             0x04
>
>  #define SBEFIFO_CMD_CLASS_REGISTER       0xA500
>  #define   SBEFIFO_CMD_GET_REGISTER         0x01
> --
> 2.26.2
>
> --
> Pdbg mailing list
> Pdbg at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/pdbg


More information about the Pdbg mailing list