From d0ea932ccf20b47377a5c13968b247dca7bee74b Mon Sep 17 00:00:00 2001 From: Ghanim Fodi Date: Wed, 29 Jan 2020 21:22:33 +0200 Subject: [PATCH] Update IPA and GSI driver techpack snapshot Upate the driver to msm-5.4 kernel snapshot as of 'commit ("sched/fair: consider uclamp boost while deciding the start_cpu")'. Change-Id: If63ae521dd26cbf72514cd0b95acfe38ed68cf82 Signed-off-by: Ghanim Fodi --- .../platform/msm/ipa/ipa_clients/ipa_usb.c | 31 ++++++----- drivers/platform/msm/ipa/ipa_v3/ipa.c | 15 +++--- drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c | 4 +- drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 27 +++++++--- .../platform/msm/ipa/ipa_v3/ipa_hw_stats.c | 33 +++++++++--- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 7 ++- drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c | 53 ++++++++++++++++++- .../platform/msm/ipa/ipa_v3/ipa_qmi_service.c | 6 +-- drivers/platform/msm/ipa/ipa_v3/ipa_utils.c | 52 ++++++++++++------ 9 files changed, 170 insertions(+), 58 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_clients/ipa_usb.c b/drivers/platform/msm/ipa/ipa_clients/ipa_usb.c index 846364fca944..e08d66eebe5f 100644 --- a/drivers/platform/msm/ipa/ipa_clients/ipa_usb.c +++ b/drivers/platform/msm/ipa/ipa_clients/ipa_usb.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #include @@ -1590,6 +1590,17 @@ static int ipa3_usb_xdci_connect_internal( return result; } + /* Start MHIP UL channel before starting USB UL channel + * DL channel will be started when voting for PCIe -> LPM Exit. + */ + if (ipa3_is_mhip_offload_enabled()) { + result = ipa_mpm_mhip_xdci_pipe_enable(params->teth_prot); + if (result) { + IPA_USB_ERR("failed to enable MHIP UL channel\n"); + goto connect_fail; + } + } + if (params->teth_prot != IPA_USB_DIAG) { /* Start UL channel */ result = ipa3_xdci_start(params->usb_to_ipa_clnt_hdl, @@ -1610,20 +1621,11 @@ static int ipa3_usb_xdci_connect_internal( goto connect_dl_fail; } - /* MHIP pipe enablement */ - if (ipa3_is_mhip_offload_enabled()) { - result = ipa_mpm_mhip_xdci_pipe_enable(params->teth_prot); - if (result) { - IPA_USB_ERR("failed to enable MHIP channel\n"); - goto connect_teth_prot_fail; - } - } - /* Connect tethering protocol */ result = ipa3_usb_connect_teth_prot(params->teth_prot); if (result) { IPA_USB_ERR("failed to connect teth protocol\n"); - goto connect_mhip_prot_fail; + goto connect_teth_prot_fail; } if (!ipa3_usb_set_state(IPA_USB_CONNECTED, false, ttype)) { @@ -1637,9 +1639,6 @@ static int ipa3_usb_xdci_connect_internal( state_change_connected_fail: ipa3_usb_disconnect_teth_prot(params->teth_prot); -connect_mhip_prot_fail: - if (ipa3_is_mhip_offload_enabled()) - ipa_mpm_mhip_xdci_pipe_disable(params->teth_prot); connect_teth_prot_fail: ipa3_xdci_disconnect(params->ipa_to_usb_clnt_hdl, false, -1); ipa3_reset_gsi_channel(params->ipa_to_usb_clnt_hdl); @@ -1651,8 +1650,12 @@ connect_dl_fail: ipa3_reset_gsi_event_ring(params->usb_to_ipa_clnt_hdl); } connect_ul_fail: + if (ipa3_is_mhip_offload_enabled()) + ipa_mpm_mhip_xdci_pipe_disable(params->teth_prot); +connect_fail: ipa_pm_deactivate_sync( ipa3_usb_ctx->ttype_ctx[ttype].pm_ctx.hdl); + return result; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 21a97fc7d786..99dbd528190e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -3862,22 +3862,23 @@ int _ipa_init_sram_v3(void) if (ipa_get_hw_type() >= IPA_HW_v4_5) { ipa3_sram_set_canary(ipa_sram_mmio, IPA_MEM_PART(nat_tbl_ofst) - 12); - ipa3_sram_set_canary(ipa_sram_mmio, - IPA_MEM_PART(nat_tbl_ofst) - 8); - ipa3_sram_set_canary(ipa_sram_mmio, - IPA_MEM_PART(nat_tbl_ofst) - 4); - ipa3_sram_set_canary(ipa_sram_mmio, IPA_MEM_PART(nat_tbl_ofst)); } if (ipa_get_hw_type() >= IPA_HW_v4_0) { + if (ipa_get_hw_type() < IPA_HW_v4_5) { ipa3_sram_set_canary(ipa_sram_mmio, IPA_MEM_PART(pdn_config_ofst) - 4); ipa3_sram_set_canary(ipa_sram_mmio, IPA_MEM_PART(pdn_config_ofst)); ipa3_sram_set_canary(ipa_sram_mmio, - IPA_MEM_PART(stats_quota_ofst) - 4); + IPA_MEM_PART(stats_quota_q6_ofst) - 4); ipa3_sram_set_canary(ipa_sram_mmio, - IPA_MEM_PART(stats_quota_ofst)); + IPA_MEM_PART(stats_quota_q6_ofst)); + } else { + ipa3_sram_set_canary(ipa_sram_mmio, + IPA_MEM_PART(stats_quota_q6_ofst) - 12); } + } + if (ipa_get_hw_type() <= IPA_HW_v3_5 || ipa_get_hw_type() >= IPA_HW_v4_5) { ipa3_sram_set_canary(ipa_sram_mmio, diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c index dd6d17eaa032..672a24a1dffb 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c @@ -1427,6 +1427,7 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf, "lan_repl_rx_empty=%u\n" "flow_enable=%u\n" "flow_disable=%u\n", + "rx_page_drop_cnt=%u\n", ipa3_ctx->stats.tx_sw_pkts, ipa3_ctx->stats.tx_hw_pkts, ipa3_ctx->stats.tx_non_linear, @@ -1442,7 +1443,8 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf, ipa3_ctx->stats.lan_rx_empty, ipa3_ctx->stats.lan_repl_rx_empty, ipa3_ctx->stats.flow_enable, - ipa3_ctx->stats.flow_disable); + ipa3_ctx->stats.flow_disable, + ipa3_ctx->stats.rx_page_drop_cnt); cnt += nbytes; for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 83da77f0982c..9ed92508d561 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -3398,10 +3398,17 @@ static struct sk_buff *handle_page_completion(struct gsi_chan_xfer_notify IPAERR("update_truesize not supported\n"); if (notify->veid >= GSI_VEID_MAX) { - rx_pkt->sys->free_rx_wrapper(rx_pkt); - if (!rx_page.is_tmp_alloc) - init_page_count(rx_page.page); IPAERR("notify->veid > GSI_VEID_MAX\n"); + if (!rx_page.is_tmp_alloc) { + init_page_count(rx_page.page); + } else { + dma_unmap_page(ipa3_ctx->pdev, rx_page.dma_addr, + rx_pkt->len, DMA_FROM_DEVICE); + __free_pages(rx_pkt->page_data.page, + IPA_WAN_PAGE_ORDER); + } + rx_pkt->sys->free_rx_wrapper(rx_pkt); + IPA_STATS_INC_CNT(ipa3_ctx->stats.rx_page_drop_cnt); return NULL; } @@ -3415,10 +3422,18 @@ static struct sk_buff *handle_page_completion(struct gsi_chan_xfer_notify sys->ep->client == IPA_CLIENT_APPS_LAN_CONS) { rx_skb = alloc_skb(0, GFP_ATOMIC); if (unlikely(!rx_skb)) { - rx_pkt->sys->free_rx_wrapper(rx_pkt); - if (!rx_page.is_tmp_alloc) - init_page_count(rx_page.page); IPAERR("skb alloc failure\n"); + list_del(&rx_pkt->link); + if (!rx_page.is_tmp_alloc) { + init_page_count(rx_page.page); + } else { + dma_unmap_page(ipa3_ctx->pdev, rx_page.dma_addr, + rx_pkt->len, DMA_FROM_DEVICE); + __free_pages(rx_pkt->page_data.page, + IPA_WAN_PAGE_ORDER); + } + rx_pkt->sys->free_rx_wrapper(rx_pkt); + IPA_STATS_INC_CNT(ipa3_ctx->stats.rx_page_drop_cnt); return NULL; } /* go over the list backward to save computations on updating length */ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c index d12a1ea7b830..4587984fd843 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hw_stats.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #include @@ -271,6 +271,27 @@ static void ipa_close_coal_frame(struct ipahal_imm_cmd_pyld **coal_cmd_pyld) ®_write_coal_close, false); } +static bool ipa_validate_quota_stats_sram_size(u32 needed_len) +{ + u32 sram_size; + + /* Starting IPA4.5 Quota stats is split between Q6 and AP */ + + if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) { + IPAERR("Not supported ipa_ver=%d\n", ipa3_ctx->ipa_hw_type); + return false; + } + + sram_size = IPA_MEM_PART(stats_quota_ap_size); + if (needed_len > sram_size) { + IPAERR("SRAM partition too small: %u needed %u\n", + sram_size, needed_len); + return false; + } + + return true; +} + int ipa_init_quota_stats(u32 pipe_bitmask) { struct ipahal_stats_init_pyld *pyld; @@ -301,9 +322,7 @@ int ipa_init_quota_stats(u32 pipe_bitmask) return -EPERM; } - if (pyld->len > IPA_MEM_PART(stats_quota_size)) { - IPAERR("SRAM partition too small: %d needed %d\n", - IPA_MEM_PART(stats_quota_size), pyld->len); + if (!ipa_validate_quota_stats_sram_size(pyld->len)) { ret = -EPERM; goto destroy_init_pyld; } @@ -356,7 +375,7 @@ int ipa_init_quota_stats(u32 pipe_bitmask) quota_base.offset = ipahal_get_reg_n_ofst(IPA_STAT_QUOTA_BASE_n, ipa3_ctx->ee); quota_base.value = ipa3_ctx->smem_restricted_bytes + - IPA_MEM_PART(stats_quota_ofst); + IPA_MEM_PART(stats_quota_ap_ofst); quota_base.value_mask = ~0; quota_base_pyld = ipahal_construct_imm_cmd(IPA_IMM_CMD_REGISTER_WRITE, "a_base, false); @@ -377,7 +396,7 @@ int ipa_init_quota_stats(u32 pipe_bitmask) cmd.size = pyld->len; cmd.system_addr = dma_address; cmd.local_addr = ipa3_ctx->smem_restricted_bytes + - IPA_MEM_PART(stats_quota_ofst); + IPA_MEM_PART(stats_quota_ap_ofst); cmd_pyld = ipahal_construct_imm_cmd( IPA_IMM_CMD_DMA_SHARED_MEM, &cmd, false); if (!cmd_pyld) { @@ -476,7 +495,7 @@ int ipa_get_quota_stats(struct ipa_quota_stats_all *out) cmd.size = mem.size; cmd.system_addr = mem.phys_base; cmd.local_addr = ipa3_ctx->smem_restricted_bytes + - IPA_MEM_PART(stats_quota_ofst) + offset.offset; + IPA_MEM_PART(stats_quota_ap_ofst) + offset.offset; cmd_pyld[num_cmd] = ipahal_construct_imm_cmd( IPA_IMM_CMD_DMA_SHARED_MEM, &cmd, false); if (!cmd_pyld[num_cmd]) { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index dde7e7b80a34..b2c5e7447122 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1397,6 +1397,7 @@ struct ipa3_stats { u32 flow_enable; u32 flow_disable; u32 tx_non_linear; + u32 rx_page_drop_cnt; struct ipa3_page_recycle_stats page_recycle_stats[2]; }; @@ -2318,8 +2319,10 @@ struct ipa3_mem_partition { u32 uc_descriptor_ram_size; u32 pdn_config_ofst; u32 pdn_config_size; - u32 stats_quota_ofst; - u32 stats_quota_size; + u32 stats_quota_q6_ofst; + u32 stats_quota_q6_size; + u32 stats_quota_ap_ofst; + u32 stats_quota_ap_size; u32 stats_tethering_ofst; u32 stats_tethering_size; u32 stats_fnr_ofst; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c b/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c index 31e411dab53c..3504b188bd4c 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. */ #include @@ -74,6 +74,7 @@ #define IPA_MHIP_HOLB_TMO 31 /* value to match granularity on ipa HW 4.5 */ #define IPA_MPM_FLOW_CTRL_ADD 1 #define IPA_MPM_FLOW_CTRL_DELETE 0 +#define IPA_MPM_NUM_OF_INIT_CMD_DESC 2 enum mhip_re_type { MHIP_RE_XFER = 0x2, @@ -478,12 +479,56 @@ static void ipa_mpm_gsi_chan_err_cb(struct gsi_chan_err_notify *err_data) static int ipa_mpm_set_dma_mode(enum ipa_client_type src_pipe, enum ipa_client_type dst_pipe, bool reset) { - int result = 0; + struct ipahal_imm_cmd_pyld *cmd_pyld[IPA_MPM_NUM_OF_INIT_CMD_DESC]; + struct ipahal_imm_cmd_register_write reg_write_coal_close; + struct ipahal_reg_valmask valmask; + struct ipa3_desc desc[IPA_MPM_NUM_OF_INIT_CMD_DESC]; + int i, num_cmd = 0, result = 0; struct ipa_ep_cfg ep_cfg = { { 0 } }; IPA_MPM_FUNC_ENTRY(); IPA_MPM_DBG("DMA from %d to %d reset=%d\n", src_pipe, dst_pipe, reset); + memset(desc, 0, sizeof(desc)); + memset(cmd_pyld, 0, sizeof(cmd_pyld)); + + /* First step is to clear IPA Pipeline before changing DMA mode */ + if (ipa3_get_ep_mapping(src_pipe) != IPA_EP_NOT_ALLOCATED) { + i = ipa3_get_ep_mapping(src_pipe); + reg_write_coal_close.skip_pipeline_clear = false; + reg_write_coal_close.pipeline_clear_options = IPAHAL_HPS_CLEAR; + reg_write_coal_close.offset = ipahal_get_reg_ofst( + IPA_AGGR_FORCE_CLOSE); + ipahal_get_aggr_force_close_valmask(i, &valmask); + reg_write_coal_close.value = valmask.val; + reg_write_coal_close.value_mask = valmask.mask; + cmd_pyld[num_cmd] = ipahal_construct_imm_cmd( + IPA_IMM_CMD_REGISTER_WRITE, + ®_write_coal_close, false); + + if (!cmd_pyld[num_cmd]) { + IPA_MPM_ERR("failed to construct coal close IC\n"); + result = -ENOMEM; + goto destroy_imm_cmd; + } + ipa3_init_imm_cmd_desc(&desc[num_cmd], cmd_pyld[num_cmd]); + ++num_cmd; + } + /* NO-OP IC for ensuring that IPA pipeline is empty */ + cmd_pyld[num_cmd] = + ipahal_construct_nop_imm_cmd(false, IPAHAL_HPS_CLEAR, false); + if (!cmd_pyld[num_cmd]) { + IPA_MPM_ERR("failed to construct NOP imm cmd\n"); + result = -ENOMEM; + goto destroy_imm_cmd; + } + + result = ipa3_send_cmd(num_cmd, desc); + if (result) { + IPAERR("fail to send Reset Pipeline immediate command\n"); + goto destroy_imm_cmd; + } + /* Reset to basic if reset = 1, otherwise set to DMA */ if (reset) ep_cfg.mode.mode = IPA_BASIC; @@ -495,6 +540,10 @@ static int ipa_mpm_set_dma_mode(enum ipa_client_type src_pipe, result = ipa_cfg_ep(ipa_get_ep_mapping(src_pipe), &ep_cfg); IPA_MPM_FUNC_EXIT(); +destroy_imm_cmd: + for (i = 0; i < num_cmd; ++i) + ipahal_destroy_imm_cmd(cmd_pyld[i]); + return result; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index a72a5b60fdaa..86b9fcfde5f7 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. */ #include @@ -589,10 +589,10 @@ static int ipa3_qmi_init_modem_send_sync_msg(void) } req.hw_stats_quota_base_addr_valid = true; req.hw_stats_quota_base_addr = - IPA_MEM_PART(stats_quota_ofst) + smem_restr_bytes; + IPA_MEM_PART(stats_quota_q6_ofst) + smem_restr_bytes; req.hw_stats_quota_size_valid = true; - req.hw_stats_quota_size = IPA_MEM_PART(stats_quota_size); + req.hw_stats_quota_size = IPA_MEM_PART(stats_quota_q6_size); req.hw_drop_stats_base_addr_valid = true; req.hw_drop_stats_base_addr = diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index d601277def63..17d3717352cb 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -3144,8 +3144,10 @@ static struct ipa3_mem_partition ipa_4_1_mem_part = { .uc_descriptor_ram_size = 0x400, .pdn_config_ofst = 0xbd8, .pdn_config_size = 0x50, - .stats_quota_ofst = 0xc30, - .stats_quota_size = 0x60, + .stats_quota_q6_ofst = 0xc30, + .stats_quota_q6_size = 0x60, + .stats_quota_ap_ofst = 0, + .stats_quota_ap_size = 0, .stats_tethering_ofst = 0xc90, .stats_tethering_size = 0x140, .stats_flt_v4_ofst = 0xdd0, @@ -3233,8 +3235,10 @@ static struct ipa3_mem_partition ipa_4_2_mem_part = { .uc_descriptor_ram_size = 0x0, .pdn_config_ofst = 0x9F8, .pdn_config_size = 0x50, - .stats_quota_ofst = 0xa50, - .stats_quota_size = 0x60, + .stats_quota_q6_ofst = 0xa50, + .stats_quota_q6_size = 0x60, + .stats_quota_ap_ofst = 0, + .stats_quota_ap_size = 0, .stats_tethering_ofst = 0xab0, .stats_tethering_size = 0x140, .stats_flt_v4_ofst = 0xbf0, @@ -3299,8 +3303,10 @@ static struct ipa3_mem_partition ipa_4_5_mem_part = { .apps_hdr_proc_ctx_size_ddr = 0x0, .nat_tbl_ofst = 0x1800, .nat_tbl_size = 0xd00, - .stats_quota_ofst = 0x2510, - .stats_quota_size = 0x78, + .stats_quota_q6_ofst = 0x2510, + .stats_quota_q6_size = 0x30, + .stats_quota_ap_ofst = 0x2540, + .stats_quota_ap_size = 0x48, .stats_tethering_ofst = 0x2588, .stats_tethering_size = 0x238, .stats_flt_v4_ofst = 0, @@ -3394,8 +3400,10 @@ static struct ipa3_mem_partition ipa_4_7_mem_part = { .nat_tbl_size = 0xd00, .pdn_config_ofst = 0x1be8, .pdn_config_size = 0x50, - .stats_quota_ofst = 0x1c40, - .stats_quota_size = 0x78, + .stats_quota_q6_ofst = 0x1c40, + .stats_quota_q6_size = 0x30, + .stats_quota_ap_ofst = 0x1c70, + .stats_quota_ap_size = 0x48, .stats_tethering_ofst = 0x1cb8, .stats_tethering_size = 0x238, .stats_flt_v4_ofst = 0, @@ -3485,8 +3493,10 @@ static struct ipa3_mem_partition ipa_4_9_mem_part = { .apps_hdr_proc_ctx_size_ddr = 0x0, .nat_tbl_ofst = 0x1800, .nat_tbl_size = 0xd00, - .stats_quota_ofst = 0x2510, - .stats_quota_size = 0x78, + .stats_quota_q6_ofst = 0x2510, + .stats_quota_q6_size = 0x30, + .stats_quota_ap_ofst = 0x2540, + .stats_quota_ap_size = 0x48, .stats_tethering_ofst = 0x2588, .stats_tethering_size = 0x238, .stats_flt_v4_ofst = 0, @@ -6131,13 +6141,23 @@ int ipa3_init_mem_partition(enum ipa_hw_type type) return -ENODEV; } - IPADBG("QUOTA STATS OFST 0x%x SIZE 0x%x\n", - IPA_MEM_PART(stats_quota_ofst), - IPA_MEM_PART(stats_quota_size)); + IPADBG("Q6 QUOTA STATS OFST 0x%x SIZE 0x%x\n", + IPA_MEM_PART(stats_quota_q6_ofst), + IPA_MEM_PART(stats_quota_q6_size)); - if (IPA_MEM_PART(stats_quota_ofst) & 7) { - IPAERR("QUOTA STATS OFST 0x%x is unaligned\n", - IPA_MEM_PART(stats_quota_ofst)); + if (IPA_MEM_PART(stats_quota_q6_ofst) & 7) { + IPAERR("Q6 QUOTA STATS OFST 0x%x is unaligned\n", + IPA_MEM_PART(stats_quota_q6_ofst)); + return -ENODEV; + } + + IPADBG("AP QUOTA STATS OFST 0x%x SIZE 0x%x\n", + IPA_MEM_PART(stats_quota_ap_ofst), + IPA_MEM_PART(stats_quota_ap_size)); + + if (IPA_MEM_PART(stats_quota_ap_ofst) & 7) { + IPAERR("AP QUOTA STATS OFST 0x%x is unaligned\n", + IPA_MEM_PART(stats_quota_ap_ofst)); return -ENODEV; }