Commit e6e49e43 authored by Alex Elder's avatar Alex Elder Committed by David S. Miller

net: ipa: limit local processing context address

Not all of the bits of the LOCAL_PKT_PROC_CNTXT register are valid.
Until IPA v4.5, there are 17 valid bits (though the bottom three
must be zero).  Starting with IPA v4.5, 18 bits are valid.

Introduce proc_cntxt_base_addr_encoded() to encode the base address
for use in the register using only the valid bits.

Shorten the name of the register (omit "_BASE") to avoid the need to
wrap the line in the one place it's used.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 647a05f3
...@@ -61,6 +61,7 @@ int ipa_mem_setup(struct ipa *ipa) ...@@ -61,6 +61,7 @@ int ipa_mem_setup(struct ipa *ipa)
struct gsi_trans *trans; struct gsi_trans *trans;
u32 offset; u32 offset;
u16 size; u16 size;
u32 val;
/* Get a transaction to define the header memory region and to zero /* Get a transaction to define the header memory region and to zero
* the processing context and modem memory regions. * the processing context and modem memory regions.
...@@ -89,8 +90,9 @@ int ipa_mem_setup(struct ipa *ipa) ...@@ -89,8 +90,9 @@ int ipa_mem_setup(struct ipa *ipa)
gsi_trans_commit_wait(trans); gsi_trans_commit_wait(trans);
/* Tell the hardware where the processing context area is located */ /* Tell the hardware where the processing context area is located */
iowrite32(ipa->mem_offset + ipa->mem[IPA_MEM_MODEM_PROC_CTX].offset, offset = ipa->mem_offset + ipa->mem[IPA_MEM_MODEM_PROC_CTX].offset;
ipa->reg_virt + IPA_REG_LOCAL_PKT_PROC_CNTXT_BASE_OFFSET); val = proc_cntxt_base_addr_encoded(ipa->version, offset);
iowrite32(val, ipa->reg_virt + IPA_REG_LOCAL_PKT_PROC_CNTXT_OFFSET);
return 0; return 0;
} }
......
...@@ -217,8 +217,18 @@ static inline u32 ipa_reg_bcr_val(enum ipa_version version) ...@@ -217,8 +217,18 @@ static inline u32 ipa_reg_bcr_val(enum ipa_version version)
return 0x00000000; return 0x00000000;
} }
/* The value of the next register must be a multiple of 8 */ /* The value of the next register must be a multiple of 8 (bottom 3 bits 0) */
#define IPA_REG_LOCAL_PKT_PROC_CNTXT_BASE_OFFSET 0x000001e8 #define IPA_REG_LOCAL_PKT_PROC_CNTXT_OFFSET 0x000001e8
/* Encoded value for LOCAL_PKT_PROC_CNTXT register BASE_ADDR field */
static inline u32 proc_cntxt_base_addr_encoded(enum ipa_version version,
u32 addr)
{
if (version < IPA_VERSION_4_5)
return u32_encode_bits(addr, GENMASK(16, 0));
return u32_encode_bits(addr, GENMASK(17, 0));
}
/* ipa->available defines the valid bits in the AGGR_FORCE_CLOSE register */ /* ipa->available defines the valid bits in the AGGR_FORCE_CLOSE register */
#define IPA_REG_AGGR_FORCE_CLOSE_OFFSET 0x000001ec #define IPA_REG_AGGR_FORCE_CLOSE_OFFSET 0x000001ec
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment