git: 83217f087be7 - stable/14 - amdiommu: changes for stable/14 merge
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 09 Nov 2024 20:19:16 UTC
The branch stable/14 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=83217f087be7de6e250039ca757e5d37facff72a
commit 83217f087be7de6e250039ca757e5d37facff72a
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2024-11-09 19:29:26 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-11-09 19:31:25 +0000
amdiommu: changes for stable/14 merge
to accomodate lack of ilog2() on stable/14. Done as separate commit to
ease future cherry-picks.
Sponsored by: Advanced Micro Devices (AMD)
Sponsored by: The FreeBSD Foundation
---
sys/x86/iommu/amd_cmd.c | 4 ++--
sys/x86/iommu/amd_ctx.c | 2 +-
sys/x86/iommu/amd_drv.c | 2 +-
sys/x86/iommu/amd_event.c | 2 +-
sys/x86/iommu/amd_intrmap.c | 2 +-
sys/x86/iommu/x86_iommu.h | 10 ++++++++++
6 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/sys/x86/iommu/amd_cmd.c b/sys/x86/iommu/amd_cmd.c
index bbc2a8e0ad9f..384d92066e36 100644
--- a/sys/x86/iommu/amd_cmd.c
+++ b/sys/x86/iommu/amd_cmd.c
@@ -320,7 +320,7 @@ amdiommu_init_cmd(struct amdiommu_unit *unit)
{
uint64_t qi_sz, rv;
- unit->x86c.qi_buf_maxsz = ilog2(AMDIOMMU_CMDBUF_MAX / PAGE_SIZE);
+ unit->x86c.qi_buf_maxsz = ilog2_local(AMDIOMMU_CMDBUF_MAX / PAGE_SIZE);
unit->x86c.qi_cmd_sz = AMDIOMMU_CMD_SZ;
iommu_qi_common_init(AMD2IOMMU(unit), amdiommu_qi_task);
get_x86_iommu()->qi_ensure = amdiommu_cmd_ensure;
@@ -334,7 +334,7 @@ amdiommu_init_cmd(struct amdiommu_unit *unit)
* See the description of the ComLen encoding for Command
* buffer Base Address Register.
*/
- qi_sz = ilog2(unit->x86c.inv_queue_size / PAGE_SIZE) + 8;
+ qi_sz = ilog2_local(unit->x86c.inv_queue_size / PAGE_SIZE) + 8;
rv |= qi_sz << AMDIOMMU_CMDBUF_BASE_SZSHIFT;
AMDIOMMU_LOCK(unit);
diff --git a/sys/x86/iommu/amd_ctx.c b/sys/x86/iommu/amd_ctx.c
index b3e85350a995..81e284373fc8 100644
--- a/sys/x86/iommu/amd_ctx.c
+++ b/sys/x86/iommu/amd_ctx.c
@@ -462,7 +462,7 @@ dte_entry_init_one(struct amdiommu_dte *dtep, struct amdiommu_ctx *ctx,
if (unit->irte_enabled) {
dtep->iv = 1;
dtep->i = 0;
- dtep->inttablen = ilog2(unit->irte_nentries);
+ dtep->inttablen = ilog2_local(unit->irte_nentries);
dtep->intrroot = pmap_kextract(unit->irte_x2apic ?
(vm_offset_t)ctx->irtx2 :
(vm_offset_t)ctx->irtb) >> 6;
diff --git a/sys/x86/iommu/amd_drv.c b/sys/x86/iommu/amd_drv.c
index 395cefc65caa..5db7a5225538 100644
--- a/sys/x86/iommu/amd_drv.c
+++ b/sys/x86/iommu/amd_drv.c
@@ -236,7 +236,7 @@ amdiommu_create_dev_tbl(struct amdiommu_unit *sc)
sc->devtbl_obj->domain.dr_policy = DOMAINSET_PREF(dom);
sc->hw_ctrl &= ~AMDIOMMU_CTRL_DEVTABSEG_MASK;
- sc->hw_ctrl |= (uint64_t)segnum_log << ilog2(AMDIOMMU_CTRL_DEVTABSEG_2);
+ sc->hw_ctrl |= (uint64_t)segnum_log << 34; /* ilog2(AMDIOMMU_CTRL_DEVTABSEG_2) */
sc->hw_ctrl |= AMDIOMMU_CTRL_COHERENT;
amdiommu_write8(sc, AMDIOMMU_CTRL, sc->hw_ctrl);
diff --git a/sys/x86/iommu/amd_event.c b/sys/x86/iommu/amd_event.c
index 4a52e42260c2..d4be79474c6a 100644
--- a/sys/x86/iommu/amd_event.c
+++ b/sys/x86/iommu/amd_event.c
@@ -285,7 +285,7 @@ amdiommu_init_event(struct amdiommu_unit *unit)
"amdiommu%d event taskq", unit->iommu.unit);
base_reg = pmap_kextract((vm_offset_t)unit->event_log) |
- (((uint64_t)0x8 + ilog2(unit->event_log_size /
+ (((uint64_t)0x8 + ilog2_local(unit->event_log_size /
AMDIOMMU_EVNTLOG_MIN)) << AMDIOMMU_EVNTLOG_BASE_SZSHIFT);
AMDIOMMU_LOCK(unit);
/*
diff --git a/sys/x86/iommu/amd_intrmap.c b/sys/x86/iommu/amd_intrmap.c
index a4c1a7836268..c5c1706f1f3e 100644
--- a/sys/x86/iommu/amd_intrmap.c
+++ b/sys/x86/iommu/amd_intrmap.c
@@ -374,7 +374,7 @@ amdiommu_init_irt(struct amdiommu_unit *unit)
nentries = 32;
TUNABLE_INT_FETCH("hw.iommu.amd.ir_num", &nentries);
- nentries = roundup_pow_of_two(nentries);
+ nentries = roundup_pow_of_two_local(nentries);
if (nentries < 1)
nentries = 1;
if (nentries > 2048)
diff --git a/sys/x86/iommu/x86_iommu.h b/sys/x86/iommu/x86_iommu.h
index eb4a9907a5d6..835a4623a95e 100644
--- a/sys/x86/iommu/x86_iommu.h
+++ b/sys/x86/iommu/x86_iommu.h
@@ -200,4 +200,14 @@ void iommu_db_print_ctx(struct iommu_ctx *ctx);
void iommu_db_domain_print_contexts(struct iommu_domain *iodom);
void iommu_db_domain_print_mappings(struct iommu_domain *iodom);
+static __inline __pure2 int
+ilog2_local(int n)
+{
+ KASSERT(n != 0, ("ilog argument must be nonzero"));
+ return (8 * sizeof(n) - 1 - __builtin_clz((u_int)n));
+}
+
+#define order_base_2_local(n) ilog2_local(2*(n)-1)
+#define roundup_pow_of_two_local(n) ((__typeof(n))1 << order_base_2_local(n))
+
#endif