2020-03-05 21:28:17 -07:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
|
|
|
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
|
2024-04-16 16:10:18 -07:00
|
|
|
* Copyright (C) 2019-2024 Linaro Ltd.
|
2020-03-05 21:28:17 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/io.h>
|
2024-04-16 16:10:18 -07:00
|
|
|
#include <linux/platform_device.h>
|
2020-03-05 21:28:17 -07:00
|
|
|
|
|
|
|
#include "ipa.h"
|
|
|
|
#include "ipa_reg.h"
|
|
|
|
|
2023-02-08 13:56:48 -07:00
|
|
|
/* Is this register ID valid for the current IPA version? */
|
|
|
|
static bool ipa_reg_id_valid(struct ipa *ipa, enum ipa_reg_id reg_id)
|
2022-09-26 15:09:17 -07:00
|
|
|
{
|
|
|
|
enum ipa_version version = ipa->version;
|
|
|
|
|
|
|
|
switch (reg_id) {
|
2023-03-16 07:51:36 -07:00
|
|
|
case FILT_ROUT_HASH_EN:
|
|
|
|
return version == IPA_VERSION_4_2;
|
|
|
|
|
|
|
|
case FILT_ROUT_HASH_FLUSH:
|
|
|
|
return version < IPA_VERSION_5_0 && version != IPA_VERSION_4_2;
|
|
|
|
|
|
|
|
case FILT_ROUT_CACHE_FLUSH:
|
|
|
|
case ENDP_FILTER_CACHE_CFG:
|
|
|
|
case ENDP_ROUTER_CACHE_CFG:
|
|
|
|
return version >= IPA_VERSION_5_0;
|
|
|
|
|
2022-09-26 15:09:17 -07:00
|
|
|
case IPA_BCR:
|
|
|
|
case COUNTER_CFG:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return version < IPA_VERSION_4_5;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
|
|
|
case IPA_TX_CFG:
|
|
|
|
case FLAVOR_0:
|
|
|
|
case IDLE_INDICATION_CFG:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return version >= IPA_VERSION_3_5;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
|
|
|
case QTIME_TIMESTAMP_CFG:
|
|
|
|
case TIMERS_XO_CLK_DIV_CFG:
|
|
|
|
case TIMERS_PULSE_GRAN_CFG:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return version >= IPA_VERSION_4_5;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
|
|
|
case SRC_RSRC_GRP_45_RSRC_TYPE:
|
|
|
|
case DST_RSRC_GRP_45_RSRC_TYPE:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return version <= IPA_VERSION_3_1 ||
|
2023-03-16 07:51:36 -07:00
|
|
|
version == IPA_VERSION_4_5 ||
|
2023-11-22 16:09:08 -07:00
|
|
|
version >= IPA_VERSION_5_0;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
|
|
|
case SRC_RSRC_GRP_67_RSRC_TYPE:
|
|
|
|
case DST_RSRC_GRP_67_RSRC_TYPE:
|
2023-03-16 07:51:36 -07:00
|
|
|
return version <= IPA_VERSION_3_1 ||
|
2023-11-22 16:09:08 -07:00
|
|
|
version >= IPA_VERSION_5_0;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
|
|
|
case ENDP_FILTER_ROUTER_HSH_CFG:
|
2023-03-16 07:51:35 -07:00
|
|
|
return version < IPA_VERSION_5_0 &&
|
|
|
|
version != IPA_VERSION_4_2;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
|
|
|
case IRQ_SUSPEND_EN:
|
|
|
|
case IRQ_SUSPEND_CLR:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return version >= IPA_VERSION_3_1;
|
2022-09-26 15:09:17 -07:00
|
|
|
|
2023-02-08 13:56:48 -07:00
|
|
|
case COMP_CFG:
|
|
|
|
case CLKON_CFG:
|
|
|
|
case ROUTE:
|
|
|
|
case SHARED_MEM_SIZE:
|
|
|
|
case QSB_MAX_WRITES:
|
|
|
|
case QSB_MAX_READS:
|
|
|
|
case STATE_AGGR_ACTIVE:
|
|
|
|
case LOCAL_PKT_PROC_CNTXT:
|
|
|
|
case AGGR_FORCE_CLOSE:
|
|
|
|
case SRC_RSRC_GRP_01_RSRC_TYPE:
|
|
|
|
case SRC_RSRC_GRP_23_RSRC_TYPE:
|
|
|
|
case DST_RSRC_GRP_01_RSRC_TYPE:
|
|
|
|
case DST_RSRC_GRP_23_RSRC_TYPE:
|
|
|
|
case ENDP_INIT_CTRL:
|
|
|
|
case ENDP_INIT_CFG:
|
|
|
|
case ENDP_INIT_NAT:
|
|
|
|
case ENDP_INIT_HDR:
|
|
|
|
case ENDP_INIT_HDR_EXT:
|
|
|
|
case ENDP_INIT_HDR_METADATA_MASK:
|
|
|
|
case ENDP_INIT_MODE:
|
|
|
|
case ENDP_INIT_AGGR:
|
|
|
|
case ENDP_INIT_HOL_BLOCK_EN:
|
|
|
|
case ENDP_INIT_HOL_BLOCK_TIMER:
|
|
|
|
case ENDP_INIT_DEAGGR:
|
|
|
|
case ENDP_INIT_RSRC_GRP:
|
|
|
|
case ENDP_INIT_SEQ:
|
|
|
|
case ENDP_STATUS:
|
|
|
|
case IPA_IRQ_STTS:
|
|
|
|
case IPA_IRQ_EN:
|
|
|
|
case IPA_IRQ_CLR:
|
|
|
|
case IPA_IRQ_UC:
|
|
|
|
case IRQ_SUSPEND_INFO:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return true; /* These should be defined for all versions */
|
2023-02-08 13:56:48 -07:00
|
|
|
|
2022-09-26 15:09:17 -07:00
|
|
|
default:
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return false;
|
2022-09-26 15:09:17 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
const struct reg *ipa_reg(struct ipa *ipa, enum ipa_reg_id reg_id)
|
2022-09-26 15:09:18 -07:00
|
|
|
{
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
if (WARN(!ipa_reg_id_valid(ipa, reg_id), "invalid reg %u\n", reg_id))
|
2022-09-26 15:09:21 -07:00
|
|
|
return NULL;
|
2022-09-26 15:09:18 -07:00
|
|
|
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
return reg(ipa->regs, reg_id);
|
2022-09-26 15:09:18 -07:00
|
|
|
}
|
|
|
|
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
static const struct regs *ipa_regs(enum ipa_version version)
|
2022-09-26 15:09:19 -07:00
|
|
|
{
|
|
|
|
switch (version) {
|
|
|
|
case IPA_VERSION_3_1:
|
|
|
|
return &ipa_regs_v3_1;
|
|
|
|
case IPA_VERSION_3_5_1:
|
|
|
|
return &ipa_regs_v3_5_1;
|
|
|
|
case IPA_VERSION_4_2:
|
|
|
|
return &ipa_regs_v4_2;
|
|
|
|
case IPA_VERSION_4_5:
|
|
|
|
return &ipa_regs_v4_5;
|
2022-12-08 14:15:29 -07:00
|
|
|
case IPA_VERSION_4_7:
|
|
|
|
return &ipa_regs_v4_7;
|
2022-09-26 15:09:19 -07:00
|
|
|
case IPA_VERSION_4_9:
|
|
|
|
return &ipa_regs_v4_9;
|
|
|
|
case IPA_VERSION_4_11:
|
|
|
|
return &ipa_regs_v4_11;
|
2023-03-21 11:26:42 -07:00
|
|
|
case IPA_VERSION_5_0:
|
|
|
|
return &ipa_regs_v5_0;
|
2023-11-22 16:09:08 -07:00
|
|
|
case IPA_VERSION_5_5:
|
|
|
|
return &ipa_regs_v5_5;
|
2022-09-26 15:09:19 -07:00
|
|
|
default:
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-01 10:02:38 -07:00
|
|
|
int ipa_reg_init(struct ipa *ipa, struct platform_device *pdev)
|
2020-03-05 21:28:17 -07:00
|
|
|
{
|
2024-03-01 10:02:38 -07:00
|
|
|
struct device *dev = &pdev->dev;
|
net: ipa: start generalizing "ipa_reg"
IPA register definitions have evolved with each new version. The
changes required to support more than 32 endpoints in IPA v5.0 made
it best to define a unified mechanism for defining registers and
their fields.
GSI register definitions, meanwhile, have remained fairly stable.
And even as the total number of IPA endpoints goes beyond 32, the
number of GSI channels on a given EE that underly endpoints still
remains 32 or less.
Despite that, GSI v3.0 (which is used with IPA v5.0) extends the
number of channels (and events) it supports to be about 256, and as
a result, many GSI register definitions must change significantly.
To address this, we'll use the same "ipa_reg" mechanism to define
the GSI registers.
As a first step in generalizing the "ipa_reg" to also support GSI
registers, isolate the definitions of the "ipa_reg" and "ipa_regs"
structure types (and some supporting macros) into a new header file,
and remove the "ipa_" and "IPA_" from symbol names.
Separate the IPA register ID validity checking from the generic
check that a register ID is in range. Aside from that, this is
intended to have no functional effect on the code.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-02-08 13:56:51 -07:00
|
|
|
const struct regs *regs;
|
2020-03-05 21:28:17 -07:00
|
|
|
struct resource *res;
|
|
|
|
|
2022-09-26 15:09:19 -07:00
|
|
|
regs = ipa_regs(ipa->version);
|
|
|
|
if (!regs)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
if (WARN_ON(regs->reg_count > IPA_REG_ID_COUNT))
|
|
|
|
return -EINVAL;
|
|
|
|
|
2020-03-05 21:28:17 -07:00
|
|
|
/* Setup IPA register memory */
|
2024-03-01 10:02:38 -07:00
|
|
|
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ipa-reg");
|
2020-03-05 21:28:17 -07:00
|
|
|
if (!res) {
|
|
|
|
dev_err(dev, "DT error getting \"ipa-reg\" memory property\n");
|
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
|
|
|
ipa->reg_virt = ioremap(res->start, resource_size(res));
|
|
|
|
if (!ipa->reg_virt) {
|
|
|
|
dev_err(dev, "unable to remap \"ipa-reg\" memory\n");
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
2022-09-26 15:09:19 -07:00
|
|
|
ipa->regs = regs;
|
2020-03-05 21:28:17 -07:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ipa_reg_exit(struct ipa *ipa)
|
|
|
|
{
|
|
|
|
iounmap(ipa->reg_virt);
|
|
|
|
}
|