Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff6155fa authored by Sarada Prasanna Garnayak's avatar Sarada Prasanna Garnayak Committed by Gerrit - the friendly Code Review server
Browse files

ath10k: define structure for the copy engine CTRL_1 regs



Define a structure for the copy engine CTRL_1 register
source, destination and dmax ring. This adds support to
avoid the conditional compilation, code optimization and
dynamic configuration of the copy engine register map
for respective hardware bus interface.

Change-Id: Ic0a4190b0735fb5d905ea75ac71e8060260dde74
Signed-off-by: default avatarSarada Prasanna Garnayak <sgarna@codeaurora.org>
parent e42e488a
Loading
Loading
Loading
Loading
+18 −12
Original line number Diff line number Diff line
@@ -151,12 +151,14 @@ static inline void ath10k_ce_src_ring_dmax_set(struct ath10k *ar,
					       unsigned int n)
{
	struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
	struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs;

	u32 ctrl1_addr = ar_opaque->bus_ops->read32((ar),
					   (ce_ctrl_addr) + CE_CTRL1_ADDRESS);
				(ce_ctrl_addr) + ctrl_regs->addr);

	ar_opaque->bus_ops->write32(ar, ce_ctrl_addr + CE_CTRL1_ADDRESS,
			   (ctrl1_addr &  ~CE_CTRL1_DMAX_LENGTH_MASK) |
			   CE_CTRL1_DMAX_LENGTH_SET(n));
	ar_opaque->bus_ops->write32(ar, ce_ctrl_addr + ctrl_regs->addr,
			   (ctrl1_addr &  ~(ctrl_regs->dmax->mask)) |
			   ctrl_regs->dmax->set(n, ctrl_regs->dmax));
}

static inline void ath10k_ce_src_ring_byte_swap_set(struct ath10k *ar,
@@ -164,12 +166,14 @@ static inline void ath10k_ce_src_ring_byte_swap_set(struct ath10k *ar,
						    unsigned int n)
{
	struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
	struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs;

	u32 ctrl1_addr = ar_opaque->bus_ops->read32(ar, ce_ctrl_addr +
						    CE_CTRL1_ADDRESS);
						    ctrl_regs->addr);

	ar_opaque->bus_ops->write32(ar, ce_ctrl_addr + CE_CTRL1_ADDRESS,
			   (ctrl1_addr & ~CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK) |
			   CE_CTRL1_SRC_RING_BYTE_SWAP_EN_SET(n));
	ar_opaque->bus_ops->write32(ar, ce_ctrl_addr + ctrl_regs->addr,
			   (ctrl1_addr & ~(ctrl_regs->src_ring->mask)) |
			   ctrl_regs->src_ring->set(n, ctrl_regs->src_ring));
}

static inline void ath10k_ce_dest_ring_byte_swap_set(struct ath10k *ar,
@@ -177,12 +181,14 @@ static inline void ath10k_ce_dest_ring_byte_swap_set(struct ath10k *ar,
						     unsigned int n)
{
	struct bus_opaque *ar_opaque = ath10k_bus_priv(ar);
	struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs;

	u32 ctrl1_addr = ar_opaque->bus_ops->read32(ar, ce_ctrl_addr +
						    CE_CTRL1_ADDRESS);
						    ctrl_regs->addr);

	ar_opaque->bus_ops->write32(ar, ce_ctrl_addr + CE_CTRL1_ADDRESS,
			   (ctrl1_addr & ~CE_CTRL1_DST_RING_BYTE_SWAP_EN_MASK) |
			   CE_CTRL1_DST_RING_BYTE_SWAP_EN_SET(n));
	ar_opaque->bus_ops->write32(ar, ce_ctrl_addr + ctrl_regs->addr,
			   (ctrl1_addr & ~(ctrl_regs->dst_ring->mask)) |
			   ctrl_regs->dst_ring->set(n, ctrl_regs->dst_ring));
}

static inline u32 ath10k_ce_dest_ring_read_index_get(struct ath10k *ar,
+0 −64
Original line number Diff line number Diff line
@@ -357,39 +357,6 @@ struct ce_attr {
};

#ifndef CONFIG_ATH10K_SNOC
#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_MSB	17
#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_LSB	17
#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_MASK	0x00020000
#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_SET(x) \
	(((0 | (x)) << CE_CTRL1_DST_RING_BYTE_SWAP_EN_LSB) & \
	CE_CTRL1_DST_RING_BYTE_SWAP_EN_MASK)

#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MSB	16
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_LSB	16
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK	0x00010000
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_GET(x) \
	(((x) & CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK) >> \
	 CE_CTRL1_SRC_RING_BYTE_SWAP_EN_LSB)
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_SET(x) \
	(((0 | (x)) << CE_CTRL1_SRC_RING_BYTE_SWAP_EN_LSB) & \
	 CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK)

#define CE_CTRL1_DMAX_LENGTH_MSB		15
#define CE_CTRL1_DMAX_LENGTH_LSB		0
#define CE_CTRL1_DMAX_LENGTH_MASK		0x0000ffff
#define CE_CTRL1_DMAX_LENGTH_GET(x) \
	(((x) & CE_CTRL1_DMAX_LENGTH_MASK) >> CE_CTRL1_DMAX_LENGTH_LSB)
#define CE_CTRL1_DMAX_LENGTH_SET(x) \
	(((0 | (x)) << CE_CTRL1_DMAX_LENGTH_LSB) & CE_CTRL1_DMAX_LENGTH_MASK)

#define CE_CTRL1_ADDRESS			0x0010
#define CE_CTRL1_HW_MASK			0x0007ffff
#define CE_CTRL1_SW_MASK			0x0007ffff
#define CE_CTRL1_HW_WRITE_MASK			0x00000000
#define CE_CTRL1_SW_WRITE_MASK			0x0007ffff
#define CE_CTRL1_RSTMASK			0xffffffff
#define CE_CTRL1_RESET				0x00000080

#define CE_CMD_HALT_STATUS_MSB			3
#define CE_CMD_HALT_STATUS_LSB			3
#define CE_CMD_HALT_STATUS_MASK			0x00000008
@@ -519,37 +486,6 @@ struct ce_attr {
#define WCN3990_CE11_BASE_ADDRESS \
			WCN3990_CE11_SR_BA_LOW

#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_MSB	18
#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_LSB	18

#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_MASK	0x00040000
#define CE_CTRL1_DST_RING_BYTE_SWAP_EN_SET(x) \
		(((0 | (x)) << CE_CTRL1_DST_RING_BYTE_SWAP_EN_LSB) & \
		CE_CTRL1_DST_RING_BYTE_SWAP_EN_MASK)

#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MSB	16
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_LSB	16

#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK	0x00020000
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_GET(x) \
		(((x) & CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK) >> \
		CE_CTRL1_SRC_RING_BYTE_SWAP_EN_LSB)
#define CE_CTRL1_SRC_RING_BYTE_SWAP_EN_SET(x) \
	(((0 | (x)) << CE_CTRL1_SRC_RING_BYTE_SWAP_EN_LSB) & \
	 CE_CTRL1_SRC_RING_BYTE_SWAP_EN_MASK)

#define CE_CTRL1_DMAX_LENGTH_MSB		0
#define CE_CTRL1_DMAX_LENGTH_LSB		0

#define CE_CTRL1_DMAX_LENGTH_MASK		0x0000FFFF
#define CE_CTRL1_DMAX_LENGTH_GET(x) \
	(((x) & CE_CTRL1_DMAX_LENGTH_MASK) >> CE_CTRL1_DMAX_LENGTH_LSB)
#define CE_CTRL1_DMAX_LENGTH_SET(x) \
	(((0 | (x)) << CE_CTRL1_DMAX_LENGTH_LSB) & CE_CTRL1_DMAX_LENGTH_MASK)

#define CE_CTRL1_ADDRESS	(WCN3990_CE0_CE_CTRL1 \
					- WCN3990_CE0_BASE_ADDRESS)

#define HOST_IS_DST_RING_LOW_WATERMARK_MASK	0x00000010
#define HOST_IS_DST_RING_HIGH_WATERMARK_MASK	0x00000008
#define HOST_IS_SRC_RING_LOW_WATERMARK_MASK	0x00000004
+83 −0
Original line number Diff line number Diff line
@@ -164,6 +164,51 @@ const struct ath10k_hw_regs wcn3990_regs = {
	.pcie_intr_fw_mask			= 0x00100000,
};

static unsigned int
ath10k_set_ring_byte(unsigned int offset,
		     struct ath10k_hw_ce_regs_addr_map *addr_map)
{
	return (((0 | (offset)) << addr_map->lsb) & addr_map->mask);
}

static unsigned int
ath10k_get_ring_byte(unsigned int offset,
		     struct ath10k_hw_ce_regs_addr_map *addr_map)
{
	return (((offset) & addr_map->mask) >> (addr_map->lsb));
}

struct ath10k_hw_ce_regs_addr_map wcn3990_src_ring = {
	.msb	= 0x00000010,
	.lsb	= 0x00000010,
	.mask	= 0x00020000,
	.set	= &ath10k_set_ring_byte,
	.get	= &ath10k_get_ring_byte,
};

struct ath10k_hw_ce_regs_addr_map wcn3990_dst_ring = {
	.msb	= 0x00000012,
	.lsb	= 0x00000012,
	.mask	= 0x00040000,
	.set	= &ath10k_set_ring_byte,
	.get	= &ath10k_get_ring_byte,
};

struct ath10k_hw_ce_regs_addr_map wcn3990_dmax = {
	.msb	= 0x00000000,
	.lsb	= 0x00000000,
	.mask	= 0x0000ffff,
	.set	= &ath10k_set_ring_byte,
	.get	= &ath10k_get_ring_byte,
};

struct ath10k_hw_ce_ctrl1 wcn3990_ctrl1 = {
	.addr		= 0x00000018,
	.src_ring	= &wcn3990_src_ring,
	.dst_ring	= &wcn3990_dst_ring,
	.dmax		= &wcn3990_dmax,
};

struct ath10k_hw_ce_regs wcn3990_ce_regs = {
	.sr_base_addr		= 0x00000000,
	.sr_size_addr		= 0x00000008,
@@ -179,6 +224,43 @@ struct ath10k_hw_ce_regs wcn3990_ce_regs = {
	.ce_rri_low		= 0x0024C004,
	.ce_rri_high		= 0x0024C008,
	.host_ie_addr		= 0x0000002c,
	.ctrl1_regs		= &wcn3990_ctrl1,
};

struct ath10k_hw_ce_regs_addr_map qcax_src_ring = {
	.msb	= 0x00000010,
	.lsb	= 0x00000010,
	.mask	= 0x00010000,
	.set	= &ath10k_set_ring_byte,
};

struct ath10k_hw_ce_regs_addr_map qcax_dst_ring = {
	.msb	= 0x00000011,
	.lsb	= 0x00000011,
	.mask	= 0x00020000,
	.set	= &ath10k_set_ring_byte,
	.get	= &ath10k_get_ring_byte,
};

struct ath10k_hw_ce_regs_addr_map qcax_dmax = {
	.msb	= 0x0000000f,
	.lsb	= 0x00000000,
	.mask	= 0x0000ffff,
	.set	= &ath10k_set_ring_byte,
	.get    = &ath10k_get_ring_byte,
};

struct ath10k_hw_ce_ctrl1 qcax_ctrl1 = {
	.addr		= 0x00000010,
	.hw_mask	= 0x0007ffff,
	.sw_mask	= 0x0007ffff,
	.hw_wr_mask	= 0x00000000,
	.sw_wr_mask	= 0x0007ffff,
	.reset_mask	= 0xffffffff,
	.reset		= 0x00000080,
	.src_ring	= &qcax_src_ring,
	.dst_ring	= &qcax_dst_ring,
	.dmax		= &qcax_dmax,
};

struct ath10k_hw_ce_regs qcax_ce_regs = {
@@ -193,6 +275,7 @@ struct ath10k_hw_ce_regs qcax_ce_regs = {
	.current_srri_addr	= 0x00000044,
	.current_drri_addr	= 0x00000048,
	.host_ie_addr		= 0x0000002c,
	.ctrl1_regs		= &qcax_ctrl1,
};

const struct ath10k_hw_values qca988x_values = {
+24 −0
Original line number Diff line number Diff line
@@ -268,6 +268,29 @@ extern const struct ath10k_hw_regs qca99x0_regs;
extern const struct ath10k_hw_regs qca4019_regs;
extern const struct ath10k_hw_regs wcn3990_regs;

struct ath10k_hw_ce_regs_addr_map {
	u32 msb;
	u32 lsb;
	u32 mask;
	unsigned int (*set)(unsigned int offset,
			    struct ath10k_hw_ce_regs_addr_map *addr_map);
	unsigned int (*get)(unsigned int offset,
			    struct ath10k_hw_ce_regs_addr_map *addr_map);
};

struct ath10k_hw_ce_ctrl1 {
	u32 addr;
	u32 hw_mask;
	u32 sw_mask;
	u32 hw_wr_mask;
	u32 sw_wr_mask;
	u32 reset_mask;
	u32 reset;
	struct ath10k_hw_ce_regs_addr_map *src_ring;
	struct ath10k_hw_ce_regs_addr_map *dst_ring;
	struct ath10k_hw_ce_regs_addr_map *dmax;
};

struct ath10k_hw_ce_regs {
	u32 sr_base_addr;
	u32 sr_size_addr;
@@ -284,6 +307,7 @@ struct ath10k_hw_ce_regs {
	u32 ce_rri_low;
	u32 ce_rri_high;
	u32 host_ie_addr;
	struct ath10k_hw_ce_ctrl1 *ctrl1_regs;
};

extern struct ath10k_hw_ce_regs wcn3990_ce_regs;