net: ipa: add per-version IPA register definition files
Create a new subdirectory "reg", which contains a register definition file for each supported version of IPA. Each register definition contains the register's offset, and for parameterized registers, the stride (distance between consecutive instances of the register). Finally, it includes an all-caps printable register name. In these files, each IPA version defines an array of IPA register definition pointers, with unsupported registers defined with a null pointer. The array is indexed by the ipa_reg_id enumerated type. At initialization time, the appropriate register definition array to use is selected based on the IPA version, and assigned to a new "regs" field in the IPA structure. Extend ipa_reg_valid() so it fails if a valid register is not defined. This patch simply puts this infrastructure in place; the next will use it. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
6bfb753850
commit
07f120bcf7
@@ -7,6 +7,7 @@
|
||||
#define _IPA_REG_H_
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
#include "ipa_version.h"
|
||||
|
||||
@@ -120,6 +121,40 @@ enum ipa_reg_id {
|
||||
IPA_REG_ID_COUNT, /* Last; not an ID */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ipa_reg - An IPA register descriptor
|
||||
* @offset: Register offset relative to base of the "ipa-reg" memory
|
||||
* @stride: Distance between two instances, if parameterized
|
||||
* @name: Upper-case name of the IPA register
|
||||
*/
|
||||
struct ipa_reg {
|
||||
u32 offset;
|
||||
u32 stride;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
/* Helper macro for defining "simple" (non-parameterized) registers */
|
||||
#define IPA_REG(__NAME, __reg_id, __offset) \
|
||||
IPA_REG_STRIDE(__NAME, __reg_id, __offset, 0)
|
||||
|
||||
/* Helper macro for defining parameterized registers, specifying stride */
|
||||
#define IPA_REG_STRIDE(__NAME, __reg_id, __offset, __stride) \
|
||||
static const struct ipa_reg ipa_reg_ ## __reg_id = { \
|
||||
.name = #__NAME, \
|
||||
.offset = __offset, \
|
||||
.stride = __stride, \
|
||||
}
|
||||
|
||||
/**
|
||||
* struct ipa_regs - Description of registers supported by hardware
|
||||
* @reg_count: Number of registers in the @reg[] array
|
||||
* @reg: Array of register descriptors
|
||||
*/
|
||||
struct ipa_regs {
|
||||
u32 reg_count;
|
||||
const struct ipa_reg **reg;
|
||||
};
|
||||
|
||||
#define IPA_REG_COMP_CFG_OFFSET 0x0000003c
|
||||
/* The next field is not supported for IPA v4.0+, not present for IPA v4.5+ */
|
||||
#define ENABLE_FMASK GENMASK(0, 0)
|
||||
@@ -898,8 +933,17 @@ ipa_reg_irq_suspend_clr_offset(enum ipa_version version)
|
||||
return ipa_reg_irq_suspend_clr_ee_n_offset(version, GSI_EE_AP);
|
||||
}
|
||||
|
||||
extern const struct ipa_regs ipa_regs_v3_1;
|
||||
extern const struct ipa_regs ipa_regs_v3_5_1;
|
||||
extern const struct ipa_regs ipa_regs_v4_2;
|
||||
extern const struct ipa_regs ipa_regs_v4_5;
|
||||
extern const struct ipa_regs ipa_regs_v4_9;
|
||||
extern const struct ipa_regs ipa_regs_v4_11;
|
||||
|
||||
u32 __ipa_reg_offset(struct ipa *ipa, enum ipa_reg_id reg_id, u32 n);
|
||||
|
||||
const struct ipa_reg *ipa_reg(struct ipa *ipa, enum ipa_reg_id reg_id);
|
||||
|
||||
static inline u32 ipa_reg_offset(struct ipa *ipa, enum ipa_reg_id reg_id)
|
||||
{
|
||||
return __ipa_reg_offset(ipa, reg_id, 0);
|
||||
|
||||
Reference in New Issue
Block a user