|
@@ -124,6 +124,7 @@ struct k3_nav_ring_state {
|
|
|
/**
|
|
|
* struct k3_nav_ring - RA Ring descriptor
|
|
|
*
|
|
|
+ * @cfg - Ring configuration registers
|
|
|
* @rt - Ring control/status registers
|
|
|
* @fifos - Ring queues registers
|
|
|
* @ring_mem_dma - Ring buffer dma address
|
|
@@ -138,6 +139,7 @@ struct k3_nav_ring_state {
|
|
|
* @use_count - Use count for shared rings
|
|
|
*/
|
|
|
struct k3_nav_ring {
|
|
|
+ struct k3_nav_ring_cfg_regs __iomem *cfg;
|
|
|
struct k3_nav_ring_rt_regs __iomem *rt;
|
|
|
struct k3_nav_ring_fifo_regs __iomem *fifos;
|
|
|
dma_addr_t ring_mem_dma;
|
|
@@ -195,6 +197,8 @@ struct k3_nav_ringacc {
|
|
|
bool dual_ring;
|
|
|
};
|
|
|
|
|
|
+#include "k3-navss-ringacc-u-boot.c"
|
|
|
+
|
|
|
static int k3_nav_ringacc_ring_read_occ(struct k3_nav_ring *ring)
|
|
|
{
|
|
|
return readl(&ring->rt->occ) & KNAV_RINGACC_RT_OCC_MASK;
|
|
@@ -330,6 +334,9 @@ static void k3_ringacc_ring_reset_sci(struct k3_nav_ring *ring)
|
|
|
struct k3_nav_ringacc *ringacc = ring->parent;
|
|
|
int ret;
|
|
|
|
|
|
+ if (IS_ENABLED(CONFIG_K3_DM_FW))
|
|
|
+ return k3_ringacc_ring_reset_raw(ring);
|
|
|
+
|
|
|
ret = ringacc->tisci_ring_ops->config(
|
|
|
ringacc->tisci,
|
|
|
TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID,
|
|
@@ -362,6 +369,9 @@ static void k3_ringacc_ring_reconfig_qmode_sci(struct k3_nav_ring *ring,
|
|
|
struct k3_nav_ringacc *ringacc = ring->parent;
|
|
|
int ret;
|
|
|
|
|
|
+ if (IS_ENABLED(CONFIG_K3_DM_FW))
|
|
|
+ return k3_ringacc_ring_reconfig_qmode_raw(ring, mode);
|
|
|
+
|
|
|
ret = ringacc->tisci_ring_ops->config(
|
|
|
ringacc->tisci,
|
|
|
TI_SCI_MSG_VALUE_RM_RING_MODE_VALID,
|
|
@@ -442,6 +452,9 @@ static void k3_ringacc_ring_free_sci(struct k3_nav_ring *ring)
|
|
|
struct k3_nav_ringacc *ringacc = ring->parent;
|
|
|
int ret;
|
|
|
|
|
|
+ if (IS_ENABLED(CONFIG_K3_DM_FW))
|
|
|
+ return k3_ringacc_ring_free_raw(ring);
|
|
|
+
|
|
|
ret = ringacc->tisci_ring_ops->config(
|
|
|
ringacc->tisci,
|
|
|
TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER,
|
|
@@ -531,11 +544,21 @@ static int k3_nav_ringacc_ring_cfg_sci(struct k3_nav_ring *ring)
|
|
|
ring->mode,
|
|
|
ring->elm_size,
|
|
|
0);
|
|
|
- if (ret)
|
|
|
+ if (ret) {
|
|
|
dev_err(ringacc->dev, "TISCI config ring fail (%d) ring_idx %d\n",
|
|
|
ret, ring_idx);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
- return ret;
|
|
|
+ /*
|
|
|
+ * Above TI SCI call handles firewall configuration, cfg
|
|
|
+ * register configuration still has to be done locally in
|
|
|
+ * absence of RM services.
|
|
|
+ */
|
|
|
+ if (IS_ENABLED(CONFIG_K3_DM_FW))
|
|
|
+ k3_nav_ringacc_ring_cfg_raw(ring);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int k3_dmaring_ring_cfg(struct k3_nav_ring *ring, struct k3_nav_ring_cfg *cfg)
|
|
@@ -951,13 +974,18 @@ static int k3_nav_ringacc_probe_dt(struct k3_nav_ringacc *ringacc)
|
|
|
|
|
|
static int k3_nav_ringacc_init(struct udevice *dev, struct k3_nav_ringacc *ringacc)
|
|
|
{
|
|
|
- void __iomem *base_rt;
|
|
|
+ void __iomem *base_cfg, *base_rt;
|
|
|
int ret, i;
|
|
|
|
|
|
ret = k3_nav_ringacc_probe_dt(ringacc);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
+ base_cfg = dev_remap_addr_name(dev, "cfg");
|
|
|
+ pr_debug("cfg %p\n", base_cfg);
|
|
|
+ if (!base_cfg)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
base_rt = (uint32_t *)devfdt_get_addr_name(dev, "rt");
|
|
|
pr_debug("rt %p\n", base_rt);
|
|
|
if (IS_ERR(base_rt))
|
|
@@ -975,6 +1003,8 @@ static int k3_nav_ringacc_init(struct udevice *dev, struct k3_nav_ringacc *ringa
|
|
|
return -ENOMEM;
|
|
|
|
|
|
for (i = 0; i < ringacc->num_rings; i++) {
|
|
|
+ ringacc->rings[i].cfg = base_cfg +
|
|
|
+ KNAV_RINGACC_CFG_REGS_STEP * i;
|
|
|
ringacc->rings[i].rt = base_rt +
|
|
|
KNAV_RINGACC_RT_REGS_STEP * i;
|
|
|
ringacc->rings[i].parent = ringacc;
|