summaryrefslogtreecommitdiff
path: root/drivers/soc/ti/k3-navss-ringacc-u-boot.c
blob: 5d650b9de799e39463d471a22c73f0486d821b2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// SPDX-License-Identifier: GPL-2.0+
/*
 * U-Boot specific helpers for TI K3 AM65x NAVSS Ring accelerator
 * Manager (RA) subsystem driver
 *
 * Copyright (C) 2021 Texas Instruments Incorporated - https://www.ti.com
 */

struct k3_nav_ring_cfg_regs {
	u32	resv_64[16];
	u32	ba_lo;		/* Ring Base Address Lo Register */
	u32	ba_hi;		/* Ring Base Address Hi Register */
	u32	size;		/* Ring Size Register */
	u32	event;		/* Ring Event Register */
	u32	orderid;	/* Ring OrderID Register */
};

#define KNAV_RINGACC_CFG_REGS_STEP	0x100

#define KNAV_RINGACC_CFG_RING_BA_HI_ADDR_HI_MASK	GENMASK(15, 0)

#define KNAV_RINGACC_CFG_RING_SIZE_QMODE_MASK		GENMASK(31, 30)
#define KNAV_RINGACC_CFG_RING_SIZE_QMODE_SHIFT		(30)

#define KNAV_RINGACC_CFG_RING_SIZE_ELSIZE_MASK		GENMASK(26, 24)
#define KNAV_RINGACC_CFG_RING_SIZE_ELSIZE_SHIFT		(24)

#define KNAV_RINGACC_CFG_RING_SIZE_MASK			GENMASK(15, 0)

static void k3_ringacc_ring_reset_raw(struct k3_nav_ring *ring)
{
	u32 reg;

	reg = readl(&ring->cfg->size);
	reg &= KNAV_RINGACC_CFG_RING_SIZE_MASK;
	reg |= ring->size;
	writel(reg, &ring->cfg->size);
}

static void k3_ringacc_ring_reconfig_qmode_raw(struct k3_nav_ring *ring, enum k3_nav_ring_mode mode)
{
	u32 val;

	val = readl(&ring->cfg->size);
	val &= KNAV_RINGACC_CFG_RING_SIZE_QMODE_MASK;
	val |= mode << KNAV_RINGACC_CFG_RING_SIZE_QMODE_SHIFT;
	writel(val, &ring->cfg->size);
}

static void k3_ringacc_ring_free_raw(struct k3_nav_ring *ring)
{
	writel(0, &ring->cfg->ba_hi);
	writel(0, &ring->cfg->ba_lo);
	writel(0, &ring->cfg->size);
}

static void k3_nav_ringacc_ring_cfg_raw(struct k3_nav_ring *ring)
{
	u32 val;

	writel(lower_32_bits(ring->ring_mem_dma), &ring->cfg->ba_lo);
	writel(upper_32_bits(ring->ring_mem_dma), &ring->cfg->ba_hi);

	val = ring->mode << KNAV_RINGACC_CFG_RING_SIZE_QMODE_SHIFT |
	      ring->elm_size << KNAV_RINGACC_CFG_RING_SIZE_ELSIZE_SHIFT |
	      ring->size;
	writel(val, &ring->cfg->size);
}