net: ipa: add a parameter to aggregation registers
Starting with IPA v5.0, a single IPA instance can have more than 32 endpoints defined. To handle this, each register that holds a bitmap of IPA endpoints is replicated as needed to represent the available endpoints. To prepare for this, registers that represent endpoint IDs in a bit mask will be defined to have a parameter, with a stride value of 4 bytes. The first 32 endpoints are represented in the first 32-bit register, then the next (up to) 32 endpoints at an offset 4 bytes higher. When accessing such a register, the endpoint ID divided by 32 determines the offset, and the endpoint ID modulo 32 defines the endpoint's bit position within the register. The first two registers we'll update for this are STATE_AGGR_ACTIVE and AGGR_FORCE_CLOSE. Until more than 32 endpoints are supported, this change has no practical effect. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6337b14782
commit
1d8f16dbdf
@ -350,29 +350,35 @@ ipa_endpoint_program_delay(struct ipa_endpoint *endpoint, bool enable)
|
||||
|
||||
static bool ipa_endpoint_aggr_active(struct ipa_endpoint *endpoint)
|
||||
{
|
||||
u32 mask = BIT(endpoint->endpoint_id);
|
||||
u32 endpoint_id = endpoint->endpoint_id;
|
||||
u32 mask = BIT(endpoint_id % 32);
|
||||
struct ipa *ipa = endpoint->ipa;
|
||||
u32 unit = endpoint_id / 32;
|
||||
const struct ipa_reg *reg;
|
||||
u32 val;
|
||||
|
||||
/* This works until we actually have more than 32 endpoints */
|
||||
WARN_ON(!(mask & ipa->available));
|
||||
|
||||
reg = ipa_reg(ipa, STATE_AGGR_ACTIVE);
|
||||
val = ioread32(ipa->reg_virt + ipa_reg_offset(reg));
|
||||
val = ioread32(ipa->reg_virt + ipa_reg_n_offset(reg, unit));
|
||||
|
||||
return !!(val & mask);
|
||||
}
|
||||
|
||||
static void ipa_endpoint_force_close(struct ipa_endpoint *endpoint)
|
||||
{
|
||||
u32 mask = BIT(endpoint->endpoint_id);
|
||||
u32 endpoint_id = endpoint->endpoint_id;
|
||||
u32 mask = BIT(endpoint_id % 32);
|
||||
struct ipa *ipa = endpoint->ipa;
|
||||
u32 unit = endpoint_id / 32;
|
||||
const struct ipa_reg *reg;
|
||||
|
||||
/* This works until we actually have more than 32 endpoints */
|
||||
WARN_ON(!(mask & ipa->available));
|
||||
|
||||
reg = ipa_reg(ipa, AGGR_FORCE_CLOSE);
|
||||
iowrite32(mask, ipa->reg_virt + ipa_reg_offset(reg));
|
||||
iowrite32(mask, ipa->reg_virt + ipa_reg_n_offset(reg, unit));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -103,7 +103,7 @@ static const u32 ipa_reg_filt_rout_hash_flush_fmask[] = {
|
||||
IPA_REG_FIELDS(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x0000090);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x0000010c);
|
||||
IPA_REG_STRIDE(STATE_AGGR_ACTIVE, state_aggr_active, 0x0000010c, 0x0004);
|
||||
|
||||
IPA_REG(IPA_BCR, ipa_bcr, 0x000001d0);
|
||||
|
||||
@ -116,7 +116,7 @@ static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
IPA_REG_FIELDS(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
|
||||
IPA_REG_STRIDE(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_counter_cfg_fmask[] = {
|
||||
[EOT_COAL_GRANULARITY] = GENMASK(3, 0),
|
||||
|
@ -108,7 +108,7 @@ static const u32 ipa_reg_filt_rout_hash_flush_fmask[] = {
|
||||
IPA_REG_FIELDS(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x0000090);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x0000010c);
|
||||
IPA_REG_STRIDE(STATE_AGGR_ACTIVE, state_aggr_active, 0x0000010c, 0x0004);
|
||||
|
||||
IPA_REG(IPA_BCR, ipa_bcr, 0x000001d0);
|
||||
|
||||
@ -121,7 +121,7 @@ static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
IPA_REG_FIELDS(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
|
||||
IPA_REG_STRIDE(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_counter_cfg_fmask[] = {
|
||||
/* Bits 0-3 reserved */
|
||||
|
@ -140,7 +140,7 @@ static const u32 ipa_reg_filt_rout_hash_flush_fmask[] = {
|
||||
IPA_REG_FIELDS(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
|
||||
IPA_REG_STRIDE(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
[IPA_BASE_ADDR] = GENMASK(17, 0),
|
||||
@ -151,7 +151,7 @@ static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
IPA_REG_FIELDS(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
|
||||
IPA_REG_STRIDE(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_ipa_tx_cfg_fmask[] = {
|
||||
/* Bits 0-1 reserved */
|
||||
|
@ -132,7 +132,7 @@ static const u32 ipa_reg_filt_rout_hash_flush_fmask[] = {
|
||||
IPA_REG_FIELDS(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
|
||||
IPA_REG_STRIDE(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4, 0x0004);
|
||||
|
||||
IPA_REG(IPA_BCR, ipa_bcr, 0x000001d0);
|
||||
|
||||
@ -145,7 +145,7 @@ static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
IPA_REG_FIELDS(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
|
||||
IPA_REG_STRIDE(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_counter_cfg_fmask[] = {
|
||||
/* Bits 0-3 reserved */
|
||||
|
@ -134,7 +134,7 @@ static const u32 ipa_reg_filt_rout_hash_flush_fmask[] = {
|
||||
IPA_REG_FIELDS(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
|
||||
IPA_REG_STRIDE(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
[IPA_BASE_ADDR] = GENMASK(17, 0),
|
||||
@ -145,7 +145,7 @@ static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
IPA_REG_FIELDS(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
|
||||
IPA_REG_STRIDE(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_ipa_tx_cfg_fmask[] = {
|
||||
/* Bits 0-1 reserved */
|
||||
|
@ -139,7 +139,7 @@ static const u32 ipa_reg_filt_rout_hash_flush_fmask[] = {
|
||||
IPA_REG_FIELDS(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
|
||||
IPA_REG_STRIDE(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
[IPA_BASE_ADDR] = GENMASK(17, 0),
|
||||
@ -150,7 +150,7 @@ static const u32 ipa_reg_local_pkt_proc_cntxt_fmask[] = {
|
||||
IPA_REG_FIELDS(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
|
||||
|
||||
/* Valid bits defined by ipa->available */
|
||||
IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
|
||||
IPA_REG_STRIDE(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec, 0x0004);
|
||||
|
||||
static const u32 ipa_reg_ipa_tx_cfg_fmask[] = {
|
||||
/* Bits 0-1 reserved */
|
||||
|
Loading…
x
Reference in New Issue
Block a user