gsi: Add HAL Layer for GSI

Add Hardware Abstraction Layer infrastructure to GSI
driver. This change includes registers HAL component
for GSI.

Change-Id: I87e7c22ed88117a74af4220b4c05c610bae498cc
Signed-off-by: Amir Levy <alevy@codeaurora.org>
Signed-off-by: Ilia Lin <ilialin@codeaurora.org>
This commit is contained in:
Sivan Reinstein
2020-10-08 09:20:40 +03:00
parent 4c6c6a1b80
commit b4f2036141
20 changed files with 3296 additions and 3449 deletions

View File

@@ -4,7 +4,6 @@
*/ */
#define CONFIG_GSI 1 #define CONFIG_GSI 1
#define CONFIG_GSI_REGISTER_VERSION_2 1
#define CONFIG_RMNET_IPA3 1 #define CONFIG_RMNET_IPA3 1
#define CONFIG_RNDIS_IPA 1 #define CONFIG_RNDIS_IPA 1
#define CONFIG_IPA_WDI_UNIFIED_API 1 #define CONFIG_IPA_WDI_UNIFIED_API 1

View File

@@ -1,5 +1,4 @@
export CONFIG_GSI=m export CONFIG_GSI=m
export CONFIG_GSI_REGISTER_VERSION_2=y
export CONFIG_IPA_CLIENTS_MANAGER=m export CONFIG_IPA_CLIENTS_MANAGER=m
export CONFIG_IPA_WDI_UNIFIED_API=y export CONFIG_IPA_WDI_UNIFIED_API=y
export CONFIG_RMNET_IPA3=y export CONFIG_RMNET_IPA3=y

View File

@@ -1,5 +1,4 @@
export CONFIG_GSI=y export CONFIG_GSI=y
export CONFIG_GSI_REGISTER_VERSION_2=y
export CONFIG_IPA_CLIENTS_MANAGER=y export CONFIG_IPA_CLIENTS_MANAGER=y
export CONFIG_IPA_WDI_UNIFIED_API=y export CONFIG_IPA_WDI_UNIFIED_API=y
export CONFIG_RMNET_IPA3=y export CONFIG_RMNET_IPA3=y

View File

@@ -27,8 +27,9 @@ endif
DATAIPADRVTOP = $(srctree)/techpack/dataipa/drivers/platform/msm DATAIPADRVTOP = $(srctree)/techpack/dataipa/drivers/platform/msm
ifneq (,$(filter $(CONFIG_IPA3),y m)) ifneq (,$(filter $(CONFIG_IPA3) $(CONFIG_GSI),y m))
LINUXINCLUDE += -I$(DATAIPADRVTOP)/gsi LINUXINCLUDE += -I$(DATAIPADRVTOP)/gsi
LINUXINCLUDE += -I$(DATAIPADRVTOP)/gsi/gsihal
LINUXINCLUDE += -I$(DATAIPADRVTOP)/ipa LINUXINCLUDE += -I$(DATAIPADRVTOP)/ipa
LINUXINCLUDE += -I$(DATAIPADRVTOP)/ipa/ipa_v3 LINUXINCLUDE += -I$(DATAIPADRVTOP)/ipa/ipa_v3
LINUXINCLUDE += -I$(DATAIPADRVTOP)/ipa/ipa_v3/ipahal LINUXINCLUDE += -I$(DATAIPADRVTOP)/ipa/ipa_v3/ipahal

View File

@@ -2,7 +2,7 @@
obj-$(CONFIG_GSI) += gsim.o obj-$(CONFIG_GSI) += gsim.o
gsim-objs := gsi.o gsim-objs := gsi.o gsihal/gsihal.o gsihal/gsihal_reg.o
gsim-$(CONFIG_DEBUG_FS) += gsi_dbg.o gsim-$(CONFIG_DEBUG_FS) += gsi_dbg.o

File diff suppressed because it is too large Load Diff

View File

@@ -30,9 +30,6 @@
#define GSI_NO_EVT_ERINDEX 31 #define GSI_NO_EVT_ERINDEX 31
#define GSI_ISR_CACHE_MAX 20 #define GSI_ISR_CACHE_MAX 20
#define gsi_readl(c) (readl_relaxed(c))
#define gsi_writel(v, c) ({ __iowmb(); writel_relaxed((v), (c)); })
#define GSI_IPC_LOGGING(buf, fmt, args...) \ #define GSI_IPC_LOGGING(buf, fmt, args...) \
do { \ do { \
if (buf) \ if (buf) \
@@ -2037,10 +2034,11 @@ void gsi_wdi3_dump_register(unsigned long chan_hdl);
* @gsi_base_addr: Base address of GSI register space * @gsi_base_addr: Base address of GSI register space
* @gsi_size: Mapping size of the GSI register space * @gsi_size: Mapping size of the GSI register space
* @ver: The appropriate GSI version enum
* *
* @Return gsi_status * @Return gsi_status
*/ */
int gsi_map_base(phys_addr_t gsi_base_addr, u32 gsi_size); int gsi_map_base(phys_addr_t gsi_base_addr, u32 gsi_size, enum gsi_ver ver);
/** /**
* gsi_unmap_base - Peripheral should call this function to undo the * gsi_unmap_base - Peripheral should call this function to undo the

View File

@@ -9,8 +9,8 @@
#include <linux/random.h> #include <linux/random.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/msm_gsi.h> #include <linux/msm_gsi.h>
#include "gsi_reg.h"
#include "gsi.h" #include "gsi.h"
#include "gsihal.h"
#define TERR(fmt, args...) \ #define TERR(fmt, args...) \
pr_err("%s:%d " fmt, __func__, __LINE__, ## args) pr_err("%s:%d " fmt, __func__, __LINE__, ## args)
@@ -69,53 +69,53 @@ static ssize_t gsi_dump_evt(struct file *file,
return -EINVAL; return -EINVAL;
} }
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_0,
GSI_EE_n_EV_CH_k_CNTXT_0_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX0 0x%x\n", arg1, val); TERR("EV%2d CTX0 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_1,
GSI_EE_n_EV_CH_k_CNTXT_1_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX1 0x%x\n", arg1, val); TERR("EV%2d CTX1 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_2,
GSI_EE_n_EV_CH_k_CNTXT_2_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX2 0x%x\n", arg1, val); TERR("EV%2d CTX2 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_3,
GSI_EE_n_EV_CH_k_CNTXT_3_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX3 0x%x\n", arg1, val); TERR("EV%2d CTX3 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_4,
GSI_EE_n_EV_CH_k_CNTXT_4_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX4 0x%x\n", arg1, val); TERR("EV%2d CTX4 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_5,
GSI_EE_n_EV_CH_k_CNTXT_5_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX5 0x%x\n", arg1, val); TERR("EV%2d CTX5 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_6,
GSI_EE_n_EV_CH_k_CNTXT_6_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX6 0x%x\n", arg1, val); TERR("EV%2d CTX6 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_7,
GSI_EE_n_EV_CH_k_CNTXT_7_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX7 0x%x\n", arg1, val); TERR("EV%2d CTX7 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_8,
GSI_EE_n_EV_CH_k_CNTXT_8_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX8 0x%x\n", arg1, val); TERR("EV%2d CTX8 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_9,
GSI_EE_n_EV_CH_k_CNTXT_9_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX9 0x%x\n", arg1, val); TERR("EV%2d CTX9 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_10,
GSI_EE_n_EV_CH_k_CNTXT_10_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX10 0x%x\n", arg1, val); TERR("EV%2d CTX10 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_11,
GSI_EE_n_EV_CH_k_CNTXT_11_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX11 0x%x\n", arg1, val); TERR("EV%2d CTX11 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_12,
GSI_EE_n_EV_CH_k_CNTXT_12_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX12 0x%x\n", arg1, val); TERR("EV%2d CTX12 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_CNTXT_13,
GSI_EE_n_EV_CH_k_CNTXT_13_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d CTX13 0x%x\n", arg1, val); TERR("EV%2d CTX13 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_SCRATCH_0,
GSI_EE_n_EV_CH_k_SCRATCH_0_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d SCR0 0x%x\n", arg1, val); TERR("EV%2d SCR0 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_EV_CH_k_SCRATCH_1,
GSI_EE_n_EV_CH_k_SCRATCH_1_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("EV%2d SCR1 0x%x\n", arg1, val); TERR("EV%2d SCR1 0x%x\n", arg1, val);
if (arg2) { if (arg2) {
@@ -182,57 +182,50 @@ static ssize_t gsi_dump_ch(struct file *file,
return -EINVAL; return -EINVAL;
} }
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_0,
GSI_EE_n_GSI_CH_k_CNTXT_0_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX0 0x%x\n", arg1, val); TERR("CH%2d CTX0 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_1,
GSI_EE_n_GSI_CH_k_CNTXT_1_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX1 0x%x\n", arg1, val); TERR("CH%2d CTX1 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_2,
GSI_EE_n_GSI_CH_k_CNTXT_2_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX2 0x%x\n", arg1, val); TERR("CH%2d CTX2 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_3,
GSI_EE_n_GSI_CH_k_CNTXT_3_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX3 0x%x\n", arg1, val); TERR("CH%2d CTX3 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_4,
GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX4 0x%x\n", arg1, val); TERR("CH%2d CTX4 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_5,
GSI_EE_n_GSI_CH_k_CNTXT_5_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX5 0x%x\n", arg1, val); TERR("CH%2d CTX5 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_6,
GSI_EE_n_GSI_CH_k_CNTXT_6_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX6 0x%x\n", arg1, val); TERR("CH%2d CTX6 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_7,
GSI_EE_n_GSI_CH_k_CNTXT_7_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d CTX7 0x%x\n", arg1, val); TERR("CH%2d CTX7 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_RE_FETCH_READ_PTR,
GSI_EE_n_GSI_CH_k_RE_FETCH_READ_PTR_OFFS(arg1, gsi_ctx->per.ee, arg1);
gsi_ctx->per.ee));
TERR("CH%2d REFRP 0x%x\n", arg1, val); TERR("CH%2d REFRP 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_RE_FETCH_WRITE_PTR,
GSI_EE_n_GSI_CH_k_RE_FETCH_WRITE_PTR_OFFS(arg1, gsi_ctx->per.ee, arg1);
gsi_ctx->per.ee));
TERR("CH%2d REFWP 0x%x\n", arg1, val); TERR("CH%2d REFWP 0x%x\n", arg1, val);
if (gsi_ctx->per.ver >= GSI_VER_2_5) { val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_QOS,
val = gsi_readl(gsi_ctx->base + gsi_ctx->per.ee, arg1);
GSI_V2_5_EE_n_GSI_CH_k_QOS_OFFS(arg1, gsi_ctx->per.ee));
} else {
val = gsi_readl(gsi_ctx->base +
GSI_EE_n_GSI_CH_k_QOS_OFFS(arg1, gsi_ctx->per.ee));
}
TERR("CH%2d QOS 0x%x\n", arg1, val); TERR("CH%2d QOS 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_SCRATCH_0,
GSI_EE_n_GSI_CH_k_SCRATCH_0_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d SCR0 0x%x\n", arg1, val); TERR("CH%2d SCR0 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_SCRATCH_1,
GSI_EE_n_GSI_CH_k_SCRATCH_1_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d SCR1 0x%x\n", arg1, val); TERR("CH%2d SCR1 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_SCRATCH_2,
GSI_EE_n_GSI_CH_k_SCRATCH_2_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d SCR2 0x%x\n", arg1, val); TERR("CH%2d SCR2 0x%x\n", arg1, val);
val = gsi_readl(gsi_ctx->base + val = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_SCRATCH_3,
GSI_EE_n_GSI_CH_k_SCRATCH_3_OFFS(arg1, gsi_ctx->per.ee)); gsi_ctx->per.ee, arg1);
TERR("CH%2d SCR3 0x%x\n", arg1, val); TERR("CH%2d SCR3 0x%x\n", arg1, val);
if (arg2) { if (arg2) {
@@ -482,17 +475,15 @@ static void gsi_dbg_update_ch_dp_stats(struct gsi_chan_ctx *ctx)
int ee = gsi_ctx->per.ee; int ee = gsi_ctx->per.ee;
uint16_t used_hw; uint16_t used_hw;
rp_hw = gsi_readl(gsi_ctx->base + rp_hw = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_4,
GSI_EE_n_GSI_CH_k_CNTXT_4_OFFS(ctx->props.ch_id, ee)); ee, ctx->props.ch_id);
rp_hw |= ((uint64_t)gsi_readl(gsi_ctx->base + rp_hw |= ((uint64_t)gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_5,
GSI_EE_n_GSI_CH_k_CNTXT_5_OFFS(ctx->props.ch_id, ee))) ee, ctx->props.ch_id)) << 32;
<< 32;
wp_hw = gsi_readl(gsi_ctx->base + wp_hw = gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_6,
GSI_EE_n_GSI_CH_k_CNTXT_6_OFFS(ctx->props.ch_id, ee)); ee, ctx->props.ch_id);
wp_hw |= ((uint64_t)gsi_readl(gsi_ctx->base + wp_hw |= ((uint64_t)gsihal_read_reg_nk(GSI_EE_n_GSI_CH_k_CNTXT_7,
GSI_EE_n_GSI_CH_k_CNTXT_7_OFFS(ctx->props.ch_id, ee))) ee, ctx->props.ch_id)) << 32;
<< 32;
start_hw = gsi_find_idx_from_addr(&ctx->ring, rp_hw); start_hw = gsi_find_idx_from_addr(&ctx->ring, rp_hw);
end_hw = gsi_find_idx_from_addr(&ctx->ring, wp_hw); end_hw = gsi_find_idx_from_addr(&ctx->ring, wp_hw);

View File

@@ -9,7 +9,6 @@
# include <linux/interrupt.h> # include <linux/interrupt.h>
# include "gsi.h" # include "gsi.h"
# include "gsi_reg.h"
#if defined(CONFIG_IPA_EMULATION) #if defined(CONFIG_IPA_EMULATION)
# include "gsi_emulation_stubs.h" # include "gsi_emulation_stubs.h"

View File

@@ -1,30 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
*/
#ifndef __GSI_REG_H__
#define __GSI_REG_H__
enum gsi_register_ver {
GSI_REGISTER_VER_1 = 0,
GSI_REGISTER_VER_2 = 1,
GSI_REGISTER_MAX,
};
#ifdef GSI_REGISTER_VER_CURRENT
#error GSI_REGISTER_VER_CURRENT already defined
#endif
#ifdef CONFIG_GSI_REGISTER_VERSION_2
#include "gsi_reg_v2.h"
#define GSI_REGISTER_VER_CURRENT GSI_REGISTER_VER_2
#endif
/* The default is V1 */
#ifndef GSI_REGISTER_VER_CURRENT
#include "gsi_reg_v1.h"
#define GSI_REGISTER_VER_CURRENT GSI_REGISTER_VER_1
#endif
#endif /* __GSI_REG_H__ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,71 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
#include "gsihal_i.h"
#include "gsihal_reg.h"
struct gsihal_context *gsihal_ctx;
int gsihal_init(enum gsi_ver gsi_ver, void __iomem *base)
{
int result = 0;
GSIDBG("initializing GSI HAL, GSI ver %d, base = %pK\n",
gsi_ver, base);
if (gsihal_ctx) {
GSIDBG("gsihal already initialized\n");
if (base != gsihal_ctx->base) {
GSIERR(
"base address of early init is differnet (%pK - %pK)\n"
);
WARN_ON(1);
}
result = -EEXIST;
goto bail_err_exit;
}
if (gsi_ver < GSI_VER_1_0 || gsi_ver >= GSI_VER_MAX) {
GSIERR("invalid GSI version %d\n", gsi_ver);
result = -EINVAL;
goto bail_err_exit;
}
if (!base) {
GSIERR("invalid memory io mapping addr\n");
result = -EINVAL;
goto bail_err_exit;
}
gsihal_ctx = kzalloc(sizeof(*gsihal_ctx), GFP_KERNEL);
if (!gsihal_ctx) {
GSIERR("kzalloc err for gsihal_ctx\n");
result = -ENOMEM;
goto bail_err_exit;
}
gsihal_ctx->gsi_ver = gsi_ver;
gsihal_ctx->base = base;
if (gsihal_reg_init(gsi_ver)) {
GSIERR("failed to initialize gsihal regs\n");
result = -EINVAL;
goto bail_free_ctx;
}
return 0;
bail_free_ctx:
kfree(gsihal_ctx);
gsihal_ctx = NULL;
bail_err_exit:
return result;
}
void gsihal_destroy(void)
{
GSIDBG("Entry\n");
kfree(gsihal_ctx);
gsihal_ctx = NULL;
}

View File

@@ -0,0 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2030, The Linux Foundation. All rights reserved.
*/
#ifndef _GSIHAL_H_
#define _GSIHAL_H_
#include "gsihal_reg.h"
int gsihal_init(enum gsi_ver gsi_ver, void __iomem *base);
void gsihal_destroy(void);
#endif /* _GSIHAL_H_ */

View File

@@ -0,0 +1,19 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
#ifndef _GSIHAL_I_H_
#define _GSIHAL_I_H_
#include "../gsi.h"
#include <linux/slab.h>
#include <linux/io.h>
struct gsihal_context {
enum gsi_ver gsi_ver;
void __iomem *base;
};
extern struct gsihal_context *gsihal_ctx;
#endif /* _GSIHAL_I_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,406 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2030, The Linux Foundation. All rights reserved.
*/
#ifndef _GSIHAL_REG_H_
#define _GSIHAL_REG_H_
/*
* Registers names
*
* NOTE:: Any change to this enum, need to change to gsireg_name_to_str
* array as well.
*/
enum gsihal_reg_name {
GSI_EE_n_CNTXT_TYPE_IRQ_MSK,
GSI_EE_n_CNTXT_SRC_GSI_CH_IRQ_MSK,
GSI_EE_n_CNTXT_SRC_EV_CH_IRQ_MSK,
GSI_EE_n_CNTXT_SRC_IEOB_IRQ_MSK,
GSI_EE_n_CNTXT_GLOB_IRQ_EN,
GSI_EE_n_CNTXT_GSI_IRQ_EN,
GSI_EE_n_CNTXT_TYPE_IRQ,
GSI_EE_n_CNTXT_SRC_GSI_CH_IRQ,
GSI_EE_n_GSI_CH_k_CNTXT_0,
GSI_EE_n_CNTXT_SRC_GSI_CH_IRQ_CLR,
GSI_EE_n_CNTXT_SRC_EV_CH_IRQ,
GSI_EE_n_CNTXT_SRC_EV_CH_IRQ_CLR,
GSI_EE_n_EV_CH_k_CNTXT_0,
GSI_EE_n_CNTXT_GLOB_IRQ_STTS,
GSI_EE_n_ERROR_LOG,
GSI_EE_n_ERROR_LOG_CLR,
GSI_EE_n_CNTXT_GLOB_IRQ_CLR,
GSI_EE_n_EV_CH_k_DOORBELL_0,
GSI_EE_n_GSI_CH_k_DOORBELL_0,
GSI_EE_n_CNTXT_SRC_IEOB_IRQ,
GSI_EE_n_CNTXT_SRC_IEOB_IRQ_CLR,
GSI_INTER_EE_n_SRC_GSI_CH_IRQ,
GSI_INTER_EE_n_SRC_GSI_CH_IRQ_CLR,
GSI_INTER_EE_n_SRC_EV_CH_IRQ,
GSI_INTER_EE_n_SRC_EV_CH_IRQ_CLR,
GSI_EE_n_CNTXT_GSI_IRQ_STTS,
GSI_EE_n_CNTXT_GSI_IRQ_CLR,
GSI_EE_n_GSI_HW_PARAM,
GSI_EE_n_GSI_HW_PARAM_0,
GSI_EE_n_GSI_HW_PARAM_2,
GSI_EE_n_GSI_SW_VERSION,
GSI_EE_n_CNTXT_INTSET,
GSI_EE_n_CNTXT_MSI_BASE_LSB,
GSI_EE_n_CNTXT_MSI_BASE_MSB,
GSI_EE_n_GSI_STATUS,
GSI_EE_n_CNTXT_SCRATCH_0,
GSI_EE_n_EV_CH_k_CNTXT_1,
GSI_EE_n_EV_CH_k_CNTXT_2,
GSI_EE_n_EV_CH_k_CNTXT_3,
GSI_EE_n_EV_CH_k_CNTXT_8,
GSI_EE_n_EV_CH_k_CNTXT_9,
GSI_EE_n_EV_CH_k_CNTXT_10,
GSI_EE_n_EV_CH_k_CNTXT_11,
GSI_EE_n_EV_CH_k_CNTXT_12,
GSI_EE_n_EV_CH_k_CNTXT_13,
GSI_EE_n_EV_CH_k_DOORBELL_1,
GSI_EE_n_EV_CH_CMD,
GSI_EE_n_EV_CH_k_SCRATCH_0,
GSI_EE_n_EV_CH_k_SCRATCH_1,
GSI_EE_n_GSI_CH_k_DOORBELL_1,
GSI_EE_n_GSI_CH_k_QOS,
GSI_EE_n_GSI_CH_k_CNTXT_1,
GSI_EE_n_GSI_CH_k_CNTXT_2,
GSI_EE_n_GSI_CH_k_CNTXT_3,
GSI_EE_n_GSI_CH_CMD,
GSI_EE_n_GSI_CH_k_SCRATCH_0,
GSI_EE_n_GSI_CH_k_SCRATCH_1,
GSI_EE_n_GSI_CH_k_SCRATCH_2,
GSI_EE_n_GSI_CH_k_SCRATCH_3,
GSI_EE_n_GSI_CH_k_CNTXT_4,
GSI_EE_n_GSI_CH_k_CNTXT_5,
GSI_EE_n_GSI_CH_k_CNTXT_6,
GSI_EE_n_GSI_CH_k_CNTXT_7,
GSI_EE_n_EV_CH_k_CNTXT_4,
GSI_EE_n_EV_CH_k_CNTXT_5,
GSI_EE_n_EV_CH_k_CNTXT_6,
GSI_EE_n_EV_CH_k_CNTXT_7,
GSI_GSI_IRAM_PTR_CH_CMD,
GSI_GSI_IRAM_PTR_CH_DB,
GSI_GSI_IRAM_PTR_CH_DIS_COMP,
GSI_GSI_IRAM_PTR_CH_EMPTY,
GSI_GSI_IRAM_PTR_EE_GENERIC_CMD,
GSI_GSI_IRAM_PTR_EVENT_GEN_COMP,
GSI_GSI_IRAM_PTR_INT_MOD_STOPPED,
GSI_GSI_IRAM_PTR_PERIPH_IF_TLV_IN_0,
GSI_GSI_IRAM_PTR_PERIPH_IF_TLV_IN_2,
GSI_GSI_IRAM_PTR_PERIPH_IF_TLV_IN_1,
GSI_GSI_IRAM_PTR_NEW_RE,
GSI_GSI_IRAM_PTR_READ_ENG_COMP,
GSI_GSI_IRAM_PTR_TIMER_EXPIRED,
GSI_GSI_IRAM_PTR_EV_DB,
GSI_GSI_IRAM_PTR_UC_GP_INT,
GSI_GSI_IRAM_PTR_WRITE_ENG_COMP,
GSI_GSI_IRAM_PTR_TLV_CH_NOT_FULL,
GSI_IC_DISABLE_CHNL_BCK_PRS_LSB,
GSI_IC_DISABLE_CHNL_BCK_PRS_MSB,
GSI_IC_GEN_EVNT_BCK_PRS_LSB,
GSI_IC_GEN_EVNT_BCK_PRS_MSB,
GSI_IC_GEN_INT_BCK_PRS_LSB,
GSI_IC_GEN_INT_BCK_PRS_MSB,
GSI_IC_STOP_INT_MOD_BCK_PRS_LSB,
GSI_IC_STOP_INT_MOD_BCK_PRS_MSB,
GSI_IC_PROCESS_DESC_BCK_PRS_LSB,
GSI_IC_PROCESS_DESC_BCK_PRS_MSB,
GSI_IC_TLV_STOP_BCK_PRS_LSB,
GSI_IC_TLV_STOP_BCK_PRS_MSB,
GSI_IC_TLV_RESET_BCK_PRS_LSB,
GSI_IC_TLV_RESET_BCK_PRS_MSB,
GSI_IC_RGSTR_TIMER_BCK_PRS_LSB,
GSI_IC_RGSTR_TIMER_BCK_PRS_MSB,
GSI_IC_READ_BCK_PRS_LSB,
GSI_IC_READ_BCK_PRS_MSB,
GSI_IC_WRITE_BCK_PRS_LSB,
GSI_IC_WRITE_BCK_PRS_MSB,
GSI_IC_UCONTROLLER_GPR_BCK_PRS_LSB,
GSI_IC_UCONTROLLER_GPR_BCK_PRS_MSB,
GSI_GSI_PERIPH_BASE_ADDR_MSB,
GSI_GSI_PERIPH_BASE_ADDR_LSB,
GSI_GSI_MCS_CFG,
GSI_GSI_CFG,
GSI_EE_n_GSI_EE_GENERIC_CMD,
GSI_MAP_EE_n_CH_k_VP_TABLE,
GSI_EE_n_GSI_CH_k_RE_FETCH_READ_PTR,
GSI_EE_n_GSI_CH_k_RE_FETCH_WRITE_PTR,
GSI_GSI_INST_RAM_n,
GSI_GSI_IRAM_PTR_MSI_DB,
GSI_REG_MAX
};
struct gsihal_reg_ctx_type_irq {
uint32_t general;
uint32_t inter_ee_ev_ctrl;
uint32_t inter_ee_ch_ctrl;
uint32_t ieob;
uint32_t glob_ee;
uint32_t ev_ctrl;
uint32_t ch_ctrl;
};
struct gsihal_reg_ch_k_cntxt_0 {
uint32_t element_size;
uint32_t chstate;
uint32_t erindex;
uint32_t chtype_protocol_msb;
uint32_t chid;
uint32_t ee;
uint32_t chtype_dir;
uint32_t chtype_protocol;
};
struct gsihal_reg_cntxt_glob_irq_stts {
uint8_t gp_int3;
uint8_t gp_int2;
uint8_t gp_int1;
uint8_t error_int;
};
struct gsihal_reg_cntxt_gsi_irq_stts {
uint8_t gsi_mcs_stack_ovrflow;
uint8_t gsi_cmd_fifo_ovrflow;
uint8_t gsi_bus_error;
uint8_t gsi_break_point;
};
struct gsihal_reg_hw_param {
uint32_t periph_sec_grp;
uint32_t use_axi_m;
uint32_t periph_conf_addr_bus_w;
uint32_t num_ees;
uint32_t gsi_ch_num;
uint32_t gsi_ev_ch_num;
};
struct gsihal_reg_hw_param2 {
uint32_t gsi_use_inter_ee;
uint32_t gsi_use_rd_wr_eng;
uint32_t gsi_sdma_n_iovec;
uint32_t gsi_sdma_max_burst;
uint32_t gsi_sdma_n_int;
uint32_t gsi_use_sdma;
uint32_t gsi_ch_full_logic;
uint32_t gsi_ch_pend_translate;
uint32_t gsi_num_ev_per_ee;
uint32_t gsi_num_ch_per_ee;
uint32_t gsi_iram_size;
};
struct gsihal_reg_gsi_status {
uint8_t enabled;
};
struct gsihal_reg_ev_ch_k_cntxt_0 {
uint32_t element_size;
uint32_t chstate;
uint32_t intype;
uint32_t evchid;
uint32_t ee;
uint32_t chtype;
};
struct gsihal_reg_ev_ch_k_cntxt_1 {
uint32_t r_length;
};
struct gsihal_reg_ev_ch_k_cntxt_2 {
uint32_t r_base_addr_lsbs;
};
struct gsihal_reg_ev_ch_k_cntxt_3 {
uint32_t r_base_addr_msbs;
};
struct gsihal_reg_ev_ch_k_cntxt_8 {
uint32_t int_mod_cnt;
uint32_t int_modc;
uint32_t int_modt;
};
struct gsihal_reg_ev_ch_k_cntxt_9 {
uint32_t intvec;
};
struct gsihal_reg_ev_ch_k_cntxt_10 {
uint32_t msi_addr_lsb;
};
struct gsihal_reg_ev_ch_k_cntxt_11 {
uint32_t msi_addr_msb;
};
struct gsihal_reg_ev_ch_k_cntxt_12 {
uint32_t rp_update_addr_lsb;
};
struct gsihal_reg_ev_ch_k_cntxt_13 {
uint32_t rp_update_addr_msb;
};
struct gsihal_reg_gsi_ee_n_ev_ch_k_doorbell_1 {
uint32_t write_ptr_msb;
};
struct gsihal_reg_ee_n_ev_ch_cmd {
uint32_t opcode;
uint32_t chid;
};
struct gsihal_reg_ee_n_gsi_ch_cmd {
uint32_t opcode;
uint32_t chid;
};
struct gsihal_reg_gsi_ee_n_gsi_ch_k_qos {
uint32_t db_in_bytes; //2.9
uint32_t empty_lvl_thrshold;
uint32_t prefetch_mode;
uint32_t use_escape_buf_only; //stringray
uint32_t use_db_eng; //mclaren
uint32_t max_prefetch;
uint32_t wrr_weight;
};
struct gsihal_reg_ch_k_cntxt_1 {
uint32_t r_length;
};
struct gsihal_reg_gsi_cfg {
uint32_t sleep_clk_div;
uint32_t bp_mtrix_disable;
uint32_t gsi_pwr_clps;
uint32_t uc_is_mcs;
uint32_t double_mcs_clk_freq;
uint32_t mcs_enable;
uint32_t gsi_enable;
};
struct gsihal_reg_gsi_ee_generic_cmd {
uint32_t opcode;
uint32_t virt_chan_idx;
uint32_t ee;
};
struct gsihal_reg_gsi_ee_n_cntxt_gsi_irq {
uint8_t gsi_mcs_stack_ovrflow;
uint8_t gsi_cmd_fifo_ovrflow;
uint8_t gsi_bus_error;
uint8_t gsi_break_point;
};
/*
* gsihal_reg_init() - intialize gsihal regsiters module
*/
int gsihal_reg_init(enum gsi_ver gsi_ver);
/*
* gsihal_read_reg_nk() - Get nk parameterized reg value
*/
u32 gsihal_read_reg_nk(enum gsihal_reg_name reg, u32 n, u32 k);
/*
* gsihal_read_reg_n() - Get n parameterized reg value
*/
static inline u32 gsihal_read_reg_n(enum gsihal_reg_name reg, u32 n)
{
return gsihal_read_reg_nk(reg, n, 0);
}
/*
* gsihal_read_reg() - Get reg value
*/
static inline u32 gsihal_read_reg(enum gsihal_reg_name reg)
{
return gsihal_read_reg_nk(reg, 0, 0);
}
/*
* gsihal_write_reg_nk() - Write to n/k parameterized reg a raw value
*/
void gsihal_write_reg_nk(enum gsihal_reg_name reg, u32 n, u32 k, u32 val);
/*
* gsihal_write_reg_n() - Write to n parameterized reg a raw value
*/
static inline void gsihal_write_reg_n(enum gsihal_reg_name reg, u32 n, u32 val)
{
gsihal_write_reg_nk(reg, n, 0, val);
}
/*
* gsihal_write_reg() - Write to reg a raw value
*/
static inline void gsihal_write_reg(enum gsihal_reg_name reg, u32 val)
{
gsihal_write_reg_nk(reg, 0, 0, val);
}
/*
* gsihal_read_reg_nk_fields() - Get the parsed value of nk parameterized reg
*/
u32 gsihal_read_reg_nk_fields(enum gsihal_reg_name reg,
u32 n, u32 k, void *fields);
/*
* gsihal_write_reg_nk_fields() - Write to nk parameterized reg a prased value
*/
void gsihal_write_reg_nk_fields(enum gsihal_reg_name reg, u32 n, u32 k,
const void *fields);
/*
* gsihal_read_reg_n_fields() - Get the parsed value of n parameterized reg
*/
u32 gsihal_read_reg_n_fields(enum gsihal_reg_name reg, u32 n, void *fields);
/*
* gsihal_write_reg_n_fields() - Write to n parameterized reg a prased value
*/
void gsihal_write_reg_n_fields(enum gsihal_reg_name reg, u32 n,
const void *fields);
/*
* gsihal_write_reg_fields() - Write to reg a prased value
*/
void gsihal_write_reg_fields(enum gsihal_reg_name reg, const void *fields);
/*
* gsihal_read_reg_fields() - Get the parsed value of reg
*/
u32 gsihal_read_reg_fields(enum gsihal_reg_name reg, void *fields);
/*
* Get the offset of a nk parameterized register
*/
u32 gsihal_get_reg_nk_ofst(enum gsihal_reg_name reg, u32 n, u32 k);
/*
* Get the offset of a n parameterized register
*/
static inline u32 gsihal_get_reg_n_ofst(enum gsihal_reg_name reg, u32 n)
{
return gsihal_get_reg_nk_ofst(reg, n, 0);
}
/*
* Get the offset of a register
*/
static inline u32 gsihal_get_reg_ofst(enum gsihal_reg_name reg)
{
return gsihal_get_reg_nk_ofst(reg, 0, 0);
}
/*
* Get GSI instruction ram MAX size
*/
unsigned long gsihal_get_inst_ram_size(void);
/*
* Get mask for GP_int1
*/
u32 gsihal_get_glob_irq_en_gp_int1_mask(void);
#endif /* _GSIHAL_REG_H_ */

View File

@@ -0,0 +1,298 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
#ifndef _GSIHAL_REG_I_H_
#define _GSIHAL_REG_I_H_
#define GSI_SETFIELD(val, shift, mask) (((val) << (shift)) & (mask))
#define GSI_SETFIELD_IN_REG(reg, val, shift, mask) \
(reg |= ((val) << (shift)) & (mask))
#define GSI_GETFIELD_FROM_REG(reg, shift, mask) \
(((reg) & (mask)) >> (shift))
/* GSI_GSI_INST_RAM_n */
#define GSI_GSI_INST_RAM_n_WORD_SZ 0x4
#define GSI_GSI_INST_RAM_n_MAXn 4095
#define GSI_V2_0_GSI_INST_RAM_n_MAXn 6143
#define GSI_V2_2_GSI_INST_RAM_n_MAXn 4095
#define GSI_V2_5_GSI_INST_RAM_n_MAXn 8191
#define GSI_V2_7_GSI_INST_RAM_n_MAXn 5119
#define GSI_V2_9_GSI_INST_RAM_n_MAXn 6143
/* GSI_EE_n_CNTXT_TYPE_IRQ */
#define GSI_EE_n_CNTXT_TYPE_IRQ_GENERAL_BMSK 0x40
#define GSI_EE_n_CNTXT_TYPE_IRQ_GENERAL_SHFT 0x6
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_EV_CTRL_BMSK 0x20
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_EV_CTRL_SHFT 0x5
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_CH_CTRL_BMSK 0x10
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_CH_CTRL_SHFT 0x4
#define GSI_EE_n_CNTXT_TYPE_IRQ_IEOB_BMSK 0x8
#define GSI_EE_n_CNTXT_TYPE_IRQ_IEOB_SHFT 0x3
#define GSI_EE_n_CNTXT_TYPE_IRQ_GLOB_EE_BMSK 0x4
#define GSI_EE_n_CNTXT_TYPE_IRQ_GLOB_EE_SHFT 0x2
#define GSI_EE_n_CNTXT_TYPE_IRQ_EV_CTRL_BMSK 0x2
#define GSI_EE_n_CNTXT_TYPE_IRQ_EV_CTRL_SHFT 0x1
#define GSI_EE_n_CNTXT_TYPE_IRQ_CH_CTRL_BMSK 0x1
#define GSI_EE_n_CNTXT_TYPE_IRQ_CH_CTRL_SHFT 0x0
/* GSI_EE_n_GSI_CH_k_CNTXT_0 */
#define GSI_EE_n_GSI_CH_k_CNTXT_0_ELEMENT_SIZE_BMSK 0xff000000
#define GSI_EE_n_GSI_CH_k_CNTXT_0_ELEMENT_SIZE_SHFT 0x18
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHSTATE_BMSK 0xf00000
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHSTATE_SHFT 0x14
#define GSI_EE_n_GSI_CH_k_CNTXT_0_ERINDEX_BMSK 0x7c000
#define GSI_EE_n_GSI_CH_k_CNTXT_0_ERINDEX_SHFT 0xe
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHID_BMSK 0x1f00
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHID_SHFT 0x8
#define GSI_EE_n_GSI_CH_k_CNTXT_0_EE_BMSK 0xf0
#define GSI_EE_n_GSI_CH_k_CNTXT_0_EE_SHFT 0x4
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHTYPE_DIR_BMSK 0x8
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHTYPE_DIR_SHFT 0x3
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHTYPE_PROTOCOL_BMSK 0x7
#define GSI_EE_n_GSI_CH_k_CNTXT_0_CHTYPE_PROTOCOL_SHFT 0x0
#define GSI_V2_5_EE_n_GSI_CH_k_CNTXT_0_CHTYPE_PROTOCOL_MSB_BMSK 0x2000
#define GSI_V2_5_EE_n_GSI_CH_k_CNTXT_0_CHTYPE_PROTOCOL_MSB_SHFT 0xd
/* GSI_EE_n_EV_CH_k_CNTXT_0 */
#define GSI_EE_n_EV_CH_k_CNTXT_0_ELEMENT_SIZE_BMSK 0xff000000
#define GSI_EE_n_EV_CH_k_CNTXT_0_ELEMENT_SIZE_SHFT 0x18
#define GSI_EE_n_EV_CH_k_CNTXT_0_CHSTATE_BMSK 0xf00000
#define GSI_EE_n_EV_CH_k_CNTXT_0_CHSTATE_SHFT 0x14
#define GSI_EE_n_EV_CH_k_CNTXT_0_INTYPE_BMSK 0x10000
#define GSI_EE_n_EV_CH_k_CNTXT_0_INTYPE_SHFT 0x10
#define GSI_EE_n_EV_CH_k_CNTXT_0_EVCHID_BMSK 0xff00
#define GSI_EE_n_EV_CH_k_CNTXT_0_EVCHID_SHFT 0x8
#define GSI_EE_n_EV_CH_k_CNTXT_0_EE_BMSK 0xf0
#define GSI_EE_n_EV_CH_k_CNTXT_0_EE_SHFT 0x4
#define GSI_EE_n_EV_CH_k_CNTXT_0_CHTYPE_BMSK 0xf
#define GSI_EE_n_EV_CH_k_CNTXT_0_CHTYPE_SHFT 0x0
/* GSI_EE_n_CNTXT_GLOB_IRQ_STTS */
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_GP_INT3_BMSK 0x8
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_GP_INT3_SHFT 0x3
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_GP_INT2_BMSK 0x4
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_GP_INT2_SHFT 0x2
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_GP_INT1_BMSK 0x2
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_GP_INT1_SHFT 0x1
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_ERROR_INT_BMSK 0x1
#define GSI_EE_n_CNTXT_GLOB_IRQ_STTS_ERROR_INT_SHFT 0x0
/* GSI_EE_n_CNTXT_GLOB_IRQ_EN */
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_GP_INT3_BMSK 0x8
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_GP_INT3_SHFT 0x3
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_GP_INT2_BMSK 0x4
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_GP_INT2_SHFT 0x2
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_GP_INT1_BMSK 0x2
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_GP_INT1_SHFT 0x1
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_ERROR_INT_BMSK 0x1
#define GSI_EE_n_CNTXT_GLOB_IRQ_EN_ERROR_INT_SHFT 0x0
/* GSI_EE_n_CNTXT_GSI_IRQ_STTS */
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_MCS_STACK_OVRFLOW_BMSK 0x8
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_MCS_STACK_OVRFLOW_SHFT 0x3
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_CMD_FIFO_OVRFLOW_BMSK 0x4
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_CMD_FIFO_OVRFLOW_SHFT 0x2
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_BUS_ERROR_BMSK 0x2
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_BUS_ERROR_SHFT 0x1
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_BREAK_POINT_BMSK 0x1
#define GSI_EE_n_CNTXT_GSI_IRQ_STTS_GSI_BREAK_POINT_SHFT 0x0
/* GSI_EE_n_CNTXT_TYPE_IRQ */
#define GSI_EE_n_CNTXT_TYPE_IRQ_GENERAL_BMSK 0x40
#define GSI_EE_n_CNTXT_TYPE_IRQ_GENERAL_SHFT 0x6
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_EV_CTRL_BMSK 0x20
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_EV_CTRL_SHFT 0x5
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_CH_CTRL_BMSK 0x10
#define GSI_EE_n_CNTXT_TYPE_IRQ_INTER_EE_CH_CTRL_SHFT 0x4
#define GSI_EE_n_CNTXT_TYPE_IRQ_IEOB_BMSK 0x8
#define GSI_EE_n_CNTXT_TYPE_IRQ_IEOB_SHFT 0x3
#define GSI_EE_n_CNTXT_TYPE_IRQ_GLOB_EE_BMSK 0x4
#define GSI_EE_n_CNTXT_TYPE_IRQ_GLOB_EE_SHFT 0x2
#define GSI_EE_n_CNTXT_TYPE_IRQ_EV_CTRL_BMSK 0x2
#define GSI_EE_n_CNTXT_TYPE_IRQ_EV_CTRL_SHFT 0x1
#define GSI_EE_n_CNTXT_TYPE_IRQ_CH_CTRL_BMSK 0x1
#define GSI_EE_n_CNTXT_TYPE_IRQ_CH_CTRL_SHFT 0x0
/* GSI_EE_n_GSI_HW_PARAM */
#define GSI_V1_0_EE_n_GSI_HW_PARAM_PERIPH_SEC_GRP_BMSK 0x7c000000
#define GSI_V1_0_EE_n_GSI_HW_PARAM_PERIPH_SEC_GRP_SHFT 0x1a
#define GSI_V1_0_EE_n_GSI_HW_PARAM_USE_AXI_M_BMSK 0x2000000
#define GSI_V1_0_EE_n_GSI_HW_PARAM_USE_AXI_M_SHFT 0x19
#define GSI_V1_0_EE_n_GSI_HW_PARAM_PERIPH_CONF_ADDR_BUS_W_BMSK 0x1f00000
#define GSI_V1_0_EE_n_GSI_HW_PARAM_PERIPH_CONF_ADDR_BUS_W_SHFT 0x14
#define GSI_V1_0_EE_n_GSI_HW_PARAM_NUM_EES_BMSK 0xf0000
#define GSI_V1_0_EE_n_GSI_HW_PARAM_NUM_EES_SHFT 0x10
#define GSI_V1_0_EE_n_GSI_HW_PARAM_GSI_CH_NUM_BMSK 0xff00
#define GSI_V1_0_EE_n_GSI_HW_PARAM_GSI_CH_NUM_SHFT 0x8
#define GSI_V1_0_EE_n_GSI_HW_PARAM_GSI_EV_CH_NUM_BMSK 0xff
#define GSI_V1_0_EE_n_GSI_HW_PARAM_GSI_EV_CH_NUM_SHFT 0x0
/* GSI_EE_n_GSI_HW_PARAM_0 */
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_USE_AXI_M_BMSK 0x80000000
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_USE_AXI_M_SHFT 0x1f
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_PERIPH_SEC_GRP_BMSK 0x7c000000
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_PERIPH_SEC_GRP_SHFT 0x1a
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_PERIPH_CONF_ADDR_BUS_W_BMSK 0x3e00000
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_PERIPH_CONF_ADDR_BUS_W_SHFT 0x15
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_NUM_EES_BMSK 0x1f0000
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_NUM_EES_SHFT 0x10
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_GSI_CH_NUM_BMSK 0xff00
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_GSI_CH_NUM_SHFT 0x8
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_GSI_EV_CH_NUM_BMSK 0xff
#define GSI_V1_2_EE_n_GSI_HW_PARAM_0_GSI_EV_CH_NUM_SHFT 0x0
/* GSI_EE_n_GSI_HW_PARAM_2 */
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_CH_FULL_LOGIC_BMSK 0x4000
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_CH_FULL_LOGIC_SHFT 0xe
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_CH_PEND_TRANSLATE_BMSK 0x2000
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_CH_PEND_TRANSLATE_SHFT 0xd
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_NUM_EV_PER_EE_BMSK 0x1f00
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_NUM_EV_PER_EE_SHFT 0x8
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_NUM_CH_PER_EE_BMSK 0xf8
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_NUM_CH_PER_EE_SHFT 0x3
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_IRAM_SIZE_BMSK 0x7
#define GSI_V1_3_EE_n_GSI_HW_PARAM_2_GSI_IRAM_SIZE_SHFT 0x0
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_SDMA_N_IOVEC_BMSK 0x38000000
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_SDMA_N_IOVEC_SHFT 0x1b
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_SDMA_MAX_BURST_BMSK 0x7F80000
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_SDMA_MAX_BURST_SHFT 0x13
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_SDMA_N_INT_BMSK 0x70000
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_SDMA_N_INT_SHFT 0x10
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_USE_SDMA_BMSK 0x8000
#define GSI_V2_0_EE_n_GSI_HW_PARAM_2_GSI_USE_SDMA_SHFT 0xf
#define GSI_V2_2_EE_n_GSI_HW_PARAM_2_GSI_USE_INTER_EE_BMSK 0x80000000
#define GSI_V2_2_EE_n_GSI_HW_PARAM_2_GSI_USE_INTER_EE_SHFT 0x1f
#define GSI_V2_2_EE_n_GSI_HW_PARAM_2_GSI_USE_RD_WR_ENG_BMSK 0x40000000
#define GSI_V2_2_EE_n_GSI_HW_PARAM_2_GSI_USE_RD_WR_ENG_SHFT 0x1E
/* GSI_EE_n_GSI_STATUS */
#define GSI_EE_n_GSI_STATUS_ENABLED_BMSK 0x1
#define GSI_EE_n_GSI_STATUS_ENABLED_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_1 */
#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_R_LENGTH_BMSK 0xfffff
#define GSI_V2_9_EE_n_EV_CH_k_CNTXT_1_R_LENGTH_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_2 */
#define GSI_EE_n_EV_CH_k_CNTXT_2_R_BASE_ADDR_LSBS_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_2_R_BASE_ADDR_LSBS_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_3 */
#define GSI_EE_n_EV_CH_k_CNTXT_3_R_BASE_ADDR_MSBS_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_3_R_BASE_ADDR_MSBS_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_8 */
#define GSI_EE_n_EV_CH_k_CNTXT_8_INT_MOD_CNT_BMSK 0xff000000
#define GSI_EE_n_EV_CH_k_CNTXT_8_INT_MOD_CNT_SHFT 0x18
#define GSI_EE_n_EV_CH_k_CNTXT_8_INT_MODC_BMSK 0xff0000
#define GSI_EE_n_EV_CH_k_CNTXT_8_INT_MODC_SHFT 0x10
#define GSI_EE_n_EV_CH_k_CNTXT_8_INT_MODT_BMSK 0xffff
#define GSI_EE_n_EV_CH_k_CNTXT_8_INT_MODT_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_9 */
#define GSI_EE_n_EV_CH_k_CNTXT_9_INTVEC_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_9_INTVEC_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_10 */
#define GSI_EE_n_EV_CH_k_CNTXT_10_MSI_ADDR_LSB_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_10_MSI_ADDR_LSB_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_11 */
#define GSI_EE_n_EV_CH_k_CNTXT_11_MSI_ADDR_MSB_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_11_MSI_ADDR_MSB_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_12 */
#define GSI_EE_n_EV_CH_k_CNTXT_12_RP_UPDATE_ADDR_LSB_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_12_RP_UPDATE_ADDR_LSB_SHFT 0x0
/* GSI_EE_n_EV_CH_k_CNTXT_13 */
#define GSI_EE_n_EV_CH_k_CNTXT_13_RP_UPDATE_ADDR_MSB_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_CNTXT_13_RP_UPDATE_ADDR_MSB_SHFT 0x0
/* GSI_EE_n_EV_CH_k_DOORBELL_1 */
#define GSI_EE_n_EV_CH_k_DOORBELL_1_WRITE_PTR_MSB_BMSK 0xffffffff
#define GSI_EE_n_EV_CH_k_DOORBELL_1_WRITE_PTR_MSB_SHFT 0x0
/* GSI_EE_n_EV_CH_CMD */
#define GSI_EE_n_EV_CH_CMD_OPCODE_BMSK 0xff000000
#define GSI_EE_n_EV_CH_CMD_OPCODE_SHFT 0x18
#define GSI_EE_n_EV_CH_CMD_CHID_BMSK 0xff
#define GSI_EE_n_EV_CH_CMD_CHID_SHFT 0x0
/* GSI_EE_n_GSI_CH_k_QOS */
#define GSI_EE_n_GSI_CH_k_QOS_USE_DB_ENG_BMSK 0x200
#define GSI_EE_n_GSI_CH_k_QOS_USE_DB_ENG_SHFT 0x9
#define GSI_EE_n_GSI_CH_k_QOS_MAX_PREFETCH_BMSK 0x100
#define GSI_EE_n_GSI_CH_k_QOS_MAX_PREFETCH_SHFT 0x8
#define GSI_EE_n_GSI_CH_k_QOS_WRR_WEIGHT_BMSK 0xf
#define GSI_EE_n_GSI_CH_k_QOS_WRR_WEIGHT_SHFT 0x0
#define GSI_V2_0_EE_n_GSI_CH_k_QOS_USE_ESCAPE_BUF_ONLY_BMSK 0x400
#define GSI_V2_0_EE_n_GSI_CH_k_QOS_USE_ESCAPE_BUF_ONLY_SHFT 0xa
#define GSI_V2_5_EE_n_GSI_CH_k_QOS_EMPTY_LVL_THRSHOLD_SHFT 0x10
#define GSI_V2_9_EE_n_GSI_CH_k_QOS_EMPTY_LVL_THRSHOLD_BMSK 0xff0000
#define GSI_V2_5_EE_n_GSI_CH_k_QOS_PREFETCH_MODE_BMSK 0x3c00
#define GSI_V2_5_EE_n_GSI_CH_k_QOS_PREFETCH_MODE_SHFT 0xa
#define GSI_V2_9_EE_n_GSI_CH_k_QOS_DB_IN_BYTES_BMSK 0x1000000
#define GSI_V2_9_EE_n_GSI_CH_k_QOS_DB_IN_BYTES_SHFT 0x18
/* GSI_EE_n_GSI_CH_k_CNTXT_1 */
#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_R_LENGTH_BMSK 0xfffff
#define GSI_V2_9_EE_n_GSI_CH_k_CNTXT_1_R_LENGTH_SHFT 0x0
/* GSI_EE_n_GSI_CH_CMD */
#define GSI_EE_n_GSI_CH_CMD_OPCODE_BMSK 0xff000000
#define GSI_EE_n_GSI_CH_CMD_OPCODE_SHFT 0x18
#define GSI_EE_n_GSI_CH_CMD_CHID_BMSK 0xff
#define GSI_EE_n_GSI_CH_CMD_CHID_SHFT 0x0
/* GSI_GSI_CFG */
#define GSI_GSI_CFG_BP_MTRIX_DISABLE_BMSK 0x20
#define GSI_GSI_CFG_BP_MTRIX_DISABLE_SHFT 0x5
#define GSI_GSI_CFG_GSI_PWR_CLPS_BMSK 0x10
#define GSI_GSI_CFG_GSI_PWR_CLPS_SHFT 0x4
#define GSI_GSI_CFG_UC_IS_MCS_BMSK 0x8
#define GSI_GSI_CFG_UC_IS_MCS_SHFT 0x3
#define GSI_GSI_CFG_DOUBLE_MCS_CLK_FREQ_BMSK 0x4
#define GSI_GSI_CFG_DOUBLE_MCS_CLK_FREQ_SHFT 0x2
#define GSI_GSI_CFG_MCS_ENABLE_BMSK 0x2
#define GSI_GSI_CFG_MCS_ENABLE_SHFT 0x1
#define GSI_GSI_CFG_GSI_ENABLE_BMSK 0x1
#define GSI_GSI_CFG_GSI_ENABLE_SHFT 0x0
#define GSI_V2_5_GSI_CFG_SLEEP_CLK_DIV_BMSK 0xf00
#define GSI_V2_5_GSI_CFG_SLEEP_CLK_DIV_SHFT 0x8
/* GSI_EE_n_GSI_EE_GENERIC_CMD */
#define GSI_EE_n_GSI_EE_GENERIC_CMD_OPCODE_BMSK 0x1f
#define GSI_EE_n_GSI_EE_GENERIC_CMD_OPCODE_SHFT 0x0
#define GSI_EE_n_GSI_EE_GENERIC_CMD_VIRT_CHAN_IDX_BMSK 0x3e0
#define GSI_EE_n_GSI_EE_GENERIC_CMD_VIRT_CHAN_IDX_SHFT 0x5
#define GSI_EE_n_GSI_EE_GENERIC_CMD_EE_BMSK 0x3c00
#define GSI_EE_n_GSI_EE_GENERIC_CMD_EE_SHFT 0xa
/* GSI_EE_n_CNTXT_GSI_IRQ_EN */
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_MCS_STACK_OVRFLOW_BMSK 0x8
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_MCS_STACK_OVRFLOW_SHFT 0x3
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_CMD_FIFO_OVRFLOW_BMSK 0x4
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_CMD_FIFO_OVRFLOW_SHFT 0x2
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_BUS_ERROR_BMSK 0x2
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_BUS_ERROR_SHFT 0x1
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_BREAK_POINT_BMSK 0x1
#define GSI_EE_n_CNTXT_GSI_IRQ_EN_GSI_BREAK_POINT_SHFT 0x0
#endif /* _GSIHAL_REG_I_H_ */

View File

@@ -6050,9 +6050,6 @@ static enum gsi_ver ipa3_get_gsi_ver(enum ipa_hw_type ipa_hw_type)
case IPA_HW_v4_11: case IPA_HW_v4_11:
gsi_ver = GSI_VER_2_11; gsi_ver = GSI_VER_2_11;
break; break;
case IPA_HW_v5_0:
gsi_ver = GSI_VER_3_0;
break;
default: default:
IPAERR("No GSI version for ipa type %d\n", ipa_hw_type); IPAERR("No GSI version for ipa type %d\n", ipa_hw_type);
WARN_ON(1); WARN_ON(1);
@@ -7288,20 +7285,6 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
goto fail_gsi_map; goto fail_gsi_map;
} }
/*
* Since we now know where the transport's registers live,
* let's set up access to them. This is done since subseqent
* functions, that deal with the transport, require the
* access.
*/
if (gsi_map_base(
ipa3_res.transport_mem_base,
ipa3_res.transport_mem_size) != 0) {
IPAERR("Allocation of gsi base failed\n");
result = -EFAULT;
goto fail_gsi_map;
}
mutex_init(&ipa3_ctx->ipa3_active_clients.mutex); mutex_init(&ipa3_ctx->ipa3_active_clients.mutex);
IPA_ACTIVE_CLIENTS_PREP_SPECIAL(log_info, "PROXY_CLK_VOTE"); IPA_ACTIVE_CLIENTS_PREP_SPECIAL(log_info, "PROXY_CLK_VOTE");
@@ -9014,6 +8997,20 @@ int ipa3_plat_drv_probe(struct platform_device *pdev_p)
return result; return result;
} }
/*
* Since we now know where the transport's registers live,
* let's set up access to them. This is done since subsequent
* functions, that deal with the transport, require the
* access.
*/
if (gsi_map_base(
ipa3_res.transport_mem_base,
ipa3_res.transport_mem_size,
ipa3_get_gsi_ver(ipa3_res.ipa_hw_type)) != 0) {
IPAERR("Allocation of gsi base failed\n");
return -EFAULT;
}
/* Get GSI version */ /* Get GSI version */
ipa3_ctx->gsi_ver = ipa3_get_gsi_ver(ipa3_res.ipa_hw_type); ipa3_ctx->gsi_ver = ipa3_get_gsi_ver(ipa3_res.ipa_hw_type);

View File

@@ -8,7 +8,7 @@
#include <linux/ipa.h> #include <linux/ipa.h>
#include "ipa_i.h" #include "ipa_i.h"
#include "gsi.h" #include "gsi.h"
#include "gsi_reg.h" #include "gsihal.h"
#include "ipa_ut_framework.h" #include "ipa_ut_framework.h"
#define IPA_MHI_TEST_NUM_CHANNELS 8 #define IPA_MHI_TEST_NUM_CHANNELS 8
@@ -322,7 +322,6 @@ struct ipa_mhi_transfer_ring_element {
* struct ipa_test_mhi_context - MHI test context * struct ipa_test_mhi_context - MHI test context
*/ */
struct ipa_test_mhi_context { struct ipa_test_mhi_context {
void __iomem *gsi_mmio;
struct ipa_mem_buffer msi; struct ipa_mem_buffer msi;
struct ipa_mem_buffer ch_ctx_array; struct ipa_mem_buffer ch_ctx_array;
struct ipa_mem_buffer ev_ctx_array; struct ipa_mem_buffer ev_ctx_array;
@@ -809,20 +808,10 @@ static int ipa_test_mhi_suite_setup(void **ppriv)
goto fail_free_ctx; goto fail_free_ctx;
} }
test_mhi_ctx->gsi_mmio =
ioremap(test_mhi_ctx->transport_phys_addr,
test_mhi_ctx->transport_size);
if (!test_mhi_ctx->gsi_mmio) {
IPA_UT_ERR("failed to remap GSI HW size=%lu\n",
test_mhi_ctx->transport_size);
rc = -EFAULT;
goto fail_free_ctx;
}
rc = ipa_test_mhi_alloc_mmio_space(); rc = ipa_test_mhi_alloc_mmio_space();
if (rc) { if (rc) {
IPA_UT_ERR("failed to alloc mmio space"); IPA_UT_ERR("failed to alloc mmio space");
goto fail_iounmap; goto fail_free_ctx;
} }
rc = ipa_mhi_test_setup_data_structures(); rc = ipa_mhi_test_setup_data_structures();
@@ -849,8 +838,6 @@ fail_destroy_data_structures:
ipa_mhi_test_destroy_data_structures(); ipa_mhi_test_destroy_data_structures();
fail_free_mmio_spc: fail_free_mmio_spc:
ipa_test_mhi_free_mmio_space(); ipa_test_mhi_free_mmio_space();
fail_iounmap:
iounmap(test_mhi_ctx->gsi_mmio);
fail_free_ctx: fail_free_ctx:
kfree(test_mhi_ctx); kfree(test_mhi_ctx);
test_mhi_ctx = NULL; test_mhi_ctx = NULL;
@@ -870,7 +857,6 @@ static int ipa_test_mhi_suite_teardown(void *priv)
ipa_teardown_sys_pipe(test_mhi_ctx->test_prod_hdl); ipa_teardown_sys_pipe(test_mhi_ctx->test_prod_hdl);
ipa_mhi_test_destroy_data_structures(); ipa_mhi_test_destroy_data_structures();
ipa_test_mhi_free_mmio_space(); ipa_test_mhi_free_mmio_space();
iounmap(test_mhi_ctx->gsi_mmio);
kfree(test_mhi_ctx); kfree(test_mhi_ctx);
test_mhi_ctx = NULL; test_mhi_ctx = NULL;
@@ -1399,12 +1385,11 @@ static int ipa_mhi_test_q_transfer_re(struct ipa_mem_buffer *mmio,
IPA_UT_LOG("DB to event 0x%llx: base %pa ofst 0x%x\n", IPA_UT_LOG("DB to event 0x%llx: base %pa ofst 0x%x\n",
p_events[event_ring_index].wp, p_events[event_ring_index].wp,
&(test_mhi_ctx->transport_phys_addr), &(test_mhi_ctx->transport_phys_addr),
GSI_EE_n_EV_CH_k_DOORBELL_0_OFFS( gsihal_get_reg_nk_ofst(GSI_EE_n_EV_CH_k_DOORBELL_0, 0,
event_ring_index + ipa3_ctx->mhi_evid_limits[0], 0)); event_ring_index + ipa3_ctx->mhi_evid_limits[0]));
iowrite32(p_events[event_ring_index].wp, gsihal_write_reg_nk(GSI_EE_n_EV_CH_k_DOORBELL_0, 0,
test_mhi_ctx->gsi_mmio + event_ring_index + ipa3_ctx->mhi_evid_limits[0],
GSI_EE_n_EV_CH_k_DOORBELL_0_OFFS( p_events[event_ring_index].wp);
event_ring_index + ipa3_ctx->mhi_evid_limits[0], 0));
} }
for (i = 0; i < buf_array_size; i++) { for (i = 0; i < buf_array_size; i++) {
@@ -1446,12 +1431,13 @@ static int ipa_mhi_test_q_transfer_re(struct ipa_mem_buffer *mmio,
"DB to channel 0x%llx: base %pa ofst 0x%x\n" "DB to channel 0x%llx: base %pa ofst 0x%x\n"
, p_channels[channel_idx].wp , p_channels[channel_idx].wp
, &(test_mhi_ctx->transport_phys_addr) , &(test_mhi_ctx->transport_phys_addr)
, GSI_EE_n_GSI_CH_k_DOORBELL_0_OFFS( , gsihal_get_reg_nk_ofst(
channel_idx, 0)); GSI_EE_n_GSI_CH_k_DOORBELL_0,
iowrite32(p_channels[channel_idx].wp, 0, channel_idx));
test_mhi_ctx->gsi_mmio + gsihal_write_reg_nk(
GSI_EE_n_GSI_CH_k_DOORBELL_0_OFFS( GSI_EE_n_GSI_CH_k_DOORBELL_0,
channel_idx, 0)); 0, channel_idx,
p_channels[channel_idx].wp);
} }
} else { } else {
curr_re->word_C.bits.chain = 1; curr_re->word_C.bits.chain = 1;