Merge "msm: ipa: Update WDI3.0 specific GSI interface for Lahaina"

This commit is contained in:
qctecmdr 2019-11-20 15:58:34 -08:00 • committed by Gerrit - the friendly Code Review server
commit fa519ac504
4 changed files with 82 additions and 22 deletions

View file

@ -1420,10 +1420,18 @@ static void gsi_program_evt_ring_ctx(struct gsi_evt_ring_props *props,
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_0_OFFS(evt_id, ee));
val = (props->ring_len & GSI_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_BMSK) <<
GSI_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_1_OFFS(evt_id, ee));
if (gsi_ctx->per.ver >= GSI_VER_2_9) {
val = (props->ring_len &
GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_BMSK)
<< GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_OFFS(evt_id, ee));
} else {
val = (props->ring_len & GSI_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_BMSK)
<< GSI_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_1_OFFS(evt_id, ee));
}
val = (props->ring_base_addr &
GSI_EE_n_EV_CH_k_CNTXT_2_R_BASE_ADDR_LSBS_BMSK) <<
@ -1461,16 +1469,16 @@ static void gsi_program_evt_ring_ctx(struct gsi_evt_ring_props *props,
GSI_EE_n_EV_CH_k_CNTXT_11_OFFS(evt_id, ee));
val = (props->rp_update_addr &
GSI_EE_n_EV_CH_k_CNTXT_12_RP_UPDATE_ADDR_LSB_BMSK) <<
GSI_EE_n_EV_CH_k_CNTXT_12_RP_UPDATE_ADDR_LSB_BMSK) <<
GSI_EE_n_EV_CH_k_CNTXT_12_RP_UPDATE_ADDR_LSB_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_12_OFFS(evt_id, ee));
GSI_EE_n_EV_CH_k_CNTXT_12_OFFS(evt_id, ee));
val = ((props->rp_update_addr >> 32) &
GSI_EE_n_EV_CH_k_CNTXT_13_RP_UPDATE_ADDR_MSB_BMSK) <<
GSI_EE_n_EV_CH_k_CNTXT_13_RP_UPDATE_ADDR_MSB_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_13_OFFS(evt_id, ee));
GSI_EE_n_EV_CH_k_CNTXT_13_OFFS(evt_id, ee));
}
static void gsi_init_evt_ring(struct gsi_evt_ring_props *props,
@ -2217,10 +2225,21 @@ static void gsi_program_chan_ctx(struct gsi_chan_props *props, unsigned int ee,
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_GSI_CH_k_CNTXT_0_OFFS(props->ch_id, ee));
val = (props->ring_len & GSI_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_BMSK) <<
GSI_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_GSI_CH_k_CNTXT_1_OFFS(props->ch_id, ee));
if (gsi_ctx->per.ver >= GSI_VER_2_9) {
val = (props->ring_len &
GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_BMSK)
<< GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_OFFS(
props->ch_id, ee));
} else {
val = (props->ring_len &
GSI_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_BMSK)
<< GSI_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_SHFT;
gsi_writel(val, gsi_ctx->base +
GSI_EE_n_GSI_CH_k_CNTXT_1_OFFS(props->ch_id,
ee));
}
val = (props->ring_base_addr &
GSI_EE_n_GSI_CH_k_CNTXT_2_R_BASE_ADDR_LSBS_BMSK) <<
@ -4321,11 +4340,23 @@ void gsi_wdi3_write_evt_ring_db(unsigned long evt_ring_hdl,
return;
}
gsi_writel(db_addr_low, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_12_OFFS(evt_ring_hdl, gsi_ctx->per.ee));
if (gsi_ctx->per.ver >= GSI_VER_2_9) {
gsi_writel(db_addr_low, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_10_OFFS(evt_ring_hdl,
gsi_ctx->per.ee));
gsi_writel(db_addr_high, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_13_OFFS(evt_ring_hdl, gsi_ctx->per.ee));
gsi_writel(db_addr_high, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_11_OFFS(evt_ring_hdl,
gsi_ctx->per.ee));
} else {
gsi_writel(db_addr_low, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_12_OFFS(evt_ring_hdl,
gsi_ctx->per.ee));
gsi_writel(db_addr_high, gsi_ctx->base +
GSI_EE_n_EV_CH_k_CNTXT_13_OFFS(evt_ring_hdl,
gsi_ctx->per.ee));
}
}
EXPORT_SYMBOL(gsi_wdi3_write_evt_ring_db);

View file

@ -477,6 +477,11 @@
#define GSI_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_BMSK 0xffff
#define GSI_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_SHFT 0x0
#define GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_OFFS(k, n) \
(GSI_GSI_REG_BASE_OFFS + 0x0000f004 + 0x4000 * (n) + 0x80 * (k))
#define GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_BMSK 0xfffff
#define GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_SHFT 0x0
#define GSI_EE_n_GSI_CH_k_CNTXT_2_OFFS(k, n) \
(GSI_GSI_REG_BASE_OFFS + 0x0000f008 + 0x4000 * (n) + 0x80 * (k))
#define GSI_EE_n_GSI_CH_k_CNTXT_2_R_BASE_ADDR_LSBS_BMSK 0xffffffff
@ -605,6 +610,11 @@
#define GSI_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_BMSK 0xffff
#define GSI_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_SHFT 0x0
#define GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_OFFS(k, n) \
(GSI_GSI_REG_BASE_OFFS + 0x00010004 + 0x4000 * (n) + 0x80 * (k))
#define GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_BMSK 0xfffff
#define GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_SHFT 0x0
#define GSI_EE_n_EV_CH_k_CNTXT_2_OFFS(k, n) \
(GSI_GSI_REG_BASE_OFFS + 0x00010008 + 0x4000 * (n) + 0x80 * (k))
#define GSI_EE_n_EV_CH_k_CNTXT_2_R_BASE_ADDR_LSBS_BMSK 0xffffffff

View file

@ -83,12 +83,21 @@ static int ipa3_setup_wdi3_gsi_channel(u8 is_smmu_enabled,
/* setup event ring */
memset(&gsi_evt_ring_props, 0, sizeof(gsi_evt_ring_props));
gsi_evt_ring_props.intf = GSI_EVT_CHTYPE_WDI3_EV;
gsi_evt_ring_props.intr = GSI_INTR_IRQ;
/* 16 (for Tx) and 8 (for Rx) */
if (dir == IPA_WDI3_TX_DIR)
gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_16B;
else
gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_8B;
if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_9) {
gsi_evt_ring_props.intr = GSI_INTR_MSI;
/* 32 (for Tx) and 8 (for Rx) */
if (dir == IPA_WDI3_TX_DIR)
gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_32B;
else
gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_8B;
} else {
gsi_evt_ring_props.intr = GSI_INTR_IRQ;
/* 16 (for Tx) and 8 (for Rx) */
if (dir == IPA_WDI3_TX_DIR)
gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_16B;
else
gsi_evt_ring_props.re_size = GSI_EVT_RING_RE_SIZE_8B;
}
if (!is_smmu_enabled) {
gsi_evt_ring_props.ring_len = info->event_ring_size;
gsi_evt_ring_props.ring_base_addr =
@ -153,7 +162,15 @@ static int ipa3_setup_wdi3_gsi_channel(u8 is_smmu_enabled,
gsi_channel_props.db_in_bytes = 0;
gsi_channel_props.evt_ring_hdl = ep->gsi_evt_ring_hdl;
gsi_channel_props.re_size = GSI_CHAN_RE_SIZE_16B;
if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_9) {
/* 32 (for Tx) and 64 (for Rx) */
if (dir == IPA_WDI3_TX_DIR)
gsi_channel_props.re_size = GSI_CHAN_RE_SIZE_32B;
else
gsi_channel_props.re_size = GSI_CHAN_RE_SIZE_64B;
} else
gsi_channel_props.re_size = GSI_CHAN_RE_SIZE_16B;
gsi_channel_props.use_db_eng = GSI_CHAN_DB_MODE;
gsi_channel_props.max_prefetch = GSI_ONE_PREFETCH_SEG;
gsi_channel_props.prefetch_mode =

View file

@ -162,6 +162,7 @@ enum gsi_evt_ring_elem_size {
GSI_EVT_RING_RE_SIZE_4B = 4,
GSI_EVT_RING_RE_SIZE_8B = 8,
GSI_EVT_RING_RE_SIZE_16B = 16,
GSI_EVT_RING_RE_SIZE_32B = 32,
};
/**
@ -335,6 +336,7 @@ enum gsi_chan_ring_elem_size {
GSI_CHAN_RE_SIZE_8B = 8,
GSI_CHAN_RE_SIZE_16B = 16,
GSI_CHAN_RE_SIZE_32B = 32,
GSI_CHAN_RE_SIZE_64B = 64,
};
enum gsi_chan_use_db_eng {