k3-navss-ringacc-u-boot.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * U-Boot specific helpers for TI K3 AM65x NAVSS Ring accelerator
  4. * Manager (RA) subsystem driver
  5. *
  6. * Copyright (C) 2021 Texas Instruments Incorporated - https://www.ti.com
  7. */
  8. struct k3_nav_ring_cfg_regs {
  9. u32 resv_64[16];
  10. u32 ba_lo; /* Ring Base Address Lo Register */
  11. u32 ba_hi; /* Ring Base Address Hi Register */
  12. u32 size; /* Ring Size Register */
  13. u32 event; /* Ring Event Register */
  14. u32 orderid; /* Ring OrderID Register */
  15. };
  16. #define KNAV_RINGACC_CFG_REGS_STEP 0x100
  17. #define KNAV_RINGACC_CFG_RING_BA_HI_ADDR_HI_MASK GENMASK(15, 0)
  18. #define KNAV_RINGACC_CFG_RING_SIZE_QMODE_MASK GENMASK(31, 30)
  19. #define KNAV_RINGACC_CFG_RING_SIZE_QMODE_SHIFT (30)
  20. #define KNAV_RINGACC_CFG_RING_SIZE_ELSIZE_MASK GENMASK(26, 24)
  21. #define KNAV_RINGACC_CFG_RING_SIZE_ELSIZE_SHIFT (24)
  22. static void k3_ringacc_ring_reset_raw(struct k3_nav_ring *ring)
  23. {
  24. writel(0, &ring->cfg->size);
  25. }
  26. static void k3_ringacc_ring_reconfig_qmode_raw(struct k3_nav_ring *ring, enum k3_nav_ring_mode mode)
  27. {
  28. u32 val;
  29. val = readl(&ring->cfg->size);
  30. val &= KNAV_RINGACC_CFG_RING_SIZE_QMODE_MASK;
  31. val |= mode << KNAV_RINGACC_CFG_RING_SIZE_QMODE_SHIFT;
  32. writel(val, &ring->cfg->size);
  33. }
  34. static void k3_ringacc_ring_free_raw(struct k3_nav_ring *ring)
  35. {
  36. writel(0, &ring->cfg->ba_hi);
  37. writel(0, &ring->cfg->ba_lo);
  38. writel(0, &ring->cfg->size);
  39. }
  40. static void k3_nav_ringacc_ring_cfg_raw(struct k3_nav_ring *ring)
  41. {
  42. u32 val;
  43. writel(lower_32_bits(ring->ring_mem_dma), &ring->cfg->ba_lo);
  44. writel(upper_32_bits(ring->ring_mem_dma), &ring->cfg->ba_hi);
  45. val = ring->mode << KNAV_RINGACC_CFG_RING_SIZE_QMODE_SHIFT |
  46. ring->elm_size << KNAV_RINGACC_CFG_RING_SIZE_ELSIZE_SHIFT |
  47. ring->size;
  48. writel(val, &ring->cfg->size);
  49. }