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: Sarada Prasanna Garnayak <sgarna@codeaurora.org>
This commit is contained in:
parent
e42e488a2d
commit
ff6155fa90
4 changed files with 128 additions and 79 deletions
|
@ -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);
|
||||
u32 ctrl1_addr = ar_opaque->bus_ops->read32((ar),
|
||||
(ce_ctrl_addr) + CE_CTRL1_ADDRESS);
|
||||
struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs;
|
||||
|
||||
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));
|
||||
u32 ctrl1_addr = ar_opaque->bus_ops->read32((ar),
|
||||
(ce_ctrl_addr) + ctrl_regs->addr);
|
||||
|
||||
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);
|
||||
u32 ctrl1_addr = ar_opaque->bus_ops->read32(ar, ce_ctrl_addr +
|
||||
CE_CTRL1_ADDRESS);
|
||||
struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs;
|
||||
|
||||
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));
|
||||
u32 ctrl1_addr = ar_opaque->bus_ops->read32(ar, ce_ctrl_addr +
|
||||
ctrl_regs->addr);
|
||||
|
||||
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);
|
||||
u32 ctrl1_addr = ar_opaque->bus_ops->read32(ar, ce_ctrl_addr +
|
||||
CE_CTRL1_ADDRESS);
|
||||
struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs;
|
||||
|
||||
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));
|
||||
u32 ctrl1_addr = ar_opaque->bus_ops->read32(ar, ce_ctrl_addr +
|
||||
ctrl_regs->addr);
|
||||
|
||||
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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue