From 826473f5e9e3a7647904010a07371fdcfa044762 Mon Sep 17 00:00:00 2001 From: Bojun Pan Date: Fri, 18 Oct 2019 16:28:37 -0700 Subject: [PATCH] msm: ipa: Update WDI3.0 specific GSI interface for Lahaina Update the GSI register fields to handle the latest WDI3.0 changes. Change-Id: I10c2f1280a1f5b9e79a339f4989a2fb41fe07b6e Acked-by: Priyadarshini Rajagopal Signed-off-by: Bojun Pan --- drivers/platform/msm/gsi/gsi.c | 61 +++++++++++++++----- drivers/platform/msm/gsi/gsi_reg_v2.h | 10 ++++ drivers/platform/msm/ipa/ipa_v3/ipa_wdi3_i.c | 31 +++++++--- include/linux/msm_gsi.h | 2 + 4 files changed, 82 insertions(+), 22 deletions(-) diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index b657e174722c..dafcb2910428 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -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); diff --git a/drivers/platform/msm/gsi/gsi_reg_v2.h b/drivers/platform/msm/gsi/gsi_reg_v2.h index 1615697521a0..9b432a22149f 100644 --- a/drivers/platform/msm/gsi/gsi_reg_v2.h +++ b/drivers/platform/msm/gsi/gsi_reg_v2.h @@ -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 diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_wdi3_i.c b/drivers/platform/msm/ipa/ipa_v3/ipa_wdi3_i.c index eb3b3ad0222b..843cf0b37a41 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_wdi3_i.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_wdi3_i.c @@ -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 = diff --git a/include/linux/msm_gsi.h b/include/linux/msm_gsi.h index 7a680da1416f..1af1ba760d40 100644 --- a/include/linux/msm_gsi.h +++ b/include/linux/msm_gsi.h @@ -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 {