* [PATCH 10/13] mm/vma: convert miscellaneous uses of VMA flags in core mm
From: Lorenzo Stoakes @ 2026-06-29 19:25 UTC (permalink / raw)
To: Andrew Morton
Cc: Thomas Bogendoerfer, Madhavan Srinivasan, Michael Ellerman,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Lucas Stach, Inki Dae, Seung-Woo Kim,
Kyungmin Park, Krzysztof Kozlowski, Peter Griffin, Jani Nikula,
Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Rob Clark,
Dmitry Baryshkov, Lyude Paul, Danilo Krummrich, Tomi Valkeinen,
Sandy Huang, Heiko Stübner, Andy Yan, Thierry Reding,
Mikko Perttunen, Jonathan Hunter, Gerd Hoffmann, Dmitry Osipenko,
Zack Rusin, Matthew Brost, Thomas Hellstrom,
Oleksandr Andrushchenko, Helge Deller, Benjamin LaHaise,
Alexander Viro, Christian Brauner, Muchun Song, Oscar Salvador,
David Hildenbrand, Zi Yan, Baolin Wang, Liam R . Howlett,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Hugh Dickins, Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan,
Michal Hocko, Jann Horn, Pedro Falcato, Kees Cook,
Jaroslav Kysela, Takashi Iwai, linux-mips, linux-kernel,
linuxppc-dev, dri-devel, etnaviv, linux-arm-kernel,
linux-samsung-soc, intel-gfx, linux-arm-msm, freedreno, nouveau,
linux-rockchip, linux-tegra, virtualization, intel-xe, xen-devel,
linux-fbdev, linux-aio, linux-fsdevel, linux-mm, linux-sound
In-Reply-To: <cover.1782760670.git.ljs@kernel.org>
Update various uses of legacy flags in vma.c and mmap.c to the new
vma_flags_t type, updating comments alongside them to be consistent.
Also update __install_special_mapping() to rearrange things slightly to
accommodate the changes.
Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
---
mm/mmap.c | 39 +++++++++++++++++++++------------------
mm/vma.c | 16 ++++++++++------
2 files changed, 31 insertions(+), 24 deletions(-)
diff --git a/mm/mmap.c b/mm/mmap.c
index e834ec9273e3..a8546c9250a0 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -557,8 +557,8 @@ unsigned long do_mmap(struct file *file, unsigned long addr,
}
/*
- * Set 'VM_NORESERVE' if we should not account for the
- * memory use of this mapping.
+ * Set VMA_NORESERVE_BIT if we should not account for the memory use
+ * of this mapping.
*/
if (flags & MAP_NORESERVE) {
/* We honor MAP_NORESERVE if allowed to overcommit */
@@ -985,7 +985,7 @@ struct vm_area_struct *find_extend_vma_locked(struct mm_struct *mm, unsigned lon
return NULL;
if (expand_stack_locked(prev, addr))
return NULL;
- if (prev->vm_flags & VM_LOCKED)
+ if (vma_test(prev, VMA_LOCKED_BIT))
populate_vma_page_range(prev, addr, prev->vm_end, NULL);
return prev;
}
@@ -1009,7 +1009,7 @@ struct vm_area_struct *find_extend_vma_locked(struct mm_struct *mm, unsigned lon
start = vma->vm_start;
if (expand_stack_locked(vma, addr))
return NULL;
- if (vma->vm_flags & VM_LOCKED)
+ if (vma_test(vma, VMA_LOCKED_BIT))
populate_vma_page_range(vma, addr, start, NULL);
return vma;
}
@@ -1134,18 +1134,18 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
*/
vma = vma_lookup(mm, start);
- if (!vma || !(vma->vm_flags & VM_SHARED)) {
+ if (!vma || !vma_test(vma, VMA_SHARED_BIT)) {
mmap_read_unlock(mm);
return -EINVAL;
}
- prot |= vma->vm_flags & VM_READ ? PROT_READ : 0;
- prot |= vma->vm_flags & VM_WRITE ? PROT_WRITE : 0;
- prot |= vma->vm_flags & VM_EXEC ? PROT_EXEC : 0;
+ prot |= vma_test(vma, VMA_READ_BIT) ? PROT_READ : 0;
+ prot |= vma_test(vma, VMA_WRITE_BIT) ? PROT_WRITE : 0;
+ prot |= vma_test(vma, VMA_EXEC_BIT) ? PROT_EXEC : 0;
flags &= MAP_NONBLOCK;
flags |= MAP_SHARED | MAP_FIXED | MAP_POPULATE;
- if (vma->vm_flags & VM_LOCKED)
+ if (vma_test(vma, VMA_LOCKED_BIT))
flags |= MAP_LOCKED;
/* Save vm_flags used to calculate prot and flags, and recheck later. */
@@ -1271,7 +1271,7 @@ unsigned long tear_down_vmas(struct mm_struct *mm, struct vma_iterator *vmi,
mmap_assert_write_locked(mm);
vma_iter_set(vmi, vma->vm_end);
do {
- if (vma->vm_flags & VM_ACCOUNT)
+ if (vma_test(vma, VMA_ACCOUNT_BIT))
nr_accounted += vma_pages(vma);
vma_mark_detached(vma);
remove_vma(vma);
@@ -1420,7 +1420,7 @@ static int special_mapping_split(struct vm_area_struct *vma, unsigned long addr)
{
/*
* Forbid splitting special mappings - kernel has expectations over
- * the number of pages in mapping. Together with VM_DONTEXPAND
+ * the number of pages in mapping. Together with VMA_DONTEXPAND_BIT
* the size of vma should stay the same over the special mapping's
* lifetime.
*/
@@ -1692,7 +1692,7 @@ bool mmap_read_lock_maybe_expand(struct mm_struct *mm,
return true;
}
- if (!(new_vma->vm_flags & VM_GROWSDOWN))
+ if (!vma_test(new_vma, VMA_GROWSDOWN_BIT))
return false;
mmap_write_lock(mm);
@@ -1742,7 +1742,7 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
retval = vma_start_write_killable(mpnt);
if (retval < 0)
goto loop_out;
- if (mpnt->vm_flags & VM_DONTCOPY) {
+ if (vma_test(mpnt, VMA_DONTCOPY_BIT)) {
retval = vma_iter_clear_gfp(&vmi, mpnt->vm_start,
mpnt->vm_end, GFP_KERNEL);
if (retval)
@@ -1752,7 +1752,7 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
continue;
}
charge = 0;
- if (mpnt->vm_flags & VM_ACCOUNT) {
+ if (vma_test(mpnt, VMA_ACCOUNT_BIT)) {
unsigned long len = vma_pages(mpnt);
if (security_vm_enough_memory_mm(oldmm, len)) /* sic */
@@ -1770,16 +1770,19 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
retval = dup_userfaultfd(tmp, &uf);
if (retval)
goto fail_nomem_anon_vma_fork;
- if (tmp->vm_flags & VM_WIPEONFORK) {
+
+ if (vma_test(tmp, VMA_WIPEONFORK_BIT)) {
/*
- * VM_WIPEONFORK gets a clean slate in the child.
+ * VMA_WIPEONFORK_BIT gets a clean slate in the child.
* Don't prepare anon_vma until fault since we don't
* copy page for current vma.
*/
tmp->anon_vma = NULL;
} else if (anon_vma_fork(tmp, mpnt))
goto fail_nomem_anon_vma_fork;
- vm_flags_clear(tmp, VM_LOCKED_MASK);
+
+ vma_start_write(tmp);
+ vma_clear_flags_mask(tmp, VMA_LOCKED_MASK);
/*
* Copy/update hugetlb private vma information.
*/
@@ -1812,7 +1815,7 @@ __latent_entropy int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
i_mmap_unlock_write(mapping);
}
- if (!(tmp->vm_flags & VM_WIPEONFORK))
+ if (!vma_test(tmp, VMA_WIPEONFORK_BIT))
retval = copy_page_range(tmp, mpnt);
if (retval) {
diff --git a/mm/vma.c b/mm/vma.c
index b81c05e67a61..ab2ef0f04420 100644
--- a/mm/vma.c
+++ b/mm/vma.c
@@ -3417,23 +3417,27 @@ struct vm_area_struct *__install_special_mapping(
vm_flags_t vm_flags, void *priv,
const struct vm_operations_struct *ops)
{
- int ret;
+ vma_flags_t vma_flags = legacy_to_vma_flags(vm_flags);
struct vm_area_struct *vma;
+ int ret;
vma = vm_area_alloc(mm);
- if (unlikely(vma == NULL))
+ if (unlikely(!vma))
return ERR_PTR(-ENOMEM);
- vma_set_range(vma, addr, addr + len, 0);
- vm_flags |= vma_flags_to_legacy(mm->def_vma_flags) | VM_DONTEXPAND;
+ vma_flags_set_mask(&vma_flags, mm->def_vma_flags);
+ vma_flags_set(&vma_flags, VMA_DONTEXPAND_BIT);
if (pgtable_supports_soft_dirty())
- vm_flags |= VM_SOFTDIRTY;
- vm_flags_init(vma, vm_flags & ~VM_LOCKED_MASK);
+ vma_flags_set(&vma_flags, VMA_SOFTDIRTY_BIT);
+ vma_flags_clear_mask(&vma_flags, VMA_LOCKED_MASK);
+ vma->flags = vma_flags;
vma->vm_page_prot = vma_get_page_prot(vma);
vma->vm_ops = ops;
vma->vm_private_data = priv;
+ vma_set_range(vma, addr, addr + len, 0);
+
ret = insert_vm_struct(mm, vma);
if (ret)
goto out;
--
2.54.0
^ permalink raw reply related
* [PATCH 11/13] mm/mlock: convert mlock code to use vma_flags_t
From: Lorenzo Stoakes @ 2026-06-29 19:25 UTC (permalink / raw)
To: Andrew Morton
Cc: Thomas Bogendoerfer, Madhavan Srinivasan, Michael Ellerman,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Lucas Stach, Inki Dae, Seung-Woo Kim,
Kyungmin Park, Krzysztof Kozlowski, Peter Griffin, Jani Nikula,
Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Rob Clark,
Dmitry Baryshkov, Lyude Paul, Danilo Krummrich, Tomi Valkeinen,
Sandy Huang, Heiko Stübner, Andy Yan, Thierry Reding,
Mikko Perttunen, Jonathan Hunter, Gerd Hoffmann, Dmitry Osipenko,
Zack Rusin, Matthew Brost, Thomas Hellstrom,
Oleksandr Andrushchenko, Helge Deller, Benjamin LaHaise,
Alexander Viro, Christian Brauner, Muchun Song, Oscar Salvador,
David Hildenbrand, Zi Yan, Baolin Wang, Liam R . Howlett,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Hugh Dickins, Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan,
Michal Hocko, Jann Horn, Pedro Falcato, Kees Cook,
Jaroslav Kysela, Takashi Iwai, linux-mips, linux-kernel,
linuxppc-dev, dri-devel, etnaviv, linux-arm-kernel,
linux-samsung-soc, intel-gfx, linux-arm-msm, freedreno, nouveau,
linux-rockchip, linux-tegra, virtualization, intel-xe, xen-devel,
linux-fbdev, linux-aio, linux-fsdevel, linux-mm, linux-sound
In-Reply-To: <cover.1782760670.git.ljs@kernel.org>
Replace use of the legacy vm_flags_t flags with vma_flags_t values
throughout the mlock logic.
Additionally update comments to reflect the changes to be consistent.
No functional change intended.
Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
---
mm/mlock.c | 86 +++++++++++++++++++++++++++++-------------------------
1 file changed, 46 insertions(+), 40 deletions(-)
diff --git a/mm/mlock.c b/mm/mlock.c
index 9c87b3ced65f..1634b125a519 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -329,7 +329,7 @@ static inline bool allow_mlock_munlock(struct folio *folio,
* be split. And the pages are not in VM_LOCKed VMA
* can be reclaimed.
*/
- if (!(vma->vm_flags & VM_LOCKED))
+ if (!vma_test(vma, VMA_LOCKED_BIT))
return true;
/* folio_within_range() cannot take KSM, but any small folio is OK */
@@ -368,7 +368,7 @@ static int mlock_pte_range(pmd_t *pmd, unsigned long addr,
folio = pmd_folio(*pmd);
if (folio_is_zone_device(folio))
goto out;
- if (vma->vm_flags & VM_LOCKED)
+ if (vma_test(vma, VMA_LOCKED_BIT))
mlock_folio(folio);
else
munlock_folio(folio);
@@ -393,7 +393,7 @@ static int mlock_pte_range(pmd_t *pmd, unsigned long addr,
if (!allow_mlock_munlock(folio, vma, start, end, step))
goto next_entry;
- if (vma->vm_flags & VM_LOCKED)
+ if (vma_test(vma, VMA_LOCKED_BIT))
mlock_folio(folio);
else
munlock_folio(folio);
@@ -417,8 +417,8 @@ static int mlock_pte_range(pmd_t *pmd, unsigned long addr,
* @end - end of range in @vma
* @new_vma_flags - the new set of flags for @vma.
*
- * Called for mlock(), mlock2() and mlockall(), to set @vma VM_LOCKED;
- * called for munlock() and munlockall(), to clear VM_LOCKED from @vma.
+ * Called for mlock(), mlock2() and mlockall(), to set @vma VMA_LOCKED_BIT;
+ * called for munlock() and munlockall(), to clear VMA_LOCKED_BIT from @vma.
*/
static void mlock_vma_pages_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end,
@@ -431,14 +431,14 @@ static void mlock_vma_pages_range(struct vm_area_struct *vma,
/*
* There is a slight chance that concurrent page migration,
- * or page reclaim finding a page of this now-VM_LOCKED vma,
+ * or page reclaim finding a page of this now-VMA_LOCKED_BIT vma,
* will call mlock_vma_folio() and raise page's mlock_count:
* double counting, leaving the page unevictable indefinitely.
- * Communicate this danger to mlock_vma_folio() with VM_IO,
- * which is a VM_SPECIAL flag not allowed on VM_LOCKED vmas.
+ * Communicate this danger to mlock_vma_folio() with VMA_IO_BIT,
+ * which is a VMA_SPECIAL_FLAGS flag not allowed on VMA_LOCKED_BIT vmas.
* mmap_lock is held in write mode here, so this weird
* combination should not be visible to other mmap_lock users;
- * but WRITE_ONCE so rmap walkers must see VM_IO if VM_LOCKED.
+ * but WRITE_ONCE so rmap walkers must see VMA_IO_BIT if VMA_LOCKED_BIT.
*/
if (vma_flags_test(new_vma_flags, VMA_LOCKED_BIT))
vma_flags_set(new_vma_flags, VMA_IO_BIT);
@@ -458,7 +458,7 @@ static void mlock_vma_pages_range(struct vm_area_struct *vma,
/*
* mlock_fixup - handle mlock[all]/munlock[all] requests.
*
- * Filters out "special" vmas -- VM_LOCKED never gets set for these, and
+ * Filters out "special" vmas -- VMA_LOCKED_BIT never gets set for these, and
* munlock is a no-op. However, for some special vmas, we go ahead and
* populate the ptes.
*
@@ -466,24 +466,23 @@ static void mlock_vma_pages_range(struct vm_area_struct *vma,
*/
static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,
struct vm_area_struct **prev, unsigned long start,
- unsigned long end, vm_flags_t newflags)
+ unsigned long end, vma_flags_t *new_vma_flags)
{
- vma_flags_t new_vma_flags = legacy_to_vma_flags(newflags);
const vma_flags_t old_vma_flags = vma->flags;
struct mm_struct *mm = vma->vm_mm;
int nr_pages;
int ret = 0;
- if (vma_flags_same_pair(&old_vma_flags, &new_vma_flags) ||
+ if (vma_flags_same_pair(&old_vma_flags, new_vma_flags) ||
vma_is_secretmem(vma) || !vma_supports_mlock(vma)) {
/*
- * Don't set VM_LOCKED or VM_LOCKONFAULT and don't count.
+ * Don't set VMA_LOCKED_BIT or VM_LOCKONFAULT and don't count.
* For secretmem, don't allow the memory to be unlocked.
*/
goto out;
}
- vma = vma_modify_flags(vmi, *prev, vma, start, end, &new_vma_flags);
+ vma = vma_modify_flags(vmi, *prev, vma, start, end, new_vma_flags);
if (IS_ERR(vma)) {
ret = PTR_ERR(vma);
goto out;
@@ -493,7 +492,7 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,
* Keep track of amount of locked VM.
*/
nr_pages = (end - start) >> PAGE_SHIFT;
- if (!vma_flags_test(&new_vma_flags, VMA_LOCKED_BIT))
+ if (!vma_flags_test(new_vma_flags, VMA_LOCKED_BIT))
nr_pages = -nr_pages;
else if (vma_flags_test(&old_vma_flags, VMA_LOCKED_BIT))
nr_pages = 0;
@@ -502,15 +501,15 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,
/*
* vm_flags is protected by the mmap_lock held in write mode.
* It's okay if try_to_unmap_one unmaps a page just after we
- * set VM_LOCKED, populate_vma_page_range will bring it back.
+ * set VMA_LOCKED_BIT, populate_vma_page_range will bring it back.
*/
- if (vma_flags_test(&new_vma_flags, VMA_LOCKED_BIT) &&
+ if (vma_flags_test(new_vma_flags, VMA_LOCKED_BIT) &&
vma_flags_test(&old_vma_flags, VMA_LOCKED_BIT)) {
/* No work to do, and mlocking twice would be wrong */
vma_start_write(vma);
- vma->flags = new_vma_flags;
+ vma->flags = *new_vma_flags;
} else {
- mlock_vma_pages_range(vma, start, end, &new_vma_flags);
+ mlock_vma_pages_range(vma, start, end, new_vma_flags);
}
out:
*prev = vma;
@@ -518,7 +517,7 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,
}
static int apply_vma_lock_flags(unsigned long start, size_t len,
- vm_flags_t flags)
+ const vma_flags_t *flags)
{
unsigned long nstart, end, tmp;
struct vm_area_struct *vma, *prev;
@@ -543,18 +542,20 @@ static int apply_vma_lock_flags(unsigned long start, size_t len,
tmp = vma->vm_start;
for_each_vma_range(vmi, vma, end) {
int error;
- vm_flags_t newflags;
+ vma_flags_t newflags;
if (vma->vm_start != tmp)
return -ENOMEM;
- newflags = vma->vm_flags & ~VM_LOCKED_MASK;
- newflags |= flags;
+ newflags = vma->flags;
+ vma_flags_clear_mask(&newflags, VMA_LOCKED_MASK);
+ vma_flags_set_mask(&newflags, *flags);
+
/* Here we know that vma->vm_start <= nstart < vma->vm_end. */
tmp = vma->vm_end;
if (tmp > end)
tmp = end;
- error = mlock_fixup(&vmi, vma, &prev, nstart, tmp, newflags);
+ error = mlock_fixup(&vmi, vma, &prev, nstart, tmp, &newflags);
if (error)
return error;
tmp = vma_iter_end(&vmi);
@@ -589,7 +590,7 @@ static unsigned long count_mm_mlocked_page_nr(struct mm_struct *mm,
end = start + len;
for_each_vma_range(vmi, vma, end) {
- if (vma->vm_flags & VM_LOCKED) {
+ if (vma_test(vma, VMA_LOCKED_BIT)) {
if (start > vma->vm_start)
count -= (start - vma->vm_start);
if (end < vma->vm_end) {
@@ -615,7 +616,8 @@ static int __mlock_posix_error_return(long retval)
return retval;
}
-static __must_check int do_mlock(unsigned long start, size_t len, vm_flags_t flags)
+static __must_check int do_mlock(unsigned long start, size_t len,
+ vma_flags_t *flags)
{
unsigned long locked;
unsigned long lock_limit;
@@ -664,24 +666,27 @@ static __must_check int do_mlock(unsigned long start, size_t len, vm_flags_t fla
SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
{
- return do_mlock(start, len, VM_LOCKED);
+ vma_flags_t flags = mk_vma_flags(VMA_LOCKED_BIT);
+
+ return do_mlock(start, len, &flags);
}
SYSCALL_DEFINE3(mlock2, unsigned long, start, size_t, len, int, flags)
{
- vm_flags_t vm_flags = VM_LOCKED;
+ vma_flags_t vma_flags = mk_vma_flags(VMA_LOCKED_BIT);
if (flags & ~MLOCK_ONFAULT)
return -EINVAL;
if (flags & MLOCK_ONFAULT)
- vm_flags |= VM_LOCKONFAULT;
+ vma_flags_set(&vma_flags, VMA_LOCKONFAULT_BIT);
- return do_mlock(start, len, vm_flags);
+ return do_mlock(start, len, &vma_flags);
}
SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
{
+ vma_flags_t flags = EMPTY_VMA_FLAGS;
int ret;
start = untagged_addr(start);
@@ -691,7 +696,7 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
if (mmap_write_lock_killable(current->mm))
return -EINTR;
- ret = apply_vma_lock_flags(start, len, 0);
+ ret = apply_vma_lock_flags(start, len, &flags);
mmap_write_unlock(current->mm);
return ret;
@@ -705,14 +710,15 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
* There are a couple of subtleties with this. If mlockall() is called multiple
* times with different flags, the values do not necessarily stack. If mlockall
* is called once including the MCL_FUTURE flag and then a second time without
- * it, VM_LOCKED and VM_LOCKONFAULT will be cleared from mm->def_vma_flags.
+ * it, VMA_LOCKED_BIT and VMA_LOCKONFAULT_BIT will be cleared from
+ * mm->def_vma_flags.
*/
static int apply_mlockall_flags(int flags)
{
VMA_ITERATOR(vmi, current->mm, 0);
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma, *prev = NULL;
- vm_flags_t to_add = 0;
+ vma_flags_t to_add = EMPTY_VMA_FLAGS;
vma_flags_clear_mask(&mm->def_vma_flags, VMA_LOCKED_MASK);
if (flags & MCL_FUTURE) {
@@ -726,20 +732,20 @@ static int apply_mlockall_flags(int flags)
}
if (flags & MCL_CURRENT) {
- to_add |= VM_LOCKED;
+ vma_flags_set(&to_add, VMA_LOCKED_BIT);
if (flags & MCL_ONFAULT)
- to_add |= VM_LOCKONFAULT;
+ vma_flags_set(&to_add, VMA_LOCKONFAULT_BIT);
}
for_each_vma(vmi, vma) {
int error;
- vm_flags_t newflags;
+ vma_flags_t newflags = vma->flags;
- newflags = vma->vm_flags & ~VM_LOCKED_MASK;
- newflags |= to_add;
+ vma_flags_clear_mask(&newflags, VMA_LOCKED_MASK);
+ vma_flags_set_mask(&newflags, to_add);
error = mlock_fixup(&vmi, vma, &prev, vma->vm_start, vma->vm_end,
- newflags);
+ &newflags);
/* Ignore errors, but prev needs fixing up. */
if (error)
prev = vma;
--
2.54.0
^ permalink raw reply related
* [PATCH 12/13] mm/mprotect: convert mprotect code to use vma_flags_t
From: Lorenzo Stoakes @ 2026-06-29 19:25 UTC (permalink / raw)
To: Andrew Morton
Cc: Thomas Bogendoerfer, Madhavan Srinivasan, Michael Ellerman,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Lucas Stach, Inki Dae, Seung-Woo Kim,
Kyungmin Park, Krzysztof Kozlowski, Peter Griffin, Jani Nikula,
Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Rob Clark,
Dmitry Baryshkov, Lyude Paul, Danilo Krummrich, Tomi Valkeinen,
Sandy Huang, Heiko Stübner, Andy Yan, Thierry Reding,
Mikko Perttunen, Jonathan Hunter, Gerd Hoffmann, Dmitry Osipenko,
Zack Rusin, Matthew Brost, Thomas Hellstrom,
Oleksandr Andrushchenko, Helge Deller, Benjamin LaHaise,
Alexander Viro, Christian Brauner, Muchun Song, Oscar Salvador,
David Hildenbrand, Zi Yan, Baolin Wang, Liam R . Howlett,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Hugh Dickins, Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan,
Michal Hocko, Jann Horn, Pedro Falcato, Kees Cook,
Jaroslav Kysela, Takashi Iwai, linux-mips, linux-kernel,
linuxppc-dev, dri-devel, etnaviv, linux-arm-kernel,
linux-samsung-soc, intel-gfx, linux-arm-msm, freedreno, nouveau,
linux-rockchip, linux-tegra, virtualization, intel-xe, xen-devel,
linux-fbdev, linux-aio, linux-fsdevel, linux-mm, linux-sound
In-Reply-To: <cover.1782760670.git.ljs@kernel.org>
Replace use of the legacy vm_flags_t flags with vma_flags_t values
throughout the mprotect logic.
Note that we retain the legacy vm_flags_t bit shifting code in
do_mprotect_key(), deferring a vma_flags_t approach to this for the time
being.
Additionally update comments to reflect the changes to be consistent.
No functional change intended.
Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
---
mm/mprotect.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/mm/mprotect.c b/mm/mprotect.c
index 9cbf932b028c..c9504b2a2525 100644
--- a/mm/mprotect.c
+++ b/mm/mprotect.c
@@ -40,7 +40,7 @@
static bool maybe_change_pte_writable(struct vm_area_struct *vma, pte_t pte)
{
- if (WARN_ON_ONCE(!(vma->vm_flags & VM_WRITE)))
+ if (WARN_ON_ONCE(!vma_test(vma, VMA_WRITE_BIT)))
return false;
/* Don't touch entries that are not even readable. */
@@ -97,7 +97,7 @@ static bool can_change_shared_pte_writable(struct vm_area_struct *vma,
bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr,
pte_t pte)
{
- if (!(vma->vm_flags & VM_SHARED))
+ if (!vma_test(vma, VMA_SHARED_BIT))
return can_change_private_pte_writable(vma, addr, pte);
return can_change_shared_pte_writable(vma, pte);
@@ -194,7 +194,7 @@ static __always_inline void set_write_prot_commit_flush_ptes(struct vm_area_stru
{
bool set_write;
- if (vma->vm_flags & VM_SHARED) {
+ if (vma_test(vma, VMA_SHARED_BIT)) {
set_write = can_change_shared_pte_writable(vma, ptent);
prot_commit_flush_ptes(vma, addr, ptep, oldpte, ptent, nr_ptes,
/* idx = */ 0, set_write, tlb);
@@ -811,8 +811,8 @@ mprotect_fixup(struct vma_iterator *vmi, struct mmu_gather *tlb,
vm_unacct_memory(nrpages);
/*
- * Private VM_LOCKED VMA becoming writable: trigger COW to avoid major
- * fault on access.
+ * Private VMA_LOCKED_BIT VMA becoming writable: trigger COW to avoid
+ * major fault on access.
*/
if (vma_flags_test(&new_vma_flags, VMA_WRITE_BIT) &&
vma_flags_test(&old_vma_flags, VMA_LOCKED_BIT) &&
@@ -886,7 +886,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
goto out;
start = vma->vm_start;
error = -EINVAL;
- if (!(vma->vm_flags & VM_GROWSDOWN))
+ if (!vma_test(vma, VMA_GROWSDOWN_BIT))
goto out;
} else {
if (vma->vm_start > start)
@@ -894,7 +894,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
if (unlikely(grows & PROT_GROWSUP)) {
end = vma->vm_end;
error = -EINVAL;
- if (!(vma->vm_flags & VM_GROWSUP))
+ if (!vma_test(vma, VMA_GROWSUP_BIT))
goto out;
}
}
@@ -918,7 +918,7 @@ static int do_mprotect_pkey(unsigned long start, size_t len,
}
/* Does the application expect PROT_READ to imply PROT_EXEC */
- if (rier && (vma->vm_flags & VM_MAYEXEC))
+ if (rier && vma_test(vma, VMA_MAYEXEC_BIT))
prot |= PROT_EXEC;
/*
--
2.54.0
^ permalink raw reply related
* [PATCH 13/13] mm/mremap: convert mremap code to use vma_flags_t
From: Lorenzo Stoakes @ 2026-06-29 19:25 UTC (permalink / raw)
To: Andrew Morton
Cc: Thomas Bogendoerfer, Madhavan Srinivasan, Michael Ellerman,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Lucas Stach, Inki Dae, Seung-Woo Kim,
Kyungmin Park, Krzysztof Kozlowski, Peter Griffin, Jani Nikula,
Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Rob Clark,
Dmitry Baryshkov, Lyude Paul, Danilo Krummrich, Tomi Valkeinen,
Sandy Huang, Heiko Stübner, Andy Yan, Thierry Reding,
Mikko Perttunen, Jonathan Hunter, Gerd Hoffmann, Dmitry Osipenko,
Zack Rusin, Matthew Brost, Thomas Hellstrom,
Oleksandr Andrushchenko, Helge Deller, Benjamin LaHaise,
Alexander Viro, Christian Brauner, Muchun Song, Oscar Salvador,
David Hildenbrand, Zi Yan, Baolin Wang, Liam R . Howlett,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Hugh Dickins, Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan,
Michal Hocko, Jann Horn, Pedro Falcato, Kees Cook,
Jaroslav Kysela, Takashi Iwai, linux-mips, linux-kernel,
linuxppc-dev, dri-devel, etnaviv, linux-arm-kernel,
linux-samsung-soc, intel-gfx, linux-arm-msm, freedreno, nouveau,
linux-rockchip, linux-tegra, virtualization, intel-xe, xen-devel,
linux-fbdev, linux-aio, linux-fsdevel, linux-mm, linux-sound
In-Reply-To: <cover.1782760670.git.ljs@kernel.org>
Replace use of the legacy vm_flags_t flags with vma_flags_t values
throughout the mremap logic.
Additionally update comments to reflect the changes to be consistent.
No functional change intended.
Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
---
mm/mremap.c | 38 ++++++++++++++++++++------------------
1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/mm/mremap.c b/mm/mremap.c
index 079a0ba0c4a7..0ea43302b7ed 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -68,7 +68,7 @@ struct vma_remap_struct {
bool populate_expand; /* mlock()'d expanded, must populate. */
enum mremap_type remap_type; /* expand, shrink, etc. */
bool mmap_locked; /* Is mm currently write-locked? */
- unsigned long charged; /* If VM_ACCOUNT, # pages to account. */
+ unsigned long charged; /* If VMA_ACCOUNT_BIT, # pgs to account */
bool vmi_needs_invalidate; /* Is the VMA iterator invalidated? */
};
@@ -954,7 +954,7 @@ static unsigned long vrm_set_new_addr(struct vma_remap_struct *vrm)
if (vrm->flags & MREMAP_FIXED)
map_flags |= MAP_FIXED;
- if (vma->vm_flags & VM_MAYSHARE)
+ if (vma_test(vma, VMA_MAYSHARE_BIT))
map_flags |= MAP_SHARED;
res = get_unmapped_area(vma->vm_file, new_addr, vrm->new_len, pgoff,
@@ -976,7 +976,7 @@ static bool vrm_calc_charge(struct vma_remap_struct *vrm)
{
unsigned long charged;
- if (!(vrm->vma->vm_flags & VM_ACCOUNT))
+ if (!vma_test(vrm->vma, VMA_ACCOUNT_BIT))
return true;
/*
@@ -1003,7 +1003,7 @@ static bool vrm_calc_charge(struct vma_remap_struct *vrm)
*/
static void vrm_uncharge(struct vma_remap_struct *vrm)
{
- if (!(vrm->vma->vm_flags & VM_ACCOUNT))
+ if (!vma_test(vrm->vma, VMA_ACCOUNT_BIT))
return;
vm_unacct_memory(vrm->charged);
@@ -1023,7 +1023,7 @@ static void vrm_stat_account(struct vma_remap_struct *vrm,
struct vm_area_struct *vma = vrm->vma;
vm_stat_account(mm, vma->vm_flags, pages);
- if (vma->vm_flags & VM_LOCKED)
+ if (vma_test(vma, VMA_LOCKED_BIT))
mm->locked_vm += pages;
}
@@ -1167,7 +1167,7 @@ static void unmap_source_vma(struct vma_remap_struct *vrm)
* arose, in which case we _do_ wish to unmap the _new_ VMA, which means
* we actually _do_ want it be unaccounted.
*/
- bool accountable_move = (vma->vm_flags & VM_ACCOUNT) &&
+ bool accountable_move = vma_test(vma, VMA_ACCOUNT_BIT) &&
!(vrm->flags & MREMAP_DONTUNMAP);
/*
@@ -1186,7 +1186,7 @@ static void unmap_source_vma(struct vma_remap_struct *vrm)
* portions of the original VMA that remain.
*/
if (accountable_move) {
- vm_flags_clear(vma, VM_ACCOUNT);
+ vma_clear_flags(vma, VMA_ACCOUNT_BIT);
/* We are about to split vma, so store the start/end. */
vm_start = vma->vm_start;
vm_end = vma->vm_end;
@@ -1211,8 +1211,8 @@ static void unmap_source_vma(struct vma_remap_struct *vrm)
* | |
* |-------------|
*
- * Having cleared VM_ACCOUNT from the whole VMA, after we unmap above
- * we'll end up with:
+ * Having cleared VMA_ACCOUNT_BIT from the whole VMA, after we unmap
+ * above we'll end up with:
*
* addr end
* | |
@@ -1232,13 +1232,15 @@ static void unmap_source_vma(struct vma_remap_struct *vrm)
if (vm_start < addr) {
struct vm_area_struct *prev = vma_prev(&vmi);
- vm_flags_set(prev, VM_ACCOUNT); /* Acquires VMA lock. */
+ vma_start_write(prev);
+ vma_set_flags(prev, VMA_ACCOUNT_BIT);
}
if (vm_end > end) {
struct vm_area_struct *next = vma_next(&vmi);
- vm_flags_set(next, VM_ACCOUNT); /* Acquires VMA lock. */
+ vma_start_write(next);
+ vma_set_flags(next, VMA_ACCOUNT_BIT);
}
}
}
@@ -1321,8 +1323,8 @@ static void dontunmap_complete(struct vma_remap_struct *vrm,
unsigned long old_start = vrm->vma->vm_start;
unsigned long old_end = vrm->vma->vm_end;
- /* We always clear VM_LOCKED[ONFAULT] on the old VMA. */
- vm_flags_clear(vrm->vma, VM_LOCKED_MASK);
+ /* We always clear VMA_LOCKED[ONFAULT]_BIT on the old VMA. */
+ vma_clear_flags_mask(vrm->vma, VMA_LOCKED_MASK);
/*
* anon_vma links of the old vma is no longer needed after its page
@@ -1758,14 +1760,14 @@ static int check_prep_vma(struct vma_remap_struct *vrm)
* based on the original. There are no known use cases for this
* behavior. As a result, fail such attempts.
*/
- if (!old_len && !(vma->vm_flags & (VM_SHARED | VM_MAYSHARE))) {
+ if (!old_len && !vma_test_any(vma, VMA_SHARED_BIT, VMA_MAYSHARE_BIT)) {
pr_warn_once("%s (%d): attempted to duplicate a private mapping with mremap. This is not supported.\n",
current->comm, current->pid);
return -EINVAL;
}
if ((vrm->flags & MREMAP_DONTUNMAP) &&
- (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP)))
+ vma_test_any(vma, VMA_DONTEXPAND_BIT, VMA_PFNMAP_BIT))
return -EINVAL;
/*
@@ -1795,7 +1797,7 @@ static int check_prep_vma(struct vma_remap_struct *vrm)
return 0;
/* We are expanding and the VMA is mlock()'d so we need to populate. */
- if (vma->vm_flags & VM_LOCKED)
+ if (vma_test(vma, VMA_LOCKED_BIT))
vrm->populate_expand = true;
/* Need to be careful about a growing mapping */
@@ -1803,10 +1805,10 @@ static int check_prep_vma(struct vma_remap_struct *vrm)
if (pgoff + (new_len >> PAGE_SHIFT) < pgoff)
return -EINVAL;
- if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP))
+ if (vma_test_any(vma, VMA_DONTEXPAND_BIT, VMA_PFNMAP_BIT))
return -EFAULT;
- if (!mlock_future_ok(mm, vma->vm_flags & VM_LOCKED, vrm->delta))
+ if (!mlock_future_ok(mm, vma_test(vma, VMA_LOCKED_BIT), vrm->delta))
return -EAGAIN;
if (!may_expand_vm(mm, &vma->flags, vrm->delta >> PAGE_SHIFT))
--
2.54.0
^ permalink raw reply related
* Re: [PATCH 01/13] mm: introduce vma_flags_can_grow() and vma_can_grow()
From: Zi Yan @ 2026-06-29 20:26 UTC (permalink / raw)
To: Lorenzo Stoakes, Andrew Morton
Cc: Thomas Bogendoerfer, Madhavan Srinivasan, Michael Ellerman,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Lucas Stach, Inki Dae, Seung-Woo Kim,
Kyungmin Park, Krzysztof Kozlowski, Peter Griffin, Jani Nikula,
Joonas Lahtinen, Rodrigo Vivi, Tvrtko Ursulin, Rob Clark,
Dmitry Baryshkov, Lyude Paul, Danilo Krummrich, Tomi Valkeinen,
Sandy Huang, Heiko Stübner, Andy Yan, Thierry Reding,
Mikko Perttunen, Jonathan Hunter, Gerd Hoffmann, Dmitry Osipenko,
Zack Rusin, Matthew Brost, Thomas Hellstrom,
Oleksandr Andrushchenko, Helge Deller, Benjamin LaHaise,
Alexander Viro, Christian Brauner, Muchun Song, Oscar Salvador,
David Hildenbrand, Baolin Wang, Liam R . Howlett, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Hugh Dickins,
Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
Jann Horn, Pedro Falcato, Kees Cook, Jaroslav Kysela,
Takashi Iwai, linux-mips, linux-kernel, linuxppc-dev, dri-devel,
etnaviv, linux-arm-kernel, linux-samsung-soc, intel-gfx,
linux-arm-msm, freedreno, nouveau, linux-rockchip, linux-tegra,
virtualization, intel-xe, xen-devel, linux-fbdev, linux-aio,
linux-fsdevel, linux-mm, linux-sound
In-Reply-To: <f2e8c32515d328db62279cc8bab8398ea278d74f.1782760670.git.ljs@kernel.org>
On Mon Jun 29, 2026 at 3:25 PM EDT, Lorenzo Stoakes wrote:
> These test whether the VMA has stack sematics, i.e. is able to grow upwards
> or downwards depending on the architecture.
>
> In order to account for arches which do not support upward-growing stacks,
> introduce VMA_GROWSUP whose definition depends on the architecture
> supporting it, and use vma_flags_test_single_mask() in vma_flags_can_grow()
> to account for this.
>
> Update the VMA userland tests to reflect the changes
>
> No functional change intended.
>
> Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
> ---
> include/linux/mm.h | 21 ++++++++++++++++++---
> tools/testing/vma/include/dup.h | 4 ++++
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 868b2334bff3..cf7df1569052 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -472,6 +472,7 @@ enum {
> #define VM_SAO INIT_VM_FLAG(SAO)
> #elif defined(CONFIG_PARISC)
> #define VM_GROWSUP INIT_VM_FLAG(GROWSUP)
> +#define VMA_GROWSUP mk_vma_flags(VMA_GROWSUP_BIT)
> #elif defined(CONFIG_SPARC64)
> #define VM_SPARC_ADI INIT_VM_FLAG(SPARC_ADI)
> #define VM_ARCH_CLEAR INIT_VM_FLAG(ARCH_CLEAR)
> @@ -483,6 +484,7 @@ enum {
> #endif
> #ifndef VM_GROWSUP
> #define VM_GROWSUP VM_NONE
> +#define VMA_GROWSUP EMPTY_VMA_FLAGS
> #endif
> #ifdef CONFIG_ARM64_MTE
> #define VM_MTE INIT_VM_FLAG(MTE)
> @@ -1563,11 +1565,24 @@ static inline bool vma_is_initial_stack(const struct vm_area_struct *vma)
> vma->vm_end >= vma->vm_mm->start_stack;
> }
>
> -static inline bool vma_is_temporary_stack(const struct vm_area_struct *vma)
> +static inline bool vma_flags_can_grow(const vma_flags_t *flags)
> {
> - int maybe_stack = vma->vm_flags & (VM_GROWSDOWN | VM_GROWSUP);
> + if (vma_flags_test_single_mask(flags, VMA_GROWSUP))
> + return true;
> + if (vma_flags_test(flags, VMA_GROWSDOWN_BIT))
> + return true;
> +
> + return false;
> +}
>
> - if (!maybe_stack)
> +static inline bool vma_can_grow(const struct vm_area_struct *vma)
> +{
> + return vma_flags_can_grow(&vma->flags);
Would it save vma_flags_can_grow() if we do below?
return vma_test(vma, VMA_GROWSDOWN_BIT) || vma_test_single_mask(vma, VMA_GROWSUP);
I find these two functions when I am reading mm.h.
> +}
> +
> +static inline bool vma_is_temporary_stack(const struct vm_area_struct *vma)
> +{
> + if (!vma_can_grow(vma))
> return false;
>
> if ((vma->vm_flags & VM_STACK_INCOMPLETE_SETUP) ==
> diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/dup.h
> index 5d7d0afd7765..6f5bcd7fbcd8 100644
> --- a/tools/testing/vma/include/dup.h
> +++ b/tools/testing/vma/include/dup.h
> @@ -245,8 +245,10 @@ enum {
> #define VM_STACK INIT_VM_FLAG(STACK)
> #ifdef CONFIG_STACK_GROWS_UP
> #define VM_STACK_EARLY INIT_VM_FLAG(STACK_EARLY)
> +#define VMA_STACK_EARLY mk_vma_flags(VMA_STACK_EARLY_BIT)
> #else
> #define VM_STACK_EARLY VM_NONE
> +#define VMA_STACK_EARLY EMPTY_VMA_FLAGS
> #endif
> #ifdef CONFIG_ARCH_HAS_PKEYS
> #define VM_PKEY_SHIFT ((__force int)VMA_HIGH_ARCH_0_BIT)
> @@ -315,6 +317,8 @@ enum {
>
> /* Bits set in the VMA until the stack is in its final location */
> #define VM_STACK_INCOMPLETE_SETUP (VM_RAND_READ | VM_SEQ_READ | VM_STACK_EARLY)
> +#define VMA_STACK_INCOMPLETE_SETUP append_vma_flags( \
> + VMA_STACK_EARLY, VMA_RAND_READ_BIT, VMA_SEQ_READ_BIT)
>
> #define TASK_EXEC_BIT ((current->personality & READ_IMPLIES_EXEC) ? \
> VM_EXEC_BIT : VM_READ_BIT)
Why are VMA_STACK_EARLY and VMA_STACK_INCOMPLETE_SETUP added here but
not in mm.h?
--
Best Regards,
Yan, Zi
^ permalink raw reply
* [PATCH net-next 0/2] net: remove the orphaned IBM eHEA driver
From: David Christensen @ 2026-06-29 21:13 UTC (permalink / raw)
To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Michael Ellerman, Nicholas Piggin, Christophe Leroy
Cc: netdev, linuxppc-dev, linux-kernel, David Christensen
The IBM eHEA (Ethernet Host Ethernet Adapter) driver has been orphaned
since April 2024 with no active maintainer stepping forward. This series
removes the driver and associated references from the kernel tree.
The driver was marked as an Orphan on April 18, 2024:
commit 97ec32b583bb ("MAINTAINERS: eth: mark IBM eHEA as an Orphan")
In the 13 months since, no maintainer has stepped forward to take
ownership.
The hardware was last supported on IBM POWER7 systems, which reached
end-of-support in December 2020. The driver has received no functional
updates since October 2022:
commit 0e7ce23a917a ("net: ehea: fix possible memory leak in ehea_register_port()")
And has only received mechanical API migrations affecting the entire kernel
tree since that time.
David Christensen (2):
ehea: remove the ehea driver
powerpc: remove ehea driver references
MAINTAINERS | 5 -
arch/powerpc/configs/ppc64_defconfig | 1 -
arch/powerpc/mm/mem.c | 6 -
drivers/net/ethernet/ibm/Kconfig | 9 -
drivers/net/ethernet/ibm/Makefile | 1 -
drivers/net/ethernet/ibm/ehea/Makefile | 7 -
drivers/net/ethernet/ibm/ehea/ehea.h | 477 ---
drivers/net/ethernet/ibm/ehea/ehea_ethtool.c | 277 --
drivers/net/ethernet/ibm/ehea/ehea_hw.h | 253 --
drivers/net/ethernet/ibm/ehea/ehea_main.c | 3581 ------------------
drivers/net/ethernet/ibm/ehea/ehea_phyp.c | 612 ---
drivers/net/ethernet/ibm/ehea/ehea_phyp.h | 433 ---
drivers/net/ethernet/ibm/ehea/ehea_qmr.c | 999 -----
drivers/net/ethernet/ibm/ehea/ehea_qmr.h | 390 --
14 files changed, 7051 deletions(-)
delete mode 100644 drivers/net/ethernet/ibm/ehea/Makefile
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea.h
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_hw.h
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_main.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_phyp.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_phyp.h
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_qmr.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_qmr.h
--
2.47.3
^ permalink raw reply
* [PATCH net-next 2/2] powerpc: remove ehea driver references
From: David Christensen @ 2026-06-29 21:13 UTC (permalink / raw)
To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Michael Ellerman, Nicholas Piggin, Christophe Leroy
Cc: netdev, linuxppc-dev, linux-kernel, David Christensen
In-Reply-To: <20260629211343.3712775-1-drc@linux.ibm.com>
Follow-on cleanup after the removal of the IBM eHEA driver in commit
f721e8ffa92a ("ehea: remove the ehea driver").
Remove the CONFIG_IBM_EHEA entry from ppc64_defconfig and the
EXPORT_SYMBOL_GPL(walk_system_ram_range) export from arch/powerpc/mm/mem.c
that was only needed by the ehea driver.
Signed-off-by: David Christensen <drc@linux.ibm.com>
---
arch/powerpc/configs/ppc64_defconfig | 1 -
arch/powerpc/mm/mem.c | 6 ------
2 files changed, 7 deletions(-)
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
index f795b74602ec..1eb8e3457e8b 100644
--- a/arch/powerpc/configs/ppc64_defconfig
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -210,7 +210,6 @@ CONFIG_BNX2X=m
CONFIG_CHELSIO_T1=m
CONFIG_BE2NET=m
CONFIG_IBMVETH=m
-CONFIG_EHEA=m
CONFIG_IBMVNIC=m
CONFIG_E100=y
CONFIG_E1000=y
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 4c1afab91996..b617b69452cd 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -371,12 +371,6 @@ int devmem_is_allowed(unsigned long pfn)
}
#endif /* CONFIG_STRICT_DEVMEM */
-/*
- * This is defined in kernel/resource.c but only powerpc needs to export it, for
- * the EHEA driver. Drop this when drivers/net/ethernet/ibm/ehea is removed.
- */
-EXPORT_SYMBOL_GPL(walk_system_ram_range);
-
#ifdef CONFIG_EXECMEM
static struct execmem_info execmem_info __ro_after_init;
--
2.47.3
^ permalink raw reply related
* [PATCH net-next 1/2] ehea: remove the ehea driver
From: David Christensen @ 2026-06-29 21:13 UTC (permalink / raw)
To: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Michael Ellerman, Nicholas Piggin, Christophe Leroy
Cc: netdev, linuxppc-dev, linux-kernel, David Christensen
In-Reply-To: <20260629211343.3712775-1-drc@linux.ibm.com>
The IBM eHEA (Ethernet Host Ethernet Adapter) driver has been orphaned
since April 2024 with no active maintainer. The hardware was last
supported on IBM POWER7 systems which reached end-of-support in
December 2020. The driver has received no functional updates since
October 2022, with all subsequent changes being mechanical API
migrations affecting the entire kernel tree.
A search of lore.kernel.org for the last 24 months reveals no user
reports, no objections to the orphan status, and no maintenance
discussions indicating active hardware deployment.
The code is preserved in git history and can be restored if a
maintainer steps forward to take ownership.
Signed-off-by: David Christensen <drc@linux.ibm.com>
---
MAINTAINERS | 5 -
drivers/net/ethernet/ibm/Kconfig | 9 -
drivers/net/ethernet/ibm/Makefile | 1 -
drivers/net/ethernet/ibm/ehea/Makefile | 7 -
drivers/net/ethernet/ibm/ehea/ehea.h | 477 ---
drivers/net/ethernet/ibm/ehea/ehea_ethtool.c | 277 --
drivers/net/ethernet/ibm/ehea/ehea_hw.h | 253 --
drivers/net/ethernet/ibm/ehea/ehea_main.c | 3581 ------------------
drivers/net/ethernet/ibm/ehea/ehea_phyp.c | 612 ---
drivers/net/ethernet/ibm/ehea/ehea_phyp.h | 433 ---
drivers/net/ethernet/ibm/ehea/ehea_qmr.c | 999 -----
drivers/net/ethernet/ibm/ehea/ehea_qmr.h | 390 --
12 files changed, 7044 deletions(-)
delete mode 100644 drivers/net/ethernet/ibm/ehea/Makefile
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea.h
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_hw.h
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_main.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_phyp.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_phyp.h
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_qmr.c
delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_qmr.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 15011f5752a9..ee4ee7b8e947 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9498,11 +9498,6 @@ S: Orphan
W: http://aeschi.ch.eu.org/efs/
F: fs/efs/
-EHEA (IBM pSeries eHEA 10Gb ethernet adapter) DRIVER
-L: netdev@vger.kernel.org
-S: Orphan
-F: drivers/net/ethernet/ibm/ehea/
-
ELM327 CAN NETWORK DRIVER
M: Max Staudt <max@enpas.org>
L: linux-can@vger.kernel.org
diff --git a/drivers/net/ethernet/ibm/Kconfig b/drivers/net/ethernet/ibm/Kconfig
index 4f4b23465c47..8e55faac2035 100644
--- a/drivers/net/ethernet/ibm/Kconfig
+++ b/drivers/net/ethernet/ibm/Kconfig
@@ -42,15 +42,6 @@ config IBMVETH_KUNIT_TEST
source "drivers/net/ethernet/ibm/emac/Kconfig"
-config EHEA
- tristate "eHEA Ethernet support"
- depends on IBMEBUS && SPARSEMEM
- help
- This driver supports the IBM pSeries eHEA ethernet adapter.
-
- To compile the driver as a module, choose M here. The module
- will be called ehea.
-
config IBMVNIC
tristate "IBM Virtual NIC support"
depends on PPC_PSERIES
diff --git a/drivers/net/ethernet/ibm/Makefile b/drivers/net/ethernet/ibm/Makefile
index 1d17d0c33d4d..c7e5d891c946 100644
--- a/drivers/net/ethernet/ibm/Makefile
+++ b/drivers/net/ethernet/ibm/Makefile
@@ -6,4 +6,3 @@
obj-$(CONFIG_IBMVETH) += ibmveth.o
obj-$(CONFIG_IBMVNIC) += ibmvnic.o
obj-$(CONFIG_IBM_EMAC) += emac/
-obj-$(CONFIG_EHEA) += ehea/
diff --git a/drivers/net/ethernet/ibm/ehea/Makefile b/drivers/net/ethernet/ibm/ehea/Makefile
deleted file mode 100644
index 9e1e5c7aafe2..000000000000
--- a/drivers/net/ethernet/ibm/ehea/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the eHEA ethernet device driver for IBM eServer System p
-#
-ehea-y = ehea_main.o ehea_phyp.o ehea_qmr.o ehea_ethtool.o
-obj-$(CONFIG_EHEA) += ehea.o
-
diff --git a/drivers/net/ethernet/ibm/ehea/ehea.h b/drivers/net/ethernet/ibm/ehea/ehea.h
deleted file mode 100644
index 208c440a602b..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea.h
+++ /dev/null
@@ -1,477 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea.h
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#ifndef __EHEA_H__
-#define __EHEA_H__
-
-#include <linux/module.h>
-#include <linux/ethtool.h>
-#include <linux/vmalloc.h>
-#include <linux/if_vlan.h>
-#include <linux/platform_device.h>
-
-#include <asm/ibmebus.h>
-#include <asm/io.h>
-
-#define DRV_NAME "ehea"
-#define DRV_VERSION "EHEA_0107"
-
-/* eHEA capability flags */
-#define DLPAR_PORT_ADD_REM 1
-#define DLPAR_MEM_ADD 2
-#define DLPAR_MEM_REM 4
-#define EHEA_CAPABILITIES (DLPAR_PORT_ADD_REM | DLPAR_MEM_ADD | DLPAR_MEM_REM)
-
-#define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
- | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
-
-#define EHEA_MAX_ENTRIES_RQ1 32767
-#define EHEA_MAX_ENTRIES_RQ2 16383
-#define EHEA_MAX_ENTRIES_RQ3 16383
-#define EHEA_MAX_ENTRIES_SQ 32767
-#define EHEA_MIN_ENTRIES_QP 127
-
-#define EHEA_SMALL_QUEUES
-
-#ifdef EHEA_SMALL_QUEUES
-#define EHEA_MAX_CQE_COUNT 1023
-#define EHEA_DEF_ENTRIES_SQ 1023
-#define EHEA_DEF_ENTRIES_RQ1 1023
-#define EHEA_DEF_ENTRIES_RQ2 1023
-#define EHEA_DEF_ENTRIES_RQ3 511
-#else
-#define EHEA_MAX_CQE_COUNT 4080
-#define EHEA_DEF_ENTRIES_SQ 4080
-#define EHEA_DEF_ENTRIES_RQ1 8160
-#define EHEA_DEF_ENTRIES_RQ2 2040
-#define EHEA_DEF_ENTRIES_RQ3 2040
-#endif
-
-#define EHEA_MAX_ENTRIES_EQ 20
-
-#define EHEA_SG_SQ 2
-#define EHEA_SG_RQ1 1
-#define EHEA_SG_RQ2 0
-#define EHEA_SG_RQ3 0
-
-#define EHEA_MAX_PACKET_SIZE 9022 /* for jumbo frames */
-#define EHEA_RQ2_PKT_SIZE 2048
-#define EHEA_L_PKT_SIZE 256 /* low latency */
-
-/* Send completion signaling */
-
-/* Protection Domain Identifier */
-#define EHEA_PD_ID 0xaabcdeff
-
-#define EHEA_RQ2_THRESHOLD 1
-#define EHEA_RQ3_THRESHOLD 4 /* use RQ3 threshold of 2048 bytes */
-
-#define EHEA_SPEED_10G 10000
-#define EHEA_SPEED_1G 1000
-#define EHEA_SPEED_100M 100
-#define EHEA_SPEED_10M 10
-#define EHEA_SPEED_AUTONEG 0
-
-/* Broadcast/Multicast registration types */
-#define EHEA_BCMC_SCOPE_ALL 0x08
-#define EHEA_BCMC_SCOPE_SINGLE 0x00
-#define EHEA_BCMC_MULTICAST 0x04
-#define EHEA_BCMC_BROADCAST 0x00
-#define EHEA_BCMC_UNTAGGED 0x02
-#define EHEA_BCMC_TAGGED 0x00
-#define EHEA_BCMC_VLANID_ALL 0x01
-#define EHEA_BCMC_VLANID_SINGLE 0x00
-
-#define EHEA_CACHE_LINE 128
-
-/* Memory Regions */
-#define EHEA_MR_ACC_CTRL 0x00800000
-
-#define EHEA_BUSMAP_START 0x8000000000000000ULL
-#define EHEA_INVAL_ADDR 0xFFFFFFFFFFFFFFFFULL
-#define EHEA_DIR_INDEX_SHIFT 13 /* 8k Entries in 64k block */
-#define EHEA_TOP_INDEX_SHIFT (EHEA_DIR_INDEX_SHIFT * 2)
-#define EHEA_MAP_ENTRIES (1 << EHEA_DIR_INDEX_SHIFT)
-#define EHEA_MAP_SIZE (0x10000) /* currently fixed map size */
-#define EHEA_INDEX_MASK (EHEA_MAP_ENTRIES - 1)
-
-
-#define EHEA_WATCH_DOG_TIMEOUT 10*HZ
-
-/* utility functions */
-
-void ehea_dump(void *adr, int len, char *msg);
-
-#define EHEA_BMASK(pos, length) (((pos) << 16) + (length))
-
-#define EHEA_BMASK_IBM(from, to) (((63 - to) << 16) + ((to) - (from) + 1))
-
-#define EHEA_BMASK_SHIFTPOS(mask) (((mask) >> 16) & 0xffff)
-
-#define EHEA_BMASK_MASK(mask) \
- (0xffffffffffffffffULL >> ((64 - (mask)) & 0xffff))
-
-#define EHEA_BMASK_SET(mask, value) \
- ((EHEA_BMASK_MASK(mask) & ((u64)(value))) << EHEA_BMASK_SHIFTPOS(mask))
-
-#define EHEA_BMASK_GET(mask, value) \
- (EHEA_BMASK_MASK(mask) & (((u64)(value)) >> EHEA_BMASK_SHIFTPOS(mask)))
-
-/*
- * Generic ehea page
- */
-struct ehea_page {
- u8 entries[PAGE_SIZE];
-};
-
-/*
- * Generic queue in linux kernel virtual memory
- */
-struct hw_queue {
- u64 current_q_offset; /* current queue entry */
- struct ehea_page **queue_pages; /* array of pages belonging to queue */
- u32 qe_size; /* queue entry size */
- u32 queue_length; /* queue length allocated in bytes */
- u32 pagesize;
- u32 toggle_state; /* toggle flag - per page */
- u32 reserved; /* 64 bit alignment */
-};
-
-/*
- * For pSeries this is a 64bit memory address where
- * I/O memory is mapped into CPU address space
- */
-struct h_epa {
- void __iomem *addr;
-};
-
-struct h_epa_user {
- u64 addr;
-};
-
-struct h_epas {
- struct h_epa kernel; /* kernel space accessible resource,
- set to 0 if unused */
- struct h_epa_user user; /* user space accessible resource
- set to 0 if unused */
-};
-
-/*
- * Memory map data structures
- */
-struct ehea_dir_bmap
-{
- u64 ent[EHEA_MAP_ENTRIES];
-};
-struct ehea_top_bmap
-{
- struct ehea_dir_bmap *dir[EHEA_MAP_ENTRIES];
-};
-struct ehea_bmap
-{
- struct ehea_top_bmap *top[EHEA_MAP_ENTRIES];
-};
-
-struct ehea_qp;
-struct ehea_cq;
-struct ehea_eq;
-struct ehea_port;
-struct ehea_av;
-
-/*
- * Queue attributes passed to ehea_create_qp()
- */
-struct ehea_qp_init_attr {
- /* input parameter */
- u32 qp_token; /* queue token */
- u8 low_lat_rq1;
- u8 signalingtype; /* cqe generation flag */
- u8 rq_count; /* num of receive queues */
- u8 eqe_gen; /* eqe generation flag */
- u16 max_nr_send_wqes; /* max number of send wqes */
- u16 max_nr_rwqes_rq1; /* max number of receive wqes */
- u16 max_nr_rwqes_rq2;
- u16 max_nr_rwqes_rq3;
- u8 wqe_size_enc_sq;
- u8 wqe_size_enc_rq1;
- u8 wqe_size_enc_rq2;
- u8 wqe_size_enc_rq3;
- u8 swqe_imm_data_len; /* immediate data length for swqes */
- u16 port_nr;
- u16 rq2_threshold;
- u16 rq3_threshold;
- u64 send_cq_handle;
- u64 recv_cq_handle;
- u64 aff_eq_handle;
-
- /* output parameter */
- u32 qp_nr;
- u16 act_nr_send_wqes;
- u16 act_nr_rwqes_rq1;
- u16 act_nr_rwqes_rq2;
- u16 act_nr_rwqes_rq3;
- u8 act_wqe_size_enc_sq;
- u8 act_wqe_size_enc_rq1;
- u8 act_wqe_size_enc_rq2;
- u8 act_wqe_size_enc_rq3;
- u32 nr_sq_pages;
- u32 nr_rq1_pages;
- u32 nr_rq2_pages;
- u32 nr_rq3_pages;
- u32 liobn_sq;
- u32 liobn_rq1;
- u32 liobn_rq2;
- u32 liobn_rq3;
-};
-
-/*
- * Event Queue attributes, passed as parameter
- */
-struct ehea_eq_attr {
- u32 type;
- u32 max_nr_of_eqes;
- u8 eqe_gen; /* generate eqe flag */
- u64 eq_handle;
- u32 act_nr_of_eqes;
- u32 nr_pages;
- u32 ist1; /* Interrupt service token */
- u32 ist2;
- u32 ist3;
- u32 ist4;
-};
-
-
-/*
- * Event Queue
- */
-struct ehea_eq {
- struct ehea_adapter *adapter;
- struct hw_queue hw_queue;
- u64 fw_handle;
- struct h_epas epas;
- spinlock_t spinlock;
- struct ehea_eq_attr attr;
-};
-
-/*
- * HEA Queues
- */
-struct ehea_qp {
- struct ehea_adapter *adapter;
- u64 fw_handle; /* QP handle for firmware calls */
- struct hw_queue hw_squeue;
- struct hw_queue hw_rqueue1;
- struct hw_queue hw_rqueue2;
- struct hw_queue hw_rqueue3;
- struct h_epas epas;
- struct ehea_qp_init_attr init_attr;
-};
-
-/*
- * Completion Queue attributes
- */
-struct ehea_cq_attr {
- /* input parameter */
- u32 max_nr_of_cqes;
- u32 cq_token;
- u64 eq_handle;
-
- /* output parameter */
- u32 act_nr_of_cqes;
- u32 nr_pages;
-};
-
-/*
- * Completion Queue
- */
-struct ehea_cq {
- struct ehea_adapter *adapter;
- u64 fw_handle;
- struct hw_queue hw_queue;
- struct h_epas epas;
- struct ehea_cq_attr attr;
-};
-
-/*
- * Memory Region
- */
-struct ehea_mr {
- struct ehea_adapter *adapter;
- u64 handle;
- u64 vaddr;
- u32 lkey;
-};
-
-/*
- * Port state information
- */
-struct port_stats {
- int poll_receive_errors;
- int queue_stopped;
- int err_tcp_cksum;
- int err_ip_cksum;
- int err_frame_crc;
-};
-
-#define EHEA_IRQ_NAME_SIZE 20
-
-/*
- * Queue SKB Array
- */
-struct ehea_q_skb_arr {
- struct sk_buff **arr; /* skb array for queue */
- int len; /* array length */
- int index; /* array index */
- int os_skbs; /* rq2/rq3 only: outstanding skbs */
-};
-
-/*
- * Port resources
- */
-struct ehea_port_res {
- struct napi_struct napi;
- struct port_stats p_stats;
- struct ehea_mr send_mr; /* send memory region */
- struct ehea_mr recv_mr; /* receive memory region */
- struct ehea_port *port;
- char int_recv_name[EHEA_IRQ_NAME_SIZE];
- char int_send_name[EHEA_IRQ_NAME_SIZE];
- struct ehea_qp *qp;
- struct ehea_cq *send_cq;
- struct ehea_cq *recv_cq;
- struct ehea_eq *eq;
- struct ehea_q_skb_arr rq1_skba;
- struct ehea_q_skb_arr rq2_skba;
- struct ehea_q_skb_arr rq3_skba;
- struct ehea_q_skb_arr sq_skba;
- int sq_skba_size;
- int swqe_refill_th;
- atomic_t swqe_avail;
- int swqe_ll_count;
- u32 swqe_id_counter;
- u64 tx_packets;
- u64 tx_bytes;
- u64 rx_packets;
- u64 rx_bytes;
- int sq_restart_flag;
-};
-
-
-#define EHEA_MAX_PORTS 16
-
-#define EHEA_NUM_PORTRES_FW_HANDLES 6 /* QP handle, SendCQ handle,
- RecvCQ handle, EQ handle,
- SendMR handle, RecvMR handle */
-#define EHEA_NUM_PORT_FW_HANDLES 1 /* EQ handle */
-#define EHEA_NUM_ADAPTER_FW_HANDLES 2 /* MR handle, NEQ handle */
-
-struct ehea_adapter {
- u64 handle;
- struct platform_device *ofdev;
- struct ehea_port *port[EHEA_MAX_PORTS];
- struct ehea_eq *neq; /* notification event queue */
- struct tasklet_struct neq_tasklet;
- struct ehea_mr mr;
- u32 pd; /* protection domain */
- u64 max_mc_mac; /* max number of multicast mac addresses */
- int active_ports;
- struct list_head list;
-};
-
-
-struct ehea_mc_list {
- struct list_head list;
- u64 macaddr;
-};
-
-/* kdump support */
-struct ehea_fw_handle_entry {
- u64 adh; /* Adapter Handle */
- u64 fwh; /* Firmware Handle */
-};
-
-struct ehea_fw_handle_array {
- struct ehea_fw_handle_entry *arr;
- int num_entries;
- struct mutex lock;
-};
-
-struct ehea_bcmc_reg_entry {
- u64 adh; /* Adapter Handle */
- u32 port_id; /* Logical Port Id */
- u8 reg_type; /* Registration Type */
- u64 macaddr;
-};
-
-struct ehea_bcmc_reg_array {
- struct ehea_bcmc_reg_entry *arr;
- int num_entries;
- spinlock_t lock;
-};
-
-#define EHEA_PORT_UP 1
-#define EHEA_PORT_DOWN 0
-#define EHEA_PHY_LINK_UP 1
-#define EHEA_PHY_LINK_DOWN 0
-#define EHEA_MAX_PORT_RES 16
-struct ehea_port {
- struct ehea_adapter *adapter; /* adapter that owns this port */
- struct net_device *netdev;
- struct rtnl_link_stats64 stats;
- struct ehea_port_res port_res[EHEA_MAX_PORT_RES];
- struct platform_device ofdev; /* Open Firmware Device */
- struct ehea_mc_list *mc_list; /* Multicast MAC addresses */
- struct ehea_eq *qp_eq;
- struct work_struct reset_task;
- struct delayed_work stats_work;
- struct mutex port_lock;
- char int_aff_name[EHEA_IRQ_NAME_SIZE];
- int allmulti; /* Indicates IFF_ALLMULTI state */
- int promisc; /* Indicates IFF_PROMISC state */
- int num_mcs;
- int resets;
- unsigned long flags;
- u64 mac_addr;
- u32 logical_port_id;
- u32 port_speed;
- u32 msg_enable;
- u32 sig_comp_iv;
- u32 state;
- u8 phy_link;
- u8 full_duplex;
- u8 autoneg;
- u8 num_def_qps;
- wait_queue_head_t swqe_avail_wq;
- wait_queue_head_t restart_wq;
-};
-
-struct port_res_cfg {
- int max_entries_rcq;
- int max_entries_scq;
- int max_entries_sq;
- int max_entries_rq1;
- int max_entries_rq2;
- int max_entries_rq3;
-};
-
-enum ehea_flag_bits {
- __EHEA_STOP_XFER,
- __EHEA_DISABLE_PORT_RESET
-};
-
-void ehea_set_ethtool_ops(struct net_device *netdev);
-int ehea_sense_port_attr(struct ehea_port *port);
-int ehea_set_portspeed(struct ehea_port *port, u32 port_speed);
-
-#endif /* __EHEA_H__ */
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c b/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
deleted file mode 100644
index 1db5b6790a41..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
+++ /dev/null
@@ -1,277 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include "ehea.h"
-#include "ehea_phyp.h"
-
-static int ehea_get_link_ksettings(struct net_device *dev,
- struct ethtool_link_ksettings *cmd)
-{
- struct ehea_port *port = netdev_priv(dev);
- u32 supported, advertising;
- u32 speed;
- int ret;
-
- ret = ehea_sense_port_attr(port);
-
- if (ret)
- return ret;
-
- if (netif_carrier_ok(dev)) {
- switch (port->port_speed) {
- case EHEA_SPEED_10M:
- speed = SPEED_10;
- break;
- case EHEA_SPEED_100M:
- speed = SPEED_100;
- break;
- case EHEA_SPEED_1G:
- speed = SPEED_1000;
- break;
- case EHEA_SPEED_10G:
- speed = SPEED_10000;
- break;
- default:
- speed = -1;
- break; /* BUG */
- }
- cmd->base.duplex = port->full_duplex == 1 ?
- DUPLEX_FULL : DUPLEX_HALF;
- } else {
- speed = SPEED_UNKNOWN;
- cmd->base.duplex = DUPLEX_UNKNOWN;
- }
- cmd->base.speed = speed;
-
- if (cmd->base.speed == SPEED_10000) {
- supported = (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE);
- advertising = (ADVERTISED_10000baseT_Full | ADVERTISED_FIBRE);
- cmd->base.port = PORT_FIBRE;
- } else {
- supported = (SUPPORTED_1000baseT_Full | SUPPORTED_100baseT_Full
- | SUPPORTED_100baseT_Half | SUPPORTED_10baseT_Full
- | SUPPORTED_10baseT_Half | SUPPORTED_Autoneg
- | SUPPORTED_TP);
- advertising = (ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg
- | ADVERTISED_TP);
- cmd->base.port = PORT_TP;
- }
-
- cmd->base.autoneg = port->autoneg == 1 ?
- AUTONEG_ENABLE : AUTONEG_DISABLE;
-
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
- supported);
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
- advertising);
-
- return 0;
-}
-
-static int ehea_set_link_ksettings(struct net_device *dev,
- const struct ethtool_link_ksettings *cmd)
-{
- struct ehea_port *port = netdev_priv(dev);
- int ret = 0;
- u32 sp;
-
- if (cmd->base.autoneg == AUTONEG_ENABLE) {
- sp = EHEA_SPEED_AUTONEG;
- goto doit;
- }
-
- switch (cmd->base.speed) {
- case SPEED_10:
- if (cmd->base.duplex == DUPLEX_FULL)
- sp = H_SPEED_10M_F;
- else
- sp = H_SPEED_10M_H;
- break;
-
- case SPEED_100:
- if (cmd->base.duplex == DUPLEX_FULL)
- sp = H_SPEED_100M_F;
- else
- sp = H_SPEED_100M_H;
- break;
-
- case SPEED_1000:
- if (cmd->base.duplex == DUPLEX_FULL)
- sp = H_SPEED_1G_F;
- else
- ret = -EINVAL;
- break;
-
- case SPEED_10000:
- if (cmd->base.duplex == DUPLEX_FULL)
- sp = H_SPEED_10G_F;
- else
- ret = -EINVAL;
- break;
-
- default:
- ret = -EINVAL;
- break;
- }
-
- if (ret)
- goto out;
-doit:
- ret = ehea_set_portspeed(port, sp);
-
- if (!ret)
- netdev_info(dev,
- "Port speed successfully set: %dMbps %s Duplex\n",
- port->port_speed,
- port->full_duplex == 1 ? "Full" : "Half");
-out:
- return ret;
-}
-
-static int ehea_nway_reset(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- int ret;
-
- ret = ehea_set_portspeed(port, EHEA_SPEED_AUTONEG);
-
- if (!ret)
- netdev_info(port->netdev,
- "Port speed successfully set: %dMbps %s Duplex\n",
- port->port_speed,
- port->full_duplex == 1 ? "Full" : "Half");
- return ret;
-}
-
-static void ehea_get_drvinfo(struct net_device *dev,
- struct ethtool_drvinfo *info)
-{
- strscpy(info->driver, DRV_NAME, sizeof(info->driver));
- strscpy(info->version, DRV_VERSION, sizeof(info->version));
-}
-
-static u32 ehea_get_msglevel(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- return port->msg_enable;
-}
-
-static void ehea_set_msglevel(struct net_device *dev, u32 value)
-{
- struct ehea_port *port = netdev_priv(dev);
- port->msg_enable = value;
-}
-
-static const char ehea_ethtool_stats_keys[][ETH_GSTRING_LEN] = {
- {"sig_comp_iv"},
- {"swqe_refill_th"},
- {"port resets"},
- {"Receive errors"},
- {"TCP cksum errors"},
- {"IP cksum errors"},
- {"Frame cksum errors"},
- {"num SQ stopped"},
- {"PR0 free_swqes"},
- {"PR1 free_swqes"},
- {"PR2 free_swqes"},
- {"PR3 free_swqes"},
- {"PR4 free_swqes"},
- {"PR5 free_swqes"},
- {"PR6 free_swqes"},
- {"PR7 free_swqes"},
- {"PR8 free_swqes"},
- {"PR9 free_swqes"},
- {"PR10 free_swqes"},
- {"PR11 free_swqes"},
- {"PR12 free_swqes"},
- {"PR13 free_swqes"},
- {"PR14 free_swqes"},
- {"PR15 free_swqes"},
-};
-
-static void ehea_get_strings(struct net_device *dev, u32 stringset, u8 *data)
-{
- if (stringset == ETH_SS_STATS) {
- memcpy(data, &ehea_ethtool_stats_keys,
- sizeof(ehea_ethtool_stats_keys));
- }
-}
-
-static int ehea_get_sset_count(struct net_device *dev, int sset)
-{
- switch (sset) {
- case ETH_SS_STATS:
- return ARRAY_SIZE(ehea_ethtool_stats_keys);
- default:
- return -EOPNOTSUPP;
- }
-}
-
-static void ehea_get_ethtool_stats(struct net_device *dev,
- struct ethtool_stats *stats, u64 *data)
-{
- int i, k, tmp;
- struct ehea_port *port = netdev_priv(dev);
-
- for (i = 0; i < ehea_get_sset_count(dev, ETH_SS_STATS); i++)
- data[i] = 0;
- i = 0;
-
- data[i++] = port->sig_comp_iv;
- data[i++] = port->port_res[0].swqe_refill_th;
- data[i++] = port->resets;
-
- for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
- tmp += port->port_res[k].p_stats.poll_receive_errors;
- data[i++] = tmp;
-
- for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
- tmp += port->port_res[k].p_stats.err_tcp_cksum;
- data[i++] = tmp;
-
- for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
- tmp += port->port_res[k].p_stats.err_ip_cksum;
- data[i++] = tmp;
-
- for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
- tmp += port->port_res[k].p_stats.err_frame_crc;
- data[i++] = tmp;
-
- for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
- tmp += port->port_res[k].p_stats.queue_stopped;
- data[i++] = tmp;
-
- for (k = 0; k < 16; k++)
- data[i++] = atomic_read(&port->port_res[k].swqe_avail);
-}
-
-static const struct ethtool_ops ehea_ethtool_ops = {
- .get_drvinfo = ehea_get_drvinfo,
- .get_msglevel = ehea_get_msglevel,
- .set_msglevel = ehea_set_msglevel,
- .get_link = ethtool_op_get_link,
- .get_strings = ehea_get_strings,
- .get_sset_count = ehea_get_sset_count,
- .get_ethtool_stats = ehea_get_ethtool_stats,
- .nway_reset = ehea_nway_reset, /* Restart autonegotiation */
- .get_link_ksettings = ehea_get_link_ksettings,
- .set_link_ksettings = ehea_set_link_ksettings,
-};
-
-void ehea_set_ethtool_ops(struct net_device *netdev)
-{
- netdev->ethtool_ops = &ehea_ethtool_ops;
-}
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_hw.h b/drivers/net/ethernet/ibm/ehea/ehea_hw.h
deleted file mode 100644
index 590933a45d65..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_hw.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_hw.h
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#ifndef __EHEA_HW_H__
-#define __EHEA_HW_H__
-
-#define QPX_SQA_VALUE EHEA_BMASK_IBM(48, 63)
-#define QPX_RQ1A_VALUE EHEA_BMASK_IBM(48, 63)
-#define QPX_RQ2A_VALUE EHEA_BMASK_IBM(48, 63)
-#define QPX_RQ3A_VALUE EHEA_BMASK_IBM(48, 63)
-
-#define QPTEMM_OFFSET(x) offsetof(struct ehea_qptemm, x)
-
-struct ehea_qptemm {
- u64 qpx_hcr;
- u64 qpx_c;
- u64 qpx_herr;
- u64 qpx_aer;
- u64 qpx_sqa;
- u64 qpx_sqc;
- u64 qpx_rq1a;
- u64 qpx_rq1c;
- u64 qpx_st;
- u64 qpx_aerr;
- u64 qpx_tenure;
- u64 qpx_reserved1[(0x098 - 0x058) / 8];
- u64 qpx_portp;
- u64 qpx_reserved2[(0x100 - 0x0A0) / 8];
- u64 qpx_t;
- u64 qpx_sqhp;
- u64 qpx_sqptp;
- u64 qpx_reserved3[(0x140 - 0x118) / 8];
- u64 qpx_sqwsize;
- u64 qpx_reserved4[(0x170 - 0x148) / 8];
- u64 qpx_sqsize;
- u64 qpx_reserved5[(0x1B0 - 0x178) / 8];
- u64 qpx_sigt;
- u64 qpx_wqecnt;
- u64 qpx_rq1hp;
- u64 qpx_rq1ptp;
- u64 qpx_rq1size;
- u64 qpx_reserved6[(0x220 - 0x1D8) / 8];
- u64 qpx_rq1wsize;
- u64 qpx_reserved7[(0x240 - 0x228) / 8];
- u64 qpx_pd;
- u64 qpx_scqn;
- u64 qpx_rcqn;
- u64 qpx_aeqn;
- u64 reserved49;
- u64 qpx_ram;
- u64 qpx_reserved8[(0x300 - 0x270) / 8];
- u64 qpx_rq2a;
- u64 qpx_rq2c;
- u64 qpx_rq2hp;
- u64 qpx_rq2ptp;
- u64 qpx_rq2size;
- u64 qpx_rq2wsize;
- u64 qpx_rq2th;
- u64 qpx_rq3a;
- u64 qpx_rq3c;
- u64 qpx_rq3hp;
- u64 qpx_rq3ptp;
- u64 qpx_rq3size;
- u64 qpx_rq3wsize;
- u64 qpx_rq3th;
- u64 qpx_lpn;
- u64 qpx_reserved9[(0x400 - 0x378) / 8];
- u64 reserved_ext[(0x500 - 0x400) / 8];
- u64 reserved2[(0x1000 - 0x500) / 8];
-};
-
-#define MRx_HCR_LPARID_VALID EHEA_BMASK_IBM(0, 0)
-
-#define MRMWMM_OFFSET(x) offsetof(struct ehea_mrmwmm, x)
-
-struct ehea_mrmwmm {
- u64 mrx_hcr;
- u64 mrx_c;
- u64 mrx_herr;
- u64 mrx_aer;
- u64 mrx_pp;
- u64 reserved1;
- u64 reserved2;
- u64 reserved3;
- u64 reserved4[(0x200 - 0x40) / 8];
- u64 mrx_ctl[64];
-};
-
-#define QPEDMM_OFFSET(x) offsetof(struct ehea_qpedmm, x)
-
-struct ehea_qpedmm {
-
- u64 reserved0[(0x400) / 8];
- u64 qpedx_phh;
- u64 qpedx_ppsgp;
- u64 qpedx_ppsgu;
- u64 qpedx_ppdgp;
- u64 qpedx_ppdgu;
- u64 qpedx_aph;
- u64 qpedx_apsgp;
- u64 qpedx_apsgu;
- u64 qpedx_apdgp;
- u64 qpedx_apdgu;
- u64 qpedx_apav;
- u64 qpedx_apsav;
- u64 qpedx_hcr;
- u64 reserved1[4];
- u64 qpedx_rrl0;
- u64 qpedx_rrrkey0;
- u64 qpedx_rrva0;
- u64 reserved2;
- u64 qpedx_rrl1;
- u64 qpedx_rrrkey1;
- u64 qpedx_rrva1;
- u64 reserved3;
- u64 qpedx_rrl2;
- u64 qpedx_rrrkey2;
- u64 qpedx_rrva2;
- u64 reserved4;
- u64 qpedx_rrl3;
- u64 qpedx_rrrkey3;
- u64 qpedx_rrva3;
-};
-
-#define CQX_FECADDER EHEA_BMASK_IBM(32, 63)
-#define CQX_FEC_CQE_CNT EHEA_BMASK_IBM(32, 63)
-#define CQX_N1_GENERATE_COMP_EVENT EHEA_BMASK_IBM(0, 0)
-#define CQX_EP_EVENT_PENDING EHEA_BMASK_IBM(0, 0)
-
-#define CQTEMM_OFFSET(x) offsetof(struct ehea_cqtemm, x)
-
-struct ehea_cqtemm {
- u64 cqx_hcr;
- u64 cqx_c;
- u64 cqx_herr;
- u64 cqx_aer;
- u64 cqx_ptp;
- u64 cqx_tp;
- u64 cqx_fec;
- u64 cqx_feca;
- u64 cqx_ep;
- u64 cqx_eq;
- u64 reserved1;
- u64 cqx_n0;
- u64 cqx_n1;
- u64 reserved2[(0x1000 - 0x60) / 8];
-};
-
-#define EQTEMM_OFFSET(x) offsetof(struct ehea_eqtemm, x)
-
-struct ehea_eqtemm {
- u64 eqx_hcr;
- u64 eqx_c;
- u64 eqx_herr;
- u64 eqx_aer;
- u64 eqx_ptp;
- u64 eqx_tp;
- u64 eqx_ssba;
- u64 eqx_psba;
- u64 eqx_cec;
- u64 eqx_meql;
- u64 eqx_xisbi;
- u64 eqx_xisc;
- u64 eqx_it;
-};
-
-/*
- * These access functions will be changed when the dissuccsion about
- * the new access methods for POWER has settled.
- */
-
-static inline u64 epa_load(struct h_epa epa, u32 offset)
-{
- return __raw_readq((void __iomem *)(epa.addr + offset));
-}
-
-static inline void epa_store(struct h_epa epa, u32 offset, u64 value)
-{
- __raw_writeq(value, (void __iomem *)(epa.addr + offset));
- epa_load(epa, offset); /* synchronize explicitly to eHEA */
-}
-
-static inline void epa_store_acc(struct h_epa epa, u32 offset, u64 value)
-{
- __raw_writeq(value, (void __iomem *)(epa.addr + offset));
-}
-
-#define epa_store_cq(epa, offset, value)\
- epa_store(epa, CQTEMM_OFFSET(offset), value)
-#define epa_load_cq(epa, offset)\
- epa_load(epa, CQTEMM_OFFSET(offset))
-
-static inline void ehea_update_sqa(struct ehea_qp *qp, u16 nr_wqes)
-{
- struct h_epa epa = qp->epas.kernel;
- epa_store_acc(epa, QPTEMM_OFFSET(qpx_sqa),
- EHEA_BMASK_SET(QPX_SQA_VALUE, nr_wqes));
-}
-
-static inline void ehea_update_rq3a(struct ehea_qp *qp, u16 nr_wqes)
-{
- struct h_epa epa = qp->epas.kernel;
- epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq3a),
- EHEA_BMASK_SET(QPX_RQ1A_VALUE, nr_wqes));
-}
-
-static inline void ehea_update_rq2a(struct ehea_qp *qp, u16 nr_wqes)
-{
- struct h_epa epa = qp->epas.kernel;
- epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq2a),
- EHEA_BMASK_SET(QPX_RQ2A_VALUE, nr_wqes));
-}
-
-static inline void ehea_update_rq1a(struct ehea_qp *qp, u16 nr_wqes)
-{
- struct h_epa epa = qp->epas.kernel;
- epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq1a),
- EHEA_BMASK_SET(QPX_RQ3A_VALUE, nr_wqes));
-}
-
-static inline void ehea_update_feca(struct ehea_cq *cq, u32 nr_cqes)
-{
- struct h_epa epa = cq->epas.kernel;
- epa_store_acc(epa, CQTEMM_OFFSET(cqx_feca),
- EHEA_BMASK_SET(CQX_FECADDER, nr_cqes));
-}
-
-static inline void ehea_reset_cq_n1(struct ehea_cq *cq)
-{
- struct h_epa epa = cq->epas.kernel;
- epa_store_cq(epa, cqx_n1,
- EHEA_BMASK_SET(CQX_N1_GENERATE_COMP_EVENT, 1));
-}
-
-static inline void ehea_reset_cq_ep(struct ehea_cq *my_cq)
-{
- struct h_epa epa = my_cq->epas.kernel;
- epa_store_acc(epa, CQTEMM_OFFSET(cqx_ep),
- EHEA_BMASK_SET(CQX_EP_EVENT_PENDING, 0));
-}
-
-#endif /* __EHEA_HW_H__ */
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
deleted file mode 100644
index bfc8699a05b9..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
+++ /dev/null
@@ -1,3581 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_main.c
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/device.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/tcp.h>
-#include <linux/udp.h>
-#include <linux/if.h>
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/if_ether.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
-#include <linux/memory.h>
-#include <asm/kexec.h>
-#include <linux/mutex.h>
-#include <linux/prefetch.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/platform_device.h>
-
-#include <net/ip.h>
-
-#include "ehea.h"
-#include "ehea_qmr.h"
-#include "ehea_phyp.h"
-
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
-MODULE_DESCRIPTION("IBM eServer HEA Driver");
-MODULE_VERSION(DRV_VERSION);
-
-
-static int msg_level = -1;
-static int rq1_entries = EHEA_DEF_ENTRIES_RQ1;
-static int rq2_entries = EHEA_DEF_ENTRIES_RQ2;
-static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
-static int sq_entries = EHEA_DEF_ENTRIES_SQ;
-static int use_mcs = 1;
-static int prop_carrier_state;
-
-module_param(msg_level, int, 0);
-module_param(rq1_entries, int, 0);
-module_param(rq2_entries, int, 0);
-module_param(rq3_entries, int, 0);
-module_param(sq_entries, int, 0);
-module_param(prop_carrier_state, int, 0);
-module_param(use_mcs, int, 0);
-
-MODULE_PARM_DESC(msg_level, "msg_level");
-MODULE_PARM_DESC(prop_carrier_state, "Propagate carrier state of physical "
- "port to stack. 1:yes, 0:no. Default = 0 ");
-MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 "
- "[2^x - 1], x = [7..14]. Default = "
- __MODULE_STRING(EHEA_DEF_ENTRIES_RQ3) ")");
-MODULE_PARM_DESC(rq2_entries, "Number of entries for Receive Queue 2 "
- "[2^x - 1], x = [7..14]. Default = "
- __MODULE_STRING(EHEA_DEF_ENTRIES_RQ2) ")");
-MODULE_PARM_DESC(rq1_entries, "Number of entries for Receive Queue 1 "
- "[2^x - 1], x = [7..14]. Default = "
- __MODULE_STRING(EHEA_DEF_ENTRIES_RQ1) ")");
-MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue "
- "[2^x - 1], x = [7..14]. Default = "
- __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
-MODULE_PARM_DESC(use_mcs, " Multiple receive queues, 1: enable, 0: disable, "
- "Default = 1");
-
-static int port_name_cnt;
-static LIST_HEAD(adapter_list);
-static unsigned long ehea_driver_flags;
-static DEFINE_MUTEX(dlpar_mem_lock);
-static struct ehea_fw_handle_array ehea_fw_handles;
-static struct ehea_bcmc_reg_array ehea_bcmc_regs;
-
-
-static int ehea_probe_adapter(struct platform_device *dev);
-
-static void ehea_remove(struct platform_device *dev);
-
-static const struct of_device_id ehea_module_device_table[] = {
- {
- .name = "lhea",
- .compatible = "IBM,lhea",
- },
- {
- .type = "network",
- .compatible = "IBM,lhea-ethernet",
- },
- {},
-};
-MODULE_DEVICE_TABLE(of, ehea_module_device_table);
-
-static const struct of_device_id ehea_device_table[] = {
- {
- .name = "lhea",
- .compatible = "IBM,lhea",
- },
- {},
-};
-MODULE_DEVICE_TABLE(of, ehea_device_table);
-
-static struct platform_driver ehea_driver = {
- .driver = {
- .name = "ehea",
- .owner = THIS_MODULE,
- .of_match_table = ehea_device_table,
- },
- .probe = ehea_probe_adapter,
- .remove = ehea_remove,
-};
-
-void ehea_dump(void *adr, int len, char *msg)
-{
- int x;
- unsigned char *deb = adr;
- for (x = 0; x < len; x += 16) {
- pr_info("%s adr=%p ofs=%04x %016llx %016llx\n",
- msg, deb, x, *((u64 *)&deb[0]), *((u64 *)&deb[8]));
- deb += 16;
- }
-}
-
-static void ehea_schedule_port_reset(struct ehea_port *port)
-{
- if (!test_bit(__EHEA_DISABLE_PORT_RESET, &port->flags))
- schedule_work(&port->reset_task);
-}
-
-static void ehea_update_firmware_handles(void)
-{
- struct ehea_fw_handle_entry *arr = NULL;
- struct ehea_adapter *adapter;
- int num_adapters = 0;
- int num_ports = 0;
- int num_portres = 0;
- int i = 0;
- int num_fw_handles, k, l;
-
- /* Determine number of handles */
- mutex_lock(&ehea_fw_handles.lock);
-
- list_for_each_entry(adapter, &adapter_list, list) {
- num_adapters++;
-
- for (k = 0; k < EHEA_MAX_PORTS; k++) {
- struct ehea_port *port = adapter->port[k];
-
- if (!port || (port->state != EHEA_PORT_UP))
- continue;
-
- num_ports++;
- num_portres += port->num_def_qps;
- }
- }
-
- num_fw_handles = num_adapters * EHEA_NUM_ADAPTER_FW_HANDLES +
- num_ports * EHEA_NUM_PORT_FW_HANDLES +
- num_portres * EHEA_NUM_PORTRES_FW_HANDLES;
-
- if (num_fw_handles) {
- arr = kzalloc_objs(*arr, num_fw_handles);
- if (!arr)
- goto out; /* Keep the existing array */
- } else
- goto out_update;
-
- list_for_each_entry(adapter, &adapter_list, list) {
- if (num_adapters == 0)
- break;
-
- for (k = 0; k < EHEA_MAX_PORTS; k++) {
- struct ehea_port *port = adapter->port[k];
-
- if (!port || (port->state != EHEA_PORT_UP) ||
- (num_ports == 0))
- continue;
-
- for (l = 0; l < port->num_def_qps; l++) {
- struct ehea_port_res *pr = &port->port_res[l];
-
- arr[i].adh = adapter->handle;
- arr[i++].fwh = pr->qp->fw_handle;
- arr[i].adh = adapter->handle;
- arr[i++].fwh = pr->send_cq->fw_handle;
- arr[i].adh = adapter->handle;
- arr[i++].fwh = pr->recv_cq->fw_handle;
- arr[i].adh = adapter->handle;
- arr[i++].fwh = pr->eq->fw_handle;
- arr[i].adh = adapter->handle;
- arr[i++].fwh = pr->send_mr.handle;
- arr[i].adh = adapter->handle;
- arr[i++].fwh = pr->recv_mr.handle;
- }
- arr[i].adh = adapter->handle;
- arr[i++].fwh = port->qp_eq->fw_handle;
- num_ports--;
- }
-
- arr[i].adh = adapter->handle;
- arr[i++].fwh = adapter->neq->fw_handle;
-
- if (adapter->mr.handle) {
- arr[i].adh = adapter->handle;
- arr[i++].fwh = adapter->mr.handle;
- }
- num_adapters--;
- }
-
-out_update:
- kfree(ehea_fw_handles.arr);
- ehea_fw_handles.arr = arr;
- ehea_fw_handles.num_entries = i;
-out:
- mutex_unlock(&ehea_fw_handles.lock);
-}
-
-static void ehea_update_bcmc_registrations(void)
-{
- unsigned long flags;
- struct ehea_bcmc_reg_entry *arr = NULL;
- struct ehea_adapter *adapter;
- struct ehea_mc_list *mc_entry;
- int num_registrations = 0;
- int i = 0;
- int k;
-
- spin_lock_irqsave(&ehea_bcmc_regs.lock, flags);
-
- /* Determine number of registrations */
- list_for_each_entry(adapter, &adapter_list, list)
- for (k = 0; k < EHEA_MAX_PORTS; k++) {
- struct ehea_port *port = adapter->port[k];
-
- if (!port || (port->state != EHEA_PORT_UP))
- continue;
-
- num_registrations += 2; /* Broadcast registrations */
-
- list_for_each_entry(mc_entry, &port->mc_list->list,list)
- num_registrations += 2;
- }
-
- if (num_registrations) {
- arr = kzalloc_objs(*arr, num_registrations, GFP_ATOMIC);
- if (!arr)
- goto out; /* Keep the existing array */
- } else
- goto out_update;
-
- list_for_each_entry(adapter, &adapter_list, list) {
- for (k = 0; k < EHEA_MAX_PORTS; k++) {
- struct ehea_port *port = adapter->port[k];
-
- if (!port || (port->state != EHEA_PORT_UP))
- continue;
-
- if (num_registrations == 0)
- goto out_update;
-
- arr[i].adh = adapter->handle;
- arr[i].port_id = port->logical_port_id;
- arr[i].reg_type = EHEA_BCMC_BROADCAST |
- EHEA_BCMC_UNTAGGED;
- arr[i++].macaddr = port->mac_addr;
-
- arr[i].adh = adapter->handle;
- arr[i].port_id = port->logical_port_id;
- arr[i].reg_type = EHEA_BCMC_BROADCAST |
- EHEA_BCMC_VLANID_ALL;
- arr[i++].macaddr = port->mac_addr;
- num_registrations -= 2;
-
- list_for_each_entry(mc_entry,
- &port->mc_list->list, list) {
- if (num_registrations == 0)
- goto out_update;
-
- arr[i].adh = adapter->handle;
- arr[i].port_id = port->logical_port_id;
- arr[i].reg_type = EHEA_BCMC_MULTICAST |
- EHEA_BCMC_UNTAGGED;
- if (mc_entry->macaddr == 0)
- arr[i].reg_type |= EHEA_BCMC_SCOPE_ALL;
- arr[i++].macaddr = mc_entry->macaddr;
-
- arr[i].adh = adapter->handle;
- arr[i].port_id = port->logical_port_id;
- arr[i].reg_type = EHEA_BCMC_MULTICAST |
- EHEA_BCMC_VLANID_ALL;
- if (mc_entry->macaddr == 0)
- arr[i].reg_type |= EHEA_BCMC_SCOPE_ALL;
- arr[i++].macaddr = mc_entry->macaddr;
- num_registrations -= 2;
- }
- }
- }
-
-out_update:
- kfree(ehea_bcmc_regs.arr);
- ehea_bcmc_regs.arr = arr;
- ehea_bcmc_regs.num_entries = i;
-out:
- spin_unlock_irqrestore(&ehea_bcmc_regs.lock, flags);
-}
-
-static void ehea_get_stats64(struct net_device *dev,
- struct rtnl_link_stats64 *stats)
-{
- struct ehea_port *port = netdev_priv(dev);
- u64 rx_packets = 0, tx_packets = 0, rx_bytes = 0, tx_bytes = 0;
- int i;
-
- for (i = 0; i < port->num_def_qps; i++) {
- rx_packets += port->port_res[i].rx_packets;
- rx_bytes += port->port_res[i].rx_bytes;
- }
-
- for (i = 0; i < port->num_def_qps; i++) {
- tx_packets += port->port_res[i].tx_packets;
- tx_bytes += port->port_res[i].tx_bytes;
- }
-
- stats->tx_packets = tx_packets;
- stats->rx_bytes = rx_bytes;
- stats->tx_bytes = tx_bytes;
- stats->rx_packets = rx_packets;
-
- stats->multicast = port->stats.multicast;
- stats->rx_errors = port->stats.rx_errors;
-}
-
-static void ehea_update_stats(struct work_struct *work)
-{
- struct ehea_port *port =
- container_of(work, struct ehea_port, stats_work.work);
- struct net_device *dev = port->netdev;
- struct rtnl_link_stats64 *stats = &port->stats;
- struct hcp_ehea_port_cb2 *cb2;
- u64 hret;
-
- cb2 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb2) {
- netdev_err(dev, "No mem for cb2. Some interface statistics were not updated\n");
- goto resched;
- }
-
- hret = ehea_h_query_ehea_port(port->adapter->handle,
- port->logical_port_id,
- H_PORT_CB2, H_PORT_CB2_ALL, cb2);
- if (hret != H_SUCCESS) {
- netdev_err(dev, "query_ehea_port failed\n");
- goto out_herr;
- }
-
- if (netif_msg_hw(port))
- ehea_dump(cb2, sizeof(*cb2), "net_device_stats");
-
- stats->multicast = cb2->rxmcp;
- stats->rx_errors = cb2->rxuerr;
-
-out_herr:
- free_page((unsigned long)cb2);
-resched:
- schedule_delayed_work(&port->stats_work,
- round_jiffies_relative(msecs_to_jiffies(1000)));
-}
-
-static void ehea_refill_rq1(struct ehea_port_res *pr, int index, int nr_of_wqes)
-{
- struct sk_buff **skb_arr_rq1 = pr->rq1_skba.arr;
- struct net_device *dev = pr->port->netdev;
- int max_index_mask = pr->rq1_skba.len - 1;
- int fill_wqes = pr->rq1_skba.os_skbs + nr_of_wqes;
- int adder = 0;
- int i;
-
- pr->rq1_skba.os_skbs = 0;
-
- if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
- if (nr_of_wqes > 0)
- pr->rq1_skba.index = index;
- pr->rq1_skba.os_skbs = fill_wqes;
- return;
- }
-
- for (i = 0; i < fill_wqes; i++) {
- if (!skb_arr_rq1[index]) {
- skb_arr_rq1[index] = netdev_alloc_skb(dev,
- EHEA_L_PKT_SIZE);
- if (!skb_arr_rq1[index]) {
- pr->rq1_skba.os_skbs = fill_wqes - i;
- break;
- }
- }
- index--;
- index &= max_index_mask;
- adder++;
- }
-
- if (adder == 0)
- return;
-
- /* Ring doorbell */
- ehea_update_rq1a(pr->qp, adder);
-}
-
-static void ehea_init_fill_rq1(struct ehea_port_res *pr, int nr_rq1a)
-{
- struct sk_buff **skb_arr_rq1 = pr->rq1_skba.arr;
- struct net_device *dev = pr->port->netdev;
- int i;
-
- if (nr_rq1a > pr->rq1_skba.len) {
- netdev_err(dev, "NR_RQ1A bigger than skb array len\n");
- return;
- }
-
- for (i = 0; i < nr_rq1a; i++) {
- skb_arr_rq1[i] = netdev_alloc_skb(dev, EHEA_L_PKT_SIZE);
- if (!skb_arr_rq1[i])
- break;
- }
- /* Ring doorbell */
- ehea_update_rq1a(pr->qp, i - 1);
-}
-
-static int ehea_refill_rq_def(struct ehea_port_res *pr,
- struct ehea_q_skb_arr *q_skba, int rq_nr,
- int num_wqes, int wqe_type, int packet_size)
-{
- struct net_device *dev = pr->port->netdev;
- struct ehea_qp *qp = pr->qp;
- struct sk_buff **skb_arr = q_skba->arr;
- struct ehea_rwqe *rwqe;
- int i, index, max_index_mask, fill_wqes;
- int adder = 0;
- int ret = 0;
-
- fill_wqes = q_skba->os_skbs + num_wqes;
- q_skba->os_skbs = 0;
-
- if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
- q_skba->os_skbs = fill_wqes;
- return ret;
- }
-
- index = q_skba->index;
- max_index_mask = q_skba->len - 1;
- for (i = 0; i < fill_wqes; i++) {
- u64 tmp_addr;
- struct sk_buff *skb;
-
- skb = netdev_alloc_skb_ip_align(dev, packet_size);
- if (!skb) {
- q_skba->os_skbs = fill_wqes - i;
- if (q_skba->os_skbs == q_skba->len - 2) {
- netdev_info(pr->port->netdev,
- "rq%i ran dry - no mem for skb\n",
- rq_nr);
- ret = -ENOMEM;
- }
- break;
- }
-
- skb_arr[index] = skb;
- tmp_addr = ehea_map_vaddr(skb->data);
- if (tmp_addr == -1) {
- dev_consume_skb_any(skb);
- q_skba->os_skbs = fill_wqes - i;
- ret = 0;
- break;
- }
-
- rwqe = ehea_get_next_rwqe(qp, rq_nr);
- rwqe->wr_id = EHEA_BMASK_SET(EHEA_WR_ID_TYPE, wqe_type)
- | EHEA_BMASK_SET(EHEA_WR_ID_INDEX, index);
- rwqe->sg_list[0].l_key = pr->recv_mr.lkey;
- rwqe->sg_list[0].vaddr = tmp_addr;
- rwqe->sg_list[0].len = packet_size;
- rwqe->data_segments = 1;
-
- index++;
- index &= max_index_mask;
- adder++;
- }
-
- q_skba->index = index;
- if (adder == 0)
- goto out;
-
- /* Ring doorbell */
- iosync();
- if (rq_nr == 2)
- ehea_update_rq2a(pr->qp, adder);
- else
- ehea_update_rq3a(pr->qp, adder);
-out:
- return ret;
-}
-
-
-static int ehea_refill_rq2(struct ehea_port_res *pr, int nr_of_wqes)
-{
- return ehea_refill_rq_def(pr, &pr->rq2_skba, 2,
- nr_of_wqes, EHEA_RWQE2_TYPE,
- EHEA_RQ2_PKT_SIZE);
-}
-
-
-static int ehea_refill_rq3(struct ehea_port_res *pr, int nr_of_wqes)
-{
- return ehea_refill_rq_def(pr, &pr->rq3_skba, 3,
- nr_of_wqes, EHEA_RWQE3_TYPE,
- EHEA_MAX_PACKET_SIZE);
-}
-
-static inline int ehea_check_cqe(struct ehea_cqe *cqe, int *rq_num)
-{
- *rq_num = (cqe->type & EHEA_CQE_TYPE_RQ) >> 5;
- if ((cqe->status & EHEA_CQE_STAT_ERR_MASK) == 0)
- return 0;
- if (((cqe->status & EHEA_CQE_STAT_ERR_TCP) != 0) &&
- (cqe->header_length == 0))
- return 0;
- return -EINVAL;
-}
-
-static inline void ehea_fill_skb(struct net_device *dev,
- struct sk_buff *skb, struct ehea_cqe *cqe,
- struct ehea_port_res *pr)
-{
- int length = cqe->num_bytes_transfered - 4; /*remove CRC */
-
- skb_put(skb, length);
- skb->protocol = eth_type_trans(skb, dev);
-
- /* The packet was not an IPV4 packet so a complemented checksum was
- calculated. The value is found in the Internet Checksum field. */
- if (cqe->status & EHEA_CQE_BLIND_CKSUM) {
- skb->ip_summed = CHECKSUM_COMPLETE;
- skb->csum = csum_unfold(~cqe->inet_checksum_value);
- } else
- skb->ip_summed = CHECKSUM_UNNECESSARY;
-
- skb_record_rx_queue(skb, pr - &pr->port->port_res[0]);
-}
-
-static inline struct sk_buff *get_skb_by_index(struct sk_buff **skb_array,
- int arr_len,
- struct ehea_cqe *cqe)
-{
- int skb_index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, cqe->wr_id);
- struct sk_buff *skb;
- void *pref;
- int x;
-
- x = skb_index + 1;
- x &= (arr_len - 1);
-
- pref = skb_array[x];
- if (pref) {
- prefetchw(pref);
- prefetchw(pref + EHEA_CACHE_LINE);
-
- pref = (skb_array[x]->data);
- prefetch(pref);
- prefetch(pref + EHEA_CACHE_LINE);
- prefetch(pref + EHEA_CACHE_LINE * 2);
- prefetch(pref + EHEA_CACHE_LINE * 3);
- }
-
- skb = skb_array[skb_index];
- skb_array[skb_index] = NULL;
- return skb;
-}
-
-static inline struct sk_buff *get_skb_by_index_ll(struct sk_buff **skb_array,
- int arr_len, int wqe_index)
-{
- struct sk_buff *skb;
- void *pref;
- int x;
-
- x = wqe_index + 1;
- x &= (arr_len - 1);
-
- pref = skb_array[x];
- if (pref) {
- prefetchw(pref);
- prefetchw(pref + EHEA_CACHE_LINE);
-
- pref = (skb_array[x]->data);
- prefetchw(pref);
- prefetchw(pref + EHEA_CACHE_LINE);
- }
-
- skb = skb_array[wqe_index];
- skb_array[wqe_index] = NULL;
- return skb;
-}
-
-static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
- struct ehea_cqe *cqe, int *processed_rq2,
- int *processed_rq3)
-{
- struct sk_buff *skb;
-
- if (cqe->status & EHEA_CQE_STAT_ERR_TCP)
- pr->p_stats.err_tcp_cksum++;
- if (cqe->status & EHEA_CQE_STAT_ERR_IP)
- pr->p_stats.err_ip_cksum++;
- if (cqe->status & EHEA_CQE_STAT_ERR_CRC)
- pr->p_stats.err_frame_crc++;
-
- if (rq == 2) {
- *processed_rq2 += 1;
- skb = get_skb_by_index(pr->rq2_skba.arr, pr->rq2_skba.len, cqe);
- dev_kfree_skb(skb);
- } else if (rq == 3) {
- *processed_rq3 += 1;
- skb = get_skb_by_index(pr->rq3_skba.arr, pr->rq3_skba.len, cqe);
- dev_kfree_skb(skb);
- }
-
- if (cqe->status & EHEA_CQE_STAT_FAT_ERR_MASK) {
- if (netif_msg_rx_err(pr->port)) {
- pr_err("Critical receive error for QP %d. Resetting port.\n",
- pr->qp->init_attr.qp_nr);
- ehea_dump(cqe, sizeof(*cqe), "CQE");
- }
- ehea_schedule_port_reset(pr->port);
- return 1;
- }
-
- return 0;
-}
-
-static int ehea_proc_rwqes(struct net_device *dev,
- struct ehea_port_res *pr,
- int budget)
-{
- struct ehea_port *port = pr->port;
- struct ehea_qp *qp = pr->qp;
- struct ehea_cqe *cqe;
- struct sk_buff *skb;
- struct sk_buff **skb_arr_rq1 = pr->rq1_skba.arr;
- struct sk_buff **skb_arr_rq2 = pr->rq2_skba.arr;
- struct sk_buff **skb_arr_rq3 = pr->rq3_skba.arr;
- int skb_arr_rq1_len = pr->rq1_skba.len;
- int skb_arr_rq2_len = pr->rq2_skba.len;
- int skb_arr_rq3_len = pr->rq3_skba.len;
- int processed, processed_rq1, processed_rq2, processed_rq3;
- u64 processed_bytes = 0;
- int wqe_index, last_wqe_index, rq, port_reset;
-
- processed = processed_rq1 = processed_rq2 = processed_rq3 = 0;
- last_wqe_index = 0;
-
- cqe = ehea_poll_rq1(qp, &wqe_index);
- while ((processed < budget) && cqe) {
- ehea_inc_rq1(qp);
- processed_rq1++;
- processed++;
- if (netif_msg_rx_status(port))
- ehea_dump(cqe, sizeof(*cqe), "CQE");
-
- last_wqe_index = wqe_index;
- rmb();
- if (!ehea_check_cqe(cqe, &rq)) {
- if (rq == 1) {
- /* LL RQ1 */
- skb = get_skb_by_index_ll(skb_arr_rq1,
- skb_arr_rq1_len,
- wqe_index);
- if (unlikely(!skb)) {
- netif_info(port, rx_err, dev,
- "LL rq1: skb=NULL\n");
-
- skb = netdev_alloc_skb(dev,
- EHEA_L_PKT_SIZE);
- if (!skb)
- break;
- }
- skb_copy_to_linear_data(skb, ((char *)cqe) + 64,
- cqe->num_bytes_transfered - 4);
- ehea_fill_skb(dev, skb, cqe, pr);
- } else if (rq == 2) {
- /* RQ2 */
- skb = get_skb_by_index(skb_arr_rq2,
- skb_arr_rq2_len, cqe);
- if (unlikely(!skb)) {
- netif_err(port, rx_err, dev,
- "rq2: skb=NULL\n");
- break;
- }
- ehea_fill_skb(dev, skb, cqe, pr);
- processed_rq2++;
- } else {
- /* RQ3 */
- skb = get_skb_by_index(skb_arr_rq3,
- skb_arr_rq3_len, cqe);
- if (unlikely(!skb)) {
- netif_err(port, rx_err, dev,
- "rq3: skb=NULL\n");
- break;
- }
- ehea_fill_skb(dev, skb, cqe, pr);
- processed_rq3++;
- }
-
- processed_bytes += skb->len;
-
- if (cqe->status & EHEA_CQE_VLAN_TAG_XTRACT)
- __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
- cqe->vlan_tag);
-
- napi_gro_receive(&pr->napi, skb);
- } else {
- pr->p_stats.poll_receive_errors++;
- port_reset = ehea_treat_poll_error(pr, rq, cqe,
- &processed_rq2,
- &processed_rq3);
- if (port_reset)
- break;
- }
- cqe = ehea_poll_rq1(qp, &wqe_index);
- }
-
- pr->rx_packets += processed;
- pr->rx_bytes += processed_bytes;
-
- ehea_refill_rq1(pr, last_wqe_index, processed_rq1);
- ehea_refill_rq2(pr, processed_rq2);
- ehea_refill_rq3(pr, processed_rq3);
-
- return processed;
-}
-
-#define SWQE_RESTART_CHECK 0xdeadbeaff00d0000ull
-
-static void reset_sq_restart_flag(struct ehea_port *port)
-{
- int i;
-
- for (i = 0; i < port->num_def_qps; i++) {
- struct ehea_port_res *pr = &port->port_res[i];
- pr->sq_restart_flag = 0;
- }
- wake_up(&port->restart_wq);
-}
-
-static void check_sqs(struct ehea_port *port)
-{
- struct ehea_swqe *swqe;
- int swqe_index;
- int i;
-
- for (i = 0; i < port->num_def_qps; i++) {
- struct ehea_port_res *pr = &port->port_res[i];
- int ret;
- swqe = ehea_get_swqe(pr->qp, &swqe_index);
- memset(swqe, 0, SWQE_HEADER_SIZE);
- atomic_dec(&pr->swqe_avail);
-
- swqe->tx_control |= EHEA_SWQE_PURGE;
- swqe->wr_id = SWQE_RESTART_CHECK;
- swqe->tx_control |= EHEA_SWQE_SIGNALLED_COMPLETION;
- swqe->tx_control |= EHEA_SWQE_IMM_DATA_PRESENT;
- swqe->immediate_data_length = 80;
-
- ehea_post_swqe(pr->qp, swqe);
-
- ret = wait_event_timeout(port->restart_wq,
- pr->sq_restart_flag == 0,
- msecs_to_jiffies(100));
-
- if (!ret) {
- pr_err("HW/SW queues out of sync\n");
- ehea_schedule_port_reset(pr->port);
- return;
- }
- }
-}
-
-
-static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota)
-{
- struct sk_buff *skb;
- struct ehea_cq *send_cq = pr->send_cq;
- struct ehea_cqe *cqe;
- int quota = my_quota;
- int cqe_counter = 0;
- int swqe_av = 0;
- int index;
- struct netdev_queue *txq = netdev_get_tx_queue(pr->port->netdev,
- pr - &pr->port->port_res[0]);
-
- cqe = ehea_poll_cq(send_cq);
- while (cqe && (quota > 0)) {
- ehea_inc_cq(send_cq);
-
- cqe_counter++;
- rmb();
-
- if (cqe->wr_id == SWQE_RESTART_CHECK) {
- pr->sq_restart_flag = 1;
- swqe_av++;
- break;
- }
-
- if (cqe->status & EHEA_CQE_STAT_ERR_MASK) {
- pr_err("Bad send completion status=0x%04X\n",
- cqe->status);
-
- if (netif_msg_tx_err(pr->port))
- ehea_dump(cqe, sizeof(*cqe), "Send CQE");
-
- if (cqe->status & EHEA_CQE_STAT_RESET_MASK) {
- pr_err("Resetting port\n");
- ehea_schedule_port_reset(pr->port);
- break;
- }
- }
-
- if (netif_msg_tx_done(pr->port))
- ehea_dump(cqe, sizeof(*cqe), "CQE");
-
- if (likely(EHEA_BMASK_GET(EHEA_WR_ID_TYPE, cqe->wr_id)
- == EHEA_SWQE2_TYPE)) {
-
- index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, cqe->wr_id);
- skb = pr->sq_skba.arr[index];
- dev_consume_skb_any(skb);
- pr->sq_skba.arr[index] = NULL;
- }
-
- swqe_av += EHEA_BMASK_GET(EHEA_WR_ID_REFILL, cqe->wr_id);
- quota--;
-
- cqe = ehea_poll_cq(send_cq);
- }
-
- ehea_update_feca(send_cq, cqe_counter);
- atomic_add(swqe_av, &pr->swqe_avail);
-
- if (unlikely(netif_tx_queue_stopped(txq) &&
- (atomic_read(&pr->swqe_avail) >= pr->swqe_refill_th))) {
- __netif_tx_lock(txq, smp_processor_id());
- if (netif_tx_queue_stopped(txq) &&
- (atomic_read(&pr->swqe_avail) >= pr->swqe_refill_th))
- netif_tx_wake_queue(txq);
- __netif_tx_unlock(txq);
- }
-
- wake_up(&pr->port->swqe_avail_wq);
-
- return cqe;
-}
-
-#define EHEA_POLL_MAX_CQES 65535
-
-static int ehea_poll(struct napi_struct *napi, int budget)
-{
- struct ehea_port_res *pr = container_of(napi, struct ehea_port_res,
- napi);
- struct net_device *dev = pr->port->netdev;
- struct ehea_cqe *cqe;
- struct ehea_cqe *cqe_skb = NULL;
- int wqe_index;
- int rx = 0;
-
- cqe_skb = ehea_proc_cqes(pr, EHEA_POLL_MAX_CQES);
- rx += ehea_proc_rwqes(dev, pr, budget - rx);
-
- while (rx != budget) {
- napi_complete(napi);
- ehea_reset_cq_ep(pr->recv_cq);
- ehea_reset_cq_ep(pr->send_cq);
- ehea_reset_cq_n1(pr->recv_cq);
- ehea_reset_cq_n1(pr->send_cq);
- rmb();
- cqe = ehea_poll_rq1(pr->qp, &wqe_index);
- cqe_skb = ehea_poll_cq(pr->send_cq);
-
- if (!cqe && !cqe_skb)
- return rx;
-
- if (!napi_schedule(napi))
- return rx;
-
- cqe_skb = ehea_proc_cqes(pr, EHEA_POLL_MAX_CQES);
- rx += ehea_proc_rwqes(dev, pr, budget - rx);
- }
-
- return rx;
-}
-
-static irqreturn_t ehea_recv_irq_handler(int irq, void *param)
-{
- struct ehea_port_res *pr = param;
-
- napi_schedule(&pr->napi);
-
- return IRQ_HANDLED;
-}
-
-static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
-{
- struct ehea_port *port = param;
- struct ehea_eqe *eqe;
- struct ehea_qp *qp;
- u32 qp_token;
- u64 resource_type, aer, aerr;
- int reset_port = 0;
-
- eqe = ehea_poll_eq(port->qp_eq);
-
- while (eqe) {
- qp_token = EHEA_BMASK_GET(EHEA_EQE_QP_TOKEN, eqe->entry);
- pr_err("QP aff_err: entry=0x%llx, token=0x%x\n",
- eqe->entry, qp_token);
-
- qp = port->port_res[qp_token].qp;
-
- resource_type = ehea_error_data(port->adapter, qp->fw_handle,
- &aer, &aerr);
-
- if (resource_type == EHEA_AER_RESTYPE_QP) {
- if ((aer & EHEA_AER_RESET_MASK) ||
- (aerr & EHEA_AERR_RESET_MASK))
- reset_port = 1;
- } else
- reset_port = 1; /* Reset in case of CQ or EQ error */
-
- eqe = ehea_poll_eq(port->qp_eq);
- }
-
- if (reset_port) {
- pr_err("Resetting port\n");
- ehea_schedule_port_reset(port);
- }
-
- return IRQ_HANDLED;
-}
-
-static struct ehea_port *ehea_get_port(struct ehea_adapter *adapter,
- int logical_port)
-{
- int i;
-
- for (i = 0; i < EHEA_MAX_PORTS; i++)
- if (adapter->port[i])
- if (adapter->port[i]->logical_port_id == logical_port)
- return adapter->port[i];
- return NULL;
-}
-
-int ehea_sense_port_attr(struct ehea_port *port)
-{
- int ret;
- u64 hret;
- struct hcp_ehea_port_cb0 *cb0;
-
- /* may be called via ehea_neq_tasklet() */
- cb0 = (void *)get_zeroed_page(GFP_ATOMIC);
- if (!cb0) {
- pr_err("no mem for cb0\n");
- ret = -ENOMEM;
- goto out;
- }
-
- hret = ehea_h_query_ehea_port(port->adapter->handle,
- port->logical_port_id, H_PORT_CB0,
- EHEA_BMASK_SET(H_PORT_CB0_ALL, 0xFFFF),
- cb0);
- if (hret != H_SUCCESS) {
- ret = -EIO;
- goto out_free;
- }
-
- /* MAC address */
- port->mac_addr = cb0->port_mac_addr << 16;
-
- if (!is_valid_ether_addr((u8 *)&port->mac_addr)) {
- ret = -EADDRNOTAVAIL;
- goto out_free;
- }
-
- /* Port speed */
- switch (cb0->port_speed) {
- case H_SPEED_10M_H:
- port->port_speed = EHEA_SPEED_10M;
- port->full_duplex = 0;
- break;
- case H_SPEED_10M_F:
- port->port_speed = EHEA_SPEED_10M;
- port->full_duplex = 1;
- break;
- case H_SPEED_100M_H:
- port->port_speed = EHEA_SPEED_100M;
- port->full_duplex = 0;
- break;
- case H_SPEED_100M_F:
- port->port_speed = EHEA_SPEED_100M;
- port->full_duplex = 1;
- break;
- case H_SPEED_1G_F:
- port->port_speed = EHEA_SPEED_1G;
- port->full_duplex = 1;
- break;
- case H_SPEED_10G_F:
- port->port_speed = EHEA_SPEED_10G;
- port->full_duplex = 1;
- break;
- default:
- port->port_speed = 0;
- port->full_duplex = 0;
- break;
- }
-
- port->autoneg = 1;
- port->num_mcs = cb0->num_default_qps;
-
- /* Number of default QPs */
- if (use_mcs)
- port->num_def_qps = cb0->num_default_qps;
- else
- port->num_def_qps = 1;
-
- if (!port->num_def_qps) {
- ret = -EINVAL;
- goto out_free;
- }
-
- ret = 0;
-out_free:
- if (ret || netif_msg_probe(port))
- ehea_dump(cb0, sizeof(*cb0), "ehea_sense_port_attr");
- free_page((unsigned long)cb0);
-out:
- return ret;
-}
-
-int ehea_set_portspeed(struct ehea_port *port, u32 port_speed)
-{
- struct hcp_ehea_port_cb4 *cb4;
- u64 hret;
- int ret = 0;
-
- cb4 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb4) {
- pr_err("no mem for cb4\n");
- ret = -ENOMEM;
- goto out;
- }
-
- cb4->port_speed = port_speed;
-
- netif_carrier_off(port->netdev);
-
- hret = ehea_h_modify_ehea_port(port->adapter->handle,
- port->logical_port_id,
- H_PORT_CB4, H_PORT_CB4_SPEED, cb4);
- if (hret == H_SUCCESS) {
- port->autoneg = port_speed == EHEA_SPEED_AUTONEG ? 1 : 0;
-
- hret = ehea_h_query_ehea_port(port->adapter->handle,
- port->logical_port_id,
- H_PORT_CB4, H_PORT_CB4_SPEED,
- cb4);
- if (hret == H_SUCCESS) {
- switch (cb4->port_speed) {
- case H_SPEED_10M_H:
- port->port_speed = EHEA_SPEED_10M;
- port->full_duplex = 0;
- break;
- case H_SPEED_10M_F:
- port->port_speed = EHEA_SPEED_10M;
- port->full_duplex = 1;
- break;
- case H_SPEED_100M_H:
- port->port_speed = EHEA_SPEED_100M;
- port->full_duplex = 0;
- break;
- case H_SPEED_100M_F:
- port->port_speed = EHEA_SPEED_100M;
- port->full_duplex = 1;
- break;
- case H_SPEED_1G_F:
- port->port_speed = EHEA_SPEED_1G;
- port->full_duplex = 1;
- break;
- case H_SPEED_10G_F:
- port->port_speed = EHEA_SPEED_10G;
- port->full_duplex = 1;
- break;
- default:
- port->port_speed = 0;
- port->full_duplex = 0;
- break;
- }
- } else {
- pr_err("Failed sensing port speed\n");
- ret = -EIO;
- }
- } else {
- if (hret == H_AUTHORITY) {
- pr_info("Hypervisor denied setting port speed\n");
- ret = -EPERM;
- } else {
- ret = -EIO;
- pr_err("Failed setting port speed\n");
- }
- }
- if (!prop_carrier_state || (port->phy_link == EHEA_PHY_LINK_UP))
- netif_carrier_on(port->netdev);
-
- free_page((unsigned long)cb4);
-out:
- return ret;
-}
-
-static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe)
-{
- int ret;
- u8 ec;
- u8 portnum;
- struct ehea_port *port;
- struct net_device *dev;
-
- ec = EHEA_BMASK_GET(NEQE_EVENT_CODE, eqe);
- portnum = EHEA_BMASK_GET(NEQE_PORTNUM, eqe);
- port = ehea_get_port(adapter, portnum);
- if (!port) {
- netdev_err(NULL, "unknown portnum %x\n", portnum);
- return;
- }
- dev = port->netdev;
-
- switch (ec) {
- case EHEA_EC_PORTSTATE_CHG: /* port state change */
-
- if (EHEA_BMASK_GET(NEQE_PORT_UP, eqe)) {
- if (!netif_carrier_ok(dev)) {
- ret = ehea_sense_port_attr(port);
- if (ret) {
- netdev_err(dev, "failed resensing port attributes\n");
- break;
- }
-
- netif_info(port, link, dev,
- "Logical port up: %dMbps %s Duplex\n",
- port->port_speed,
- port->full_duplex == 1 ?
- "Full" : "Half");
-
- netif_carrier_on(dev);
- netif_wake_queue(dev);
- }
- } else
- if (netif_carrier_ok(dev)) {
- netif_info(port, link, dev,
- "Logical port down\n");
- netif_carrier_off(dev);
- netif_tx_disable(dev);
- }
-
- if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PORT_UP, eqe)) {
- port->phy_link = EHEA_PHY_LINK_UP;
- netif_info(port, link, dev,
- "Physical port up\n");
- if (prop_carrier_state)
- netif_carrier_on(dev);
- } else {
- port->phy_link = EHEA_PHY_LINK_DOWN;
- netif_info(port, link, dev,
- "Physical port down\n");
- if (prop_carrier_state)
- netif_carrier_off(dev);
- }
-
- if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PRIMARY, eqe))
- netdev_info(dev,
- "External switch port is primary port\n");
- else
- netdev_info(dev,
- "External switch port is backup port\n");
-
- break;
- case EHEA_EC_ADAPTER_MALFUNC:
- netdev_err(dev, "Adapter malfunction\n");
- break;
- case EHEA_EC_PORT_MALFUNC:
- netdev_info(dev, "Port malfunction\n");
- netif_carrier_off(dev);
- netif_tx_disable(dev);
- break;
- default:
- netdev_err(dev, "unknown event code %x, eqe=0x%llX\n", ec, eqe);
- break;
- }
-}
-
-static void ehea_neq_tasklet(struct tasklet_struct *t)
-{
- struct ehea_adapter *adapter = from_tasklet(adapter, t, neq_tasklet);
- struct ehea_eqe *eqe;
- u64 event_mask;
-
- eqe = ehea_poll_eq(adapter->neq);
- pr_debug("eqe=%p\n", eqe);
-
- while (eqe) {
- pr_debug("*eqe=%lx\n", (unsigned long) eqe->entry);
- ehea_parse_eqe(adapter, eqe->entry);
- eqe = ehea_poll_eq(adapter->neq);
- pr_debug("next eqe=%p\n", eqe);
- }
-
- event_mask = EHEA_BMASK_SET(NELR_PORTSTATE_CHG, 1)
- | EHEA_BMASK_SET(NELR_ADAPTER_MALFUNC, 1)
- | EHEA_BMASK_SET(NELR_PORT_MALFUNC, 1);
-
- ehea_h_reset_events(adapter->handle,
- adapter->neq->fw_handle, event_mask);
-}
-
-static irqreturn_t ehea_interrupt_neq(int irq, void *param)
-{
- struct ehea_adapter *adapter = param;
- tasklet_hi_schedule(&adapter->neq_tasklet);
- return IRQ_HANDLED;
-}
-
-
-static int ehea_fill_port_res(struct ehea_port_res *pr)
-{
- int ret;
- struct ehea_qp_init_attr *init_attr = &pr->qp->init_attr;
-
- ehea_init_fill_rq1(pr, pr->rq1_skba.len);
-
- ret = ehea_refill_rq2(pr, init_attr->act_nr_rwqes_rq2 - 1);
-
- ret |= ehea_refill_rq3(pr, init_attr->act_nr_rwqes_rq3 - 1);
-
- return ret;
-}
-
-static int ehea_reg_interrupts(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_port_res *pr;
- int i, ret;
-
-
- snprintf(port->int_aff_name, EHEA_IRQ_NAME_SIZE - 1, "%s-aff",
- dev->name);
-
- ret = ibmebus_request_irq(port->qp_eq->attr.ist1,
- ehea_qp_aff_irq_handler,
- 0, port->int_aff_name, port);
- if (ret) {
- netdev_err(dev, "failed registering irq for qp_aff_irq_handler:ist=%X\n",
- port->qp_eq->attr.ist1);
- goto out_free_qpeq;
- }
-
- netif_info(port, ifup, dev,
- "irq_handle 0x%X for function qp_aff_irq_handler registered\n",
- port->qp_eq->attr.ist1);
-
-
- for (i = 0; i < port->num_def_qps; i++) {
- pr = &port->port_res[i];
- snprintf(pr->int_send_name, EHEA_IRQ_NAME_SIZE - 1,
- "%s-queue%d", dev->name, i);
- ret = ibmebus_request_irq(pr->eq->attr.ist1,
- ehea_recv_irq_handler,
- 0, pr->int_send_name, pr);
- if (ret) {
- netdev_err(dev, "failed registering irq for ehea_queue port_res_nr:%d, ist=%X\n",
- i, pr->eq->attr.ist1);
- goto out_free_req;
- }
- netif_info(port, ifup, dev,
- "irq_handle 0x%X for function ehea_queue_int %d registered\n",
- pr->eq->attr.ist1, i);
- }
-out:
- return ret;
-
-
-out_free_req:
- while (--i >= 0) {
- u32 ist = port->port_res[i].eq->attr.ist1;
- ibmebus_free_irq(ist, &port->port_res[i]);
- }
-
-out_free_qpeq:
- ibmebus_free_irq(port->qp_eq->attr.ist1, port);
- i = port->num_def_qps;
-
- goto out;
-
-}
-
-static void ehea_free_interrupts(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_port_res *pr;
- int i;
-
- /* send */
-
- for (i = 0; i < port->num_def_qps; i++) {
- pr = &port->port_res[i];
- ibmebus_free_irq(pr->eq->attr.ist1, pr);
- netif_info(port, intr, dev,
- "free send irq for res %d with handle 0x%X\n",
- i, pr->eq->attr.ist1);
- }
-
- /* associated events */
- ibmebus_free_irq(port->qp_eq->attr.ist1, port);
- netif_info(port, intr, dev,
- "associated event interrupt for handle 0x%X freed\n",
- port->qp_eq->attr.ist1);
-}
-
-static int ehea_configure_port(struct ehea_port *port)
-{
- int ret, i;
- u64 hret, mask;
- struct hcp_ehea_port_cb0 *cb0;
-
- ret = -ENOMEM;
- cb0 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb0)
- goto out;
-
- cb0->port_rc = EHEA_BMASK_SET(PXLY_RC_VALID, 1)
- | EHEA_BMASK_SET(PXLY_RC_IP_CHKSUM, 1)
- | EHEA_BMASK_SET(PXLY_RC_TCP_UDP_CHKSUM, 1)
- | EHEA_BMASK_SET(PXLY_RC_VLAN_XTRACT, 1)
- | EHEA_BMASK_SET(PXLY_RC_VLAN_TAG_FILTER,
- PXLY_RC_VLAN_FILTER)
- | EHEA_BMASK_SET(PXLY_RC_JUMBO_FRAME, 1);
-
- for (i = 0; i < port->num_mcs; i++)
- if (use_mcs)
- cb0->default_qpn_arr[i] =
- port->port_res[i].qp->init_attr.qp_nr;
- else
- cb0->default_qpn_arr[i] =
- port->port_res[0].qp->init_attr.qp_nr;
-
- if (netif_msg_ifup(port))
- ehea_dump(cb0, sizeof(*cb0), "ehea_configure_port");
-
- mask = EHEA_BMASK_SET(H_PORT_CB0_PRC, 1)
- | EHEA_BMASK_SET(H_PORT_CB0_DEFQPNARRAY, 1);
-
- hret = ehea_h_modify_ehea_port(port->adapter->handle,
- port->logical_port_id,
- H_PORT_CB0, mask, cb0);
- ret = -EIO;
- if (hret != H_SUCCESS)
- goto out_free;
-
- ret = 0;
-
-out_free:
- free_page((unsigned long)cb0);
-out:
- return ret;
-}
-
-static int ehea_gen_smrs(struct ehea_port_res *pr)
-{
- int ret;
- struct ehea_adapter *adapter = pr->port->adapter;
-
- ret = ehea_gen_smr(adapter, &adapter->mr, &pr->send_mr);
- if (ret)
- goto out;
-
- ret = ehea_gen_smr(adapter, &adapter->mr, &pr->recv_mr);
- if (ret)
- goto out_free;
-
- return 0;
-
-out_free:
- ehea_rem_mr(&pr->send_mr);
-out:
- pr_err("Generating SMRS failed\n");
- return -EIO;
-}
-
-static int ehea_rem_smrs(struct ehea_port_res *pr)
-{
- if ((ehea_rem_mr(&pr->send_mr)) ||
- (ehea_rem_mr(&pr->recv_mr)))
- return -EIO;
- else
- return 0;
-}
-
-static int ehea_init_q_skba(struct ehea_q_skb_arr *q_skba, int max_q_entries)
-{
- int arr_size = sizeof(void *) * max_q_entries;
-
- q_skba->arr = vzalloc(arr_size);
- if (!q_skba->arr)
- return -ENOMEM;
-
- q_skba->len = max_q_entries;
- q_skba->index = 0;
- q_skba->os_skbs = 0;
-
- return 0;
-}
-
-static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr,
- struct port_res_cfg *pr_cfg, int queue_token)
-{
- struct ehea_adapter *adapter = port->adapter;
- enum ehea_eq_type eq_type = EHEA_EQ;
- struct ehea_qp_init_attr *init_attr = NULL;
- int ret = -EIO;
- u64 tx_bytes, rx_bytes, tx_packets, rx_packets;
-
- tx_bytes = pr->tx_bytes;
- tx_packets = pr->tx_packets;
- rx_bytes = pr->rx_bytes;
- rx_packets = pr->rx_packets;
-
- memset(pr, 0, sizeof(struct ehea_port_res));
-
- pr->tx_bytes = tx_bytes;
- pr->tx_packets = tx_packets;
- pr->rx_bytes = rx_bytes;
- pr->rx_packets = rx_packets;
-
- pr->port = port;
-
- pr->eq = ehea_create_eq(adapter, eq_type, EHEA_MAX_ENTRIES_EQ, 0);
- if (!pr->eq) {
- pr_err("create_eq failed (eq)\n");
- goto out_free;
- }
-
- pr->recv_cq = ehea_create_cq(adapter, pr_cfg->max_entries_rcq,
- pr->eq->fw_handle,
- port->logical_port_id);
- if (!pr->recv_cq) {
- pr_err("create_cq failed (cq_recv)\n");
- goto out_free;
- }
-
- pr->send_cq = ehea_create_cq(adapter, pr_cfg->max_entries_scq,
- pr->eq->fw_handle,
- port->logical_port_id);
- if (!pr->send_cq) {
- pr_err("create_cq failed (cq_send)\n");
- goto out_free;
- }
-
- if (netif_msg_ifup(port))
- pr_info("Send CQ: act_nr_cqes=%d, Recv CQ: act_nr_cqes=%d\n",
- pr->send_cq->attr.act_nr_of_cqes,
- pr->recv_cq->attr.act_nr_of_cqes);
-
- init_attr = kzalloc_obj(*init_attr);
- if (!init_attr) {
- ret = -ENOMEM;
- pr_err("no mem for ehea_qp_init_attr\n");
- goto out_free;
- }
-
- init_attr->low_lat_rq1 = 1;
- init_attr->signalingtype = 1; /* generate CQE if specified in WQE */
- init_attr->rq_count = 3;
- init_attr->qp_token = queue_token;
- init_attr->max_nr_send_wqes = pr_cfg->max_entries_sq;
- init_attr->max_nr_rwqes_rq1 = pr_cfg->max_entries_rq1;
- init_attr->max_nr_rwqes_rq2 = pr_cfg->max_entries_rq2;
- init_attr->max_nr_rwqes_rq3 = pr_cfg->max_entries_rq3;
- init_attr->wqe_size_enc_sq = EHEA_SG_SQ;
- init_attr->wqe_size_enc_rq1 = EHEA_SG_RQ1;
- init_attr->wqe_size_enc_rq2 = EHEA_SG_RQ2;
- init_attr->wqe_size_enc_rq3 = EHEA_SG_RQ3;
- init_attr->rq2_threshold = EHEA_RQ2_THRESHOLD;
- init_attr->rq3_threshold = EHEA_RQ3_THRESHOLD;
- init_attr->port_nr = port->logical_port_id;
- init_attr->send_cq_handle = pr->send_cq->fw_handle;
- init_attr->recv_cq_handle = pr->recv_cq->fw_handle;
- init_attr->aff_eq_handle = port->qp_eq->fw_handle;
-
- pr->qp = ehea_create_qp(adapter, adapter->pd, init_attr);
- if (!pr->qp) {
- pr_err("create_qp failed\n");
- ret = -EIO;
- goto out_free;
- }
-
- if (netif_msg_ifup(port))
- pr_info("QP: qp_nr=%d\n act_nr_snd_wqe=%d\n nr_rwqe_rq1=%d\n nr_rwqe_rq2=%d\n nr_rwqe_rq3=%d\n",
- init_attr->qp_nr,
- init_attr->act_nr_send_wqes,
- init_attr->act_nr_rwqes_rq1,
- init_attr->act_nr_rwqes_rq2,
- init_attr->act_nr_rwqes_rq3);
-
- pr->sq_skba_size = init_attr->act_nr_send_wqes + 1;
-
- ret = ehea_init_q_skba(&pr->sq_skba, pr->sq_skba_size);
- ret |= ehea_init_q_skba(&pr->rq1_skba, init_attr->act_nr_rwqes_rq1 + 1);
- ret |= ehea_init_q_skba(&pr->rq2_skba, init_attr->act_nr_rwqes_rq2 + 1);
- ret |= ehea_init_q_skba(&pr->rq3_skba, init_attr->act_nr_rwqes_rq3 + 1);
- if (ret)
- goto out_free;
-
- pr->swqe_refill_th = init_attr->act_nr_send_wqes / 10;
- if (ehea_gen_smrs(pr) != 0) {
- ret = -EIO;
- goto out_free;
- }
-
- atomic_set(&pr->swqe_avail, init_attr->act_nr_send_wqes - 1);
-
- kfree(init_attr);
-
- netif_napi_add(pr->port->netdev, &pr->napi, ehea_poll);
-
- ret = 0;
- goto out;
-
-out_free:
- kfree(init_attr);
- vfree(pr->sq_skba.arr);
- vfree(pr->rq1_skba.arr);
- vfree(pr->rq2_skba.arr);
- vfree(pr->rq3_skba.arr);
- ehea_destroy_qp(pr->qp);
- ehea_destroy_cq(pr->send_cq);
- ehea_destroy_cq(pr->recv_cq);
- ehea_destroy_eq(pr->eq);
-out:
- return ret;
-}
-
-static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr)
-{
- int ret, i;
-
- if (pr->qp)
- netif_napi_del(&pr->napi);
-
- ret = ehea_destroy_qp(pr->qp);
-
- if (!ret) {
- ehea_destroy_cq(pr->send_cq);
- ehea_destroy_cq(pr->recv_cq);
- ehea_destroy_eq(pr->eq);
-
- for (i = 0; i < pr->rq1_skba.len; i++)
- dev_kfree_skb(pr->rq1_skba.arr[i]);
-
- for (i = 0; i < pr->rq2_skba.len; i++)
- dev_kfree_skb(pr->rq2_skba.arr[i]);
-
- for (i = 0; i < pr->rq3_skba.len; i++)
- dev_kfree_skb(pr->rq3_skba.arr[i]);
-
- for (i = 0; i < pr->sq_skba.len; i++)
- dev_kfree_skb(pr->sq_skba.arr[i]);
-
- vfree(pr->rq1_skba.arr);
- vfree(pr->rq2_skba.arr);
- vfree(pr->rq3_skba.arr);
- vfree(pr->sq_skba.arr);
- ret = ehea_rem_smrs(pr);
- }
- return ret;
-}
-
-static void write_swqe2_immediate(struct sk_buff *skb, struct ehea_swqe *swqe,
- u32 lkey)
-{
- int skb_data_size = skb_headlen(skb);
- u8 *imm_data = &swqe->u.immdata_desc.immediate_data[0];
- struct ehea_vsgentry *sg1entry = &swqe->u.immdata_desc.sg_entry;
- unsigned int immediate_len = SWQE2_MAX_IMM;
-
- swqe->descriptors = 0;
-
- if (skb_is_gso(skb)) {
- swqe->tx_control |= EHEA_SWQE_TSO;
- swqe->mss = skb_shinfo(skb)->gso_size;
- /*
- * For TSO packets we only copy the headers into the
- * immediate area.
- */
- immediate_len = skb_tcp_all_headers(skb);
- }
-
- if (skb_is_gso(skb) || skb_data_size >= SWQE2_MAX_IMM) {
- skb_copy_from_linear_data(skb, imm_data, immediate_len);
- swqe->immediate_data_length = immediate_len;
-
- if (skb_data_size > immediate_len) {
- sg1entry->l_key = lkey;
- sg1entry->len = skb_data_size - immediate_len;
- sg1entry->vaddr =
- ehea_map_vaddr(skb->data + immediate_len);
- swqe->descriptors++;
- }
- } else {
- skb_copy_from_linear_data(skb, imm_data, skb_data_size);
- swqe->immediate_data_length = skb_data_size;
- }
-}
-
-static inline void write_swqe2_data(struct sk_buff *skb, struct net_device *dev,
- struct ehea_swqe *swqe, u32 lkey)
-{
- struct ehea_vsgentry *sg_list, *sg1entry, *sgentry;
- skb_frag_t *frag;
- int nfrags, sg1entry_contains_frag_data, i;
-
- nfrags = skb_shinfo(skb)->nr_frags;
- sg1entry = &swqe->u.immdata_desc.sg_entry;
- sg_list = (struct ehea_vsgentry *)&swqe->u.immdata_desc.sg_list;
- sg1entry_contains_frag_data = 0;
-
- write_swqe2_immediate(skb, swqe, lkey);
-
- /* write descriptors */
- if (nfrags > 0) {
- if (swqe->descriptors == 0) {
- /* sg1entry not yet used */
- frag = &skb_shinfo(skb)->frags[0];
-
- /* copy sg1entry data */
- sg1entry->l_key = lkey;
- sg1entry->len = skb_frag_size(frag);
- sg1entry->vaddr =
- ehea_map_vaddr(skb_frag_address(frag));
- swqe->descriptors++;
- sg1entry_contains_frag_data = 1;
- }
-
- for (i = sg1entry_contains_frag_data; i < nfrags; i++) {
-
- frag = &skb_shinfo(skb)->frags[i];
- sgentry = &sg_list[i - sg1entry_contains_frag_data];
-
- sgentry->l_key = lkey;
- sgentry->len = skb_frag_size(frag);
- sgentry->vaddr = ehea_map_vaddr(skb_frag_address(frag));
- swqe->descriptors++;
- }
- }
-}
-
-static int ehea_broadcast_reg_helper(struct ehea_port *port, u32 hcallid)
-{
- int ret = 0;
- u64 hret;
- u8 reg_type;
-
- /* De/Register untagged packets */
- reg_type = EHEA_BCMC_BROADCAST | EHEA_BCMC_UNTAGGED;
- hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
- port->logical_port_id,
- reg_type, port->mac_addr, 0, hcallid);
- if (hret != H_SUCCESS) {
- pr_err("%sregistering bc address failed (tagged)\n",
- hcallid == H_REG_BCMC ? "" : "de");
- ret = -EIO;
- goto out_herr;
- }
-
- /* De/Register VLAN packets */
- reg_type = EHEA_BCMC_BROADCAST | EHEA_BCMC_VLANID_ALL;
- hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
- port->logical_port_id,
- reg_type, port->mac_addr, 0, hcallid);
- if (hret != H_SUCCESS) {
- pr_err("%sregistering bc address failed (vlan)\n",
- hcallid == H_REG_BCMC ? "" : "de");
- ret = -EIO;
- }
-out_herr:
- return ret;
-}
-
-static int ehea_set_mac_addr(struct net_device *dev, void *sa)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct sockaddr *mac_addr = sa;
- struct hcp_ehea_port_cb0 *cb0;
- int ret;
- u64 hret;
-
- if (!is_valid_ether_addr(mac_addr->sa_data)) {
- ret = -EADDRNOTAVAIL;
- goto out;
- }
-
- cb0 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb0) {
- pr_err("no mem for cb0\n");
- ret = -ENOMEM;
- goto out;
- }
-
- memcpy(&(cb0->port_mac_addr), &(mac_addr->sa_data[0]), ETH_ALEN);
-
- cb0->port_mac_addr = cb0->port_mac_addr >> 16;
-
- hret = ehea_h_modify_ehea_port(port->adapter->handle,
- port->logical_port_id, H_PORT_CB0,
- EHEA_BMASK_SET(H_PORT_CB0_MAC, 1), cb0);
- if (hret != H_SUCCESS) {
- ret = -EIO;
- goto out_free;
- }
-
- eth_hw_addr_set(dev, mac_addr->sa_data);
-
- /* Deregister old MAC in pHYP */
- if (port->state == EHEA_PORT_UP) {
- ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
- if (ret)
- goto out_upregs;
- }
-
- port->mac_addr = cb0->port_mac_addr << 16;
-
- /* Register new MAC in pHYP */
- if (port->state == EHEA_PORT_UP) {
- ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
- if (ret)
- goto out_upregs;
- }
-
- ret = 0;
-
-out_upregs:
- ehea_update_bcmc_registrations();
-out_free:
- free_page((unsigned long)cb0);
-out:
- return ret;
-}
-
-static void ehea_promiscuous_error(u64 hret, int enable)
-{
- if (hret == H_AUTHORITY)
- pr_info("Hypervisor denied %sabling promiscuous mode\n",
- enable == 1 ? "en" : "dis");
- else
- pr_err("failed %sabling promiscuous mode\n",
- enable == 1 ? "en" : "dis");
-}
-
-static void ehea_promiscuous(struct net_device *dev, int enable)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct hcp_ehea_port_cb7 *cb7;
- u64 hret;
-
- if (enable == port->promisc)
- return;
-
- cb7 = (void *)get_zeroed_page(GFP_ATOMIC);
- if (!cb7) {
- pr_err("no mem for cb7\n");
- goto out;
- }
-
- /* Modify Pxs_DUCQPN in CB7 */
- cb7->def_uc_qpn = enable == 1 ? port->port_res[0].qp->fw_handle : 0;
-
- hret = ehea_h_modify_ehea_port(port->adapter->handle,
- port->logical_port_id,
- H_PORT_CB7, H_PORT_CB7_DUCQPN, cb7);
- if (hret) {
- ehea_promiscuous_error(hret, enable);
- goto out;
- }
-
- port->promisc = enable;
-out:
- free_page((unsigned long)cb7);
-}
-
-static u64 ehea_multicast_reg_helper(struct ehea_port *port, u64 mc_mac_addr,
- u32 hcallid)
-{
- u64 hret;
- u8 reg_type;
-
- reg_type = EHEA_BCMC_MULTICAST | EHEA_BCMC_UNTAGGED;
- if (mc_mac_addr == 0)
- reg_type |= EHEA_BCMC_SCOPE_ALL;
-
- hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
- port->logical_port_id,
- reg_type, mc_mac_addr, 0, hcallid);
- if (hret)
- goto out;
-
- reg_type = EHEA_BCMC_MULTICAST | EHEA_BCMC_VLANID_ALL;
- if (mc_mac_addr == 0)
- reg_type |= EHEA_BCMC_SCOPE_ALL;
-
- hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
- port->logical_port_id,
- reg_type, mc_mac_addr, 0, hcallid);
-out:
- return hret;
-}
-
-static int ehea_drop_multicast_list(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_mc_list *mc_entry = port->mc_list;
- struct list_head *pos;
- struct list_head *temp;
- int ret = 0;
- u64 hret;
-
- list_for_each_safe(pos, temp, &(port->mc_list->list)) {
- mc_entry = list_entry(pos, struct ehea_mc_list, list);
-
- hret = ehea_multicast_reg_helper(port, mc_entry->macaddr,
- H_DEREG_BCMC);
- if (hret) {
- pr_err("failed deregistering mcast MAC\n");
- ret = -EIO;
- }
-
- list_del(pos);
- kfree(mc_entry);
- }
- return ret;
-}
-
-static void ehea_allmulti(struct net_device *dev, int enable)
-{
- struct ehea_port *port = netdev_priv(dev);
- u64 hret;
-
- if (!port->allmulti) {
- if (enable) {
- /* Enable ALLMULTI */
- ehea_drop_multicast_list(dev);
- hret = ehea_multicast_reg_helper(port, 0, H_REG_BCMC);
- if (!hret)
- port->allmulti = 1;
- else
- netdev_err(dev,
- "failed enabling IFF_ALLMULTI\n");
- }
- } else {
- if (!enable) {
- /* Disable ALLMULTI */
- hret = ehea_multicast_reg_helper(port, 0, H_DEREG_BCMC);
- if (!hret)
- port->allmulti = 0;
- else
- netdev_err(dev,
- "failed disabling IFF_ALLMULTI\n");
- }
- }
-}
-
-static void ehea_add_multicast_entry(struct ehea_port *port, u8 *mc_mac_addr)
-{
- struct ehea_mc_list *ehea_mcl_entry;
- u64 hret;
-
- ehea_mcl_entry = kzalloc_obj(*ehea_mcl_entry, GFP_ATOMIC);
- if (!ehea_mcl_entry)
- return;
-
- INIT_LIST_HEAD(&ehea_mcl_entry->list);
-
- memcpy(&ehea_mcl_entry->macaddr, mc_mac_addr, ETH_ALEN);
-
- hret = ehea_multicast_reg_helper(port, ehea_mcl_entry->macaddr,
- H_REG_BCMC);
- if (!hret)
- list_add(&ehea_mcl_entry->list, &port->mc_list->list);
- else {
- pr_err("failed registering mcast MAC\n");
- kfree(ehea_mcl_entry);
- }
-}
-
-static void ehea_set_multicast_list(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct netdev_hw_addr *ha;
- int ret;
-
- ehea_promiscuous(dev, !!(dev->flags & IFF_PROMISC));
-
- if (dev->flags & IFF_ALLMULTI) {
- ehea_allmulti(dev, 1);
- goto out;
- }
- ehea_allmulti(dev, 0);
-
- if (!netdev_mc_empty(dev)) {
- ret = ehea_drop_multicast_list(dev);
- if (ret) {
- /* Dropping the current multicast list failed.
- * Enabling ALL_MULTI is the best we can do.
- */
- ehea_allmulti(dev, 1);
- }
-
- if (netdev_mc_count(dev) > port->adapter->max_mc_mac) {
- pr_info("Mcast registration limit reached (0x%llx). Use ALLMULTI!\n",
- port->adapter->max_mc_mac);
- goto out;
- }
-
- netdev_for_each_mc_addr(ha, dev)
- ehea_add_multicast_entry(port, ha->addr);
-
- }
-out:
- ehea_update_bcmc_registrations();
-}
-
-static void xmit_common(struct sk_buff *skb, struct ehea_swqe *swqe)
-{
- swqe->tx_control |= EHEA_SWQE_IMM_DATA_PRESENT | EHEA_SWQE_CRC;
-
- if (vlan_get_protocol(skb) != htons(ETH_P_IP))
- return;
-
- if (skb->ip_summed == CHECKSUM_PARTIAL)
- swqe->tx_control |= EHEA_SWQE_IP_CHECKSUM;
-
- swqe->ip_start = skb_network_offset(skb);
- swqe->ip_end = swqe->ip_start + ip_hdrlen(skb) - 1;
-
- switch (ip_hdr(skb)->protocol) {
- case IPPROTO_UDP:
- if (skb->ip_summed == CHECKSUM_PARTIAL)
- swqe->tx_control |= EHEA_SWQE_TCP_CHECKSUM;
-
- swqe->tcp_offset = swqe->ip_end + 1 +
- offsetof(struct udphdr, check);
- break;
-
- case IPPROTO_TCP:
- if (skb->ip_summed == CHECKSUM_PARTIAL)
- swqe->tx_control |= EHEA_SWQE_TCP_CHECKSUM;
-
- swqe->tcp_offset = swqe->ip_end + 1 +
- offsetof(struct tcphdr, check);
- break;
- }
-}
-
-static void ehea_xmit2(struct sk_buff *skb, struct net_device *dev,
- struct ehea_swqe *swqe, u32 lkey)
-{
- swqe->tx_control |= EHEA_SWQE_DESCRIPTORS_PRESENT;
-
- xmit_common(skb, swqe);
-
- write_swqe2_data(skb, dev, swqe, lkey);
-}
-
-static void ehea_xmit3(struct sk_buff *skb, struct net_device *dev,
- struct ehea_swqe *swqe)
-{
- u8 *imm_data = &swqe->u.immdata_nodesc.immediate_data[0];
-
- xmit_common(skb, swqe);
-
- if (!skb->data_len)
- skb_copy_from_linear_data(skb, imm_data, skb->len);
- else
- skb_copy_bits(skb, 0, imm_data, skb->len);
-
- swqe->immediate_data_length = skb->len;
- dev_consume_skb_any(skb);
-}
-
-static netdev_tx_t ehea_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_swqe *swqe;
- u32 lkey;
- int swqe_index;
- struct ehea_port_res *pr;
- struct netdev_queue *txq;
-
- pr = &port->port_res[skb_get_queue_mapping(skb)];
- txq = netdev_get_tx_queue(dev, skb_get_queue_mapping(skb));
-
- swqe = ehea_get_swqe(pr->qp, &swqe_index);
- memset(swqe, 0, SWQE_HEADER_SIZE);
- atomic_dec(&pr->swqe_avail);
-
- if (skb_vlan_tag_present(skb)) {
- swqe->tx_control |= EHEA_SWQE_VLAN_INSERT;
- swqe->vlan_tag = skb_vlan_tag_get(skb);
- }
-
- pr->tx_packets++;
- pr->tx_bytes += skb->len;
-
- if (skb->len <= SWQE3_MAX_IMM) {
- u32 sig_iv = port->sig_comp_iv;
- u32 swqe_num = pr->swqe_id_counter;
- ehea_xmit3(skb, dev, swqe);
- swqe->wr_id = EHEA_BMASK_SET(EHEA_WR_ID_TYPE, EHEA_SWQE3_TYPE)
- | EHEA_BMASK_SET(EHEA_WR_ID_COUNT, swqe_num);
- if (pr->swqe_ll_count >= (sig_iv - 1)) {
- swqe->wr_id |= EHEA_BMASK_SET(EHEA_WR_ID_REFILL,
- sig_iv);
- swqe->tx_control |= EHEA_SWQE_SIGNALLED_COMPLETION;
- pr->swqe_ll_count = 0;
- } else
- pr->swqe_ll_count += 1;
- } else {
- swqe->wr_id =
- EHEA_BMASK_SET(EHEA_WR_ID_TYPE, EHEA_SWQE2_TYPE)
- | EHEA_BMASK_SET(EHEA_WR_ID_COUNT, pr->swqe_id_counter)
- | EHEA_BMASK_SET(EHEA_WR_ID_REFILL, 1)
- | EHEA_BMASK_SET(EHEA_WR_ID_INDEX, pr->sq_skba.index);
- pr->sq_skba.arr[pr->sq_skba.index] = skb;
-
- pr->sq_skba.index++;
- pr->sq_skba.index &= (pr->sq_skba.len - 1);
-
- lkey = pr->send_mr.lkey;
- ehea_xmit2(skb, dev, swqe, lkey);
- swqe->tx_control |= EHEA_SWQE_SIGNALLED_COMPLETION;
- }
- pr->swqe_id_counter += 1;
-
- netif_info(port, tx_queued, dev,
- "post swqe on QP %d\n", pr->qp->init_attr.qp_nr);
- if (netif_msg_tx_queued(port))
- ehea_dump(swqe, 512, "swqe");
-
- if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
- netif_tx_stop_queue(txq);
- swqe->tx_control |= EHEA_SWQE_PURGE;
- }
-
- ehea_post_swqe(pr->qp, swqe);
-
- if (unlikely(atomic_read(&pr->swqe_avail) <= 1)) {
- pr->p_stats.queue_stopped++;
- netif_tx_stop_queue(txq);
- }
-
- return NETDEV_TX_OK;
-}
-
-static int ehea_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_adapter *adapter = port->adapter;
- struct hcp_ehea_port_cb1 *cb1;
- int index;
- u64 hret;
- int err = 0;
-
- cb1 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb1) {
- pr_err("no mem for cb1\n");
- err = -ENOMEM;
- goto out;
- }
-
- hret = ehea_h_query_ehea_port(adapter->handle, port->logical_port_id,
- H_PORT_CB1, H_PORT_CB1_ALL, cb1);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_port failed\n");
- err = -EINVAL;
- goto out;
- }
-
- index = (vid / 64);
- cb1->vlan_filter[index] |= ((u64)(0x8000000000000000 >> (vid & 0x3F)));
-
- hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
- H_PORT_CB1, H_PORT_CB1_ALL, cb1);
- if (hret != H_SUCCESS) {
- pr_err("modify_ehea_port failed\n");
- err = -EINVAL;
- }
-out:
- free_page((unsigned long)cb1);
- return err;
-}
-
-static int ehea_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_adapter *adapter = port->adapter;
- struct hcp_ehea_port_cb1 *cb1;
- int index;
- u64 hret;
- int err = 0;
-
- cb1 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb1) {
- pr_err("no mem for cb1\n");
- err = -ENOMEM;
- goto out;
- }
-
- hret = ehea_h_query_ehea_port(adapter->handle, port->logical_port_id,
- H_PORT_CB1, H_PORT_CB1_ALL, cb1);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_port failed\n");
- err = -EINVAL;
- goto out;
- }
-
- index = (vid / 64);
- cb1->vlan_filter[index] &= ~((u64)(0x8000000000000000 >> (vid & 0x3F)));
-
- hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
- H_PORT_CB1, H_PORT_CB1_ALL, cb1);
- if (hret != H_SUCCESS) {
- pr_err("modify_ehea_port failed\n");
- err = -EINVAL;
- }
-out:
- free_page((unsigned long)cb1);
- return err;
-}
-
-static int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp)
-{
- int ret = -EIO;
- u64 hret;
- u16 dummy16 = 0;
- u64 dummy64 = 0;
- struct hcp_modify_qp_cb0 *cb0;
-
- cb0 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb0) {
- ret = -ENOMEM;
- goto out;
- }
-
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_qp failed (1)\n");
- goto out;
- }
-
- cb0->qp_ctl_reg = H_QP_CR_STATE_INITIALIZED;
- hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG, 1), cb0,
- &dummy64, &dummy64, &dummy16, &dummy16);
- if (hret != H_SUCCESS) {
- pr_err("modify_ehea_qp failed (1)\n");
- goto out;
- }
-
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_qp failed (2)\n");
- goto out;
- }
-
- cb0->qp_ctl_reg = H_QP_CR_ENABLED | H_QP_CR_STATE_INITIALIZED;
- hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG, 1), cb0,
- &dummy64, &dummy64, &dummy16, &dummy16);
- if (hret != H_SUCCESS) {
- pr_err("modify_ehea_qp failed (2)\n");
- goto out;
- }
-
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_qp failed (3)\n");
- goto out;
- }
-
- cb0->qp_ctl_reg = H_QP_CR_ENABLED | H_QP_CR_STATE_RDY2SND;
- hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG, 1), cb0,
- &dummy64, &dummy64, &dummy16, &dummy16);
- if (hret != H_SUCCESS) {
- pr_err("modify_ehea_qp failed (3)\n");
- goto out;
- }
-
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_qp failed (4)\n");
- goto out;
- }
-
- ret = 0;
-out:
- free_page((unsigned long)cb0);
- return ret;
-}
-
-static int ehea_port_res_setup(struct ehea_port *port, int def_qps)
-{
- int ret, i;
- struct port_res_cfg pr_cfg, pr_cfg_small_rx;
- enum ehea_eq_type eq_type = EHEA_EQ;
-
- port->qp_eq = ehea_create_eq(port->adapter, eq_type,
- EHEA_MAX_ENTRIES_EQ, 1);
- if (!port->qp_eq) {
- ret = -EINVAL;
- pr_err("ehea_create_eq failed (qp_eq)\n");
- goto out_kill_eq;
- }
-
- pr_cfg.max_entries_rcq = rq1_entries + rq2_entries + rq3_entries;
- pr_cfg.max_entries_scq = sq_entries * 2;
- pr_cfg.max_entries_sq = sq_entries;
- pr_cfg.max_entries_rq1 = rq1_entries;
- pr_cfg.max_entries_rq2 = rq2_entries;
- pr_cfg.max_entries_rq3 = rq3_entries;
-
- pr_cfg_small_rx.max_entries_rcq = 1;
- pr_cfg_small_rx.max_entries_scq = sq_entries;
- pr_cfg_small_rx.max_entries_sq = sq_entries;
- pr_cfg_small_rx.max_entries_rq1 = 1;
- pr_cfg_small_rx.max_entries_rq2 = 1;
- pr_cfg_small_rx.max_entries_rq3 = 1;
-
- for (i = 0; i < def_qps; i++) {
- ret = ehea_init_port_res(port, &port->port_res[i], &pr_cfg, i);
- if (ret)
- goto out_clean_pr;
- }
- for (i = def_qps; i < def_qps; i++) {
- ret = ehea_init_port_res(port, &port->port_res[i],
- &pr_cfg_small_rx, i);
- if (ret)
- goto out_clean_pr;
- }
-
- return 0;
-
-out_clean_pr:
- while (--i >= 0)
- ehea_clean_portres(port, &port->port_res[i]);
-
-out_kill_eq:
- ehea_destroy_eq(port->qp_eq);
- return ret;
-}
-
-static int ehea_clean_all_portres(struct ehea_port *port)
-{
- int ret = 0;
- int i;
-
- for (i = 0; i < port->num_def_qps; i++)
- ret |= ehea_clean_portres(port, &port->port_res[i]);
-
- ret |= ehea_destroy_eq(port->qp_eq);
-
- return ret;
-}
-
-static void ehea_remove_adapter_mr(struct ehea_adapter *adapter)
-{
- if (adapter->active_ports)
- return;
-
- ehea_rem_mr(&adapter->mr);
-}
-
-static int ehea_add_adapter_mr(struct ehea_adapter *adapter)
-{
- if (adapter->active_ports)
- return 0;
-
- return ehea_reg_kernel_mr(adapter, &adapter->mr);
-}
-
-static int ehea_up(struct net_device *dev)
-{
- int ret, i;
- struct ehea_port *port = netdev_priv(dev);
-
- if (port->state == EHEA_PORT_UP)
- return 0;
-
- ret = ehea_port_res_setup(port, port->num_def_qps);
- if (ret) {
- netdev_err(dev, "port_res_failed\n");
- goto out;
- }
-
- /* Set default QP for this port */
- ret = ehea_configure_port(port);
- if (ret) {
- netdev_err(dev, "ehea_configure_port failed. ret:%d\n", ret);
- goto out_clean_pr;
- }
-
- ret = ehea_reg_interrupts(dev);
- if (ret) {
- netdev_err(dev, "reg_interrupts failed. ret:%d\n", ret);
- goto out_clean_pr;
- }
-
- for (i = 0; i < port->num_def_qps; i++) {
- ret = ehea_activate_qp(port->adapter, port->port_res[i].qp);
- if (ret) {
- netdev_err(dev, "activate_qp failed\n");
- goto out_free_irqs;
- }
- }
-
- for (i = 0; i < port->num_def_qps; i++) {
- ret = ehea_fill_port_res(&port->port_res[i]);
- if (ret) {
- netdev_err(dev, "out_free_irqs\n");
- goto out_free_irqs;
- }
- }
-
- ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
- if (ret) {
- ret = -EIO;
- goto out_free_irqs;
- }
-
- port->state = EHEA_PORT_UP;
-
- ret = 0;
- goto out;
-
-out_free_irqs:
- ehea_free_interrupts(dev);
-
-out_clean_pr:
- ehea_clean_all_portres(port);
-out:
- if (ret)
- netdev_info(dev, "Failed starting. ret=%i\n", ret);
-
- ehea_update_bcmc_registrations();
- ehea_update_firmware_handles();
-
- return ret;
-}
-
-static void port_napi_disable(struct ehea_port *port)
-{
- int i;
-
- for (i = 0; i < port->num_def_qps; i++)
- napi_disable(&port->port_res[i].napi);
-}
-
-static void port_napi_enable(struct ehea_port *port)
-{
- int i;
-
- for (i = 0; i < port->num_def_qps; i++)
- napi_enable(&port->port_res[i].napi);
-}
-
-static int ehea_open(struct net_device *dev)
-{
- int ret;
- struct ehea_port *port = netdev_priv(dev);
-
- mutex_lock(&port->port_lock);
-
- netif_info(port, ifup, dev, "enabling port\n");
-
- netif_carrier_off(dev);
-
- ret = ehea_up(dev);
- if (!ret) {
- port_napi_enable(port);
- netif_tx_start_all_queues(dev);
- }
-
- mutex_unlock(&port->port_lock);
- schedule_delayed_work(&port->stats_work,
- round_jiffies_relative(msecs_to_jiffies(1000)));
-
- return ret;
-}
-
-static int ehea_down(struct net_device *dev)
-{
- int ret;
- struct ehea_port *port = netdev_priv(dev);
-
- if (port->state == EHEA_PORT_DOWN)
- return 0;
-
- ehea_drop_multicast_list(dev);
- ehea_allmulti(dev, 0);
- ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
-
- ehea_free_interrupts(dev);
-
- port->state = EHEA_PORT_DOWN;
-
- ehea_update_bcmc_registrations();
-
- ret = ehea_clean_all_portres(port);
- if (ret)
- netdev_info(dev, "Failed freeing resources. ret=%i\n", ret);
-
- ehea_update_firmware_handles();
-
- return ret;
-}
-
-static int ehea_stop(struct net_device *dev)
-{
- int ret;
- struct ehea_port *port = netdev_priv(dev);
-
- netif_info(port, ifdown, dev, "disabling port\n");
-
- set_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
- cancel_work_sync(&port->reset_task);
- cancel_delayed_work_sync(&port->stats_work);
- mutex_lock(&port->port_lock);
- netif_tx_stop_all_queues(dev);
- port_napi_disable(port);
- ret = ehea_down(dev);
- mutex_unlock(&port->port_lock);
- clear_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
- return ret;
-}
-
-static void ehea_purge_sq(struct ehea_qp *orig_qp)
-{
- struct ehea_qp qp = *orig_qp;
- struct ehea_qp_init_attr *init_attr = &qp.init_attr;
- struct ehea_swqe *swqe;
- int wqe_index;
- int i;
-
- for (i = 0; i < init_attr->act_nr_send_wqes; i++) {
- swqe = ehea_get_swqe(&qp, &wqe_index);
- swqe->tx_control |= EHEA_SWQE_PURGE;
- }
-}
-
-static void ehea_flush_sq(struct ehea_port *port)
-{
- int i;
-
- for (i = 0; i < port->num_def_qps; i++) {
- struct ehea_port_res *pr = &port->port_res[i];
- int swqe_max = pr->sq_skba_size - 2 - pr->swqe_ll_count;
- int ret;
-
- ret = wait_event_timeout(port->swqe_avail_wq,
- atomic_read(&pr->swqe_avail) >= swqe_max,
- msecs_to_jiffies(100));
-
- if (!ret) {
- pr_err("WARNING: sq not flushed completely\n");
- break;
- }
- }
-}
-
-static int ehea_stop_qps(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_adapter *adapter = port->adapter;
- struct hcp_modify_qp_cb0 *cb0;
- int ret = -EIO;
- int dret;
- int i;
- u64 hret;
- u64 dummy64 = 0;
- u16 dummy16 = 0;
-
- cb0 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb0) {
- ret = -ENOMEM;
- goto out;
- }
-
- for (i = 0; i < (port->num_def_qps); i++) {
- struct ehea_port_res *pr = &port->port_res[i];
- struct ehea_qp *qp = pr->qp;
-
- /* Purge send queue */
- ehea_purge_sq(qp);
-
- /* Disable queue pair */
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
- cb0);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_qp failed (1)\n");
- goto out;
- }
-
- cb0->qp_ctl_reg = (cb0->qp_ctl_reg & H_QP_CR_RES_STATE) << 8;
- cb0->qp_ctl_reg &= ~H_QP_CR_ENABLED;
-
- hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG,
- 1), cb0, &dummy64,
- &dummy64, &dummy16, &dummy16);
- if (hret != H_SUCCESS) {
- pr_err("modify_ehea_qp failed (1)\n");
- goto out;
- }
-
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
- cb0);
- if (hret != H_SUCCESS) {
- pr_err("query_ehea_qp failed (2)\n");
- goto out;
- }
-
- /* deregister shared memory regions */
- dret = ehea_rem_smrs(pr);
- if (dret) {
- pr_err("unreg shared memory region failed\n");
- goto out;
- }
- }
-
- ret = 0;
-out:
- free_page((unsigned long)cb0);
-
- return ret;
-}
-
-static void ehea_update_rqs(struct ehea_qp *orig_qp, struct ehea_port_res *pr)
-{
- struct ehea_qp qp = *orig_qp;
- struct ehea_qp_init_attr *init_attr = &qp.init_attr;
- struct ehea_rwqe *rwqe;
- struct sk_buff **skba_rq2 = pr->rq2_skba.arr;
- struct sk_buff **skba_rq3 = pr->rq3_skba.arr;
- struct sk_buff *skb;
- u32 lkey = pr->recv_mr.lkey;
-
-
- int i;
- int index;
-
- for (i = 0; i < init_attr->act_nr_rwqes_rq2 + 1; i++) {
- rwqe = ehea_get_next_rwqe(&qp, 2);
- rwqe->sg_list[0].l_key = lkey;
- index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, rwqe->wr_id);
- skb = skba_rq2[index];
- if (skb)
- rwqe->sg_list[0].vaddr = ehea_map_vaddr(skb->data);
- }
-
- for (i = 0; i < init_attr->act_nr_rwqes_rq3 + 1; i++) {
- rwqe = ehea_get_next_rwqe(&qp, 3);
- rwqe->sg_list[0].l_key = lkey;
- index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, rwqe->wr_id);
- skb = skba_rq3[index];
- if (skb)
- rwqe->sg_list[0].vaddr = ehea_map_vaddr(skb->data);
- }
-}
-
-static int ehea_restart_qps(struct net_device *dev)
-{
- struct ehea_port *port = netdev_priv(dev);
- struct ehea_adapter *adapter = port->adapter;
- int ret = 0;
- int i;
-
- struct hcp_modify_qp_cb0 *cb0;
- u64 hret;
- u64 dummy64 = 0;
- u16 dummy16 = 0;
-
- cb0 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb0)
- return -ENOMEM;
-
- for (i = 0; i < (port->num_def_qps); i++) {
- struct ehea_port_res *pr = &port->port_res[i];
- struct ehea_qp *qp = pr->qp;
-
- ret = ehea_gen_smrs(pr);
- if (ret) {
- netdev_err(dev, "creation of shared memory regions failed\n");
- goto out;
- }
-
- ehea_update_rqs(qp, pr);
-
- /* Enable queue pair */
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
- cb0);
- if (hret != H_SUCCESS) {
- netdev_err(dev, "query_ehea_qp failed (1)\n");
- ret = -EFAULT;
- goto out;
- }
-
- cb0->qp_ctl_reg = (cb0->qp_ctl_reg & H_QP_CR_RES_STATE) << 8;
- cb0->qp_ctl_reg |= H_QP_CR_ENABLED;
-
- hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG,
- 1), cb0, &dummy64,
- &dummy64, &dummy16, &dummy16);
- if (hret != H_SUCCESS) {
- netdev_err(dev, "modify_ehea_qp failed (1)\n");
- ret = -EFAULT;
- goto out;
- }
-
- hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
- EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
- cb0);
- if (hret != H_SUCCESS) {
- netdev_err(dev, "query_ehea_qp failed (2)\n");
- ret = -EFAULT;
- goto out;
- }
-
- /* refill entire queue */
- ehea_refill_rq1(pr, pr->rq1_skba.index, 0);
- ehea_refill_rq2(pr, 0);
- ehea_refill_rq3(pr, 0);
- }
-out:
- free_page((unsigned long)cb0);
-
- return ret;
-}
-
-static void ehea_reset_port(struct work_struct *work)
-{
- int ret;
- struct ehea_port *port =
- container_of(work, struct ehea_port, reset_task);
- struct net_device *dev = port->netdev;
-
- mutex_lock(&dlpar_mem_lock);
- port->resets++;
- mutex_lock(&port->port_lock);
- netif_tx_disable(dev);
-
- port_napi_disable(port);
-
- ehea_down(dev);
-
- ret = ehea_up(dev);
- if (ret)
- goto out;
-
- ehea_set_multicast_list(dev);
-
- netif_info(port, timer, dev, "reset successful\n");
-
- port_napi_enable(port);
-
- netif_tx_wake_all_queues(dev);
-out:
- mutex_unlock(&port->port_lock);
- mutex_unlock(&dlpar_mem_lock);
-}
-
-static void ehea_rereg_mrs(void)
-{
- int ret, i;
- struct ehea_adapter *adapter;
-
- pr_info("LPAR memory changed - re-initializing driver\n");
-
- list_for_each_entry(adapter, &adapter_list, list)
- if (adapter->active_ports) {
- /* Shutdown all ports */
- for (i = 0; i < EHEA_MAX_PORTS; i++) {
- struct ehea_port *port = adapter->port[i];
- struct net_device *dev;
-
- if (!port)
- continue;
-
- dev = port->netdev;
-
- if (dev->flags & IFF_UP) {
- mutex_lock(&port->port_lock);
- netif_tx_disable(dev);
- ehea_flush_sq(port);
- ret = ehea_stop_qps(dev);
- if (ret) {
- mutex_unlock(&port->port_lock);
- goto out;
- }
- port_napi_disable(port);
- mutex_unlock(&port->port_lock);
- }
- reset_sq_restart_flag(port);
- }
-
- /* Unregister old memory region */
- ret = ehea_rem_mr(&adapter->mr);
- if (ret) {
- pr_err("unregister MR failed - driver inoperable!\n");
- goto out;
- }
- }
-
- clear_bit(__EHEA_STOP_XFER, &ehea_driver_flags);
-
- list_for_each_entry(adapter, &adapter_list, list)
- if (adapter->active_ports) {
- /* Register new memory region */
- ret = ehea_reg_kernel_mr(adapter, &adapter->mr);
- if (ret) {
- pr_err("register MR failed - driver inoperable!\n");
- goto out;
- }
-
- /* Restart all ports */
- for (i = 0; i < EHEA_MAX_PORTS; i++) {
- struct ehea_port *port = adapter->port[i];
-
- if (port) {
- struct net_device *dev = port->netdev;
-
- if (dev->flags & IFF_UP) {
- mutex_lock(&port->port_lock);
- ret = ehea_restart_qps(dev);
- if (!ret) {
- check_sqs(port);
- port_napi_enable(port);
- netif_tx_wake_all_queues(dev);
- } else {
- netdev_err(dev, "Unable to restart QPS\n");
- }
- mutex_unlock(&port->port_lock);
- }
- }
- }
- }
- pr_info("re-initializing driver complete\n");
-out:
- return;
-}
-
-static void ehea_tx_watchdog(struct net_device *dev, unsigned int txqueue)
-{
- struct ehea_port *port = netdev_priv(dev);
-
- if (netif_carrier_ok(dev) &&
- !test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))
- ehea_schedule_port_reset(port);
-}
-
-static int ehea_sense_adapter_attr(struct ehea_adapter *adapter)
-{
- struct hcp_query_ehea *cb;
- u64 hret;
- int ret;
-
- cb = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb) {
- ret = -ENOMEM;
- goto out;
- }
-
- hret = ehea_h_query_ehea(adapter->handle, cb);
-
- if (hret != H_SUCCESS) {
- ret = -EIO;
- goto out_herr;
- }
-
- adapter->max_mc_mac = cb->max_mc_mac - 1;
- ret = 0;
-
-out_herr:
- free_page((unsigned long)cb);
-out:
- return ret;
-}
-
-static int ehea_get_jumboframe_status(struct ehea_port *port, int *jumbo)
-{
- struct hcp_ehea_port_cb4 *cb4;
- u64 hret;
- int ret = 0;
-
- *jumbo = 0;
-
- /* (Try to) enable *jumbo frames */
- cb4 = (void *)get_zeroed_page(GFP_KERNEL);
- if (!cb4) {
- pr_err("no mem for cb4\n");
- ret = -ENOMEM;
- goto out;
- } else {
- hret = ehea_h_query_ehea_port(port->adapter->handle,
- port->logical_port_id,
- H_PORT_CB4,
- H_PORT_CB4_JUMBO, cb4);
- if (hret == H_SUCCESS) {
- if (cb4->jumbo_frame)
- *jumbo = 1;
- else {
- cb4->jumbo_frame = 1;
- hret = ehea_h_modify_ehea_port(port->adapter->
- handle,
- port->
- logical_port_id,
- H_PORT_CB4,
- H_PORT_CB4_JUMBO,
- cb4);
- if (hret == H_SUCCESS)
- *jumbo = 1;
- }
- } else
- ret = -EINVAL;
-
- free_page((unsigned long)cb4);
- }
-out:
- return ret;
-}
-
-static ssize_t log_port_id_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct ehea_port *port = container_of(dev, struct ehea_port, ofdev.dev);
- return sprintf(buf, "%d", port->logical_port_id);
-}
-
-static DEVICE_ATTR_RO(log_port_id);
-
-static void logical_port_release(struct device *dev)
-{
- struct ehea_port *port = container_of(dev, struct ehea_port, ofdev.dev);
- of_node_put(port->ofdev.dev.of_node);
-}
-
-static struct device *ehea_register_port(struct ehea_port *port,
- struct device_node *dn)
-{
- int ret;
-
- port->ofdev.dev.of_node = of_node_get(dn);
- port->ofdev.dev.parent = &port->adapter->ofdev->dev;
- port->ofdev.dev.bus = &ibmebus_bus_type;
-
- dev_set_name(&port->ofdev.dev, "port%d", port_name_cnt++);
- port->ofdev.dev.release = logical_port_release;
-
- ret = of_device_register(&port->ofdev);
- if (ret) {
- pr_err("failed to register device. ret=%d\n", ret);
- put_device(&port->ofdev.dev);
- goto out;
- }
-
- ret = device_create_file(&port->ofdev.dev, &dev_attr_log_port_id);
- if (ret) {
- pr_err("failed to register attributes, ret=%d\n", ret);
- goto out_unreg_of_dev;
- }
-
- return &port->ofdev.dev;
-
-out_unreg_of_dev:
- of_device_unregister(&port->ofdev);
-out:
- return NULL;
-}
-
-static void ehea_unregister_port(struct ehea_port *port)
-{
- device_remove_file(&port->ofdev.dev, &dev_attr_log_port_id);
- of_device_unregister(&port->ofdev);
-}
-
-static const struct net_device_ops ehea_netdev_ops = {
- .ndo_open = ehea_open,
- .ndo_stop = ehea_stop,
- .ndo_start_xmit = ehea_start_xmit,
- .ndo_get_stats64 = ehea_get_stats64,
- .ndo_set_mac_address = ehea_set_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
- .ndo_set_rx_mode = ehea_set_multicast_list,
- .ndo_vlan_rx_add_vid = ehea_vlan_rx_add_vid,
- .ndo_vlan_rx_kill_vid = ehea_vlan_rx_kill_vid,
- .ndo_tx_timeout = ehea_tx_watchdog,
-};
-
-static struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
- u32 logical_port_id,
- struct device_node *dn)
-{
- int ret;
- struct net_device *dev;
- struct ehea_port *port;
- struct device *port_dev;
- int jumbo;
-
- /* allocate memory for the port structures */
- dev = alloc_etherdev_mq(sizeof(struct ehea_port), EHEA_MAX_PORT_RES);
-
- if (!dev) {
- ret = -ENOMEM;
- goto out_err;
- }
-
- port = netdev_priv(dev);
-
- mutex_init(&port->port_lock);
- port->state = EHEA_PORT_DOWN;
- port->sig_comp_iv = sq_entries / 10;
-
- port->adapter = adapter;
- port->netdev = dev;
- port->logical_port_id = logical_port_id;
-
- port->msg_enable = netif_msg_init(msg_level, EHEA_MSG_DEFAULT);
-
- port->mc_list = kzalloc_obj(struct ehea_mc_list);
- if (!port->mc_list) {
- ret = -ENOMEM;
- goto out_free_ethdev;
- }
-
- INIT_LIST_HEAD(&port->mc_list->list);
-
- ret = ehea_sense_port_attr(port);
- if (ret)
- goto out_free_mc_list;
-
- netif_set_real_num_rx_queues(dev, port->num_def_qps);
- netif_set_real_num_tx_queues(dev, port->num_def_qps);
-
- port_dev = ehea_register_port(port, dn);
- if (!port_dev)
- goto out_free_mc_list;
-
- SET_NETDEV_DEV(dev, port_dev);
-
- /* initialize net_device structure */
- eth_hw_addr_set(dev, (u8 *)&port->mac_addr);
-
- dev->netdev_ops = &ehea_netdev_ops;
- ehea_set_ethtool_ops(dev);
-
- dev->hw_features = NETIF_F_SG | NETIF_F_TSO |
- NETIF_F_IP_CSUM | NETIF_F_HW_VLAN_CTAG_TX;
- dev->features = NETIF_F_SG | NETIF_F_TSO |
- NETIF_F_HIGHDMA | NETIF_F_IP_CSUM |
- NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
- NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXCSUM;
- dev->vlan_features = NETIF_F_SG | NETIF_F_TSO | NETIF_F_HIGHDMA |
- NETIF_F_IP_CSUM;
- dev->watchdog_timeo = EHEA_WATCH_DOG_TIMEOUT;
-
- /* MTU range: 68 - 9022 */
- dev->min_mtu = ETH_MIN_MTU;
- dev->max_mtu = EHEA_MAX_PACKET_SIZE;
-
- INIT_WORK(&port->reset_task, ehea_reset_port);
- INIT_DELAYED_WORK(&port->stats_work, ehea_update_stats);
-
- init_waitqueue_head(&port->swqe_avail_wq);
- init_waitqueue_head(&port->restart_wq);
-
- ret = register_netdev(dev);
- if (ret) {
- pr_err("register_netdev failed. ret=%d\n", ret);
- goto out_unreg_port;
- }
-
- ret = ehea_get_jumboframe_status(port, &jumbo);
- if (ret)
- netdev_err(dev, "failed determining jumbo frame status\n");
-
- netdev_info(dev, "Jumbo frames are %sabled\n",
- jumbo == 1 ? "en" : "dis");
-
- adapter->active_ports++;
-
- return port;
-
-out_unreg_port:
- ehea_unregister_port(port);
-
-out_free_mc_list:
- kfree(port->mc_list);
-
-out_free_ethdev:
- free_netdev(dev);
-
-out_err:
- pr_err("setting up logical port with id=%d failed, ret=%d\n",
- logical_port_id, ret);
- return NULL;
-}
-
-static void ehea_shutdown_single_port(struct ehea_port *port)
-{
- struct ehea_adapter *adapter = port->adapter;
-
- cancel_work_sync(&port->reset_task);
- cancel_delayed_work_sync(&port->stats_work);
- unregister_netdev(port->netdev);
- ehea_unregister_port(port);
- kfree(port->mc_list);
- free_netdev(port->netdev);
- adapter->active_ports--;
-}
-
-static int ehea_setup_ports(struct ehea_adapter *adapter)
-{
- struct device_node *lhea_dn;
- struct device_node *eth_dn;
-
- const u32 *dn_log_port_id;
- int i = 0;
-
- lhea_dn = adapter->ofdev->dev.of_node;
- for_each_child_of_node(lhea_dn, eth_dn) {
- dn_log_port_id = of_get_property(eth_dn, "ibm,hea-port-no",
- NULL);
- if (!dn_log_port_id) {
- pr_err("bad device node: eth_dn name=%pOF\n", eth_dn);
- continue;
- }
-
- if (ehea_add_adapter_mr(adapter)) {
- pr_err("creating MR failed\n");
- of_node_put(eth_dn);
- return -EIO;
- }
-
- adapter->port[i] = ehea_setup_single_port(adapter,
- *dn_log_port_id,
- eth_dn);
- if (adapter->port[i])
- netdev_info(adapter->port[i]->netdev,
- "logical port id #%d\n", *dn_log_port_id);
- else
- ehea_remove_adapter_mr(adapter);
-
- i++;
- }
- return 0;
-}
-
-static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter,
- u32 logical_port_id)
-{
- struct device_node *lhea_dn;
- struct device_node *eth_dn;
- const u32 *dn_log_port_id;
-
- lhea_dn = adapter->ofdev->dev.of_node;
- for_each_child_of_node(lhea_dn, eth_dn) {
- dn_log_port_id = of_get_property(eth_dn, "ibm,hea-port-no",
- NULL);
- if (dn_log_port_id)
- if (*dn_log_port_id == logical_port_id)
- return eth_dn;
- }
-
- return NULL;
-}
-
-static ssize_t probe_port_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct ehea_adapter *adapter = dev_get_drvdata(dev);
- struct ehea_port *port;
- struct device_node *eth_dn = NULL;
- int i;
-
- u32 logical_port_id;
-
- sscanf(buf, "%d", &logical_port_id);
-
- port = ehea_get_port(adapter, logical_port_id);
-
- if (port) {
- netdev_info(port->netdev, "adding port with logical port id=%d failed: port already configured\n",
- logical_port_id);
- return -EINVAL;
- }
-
- eth_dn = ehea_get_eth_dn(adapter, logical_port_id);
-
- if (!eth_dn) {
- pr_info("no logical port with id %d found\n", logical_port_id);
- return -EINVAL;
- }
-
- if (ehea_add_adapter_mr(adapter)) {
- pr_err("creating MR failed\n");
- of_node_put(eth_dn);
- return -EIO;
- }
-
- port = ehea_setup_single_port(adapter, logical_port_id, eth_dn);
-
- of_node_put(eth_dn);
-
- if (port) {
- for (i = 0; i < EHEA_MAX_PORTS; i++)
- if (!adapter->port[i]) {
- adapter->port[i] = port;
- break;
- }
-
- netdev_info(port->netdev, "added: (logical port id=%d)\n",
- logical_port_id);
- } else {
- ehea_remove_adapter_mr(adapter);
- return -EIO;
- }
-
- return (ssize_t) count;
-}
-
-static ssize_t remove_port_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct ehea_adapter *adapter = dev_get_drvdata(dev);
- struct ehea_port *port;
- int i;
- u32 logical_port_id;
-
- sscanf(buf, "%d", &logical_port_id);
-
- port = ehea_get_port(adapter, logical_port_id);
-
- if (port) {
- netdev_info(port->netdev, "removed: (logical port id=%d)\n",
- logical_port_id);
-
- ehea_shutdown_single_port(port);
-
- for (i = 0; i < EHEA_MAX_PORTS; i++)
- if (adapter->port[i] == port) {
- adapter->port[i] = NULL;
- break;
- }
- } else {
- pr_err("removing port with logical port id=%d failed. port not configured.\n",
- logical_port_id);
- return -EINVAL;
- }
-
- ehea_remove_adapter_mr(adapter);
-
- return (ssize_t) count;
-}
-
-static DEVICE_ATTR_WO(probe_port);
-static DEVICE_ATTR_WO(remove_port);
-
-static int ehea_create_device_sysfs(struct platform_device *dev)
-{
- int ret = device_create_file(&dev->dev, &dev_attr_probe_port);
- if (ret)
- goto out;
-
- ret = device_create_file(&dev->dev, &dev_attr_remove_port);
- if (ret)
- device_remove_file(&dev->dev, &dev_attr_probe_port);
-out:
- return ret;
-}
-
-static void ehea_remove_device_sysfs(struct platform_device *dev)
-{
- device_remove_file(&dev->dev, &dev_attr_probe_port);
- device_remove_file(&dev->dev, &dev_attr_remove_port);
-}
-
-static int ehea_reboot_notifier(struct notifier_block *nb,
- unsigned long action, void *unused)
-{
- if (action == SYS_RESTART) {
- pr_info("Reboot: freeing all eHEA resources\n");
- ibmebus_unregister_driver(&ehea_driver);
- }
- return NOTIFY_DONE;
-}
-
-static struct notifier_block ehea_reboot_nb = {
- .notifier_call = ehea_reboot_notifier,
-};
-
-static int ehea_mem_notifier(struct notifier_block *nb,
- unsigned long action, void *data)
-{
- int ret = NOTIFY_BAD;
- struct memory_notify *arg = data;
-
- mutex_lock(&dlpar_mem_lock);
-
- switch (action) {
- case MEM_CANCEL_OFFLINE:
- pr_info("memory offlining canceled");
- fallthrough; /* re-add canceled memory block */
-
- case MEM_ONLINE:
- pr_info("memory is going online");
- set_bit(__EHEA_STOP_XFER, &ehea_driver_flags);
- if (ehea_add_sect_bmap(arg->start_pfn, arg->nr_pages))
- goto out_unlock;
- ehea_rereg_mrs();
- break;
-
- case MEM_GOING_OFFLINE:
- pr_info("memory is going offline");
- set_bit(__EHEA_STOP_XFER, &ehea_driver_flags);
- if (ehea_rem_sect_bmap(arg->start_pfn, arg->nr_pages))
- goto out_unlock;
- ehea_rereg_mrs();
- break;
-
- default:
- break;
- }
-
- ehea_update_firmware_handles();
- ret = NOTIFY_OK;
-
-out_unlock:
- mutex_unlock(&dlpar_mem_lock);
- return ret;
-}
-
-static struct notifier_block ehea_mem_nb = {
- .notifier_call = ehea_mem_notifier,
-};
-
-static void ehea_crash_handler(void)
-{
- int i;
-
- if (ehea_fw_handles.arr)
- for (i = 0; i < ehea_fw_handles.num_entries; i++)
- ehea_h_free_resource(ehea_fw_handles.arr[i].adh,
- ehea_fw_handles.arr[i].fwh,
- FORCE_FREE);
-
- if (ehea_bcmc_regs.arr)
- for (i = 0; i < ehea_bcmc_regs.num_entries; i++)
- ehea_h_reg_dereg_bcmc(ehea_bcmc_regs.arr[i].adh,
- ehea_bcmc_regs.arr[i].port_id,
- ehea_bcmc_regs.arr[i].reg_type,
- ehea_bcmc_regs.arr[i].macaddr,
- 0, H_DEREG_BCMC);
-}
-
-static atomic_t ehea_memory_hooks_registered;
-
-/* Register memory hooks on probe of first adapter */
-static int ehea_register_memory_hooks(void)
-{
- int ret = 0;
-
- if (atomic_inc_return(&ehea_memory_hooks_registered) > 1)
- return 0;
-
- ret = ehea_create_busmap();
- if (ret) {
- pr_info("ehea_create_busmap failed\n");
- goto out;
- }
-
- ret = register_reboot_notifier(&ehea_reboot_nb);
- if (ret) {
- pr_info("register_reboot_notifier failed\n");
- goto out;
- }
-
- ret = register_memory_notifier(&ehea_mem_nb);
- if (ret) {
- pr_info("register_memory_notifier failed\n");
- goto out2;
- }
-
- ret = crash_shutdown_register(ehea_crash_handler);
- if (ret) {
- pr_info("crash_shutdown_register failed\n");
- goto out3;
- }
-
- return 0;
-
-out3:
- unregister_memory_notifier(&ehea_mem_nb);
-out2:
- unregister_reboot_notifier(&ehea_reboot_nb);
-out:
- atomic_dec(&ehea_memory_hooks_registered);
- return ret;
-}
-
-static void ehea_unregister_memory_hooks(void)
-{
- /* Only remove the hooks if we've registered them */
- if (atomic_read(&ehea_memory_hooks_registered) == 0)
- return;
-
- unregister_reboot_notifier(&ehea_reboot_nb);
- if (crash_shutdown_unregister(ehea_crash_handler))
- pr_info("failed unregistering crash handler\n");
- unregister_memory_notifier(&ehea_mem_nb);
-}
-
-static int ehea_probe_adapter(struct platform_device *dev)
-{
- struct ehea_adapter *adapter;
- const u64 *adapter_handle;
- int ret;
- int i;
-
- ret = ehea_register_memory_hooks();
- if (ret)
- return ret;
-
- if (!dev || !dev->dev.of_node) {
- pr_err("Invalid ibmebus device probed\n");
- return -EINVAL;
- }
-
- adapter = devm_kzalloc(&dev->dev, sizeof(*adapter), GFP_KERNEL);
- if (!adapter) {
- ret = -ENOMEM;
- dev_err(&dev->dev, "no mem for ehea_adapter\n");
- goto out;
- }
-
- list_add(&adapter->list, &adapter_list);
-
- adapter->ofdev = dev;
-
- adapter_handle = of_get_property(dev->dev.of_node, "ibm,hea-handle",
- NULL);
- if (adapter_handle)
- adapter->handle = *adapter_handle;
-
- if (!adapter->handle) {
- dev_err(&dev->dev, "failed getting handle for adapter"
- " '%pOF'\n", dev->dev.of_node);
- ret = -ENODEV;
- goto out_free_ad;
- }
-
- adapter->pd = EHEA_PD_ID;
-
- platform_set_drvdata(dev, adapter);
-
-
- /* initialize adapter and ports */
- /* get adapter properties */
- ret = ehea_sense_adapter_attr(adapter);
- if (ret) {
- dev_err(&dev->dev, "sense_adapter_attr failed: %d\n", ret);
- goto out_free_ad;
- }
-
- adapter->neq = ehea_create_eq(adapter,
- EHEA_NEQ, EHEA_MAX_ENTRIES_EQ, 1);
- if (!adapter->neq) {
- ret = -EIO;
- dev_err(&dev->dev, "NEQ creation failed\n");
- goto out_free_ad;
- }
-
- tasklet_setup(&adapter->neq_tasklet, ehea_neq_tasklet);
-
- ret = ehea_create_device_sysfs(dev);
- if (ret)
- goto out_kill_eq;
-
- ret = ehea_setup_ports(adapter);
- if (ret) {
- dev_err(&dev->dev, "setup_ports failed\n");
- goto out_rem_dev_sysfs;
- }
-
- ret = ibmebus_request_irq(adapter->neq->attr.ist1,
- ehea_interrupt_neq, 0,
- "ehea_neq", adapter);
- if (ret) {
- dev_err(&dev->dev, "requesting NEQ IRQ failed\n");
- goto out_shutdown_ports;
- }
-
- /* Handle any events that might be pending. */
- tasklet_hi_schedule(&adapter->neq_tasklet);
-
- ret = 0;
- goto out;
-
-out_shutdown_ports:
- for (i = 0; i < EHEA_MAX_PORTS; i++)
- if (adapter->port[i]) {
- ehea_shutdown_single_port(adapter->port[i]);
- adapter->port[i] = NULL;
- }
-
-out_rem_dev_sysfs:
- ehea_remove_device_sysfs(dev);
-
-out_kill_eq:
- ehea_destroy_eq(adapter->neq);
-
-out_free_ad:
- list_del(&adapter->list);
-
-out:
- ehea_update_firmware_handles();
-
- return ret;
-}
-
-static void ehea_remove(struct platform_device *dev)
-{
- struct ehea_adapter *adapter = platform_get_drvdata(dev);
- int i;
-
- for (i = 0; i < EHEA_MAX_PORTS; i++)
- if (adapter->port[i]) {
- ehea_shutdown_single_port(adapter->port[i]);
- adapter->port[i] = NULL;
- }
-
- ehea_remove_device_sysfs(dev);
-
- ibmebus_free_irq(adapter->neq->attr.ist1, adapter);
- tasklet_kill(&adapter->neq_tasklet);
-
- ehea_destroy_eq(adapter->neq);
- ehea_remove_adapter_mr(adapter);
- list_del(&adapter->list);
-
- ehea_update_firmware_handles();
-}
-
-static int check_module_parm(void)
-{
- int ret = 0;
-
- if ((rq1_entries < EHEA_MIN_ENTRIES_QP) ||
- (rq1_entries > EHEA_MAX_ENTRIES_RQ1)) {
- pr_info("Bad parameter: rq1_entries\n");
- ret = -EINVAL;
- }
- if ((rq2_entries < EHEA_MIN_ENTRIES_QP) ||
- (rq2_entries > EHEA_MAX_ENTRIES_RQ2)) {
- pr_info("Bad parameter: rq2_entries\n");
- ret = -EINVAL;
- }
- if ((rq3_entries < EHEA_MIN_ENTRIES_QP) ||
- (rq3_entries > EHEA_MAX_ENTRIES_RQ3)) {
- pr_info("Bad parameter: rq3_entries\n");
- ret = -EINVAL;
- }
- if ((sq_entries < EHEA_MIN_ENTRIES_QP) ||
- (sq_entries > EHEA_MAX_ENTRIES_SQ)) {
- pr_info("Bad parameter: sq_entries\n");
- ret = -EINVAL;
- }
-
- return ret;
-}
-
-static ssize_t capabilities_show(struct device_driver *drv, char *buf)
-{
- return sprintf(buf, "%d", EHEA_CAPABILITIES);
-}
-
-static DRIVER_ATTR_RO(capabilities);
-
-static int __init ehea_module_init(void)
-{
- int ret;
-
- pr_info("IBM eHEA ethernet device driver (Release %s)\n", DRV_VERSION);
-
- memset(&ehea_fw_handles, 0, sizeof(ehea_fw_handles));
- memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs));
-
- mutex_init(&ehea_fw_handles.lock);
- spin_lock_init(&ehea_bcmc_regs.lock);
-
- ret = check_module_parm();
- if (ret)
- goto out;
-
- ret = ibmebus_register_driver(&ehea_driver);
- if (ret) {
- pr_err("failed registering eHEA device driver on ebus\n");
- goto out;
- }
-
- ret = driver_create_file(&ehea_driver.driver,
- &driver_attr_capabilities);
- if (ret) {
- pr_err("failed to register capabilities attribute, ret=%d\n",
- ret);
- goto out2;
- }
-
- return ret;
-
-out2:
- ibmebus_unregister_driver(&ehea_driver);
-out:
- return ret;
-}
-
-static void __exit ehea_module_exit(void)
-{
- driver_remove_file(&ehea_driver.driver, &driver_attr_capabilities);
- ibmebus_unregister_driver(&ehea_driver);
- ehea_unregister_memory_hooks();
- kfree(ehea_fw_handles.arr);
- kfree(ehea_bcmc_regs.arr);
- ehea_destroy_busmap();
-}
-
-module_init(ehea_module_init);
-module_exit(ehea_module_exit);
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_phyp.c b/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
deleted file mode 100644
index e63716e139f5..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
+++ /dev/null
@@ -1,612 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include "ehea_phyp.h"
-
-
-static inline u16 get_order_of_qentries(u16 queue_entries)
-{
- u8 ld = 1; /* logarithmus dualis */
- while (((1U << ld) - 1) < queue_entries)
- ld++;
- return ld - 1;
-}
-
-/* Defines for H_CALL H_ALLOC_RESOURCE */
-#define H_ALL_RES_TYPE_QP 1
-#define H_ALL_RES_TYPE_CQ 2
-#define H_ALL_RES_TYPE_EQ 3
-#define H_ALL_RES_TYPE_MR 5
-#define H_ALL_RES_TYPE_MW 6
-
-static long ehea_plpar_hcall_norets(unsigned long opcode,
- unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3,
- unsigned long arg4,
- unsigned long arg5,
- unsigned long arg6,
- unsigned long arg7)
-{
- long ret;
- int i, sleep_msecs;
-
- for (i = 0; i < 5; i++) {
- ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4,
- arg5, arg6, arg7);
-
- if (H_IS_LONG_BUSY(ret)) {
- sleep_msecs = get_longbusy_msecs(ret);
- msleep_interruptible(sleep_msecs);
- continue;
- }
-
- if (ret < H_SUCCESS)
- pr_err("opcode=%lx ret=%lx"
- " arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
- " arg5=%lx arg6=%lx arg7=%lx\n",
- opcode, ret,
- arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-
- return ret;
- }
-
- return H_BUSY;
-}
-
-static long ehea_plpar_hcall9(unsigned long opcode,
- unsigned long *outs, /* array of 9 outputs */
- unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3,
- unsigned long arg4,
- unsigned long arg5,
- unsigned long arg6,
- unsigned long arg7,
- unsigned long arg8,
- unsigned long arg9)
-{
- long ret;
- int i, sleep_msecs;
- u8 cb_cat;
-
- for (i = 0; i < 5; i++) {
- ret = plpar_hcall9(opcode, outs,
- arg1, arg2, arg3, arg4, arg5,
- arg6, arg7, arg8, arg9);
-
- if (H_IS_LONG_BUSY(ret)) {
- sleep_msecs = get_longbusy_msecs(ret);
- msleep_interruptible(sleep_msecs);
- continue;
- }
-
- cb_cat = EHEA_BMASK_GET(H_MEHEAPORT_CAT, arg2);
-
- if ((ret < H_SUCCESS) && !(((ret == H_AUTHORITY)
- && (opcode == H_MODIFY_HEA_PORT))
- && (((cb_cat == H_PORT_CB4) && ((arg3 == H_PORT_CB4_JUMBO)
- || (arg3 == H_PORT_CB4_SPEED))) || ((cb_cat == H_PORT_CB7)
- && (arg3 == H_PORT_CB7_DUCQPN)))))
- pr_err("opcode=%lx ret=%lx"
- " arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
- " arg5=%lx arg6=%lx arg7=%lx arg8=%lx"
- " arg9=%lx"
- " out1=%lx out2=%lx out3=%lx out4=%lx"
- " out5=%lx out6=%lx out7=%lx out8=%lx"
- " out9=%lx\n",
- opcode, ret,
- arg1, arg2, arg3, arg4, arg5,
- arg6, arg7, arg8, arg9,
- outs[0], outs[1], outs[2], outs[3], outs[4],
- outs[5], outs[6], outs[7], outs[8]);
- return ret;
- }
-
- return H_BUSY;
-}
-
-u64 ehea_h_query_ehea_qp(const u64 adapter_handle, const u8 qp_category,
- const u64 qp_handle, const u64 sel_mask, void *cb_addr)
-{
- return ehea_plpar_hcall_norets(H_QUERY_HEA_QP,
- adapter_handle, /* R4 */
- qp_category, /* R5 */
- qp_handle, /* R6 */
- sel_mask, /* R7 */
- __pa(cb_addr), /* R8 */
- 0, 0);
-}
-
-/* input param R5 */
-#define H_ALL_RES_QP_EQPO EHEA_BMASK_IBM(9, 11)
-#define H_ALL_RES_QP_QPP EHEA_BMASK_IBM(12, 12)
-#define H_ALL_RES_QP_RQR EHEA_BMASK_IBM(13, 15)
-#define H_ALL_RES_QP_EQEG EHEA_BMASK_IBM(16, 16)
-#define H_ALL_RES_QP_LL_QP EHEA_BMASK_IBM(17, 17)
-#define H_ALL_RES_QP_DMA128 EHEA_BMASK_IBM(19, 19)
-#define H_ALL_RES_QP_HSM EHEA_BMASK_IBM(20, 21)
-#define H_ALL_RES_QP_SIGT EHEA_BMASK_IBM(22, 23)
-#define H_ALL_RES_QP_TENURE EHEA_BMASK_IBM(48, 55)
-#define H_ALL_RES_QP_RES_TYP EHEA_BMASK_IBM(56, 63)
-
-/* input param R9 */
-#define H_ALL_RES_QP_TOKEN EHEA_BMASK_IBM(0, 31)
-#define H_ALL_RES_QP_PD EHEA_BMASK_IBM(32, 63)
-
-/* input param R10 */
-#define H_ALL_RES_QP_MAX_SWQE EHEA_BMASK_IBM(4, 7)
-#define H_ALL_RES_QP_MAX_R1WQE EHEA_BMASK_IBM(12, 15)
-#define H_ALL_RES_QP_MAX_R2WQE EHEA_BMASK_IBM(20, 23)
-#define H_ALL_RES_QP_MAX_R3WQE EHEA_BMASK_IBM(28, 31)
-/* Max Send Scatter Gather Elements */
-#define H_ALL_RES_QP_MAX_SSGE EHEA_BMASK_IBM(37, 39)
-#define H_ALL_RES_QP_MAX_R1SGE EHEA_BMASK_IBM(45, 47)
-/* Max Receive SG Elements RQ1 */
-#define H_ALL_RES_QP_MAX_R2SGE EHEA_BMASK_IBM(53, 55)
-#define H_ALL_RES_QP_MAX_R3SGE EHEA_BMASK_IBM(61, 63)
-
-/* input param R11 */
-#define H_ALL_RES_QP_SWQE_IDL EHEA_BMASK_IBM(0, 7)
-/* max swqe immediate data length */
-#define H_ALL_RES_QP_PORT_NUM EHEA_BMASK_IBM(48, 63)
-
-/* input param R12 */
-#define H_ALL_RES_QP_TH_RQ2 EHEA_BMASK_IBM(0, 15)
-/* Threshold RQ2 */
-#define H_ALL_RES_QP_TH_RQ3 EHEA_BMASK_IBM(16, 31)
-/* Threshold RQ3 */
-
-/* output param R6 */
-#define H_ALL_RES_QP_ACT_SWQE EHEA_BMASK_IBM(0, 15)
-#define H_ALL_RES_QP_ACT_R1WQE EHEA_BMASK_IBM(16, 31)
-#define H_ALL_RES_QP_ACT_R2WQE EHEA_BMASK_IBM(32, 47)
-#define H_ALL_RES_QP_ACT_R3WQE EHEA_BMASK_IBM(48, 63)
-
-/* output param, R7 */
-#define H_ALL_RES_QP_ACT_SSGE EHEA_BMASK_IBM(0, 7)
-#define H_ALL_RES_QP_ACT_R1SGE EHEA_BMASK_IBM(8, 15)
-#define H_ALL_RES_QP_ACT_R2SGE EHEA_BMASK_IBM(16, 23)
-#define H_ALL_RES_QP_ACT_R3SGE EHEA_BMASK_IBM(24, 31)
-#define H_ALL_RES_QP_ACT_SWQE_IDL EHEA_BMASK_IBM(32, 39)
-
-/* output param R8,R9 */
-#define H_ALL_RES_QP_SIZE_SQ EHEA_BMASK_IBM(0, 31)
-#define H_ALL_RES_QP_SIZE_RQ1 EHEA_BMASK_IBM(32, 63)
-#define H_ALL_RES_QP_SIZE_RQ2 EHEA_BMASK_IBM(0, 31)
-#define H_ALL_RES_QP_SIZE_RQ3 EHEA_BMASK_IBM(32, 63)
-
-/* output param R11,R12 */
-#define H_ALL_RES_QP_LIOBN_SQ EHEA_BMASK_IBM(0, 31)
-#define H_ALL_RES_QP_LIOBN_RQ1 EHEA_BMASK_IBM(32, 63)
-#define H_ALL_RES_QP_LIOBN_RQ2 EHEA_BMASK_IBM(0, 31)
-#define H_ALL_RES_QP_LIOBN_RQ3 EHEA_BMASK_IBM(32, 63)
-
-u64 ehea_h_alloc_resource_qp(const u64 adapter_handle,
- struct ehea_qp_init_attr *init_attr, const u32 pd,
- u64 *qp_handle, struct h_epas *h_epas)
-{
- u64 hret;
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- u64 allocate_controls =
- EHEA_BMASK_SET(H_ALL_RES_QP_EQPO, init_attr->low_lat_rq1 ? 1 : 0)
- | EHEA_BMASK_SET(H_ALL_RES_QP_QPP, 0)
- | EHEA_BMASK_SET(H_ALL_RES_QP_RQR, 6) /* rq1 & rq2 & rq3 */
- | EHEA_BMASK_SET(H_ALL_RES_QP_EQEG, 0) /* EQE gen. disabled */
- | EHEA_BMASK_SET(H_ALL_RES_QP_LL_QP, init_attr->low_lat_rq1)
- | EHEA_BMASK_SET(H_ALL_RES_QP_DMA128, 0)
- | EHEA_BMASK_SET(H_ALL_RES_QP_HSM, 0)
- | EHEA_BMASK_SET(H_ALL_RES_QP_SIGT, init_attr->signalingtype)
- | EHEA_BMASK_SET(H_ALL_RES_QP_RES_TYP, H_ALL_RES_TYPE_QP);
-
- u64 r9_reg = EHEA_BMASK_SET(H_ALL_RES_QP_PD, pd)
- | EHEA_BMASK_SET(H_ALL_RES_QP_TOKEN, init_attr->qp_token);
-
- u64 max_r10_reg =
- EHEA_BMASK_SET(H_ALL_RES_QP_MAX_SWQE,
- get_order_of_qentries(init_attr->max_nr_send_wqes))
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R1WQE,
- get_order_of_qentries(init_attr->max_nr_rwqes_rq1))
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R2WQE,
- get_order_of_qentries(init_attr->max_nr_rwqes_rq2))
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R3WQE,
- get_order_of_qentries(init_attr->max_nr_rwqes_rq3))
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_SSGE, init_attr->wqe_size_enc_sq)
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R1SGE,
- init_attr->wqe_size_enc_rq1)
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R2SGE,
- init_attr->wqe_size_enc_rq2)
- | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R3SGE,
- init_attr->wqe_size_enc_rq3);
-
- u64 r11_in =
- EHEA_BMASK_SET(H_ALL_RES_QP_SWQE_IDL, init_attr->swqe_imm_data_len)
- | EHEA_BMASK_SET(H_ALL_RES_QP_PORT_NUM, init_attr->port_nr);
- u64 threshold =
- EHEA_BMASK_SET(H_ALL_RES_QP_TH_RQ2, init_attr->rq2_threshold)
- | EHEA_BMASK_SET(H_ALL_RES_QP_TH_RQ3, init_attr->rq3_threshold);
-
- hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
- outs,
- adapter_handle, /* R4 */
- allocate_controls, /* R5 */
- init_attr->send_cq_handle, /* R6 */
- init_attr->recv_cq_handle, /* R7 */
- init_attr->aff_eq_handle, /* R8 */
- r9_reg, /* R9 */
- max_r10_reg, /* R10 */
- r11_in, /* R11 */
- threshold); /* R12 */
-
- *qp_handle = outs[0];
- init_attr->qp_nr = (u32)outs[1];
-
- init_attr->act_nr_send_wqes =
- (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_SWQE, outs[2]);
- init_attr->act_nr_rwqes_rq1 =
- (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_R1WQE, outs[2]);
- init_attr->act_nr_rwqes_rq2 =
- (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_R2WQE, outs[2]);
- init_attr->act_nr_rwqes_rq3 =
- (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_R3WQE, outs[2]);
-
- init_attr->act_wqe_size_enc_sq = init_attr->wqe_size_enc_sq;
- init_attr->act_wqe_size_enc_rq1 = init_attr->wqe_size_enc_rq1;
- init_attr->act_wqe_size_enc_rq2 = init_attr->wqe_size_enc_rq2;
- init_attr->act_wqe_size_enc_rq3 = init_attr->wqe_size_enc_rq3;
-
- init_attr->nr_sq_pages =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_SQ, outs[4]);
- init_attr->nr_rq1_pages =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_RQ1, outs[4]);
- init_attr->nr_rq2_pages =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_RQ2, outs[5]);
- init_attr->nr_rq3_pages =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_RQ3, outs[5]);
-
- init_attr->liobn_sq =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_SQ, outs[7]);
- init_attr->liobn_rq1 =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_RQ1, outs[7]);
- init_attr->liobn_rq2 =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_RQ2, outs[8]);
- init_attr->liobn_rq3 =
- (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_RQ3, outs[8]);
-
- if (!hret)
- hcp_epas_ctor(h_epas, outs[6], outs[6]);
-
- return hret;
-}
-
-u64 ehea_h_alloc_resource_cq(const u64 adapter_handle,
- struct ehea_cq_attr *cq_attr,
- u64 *cq_handle, struct h_epas *epas)
-{
- u64 hret;
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
- outs,
- adapter_handle, /* R4 */
- H_ALL_RES_TYPE_CQ, /* R5 */
- cq_attr->eq_handle, /* R6 */
- cq_attr->cq_token, /* R7 */
- cq_attr->max_nr_of_cqes, /* R8 */
- 0, 0, 0, 0); /* R9-R12 */
-
- *cq_handle = outs[0];
- cq_attr->act_nr_of_cqes = outs[3];
- cq_attr->nr_pages = outs[4];
-
- if (!hret)
- hcp_epas_ctor(epas, outs[5], outs[6]);
-
- return hret;
-}
-
-/* Defines for H_CALL H_ALLOC_RESOURCE */
-#define H_ALL_RES_TYPE_QP 1
-#define H_ALL_RES_TYPE_CQ 2
-#define H_ALL_RES_TYPE_EQ 3
-#define H_ALL_RES_TYPE_MR 5
-#define H_ALL_RES_TYPE_MW 6
-
-/* input param R5 */
-#define H_ALL_RES_EQ_NEQ EHEA_BMASK_IBM(0, 0)
-#define H_ALL_RES_EQ_NON_NEQ_ISN EHEA_BMASK_IBM(6, 7)
-#define H_ALL_RES_EQ_INH_EQE_GEN EHEA_BMASK_IBM(16, 16)
-#define H_ALL_RES_EQ_RES_TYPE EHEA_BMASK_IBM(56, 63)
-/* input param R6 */
-#define H_ALL_RES_EQ_MAX_EQE EHEA_BMASK_IBM(32, 63)
-
-/* output param R6 */
-#define H_ALL_RES_EQ_LIOBN EHEA_BMASK_IBM(32, 63)
-
-/* output param R7 */
-#define H_ALL_RES_EQ_ACT_EQE EHEA_BMASK_IBM(32, 63)
-
-/* output param R8 */
-#define H_ALL_RES_EQ_ACT_PS EHEA_BMASK_IBM(32, 63)
-
-/* output param R9 */
-#define H_ALL_RES_EQ_ACT_EQ_IST_C EHEA_BMASK_IBM(30, 31)
-#define H_ALL_RES_EQ_ACT_EQ_IST_1 EHEA_BMASK_IBM(40, 63)
-
-/* output param R10 */
-#define H_ALL_RES_EQ_ACT_EQ_IST_2 EHEA_BMASK_IBM(40, 63)
-
-/* output param R11 */
-#define H_ALL_RES_EQ_ACT_EQ_IST_3 EHEA_BMASK_IBM(40, 63)
-
-/* output param R12 */
-#define H_ALL_RES_EQ_ACT_EQ_IST_4 EHEA_BMASK_IBM(40, 63)
-
-u64 ehea_h_alloc_resource_eq(const u64 adapter_handle,
- struct ehea_eq_attr *eq_attr, u64 *eq_handle)
-{
- u64 hret, allocate_controls;
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- /* resource type */
- allocate_controls =
- EHEA_BMASK_SET(H_ALL_RES_EQ_RES_TYPE, H_ALL_RES_TYPE_EQ)
- | EHEA_BMASK_SET(H_ALL_RES_EQ_NEQ, eq_attr->type ? 1 : 0)
- | EHEA_BMASK_SET(H_ALL_RES_EQ_INH_EQE_GEN, !eq_attr->eqe_gen)
- | EHEA_BMASK_SET(H_ALL_RES_EQ_NON_NEQ_ISN, 1);
-
- hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
- outs,
- adapter_handle, /* R4 */
- allocate_controls, /* R5 */
- eq_attr->max_nr_of_eqes, /* R6 */
- 0, 0, 0, 0, 0, 0); /* R7-R10 */
-
- *eq_handle = outs[0];
- eq_attr->act_nr_of_eqes = outs[3];
- eq_attr->nr_pages = outs[4];
- eq_attr->ist1 = outs[5];
- eq_attr->ist2 = outs[6];
- eq_attr->ist3 = outs[7];
- eq_attr->ist4 = outs[8];
-
- return hret;
-}
-
-u64 ehea_h_modify_ehea_qp(const u64 adapter_handle, const u8 cat,
- const u64 qp_handle, const u64 sel_mask,
- void *cb_addr, u64 *inv_attr_id, u64 *proc_mask,
- u16 *out_swr, u16 *out_rwr)
-{
- u64 hret;
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- hret = ehea_plpar_hcall9(H_MODIFY_HEA_QP,
- outs,
- adapter_handle, /* R4 */
- (u64) cat, /* R5 */
- qp_handle, /* R6 */
- sel_mask, /* R7 */
- __pa(cb_addr), /* R8 */
- 0, 0, 0, 0); /* R9-R12 */
-
- *inv_attr_id = outs[0];
- *out_swr = outs[3];
- *out_rwr = outs[4];
- *proc_mask = outs[5];
-
- return hret;
-}
-
-u64 ehea_h_register_rpage(const u64 adapter_handle, const u8 pagesize,
- const u8 queue_type, const u64 resource_handle,
- const u64 log_pageaddr, u64 count)
-{
- u64 reg_control;
-
- reg_control = EHEA_BMASK_SET(H_REG_RPAGE_PAGE_SIZE, pagesize)
- | EHEA_BMASK_SET(H_REG_RPAGE_QT, queue_type);
-
- return ehea_plpar_hcall_norets(H_REGISTER_HEA_RPAGES,
- adapter_handle, /* R4 */
- reg_control, /* R5 */
- resource_handle, /* R6 */
- log_pageaddr, /* R7 */
- count, /* R8 */
- 0, 0); /* R9-R10 */
-}
-
-u64 ehea_h_register_smr(const u64 adapter_handle, const u64 orig_mr_handle,
- const u64 vaddr_in, const u32 access_ctrl, const u32 pd,
- struct ehea_mr *mr)
-{
- u64 hret;
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- hret = ehea_plpar_hcall9(H_REGISTER_SMR,
- outs,
- adapter_handle , /* R4 */
- orig_mr_handle, /* R5 */
- vaddr_in, /* R6 */
- (((u64)access_ctrl) << 32ULL), /* R7 */
- pd, /* R8 */
- 0, 0, 0, 0); /* R9-R12 */
-
- mr->handle = outs[0];
- mr->lkey = (u32)outs[2];
-
- return hret;
-}
-
-u64 ehea_h_disable_and_get_hea(const u64 adapter_handle, const u64 qp_handle)
-{
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- return ehea_plpar_hcall9(H_DISABLE_AND_GET_HEA,
- outs,
- adapter_handle, /* R4 */
- H_DISABLE_GET_EHEA_WQE_P, /* R5 */
- qp_handle, /* R6 */
- 0, 0, 0, 0, 0, 0); /* R7-R12 */
-}
-
-u64 ehea_h_free_resource(const u64 adapter_handle, const u64 res_handle,
- u64 force_bit)
-{
- return ehea_plpar_hcall_norets(H_FREE_RESOURCE,
- adapter_handle, /* R4 */
- res_handle, /* R5 */
- force_bit,
- 0, 0, 0, 0); /* R7-R10 */
-}
-
-u64 ehea_h_alloc_resource_mr(const u64 adapter_handle, const u64 vaddr,
- const u64 length, const u32 access_ctrl,
- const u32 pd, u64 *mr_handle, u32 *lkey)
-{
- u64 hret;
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
-
- hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
- outs,
- adapter_handle, /* R4 */
- 5, /* R5 */
- vaddr, /* R6 */
- length, /* R7 */
- (((u64) access_ctrl) << 32ULL), /* R8 */
- pd, /* R9 */
- 0, 0, 0); /* R10-R12 */
-
- *mr_handle = outs[0];
- *lkey = (u32)outs[2];
- return hret;
-}
-
-u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle,
- const u8 pagesize, const u8 queue_type,
- const u64 log_pageaddr, const u64 count)
-{
- if ((count > 1) && (log_pageaddr & ~PAGE_MASK)) {
- pr_err("not on pageboundary\n");
- return H_PARAMETER;
- }
-
- return ehea_h_register_rpage(adapter_handle, pagesize,
- queue_type, mr_handle,
- log_pageaddr, count);
-}
-
-u64 ehea_h_query_ehea(const u64 adapter_handle, void *cb_addr)
-{
- u64 hret, cb_logaddr;
-
- cb_logaddr = __pa(cb_addr);
-
- hret = ehea_plpar_hcall_norets(H_QUERY_HEA,
- adapter_handle, /* R4 */
- cb_logaddr, /* R5 */
- 0, 0, 0, 0, 0); /* R6-R10 */
-#ifdef DEBUG
- ehea_dump(cb_addr, sizeof(struct hcp_query_ehea), "hcp_query_ehea");
-#endif
- return hret;
-}
-
-u64 ehea_h_query_ehea_port(const u64 adapter_handle, const u16 port_num,
- const u8 cb_cat, const u64 select_mask,
- void *cb_addr)
-{
- u64 port_info;
- u64 cb_logaddr = __pa(cb_addr);
- u64 arr_index = 0;
-
- port_info = EHEA_BMASK_SET(H_MEHEAPORT_CAT, cb_cat)
- | EHEA_BMASK_SET(H_MEHEAPORT_PN, port_num);
-
- return ehea_plpar_hcall_norets(H_QUERY_HEA_PORT,
- adapter_handle, /* R4 */
- port_info, /* R5 */
- select_mask, /* R6 */
- arr_index, /* R7 */
- cb_logaddr, /* R8 */
- 0, 0); /* R9-R10 */
-}
-
-u64 ehea_h_modify_ehea_port(const u64 adapter_handle, const u16 port_num,
- const u8 cb_cat, const u64 select_mask,
- void *cb_addr)
-{
- unsigned long outs[PLPAR_HCALL9_BUFSIZE];
- u64 port_info;
- u64 arr_index = 0;
- u64 cb_logaddr = __pa(cb_addr);
-
- port_info = EHEA_BMASK_SET(H_MEHEAPORT_CAT, cb_cat)
- | EHEA_BMASK_SET(H_MEHEAPORT_PN, port_num);
-#ifdef DEBUG
- ehea_dump(cb_addr, sizeof(struct hcp_ehea_port_cb0), "Before HCALL");
-#endif
- return ehea_plpar_hcall9(H_MODIFY_HEA_PORT,
- outs,
- adapter_handle, /* R4 */
- port_info, /* R5 */
- select_mask, /* R6 */
- arr_index, /* R7 */
- cb_logaddr, /* R8 */
- 0, 0, 0, 0); /* R9-R12 */
-}
-
-u64 ehea_h_reg_dereg_bcmc(const u64 adapter_handle, const u16 port_num,
- const u8 reg_type, const u64 mc_mac_addr,
- const u16 vlan_id, const u32 hcall_id)
-{
- u64 r5_port_num, r6_reg_type, r7_mc_mac_addr, r8_vlan_id;
- u64 mac_addr = mc_mac_addr >> 16;
-
- r5_port_num = EHEA_BMASK_SET(H_REGBCMC_PN, port_num);
- r6_reg_type = EHEA_BMASK_SET(H_REGBCMC_REGTYPE, reg_type);
- r7_mc_mac_addr = EHEA_BMASK_SET(H_REGBCMC_MACADDR, mac_addr);
- r8_vlan_id = EHEA_BMASK_SET(H_REGBCMC_VLANID, vlan_id);
-
- return ehea_plpar_hcall_norets(hcall_id,
- adapter_handle, /* R4 */
- r5_port_num, /* R5 */
- r6_reg_type, /* R6 */
- r7_mc_mac_addr, /* R7 */
- r8_vlan_id, /* R8 */
- 0, 0); /* R9-R12 */
-}
-
-u64 ehea_h_reset_events(const u64 adapter_handle, const u64 neq_handle,
- const u64 event_mask)
-{
- return ehea_plpar_hcall_norets(H_RESET_EVENTS,
- adapter_handle, /* R4 */
- neq_handle, /* R5 */
- event_mask, /* R6 */
- 0, 0, 0, 0); /* R7-R12 */
-}
-
-u64 ehea_h_error_data(const u64 adapter_handle, const u64 ressource_handle,
- void *rblock)
-{
- return ehea_plpar_hcall_norets(H_ERROR_DATA,
- adapter_handle, /* R4 */
- ressource_handle, /* R5 */
- __pa(rblock), /* R6 */
- 0, 0, 0, 0); /* R7-R12 */
-}
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_phyp.h b/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
deleted file mode 100644
index e8b56c103410..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
+++ /dev/null
@@ -1,433 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#ifndef __EHEA_PHYP_H__
-#define __EHEA_PHYP_H__
-
-#include <linux/delay.h>
-#include <asm/hvcall.h>
-#include "ehea.h"
-#include "ehea_hw.h"
-
-/* Some abbreviations used here:
- *
- * hcp_* - structures, variables and functions releated to Hypervisor Calls
- */
-
-/* Number of pages which can be registered at once by H_REGISTER_HEA_RPAGES */
-#define EHEA_MAX_RPAGE 512
-
-/* Notification Event Queue (NEQ) Entry bit masks */
-#define NEQE_EVENT_CODE EHEA_BMASK_IBM(2, 7)
-#define NEQE_PORTNUM EHEA_BMASK_IBM(32, 47)
-#define NEQE_PORT_UP EHEA_BMASK_IBM(16, 16)
-#define NEQE_EXTSWITCH_PORT_UP EHEA_BMASK_IBM(17, 17)
-#define NEQE_EXTSWITCH_PRIMARY EHEA_BMASK_IBM(18, 18)
-#define NEQE_PLID EHEA_BMASK_IBM(16, 47)
-
-/* Notification Event Codes */
-#define EHEA_EC_PORTSTATE_CHG 0x30
-#define EHEA_EC_ADAPTER_MALFUNC 0x32
-#define EHEA_EC_PORT_MALFUNC 0x33
-
-/* Notification Event Log Register (NELR) bit masks */
-#define NELR_PORT_MALFUNC EHEA_BMASK_IBM(61, 61)
-#define NELR_ADAPTER_MALFUNC EHEA_BMASK_IBM(62, 62)
-#define NELR_PORTSTATE_CHG EHEA_BMASK_IBM(63, 63)
-
-static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel,
- u64 paddr_user)
-{
- /* To support 64k pages we must round to 64k page boundary */
- epas->kernel.addr = ioremap((paddr_kernel & PAGE_MASK), PAGE_SIZE) +
- (paddr_kernel & ~PAGE_MASK);
- epas->user.addr = paddr_user;
-}
-
-static inline void hcp_epas_dtor(struct h_epas *epas)
-{
- if (epas->kernel.addr)
- iounmap((void __iomem *)((u64)epas->kernel.addr & PAGE_MASK));
-
- epas->user.addr = 0;
- epas->kernel.addr = 0;
-}
-
-struct hcp_modify_qp_cb0 {
- u64 qp_ctl_reg; /* 00 */
- u32 max_swqe; /* 02 */
- u32 max_rwqe; /* 03 */
- u32 port_nb; /* 04 */
- u32 reserved0; /* 05 */
- u64 qp_aer; /* 06 */
- u64 qp_tenure; /* 08 */
-};
-
-/* Hcall Query/Modify Queue Pair Control Block 0 Selection Mask Bits */
-#define H_QPCB0_ALL EHEA_BMASK_IBM(0, 5)
-#define H_QPCB0_QP_CTL_REG EHEA_BMASK_IBM(0, 0)
-#define H_QPCB0_MAX_SWQE EHEA_BMASK_IBM(1, 1)
-#define H_QPCB0_MAX_RWQE EHEA_BMASK_IBM(2, 2)
-#define H_QPCB0_PORT_NB EHEA_BMASK_IBM(3, 3)
-#define H_QPCB0_QP_AER EHEA_BMASK_IBM(4, 4)
-#define H_QPCB0_QP_TENURE EHEA_BMASK_IBM(5, 5)
-
-/* Queue Pair Control Register Status Bits */
-#define H_QP_CR_ENABLED 0x8000000000000000ULL /* QP enabled */
- /* QP States: */
-#define H_QP_CR_STATE_RESET 0x0000010000000000ULL /* Reset */
-#define H_QP_CR_STATE_INITIALIZED 0x0000020000000000ULL /* Initialized */
-#define H_QP_CR_STATE_RDY2RCV 0x0000030000000000ULL /* Ready to recv */
-#define H_QP_CR_STATE_RDY2SND 0x0000050000000000ULL /* Ready to send */
-#define H_QP_CR_STATE_ERROR 0x0000800000000000ULL /* Error */
-#define H_QP_CR_RES_STATE 0x0000007F00000000ULL /* Resultant state */
-
-struct hcp_modify_qp_cb1 {
- u32 qpn; /* 00 */
- u32 qp_asyn_ev_eq_nb; /* 01 */
- u64 sq_cq_handle; /* 02 */
- u64 rq_cq_handle; /* 04 */
- /* sgel = scatter gather element */
- u32 sgel_nb_sq; /* 06 */
- u32 sgel_nb_rq1; /* 07 */
- u32 sgel_nb_rq2; /* 08 */
- u32 sgel_nb_rq3; /* 09 */
-};
-
-/* Hcall Query/Modify Queue Pair Control Block 1 Selection Mask Bits */
-#define H_QPCB1_ALL EHEA_BMASK_IBM(0, 7)
-#define H_QPCB1_QPN EHEA_BMASK_IBM(0, 0)
-#define H_QPCB1_ASYN_EV_EQ_NB EHEA_BMASK_IBM(1, 1)
-#define H_QPCB1_SQ_CQ_HANDLE EHEA_BMASK_IBM(2, 2)
-#define H_QPCB1_RQ_CQ_HANDLE EHEA_BMASK_IBM(3, 3)
-#define H_QPCB1_SGEL_NB_SQ EHEA_BMASK_IBM(4, 4)
-#define H_QPCB1_SGEL_NB_RQ1 EHEA_BMASK_IBM(5, 5)
-#define H_QPCB1_SGEL_NB_RQ2 EHEA_BMASK_IBM(6, 6)
-#define H_QPCB1_SGEL_NB_RQ3 EHEA_BMASK_IBM(7, 7)
-
-struct hcp_query_ehea {
- u32 cur_num_qps; /* 00 */
- u32 cur_num_cqs; /* 01 */
- u32 cur_num_eqs; /* 02 */
- u32 cur_num_mrs; /* 03 */
- u32 auth_level; /* 04 */
- u32 max_num_qps; /* 05 */
- u32 max_num_cqs; /* 06 */
- u32 max_num_eqs; /* 07 */
- u32 max_num_mrs; /* 08 */
- u32 reserved0; /* 09 */
- u32 int_clock_freq; /* 10 */
- u32 max_num_pds; /* 11 */
- u32 max_num_addr_handles; /* 12 */
- u32 max_num_cqes; /* 13 */
- u32 max_num_wqes; /* 14 */
- u32 max_num_sgel_rq1wqe; /* 15 */
- u32 max_num_sgel_rq2wqe; /* 16 */
- u32 max_num_sgel_rq3wqe; /* 17 */
- u32 mr_page_size; /* 18 */
- u32 reserved1; /* 19 */
- u64 max_mr_size; /* 20 */
- u64 reserved2; /* 22 */
- u32 num_ports; /* 24 */
- u32 reserved3; /* 25 */
- u32 reserved4; /* 26 */
- u32 reserved5; /* 27 */
- u64 max_mc_mac; /* 28 */
- u64 ehea_cap; /* 30 */
- u32 max_isn_per_eq; /* 32 */
- u32 max_num_neq; /* 33 */
- u64 max_num_vlan_ids; /* 34 */
- u32 max_num_port_group; /* 36 */
- u32 max_num_phys_port; /* 37 */
-
-};
-
-/* Hcall Query/Modify Port Control Block defines */
-#define H_PORT_CB0 0
-#define H_PORT_CB1 1
-#define H_PORT_CB2 2
-#define H_PORT_CB3 3
-#define H_PORT_CB4 4
-#define H_PORT_CB5 5
-#define H_PORT_CB6 6
-#define H_PORT_CB7 7
-
-struct hcp_ehea_port_cb0 {
- u64 port_mac_addr;
- u64 port_rc;
- u64 reserved0;
- u32 port_op_state;
- u32 port_speed;
- u32 ext_swport_op_state;
- u32 neg_tpf_prpf;
- u32 num_default_qps;
- u32 reserved1;
- u64 default_qpn_arr[16];
-};
-
-/* Hcall Query/Modify Port Control Block 0 Selection Mask Bits */
-#define H_PORT_CB0_ALL EHEA_BMASK_IBM(0, 7) /* Set all bits */
-#define H_PORT_CB0_MAC EHEA_BMASK_IBM(0, 0) /* MAC address */
-#define H_PORT_CB0_PRC EHEA_BMASK_IBM(1, 1) /* Port Recv Control */
-#define H_PORT_CB0_DEFQPNARRAY EHEA_BMASK_IBM(7, 7) /* Default QPN Array */
-
-/* Hcall Query Port: Returned port speed values */
-#define H_SPEED_10M_H 1 /* 10 Mbps, Half Duplex */
-#define H_SPEED_10M_F 2 /* 10 Mbps, Full Duplex */
-#define H_SPEED_100M_H 3 /* 100 Mbps, Half Duplex */
-#define H_SPEED_100M_F 4 /* 100 Mbps, Full Duplex */
-#define H_SPEED_1G_F 6 /* 1 Gbps, Full Duplex */
-#define H_SPEED_10G_F 8 /* 10 Gbps, Full Duplex */
-
-/* Port Receive Control Status Bits */
-#define PXLY_RC_VALID EHEA_BMASK_IBM(49, 49)
-#define PXLY_RC_VLAN_XTRACT EHEA_BMASK_IBM(50, 50)
-#define PXLY_RC_TCP_6_TUPLE EHEA_BMASK_IBM(51, 51)
-#define PXLY_RC_UDP_6_TUPLE EHEA_BMASK_IBM(52, 52)
-#define PXLY_RC_TCP_3_TUPLE EHEA_BMASK_IBM(53, 53)
-#define PXLY_RC_TCP_2_TUPLE EHEA_BMASK_IBM(54, 54)
-#define PXLY_RC_LLC_SNAP EHEA_BMASK_IBM(55, 55)
-#define PXLY_RC_JUMBO_FRAME EHEA_BMASK_IBM(56, 56)
-#define PXLY_RC_FRAG_IP_PKT EHEA_BMASK_IBM(57, 57)
-#define PXLY_RC_TCP_UDP_CHKSUM EHEA_BMASK_IBM(58, 58)
-#define PXLY_RC_IP_CHKSUM EHEA_BMASK_IBM(59, 59)
-#define PXLY_RC_MAC_FILTER EHEA_BMASK_IBM(60, 60)
-#define PXLY_RC_UNTAG_FILTER EHEA_BMASK_IBM(61, 61)
-#define PXLY_RC_VLAN_TAG_FILTER EHEA_BMASK_IBM(62, 63)
-
-#define PXLY_RC_VLAN_FILTER 2
-#define PXLY_RC_VLAN_PERM 0
-
-
-#define H_PORT_CB1_ALL 0x8000000000000000ULL
-
-struct hcp_ehea_port_cb1 {
- u64 vlan_filter[64];
-};
-
-#define H_PORT_CB2_ALL 0xFFE0000000000000ULL
-
-struct hcp_ehea_port_cb2 {
- u64 rxo;
- u64 rxucp;
- u64 rxufd;
- u64 rxuerr;
- u64 rxftl;
- u64 rxmcp;
- u64 rxbcp;
- u64 txo;
- u64 txucp;
- u64 txmcp;
- u64 txbcp;
-};
-
-struct hcp_ehea_port_cb3 {
- u64 vlan_bc_filter[64];
- u64 vlan_mc_filter[64];
- u64 vlan_un_filter[64];
- u64 port_mac_hash_array[64];
-};
-
-#define H_PORT_CB4_ALL 0xF000000000000000ULL
-#define H_PORT_CB4_JUMBO 0x1000000000000000ULL
-#define H_PORT_CB4_SPEED 0x8000000000000000ULL
-
-struct hcp_ehea_port_cb4 {
- u32 port_speed;
- u32 pause_frame;
- u32 ens_port_op_state;
- u32 jumbo_frame;
- u32 ens_port_wrap;
-};
-
-/* Hcall Query/Modify Port Control Block 5 Selection Mask Bits */
-#define H_PORT_CB5_RCU 0x0001000000000000ULL
-#define PXS_RCU EHEA_BMASK_IBM(61, 63)
-
-struct hcp_ehea_port_cb5 {
- u64 prc; /* 00 */
- u64 uaa; /* 01 */
- u64 macvc; /* 02 */
- u64 xpcsc; /* 03 */
- u64 xpcsp; /* 04 */
- u64 pcsid; /* 05 */
- u64 xpcsst; /* 06 */
- u64 pthlb; /* 07 */
- u64 pthrb; /* 08 */
- u64 pqu; /* 09 */
- u64 pqd; /* 10 */
- u64 prt; /* 11 */
- u64 wsth; /* 12 */
- u64 rcb; /* 13 */
- u64 rcm; /* 14 */
- u64 rcu; /* 15 */
- u64 macc; /* 16 */
- u64 pc; /* 17 */
- u64 pst; /* 18 */
- u64 ducqpn; /* 19 */
- u64 mcqpn; /* 20 */
- u64 mma; /* 21 */
- u64 pmc0h; /* 22 */
- u64 pmc0l; /* 23 */
- u64 lbc; /* 24 */
-};
-
-#define H_PORT_CB6_ALL 0xFFFFFE7FFFFF8000ULL
-
-struct hcp_ehea_port_cb6 {
- u64 rxo; /* 00 */
- u64 rx64; /* 01 */
- u64 rx65; /* 02 */
- u64 rx128; /* 03 */
- u64 rx256; /* 04 */
- u64 rx512; /* 05 */
- u64 rx1024; /* 06 */
- u64 rxbfcs; /* 07 */
- u64 rxime; /* 08 */
- u64 rxrle; /* 09 */
- u64 rxorle; /* 10 */
- u64 rxftl; /* 11 */
- u64 rxjab; /* 12 */
- u64 rxse; /* 13 */
- u64 rxce; /* 14 */
- u64 rxrf; /* 15 */
- u64 rxfrag; /* 16 */
- u64 rxuoc; /* 17 */
- u64 rxcpf; /* 18 */
- u64 rxsb; /* 19 */
- u64 rxfd; /* 20 */
- u64 rxoerr; /* 21 */
- u64 rxaln; /* 22 */
- u64 ducqpn; /* 23 */
- u64 reserved0; /* 24 */
- u64 rxmcp; /* 25 */
- u64 rxbcp; /* 26 */
- u64 txmcp; /* 27 */
- u64 txbcp; /* 28 */
- u64 txo; /* 29 */
- u64 tx64; /* 30 */
- u64 tx65; /* 31 */
- u64 tx128; /* 32 */
- u64 tx256; /* 33 */
- u64 tx512; /* 34 */
- u64 tx1024; /* 35 */
- u64 txbfcs; /* 36 */
- u64 txcpf; /* 37 */
- u64 txlf; /* 38 */
- u64 txrf; /* 39 */
- u64 txime; /* 40 */
- u64 txsc; /* 41 */
- u64 txmc; /* 42 */
- u64 txsqe; /* 43 */
- u64 txdef; /* 44 */
- u64 txlcol; /* 45 */
- u64 txexcol; /* 46 */
- u64 txcse; /* 47 */
- u64 txbor; /* 48 */
-};
-
-#define H_PORT_CB7_DUCQPN 0x8000000000000000ULL
-
-struct hcp_ehea_port_cb7 {
- u64 def_uc_qpn;
-};
-
-u64 ehea_h_query_ehea_qp(const u64 adapter_handle,
- const u8 qp_category,
- const u64 qp_handle, const u64 sel_mask,
- void *cb_addr);
-
-u64 ehea_h_modify_ehea_qp(const u64 adapter_handle,
- const u8 cat,
- const u64 qp_handle,
- const u64 sel_mask,
- void *cb_addr,
- u64 *inv_attr_id,
- u64 *proc_mask, u16 *out_swr, u16 *out_rwr);
-
-u64 ehea_h_alloc_resource_eq(const u64 adapter_handle,
- struct ehea_eq_attr *eq_attr, u64 *eq_handle);
-
-u64 ehea_h_alloc_resource_cq(const u64 adapter_handle,
- struct ehea_cq_attr *cq_attr,
- u64 *cq_handle, struct h_epas *epas);
-
-u64 ehea_h_alloc_resource_qp(const u64 adapter_handle,
- struct ehea_qp_init_attr *init_attr,
- const u32 pd,
- u64 *qp_handle, struct h_epas *h_epas);
-
-#define H_REG_RPAGE_PAGE_SIZE EHEA_BMASK_IBM(48, 55)
-#define H_REG_RPAGE_QT EHEA_BMASK_IBM(62, 63)
-
-u64 ehea_h_register_rpage(const u64 adapter_handle,
- const u8 pagesize,
- const u8 queue_type,
- const u64 resource_handle,
- const u64 log_pageaddr, u64 count);
-
-#define H_DISABLE_GET_EHEA_WQE_P 1
-#define H_DISABLE_GET_SQ_WQE_P 2
-#define H_DISABLE_GET_RQC 3
-
-u64 ehea_h_disable_and_get_hea(const u64 adapter_handle, const u64 qp_handle);
-
-#define FORCE_FREE 1
-#define NORMAL_FREE 0
-
-u64 ehea_h_free_resource(const u64 adapter_handle, const u64 res_handle,
- u64 force_bit);
-
-u64 ehea_h_alloc_resource_mr(const u64 adapter_handle, const u64 vaddr,
- const u64 length, const u32 access_ctrl,
- const u32 pd, u64 *mr_handle, u32 *lkey);
-
-u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle,
- const u8 pagesize, const u8 queue_type,
- const u64 log_pageaddr, const u64 count);
-
-u64 ehea_h_register_smr(const u64 adapter_handle, const u64 orig_mr_handle,
- const u64 vaddr_in, const u32 access_ctrl, const u32 pd,
- struct ehea_mr *mr);
-
-u64 ehea_h_query_ehea(const u64 adapter_handle, void *cb_addr);
-
-/* output param R5 */
-#define H_MEHEAPORT_CAT EHEA_BMASK_IBM(40, 47)
-#define H_MEHEAPORT_PN EHEA_BMASK_IBM(48, 63)
-
-u64 ehea_h_query_ehea_port(const u64 adapter_handle, const u16 port_num,
- const u8 cb_cat, const u64 select_mask,
- void *cb_addr);
-
-u64 ehea_h_modify_ehea_port(const u64 adapter_handle, const u16 port_num,
- const u8 cb_cat, const u64 select_mask,
- void *cb_addr);
-
-#define H_REGBCMC_PN EHEA_BMASK_IBM(48, 63)
-#define H_REGBCMC_REGTYPE EHEA_BMASK_IBM(60, 63)
-#define H_REGBCMC_MACADDR EHEA_BMASK_IBM(16, 63)
-#define H_REGBCMC_VLANID EHEA_BMASK_IBM(52, 63)
-
-u64 ehea_h_reg_dereg_bcmc(const u64 adapter_handle, const u16 port_num,
- const u8 reg_type, const u64 mc_mac_addr,
- const u16 vlan_id, const u32 hcall_id);
-
-u64 ehea_h_reset_events(const u64 adapter_handle, const u64 neq_handle,
- const u64 event_mask);
-
-u64 ehea_h_error_data(const u64 adapter_handle, const u64 ressource_handle,
- void *rblock);
-
-#endif /* __EHEA_PHYP_H__ */
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_qmr.c b/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
deleted file mode 100644
index 60629a0032b2..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
+++ /dev/null
@@ -1,999 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include "ehea.h"
-#include "ehea_phyp.h"
-#include "ehea_qmr.h"
-
-static struct ehea_bmap *ehea_bmap;
-
-static void *hw_qpageit_get_inc(struct hw_queue *queue)
-{
- void *retvalue = hw_qeit_get(queue);
-
- queue->current_q_offset += queue->pagesize;
- if (queue->current_q_offset > queue->queue_length) {
- queue->current_q_offset -= queue->pagesize;
- retvalue = NULL;
- } else if (((u64) retvalue) & (EHEA_PAGESIZE-1)) {
- pr_err("not on pageboundary\n");
- retvalue = NULL;
- }
- return retvalue;
-}
-
-static int hw_queue_ctor(struct hw_queue *queue, const u32 nr_of_pages,
- const u32 pagesize, const u32 qe_size)
-{
- int pages_per_kpage = PAGE_SIZE / pagesize;
- int i, k;
-
- if ((pagesize > PAGE_SIZE) || (!pages_per_kpage)) {
- pr_err("pagesize conflict! kernel pagesize=%d, ehea pagesize=%d\n",
- (int)PAGE_SIZE, (int)pagesize);
- return -EINVAL;
- }
-
- queue->queue_length = nr_of_pages * pagesize;
- queue->queue_pages = kmalloc_array(nr_of_pages, sizeof(void *),
- GFP_KERNEL);
- if (!queue->queue_pages)
- return -ENOMEM;
-
- /*
- * allocate pages for queue:
- * outer loop allocates whole kernel pages (page aligned) and
- * inner loop divides a kernel page into smaller hea queue pages
- */
- i = 0;
- while (i < nr_of_pages) {
- u8 *kpage = (u8 *)get_zeroed_page(GFP_KERNEL);
- if (!kpage)
- goto out_nomem;
- for (k = 0; k < pages_per_kpage && i < nr_of_pages; k++) {
- (queue->queue_pages)[i] = (struct ehea_page *)kpage;
- kpage += pagesize;
- i++;
- }
- }
-
- queue->current_q_offset = 0;
- queue->qe_size = qe_size;
- queue->pagesize = pagesize;
- queue->toggle_state = 1;
-
- return 0;
-out_nomem:
- for (i = 0; i < nr_of_pages; i += pages_per_kpage) {
- if (!(queue->queue_pages)[i])
- break;
- free_page((unsigned long)(queue->queue_pages)[i]);
- }
- return -ENOMEM;
-}
-
-static void hw_queue_dtor(struct hw_queue *queue)
-{
- int pages_per_kpage;
- int i, nr_pages;
-
- if (!queue || !queue->queue_pages)
- return;
-
- pages_per_kpage = PAGE_SIZE / queue->pagesize;
-
- nr_pages = queue->queue_length / queue->pagesize;
-
- for (i = 0; i < nr_pages; i += pages_per_kpage)
- free_page((unsigned long)(queue->queue_pages)[i]);
-
- kfree(queue->queue_pages);
-}
-
-struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter,
- int nr_of_cqe, u64 eq_handle, u32 cq_token)
-{
- struct ehea_cq *cq;
- u64 hret, rpage;
- u32 counter;
- int ret;
- void *vpage;
-
- cq = kzalloc_obj(*cq);
- if (!cq)
- goto out_nomem;
-
- cq->attr.max_nr_of_cqes = nr_of_cqe;
- cq->attr.cq_token = cq_token;
- cq->attr.eq_handle = eq_handle;
-
- cq->adapter = adapter;
-
- hret = ehea_h_alloc_resource_cq(adapter->handle, &cq->attr,
- &cq->fw_handle, &cq->epas);
- if (hret != H_SUCCESS) {
- pr_err("alloc_resource_cq failed\n");
- goto out_freemem;
- }
-
- ret = hw_queue_ctor(&cq->hw_queue, cq->attr.nr_pages,
- EHEA_PAGESIZE, sizeof(struct ehea_cqe));
- if (ret)
- goto out_freeres;
-
- for (counter = 0; counter < cq->attr.nr_pages; counter++) {
- vpage = hw_qpageit_get_inc(&cq->hw_queue);
- if (!vpage) {
- pr_err("hw_qpageit_get_inc failed\n");
- goto out_kill_hwq;
- }
-
- rpage = __pa(vpage);
- hret = ehea_h_register_rpage(adapter->handle,
- 0, EHEA_CQ_REGISTER_ORIG,
- cq->fw_handle, rpage, 1);
- if (hret < H_SUCCESS) {
- pr_err("register_rpage_cq failed ehea_cq=%p hret=%llx counter=%i act_pages=%i\n",
- cq, hret, counter, cq->attr.nr_pages);
- goto out_kill_hwq;
- }
-
- if (counter == (cq->attr.nr_pages - 1)) {
- vpage = hw_qpageit_get_inc(&cq->hw_queue);
-
- if ((hret != H_SUCCESS) || (vpage)) {
- pr_err("registration of pages not complete hret=%llx\n",
- hret);
- goto out_kill_hwq;
- }
- } else {
- if (hret != H_PAGE_REGISTERED) {
- pr_err("CQ: registration of page failed hret=%llx\n",
- hret);
- goto out_kill_hwq;
- }
- }
- }
-
- hw_qeit_reset(&cq->hw_queue);
- ehea_reset_cq_ep(cq);
- ehea_reset_cq_n1(cq);
-
- return cq;
-
-out_kill_hwq:
- hw_queue_dtor(&cq->hw_queue);
-
-out_freeres:
- ehea_h_free_resource(adapter->handle, cq->fw_handle, FORCE_FREE);
-
-out_freemem:
- kfree(cq);
-
-out_nomem:
- return NULL;
-}
-
-static u64 ehea_destroy_cq_res(struct ehea_cq *cq, u64 force)
-{
- u64 hret;
- u64 adapter_handle = cq->adapter->handle;
-
- /* deregister all previous registered pages */
- hret = ehea_h_free_resource(adapter_handle, cq->fw_handle, force);
- if (hret != H_SUCCESS)
- return hret;
-
- hw_queue_dtor(&cq->hw_queue);
- kfree(cq);
-
- return hret;
-}
-
-int ehea_destroy_cq(struct ehea_cq *cq)
-{
- u64 hret, aer, aerr;
- if (!cq)
- return 0;
-
- hcp_epas_dtor(&cq->epas);
- hret = ehea_destroy_cq_res(cq, NORMAL_FREE);
- if (hret == H_R_STATE) {
- ehea_error_data(cq->adapter, cq->fw_handle, &aer, &aerr);
- hret = ehea_destroy_cq_res(cq, FORCE_FREE);
- }
-
- if (hret != H_SUCCESS) {
- pr_err("destroy CQ failed\n");
- return -EIO;
- }
-
- return 0;
-}
-
-struct ehea_eq *ehea_create_eq(struct ehea_adapter *adapter,
- const enum ehea_eq_type type,
- const u32 max_nr_of_eqes, const u8 eqe_gen)
-{
- int ret, i;
- u64 hret, rpage;
- void *vpage;
- struct ehea_eq *eq;
-
- eq = kzalloc_obj(*eq);
- if (!eq)
- return NULL;
-
- eq->adapter = adapter;
- eq->attr.type = type;
- eq->attr.max_nr_of_eqes = max_nr_of_eqes;
- eq->attr.eqe_gen = eqe_gen;
- spin_lock_init(&eq->spinlock);
-
- hret = ehea_h_alloc_resource_eq(adapter->handle,
- &eq->attr, &eq->fw_handle);
- if (hret != H_SUCCESS) {
- pr_err("alloc_resource_eq failed\n");
- goto out_freemem;
- }
-
- ret = hw_queue_ctor(&eq->hw_queue, eq->attr.nr_pages,
- EHEA_PAGESIZE, sizeof(struct ehea_eqe));
- if (ret) {
- pr_err("can't allocate eq pages\n");
- goto out_freeres;
- }
-
- for (i = 0; i < eq->attr.nr_pages; i++) {
- vpage = hw_qpageit_get_inc(&eq->hw_queue);
- if (!vpage) {
- pr_err("hw_qpageit_get_inc failed\n");
- hret = H_RESOURCE;
- goto out_kill_hwq;
- }
-
- rpage = __pa(vpage);
-
- hret = ehea_h_register_rpage(adapter->handle, 0,
- EHEA_EQ_REGISTER_ORIG,
- eq->fw_handle, rpage, 1);
-
- if (i == (eq->attr.nr_pages - 1)) {
- /* last page */
- vpage = hw_qpageit_get_inc(&eq->hw_queue);
- if ((hret != H_SUCCESS) || (vpage))
- goto out_kill_hwq;
-
- } else {
- if (hret != H_PAGE_REGISTERED)
- goto out_kill_hwq;
-
- }
- }
-
- hw_qeit_reset(&eq->hw_queue);
- return eq;
-
-out_kill_hwq:
- hw_queue_dtor(&eq->hw_queue);
-
-out_freeres:
- ehea_h_free_resource(adapter->handle, eq->fw_handle, FORCE_FREE);
-
-out_freemem:
- kfree(eq);
- return NULL;
-}
-
-struct ehea_eqe *ehea_poll_eq(struct ehea_eq *eq)
-{
- struct ehea_eqe *eqe;
- unsigned long flags;
-
- spin_lock_irqsave(&eq->spinlock, flags);
- eqe = hw_eqit_eq_get_inc_valid(&eq->hw_queue);
- spin_unlock_irqrestore(&eq->spinlock, flags);
-
- return eqe;
-}
-
-static u64 ehea_destroy_eq_res(struct ehea_eq *eq, u64 force)
-{
- u64 hret;
- unsigned long flags;
-
- spin_lock_irqsave(&eq->spinlock, flags);
-
- hret = ehea_h_free_resource(eq->adapter->handle, eq->fw_handle, force);
- spin_unlock_irqrestore(&eq->spinlock, flags);
-
- if (hret != H_SUCCESS)
- return hret;
-
- hw_queue_dtor(&eq->hw_queue);
- kfree(eq);
-
- return hret;
-}
-
-int ehea_destroy_eq(struct ehea_eq *eq)
-{
- u64 hret, aer, aerr;
- if (!eq)
- return 0;
-
- hcp_epas_dtor(&eq->epas);
-
- hret = ehea_destroy_eq_res(eq, NORMAL_FREE);
- if (hret == H_R_STATE) {
- ehea_error_data(eq->adapter, eq->fw_handle, &aer, &aerr);
- hret = ehea_destroy_eq_res(eq, FORCE_FREE);
- }
-
- if (hret != H_SUCCESS) {
- pr_err("destroy EQ failed\n");
- return -EIO;
- }
-
- return 0;
-}
-
-/* allocates memory for a queue and registers pages in phyp */
-static int ehea_qp_alloc_register(struct ehea_qp *qp, struct hw_queue *hw_queue,
- int nr_pages, int wqe_size, int act_nr_sges,
- struct ehea_adapter *adapter, int h_call_q_selector)
-{
- u64 hret, rpage;
- int ret, cnt;
- void *vpage;
-
- ret = hw_queue_ctor(hw_queue, nr_pages, EHEA_PAGESIZE, wqe_size);
- if (ret)
- return ret;
-
- for (cnt = 0; cnt < nr_pages; cnt++) {
- vpage = hw_qpageit_get_inc(hw_queue);
- if (!vpage) {
- pr_err("hw_qpageit_get_inc failed\n");
- goto out_kill_hwq;
- }
- rpage = __pa(vpage);
- hret = ehea_h_register_rpage(adapter->handle,
- 0, h_call_q_selector,
- qp->fw_handle, rpage, 1);
- if (hret < H_SUCCESS) {
- pr_err("register_rpage_qp failed\n");
- goto out_kill_hwq;
- }
- }
- hw_qeit_reset(hw_queue);
- return 0;
-
-out_kill_hwq:
- hw_queue_dtor(hw_queue);
- return -EIO;
-}
-
-static inline u32 map_wqe_size(u8 wqe_enc_size)
-{
- return 128 << wqe_enc_size;
-}
-
-struct ehea_qp *ehea_create_qp(struct ehea_adapter *adapter,
- u32 pd, struct ehea_qp_init_attr *init_attr)
-{
- int ret;
- u64 hret;
- struct ehea_qp *qp;
- u32 wqe_size_in_bytes_sq, wqe_size_in_bytes_rq1;
- u32 wqe_size_in_bytes_rq2, wqe_size_in_bytes_rq3;
-
-
- qp = kzalloc_obj(*qp);
- if (!qp)
- return NULL;
-
- qp->adapter = adapter;
-
- hret = ehea_h_alloc_resource_qp(adapter->handle, init_attr, pd,
- &qp->fw_handle, &qp->epas);
- if (hret != H_SUCCESS) {
- pr_err("ehea_h_alloc_resource_qp failed\n");
- goto out_freemem;
- }
-
- wqe_size_in_bytes_sq = map_wqe_size(init_attr->act_wqe_size_enc_sq);
- wqe_size_in_bytes_rq1 = map_wqe_size(init_attr->act_wqe_size_enc_rq1);
- wqe_size_in_bytes_rq2 = map_wqe_size(init_attr->act_wqe_size_enc_rq2);
- wqe_size_in_bytes_rq3 = map_wqe_size(init_attr->act_wqe_size_enc_rq3);
-
- ret = ehea_qp_alloc_register(qp, &qp->hw_squeue, init_attr->nr_sq_pages,
- wqe_size_in_bytes_sq,
- init_attr->act_wqe_size_enc_sq, adapter,
- 0);
- if (ret) {
- pr_err("can't register for sq ret=%x\n", ret);
- goto out_freeres;
- }
-
- ret = ehea_qp_alloc_register(qp, &qp->hw_rqueue1,
- init_attr->nr_rq1_pages,
- wqe_size_in_bytes_rq1,
- init_attr->act_wqe_size_enc_rq1,
- adapter, 1);
- if (ret) {
- pr_err("can't register for rq1 ret=%x\n", ret);
- goto out_kill_hwsq;
- }
-
- if (init_attr->rq_count > 1) {
- ret = ehea_qp_alloc_register(qp, &qp->hw_rqueue2,
- init_attr->nr_rq2_pages,
- wqe_size_in_bytes_rq2,
- init_attr->act_wqe_size_enc_rq2,
- adapter, 2);
- if (ret) {
- pr_err("can't register for rq2 ret=%x\n", ret);
- goto out_kill_hwr1q;
- }
- }
-
- if (init_attr->rq_count > 2) {
- ret = ehea_qp_alloc_register(qp, &qp->hw_rqueue3,
- init_attr->nr_rq3_pages,
- wqe_size_in_bytes_rq3,
- init_attr->act_wqe_size_enc_rq3,
- adapter, 3);
- if (ret) {
- pr_err("can't register for rq3 ret=%x\n", ret);
- goto out_kill_hwr2q;
- }
- }
-
- qp->init_attr = *init_attr;
-
- return qp;
-
-out_kill_hwr2q:
- hw_queue_dtor(&qp->hw_rqueue2);
-
-out_kill_hwr1q:
- hw_queue_dtor(&qp->hw_rqueue1);
-
-out_kill_hwsq:
- hw_queue_dtor(&qp->hw_squeue);
-
-out_freeres:
- ehea_h_disable_and_get_hea(adapter->handle, qp->fw_handle);
- ehea_h_free_resource(adapter->handle, qp->fw_handle, FORCE_FREE);
-
-out_freemem:
- kfree(qp);
- return NULL;
-}
-
-static u64 ehea_destroy_qp_res(struct ehea_qp *qp, u64 force)
-{
- u64 hret;
- struct ehea_qp_init_attr *qp_attr = &qp->init_attr;
-
-
- ehea_h_disable_and_get_hea(qp->adapter->handle, qp->fw_handle);
- hret = ehea_h_free_resource(qp->adapter->handle, qp->fw_handle, force);
- if (hret != H_SUCCESS)
- return hret;
-
- hw_queue_dtor(&qp->hw_squeue);
- hw_queue_dtor(&qp->hw_rqueue1);
-
- if (qp_attr->rq_count > 1)
- hw_queue_dtor(&qp->hw_rqueue2);
- if (qp_attr->rq_count > 2)
- hw_queue_dtor(&qp->hw_rqueue3);
- kfree(qp);
-
- return hret;
-}
-
-int ehea_destroy_qp(struct ehea_qp *qp)
-{
- u64 hret, aer, aerr;
- if (!qp)
- return 0;
-
- hcp_epas_dtor(&qp->epas);
-
- hret = ehea_destroy_qp_res(qp, NORMAL_FREE);
- if (hret == H_R_STATE) {
- ehea_error_data(qp->adapter, qp->fw_handle, &aer, &aerr);
- hret = ehea_destroy_qp_res(qp, FORCE_FREE);
- }
-
- if (hret != H_SUCCESS) {
- pr_err("destroy QP failed\n");
- return -EIO;
- }
-
- return 0;
-}
-
-static inline int ehea_calc_index(unsigned long i, unsigned long s)
-{
- return (i >> s) & EHEA_INDEX_MASK;
-}
-
-static inline int ehea_init_top_bmap(struct ehea_top_bmap *ehea_top_bmap,
- int dir)
-{
- if (!ehea_top_bmap->dir[dir]) {
- ehea_top_bmap->dir[dir] =
- kzalloc_obj(struct ehea_dir_bmap);
- if (!ehea_top_bmap->dir[dir])
- return -ENOMEM;
- }
- return 0;
-}
-
-static inline int ehea_init_bmap(struct ehea_bmap *ehea_bmap, int top, int dir)
-{
- if (!ehea_bmap->top[top]) {
- ehea_bmap->top[top] =
- kzalloc_obj(struct ehea_top_bmap);
- if (!ehea_bmap->top[top])
- return -ENOMEM;
- }
- return ehea_init_top_bmap(ehea_bmap->top[top], dir);
-}
-
-static DEFINE_MUTEX(ehea_busmap_mutex);
-static unsigned long ehea_mr_len;
-
-#define EHEA_BUSMAP_ADD_SECT 1
-#define EHEA_BUSMAP_REM_SECT 0
-
-static void ehea_rebuild_busmap(void)
-{
- u64 vaddr = EHEA_BUSMAP_START;
- int top, dir, idx;
-
- for (top = 0; top < EHEA_MAP_ENTRIES; top++) {
- struct ehea_top_bmap *ehea_top;
- int valid_dir_entries = 0;
-
- if (!ehea_bmap->top[top])
- continue;
- ehea_top = ehea_bmap->top[top];
- for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) {
- struct ehea_dir_bmap *ehea_dir;
- int valid_entries = 0;
-
- if (!ehea_top->dir[dir])
- continue;
- valid_dir_entries++;
- ehea_dir = ehea_top->dir[dir];
- for (idx = 0; idx < EHEA_MAP_ENTRIES; idx++) {
- if (!ehea_dir->ent[idx])
- continue;
- valid_entries++;
- ehea_dir->ent[idx] = vaddr;
- vaddr += EHEA_SECTSIZE;
- }
- if (!valid_entries) {
- ehea_top->dir[dir] = NULL;
- kfree(ehea_dir);
- }
- }
- if (!valid_dir_entries) {
- ehea_bmap->top[top] = NULL;
- kfree(ehea_top);
- }
- }
-}
-
-static int ehea_update_busmap(unsigned long pfn, unsigned long nr_pages, int add)
-{
- unsigned long i, start_section, end_section;
-
- if (!nr_pages)
- return 0;
-
- if (!ehea_bmap) {
- ehea_bmap = kzalloc_obj(struct ehea_bmap);
- if (!ehea_bmap)
- return -ENOMEM;
- }
-
- start_section = (pfn * PAGE_SIZE) / EHEA_SECTSIZE;
- end_section = start_section + ((nr_pages * PAGE_SIZE) / EHEA_SECTSIZE);
- /* Mark entries as valid or invalid only; address is assigned later */
- for (i = start_section; i < end_section; i++) {
- u64 flag;
- int top = ehea_calc_index(i, EHEA_TOP_INDEX_SHIFT);
- int dir = ehea_calc_index(i, EHEA_DIR_INDEX_SHIFT);
- int idx = i & EHEA_INDEX_MASK;
-
- if (add) {
- int ret = ehea_init_bmap(ehea_bmap, top, dir);
- if (ret)
- return ret;
- flag = 1; /* valid */
- ehea_mr_len += EHEA_SECTSIZE;
- } else {
- if (!ehea_bmap->top[top])
- continue;
- if (!ehea_bmap->top[top]->dir[dir])
- continue;
- flag = 0; /* invalid */
- ehea_mr_len -= EHEA_SECTSIZE;
- }
-
- ehea_bmap->top[top]->dir[dir]->ent[idx] = flag;
- }
- ehea_rebuild_busmap(); /* Assign contiguous addresses for mr */
- return 0;
-}
-
-int ehea_add_sect_bmap(unsigned long pfn, unsigned long nr_pages)
-{
- int ret;
-
- mutex_lock(&ehea_busmap_mutex);
- ret = ehea_update_busmap(pfn, nr_pages, EHEA_BUSMAP_ADD_SECT);
- mutex_unlock(&ehea_busmap_mutex);
- return ret;
-}
-
-int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages)
-{
- int ret;
-
- mutex_lock(&ehea_busmap_mutex);
- ret = ehea_update_busmap(pfn, nr_pages, EHEA_BUSMAP_REM_SECT);
- mutex_unlock(&ehea_busmap_mutex);
- return ret;
-}
-
-static int ehea_is_hugepage(unsigned long pfn)
-{
- if (pfn & EHEA_HUGEPAGE_PFN_MASK)
- return 0;
-
- if (page_shift(pfn_to_page(pfn)) != EHEA_HUGEPAGESHIFT)
- return 0;
-
- return 1;
-}
-
-static int ehea_create_busmap_callback(unsigned long initial_pfn,
- unsigned long total_nr_pages, void *arg)
-{
- int ret;
- unsigned long pfn, start_pfn, end_pfn, nr_pages;
-
- if ((total_nr_pages * PAGE_SIZE) < EHEA_HUGEPAGE_SIZE)
- return ehea_update_busmap(initial_pfn, total_nr_pages,
- EHEA_BUSMAP_ADD_SECT);
-
- /* Given chunk is >= 16GB -> check for hugepages */
- start_pfn = initial_pfn;
- end_pfn = initial_pfn + total_nr_pages;
- pfn = start_pfn;
-
- while (pfn < end_pfn) {
- if (ehea_is_hugepage(pfn)) {
- /* Add mem found in front of the hugepage */
- nr_pages = pfn - start_pfn;
- ret = ehea_update_busmap(start_pfn, nr_pages,
- EHEA_BUSMAP_ADD_SECT);
- if (ret)
- return ret;
-
- /* Skip the hugepage */
- pfn += (EHEA_HUGEPAGE_SIZE / PAGE_SIZE);
- start_pfn = pfn;
- } else
- pfn += (EHEA_SECTSIZE / PAGE_SIZE);
- }
-
- /* Add mem found behind the hugepage(s) */
- nr_pages = pfn - start_pfn;
- return ehea_update_busmap(start_pfn, nr_pages, EHEA_BUSMAP_ADD_SECT);
-}
-
-int ehea_create_busmap(void)
-{
- int ret;
-
- mutex_lock(&ehea_busmap_mutex);
- ehea_mr_len = 0;
- ret = walk_system_ram_range(0, 1ULL << MAX_PHYSMEM_BITS, NULL,
- ehea_create_busmap_callback);
- mutex_unlock(&ehea_busmap_mutex);
- return ret;
-}
-
-void ehea_destroy_busmap(void)
-{
- int top, dir;
- mutex_lock(&ehea_busmap_mutex);
- if (!ehea_bmap)
- goto out_destroy;
-
- for (top = 0; top < EHEA_MAP_ENTRIES; top++) {
- if (!ehea_bmap->top[top])
- continue;
-
- for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) {
- if (!ehea_bmap->top[top]->dir[dir])
- continue;
-
- kfree(ehea_bmap->top[top]->dir[dir]);
- }
-
- kfree(ehea_bmap->top[top]);
- }
-
- kfree(ehea_bmap);
- ehea_bmap = NULL;
-out_destroy:
- mutex_unlock(&ehea_busmap_mutex);
-}
-
-u64 ehea_map_vaddr(void *caddr)
-{
- int top, dir, idx;
- unsigned long index, offset;
-
- if (!ehea_bmap)
- return EHEA_INVAL_ADDR;
-
- index = __pa(caddr) >> SECTION_SIZE_BITS;
- top = (index >> EHEA_TOP_INDEX_SHIFT) & EHEA_INDEX_MASK;
- if (!ehea_bmap->top[top])
- return EHEA_INVAL_ADDR;
-
- dir = (index >> EHEA_DIR_INDEX_SHIFT) & EHEA_INDEX_MASK;
- if (!ehea_bmap->top[top]->dir[dir])
- return EHEA_INVAL_ADDR;
-
- idx = index & EHEA_INDEX_MASK;
- if (!ehea_bmap->top[top]->dir[dir]->ent[idx])
- return EHEA_INVAL_ADDR;
-
- offset = (unsigned long)caddr & (EHEA_SECTSIZE - 1);
- return ehea_bmap->top[top]->dir[dir]->ent[idx] | offset;
-}
-
-static inline void *ehea_calc_sectbase(int top, int dir, int idx)
-{
- unsigned long ret = idx;
- ret |= dir << EHEA_DIR_INDEX_SHIFT;
- ret |= top << EHEA_TOP_INDEX_SHIFT;
- return __va(ret << SECTION_SIZE_BITS);
-}
-
-static u64 ehea_reg_mr_section(int top, int dir, int idx, u64 *pt,
- struct ehea_adapter *adapter,
- struct ehea_mr *mr)
-{
- void *pg;
- u64 j, m, hret;
- unsigned long k = 0;
- u64 pt_abs = __pa(pt);
-
- void *sectbase = ehea_calc_sectbase(top, dir, idx);
-
- for (j = 0; j < (EHEA_PAGES_PER_SECTION / EHEA_MAX_RPAGE); j++) {
-
- for (m = 0; m < EHEA_MAX_RPAGE; m++) {
- pg = sectbase + ((k++) * EHEA_PAGESIZE);
- pt[m] = __pa(pg);
- }
- hret = ehea_h_register_rpage_mr(adapter->handle, mr->handle, 0,
- 0, pt_abs, EHEA_MAX_RPAGE);
-
- if ((hret != H_SUCCESS) &&
- (hret != H_PAGE_REGISTERED)) {
- ehea_h_free_resource(adapter->handle, mr->handle,
- FORCE_FREE);
- pr_err("register_rpage_mr failed\n");
- return hret;
- }
- }
- return hret;
-}
-
-static u64 ehea_reg_mr_sections(int top, int dir, u64 *pt,
- struct ehea_adapter *adapter,
- struct ehea_mr *mr)
-{
- u64 hret = H_SUCCESS;
- int idx;
-
- for (idx = 0; idx < EHEA_MAP_ENTRIES; idx++) {
- if (!ehea_bmap->top[top]->dir[dir]->ent[idx])
- continue;
-
- hret = ehea_reg_mr_section(top, dir, idx, pt, adapter, mr);
- if ((hret != H_SUCCESS) && (hret != H_PAGE_REGISTERED))
- return hret;
- }
- return hret;
-}
-
-static u64 ehea_reg_mr_dir_sections(int top, u64 *pt,
- struct ehea_adapter *adapter,
- struct ehea_mr *mr)
-{
- u64 hret = H_SUCCESS;
- int dir;
-
- for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) {
- if (!ehea_bmap->top[top]->dir[dir])
- continue;
-
- hret = ehea_reg_mr_sections(top, dir, pt, adapter, mr);
- if ((hret != H_SUCCESS) && (hret != H_PAGE_REGISTERED))
- return hret;
- }
- return hret;
-}
-
-int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
-{
- int ret;
- u64 *pt;
- u64 hret;
- u32 acc_ctrl = EHEA_MR_ACC_CTRL;
-
- unsigned long top;
-
- pt = (void *)get_zeroed_page(GFP_KERNEL);
- if (!pt) {
- pr_err("no mem\n");
- ret = -ENOMEM;
- goto out;
- }
-
- hret = ehea_h_alloc_resource_mr(adapter->handle, EHEA_BUSMAP_START,
- ehea_mr_len, acc_ctrl, adapter->pd,
- &mr->handle, &mr->lkey);
-
- if (hret != H_SUCCESS) {
- pr_err("alloc_resource_mr failed\n");
- ret = -EIO;
- goto out;
- }
-
- if (!ehea_bmap) {
- ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE);
- pr_err("no busmap available\n");
- ret = -EIO;
- goto out;
- }
-
- for (top = 0; top < EHEA_MAP_ENTRIES; top++) {
- if (!ehea_bmap->top[top])
- continue;
-
- hret = ehea_reg_mr_dir_sections(top, pt, adapter, mr);
- if((hret != H_PAGE_REGISTERED) && (hret != H_SUCCESS))
- break;
- }
-
- if (hret != H_SUCCESS) {
- ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE);
- pr_err("registering mr failed\n");
- ret = -EIO;
- goto out;
- }
-
- mr->vaddr = EHEA_BUSMAP_START;
- mr->adapter = adapter;
- ret = 0;
-out:
- free_page((unsigned long)pt);
- return ret;
-}
-
-int ehea_rem_mr(struct ehea_mr *mr)
-{
- u64 hret;
-
- if (!mr || !mr->adapter)
- return -EINVAL;
-
- hret = ehea_h_free_resource(mr->adapter->handle, mr->handle,
- FORCE_FREE);
- if (hret != H_SUCCESS) {
- pr_err("destroy MR failed\n");
- return -EIO;
- }
-
- return 0;
-}
-
-int ehea_gen_smr(struct ehea_adapter *adapter, struct ehea_mr *old_mr,
- struct ehea_mr *shared_mr)
-{
- u64 hret;
-
- hret = ehea_h_register_smr(adapter->handle, old_mr->handle,
- old_mr->vaddr, EHEA_MR_ACC_CTRL,
- adapter->pd, shared_mr);
- if (hret != H_SUCCESS)
- return -EIO;
-
- shared_mr->adapter = adapter;
-
- return 0;
-}
-
-static void print_error_data(u64 *data)
-{
- int length;
- u64 type = EHEA_BMASK_GET(ERROR_DATA_TYPE, data[2]);
- u64 resource = data[1];
-
- length = EHEA_BMASK_GET(ERROR_DATA_LENGTH, data[0]);
-
- if (length > EHEA_PAGESIZE)
- length = EHEA_PAGESIZE;
-
- if (type == EHEA_AER_RESTYPE_QP)
- pr_err("QP (resource=%llX) state: AER=0x%llX, AERR=0x%llX, port=%llX\n",
- resource, data[6], data[12], data[22]);
- else if (type == EHEA_AER_RESTYPE_CQ)
- pr_err("CQ (resource=%llX) state: AER=0x%llX\n",
- resource, data[6]);
- else if (type == EHEA_AER_RESTYPE_EQ)
- pr_err("EQ (resource=%llX) state: AER=0x%llX\n",
- resource, data[6]);
-
- ehea_dump(data, length, "error data");
-}
-
-u64 ehea_error_data(struct ehea_adapter *adapter, u64 res_handle,
- u64 *aer, u64 *aerr)
-{
- unsigned long ret;
- u64 *rblock;
- u64 type = 0;
-
- rblock = (void *)get_zeroed_page(GFP_KERNEL);
- if (!rblock) {
- pr_err("Cannot allocate rblock memory\n");
- goto out;
- }
-
- ret = ehea_h_error_data(adapter->handle, res_handle, rblock);
-
- if (ret == H_SUCCESS) {
- type = EHEA_BMASK_GET(ERROR_DATA_TYPE, rblock[2]);
- *aer = rblock[6];
- *aerr = rblock[12];
- print_error_data(rblock);
- } else if (ret == H_R_STATE) {
- pr_err("No error data available: %llX\n", res_handle);
- } else
- pr_err("Error data could not be fetched: %llX\n", res_handle);
-
- free_page((unsigned long)rblock);
-out:
- return type;
-}
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_qmr.h b/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
deleted file mode 100644
index 7c7cccd820f7..000000000000
--- a/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
+++ /dev/null
@@ -1,390 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
- *
- * eHEA ethernet device driver for IBM eServer System p
- *
- * (C) Copyright IBM Corp. 2006
- *
- * Authors:
- * Christoph Raisch <raisch@de.ibm.com>
- * Jan-Bernd Themann <themann@de.ibm.com>
- * Thomas Klein <tklein@de.ibm.com>
- */
-
-#ifndef __EHEA_QMR_H__
-#define __EHEA_QMR_H__
-
-#include <linux/prefetch.h>
-#include "ehea.h"
-#include "ehea_hw.h"
-
-/*
- * page size of ehea hardware queues
- */
-
-#define EHEA_PAGESHIFT 12
-#define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT)
-#define EHEA_SECTSIZE (1UL << 24)
-#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT)
-#define EHEA_HUGEPAGESHIFT 34
-#define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT)
-#define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT)
-
-#if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE)
-#error eHEA module cannot work if kernel sectionsize < ehea sectionsize
-#endif
-
-/* Some abbreviations used here:
- *
- * WQE - Work Queue Entry
- * SWQE - Send Work Queue Entry
- * RWQE - Receive Work Queue Entry
- * CQE - Completion Queue Entry
- * EQE - Event Queue Entry
- * MR - Memory Region
- */
-
-/* Use of WR_ID field for EHEA */
-#define EHEA_WR_ID_COUNT EHEA_BMASK_IBM(0, 19)
-#define EHEA_WR_ID_TYPE EHEA_BMASK_IBM(20, 23)
-#define EHEA_SWQE2_TYPE 0x1
-#define EHEA_SWQE3_TYPE 0x2
-#define EHEA_RWQE2_TYPE 0x3
-#define EHEA_RWQE3_TYPE 0x4
-#define EHEA_WR_ID_INDEX EHEA_BMASK_IBM(24, 47)
-#define EHEA_WR_ID_REFILL EHEA_BMASK_IBM(48, 63)
-
-struct ehea_vsgentry {
- u64 vaddr;
- u32 l_key;
- u32 len;
-};
-
-/* maximum number of sg entries allowed in a WQE */
-#define EHEA_MAX_WQE_SG_ENTRIES 252
-#define SWQE2_MAX_IMM (0xD0 - 0x30)
-#define SWQE3_MAX_IMM 224
-
-/* tx control flags for swqe */
-#define EHEA_SWQE_CRC 0x8000
-#define EHEA_SWQE_IP_CHECKSUM 0x4000
-#define EHEA_SWQE_TCP_CHECKSUM 0x2000
-#define EHEA_SWQE_TSO 0x1000
-#define EHEA_SWQE_SIGNALLED_COMPLETION 0x0800
-#define EHEA_SWQE_VLAN_INSERT 0x0400
-#define EHEA_SWQE_IMM_DATA_PRESENT 0x0200
-#define EHEA_SWQE_DESCRIPTORS_PRESENT 0x0100
-#define EHEA_SWQE_WRAP_CTL_REC 0x0080
-#define EHEA_SWQE_WRAP_CTL_FORCE 0x0040
-#define EHEA_SWQE_BIND 0x0020
-#define EHEA_SWQE_PURGE 0x0010
-
-/* sizeof(struct ehea_swqe) less the union */
-#define SWQE_HEADER_SIZE 32
-
-struct ehea_swqe {
- u64 wr_id;
- u16 tx_control;
- u16 vlan_tag;
- u8 reserved1;
- u8 ip_start;
- u8 ip_end;
- u8 immediate_data_length;
- u8 tcp_offset;
- u8 reserved2;
- u16 reserved2b;
- u8 wrap_tag;
- u8 descriptors; /* number of valid descriptors in WQE */
- u16 reserved3;
- u16 reserved4;
- u16 mss;
- u32 reserved5;
- union {
- /* Send WQE Format 1 */
- struct {
- struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES];
- } no_immediate_data;
-
- /* Send WQE Format 2 */
- struct {
- struct ehea_vsgentry sg_entry;
- /* 0x30 */
- u8 immediate_data[SWQE2_MAX_IMM];
- /* 0xd0 */
- struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES-1];
- } immdata_desc __packed;
-
- /* Send WQE Format 3 */
- struct {
- u8 immediate_data[SWQE3_MAX_IMM];
- } immdata_nodesc;
- } u;
-};
-
-struct ehea_rwqe {
- u64 wr_id; /* work request ID */
- u8 reserved1[5];
- u8 data_segments;
- u16 reserved2;
- u64 reserved3;
- u64 reserved4;
- struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES];
-};
-
-#define EHEA_CQE_VLAN_TAG_XTRACT 0x0400
-
-#define EHEA_CQE_TYPE_RQ 0x60
-#define EHEA_CQE_STAT_ERR_MASK 0x700F
-#define EHEA_CQE_STAT_FAT_ERR_MASK 0xF
-#define EHEA_CQE_BLIND_CKSUM 0x8000
-#define EHEA_CQE_STAT_ERR_TCP 0x4000
-#define EHEA_CQE_STAT_ERR_IP 0x2000
-#define EHEA_CQE_STAT_ERR_CRC 0x1000
-
-/* Defines which bad send cqe stati lead to a port reset */
-#define EHEA_CQE_STAT_RESET_MASK 0x0002
-
-struct ehea_cqe {
- u64 wr_id; /* work request ID from WQE */
- u8 type;
- u8 valid;
- u16 status;
- u16 reserved1;
- u16 num_bytes_transfered;
- u16 vlan_tag;
- u16 inet_checksum_value;
- u8 reserved2;
- u8 header_length;
- u16 reserved3;
- u16 page_offset;
- u16 wqe_count;
- u32 qp_token;
- u32 timestamp;
- u32 reserved4;
- u64 reserved5[3];
-};
-
-#define EHEA_EQE_VALID EHEA_BMASK_IBM(0, 0)
-#define EHEA_EQE_IS_CQE EHEA_BMASK_IBM(1, 1)
-#define EHEA_EQE_IDENTIFIER EHEA_BMASK_IBM(2, 7)
-#define EHEA_EQE_QP_CQ_NUMBER EHEA_BMASK_IBM(8, 31)
-#define EHEA_EQE_QP_TOKEN EHEA_BMASK_IBM(32, 63)
-#define EHEA_EQE_CQ_TOKEN EHEA_BMASK_IBM(32, 63)
-#define EHEA_EQE_KEY EHEA_BMASK_IBM(32, 63)
-#define EHEA_EQE_PORT_NUMBER EHEA_BMASK_IBM(56, 63)
-#define EHEA_EQE_EQ_NUMBER EHEA_BMASK_IBM(48, 63)
-#define EHEA_EQE_SM_ID EHEA_BMASK_IBM(48, 63)
-#define EHEA_EQE_SM_MECH_NUMBER EHEA_BMASK_IBM(48, 55)
-#define EHEA_EQE_SM_PORT_NUMBER EHEA_BMASK_IBM(56, 63)
-
-#define EHEA_AER_RESTYPE_QP 0x8
-#define EHEA_AER_RESTYPE_CQ 0x4
-#define EHEA_AER_RESTYPE_EQ 0x3
-
-/* Defines which affiliated errors lead to a port reset */
-#define EHEA_AER_RESET_MASK 0xFFFFFFFFFEFFFFFFULL
-#define EHEA_AERR_RESET_MASK 0xFFFFFFFFFFFFFFFFULL
-
-struct ehea_eqe {
- u64 entry;
-};
-
-#define ERROR_DATA_LENGTH EHEA_BMASK_IBM(52, 63)
-#define ERROR_DATA_TYPE EHEA_BMASK_IBM(0, 7)
-
-static inline void *hw_qeit_calc(struct hw_queue *queue, u64 q_offset)
-{
- struct ehea_page *current_page;
-
- if (q_offset >= queue->queue_length)
- q_offset -= queue->queue_length;
- current_page = (queue->queue_pages)[q_offset >> EHEA_PAGESHIFT];
- return ¤t_page->entries[q_offset & (EHEA_PAGESIZE - 1)];
-}
-
-static inline void *hw_qeit_get(struct hw_queue *queue)
-{
- return hw_qeit_calc(queue, queue->current_q_offset);
-}
-
-static inline void hw_qeit_inc(struct hw_queue *queue)
-{
- queue->current_q_offset += queue->qe_size;
- if (queue->current_q_offset >= queue->queue_length) {
- queue->current_q_offset = 0;
- /* toggle the valid flag */
- queue->toggle_state = (~queue->toggle_state) & 1;
- }
-}
-
-static inline void *hw_qeit_get_inc(struct hw_queue *queue)
-{
- void *retvalue = hw_qeit_get(queue);
- hw_qeit_inc(queue);
- return retvalue;
-}
-
-static inline void *hw_qeit_get_inc_valid(struct hw_queue *queue)
-{
- struct ehea_cqe *retvalue = hw_qeit_get(queue);
- u8 valid = retvalue->valid;
- void *pref;
-
- if ((valid >> 7) == (queue->toggle_state & 1)) {
- /* this is a good one */
- hw_qeit_inc(queue);
- pref = hw_qeit_calc(queue, queue->current_q_offset);
- prefetch(pref);
- prefetch(pref + 128);
- } else
- retvalue = NULL;
- return retvalue;
-}
-
-static inline void *hw_qeit_get_valid(struct hw_queue *queue)
-{
- struct ehea_cqe *retvalue = hw_qeit_get(queue);
- void *pref;
- u8 valid;
-
- pref = hw_qeit_calc(queue, queue->current_q_offset);
- prefetch(pref);
- prefetch(pref + 128);
- prefetch(pref + 256);
- valid = retvalue->valid;
- if (!((valid >> 7) == (queue->toggle_state & 1)))
- retvalue = NULL;
- return retvalue;
-}
-
-static inline void *hw_qeit_reset(struct hw_queue *queue)
-{
- queue->current_q_offset = 0;
- return hw_qeit_get(queue);
-}
-
-static inline void *hw_qeit_eq_get_inc(struct hw_queue *queue)
-{
- u64 last_entry_in_q = queue->queue_length - queue->qe_size;
- void *retvalue;
-
- retvalue = hw_qeit_get(queue);
- queue->current_q_offset += queue->qe_size;
- if (queue->current_q_offset > last_entry_in_q) {
- queue->current_q_offset = 0;
- queue->toggle_state = (~queue->toggle_state) & 1;
- }
- return retvalue;
-}
-
-static inline void *hw_eqit_eq_get_inc_valid(struct hw_queue *queue)
-{
- void *retvalue = hw_qeit_get(queue);
- u32 qe = *(u8 *)retvalue;
- if ((qe >> 7) == (queue->toggle_state & 1))
- hw_qeit_eq_get_inc(queue);
- else
- retvalue = NULL;
- return retvalue;
-}
-
-static inline struct ehea_rwqe *ehea_get_next_rwqe(struct ehea_qp *qp,
- int rq_nr)
-{
- struct hw_queue *queue;
-
- if (rq_nr == 1)
- queue = &qp->hw_rqueue1;
- else if (rq_nr == 2)
- queue = &qp->hw_rqueue2;
- else
- queue = &qp->hw_rqueue3;
-
- return hw_qeit_get_inc(queue);
-}
-
-static inline struct ehea_swqe *ehea_get_swqe(struct ehea_qp *my_qp,
- int *wqe_index)
-{
- struct hw_queue *queue = &my_qp->hw_squeue;
- struct ehea_swqe *wqe_p;
-
- *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_SQ);
- wqe_p = hw_qeit_get_inc(&my_qp->hw_squeue);
-
- return wqe_p;
-}
-
-static inline void ehea_post_swqe(struct ehea_qp *my_qp, struct ehea_swqe *swqe)
-{
- iosync();
- ehea_update_sqa(my_qp, 1);
-}
-
-static inline struct ehea_cqe *ehea_poll_rq1(struct ehea_qp *qp, int *wqe_index)
-{
- struct hw_queue *queue = &qp->hw_rqueue1;
-
- *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_RQ1);
- return hw_qeit_get_valid(queue);
-}
-
-static inline void ehea_inc_cq(struct ehea_cq *cq)
-{
- hw_qeit_inc(&cq->hw_queue);
-}
-
-static inline void ehea_inc_rq1(struct ehea_qp *qp)
-{
- hw_qeit_inc(&qp->hw_rqueue1);
-}
-
-static inline struct ehea_cqe *ehea_poll_cq(struct ehea_cq *my_cq)
-{
- return hw_qeit_get_valid(&my_cq->hw_queue);
-}
-
-#define EHEA_CQ_REGISTER_ORIG 0
-#define EHEA_EQ_REGISTER_ORIG 0
-
-enum ehea_eq_type {
- EHEA_EQ = 0, /* event queue */
- EHEA_NEQ /* notification event queue */
-};
-
-struct ehea_eq *ehea_create_eq(struct ehea_adapter *adapter,
- enum ehea_eq_type type,
- const u32 length, const u8 eqe_gen);
-
-int ehea_destroy_eq(struct ehea_eq *eq);
-
-struct ehea_eqe *ehea_poll_eq(struct ehea_eq *eq);
-
-struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter, int cqe,
- u64 eq_handle, u32 cq_token);
-
-int ehea_destroy_cq(struct ehea_cq *cq);
-
-struct ehea_qp *ehea_create_qp(struct ehea_adapter *adapter, u32 pd,
- struct ehea_qp_init_attr *init_attr);
-
-int ehea_destroy_qp(struct ehea_qp *qp);
-
-int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr);
-
-int ehea_gen_smr(struct ehea_adapter *adapter, struct ehea_mr *old_mr,
- struct ehea_mr *shared_mr);
-
-int ehea_rem_mr(struct ehea_mr *mr);
-
-u64 ehea_error_data(struct ehea_adapter *adapter, u64 res_handle,
- u64 *aer, u64 *aerr);
-
-int ehea_add_sect_bmap(unsigned long pfn, unsigned long nr_pages);
-int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages);
-int ehea_create_busmap(void);
-void ehea_destroy_busmap(void);
-u64 ehea_map_vaddr(void *caddr);
-
-#endif /* __EHEA_QMR_H__ */
--
2.47.3
^ permalink raw reply related
* Re: [PATCH v2 09/19] net: bcmgenet: use platform_device_set_of_node()
From: Jakub Kicinski @ 2026-06-29 23:15 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Lee Jones, Mark Brown, Thierry Reding, Sebastian Hesselbarth,
Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Rafael J. Wysocki, Danilo Krummrich, Rob Herring, Saravana Kannan,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andi Shyti, Andy Shevchenko,
Joerg Roedel, Will Deacon, Robin Murphy, Doug Berger,
Florian Fainelli, Broadcom internal kernel review list,
Ulf Hansson, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Matthew Brost, Thomas Hellström, Rodrigo Vivi,
David Airlie, Simona Vetter, Peter Chen, Paul Cercueil, Bin Liu,
Philipp Zabel, Maximilian Luz, Hans de Goede, Ilpo Järvinen,
Krzysztof Kozlowski, Benjamin Herrenschmidt, brgl, linux-kernel,
netdev, linux-arm-msm, linux-sound, driver-core, devicetree,
linuxppc-dev, linux-i2c, iommu, linux-pm, imx, linux-arm-kernel,
intel-xe, dri-devel, linux-usb, linux-mips, platform-driver-x86
In-Reply-To: <20260629-pdev-fwnode-ref-v2-9-8abe2513f96e@oss.qualcomm.com>
On Mon, 29 Jun 2026 11:12:32 +0200 Bartosz Golaszewski wrote:
> + if (dn) {
> + struct device_node *np __free(device_node) = bcmgenet_mii_of_find_mdio(priv);
> +
> + platform_device_set_of_node(ppdev, np);
> + } else {
Please don't blindly use __free() in cases where it's clearly
unnecessary.
^ permalink raw reply
* Re: [PATCH v2 13/19] net: mv643xx: use platform_device_set_of_node()
From: Jakub Kicinski @ 2026-06-29 23:16 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Lee Jones, Mark Brown, Thierry Reding, Sebastian Hesselbarth,
Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
Srinivas Kandagatla, Greg Kroah-Hartman, Vinod Koul,
Rafael J. Wysocki, Danilo Krummrich, Rob Herring, Saravana Kannan,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andi Shyti, Andy Shevchenko,
Joerg Roedel, Will Deacon, Robin Murphy, Doug Berger,
Florian Fainelli, Broadcom internal kernel review list,
Ulf Hansson, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Matthew Brost, Thomas Hellström, Rodrigo Vivi,
David Airlie, Simona Vetter, Peter Chen, Paul Cercueil, Bin Liu,
Philipp Zabel, Maximilian Luz, Hans de Goede, Ilpo Järvinen,
Krzysztof Kozlowski, Benjamin Herrenschmidt, brgl, linux-kernel,
netdev, linux-arm-msm, linux-sound, driver-core, devicetree,
linuxppc-dev, linux-i2c, iommu, linux-pm, imx, linux-arm-kernel,
intel-xe, dri-devel, linux-usb, linux-mips, platform-driver-x86
In-Reply-To: <20260629-pdev-fwnode-ref-v2-13-8abe2513f96e@oss.qualcomm.com>
On Mon, 29 Jun 2026 11:12:36 +0200 Bartosz Golaszewski wrote:
> Ahead of reworking the reference counting logic for platform devices,
> encapsulate the assignment of the OF node for dynamically allocated
> platform devices with the provided helper.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
^ permalink raw reply
* Re: [PATCH net-next 1/2] ehea: remove the ehea driver
From: Christophe Leroy (CS GROUP) @ 2026-06-30 5:42 UTC (permalink / raw)
To: David Christensen, David S . Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Michael Ellerman, Nicholas Piggin
Cc: netdev, linuxppc-dev, linux-kernel
In-Reply-To: <20260629211343.3712775-2-drc@linux.ibm.com>
Le 29/06/2026 à 23:13, David Christensen a écrit :
> [Vous ne recevez pas souvent de courriers de drc@linux.ibm.com. Découvrez pourquoi ceci est important à https://aka.ms/LearnAboutSenderIdentification ]
>
> The IBM eHEA (Ethernet Host Ethernet Adapter) driver has been orphaned
> since April 2024 with no active maintainer. The hardware was last
> supported on IBM POWER7 systems which reached end-of-support in
> December 2020. The driver has received no functional updates since
> October 2022, with all subsequent changes being mechanical API
> migrations affecting the entire kernel tree.
>
> A search of lore.kernel.org for the last 24 months reveals no user
> reports, no objections to the orphan status, and no maintenance
> discussions indicating active hardware deployment.
>
> The code is preserved in git history and can be restored if a
> maintainer steps forward to take ownership.
>
> Signed-off-by: David Christensen <drc@linux.ibm.com>
Reviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
> ---
> MAINTAINERS | 5 -
> drivers/net/ethernet/ibm/Kconfig | 9 -
> drivers/net/ethernet/ibm/Makefile | 1 -
> drivers/net/ethernet/ibm/ehea/Makefile | 7 -
> drivers/net/ethernet/ibm/ehea/ehea.h | 477 ---
> drivers/net/ethernet/ibm/ehea/ehea_ethtool.c | 277 --
> drivers/net/ethernet/ibm/ehea/ehea_hw.h | 253 --
> drivers/net/ethernet/ibm/ehea/ehea_main.c | 3581 ------------------
> drivers/net/ethernet/ibm/ehea/ehea_phyp.c | 612 ---
> drivers/net/ethernet/ibm/ehea/ehea_phyp.h | 433 ---
> drivers/net/ethernet/ibm/ehea/ehea_qmr.c | 999 -----
> drivers/net/ethernet/ibm/ehea/ehea_qmr.h | 390 --
> 12 files changed, 7044 deletions(-)
> delete mode 100644 drivers/net/ethernet/ibm/ehea/Makefile
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea.h
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_hw.h
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_main.c
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_phyp.c
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_phyp.h
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_qmr.c
> delete mode 100644 drivers/net/ethernet/ibm/ehea/ehea_qmr.h
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 15011f5752a9..ee4ee7b8e947 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -9498,11 +9498,6 @@ S: Orphan
> W: http://aeschi.ch.eu.org/efs/
> F: fs/efs/
>
> -EHEA (IBM pSeries eHEA 10Gb ethernet adapter) DRIVER
> -L: netdev@vger.kernel.org
> -S: Orphan
> -F: drivers/net/ethernet/ibm/ehea/
> -
> ELM327 CAN NETWORK DRIVER
> M: Max Staudt <max@enpas.org>
> L: linux-can@vger.kernel.org
> diff --git a/drivers/net/ethernet/ibm/Kconfig b/drivers/net/ethernet/ibm/Kconfig
> index 4f4b23465c47..8e55faac2035 100644
> --- a/drivers/net/ethernet/ibm/Kconfig
> +++ b/drivers/net/ethernet/ibm/Kconfig
> @@ -42,15 +42,6 @@ config IBMVETH_KUNIT_TEST
>
> source "drivers/net/ethernet/ibm/emac/Kconfig"
>
> -config EHEA
> - tristate "eHEA Ethernet support"
> - depends on IBMEBUS && SPARSEMEM
> - help
> - This driver supports the IBM pSeries eHEA ethernet adapter.
> -
> - To compile the driver as a module, choose M here. The module
> - will be called ehea.
> -
> config IBMVNIC
> tristate "IBM Virtual NIC support"
> depends on PPC_PSERIES
> diff --git a/drivers/net/ethernet/ibm/Makefile b/drivers/net/ethernet/ibm/Makefile
> index 1d17d0c33d4d..c7e5d891c946 100644
> --- a/drivers/net/ethernet/ibm/Makefile
> +++ b/drivers/net/ethernet/ibm/Makefile
> @@ -6,4 +6,3 @@
> obj-$(CONFIG_IBMVETH) += ibmveth.o
> obj-$(CONFIG_IBMVNIC) += ibmvnic.o
> obj-$(CONFIG_IBM_EMAC) += emac/
> -obj-$(CONFIG_EHEA) += ehea/
> diff --git a/drivers/net/ethernet/ibm/ehea/Makefile b/drivers/net/ethernet/ibm/ehea/Makefile
> deleted file mode 100644
> index 9e1e5c7aafe2..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/Makefile
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0-only
> -#
> -# Makefile for the eHEA ethernet device driver for IBM eServer System p
> -#
> -ehea-y = ehea_main.o ehea_phyp.o ehea_qmr.o ehea_ethtool.o
> -obj-$(CONFIG_EHEA) += ehea.o
> -
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea.h b/drivers/net/ethernet/ibm/ehea/ehea.h
> deleted file mode 100644
> index 208c440a602b..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea.h
> +++ /dev/null
> @@ -1,477 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea.h
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#ifndef __EHEA_H__
> -#define __EHEA_H__
> -
> -#include <linux/module.h>
> -#include <linux/ethtool.h>
> -#include <linux/vmalloc.h>
> -#include <linux/if_vlan.h>
> -#include <linux/platform_device.h>
> -
> -#include <asm/ibmebus.h>
> -#include <asm/io.h>
> -
> -#define DRV_NAME "ehea"
> -#define DRV_VERSION "EHEA_0107"
> -
> -/* eHEA capability flags */
> -#define DLPAR_PORT_ADD_REM 1
> -#define DLPAR_MEM_ADD 2
> -#define DLPAR_MEM_REM 4
> -#define EHEA_CAPABILITIES (DLPAR_PORT_ADD_REM | DLPAR_MEM_ADD | DLPAR_MEM_REM)
> -
> -#define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
> - | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
> -
> -#define EHEA_MAX_ENTRIES_RQ1 32767
> -#define EHEA_MAX_ENTRIES_RQ2 16383
> -#define EHEA_MAX_ENTRIES_RQ3 16383
> -#define EHEA_MAX_ENTRIES_SQ 32767
> -#define EHEA_MIN_ENTRIES_QP 127
> -
> -#define EHEA_SMALL_QUEUES
> -
> -#ifdef EHEA_SMALL_QUEUES
> -#define EHEA_MAX_CQE_COUNT 1023
> -#define EHEA_DEF_ENTRIES_SQ 1023
> -#define EHEA_DEF_ENTRIES_RQ1 1023
> -#define EHEA_DEF_ENTRIES_RQ2 1023
> -#define EHEA_DEF_ENTRIES_RQ3 511
> -#else
> -#define EHEA_MAX_CQE_COUNT 4080
> -#define EHEA_DEF_ENTRIES_SQ 4080
> -#define EHEA_DEF_ENTRIES_RQ1 8160
> -#define EHEA_DEF_ENTRIES_RQ2 2040
> -#define EHEA_DEF_ENTRIES_RQ3 2040
> -#endif
> -
> -#define EHEA_MAX_ENTRIES_EQ 20
> -
> -#define EHEA_SG_SQ 2
> -#define EHEA_SG_RQ1 1
> -#define EHEA_SG_RQ2 0
> -#define EHEA_SG_RQ3 0
> -
> -#define EHEA_MAX_PACKET_SIZE 9022 /* for jumbo frames */
> -#define EHEA_RQ2_PKT_SIZE 2048
> -#define EHEA_L_PKT_SIZE 256 /* low latency */
> -
> -/* Send completion signaling */
> -
> -/* Protection Domain Identifier */
> -#define EHEA_PD_ID 0xaabcdeff
> -
> -#define EHEA_RQ2_THRESHOLD 1
> -#define EHEA_RQ3_THRESHOLD 4 /* use RQ3 threshold of 2048 bytes */
> -
> -#define EHEA_SPEED_10G 10000
> -#define EHEA_SPEED_1G 1000
> -#define EHEA_SPEED_100M 100
> -#define EHEA_SPEED_10M 10
> -#define EHEA_SPEED_AUTONEG 0
> -
> -/* Broadcast/Multicast registration types */
> -#define EHEA_BCMC_SCOPE_ALL 0x08
> -#define EHEA_BCMC_SCOPE_SINGLE 0x00
> -#define EHEA_BCMC_MULTICAST 0x04
> -#define EHEA_BCMC_BROADCAST 0x00
> -#define EHEA_BCMC_UNTAGGED 0x02
> -#define EHEA_BCMC_TAGGED 0x00
> -#define EHEA_BCMC_VLANID_ALL 0x01
> -#define EHEA_BCMC_VLANID_SINGLE 0x00
> -
> -#define EHEA_CACHE_LINE 128
> -
> -/* Memory Regions */
> -#define EHEA_MR_ACC_CTRL 0x00800000
> -
> -#define EHEA_BUSMAP_START 0x8000000000000000ULL
> -#define EHEA_INVAL_ADDR 0xFFFFFFFFFFFFFFFFULL
> -#define EHEA_DIR_INDEX_SHIFT 13 /* 8k Entries in 64k block */
> -#define EHEA_TOP_INDEX_SHIFT (EHEA_DIR_INDEX_SHIFT * 2)
> -#define EHEA_MAP_ENTRIES (1 << EHEA_DIR_INDEX_SHIFT)
> -#define EHEA_MAP_SIZE (0x10000) /* currently fixed map size */
> -#define EHEA_INDEX_MASK (EHEA_MAP_ENTRIES - 1)
> -
> -
> -#define EHEA_WATCH_DOG_TIMEOUT 10*HZ
> -
> -/* utility functions */
> -
> -void ehea_dump(void *adr, int len, char *msg);
> -
> -#define EHEA_BMASK(pos, length) (((pos) << 16) + (length))
> -
> -#define EHEA_BMASK_IBM(from, to) (((63 - to) << 16) + ((to) - (from) + 1))
> -
> -#define EHEA_BMASK_SHIFTPOS(mask) (((mask) >> 16) & 0xffff)
> -
> -#define EHEA_BMASK_MASK(mask) \
> - (0xffffffffffffffffULL >> ((64 - (mask)) & 0xffff))
> -
> -#define EHEA_BMASK_SET(mask, value) \
> - ((EHEA_BMASK_MASK(mask) & ((u64)(value))) << EHEA_BMASK_SHIFTPOS(mask))
> -
> -#define EHEA_BMASK_GET(mask, value) \
> - (EHEA_BMASK_MASK(mask) & (((u64)(value)) >> EHEA_BMASK_SHIFTPOS(mask)))
> -
> -/*
> - * Generic ehea page
> - */
> -struct ehea_page {
> - u8 entries[PAGE_SIZE];
> -};
> -
> -/*
> - * Generic queue in linux kernel virtual memory
> - */
> -struct hw_queue {
> - u64 current_q_offset; /* current queue entry */
> - struct ehea_page **queue_pages; /* array of pages belonging to queue */
> - u32 qe_size; /* queue entry size */
> - u32 queue_length; /* queue length allocated in bytes */
> - u32 pagesize;
> - u32 toggle_state; /* toggle flag - per page */
> - u32 reserved; /* 64 bit alignment */
> -};
> -
> -/*
> - * For pSeries this is a 64bit memory address where
> - * I/O memory is mapped into CPU address space
> - */
> -struct h_epa {
> - void __iomem *addr;
> -};
> -
> -struct h_epa_user {
> - u64 addr;
> -};
> -
> -struct h_epas {
> - struct h_epa kernel; /* kernel space accessible resource,
> - set to 0 if unused */
> - struct h_epa_user user; /* user space accessible resource
> - set to 0 if unused */
> -};
> -
> -/*
> - * Memory map data structures
> - */
> -struct ehea_dir_bmap
> -{
> - u64 ent[EHEA_MAP_ENTRIES];
> -};
> -struct ehea_top_bmap
> -{
> - struct ehea_dir_bmap *dir[EHEA_MAP_ENTRIES];
> -};
> -struct ehea_bmap
> -{
> - struct ehea_top_bmap *top[EHEA_MAP_ENTRIES];
> -};
> -
> -struct ehea_qp;
> -struct ehea_cq;
> -struct ehea_eq;
> -struct ehea_port;
> -struct ehea_av;
> -
> -/*
> - * Queue attributes passed to ehea_create_qp()
> - */
> -struct ehea_qp_init_attr {
> - /* input parameter */
> - u32 qp_token; /* queue token */
> - u8 low_lat_rq1;
> - u8 signalingtype; /* cqe generation flag */
> - u8 rq_count; /* num of receive queues */
> - u8 eqe_gen; /* eqe generation flag */
> - u16 max_nr_send_wqes; /* max number of send wqes */
> - u16 max_nr_rwqes_rq1; /* max number of receive wqes */
> - u16 max_nr_rwqes_rq2;
> - u16 max_nr_rwqes_rq3;
> - u8 wqe_size_enc_sq;
> - u8 wqe_size_enc_rq1;
> - u8 wqe_size_enc_rq2;
> - u8 wqe_size_enc_rq3;
> - u8 swqe_imm_data_len; /* immediate data length for swqes */
> - u16 port_nr;
> - u16 rq2_threshold;
> - u16 rq3_threshold;
> - u64 send_cq_handle;
> - u64 recv_cq_handle;
> - u64 aff_eq_handle;
> -
> - /* output parameter */
> - u32 qp_nr;
> - u16 act_nr_send_wqes;
> - u16 act_nr_rwqes_rq1;
> - u16 act_nr_rwqes_rq2;
> - u16 act_nr_rwqes_rq3;
> - u8 act_wqe_size_enc_sq;
> - u8 act_wqe_size_enc_rq1;
> - u8 act_wqe_size_enc_rq2;
> - u8 act_wqe_size_enc_rq3;
> - u32 nr_sq_pages;
> - u32 nr_rq1_pages;
> - u32 nr_rq2_pages;
> - u32 nr_rq3_pages;
> - u32 liobn_sq;
> - u32 liobn_rq1;
> - u32 liobn_rq2;
> - u32 liobn_rq3;
> -};
> -
> -/*
> - * Event Queue attributes, passed as parameter
> - */
> -struct ehea_eq_attr {
> - u32 type;
> - u32 max_nr_of_eqes;
> - u8 eqe_gen; /* generate eqe flag */
> - u64 eq_handle;
> - u32 act_nr_of_eqes;
> - u32 nr_pages;
> - u32 ist1; /* Interrupt service token */
> - u32 ist2;
> - u32 ist3;
> - u32 ist4;
> -};
> -
> -
> -/*
> - * Event Queue
> - */
> -struct ehea_eq {
> - struct ehea_adapter *adapter;
> - struct hw_queue hw_queue;
> - u64 fw_handle;
> - struct h_epas epas;
> - spinlock_t spinlock;
> - struct ehea_eq_attr attr;
> -};
> -
> -/*
> - * HEA Queues
> - */
> -struct ehea_qp {
> - struct ehea_adapter *adapter;
> - u64 fw_handle; /* QP handle for firmware calls */
> - struct hw_queue hw_squeue;
> - struct hw_queue hw_rqueue1;
> - struct hw_queue hw_rqueue2;
> - struct hw_queue hw_rqueue3;
> - struct h_epas epas;
> - struct ehea_qp_init_attr init_attr;
> -};
> -
> -/*
> - * Completion Queue attributes
> - */
> -struct ehea_cq_attr {
> - /* input parameter */
> - u32 max_nr_of_cqes;
> - u32 cq_token;
> - u64 eq_handle;
> -
> - /* output parameter */
> - u32 act_nr_of_cqes;
> - u32 nr_pages;
> -};
> -
> -/*
> - * Completion Queue
> - */
> -struct ehea_cq {
> - struct ehea_adapter *adapter;
> - u64 fw_handle;
> - struct hw_queue hw_queue;
> - struct h_epas epas;
> - struct ehea_cq_attr attr;
> -};
> -
> -/*
> - * Memory Region
> - */
> -struct ehea_mr {
> - struct ehea_adapter *adapter;
> - u64 handle;
> - u64 vaddr;
> - u32 lkey;
> -};
> -
> -/*
> - * Port state information
> - */
> -struct port_stats {
> - int poll_receive_errors;
> - int queue_stopped;
> - int err_tcp_cksum;
> - int err_ip_cksum;
> - int err_frame_crc;
> -};
> -
> -#define EHEA_IRQ_NAME_SIZE 20
> -
> -/*
> - * Queue SKB Array
> - */
> -struct ehea_q_skb_arr {
> - struct sk_buff **arr; /* skb array for queue */
> - int len; /* array length */
> - int index; /* array index */
> - int os_skbs; /* rq2/rq3 only: outstanding skbs */
> -};
> -
> -/*
> - * Port resources
> - */
> -struct ehea_port_res {
> - struct napi_struct napi;
> - struct port_stats p_stats;
> - struct ehea_mr send_mr; /* send memory region */
> - struct ehea_mr recv_mr; /* receive memory region */
> - struct ehea_port *port;
> - char int_recv_name[EHEA_IRQ_NAME_SIZE];
> - char int_send_name[EHEA_IRQ_NAME_SIZE];
> - struct ehea_qp *qp;
> - struct ehea_cq *send_cq;
> - struct ehea_cq *recv_cq;
> - struct ehea_eq *eq;
> - struct ehea_q_skb_arr rq1_skba;
> - struct ehea_q_skb_arr rq2_skba;
> - struct ehea_q_skb_arr rq3_skba;
> - struct ehea_q_skb_arr sq_skba;
> - int sq_skba_size;
> - int swqe_refill_th;
> - atomic_t swqe_avail;
> - int swqe_ll_count;
> - u32 swqe_id_counter;
> - u64 tx_packets;
> - u64 tx_bytes;
> - u64 rx_packets;
> - u64 rx_bytes;
> - int sq_restart_flag;
> -};
> -
> -
> -#define EHEA_MAX_PORTS 16
> -
> -#define EHEA_NUM_PORTRES_FW_HANDLES 6 /* QP handle, SendCQ handle,
> - RecvCQ handle, EQ handle,
> - SendMR handle, RecvMR handle */
> -#define EHEA_NUM_PORT_FW_HANDLES 1 /* EQ handle */
> -#define EHEA_NUM_ADAPTER_FW_HANDLES 2 /* MR handle, NEQ handle */
> -
> -struct ehea_adapter {
> - u64 handle;
> - struct platform_device *ofdev;
> - struct ehea_port *port[EHEA_MAX_PORTS];
> - struct ehea_eq *neq; /* notification event queue */
> - struct tasklet_struct neq_tasklet;
> - struct ehea_mr mr;
> - u32 pd; /* protection domain */
> - u64 max_mc_mac; /* max number of multicast mac addresses */
> - int active_ports;
> - struct list_head list;
> -};
> -
> -
> -struct ehea_mc_list {
> - struct list_head list;
> - u64 macaddr;
> -};
> -
> -/* kdump support */
> -struct ehea_fw_handle_entry {
> - u64 adh; /* Adapter Handle */
> - u64 fwh; /* Firmware Handle */
> -};
> -
> -struct ehea_fw_handle_array {
> - struct ehea_fw_handle_entry *arr;
> - int num_entries;
> - struct mutex lock;
> -};
> -
> -struct ehea_bcmc_reg_entry {
> - u64 adh; /* Adapter Handle */
> - u32 port_id; /* Logical Port Id */
> - u8 reg_type; /* Registration Type */
> - u64 macaddr;
> -};
> -
> -struct ehea_bcmc_reg_array {
> - struct ehea_bcmc_reg_entry *arr;
> - int num_entries;
> - spinlock_t lock;
> -};
> -
> -#define EHEA_PORT_UP 1
> -#define EHEA_PORT_DOWN 0
> -#define EHEA_PHY_LINK_UP 1
> -#define EHEA_PHY_LINK_DOWN 0
> -#define EHEA_MAX_PORT_RES 16
> -struct ehea_port {
> - struct ehea_adapter *adapter; /* adapter that owns this port */
> - struct net_device *netdev;
> - struct rtnl_link_stats64 stats;
> - struct ehea_port_res port_res[EHEA_MAX_PORT_RES];
> - struct platform_device ofdev; /* Open Firmware Device */
> - struct ehea_mc_list *mc_list; /* Multicast MAC addresses */
> - struct ehea_eq *qp_eq;
> - struct work_struct reset_task;
> - struct delayed_work stats_work;
> - struct mutex port_lock;
> - char int_aff_name[EHEA_IRQ_NAME_SIZE];
> - int allmulti; /* Indicates IFF_ALLMULTI state */
> - int promisc; /* Indicates IFF_PROMISC state */
> - int num_mcs;
> - int resets;
> - unsigned long flags;
> - u64 mac_addr;
> - u32 logical_port_id;
> - u32 port_speed;
> - u32 msg_enable;
> - u32 sig_comp_iv;
> - u32 state;
> - u8 phy_link;
> - u8 full_duplex;
> - u8 autoneg;
> - u8 num_def_qps;
> - wait_queue_head_t swqe_avail_wq;
> - wait_queue_head_t restart_wq;
> -};
> -
> -struct port_res_cfg {
> - int max_entries_rcq;
> - int max_entries_scq;
> - int max_entries_sq;
> - int max_entries_rq1;
> - int max_entries_rq2;
> - int max_entries_rq3;
> -};
> -
> -enum ehea_flag_bits {
> - __EHEA_STOP_XFER,
> - __EHEA_DISABLE_PORT_RESET
> -};
> -
> -void ehea_set_ethtool_ops(struct net_device *netdev);
> -int ehea_sense_port_attr(struct ehea_port *port);
> -int ehea_set_portspeed(struct ehea_port *port, u32 port_speed);
> -
> -#endif /* __EHEA_H__ */
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c b/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> deleted file mode 100644
> index 1db5b6790a41..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> +++ /dev/null
> @@ -1,277 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_ethtool.c
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include "ehea.h"
> -#include "ehea_phyp.h"
> -
> -static int ehea_get_link_ksettings(struct net_device *dev,
> - struct ethtool_link_ksettings *cmd)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - u32 supported, advertising;
> - u32 speed;
> - int ret;
> -
> - ret = ehea_sense_port_attr(port);
> -
> - if (ret)
> - return ret;
> -
> - if (netif_carrier_ok(dev)) {
> - switch (port->port_speed) {
> - case EHEA_SPEED_10M:
> - speed = SPEED_10;
> - break;
> - case EHEA_SPEED_100M:
> - speed = SPEED_100;
> - break;
> - case EHEA_SPEED_1G:
> - speed = SPEED_1000;
> - break;
> - case EHEA_SPEED_10G:
> - speed = SPEED_10000;
> - break;
> - default:
> - speed = -1;
> - break; /* BUG */
> - }
> - cmd->base.duplex = port->full_duplex == 1 ?
> - DUPLEX_FULL : DUPLEX_HALF;
> - } else {
> - speed = SPEED_UNKNOWN;
> - cmd->base.duplex = DUPLEX_UNKNOWN;
> - }
> - cmd->base.speed = speed;
> -
> - if (cmd->base.speed == SPEED_10000) {
> - supported = (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE);
> - advertising = (ADVERTISED_10000baseT_Full | ADVERTISED_FIBRE);
> - cmd->base.port = PORT_FIBRE;
> - } else {
> - supported = (SUPPORTED_1000baseT_Full | SUPPORTED_100baseT_Full
> - | SUPPORTED_100baseT_Half | SUPPORTED_10baseT_Full
> - | SUPPORTED_10baseT_Half | SUPPORTED_Autoneg
> - | SUPPORTED_TP);
> - advertising = (ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg
> - | ADVERTISED_TP);
> - cmd->base.port = PORT_TP;
> - }
> -
> - cmd->base.autoneg = port->autoneg == 1 ?
> - AUTONEG_ENABLE : AUTONEG_DISABLE;
> -
> - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
> - supported);
> - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
> - advertising);
> -
> - return 0;
> -}
> -
> -static int ehea_set_link_ksettings(struct net_device *dev,
> - const struct ethtool_link_ksettings *cmd)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - int ret = 0;
> - u32 sp;
> -
> - if (cmd->base.autoneg == AUTONEG_ENABLE) {
> - sp = EHEA_SPEED_AUTONEG;
> - goto doit;
> - }
> -
> - switch (cmd->base.speed) {
> - case SPEED_10:
> - if (cmd->base.duplex == DUPLEX_FULL)
> - sp = H_SPEED_10M_F;
> - else
> - sp = H_SPEED_10M_H;
> - break;
> -
> - case SPEED_100:
> - if (cmd->base.duplex == DUPLEX_FULL)
> - sp = H_SPEED_100M_F;
> - else
> - sp = H_SPEED_100M_H;
> - break;
> -
> - case SPEED_1000:
> - if (cmd->base.duplex == DUPLEX_FULL)
> - sp = H_SPEED_1G_F;
> - else
> - ret = -EINVAL;
> - break;
> -
> - case SPEED_10000:
> - if (cmd->base.duplex == DUPLEX_FULL)
> - sp = H_SPEED_10G_F;
> - else
> - ret = -EINVAL;
> - break;
> -
> - default:
> - ret = -EINVAL;
> - break;
> - }
> -
> - if (ret)
> - goto out;
> -doit:
> - ret = ehea_set_portspeed(port, sp);
> -
> - if (!ret)
> - netdev_info(dev,
> - "Port speed successfully set: %dMbps %s Duplex\n",
> - port->port_speed,
> - port->full_duplex == 1 ? "Full" : "Half");
> -out:
> - return ret;
> -}
> -
> -static int ehea_nway_reset(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - int ret;
> -
> - ret = ehea_set_portspeed(port, EHEA_SPEED_AUTONEG);
> -
> - if (!ret)
> - netdev_info(port->netdev,
> - "Port speed successfully set: %dMbps %s Duplex\n",
> - port->port_speed,
> - port->full_duplex == 1 ? "Full" : "Half");
> - return ret;
> -}
> -
> -static void ehea_get_drvinfo(struct net_device *dev,
> - struct ethtool_drvinfo *info)
> -{
> - strscpy(info->driver, DRV_NAME, sizeof(info->driver));
> - strscpy(info->version, DRV_VERSION, sizeof(info->version));
> -}
> -
> -static u32 ehea_get_msglevel(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - return port->msg_enable;
> -}
> -
> -static void ehea_set_msglevel(struct net_device *dev, u32 value)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - port->msg_enable = value;
> -}
> -
> -static const char ehea_ethtool_stats_keys[][ETH_GSTRING_LEN] = {
> - {"sig_comp_iv"},
> - {"swqe_refill_th"},
> - {"port resets"},
> - {"Receive errors"},
> - {"TCP cksum errors"},
> - {"IP cksum errors"},
> - {"Frame cksum errors"},
> - {"num SQ stopped"},
> - {"PR0 free_swqes"},
> - {"PR1 free_swqes"},
> - {"PR2 free_swqes"},
> - {"PR3 free_swqes"},
> - {"PR4 free_swqes"},
> - {"PR5 free_swqes"},
> - {"PR6 free_swqes"},
> - {"PR7 free_swqes"},
> - {"PR8 free_swqes"},
> - {"PR9 free_swqes"},
> - {"PR10 free_swqes"},
> - {"PR11 free_swqes"},
> - {"PR12 free_swqes"},
> - {"PR13 free_swqes"},
> - {"PR14 free_swqes"},
> - {"PR15 free_swqes"},
> -};
> -
> -static void ehea_get_strings(struct net_device *dev, u32 stringset, u8 *data)
> -{
> - if (stringset == ETH_SS_STATS) {
> - memcpy(data, &ehea_ethtool_stats_keys,
> - sizeof(ehea_ethtool_stats_keys));
> - }
> -}
> -
> -static int ehea_get_sset_count(struct net_device *dev, int sset)
> -{
> - switch (sset) {
> - case ETH_SS_STATS:
> - return ARRAY_SIZE(ehea_ethtool_stats_keys);
> - default:
> - return -EOPNOTSUPP;
> - }
> -}
> -
> -static void ehea_get_ethtool_stats(struct net_device *dev,
> - struct ethtool_stats *stats, u64 *data)
> -{
> - int i, k, tmp;
> - struct ehea_port *port = netdev_priv(dev);
> -
> - for (i = 0; i < ehea_get_sset_count(dev, ETH_SS_STATS); i++)
> - data[i] = 0;
> - i = 0;
> -
> - data[i++] = port->sig_comp_iv;
> - data[i++] = port->port_res[0].swqe_refill_th;
> - data[i++] = port->resets;
> -
> - for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
> - tmp += port->port_res[k].p_stats.poll_receive_errors;
> - data[i++] = tmp;
> -
> - for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
> - tmp += port->port_res[k].p_stats.err_tcp_cksum;
> - data[i++] = tmp;
> -
> - for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
> - tmp += port->port_res[k].p_stats.err_ip_cksum;
> - data[i++] = tmp;
> -
> - for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
> - tmp += port->port_res[k].p_stats.err_frame_crc;
> - data[i++] = tmp;
> -
> - for (k = 0, tmp = 0; k < EHEA_MAX_PORT_RES; k++)
> - tmp += port->port_res[k].p_stats.queue_stopped;
> - data[i++] = tmp;
> -
> - for (k = 0; k < 16; k++)
> - data[i++] = atomic_read(&port->port_res[k].swqe_avail);
> -}
> -
> -static const struct ethtool_ops ehea_ethtool_ops = {
> - .get_drvinfo = ehea_get_drvinfo,
> - .get_msglevel = ehea_get_msglevel,
> - .set_msglevel = ehea_set_msglevel,
> - .get_link = ethtool_op_get_link,
> - .get_strings = ehea_get_strings,
> - .get_sset_count = ehea_get_sset_count,
> - .get_ethtool_stats = ehea_get_ethtool_stats,
> - .nway_reset = ehea_nway_reset, /* Restart autonegotiation */
> - .get_link_ksettings = ehea_get_link_ksettings,
> - .set_link_ksettings = ehea_set_link_ksettings,
> -};
> -
> -void ehea_set_ethtool_ops(struct net_device *netdev)
> -{
> - netdev->ethtool_ops = &ehea_ethtool_ops;
> -}
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_hw.h b/drivers/net/ethernet/ibm/ehea/ehea_hw.h
> deleted file mode 100644
> index 590933a45d65..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_hw.h
> +++ /dev/null
> @@ -1,253 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_hw.h
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#ifndef __EHEA_HW_H__
> -#define __EHEA_HW_H__
> -
> -#define QPX_SQA_VALUE EHEA_BMASK_IBM(48, 63)
> -#define QPX_RQ1A_VALUE EHEA_BMASK_IBM(48, 63)
> -#define QPX_RQ2A_VALUE EHEA_BMASK_IBM(48, 63)
> -#define QPX_RQ3A_VALUE EHEA_BMASK_IBM(48, 63)
> -
> -#define QPTEMM_OFFSET(x) offsetof(struct ehea_qptemm, x)
> -
> -struct ehea_qptemm {
> - u64 qpx_hcr;
> - u64 qpx_c;
> - u64 qpx_herr;
> - u64 qpx_aer;
> - u64 qpx_sqa;
> - u64 qpx_sqc;
> - u64 qpx_rq1a;
> - u64 qpx_rq1c;
> - u64 qpx_st;
> - u64 qpx_aerr;
> - u64 qpx_tenure;
> - u64 qpx_reserved1[(0x098 - 0x058) / 8];
> - u64 qpx_portp;
> - u64 qpx_reserved2[(0x100 - 0x0A0) / 8];
> - u64 qpx_t;
> - u64 qpx_sqhp;
> - u64 qpx_sqptp;
> - u64 qpx_reserved3[(0x140 - 0x118) / 8];
> - u64 qpx_sqwsize;
> - u64 qpx_reserved4[(0x170 - 0x148) / 8];
> - u64 qpx_sqsize;
> - u64 qpx_reserved5[(0x1B0 - 0x178) / 8];
> - u64 qpx_sigt;
> - u64 qpx_wqecnt;
> - u64 qpx_rq1hp;
> - u64 qpx_rq1ptp;
> - u64 qpx_rq1size;
> - u64 qpx_reserved6[(0x220 - 0x1D8) / 8];
> - u64 qpx_rq1wsize;
> - u64 qpx_reserved7[(0x240 - 0x228) / 8];
> - u64 qpx_pd;
> - u64 qpx_scqn;
> - u64 qpx_rcqn;
> - u64 qpx_aeqn;
> - u64 reserved49;
> - u64 qpx_ram;
> - u64 qpx_reserved8[(0x300 - 0x270) / 8];
> - u64 qpx_rq2a;
> - u64 qpx_rq2c;
> - u64 qpx_rq2hp;
> - u64 qpx_rq2ptp;
> - u64 qpx_rq2size;
> - u64 qpx_rq2wsize;
> - u64 qpx_rq2th;
> - u64 qpx_rq3a;
> - u64 qpx_rq3c;
> - u64 qpx_rq3hp;
> - u64 qpx_rq3ptp;
> - u64 qpx_rq3size;
> - u64 qpx_rq3wsize;
> - u64 qpx_rq3th;
> - u64 qpx_lpn;
> - u64 qpx_reserved9[(0x400 - 0x378) / 8];
> - u64 reserved_ext[(0x500 - 0x400) / 8];
> - u64 reserved2[(0x1000 - 0x500) / 8];
> -};
> -
> -#define MRx_HCR_LPARID_VALID EHEA_BMASK_IBM(0, 0)
> -
> -#define MRMWMM_OFFSET(x) offsetof(struct ehea_mrmwmm, x)
> -
> -struct ehea_mrmwmm {
> - u64 mrx_hcr;
> - u64 mrx_c;
> - u64 mrx_herr;
> - u64 mrx_aer;
> - u64 mrx_pp;
> - u64 reserved1;
> - u64 reserved2;
> - u64 reserved3;
> - u64 reserved4[(0x200 - 0x40) / 8];
> - u64 mrx_ctl[64];
> -};
> -
> -#define QPEDMM_OFFSET(x) offsetof(struct ehea_qpedmm, x)
> -
> -struct ehea_qpedmm {
> -
> - u64 reserved0[(0x400) / 8];
> - u64 qpedx_phh;
> - u64 qpedx_ppsgp;
> - u64 qpedx_ppsgu;
> - u64 qpedx_ppdgp;
> - u64 qpedx_ppdgu;
> - u64 qpedx_aph;
> - u64 qpedx_apsgp;
> - u64 qpedx_apsgu;
> - u64 qpedx_apdgp;
> - u64 qpedx_apdgu;
> - u64 qpedx_apav;
> - u64 qpedx_apsav;
> - u64 qpedx_hcr;
> - u64 reserved1[4];
> - u64 qpedx_rrl0;
> - u64 qpedx_rrrkey0;
> - u64 qpedx_rrva0;
> - u64 reserved2;
> - u64 qpedx_rrl1;
> - u64 qpedx_rrrkey1;
> - u64 qpedx_rrva1;
> - u64 reserved3;
> - u64 qpedx_rrl2;
> - u64 qpedx_rrrkey2;
> - u64 qpedx_rrva2;
> - u64 reserved4;
> - u64 qpedx_rrl3;
> - u64 qpedx_rrrkey3;
> - u64 qpedx_rrva3;
> -};
> -
> -#define CQX_FECADDER EHEA_BMASK_IBM(32, 63)
> -#define CQX_FEC_CQE_CNT EHEA_BMASK_IBM(32, 63)
> -#define CQX_N1_GENERATE_COMP_EVENT EHEA_BMASK_IBM(0, 0)
> -#define CQX_EP_EVENT_PENDING EHEA_BMASK_IBM(0, 0)
> -
> -#define CQTEMM_OFFSET(x) offsetof(struct ehea_cqtemm, x)
> -
> -struct ehea_cqtemm {
> - u64 cqx_hcr;
> - u64 cqx_c;
> - u64 cqx_herr;
> - u64 cqx_aer;
> - u64 cqx_ptp;
> - u64 cqx_tp;
> - u64 cqx_fec;
> - u64 cqx_feca;
> - u64 cqx_ep;
> - u64 cqx_eq;
> - u64 reserved1;
> - u64 cqx_n0;
> - u64 cqx_n1;
> - u64 reserved2[(0x1000 - 0x60) / 8];
> -};
> -
> -#define EQTEMM_OFFSET(x) offsetof(struct ehea_eqtemm, x)
> -
> -struct ehea_eqtemm {
> - u64 eqx_hcr;
> - u64 eqx_c;
> - u64 eqx_herr;
> - u64 eqx_aer;
> - u64 eqx_ptp;
> - u64 eqx_tp;
> - u64 eqx_ssba;
> - u64 eqx_psba;
> - u64 eqx_cec;
> - u64 eqx_meql;
> - u64 eqx_xisbi;
> - u64 eqx_xisc;
> - u64 eqx_it;
> -};
> -
> -/*
> - * These access functions will be changed when the dissuccsion about
> - * the new access methods for POWER has settled.
> - */
> -
> -static inline u64 epa_load(struct h_epa epa, u32 offset)
> -{
> - return __raw_readq((void __iomem *)(epa.addr + offset));
> -}
> -
> -static inline void epa_store(struct h_epa epa, u32 offset, u64 value)
> -{
> - __raw_writeq(value, (void __iomem *)(epa.addr + offset));
> - epa_load(epa, offset); /* synchronize explicitly to eHEA */
> -}
> -
> -static inline void epa_store_acc(struct h_epa epa, u32 offset, u64 value)
> -{
> - __raw_writeq(value, (void __iomem *)(epa.addr + offset));
> -}
> -
> -#define epa_store_cq(epa, offset, value)\
> - epa_store(epa, CQTEMM_OFFSET(offset), value)
> -#define epa_load_cq(epa, offset)\
> - epa_load(epa, CQTEMM_OFFSET(offset))
> -
> -static inline void ehea_update_sqa(struct ehea_qp *qp, u16 nr_wqes)
> -{
> - struct h_epa epa = qp->epas.kernel;
> - epa_store_acc(epa, QPTEMM_OFFSET(qpx_sqa),
> - EHEA_BMASK_SET(QPX_SQA_VALUE, nr_wqes));
> -}
> -
> -static inline void ehea_update_rq3a(struct ehea_qp *qp, u16 nr_wqes)
> -{
> - struct h_epa epa = qp->epas.kernel;
> - epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq3a),
> - EHEA_BMASK_SET(QPX_RQ1A_VALUE, nr_wqes));
> -}
> -
> -static inline void ehea_update_rq2a(struct ehea_qp *qp, u16 nr_wqes)
> -{
> - struct h_epa epa = qp->epas.kernel;
> - epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq2a),
> - EHEA_BMASK_SET(QPX_RQ2A_VALUE, nr_wqes));
> -}
> -
> -static inline void ehea_update_rq1a(struct ehea_qp *qp, u16 nr_wqes)
> -{
> - struct h_epa epa = qp->epas.kernel;
> - epa_store_acc(epa, QPTEMM_OFFSET(qpx_rq1a),
> - EHEA_BMASK_SET(QPX_RQ3A_VALUE, nr_wqes));
> -}
> -
> -static inline void ehea_update_feca(struct ehea_cq *cq, u32 nr_cqes)
> -{
> - struct h_epa epa = cq->epas.kernel;
> - epa_store_acc(epa, CQTEMM_OFFSET(cqx_feca),
> - EHEA_BMASK_SET(CQX_FECADDER, nr_cqes));
> -}
> -
> -static inline void ehea_reset_cq_n1(struct ehea_cq *cq)
> -{
> - struct h_epa epa = cq->epas.kernel;
> - epa_store_cq(epa, cqx_n1,
> - EHEA_BMASK_SET(CQX_N1_GENERATE_COMP_EVENT, 1));
> -}
> -
> -static inline void ehea_reset_cq_ep(struct ehea_cq *my_cq)
> -{
> - struct h_epa epa = my_cq->epas.kernel;
> - epa_store_acc(epa, CQTEMM_OFFSET(cqx_ep),
> - EHEA_BMASK_SET(CQX_EP_EVENT_PENDING, 0));
> -}
> -
> -#endif /* __EHEA_HW_H__ */
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
> deleted file mode 100644
> index bfc8699a05b9..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
> +++ /dev/null
> @@ -1,3581 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_main.c
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include <linux/device.h>
> -#include <linux/in.h>
> -#include <linux/ip.h>
> -#include <linux/tcp.h>
> -#include <linux/udp.h>
> -#include <linux/if.h>
> -#include <linux/list.h>
> -#include <linux/slab.h>
> -#include <linux/if_ether.h>
> -#include <linux/notifier.h>
> -#include <linux/reboot.h>
> -#include <linux/memory.h>
> -#include <asm/kexec.h>
> -#include <linux/mutex.h>
> -#include <linux/prefetch.h>
> -#include <linux/of.h>
> -#include <linux/of_device.h>
> -#include <linux/platform_device.h>
> -
> -#include <net/ip.h>
> -
> -#include "ehea.h"
> -#include "ehea_qmr.h"
> -#include "ehea_phyp.h"
> -
> -
> -MODULE_LICENSE("GPL");
> -MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
> -MODULE_DESCRIPTION("IBM eServer HEA Driver");
> -MODULE_VERSION(DRV_VERSION);
> -
> -
> -static int msg_level = -1;
> -static int rq1_entries = EHEA_DEF_ENTRIES_RQ1;
> -static int rq2_entries = EHEA_DEF_ENTRIES_RQ2;
> -static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
> -static int sq_entries = EHEA_DEF_ENTRIES_SQ;
> -static int use_mcs = 1;
> -static int prop_carrier_state;
> -
> -module_param(msg_level, int, 0);
> -module_param(rq1_entries, int, 0);
> -module_param(rq2_entries, int, 0);
> -module_param(rq3_entries, int, 0);
> -module_param(sq_entries, int, 0);
> -module_param(prop_carrier_state, int, 0);
> -module_param(use_mcs, int, 0);
> -
> -MODULE_PARM_DESC(msg_level, "msg_level");
> -MODULE_PARM_DESC(prop_carrier_state, "Propagate carrier state of physical "
> - "port to stack. 1:yes, 0:no. Default = 0 ");
> -MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 "
> - "[2^x - 1], x = [7..14]. Default = "
> - __MODULE_STRING(EHEA_DEF_ENTRIES_RQ3) ")");
> -MODULE_PARM_DESC(rq2_entries, "Number of entries for Receive Queue 2 "
> - "[2^x - 1], x = [7..14]. Default = "
> - __MODULE_STRING(EHEA_DEF_ENTRIES_RQ2) ")");
> -MODULE_PARM_DESC(rq1_entries, "Number of entries for Receive Queue 1 "
> - "[2^x - 1], x = [7..14]. Default = "
> - __MODULE_STRING(EHEA_DEF_ENTRIES_RQ1) ")");
> -MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue "
> - "[2^x - 1], x = [7..14]. Default = "
> - __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
> -MODULE_PARM_DESC(use_mcs, " Multiple receive queues, 1: enable, 0: disable, "
> - "Default = 1");
> -
> -static int port_name_cnt;
> -static LIST_HEAD(adapter_list);
> -static unsigned long ehea_driver_flags;
> -static DEFINE_MUTEX(dlpar_mem_lock);
> -static struct ehea_fw_handle_array ehea_fw_handles;
> -static struct ehea_bcmc_reg_array ehea_bcmc_regs;
> -
> -
> -static int ehea_probe_adapter(struct platform_device *dev);
> -
> -static void ehea_remove(struct platform_device *dev);
> -
> -static const struct of_device_id ehea_module_device_table[] = {
> - {
> - .name = "lhea",
> - .compatible = "IBM,lhea",
> - },
> - {
> - .type = "network",
> - .compatible = "IBM,lhea-ethernet",
> - },
> - {},
> -};
> -MODULE_DEVICE_TABLE(of, ehea_module_device_table);
> -
> -static const struct of_device_id ehea_device_table[] = {
> - {
> - .name = "lhea",
> - .compatible = "IBM,lhea",
> - },
> - {},
> -};
> -MODULE_DEVICE_TABLE(of, ehea_device_table);
> -
> -static struct platform_driver ehea_driver = {
> - .driver = {
> - .name = "ehea",
> - .owner = THIS_MODULE,
> - .of_match_table = ehea_device_table,
> - },
> - .probe = ehea_probe_adapter,
> - .remove = ehea_remove,
> -};
> -
> -void ehea_dump(void *adr, int len, char *msg)
> -{
> - int x;
> - unsigned char *deb = adr;
> - for (x = 0; x < len; x += 16) {
> - pr_info("%s adr=%p ofs=%04x %016llx %016llx\n",
> - msg, deb, x, *((u64 *)&deb[0]), *((u64 *)&deb[8]));
> - deb += 16;
> - }
> -}
> -
> -static void ehea_schedule_port_reset(struct ehea_port *port)
> -{
> - if (!test_bit(__EHEA_DISABLE_PORT_RESET, &port->flags))
> - schedule_work(&port->reset_task);
> -}
> -
> -static void ehea_update_firmware_handles(void)
> -{
> - struct ehea_fw_handle_entry *arr = NULL;
> - struct ehea_adapter *adapter;
> - int num_adapters = 0;
> - int num_ports = 0;
> - int num_portres = 0;
> - int i = 0;
> - int num_fw_handles, k, l;
> -
> - /* Determine number of handles */
> - mutex_lock(&ehea_fw_handles.lock);
> -
> - list_for_each_entry(adapter, &adapter_list, list) {
> - num_adapters++;
> -
> - for (k = 0; k < EHEA_MAX_PORTS; k++) {
> - struct ehea_port *port = adapter->port[k];
> -
> - if (!port || (port->state != EHEA_PORT_UP))
> - continue;
> -
> - num_ports++;
> - num_portres += port->num_def_qps;
> - }
> - }
> -
> - num_fw_handles = num_adapters * EHEA_NUM_ADAPTER_FW_HANDLES +
> - num_ports * EHEA_NUM_PORT_FW_HANDLES +
> - num_portres * EHEA_NUM_PORTRES_FW_HANDLES;
> -
> - if (num_fw_handles) {
> - arr = kzalloc_objs(*arr, num_fw_handles);
> - if (!arr)
> - goto out; /* Keep the existing array */
> - } else
> - goto out_update;
> -
> - list_for_each_entry(adapter, &adapter_list, list) {
> - if (num_adapters == 0)
> - break;
> -
> - for (k = 0; k < EHEA_MAX_PORTS; k++) {
> - struct ehea_port *port = adapter->port[k];
> -
> - if (!port || (port->state != EHEA_PORT_UP) ||
> - (num_ports == 0))
> - continue;
> -
> - for (l = 0; l < port->num_def_qps; l++) {
> - struct ehea_port_res *pr = &port->port_res[l];
> -
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = pr->qp->fw_handle;
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = pr->send_cq->fw_handle;
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = pr->recv_cq->fw_handle;
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = pr->eq->fw_handle;
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = pr->send_mr.handle;
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = pr->recv_mr.handle;
> - }
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = port->qp_eq->fw_handle;
> - num_ports--;
> - }
> -
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = adapter->neq->fw_handle;
> -
> - if (adapter->mr.handle) {
> - arr[i].adh = adapter->handle;
> - arr[i++].fwh = adapter->mr.handle;
> - }
> - num_adapters--;
> - }
> -
> -out_update:
> - kfree(ehea_fw_handles.arr);
> - ehea_fw_handles.arr = arr;
> - ehea_fw_handles.num_entries = i;
> -out:
> - mutex_unlock(&ehea_fw_handles.lock);
> -}
> -
> -static void ehea_update_bcmc_registrations(void)
> -{
> - unsigned long flags;
> - struct ehea_bcmc_reg_entry *arr = NULL;
> - struct ehea_adapter *adapter;
> - struct ehea_mc_list *mc_entry;
> - int num_registrations = 0;
> - int i = 0;
> - int k;
> -
> - spin_lock_irqsave(&ehea_bcmc_regs.lock, flags);
> -
> - /* Determine number of registrations */
> - list_for_each_entry(adapter, &adapter_list, list)
> - for (k = 0; k < EHEA_MAX_PORTS; k++) {
> - struct ehea_port *port = adapter->port[k];
> -
> - if (!port || (port->state != EHEA_PORT_UP))
> - continue;
> -
> - num_registrations += 2; /* Broadcast registrations */
> -
> - list_for_each_entry(mc_entry, &port->mc_list->list,list)
> - num_registrations += 2;
> - }
> -
> - if (num_registrations) {
> - arr = kzalloc_objs(*arr, num_registrations, GFP_ATOMIC);
> - if (!arr)
> - goto out; /* Keep the existing array */
> - } else
> - goto out_update;
> -
> - list_for_each_entry(adapter, &adapter_list, list) {
> - for (k = 0; k < EHEA_MAX_PORTS; k++) {
> - struct ehea_port *port = adapter->port[k];
> -
> - if (!port || (port->state != EHEA_PORT_UP))
> - continue;
> -
> - if (num_registrations == 0)
> - goto out_update;
> -
> - arr[i].adh = adapter->handle;
> - arr[i].port_id = port->logical_port_id;
> - arr[i].reg_type = EHEA_BCMC_BROADCAST |
> - EHEA_BCMC_UNTAGGED;
> - arr[i++].macaddr = port->mac_addr;
> -
> - arr[i].adh = adapter->handle;
> - arr[i].port_id = port->logical_port_id;
> - arr[i].reg_type = EHEA_BCMC_BROADCAST |
> - EHEA_BCMC_VLANID_ALL;
> - arr[i++].macaddr = port->mac_addr;
> - num_registrations -= 2;
> -
> - list_for_each_entry(mc_entry,
> - &port->mc_list->list, list) {
> - if (num_registrations == 0)
> - goto out_update;
> -
> - arr[i].adh = adapter->handle;
> - arr[i].port_id = port->logical_port_id;
> - arr[i].reg_type = EHEA_BCMC_MULTICAST |
> - EHEA_BCMC_UNTAGGED;
> - if (mc_entry->macaddr == 0)
> - arr[i].reg_type |= EHEA_BCMC_SCOPE_ALL;
> - arr[i++].macaddr = mc_entry->macaddr;
> -
> - arr[i].adh = adapter->handle;
> - arr[i].port_id = port->logical_port_id;
> - arr[i].reg_type = EHEA_BCMC_MULTICAST |
> - EHEA_BCMC_VLANID_ALL;
> - if (mc_entry->macaddr == 0)
> - arr[i].reg_type |= EHEA_BCMC_SCOPE_ALL;
> - arr[i++].macaddr = mc_entry->macaddr;
> - num_registrations -= 2;
> - }
> - }
> - }
> -
> -out_update:
> - kfree(ehea_bcmc_regs.arr);
> - ehea_bcmc_regs.arr = arr;
> - ehea_bcmc_regs.num_entries = i;
> -out:
> - spin_unlock_irqrestore(&ehea_bcmc_regs.lock, flags);
> -}
> -
> -static void ehea_get_stats64(struct net_device *dev,
> - struct rtnl_link_stats64 *stats)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - u64 rx_packets = 0, tx_packets = 0, rx_bytes = 0, tx_bytes = 0;
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - rx_packets += port->port_res[i].rx_packets;
> - rx_bytes += port->port_res[i].rx_bytes;
> - }
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - tx_packets += port->port_res[i].tx_packets;
> - tx_bytes += port->port_res[i].tx_bytes;
> - }
> -
> - stats->tx_packets = tx_packets;
> - stats->rx_bytes = rx_bytes;
> - stats->tx_bytes = tx_bytes;
> - stats->rx_packets = rx_packets;
> -
> - stats->multicast = port->stats.multicast;
> - stats->rx_errors = port->stats.rx_errors;
> -}
> -
> -static void ehea_update_stats(struct work_struct *work)
> -{
> - struct ehea_port *port =
> - container_of(work, struct ehea_port, stats_work.work);
> - struct net_device *dev = port->netdev;
> - struct rtnl_link_stats64 *stats = &port->stats;
> - struct hcp_ehea_port_cb2 *cb2;
> - u64 hret;
> -
> - cb2 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb2) {
> - netdev_err(dev, "No mem for cb2. Some interface statistics were not updated\n");
> - goto resched;
> - }
> -
> - hret = ehea_h_query_ehea_port(port->adapter->handle,
> - port->logical_port_id,
> - H_PORT_CB2, H_PORT_CB2_ALL, cb2);
> - if (hret != H_SUCCESS) {
> - netdev_err(dev, "query_ehea_port failed\n");
> - goto out_herr;
> - }
> -
> - if (netif_msg_hw(port))
> - ehea_dump(cb2, sizeof(*cb2), "net_device_stats");
> -
> - stats->multicast = cb2->rxmcp;
> - stats->rx_errors = cb2->rxuerr;
> -
> -out_herr:
> - free_page((unsigned long)cb2);
> -resched:
> - schedule_delayed_work(&port->stats_work,
> - round_jiffies_relative(msecs_to_jiffies(1000)));
> -}
> -
> -static void ehea_refill_rq1(struct ehea_port_res *pr, int index, int nr_of_wqes)
> -{
> - struct sk_buff **skb_arr_rq1 = pr->rq1_skba.arr;
> - struct net_device *dev = pr->port->netdev;
> - int max_index_mask = pr->rq1_skba.len - 1;
> - int fill_wqes = pr->rq1_skba.os_skbs + nr_of_wqes;
> - int adder = 0;
> - int i;
> -
> - pr->rq1_skba.os_skbs = 0;
> -
> - if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
> - if (nr_of_wqes > 0)
> - pr->rq1_skba.index = index;
> - pr->rq1_skba.os_skbs = fill_wqes;
> - return;
> - }
> -
> - for (i = 0; i < fill_wqes; i++) {
> - if (!skb_arr_rq1[index]) {
> - skb_arr_rq1[index] = netdev_alloc_skb(dev,
> - EHEA_L_PKT_SIZE);
> - if (!skb_arr_rq1[index]) {
> - pr->rq1_skba.os_skbs = fill_wqes - i;
> - break;
> - }
> - }
> - index--;
> - index &= max_index_mask;
> - adder++;
> - }
> -
> - if (adder == 0)
> - return;
> -
> - /* Ring doorbell */
> - ehea_update_rq1a(pr->qp, adder);
> -}
> -
> -static void ehea_init_fill_rq1(struct ehea_port_res *pr, int nr_rq1a)
> -{
> - struct sk_buff **skb_arr_rq1 = pr->rq1_skba.arr;
> - struct net_device *dev = pr->port->netdev;
> - int i;
> -
> - if (nr_rq1a > pr->rq1_skba.len) {
> - netdev_err(dev, "NR_RQ1A bigger than skb array len\n");
> - return;
> - }
> -
> - for (i = 0; i < nr_rq1a; i++) {
> - skb_arr_rq1[i] = netdev_alloc_skb(dev, EHEA_L_PKT_SIZE);
> - if (!skb_arr_rq1[i])
> - break;
> - }
> - /* Ring doorbell */
> - ehea_update_rq1a(pr->qp, i - 1);
> -}
> -
> -static int ehea_refill_rq_def(struct ehea_port_res *pr,
> - struct ehea_q_skb_arr *q_skba, int rq_nr,
> - int num_wqes, int wqe_type, int packet_size)
> -{
> - struct net_device *dev = pr->port->netdev;
> - struct ehea_qp *qp = pr->qp;
> - struct sk_buff **skb_arr = q_skba->arr;
> - struct ehea_rwqe *rwqe;
> - int i, index, max_index_mask, fill_wqes;
> - int adder = 0;
> - int ret = 0;
> -
> - fill_wqes = q_skba->os_skbs + num_wqes;
> - q_skba->os_skbs = 0;
> -
> - if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
> - q_skba->os_skbs = fill_wqes;
> - return ret;
> - }
> -
> - index = q_skba->index;
> - max_index_mask = q_skba->len - 1;
> - for (i = 0; i < fill_wqes; i++) {
> - u64 tmp_addr;
> - struct sk_buff *skb;
> -
> - skb = netdev_alloc_skb_ip_align(dev, packet_size);
> - if (!skb) {
> - q_skba->os_skbs = fill_wqes - i;
> - if (q_skba->os_skbs == q_skba->len - 2) {
> - netdev_info(pr->port->netdev,
> - "rq%i ran dry - no mem for skb\n",
> - rq_nr);
> - ret = -ENOMEM;
> - }
> - break;
> - }
> -
> - skb_arr[index] = skb;
> - tmp_addr = ehea_map_vaddr(skb->data);
> - if (tmp_addr == -1) {
> - dev_consume_skb_any(skb);
> - q_skba->os_skbs = fill_wqes - i;
> - ret = 0;
> - break;
> - }
> -
> - rwqe = ehea_get_next_rwqe(qp, rq_nr);
> - rwqe->wr_id = EHEA_BMASK_SET(EHEA_WR_ID_TYPE, wqe_type)
> - | EHEA_BMASK_SET(EHEA_WR_ID_INDEX, index);
> - rwqe->sg_list[0].l_key = pr->recv_mr.lkey;
> - rwqe->sg_list[0].vaddr = tmp_addr;
> - rwqe->sg_list[0].len = packet_size;
> - rwqe->data_segments = 1;
> -
> - index++;
> - index &= max_index_mask;
> - adder++;
> - }
> -
> - q_skba->index = index;
> - if (adder == 0)
> - goto out;
> -
> - /* Ring doorbell */
> - iosync();
> - if (rq_nr == 2)
> - ehea_update_rq2a(pr->qp, adder);
> - else
> - ehea_update_rq3a(pr->qp, adder);
> -out:
> - return ret;
> -}
> -
> -
> -static int ehea_refill_rq2(struct ehea_port_res *pr, int nr_of_wqes)
> -{
> - return ehea_refill_rq_def(pr, &pr->rq2_skba, 2,
> - nr_of_wqes, EHEA_RWQE2_TYPE,
> - EHEA_RQ2_PKT_SIZE);
> -}
> -
> -
> -static int ehea_refill_rq3(struct ehea_port_res *pr, int nr_of_wqes)
> -{
> - return ehea_refill_rq_def(pr, &pr->rq3_skba, 3,
> - nr_of_wqes, EHEA_RWQE3_TYPE,
> - EHEA_MAX_PACKET_SIZE);
> -}
> -
> -static inline int ehea_check_cqe(struct ehea_cqe *cqe, int *rq_num)
> -{
> - *rq_num = (cqe->type & EHEA_CQE_TYPE_RQ) >> 5;
> - if ((cqe->status & EHEA_CQE_STAT_ERR_MASK) == 0)
> - return 0;
> - if (((cqe->status & EHEA_CQE_STAT_ERR_TCP) != 0) &&
> - (cqe->header_length == 0))
> - return 0;
> - return -EINVAL;
> -}
> -
> -static inline void ehea_fill_skb(struct net_device *dev,
> - struct sk_buff *skb, struct ehea_cqe *cqe,
> - struct ehea_port_res *pr)
> -{
> - int length = cqe->num_bytes_transfered - 4; /*remove CRC */
> -
> - skb_put(skb, length);
> - skb->protocol = eth_type_trans(skb, dev);
> -
> - /* The packet was not an IPV4 packet so a complemented checksum was
> - calculated. The value is found in the Internet Checksum field. */
> - if (cqe->status & EHEA_CQE_BLIND_CKSUM) {
> - skb->ip_summed = CHECKSUM_COMPLETE;
> - skb->csum = csum_unfold(~cqe->inet_checksum_value);
> - } else
> - skb->ip_summed = CHECKSUM_UNNECESSARY;
> -
> - skb_record_rx_queue(skb, pr - &pr->port->port_res[0]);
> -}
> -
> -static inline struct sk_buff *get_skb_by_index(struct sk_buff **skb_array,
> - int arr_len,
> - struct ehea_cqe *cqe)
> -{
> - int skb_index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, cqe->wr_id);
> - struct sk_buff *skb;
> - void *pref;
> - int x;
> -
> - x = skb_index + 1;
> - x &= (arr_len - 1);
> -
> - pref = skb_array[x];
> - if (pref) {
> - prefetchw(pref);
> - prefetchw(pref + EHEA_CACHE_LINE);
> -
> - pref = (skb_array[x]->data);
> - prefetch(pref);
> - prefetch(pref + EHEA_CACHE_LINE);
> - prefetch(pref + EHEA_CACHE_LINE * 2);
> - prefetch(pref + EHEA_CACHE_LINE * 3);
> - }
> -
> - skb = skb_array[skb_index];
> - skb_array[skb_index] = NULL;
> - return skb;
> -}
> -
> -static inline struct sk_buff *get_skb_by_index_ll(struct sk_buff **skb_array,
> - int arr_len, int wqe_index)
> -{
> - struct sk_buff *skb;
> - void *pref;
> - int x;
> -
> - x = wqe_index + 1;
> - x &= (arr_len - 1);
> -
> - pref = skb_array[x];
> - if (pref) {
> - prefetchw(pref);
> - prefetchw(pref + EHEA_CACHE_LINE);
> -
> - pref = (skb_array[x]->data);
> - prefetchw(pref);
> - prefetchw(pref + EHEA_CACHE_LINE);
> - }
> -
> - skb = skb_array[wqe_index];
> - skb_array[wqe_index] = NULL;
> - return skb;
> -}
> -
> -static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
> - struct ehea_cqe *cqe, int *processed_rq2,
> - int *processed_rq3)
> -{
> - struct sk_buff *skb;
> -
> - if (cqe->status & EHEA_CQE_STAT_ERR_TCP)
> - pr->p_stats.err_tcp_cksum++;
> - if (cqe->status & EHEA_CQE_STAT_ERR_IP)
> - pr->p_stats.err_ip_cksum++;
> - if (cqe->status & EHEA_CQE_STAT_ERR_CRC)
> - pr->p_stats.err_frame_crc++;
> -
> - if (rq == 2) {
> - *processed_rq2 += 1;
> - skb = get_skb_by_index(pr->rq2_skba.arr, pr->rq2_skba.len, cqe);
> - dev_kfree_skb(skb);
> - } else if (rq == 3) {
> - *processed_rq3 += 1;
> - skb = get_skb_by_index(pr->rq3_skba.arr, pr->rq3_skba.len, cqe);
> - dev_kfree_skb(skb);
> - }
> -
> - if (cqe->status & EHEA_CQE_STAT_FAT_ERR_MASK) {
> - if (netif_msg_rx_err(pr->port)) {
> - pr_err("Critical receive error for QP %d. Resetting port.\n",
> - pr->qp->init_attr.qp_nr);
> - ehea_dump(cqe, sizeof(*cqe), "CQE");
> - }
> - ehea_schedule_port_reset(pr->port);
> - return 1;
> - }
> -
> - return 0;
> -}
> -
> -static int ehea_proc_rwqes(struct net_device *dev,
> - struct ehea_port_res *pr,
> - int budget)
> -{
> - struct ehea_port *port = pr->port;
> - struct ehea_qp *qp = pr->qp;
> - struct ehea_cqe *cqe;
> - struct sk_buff *skb;
> - struct sk_buff **skb_arr_rq1 = pr->rq1_skba.arr;
> - struct sk_buff **skb_arr_rq2 = pr->rq2_skba.arr;
> - struct sk_buff **skb_arr_rq3 = pr->rq3_skba.arr;
> - int skb_arr_rq1_len = pr->rq1_skba.len;
> - int skb_arr_rq2_len = pr->rq2_skba.len;
> - int skb_arr_rq3_len = pr->rq3_skba.len;
> - int processed, processed_rq1, processed_rq2, processed_rq3;
> - u64 processed_bytes = 0;
> - int wqe_index, last_wqe_index, rq, port_reset;
> -
> - processed = processed_rq1 = processed_rq2 = processed_rq3 = 0;
> - last_wqe_index = 0;
> -
> - cqe = ehea_poll_rq1(qp, &wqe_index);
> - while ((processed < budget) && cqe) {
> - ehea_inc_rq1(qp);
> - processed_rq1++;
> - processed++;
> - if (netif_msg_rx_status(port))
> - ehea_dump(cqe, sizeof(*cqe), "CQE");
> -
> - last_wqe_index = wqe_index;
> - rmb();
> - if (!ehea_check_cqe(cqe, &rq)) {
> - if (rq == 1) {
> - /* LL RQ1 */
> - skb = get_skb_by_index_ll(skb_arr_rq1,
> - skb_arr_rq1_len,
> - wqe_index);
> - if (unlikely(!skb)) {
> - netif_info(port, rx_err, dev,
> - "LL rq1: skb=NULL\n");
> -
> - skb = netdev_alloc_skb(dev,
> - EHEA_L_PKT_SIZE);
> - if (!skb)
> - break;
> - }
> - skb_copy_to_linear_data(skb, ((char *)cqe) + 64,
> - cqe->num_bytes_transfered - 4);
> - ehea_fill_skb(dev, skb, cqe, pr);
> - } else if (rq == 2) {
> - /* RQ2 */
> - skb = get_skb_by_index(skb_arr_rq2,
> - skb_arr_rq2_len, cqe);
> - if (unlikely(!skb)) {
> - netif_err(port, rx_err, dev,
> - "rq2: skb=NULL\n");
> - break;
> - }
> - ehea_fill_skb(dev, skb, cqe, pr);
> - processed_rq2++;
> - } else {
> - /* RQ3 */
> - skb = get_skb_by_index(skb_arr_rq3,
> - skb_arr_rq3_len, cqe);
> - if (unlikely(!skb)) {
> - netif_err(port, rx_err, dev,
> - "rq3: skb=NULL\n");
> - break;
> - }
> - ehea_fill_skb(dev, skb, cqe, pr);
> - processed_rq3++;
> - }
> -
> - processed_bytes += skb->len;
> -
> - if (cqe->status & EHEA_CQE_VLAN_TAG_XTRACT)
> - __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
> - cqe->vlan_tag);
> -
> - napi_gro_receive(&pr->napi, skb);
> - } else {
> - pr->p_stats.poll_receive_errors++;
> - port_reset = ehea_treat_poll_error(pr, rq, cqe,
> - &processed_rq2,
> - &processed_rq3);
> - if (port_reset)
> - break;
> - }
> - cqe = ehea_poll_rq1(qp, &wqe_index);
> - }
> -
> - pr->rx_packets += processed;
> - pr->rx_bytes += processed_bytes;
> -
> - ehea_refill_rq1(pr, last_wqe_index, processed_rq1);
> - ehea_refill_rq2(pr, processed_rq2);
> - ehea_refill_rq3(pr, processed_rq3);
> -
> - return processed;
> -}
> -
> -#define SWQE_RESTART_CHECK 0xdeadbeaff00d0000ull
> -
> -static void reset_sq_restart_flag(struct ehea_port *port)
> -{
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - struct ehea_port_res *pr = &port->port_res[i];
> - pr->sq_restart_flag = 0;
> - }
> - wake_up(&port->restart_wq);
> -}
> -
> -static void check_sqs(struct ehea_port *port)
> -{
> - struct ehea_swqe *swqe;
> - int swqe_index;
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - struct ehea_port_res *pr = &port->port_res[i];
> - int ret;
> - swqe = ehea_get_swqe(pr->qp, &swqe_index);
> - memset(swqe, 0, SWQE_HEADER_SIZE);
> - atomic_dec(&pr->swqe_avail);
> -
> - swqe->tx_control |= EHEA_SWQE_PURGE;
> - swqe->wr_id = SWQE_RESTART_CHECK;
> - swqe->tx_control |= EHEA_SWQE_SIGNALLED_COMPLETION;
> - swqe->tx_control |= EHEA_SWQE_IMM_DATA_PRESENT;
> - swqe->immediate_data_length = 80;
> -
> - ehea_post_swqe(pr->qp, swqe);
> -
> - ret = wait_event_timeout(port->restart_wq,
> - pr->sq_restart_flag == 0,
> - msecs_to_jiffies(100));
> -
> - if (!ret) {
> - pr_err("HW/SW queues out of sync\n");
> - ehea_schedule_port_reset(pr->port);
> - return;
> - }
> - }
> -}
> -
> -
> -static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota)
> -{
> - struct sk_buff *skb;
> - struct ehea_cq *send_cq = pr->send_cq;
> - struct ehea_cqe *cqe;
> - int quota = my_quota;
> - int cqe_counter = 0;
> - int swqe_av = 0;
> - int index;
> - struct netdev_queue *txq = netdev_get_tx_queue(pr->port->netdev,
> - pr - &pr->port->port_res[0]);
> -
> - cqe = ehea_poll_cq(send_cq);
> - while (cqe && (quota > 0)) {
> - ehea_inc_cq(send_cq);
> -
> - cqe_counter++;
> - rmb();
> -
> - if (cqe->wr_id == SWQE_RESTART_CHECK) {
> - pr->sq_restart_flag = 1;
> - swqe_av++;
> - break;
> - }
> -
> - if (cqe->status & EHEA_CQE_STAT_ERR_MASK) {
> - pr_err("Bad send completion status=0x%04X\n",
> - cqe->status);
> -
> - if (netif_msg_tx_err(pr->port))
> - ehea_dump(cqe, sizeof(*cqe), "Send CQE");
> -
> - if (cqe->status & EHEA_CQE_STAT_RESET_MASK) {
> - pr_err("Resetting port\n");
> - ehea_schedule_port_reset(pr->port);
> - break;
> - }
> - }
> -
> - if (netif_msg_tx_done(pr->port))
> - ehea_dump(cqe, sizeof(*cqe), "CQE");
> -
> - if (likely(EHEA_BMASK_GET(EHEA_WR_ID_TYPE, cqe->wr_id)
> - == EHEA_SWQE2_TYPE)) {
> -
> - index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, cqe->wr_id);
> - skb = pr->sq_skba.arr[index];
> - dev_consume_skb_any(skb);
> - pr->sq_skba.arr[index] = NULL;
> - }
> -
> - swqe_av += EHEA_BMASK_GET(EHEA_WR_ID_REFILL, cqe->wr_id);
> - quota--;
> -
> - cqe = ehea_poll_cq(send_cq);
> - }
> -
> - ehea_update_feca(send_cq, cqe_counter);
> - atomic_add(swqe_av, &pr->swqe_avail);
> -
> - if (unlikely(netif_tx_queue_stopped(txq) &&
> - (atomic_read(&pr->swqe_avail) >= pr->swqe_refill_th))) {
> - __netif_tx_lock(txq, smp_processor_id());
> - if (netif_tx_queue_stopped(txq) &&
> - (atomic_read(&pr->swqe_avail) >= pr->swqe_refill_th))
> - netif_tx_wake_queue(txq);
> - __netif_tx_unlock(txq);
> - }
> -
> - wake_up(&pr->port->swqe_avail_wq);
> -
> - return cqe;
> -}
> -
> -#define EHEA_POLL_MAX_CQES 65535
> -
> -static int ehea_poll(struct napi_struct *napi, int budget)
> -{
> - struct ehea_port_res *pr = container_of(napi, struct ehea_port_res,
> - napi);
> - struct net_device *dev = pr->port->netdev;
> - struct ehea_cqe *cqe;
> - struct ehea_cqe *cqe_skb = NULL;
> - int wqe_index;
> - int rx = 0;
> -
> - cqe_skb = ehea_proc_cqes(pr, EHEA_POLL_MAX_CQES);
> - rx += ehea_proc_rwqes(dev, pr, budget - rx);
> -
> - while (rx != budget) {
> - napi_complete(napi);
> - ehea_reset_cq_ep(pr->recv_cq);
> - ehea_reset_cq_ep(pr->send_cq);
> - ehea_reset_cq_n1(pr->recv_cq);
> - ehea_reset_cq_n1(pr->send_cq);
> - rmb();
> - cqe = ehea_poll_rq1(pr->qp, &wqe_index);
> - cqe_skb = ehea_poll_cq(pr->send_cq);
> -
> - if (!cqe && !cqe_skb)
> - return rx;
> -
> - if (!napi_schedule(napi))
> - return rx;
> -
> - cqe_skb = ehea_proc_cqes(pr, EHEA_POLL_MAX_CQES);
> - rx += ehea_proc_rwqes(dev, pr, budget - rx);
> - }
> -
> - return rx;
> -}
> -
> -static irqreturn_t ehea_recv_irq_handler(int irq, void *param)
> -{
> - struct ehea_port_res *pr = param;
> -
> - napi_schedule(&pr->napi);
> -
> - return IRQ_HANDLED;
> -}
> -
> -static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
> -{
> - struct ehea_port *port = param;
> - struct ehea_eqe *eqe;
> - struct ehea_qp *qp;
> - u32 qp_token;
> - u64 resource_type, aer, aerr;
> - int reset_port = 0;
> -
> - eqe = ehea_poll_eq(port->qp_eq);
> -
> - while (eqe) {
> - qp_token = EHEA_BMASK_GET(EHEA_EQE_QP_TOKEN, eqe->entry);
> - pr_err("QP aff_err: entry=0x%llx, token=0x%x\n",
> - eqe->entry, qp_token);
> -
> - qp = port->port_res[qp_token].qp;
> -
> - resource_type = ehea_error_data(port->adapter, qp->fw_handle,
> - &aer, &aerr);
> -
> - if (resource_type == EHEA_AER_RESTYPE_QP) {
> - if ((aer & EHEA_AER_RESET_MASK) ||
> - (aerr & EHEA_AERR_RESET_MASK))
> - reset_port = 1;
> - } else
> - reset_port = 1; /* Reset in case of CQ or EQ error */
> -
> - eqe = ehea_poll_eq(port->qp_eq);
> - }
> -
> - if (reset_port) {
> - pr_err("Resetting port\n");
> - ehea_schedule_port_reset(port);
> - }
> -
> - return IRQ_HANDLED;
> -}
> -
> -static struct ehea_port *ehea_get_port(struct ehea_adapter *adapter,
> - int logical_port)
> -{
> - int i;
> -
> - for (i = 0; i < EHEA_MAX_PORTS; i++)
> - if (adapter->port[i])
> - if (adapter->port[i]->logical_port_id == logical_port)
> - return adapter->port[i];
> - return NULL;
> -}
> -
> -int ehea_sense_port_attr(struct ehea_port *port)
> -{
> - int ret;
> - u64 hret;
> - struct hcp_ehea_port_cb0 *cb0;
> -
> - /* may be called via ehea_neq_tasklet() */
> - cb0 = (void *)get_zeroed_page(GFP_ATOMIC);
> - if (!cb0) {
> - pr_err("no mem for cb0\n");
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_port(port->adapter->handle,
> - port->logical_port_id, H_PORT_CB0,
> - EHEA_BMASK_SET(H_PORT_CB0_ALL, 0xFFFF),
> - cb0);
> - if (hret != H_SUCCESS) {
> - ret = -EIO;
> - goto out_free;
> - }
> -
> - /* MAC address */
> - port->mac_addr = cb0->port_mac_addr << 16;
> -
> - if (!is_valid_ether_addr((u8 *)&port->mac_addr)) {
> - ret = -EADDRNOTAVAIL;
> - goto out_free;
> - }
> -
> - /* Port speed */
> - switch (cb0->port_speed) {
> - case H_SPEED_10M_H:
> - port->port_speed = EHEA_SPEED_10M;
> - port->full_duplex = 0;
> - break;
> - case H_SPEED_10M_F:
> - port->port_speed = EHEA_SPEED_10M;
> - port->full_duplex = 1;
> - break;
> - case H_SPEED_100M_H:
> - port->port_speed = EHEA_SPEED_100M;
> - port->full_duplex = 0;
> - break;
> - case H_SPEED_100M_F:
> - port->port_speed = EHEA_SPEED_100M;
> - port->full_duplex = 1;
> - break;
> - case H_SPEED_1G_F:
> - port->port_speed = EHEA_SPEED_1G;
> - port->full_duplex = 1;
> - break;
> - case H_SPEED_10G_F:
> - port->port_speed = EHEA_SPEED_10G;
> - port->full_duplex = 1;
> - break;
> - default:
> - port->port_speed = 0;
> - port->full_duplex = 0;
> - break;
> - }
> -
> - port->autoneg = 1;
> - port->num_mcs = cb0->num_default_qps;
> -
> - /* Number of default QPs */
> - if (use_mcs)
> - port->num_def_qps = cb0->num_default_qps;
> - else
> - port->num_def_qps = 1;
> -
> - if (!port->num_def_qps) {
> - ret = -EINVAL;
> - goto out_free;
> - }
> -
> - ret = 0;
> -out_free:
> - if (ret || netif_msg_probe(port))
> - ehea_dump(cb0, sizeof(*cb0), "ehea_sense_port_attr");
> - free_page((unsigned long)cb0);
> -out:
> - return ret;
> -}
> -
> -int ehea_set_portspeed(struct ehea_port *port, u32 port_speed)
> -{
> - struct hcp_ehea_port_cb4 *cb4;
> - u64 hret;
> - int ret = 0;
> -
> - cb4 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb4) {
> - pr_err("no mem for cb4\n");
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - cb4->port_speed = port_speed;
> -
> - netif_carrier_off(port->netdev);
> -
> - hret = ehea_h_modify_ehea_port(port->adapter->handle,
> - port->logical_port_id,
> - H_PORT_CB4, H_PORT_CB4_SPEED, cb4);
> - if (hret == H_SUCCESS) {
> - port->autoneg = port_speed == EHEA_SPEED_AUTONEG ? 1 : 0;
> -
> - hret = ehea_h_query_ehea_port(port->adapter->handle,
> - port->logical_port_id,
> - H_PORT_CB4, H_PORT_CB4_SPEED,
> - cb4);
> - if (hret == H_SUCCESS) {
> - switch (cb4->port_speed) {
> - case H_SPEED_10M_H:
> - port->port_speed = EHEA_SPEED_10M;
> - port->full_duplex = 0;
> - break;
> - case H_SPEED_10M_F:
> - port->port_speed = EHEA_SPEED_10M;
> - port->full_duplex = 1;
> - break;
> - case H_SPEED_100M_H:
> - port->port_speed = EHEA_SPEED_100M;
> - port->full_duplex = 0;
> - break;
> - case H_SPEED_100M_F:
> - port->port_speed = EHEA_SPEED_100M;
> - port->full_duplex = 1;
> - break;
> - case H_SPEED_1G_F:
> - port->port_speed = EHEA_SPEED_1G;
> - port->full_duplex = 1;
> - break;
> - case H_SPEED_10G_F:
> - port->port_speed = EHEA_SPEED_10G;
> - port->full_duplex = 1;
> - break;
> - default:
> - port->port_speed = 0;
> - port->full_duplex = 0;
> - break;
> - }
> - } else {
> - pr_err("Failed sensing port speed\n");
> - ret = -EIO;
> - }
> - } else {
> - if (hret == H_AUTHORITY) {
> - pr_info("Hypervisor denied setting port speed\n");
> - ret = -EPERM;
> - } else {
> - ret = -EIO;
> - pr_err("Failed setting port speed\n");
> - }
> - }
> - if (!prop_carrier_state || (port->phy_link == EHEA_PHY_LINK_UP))
> - netif_carrier_on(port->netdev);
> -
> - free_page((unsigned long)cb4);
> -out:
> - return ret;
> -}
> -
> -static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe)
> -{
> - int ret;
> - u8 ec;
> - u8 portnum;
> - struct ehea_port *port;
> - struct net_device *dev;
> -
> - ec = EHEA_BMASK_GET(NEQE_EVENT_CODE, eqe);
> - portnum = EHEA_BMASK_GET(NEQE_PORTNUM, eqe);
> - port = ehea_get_port(adapter, portnum);
> - if (!port) {
> - netdev_err(NULL, "unknown portnum %x\n", portnum);
> - return;
> - }
> - dev = port->netdev;
> -
> - switch (ec) {
> - case EHEA_EC_PORTSTATE_CHG: /* port state change */
> -
> - if (EHEA_BMASK_GET(NEQE_PORT_UP, eqe)) {
> - if (!netif_carrier_ok(dev)) {
> - ret = ehea_sense_port_attr(port);
> - if (ret) {
> - netdev_err(dev, "failed resensing port attributes\n");
> - break;
> - }
> -
> - netif_info(port, link, dev,
> - "Logical port up: %dMbps %s Duplex\n",
> - port->port_speed,
> - port->full_duplex == 1 ?
> - "Full" : "Half");
> -
> - netif_carrier_on(dev);
> - netif_wake_queue(dev);
> - }
> - } else
> - if (netif_carrier_ok(dev)) {
> - netif_info(port, link, dev,
> - "Logical port down\n");
> - netif_carrier_off(dev);
> - netif_tx_disable(dev);
> - }
> -
> - if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PORT_UP, eqe)) {
> - port->phy_link = EHEA_PHY_LINK_UP;
> - netif_info(port, link, dev,
> - "Physical port up\n");
> - if (prop_carrier_state)
> - netif_carrier_on(dev);
> - } else {
> - port->phy_link = EHEA_PHY_LINK_DOWN;
> - netif_info(port, link, dev,
> - "Physical port down\n");
> - if (prop_carrier_state)
> - netif_carrier_off(dev);
> - }
> -
> - if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PRIMARY, eqe))
> - netdev_info(dev,
> - "External switch port is primary port\n");
> - else
> - netdev_info(dev,
> - "External switch port is backup port\n");
> -
> - break;
> - case EHEA_EC_ADAPTER_MALFUNC:
> - netdev_err(dev, "Adapter malfunction\n");
> - break;
> - case EHEA_EC_PORT_MALFUNC:
> - netdev_info(dev, "Port malfunction\n");
> - netif_carrier_off(dev);
> - netif_tx_disable(dev);
> - break;
> - default:
> - netdev_err(dev, "unknown event code %x, eqe=0x%llX\n", ec, eqe);
> - break;
> - }
> -}
> -
> -static void ehea_neq_tasklet(struct tasklet_struct *t)
> -{
> - struct ehea_adapter *adapter = from_tasklet(adapter, t, neq_tasklet);
> - struct ehea_eqe *eqe;
> - u64 event_mask;
> -
> - eqe = ehea_poll_eq(adapter->neq);
> - pr_debug("eqe=%p\n", eqe);
> -
> - while (eqe) {
> - pr_debug("*eqe=%lx\n", (unsigned long) eqe->entry);
> - ehea_parse_eqe(adapter, eqe->entry);
> - eqe = ehea_poll_eq(adapter->neq);
> - pr_debug("next eqe=%p\n", eqe);
> - }
> -
> - event_mask = EHEA_BMASK_SET(NELR_PORTSTATE_CHG, 1)
> - | EHEA_BMASK_SET(NELR_ADAPTER_MALFUNC, 1)
> - | EHEA_BMASK_SET(NELR_PORT_MALFUNC, 1);
> -
> - ehea_h_reset_events(adapter->handle,
> - adapter->neq->fw_handle, event_mask);
> -}
> -
> -static irqreturn_t ehea_interrupt_neq(int irq, void *param)
> -{
> - struct ehea_adapter *adapter = param;
> - tasklet_hi_schedule(&adapter->neq_tasklet);
> - return IRQ_HANDLED;
> -}
> -
> -
> -static int ehea_fill_port_res(struct ehea_port_res *pr)
> -{
> - int ret;
> - struct ehea_qp_init_attr *init_attr = &pr->qp->init_attr;
> -
> - ehea_init_fill_rq1(pr, pr->rq1_skba.len);
> -
> - ret = ehea_refill_rq2(pr, init_attr->act_nr_rwqes_rq2 - 1);
> -
> - ret |= ehea_refill_rq3(pr, init_attr->act_nr_rwqes_rq3 - 1);
> -
> - return ret;
> -}
> -
> -static int ehea_reg_interrupts(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_port_res *pr;
> - int i, ret;
> -
> -
> - snprintf(port->int_aff_name, EHEA_IRQ_NAME_SIZE - 1, "%s-aff",
> - dev->name);
> -
> - ret = ibmebus_request_irq(port->qp_eq->attr.ist1,
> - ehea_qp_aff_irq_handler,
> - 0, port->int_aff_name, port);
> - if (ret) {
> - netdev_err(dev, "failed registering irq for qp_aff_irq_handler:ist=%X\n",
> - port->qp_eq->attr.ist1);
> - goto out_free_qpeq;
> - }
> -
> - netif_info(port, ifup, dev,
> - "irq_handle 0x%X for function qp_aff_irq_handler registered\n",
> - port->qp_eq->attr.ist1);
> -
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - pr = &port->port_res[i];
> - snprintf(pr->int_send_name, EHEA_IRQ_NAME_SIZE - 1,
> - "%s-queue%d", dev->name, i);
> - ret = ibmebus_request_irq(pr->eq->attr.ist1,
> - ehea_recv_irq_handler,
> - 0, pr->int_send_name, pr);
> - if (ret) {
> - netdev_err(dev, "failed registering irq for ehea_queue port_res_nr:%d, ist=%X\n",
> - i, pr->eq->attr.ist1);
> - goto out_free_req;
> - }
> - netif_info(port, ifup, dev,
> - "irq_handle 0x%X for function ehea_queue_int %d registered\n",
> - pr->eq->attr.ist1, i);
> - }
> -out:
> - return ret;
> -
> -
> -out_free_req:
> - while (--i >= 0) {
> - u32 ist = port->port_res[i].eq->attr.ist1;
> - ibmebus_free_irq(ist, &port->port_res[i]);
> - }
> -
> -out_free_qpeq:
> - ibmebus_free_irq(port->qp_eq->attr.ist1, port);
> - i = port->num_def_qps;
> -
> - goto out;
> -
> -}
> -
> -static void ehea_free_interrupts(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_port_res *pr;
> - int i;
> -
> - /* send */
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - pr = &port->port_res[i];
> - ibmebus_free_irq(pr->eq->attr.ist1, pr);
> - netif_info(port, intr, dev,
> - "free send irq for res %d with handle 0x%X\n",
> - i, pr->eq->attr.ist1);
> - }
> -
> - /* associated events */
> - ibmebus_free_irq(port->qp_eq->attr.ist1, port);
> - netif_info(port, intr, dev,
> - "associated event interrupt for handle 0x%X freed\n",
> - port->qp_eq->attr.ist1);
> -}
> -
> -static int ehea_configure_port(struct ehea_port *port)
> -{
> - int ret, i;
> - u64 hret, mask;
> - struct hcp_ehea_port_cb0 *cb0;
> -
> - ret = -ENOMEM;
> - cb0 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb0)
> - goto out;
> -
> - cb0->port_rc = EHEA_BMASK_SET(PXLY_RC_VALID, 1)
> - | EHEA_BMASK_SET(PXLY_RC_IP_CHKSUM, 1)
> - | EHEA_BMASK_SET(PXLY_RC_TCP_UDP_CHKSUM, 1)
> - | EHEA_BMASK_SET(PXLY_RC_VLAN_XTRACT, 1)
> - | EHEA_BMASK_SET(PXLY_RC_VLAN_TAG_FILTER,
> - PXLY_RC_VLAN_FILTER)
> - | EHEA_BMASK_SET(PXLY_RC_JUMBO_FRAME, 1);
> -
> - for (i = 0; i < port->num_mcs; i++)
> - if (use_mcs)
> - cb0->default_qpn_arr[i] =
> - port->port_res[i].qp->init_attr.qp_nr;
> - else
> - cb0->default_qpn_arr[i] =
> - port->port_res[0].qp->init_attr.qp_nr;
> -
> - if (netif_msg_ifup(port))
> - ehea_dump(cb0, sizeof(*cb0), "ehea_configure_port");
> -
> - mask = EHEA_BMASK_SET(H_PORT_CB0_PRC, 1)
> - | EHEA_BMASK_SET(H_PORT_CB0_DEFQPNARRAY, 1);
> -
> - hret = ehea_h_modify_ehea_port(port->adapter->handle,
> - port->logical_port_id,
> - H_PORT_CB0, mask, cb0);
> - ret = -EIO;
> - if (hret != H_SUCCESS)
> - goto out_free;
> -
> - ret = 0;
> -
> -out_free:
> - free_page((unsigned long)cb0);
> -out:
> - return ret;
> -}
> -
> -static int ehea_gen_smrs(struct ehea_port_res *pr)
> -{
> - int ret;
> - struct ehea_adapter *adapter = pr->port->adapter;
> -
> - ret = ehea_gen_smr(adapter, &adapter->mr, &pr->send_mr);
> - if (ret)
> - goto out;
> -
> - ret = ehea_gen_smr(adapter, &adapter->mr, &pr->recv_mr);
> - if (ret)
> - goto out_free;
> -
> - return 0;
> -
> -out_free:
> - ehea_rem_mr(&pr->send_mr);
> -out:
> - pr_err("Generating SMRS failed\n");
> - return -EIO;
> -}
> -
> -static int ehea_rem_smrs(struct ehea_port_res *pr)
> -{
> - if ((ehea_rem_mr(&pr->send_mr)) ||
> - (ehea_rem_mr(&pr->recv_mr)))
> - return -EIO;
> - else
> - return 0;
> -}
> -
> -static int ehea_init_q_skba(struct ehea_q_skb_arr *q_skba, int max_q_entries)
> -{
> - int arr_size = sizeof(void *) * max_q_entries;
> -
> - q_skba->arr = vzalloc(arr_size);
> - if (!q_skba->arr)
> - return -ENOMEM;
> -
> - q_skba->len = max_q_entries;
> - q_skba->index = 0;
> - q_skba->os_skbs = 0;
> -
> - return 0;
> -}
> -
> -static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr,
> - struct port_res_cfg *pr_cfg, int queue_token)
> -{
> - struct ehea_adapter *adapter = port->adapter;
> - enum ehea_eq_type eq_type = EHEA_EQ;
> - struct ehea_qp_init_attr *init_attr = NULL;
> - int ret = -EIO;
> - u64 tx_bytes, rx_bytes, tx_packets, rx_packets;
> -
> - tx_bytes = pr->tx_bytes;
> - tx_packets = pr->tx_packets;
> - rx_bytes = pr->rx_bytes;
> - rx_packets = pr->rx_packets;
> -
> - memset(pr, 0, sizeof(struct ehea_port_res));
> -
> - pr->tx_bytes = tx_bytes;
> - pr->tx_packets = tx_packets;
> - pr->rx_bytes = rx_bytes;
> - pr->rx_packets = rx_packets;
> -
> - pr->port = port;
> -
> - pr->eq = ehea_create_eq(adapter, eq_type, EHEA_MAX_ENTRIES_EQ, 0);
> - if (!pr->eq) {
> - pr_err("create_eq failed (eq)\n");
> - goto out_free;
> - }
> -
> - pr->recv_cq = ehea_create_cq(adapter, pr_cfg->max_entries_rcq,
> - pr->eq->fw_handle,
> - port->logical_port_id);
> - if (!pr->recv_cq) {
> - pr_err("create_cq failed (cq_recv)\n");
> - goto out_free;
> - }
> -
> - pr->send_cq = ehea_create_cq(adapter, pr_cfg->max_entries_scq,
> - pr->eq->fw_handle,
> - port->logical_port_id);
> - if (!pr->send_cq) {
> - pr_err("create_cq failed (cq_send)\n");
> - goto out_free;
> - }
> -
> - if (netif_msg_ifup(port))
> - pr_info("Send CQ: act_nr_cqes=%d, Recv CQ: act_nr_cqes=%d\n",
> - pr->send_cq->attr.act_nr_of_cqes,
> - pr->recv_cq->attr.act_nr_of_cqes);
> -
> - init_attr = kzalloc_obj(*init_attr);
> - if (!init_attr) {
> - ret = -ENOMEM;
> - pr_err("no mem for ehea_qp_init_attr\n");
> - goto out_free;
> - }
> -
> - init_attr->low_lat_rq1 = 1;
> - init_attr->signalingtype = 1; /* generate CQE if specified in WQE */
> - init_attr->rq_count = 3;
> - init_attr->qp_token = queue_token;
> - init_attr->max_nr_send_wqes = pr_cfg->max_entries_sq;
> - init_attr->max_nr_rwqes_rq1 = pr_cfg->max_entries_rq1;
> - init_attr->max_nr_rwqes_rq2 = pr_cfg->max_entries_rq2;
> - init_attr->max_nr_rwqes_rq3 = pr_cfg->max_entries_rq3;
> - init_attr->wqe_size_enc_sq = EHEA_SG_SQ;
> - init_attr->wqe_size_enc_rq1 = EHEA_SG_RQ1;
> - init_attr->wqe_size_enc_rq2 = EHEA_SG_RQ2;
> - init_attr->wqe_size_enc_rq3 = EHEA_SG_RQ3;
> - init_attr->rq2_threshold = EHEA_RQ2_THRESHOLD;
> - init_attr->rq3_threshold = EHEA_RQ3_THRESHOLD;
> - init_attr->port_nr = port->logical_port_id;
> - init_attr->send_cq_handle = pr->send_cq->fw_handle;
> - init_attr->recv_cq_handle = pr->recv_cq->fw_handle;
> - init_attr->aff_eq_handle = port->qp_eq->fw_handle;
> -
> - pr->qp = ehea_create_qp(adapter, adapter->pd, init_attr);
> - if (!pr->qp) {
> - pr_err("create_qp failed\n");
> - ret = -EIO;
> - goto out_free;
> - }
> -
> - if (netif_msg_ifup(port))
> - pr_info("QP: qp_nr=%d\n act_nr_snd_wqe=%d\n nr_rwqe_rq1=%d\n nr_rwqe_rq2=%d\n nr_rwqe_rq3=%d\n",
> - init_attr->qp_nr,
> - init_attr->act_nr_send_wqes,
> - init_attr->act_nr_rwqes_rq1,
> - init_attr->act_nr_rwqes_rq2,
> - init_attr->act_nr_rwqes_rq3);
> -
> - pr->sq_skba_size = init_attr->act_nr_send_wqes + 1;
> -
> - ret = ehea_init_q_skba(&pr->sq_skba, pr->sq_skba_size);
> - ret |= ehea_init_q_skba(&pr->rq1_skba, init_attr->act_nr_rwqes_rq1 + 1);
> - ret |= ehea_init_q_skba(&pr->rq2_skba, init_attr->act_nr_rwqes_rq2 + 1);
> - ret |= ehea_init_q_skba(&pr->rq3_skba, init_attr->act_nr_rwqes_rq3 + 1);
> - if (ret)
> - goto out_free;
> -
> - pr->swqe_refill_th = init_attr->act_nr_send_wqes / 10;
> - if (ehea_gen_smrs(pr) != 0) {
> - ret = -EIO;
> - goto out_free;
> - }
> -
> - atomic_set(&pr->swqe_avail, init_attr->act_nr_send_wqes - 1);
> -
> - kfree(init_attr);
> -
> - netif_napi_add(pr->port->netdev, &pr->napi, ehea_poll);
> -
> - ret = 0;
> - goto out;
> -
> -out_free:
> - kfree(init_attr);
> - vfree(pr->sq_skba.arr);
> - vfree(pr->rq1_skba.arr);
> - vfree(pr->rq2_skba.arr);
> - vfree(pr->rq3_skba.arr);
> - ehea_destroy_qp(pr->qp);
> - ehea_destroy_cq(pr->send_cq);
> - ehea_destroy_cq(pr->recv_cq);
> - ehea_destroy_eq(pr->eq);
> -out:
> - return ret;
> -}
> -
> -static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr)
> -{
> - int ret, i;
> -
> - if (pr->qp)
> - netif_napi_del(&pr->napi);
> -
> - ret = ehea_destroy_qp(pr->qp);
> -
> - if (!ret) {
> - ehea_destroy_cq(pr->send_cq);
> - ehea_destroy_cq(pr->recv_cq);
> - ehea_destroy_eq(pr->eq);
> -
> - for (i = 0; i < pr->rq1_skba.len; i++)
> - dev_kfree_skb(pr->rq1_skba.arr[i]);
> -
> - for (i = 0; i < pr->rq2_skba.len; i++)
> - dev_kfree_skb(pr->rq2_skba.arr[i]);
> -
> - for (i = 0; i < pr->rq3_skba.len; i++)
> - dev_kfree_skb(pr->rq3_skba.arr[i]);
> -
> - for (i = 0; i < pr->sq_skba.len; i++)
> - dev_kfree_skb(pr->sq_skba.arr[i]);
> -
> - vfree(pr->rq1_skba.arr);
> - vfree(pr->rq2_skba.arr);
> - vfree(pr->rq3_skba.arr);
> - vfree(pr->sq_skba.arr);
> - ret = ehea_rem_smrs(pr);
> - }
> - return ret;
> -}
> -
> -static void write_swqe2_immediate(struct sk_buff *skb, struct ehea_swqe *swqe,
> - u32 lkey)
> -{
> - int skb_data_size = skb_headlen(skb);
> - u8 *imm_data = &swqe->u.immdata_desc.immediate_data[0];
> - struct ehea_vsgentry *sg1entry = &swqe->u.immdata_desc.sg_entry;
> - unsigned int immediate_len = SWQE2_MAX_IMM;
> -
> - swqe->descriptors = 0;
> -
> - if (skb_is_gso(skb)) {
> - swqe->tx_control |= EHEA_SWQE_TSO;
> - swqe->mss = skb_shinfo(skb)->gso_size;
> - /*
> - * For TSO packets we only copy the headers into the
> - * immediate area.
> - */
> - immediate_len = skb_tcp_all_headers(skb);
> - }
> -
> - if (skb_is_gso(skb) || skb_data_size >= SWQE2_MAX_IMM) {
> - skb_copy_from_linear_data(skb, imm_data, immediate_len);
> - swqe->immediate_data_length = immediate_len;
> -
> - if (skb_data_size > immediate_len) {
> - sg1entry->l_key = lkey;
> - sg1entry->len = skb_data_size - immediate_len;
> - sg1entry->vaddr =
> - ehea_map_vaddr(skb->data + immediate_len);
> - swqe->descriptors++;
> - }
> - } else {
> - skb_copy_from_linear_data(skb, imm_data, skb_data_size);
> - swqe->immediate_data_length = skb_data_size;
> - }
> -}
> -
> -static inline void write_swqe2_data(struct sk_buff *skb, struct net_device *dev,
> - struct ehea_swqe *swqe, u32 lkey)
> -{
> - struct ehea_vsgentry *sg_list, *sg1entry, *sgentry;
> - skb_frag_t *frag;
> - int nfrags, sg1entry_contains_frag_data, i;
> -
> - nfrags = skb_shinfo(skb)->nr_frags;
> - sg1entry = &swqe->u.immdata_desc.sg_entry;
> - sg_list = (struct ehea_vsgentry *)&swqe->u.immdata_desc.sg_list;
> - sg1entry_contains_frag_data = 0;
> -
> - write_swqe2_immediate(skb, swqe, lkey);
> -
> - /* write descriptors */
> - if (nfrags > 0) {
> - if (swqe->descriptors == 0) {
> - /* sg1entry not yet used */
> - frag = &skb_shinfo(skb)->frags[0];
> -
> - /* copy sg1entry data */
> - sg1entry->l_key = lkey;
> - sg1entry->len = skb_frag_size(frag);
> - sg1entry->vaddr =
> - ehea_map_vaddr(skb_frag_address(frag));
> - swqe->descriptors++;
> - sg1entry_contains_frag_data = 1;
> - }
> -
> - for (i = sg1entry_contains_frag_data; i < nfrags; i++) {
> -
> - frag = &skb_shinfo(skb)->frags[i];
> - sgentry = &sg_list[i - sg1entry_contains_frag_data];
> -
> - sgentry->l_key = lkey;
> - sgentry->len = skb_frag_size(frag);
> - sgentry->vaddr = ehea_map_vaddr(skb_frag_address(frag));
> - swqe->descriptors++;
> - }
> - }
> -}
> -
> -static int ehea_broadcast_reg_helper(struct ehea_port *port, u32 hcallid)
> -{
> - int ret = 0;
> - u64 hret;
> - u8 reg_type;
> -
> - /* De/Register untagged packets */
> - reg_type = EHEA_BCMC_BROADCAST | EHEA_BCMC_UNTAGGED;
> - hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
> - port->logical_port_id,
> - reg_type, port->mac_addr, 0, hcallid);
> - if (hret != H_SUCCESS) {
> - pr_err("%sregistering bc address failed (tagged)\n",
> - hcallid == H_REG_BCMC ? "" : "de");
> - ret = -EIO;
> - goto out_herr;
> - }
> -
> - /* De/Register VLAN packets */
> - reg_type = EHEA_BCMC_BROADCAST | EHEA_BCMC_VLANID_ALL;
> - hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
> - port->logical_port_id,
> - reg_type, port->mac_addr, 0, hcallid);
> - if (hret != H_SUCCESS) {
> - pr_err("%sregistering bc address failed (vlan)\n",
> - hcallid == H_REG_BCMC ? "" : "de");
> - ret = -EIO;
> - }
> -out_herr:
> - return ret;
> -}
> -
> -static int ehea_set_mac_addr(struct net_device *dev, void *sa)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct sockaddr *mac_addr = sa;
> - struct hcp_ehea_port_cb0 *cb0;
> - int ret;
> - u64 hret;
> -
> - if (!is_valid_ether_addr(mac_addr->sa_data)) {
> - ret = -EADDRNOTAVAIL;
> - goto out;
> - }
> -
> - cb0 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb0) {
> - pr_err("no mem for cb0\n");
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - memcpy(&(cb0->port_mac_addr), &(mac_addr->sa_data[0]), ETH_ALEN);
> -
> - cb0->port_mac_addr = cb0->port_mac_addr >> 16;
> -
> - hret = ehea_h_modify_ehea_port(port->adapter->handle,
> - port->logical_port_id, H_PORT_CB0,
> - EHEA_BMASK_SET(H_PORT_CB0_MAC, 1), cb0);
> - if (hret != H_SUCCESS) {
> - ret = -EIO;
> - goto out_free;
> - }
> -
> - eth_hw_addr_set(dev, mac_addr->sa_data);
> -
> - /* Deregister old MAC in pHYP */
> - if (port->state == EHEA_PORT_UP) {
> - ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
> - if (ret)
> - goto out_upregs;
> - }
> -
> - port->mac_addr = cb0->port_mac_addr << 16;
> -
> - /* Register new MAC in pHYP */
> - if (port->state == EHEA_PORT_UP) {
> - ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
> - if (ret)
> - goto out_upregs;
> - }
> -
> - ret = 0;
> -
> -out_upregs:
> - ehea_update_bcmc_registrations();
> -out_free:
> - free_page((unsigned long)cb0);
> -out:
> - return ret;
> -}
> -
> -static void ehea_promiscuous_error(u64 hret, int enable)
> -{
> - if (hret == H_AUTHORITY)
> - pr_info("Hypervisor denied %sabling promiscuous mode\n",
> - enable == 1 ? "en" : "dis");
> - else
> - pr_err("failed %sabling promiscuous mode\n",
> - enable == 1 ? "en" : "dis");
> -}
> -
> -static void ehea_promiscuous(struct net_device *dev, int enable)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct hcp_ehea_port_cb7 *cb7;
> - u64 hret;
> -
> - if (enable == port->promisc)
> - return;
> -
> - cb7 = (void *)get_zeroed_page(GFP_ATOMIC);
> - if (!cb7) {
> - pr_err("no mem for cb7\n");
> - goto out;
> - }
> -
> - /* Modify Pxs_DUCQPN in CB7 */
> - cb7->def_uc_qpn = enable == 1 ? port->port_res[0].qp->fw_handle : 0;
> -
> - hret = ehea_h_modify_ehea_port(port->adapter->handle,
> - port->logical_port_id,
> - H_PORT_CB7, H_PORT_CB7_DUCQPN, cb7);
> - if (hret) {
> - ehea_promiscuous_error(hret, enable);
> - goto out;
> - }
> -
> - port->promisc = enable;
> -out:
> - free_page((unsigned long)cb7);
> -}
> -
> -static u64 ehea_multicast_reg_helper(struct ehea_port *port, u64 mc_mac_addr,
> - u32 hcallid)
> -{
> - u64 hret;
> - u8 reg_type;
> -
> - reg_type = EHEA_BCMC_MULTICAST | EHEA_BCMC_UNTAGGED;
> - if (mc_mac_addr == 0)
> - reg_type |= EHEA_BCMC_SCOPE_ALL;
> -
> - hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
> - port->logical_port_id,
> - reg_type, mc_mac_addr, 0, hcallid);
> - if (hret)
> - goto out;
> -
> - reg_type = EHEA_BCMC_MULTICAST | EHEA_BCMC_VLANID_ALL;
> - if (mc_mac_addr == 0)
> - reg_type |= EHEA_BCMC_SCOPE_ALL;
> -
> - hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
> - port->logical_port_id,
> - reg_type, mc_mac_addr, 0, hcallid);
> -out:
> - return hret;
> -}
> -
> -static int ehea_drop_multicast_list(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_mc_list *mc_entry = port->mc_list;
> - struct list_head *pos;
> - struct list_head *temp;
> - int ret = 0;
> - u64 hret;
> -
> - list_for_each_safe(pos, temp, &(port->mc_list->list)) {
> - mc_entry = list_entry(pos, struct ehea_mc_list, list);
> -
> - hret = ehea_multicast_reg_helper(port, mc_entry->macaddr,
> - H_DEREG_BCMC);
> - if (hret) {
> - pr_err("failed deregistering mcast MAC\n");
> - ret = -EIO;
> - }
> -
> - list_del(pos);
> - kfree(mc_entry);
> - }
> - return ret;
> -}
> -
> -static void ehea_allmulti(struct net_device *dev, int enable)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - u64 hret;
> -
> - if (!port->allmulti) {
> - if (enable) {
> - /* Enable ALLMULTI */
> - ehea_drop_multicast_list(dev);
> - hret = ehea_multicast_reg_helper(port, 0, H_REG_BCMC);
> - if (!hret)
> - port->allmulti = 1;
> - else
> - netdev_err(dev,
> - "failed enabling IFF_ALLMULTI\n");
> - }
> - } else {
> - if (!enable) {
> - /* Disable ALLMULTI */
> - hret = ehea_multicast_reg_helper(port, 0, H_DEREG_BCMC);
> - if (!hret)
> - port->allmulti = 0;
> - else
> - netdev_err(dev,
> - "failed disabling IFF_ALLMULTI\n");
> - }
> - }
> -}
> -
> -static void ehea_add_multicast_entry(struct ehea_port *port, u8 *mc_mac_addr)
> -{
> - struct ehea_mc_list *ehea_mcl_entry;
> - u64 hret;
> -
> - ehea_mcl_entry = kzalloc_obj(*ehea_mcl_entry, GFP_ATOMIC);
> - if (!ehea_mcl_entry)
> - return;
> -
> - INIT_LIST_HEAD(&ehea_mcl_entry->list);
> -
> - memcpy(&ehea_mcl_entry->macaddr, mc_mac_addr, ETH_ALEN);
> -
> - hret = ehea_multicast_reg_helper(port, ehea_mcl_entry->macaddr,
> - H_REG_BCMC);
> - if (!hret)
> - list_add(&ehea_mcl_entry->list, &port->mc_list->list);
> - else {
> - pr_err("failed registering mcast MAC\n");
> - kfree(ehea_mcl_entry);
> - }
> -}
> -
> -static void ehea_set_multicast_list(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct netdev_hw_addr *ha;
> - int ret;
> -
> - ehea_promiscuous(dev, !!(dev->flags & IFF_PROMISC));
> -
> - if (dev->flags & IFF_ALLMULTI) {
> - ehea_allmulti(dev, 1);
> - goto out;
> - }
> - ehea_allmulti(dev, 0);
> -
> - if (!netdev_mc_empty(dev)) {
> - ret = ehea_drop_multicast_list(dev);
> - if (ret) {
> - /* Dropping the current multicast list failed.
> - * Enabling ALL_MULTI is the best we can do.
> - */
> - ehea_allmulti(dev, 1);
> - }
> -
> - if (netdev_mc_count(dev) > port->adapter->max_mc_mac) {
> - pr_info("Mcast registration limit reached (0x%llx). Use ALLMULTI!\n",
> - port->adapter->max_mc_mac);
> - goto out;
> - }
> -
> - netdev_for_each_mc_addr(ha, dev)
> - ehea_add_multicast_entry(port, ha->addr);
> -
> - }
> -out:
> - ehea_update_bcmc_registrations();
> -}
> -
> -static void xmit_common(struct sk_buff *skb, struct ehea_swqe *swqe)
> -{
> - swqe->tx_control |= EHEA_SWQE_IMM_DATA_PRESENT | EHEA_SWQE_CRC;
> -
> - if (vlan_get_protocol(skb) != htons(ETH_P_IP))
> - return;
> -
> - if (skb->ip_summed == CHECKSUM_PARTIAL)
> - swqe->tx_control |= EHEA_SWQE_IP_CHECKSUM;
> -
> - swqe->ip_start = skb_network_offset(skb);
> - swqe->ip_end = swqe->ip_start + ip_hdrlen(skb) - 1;
> -
> - switch (ip_hdr(skb)->protocol) {
> - case IPPROTO_UDP:
> - if (skb->ip_summed == CHECKSUM_PARTIAL)
> - swqe->tx_control |= EHEA_SWQE_TCP_CHECKSUM;
> -
> - swqe->tcp_offset = swqe->ip_end + 1 +
> - offsetof(struct udphdr, check);
> - break;
> -
> - case IPPROTO_TCP:
> - if (skb->ip_summed == CHECKSUM_PARTIAL)
> - swqe->tx_control |= EHEA_SWQE_TCP_CHECKSUM;
> -
> - swqe->tcp_offset = swqe->ip_end + 1 +
> - offsetof(struct tcphdr, check);
> - break;
> - }
> -}
> -
> -static void ehea_xmit2(struct sk_buff *skb, struct net_device *dev,
> - struct ehea_swqe *swqe, u32 lkey)
> -{
> - swqe->tx_control |= EHEA_SWQE_DESCRIPTORS_PRESENT;
> -
> - xmit_common(skb, swqe);
> -
> - write_swqe2_data(skb, dev, swqe, lkey);
> -}
> -
> -static void ehea_xmit3(struct sk_buff *skb, struct net_device *dev,
> - struct ehea_swqe *swqe)
> -{
> - u8 *imm_data = &swqe->u.immdata_nodesc.immediate_data[0];
> -
> - xmit_common(skb, swqe);
> -
> - if (!skb->data_len)
> - skb_copy_from_linear_data(skb, imm_data, skb->len);
> - else
> - skb_copy_bits(skb, 0, imm_data, skb->len);
> -
> - swqe->immediate_data_length = skb->len;
> - dev_consume_skb_any(skb);
> -}
> -
> -static netdev_tx_t ehea_start_xmit(struct sk_buff *skb, struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_swqe *swqe;
> - u32 lkey;
> - int swqe_index;
> - struct ehea_port_res *pr;
> - struct netdev_queue *txq;
> -
> - pr = &port->port_res[skb_get_queue_mapping(skb)];
> - txq = netdev_get_tx_queue(dev, skb_get_queue_mapping(skb));
> -
> - swqe = ehea_get_swqe(pr->qp, &swqe_index);
> - memset(swqe, 0, SWQE_HEADER_SIZE);
> - atomic_dec(&pr->swqe_avail);
> -
> - if (skb_vlan_tag_present(skb)) {
> - swqe->tx_control |= EHEA_SWQE_VLAN_INSERT;
> - swqe->vlan_tag = skb_vlan_tag_get(skb);
> - }
> -
> - pr->tx_packets++;
> - pr->tx_bytes += skb->len;
> -
> - if (skb->len <= SWQE3_MAX_IMM) {
> - u32 sig_iv = port->sig_comp_iv;
> - u32 swqe_num = pr->swqe_id_counter;
> - ehea_xmit3(skb, dev, swqe);
> - swqe->wr_id = EHEA_BMASK_SET(EHEA_WR_ID_TYPE, EHEA_SWQE3_TYPE)
> - | EHEA_BMASK_SET(EHEA_WR_ID_COUNT, swqe_num);
> - if (pr->swqe_ll_count >= (sig_iv - 1)) {
> - swqe->wr_id |= EHEA_BMASK_SET(EHEA_WR_ID_REFILL,
> - sig_iv);
> - swqe->tx_control |= EHEA_SWQE_SIGNALLED_COMPLETION;
> - pr->swqe_ll_count = 0;
> - } else
> - pr->swqe_ll_count += 1;
> - } else {
> - swqe->wr_id =
> - EHEA_BMASK_SET(EHEA_WR_ID_TYPE, EHEA_SWQE2_TYPE)
> - | EHEA_BMASK_SET(EHEA_WR_ID_COUNT, pr->swqe_id_counter)
> - | EHEA_BMASK_SET(EHEA_WR_ID_REFILL, 1)
> - | EHEA_BMASK_SET(EHEA_WR_ID_INDEX, pr->sq_skba.index);
> - pr->sq_skba.arr[pr->sq_skba.index] = skb;
> -
> - pr->sq_skba.index++;
> - pr->sq_skba.index &= (pr->sq_skba.len - 1);
> -
> - lkey = pr->send_mr.lkey;
> - ehea_xmit2(skb, dev, swqe, lkey);
> - swqe->tx_control |= EHEA_SWQE_SIGNALLED_COMPLETION;
> - }
> - pr->swqe_id_counter += 1;
> -
> - netif_info(port, tx_queued, dev,
> - "post swqe on QP %d\n", pr->qp->init_attr.qp_nr);
> - if (netif_msg_tx_queued(port))
> - ehea_dump(swqe, 512, "swqe");
> -
> - if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
> - netif_tx_stop_queue(txq);
> - swqe->tx_control |= EHEA_SWQE_PURGE;
> - }
> -
> - ehea_post_swqe(pr->qp, swqe);
> -
> - if (unlikely(atomic_read(&pr->swqe_avail) <= 1)) {
> - pr->p_stats.queue_stopped++;
> - netif_tx_stop_queue(txq);
> - }
> -
> - return NETDEV_TX_OK;
> -}
> -
> -static int ehea_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_adapter *adapter = port->adapter;
> - struct hcp_ehea_port_cb1 *cb1;
> - int index;
> - u64 hret;
> - int err = 0;
> -
> - cb1 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb1) {
> - pr_err("no mem for cb1\n");
> - err = -ENOMEM;
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_port(adapter->handle, port->logical_port_id,
> - H_PORT_CB1, H_PORT_CB1_ALL, cb1);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_port failed\n");
> - err = -EINVAL;
> - goto out;
> - }
> -
> - index = (vid / 64);
> - cb1->vlan_filter[index] |= ((u64)(0x8000000000000000 >> (vid & 0x3F)));
> -
> - hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
> - H_PORT_CB1, H_PORT_CB1_ALL, cb1);
> - if (hret != H_SUCCESS) {
> - pr_err("modify_ehea_port failed\n");
> - err = -EINVAL;
> - }
> -out:
> - free_page((unsigned long)cb1);
> - return err;
> -}
> -
> -static int ehea_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_adapter *adapter = port->adapter;
> - struct hcp_ehea_port_cb1 *cb1;
> - int index;
> - u64 hret;
> - int err = 0;
> -
> - cb1 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb1) {
> - pr_err("no mem for cb1\n");
> - err = -ENOMEM;
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_port(adapter->handle, port->logical_port_id,
> - H_PORT_CB1, H_PORT_CB1_ALL, cb1);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_port failed\n");
> - err = -EINVAL;
> - goto out;
> - }
> -
> - index = (vid / 64);
> - cb1->vlan_filter[index] &= ~((u64)(0x8000000000000000 >> (vid & 0x3F)));
> -
> - hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
> - H_PORT_CB1, H_PORT_CB1_ALL, cb1);
> - if (hret != H_SUCCESS) {
> - pr_err("modify_ehea_port failed\n");
> - err = -EINVAL;
> - }
> -out:
> - free_page((unsigned long)cb1);
> - return err;
> -}
> -
> -static int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp)
> -{
> - int ret = -EIO;
> - u64 hret;
> - u16 dummy16 = 0;
> - u64 dummy64 = 0;
> - struct hcp_modify_qp_cb0 *cb0;
> -
> - cb0 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb0) {
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_qp failed (1)\n");
> - goto out;
> - }
> -
> - cb0->qp_ctl_reg = H_QP_CR_STATE_INITIALIZED;
> - hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG, 1), cb0,
> - &dummy64, &dummy64, &dummy16, &dummy16);
> - if (hret != H_SUCCESS) {
> - pr_err("modify_ehea_qp failed (1)\n");
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_qp failed (2)\n");
> - goto out;
> - }
> -
> - cb0->qp_ctl_reg = H_QP_CR_ENABLED | H_QP_CR_STATE_INITIALIZED;
> - hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG, 1), cb0,
> - &dummy64, &dummy64, &dummy16, &dummy16);
> - if (hret != H_SUCCESS) {
> - pr_err("modify_ehea_qp failed (2)\n");
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_qp failed (3)\n");
> - goto out;
> - }
> -
> - cb0->qp_ctl_reg = H_QP_CR_ENABLED | H_QP_CR_STATE_RDY2SND;
> - hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG, 1), cb0,
> - &dummy64, &dummy64, &dummy16, &dummy16);
> - if (hret != H_SUCCESS) {
> - pr_err("modify_ehea_qp failed (3)\n");
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF), cb0);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_qp failed (4)\n");
> - goto out;
> - }
> -
> - ret = 0;
> -out:
> - free_page((unsigned long)cb0);
> - return ret;
> -}
> -
> -static int ehea_port_res_setup(struct ehea_port *port, int def_qps)
> -{
> - int ret, i;
> - struct port_res_cfg pr_cfg, pr_cfg_small_rx;
> - enum ehea_eq_type eq_type = EHEA_EQ;
> -
> - port->qp_eq = ehea_create_eq(port->adapter, eq_type,
> - EHEA_MAX_ENTRIES_EQ, 1);
> - if (!port->qp_eq) {
> - ret = -EINVAL;
> - pr_err("ehea_create_eq failed (qp_eq)\n");
> - goto out_kill_eq;
> - }
> -
> - pr_cfg.max_entries_rcq = rq1_entries + rq2_entries + rq3_entries;
> - pr_cfg.max_entries_scq = sq_entries * 2;
> - pr_cfg.max_entries_sq = sq_entries;
> - pr_cfg.max_entries_rq1 = rq1_entries;
> - pr_cfg.max_entries_rq2 = rq2_entries;
> - pr_cfg.max_entries_rq3 = rq3_entries;
> -
> - pr_cfg_small_rx.max_entries_rcq = 1;
> - pr_cfg_small_rx.max_entries_scq = sq_entries;
> - pr_cfg_small_rx.max_entries_sq = sq_entries;
> - pr_cfg_small_rx.max_entries_rq1 = 1;
> - pr_cfg_small_rx.max_entries_rq2 = 1;
> - pr_cfg_small_rx.max_entries_rq3 = 1;
> -
> - for (i = 0; i < def_qps; i++) {
> - ret = ehea_init_port_res(port, &port->port_res[i], &pr_cfg, i);
> - if (ret)
> - goto out_clean_pr;
> - }
> - for (i = def_qps; i < def_qps; i++) {
> - ret = ehea_init_port_res(port, &port->port_res[i],
> - &pr_cfg_small_rx, i);
> - if (ret)
> - goto out_clean_pr;
> - }
> -
> - return 0;
> -
> -out_clean_pr:
> - while (--i >= 0)
> - ehea_clean_portres(port, &port->port_res[i]);
> -
> -out_kill_eq:
> - ehea_destroy_eq(port->qp_eq);
> - return ret;
> -}
> -
> -static int ehea_clean_all_portres(struct ehea_port *port)
> -{
> - int ret = 0;
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++)
> - ret |= ehea_clean_portres(port, &port->port_res[i]);
> -
> - ret |= ehea_destroy_eq(port->qp_eq);
> -
> - return ret;
> -}
> -
> -static void ehea_remove_adapter_mr(struct ehea_adapter *adapter)
> -{
> - if (adapter->active_ports)
> - return;
> -
> - ehea_rem_mr(&adapter->mr);
> -}
> -
> -static int ehea_add_adapter_mr(struct ehea_adapter *adapter)
> -{
> - if (adapter->active_ports)
> - return 0;
> -
> - return ehea_reg_kernel_mr(adapter, &adapter->mr);
> -}
> -
> -static int ehea_up(struct net_device *dev)
> -{
> - int ret, i;
> - struct ehea_port *port = netdev_priv(dev);
> -
> - if (port->state == EHEA_PORT_UP)
> - return 0;
> -
> - ret = ehea_port_res_setup(port, port->num_def_qps);
> - if (ret) {
> - netdev_err(dev, "port_res_failed\n");
> - goto out;
> - }
> -
> - /* Set default QP for this port */
> - ret = ehea_configure_port(port);
> - if (ret) {
> - netdev_err(dev, "ehea_configure_port failed. ret:%d\n", ret);
> - goto out_clean_pr;
> - }
> -
> - ret = ehea_reg_interrupts(dev);
> - if (ret) {
> - netdev_err(dev, "reg_interrupts failed. ret:%d\n", ret);
> - goto out_clean_pr;
> - }
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - ret = ehea_activate_qp(port->adapter, port->port_res[i].qp);
> - if (ret) {
> - netdev_err(dev, "activate_qp failed\n");
> - goto out_free_irqs;
> - }
> - }
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - ret = ehea_fill_port_res(&port->port_res[i]);
> - if (ret) {
> - netdev_err(dev, "out_free_irqs\n");
> - goto out_free_irqs;
> - }
> - }
> -
> - ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
> - if (ret) {
> - ret = -EIO;
> - goto out_free_irqs;
> - }
> -
> - port->state = EHEA_PORT_UP;
> -
> - ret = 0;
> - goto out;
> -
> -out_free_irqs:
> - ehea_free_interrupts(dev);
> -
> -out_clean_pr:
> - ehea_clean_all_portres(port);
> -out:
> - if (ret)
> - netdev_info(dev, "Failed starting. ret=%i\n", ret);
> -
> - ehea_update_bcmc_registrations();
> - ehea_update_firmware_handles();
> -
> - return ret;
> -}
> -
> -static void port_napi_disable(struct ehea_port *port)
> -{
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++)
> - napi_disable(&port->port_res[i].napi);
> -}
> -
> -static void port_napi_enable(struct ehea_port *port)
> -{
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++)
> - napi_enable(&port->port_res[i].napi);
> -}
> -
> -static int ehea_open(struct net_device *dev)
> -{
> - int ret;
> - struct ehea_port *port = netdev_priv(dev);
> -
> - mutex_lock(&port->port_lock);
> -
> - netif_info(port, ifup, dev, "enabling port\n");
> -
> - netif_carrier_off(dev);
> -
> - ret = ehea_up(dev);
> - if (!ret) {
> - port_napi_enable(port);
> - netif_tx_start_all_queues(dev);
> - }
> -
> - mutex_unlock(&port->port_lock);
> - schedule_delayed_work(&port->stats_work,
> - round_jiffies_relative(msecs_to_jiffies(1000)));
> -
> - return ret;
> -}
> -
> -static int ehea_down(struct net_device *dev)
> -{
> - int ret;
> - struct ehea_port *port = netdev_priv(dev);
> -
> - if (port->state == EHEA_PORT_DOWN)
> - return 0;
> -
> - ehea_drop_multicast_list(dev);
> - ehea_allmulti(dev, 0);
> - ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
> -
> - ehea_free_interrupts(dev);
> -
> - port->state = EHEA_PORT_DOWN;
> -
> - ehea_update_bcmc_registrations();
> -
> - ret = ehea_clean_all_portres(port);
> - if (ret)
> - netdev_info(dev, "Failed freeing resources. ret=%i\n", ret);
> -
> - ehea_update_firmware_handles();
> -
> - return ret;
> -}
> -
> -static int ehea_stop(struct net_device *dev)
> -{
> - int ret;
> - struct ehea_port *port = netdev_priv(dev);
> -
> - netif_info(port, ifdown, dev, "disabling port\n");
> -
> - set_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
> - cancel_work_sync(&port->reset_task);
> - cancel_delayed_work_sync(&port->stats_work);
> - mutex_lock(&port->port_lock);
> - netif_tx_stop_all_queues(dev);
> - port_napi_disable(port);
> - ret = ehea_down(dev);
> - mutex_unlock(&port->port_lock);
> - clear_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
> - return ret;
> -}
> -
> -static void ehea_purge_sq(struct ehea_qp *orig_qp)
> -{
> - struct ehea_qp qp = *orig_qp;
> - struct ehea_qp_init_attr *init_attr = &qp.init_attr;
> - struct ehea_swqe *swqe;
> - int wqe_index;
> - int i;
> -
> - for (i = 0; i < init_attr->act_nr_send_wqes; i++) {
> - swqe = ehea_get_swqe(&qp, &wqe_index);
> - swqe->tx_control |= EHEA_SWQE_PURGE;
> - }
> -}
> -
> -static void ehea_flush_sq(struct ehea_port *port)
> -{
> - int i;
> -
> - for (i = 0; i < port->num_def_qps; i++) {
> - struct ehea_port_res *pr = &port->port_res[i];
> - int swqe_max = pr->sq_skba_size - 2 - pr->swqe_ll_count;
> - int ret;
> -
> - ret = wait_event_timeout(port->swqe_avail_wq,
> - atomic_read(&pr->swqe_avail) >= swqe_max,
> - msecs_to_jiffies(100));
> -
> - if (!ret) {
> - pr_err("WARNING: sq not flushed completely\n");
> - break;
> - }
> - }
> -}
> -
> -static int ehea_stop_qps(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_adapter *adapter = port->adapter;
> - struct hcp_modify_qp_cb0 *cb0;
> - int ret = -EIO;
> - int dret;
> - int i;
> - u64 hret;
> - u64 dummy64 = 0;
> - u16 dummy16 = 0;
> -
> - cb0 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb0) {
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - for (i = 0; i < (port->num_def_qps); i++) {
> - struct ehea_port_res *pr = &port->port_res[i];
> - struct ehea_qp *qp = pr->qp;
> -
> - /* Purge send queue */
> - ehea_purge_sq(qp);
> -
> - /* Disable queue pair */
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
> - cb0);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_qp failed (1)\n");
> - goto out;
> - }
> -
> - cb0->qp_ctl_reg = (cb0->qp_ctl_reg & H_QP_CR_RES_STATE) << 8;
> - cb0->qp_ctl_reg &= ~H_QP_CR_ENABLED;
> -
> - hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG,
> - 1), cb0, &dummy64,
> - &dummy64, &dummy16, &dummy16);
> - if (hret != H_SUCCESS) {
> - pr_err("modify_ehea_qp failed (1)\n");
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
> - cb0);
> - if (hret != H_SUCCESS) {
> - pr_err("query_ehea_qp failed (2)\n");
> - goto out;
> - }
> -
> - /* deregister shared memory regions */
> - dret = ehea_rem_smrs(pr);
> - if (dret) {
> - pr_err("unreg shared memory region failed\n");
> - goto out;
> - }
> - }
> -
> - ret = 0;
> -out:
> - free_page((unsigned long)cb0);
> -
> - return ret;
> -}
> -
> -static void ehea_update_rqs(struct ehea_qp *orig_qp, struct ehea_port_res *pr)
> -{
> - struct ehea_qp qp = *orig_qp;
> - struct ehea_qp_init_attr *init_attr = &qp.init_attr;
> - struct ehea_rwqe *rwqe;
> - struct sk_buff **skba_rq2 = pr->rq2_skba.arr;
> - struct sk_buff **skba_rq3 = pr->rq3_skba.arr;
> - struct sk_buff *skb;
> - u32 lkey = pr->recv_mr.lkey;
> -
> -
> - int i;
> - int index;
> -
> - for (i = 0; i < init_attr->act_nr_rwqes_rq2 + 1; i++) {
> - rwqe = ehea_get_next_rwqe(&qp, 2);
> - rwqe->sg_list[0].l_key = lkey;
> - index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, rwqe->wr_id);
> - skb = skba_rq2[index];
> - if (skb)
> - rwqe->sg_list[0].vaddr = ehea_map_vaddr(skb->data);
> - }
> -
> - for (i = 0; i < init_attr->act_nr_rwqes_rq3 + 1; i++) {
> - rwqe = ehea_get_next_rwqe(&qp, 3);
> - rwqe->sg_list[0].l_key = lkey;
> - index = EHEA_BMASK_GET(EHEA_WR_ID_INDEX, rwqe->wr_id);
> - skb = skba_rq3[index];
> - if (skb)
> - rwqe->sg_list[0].vaddr = ehea_map_vaddr(skb->data);
> - }
> -}
> -
> -static int ehea_restart_qps(struct net_device *dev)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> - struct ehea_adapter *adapter = port->adapter;
> - int ret = 0;
> - int i;
> -
> - struct hcp_modify_qp_cb0 *cb0;
> - u64 hret;
> - u64 dummy64 = 0;
> - u16 dummy16 = 0;
> -
> - cb0 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb0)
> - return -ENOMEM;
> -
> - for (i = 0; i < (port->num_def_qps); i++) {
> - struct ehea_port_res *pr = &port->port_res[i];
> - struct ehea_qp *qp = pr->qp;
> -
> - ret = ehea_gen_smrs(pr);
> - if (ret) {
> - netdev_err(dev, "creation of shared memory regions failed\n");
> - goto out;
> - }
> -
> - ehea_update_rqs(qp, pr);
> -
> - /* Enable queue pair */
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
> - cb0);
> - if (hret != H_SUCCESS) {
> - netdev_err(dev, "query_ehea_qp failed (1)\n");
> - ret = -EFAULT;
> - goto out;
> - }
> -
> - cb0->qp_ctl_reg = (cb0->qp_ctl_reg & H_QP_CR_RES_STATE) << 8;
> - cb0->qp_ctl_reg |= H_QP_CR_ENABLED;
> -
> - hret = ehea_h_modify_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_QP_CTL_REG,
> - 1), cb0, &dummy64,
> - &dummy64, &dummy16, &dummy16);
> - if (hret != H_SUCCESS) {
> - netdev_err(dev, "modify_ehea_qp failed (1)\n");
> - ret = -EFAULT;
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea_qp(adapter->handle, 0, qp->fw_handle,
> - EHEA_BMASK_SET(H_QPCB0_ALL, 0xFFFF),
> - cb0);
> - if (hret != H_SUCCESS) {
> - netdev_err(dev, "query_ehea_qp failed (2)\n");
> - ret = -EFAULT;
> - goto out;
> - }
> -
> - /* refill entire queue */
> - ehea_refill_rq1(pr, pr->rq1_skba.index, 0);
> - ehea_refill_rq2(pr, 0);
> - ehea_refill_rq3(pr, 0);
> - }
> -out:
> - free_page((unsigned long)cb0);
> -
> - return ret;
> -}
> -
> -static void ehea_reset_port(struct work_struct *work)
> -{
> - int ret;
> - struct ehea_port *port =
> - container_of(work, struct ehea_port, reset_task);
> - struct net_device *dev = port->netdev;
> -
> - mutex_lock(&dlpar_mem_lock);
> - port->resets++;
> - mutex_lock(&port->port_lock);
> - netif_tx_disable(dev);
> -
> - port_napi_disable(port);
> -
> - ehea_down(dev);
> -
> - ret = ehea_up(dev);
> - if (ret)
> - goto out;
> -
> - ehea_set_multicast_list(dev);
> -
> - netif_info(port, timer, dev, "reset successful\n");
> -
> - port_napi_enable(port);
> -
> - netif_tx_wake_all_queues(dev);
> -out:
> - mutex_unlock(&port->port_lock);
> - mutex_unlock(&dlpar_mem_lock);
> -}
> -
> -static void ehea_rereg_mrs(void)
> -{
> - int ret, i;
> - struct ehea_adapter *adapter;
> -
> - pr_info("LPAR memory changed - re-initializing driver\n");
> -
> - list_for_each_entry(adapter, &adapter_list, list)
> - if (adapter->active_ports) {
> - /* Shutdown all ports */
> - for (i = 0; i < EHEA_MAX_PORTS; i++) {
> - struct ehea_port *port = adapter->port[i];
> - struct net_device *dev;
> -
> - if (!port)
> - continue;
> -
> - dev = port->netdev;
> -
> - if (dev->flags & IFF_UP) {
> - mutex_lock(&port->port_lock);
> - netif_tx_disable(dev);
> - ehea_flush_sq(port);
> - ret = ehea_stop_qps(dev);
> - if (ret) {
> - mutex_unlock(&port->port_lock);
> - goto out;
> - }
> - port_napi_disable(port);
> - mutex_unlock(&port->port_lock);
> - }
> - reset_sq_restart_flag(port);
> - }
> -
> - /* Unregister old memory region */
> - ret = ehea_rem_mr(&adapter->mr);
> - if (ret) {
> - pr_err("unregister MR failed - driver inoperable!\n");
> - goto out;
> - }
> - }
> -
> - clear_bit(__EHEA_STOP_XFER, &ehea_driver_flags);
> -
> - list_for_each_entry(adapter, &adapter_list, list)
> - if (adapter->active_ports) {
> - /* Register new memory region */
> - ret = ehea_reg_kernel_mr(adapter, &adapter->mr);
> - if (ret) {
> - pr_err("register MR failed - driver inoperable!\n");
> - goto out;
> - }
> -
> - /* Restart all ports */
> - for (i = 0; i < EHEA_MAX_PORTS; i++) {
> - struct ehea_port *port = adapter->port[i];
> -
> - if (port) {
> - struct net_device *dev = port->netdev;
> -
> - if (dev->flags & IFF_UP) {
> - mutex_lock(&port->port_lock);
> - ret = ehea_restart_qps(dev);
> - if (!ret) {
> - check_sqs(port);
> - port_napi_enable(port);
> - netif_tx_wake_all_queues(dev);
> - } else {
> - netdev_err(dev, "Unable to restart QPS\n");
> - }
> - mutex_unlock(&port->port_lock);
> - }
> - }
> - }
> - }
> - pr_info("re-initializing driver complete\n");
> -out:
> - return;
> -}
> -
> -static void ehea_tx_watchdog(struct net_device *dev, unsigned int txqueue)
> -{
> - struct ehea_port *port = netdev_priv(dev);
> -
> - if (netif_carrier_ok(dev) &&
> - !test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))
> - ehea_schedule_port_reset(port);
> -}
> -
> -static int ehea_sense_adapter_attr(struct ehea_adapter *adapter)
> -{
> - struct hcp_query_ehea *cb;
> - u64 hret;
> - int ret;
> -
> - cb = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb) {
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - hret = ehea_h_query_ehea(adapter->handle, cb);
> -
> - if (hret != H_SUCCESS) {
> - ret = -EIO;
> - goto out_herr;
> - }
> -
> - adapter->max_mc_mac = cb->max_mc_mac - 1;
> - ret = 0;
> -
> -out_herr:
> - free_page((unsigned long)cb);
> -out:
> - return ret;
> -}
> -
> -static int ehea_get_jumboframe_status(struct ehea_port *port, int *jumbo)
> -{
> - struct hcp_ehea_port_cb4 *cb4;
> - u64 hret;
> - int ret = 0;
> -
> - *jumbo = 0;
> -
> - /* (Try to) enable *jumbo frames */
> - cb4 = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!cb4) {
> - pr_err("no mem for cb4\n");
> - ret = -ENOMEM;
> - goto out;
> - } else {
> - hret = ehea_h_query_ehea_port(port->adapter->handle,
> - port->logical_port_id,
> - H_PORT_CB4,
> - H_PORT_CB4_JUMBO, cb4);
> - if (hret == H_SUCCESS) {
> - if (cb4->jumbo_frame)
> - *jumbo = 1;
> - else {
> - cb4->jumbo_frame = 1;
> - hret = ehea_h_modify_ehea_port(port->adapter->
> - handle,
> - port->
> - logical_port_id,
> - H_PORT_CB4,
> - H_PORT_CB4_JUMBO,
> - cb4);
> - if (hret == H_SUCCESS)
> - *jumbo = 1;
> - }
> - } else
> - ret = -EINVAL;
> -
> - free_page((unsigned long)cb4);
> - }
> -out:
> - return ret;
> -}
> -
> -static ssize_t log_port_id_show(struct device *dev,
> - struct device_attribute *attr, char *buf)
> -{
> - struct ehea_port *port = container_of(dev, struct ehea_port, ofdev.dev);
> - return sprintf(buf, "%d", port->logical_port_id);
> -}
> -
> -static DEVICE_ATTR_RO(log_port_id);
> -
> -static void logical_port_release(struct device *dev)
> -{
> - struct ehea_port *port = container_of(dev, struct ehea_port, ofdev.dev);
> - of_node_put(port->ofdev.dev.of_node);
> -}
> -
> -static struct device *ehea_register_port(struct ehea_port *port,
> - struct device_node *dn)
> -{
> - int ret;
> -
> - port->ofdev.dev.of_node = of_node_get(dn);
> - port->ofdev.dev.parent = &port->adapter->ofdev->dev;
> - port->ofdev.dev.bus = &ibmebus_bus_type;
> -
> - dev_set_name(&port->ofdev.dev, "port%d", port_name_cnt++);
> - port->ofdev.dev.release = logical_port_release;
> -
> - ret = of_device_register(&port->ofdev);
> - if (ret) {
> - pr_err("failed to register device. ret=%d\n", ret);
> - put_device(&port->ofdev.dev);
> - goto out;
> - }
> -
> - ret = device_create_file(&port->ofdev.dev, &dev_attr_log_port_id);
> - if (ret) {
> - pr_err("failed to register attributes, ret=%d\n", ret);
> - goto out_unreg_of_dev;
> - }
> -
> - return &port->ofdev.dev;
> -
> -out_unreg_of_dev:
> - of_device_unregister(&port->ofdev);
> -out:
> - return NULL;
> -}
> -
> -static void ehea_unregister_port(struct ehea_port *port)
> -{
> - device_remove_file(&port->ofdev.dev, &dev_attr_log_port_id);
> - of_device_unregister(&port->ofdev);
> -}
> -
> -static const struct net_device_ops ehea_netdev_ops = {
> - .ndo_open = ehea_open,
> - .ndo_stop = ehea_stop,
> - .ndo_start_xmit = ehea_start_xmit,
> - .ndo_get_stats64 = ehea_get_stats64,
> - .ndo_set_mac_address = ehea_set_mac_addr,
> - .ndo_validate_addr = eth_validate_addr,
> - .ndo_set_rx_mode = ehea_set_multicast_list,
> - .ndo_vlan_rx_add_vid = ehea_vlan_rx_add_vid,
> - .ndo_vlan_rx_kill_vid = ehea_vlan_rx_kill_vid,
> - .ndo_tx_timeout = ehea_tx_watchdog,
> -};
> -
> -static struct ehea_port *ehea_setup_single_port(struct ehea_adapter *adapter,
> - u32 logical_port_id,
> - struct device_node *dn)
> -{
> - int ret;
> - struct net_device *dev;
> - struct ehea_port *port;
> - struct device *port_dev;
> - int jumbo;
> -
> - /* allocate memory for the port structures */
> - dev = alloc_etherdev_mq(sizeof(struct ehea_port), EHEA_MAX_PORT_RES);
> -
> - if (!dev) {
> - ret = -ENOMEM;
> - goto out_err;
> - }
> -
> - port = netdev_priv(dev);
> -
> - mutex_init(&port->port_lock);
> - port->state = EHEA_PORT_DOWN;
> - port->sig_comp_iv = sq_entries / 10;
> -
> - port->adapter = adapter;
> - port->netdev = dev;
> - port->logical_port_id = logical_port_id;
> -
> - port->msg_enable = netif_msg_init(msg_level, EHEA_MSG_DEFAULT);
> -
> - port->mc_list = kzalloc_obj(struct ehea_mc_list);
> - if (!port->mc_list) {
> - ret = -ENOMEM;
> - goto out_free_ethdev;
> - }
> -
> - INIT_LIST_HEAD(&port->mc_list->list);
> -
> - ret = ehea_sense_port_attr(port);
> - if (ret)
> - goto out_free_mc_list;
> -
> - netif_set_real_num_rx_queues(dev, port->num_def_qps);
> - netif_set_real_num_tx_queues(dev, port->num_def_qps);
> -
> - port_dev = ehea_register_port(port, dn);
> - if (!port_dev)
> - goto out_free_mc_list;
> -
> - SET_NETDEV_DEV(dev, port_dev);
> -
> - /* initialize net_device structure */
> - eth_hw_addr_set(dev, (u8 *)&port->mac_addr);
> -
> - dev->netdev_ops = &ehea_netdev_ops;
> - ehea_set_ethtool_ops(dev);
> -
> - dev->hw_features = NETIF_F_SG | NETIF_F_TSO |
> - NETIF_F_IP_CSUM | NETIF_F_HW_VLAN_CTAG_TX;
> - dev->features = NETIF_F_SG | NETIF_F_TSO |
> - NETIF_F_HIGHDMA | NETIF_F_IP_CSUM |
> - NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
> - NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXCSUM;
> - dev->vlan_features = NETIF_F_SG | NETIF_F_TSO | NETIF_F_HIGHDMA |
> - NETIF_F_IP_CSUM;
> - dev->watchdog_timeo = EHEA_WATCH_DOG_TIMEOUT;
> -
> - /* MTU range: 68 - 9022 */
> - dev->min_mtu = ETH_MIN_MTU;
> - dev->max_mtu = EHEA_MAX_PACKET_SIZE;
> -
> - INIT_WORK(&port->reset_task, ehea_reset_port);
> - INIT_DELAYED_WORK(&port->stats_work, ehea_update_stats);
> -
> - init_waitqueue_head(&port->swqe_avail_wq);
> - init_waitqueue_head(&port->restart_wq);
> -
> - ret = register_netdev(dev);
> - if (ret) {
> - pr_err("register_netdev failed. ret=%d\n", ret);
> - goto out_unreg_port;
> - }
> -
> - ret = ehea_get_jumboframe_status(port, &jumbo);
> - if (ret)
> - netdev_err(dev, "failed determining jumbo frame status\n");
> -
> - netdev_info(dev, "Jumbo frames are %sabled\n",
> - jumbo == 1 ? "en" : "dis");
> -
> - adapter->active_ports++;
> -
> - return port;
> -
> -out_unreg_port:
> - ehea_unregister_port(port);
> -
> -out_free_mc_list:
> - kfree(port->mc_list);
> -
> -out_free_ethdev:
> - free_netdev(dev);
> -
> -out_err:
> - pr_err("setting up logical port with id=%d failed, ret=%d\n",
> - logical_port_id, ret);
> - return NULL;
> -}
> -
> -static void ehea_shutdown_single_port(struct ehea_port *port)
> -{
> - struct ehea_adapter *adapter = port->adapter;
> -
> - cancel_work_sync(&port->reset_task);
> - cancel_delayed_work_sync(&port->stats_work);
> - unregister_netdev(port->netdev);
> - ehea_unregister_port(port);
> - kfree(port->mc_list);
> - free_netdev(port->netdev);
> - adapter->active_ports--;
> -}
> -
> -static int ehea_setup_ports(struct ehea_adapter *adapter)
> -{
> - struct device_node *lhea_dn;
> - struct device_node *eth_dn;
> -
> - const u32 *dn_log_port_id;
> - int i = 0;
> -
> - lhea_dn = adapter->ofdev->dev.of_node;
> - for_each_child_of_node(lhea_dn, eth_dn) {
> - dn_log_port_id = of_get_property(eth_dn, "ibm,hea-port-no",
> - NULL);
> - if (!dn_log_port_id) {
> - pr_err("bad device node: eth_dn name=%pOF\n", eth_dn);
> - continue;
> - }
> -
> - if (ehea_add_adapter_mr(adapter)) {
> - pr_err("creating MR failed\n");
> - of_node_put(eth_dn);
> - return -EIO;
> - }
> -
> - adapter->port[i] = ehea_setup_single_port(adapter,
> - *dn_log_port_id,
> - eth_dn);
> - if (adapter->port[i])
> - netdev_info(adapter->port[i]->netdev,
> - "logical port id #%d\n", *dn_log_port_id);
> - else
> - ehea_remove_adapter_mr(adapter);
> -
> - i++;
> - }
> - return 0;
> -}
> -
> -static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter,
> - u32 logical_port_id)
> -{
> - struct device_node *lhea_dn;
> - struct device_node *eth_dn;
> - const u32 *dn_log_port_id;
> -
> - lhea_dn = adapter->ofdev->dev.of_node;
> - for_each_child_of_node(lhea_dn, eth_dn) {
> - dn_log_port_id = of_get_property(eth_dn, "ibm,hea-port-no",
> - NULL);
> - if (dn_log_port_id)
> - if (*dn_log_port_id == logical_port_id)
> - return eth_dn;
> - }
> -
> - return NULL;
> -}
> -
> -static ssize_t probe_port_store(struct device *dev,
> - struct device_attribute *attr,
> - const char *buf, size_t count)
> -{
> - struct ehea_adapter *adapter = dev_get_drvdata(dev);
> - struct ehea_port *port;
> - struct device_node *eth_dn = NULL;
> - int i;
> -
> - u32 logical_port_id;
> -
> - sscanf(buf, "%d", &logical_port_id);
> -
> - port = ehea_get_port(adapter, logical_port_id);
> -
> - if (port) {
> - netdev_info(port->netdev, "adding port with logical port id=%d failed: port already configured\n",
> - logical_port_id);
> - return -EINVAL;
> - }
> -
> - eth_dn = ehea_get_eth_dn(adapter, logical_port_id);
> -
> - if (!eth_dn) {
> - pr_info("no logical port with id %d found\n", logical_port_id);
> - return -EINVAL;
> - }
> -
> - if (ehea_add_adapter_mr(adapter)) {
> - pr_err("creating MR failed\n");
> - of_node_put(eth_dn);
> - return -EIO;
> - }
> -
> - port = ehea_setup_single_port(adapter, logical_port_id, eth_dn);
> -
> - of_node_put(eth_dn);
> -
> - if (port) {
> - for (i = 0; i < EHEA_MAX_PORTS; i++)
> - if (!adapter->port[i]) {
> - adapter->port[i] = port;
> - break;
> - }
> -
> - netdev_info(port->netdev, "added: (logical port id=%d)\n",
> - logical_port_id);
> - } else {
> - ehea_remove_adapter_mr(adapter);
> - return -EIO;
> - }
> -
> - return (ssize_t) count;
> -}
> -
> -static ssize_t remove_port_store(struct device *dev,
> - struct device_attribute *attr,
> - const char *buf, size_t count)
> -{
> - struct ehea_adapter *adapter = dev_get_drvdata(dev);
> - struct ehea_port *port;
> - int i;
> - u32 logical_port_id;
> -
> - sscanf(buf, "%d", &logical_port_id);
> -
> - port = ehea_get_port(adapter, logical_port_id);
> -
> - if (port) {
> - netdev_info(port->netdev, "removed: (logical port id=%d)\n",
> - logical_port_id);
> -
> - ehea_shutdown_single_port(port);
> -
> - for (i = 0; i < EHEA_MAX_PORTS; i++)
> - if (adapter->port[i] == port) {
> - adapter->port[i] = NULL;
> - break;
> - }
> - } else {
> - pr_err("removing port with logical port id=%d failed. port not configured.\n",
> - logical_port_id);
> - return -EINVAL;
> - }
> -
> - ehea_remove_adapter_mr(adapter);
> -
> - return (ssize_t) count;
> -}
> -
> -static DEVICE_ATTR_WO(probe_port);
> -static DEVICE_ATTR_WO(remove_port);
> -
> -static int ehea_create_device_sysfs(struct platform_device *dev)
> -{
> - int ret = device_create_file(&dev->dev, &dev_attr_probe_port);
> - if (ret)
> - goto out;
> -
> - ret = device_create_file(&dev->dev, &dev_attr_remove_port);
> - if (ret)
> - device_remove_file(&dev->dev, &dev_attr_probe_port);
> -out:
> - return ret;
> -}
> -
> -static void ehea_remove_device_sysfs(struct platform_device *dev)
> -{
> - device_remove_file(&dev->dev, &dev_attr_probe_port);
> - device_remove_file(&dev->dev, &dev_attr_remove_port);
> -}
> -
> -static int ehea_reboot_notifier(struct notifier_block *nb,
> - unsigned long action, void *unused)
> -{
> - if (action == SYS_RESTART) {
> - pr_info("Reboot: freeing all eHEA resources\n");
> - ibmebus_unregister_driver(&ehea_driver);
> - }
> - return NOTIFY_DONE;
> -}
> -
> -static struct notifier_block ehea_reboot_nb = {
> - .notifier_call = ehea_reboot_notifier,
> -};
> -
> -static int ehea_mem_notifier(struct notifier_block *nb,
> - unsigned long action, void *data)
> -{
> - int ret = NOTIFY_BAD;
> - struct memory_notify *arg = data;
> -
> - mutex_lock(&dlpar_mem_lock);
> -
> - switch (action) {
> - case MEM_CANCEL_OFFLINE:
> - pr_info("memory offlining canceled");
> - fallthrough; /* re-add canceled memory block */
> -
> - case MEM_ONLINE:
> - pr_info("memory is going online");
> - set_bit(__EHEA_STOP_XFER, &ehea_driver_flags);
> - if (ehea_add_sect_bmap(arg->start_pfn, arg->nr_pages))
> - goto out_unlock;
> - ehea_rereg_mrs();
> - break;
> -
> - case MEM_GOING_OFFLINE:
> - pr_info("memory is going offline");
> - set_bit(__EHEA_STOP_XFER, &ehea_driver_flags);
> - if (ehea_rem_sect_bmap(arg->start_pfn, arg->nr_pages))
> - goto out_unlock;
> - ehea_rereg_mrs();
> - break;
> -
> - default:
> - break;
> - }
> -
> - ehea_update_firmware_handles();
> - ret = NOTIFY_OK;
> -
> -out_unlock:
> - mutex_unlock(&dlpar_mem_lock);
> - return ret;
> -}
> -
> -static struct notifier_block ehea_mem_nb = {
> - .notifier_call = ehea_mem_notifier,
> -};
> -
> -static void ehea_crash_handler(void)
> -{
> - int i;
> -
> - if (ehea_fw_handles.arr)
> - for (i = 0; i < ehea_fw_handles.num_entries; i++)
> - ehea_h_free_resource(ehea_fw_handles.arr[i].adh,
> - ehea_fw_handles.arr[i].fwh,
> - FORCE_FREE);
> -
> - if (ehea_bcmc_regs.arr)
> - for (i = 0; i < ehea_bcmc_regs.num_entries; i++)
> - ehea_h_reg_dereg_bcmc(ehea_bcmc_regs.arr[i].adh,
> - ehea_bcmc_regs.arr[i].port_id,
> - ehea_bcmc_regs.arr[i].reg_type,
> - ehea_bcmc_regs.arr[i].macaddr,
> - 0, H_DEREG_BCMC);
> -}
> -
> -static atomic_t ehea_memory_hooks_registered;
> -
> -/* Register memory hooks on probe of first adapter */
> -static int ehea_register_memory_hooks(void)
> -{
> - int ret = 0;
> -
> - if (atomic_inc_return(&ehea_memory_hooks_registered) > 1)
> - return 0;
> -
> - ret = ehea_create_busmap();
> - if (ret) {
> - pr_info("ehea_create_busmap failed\n");
> - goto out;
> - }
> -
> - ret = register_reboot_notifier(&ehea_reboot_nb);
> - if (ret) {
> - pr_info("register_reboot_notifier failed\n");
> - goto out;
> - }
> -
> - ret = register_memory_notifier(&ehea_mem_nb);
> - if (ret) {
> - pr_info("register_memory_notifier failed\n");
> - goto out2;
> - }
> -
> - ret = crash_shutdown_register(ehea_crash_handler);
> - if (ret) {
> - pr_info("crash_shutdown_register failed\n");
> - goto out3;
> - }
> -
> - return 0;
> -
> -out3:
> - unregister_memory_notifier(&ehea_mem_nb);
> -out2:
> - unregister_reboot_notifier(&ehea_reboot_nb);
> -out:
> - atomic_dec(&ehea_memory_hooks_registered);
> - return ret;
> -}
> -
> -static void ehea_unregister_memory_hooks(void)
> -{
> - /* Only remove the hooks if we've registered them */
> - if (atomic_read(&ehea_memory_hooks_registered) == 0)
> - return;
> -
> - unregister_reboot_notifier(&ehea_reboot_nb);
> - if (crash_shutdown_unregister(ehea_crash_handler))
> - pr_info("failed unregistering crash handler\n");
> - unregister_memory_notifier(&ehea_mem_nb);
> -}
> -
> -static int ehea_probe_adapter(struct platform_device *dev)
> -{
> - struct ehea_adapter *adapter;
> - const u64 *adapter_handle;
> - int ret;
> - int i;
> -
> - ret = ehea_register_memory_hooks();
> - if (ret)
> - return ret;
> -
> - if (!dev || !dev->dev.of_node) {
> - pr_err("Invalid ibmebus device probed\n");
> - return -EINVAL;
> - }
> -
> - adapter = devm_kzalloc(&dev->dev, sizeof(*adapter), GFP_KERNEL);
> - if (!adapter) {
> - ret = -ENOMEM;
> - dev_err(&dev->dev, "no mem for ehea_adapter\n");
> - goto out;
> - }
> -
> - list_add(&adapter->list, &adapter_list);
> -
> - adapter->ofdev = dev;
> -
> - adapter_handle = of_get_property(dev->dev.of_node, "ibm,hea-handle",
> - NULL);
> - if (adapter_handle)
> - adapter->handle = *adapter_handle;
> -
> - if (!adapter->handle) {
> - dev_err(&dev->dev, "failed getting handle for adapter"
> - " '%pOF'\n", dev->dev.of_node);
> - ret = -ENODEV;
> - goto out_free_ad;
> - }
> -
> - adapter->pd = EHEA_PD_ID;
> -
> - platform_set_drvdata(dev, adapter);
> -
> -
> - /* initialize adapter and ports */
> - /* get adapter properties */
> - ret = ehea_sense_adapter_attr(adapter);
> - if (ret) {
> - dev_err(&dev->dev, "sense_adapter_attr failed: %d\n", ret);
> - goto out_free_ad;
> - }
> -
> - adapter->neq = ehea_create_eq(adapter,
> - EHEA_NEQ, EHEA_MAX_ENTRIES_EQ, 1);
> - if (!adapter->neq) {
> - ret = -EIO;
> - dev_err(&dev->dev, "NEQ creation failed\n");
> - goto out_free_ad;
> - }
> -
> - tasklet_setup(&adapter->neq_tasklet, ehea_neq_tasklet);
> -
> - ret = ehea_create_device_sysfs(dev);
> - if (ret)
> - goto out_kill_eq;
> -
> - ret = ehea_setup_ports(adapter);
> - if (ret) {
> - dev_err(&dev->dev, "setup_ports failed\n");
> - goto out_rem_dev_sysfs;
> - }
> -
> - ret = ibmebus_request_irq(adapter->neq->attr.ist1,
> - ehea_interrupt_neq, 0,
> - "ehea_neq", adapter);
> - if (ret) {
> - dev_err(&dev->dev, "requesting NEQ IRQ failed\n");
> - goto out_shutdown_ports;
> - }
> -
> - /* Handle any events that might be pending. */
> - tasklet_hi_schedule(&adapter->neq_tasklet);
> -
> - ret = 0;
> - goto out;
> -
> -out_shutdown_ports:
> - for (i = 0; i < EHEA_MAX_PORTS; i++)
> - if (adapter->port[i]) {
> - ehea_shutdown_single_port(adapter->port[i]);
> - adapter->port[i] = NULL;
> - }
> -
> -out_rem_dev_sysfs:
> - ehea_remove_device_sysfs(dev);
> -
> -out_kill_eq:
> - ehea_destroy_eq(adapter->neq);
> -
> -out_free_ad:
> - list_del(&adapter->list);
> -
> -out:
> - ehea_update_firmware_handles();
> -
> - return ret;
> -}
> -
> -static void ehea_remove(struct platform_device *dev)
> -{
> - struct ehea_adapter *adapter = platform_get_drvdata(dev);
> - int i;
> -
> - for (i = 0; i < EHEA_MAX_PORTS; i++)
> - if (adapter->port[i]) {
> - ehea_shutdown_single_port(adapter->port[i]);
> - adapter->port[i] = NULL;
> - }
> -
> - ehea_remove_device_sysfs(dev);
> -
> - ibmebus_free_irq(adapter->neq->attr.ist1, adapter);
> - tasklet_kill(&adapter->neq_tasklet);
> -
> - ehea_destroy_eq(adapter->neq);
> - ehea_remove_adapter_mr(adapter);
> - list_del(&adapter->list);
> -
> - ehea_update_firmware_handles();
> -}
> -
> -static int check_module_parm(void)
> -{
> - int ret = 0;
> -
> - if ((rq1_entries < EHEA_MIN_ENTRIES_QP) ||
> - (rq1_entries > EHEA_MAX_ENTRIES_RQ1)) {
> - pr_info("Bad parameter: rq1_entries\n");
> - ret = -EINVAL;
> - }
> - if ((rq2_entries < EHEA_MIN_ENTRIES_QP) ||
> - (rq2_entries > EHEA_MAX_ENTRIES_RQ2)) {
> - pr_info("Bad parameter: rq2_entries\n");
> - ret = -EINVAL;
> - }
> - if ((rq3_entries < EHEA_MIN_ENTRIES_QP) ||
> - (rq3_entries > EHEA_MAX_ENTRIES_RQ3)) {
> - pr_info("Bad parameter: rq3_entries\n");
> - ret = -EINVAL;
> - }
> - if ((sq_entries < EHEA_MIN_ENTRIES_QP) ||
> - (sq_entries > EHEA_MAX_ENTRIES_SQ)) {
> - pr_info("Bad parameter: sq_entries\n");
> - ret = -EINVAL;
> - }
> -
> - return ret;
> -}
> -
> -static ssize_t capabilities_show(struct device_driver *drv, char *buf)
> -{
> - return sprintf(buf, "%d", EHEA_CAPABILITIES);
> -}
> -
> -static DRIVER_ATTR_RO(capabilities);
> -
> -static int __init ehea_module_init(void)
> -{
> - int ret;
> -
> - pr_info("IBM eHEA ethernet device driver (Release %s)\n", DRV_VERSION);
> -
> - memset(&ehea_fw_handles, 0, sizeof(ehea_fw_handles));
> - memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs));
> -
> - mutex_init(&ehea_fw_handles.lock);
> - spin_lock_init(&ehea_bcmc_regs.lock);
> -
> - ret = check_module_parm();
> - if (ret)
> - goto out;
> -
> - ret = ibmebus_register_driver(&ehea_driver);
> - if (ret) {
> - pr_err("failed registering eHEA device driver on ebus\n");
> - goto out;
> - }
> -
> - ret = driver_create_file(&ehea_driver.driver,
> - &driver_attr_capabilities);
> - if (ret) {
> - pr_err("failed to register capabilities attribute, ret=%d\n",
> - ret);
> - goto out2;
> - }
> -
> - return ret;
> -
> -out2:
> - ibmebus_unregister_driver(&ehea_driver);
> -out:
> - return ret;
> -}
> -
> -static void __exit ehea_module_exit(void)
> -{
> - driver_remove_file(&ehea_driver.driver, &driver_attr_capabilities);
> - ibmebus_unregister_driver(&ehea_driver);
> - ehea_unregister_memory_hooks();
> - kfree(ehea_fw_handles.arr);
> - kfree(ehea_bcmc_regs.arr);
> - ehea_destroy_busmap();
> -}
> -
> -module_init(ehea_module_init);
> -module_exit(ehea_module_exit);
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_phyp.c b/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
> deleted file mode 100644
> index e63716e139f5..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
> +++ /dev/null
> @@ -1,612 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_phyp.c
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include "ehea_phyp.h"
> -
> -
> -static inline u16 get_order_of_qentries(u16 queue_entries)
> -{
> - u8 ld = 1; /* logarithmus dualis */
> - while (((1U << ld) - 1) < queue_entries)
> - ld++;
> - return ld - 1;
> -}
> -
> -/* Defines for H_CALL H_ALLOC_RESOURCE */
> -#define H_ALL_RES_TYPE_QP 1
> -#define H_ALL_RES_TYPE_CQ 2
> -#define H_ALL_RES_TYPE_EQ 3
> -#define H_ALL_RES_TYPE_MR 5
> -#define H_ALL_RES_TYPE_MW 6
> -
> -static long ehea_plpar_hcall_norets(unsigned long opcode,
> - unsigned long arg1,
> - unsigned long arg2,
> - unsigned long arg3,
> - unsigned long arg4,
> - unsigned long arg5,
> - unsigned long arg6,
> - unsigned long arg7)
> -{
> - long ret;
> - int i, sleep_msecs;
> -
> - for (i = 0; i < 5; i++) {
> - ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4,
> - arg5, arg6, arg7);
> -
> - if (H_IS_LONG_BUSY(ret)) {
> - sleep_msecs = get_longbusy_msecs(ret);
> - msleep_interruptible(sleep_msecs);
> - continue;
> - }
> -
> - if (ret < H_SUCCESS)
> - pr_err("opcode=%lx ret=%lx"
> - " arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
> - " arg5=%lx arg6=%lx arg7=%lx\n",
> - opcode, ret,
> - arg1, arg2, arg3, arg4, arg5, arg6, arg7);
> -
> - return ret;
> - }
> -
> - return H_BUSY;
> -}
> -
> -static long ehea_plpar_hcall9(unsigned long opcode,
> - unsigned long *outs, /* array of 9 outputs */
> - unsigned long arg1,
> - unsigned long arg2,
> - unsigned long arg3,
> - unsigned long arg4,
> - unsigned long arg5,
> - unsigned long arg6,
> - unsigned long arg7,
> - unsigned long arg8,
> - unsigned long arg9)
> -{
> - long ret;
> - int i, sleep_msecs;
> - u8 cb_cat;
> -
> - for (i = 0; i < 5; i++) {
> - ret = plpar_hcall9(opcode, outs,
> - arg1, arg2, arg3, arg4, arg5,
> - arg6, arg7, arg8, arg9);
> -
> - if (H_IS_LONG_BUSY(ret)) {
> - sleep_msecs = get_longbusy_msecs(ret);
> - msleep_interruptible(sleep_msecs);
> - continue;
> - }
> -
> - cb_cat = EHEA_BMASK_GET(H_MEHEAPORT_CAT, arg2);
> -
> - if ((ret < H_SUCCESS) && !(((ret == H_AUTHORITY)
> - && (opcode == H_MODIFY_HEA_PORT))
> - && (((cb_cat == H_PORT_CB4) && ((arg3 == H_PORT_CB4_JUMBO)
> - || (arg3 == H_PORT_CB4_SPEED))) || ((cb_cat == H_PORT_CB7)
> - && (arg3 == H_PORT_CB7_DUCQPN)))))
> - pr_err("opcode=%lx ret=%lx"
> - " arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
> - " arg5=%lx arg6=%lx arg7=%lx arg8=%lx"
> - " arg9=%lx"
> - " out1=%lx out2=%lx out3=%lx out4=%lx"
> - " out5=%lx out6=%lx out7=%lx out8=%lx"
> - " out9=%lx\n",
> - opcode, ret,
> - arg1, arg2, arg3, arg4, arg5,
> - arg6, arg7, arg8, arg9,
> - outs[0], outs[1], outs[2], outs[3], outs[4],
> - outs[5], outs[6], outs[7], outs[8]);
> - return ret;
> - }
> -
> - return H_BUSY;
> -}
> -
> -u64 ehea_h_query_ehea_qp(const u64 adapter_handle, const u8 qp_category,
> - const u64 qp_handle, const u64 sel_mask, void *cb_addr)
> -{
> - return ehea_plpar_hcall_norets(H_QUERY_HEA_QP,
> - adapter_handle, /* R4 */
> - qp_category, /* R5 */
> - qp_handle, /* R6 */
> - sel_mask, /* R7 */
> - __pa(cb_addr), /* R8 */
> - 0, 0);
> -}
> -
> -/* input param R5 */
> -#define H_ALL_RES_QP_EQPO EHEA_BMASK_IBM(9, 11)
> -#define H_ALL_RES_QP_QPP EHEA_BMASK_IBM(12, 12)
> -#define H_ALL_RES_QP_RQR EHEA_BMASK_IBM(13, 15)
> -#define H_ALL_RES_QP_EQEG EHEA_BMASK_IBM(16, 16)
> -#define H_ALL_RES_QP_LL_QP EHEA_BMASK_IBM(17, 17)
> -#define H_ALL_RES_QP_DMA128 EHEA_BMASK_IBM(19, 19)
> -#define H_ALL_RES_QP_HSM EHEA_BMASK_IBM(20, 21)
> -#define H_ALL_RES_QP_SIGT EHEA_BMASK_IBM(22, 23)
> -#define H_ALL_RES_QP_TENURE EHEA_BMASK_IBM(48, 55)
> -#define H_ALL_RES_QP_RES_TYP EHEA_BMASK_IBM(56, 63)
> -
> -/* input param R9 */
> -#define H_ALL_RES_QP_TOKEN EHEA_BMASK_IBM(0, 31)
> -#define H_ALL_RES_QP_PD EHEA_BMASK_IBM(32, 63)
> -
> -/* input param R10 */
> -#define H_ALL_RES_QP_MAX_SWQE EHEA_BMASK_IBM(4, 7)
> -#define H_ALL_RES_QP_MAX_R1WQE EHEA_BMASK_IBM(12, 15)
> -#define H_ALL_RES_QP_MAX_R2WQE EHEA_BMASK_IBM(20, 23)
> -#define H_ALL_RES_QP_MAX_R3WQE EHEA_BMASK_IBM(28, 31)
> -/* Max Send Scatter Gather Elements */
> -#define H_ALL_RES_QP_MAX_SSGE EHEA_BMASK_IBM(37, 39)
> -#define H_ALL_RES_QP_MAX_R1SGE EHEA_BMASK_IBM(45, 47)
> -/* Max Receive SG Elements RQ1 */
> -#define H_ALL_RES_QP_MAX_R2SGE EHEA_BMASK_IBM(53, 55)
> -#define H_ALL_RES_QP_MAX_R3SGE EHEA_BMASK_IBM(61, 63)
> -
> -/* input param R11 */
> -#define H_ALL_RES_QP_SWQE_IDL EHEA_BMASK_IBM(0, 7)
> -/* max swqe immediate data length */
> -#define H_ALL_RES_QP_PORT_NUM EHEA_BMASK_IBM(48, 63)
> -
> -/* input param R12 */
> -#define H_ALL_RES_QP_TH_RQ2 EHEA_BMASK_IBM(0, 15)
> -/* Threshold RQ2 */
> -#define H_ALL_RES_QP_TH_RQ3 EHEA_BMASK_IBM(16, 31)
> -/* Threshold RQ3 */
> -
> -/* output param R6 */
> -#define H_ALL_RES_QP_ACT_SWQE EHEA_BMASK_IBM(0, 15)
> -#define H_ALL_RES_QP_ACT_R1WQE EHEA_BMASK_IBM(16, 31)
> -#define H_ALL_RES_QP_ACT_R2WQE EHEA_BMASK_IBM(32, 47)
> -#define H_ALL_RES_QP_ACT_R3WQE EHEA_BMASK_IBM(48, 63)
> -
> -/* output param, R7 */
> -#define H_ALL_RES_QP_ACT_SSGE EHEA_BMASK_IBM(0, 7)
> -#define H_ALL_RES_QP_ACT_R1SGE EHEA_BMASK_IBM(8, 15)
> -#define H_ALL_RES_QP_ACT_R2SGE EHEA_BMASK_IBM(16, 23)
> -#define H_ALL_RES_QP_ACT_R3SGE EHEA_BMASK_IBM(24, 31)
> -#define H_ALL_RES_QP_ACT_SWQE_IDL EHEA_BMASK_IBM(32, 39)
> -
> -/* output param R8,R9 */
> -#define H_ALL_RES_QP_SIZE_SQ EHEA_BMASK_IBM(0, 31)
> -#define H_ALL_RES_QP_SIZE_RQ1 EHEA_BMASK_IBM(32, 63)
> -#define H_ALL_RES_QP_SIZE_RQ2 EHEA_BMASK_IBM(0, 31)
> -#define H_ALL_RES_QP_SIZE_RQ3 EHEA_BMASK_IBM(32, 63)
> -
> -/* output param R11,R12 */
> -#define H_ALL_RES_QP_LIOBN_SQ EHEA_BMASK_IBM(0, 31)
> -#define H_ALL_RES_QP_LIOBN_RQ1 EHEA_BMASK_IBM(32, 63)
> -#define H_ALL_RES_QP_LIOBN_RQ2 EHEA_BMASK_IBM(0, 31)
> -#define H_ALL_RES_QP_LIOBN_RQ3 EHEA_BMASK_IBM(32, 63)
> -
> -u64 ehea_h_alloc_resource_qp(const u64 adapter_handle,
> - struct ehea_qp_init_attr *init_attr, const u32 pd,
> - u64 *qp_handle, struct h_epas *h_epas)
> -{
> - u64 hret;
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - u64 allocate_controls =
> - EHEA_BMASK_SET(H_ALL_RES_QP_EQPO, init_attr->low_lat_rq1 ? 1 : 0)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_QPP, 0)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_RQR, 6) /* rq1 & rq2 & rq3 */
> - | EHEA_BMASK_SET(H_ALL_RES_QP_EQEG, 0) /* EQE gen. disabled */
> - | EHEA_BMASK_SET(H_ALL_RES_QP_LL_QP, init_attr->low_lat_rq1)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_DMA128, 0)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_HSM, 0)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_SIGT, init_attr->signalingtype)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_RES_TYP, H_ALL_RES_TYPE_QP);
> -
> - u64 r9_reg = EHEA_BMASK_SET(H_ALL_RES_QP_PD, pd)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_TOKEN, init_attr->qp_token);
> -
> - u64 max_r10_reg =
> - EHEA_BMASK_SET(H_ALL_RES_QP_MAX_SWQE,
> - get_order_of_qentries(init_attr->max_nr_send_wqes))
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R1WQE,
> - get_order_of_qentries(init_attr->max_nr_rwqes_rq1))
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R2WQE,
> - get_order_of_qentries(init_attr->max_nr_rwqes_rq2))
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R3WQE,
> - get_order_of_qentries(init_attr->max_nr_rwqes_rq3))
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_SSGE, init_attr->wqe_size_enc_sq)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R1SGE,
> - init_attr->wqe_size_enc_rq1)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R2SGE,
> - init_attr->wqe_size_enc_rq2)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_MAX_R3SGE,
> - init_attr->wqe_size_enc_rq3);
> -
> - u64 r11_in =
> - EHEA_BMASK_SET(H_ALL_RES_QP_SWQE_IDL, init_attr->swqe_imm_data_len)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_PORT_NUM, init_attr->port_nr);
> - u64 threshold =
> - EHEA_BMASK_SET(H_ALL_RES_QP_TH_RQ2, init_attr->rq2_threshold)
> - | EHEA_BMASK_SET(H_ALL_RES_QP_TH_RQ3, init_attr->rq3_threshold);
> -
> - hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
> - outs,
> - adapter_handle, /* R4 */
> - allocate_controls, /* R5 */
> - init_attr->send_cq_handle, /* R6 */
> - init_attr->recv_cq_handle, /* R7 */
> - init_attr->aff_eq_handle, /* R8 */
> - r9_reg, /* R9 */
> - max_r10_reg, /* R10 */
> - r11_in, /* R11 */
> - threshold); /* R12 */
> -
> - *qp_handle = outs[0];
> - init_attr->qp_nr = (u32)outs[1];
> -
> - init_attr->act_nr_send_wqes =
> - (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_SWQE, outs[2]);
> - init_attr->act_nr_rwqes_rq1 =
> - (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_R1WQE, outs[2]);
> - init_attr->act_nr_rwqes_rq2 =
> - (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_R2WQE, outs[2]);
> - init_attr->act_nr_rwqes_rq3 =
> - (u16)EHEA_BMASK_GET(H_ALL_RES_QP_ACT_R3WQE, outs[2]);
> -
> - init_attr->act_wqe_size_enc_sq = init_attr->wqe_size_enc_sq;
> - init_attr->act_wqe_size_enc_rq1 = init_attr->wqe_size_enc_rq1;
> - init_attr->act_wqe_size_enc_rq2 = init_attr->wqe_size_enc_rq2;
> - init_attr->act_wqe_size_enc_rq3 = init_attr->wqe_size_enc_rq3;
> -
> - init_attr->nr_sq_pages =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_SQ, outs[4]);
> - init_attr->nr_rq1_pages =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_RQ1, outs[4]);
> - init_attr->nr_rq2_pages =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_RQ2, outs[5]);
> - init_attr->nr_rq3_pages =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_SIZE_RQ3, outs[5]);
> -
> - init_attr->liobn_sq =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_SQ, outs[7]);
> - init_attr->liobn_rq1 =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_RQ1, outs[7]);
> - init_attr->liobn_rq2 =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_RQ2, outs[8]);
> - init_attr->liobn_rq3 =
> - (u32)EHEA_BMASK_GET(H_ALL_RES_QP_LIOBN_RQ3, outs[8]);
> -
> - if (!hret)
> - hcp_epas_ctor(h_epas, outs[6], outs[6]);
> -
> - return hret;
> -}
> -
> -u64 ehea_h_alloc_resource_cq(const u64 adapter_handle,
> - struct ehea_cq_attr *cq_attr,
> - u64 *cq_handle, struct h_epas *epas)
> -{
> - u64 hret;
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
> - outs,
> - adapter_handle, /* R4 */
> - H_ALL_RES_TYPE_CQ, /* R5 */
> - cq_attr->eq_handle, /* R6 */
> - cq_attr->cq_token, /* R7 */
> - cq_attr->max_nr_of_cqes, /* R8 */
> - 0, 0, 0, 0); /* R9-R12 */
> -
> - *cq_handle = outs[0];
> - cq_attr->act_nr_of_cqes = outs[3];
> - cq_attr->nr_pages = outs[4];
> -
> - if (!hret)
> - hcp_epas_ctor(epas, outs[5], outs[6]);
> -
> - return hret;
> -}
> -
> -/* Defines for H_CALL H_ALLOC_RESOURCE */
> -#define H_ALL_RES_TYPE_QP 1
> -#define H_ALL_RES_TYPE_CQ 2
> -#define H_ALL_RES_TYPE_EQ 3
> -#define H_ALL_RES_TYPE_MR 5
> -#define H_ALL_RES_TYPE_MW 6
> -
> -/* input param R5 */
> -#define H_ALL_RES_EQ_NEQ EHEA_BMASK_IBM(0, 0)
> -#define H_ALL_RES_EQ_NON_NEQ_ISN EHEA_BMASK_IBM(6, 7)
> -#define H_ALL_RES_EQ_INH_EQE_GEN EHEA_BMASK_IBM(16, 16)
> -#define H_ALL_RES_EQ_RES_TYPE EHEA_BMASK_IBM(56, 63)
> -/* input param R6 */
> -#define H_ALL_RES_EQ_MAX_EQE EHEA_BMASK_IBM(32, 63)
> -
> -/* output param R6 */
> -#define H_ALL_RES_EQ_LIOBN EHEA_BMASK_IBM(32, 63)
> -
> -/* output param R7 */
> -#define H_ALL_RES_EQ_ACT_EQE EHEA_BMASK_IBM(32, 63)
> -
> -/* output param R8 */
> -#define H_ALL_RES_EQ_ACT_PS EHEA_BMASK_IBM(32, 63)
> -
> -/* output param R9 */
> -#define H_ALL_RES_EQ_ACT_EQ_IST_C EHEA_BMASK_IBM(30, 31)
> -#define H_ALL_RES_EQ_ACT_EQ_IST_1 EHEA_BMASK_IBM(40, 63)
> -
> -/* output param R10 */
> -#define H_ALL_RES_EQ_ACT_EQ_IST_2 EHEA_BMASK_IBM(40, 63)
> -
> -/* output param R11 */
> -#define H_ALL_RES_EQ_ACT_EQ_IST_3 EHEA_BMASK_IBM(40, 63)
> -
> -/* output param R12 */
> -#define H_ALL_RES_EQ_ACT_EQ_IST_4 EHEA_BMASK_IBM(40, 63)
> -
> -u64 ehea_h_alloc_resource_eq(const u64 adapter_handle,
> - struct ehea_eq_attr *eq_attr, u64 *eq_handle)
> -{
> - u64 hret, allocate_controls;
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - /* resource type */
> - allocate_controls =
> - EHEA_BMASK_SET(H_ALL_RES_EQ_RES_TYPE, H_ALL_RES_TYPE_EQ)
> - | EHEA_BMASK_SET(H_ALL_RES_EQ_NEQ, eq_attr->type ? 1 : 0)
> - | EHEA_BMASK_SET(H_ALL_RES_EQ_INH_EQE_GEN, !eq_attr->eqe_gen)
> - | EHEA_BMASK_SET(H_ALL_RES_EQ_NON_NEQ_ISN, 1);
> -
> - hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
> - outs,
> - adapter_handle, /* R4 */
> - allocate_controls, /* R5 */
> - eq_attr->max_nr_of_eqes, /* R6 */
> - 0, 0, 0, 0, 0, 0); /* R7-R10 */
> -
> - *eq_handle = outs[0];
> - eq_attr->act_nr_of_eqes = outs[3];
> - eq_attr->nr_pages = outs[4];
> - eq_attr->ist1 = outs[5];
> - eq_attr->ist2 = outs[6];
> - eq_attr->ist3 = outs[7];
> - eq_attr->ist4 = outs[8];
> -
> - return hret;
> -}
> -
> -u64 ehea_h_modify_ehea_qp(const u64 adapter_handle, const u8 cat,
> - const u64 qp_handle, const u64 sel_mask,
> - void *cb_addr, u64 *inv_attr_id, u64 *proc_mask,
> - u16 *out_swr, u16 *out_rwr)
> -{
> - u64 hret;
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - hret = ehea_plpar_hcall9(H_MODIFY_HEA_QP,
> - outs,
> - adapter_handle, /* R4 */
> - (u64) cat, /* R5 */
> - qp_handle, /* R6 */
> - sel_mask, /* R7 */
> - __pa(cb_addr), /* R8 */
> - 0, 0, 0, 0); /* R9-R12 */
> -
> - *inv_attr_id = outs[0];
> - *out_swr = outs[3];
> - *out_rwr = outs[4];
> - *proc_mask = outs[5];
> -
> - return hret;
> -}
> -
> -u64 ehea_h_register_rpage(const u64 adapter_handle, const u8 pagesize,
> - const u8 queue_type, const u64 resource_handle,
> - const u64 log_pageaddr, u64 count)
> -{
> - u64 reg_control;
> -
> - reg_control = EHEA_BMASK_SET(H_REG_RPAGE_PAGE_SIZE, pagesize)
> - | EHEA_BMASK_SET(H_REG_RPAGE_QT, queue_type);
> -
> - return ehea_plpar_hcall_norets(H_REGISTER_HEA_RPAGES,
> - adapter_handle, /* R4 */
> - reg_control, /* R5 */
> - resource_handle, /* R6 */
> - log_pageaddr, /* R7 */
> - count, /* R8 */
> - 0, 0); /* R9-R10 */
> -}
> -
> -u64 ehea_h_register_smr(const u64 adapter_handle, const u64 orig_mr_handle,
> - const u64 vaddr_in, const u32 access_ctrl, const u32 pd,
> - struct ehea_mr *mr)
> -{
> - u64 hret;
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - hret = ehea_plpar_hcall9(H_REGISTER_SMR,
> - outs,
> - adapter_handle , /* R4 */
> - orig_mr_handle, /* R5 */
> - vaddr_in, /* R6 */
> - (((u64)access_ctrl) << 32ULL), /* R7 */
> - pd, /* R8 */
> - 0, 0, 0, 0); /* R9-R12 */
> -
> - mr->handle = outs[0];
> - mr->lkey = (u32)outs[2];
> -
> - return hret;
> -}
> -
> -u64 ehea_h_disable_and_get_hea(const u64 adapter_handle, const u64 qp_handle)
> -{
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - return ehea_plpar_hcall9(H_DISABLE_AND_GET_HEA,
> - outs,
> - adapter_handle, /* R4 */
> - H_DISABLE_GET_EHEA_WQE_P, /* R5 */
> - qp_handle, /* R6 */
> - 0, 0, 0, 0, 0, 0); /* R7-R12 */
> -}
> -
> -u64 ehea_h_free_resource(const u64 adapter_handle, const u64 res_handle,
> - u64 force_bit)
> -{
> - return ehea_plpar_hcall_norets(H_FREE_RESOURCE,
> - adapter_handle, /* R4 */
> - res_handle, /* R5 */
> - force_bit,
> - 0, 0, 0, 0); /* R7-R10 */
> -}
> -
> -u64 ehea_h_alloc_resource_mr(const u64 adapter_handle, const u64 vaddr,
> - const u64 length, const u32 access_ctrl,
> - const u32 pd, u64 *mr_handle, u32 *lkey)
> -{
> - u64 hret;
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> -
> - hret = ehea_plpar_hcall9(H_ALLOC_HEA_RESOURCE,
> - outs,
> - adapter_handle, /* R4 */
> - 5, /* R5 */
> - vaddr, /* R6 */
> - length, /* R7 */
> - (((u64) access_ctrl) << 32ULL), /* R8 */
> - pd, /* R9 */
> - 0, 0, 0); /* R10-R12 */
> -
> - *mr_handle = outs[0];
> - *lkey = (u32)outs[2];
> - return hret;
> -}
> -
> -u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle,
> - const u8 pagesize, const u8 queue_type,
> - const u64 log_pageaddr, const u64 count)
> -{
> - if ((count > 1) && (log_pageaddr & ~PAGE_MASK)) {
> - pr_err("not on pageboundary\n");
> - return H_PARAMETER;
> - }
> -
> - return ehea_h_register_rpage(adapter_handle, pagesize,
> - queue_type, mr_handle,
> - log_pageaddr, count);
> -}
> -
> -u64 ehea_h_query_ehea(const u64 adapter_handle, void *cb_addr)
> -{
> - u64 hret, cb_logaddr;
> -
> - cb_logaddr = __pa(cb_addr);
> -
> - hret = ehea_plpar_hcall_norets(H_QUERY_HEA,
> - adapter_handle, /* R4 */
> - cb_logaddr, /* R5 */
> - 0, 0, 0, 0, 0); /* R6-R10 */
> -#ifdef DEBUG
> - ehea_dump(cb_addr, sizeof(struct hcp_query_ehea), "hcp_query_ehea");
> -#endif
> - return hret;
> -}
> -
> -u64 ehea_h_query_ehea_port(const u64 adapter_handle, const u16 port_num,
> - const u8 cb_cat, const u64 select_mask,
> - void *cb_addr)
> -{
> - u64 port_info;
> - u64 cb_logaddr = __pa(cb_addr);
> - u64 arr_index = 0;
> -
> - port_info = EHEA_BMASK_SET(H_MEHEAPORT_CAT, cb_cat)
> - | EHEA_BMASK_SET(H_MEHEAPORT_PN, port_num);
> -
> - return ehea_plpar_hcall_norets(H_QUERY_HEA_PORT,
> - adapter_handle, /* R4 */
> - port_info, /* R5 */
> - select_mask, /* R6 */
> - arr_index, /* R7 */
> - cb_logaddr, /* R8 */
> - 0, 0); /* R9-R10 */
> -}
> -
> -u64 ehea_h_modify_ehea_port(const u64 adapter_handle, const u16 port_num,
> - const u8 cb_cat, const u64 select_mask,
> - void *cb_addr)
> -{
> - unsigned long outs[PLPAR_HCALL9_BUFSIZE];
> - u64 port_info;
> - u64 arr_index = 0;
> - u64 cb_logaddr = __pa(cb_addr);
> -
> - port_info = EHEA_BMASK_SET(H_MEHEAPORT_CAT, cb_cat)
> - | EHEA_BMASK_SET(H_MEHEAPORT_PN, port_num);
> -#ifdef DEBUG
> - ehea_dump(cb_addr, sizeof(struct hcp_ehea_port_cb0), "Before HCALL");
> -#endif
> - return ehea_plpar_hcall9(H_MODIFY_HEA_PORT,
> - outs,
> - adapter_handle, /* R4 */
> - port_info, /* R5 */
> - select_mask, /* R6 */
> - arr_index, /* R7 */
> - cb_logaddr, /* R8 */
> - 0, 0, 0, 0); /* R9-R12 */
> -}
> -
> -u64 ehea_h_reg_dereg_bcmc(const u64 adapter_handle, const u16 port_num,
> - const u8 reg_type, const u64 mc_mac_addr,
> - const u16 vlan_id, const u32 hcall_id)
> -{
> - u64 r5_port_num, r6_reg_type, r7_mc_mac_addr, r8_vlan_id;
> - u64 mac_addr = mc_mac_addr >> 16;
> -
> - r5_port_num = EHEA_BMASK_SET(H_REGBCMC_PN, port_num);
> - r6_reg_type = EHEA_BMASK_SET(H_REGBCMC_REGTYPE, reg_type);
> - r7_mc_mac_addr = EHEA_BMASK_SET(H_REGBCMC_MACADDR, mac_addr);
> - r8_vlan_id = EHEA_BMASK_SET(H_REGBCMC_VLANID, vlan_id);
> -
> - return ehea_plpar_hcall_norets(hcall_id,
> - adapter_handle, /* R4 */
> - r5_port_num, /* R5 */
> - r6_reg_type, /* R6 */
> - r7_mc_mac_addr, /* R7 */
> - r8_vlan_id, /* R8 */
> - 0, 0); /* R9-R12 */
> -}
> -
> -u64 ehea_h_reset_events(const u64 adapter_handle, const u64 neq_handle,
> - const u64 event_mask)
> -{
> - return ehea_plpar_hcall_norets(H_RESET_EVENTS,
> - adapter_handle, /* R4 */
> - neq_handle, /* R5 */
> - event_mask, /* R6 */
> - 0, 0, 0, 0); /* R7-R12 */
> -}
> -
> -u64 ehea_h_error_data(const u64 adapter_handle, const u64 ressource_handle,
> - void *rblock)
> -{
> - return ehea_plpar_hcall_norets(H_ERROR_DATA,
> - adapter_handle, /* R4 */
> - ressource_handle, /* R5 */
> - __pa(rblock), /* R6 */
> - 0, 0, 0, 0); /* R7-R12 */
> -}
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_phyp.h b/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
> deleted file mode 100644
> index e8b56c103410..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
> +++ /dev/null
> @@ -1,433 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_phyp.h
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#ifndef __EHEA_PHYP_H__
> -#define __EHEA_PHYP_H__
> -
> -#include <linux/delay.h>
> -#include <asm/hvcall.h>
> -#include "ehea.h"
> -#include "ehea_hw.h"
> -
> -/* Some abbreviations used here:
> - *
> - * hcp_* - structures, variables and functions releated to Hypervisor Calls
> - */
> -
> -/* Number of pages which can be registered at once by H_REGISTER_HEA_RPAGES */
> -#define EHEA_MAX_RPAGE 512
> -
> -/* Notification Event Queue (NEQ) Entry bit masks */
> -#define NEQE_EVENT_CODE EHEA_BMASK_IBM(2, 7)
> -#define NEQE_PORTNUM EHEA_BMASK_IBM(32, 47)
> -#define NEQE_PORT_UP EHEA_BMASK_IBM(16, 16)
> -#define NEQE_EXTSWITCH_PORT_UP EHEA_BMASK_IBM(17, 17)
> -#define NEQE_EXTSWITCH_PRIMARY EHEA_BMASK_IBM(18, 18)
> -#define NEQE_PLID EHEA_BMASK_IBM(16, 47)
> -
> -/* Notification Event Codes */
> -#define EHEA_EC_PORTSTATE_CHG 0x30
> -#define EHEA_EC_ADAPTER_MALFUNC 0x32
> -#define EHEA_EC_PORT_MALFUNC 0x33
> -
> -/* Notification Event Log Register (NELR) bit masks */
> -#define NELR_PORT_MALFUNC EHEA_BMASK_IBM(61, 61)
> -#define NELR_ADAPTER_MALFUNC EHEA_BMASK_IBM(62, 62)
> -#define NELR_PORTSTATE_CHG EHEA_BMASK_IBM(63, 63)
> -
> -static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel,
> - u64 paddr_user)
> -{
> - /* To support 64k pages we must round to 64k page boundary */
> - epas->kernel.addr = ioremap((paddr_kernel & PAGE_MASK), PAGE_SIZE) +
> - (paddr_kernel & ~PAGE_MASK);
> - epas->user.addr = paddr_user;
> -}
> -
> -static inline void hcp_epas_dtor(struct h_epas *epas)
> -{
> - if (epas->kernel.addr)
> - iounmap((void __iomem *)((u64)epas->kernel.addr & PAGE_MASK));
> -
> - epas->user.addr = 0;
> - epas->kernel.addr = 0;
> -}
> -
> -struct hcp_modify_qp_cb0 {
> - u64 qp_ctl_reg; /* 00 */
> - u32 max_swqe; /* 02 */
> - u32 max_rwqe; /* 03 */
> - u32 port_nb; /* 04 */
> - u32 reserved0; /* 05 */
> - u64 qp_aer; /* 06 */
> - u64 qp_tenure; /* 08 */
> -};
> -
> -/* Hcall Query/Modify Queue Pair Control Block 0 Selection Mask Bits */
> -#define H_QPCB0_ALL EHEA_BMASK_IBM(0, 5)
> -#define H_QPCB0_QP_CTL_REG EHEA_BMASK_IBM(0, 0)
> -#define H_QPCB0_MAX_SWQE EHEA_BMASK_IBM(1, 1)
> -#define H_QPCB0_MAX_RWQE EHEA_BMASK_IBM(2, 2)
> -#define H_QPCB0_PORT_NB EHEA_BMASK_IBM(3, 3)
> -#define H_QPCB0_QP_AER EHEA_BMASK_IBM(4, 4)
> -#define H_QPCB0_QP_TENURE EHEA_BMASK_IBM(5, 5)
> -
> -/* Queue Pair Control Register Status Bits */
> -#define H_QP_CR_ENABLED 0x8000000000000000ULL /* QP enabled */
> - /* QP States: */
> -#define H_QP_CR_STATE_RESET 0x0000010000000000ULL /* Reset */
> -#define H_QP_CR_STATE_INITIALIZED 0x0000020000000000ULL /* Initialized */
> -#define H_QP_CR_STATE_RDY2RCV 0x0000030000000000ULL /* Ready to recv */
> -#define H_QP_CR_STATE_RDY2SND 0x0000050000000000ULL /* Ready to send */
> -#define H_QP_CR_STATE_ERROR 0x0000800000000000ULL /* Error */
> -#define H_QP_CR_RES_STATE 0x0000007F00000000ULL /* Resultant state */
> -
> -struct hcp_modify_qp_cb1 {
> - u32 qpn; /* 00 */
> - u32 qp_asyn_ev_eq_nb; /* 01 */
> - u64 sq_cq_handle; /* 02 */
> - u64 rq_cq_handle; /* 04 */
> - /* sgel = scatter gather element */
> - u32 sgel_nb_sq; /* 06 */
> - u32 sgel_nb_rq1; /* 07 */
> - u32 sgel_nb_rq2; /* 08 */
> - u32 sgel_nb_rq3; /* 09 */
> -};
> -
> -/* Hcall Query/Modify Queue Pair Control Block 1 Selection Mask Bits */
> -#define H_QPCB1_ALL EHEA_BMASK_IBM(0, 7)
> -#define H_QPCB1_QPN EHEA_BMASK_IBM(0, 0)
> -#define H_QPCB1_ASYN_EV_EQ_NB EHEA_BMASK_IBM(1, 1)
> -#define H_QPCB1_SQ_CQ_HANDLE EHEA_BMASK_IBM(2, 2)
> -#define H_QPCB1_RQ_CQ_HANDLE EHEA_BMASK_IBM(3, 3)
> -#define H_QPCB1_SGEL_NB_SQ EHEA_BMASK_IBM(4, 4)
> -#define H_QPCB1_SGEL_NB_RQ1 EHEA_BMASK_IBM(5, 5)
> -#define H_QPCB1_SGEL_NB_RQ2 EHEA_BMASK_IBM(6, 6)
> -#define H_QPCB1_SGEL_NB_RQ3 EHEA_BMASK_IBM(7, 7)
> -
> -struct hcp_query_ehea {
> - u32 cur_num_qps; /* 00 */
> - u32 cur_num_cqs; /* 01 */
> - u32 cur_num_eqs; /* 02 */
> - u32 cur_num_mrs; /* 03 */
> - u32 auth_level; /* 04 */
> - u32 max_num_qps; /* 05 */
> - u32 max_num_cqs; /* 06 */
> - u32 max_num_eqs; /* 07 */
> - u32 max_num_mrs; /* 08 */
> - u32 reserved0; /* 09 */
> - u32 int_clock_freq; /* 10 */
> - u32 max_num_pds; /* 11 */
> - u32 max_num_addr_handles; /* 12 */
> - u32 max_num_cqes; /* 13 */
> - u32 max_num_wqes; /* 14 */
> - u32 max_num_sgel_rq1wqe; /* 15 */
> - u32 max_num_sgel_rq2wqe; /* 16 */
> - u32 max_num_sgel_rq3wqe; /* 17 */
> - u32 mr_page_size; /* 18 */
> - u32 reserved1; /* 19 */
> - u64 max_mr_size; /* 20 */
> - u64 reserved2; /* 22 */
> - u32 num_ports; /* 24 */
> - u32 reserved3; /* 25 */
> - u32 reserved4; /* 26 */
> - u32 reserved5; /* 27 */
> - u64 max_mc_mac; /* 28 */
> - u64 ehea_cap; /* 30 */
> - u32 max_isn_per_eq; /* 32 */
> - u32 max_num_neq; /* 33 */
> - u64 max_num_vlan_ids; /* 34 */
> - u32 max_num_port_group; /* 36 */
> - u32 max_num_phys_port; /* 37 */
> -
> -};
> -
> -/* Hcall Query/Modify Port Control Block defines */
> -#define H_PORT_CB0 0
> -#define H_PORT_CB1 1
> -#define H_PORT_CB2 2
> -#define H_PORT_CB3 3
> -#define H_PORT_CB4 4
> -#define H_PORT_CB5 5
> -#define H_PORT_CB6 6
> -#define H_PORT_CB7 7
> -
> -struct hcp_ehea_port_cb0 {
> - u64 port_mac_addr;
> - u64 port_rc;
> - u64 reserved0;
> - u32 port_op_state;
> - u32 port_speed;
> - u32 ext_swport_op_state;
> - u32 neg_tpf_prpf;
> - u32 num_default_qps;
> - u32 reserved1;
> - u64 default_qpn_arr[16];
> -};
> -
> -/* Hcall Query/Modify Port Control Block 0 Selection Mask Bits */
> -#define H_PORT_CB0_ALL EHEA_BMASK_IBM(0, 7) /* Set all bits */
> -#define H_PORT_CB0_MAC EHEA_BMASK_IBM(0, 0) /* MAC address */
> -#define H_PORT_CB0_PRC EHEA_BMASK_IBM(1, 1) /* Port Recv Control */
> -#define H_PORT_CB0_DEFQPNARRAY EHEA_BMASK_IBM(7, 7) /* Default QPN Array */
> -
> -/* Hcall Query Port: Returned port speed values */
> -#define H_SPEED_10M_H 1 /* 10 Mbps, Half Duplex */
> -#define H_SPEED_10M_F 2 /* 10 Mbps, Full Duplex */
> -#define H_SPEED_100M_H 3 /* 100 Mbps, Half Duplex */
> -#define H_SPEED_100M_F 4 /* 100 Mbps, Full Duplex */
> -#define H_SPEED_1G_F 6 /* 1 Gbps, Full Duplex */
> -#define H_SPEED_10G_F 8 /* 10 Gbps, Full Duplex */
> -
> -/* Port Receive Control Status Bits */
> -#define PXLY_RC_VALID EHEA_BMASK_IBM(49, 49)
> -#define PXLY_RC_VLAN_XTRACT EHEA_BMASK_IBM(50, 50)
> -#define PXLY_RC_TCP_6_TUPLE EHEA_BMASK_IBM(51, 51)
> -#define PXLY_RC_UDP_6_TUPLE EHEA_BMASK_IBM(52, 52)
> -#define PXLY_RC_TCP_3_TUPLE EHEA_BMASK_IBM(53, 53)
> -#define PXLY_RC_TCP_2_TUPLE EHEA_BMASK_IBM(54, 54)
> -#define PXLY_RC_LLC_SNAP EHEA_BMASK_IBM(55, 55)
> -#define PXLY_RC_JUMBO_FRAME EHEA_BMASK_IBM(56, 56)
> -#define PXLY_RC_FRAG_IP_PKT EHEA_BMASK_IBM(57, 57)
> -#define PXLY_RC_TCP_UDP_CHKSUM EHEA_BMASK_IBM(58, 58)
> -#define PXLY_RC_IP_CHKSUM EHEA_BMASK_IBM(59, 59)
> -#define PXLY_RC_MAC_FILTER EHEA_BMASK_IBM(60, 60)
> -#define PXLY_RC_UNTAG_FILTER EHEA_BMASK_IBM(61, 61)
> -#define PXLY_RC_VLAN_TAG_FILTER EHEA_BMASK_IBM(62, 63)
> -
> -#define PXLY_RC_VLAN_FILTER 2
> -#define PXLY_RC_VLAN_PERM 0
> -
> -
> -#define H_PORT_CB1_ALL 0x8000000000000000ULL
> -
> -struct hcp_ehea_port_cb1 {
> - u64 vlan_filter[64];
> -};
> -
> -#define H_PORT_CB2_ALL 0xFFE0000000000000ULL
> -
> -struct hcp_ehea_port_cb2 {
> - u64 rxo;
> - u64 rxucp;
> - u64 rxufd;
> - u64 rxuerr;
> - u64 rxftl;
> - u64 rxmcp;
> - u64 rxbcp;
> - u64 txo;
> - u64 txucp;
> - u64 txmcp;
> - u64 txbcp;
> -};
> -
> -struct hcp_ehea_port_cb3 {
> - u64 vlan_bc_filter[64];
> - u64 vlan_mc_filter[64];
> - u64 vlan_un_filter[64];
> - u64 port_mac_hash_array[64];
> -};
> -
> -#define H_PORT_CB4_ALL 0xF000000000000000ULL
> -#define H_PORT_CB4_JUMBO 0x1000000000000000ULL
> -#define H_PORT_CB4_SPEED 0x8000000000000000ULL
> -
> -struct hcp_ehea_port_cb4 {
> - u32 port_speed;
> - u32 pause_frame;
> - u32 ens_port_op_state;
> - u32 jumbo_frame;
> - u32 ens_port_wrap;
> -};
> -
> -/* Hcall Query/Modify Port Control Block 5 Selection Mask Bits */
> -#define H_PORT_CB5_RCU 0x0001000000000000ULL
> -#define PXS_RCU EHEA_BMASK_IBM(61, 63)
> -
> -struct hcp_ehea_port_cb5 {
> - u64 prc; /* 00 */
> - u64 uaa; /* 01 */
> - u64 macvc; /* 02 */
> - u64 xpcsc; /* 03 */
> - u64 xpcsp; /* 04 */
> - u64 pcsid; /* 05 */
> - u64 xpcsst; /* 06 */
> - u64 pthlb; /* 07 */
> - u64 pthrb; /* 08 */
> - u64 pqu; /* 09 */
> - u64 pqd; /* 10 */
> - u64 prt; /* 11 */
> - u64 wsth; /* 12 */
> - u64 rcb; /* 13 */
> - u64 rcm; /* 14 */
> - u64 rcu; /* 15 */
> - u64 macc; /* 16 */
> - u64 pc; /* 17 */
> - u64 pst; /* 18 */
> - u64 ducqpn; /* 19 */
> - u64 mcqpn; /* 20 */
> - u64 mma; /* 21 */
> - u64 pmc0h; /* 22 */
> - u64 pmc0l; /* 23 */
> - u64 lbc; /* 24 */
> -};
> -
> -#define H_PORT_CB6_ALL 0xFFFFFE7FFFFF8000ULL
> -
> -struct hcp_ehea_port_cb6 {
> - u64 rxo; /* 00 */
> - u64 rx64; /* 01 */
> - u64 rx65; /* 02 */
> - u64 rx128; /* 03 */
> - u64 rx256; /* 04 */
> - u64 rx512; /* 05 */
> - u64 rx1024; /* 06 */
> - u64 rxbfcs; /* 07 */
> - u64 rxime; /* 08 */
> - u64 rxrle; /* 09 */
> - u64 rxorle; /* 10 */
> - u64 rxftl; /* 11 */
> - u64 rxjab; /* 12 */
> - u64 rxse; /* 13 */
> - u64 rxce; /* 14 */
> - u64 rxrf; /* 15 */
> - u64 rxfrag; /* 16 */
> - u64 rxuoc; /* 17 */
> - u64 rxcpf; /* 18 */
> - u64 rxsb; /* 19 */
> - u64 rxfd; /* 20 */
> - u64 rxoerr; /* 21 */
> - u64 rxaln; /* 22 */
> - u64 ducqpn; /* 23 */
> - u64 reserved0; /* 24 */
> - u64 rxmcp; /* 25 */
> - u64 rxbcp; /* 26 */
> - u64 txmcp; /* 27 */
> - u64 txbcp; /* 28 */
> - u64 txo; /* 29 */
> - u64 tx64; /* 30 */
> - u64 tx65; /* 31 */
> - u64 tx128; /* 32 */
> - u64 tx256; /* 33 */
> - u64 tx512; /* 34 */
> - u64 tx1024; /* 35 */
> - u64 txbfcs; /* 36 */
> - u64 txcpf; /* 37 */
> - u64 txlf; /* 38 */
> - u64 txrf; /* 39 */
> - u64 txime; /* 40 */
> - u64 txsc; /* 41 */
> - u64 txmc; /* 42 */
> - u64 txsqe; /* 43 */
> - u64 txdef; /* 44 */
> - u64 txlcol; /* 45 */
> - u64 txexcol; /* 46 */
> - u64 txcse; /* 47 */
> - u64 txbor; /* 48 */
> -};
> -
> -#define H_PORT_CB7_DUCQPN 0x8000000000000000ULL
> -
> -struct hcp_ehea_port_cb7 {
> - u64 def_uc_qpn;
> -};
> -
> -u64 ehea_h_query_ehea_qp(const u64 adapter_handle,
> - const u8 qp_category,
> - const u64 qp_handle, const u64 sel_mask,
> - void *cb_addr);
> -
> -u64 ehea_h_modify_ehea_qp(const u64 adapter_handle,
> - const u8 cat,
> - const u64 qp_handle,
> - const u64 sel_mask,
> - void *cb_addr,
> - u64 *inv_attr_id,
> - u64 *proc_mask, u16 *out_swr, u16 *out_rwr);
> -
> -u64 ehea_h_alloc_resource_eq(const u64 adapter_handle,
> - struct ehea_eq_attr *eq_attr, u64 *eq_handle);
> -
> -u64 ehea_h_alloc_resource_cq(const u64 adapter_handle,
> - struct ehea_cq_attr *cq_attr,
> - u64 *cq_handle, struct h_epas *epas);
> -
> -u64 ehea_h_alloc_resource_qp(const u64 adapter_handle,
> - struct ehea_qp_init_attr *init_attr,
> - const u32 pd,
> - u64 *qp_handle, struct h_epas *h_epas);
> -
> -#define H_REG_RPAGE_PAGE_SIZE EHEA_BMASK_IBM(48, 55)
> -#define H_REG_RPAGE_QT EHEA_BMASK_IBM(62, 63)
> -
> -u64 ehea_h_register_rpage(const u64 adapter_handle,
> - const u8 pagesize,
> - const u8 queue_type,
> - const u64 resource_handle,
> - const u64 log_pageaddr, u64 count);
> -
> -#define H_DISABLE_GET_EHEA_WQE_P 1
> -#define H_DISABLE_GET_SQ_WQE_P 2
> -#define H_DISABLE_GET_RQC 3
> -
> -u64 ehea_h_disable_and_get_hea(const u64 adapter_handle, const u64 qp_handle);
> -
> -#define FORCE_FREE 1
> -#define NORMAL_FREE 0
> -
> -u64 ehea_h_free_resource(const u64 adapter_handle, const u64 res_handle,
> - u64 force_bit);
> -
> -u64 ehea_h_alloc_resource_mr(const u64 adapter_handle, const u64 vaddr,
> - const u64 length, const u32 access_ctrl,
> - const u32 pd, u64 *mr_handle, u32 *lkey);
> -
> -u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle,
> - const u8 pagesize, const u8 queue_type,
> - const u64 log_pageaddr, const u64 count);
> -
> -u64 ehea_h_register_smr(const u64 adapter_handle, const u64 orig_mr_handle,
> - const u64 vaddr_in, const u32 access_ctrl, const u32 pd,
> - struct ehea_mr *mr);
> -
> -u64 ehea_h_query_ehea(const u64 adapter_handle, void *cb_addr);
> -
> -/* output param R5 */
> -#define H_MEHEAPORT_CAT EHEA_BMASK_IBM(40, 47)
> -#define H_MEHEAPORT_PN EHEA_BMASK_IBM(48, 63)
> -
> -u64 ehea_h_query_ehea_port(const u64 adapter_handle, const u16 port_num,
> - const u8 cb_cat, const u64 select_mask,
> - void *cb_addr);
> -
> -u64 ehea_h_modify_ehea_port(const u64 adapter_handle, const u16 port_num,
> - const u8 cb_cat, const u64 select_mask,
> - void *cb_addr);
> -
> -#define H_REGBCMC_PN EHEA_BMASK_IBM(48, 63)
> -#define H_REGBCMC_REGTYPE EHEA_BMASK_IBM(60, 63)
> -#define H_REGBCMC_MACADDR EHEA_BMASK_IBM(16, 63)
> -#define H_REGBCMC_VLANID EHEA_BMASK_IBM(52, 63)
> -
> -u64 ehea_h_reg_dereg_bcmc(const u64 adapter_handle, const u16 port_num,
> - const u8 reg_type, const u64 mc_mac_addr,
> - const u16 vlan_id, const u32 hcall_id);
> -
> -u64 ehea_h_reset_events(const u64 adapter_handle, const u64 neq_handle,
> - const u64 event_mask);
> -
> -u64 ehea_h_error_data(const u64 adapter_handle, const u64 ressource_handle,
> - void *rblock);
> -
> -#endif /* __EHEA_PHYP_H__ */
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_qmr.c b/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
> deleted file mode 100644
> index 60629a0032b2..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
> +++ /dev/null
> @@ -1,999 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.c
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include <linux/mm.h>
> -#include <linux/slab.h>
> -#include "ehea.h"
> -#include "ehea_phyp.h"
> -#include "ehea_qmr.h"
> -
> -static struct ehea_bmap *ehea_bmap;
> -
> -static void *hw_qpageit_get_inc(struct hw_queue *queue)
> -{
> - void *retvalue = hw_qeit_get(queue);
> -
> - queue->current_q_offset += queue->pagesize;
> - if (queue->current_q_offset > queue->queue_length) {
> - queue->current_q_offset -= queue->pagesize;
> - retvalue = NULL;
> - } else if (((u64) retvalue) & (EHEA_PAGESIZE-1)) {
> - pr_err("not on pageboundary\n");
> - retvalue = NULL;
> - }
> - return retvalue;
> -}
> -
> -static int hw_queue_ctor(struct hw_queue *queue, const u32 nr_of_pages,
> - const u32 pagesize, const u32 qe_size)
> -{
> - int pages_per_kpage = PAGE_SIZE / pagesize;
> - int i, k;
> -
> - if ((pagesize > PAGE_SIZE) || (!pages_per_kpage)) {
> - pr_err("pagesize conflict! kernel pagesize=%d, ehea pagesize=%d\n",
> - (int)PAGE_SIZE, (int)pagesize);
> - return -EINVAL;
> - }
> -
> - queue->queue_length = nr_of_pages * pagesize;
> - queue->queue_pages = kmalloc_array(nr_of_pages, sizeof(void *),
> - GFP_KERNEL);
> - if (!queue->queue_pages)
> - return -ENOMEM;
> -
> - /*
> - * allocate pages for queue:
> - * outer loop allocates whole kernel pages (page aligned) and
> - * inner loop divides a kernel page into smaller hea queue pages
> - */
> - i = 0;
> - while (i < nr_of_pages) {
> - u8 *kpage = (u8 *)get_zeroed_page(GFP_KERNEL);
> - if (!kpage)
> - goto out_nomem;
> - for (k = 0; k < pages_per_kpage && i < nr_of_pages; k++) {
> - (queue->queue_pages)[i] = (struct ehea_page *)kpage;
> - kpage += pagesize;
> - i++;
> - }
> - }
> -
> - queue->current_q_offset = 0;
> - queue->qe_size = qe_size;
> - queue->pagesize = pagesize;
> - queue->toggle_state = 1;
> -
> - return 0;
> -out_nomem:
> - for (i = 0; i < nr_of_pages; i += pages_per_kpage) {
> - if (!(queue->queue_pages)[i])
> - break;
> - free_page((unsigned long)(queue->queue_pages)[i]);
> - }
> - return -ENOMEM;
> -}
> -
> -static void hw_queue_dtor(struct hw_queue *queue)
> -{
> - int pages_per_kpage;
> - int i, nr_pages;
> -
> - if (!queue || !queue->queue_pages)
> - return;
> -
> - pages_per_kpage = PAGE_SIZE / queue->pagesize;
> -
> - nr_pages = queue->queue_length / queue->pagesize;
> -
> - for (i = 0; i < nr_pages; i += pages_per_kpage)
> - free_page((unsigned long)(queue->queue_pages)[i]);
> -
> - kfree(queue->queue_pages);
> -}
> -
> -struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter,
> - int nr_of_cqe, u64 eq_handle, u32 cq_token)
> -{
> - struct ehea_cq *cq;
> - u64 hret, rpage;
> - u32 counter;
> - int ret;
> - void *vpage;
> -
> - cq = kzalloc_obj(*cq);
> - if (!cq)
> - goto out_nomem;
> -
> - cq->attr.max_nr_of_cqes = nr_of_cqe;
> - cq->attr.cq_token = cq_token;
> - cq->attr.eq_handle = eq_handle;
> -
> - cq->adapter = adapter;
> -
> - hret = ehea_h_alloc_resource_cq(adapter->handle, &cq->attr,
> - &cq->fw_handle, &cq->epas);
> - if (hret != H_SUCCESS) {
> - pr_err("alloc_resource_cq failed\n");
> - goto out_freemem;
> - }
> -
> - ret = hw_queue_ctor(&cq->hw_queue, cq->attr.nr_pages,
> - EHEA_PAGESIZE, sizeof(struct ehea_cqe));
> - if (ret)
> - goto out_freeres;
> -
> - for (counter = 0; counter < cq->attr.nr_pages; counter++) {
> - vpage = hw_qpageit_get_inc(&cq->hw_queue);
> - if (!vpage) {
> - pr_err("hw_qpageit_get_inc failed\n");
> - goto out_kill_hwq;
> - }
> -
> - rpage = __pa(vpage);
> - hret = ehea_h_register_rpage(adapter->handle,
> - 0, EHEA_CQ_REGISTER_ORIG,
> - cq->fw_handle, rpage, 1);
> - if (hret < H_SUCCESS) {
> - pr_err("register_rpage_cq failed ehea_cq=%p hret=%llx counter=%i act_pages=%i\n",
> - cq, hret, counter, cq->attr.nr_pages);
> - goto out_kill_hwq;
> - }
> -
> - if (counter == (cq->attr.nr_pages - 1)) {
> - vpage = hw_qpageit_get_inc(&cq->hw_queue);
> -
> - if ((hret != H_SUCCESS) || (vpage)) {
> - pr_err("registration of pages not complete hret=%llx\n",
> - hret);
> - goto out_kill_hwq;
> - }
> - } else {
> - if (hret != H_PAGE_REGISTERED) {
> - pr_err("CQ: registration of page failed hret=%llx\n",
> - hret);
> - goto out_kill_hwq;
> - }
> - }
> - }
> -
> - hw_qeit_reset(&cq->hw_queue);
> - ehea_reset_cq_ep(cq);
> - ehea_reset_cq_n1(cq);
> -
> - return cq;
> -
> -out_kill_hwq:
> - hw_queue_dtor(&cq->hw_queue);
> -
> -out_freeres:
> - ehea_h_free_resource(adapter->handle, cq->fw_handle, FORCE_FREE);
> -
> -out_freemem:
> - kfree(cq);
> -
> -out_nomem:
> - return NULL;
> -}
> -
> -static u64 ehea_destroy_cq_res(struct ehea_cq *cq, u64 force)
> -{
> - u64 hret;
> - u64 adapter_handle = cq->adapter->handle;
> -
> - /* deregister all previous registered pages */
> - hret = ehea_h_free_resource(adapter_handle, cq->fw_handle, force);
> - if (hret != H_SUCCESS)
> - return hret;
> -
> - hw_queue_dtor(&cq->hw_queue);
> - kfree(cq);
> -
> - return hret;
> -}
> -
> -int ehea_destroy_cq(struct ehea_cq *cq)
> -{
> - u64 hret, aer, aerr;
> - if (!cq)
> - return 0;
> -
> - hcp_epas_dtor(&cq->epas);
> - hret = ehea_destroy_cq_res(cq, NORMAL_FREE);
> - if (hret == H_R_STATE) {
> - ehea_error_data(cq->adapter, cq->fw_handle, &aer, &aerr);
> - hret = ehea_destroy_cq_res(cq, FORCE_FREE);
> - }
> -
> - if (hret != H_SUCCESS) {
> - pr_err("destroy CQ failed\n");
> - return -EIO;
> - }
> -
> - return 0;
> -}
> -
> -struct ehea_eq *ehea_create_eq(struct ehea_adapter *adapter,
> - const enum ehea_eq_type type,
> - const u32 max_nr_of_eqes, const u8 eqe_gen)
> -{
> - int ret, i;
> - u64 hret, rpage;
> - void *vpage;
> - struct ehea_eq *eq;
> -
> - eq = kzalloc_obj(*eq);
> - if (!eq)
> - return NULL;
> -
> - eq->adapter = adapter;
> - eq->attr.type = type;
> - eq->attr.max_nr_of_eqes = max_nr_of_eqes;
> - eq->attr.eqe_gen = eqe_gen;
> - spin_lock_init(&eq->spinlock);
> -
> - hret = ehea_h_alloc_resource_eq(adapter->handle,
> - &eq->attr, &eq->fw_handle);
> - if (hret != H_SUCCESS) {
> - pr_err("alloc_resource_eq failed\n");
> - goto out_freemem;
> - }
> -
> - ret = hw_queue_ctor(&eq->hw_queue, eq->attr.nr_pages,
> - EHEA_PAGESIZE, sizeof(struct ehea_eqe));
> - if (ret) {
> - pr_err("can't allocate eq pages\n");
> - goto out_freeres;
> - }
> -
> - for (i = 0; i < eq->attr.nr_pages; i++) {
> - vpage = hw_qpageit_get_inc(&eq->hw_queue);
> - if (!vpage) {
> - pr_err("hw_qpageit_get_inc failed\n");
> - hret = H_RESOURCE;
> - goto out_kill_hwq;
> - }
> -
> - rpage = __pa(vpage);
> -
> - hret = ehea_h_register_rpage(adapter->handle, 0,
> - EHEA_EQ_REGISTER_ORIG,
> - eq->fw_handle, rpage, 1);
> -
> - if (i == (eq->attr.nr_pages - 1)) {
> - /* last page */
> - vpage = hw_qpageit_get_inc(&eq->hw_queue);
> - if ((hret != H_SUCCESS) || (vpage))
> - goto out_kill_hwq;
> -
> - } else {
> - if (hret != H_PAGE_REGISTERED)
> - goto out_kill_hwq;
> -
> - }
> - }
> -
> - hw_qeit_reset(&eq->hw_queue);
> - return eq;
> -
> -out_kill_hwq:
> - hw_queue_dtor(&eq->hw_queue);
> -
> -out_freeres:
> - ehea_h_free_resource(adapter->handle, eq->fw_handle, FORCE_FREE);
> -
> -out_freemem:
> - kfree(eq);
> - return NULL;
> -}
> -
> -struct ehea_eqe *ehea_poll_eq(struct ehea_eq *eq)
> -{
> - struct ehea_eqe *eqe;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&eq->spinlock, flags);
> - eqe = hw_eqit_eq_get_inc_valid(&eq->hw_queue);
> - spin_unlock_irqrestore(&eq->spinlock, flags);
> -
> - return eqe;
> -}
> -
> -static u64 ehea_destroy_eq_res(struct ehea_eq *eq, u64 force)
> -{
> - u64 hret;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&eq->spinlock, flags);
> -
> - hret = ehea_h_free_resource(eq->adapter->handle, eq->fw_handle, force);
> - spin_unlock_irqrestore(&eq->spinlock, flags);
> -
> - if (hret != H_SUCCESS)
> - return hret;
> -
> - hw_queue_dtor(&eq->hw_queue);
> - kfree(eq);
> -
> - return hret;
> -}
> -
> -int ehea_destroy_eq(struct ehea_eq *eq)
> -{
> - u64 hret, aer, aerr;
> - if (!eq)
> - return 0;
> -
> - hcp_epas_dtor(&eq->epas);
> -
> - hret = ehea_destroy_eq_res(eq, NORMAL_FREE);
> - if (hret == H_R_STATE) {
> - ehea_error_data(eq->adapter, eq->fw_handle, &aer, &aerr);
> - hret = ehea_destroy_eq_res(eq, FORCE_FREE);
> - }
> -
> - if (hret != H_SUCCESS) {
> - pr_err("destroy EQ failed\n");
> - return -EIO;
> - }
> -
> - return 0;
> -}
> -
> -/* allocates memory for a queue and registers pages in phyp */
> -static int ehea_qp_alloc_register(struct ehea_qp *qp, struct hw_queue *hw_queue,
> - int nr_pages, int wqe_size, int act_nr_sges,
> - struct ehea_adapter *adapter, int h_call_q_selector)
> -{
> - u64 hret, rpage;
> - int ret, cnt;
> - void *vpage;
> -
> - ret = hw_queue_ctor(hw_queue, nr_pages, EHEA_PAGESIZE, wqe_size);
> - if (ret)
> - return ret;
> -
> - for (cnt = 0; cnt < nr_pages; cnt++) {
> - vpage = hw_qpageit_get_inc(hw_queue);
> - if (!vpage) {
> - pr_err("hw_qpageit_get_inc failed\n");
> - goto out_kill_hwq;
> - }
> - rpage = __pa(vpage);
> - hret = ehea_h_register_rpage(adapter->handle,
> - 0, h_call_q_selector,
> - qp->fw_handle, rpage, 1);
> - if (hret < H_SUCCESS) {
> - pr_err("register_rpage_qp failed\n");
> - goto out_kill_hwq;
> - }
> - }
> - hw_qeit_reset(hw_queue);
> - return 0;
> -
> -out_kill_hwq:
> - hw_queue_dtor(hw_queue);
> - return -EIO;
> -}
> -
> -static inline u32 map_wqe_size(u8 wqe_enc_size)
> -{
> - return 128 << wqe_enc_size;
> -}
> -
> -struct ehea_qp *ehea_create_qp(struct ehea_adapter *adapter,
> - u32 pd, struct ehea_qp_init_attr *init_attr)
> -{
> - int ret;
> - u64 hret;
> - struct ehea_qp *qp;
> - u32 wqe_size_in_bytes_sq, wqe_size_in_bytes_rq1;
> - u32 wqe_size_in_bytes_rq2, wqe_size_in_bytes_rq3;
> -
> -
> - qp = kzalloc_obj(*qp);
> - if (!qp)
> - return NULL;
> -
> - qp->adapter = adapter;
> -
> - hret = ehea_h_alloc_resource_qp(adapter->handle, init_attr, pd,
> - &qp->fw_handle, &qp->epas);
> - if (hret != H_SUCCESS) {
> - pr_err("ehea_h_alloc_resource_qp failed\n");
> - goto out_freemem;
> - }
> -
> - wqe_size_in_bytes_sq = map_wqe_size(init_attr->act_wqe_size_enc_sq);
> - wqe_size_in_bytes_rq1 = map_wqe_size(init_attr->act_wqe_size_enc_rq1);
> - wqe_size_in_bytes_rq2 = map_wqe_size(init_attr->act_wqe_size_enc_rq2);
> - wqe_size_in_bytes_rq3 = map_wqe_size(init_attr->act_wqe_size_enc_rq3);
> -
> - ret = ehea_qp_alloc_register(qp, &qp->hw_squeue, init_attr->nr_sq_pages,
> - wqe_size_in_bytes_sq,
> - init_attr->act_wqe_size_enc_sq, adapter,
> - 0);
> - if (ret) {
> - pr_err("can't register for sq ret=%x\n", ret);
> - goto out_freeres;
> - }
> -
> - ret = ehea_qp_alloc_register(qp, &qp->hw_rqueue1,
> - init_attr->nr_rq1_pages,
> - wqe_size_in_bytes_rq1,
> - init_attr->act_wqe_size_enc_rq1,
> - adapter, 1);
> - if (ret) {
> - pr_err("can't register for rq1 ret=%x\n", ret);
> - goto out_kill_hwsq;
> - }
> -
> - if (init_attr->rq_count > 1) {
> - ret = ehea_qp_alloc_register(qp, &qp->hw_rqueue2,
> - init_attr->nr_rq2_pages,
> - wqe_size_in_bytes_rq2,
> - init_attr->act_wqe_size_enc_rq2,
> - adapter, 2);
> - if (ret) {
> - pr_err("can't register for rq2 ret=%x\n", ret);
> - goto out_kill_hwr1q;
> - }
> - }
> -
> - if (init_attr->rq_count > 2) {
> - ret = ehea_qp_alloc_register(qp, &qp->hw_rqueue3,
> - init_attr->nr_rq3_pages,
> - wqe_size_in_bytes_rq3,
> - init_attr->act_wqe_size_enc_rq3,
> - adapter, 3);
> - if (ret) {
> - pr_err("can't register for rq3 ret=%x\n", ret);
> - goto out_kill_hwr2q;
> - }
> - }
> -
> - qp->init_attr = *init_attr;
> -
> - return qp;
> -
> -out_kill_hwr2q:
> - hw_queue_dtor(&qp->hw_rqueue2);
> -
> -out_kill_hwr1q:
> - hw_queue_dtor(&qp->hw_rqueue1);
> -
> -out_kill_hwsq:
> - hw_queue_dtor(&qp->hw_squeue);
> -
> -out_freeres:
> - ehea_h_disable_and_get_hea(adapter->handle, qp->fw_handle);
> - ehea_h_free_resource(adapter->handle, qp->fw_handle, FORCE_FREE);
> -
> -out_freemem:
> - kfree(qp);
> - return NULL;
> -}
> -
> -static u64 ehea_destroy_qp_res(struct ehea_qp *qp, u64 force)
> -{
> - u64 hret;
> - struct ehea_qp_init_attr *qp_attr = &qp->init_attr;
> -
> -
> - ehea_h_disable_and_get_hea(qp->adapter->handle, qp->fw_handle);
> - hret = ehea_h_free_resource(qp->adapter->handle, qp->fw_handle, force);
> - if (hret != H_SUCCESS)
> - return hret;
> -
> - hw_queue_dtor(&qp->hw_squeue);
> - hw_queue_dtor(&qp->hw_rqueue1);
> -
> - if (qp_attr->rq_count > 1)
> - hw_queue_dtor(&qp->hw_rqueue2);
> - if (qp_attr->rq_count > 2)
> - hw_queue_dtor(&qp->hw_rqueue3);
> - kfree(qp);
> -
> - return hret;
> -}
> -
> -int ehea_destroy_qp(struct ehea_qp *qp)
> -{
> - u64 hret, aer, aerr;
> - if (!qp)
> - return 0;
> -
> - hcp_epas_dtor(&qp->epas);
> -
> - hret = ehea_destroy_qp_res(qp, NORMAL_FREE);
> - if (hret == H_R_STATE) {
> - ehea_error_data(qp->adapter, qp->fw_handle, &aer, &aerr);
> - hret = ehea_destroy_qp_res(qp, FORCE_FREE);
> - }
> -
> - if (hret != H_SUCCESS) {
> - pr_err("destroy QP failed\n");
> - return -EIO;
> - }
> -
> - return 0;
> -}
> -
> -static inline int ehea_calc_index(unsigned long i, unsigned long s)
> -{
> - return (i >> s) & EHEA_INDEX_MASK;
> -}
> -
> -static inline int ehea_init_top_bmap(struct ehea_top_bmap *ehea_top_bmap,
> - int dir)
> -{
> - if (!ehea_top_bmap->dir[dir]) {
> - ehea_top_bmap->dir[dir] =
> - kzalloc_obj(struct ehea_dir_bmap);
> - if (!ehea_top_bmap->dir[dir])
> - return -ENOMEM;
> - }
> - return 0;
> -}
> -
> -static inline int ehea_init_bmap(struct ehea_bmap *ehea_bmap, int top, int dir)
> -{
> - if (!ehea_bmap->top[top]) {
> - ehea_bmap->top[top] =
> - kzalloc_obj(struct ehea_top_bmap);
> - if (!ehea_bmap->top[top])
> - return -ENOMEM;
> - }
> - return ehea_init_top_bmap(ehea_bmap->top[top], dir);
> -}
> -
> -static DEFINE_MUTEX(ehea_busmap_mutex);
> -static unsigned long ehea_mr_len;
> -
> -#define EHEA_BUSMAP_ADD_SECT 1
> -#define EHEA_BUSMAP_REM_SECT 0
> -
> -static void ehea_rebuild_busmap(void)
> -{
> - u64 vaddr = EHEA_BUSMAP_START;
> - int top, dir, idx;
> -
> - for (top = 0; top < EHEA_MAP_ENTRIES; top++) {
> - struct ehea_top_bmap *ehea_top;
> - int valid_dir_entries = 0;
> -
> - if (!ehea_bmap->top[top])
> - continue;
> - ehea_top = ehea_bmap->top[top];
> - for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) {
> - struct ehea_dir_bmap *ehea_dir;
> - int valid_entries = 0;
> -
> - if (!ehea_top->dir[dir])
> - continue;
> - valid_dir_entries++;
> - ehea_dir = ehea_top->dir[dir];
> - for (idx = 0; idx < EHEA_MAP_ENTRIES; idx++) {
> - if (!ehea_dir->ent[idx])
> - continue;
> - valid_entries++;
> - ehea_dir->ent[idx] = vaddr;
> - vaddr += EHEA_SECTSIZE;
> - }
> - if (!valid_entries) {
> - ehea_top->dir[dir] = NULL;
> - kfree(ehea_dir);
> - }
> - }
> - if (!valid_dir_entries) {
> - ehea_bmap->top[top] = NULL;
> - kfree(ehea_top);
> - }
> - }
> -}
> -
> -static int ehea_update_busmap(unsigned long pfn, unsigned long nr_pages, int add)
> -{
> - unsigned long i, start_section, end_section;
> -
> - if (!nr_pages)
> - return 0;
> -
> - if (!ehea_bmap) {
> - ehea_bmap = kzalloc_obj(struct ehea_bmap);
> - if (!ehea_bmap)
> - return -ENOMEM;
> - }
> -
> - start_section = (pfn * PAGE_SIZE) / EHEA_SECTSIZE;
> - end_section = start_section + ((nr_pages * PAGE_SIZE) / EHEA_SECTSIZE);
> - /* Mark entries as valid or invalid only; address is assigned later */
> - for (i = start_section; i < end_section; i++) {
> - u64 flag;
> - int top = ehea_calc_index(i, EHEA_TOP_INDEX_SHIFT);
> - int dir = ehea_calc_index(i, EHEA_DIR_INDEX_SHIFT);
> - int idx = i & EHEA_INDEX_MASK;
> -
> - if (add) {
> - int ret = ehea_init_bmap(ehea_bmap, top, dir);
> - if (ret)
> - return ret;
> - flag = 1; /* valid */
> - ehea_mr_len += EHEA_SECTSIZE;
> - } else {
> - if (!ehea_bmap->top[top])
> - continue;
> - if (!ehea_bmap->top[top]->dir[dir])
> - continue;
> - flag = 0; /* invalid */
> - ehea_mr_len -= EHEA_SECTSIZE;
> - }
> -
> - ehea_bmap->top[top]->dir[dir]->ent[idx] = flag;
> - }
> - ehea_rebuild_busmap(); /* Assign contiguous addresses for mr */
> - return 0;
> -}
> -
> -int ehea_add_sect_bmap(unsigned long pfn, unsigned long nr_pages)
> -{
> - int ret;
> -
> - mutex_lock(&ehea_busmap_mutex);
> - ret = ehea_update_busmap(pfn, nr_pages, EHEA_BUSMAP_ADD_SECT);
> - mutex_unlock(&ehea_busmap_mutex);
> - return ret;
> -}
> -
> -int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages)
> -{
> - int ret;
> -
> - mutex_lock(&ehea_busmap_mutex);
> - ret = ehea_update_busmap(pfn, nr_pages, EHEA_BUSMAP_REM_SECT);
> - mutex_unlock(&ehea_busmap_mutex);
> - return ret;
> -}
> -
> -static int ehea_is_hugepage(unsigned long pfn)
> -{
> - if (pfn & EHEA_HUGEPAGE_PFN_MASK)
> - return 0;
> -
> - if (page_shift(pfn_to_page(pfn)) != EHEA_HUGEPAGESHIFT)
> - return 0;
> -
> - return 1;
> -}
> -
> -static int ehea_create_busmap_callback(unsigned long initial_pfn,
> - unsigned long total_nr_pages, void *arg)
> -{
> - int ret;
> - unsigned long pfn, start_pfn, end_pfn, nr_pages;
> -
> - if ((total_nr_pages * PAGE_SIZE) < EHEA_HUGEPAGE_SIZE)
> - return ehea_update_busmap(initial_pfn, total_nr_pages,
> - EHEA_BUSMAP_ADD_SECT);
> -
> - /* Given chunk is >= 16GB -> check for hugepages */
> - start_pfn = initial_pfn;
> - end_pfn = initial_pfn + total_nr_pages;
> - pfn = start_pfn;
> -
> - while (pfn < end_pfn) {
> - if (ehea_is_hugepage(pfn)) {
> - /* Add mem found in front of the hugepage */
> - nr_pages = pfn - start_pfn;
> - ret = ehea_update_busmap(start_pfn, nr_pages,
> - EHEA_BUSMAP_ADD_SECT);
> - if (ret)
> - return ret;
> -
> - /* Skip the hugepage */
> - pfn += (EHEA_HUGEPAGE_SIZE / PAGE_SIZE);
> - start_pfn = pfn;
> - } else
> - pfn += (EHEA_SECTSIZE / PAGE_SIZE);
> - }
> -
> - /* Add mem found behind the hugepage(s) */
> - nr_pages = pfn - start_pfn;
> - return ehea_update_busmap(start_pfn, nr_pages, EHEA_BUSMAP_ADD_SECT);
> -}
> -
> -int ehea_create_busmap(void)
> -{
> - int ret;
> -
> - mutex_lock(&ehea_busmap_mutex);
> - ehea_mr_len = 0;
> - ret = walk_system_ram_range(0, 1ULL << MAX_PHYSMEM_BITS, NULL,
> - ehea_create_busmap_callback);
> - mutex_unlock(&ehea_busmap_mutex);
> - return ret;
> -}
> -
> -void ehea_destroy_busmap(void)
> -{
> - int top, dir;
> - mutex_lock(&ehea_busmap_mutex);
> - if (!ehea_bmap)
> - goto out_destroy;
> -
> - for (top = 0; top < EHEA_MAP_ENTRIES; top++) {
> - if (!ehea_bmap->top[top])
> - continue;
> -
> - for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) {
> - if (!ehea_bmap->top[top]->dir[dir])
> - continue;
> -
> - kfree(ehea_bmap->top[top]->dir[dir]);
> - }
> -
> - kfree(ehea_bmap->top[top]);
> - }
> -
> - kfree(ehea_bmap);
> - ehea_bmap = NULL;
> -out_destroy:
> - mutex_unlock(&ehea_busmap_mutex);
> -}
> -
> -u64 ehea_map_vaddr(void *caddr)
> -{
> - int top, dir, idx;
> - unsigned long index, offset;
> -
> - if (!ehea_bmap)
> - return EHEA_INVAL_ADDR;
> -
> - index = __pa(caddr) >> SECTION_SIZE_BITS;
> - top = (index >> EHEA_TOP_INDEX_SHIFT) & EHEA_INDEX_MASK;
> - if (!ehea_bmap->top[top])
> - return EHEA_INVAL_ADDR;
> -
> - dir = (index >> EHEA_DIR_INDEX_SHIFT) & EHEA_INDEX_MASK;
> - if (!ehea_bmap->top[top]->dir[dir])
> - return EHEA_INVAL_ADDR;
> -
> - idx = index & EHEA_INDEX_MASK;
> - if (!ehea_bmap->top[top]->dir[dir]->ent[idx])
> - return EHEA_INVAL_ADDR;
> -
> - offset = (unsigned long)caddr & (EHEA_SECTSIZE - 1);
> - return ehea_bmap->top[top]->dir[dir]->ent[idx] | offset;
> -}
> -
> -static inline void *ehea_calc_sectbase(int top, int dir, int idx)
> -{
> - unsigned long ret = idx;
> - ret |= dir << EHEA_DIR_INDEX_SHIFT;
> - ret |= top << EHEA_TOP_INDEX_SHIFT;
> - return __va(ret << SECTION_SIZE_BITS);
> -}
> -
> -static u64 ehea_reg_mr_section(int top, int dir, int idx, u64 *pt,
> - struct ehea_adapter *adapter,
> - struct ehea_mr *mr)
> -{
> - void *pg;
> - u64 j, m, hret;
> - unsigned long k = 0;
> - u64 pt_abs = __pa(pt);
> -
> - void *sectbase = ehea_calc_sectbase(top, dir, idx);
> -
> - for (j = 0; j < (EHEA_PAGES_PER_SECTION / EHEA_MAX_RPAGE); j++) {
> -
> - for (m = 0; m < EHEA_MAX_RPAGE; m++) {
> - pg = sectbase + ((k++) * EHEA_PAGESIZE);
> - pt[m] = __pa(pg);
> - }
> - hret = ehea_h_register_rpage_mr(adapter->handle, mr->handle, 0,
> - 0, pt_abs, EHEA_MAX_RPAGE);
> -
> - if ((hret != H_SUCCESS) &&
> - (hret != H_PAGE_REGISTERED)) {
> - ehea_h_free_resource(adapter->handle, mr->handle,
> - FORCE_FREE);
> - pr_err("register_rpage_mr failed\n");
> - return hret;
> - }
> - }
> - return hret;
> -}
> -
> -static u64 ehea_reg_mr_sections(int top, int dir, u64 *pt,
> - struct ehea_adapter *adapter,
> - struct ehea_mr *mr)
> -{
> - u64 hret = H_SUCCESS;
> - int idx;
> -
> - for (idx = 0; idx < EHEA_MAP_ENTRIES; idx++) {
> - if (!ehea_bmap->top[top]->dir[dir]->ent[idx])
> - continue;
> -
> - hret = ehea_reg_mr_section(top, dir, idx, pt, adapter, mr);
> - if ((hret != H_SUCCESS) && (hret != H_PAGE_REGISTERED))
> - return hret;
> - }
> - return hret;
> -}
> -
> -static u64 ehea_reg_mr_dir_sections(int top, u64 *pt,
> - struct ehea_adapter *adapter,
> - struct ehea_mr *mr)
> -{
> - u64 hret = H_SUCCESS;
> - int dir;
> -
> - for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) {
> - if (!ehea_bmap->top[top]->dir[dir])
> - continue;
> -
> - hret = ehea_reg_mr_sections(top, dir, pt, adapter, mr);
> - if ((hret != H_SUCCESS) && (hret != H_PAGE_REGISTERED))
> - return hret;
> - }
> - return hret;
> -}
> -
> -int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
> -{
> - int ret;
> - u64 *pt;
> - u64 hret;
> - u32 acc_ctrl = EHEA_MR_ACC_CTRL;
> -
> - unsigned long top;
> -
> - pt = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!pt) {
> - pr_err("no mem\n");
> - ret = -ENOMEM;
> - goto out;
> - }
> -
> - hret = ehea_h_alloc_resource_mr(adapter->handle, EHEA_BUSMAP_START,
> - ehea_mr_len, acc_ctrl, adapter->pd,
> - &mr->handle, &mr->lkey);
> -
> - if (hret != H_SUCCESS) {
> - pr_err("alloc_resource_mr failed\n");
> - ret = -EIO;
> - goto out;
> - }
> -
> - if (!ehea_bmap) {
> - ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE);
> - pr_err("no busmap available\n");
> - ret = -EIO;
> - goto out;
> - }
> -
> - for (top = 0; top < EHEA_MAP_ENTRIES; top++) {
> - if (!ehea_bmap->top[top])
> - continue;
> -
> - hret = ehea_reg_mr_dir_sections(top, pt, adapter, mr);
> - if((hret != H_PAGE_REGISTERED) && (hret != H_SUCCESS))
> - break;
> - }
> -
> - if (hret != H_SUCCESS) {
> - ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE);
> - pr_err("registering mr failed\n");
> - ret = -EIO;
> - goto out;
> - }
> -
> - mr->vaddr = EHEA_BUSMAP_START;
> - mr->adapter = adapter;
> - ret = 0;
> -out:
> - free_page((unsigned long)pt);
> - return ret;
> -}
> -
> -int ehea_rem_mr(struct ehea_mr *mr)
> -{
> - u64 hret;
> -
> - if (!mr || !mr->adapter)
> - return -EINVAL;
> -
> - hret = ehea_h_free_resource(mr->adapter->handle, mr->handle,
> - FORCE_FREE);
> - if (hret != H_SUCCESS) {
> - pr_err("destroy MR failed\n");
> - return -EIO;
> - }
> -
> - return 0;
> -}
> -
> -int ehea_gen_smr(struct ehea_adapter *adapter, struct ehea_mr *old_mr,
> - struct ehea_mr *shared_mr)
> -{
> - u64 hret;
> -
> - hret = ehea_h_register_smr(adapter->handle, old_mr->handle,
> - old_mr->vaddr, EHEA_MR_ACC_CTRL,
> - adapter->pd, shared_mr);
> - if (hret != H_SUCCESS)
> - return -EIO;
> -
> - shared_mr->adapter = adapter;
> -
> - return 0;
> -}
> -
> -static void print_error_data(u64 *data)
> -{
> - int length;
> - u64 type = EHEA_BMASK_GET(ERROR_DATA_TYPE, data[2]);
> - u64 resource = data[1];
> -
> - length = EHEA_BMASK_GET(ERROR_DATA_LENGTH, data[0]);
> -
> - if (length > EHEA_PAGESIZE)
> - length = EHEA_PAGESIZE;
> -
> - if (type == EHEA_AER_RESTYPE_QP)
> - pr_err("QP (resource=%llX) state: AER=0x%llX, AERR=0x%llX, port=%llX\n",
> - resource, data[6], data[12], data[22]);
> - else if (type == EHEA_AER_RESTYPE_CQ)
> - pr_err("CQ (resource=%llX) state: AER=0x%llX\n",
> - resource, data[6]);
> - else if (type == EHEA_AER_RESTYPE_EQ)
> - pr_err("EQ (resource=%llX) state: AER=0x%llX\n",
> - resource, data[6]);
> -
> - ehea_dump(data, length, "error data");
> -}
> -
> -u64 ehea_error_data(struct ehea_adapter *adapter, u64 res_handle,
> - u64 *aer, u64 *aerr)
> -{
> - unsigned long ret;
> - u64 *rblock;
> - u64 type = 0;
> -
> - rblock = (void *)get_zeroed_page(GFP_KERNEL);
> - if (!rblock) {
> - pr_err("Cannot allocate rblock memory\n");
> - goto out;
> - }
> -
> - ret = ehea_h_error_data(adapter->handle, res_handle, rblock);
> -
> - if (ret == H_SUCCESS) {
> - type = EHEA_BMASK_GET(ERROR_DATA_TYPE, rblock[2]);
> - *aer = rblock[6];
> - *aerr = rblock[12];
> - print_error_data(rblock);
> - } else if (ret == H_R_STATE) {
> - pr_err("No error data available: %llX\n", res_handle);
> - } else
> - pr_err("Error data could not be fetched: %llX\n", res_handle);
> -
> - free_page((unsigned long)rblock);
> -out:
> - return type;
> -}
> diff --git a/drivers/net/ethernet/ibm/ehea/ehea_qmr.h b/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
> deleted file mode 100644
> index 7c7cccd820f7..000000000000
> --- a/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
> +++ /dev/null
> @@ -1,390 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * linux/drivers/net/ethernet/ibm/ehea/ehea_qmr.h
> - *
> - * eHEA ethernet device driver for IBM eServer System p
> - *
> - * (C) Copyright IBM Corp. 2006
> - *
> - * Authors:
> - * Christoph Raisch <raisch@de.ibm.com>
> - * Jan-Bernd Themann <themann@de.ibm.com>
> - * Thomas Klein <tklein@de.ibm.com>
> - */
> -
> -#ifndef __EHEA_QMR_H__
> -#define __EHEA_QMR_H__
> -
> -#include <linux/prefetch.h>
> -#include "ehea.h"
> -#include "ehea_hw.h"
> -
> -/*
> - * page size of ehea hardware queues
> - */
> -
> -#define EHEA_PAGESHIFT 12
> -#define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT)
> -#define EHEA_SECTSIZE (1UL << 24)
> -#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT)
> -#define EHEA_HUGEPAGESHIFT 34
> -#define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT)
> -#define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT)
> -
> -#if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE)
> -#error eHEA module cannot work if kernel sectionsize < ehea sectionsize
> -#endif
> -
> -/* Some abbreviations used here:
> - *
> - * WQE - Work Queue Entry
> - * SWQE - Send Work Queue Entry
> - * RWQE - Receive Work Queue Entry
> - * CQE - Completion Queue Entry
> - * EQE - Event Queue Entry
> - * MR - Memory Region
> - */
> -
> -/* Use of WR_ID field for EHEA */
> -#define EHEA_WR_ID_COUNT EHEA_BMASK_IBM(0, 19)
> -#define EHEA_WR_ID_TYPE EHEA_BMASK_IBM(20, 23)
> -#define EHEA_SWQE2_TYPE 0x1
> -#define EHEA_SWQE3_TYPE 0x2
> -#define EHEA_RWQE2_TYPE 0x3
> -#define EHEA_RWQE3_TYPE 0x4
> -#define EHEA_WR_ID_INDEX EHEA_BMASK_IBM(24, 47)
> -#define EHEA_WR_ID_REFILL EHEA_BMASK_IBM(48, 63)
> -
> -struct ehea_vsgentry {
> - u64 vaddr;
> - u32 l_key;
> - u32 len;
> -};
> -
> -/* maximum number of sg entries allowed in a WQE */
> -#define EHEA_MAX_WQE_SG_ENTRIES 252
> -#define SWQE2_MAX_IMM (0xD0 - 0x30)
> -#define SWQE3_MAX_IMM 224
> -
> -/* tx control flags for swqe */
> -#define EHEA_SWQE_CRC 0x8000
> -#define EHEA_SWQE_IP_CHECKSUM 0x4000
> -#define EHEA_SWQE_TCP_CHECKSUM 0x2000
> -#define EHEA_SWQE_TSO 0x1000
> -#define EHEA_SWQE_SIGNALLED_COMPLETION 0x0800
> -#define EHEA_SWQE_VLAN_INSERT 0x0400
> -#define EHEA_SWQE_IMM_DATA_PRESENT 0x0200
> -#define EHEA_SWQE_DESCRIPTORS_PRESENT 0x0100
> -#define EHEA_SWQE_WRAP_CTL_REC 0x0080
> -#define EHEA_SWQE_WRAP_CTL_FORCE 0x0040
> -#define EHEA_SWQE_BIND 0x0020
> -#define EHEA_SWQE_PURGE 0x0010
> -
> -/* sizeof(struct ehea_swqe) less the union */
> -#define SWQE_HEADER_SIZE 32
> -
> -struct ehea_swqe {
> - u64 wr_id;
> - u16 tx_control;
> - u16 vlan_tag;
> - u8 reserved1;
> - u8 ip_start;
> - u8 ip_end;
> - u8 immediate_data_length;
> - u8 tcp_offset;
> - u8 reserved2;
> - u16 reserved2b;
> - u8 wrap_tag;
> - u8 descriptors; /* number of valid descriptors in WQE */
> - u16 reserved3;
> - u16 reserved4;
> - u16 mss;
> - u32 reserved5;
> - union {
> - /* Send WQE Format 1 */
> - struct {
> - struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES];
> - } no_immediate_data;
> -
> - /* Send WQE Format 2 */
> - struct {
> - struct ehea_vsgentry sg_entry;
> - /* 0x30 */
> - u8 immediate_data[SWQE2_MAX_IMM];
> - /* 0xd0 */
> - struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES-1];
> - } immdata_desc __packed;
> -
> - /* Send WQE Format 3 */
> - struct {
> - u8 immediate_data[SWQE3_MAX_IMM];
> - } immdata_nodesc;
> - } u;
> -};
> -
> -struct ehea_rwqe {
> - u64 wr_id; /* work request ID */
> - u8 reserved1[5];
> - u8 data_segments;
> - u16 reserved2;
> - u64 reserved3;
> - u64 reserved4;
> - struct ehea_vsgentry sg_list[EHEA_MAX_WQE_SG_ENTRIES];
> -};
> -
> -#define EHEA_CQE_VLAN_TAG_XTRACT 0x0400
> -
> -#define EHEA_CQE_TYPE_RQ 0x60
> -#define EHEA_CQE_STAT_ERR_MASK 0x700F
> -#define EHEA_CQE_STAT_FAT_ERR_MASK 0xF
> -#define EHEA_CQE_BLIND_CKSUM 0x8000
> -#define EHEA_CQE_STAT_ERR_TCP 0x4000
> -#define EHEA_CQE_STAT_ERR_IP 0x2000
> -#define EHEA_CQE_STAT_ERR_CRC 0x1000
> -
> -/* Defines which bad send cqe stati lead to a port reset */
> -#define EHEA_CQE_STAT_RESET_MASK 0x0002
> -
> -struct ehea_cqe {
> - u64 wr_id; /* work request ID from WQE */
> - u8 type;
> - u8 valid;
> - u16 status;
> - u16 reserved1;
> - u16 num_bytes_transfered;
> - u16 vlan_tag;
> - u16 inet_checksum_value;
> - u8 reserved2;
> - u8 header_length;
> - u16 reserved3;
> - u16 page_offset;
> - u16 wqe_count;
> - u32 qp_token;
> - u32 timestamp;
> - u32 reserved4;
> - u64 reserved5[3];
> -};
> -
> -#define EHEA_EQE_VALID EHEA_BMASK_IBM(0, 0)
> -#define EHEA_EQE_IS_CQE EHEA_BMASK_IBM(1, 1)
> -#define EHEA_EQE_IDENTIFIER EHEA_BMASK_IBM(2, 7)
> -#define EHEA_EQE_QP_CQ_NUMBER EHEA_BMASK_IBM(8, 31)
> -#define EHEA_EQE_QP_TOKEN EHEA_BMASK_IBM(32, 63)
> -#define EHEA_EQE_CQ_TOKEN EHEA_BMASK_IBM(32, 63)
> -#define EHEA_EQE_KEY EHEA_BMASK_IBM(32, 63)
> -#define EHEA_EQE_PORT_NUMBER EHEA_BMASK_IBM(56, 63)
> -#define EHEA_EQE_EQ_NUMBER EHEA_BMASK_IBM(48, 63)
> -#define EHEA_EQE_SM_ID EHEA_BMASK_IBM(48, 63)
> -#define EHEA_EQE_SM_MECH_NUMBER EHEA_BMASK_IBM(48, 55)
> -#define EHEA_EQE_SM_PORT_NUMBER EHEA_BMASK_IBM(56, 63)
> -
> -#define EHEA_AER_RESTYPE_QP 0x8
> -#define EHEA_AER_RESTYPE_CQ 0x4
> -#define EHEA_AER_RESTYPE_EQ 0x3
> -
> -/* Defines which affiliated errors lead to a port reset */
> -#define EHEA_AER_RESET_MASK 0xFFFFFFFFFEFFFFFFULL
> -#define EHEA_AERR_RESET_MASK 0xFFFFFFFFFFFFFFFFULL
> -
> -struct ehea_eqe {
> - u64 entry;
> -};
> -
> -#define ERROR_DATA_LENGTH EHEA_BMASK_IBM(52, 63)
> -#define ERROR_DATA_TYPE EHEA_BMASK_IBM(0, 7)
> -
> -static inline void *hw_qeit_calc(struct hw_queue *queue, u64 q_offset)
> -{
> - struct ehea_page *current_page;
> -
> - if (q_offset >= queue->queue_length)
> - q_offset -= queue->queue_length;
> - current_page = (queue->queue_pages)[q_offset >> EHEA_PAGESHIFT];
> - return ¤t_page->entries[q_offset & (EHEA_PAGESIZE - 1)];
> -}
> -
> -static inline void *hw_qeit_get(struct hw_queue *queue)
> -{
> - return hw_qeit_calc(queue, queue->current_q_offset);
> -}
> -
> -static inline void hw_qeit_inc(struct hw_queue *queue)
> -{
> - queue->current_q_offset += queue->qe_size;
> - if (queue->current_q_offset >= queue->queue_length) {
> - queue->current_q_offset = 0;
> - /* toggle the valid flag */
> - queue->toggle_state = (~queue->toggle_state) & 1;
> - }
> -}
> -
> -static inline void *hw_qeit_get_inc(struct hw_queue *queue)
> -{
> - void *retvalue = hw_qeit_get(queue);
> - hw_qeit_inc(queue);
> - return retvalue;
> -}
> -
> -static inline void *hw_qeit_get_inc_valid(struct hw_queue *queue)
> -{
> - struct ehea_cqe *retvalue = hw_qeit_get(queue);
> - u8 valid = retvalue->valid;
> - void *pref;
> -
> - if ((valid >> 7) == (queue->toggle_state & 1)) {
> - /* this is a good one */
> - hw_qeit_inc(queue);
> - pref = hw_qeit_calc(queue, queue->current_q_offset);
> - prefetch(pref);
> - prefetch(pref + 128);
> - } else
> - retvalue = NULL;
> - return retvalue;
> -}
> -
> -static inline void *hw_qeit_get_valid(struct hw_queue *queue)
> -{
> - struct ehea_cqe *retvalue = hw_qeit_get(queue);
> - void *pref;
> - u8 valid;
> -
> - pref = hw_qeit_calc(queue, queue->current_q_offset);
> - prefetch(pref);
> - prefetch(pref + 128);
> - prefetch(pref + 256);
> - valid = retvalue->valid;
> - if (!((valid >> 7) == (queue->toggle_state & 1)))
> - retvalue = NULL;
> - return retvalue;
> -}
> -
> -static inline void *hw_qeit_reset(struct hw_queue *queue)
> -{
> - queue->current_q_offset = 0;
> - return hw_qeit_get(queue);
> -}
> -
> -static inline void *hw_qeit_eq_get_inc(struct hw_queue *queue)
> -{
> - u64 last_entry_in_q = queue->queue_length - queue->qe_size;
> - void *retvalue;
> -
> - retvalue = hw_qeit_get(queue);
> - queue->current_q_offset += queue->qe_size;
> - if (queue->current_q_offset > last_entry_in_q) {
> - queue->current_q_offset = 0;
> - queue->toggle_state = (~queue->toggle_state) & 1;
> - }
> - return retvalue;
> -}
> -
> -static inline void *hw_eqit_eq_get_inc_valid(struct hw_queue *queue)
> -{
> - void *retvalue = hw_qeit_get(queue);
> - u32 qe = *(u8 *)retvalue;
> - if ((qe >> 7) == (queue->toggle_state & 1))
> - hw_qeit_eq_get_inc(queue);
> - else
> - retvalue = NULL;
> - return retvalue;
> -}
> -
> -static inline struct ehea_rwqe *ehea_get_next_rwqe(struct ehea_qp *qp,
> - int rq_nr)
> -{
> - struct hw_queue *queue;
> -
> - if (rq_nr == 1)
> - queue = &qp->hw_rqueue1;
> - else if (rq_nr == 2)
> - queue = &qp->hw_rqueue2;
> - else
> - queue = &qp->hw_rqueue3;
> -
> - return hw_qeit_get_inc(queue);
> -}
> -
> -static inline struct ehea_swqe *ehea_get_swqe(struct ehea_qp *my_qp,
> - int *wqe_index)
> -{
> - struct hw_queue *queue = &my_qp->hw_squeue;
> - struct ehea_swqe *wqe_p;
> -
> - *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_SQ);
> - wqe_p = hw_qeit_get_inc(&my_qp->hw_squeue);
> -
> - return wqe_p;
> -}
> -
> -static inline void ehea_post_swqe(struct ehea_qp *my_qp, struct ehea_swqe *swqe)
> -{
> - iosync();
> - ehea_update_sqa(my_qp, 1);
> -}
> -
> -static inline struct ehea_cqe *ehea_poll_rq1(struct ehea_qp *qp, int *wqe_index)
> -{
> - struct hw_queue *queue = &qp->hw_rqueue1;
> -
> - *wqe_index = (queue->current_q_offset) >> (7 + EHEA_SG_RQ1);
> - return hw_qeit_get_valid(queue);
> -}
> -
> -static inline void ehea_inc_cq(struct ehea_cq *cq)
> -{
> - hw_qeit_inc(&cq->hw_queue);
> -}
> -
> -static inline void ehea_inc_rq1(struct ehea_qp *qp)
> -{
> - hw_qeit_inc(&qp->hw_rqueue1);
> -}
> -
> -static inline struct ehea_cqe *ehea_poll_cq(struct ehea_cq *my_cq)
> -{
> - return hw_qeit_get_valid(&my_cq->hw_queue);
> -}
> -
> -#define EHEA_CQ_REGISTER_ORIG 0
> -#define EHEA_EQ_REGISTER_ORIG 0
> -
> -enum ehea_eq_type {
> - EHEA_EQ = 0, /* event queue */
> - EHEA_NEQ /* notification event queue */
> -};
> -
> -struct ehea_eq *ehea_create_eq(struct ehea_adapter *adapter,
> - enum ehea_eq_type type,
> - const u32 length, const u8 eqe_gen);
> -
> -int ehea_destroy_eq(struct ehea_eq *eq);
> -
> -struct ehea_eqe *ehea_poll_eq(struct ehea_eq *eq);
> -
> -struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter, int cqe,
> - u64 eq_handle, u32 cq_token);
> -
> -int ehea_destroy_cq(struct ehea_cq *cq);
> -
> -struct ehea_qp *ehea_create_qp(struct ehea_adapter *adapter, u32 pd,
> - struct ehea_qp_init_attr *init_attr);
> -
> -int ehea_destroy_qp(struct ehea_qp *qp);
> -
> -int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr);
> -
> -int ehea_gen_smr(struct ehea_adapter *adapter, struct ehea_mr *old_mr,
> - struct ehea_mr *shared_mr);
> -
> -int ehea_rem_mr(struct ehea_mr *mr);
> -
> -u64 ehea_error_data(struct ehea_adapter *adapter, u64 res_handle,
> - u64 *aer, u64 *aerr);
> -
> -int ehea_add_sect_bmap(unsigned long pfn, unsigned long nr_pages);
> -int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages);
> -int ehea_create_busmap(void);
> -void ehea_destroy_busmap(void);
> -u64 ehea_map_vaddr(void *caddr);
> -
> -#endif /* __EHEA_QMR_H__ */
> --
> 2.47.3
>
^ permalink raw reply
* Re: [PATCH net-next 2/2] powerpc: remove ehea driver references
From: Christophe Leroy (CS GROUP) @ 2026-06-30 5:43 UTC (permalink / raw)
To: David Christensen, David S . Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Michael Ellerman, Nicholas Piggin
Cc: netdev, linuxppc-dev, linux-kernel
In-Reply-To: <20260629211343.3712775-3-drc@linux.ibm.com>
Le 29/06/2026 à 23:13, David Christensen a écrit :
> [Vous ne recevez pas souvent de courriers de drc@linux.ibm.com. Découvrez pourquoi ceci est important à https://aka.ms/LearnAboutSenderIdentification ]
>
> Follow-on cleanup after the removal of the IBM eHEA driver in commit
> f721e8ffa92a ("ehea: remove the ehea driver").
>
> Remove the CONFIG_IBM_EHEA entry from ppc64_defconfig and the
> EXPORT_SYMBOL_GPL(walk_system_ram_range) export from arch/powerpc/mm/mem.c
> that was only needed by the ehea driver.
>
> Signed-off-by: David Christensen <drc@linux.ibm.com>
Reviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
> ---
> arch/powerpc/configs/ppc64_defconfig | 1 -
> arch/powerpc/mm/mem.c | 6 ------
> 2 files changed, 7 deletions(-)
>
> diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
> index f795b74602ec..1eb8e3457e8b 100644
> --- a/arch/powerpc/configs/ppc64_defconfig
> +++ b/arch/powerpc/configs/ppc64_defconfig
> @@ -210,7 +210,6 @@ CONFIG_BNX2X=m
> CONFIG_CHELSIO_T1=m
> CONFIG_BE2NET=m
> CONFIG_IBMVETH=m
> -CONFIG_EHEA=m
> CONFIG_IBMVNIC=m
> CONFIG_E100=y
> CONFIG_E1000=y
> diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
> index 4c1afab91996..b617b69452cd 100644
> --- a/arch/powerpc/mm/mem.c
> +++ b/arch/powerpc/mm/mem.c
> @@ -371,12 +371,6 @@ int devmem_is_allowed(unsigned long pfn)
> }
> #endif /* CONFIG_STRICT_DEVMEM */
>
> -/*
> - * This is defined in kernel/resource.c but only powerpc needs to export it, for
> - * the EHEA driver. Drop this when drivers/net/ethernet/ibm/ehea is removed.
> - */
> -EXPORT_SYMBOL_GPL(walk_system_ram_range);
> -
> #ifdef CONFIG_EXECMEM
> static struct execmem_info execmem_info __ro_after_init;
>
> --
> 2.47.3
>
^ permalink raw reply
* Re: [PATCH V16 4/7] rust/powerpc: Set min rustc version for powerpc
From: Mukesh Kumar Chaurasiya @ 2026-06-30 5:45 UTC (permalink / raw)
To: Miguel Ojeda
Cc: maddy, mpe, npiggin, chleroy, peterz, jpoimboe, jbaron, aliceryhl,
rostedt, ardb, ojeda, boqun, gary, bjorn3_gh, lossin, a.hindborg,
tmgross, dakr, nathan, nick.desaulniers+lkml, morbo, justinstitt,
daniel.almeida, acourbot, fujita.tomonori, gregkh, prafulrai522,
tamird, kees, lyude, airlied, linuxppc-dev, linux-kernel,
rust-for-linux, llvm
In-Reply-To: <CANiq72mj1P9QykK6vbPK37hZkMLwd7RcgVWEcxxuE=9OL+4bAg@mail.gmail.com>
On Mon, Jun 29, 2026 at 11:11:44AM +0200, Miguel Ojeda wrote:
> On Mon, Jun 29, 2026 at 6:57 AM Mukesh Kumar Chaurasiya
> <mkchauras@gmail.com> wrote:
> >
> > Sure i'll bisect. Meanwhile i would still like to get this upstream.
>
> It is very early on the cycle -- I would suggest bisecting first.
>
> But it is up to ppc, of course.
>
> Cheers,
> Miguel
Sure, I'll bisect it first.
Regards,
Mukesh
^ permalink raw reply
* [BUG] powerpc: boot warning in msi_bitmap_selftest() on Power11 on next-20260629
From: Venkat Rao Bagalkote @ 2026-06-30 5:51 UTC (permalink / raw)
To: linuxppc-dev, Madhavan Srinivasan, Nilay Shroff
Cc: LKML, Christophe Leroy (CS GROUP)
[-- Attachment #1: Type: text/plain, Size: 2827 bytes --]
Greetings!!!
I am seeing below boot warning on linux-next20260629 kernel, while
booting on IBM Power11 system.
Warning:
[ 1.213209] ------------[ cut here ]------------
[ 1.213213] WARNING: arch/powerpc/sysdev/msi_bitmap.c:181 at
test_basics+0x1b8/0x3d4, CPU#1: swapper/0/1
[ 1.213222] Modules linked in:
[ 1.213230] CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted
7.2.0-rc1-next-20260629 #1 PREEMPT(lazy)
[ 1.213236] Hardware name: IBM,9080-HEX Power11 (architected)
0x820200 0xf000007 of:IBM,FW1110.01 (NH1110_069) hv:phyp pSeries
[ 1.213242] NIP: c000000003028f84 LR: c000000003028f78 CTR:
c000000000183dd8
[ 1.213246] REGS: c000000005b43830 TRAP: 0700 Not tainted
(7.2.0-rc1-next-20260629)
[ 1.213251] MSR: 8000000000029033 <SF,EE,ME,IR,DR,RI,LE> CR:
44000244 XER: 20040003
[ 1.213262] CFAR: c000000000183ec0 IRQMASK: 0
[ 1.213262] GPR00: c000000003028f78 c000000005b43af0 c00000000200c100
0000000000000200
[ 1.213262] GPR04: 0000000000000000 0000000000000001 0000000000000240
0000000000000000
[ 1.213262] GPR08: 0000000000000000 0000000000000001 c000000005bd5d00
ffffffffffffffc1
[ 1.213262] GPR12: c000000000183dd8 c0000002fffffb00 c000000000011714
0000000000000000
[ 1.213262] GPR16: 0000000000000000 0000000000000000 0000000000000000
0000000000000000
[ 1.213262] GPR20: 0000000000000000 0000000000000000 0000000000000000
0000000000000000
[ 1.213262] GPR24: 0000000000000000 0000000000000000 c0000000030ab8b8
0000000000000007
[ 1.213262] GPR28: 0000000000000000 c0000000030ab870 c000000005c12900
0000000000000000
[ 1.213308] NIP [c000000003028f84] test_basics+0x1b8/0x3d4
[ 1.213313] LR [c000000003028f78] test_basics+0x1ac/0x3d4
[ 1.213317] Call Trace:
[ 1.213319] [c000000005b43af0] [c000000003028f78]
test_basics+0x1ac/0x3d4 (unreliable)
[ 1.213325] [c000000005b43b60] [c000000003029444]
msi_bitmap_selftest+0x2c/0x44
[ 1.213331] [c000000005b43bc0] [c000000000010eec]
do_one_initcall+0x7c/0x42c
[ 1.213337] [c000000005b43ca0] [c0000000030109c8]
do_initcalls+0x144/0x18c
[ 1.213344] [c000000005b43d30] [c000000003010c9c]
kernel_init_freeable+0x1f4/0x294
[ 1.213350] [c000000005b43dd0] [c000000000011738] kernel_init+0x2c/0x1c4
[ 1.213355] [c000000005b43e30] [c00000000000debc]
ret_from_kernel_user_thread+0x14/0x1c
[ 1.213361] ---- interrupt: 0 at 0x0
[ 1.213366] Code: 38610028 4bfda729 54630ffe 0b030000 37ffffff
4082ffe8 38800001 38610028 4bfda70d 39200001 2c030000 7d20481e
<0b090000> eba10030 7ffefb78 3bff0001
[ 1.213382] ---[ end trace 0000000000000000 ]---
Attached is the config file.
If you happen to fix this, please add below tag.
Reported-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Regards,
Venkat.
[-- Attachment #2: boot_warning --]
[-- Type: text/plain, Size: 188327 bytes --]
#
# Automatically generated file; DO NOT EDIT.
# Linux/powerpc 7.1.0-rc4 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-7)"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=120201
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23800
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=23800
CONFIG_LLD_VERSION=0
CONFIG_RUSTC_VERSION=109500
CONFIG_RUST_IS_AVAILABLE=y
CONFIG_RUSTC_LLVM_VERSION=210108
CONFIG_RUSTC_LLVM_MAJOR_VERSION=21
CONFIG_CC_CAN_LINK=y
CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y
CONFIG_TOOLS_SUPPORT_RELR=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y
CONFIG_RUSTC_HAS_SPAN_FILE=y
CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y
CONFIG_RUSTC_HAS_FILE_WITH_NUL=y
CONFIG_RUSTC_HAS_FILE_AS_C_STR=y
CONFIG_PAHOLE_VERSION=0
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_TABLE_SORT=y
CONFIG_THREAD_INFO_IN_TASK=y
#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
# CONFIG_WERROR is not set
CONFIG_UAPI_HEADER_TEST=y
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_BUILD_SALT="6.12.0-55.9.1.el10_0.ppc64le"
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_XZ is not set
CONFIG_DEFAULT_INIT=""
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_WATCH_QUEUE=y
CONFIG_CROSS_MEMORY_ATTACH=y
CONFIG_AUDIT=y
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
CONFIG_AUDITSYSCALL=y
#
# IRQ subsystem
#
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
CONFIG_GENERIC_IRQ_MIGRATION=y
CONFIG_GENERIC_IRQ_INJECTION=y
CONFIG_HARDIRQS_SW_RESEND=y
CONFIG_IRQ_DOMAIN=y
CONFIG_IRQ_SIM=y
CONFIG_IRQ_DOMAIN_HIERARCHY=y
CONFIG_GENERIC_MSI_IRQ=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y
# CONFIG_GENERIC_IRQ_DEBUGFS is not set
# end of IRQ subsystem
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_ARCH_HAS_TICK_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_TIME_KUNIT_TEST=m
CONFIG_CONTEXT_TRACKING=y
CONFIG_CONTEXT_TRACKING_IDLE=y
#
# Timers subsystem
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
# CONFIG_NO_HZ_IDLE is not set
CONFIG_NO_HZ_FULL=y
CONFIG_CONTEXT_TRACKING_USER=y
# CONFIG_CONTEXT_TRACKING_USER_FORCE is not set
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
# CONFIG_POSIX_AUX_CLOCKS is not set
# end of Timers subsystem
CONFIG_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
#
# BPF subsystem
#
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
# CONFIG_BPF_PRELOAD is not set
CONFIG_BPF_LSM=y
# end of BPF subsystem
CONFIG_PREEMPT_BUILD=y
CONFIG_ARCH_HAS_PREEMPT_LAZY=y
# CONFIG_PREEMPT is not set
CONFIG_PREEMPT_LAZY=y
CONFIG_PREEMPT_COUNT=y
CONFIG_PREEMPTION=y
CONFIG_PREEMPT_DYNAMIC=y
CONFIG_SCHED_CORE=y
#
# CPU/Task time and stats accounting
#
CONFIG_VIRT_CPU_ACCOUNTING=y
CONFIG_VIRT_CPU_ACCOUNTING_GEN=y
# CONFIG_IRQ_TIME_ACCOUNTING is not set
CONFIG_HAVE_SCHED_AVG_IRQ=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_PSI=y
CONFIG_PSI_DEFAULT_DISABLED=y
# end of CPU/Task time and stats accounting
CONFIG_CPU_ISOLATION=y
#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
CONFIG_PREEMPT_RCU=y
# CONFIG_RCU_EXPERT is not set
CONFIG_TREE_SRCU=y
CONFIG_NEED_SRCU_NMI_SAFE=y
CONFIG_TASKS_RCU_GENERIC=y
CONFIG_NEED_TASKS_RCU=y
CONFIG_TASKS_RCU=y
CONFIG_TASKS_RUDE_RCU=y
CONFIG_TASKS_TRACE_RCU=y
CONFIG_RCU_STALL_COMMON=y
CONFIG_RCU_NEED_SEGCBLIST=y
CONFIG_RCU_NOCB_CPU=y
# CONFIG_RCU_NOCB_CPU_DEFAULT_ALL is not set
# CONFIG_RCU_LAZY is not set
# end of RCU Subsystem
# CONFIG_IKCONFIG is not set
CONFIG_IKHEADERS=m
CONFIG_LOG_BUF_SHIFT=20
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_PRINTK_INDEX=y
#
# Scheduler features
#
CONFIG_UCLAMP_TASK=y
CONFIG_UCLAMP_BUCKETS_COUNT=5
# CONFIG_SCHED_PROXY_EXEC is not set
# end of Scheduler features
CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_CC_HAS_INT128=y
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
CONFIG_CC_MS_EXTENSIONS="-fms-extensions"
CONFIG_GCC10_NO_ARRAY_BOUNDS=y
CONFIG_CC_NO_ARRAY_BOUNDS=y
CONFIG_GCC_NO_STRINGOP_OVERFLOW=y
CONFIG_CC_NO_STRINGOP_OVERFLOW=y
CONFIG_NUMA_BALANCING=y
CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
CONFIG_SLAB_OBJ_EXT=y
CONFIG_CGROUPS=y
CONFIG_PAGE_COUNTER=y
# CONFIG_CGROUP_FAVOR_DYNMODS is not set
CONFIG_MEMCG=y
CONFIG_MEMCG_NMI_SAFETY_REQUIRES_ATOMIC=y
CONFIG_MEMCG_V1=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_GROUP_SCHED_WEIGHT=y
CONFIG_GROUP_SCHED_BANDWIDTH=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_SCHED_MM_CID=y
CONFIG_UCLAMP_TASK_GROUP=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
# CONFIG_CGROUP_DMEM is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CPUSETS=y
CONFIG_CPUSETS_V1=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_BPF=y
CONFIG_CGROUP_MISC=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_SOCK_CGROUP_DATA=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_TIME_NS=y
CONFIG_TIME_NS_VDSO=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_CHECKPOINT_RESTORE=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
CONFIG_RD_ZSTD=y
CONFIG_BOOT_CONFIG=y
# CONFIG_BOOT_CONFIG_FORCE is not set
# CONFIG_BOOT_CONFIG_EMBED is not set
CONFIG_CMDLINE_LOG_WRAP_IDEAL_LEN=1021
# CONFIG_INITRAMFS_PRESERVE_MTIME is not set
CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION=y
# CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is not set
CONFIG_LD_ORPHAN_WARN=y
CONFIG_LD_ORPHAN_WARN_LEVEL="warn"
CONFIG_SYSCTL=y
CONFIG_SYSCTL_EXCEPTION_TRACE=y
CONFIG_SYSFS_SYSCALL=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_EXPERT=y
CONFIG_MULTIUSER=y
CONFIG_SGETMASK_SYSCALL=y
CONFIG_FHANDLE=y
CONFIG_POSIX_TIMERS=y
CONFIG_PRINTK=y
CONFIG_PRINTK_RINGBUFFER_KUNIT_TEST=m
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
# CONFIG_BASE_SMALL is not set
CONFIG_FUTEX=y
CONFIG_FUTEX_PI=y
CONFIG_FUTEX_PRIVATE_HASH=y
CONFIG_FUTEX_MPOL=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_IO_URING=y
# CONFIG_IO_URING_MOCK_FILE is not set
CONFIG_ADVISE_SYSCALLS=y
CONFIG_MEMBARRIER=y
CONFIG_KCMP=y
CONFIG_RSEQ=y
# CONFIG_RSEQ_STATS is not set
# CONFIG_RSEQ_DEBUG_DEFAULT_ENABLE is not set
CONFIG_CACHESTAT_SYSCALL=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_SELFTEST is not set
CONFIG_KALLSYMS_ALL=y
CONFIG_ARCH_HAS_MEMBARRIER_CALLBACKS=y
CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
CONFIG_HAVE_PERF_EVENTS=y
#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# end of Kernel Performance Events And Counters
CONFIG_SYSTEM_DATA_VERIFICATION=y
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
#
# Kexec and crash features
#
CONFIG_CRASH_RESERVE=y
CONFIG_VMCORE_INFO=y
CONFIG_KEXEC_CORE=y
CONFIG_KEXEC_ELF=y
CONFIG_HAVE_IMA_KEXEC=y
# CONFIG_KEXEC is not set
CONFIG_KEXEC_FILE=y
CONFIG_CRASH_DUMP=y
# CONFIG_CRASH_DM_CRYPT is not set
CONFIG_CRASH_DUMP_KUNIT_TEST=m
CONFIG_CRASH_HOTPLUG=y
CONFIG_CRASH_MAX_MEMORY_RANGES=8192
# end of Kexec and crash features
#
# Live Update and Kexec HandOver
#
# end of Live Update and Kexec HandOver
# end of General setup
CONFIG_PPC64=y
#
# Processor support
#
CONFIG_PPC_BOOK3S_64=y
# CONFIG_PPC_BOOK3E_64 is not set
CONFIG_PPC_THP=y
# CONFIG_POWERPC64_CPU is not set
# CONFIG_POWER7_CPU is not set
# CONFIG_POWER8_CPU is not set
CONFIG_POWER9_CPU=y
# CONFIG_POWER10_CPU is not set
# CONFIG_TOOLCHAIN_DEFAULT_CPU is not set
CONFIG_TARGET_CPU_BOOL=y
CONFIG_TARGET_CPU="power9"
CONFIG_PPC_BOOK3S=y
CONFIG_PPC_FPU_REGS=y
CONFIG_PPC_FPU=y
CONFIG_ALTIVEC=y
CONFIG_VSX=y
CONFIG_PPC_64S_HASH_MMU=y
CONFIG_PPC_RADIX_MMU=y
CONFIG_PPC_RADIX_MMU_DEFAULT=y
CONFIG_PPC_RADIX_BROADCAST_TLBIE=y
CONFIG_PPC_KUEP=y
CONFIG_PPC_KUAP=y
# CONFIG_PPC_KUAP_DEBUG is not set
CONFIG_PPC_PKEY=y
CONFIG_PPC_HAVE_PMU_SUPPORT=y
# CONFIG_PMU_SYSFS is not set
CONFIG_PPC_PERF_CTRS=y
CONFIG_FORCE_SMP=y
CONFIG_SMP=y
CONFIG_NR_CPUS=8192
CONFIG_PPC_DOORBELL=y
# end of Processor support
# CONFIG_CPU_BIG_ENDIAN is not set
CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_PPC64_ELF_ABI_V2=y
CONFIG_PPC64_BOOT_WRAPPER=y
CONFIG_CC_HAS_ELFV2=y
CONFIG_CC_HAS_PREFIXED=y
CONFIG_CC_HAS_PCREL=y
CONFIG_64BIT=y
CONFIG_LIVEPATCH_64=y
CONFIG_MMU=y
CONFIG_ARCH_MMAP_RND_BITS_MAX=33
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=17
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
CONFIG_NR_IRQS=512
CONFIG_NMI_IPI=y
CONFIG_PPC_WATCHDOG=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_PPC=y
CONFIG_PPC_BARRIER_NOSPEC=y
CONFIG_PPC_HAS_LBARX_LHARX=y
CONFIG_EARLY_PRINTK=y
CONFIG_PANIC_TIMEOUT=180
# CONFIG_COMPAT is not set
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_PPC_UDBG_16550=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_EPAPR_BOOT=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ARCH_SUSPEND_NONZERO_CPU=y
CONFIG_ARCH_HAS_ADD_PAGES=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_PPC_DAWR=y
CONFIG_PGTABLE_LEVELS=4
CONFIG_PPC_MSI_BITMAP=y
CONFIG_PPC_XICS=y
CONFIG_PPC_ICP_NATIVE=y
CONFIG_PPC_ICP_HV=y
CONFIG_PPC_ICS_RTAS=y
CONFIG_PPC_XIVE=y
CONFIG_PPC_XIVE_NATIVE=y
CONFIG_PPC_XIVE_SPAPR=y
#
# Platform support
#
CONFIG_PPC_POWERNV=y
CONFIG_OPAL_PRD=m
# CONFIG_PPC_MEMTRACE is not set
CONFIG_SCOM_DEBUGFS=y
CONFIG_PPC_PSERIES=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_PARAVIRT_TIME_ACCOUNTING=y
CONFIG_PPC_SPLPAR=y
CONFIG_DTL=y
CONFIG_PSERIES_ENERGY=m
CONFIG_IO_EVENT_IRQ=y
CONFIG_LPARCFG=y
CONFIG_PPC_SMLPAR=y
CONFIG_CMM=y
CONFIG_HTMDUMP=m
CONFIG_HV_PERF_CTRS=y
# CONFIG_VPA_PMU is not set
CONFIG_IBMVIO=y
CONFIG_PSERIES_PLPKS=y
CONFIG_PSERIES_PLPKS_SED=y
CONFIG_PAPR_SCM=m
CONFIG_PPC_SVM=y
# CONFIG_PPC_MICROWATT is not set
CONFIG_KVM_GUEST=y
CONFIG_EPAPR_PARAVIRT=y
CONFIG_PPC_HASH_MMU_NATIVE=y
CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
CONFIG_PPC_DT_CPU_FTRS=y
CONFIG_PPC_SMP_MUXED_IPI=y
CONFIG_MPIC=y
# CONFIG_MPIC_MSGR is not set
CONFIG_PPC_I8259=y
CONFIG_PPC_RTAS=y
CONFIG_RTAS_ERROR_LOGGING=y
CONFIG_PPC_RTAS_DAEMON=y
CONFIG_RTAS_PROC=y
CONFIG_RTAS_FLASH=y
CONFIG_EEH=y
CONFIG_PPC_P7_NAP=y
CONFIG_PPC_BOOK3S_IDLE=y
CONFIG_PPC_INDIRECT_PIO=y
#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
#
# CPU frequency scaling drivers
#
# CONFIG_CPUFREQ_DT is not set
# CONFIG_CPUFREQ_DT_PLATDEV is not set
CONFIG_POWERNV_CPUFREQ=y
# end of CPU Frequency scaling
#
# CPUIdle driver
#
#
# CPU Idle
#
CONFIG_CPU_IDLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_CPU_IDLE_GOV_TEO is not set
# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set
#
# POWERPC CPU Idle Drivers
#
CONFIG_PSERIES_CPUIDLE=y
CONFIG_POWERNV_CPUIDLE=y
# end of POWERPC CPU Idle Drivers
# end of CPU Idle
# end of CPUIdle driver
# CONFIG_GEN_RTC is not set
# end of Platform support
#
# Kernel options
#
CONFIG_HZ_100=y
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=100
CONFIG_SCHED_HRTICK=y
CONFIG_PPC_TRANSACTIONAL_MEM=y
CONFIG_PPC_UV=y
# CONFIG_LD_HEAD_STUB_CATCH is not set
CONFIG_MPROFILE_KERNEL=y
CONFIG_HOTPLUG_CPU=y
CONFIG_INTERRUPT_SANITIZE_REGISTERS=y
CONFIG_PPC_QUEUED_SPINLOCKS=y
CONFIG_ARCH_CPU_PROBE_RELEASE=y
CONFIG_PPC64_SUPPORTS_MEMORY_FAILURE=y
CONFIG_ARCH_SUPPORTS_KEXEC=y
CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
CONFIG_ARCH_SELECTS_KEXEC_FILE=y
CONFIG_RELOCATABLE=y
# CONFIG_RELOCATABLE_TEST is not set
CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y
CONFIG_ARCH_DEFAULT_CRASH_DUMP=y
CONFIG_ARCH_SELECTS_CRASH_DUMP=y
CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y
CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y
CONFIG_FA_DUMP=y
# CONFIG_OPAL_CORE is not set
CONFIG_IRQ_ALL_CPUS=y
CONFIG_NUMA=y
CONFIG_NODES_SHIFT=8
CONFIG_HAVE_MEMORYLESS_NODES=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ILLEGAL_POINTER_VALUE=0x5deadbeef0000000
CONFIG_ARCH_MEMORY_PROBE=y
CONFIG_PPC_4K_PAGES=y
# CONFIG_PPC_64K_PAGES is not set
CONFIG_THREAD_SHIFT=14
CONFIG_DATA_SHIFT=24
CONFIG_ARCH_FORCE_MAX_ORDER=12
# CONFIG_PPC_PROT_SAO_LPAR is not set
CONFIG_PPC_COPRO_BASE=y
CONFIG_PPC_DENORMALISATION=y
CONFIG_CMDLINE=""
CONFIG_EXTRA_TARGETS=""
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
# CONFIG_SUSPEND_SKIP_SYNC is not set
# CONFIG_HIBERNATION is not set
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_SLEEP_SMP_NONZERO_CPU=y
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_PM_USERSPACE_AUTOSLEEP is not set
# CONFIG_PM_WAKELOCKS is not set
# CONFIG_PM_QOS_CPU_SYSTEM_WAKEUP is not set
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not set
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_PM_SLEEP_DEBUG=y
# CONFIG_DPM_WATCHDOG is not set
CONFIG_PM_CLK=y
CONFIG_PM_GENERIC_DOMAINS=y
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
CONFIG_PM_GENERIC_DOMAINS_OF=y
CONFIG_ENERGY_MODEL=y
CONFIG_PPC_MEM_KEYS=y
CONFIG_ARCH_PKEY_BITS=5
CONFIG_PPC_SECURE_BOOT=y
CONFIG_PPC_SECVAR_SYSFS=y
# end of Kernel options
CONFIG_ISA_DMA_API=y
#
# Bus options
#
CONFIG_GENERIC_ISA_DMA=y
# CONFIG_FSL_LBC is not set
# end of Bus options
CONFIG_NONSTATIC_KERNEL=y
CONFIG_PAGE_OFFSET=0xc000000000000000
CONFIG_KERNEL_START=0xc000000000000000
CONFIG_PHYSICAL_START=0x00000000
CONFIG_PPC64_PROC_SYSTEMCFG=y
CONFIG_KVM_COMMON=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_KVM_VFIO=y
CONFIG_HAVE_KVM_IRQ_BYPASS=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_KVM_BOOK3S_HANDLER=y
CONFIG_KVM_BOOK3S_64_HANDLER=y
CONFIG_KVM_BOOK3S_HV_POSSIBLE=y
CONFIG_KVM_BOOK3S_64=m
CONFIG_KVM_BOOK3S_64_HV=m
# CONFIG_KVM_BOOK3S_HV_P9_TIMING is not set
# CONFIG_KVM_BOOK3S_HV_P8_TIMING is not set
CONFIG_KVM_BOOK3S_HV_NESTED_PMU_WORKAROUND=y
CONFIG_KVM_BOOK3S_HV_PMU=m
CONFIG_KVM_XICS=y
CONFIG_KVM_XIVE=y
CONFIG_HAVE_LIVEPATCH=y
CONFIG_LIVEPATCH=y
CONFIG_CPU_MITIGATIONS=y
CONFIG_ARCH_HAS_DMA_OPS=y
#
# General architecture-dependent options
#
CONFIG_HOTPLUG_SMT=y
CONFIG_SMT_NUM_THREADS_DYNAMIC=y
CONFIG_ARCH_SUPPORTS_SCHED_SMT=y
CONFIG_ARCH_SUPPORTS_SCHED_MC=y
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
CONFIG_GENERIC_IRQ_ENTRY=y
CONFIG_GENERIC_SYSCALL=y
CONFIG_GENERIC_ENTRY=y
CONFIG_KPROBES=y
CONFIG_JUMP_LABEL=y
# CONFIG_STATIC_KEYS_SELFTEST is not set
CONFIG_OPTPROBES=y
CONFIG_KPROBES_ON_FTRACE=y
CONFIG_UPROBES=y
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
CONFIG_KRETPROBES=y
CONFIG_KRETPROBE_ON_RETHOOK=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
CONFIG_HAVE_NMI=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_GENERIC_IDLE_POLL_SETUP=y
CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
CONFIG_ARCH_HAS_SET_MEMORY=y
CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_RSEQ=y
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y
CONFIG_HAVE_HARDLOCKUP_DETECTOR_ARCH=y
CONFIG_HAVE_PERF_REGS=y
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
CONFIG_MMU_GATHER_TABLE_FREE=y
CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
CONFIG_MMU_GATHER_PAGE_SIZE=y
CONFIG_MMU_GATHER_MERGE_VMAS=y
CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y
CONFIG_MMU_LAZY_TLB_SHOOTDOWN=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_ARCH_WEAK_RELEASE_ACQUIRE=y
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
CONFIG_HAVE_ARCH_SECCOMP=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP=y
CONFIG_SECCOMP_FILTER=y
# CONFIG_SECCOMP_CACHE_DEBUG is not set
CONFIG_HAVE_STACKPROTECTOR=y
CONFIG_STACKPROTECTOR=y
CONFIG_STACKPROTECTOR_STRONG=y
CONFIG_LTO_NONE=y
CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
CONFIG_HAVE_CONTEXT_TRACKING_USER=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_MOVE_PUD=y
CONFIG_HAVE_MOVE_PMD=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
CONFIG_ARCH_WANT_PMD_MKWRITE=y
CONFIG_HAVE_ARCH_SOFT_DIRTY=y
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
CONFIG_MODULES_USE_ELF_RELA=y
CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
CONFIG_SOFTIRQ_ON_OWN_STACK=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
CONFIG_ARCH_MMAP_RND_BITS=18
CONFIG_HAVE_PAGE_SIZE_4KB=y
CONFIG_PAGE_SIZE_4KB=y
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
CONFIG_PAGE_SHIFT=12
CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
CONFIG_HAVE_OBJTOOL=y
CONFIG_HAVE_RELIABLE_STACKTRACE=y
CONFIG_HAVE_ARCH_NVRAM_OPS=y
CONFIG_CLONE_BACKWARDS=y
CONFIG_OLD_SIGSUSPEND=y
CONFIG_COMPAT_32BIT_TIME=y
CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
CONFIG_RANDOMIZE_KSTACK_OFFSET=y
CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y
CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
CONFIG_ARCH_HAS_PHYS_TO_DMA=y
# CONFIG_LOCK_EVENT_COUNTS is not set
CONFIG_ARCH_HAS_MEM_ENCRYPT=y
CONFIG_ARCH_HAS_CC_PLATFORM=y
CONFIG_ARCH_HAS_VDSO_ARCH_DATA=y
CONFIG_HAVE_PREEMPT_DYNAMIC=y
CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y
CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y
#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# end of GCOV-based kernel profiling
CONFIG_HAVE_GCC_PLUGINS=y
CONFIG_FUNCTION_ALIGNMENT_4B=y
CONFIG_FUNCTION_ALIGNMENT=4
CONFIG_HAVE_ARCH_GET_SECUREBOOT=y
# end of General architecture-dependent options
CONFIG_RT_MUTEXES=y
CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULES=y
CONFIG_MODULE_DEBUGFS=y
# CONFIG_MODULE_DEBUG is not set
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
CONFIG_MODVERSIONS=y
CONFIG_GENKSYMS=y
# CONFIG_GENDWARFKSYMS is not set
CONFIG_ASM_MODVERSIONS=y
# CONFIG_EXTENDED_MODVERSIONS is not set
CONFIG_BASIC_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
CONFIG_MODULE_SIG_ALL=y
# CONFIG_MODULE_SIG_SHA256 is not set
# CONFIG_MODULE_SIG_SHA384 is not set
CONFIG_MODULE_SIG_SHA512=y
# CONFIG_MODULE_SIG_SHA3_256 is not set
# CONFIG_MODULE_SIG_SHA3_384 is not set
# CONFIG_MODULE_SIG_SHA3_512 is not set
CONFIG_MODULE_SIG_HASH="sha512"
# CONFIG_MODULE_COMPRESS is not set
# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
CONFIG_MODPROBE_PATH="/usr/sbin/modprobe"
# CONFIG_TRIM_UNUSED_KSYMS is not set
CONFIG_MODULES_TREE_LOOKUP=y
CONFIG_BLOCK=y
CONFIG_BLOCK_LEGACY_AUTOLOAD=y
CONFIG_BLK_RQ_ALLOC_TIME=y
CONFIG_BLK_CGROUP_RWSTAT=y
CONFIG_BLK_CGROUP_PUNT_BIO=y
CONFIG_BLK_DEV_BSG_COMMON=y
CONFIG_BLK_ICQ=y
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_INTEGRITY=y
CONFIG_BLK_DEV_WRITE_MOUNTED=y
CONFIG_BLK_DEV_ZONED=y
CONFIG_BLK_DEV_THROTTLING=y
CONFIG_BLK_WBT=y
CONFIG_BLK_WBT_MQ=y
CONFIG_BLK_CGROUP_IOLATENCY=y
CONFIG_BLK_CGROUP_FC_APPID=y
CONFIG_BLK_CGROUP_IOCOST=y
# CONFIG_BLK_CGROUP_IOPRIO is not set
CONFIG_BLK_DEBUG_FS=y
CONFIG_BLK_SED_OPAL=y
# CONFIG_BLK_INLINE_ENCRYPTION is not set
#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not set
# CONFIG_AIX_PARTITION is not set
CONFIG_OSF_PARTITION=y
# CONFIG_AMIGA_PARTITION is not set
# CONFIG_ATARI_PARTITION is not set
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
# CONFIG_LDM_PARTITION is not set
CONFIG_SGI_PARTITION=y
# CONFIG_ULTRIX_PARTITION is not set
CONFIG_SUN_PARTITION=y
# CONFIG_KARMA_PARTITION is not set
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
# CONFIG_CMDLINE_PARTITION is not set
# CONFIG_OF_PARTITION is not set
# end of Partition Types
CONFIG_BLK_PM=y
CONFIG_BLOCK_HOLDER_DEPRECATED=y
CONFIG_BLK_MQ_STACKING=y
#
# IO Schedulers
#
CONFIG_MQ_IOSCHED_DEADLINE=y
CONFIG_MQ_IOSCHED_KYBER=y
CONFIG_IOSCHED_BFQ=y
CONFIG_BFQ_GROUP_IOSCHED=y
# CONFIG_BFQ_CGROUP_DEBUG is not set
# end of IO Schedulers
CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_PADATA=y
CONFIG_ASN1=y
CONFIG_UNINLINE_SPIN_UNLOCK=y
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_RWSEM_SPIN_ON_OWNER=y
CONFIG_LOCK_SPIN_ON_OWNER=y
CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
CONFIG_QUEUED_RWLOCKS=y
CONFIG_ARCH_HAS_MMIOWB=y
CONFIG_MMIOWB=y
CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
CONFIG_FREEZER=y
#
# Executable file formats
#
CONFIG_BINFMT_ELF=y
CONFIG_ELFCORE=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_BINFMT_SCRIPT=y
CONFIG_BINFMT_MISC=m
CONFIG_COREDUMP=y
# end of Executable file formats
#
# Memory Management options
#
CONFIG_SWAP=y
CONFIG_ZSWAP=y
# CONFIG_ZSWAP_DEFAULT_ON is not set
# CONFIG_ZSWAP_SHRINKER_DEFAULT_ON is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set
CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set
# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set
CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo"
CONFIG_ZSMALLOC=y
#
# Zsmalloc allocator options
#
#
# Zsmalloc is a common backend allocator for zswap & zram
#
CONFIG_ZSMALLOC_STAT=y
CONFIG_ZSMALLOC_CHAIN_SIZE=8
# end of Zsmalloc allocator options
#
# Slab allocator options
#
CONFIG_SLUB=y
CONFIG_KVFREE_RCU_BATCHED=y
# CONFIG_SLUB_TINY is not set
# CONFIG_SLAB_MERGE_DEFAULT is not set
CONFIG_SLAB_FREELIST_RANDOM=y
CONFIG_SLAB_FREELIST_HARDENED=y
CONFIG_SLAB_BUCKETS=y
# CONFIG_SLUB_STATS is not set
# CONFIG_RANDOM_KMALLOC_CACHES is not set
# end of Slab allocator options
CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
# CONFIG_COMPAT_BRK is not set
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
CONFIG_HAVE_GUP_FAST=y
CONFIG_ARCH_KEEP_MEMBLOCK=y
CONFIG_NUMA_KEEP_MEMINFO=y
CONFIG_MEMORY_ISOLATION=y
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
CONFIG_HAVE_BOOTMEM_INFO_NODE=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTPLUG=y
CONFIG_MHP_DEFAULT_ONLINE_TYPE_OFFLINE=y
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO is not set
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL is not set
# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE is not set
CONFIG_MEMORY_HOTREMOVE=y
CONFIG_MHP_MEMMAP_ON_MEMORY=y
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
CONFIG_SPLIT_PTE_PTLOCKS=y
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
CONFIG_SPLIT_PMD_PTLOCKS=y
CONFIG_BALLOON=y
CONFIG_BALLOON_MIGRATION=y
CONFIG_COMPACTION=y
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
CONFIG_PAGE_REPORTING=y
CONFIG_NUMA_MIGRATION=y
CONFIG_MIGRATION=y
CONFIG_DEVICE_MIGRATION=y
CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
CONFIG_ARCH_ENABLE_THP_MIGRATION=y
CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
CONFIG_CONTIG_ALLOC=y
CONFIG_PCP_BATCH_SCALE_MAX=0
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
CONFIG_MEMORY_FAILURE=y
CONFIG_HWPOISON_INJECT=m
# CONFIG_PERSISTENT_HUGE_ZERO_FOLIO is not set
CONFIG_MM_ID=y
CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set
CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_NEVER=y
# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ALWAYS is not set
# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_WITHIN_SIZE is not set
# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ADVISE is not set
CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_NEVER=y
# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ALWAYS is not set
# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_WITHIN_SIZE is not set
# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ADVISE is not set
# CONFIG_READ_ONLY_THP_FOR_FS is not set
# CONFIG_NO_PAGE_MAPCOUNT is not set
CONFIG_PAGE_MAPCOUNT=y
CONFIG_PGTABLE_HAS_HUGE_LEAVES=y
CONFIG_HAVE_GIGANTIC_FOLIOS=y
CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y
CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y
CONFIG_ARCH_SUPPORTS_PUD_PFNMAP=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_USE_PERCPU_NUMA_NODE_ID=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_CMA=y
# CONFIG_CMA_DEBUGFS is not set
CONFIG_CMA_SYSFS=y
CONFIG_CMA_AREAS=7
CONFIG_PAGE_BLOCK_MAX_ORDER=12
CONFIG_MEM_SOFT_DIRTY=y
CONFIG_GENERIC_EARLY_IOREMAP=y
# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
CONFIG_PAGE_IDLE_FLAG=y
CONFIG_IDLE_PAGE_TRACKING=y
CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
CONFIG_ZONE_DEVICE=y
CONFIG_HMM_MIRROR=y
CONFIG_GET_FREE_REGION=y
CONFIG_DEVICE_PRIVATE=y
CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
CONFIG_ARCH_HAS_PKEYS=y
CONFIG_VM_EVENT_COUNTERS=y
# CONFIG_PERCPU_STATS is not set
# CONFIG_GUP_TEST is not set
# CONFIG_DMAPOOL_TEST is not set
CONFIG_ARCH_HAS_PTE_SPECIAL=y
CONFIG_MEMFD_CREATE=y
# CONFIG_ANON_VMA_NAME is not set
CONFIG_USERFAULTFD=y
CONFIG_LRU_GEN=y
CONFIG_LRU_GEN_ENABLED=y
# CONFIG_LRU_GEN_STATS is not set
CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y
CONFIG_PER_VMA_LOCK=y
CONFIG_LOCK_MM_AND_FIND_VMA=y
CONFIG_EXECMEM=y
CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE=y
CONFIG_ARCH_HAS_LAZY_MMU_MODE=y
CONFIG_LAZY_MMU_MODE_KUNIT_TEST=m
#
# Data Access Monitoring
#
CONFIG_DAMON=y
# CONFIG_DAMON_DEBUG_SANITY is not set
CONFIG_DAMON_VADDR=y
CONFIG_DAMON_PADDR=y
CONFIG_DAMON_SYSFS=y
CONFIG_DAMON_RECLAIM=y
# CONFIG_DAMON_LRU_SORT is not set
# CONFIG_DAMON_STAT is not set
# end of Data Access Monitoring
# end of Memory Management options
CONFIG_NET=y
CONFIG_NET_INGRESS=y
CONFIG_NET_EGRESS=y
CONFIG_NET_XGRESS=y
CONFIG_NET_REDIRECT=y
CONFIG_SKB_DECRYPTED=y
CONFIG_SKB_EXTENSIONS=y
CONFIG_NET_DEVMEM=y
CONFIG_NET_SHAPER=y
CONFIG_NET_CRC32C=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_DIAG=y
# CONFIG_INET_PSP is not set
CONFIG_UNIX=y
# CONFIG_AF_UNIX_OOB is not set
CONFIG_UNIX_DIAG=y
CONFIG_TLS=m
CONFIG_TLS_DEVICE=y
# CONFIG_TLS_TOE is not set
CONFIG_XFRM=y
CONFIG_XFRM_OFFLOAD=y
CONFIG_XFRM_ALGO=y
CONFIG_XFRM_USER=y
CONFIG_XFRM_INTERFACE=m
CONFIG_XFRM_SUB_POLICY=y
CONFIG_XFRM_MIGRATE=y
CONFIG_XFRM_STATISTICS=y
CONFIG_XFRM_AH=m
CONFIG_XFRM_ESP=m
CONFIG_XFRM_IPCOMP=m
# CONFIG_NET_KEY is not set
# CONFIG_XFRM_IPTFS is not set
CONFIG_XFRM_ESPINTCP=y
# CONFIG_DIBS is not set
CONFIG_XDP_SOCKETS=y
CONFIG_XDP_SOCKETS_DIAG=m
CONFIG_NET_HANDSHAKE=y
CONFIG_NET_HANDSHAKE_KUNIT_TEST=m
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_FIB_TRIE_STATS=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_CLASSID=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE_DEMUX=m
CONFIG_NET_IP_TUNNEL=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE_COMMON=y
CONFIG_IP_MROUTE=y
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_NET_IPVTI=m
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_FOU is not set
# CONFIG_NET_FOU_IP_TUNNELS is not set
CONFIG_INET_AH=m
CONFIG_INET_ESP=m
CONFIG_INET_ESP_OFFLOAD=m
CONFIG_INET_ESPINTCP=y
CONFIG_INET_IPCOMP=m
CONFIG_INET_TABLE_PERTURB_ORDER=16
CONFIG_INET_XFRM_TUNNEL=m
CONFIG_INET_TUNNEL=m
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
CONFIG_INET_UDP_DIAG=y
CONFIG_INET_RAW_DIAG=y
CONFIG_INET_DIAG_DESTROY=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=m
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
# CONFIG_TCP_CONG_HSTCP is not set
# CONFIG_TCP_CONG_HYBLA is not set
# CONFIG_TCP_CONG_VEGAS is not set
CONFIG_TCP_CONG_NV=m
# CONFIG_TCP_CONG_SCALABLE is not set
# CONFIG_TCP_CONG_LP is not set
# CONFIG_TCP_CONG_VENO is not set
# CONFIG_TCP_CONG_YEAH is not set
CONFIG_TCP_CONG_ILLINOIS=m
CONFIG_TCP_CONG_DCTCP=m
# CONFIG_TCP_CONG_CDG is not set
CONFIG_TCP_CONG_BBR=m
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_TCP_AO is not set
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_ESP_OFFLOAD=m
CONFIG_INET6_ESPINTCP=y
CONFIG_INET6_IPCOMP=m
CONFIG_IPV6_MIP6=m
# CONFIG_IPV6_ILA is not set
CONFIG_INET6_XFRM_TUNNEL=m
CONFIG_INET6_TUNNEL=m
CONFIG_IPV6_VTI=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_SIT_6RD=y
CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_GRE=m
CONFIG_IPV6_MULTIPLE_TABLES=y
# CONFIG_IPV6_SUBTREES is not set
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_IPV6_PIMSM_V2=y
CONFIG_IPV6_SEG6_LWTUNNEL=y
CONFIG_IPV6_SEG6_HMAC=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_IPV6_RPL_LWTUNNEL is not set
# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
CONFIG_NETLABEL=y
CONFIG_MPTCP=y
CONFIG_INET_MPTCP_DIAG=y
CONFIG_MPTCP_IPV6=y
CONFIG_MPTCP_KUNIT_TEST=m
CONFIG_NETWORK_SECMARK=y
CONFIG_NET_PTP_CLASSIFY=y
CONFIG_NETWORK_PHY_TIMESTAMPING=y
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=m
#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_INGRESS=y
CONFIG_NETFILTER_EGRESS=y
CONFIG_NETFILTER_SKIP_EGRESS=y
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_FAMILY_BRIDGE=y
CONFIG_NETFILTER_FAMILY_ARP=y
CONFIG_NETFILTER_BPF_LINK=y
CONFIG_NETFILTER_NETLINK_HOOK=m
# CONFIG_NETFILTER_NETLINK_ACCT is not set
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_NETLINK_OSF=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_LOG_SYSLOG=m
CONFIG_NETFILTER_CONNCOUNT=m
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_ZONES=y
CONFIG_NF_CONNTRACK_PROCFS=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_TIMEOUT=y
CONFIG_NF_CONNTRACK_TIMESTAMP=y
CONFIG_NF_CONNTRACK_LABELS=y
CONFIG_NF_CONNTRACK_OVS=y
CONFIG_NF_CT_PROTO_GRE=y
CONFIG_NF_CT_PROTO_SCTP=y
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_BROADCAST=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_SNMP=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NF_CT_NETLINK_TIMEOUT=m
CONFIG_NF_CT_NETLINK_HELPER=m
CONFIG_NETFILTER_NETLINK_GLUE_CT=y
CONFIG_NF_NAT=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_SIP=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_REDIRECT=y
CONFIG_NF_NAT_MASQUERADE=y
CONFIG_NF_NAT_OVS=y
CONFIG_NETFILTER_SYNPROXY=m
CONFIG_NF_TABLES=m
CONFIG_NF_TABLES_INET=y
CONFIG_NF_TABLES_NETDEV=y
CONFIG_NFT_NUMGEN=m
CONFIG_NFT_CT=m
# CONFIG_NFT_EXTHDR_DCCP is not set
CONFIG_NFT_FLOW_OFFLOAD=m
CONFIG_NFT_CONNLIMIT=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
CONFIG_NFT_MASQ=m
CONFIG_NFT_REDIR=m
CONFIG_NFT_NAT=m
CONFIG_NFT_TUNNEL=m
CONFIG_NFT_QUEUE=m
CONFIG_NFT_QUOTA=m
CONFIG_NFT_REJECT=m
CONFIG_NFT_REJECT_INET=m
CONFIG_NFT_COMPAT=m
CONFIG_NFT_HASH=m
CONFIG_NFT_FIB=m
CONFIG_NFT_FIB_INET=m
CONFIG_NFT_XFRM=m
CONFIG_NFT_SOCKET=m
CONFIG_NFT_OSF=m
CONFIG_NFT_TPROXY=m
CONFIG_NFT_SYNPROXY=m
CONFIG_NF_DUP_NETDEV=m
CONFIG_NFT_DUP_NETDEV=m
CONFIG_NFT_FWD_NETDEV=m
CONFIG_NFT_FIB_NETDEV=m
CONFIG_NFT_REJECT_NETDEV=m
CONFIG_NF_FLOW_TABLE_INET=m
CONFIG_NF_FLOW_TABLE=m
CONFIG_NF_FLOW_TABLE_PROCFS=y
CONFIG_NETFILTER_XTABLES=y
# CONFIG_NETFILTER_XTABLES_LEGACY is not set
#
# Xtables combined modules
#
CONFIG_NETFILTER_XT_MARK=m
CONFIG_NETFILTER_XT_CONNMARK=m
CONFIG_NETFILTER_XT_SET=m
#
# Xtables targets
#
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_TARGET_DSCP=m
CONFIG_NETFILTER_XT_TARGET_HL=m
CONFIG_NETFILTER_XT_TARGET_HMARK=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
# CONFIG_NETFILTER_XT_TARGET_LED is not set
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_NAT=m
CONFIG_NETFILTER_XT_TARGET_NETMAP=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_RATEEST=m
CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m
CONFIG_NETFILTER_XT_TARGET_TEE=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
#
# Xtables matches
#
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
# CONFIG_NETFILTER_XT_MATCH_TIME is not set
# CONFIG_NETFILTER_XT_MATCH_U32 is not set
# end of Core Netfilter Configuration
CONFIG_IP_SET=m
CONFIG_IP_SET_MAX=256
CONFIG_IP_SET_BITMAP_IP=m
CONFIG_IP_SET_BITMAP_IPMAC=m
CONFIG_IP_SET_BITMAP_PORT=m
CONFIG_IP_SET_HASH_IP=m
CONFIG_IP_SET_HASH_IPMARK=m
CONFIG_IP_SET_HASH_IPPORT=m
CONFIG_IP_SET_HASH_IPPORTIP=m
CONFIG_IP_SET_HASH_IPPORTNET=m
CONFIG_IP_SET_HASH_IPMAC=m
CONFIG_IP_SET_HASH_MAC=m
CONFIG_IP_SET_HASH_NETPORTNET=m
CONFIG_IP_SET_HASH_NET=m
CONFIG_IP_SET_HASH_NETNET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_FO=m
CONFIG_IP_VS_OVF=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_MH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
# CONFIG_IP_VS_TWOS is not set
#
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
#
# IPVS MH scheduler
#
CONFIG_IP_VS_MH_TAB_INDEX=12
#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m
#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_SOCKET_IPV4=m
CONFIG_NF_TPROXY_IPV4=m
CONFIG_NF_TABLES_IPV4=y
CONFIG_NFT_REJECT_IPV4=m
CONFIG_NFT_DUP_IPV4=m
CONFIG_NFT_FIB_IPV4=m
CONFIG_NF_TABLES_ARP=y
CONFIG_NF_DUP_IPV4=m
CONFIG_NF_LOG_ARP=m
CONFIG_NF_LOG_IPV4=m
CONFIG_NF_REJECT_IPV4=m
CONFIG_NF_NAT_SNMP_BASIC=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_RPFILTER=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_TARGET_REJECT=m
# CONFIG_IP_NF_TARGET_SYNPROXY is not set
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_NFT_COMPAT_ARP=m
CONFIG_IP_NF_ARP_MANGLE=m
# end of IP: Netfilter Configuration
#
# IPv6: Netfilter Configuration
#
CONFIG_NF_SOCKET_IPV6=m
CONFIG_NF_TPROXY_IPV6=m
CONFIG_NF_TABLES_IPV6=y
CONFIG_NFT_REJECT_IPV6=m
CONFIG_NFT_DUP_IPV6=m
CONFIG_NFT_FIB_IPV6=m
CONFIG_NF_DUP_IPV6=m
CONFIG_NF_REJECT_IPV6=m
CONFIG_NF_LOG_IPV6=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_RPFILTER=m
CONFIG_IP6_NF_MATCH_RT=m
# CONFIG_IP6_NF_MATCH_SRH is not set
CONFIG_IP6_NF_TARGET_REJECT=m
# CONFIG_IP6_NF_TARGET_SYNPROXY is not set
CONFIG_IP6_NF_TARGET_NPT=m
# end of IPv6: Netfilter Configuration
CONFIG_NF_DEFRAG_IPV6=m
CONFIG_NF_TABLES_BRIDGE=m
CONFIG_NFT_BRIDGE_META=m
CONFIG_NFT_BRIDGE_REJECT=m
CONFIG_NF_CONNTRACK_BRIDGE=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_IP6=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
CONFIG_BRIDGE_EBT_NFLOG=m
CONFIG_IP_SCTP=m
# CONFIG_SCTP_DBG_OBJCNT is not set
CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA256=y
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
CONFIG_INET_SCTP_DIAG=m
# CONFIG_RDS is not set
CONFIG_TIPC=m
CONFIG_TIPC_MEDIA_IB=y
CONFIG_TIPC_MEDIA_UDP=y
CONFIG_TIPC_CRYPTO=y
CONFIG_TIPC_DIAG=m
# CONFIG_ATM is not set
CONFIG_L2TP=m
CONFIG_L2TP_DEBUGFS=m
CONFIG_L2TP_V3=y
CONFIG_L2TP_IP=m
CONFIG_L2TP_ETH=m
CONFIG_STP=m
CONFIG_GARP=m
CONFIG_MRP=m
CONFIG_BRIDGE=m
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_BRIDGE_VLAN_FILTERING=y
# CONFIG_BRIDGE_MRP is not set
# CONFIG_BRIDGE_CFM is not set
# CONFIG_NET_DSA is not set
CONFIG_VLAN_8021Q=m
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y
CONFIG_LLC=m
# CONFIG_LLC2 is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_PHONET is not set
# CONFIG_6LOWPAN is not set
CONFIG_IEEE802154=m
# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set
CONFIG_IEEE802154_SOCKET=m
CONFIG_MAC802154=m
CONFIG_NET_SCHED=y
#
# Queueing/Scheduling
#
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=m
CONFIG_NET_SCH_RED=m
# CONFIG_NET_SCH_SFB is not set
CONFIG_NET_SCH_SFQ=m
# CONFIG_NET_SCH_TEQL is not set
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_CBS=m
CONFIG_NET_SCH_ETF=m
CONFIG_NET_SCH_MQPRIO_LIB=m
CONFIG_NET_SCH_TAPRIO=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_NETEM=m
# CONFIG_NET_SCH_DRR is not set
CONFIG_NET_SCH_MQPRIO=m
# CONFIG_NET_SCH_SKBPRIO is not set
# CONFIG_NET_SCH_CHOKE is not set
# CONFIG_NET_SCH_QFQ is not set
# CONFIG_NET_SCH_CODEL is not set
CONFIG_NET_SCH_FQ_CODEL=y
CONFIG_NET_SCH_CAKE=m
CONFIG_NET_SCH_FQ=m
# CONFIG_NET_SCH_HHF is not set
# CONFIG_NET_SCH_PIE is not set
CONFIG_NET_SCH_INGRESS=m
# CONFIG_NET_SCH_PLUG is not set
CONFIG_NET_SCH_ETS=m
# CONFIG_NET_SCH_DUALPI2 is not set
CONFIG_NET_SCH_DEFAULT=y
# CONFIG_DEFAULT_FQ is not set
CONFIG_DEFAULT_FQ_CODEL=y
# CONFIG_DEFAULT_SFQ is not set
# CONFIG_DEFAULT_PFIFO_FAST is not set
CONFIG_DEFAULT_NET_SCH="fq_codel"
#
# Classification
#
CONFIG_NET_CLS=y
# CONFIG_NET_CLS_BASIC is not set
# CONFIG_NET_CLS_ROUTE4 is not set
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_PERF=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_CLS_BPF=m
CONFIG_NET_CLS_FLOWER=m
CONFIG_NET_CLS_MATCHALL=m
# CONFIG_NET_EMATCH is not set
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_SAMPLE=m
# CONFIG_NET_ACT_NAT is not set
CONFIG_NET_ACT_PEDIT=m
# CONFIG_NET_ACT_SIMP is not set
CONFIG_NET_ACT_SKBEDIT=m
CONFIG_NET_ACT_CSUM=m
CONFIG_NET_ACT_MPLS=m
CONFIG_NET_ACT_VLAN=m
CONFIG_NET_ACT_BPF=m
# CONFIG_NET_ACT_CONNMARK is not set
CONFIG_NET_ACT_CTINFO=m
# CONFIG_NET_ACT_SKBMOD is not set
# CONFIG_NET_ACT_IFE is not set
CONFIG_NET_ACT_TUNNEL_KEY=m
CONFIG_NET_ACT_CT=m
# CONFIG_NET_ACT_GATE is not set
CONFIG_NET_TC_SKB_EXT=y
CONFIG_NET_SCH_FIFO=y
CONFIG_DCB=y
CONFIG_DNS_RESOLVER=m
# CONFIG_BATMAN_ADV is not set
CONFIG_OPENVSWITCH=m
CONFIG_OPENVSWITCH_GRE=m
CONFIG_OPENVSWITCH_VXLAN=m
CONFIG_OPENVSWITCH_GENEVE=m
CONFIG_VSOCKETS=m
CONFIG_VSOCKETS_DIAG=m
CONFIG_VSOCKETS_LOOPBACK=m
CONFIG_VIRTIO_VSOCKETS=m
CONFIG_VIRTIO_VSOCKETS_COMMON=m
CONFIG_NETLINK_DIAG=y
CONFIG_MPLS=y
CONFIG_NET_MPLS_GSO=y
CONFIG_MPLS_ROUTING=m
CONFIG_MPLS_IPTUNNEL=m
CONFIG_NET_NSH=y
CONFIG_HSR=m
CONFIG_PRP_DUP_DISCARD_KUNIT_TEST=m
CONFIG_NET_SWITCHDEV=y
CONFIG_NET_L3_MASTER_DEV=y
# CONFIG_QRTR is not set
# CONFIG_NET_NCSI is not set
CONFIG_PCPU_DEV_REFCNT=y
CONFIG_MAX_SKB_FRAGS=17
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_SOCK_RX_QUEUE_MAPPING=y
CONFIG_XPS=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_NET_CLASSID=y
CONFIG_NET_RX_BUSY_POLL=y
CONFIG_BQL=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_NET_FLOW_LIMIT=y
#
# Network testing
#
CONFIG_NET_PKTGEN=m
CONFIG_NET_DROP_MONITOR=y
# end of Network testing
# end of Networking options
CONFIG_CAN=m
CONFIG_CAN_RAW=m
CONFIG_CAN_BCM=m
CONFIG_CAN_GW=m
CONFIG_CAN_J1939=m
CONFIG_CAN_ISOTP=m
CONFIG_BT=m
CONFIG_BT_BREDR=y
CONFIG_BT_RFCOMM=m
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=m
CONFIG_BT_LE=y
CONFIG_BT_LE_L2CAP_ECRED=y
# CONFIG_BT_LEDS is not set
# CONFIG_BT_MSFTEXT is not set
# CONFIG_BT_AOSPEXT is not set
CONFIG_BT_DEBUGFS=y
# CONFIG_BT_SELFTEST is not set
#
# Bluetooth device drivers
#
CONFIG_BT_INTEL=m
CONFIG_BT_BCM=m
CONFIG_BT_RTL=m
CONFIG_BT_MTK=m
CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y
CONFIG_BT_HCIBTUSB_POLL_SYNC=y
CONFIG_BT_HCIBTUSB_BCM=y
CONFIG_BT_HCIBTUSB_MTK=y
CONFIG_BT_HCIBTUSB_RTL=y
CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
CONFIG_BT_HCIUART_ATH3K=y
# CONFIG_BT_HCIUART_INTEL is not set
# CONFIG_BT_HCIUART_AG6XX is not set
CONFIG_BT_HCIBCM203X=m
# CONFIG_BT_HCIBCM4377 is not set
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
CONFIG_BT_HCIVHCI=m
CONFIG_BT_MRVL=m
CONFIG_BT_MRVL_SDIO=m
CONFIG_BT_ATH3K=m
# CONFIG_BT_MTKSDIO is not set
# CONFIG_BT_VIRTIO is not set
CONFIG_BT_INTEL_PCIE=m
# end of Bluetooth device drivers
CONFIG_AF_RXRPC=m
CONFIG_AF_RXRPC_IPV6=y
# CONFIG_AF_RXRPC_INJECT_LOSS is not set
# CONFIG_AF_RXRPC_INJECT_RX_DELAY is not set
CONFIG_AF_RXRPC_DEBUG=y
CONFIG_RXKAD=y
# CONFIG_RXGK is not set
CONFIG_RXPERF=m
# CONFIG_AF_KCM is not set
CONFIG_STREAM_PARSER=y
# CONFIG_MCTP is not set
CONFIG_FIB_RULES=y
# CONFIG_WIRELESS is not set
CONFIG_RFKILL=m
CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
# CONFIG_RFKILL_GPIO is not set
# CONFIG_NET_9P is not set
CONFIG_CEPH_LIB=m
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
CONFIG_CEPH_LIB_USE_DNS_RESOLVER=y
# CONFIG_NFC is not set
CONFIG_PSAMPLE=m
# CONFIG_NET_IFE is not set
CONFIG_LWTUNNEL=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_DST_CACHE=y
CONFIG_GRO_CELLS=y
CONFIG_SOCK_VALIDATE_XMIT=y
CONFIG_NET_SELFTESTS=y
CONFIG_NET_SOCK_MSG=y
CONFIG_NET_DEVLINK=y
CONFIG_PAGE_POOL=y
CONFIG_PAGE_POOL_STATS=y
CONFIG_FAILOVER=m
CONFIG_ETHTOOL_NETLINK=y
CONFIG_NETDEV_ADDR_LIST_TEST=m
CONFIG_NET_TEST=m
#
# Device Drivers
#
CONFIG_HAVE_PCI=y
CONFIG_FORCE_PCI=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCI_SYSCALL=y
CONFIG_PCIEPORTBUS=y
# CONFIG_HOTPLUG_PCI_PCIE is not set
CONFIG_PCIEAER=y
CONFIG_PCIEAER_INJECT=m
CONFIG_PCIE_ECRC=y
CONFIG_PCIEASPM=y
CONFIG_PCIEASPM_DEFAULT=y
# CONFIG_PCIEASPM_POWERSAVE is not set
# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
# CONFIG_PCIEASPM_PERFORMANCE is not set
CONFIG_PCIE_PME=y
CONFIG_PCIE_DPC=y
CONFIG_PCIE_PTM=y
CONFIG_PCI_MSI=y
CONFIG_PCI_MSI_ARCH_FALLBACKS=y
CONFIG_PCI_QUIRKS=y
# CONFIG_PCI_DEBUG is not set
# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
CONFIG_PCI_STUB=y
CONFIG_PCI_PF_STUB=m
CONFIG_PCI_ATS=y
# CONFIG_PCI_TSM is not set
CONFIG_PCI_DOE=y
CONFIG_PCI_IOV=y
# CONFIG_PCI_NPEM is not set
CONFIG_PCI_PRI=y
CONFIG_PCI_PASID=y
# CONFIG_PCIE_TPH is not set
CONFIG_PCI_P2PDMA=y
# CONFIG_PCI_DYNAMIC_OF_NODES is not set
# CONFIG_PCIE_BUS_TUNE_OFF is not set
CONFIG_PCIE_BUS_DEFAULT=y
# CONFIG_PCIE_BUS_SAFE is not set
# CONFIG_PCIE_BUS_PERFORMANCE is not set
# CONFIG_PCIE_BUS_PEER2PEER is not set
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=64
CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_OCTEONEP is not set
CONFIG_HOTPLUG_PCI_SHPC=y
CONFIG_HOTPLUG_PCI_POWERNV=y
CONFIG_HOTPLUG_PCI_RPA=m
CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
#
# PCI controller drivers
#
# CONFIG_PCI_FTPCI100 is not set
# CONFIG_PCI_HOST_GENERIC is not set
# CONFIG_PCIE_XILINX is not set
#
# Cadence-based PCIe controllers
#
# CONFIG_PCIE_CADENCE_PLAT_HOST is not set
# end of Cadence-based PCIe controllers
#
# DesignWare-based PCIe controllers
#
# CONFIG_PCI_MESON is not set
# CONFIG_PCIE_DW_PLAT_HOST is not set
# end of DesignWare-based PCIe controllers
#
# Mobiveil-based PCIe controllers
#
# end of Mobiveil-based PCIe controllers
#
# PLDA-based PCIe controllers
#
# CONFIG_PCIE_MICROCHIP_HOST is not set
# end of PLDA-based PCIe controllers
# end of PCI controller drivers
#
# PCI Endpoint
#
# CONFIG_PCI_ENDPOINT is not set
# end of PCI Endpoint
#
# PCI switch controller drivers
#
# CONFIG_PCI_SW_SWITCHTEC is not set
# end of PCI switch controller drivers
# CONFIG_PCI_PWRCTRL_GENERIC is not set
# CONFIG_PCI_PWRCTRL_TC9563 is not set
CONFIG_CXL_BUS=m
CONFIG_CXL_PCI=m
# CONFIG_CXL_MEM_RAW_COMMANDS is not set
CONFIG_CXL_PMEM=m
CONFIG_CXL_MEM=m
# CONFIG_CXL_FEATURES is not set
CONFIG_CXL_PORT=m
CONFIG_CXL_SUSPEND=y
CONFIG_CXL_REGION=y
# CONFIG_CXL_REGION_INVALIDATION_TEST is not set
# CONFIG_PCCARD is not set
# CONFIG_RAPIDIO is not set
# CONFIG_PC104 is not set
#
# Generic Driver Options
#
CONFIG_AUXILIARY_BUS=y
# CONFIG_UEVENT_HELPER is not set
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_DEVTMPFS_SAFE=y
CONFIG_DRIVER_DEFERRED_PROBE_TIMEOUT=10
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
#
# Firmware loader
#
CONFIG_FW_LOADER=y
CONFIG_FW_LOADER_DEBUG=y
CONFIG_FW_LOADER_PAGED_BUF=y
CONFIG_FW_LOADER_SYSFS=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_FW_LOADER_USER_HELPER is not set
CONFIG_FW_LOADER_COMPRESS=y
CONFIG_FW_LOADER_COMPRESS_XZ=y
# CONFIG_FW_LOADER_COMPRESS_ZSTD is not set
CONFIG_FW_CACHE=y
CONFIG_FW_UPLOAD=y
# end of Firmware loader
CONFIG_WANT_DEV_COREDUMP=y
CONFIG_ALLOW_DEV_COREDUMP=y
CONFIG_DEV_COREDUMP=y
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
CONFIG_PM_RUNTIME_KUNIT_TEST=m
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
# CONFIG_DM_KUNIT_TEST is not set
CONFIG_DRIVER_PE_KUNIT_TEST=m
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_GENERIC_CPU_VULNERABILITIES=y
CONFIG_REGMAP=y
CONFIG_REGMAP_KUNIT=m
# CONFIG_REGMAP_BUILD is not set
CONFIG_REGMAP_I2C=m
CONFIG_REGMAP_RAM=m
CONFIG_DMA_SHARED_BUFFER=y
# CONFIG_DMA_FENCE_TRACE is not set
# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set
# end of Generic Driver Options
#
# Bus devices
#
CONFIG_MHI_BUS=m
# CONFIG_MHI_BUS_DEBUG is not set
CONFIG_MHI_BUS_PCI_GENERIC=m
# CONFIG_MHI_BUS_EP is not set
# end of Bus devices
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
#
# Firmware Drivers
#
#
# ARM System Control and Management Interface Protocol
#
# end of ARM System Control and Management Interface Protocol
CONFIG_FIRMWARE_MEMMAP=y
# CONFIG_GOOGLE_FIRMWARE is not set
#
# Qualcomm firmware drivers
#
# end of Qualcomm firmware drivers
#
# Tegra firmware driver
#
# end of Tegra firmware driver
# end of Firmware Drivers
# CONFIG_FWCTL is not set
CONFIG_GNSS=m
# CONFIG_GNSS_USB is not set
CONFIG_MTD=m
# CONFIG_MTD_TESTS is not set
#
# Partition parsers
#
# CONFIG_MTD_CMDLINE_PARTS is not set
CONFIG_MTD_OF_PARTS=m
# CONFIG_MTD_REDBOOT_PARTS is not set
# end of Partition parsers
#
# User Modules And Translation Layers
#
# CONFIG_MTD_BLOCK is not set
# CONFIG_MTD_BLOCK_RO is not set
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
# CONFIG_INFTL is not set
# CONFIG_RFD_FTL is not set
# CONFIG_SSFDC is not set
# CONFIG_SM_FTL is not set
# CONFIG_MTD_OOPS is not set
# CONFIG_MTD_SWAP is not set
# CONFIG_MTD_PARTITIONED_MASTER is not set
#
# RAM/ROM/Flash chip drivers
#
# CONFIG_MTD_CFI is not set
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# end of RAM/ROM/Flash chip drivers
#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
# CONFIG_MTD_PLATRAM is not set
# end of Mapping drivers for chip access
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLOCK2MTD is not set
CONFIG_MTD_POWERNV_FLASH=m
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOCG3 is not set
# end of Self-contained MTD device drivers
#
# NAND
#
# CONFIG_MTD_ONENAND is not set
# CONFIG_MTD_RAW_NAND is not set
#
# ECC engine support
#
# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set
# CONFIG_MTD_NAND_ECC_SW_BCH is not set
# CONFIG_MTD_NAND_ECC_MXIC is not set
# end of ECC engine support
# end of NAND
#
# LPDDR & LPDDR2 PCM memory drivers
#
# CONFIG_MTD_LPDDR is not set
# end of LPDDR & LPDDR2 PCM memory drivers
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
# CONFIG_MTD_UBI_BLOCK is not set
# CONFIG_MTD_UBI_NVMEM is not set
# CONFIG_MTD_HYPERBUS is not set
CONFIG_DTC=y
CONFIG_OF=y
# CONFIG_OF_UNITTEST is not set
CONFIG_OF_KUNIT_TEST=m
CONFIG_OF_FLATTREE=y
CONFIG_OF_EARLY_FLATTREE=y
CONFIG_OF_KOBJ=y
CONFIG_OF_DYNAMIC=y
CONFIG_OF_ADDRESS=y
CONFIG_OF_IRQ=y
CONFIG_OF_RESERVED_MEM=y
CONFIG_OF_RESOLVE=y
CONFIG_OF_OVERLAY=y
CONFIG_OF_OVERLAY_KUNIT_TEST=m
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
# CONFIG_PARPORT is not set
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_NULL_BLK=m
# CONFIG_BLK_DEV_FD is not set
CONFIG_CDROM=m
# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
CONFIG_ZRAM=m
CONFIG_ZRAM_BACKEND_LZ4=y
CONFIG_ZRAM_BACKEND_LZ4HC=y
CONFIG_ZRAM_BACKEND_ZSTD=y
CONFIG_ZRAM_BACKEND_DEFLATE=y
CONFIG_ZRAM_BACKEND_842=y
CONFIG_ZRAM_BACKEND_LZO=y
CONFIG_ZRAM_DEF_COMP_LZORLE=y
# CONFIG_ZRAM_DEF_COMP_LZO is not set
# CONFIG_ZRAM_DEF_COMP_LZ4 is not set
# CONFIG_ZRAM_DEF_COMP_LZ4HC is not set
# CONFIG_ZRAM_DEF_COMP_ZSTD is not set
# CONFIG_ZRAM_DEF_COMP_DEFLATE is not set
# CONFIG_ZRAM_DEF_COMP_842 is not set
CONFIG_ZRAM_DEF_COMP="lzo-rle"
CONFIG_ZRAM_WRITEBACK=y
# CONFIG_ZRAM_TRACK_ENTRY_ACTIME is not set
# CONFIG_ZRAM_MEMORY_TRACKING is not set
CONFIG_ZRAM_MULTI_COMP=y
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_LOOP_MIN_COUNT=0
# CONFIG_BLK_DEV_DRBD is not set
CONFIG_BLK_DEV_NBD=m
CONFIG_BLK_DEV_RAM=m
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
# CONFIG_ATA_OVER_ETH is not set
CONFIG_VIRTIO_BLK=m
CONFIG_BLK_DEV_RBD=m
CONFIG_BLK_DEV_UBLK=m
CONFIG_BLKDEV_UBLK_LEGACY_OPCODES=y
# CONFIG_BLK_DEV_ZONED_LOOP is not set
#
# NVME Support
#
CONFIG_NVME_KEYRING=m
CONFIG_NVME_AUTH=m
CONFIG_NVME_AUTH_KUNIT_TEST=m
CONFIG_NVME_CORE=m
CONFIG_BLK_DEV_NVME=m
CONFIG_NVME_MULTIPATH=y
# CONFIG_NVME_VERBOSE_ERRORS is not set
# CONFIG_NVME_HWMON is not set
CONFIG_NVME_FABRICS=m
CONFIG_NVME_RDMA=m
CONFIG_NVME_FC=m
CONFIG_NVME_TCP=m
CONFIG_NVME_TCP_TLS=y
CONFIG_NVME_HOST_AUTH=y
CONFIG_NVME_TARGET=m
# CONFIG_NVME_TARGET_DEBUGFS is not set
# CONFIG_NVME_TARGET_PASSTHRU is not set
CONFIG_NVME_TARGET_LOOP=m
CONFIG_NVME_TARGET_RDMA=m
CONFIG_NVME_TARGET_FC=m
CONFIG_NVME_TARGET_FCLOOP=m
CONFIG_NVME_TARGET_TCP=m
CONFIG_NVME_TARGET_TCP_TLS=y
CONFIG_NVME_TARGET_AUTH=y
# CONFIG_NVME_TARGET_AUTH_DEBUG is not set
# end of NVME Support
#
# Misc devices
#
CONFIG_SENSORS_LIS3LV02D=m
# CONFIG_AD525X_DPOT is not set
# CONFIG_DUMMY_IRQ is not set
CONFIG_IBMVMC=m
# CONFIG_PHANTOM is not set
CONFIG_RPMB=m
# CONFIG_TI_FPC202 is not set
CONFIG_TIFM_CORE=m
CONFIG_TIFM_7XX1=m
# CONFIG_ICS932S401 is not set
CONFIG_ENCLOSURE_SERVICES=m
# CONFIG_HP_ILO is not set
CONFIG_APDS9802ALS=m
CONFIG_ISL29003=m
CONFIG_ISL29020=m
CONFIG_SENSORS_TSL2550=m
CONFIG_SENSORS_BH1770=m
CONFIG_SENSORS_APDS990X=m
# CONFIG_HMC6352 is not set
# CONFIG_DS1682 is not set
# CONFIG_SRAM is not set
# CONFIG_DW_XDATA_PCIE is not set
# CONFIG_PCI_ENDPOINT_TEST is not set
# CONFIG_XILINX_SDFEC is not set
CONFIG_MISC_RTSX=m
# CONFIG_HISI_HIKEY_USB is not set
# CONFIG_OPEN_DICE is not set
# CONFIG_NTSYNC is not set
# CONFIG_VCPU_STALL_DETECTOR is not set
# CONFIG_NSM is not set
# CONFIG_MCHP_LAN966X_PCI is not set
# CONFIG_C2PORT is not set
#
# EEPROM support
#
CONFIG_EEPROM_AT24=m
CONFIG_EEPROM_MAX6875=m
CONFIG_EEPROM_93CX6=y
# CONFIG_EEPROM_IDT_89HPESX is not set
# CONFIG_EEPROM_EE1004 is not set
# CONFIG_EEPROM_M24LR is not set
# end of EEPROM support
CONFIG_CB710_CORE=m
# CONFIG_CB710_DEBUG is not set
CONFIG_CB710_DEBUG_ASSUMPTIONS=y
CONFIG_SENSORS_LIS3_I2C=m
CONFIG_ALTERA_STAPL=m
CONFIG_GENWQE=m
CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=1
CONFIG_OCXL_BASE=y
CONFIG_OCXL=m
# CONFIG_BCM_VK is not set
# CONFIG_MISC_ALCOR_PCI is not set
CONFIG_MISC_RTSX_PCI=m
CONFIG_MISC_RTSX_USB=m
# CONFIG_UACCE is not set
# CONFIG_PVPANIC is not set
# CONFIG_GP_PCI1XXXX is not set
# CONFIG_MISC_RP1 is not set
# end of Misc devices
#
# SCSI device support
#
CONFIG_SCSI_MOD=y
CONFIG_RAID_ATTRS=m
CONFIG_SCSI_COMMON=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_NETLINK=y
CONFIG_SCSI_PROC_FS=y
CONFIG_SCSI_LIB_KUNIT_TEST=m
#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=m
CONFIG_CHR_DEV_ST=m
CONFIG_BLK_DEV_SR=m
CONFIG_CHR_DEV_SG=m
CONFIG_BLK_DEV_BSG=y
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_ENCLOSURE=m
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_SCSI_PROTO_TEST=m
#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=m
CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
CONFIG_SCSI_SAS_LIBSAS=m
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_SAS_HOST_SMP=y
CONFIG_SCSI_SRP_ATTRS=m
# end of SCSI Transports
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
CONFIG_ISCSI_BOOT_SYSFS=m
# CONFIG_SCSI_CXGB3_ISCSI is not set
CONFIG_SCSI_CXGB4_ISCSI=m
CONFIG_SCSI_BNX2_ISCSI=m
CONFIG_SCSI_BNX2X_FCOE=m
CONFIG_BE2ISCSI=m
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
CONFIG_SCSI_HPSA=m
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_3W_SAS is not set
# CONFIG_SCSI_ACARD is not set
CONFIG_SCSI_AACRAID=m
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_AIC94XX is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_MVUMI is not set
# CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_ARCMSR is not set
# CONFIG_SCSI_ESAS2R is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
CONFIG_MEGARAID_SAS=m
CONFIG_SCSI_MPT3SAS=m
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
CONFIG_SCSI_MPT3SAS_MAX_SGE=128
CONFIG_SCSI_MPT2SAS=m
CONFIG_SCSI_MPI3MR=m
CONFIG_SCSI_SMARTPQI=m
# CONFIG_SCSI_HPTIOP is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_MYRB is not set
# CONFIG_SCSI_MYRS is not set
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
# CONFIG_FCOE is not set
# CONFIG_SCSI_SNIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_FDOMAIN_PCI is not set
# CONFIG_SCSI_IPS is not set
CONFIG_SCSI_IBMVSCSI=m
CONFIG_SCSI_IBMVSCSIS=m
CONFIG_SCSI_IBMVFC=m
CONFIG_SCSI_IBMVFC_TRACE=y
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_STEX is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
CONFIG_SCSI_IPR=m
CONFIG_SCSI_IPR_TRACE=y
CONFIG_SCSI_IPR_DUMP=y
# CONFIG_SCSI_QLOGIC_1280 is not set
CONFIG_SCSI_QLA_FC=m
# CONFIG_TCM_QLA2XXX is not set
# CONFIG_SCSI_QLA_ISCSI is not set
CONFIG_QEDI=m
CONFIG_QEDF=m
CONFIG_SCSI_LPFC=m
# CONFIG_SCSI_LPFC_DEBUG_FS is not set
# CONFIG_SCSI_EFCT is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_AM53C974 is not set
# CONFIG_SCSI_WD719X is not set
CONFIG_SCSI_DEBUG=m
# CONFIG_SCSI_PMCRAID is not set
# CONFIG_SCSI_PM8001 is not set
# CONFIG_SCSI_BFA_FC is not set
CONFIG_SCSI_VIRTIO=m
CONFIG_SCSI_CHELSIO_FCOE=m
CONFIG_SCSI_DH=y
CONFIG_SCSI_DH_RDAC=y
CONFIG_SCSI_DH_HP_SW=y
CONFIG_SCSI_DH_EMC=y
CONFIG_SCSI_DH_ALUA=y
# end of SCSI device support
CONFIG_ATA=m
CONFIG_SATA_HOST=y
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_FORCE=y
CONFIG_SATA_PMP=y
#
# Controllers with non-SFF native interface
#
CONFIG_SATA_AHCI=m
CONFIG_SATA_MOBILE_LPM_POLICY=0
CONFIG_SATA_AHCI_PLATFORM=m
# CONFIG_AHCI_DWC is not set
# CONFIG_AHCI_CEVA is not set
# CONFIG_SATA_INIC162X is not set
# CONFIG_SATA_ACARD_AHCI is not set
# CONFIG_SATA_SIL24 is not set
CONFIG_ATA_SFF=y
#
# SFF controllers with custom DMA interface
#
# CONFIG_PDC_ADMA is not set
# CONFIG_SATA_QSTOR is not set
# CONFIG_SATA_SX4 is not set
CONFIG_ATA_BMDMA=y
#
# SATA SFF controllers with BMDMA
#
CONFIG_ATA_PIIX=m
# CONFIG_SATA_DWC is not set
# CONFIG_SATA_MV is not set
# CONFIG_SATA_NV is not set
# CONFIG_SATA_PROMISE is not set
# CONFIG_SATA_SIL is not set
# CONFIG_SATA_SIS is not set
# CONFIG_SATA_SVW is not set
# CONFIG_SATA_ULI is not set
# CONFIG_SATA_VIA is not set
# CONFIG_SATA_VITESSE is not set
#
# PATA SFF controllers with BMDMA
#
# CONFIG_PATA_ALI is not set
# CONFIG_PATA_AMD is not set
# CONFIG_PATA_ARTOP is not set
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_ATP867X is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CYPRESS is not set
# CONFIG_PATA_EFAR is not set
# CONFIG_PATA_HPT366 is not set
# CONFIG_PATA_HPT37X is not set
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_JMICRON is not set
# CONFIG_PATA_MARVELL is not set
# CONFIG_PATA_NETCELL is not set
# CONFIG_PATA_NINJA32 is not set
# CONFIG_PATA_NS87415 is not set
# CONFIG_PATA_OLDPIIX is not set
# CONFIG_PATA_OPTIDMA is not set
# CONFIG_PATA_PDC2027X is not set
# CONFIG_PATA_PDC_OLD is not set
# CONFIG_PATA_RADISYS is not set
# CONFIG_PATA_RDC is not set
# CONFIG_PATA_SCH is not set
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_SIL680 is not set
# CONFIG_PATA_SIS is not set
# CONFIG_PATA_TOSHIBA is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_VIA is not set
# CONFIG_PATA_WINBOND is not set
#
# PIO-only SFF controllers
#
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_MPIIX is not set
# CONFIG_PATA_NS87410 is not set
# CONFIG_PATA_OPTI is not set
CONFIG_PATA_PLATFORM=m
CONFIG_PATA_OF_PLATFORM=m
# CONFIG_PATA_RZ1000 is not set
#
# Generic fallback / legacy drivers
#
CONFIG_ATA_GENERIC=m
# CONFIG_PATA_LEGACY is not set
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_BITMAP=y
# CONFIG_MD_LLBITMAP is not set
CONFIG_MD_AUTODETECT=y
CONFIG_MD_BITMAP_FILE=y
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m
# CONFIG_BCACHE is not set
CONFIG_BLK_DEV_DM_BUILTIN=y
CONFIG_BLK_DEV_DM=m
CONFIG_DM_DEBUG=y
CONFIG_DM_BUFIO=m
# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set
CONFIG_DM_BIO_PRISON=m
CONFIG_DM_PERSISTENT_DATA=m
# CONFIG_DM_UNSTRIPED is not set
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_THIN_PROVISIONING=m
CONFIG_DM_CACHE=m
CONFIG_DM_CACHE_SMQ=m
CONFIG_DM_WRITECACHE=m
# CONFIG_DM_EBS is not set
CONFIG_DM_ERA=m
# CONFIG_DM_CLONE is not set
CONFIG_DM_MIRROR=m
CONFIG_DM_LOG_USERSPACE=m
CONFIG_DM_RAID=m
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
CONFIG_DM_MULTIPATH_QL=m
CONFIG_DM_MULTIPATH_ST=m
CONFIG_DM_MULTIPATH_HST=m
CONFIG_DM_MULTIPATH_IOA=m
CONFIG_DM_DELAY=m
# CONFIG_DM_DUST is not set
CONFIG_DM_UEVENT=y
CONFIG_DM_FLAKEY=m
CONFIG_DM_VERITY=m
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG_SECONDARY_KEYRING=y
CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG_PLATFORM_KEYRING=y
CONFIG_DM_VERITY_FEC=y
CONFIG_DM_SWITCH=m
CONFIG_DM_LOG_WRITES=m
CONFIG_DM_INTEGRITY=m
# CONFIG_DM_ZONED is not set
CONFIG_DM_AUDIT=y
CONFIG_DM_VDO=m
# CONFIG_DM_PCACHE is not set
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
CONFIG_TCM_PSCSI=m
CONFIG_TCM_USER2=m
CONFIG_LOOPBACK_TARGET=m
CONFIG_TCM_FC=m
CONFIG_ISCSI_TARGET=m
CONFIG_ISCSI_TARGET_CXGB4=m
# CONFIG_REMOTE_TARGET is not set
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
# CONFIG_FUSION_FC is not set
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=128
# CONFIG_FUSION_CTL is not set
CONFIG_FUSION_LOGGING=y
#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
# CONFIG_FIREWIRE_NOSY is not set
# end of IEEE 1394 (FireWire) support
# CONFIG_MACINTOSH_DRIVERS is not set
CONFIG_NETDEVICES=y
CONFIG_MII=m
CONFIG_NET_CORE=y
CONFIG_BONDING=m
CONFIG_DUMMY=m
CONFIG_WIREGUARD=m
# CONFIG_WIREGUARD_DEBUG is not set
# CONFIG_OVPN is not set
# CONFIG_EQUALIZER is not set
CONFIG_NET_FC=y
CONFIG_IFB=m
# CONFIG_NET_TEAM is not set
CONFIG_MACVLAN=m
CONFIG_MACVTAP=m
CONFIG_IPVLAN_L3S=y
CONFIG_IPVLAN=m
CONFIG_IPVTAP=m
CONFIG_VXLAN=m
CONFIG_GENEVE=m
CONFIG_BAREUDP=m
# CONFIG_GTP is not set
# CONFIG_PFCP is not set
# CONFIG_AMT is not set
CONFIG_MACSEC=m
CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=y
# CONFIG_NETCONSOLE_EXTENDED_LOG is not set
CONFIG_NETPOLL=y
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_TUN=m
CONFIG_TAP=m
CONFIG_TUN_VNET_CROSS_LE=y
CONFIG_VETH=m
CONFIG_VIRTIO_NET=m
CONFIG_NLMON=m
CONFIG_NETKIT=y
CONFIG_NET_VRF=m
CONFIG_VSOCKMON=m
CONFIG_MHI_NET=m
# CONFIG_ARCNET is not set
CONFIG_ETHERNET=y
CONFIG_MDIO=m
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set
# CONFIG_NET_VENDOR_AGERE is not set
# CONFIG_NET_VENDOR_ALACRITECH is not set
# CONFIG_ALTERA_TSE is not set
CONFIG_NET_VENDOR_AMAZON=y
# CONFIG_ENA_ETHERNET is not set
# CONFIG_NET_VENDOR_AMD is not set
CONFIG_NET_VENDOR_AQUANTIA=y
# CONFIG_AQTION is not set
# CONFIG_NET_VENDOR_ARC is not set
CONFIG_NET_VENDOR_ASIX=y
CONFIG_NET_VENDOR_ATHEROS=y
CONFIG_ATL2=m
CONFIG_ATL1=m
CONFIG_ATL1E=m
CONFIG_ATL1C=m
CONFIG_ALX=m
CONFIG_NET_VENDOR_BROADCOM=y
# CONFIG_B44 is not set
CONFIG_BCMGENET=m
CONFIG_BNX2=m
CONFIG_CNIC=m
CONFIG_TIGON3=m
CONFIG_TIGON3_HWMON=y
CONFIG_BNX2X=m
CONFIG_BNX2X_SRIOV=y
# CONFIG_SYSTEMPORT is not set
CONFIG_BNXT=m
CONFIG_BNXT_SRIOV=y
CONFIG_BNXT_FLOWER_OFFLOAD=y
CONFIG_BNXT_DCB=y
# CONFIG_BNXT_HWMON is not set
# CONFIG_BNGE is not set
# CONFIG_NET_VENDOR_CADENCE is not set
# CONFIG_NET_VENDOR_CAVIUM is not set
CONFIG_NET_VENDOR_CHELSIO=y
# CONFIG_CHELSIO_T1 is not set
# CONFIG_CHELSIO_T3 is not set
CONFIG_CHELSIO_T4=m
# CONFIG_CHELSIO_T4_DCB is not set
CONFIG_CHELSIO_T4VF=m
CONFIG_CHELSIO_LIB=m
CONFIG_CHELSIO_INLINE_CRYPTO=y
CONFIG_CHELSIO_IPSEC_INLINE=m
CONFIG_CHELSIO_TLS_DEVICE=m
CONFIG_NET_VENDOR_CISCO=y
CONFIG_ENIC=m
# CONFIG_NET_VENDOR_CORTINA is not set
# CONFIG_NET_VENDOR_DAVICOM is not set
CONFIG_NET_VENDOR_DEC=y
# CONFIG_NET_TULIP is not set
# CONFIG_NET_VENDOR_DLINK is not set
CONFIG_NET_VENDOR_EMULEX=y
CONFIG_BE2NET=m
CONFIG_BE2NET_HWMON=y
# CONFIG_BE2NET_BE2 is not set
# CONFIG_BE2NET_BE3 is not set
CONFIG_BE2NET_LANCER=y
CONFIG_BE2NET_SKYHAWK=y
# CONFIG_NET_VENDOR_ENGLEDER is not set
# CONFIG_NET_VENDOR_EZCHIP is not set
# CONFIG_NET_VENDOR_FUNGIBLE is not set
CONFIG_NET_VENDOR_GOOGLE=y
CONFIG_GVE=m
CONFIG_NET_VENDOR_HISILICON=y
# CONFIG_HIBMCGE is not set
# CONFIG_NET_VENDOR_HUAWEI is not set
# CONFIG_NET_VENDOR_I825XX is not set
CONFIG_NET_VENDOR_IBM=y
CONFIG_IBMVETH=m
CONFIG_IBMVNIC=m
CONFIG_NET_VENDOR_INTEL=y
CONFIG_LIBETH=m
CONFIG_LIBETH_XDP=m
CONFIG_LIBIE=m
CONFIG_LIBIE_ADMINQ=m
CONFIG_LIBIE_FWLOG=m
# CONFIG_E100 is not set
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_IGB=m
CONFIG_IGB_HWMON=y
CONFIG_IGBVF=m
CONFIG_IXGBE=m
CONFIG_IXGBE_HWMON=y
CONFIG_IXGBE_DCB=y
CONFIG_IXGBE_IPSEC=y
CONFIG_IXGBEVF=m
CONFIG_IXGBEVF_IPSEC=y
CONFIG_I40E=m
CONFIG_I40E_DCB=y
CONFIG_IAVF=m
CONFIG_I40EVF=m
CONFIG_ICE=m
CONFIG_ICE_HWMON=y
CONFIG_ICE_SWITCHDEV=y
CONFIG_FM10K=m
CONFIG_IGC=m
CONFIG_IGC_LEDS=y
CONFIG_IDPF=m
# CONFIG_IDPF_SINGLEQ is not set
# CONFIG_JME is not set
# CONFIG_NET_VENDOR_LITEX is not set
CONFIG_NET_VENDOR_MARVELL=y
# CONFIG_MVMDIO is not set
# CONFIG_SKGE is not set
# CONFIG_SKY2 is not set
CONFIG_OCTEON_EP=m
CONFIG_OCTEON_EP_VF=m
# CONFIG_PRESTERA is not set
CONFIG_NET_VENDOR_MELLANOX=y
# CONFIG_MLX4_EN is not set
CONFIG_MLX5_CORE=m
CONFIG_MLX5_FPGA=y
CONFIG_MLX5_CORE_EN=y
CONFIG_MLX5_EN_ARFS=y
CONFIG_MLX5_EN_RXNFC=y
CONFIG_MLX5_MPFS=y
CONFIG_MLX5_ESWITCH=y
CONFIG_MLX5_BRIDGE=y
CONFIG_MLX5_CLS_ACT=y
CONFIG_MLX5_TC_CT=y
CONFIG_MLX5_TC_SAMPLE=y
CONFIG_MLX5_CORE_EN_DCB=y
CONFIG_MLX5_CORE_IPOIB=y
CONFIG_MLX5_MACSEC=y
CONFIG_MLX5_EN_IPSEC=y
CONFIG_MLX5_EN_TLS=y
CONFIG_MLX5_SW_STEERING=y
CONFIG_MLX5_HW_STEERING=y
CONFIG_MLX5_SF=y
CONFIG_MLX5_SF_MANAGER=y
CONFIG_MLX5_DPLL=m
CONFIG_MLXSW_CORE=m
CONFIG_MLXSW_CORE_HWMON=y
CONFIG_MLXSW_CORE_THERMAL=y
CONFIG_MLXSW_PCI=m
CONFIG_MLXSW_I2C=m
CONFIG_MLXSW_SPECTRUM=m
CONFIG_MLXSW_SPECTRUM_DCB=y
CONFIG_MLXSW_MINIMAL=m
CONFIG_MLXFW=m
# CONFIG_NET_VENDOR_META is not set
# CONFIG_NET_VENDOR_MICREL is not set
CONFIG_NET_VENDOR_MICROCHIP=y
CONFIG_LAN743X=m
# CONFIG_LAN966X_SWITCH is not set
# CONFIG_VCAP is not set
# CONFIG_NET_VENDOR_MICROSEMI is not set
CONFIG_NET_VENDOR_MICROSOFT=y
CONFIG_NET_VENDOR_MUCSE=y
# CONFIG_MGBE is not set
CONFIG_NET_VENDOR_MYRI=y
CONFIG_MYRI10GE=m
# CONFIG_FEALNX is not set
# CONFIG_NET_VENDOR_NI is not set
# CONFIG_NET_VENDOR_NATSEMI is not set
CONFIG_NET_VENDOR_NETRONOME=y
# CONFIG_NFP is not set
# CONFIG_NET_VENDOR_NVIDIA is not set
CONFIG_NET_VENDOR_OKI=y
CONFIG_ETHOC=m
CONFIG_NET_VENDOR_PENSANDO=y
CONFIG_IONIC=m
CONFIG_NET_VENDOR_QLOGIC=y
# CONFIG_QLA3XXX is not set
# CONFIG_QLCNIC is not set
CONFIG_NETXEN_NIC=m
CONFIG_QED=m
CONFIG_QED_LL2=y
CONFIG_QED_SRIOV=y
CONFIG_QEDE=m
CONFIG_QED_RDMA=y
CONFIG_QED_ISCSI=y
CONFIG_QED_FCOE=y
CONFIG_QED_OOO=y
CONFIG_NET_VENDOR_BROCADE=y
# CONFIG_BNA is not set
# CONFIG_NET_VENDOR_QUALCOMM is not set
# CONFIG_NET_VENDOR_RDC is not set
CONFIG_NET_VENDOR_REALTEK=y
CONFIG_8139CP=m
CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set
# CONFIG_8139TOO_TUNE_TWISTER is not set
CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
CONFIG_R8169=m
CONFIG_R8169_LEDS=y
# CONFIG_RTASE is not set
# CONFIG_NET_VENDOR_RENESAS is not set
CONFIG_NET_VENDOR_ROCKER=y
CONFIG_ROCKER=m
# CONFIG_NET_VENDOR_SAMSUNG is not set
# CONFIG_NET_VENDOR_SEEQ is not set
# CONFIG_NET_VENDOR_SILAN is not set
# CONFIG_NET_VENDOR_SIS is not set
CONFIG_NET_VENDOR_SOLARFLARE=y
CONFIG_SFC=m
CONFIG_SFC_MTD=y
CONFIG_SFC_MCDI_MON=y
CONFIG_SFC_SRIOV=y
CONFIG_SFC_MCDI_LOGGING=y
# CONFIG_SFC_FALCON is not set
CONFIG_SFC_SIENA=m
CONFIG_SFC_SIENA_MTD=y
CONFIG_SFC_SIENA_MCDI_MON=y
CONFIG_SFC_SIENA_SRIOV=y
CONFIG_SFC_SIENA_MCDI_LOGGING=y
# CONFIG_NET_VENDOR_SMSC is not set
# CONFIG_NET_VENDOR_SOCIONEXT is not set
# CONFIG_NET_VENDOR_STMICRO is not set
# CONFIG_NET_VENDOR_SUN is not set
# CONFIG_NET_VENDOR_SYNOPSYS is not set
# CONFIG_NET_VENDOR_TEHUTI is not set
# CONFIG_NET_VENDOR_TI is not set
# CONFIG_NET_VENDOR_VERTEXCOM is not set
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WANGXUN is not set
# CONFIG_NET_VENDOR_WIZNET is not set
# CONFIG_NET_VENDOR_XILINX is not set
# CONFIG_FDDI is not set
CONFIG_PHYLINK=m
CONFIG_PHYLIB=y
CONFIG_SWPHY=y
CONFIG_PHY_PACKAGE=m
CONFIG_LED_TRIGGER_PHY=y
CONFIG_OPEN_ALLIANCE_HELPERS=y
CONFIG_PHYLIB_LEDS=y
CONFIG_FIXED_PHY=y
# CONFIG_SFP is not set
#
# MII PHY device drivers
#
# CONFIG_AS21XXX_PHY is not set
CONFIG_AIR_EN8811H_PHY=m
CONFIG_AMD_PHY=m
# CONFIG_ADIN_PHY is not set
# CONFIG_ADIN1100_PHY is not set
CONFIG_AQUANTIA_PHY=m
CONFIG_AX88796B_PHY=m
CONFIG_BROADCOM_PHY=m
# CONFIG_BCM54140_PHY is not set
CONFIG_BCM7XXX_PHY=m
# CONFIG_BCM84881_PHY is not set
CONFIG_BCM87XX_PHY=m
CONFIG_BCM_NET_PHYLIB=m
CONFIG_BCM_NET_PHYPTP=m
CONFIG_CICADA_PHY=m
CONFIG_CORTINA_PHY=m
CONFIG_DAVICOM_PHY=m
CONFIG_ICPLUS_PHY=m
CONFIG_LXT_PHY=m
CONFIG_INTEL_XWAY_PHY=m
CONFIG_LSI_ET1011C_PHY=m
CONFIG_MARVELL_PHY=m
CONFIG_MARVELL_10G_PHY=m
CONFIG_MARVELL_88Q2XXX_PHY=m
# CONFIG_MARVELL_88X2222_PHY is not set
CONFIG_MAXLINEAR_GPHY=m
# CONFIG_MAXLINEAR_86110_PHY is not set
# CONFIG_MEDIATEK_GE_PHY is not set
CONFIG_MICREL_PHY=m
# CONFIG_MICROCHIP_T1S_PHY is not set
CONFIG_MICROCHIP_PHY=m
CONFIG_MICROCHIP_T1_PHY=m
CONFIG_MICROCHIP_PHY_RDS_PTP=m
CONFIG_MICROSEMI_PHY=m
# CONFIG_MOTORCOMM_PHY is not set
CONFIG_NATIONAL_PHY=m
# CONFIG_NXP_CBTX_PHY is not set
# CONFIG_NXP_C45_TJA11XX_PHY is not set
# CONFIG_NXP_TJA11XX_PHY is not set
# CONFIG_NCN26000_PHY is not set
CONFIG_QCOM_NET_PHYLIB=m
CONFIG_QCA83XX_PHY=m
CONFIG_QCA808X_PHY=m
CONFIG_QCA807X_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_REALTEK_PHY=m
# CONFIG_REALTEK_PHY_HWMON is not set
CONFIG_RENESAS_PHY=m
CONFIG_ROCKCHIP_PHY=m
CONFIG_SMSC_PHY=m
CONFIG_STE10XP=m
CONFIG_TERANETICS_PHY=m
CONFIG_DP83822_PHY=m
CONFIG_DP83TC811_PHY=m
CONFIG_DP83848_PHY=m
CONFIG_DP83867_PHY=m
# CONFIG_DP83869_PHY is not set
# CONFIG_DP83TD510_PHY is not set
CONFIG_DP83TG720_PHY=m
CONFIG_VITESSE_PHY=m
CONFIG_XILINX_GMII2RGMII=m
CONFIG_CAN_DEV=m
CONFIG_CAN_VCAN=m
CONFIG_CAN_VXCAN=m
CONFIG_CAN_NETLINK=y
CONFIG_CAN_CALC_BITTIMING=y
CONFIG_CAN_RX_OFFLOAD=y
# CONFIG_CAN_CAN327 is not set
# CONFIG_CAN_DUMMY is not set
# CONFIG_CAN_FLEXCAN is not set
# CONFIG_CAN_GRCAN is not set
# CONFIG_CAN_KVASER_PCIEFD is not set
CONFIG_CAN_SLCAN=m
# CONFIG_CAN_C_CAN is not set
# CONFIG_CAN_CC770 is not set
# CONFIG_CAN_CTUCANFD_PCI is not set
# CONFIG_CAN_CTUCANFD_PLATFORM is not set
# CONFIG_CAN_ESD_402_PCI is not set
# CONFIG_CAN_IFI_CANFD is not set
CONFIG_CAN_M_CAN=m
CONFIG_CAN_M_CAN_PCI=m
# CONFIG_CAN_M_CAN_PLATFORM is not set
# CONFIG_CAN_MSCAN is not set
CONFIG_CAN_PEAK_PCIEFD=m
# CONFIG_CAN_SJA1000 is not set
# CONFIG_CAN_SOFTING is not set
#
# CAN USB interfaces
#
CONFIG_CAN_8DEV_USB=m
CONFIG_CAN_EMS_USB=m
# CONFIG_CAN_ESD_USB is not set
# CONFIG_CAN_ETAS_ES58X is not set
# CONFIG_CAN_F81604 is not set
# CONFIG_CAN_GS_USB is not set
CONFIG_CAN_KVASER_USB=m
# CONFIG_CAN_MCBA_USB is not set
CONFIG_CAN_PEAK_USB=m
# CONFIG_CAN_UCAN is not set
# end of CAN USB interfaces
# CONFIG_CAN_DEBUG_DEVICES is not set
CONFIG_FWNODE_MDIO=y
CONFIG_OF_MDIO=y
CONFIG_MDIO_BITBANG=m
CONFIG_MDIO_BCM_UNIMAC=m
CONFIG_MDIO_CAVIUM=m
CONFIG_MDIO_GPIO=m
CONFIG_MDIO_HISI_FEMAC=m
# CONFIG_MDIO_MVUSB is not set
# CONFIG_MDIO_OCTEON is not set
# CONFIG_MDIO_IPQ4019 is not set
CONFIG_MDIO_THUNDER=m
#
# MDIO Multiplexers
#
# CONFIG_MDIO_BUS_MUX_GPIO is not set
# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
#
# PCS device drivers
#
CONFIG_PCS_XPCS=m
# end of PCS device drivers
CONFIG_PPP=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=m
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOE=m
# CONFIG_PPPOE_HASH_BITS_1 is not set
# CONFIG_PPPOE_HASH_BITS_2 is not set
CONFIG_PPPOE_HASH_BITS_4=y
# CONFIG_PPPOE_HASH_BITS_8 is not set
CONFIG_PPPOE_HASH_BITS=4
CONFIG_PPTP=m
CONFIG_PPPOL2TP=m
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_SLIP=m
CONFIG_SLHC=m
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLIP_SMART=y
# CONFIG_SLIP_MODE_SLIP6 is not set
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_RTL8152=m
CONFIG_USB_LAN78XX=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_AX88179_178A=m
CONFIG_USB_NET_CDCETHER=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_NCM=m
# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
CONFIG_USB_NET_CDC_MBIM=m
CONFIG_USB_NET_DM9601=m
# CONFIG_USB_NET_SR9700 is not set
# CONFIG_USB_NET_SR9800 is not set
CONFIG_USB_NET_SMSC75XX=m
CONFIG_USB_NET_SMSC95XX=m
CONFIG_USB_NET_GL620A=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_PLUSB=m
CONFIG_USB_NET_MCS7830=m
CONFIG_USB_NET_RNDIS_HOST=m
CONFIG_USB_NET_CDC_SUBSET_ENABLE=m
CONFIG_USB_NET_CDC_SUBSET=m
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_KC2190=y
CONFIG_USB_NET_ZAURUS=m
CONFIG_USB_NET_CX82310_ETH=m
CONFIG_USB_NET_KALMIA=m
CONFIG_USB_NET_QMI_WWAN=m
CONFIG_USB_HSO=m
CONFIG_USB_NET_INT51X1=m
CONFIG_USB_IPHETH=m
CONFIG_USB_SIERRA_NET=m
CONFIG_USB_VL600=m
CONFIG_USB_NET_CH9200=m
# CONFIG_USB_NET_AQC111 is not set
CONFIG_USB_RTL8153_ECM=m
# CONFIG_WLAN is not set
CONFIG_WAN=y
CONFIG_HDLC=m
CONFIG_HDLC_RAW=m
# CONFIG_HDLC_RAW_ETH is not set
CONFIG_HDLC_CISCO=m
CONFIG_HDLC_FR=m
CONFIG_HDLC_PPP=m
#
# X.25/LAPB support is disabled
#
# CONFIG_FRAMER is not set
# CONFIG_PCI200SYN is not set
# CONFIG_WANXL is not set
# CONFIG_PC300TOO is not set
# CONFIG_FARSYNC is not set
CONFIG_IEEE802154_DRIVERS=m
CONFIG_IEEE802154_FAKELB=m
# CONFIG_IEEE802154_ATUSB is not set
# CONFIG_IEEE802154_HWSIM is not set
#
# Wireless WAN
#
CONFIG_WWAN=m
CONFIG_WWAN_DEBUGFS=y
CONFIG_WWAN_HWSIM=m
CONFIG_MHI_WWAN_CTRL=m
CONFIG_MHI_WWAN_MBIM=m
CONFIG_IOSM=m
CONFIG_MTK_T7XX=m
# end of Wireless WAN
# CONFIG_VMXNET3 is not set
CONFIG_USB4_NET=m
CONFIG_NETDEVSIM=m
CONFIG_NET_FAILOVER=m
#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_LEDS=y
CONFIG_INPUT_FF_MEMLESS=m
CONFIG_INPUT_SPARSEKMAP=m
# CONFIG_INPUT_MATRIXKMAP is not set
#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_KUNIT_TEST=m
#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5588 is not set
# CONFIG_KEYBOARD_ATKBD is not set
# CONFIG_KEYBOARD_QT1050 is not set
# CONFIG_KEYBOARD_QT1070 is not set
# CONFIG_KEYBOARD_QT2160 is not set
# CONFIG_KEYBOARD_DLINK_DIR685 is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
# CONFIG_KEYBOARD_TCA8418 is not set
# CONFIG_KEYBOARD_MATRIX is not set
# CONFIG_KEYBOARD_CHARLIEPLEX is not set
# CONFIG_KEYBOARD_LM8323 is not set
# CONFIG_KEYBOARD_LM8333 is not set
# CONFIG_KEYBOARD_MAX7359 is not set
# CONFIG_KEYBOARD_MPR121 is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_OPENCORES is not set
# CONFIG_KEYBOARD_SAMSUNG is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_OMAP4 is not set
# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_CAP11XX is not set
# CONFIG_KEYBOARD_BCM is not set
# CONFIG_KEYBOARD_CYPRESS_SF is not set
CONFIG_INPUT_MOUSE=y
# CONFIG_MOUSE_PS2 is not set
# CONFIG_MOUSE_SERIAL is not set
CONFIG_MOUSE_APPLETOUCH=m
CONFIG_MOUSE_BCM5974=m
CONFIG_MOUSE_CYAPA=m
CONFIG_MOUSE_ELAN_I2C=m
CONFIG_MOUSE_ELAN_I2C_I2C=y
CONFIG_MOUSE_ELAN_I2C_SMBUS=y
CONFIG_MOUSE_VSXXXAA=m
# CONFIG_MOUSE_GPIO is not set
CONFIG_MOUSE_SYNAPTICS_I2C=m
CONFIG_MOUSE_SYNAPTICS_USB=m
# CONFIG_INPUT_JOYSTICK is not set
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=m
CONFIG_TABLET_USB_AIPTEK=m
# CONFIG_TABLET_USB_HANWANG is not set
CONFIG_TABLET_USB_KBTAB=m
# CONFIG_TABLET_USB_PEGASUS is not set
CONFIG_TABLET_SERIAL_WACOM4=m
CONFIG_INPUT_TOUCHSCREEN=y
# CONFIG_TOUCHSCREEN_AD7879 is not set
# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_BU21029 is not set
# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP5 is not set
# CONFIG_TOUCHSCREEN_DYNAPRO is not set
# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
# CONFIG_TOUCHSCREEN_EETI is not set
# CONFIG_TOUCHSCREEN_EGALAX is not set
# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
# CONFIG_TOUCHSCREEN_EXC3000 is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set
# CONFIG_TOUCHSCREEN_HIDEEP is not set
# CONFIG_TOUCHSCREEN_HIMAX_HX852X is not set
# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set
# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set
# CONFIG_TOUCHSCREEN_HYNITRON_CST816X is not set
# CONFIG_TOUCHSCREEN_ILI210X is not set
# CONFIG_TOUCHSCREEN_ILITEK is not set
# CONFIG_TOUCHSCREEN_S6SY761 is not set
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_EKTF2127 is not set
# CONFIG_TOUCHSCREEN_ELAN is not set
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
CONFIG_TOUCHSCREEN_WACOM_I2C=m
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MMS114 is not set
# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
# CONFIG_TOUCHSCREEN_MSG2638 is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set
# CONFIG_TOUCHSCREEN_IMAGIS is not set
# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_PIXCIR is not set
# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
# CONFIG_TOUCHSCREEN_WM97XX is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
# CONFIG_TOUCHSCREEN_TSC2004 is not set
# CONFIG_TOUCHSCREEN_TSC2007 is not set
# CONFIG_TOUCHSCREEN_RM_TS is not set
# CONFIG_TOUCHSCREEN_SILEAD is not set
# CONFIG_TOUCHSCREEN_SIS_I2C is not set
# CONFIG_TOUCHSCREEN_ST1232 is not set
# CONFIG_TOUCHSCREEN_STMFTS is not set
# CONFIG_TOUCHSCREEN_SUR40 is not set
# CONFIG_TOUCHSCREEN_SX8654 is not set
# CONFIG_TOUCHSCREEN_TPS6507X is not set
# CONFIG_TOUCHSCREEN_ZET6223 is not set
# CONFIG_TOUCHSCREEN_ZFORCE is not set
# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
# CONFIG_TOUCHSCREEN_IQS5XX is not set
# CONFIG_TOUCHSCREEN_IQS7211 is not set
# CONFIG_TOUCHSCREEN_ZINITIX is not set
# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_AD714X is not set
# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
# CONFIG_INPUT_AW86927 is not set
# CONFIG_INPUT_BMA150 is not set
# CONFIG_INPUT_E3X0_BUTTON is not set
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_MMA8450 is not set
# CONFIG_INPUT_GPIO_BEEPER is not set
# CONFIG_INPUT_GPIO_DECODER is not set
# CONFIG_INPUT_GPIO_VIBRA is not set
CONFIG_INPUT_ATI_REMOTE2=m
CONFIG_INPUT_KEYSPAN_REMOTE=m
# CONFIG_INPUT_KXTJ9 is not set
CONFIG_INPUT_POWERMATE=m
CONFIG_INPUT_YEALINK=m
CONFIG_INPUT_CM109=m
CONFIG_INPUT_UINPUT=m
# CONFIG_INPUT_PCF8574 is not set
CONFIG_INPUT_PWM_BEEPER=m
# CONFIG_INPUT_PWM_VIBRA is not set
CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
# CONFIG_INPUT_DA7280_HAPTICS is not set
# CONFIG_INPUT_ADXL34X is not set
# CONFIG_INPUT_IMS_PCU is not set
# CONFIG_INPUT_IQS269A is not set
# CONFIG_INPUT_IQS626A is not set
# CONFIG_INPUT_IQS7222 is not set
# CONFIG_INPUT_CMA3000 is not set
# CONFIG_INPUT_DRV260X_HAPTICS is not set
# CONFIG_INPUT_DRV2665_HAPTICS is not set
# CONFIG_INPUT_DRV2667_HAPTICS is not set
CONFIG_RMI4_CORE=m
CONFIG_RMI4_I2C=m
CONFIG_RMI4_SMB=m
CONFIG_RMI4_F03=y
CONFIG_RMI4_F03_SERIO=m
CONFIG_RMI4_2D_SENSOR=y
CONFIG_RMI4_F11=y
CONFIG_RMI4_F12=y
# CONFIG_RMI4_F1A is not set
# CONFIG_RMI4_F21 is not set
CONFIG_RMI4_F30=y
CONFIG_RMI4_F34=y
CONFIG_RMI4_F3A=y
# CONFIG_RMI4_F54 is not set
CONFIG_RMI4_F55=y
#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
# CONFIG_SERIO_I8042 is not set
CONFIG_SERIO_SERPORT=m
# CONFIG_SERIO_PCIPS2 is not set
# CONFIG_SERIO_LIBPS2 is not set
CONFIG_SERIO_RAW=m
# CONFIG_SERIO_XILINX_XPS_PS2 is not set
CONFIG_SERIO_ALTERA_PS2=m
# CONFIG_SERIO_PS2MULT is not set
CONFIG_SERIO_ARC_PS2=m
# CONFIG_SERIO_APBPS2 is not set
# CONFIG_SERIO_GPIO_PS2 is not set
# CONFIG_USERIO is not set
# CONFIG_GAMEPORT is not set
# end of Hardware I/O ports
# end of Input device support
#
# Character devices
#
CONFIG_TTY=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_LEGACY_TIOCSTI=y
CONFIG_LDISC_AUTOLOAD=y
#
# Serial drivers
#
CONFIG_SERIAL_EARLYCON=y
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_16550A_VARIANTS is not set
# CONFIG_SERIAL_8250_FINTEK is not set
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_DMA=y
CONFIG_SERIAL_8250_PCILIB=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_EXAR=y
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_PCI1XXXX=y
CONFIG_SERIAL_8250_FSL=y
# CONFIG_SERIAL_8250_DW is not set
# CONFIG_SERIAL_8250_RT288X is not set
CONFIG_SERIAL_8250_PERICOM=y
CONFIG_SERIAL_OF_PLATFORM=m
#
# Non-8250 serial port support
#
CONFIG_SERIAL_UARTLITE=m
CONFIG_SERIAL_UARTLITE_NR_UARTS=1
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_CONSOLE_POLL=y
CONFIG_SERIAL_ICOM=m
CONFIG_SERIAL_JSM=m
# CONFIG_SERIAL_SIFIVE is not set
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_SC16IS7XX is not set
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
# CONFIG_SERIAL_ALTERA_UART is not set
# CONFIG_SERIAL_XILINX_PS_UART is not set
CONFIG_SERIAL_ARC=m
CONFIG_SERIAL_ARC_NR_PORTS=1
# CONFIG_SERIAL_RP2 is not set
# CONFIG_SERIAL_FSL_LPUART is not set
# CONFIG_SERIAL_FSL_LINFLEXUART is not set
# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
# CONFIG_SERIAL_SPRD is not set
# end of Serial drivers
CONFIG_SERIAL_MCTRL_GPIO=y
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
CONFIG_N_HDLC=m
# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set
# CONFIG_N_GSM is not set
CONFIG_NOZOMI=m
# CONFIG_NULL_TTY is not set
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_CONSOLE=y
# CONFIG_HVC_OLD_HVSI is not set
CONFIG_HVC_OPAL=y
CONFIG_HVC_RTAS=y
# CONFIG_HVC_UDBG is not set
CONFIG_HVCS=m
# CONFIG_SERIAL_DEV_BUS is not set
# CONFIG_TTY_PRINTK is not set
CONFIG_VIRTIO_CONSOLE=m
CONFIG_IBM_BSR=m
CONFIG_POWERNV_OP_PANEL=m
CONFIG_IPMI_HANDLER=m
CONFIG_IPMI_PLAT_DATA=y
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
CONFIG_IPMI_SSIF=m
CONFIG_IPMI_POWERNV=m
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_TIMERIOMEM=m
# CONFIG_HW_RANDOM_BA431 is not set
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_HW_RANDOM_PSERIES=m
CONFIG_HW_RANDOM_POWERNV=m
# CONFIG_HW_RANDOM_CCTRNG is not set
# CONFIG_HW_RANDOM_XIPHERA is not set
# CONFIG_APPLICOM is not set
CONFIG_DEVMEM=y
CONFIG_NVRAM=m
# CONFIG_DEVPORT is not set
CONFIG_HANGCHECK_TIMER=m
CONFIG_TCG_TPM=y
CONFIG_TCG_TPM2_HMAC=y
CONFIG_HW_RANDOM_TPM=y
CONFIG_TCG_TIS_CORE=y
CONFIG_TCG_TIS=y
CONFIG_TCG_TIS_I2C=y
CONFIG_TCG_TIS_I2C_CR50=m
# CONFIG_TCG_TIS_I2C_ATMEL is not set
# CONFIG_TCG_TIS_I2C_INFINEON is not set
CONFIG_TCG_TIS_I2C_NUVOTON=y
# CONFIG_TCG_ATMEL is not set
CONFIG_TCG_IBMVTPM=y
CONFIG_TCG_VTPM_PROXY=m
# CONFIG_TCG_TIS_ST33ZP24_I2C is not set
# CONFIG_XILLYBUS is not set
# CONFIG_XILLYUSB is not set
# end of Character devices
#
# I2C support
#
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=m
#
# Multiplexer I2C Chip support
#
# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
# CONFIG_I2C_MUX_GPIO is not set
# CONFIG_I2C_MUX_GPMUX is not set
# CONFIG_I2C_MUX_LTC4306 is not set
# CONFIG_I2C_MUX_PCA9541 is not set
# CONFIG_I2C_MUX_PCA954x is not set
# CONFIG_I2C_MUX_REG is not set
CONFIG_I2C_MUX_MLXCPLD=m
# CONFIG_I2C_MUX_MULE is not set
# end of Multiplexer I2C Chip support
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_ALGOBIT=m
CONFIG_I2C_ALGOPCA=m
#
# I2C Hardware Bus support
#
#
# PC SMBus host controller drivers
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
# CONFIG_I2C_AMD756 is not set
# CONFIG_I2C_AMD8111 is not set
# CONFIG_I2C_I801 is not set
# CONFIG_I2C_ISCH is not set
# CONFIG_I2C_PIIX4 is not set
CONFIG_I2C_NFORCE2=m
# CONFIG_I2C_NVIDIA_GPU is not set
# CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set
# CONFIG_I2C_SIS96X is not set
# CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set
#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
# CONFIG_I2C_CBUS_GPIO is not set
CONFIG_I2C_DESIGNWARE_CORE=m
CONFIG_I2C_DESIGNWARE_PLATFORM=m
# CONFIG_I2C_DESIGNWARE_PCI is not set
# CONFIG_I2C_EMEV2 is not set
# CONFIG_I2C_GPIO is not set
CONFIG_I2C_MPC=m
# CONFIG_I2C_OCORES is not set
CONFIG_I2C_PCA_PLATFORM=m
# CONFIG_I2C_RK3X is not set
CONFIG_I2C_SIMTEC=m
# CONFIG_I2C_XILINX is not set
#
# External I2C/SMBus adapter drivers
#
CONFIG_I2C_DIOLAN_U2C=m
# CONFIG_I2C_CP2615 is not set
# CONFIG_I2C_PCI1XXXX is not set
# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
# CONFIG_I2C_TAOS_EVM is not set
CONFIG_I2C_TINY_USB=m
#
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_OPAL=y
# CONFIG_I2C_VIRTIO is not set
# end of I2C Hardware Bus support
CONFIG_I2C_STUB=m
# CONFIG_I2C_SLAVE is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# end of I2C support
# CONFIG_I3C is not set
CONFIG_I3C_OR_I2C=y
# CONFIG_SPI is not set
# CONFIG_SPMI is not set
# CONFIG_HSI is not set
CONFIG_PPS=y
# CONFIG_PPS_DEBUG is not set
#
# PPS clients support
#
# CONFIG_PPS_CLIENT_KTIMER is not set
CONFIG_PPS_CLIENT_LDISC=m
CONFIG_PPS_CLIENT_GPIO=m
# CONFIG_PPS_GENERATOR is not set
#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK=y
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
CONFIG_DP83640_PHY=m
# CONFIG_PTP_1588_CLOCK_INES is not set
# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set
# CONFIG_PTP_1588_CLOCK_IDTCM is not set
# CONFIG_PTP_1588_CLOCK_FC3W is not set
CONFIG_PTP_1588_CLOCK_MOCK=m
# CONFIG_PTP_1588_CLOCK_OCP is not set
# CONFIG_PTP_NETC_V4_TIMER is not set
# end of PTP clock support
#
# DPLL device support
#
CONFIG_DPLL=y
# CONFIG_DPLL_REFCNT_TRACKER is not set
# CONFIG_ZL3073X_I2C is not set
# end of DPLL device support
# CONFIG_PINCTRL is not set
CONFIG_GPIOLIB_LEGACY=y
CONFIG_GPIOLIB=y
CONFIG_GPIOLIB_FASTPATH_LIMIT=512
CONFIG_OF_GPIO=y
CONFIG_GPIOLIB_IRQCHIP=y
# CONFIG_DEBUG_GPIO is not set
# CONFIG_GPIO_SYSFS is not set
CONFIG_GPIO_CDEV=y
CONFIG_GPIO_CDEV_V1=y
#
# Memory mapped GPIO drivers
#
# CONFIG_GPIO_74XX_MMIO is not set
# CONFIG_GPIO_ALTERA is not set
# CONFIG_GPIO_BY_PINCTRL is not set
# CONFIG_GPIO_CADENCE is not set
# CONFIG_GPIO_DWAPB is not set
# CONFIG_GPIO_EXAR is not set
# CONFIG_GPIO_FTGPIO010 is not set
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_GRGPIO is not set
# CONFIG_GPIO_HLWD is not set
# CONFIG_GPIO_MB86S7X is not set
# CONFIG_GPIO_POLARFIRE_SOC is not set
# CONFIG_GPIO_SIFIVE is not set
# CONFIG_GPIO_XILINX is not set
# CONFIG_GPIO_AMD_FCH is not set
# end of Memory mapped GPIO drivers
#
# I2C GPIO expanders
#
# CONFIG_GPIO_ADNP is not set
# CONFIG_GPIO_FXL6408 is not set
# CONFIG_GPIO_DS4520 is not set
# CONFIG_GPIO_GW_PLD is not set
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not set
CONFIG_GPIO_PCA953X=m
# CONFIG_GPIO_PCA953X_IRQ is not set
# CONFIG_GPIO_PCA9570 is not set
CONFIG_GPIO_PCF857X=m
# CONFIG_GPIO_TPIC2810 is not set
# end of I2C GPIO expanders
#
# MFD GPIO expanders
#
# end of MFD GPIO expanders
#
# PCI GPIO expanders
#
# CONFIG_GPIO_BT8XX is not set
# CONFIG_GPIO_PCI_IDIO_16 is not set
# CONFIG_GPIO_PCIE_IDIO_24 is not set
# CONFIG_GPIO_RDC321X is not set
# end of PCI GPIO expanders
#
# USB GPIO expanders
#
# CONFIG_GPIO_MPSSE is not set
# end of USB GPIO expanders
#
# Virtual GPIO drivers
#
# CONFIG_GPIO_AGGREGATOR is not set
# CONFIG_GPIO_LATCH is not set
# CONFIG_GPIO_LINE_MUX is not set
# CONFIG_GPIO_MOCKUP is not set
# CONFIG_GPIO_VIRTIO is not set
CONFIG_GPIO_SIM=m
# end of Virtual GPIO drivers
#
# GPIO Debugging utilities
#
# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set
# CONFIG_GPIO_VIRTUSER is not set
# end of GPIO Debugging utilities
# CONFIG_W1 is not set
CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_GPIO=y
# CONFIG_POWER_RESET_GPIO_RESTART is not set
# CONFIG_POWER_RESET_LTC2952 is not set
# CONFIG_POWER_RESET_RESTART is not set
# CONFIG_POWER_RESET_SYSCON is not set
# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
# CONFIG_NVMEM_REBOOT_MODE is not set
# CONFIG_POWER_RESET_QEMU_VIRT_CTRL is not set
# CONFIG_POWER_SEQUENCING is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
CONFIG_POWER_SUPPLY_HWMON=y
# CONFIG_IP5XXX_POWER is not set
# CONFIG_TEST_POWER is not set
# CONFIG_CHARGER_ADP5061 is not set
# CONFIG_BATTERY_CHAGALL is not set
# CONFIG_BATTERY_CW2015 is not set
# CONFIG_BATTERY_DS2780 is not set
# CONFIG_BATTERY_DS2781 is not set
# CONFIG_BATTERY_DS2782 is not set
# CONFIG_BATTERY_SAMSUNG_SDI is not set
# CONFIG_BATTERY_S2MU005 is not set
# CONFIG_BATTERY_SBS is not set
# CONFIG_CHARGER_SBS is not set
# CONFIG_MANAGER_SBS is not set
# CONFIG_BATTERY_BQ27XXX is not set
# CONFIG_BATTERY_MAX17042 is not set
# CONFIG_BATTERY_MAX1720X is not set
# CONFIG_CHARGER_MAX8903 is not set
# CONFIG_CHARGER_LP8727 is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_LT3651 is not set
# CONFIG_CHARGER_LTC4162L is not set
# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
# CONFIG_CHARGER_MAX77976 is not set
# CONFIG_CHARGER_MAX8971 is not set
# CONFIG_CHARGER_BQ2415X is not set
# CONFIG_CHARGER_BQ24257 is not set
# CONFIG_CHARGER_BQ24735 is not set
# CONFIG_CHARGER_BQ2515X is not set
# CONFIG_CHARGER_BQ25890 is not set
# CONFIG_CHARGER_BQ25980 is not set
# CONFIG_CHARGER_BQ256XX is not set
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
# CONFIG_BATTERY_GOLDFISH is not set
# CONFIG_BATTERY_RT5033 is not set
# CONFIG_CHARGER_RT9455 is not set
# CONFIG_CHARGER_RT9756 is not set
# CONFIG_FUEL_GAUGE_STC3117 is not set
# CONFIG_CHARGER_BD99954 is not set
# CONFIG_BATTERY_UG3105 is not set
# CONFIG_FUEL_GAUGE_MM8013 is not set
CONFIG_HWMON=y
CONFIG_HWMON_VID=m
# CONFIG_HWMON_DEBUG_CHIP is not set
#
# Native drivers
#
CONFIG_SENSORS_AD7414=m
CONFIG_SENSORS_AD7418=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1026=m
CONFIG_SENSORS_ADM1029=m
CONFIG_SENSORS_ADM1031=m
# CONFIG_SENSORS_ADM1177 is not set
CONFIG_SENSORS_ADM9240=m
CONFIG_SENSORS_ADT7X10=m
CONFIG_SENSORS_ADT7410=m
CONFIG_SENSORS_ADT7411=m
CONFIG_SENSORS_ADT7462=m
CONFIG_SENSORS_ADT7470=m
CONFIG_SENSORS_ADT7475=m
# CONFIG_SENSORS_AHT10 is not set
# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set
# CONFIG_SENSORS_AS370 is not set
CONFIG_SENSORS_ASC7621=m
# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set
# CONFIG_SENSORS_AXI_FAN_CONTROL is not set
CONFIG_SENSORS_ATXP1=m
# CONFIG_SENSORS_CHIPCAP2 is not set
# CONFIG_SENSORS_CORSAIR_CPRO is not set
# CONFIG_SENSORS_CORSAIR_PSU is not set
# CONFIG_SENSORS_DRIVETEMP is not set
CONFIG_SENSORS_DS620=m
CONFIG_SENSORS_DS1621=m
# CONFIG_SENSORS_I5K_AMB is not set
CONFIG_SENSORS_F75375S=m
# CONFIG_SENSORS_FTSTEUTATES is not set
# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set
CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_GL520SM=m
CONFIG_SENSORS_G760A=m
# CONFIG_SENSORS_G762 is not set
# CONFIG_SENSORS_GPIO_FAN is not set
# CONFIG_SENSORS_HIH6130 is not set
# CONFIG_SENSORS_HS3001 is not set
# CONFIG_SENSORS_HTU31 is not set
CONFIG_SENSORS_IBMAEM=m
CONFIG_SENSORS_IBMPEX=m
CONFIG_SENSORS_IBMPOWERNV=m
# CONFIG_SENSORS_ISL28022 is not set
CONFIG_SENSORS_JC42=m
# CONFIG_SENSORS_POWERZ is not set
# CONFIG_SENSORS_POWR1220 is not set
CONFIG_SENSORS_LINEAGE=m
# CONFIG_SENSORS_LTC2945 is not set
# CONFIG_SENSORS_LTC2947_I2C is not set
# CONFIG_SENSORS_LTC2990 is not set
# CONFIG_SENSORS_LTC2991 is not set
# CONFIG_SENSORS_LTC2992 is not set
CONFIG_SENSORS_LTC4151=m
CONFIG_SENSORS_LTC4215=m
# CONFIG_SENSORS_LTC4222 is not set
CONFIG_SENSORS_LTC4245=m
# CONFIG_SENSORS_LTC4260 is not set
CONFIG_SENSORS_LTC4261=m
# CONFIG_SENSORS_LTC4282 is not set
# CONFIG_SENSORS_MAX127 is not set
CONFIG_SENSORS_MAX16065=m
CONFIG_SENSORS_MAX1619=m
CONFIG_SENSORS_MAX1668=m
CONFIG_SENSORS_MAX197=m
# CONFIG_SENSORS_MAX31730 is not set
# CONFIG_SENSORS_MAX31760 is not set
# CONFIG_MAX31827 is not set
# CONFIG_SENSORS_MAX6620 is not set
# CONFIG_SENSORS_MAX6621 is not set
CONFIG_SENSORS_MAX6639=m
CONFIG_SENSORS_MAX6650=m
CONFIG_SENSORS_MAX6697=m
# CONFIG_SENSORS_MAX31790 is not set
# CONFIG_SENSORS_MC34VR500 is not set
CONFIG_SENSORS_MCP3021=m
# CONFIG_SENSORS_MCP9982 is not set
# CONFIG_SENSORS_TC654 is not set
# CONFIG_SENSORS_TPS23861 is not set
# CONFIG_SENSORS_MR75203 is not set
CONFIG_SENSORS_LM63=m
CONFIG_SENSORS_LM73=m
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m
CONFIG_SENSORS_LM85=m
CONFIG_SENSORS_LM87=m
CONFIG_SENSORS_LM90=m
CONFIG_SENSORS_LM92=m
CONFIG_SENSORS_LM93=m
CONFIG_SENSORS_LM95234=m
CONFIG_SENSORS_LM95241=m
CONFIG_SENSORS_LM95245=m
# CONFIG_SENSORS_NCT6775_I2C is not set
# CONFIG_SENSORS_NCT7363 is not set
# CONFIG_SENSORS_NCT7802 is not set
# CONFIG_SENSORS_NCT7904 is not set
# CONFIG_SENSORS_NPCM7XX is not set
# CONFIG_SENSORS_NZXT_KRAKEN2 is not set
# CONFIG_SENSORS_NZXT_KRAKEN3 is not set
# CONFIG_SENSORS_NZXT_SMART2 is not set
# CONFIG_SENSORS_OCC_P8_I2C is not set
CONFIG_SENSORS_PCF8591=m
CONFIG_PMBUS=m
CONFIG_SENSORS_PMBUS=m
# CONFIG_SENSORS_ACBEL_FSG032 is not set
# CONFIG_SENSORS_ADM1266 is not set
CONFIG_SENSORS_ADM1275=m
# CONFIG_SENSORS_ADP1050 is not set
# CONFIG_SENSORS_APS_379 is not set
# CONFIG_SENSORS_BEL_PFE is not set
# CONFIG_SENSORS_BPA_RS600 is not set
# CONFIG_SENSORS_CRPS is not set
# CONFIG_SENSORS_DELTA_AHE50DC_FAN is not set
# CONFIG_SENSORS_FSP_3Y is not set
# CONFIG_SENSORS_HAC300S is not set
# CONFIG_SENSORS_IBM_CFFPS is not set
# CONFIG_SENSORS_DPS920AB is not set
# CONFIG_SENSORS_INA233 is not set
# CONFIG_SENSORS_INSPUR_IPSPS is not set
# CONFIG_SENSORS_IR35221 is not set
# CONFIG_SENSORS_IR36021 is not set
# CONFIG_SENSORS_IR38064 is not set
# CONFIG_SENSORS_IRPS5401 is not set
# CONFIG_SENSORS_ISL68137 is not set
CONFIG_SENSORS_LM25066=m
# CONFIG_SENSORS_LT3074 is not set
# CONFIG_SENSORS_LT7182S is not set
CONFIG_SENSORS_LTC2978=m
# CONFIG_SENSORS_LTC3815 is not set
# CONFIG_SENSORS_LTC4286 is not set
# CONFIG_SENSORS_MAX15301 is not set
CONFIG_SENSORS_MAX16064=m
# CONFIG_SENSORS_MAX16601 is not set
# CONFIG_SENSORS_MAX17616 is not set
# CONFIG_SENSORS_MAX20730 is not set
# CONFIG_SENSORS_MAX20751 is not set
# CONFIG_SENSORS_MAX31785 is not set
CONFIG_SENSORS_MAX34440=m
CONFIG_SENSORS_MAX8688=m
# CONFIG_SENSORS_MP2856 is not set
# CONFIG_SENSORS_MP2869 is not set
# CONFIG_SENSORS_MP2888 is not set
# CONFIG_SENSORS_MP2891 is not set
# CONFIG_SENSORS_MP2925 is not set
# CONFIG_SENSORS_MP29502 is not set
# CONFIG_SENSORS_MP2975 is not set
# CONFIG_SENSORS_MP2993 is not set
# CONFIG_SENSORS_MP5023 is not set
# CONFIG_SENSORS_MP5920 is not set
# CONFIG_SENSORS_MP5926 is not set
# CONFIG_SENSORS_MP5990 is not set
# CONFIG_SENSORS_MP9941 is not set
# CONFIG_SENSORS_MP9945 is not set
# CONFIG_SENSORS_MPQ7932 is not set
# CONFIG_SENSORS_MPQ8785 is not set
# CONFIG_SENSORS_PIM4328 is not set
# CONFIG_SENSORS_PLI1209BC is not set
# CONFIG_SENSORS_PM6764TR is not set
# CONFIG_SENSORS_PXE1610 is not set
# CONFIG_SENSORS_Q54SJ108A2 is not set
# CONFIG_SENSORS_STEF48H28 is not set
# CONFIG_SENSORS_STPDDC60 is not set
# CONFIG_SENSORS_TDA38640 is not set
# CONFIG_SENSORS_TPS25990 is not set
# CONFIG_SENSORS_TPS40422 is not set
# CONFIG_SENSORS_TPS53679 is not set
# CONFIG_SENSORS_TPS546D24 is not set
CONFIG_SENSORS_UCD9000=m
CONFIG_SENSORS_UCD9200=m
# CONFIG_SENSORS_XDP710 is not set
# CONFIG_SENSORS_XDP720 is not set
# CONFIG_SENSORS_XDPE152 is not set
# CONFIG_SENSORS_XDPE1A2G7B is not set
# CONFIG_SENSORS_XDPE122 is not set
CONFIG_SENSORS_ZL6100=m
# CONFIG_SENSORS_PT5161L is not set
# CONFIG_SENSORS_PWM_FAN is not set
# CONFIG_SENSORS_SBTSI is not set
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
# CONFIG_SENSORS_SHT3x is not set
# CONFIG_SENSORS_SHT4x is not set
# CONFIG_SENSORS_SHTC1 is not set
CONFIG_SENSORS_SIS5595=m
CONFIG_SENSORS_EMC1403=m
# CONFIG_SENSORS_EMC2103 is not set
# CONFIG_SENSORS_EMC2305 is not set
CONFIG_SENSORS_EMC6W201=m
CONFIG_SENSORS_SMSC47M192=m
# CONFIG_SENSORS_STTS751 is not set
# CONFIG_SENSORS_ADC128D818 is not set
CONFIG_SENSORS_ADS7828=m
CONFIG_SENSORS_AMC6821=m
CONFIG_SENSORS_INA209=m
CONFIG_SENSORS_INA2XX=m
# CONFIG_SENSORS_INA238 is not set
# CONFIG_SENSORS_INA3221 is not set
# CONFIG_SENSORS_SPD5118 is not set
# CONFIG_SENSORS_TC74 is not set
CONFIG_SENSORS_THMC50=m
CONFIG_SENSORS_TMP102=m
# CONFIG_SENSORS_TMP103 is not set
# CONFIG_SENSORS_TMP108 is not set
CONFIG_SENSORS_TMP401=m
CONFIG_SENSORS_TMP421=m
# CONFIG_SENSORS_TMP464 is not set
# CONFIG_SENSORS_TMP513 is not set
# CONFIG_SENSORS_TSC1641 is not set
CONFIG_SENSORS_VIA686A=m
CONFIG_SENSORS_VT8231=m
# CONFIG_SENSORS_W83773G is not set
CONFIG_SENSORS_W83781D=m
CONFIG_SENSORS_W83791D=m
CONFIG_SENSORS_W83792D=m
CONFIG_SENSORS_W83793=m
CONFIG_SENSORS_W83795=m
# CONFIG_SENSORS_W83795_FANCTRL is not set
CONFIG_SENSORS_W83L785TS=m
CONFIG_SENSORS_W83L786NG=m
CONFIG_THERMAL=y
CONFIG_THERMAL_NETLINK=y
# CONFIG_THERMAL_STATISTICS is not set
# CONFIG_THERMAL_DEBUGFS is not set
# CONFIG_THERMAL_CORE_TESTING is not set
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
CONFIG_THERMAL_HWMON=y
# CONFIG_THERMAL_OF is not set
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
CONFIG_THERMAL_GOV_FAIR_SHARE=y
CONFIG_THERMAL_GOV_STEP_WISE=y
# CONFIG_THERMAL_GOV_BANG_BANG is not set
# CONFIG_THERMAL_GOV_USER_SPACE is not set
# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
# CONFIG_PCIE_THERMAL is not set
# CONFIG_THERMAL_EMULATION is not set
# CONFIG_THERMAL_MMIO is not set
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
CONFIG_WATCHDOG_OPEN_TIMEOUT=0
CONFIG_WATCHDOG_SYSFS=y
# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set
#
# Watchdog Pretimeout Governors
#
# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=m
# CONFIG_GPIO_WATCHDOG is not set
# CONFIG_XILINX_WATCHDOG is not set
# CONFIG_ZIIRAVE_WATCHDOG is not set
# CONFIG_CADENCE_WATCHDOG is not set
# CONFIG_DW_WATCHDOG is not set
# CONFIG_MAX63XX_WATCHDOG is not set
# CONFIG_ALIM7101_WDT is not set
CONFIG_I6300ESB_WDT=m
# CONFIG_MEN_A21_WDT is not set
CONFIG_PSERIES_WDT=m
CONFIG_WATCHDOG_RTAS=m
#
# PCI-based Watchdog Cards
#
# CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set
#
# USB-based Watchdog Cards
#
# CONFIG_USBPCWATCHDOG is not set
CONFIG_SSB_POSSIBLE=y
# CONFIG_SSB is not set
CONFIG_BCMA_POSSIBLE=y
CONFIG_BCMA=m
CONFIG_BCMA_HOST_PCI_POSSIBLE=y
CONFIG_BCMA_HOST_PCI=y
# CONFIG_BCMA_HOST_SOC is not set
CONFIG_BCMA_DRIVER_PCI=y
CONFIG_BCMA_DRIVER_GMAC_CMN=y
CONFIG_BCMA_DRIVER_GPIO=y
# CONFIG_BCMA_DEBUG is not set
#
# Multifunction device drivers
#
CONFIG_MFD_CORE=m
# CONFIG_MFD_ADP5585 is not set
# CONFIG_MFD_ACT8945A is not set
# CONFIG_MFD_AS3711 is not set
# CONFIG_MFD_SMPRO is not set
# CONFIG_MFD_AS3722 is not set
# CONFIG_PMIC_ADP5520 is not set
# CONFIG_MFD_AAT2870_CORE is not set
# CONFIG_MFD_ATMEL_FLEXCOM is not set
# CONFIG_MFD_ATMEL_HLCDC is not set
# CONFIG_MFD_BCM590XX is not set
# CONFIG_MFD_BD9571MWV is not set
# CONFIG_MFD_AXP20X_I2C is not set
# CONFIG_MFD_CS40L50_I2C is not set
# CONFIG_MFD_CS42L43_I2C is not set
# CONFIG_MFD_LOCHNAGAR is not set
# CONFIG_MFD_MADERA is not set
# CONFIG_PMIC_DA903X is not set
# CONFIG_MFD_DA9052_I2C is not set
# CONFIG_MFD_DA9055 is not set
# CONFIG_MFD_DA9062 is not set
# CONFIG_MFD_DA9063 is not set
# CONFIG_MFD_DA9150 is not set
# CONFIG_MFD_DLN2 is not set
# CONFIG_MFD_GATEWORKS_GSC is not set
# CONFIG_MFD_MC13XXX_I2C is not set
# CONFIG_MFD_MP2629 is not set
# CONFIG_MFD_PF1550 is not set
# CONFIG_MFD_HI6421_PMIC is not set
# CONFIG_LPC_ICH is not set
# CONFIG_LPC_SCH is not set
# CONFIG_MFD_IQS62X is not set
# CONFIG_MFD_JANZ_CMODIO is not set
# CONFIG_MFD_KEMPLD is not set
# CONFIG_MFD_88PM800 is not set
# CONFIG_MFD_88PM805 is not set
# CONFIG_MFD_88PM860X is not set
# CONFIG_MFD_88PM886_PMIC is not set
# CONFIG_MFD_MAX5970 is not set
# CONFIG_MFD_MAX14577 is not set
# CONFIG_MFD_MAX77541 is not set
# CONFIG_MFD_MAX77620 is not set
# CONFIG_MFD_MAX77650 is not set
# CONFIG_MFD_MAX77686 is not set
# CONFIG_MFD_MAX77693 is not set
# CONFIG_MFD_MAX77705 is not set
# CONFIG_MFD_MAX77714 is not set
# CONFIG_MFD_MAX77759 is not set
# CONFIG_MFD_MAX77843 is not set
# CONFIG_MFD_MAX8907 is not set
# CONFIG_MFD_MAX8925 is not set
# CONFIG_MFD_MAX8997 is not set
# CONFIG_MFD_MAX8998 is not set
# CONFIG_MFD_MT6360 is not set
# CONFIG_MFD_MT6370 is not set
# CONFIG_MFD_MT6397 is not set
# CONFIG_MFD_MENF21BMC is not set
# CONFIG_MFD_NCT6694 is not set
# CONFIG_MFD_VIPERBOARD is not set
# CONFIG_MFD_NTXEC is not set
# CONFIG_MFD_RETU is not set
# CONFIG_MFD_SY7636A is not set
# CONFIG_MFD_RDC321X is not set
# CONFIG_MFD_RT4831 is not set
# CONFIG_MFD_RT5033 is not set
# CONFIG_MFD_RT5120 is not set
# CONFIG_MFD_RC5T583 is not set
# CONFIG_MFD_RK8XX_I2C is not set
# CONFIG_MFD_RN5T618 is not set
# CONFIG_MFD_SEC_I2C is not set
# CONFIG_MFD_SI476X_CORE is not set
CONFIG_MFD_SM501=m
CONFIG_MFD_SM501_GPIO=y
# CONFIG_MFD_SKY81452 is not set
# CONFIG_MFD_STMPE is not set
# CONFIG_MFD_SYSCON is not set
# CONFIG_MFD_LP3943 is not set
# CONFIG_MFD_LP8788 is not set
# CONFIG_MFD_TI_LMU is not set
# CONFIG_MFD_BQ257XX is not set
# CONFIG_MFD_PALMAS is not set
# CONFIG_TPS6105X is not set
# CONFIG_TPS65010 is not set
# CONFIG_TPS6507X is not set
# CONFIG_MFD_TPS65086 is not set
# CONFIG_MFD_TPS65090 is not set
# CONFIG_MFD_TPS65217 is not set
# CONFIG_MFD_TI_LP873X is not set
# CONFIG_MFD_TI_LP87565 is not set
# CONFIG_MFD_TPS65218 is not set
# CONFIG_MFD_TPS65219 is not set
# CONFIG_MFD_TPS6586X is not set
# CONFIG_MFD_TPS65910 is not set
# CONFIG_MFD_TPS65912_I2C is not set
# CONFIG_MFD_TPS6594_I2C is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_TWL6040_CORE is not set
# CONFIG_MFD_LM3533 is not set
# CONFIG_MFD_TC3589X is not set
# CONFIG_MFD_TQMX86 is not set
CONFIG_MFD_VX855=m
# CONFIG_MFD_ARIZONA_I2C is not set
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X_I2C is not set
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_WM8994 is not set
# CONFIG_MFD_ROHM_BD718XX is not set
# CONFIG_MFD_ROHM_BD71828 is not set
# CONFIG_MFD_ROHM_BD957XMUF is not set
# CONFIG_MFD_ROHM_BD96801 is not set
# CONFIG_MFD_STPMIC1 is not set
# CONFIG_MFD_STMFX is not set
# CONFIG_MFD_ATC260X_I2C is not set
# CONFIG_MFD_QCOM_PM8008 is not set
# CONFIG_MFD_RSMU_I2C is not set
# CONFIG_MFD_MAX7360 is not set
# end of Multifunction device drivers
# CONFIG_REGULATOR is not set
# CONFIG_RC_CORE is not set
CONFIG_CEC_CORE=m
CONFIG_CEC_NOTIFIER=y
#
# CEC support
#
CONFIG_MEDIA_CEC_SUPPORT=y
# CONFIG_CEC_CH7322 is not set
# CONFIG_CEC_NXP_TDA9950 is not set
# CONFIG_CEC_GPIO is not set
# CONFIG_USB_EXTRON_DA_HD_4K_PLUS_CEC is not set
CONFIG_USB_PULSE8_CEC=m
CONFIG_USB_RAINSHADOW_CEC=m
# end of CEC support
CONFIG_MEDIA_SUPPORT=m
CONFIG_MEDIA_SUPPORT_FILTER=y
CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
#
# Media device types
#
CONFIG_MEDIA_CAMERA_SUPPORT=y
# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
# CONFIG_MEDIA_RADIO_SUPPORT is not set
# CONFIG_MEDIA_SDR_SUPPORT is not set
# CONFIG_MEDIA_PLATFORM_SUPPORT is not set
# CONFIG_MEDIA_TEST_SUPPORT is not set
# end of Media device types
CONFIG_VIDEO_DEV=m
CONFIG_MEDIA_CONTROLLER=y
#
# Video4Linux options
#
CONFIG_VIDEO_V4L2_I2C=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
CONFIG_V4L2_FWNODE=m
CONFIG_V4L2_ASYNC=m
# end of Video4Linux options
#
# Media controller options
#
# end of Media controller options
#
# Media drivers
#
#
# Drivers filtered as selected at 'Filter media drivers'
#
#
# Media drivers
#
CONFIG_MEDIA_USB_SUPPORT=y
#
# Webcam devices
#
CONFIG_USB_GSPCA=m
CONFIG_USB_GSPCA_BENQ=m
CONFIG_USB_GSPCA_CONEX=m
CONFIG_USB_GSPCA_CPIA1=m
# CONFIG_USB_GSPCA_DTCS033 is not set
CONFIG_USB_GSPCA_ETOMS=m
CONFIG_USB_GSPCA_FINEPIX=m
CONFIG_USB_GSPCA_JEILINJ=m
CONFIG_USB_GSPCA_JL2005BCD=m
# CONFIG_USB_GSPCA_KINECT is not set
CONFIG_USB_GSPCA_KONICA=m
CONFIG_USB_GSPCA_MARS=m
CONFIG_USB_GSPCA_MR97310A=m
CONFIG_USB_GSPCA_NW80X=m
CONFIG_USB_GSPCA_OV519=m
CONFIG_USB_GSPCA_OV534=m
CONFIG_USB_GSPCA_OV534_9=m
CONFIG_USB_GSPCA_PAC207=m
CONFIG_USB_GSPCA_PAC7302=m
CONFIG_USB_GSPCA_PAC7311=m
CONFIG_USB_GSPCA_SE401=m
CONFIG_USB_GSPCA_SN9C2028=m
CONFIG_USB_GSPCA_SN9C20X=m
CONFIG_USB_GSPCA_SONIXB=m
CONFIG_USB_GSPCA_SONIXJ=m
CONFIG_USB_GSPCA_SPCA1528=m
CONFIG_USB_GSPCA_SPCA500=m
CONFIG_USB_GSPCA_SPCA501=m
CONFIG_USB_GSPCA_SPCA505=m
CONFIG_USB_GSPCA_SPCA506=m
CONFIG_USB_GSPCA_SPCA508=m
CONFIG_USB_GSPCA_SPCA561=m
CONFIG_USB_GSPCA_SQ905=m
CONFIG_USB_GSPCA_SQ905C=m
CONFIG_USB_GSPCA_SQ930X=m
CONFIG_USB_GSPCA_STK014=m
# CONFIG_USB_GSPCA_STK1135 is not set
CONFIG_USB_GSPCA_STV0680=m
CONFIG_USB_GSPCA_SUNPLUS=m
CONFIG_USB_GSPCA_T613=m
CONFIG_USB_GSPCA_TOPRO=m
# CONFIG_USB_GSPCA_TOUPTEK is not set
CONFIG_USB_GSPCA_TV8532=m
CONFIG_USB_GSPCA_VC032X=m
CONFIG_USB_GSPCA_VICAM=m
CONFIG_USB_GSPCA_XIRLINK_CIT=m
CONFIG_USB_GSPCA_ZC3XX=m
CONFIG_USB_GL860=m
CONFIG_USB_M5602=m
CONFIG_USB_STV06XX=m
CONFIG_USB_PWC=m
# CONFIG_USB_PWC_DEBUG is not set
CONFIG_USB_PWC_INPUT_EVDEV=y
CONFIG_USB_S2255=m
# CONFIG_VIDEO_USBTV is not set
CONFIG_USB_VIDEO_CLASS=m
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
#
# Webcam, TV (analog/digital) USB devices
#
# CONFIG_VIDEO_EM28XX is not set
CONFIG_MEDIA_PCI_SUPPORT=y
#
# Media capture support
#
# CONFIG_VIDEO_SOLO6X10 is not set
# CONFIG_VIDEO_TW5864 is not set
# CONFIG_VIDEO_TW68 is not set
# CONFIG_VIDEO_TW686X is not set
# CONFIG_VIDEO_ZORAN is not set
CONFIG_UVC_COMMON=m
CONFIG_VIDEOBUF2_CORE=m
CONFIG_VIDEOBUF2_V4L2=m
CONFIG_VIDEOBUF2_MEMOPS=m
CONFIG_VIDEOBUF2_VMALLOC=m
# end of Media drivers
#
# Media ancillary drivers
#
CONFIG_VIDEO_CAMERA_SENSOR=y
# CONFIG_VIDEO_ALVIUM_CSI2 is not set
# CONFIG_VIDEO_AR0521 is not set
# CONFIG_VIDEO_GC0308 is not set
# CONFIG_VIDEO_GC0310 is not set
# CONFIG_VIDEO_GC05A2 is not set
# CONFIG_VIDEO_GC08A3 is not set
# CONFIG_VIDEO_GC2145 is not set
# CONFIG_VIDEO_HI556 is not set
# CONFIG_VIDEO_HI846 is not set
# CONFIG_VIDEO_HI847 is not set
# CONFIG_VIDEO_IMX111 is not set
# CONFIG_VIDEO_IMX208 is not set
# CONFIG_VIDEO_IMX214 is not set
# CONFIG_VIDEO_IMX219 is not set
# CONFIG_VIDEO_IMX258 is not set
# CONFIG_VIDEO_IMX274 is not set
# CONFIG_VIDEO_IMX283 is not set
# CONFIG_VIDEO_IMX290 is not set
# CONFIG_VIDEO_IMX296 is not set
# CONFIG_VIDEO_IMX319 is not set
# CONFIG_VIDEO_IMX334 is not set
# CONFIG_VIDEO_IMX335 is not set
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
# CONFIG_VIDEO_MT9M001 is not set
# CONFIG_VIDEO_MT9M111 is not set
# CONFIG_VIDEO_MT9M114 is not set
# CONFIG_VIDEO_MT9P031 is not set
# CONFIG_VIDEO_MT9T112 is not set
# CONFIG_VIDEO_MT9V011 is not set
# CONFIG_VIDEO_MT9V032 is not set
# CONFIG_VIDEO_MT9V111 is not set
# CONFIG_VIDEO_OG01A1B is not set
# CONFIG_VIDEO_OG0VE1B is not set
# CONFIG_VIDEO_OS05B10 is not set
# CONFIG_VIDEO_OV01A10 is not set
# CONFIG_VIDEO_OV02A10 is not set
# CONFIG_VIDEO_OV02E10 is not set
# CONFIG_VIDEO_OV02C10 is not set
# CONFIG_VIDEO_OV08D10 is not set
# CONFIG_VIDEO_OV08X40 is not set
# CONFIG_VIDEO_OV13858 is not set
# CONFIG_VIDEO_OV13B10 is not set
# CONFIG_VIDEO_OV2640 is not set
# CONFIG_VIDEO_OV2659 is not set
# CONFIG_VIDEO_OV2680 is not set
# CONFIG_VIDEO_OV2685 is not set
# CONFIG_VIDEO_OV2732 is not set
# CONFIG_VIDEO_OV2735 is not set
# CONFIG_VIDEO_OV4689 is not set
# CONFIG_VIDEO_OV5640 is not set
# CONFIG_VIDEO_OV5645 is not set
# CONFIG_VIDEO_OV5647 is not set
# CONFIG_VIDEO_OV5648 is not set
# CONFIG_VIDEO_OV5670 is not set
# CONFIG_VIDEO_OV5675 is not set
# CONFIG_VIDEO_OV5693 is not set
# CONFIG_VIDEO_OV5695 is not set
# CONFIG_VIDEO_OV6211 is not set
# CONFIG_VIDEO_OV64A40 is not set
# CONFIG_VIDEO_OV7251 is not set
# CONFIG_VIDEO_OV7640 is not set
# CONFIG_VIDEO_OV7670 is not set
# CONFIG_VIDEO_OV772X is not set
# CONFIG_VIDEO_OV7740 is not set
# CONFIG_VIDEO_OV8856 is not set
# CONFIG_VIDEO_OV8858 is not set
# CONFIG_VIDEO_OV8865 is not set
# CONFIG_VIDEO_OV9282 is not set
# CONFIG_VIDEO_OV9640 is not set
# CONFIG_VIDEO_OV9650 is not set
# CONFIG_VIDEO_RDACM20 is not set
# CONFIG_VIDEO_RDACM21 is not set
# CONFIG_VIDEO_RJ54N1 is not set
# CONFIG_VIDEO_S5K3M5 is not set
# CONFIG_VIDEO_S5K5BAF is not set
# CONFIG_VIDEO_S5K6A3 is not set
# CONFIG_VIDEO_S5KJN1 is not set
# CONFIG_VIDEO_VD55G1 is not set
# CONFIG_VIDEO_VD56G3 is not set
# CONFIG_VIDEO_VGXY61 is not set
# CONFIG_VIDEO_CCS is not set
# CONFIG_VIDEO_ET8EK8 is not set
#
# Camera ISPs
#
# CONFIG_VIDEO_THP7312 is not set
# end of Camera ISPs
CONFIG_VIDEO_CAMERA_LENS=y
# CONFIG_VIDEO_AD5820 is not set
# CONFIG_VIDEO_AK7375 is not set
# CONFIG_VIDEO_DW9714 is not set
# CONFIG_VIDEO_DW9719 is not set
# CONFIG_VIDEO_DW9768 is not set
# CONFIG_VIDEO_DW9807_VCM is not set
#
# Flash devices
#
# CONFIG_VIDEO_ADP1653 is not set
# CONFIG_VIDEO_LM3560 is not set
# CONFIG_VIDEO_LM3646 is not set
# end of Flash devices
#
# Audio decoders, processors and mixers
#
CONFIG_VIDEO_CS3308=m
# CONFIG_VIDEO_CS5345 is not set
# CONFIG_VIDEO_CS53L32A is not set
# CONFIG_VIDEO_MSP3400 is not set
# CONFIG_VIDEO_SONY_BTF_MPX is not set
# CONFIG_VIDEO_TDA7432 is not set
# CONFIG_VIDEO_TDA9840 is not set
# CONFIG_VIDEO_TEA6415C is not set
# CONFIG_VIDEO_TEA6420 is not set
# CONFIG_VIDEO_TLV320AIC23B is not set
# CONFIG_VIDEO_TVAUDIO is not set
# CONFIG_VIDEO_UDA1342 is not set
# CONFIG_VIDEO_VP27SMPX is not set
# CONFIG_VIDEO_WM8739 is not set
# CONFIG_VIDEO_WM8775 is not set
# end of Audio decoders, processors and mixers
#
# RDS decoders
#
CONFIG_VIDEO_SAA6588=m
# end of RDS decoders
#
# Video decoders
#
# CONFIG_VIDEO_ADV7180 is not set
# CONFIG_VIDEO_ADV7183 is not set
# CONFIG_VIDEO_ADV748X is not set
# CONFIG_VIDEO_ADV7604 is not set
# CONFIG_VIDEO_ADV7842 is not set
# CONFIG_VIDEO_BT819 is not set
# CONFIG_VIDEO_BT856 is not set
# CONFIG_VIDEO_BT866 is not set
# CONFIG_VIDEO_ISL7998X is not set
# CONFIG_VIDEO_KS0127 is not set
# CONFIG_VIDEO_MAX9286 is not set
# CONFIG_VIDEO_ML86V7667 is not set
# CONFIG_VIDEO_SAA7110 is not set
# CONFIG_VIDEO_SAA711X is not set
# CONFIG_VIDEO_TC358743 is not set
# CONFIG_VIDEO_TC358746 is not set
# CONFIG_VIDEO_TVP514X is not set
# CONFIG_VIDEO_TVP5150 is not set
# CONFIG_VIDEO_TVP7002 is not set
# CONFIG_VIDEO_TW2804 is not set
# CONFIG_VIDEO_TW9900 is not set
# CONFIG_VIDEO_TW9903 is not set
# CONFIG_VIDEO_TW9906 is not set
# CONFIG_VIDEO_TW9910 is not set
# CONFIG_VIDEO_VPX3220 is not set
#
# Video and audio decoders
#
# CONFIG_VIDEO_SAA717X is not set
# CONFIG_VIDEO_CX25840 is not set
# end of Video decoders
#
# Video encoders
#
# CONFIG_VIDEO_ADV7170 is not set
# CONFIG_VIDEO_ADV7175 is not set
# CONFIG_VIDEO_ADV7343 is not set
# CONFIG_VIDEO_ADV7393 is not set
# CONFIG_VIDEO_ADV7511 is not set
# CONFIG_VIDEO_AK881X is not set
# CONFIG_VIDEO_SAA7127 is not set
# CONFIG_VIDEO_SAA7185 is not set
# CONFIG_VIDEO_THS8200 is not set
# end of Video encoders
#
# Video improvement chips
#
# CONFIG_VIDEO_UPD64031A is not set
# CONFIG_VIDEO_UPD64083 is not set
# end of Video improvement chips
#
# Audio/Video compression chips
#
CONFIG_VIDEO_SAA6752HS=m
# end of Audio/Video compression chips
#
# SDR tuner chips
#
# end of SDR tuner chips
#
# Miscellaneous helper chips
#
# CONFIG_VIDEO_I2C is not set
# CONFIG_VIDEO_M52790 is not set
# CONFIG_VIDEO_ST_MIPID02 is not set
# CONFIG_VIDEO_THS7303 is not set
# end of Miscellaneous helper chips
#
# Video serializers and deserializers
#
# CONFIG_VIDEO_DS90UB913 is not set
# CONFIG_VIDEO_DS90UB953 is not set
# CONFIG_VIDEO_DS90UB960 is not set
# CONFIG_VIDEO_MAX96714 is not set
# CONFIG_VIDEO_MAX96717 is not set
# end of Video serializers and deserializers
# end of Media ancillary drivers
#
# Graphics support
#
CONFIG_APERTURE_HELPERS=y
CONFIG_VIDEO=y
# CONFIG_AUXDISPLAY is not set
# CONFIG_AGP is not set
CONFIG_GPU_BUDDY=y
CONFIG_GPU_BUDDY_KUNIT_TEST=m
CONFIG_DRM=y
#
# DRM debugging options
#
# CONFIG_DRM_WERROR is not set
# CONFIG_DRM_DEBUG_MM is not set
CONFIG_DRM_KUNIT_TEST_HELPERS=m
CONFIG_DRM_KUNIT_TEST=m
CONFIG_DRM_SCHED_KUNIT_TEST=m
CONFIG_DRM_EXPORT_FOR_TESTS=y
# end of DRM debugging options
CONFIG_DRM_KMS_HELPER=y
# CONFIG_DRM_PANIC is not set
# CONFIG_DRM_RAS is not set
# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
CONFIG_DRM_CLIENT=y
CONFIG_DRM_CLIENT_LIB=y
CONFIG_DRM_CLIENT_SELECTION=y
CONFIG_DRM_CLIENT_SETUP=y
#
# Supported DRM clients
#
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_DRM_FBDEV_OVERALLOC=100
# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
# CONFIG_DRM_CLIENT_LOG is not set
CONFIG_DRM_CLIENT_DEFAULT_FBDEV=y
CONFIG_DRM_CLIENT_DEFAULT="fbdev"
# end of Supported DRM clients
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_DISPLAY_HELPER=m
CONFIG_DRM_BRIDGE_CONNECTOR=y
# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set
# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set
CONFIG_DRM_DISPLAY_DP_HELPER=y
CONFIG_DRM_DISPLAY_DSC_HELPER=y
CONFIG_DRM_DISPLAY_HDCP_HELPER=y
CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER=y
CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER=y
CONFIG_DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER=y
CONFIG_DRM_DISPLAY_HDMI_HELPER=y
CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y
CONFIG_DRM_TTM=m
CONFIG_DRM_EXEC=m
CONFIG_DRM_GPUVM=m
CONFIG_DRM_BUDDY=m
CONFIG_DRM_TTM_HELPER=m
CONFIG_DRM_GEM_SHMEM_HELPER=y
CONFIG_DRM_SUBALLOC_HELPER=m
CONFIG_DRM_SCHED=m
CONFIG_DRM_PANEL_BACKLIGHT_QUIRKS=m
CONFIG_DRM_AMDGPU=m
# CONFIG_DRM_AMDGPU_SI is not set
# CONFIG_DRM_AMDGPU_CIK is not set
CONFIG_DRM_AMDGPU_USERPTR=y
# CONFIG_DRM_AMDGPU_WERROR is not set
#
# ACP (Audio CoProcessor) Configuration
#
CONFIG_DRM_AMD_ACP=y
# end of ACP (Audio CoProcessor) Configuration
#
# Display Engine Configuration
#
CONFIG_DRM_AMD_DC=y
CONFIG_DRM_AMD_DC_FP=y
# CONFIG_DEBUG_KERNEL_DC is not set
# CONFIG_DRM_AMD_SECURE_DISPLAY is not set
# end of Display Engine Configuration
CONFIG_HSA_AMD=y
CONFIG_HSA_AMD_SVM=y
CONFIG_HSA_AMD_P2P=y
#
# ARM devices
#
# CONFIG_DRM_KOMEDA is not set
# end of ARM devices
CONFIG_DRM_AST=m
CONFIG_DRM_BRIDGE=y
CONFIG_DRM_PANEL_BRIDGE=y
CONFIG_DRM_AUX_HPD_BRIDGE=m
#
# Display Interface Bridges
#
# CONFIG_DRM_CHIPONE_ICN6211 is not set
# CONFIG_DRM_CHRONTEL_CH7033 is not set
# CONFIG_DRM_DISPLAY_CONNECTOR is not set
# CONFIG_DRM_I2C_NXP_TDA998X is not set
# CONFIG_DRM_ITE_IT6263 is not set
# CONFIG_DRM_ITE_IT6505 is not set
# CONFIG_DRM_LONTIUM_LT8912B is not set
# CONFIG_DRM_LONTIUM_LT9211 is not set
# CONFIG_DRM_LONTIUM_LT9611 is not set
# CONFIG_DRM_LONTIUM_LT9611UXC is not set
# CONFIG_DRM_LONTIUM_LT8713SX is not set
# CONFIG_DRM_ITE_IT66121 is not set
# CONFIG_DRM_LVDS_CODEC is not set
# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
# CONFIG_DRM_NWL_MIPI_DSI is not set
# CONFIG_DRM_NXP_PTN3460 is not set
# CONFIG_DRM_PARADE_PS8622 is not set
# CONFIG_DRM_PARADE_PS8640 is not set
# CONFIG_DRM_SAMSUNG_DSIM is not set
# CONFIG_DRM_SIL_SII8620 is not set
# CONFIG_DRM_SII902X is not set
# CONFIG_DRM_SII9234 is not set
# CONFIG_DRM_SIMPLE_BRIDGE is not set
# CONFIG_DRM_THINE_THC63LVD1024 is not set
# CONFIG_DRM_TOSHIBA_TC358762 is not set
# CONFIG_DRM_TOSHIBA_TC358764 is not set
# CONFIG_DRM_TOSHIBA_TC358767 is not set
# CONFIG_DRM_TOSHIBA_TC358768 is not set
# CONFIG_DRM_TOSHIBA_TC358775 is not set
# CONFIG_DRM_TI_DLPC3433 is not set
# CONFIG_DRM_TI_TDP158 is not set
# CONFIG_DRM_TI_TFP410 is not set
# CONFIG_DRM_TI_SN65DSI83 is not set
# CONFIG_DRM_TI_SN65DSI86 is not set
# CONFIG_DRM_TI_TPD12S015 is not set
# CONFIG_DRM_WAVESHARE_BRIDGE is not set
# CONFIG_DRM_ANALOGIX_ANX6345 is not set
# CONFIG_DRM_ANALOGIX_ANX78XX is not set
# CONFIG_DRM_ANALOGIX_ANX7625 is not set
# CONFIG_DRM_I2C_ADV7511 is not set
# CONFIG_DRM_CDNS_DSI is not set
# CONFIG_DRM_CDNS_MHDP8546 is not set
# end of Display Interface Bridges
# CONFIG_DRM_ETNAVIV is not set
CONFIG_DRM_GUD=m
# CONFIG_DRM_HISI_HIBMC is not set
# CONFIG_DRM_LOGICVC is not set
CONFIG_DRM_MGAG200=m
CONFIG_DRM_NOUVEAU=m
CONFIG_NOUVEAU_DEBUG=5
CONFIG_NOUVEAU_DEBUG_DEFAULT=3
# CONFIG_NOUVEAU_DEBUG_MMU is not set
# CONFIG_NOUVEAU_DEBUG_PUSH is not set
CONFIG_DRM_NOUVEAU_BACKLIGHT=y
CONFIG_DRM_NOUVEAU_CH7006=m
CONFIG_DRM_NOUVEAU_SIL164=m
CONFIG_DRM_PANEL=y
#
# Display Panels
#
# CONFIG_DRM_PANEL_LVDS is not set
# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set
# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E8FC0 is not set
# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set
# CONFIG_DRM_PANEL_EDP is not set
# CONFIG_DRM_PANEL_SIMPLE is not set
# end of Display Panels
CONFIG_DRM_QXL=m
CONFIG_DRM_RADEON=m
CONFIG_DRM_RADEON_USERPTR=y
# CONFIG_DRM_ST7571 is not set
# CONFIG_DRM_SSD130X is not set
#
# Drivers for system framebuffers
#
CONFIG_DRM_SYSFB_HELPER=y
# CONFIG_DRM_OFDRM is not set
CONFIG_DRM_SIMPLEDRM=y
# end of Drivers for system framebuffers
# CONFIG_DRM_ARCPGU is not set
CONFIG_DRM_BOCHS=m
CONFIG_DRM_CIRRUS_QEMU=m
CONFIG_DRM_GM12U320=m
CONFIG_DRM_UDL=m
# CONFIG_DRM_VGEM is not set
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_DRM_VIRTIO_GPU_KMS=y
CONFIG_DRM_VKMS=m
CONFIG_DRM_VKMS_KUNIT_TEST=m
# CONFIG_DRM_XE is not set
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
#
# Frame buffer Devices
#
CONFIG_FB=y
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_OF is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
# CONFIG_FB_UVESA is not set
# CONFIG_FB_OPENCORES is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_I740 is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_S3 is not set
# CONFIG_FB_SAVAGE is not set
# CONFIG_FB_SIS is not set
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_VT8623 is not set
# CONFIG_FB_TRIDENT is not set
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not set
# CONFIG_FB_CARMINE is not set
# CONFIG_FB_SM501 is not set
# CONFIG_FB_SMSCUFX is not set
# CONFIG_FB_IBM_GXT4500 is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FB_METRONOME is not set
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_SSD1307 is not set
# CONFIG_FB_SM712 is not set
CONFIG_FB_CORE=y
CONFIG_FB_NOTIFY=y
# CONFIG_FB_DEVICE is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYSMEM_FOPS=y
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_IOMEM_FOPS=y
CONFIG_FB_IOMEM_HELPERS=y
CONFIG_FB_SYSMEM_HELPERS=y
CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y
CONFIG_FB_TILEBLITTING=y
# end of Frame buffer Devices
#
# Backlight & LCD device support
#
CONFIG_LCD_CLASS_DEVICE=m
CONFIG_LCD_PLATFORM=m
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_AW99706 is not set
# CONFIG_BACKLIGHT_KTD253 is not set
# CONFIG_BACKLIGHT_KTD2801 is not set
# CONFIG_BACKLIGHT_KTZ8866 is not set
CONFIG_BACKLIGHT_PWM=m
# CONFIG_BACKLIGHT_QCOM_WLED is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set
# CONFIG_BACKLIGHT_LM3509 is not set
# CONFIG_BACKLIGHT_LM3630A is not set
# CONFIG_BACKLIGHT_LM3639 is not set
CONFIG_BACKLIGHT_LP855X=m
# CONFIG_BACKLIGHT_MP3309C is not set
# CONFIG_BACKLIGHT_GPIO is not set
# CONFIG_BACKLIGHT_LV5207LP is not set
# CONFIG_BACKLIGHT_BD6107 is not set
# CONFIG_BACKLIGHT_ARCXCNN is not set
CONFIG_BACKLIGHT_LED=m
# end of Backlight & LCD device support
CONFIG_HDMI=y
#
# Console display driver support
#
CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=80
CONFIG_DUMMY_CONSOLE_ROWS=25
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
# end of Console display driver support
CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_LOGO_LINUX_CLUT224=y
CONFIG_LOGO_LINUX_CLUT224_FILE="drivers/video/logo/logo_linux_clut224.ppm"
# CONFIG_TRACE_GPU_MEM is not set
# end of Graphics support
# CONFIG_DRM_ACCEL is not set
CONFIG_SOUND=m
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=m
CONFIG_SND_TIMER=m
CONFIG_SND_PCM=m
CONFIG_SND_PCM_ELD=y
CONFIG_SND_HWDEP=m
CONFIG_SND_SEQ_DEVICE=m
CONFIG_SND_RAWMIDI=m
CONFIG_SND_UMP=m
CONFIG_SND_UMP_LEGACY_RAWMIDI=y
CONFIG_SND_CORE_TEST=m
CONFIG_SND_JACK=y
CONFIG_SND_JACK_INPUT_DEV=y
CONFIG_SND_OSSEMUL=y
# CONFIG_SND_MIXER_OSS is not set
# CONFIG_SND_PCM_OSS is not set
CONFIG_SND_PCM_TIMER=y
CONFIG_SND_HRTIMER=m
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_MAX_CARDS=32
# CONFIG_SND_SUPPORT_OLD_API is not set
CONFIG_SND_PROC_FS=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_CTL_FAST_LOOKUP=y
# CONFIG_SND_DEBUG is not set
# CONFIG_SND_CTL_INPUT_VALIDATION is not set
CONFIG_SND_UTIMER=y
CONFIG_SND_VMASTER=y
CONFIG_SND_CTL_LED=m
CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
# CONFIG_SND_SEQUENCER_OSS is not set
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_SEQ_MIDI_EVENT=m
CONFIG_SND_SEQ_MIDI=m
CONFIG_SND_SEQ_MIDI_EMUL=m
CONFIG_SND_SEQ_VIRMIDI=m
CONFIG_SND_SEQ_UMP=y
CONFIG_SND_SEQ_UMP_CLIENT=m
CONFIG_SND_MPU401_UART=m
CONFIG_SND_OPL3_LIB=m
CONFIG_SND_OPL3_LIB_SEQ=m
CONFIG_SND_VX_LIB=m
CONFIG_SND_AC97_CODEC=m
CONFIG_SND_DRIVERS=y
CONFIG_SND_DUMMY=m
CONFIG_SND_ALOOP=m
# CONFIG_SND_PCMTEST is not set
CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m
# CONFIG_SND_SERIAL_U16550 is not set
CONFIG_SND_MPU401=m
CONFIG_SND_AC97_POWER_SAVE=y
CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0
CONFIG_SND_PCI=y
# CONFIG_SND_AD1889 is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
CONFIG_SND_AU8810=m
CONFIG_SND_AU8820=m
CONFIG_SND_AU8830=m
# CONFIG_SND_AW2 is not set
CONFIG_SND_BT87X=m
# CONFIG_SND_BT87X_OVERCLOCK is not set
CONFIG_SND_CA0106=m
CONFIG_SND_CMIPCI=m
CONFIG_SND_OXYGEN_LIB=m
CONFIG_SND_OXYGEN=m
# CONFIG_SND_CS4281 is not set
CONFIG_SND_CS46XX=m
CONFIG_SND_CS46XX_NEW_DSP=y
CONFIG_SND_CTXFI=m
CONFIG_SND_DARLA20=m
CONFIG_SND_GINA20=m
CONFIG_SND_LAYLA20=m
CONFIG_SND_DARLA24=m
CONFIG_SND_GINA24=m
CONFIG_SND_LAYLA24=m
CONFIG_SND_MONA=m
CONFIG_SND_MIA=m
CONFIG_SND_ECHO3G=m
CONFIG_SND_INDIGO=m
CONFIG_SND_INDIGOIO=m
CONFIG_SND_INDIGODJ=m
CONFIG_SND_INDIGOIOX=m
CONFIG_SND_INDIGODJX=m
CONFIG_SND_ENS1370=m
CONFIG_SND_ENS1371=m
# CONFIG_SND_FM801 is not set
CONFIG_SND_HDSP=m
CONFIG_SND_HDSPM=m
CONFIG_SND_ICE1724=m
# CONFIG_SND_INTEL8X0 is not set
# CONFIG_SND_INTEL8X0M is not set
CONFIG_SND_KORG1212=m
CONFIG_SND_LOLA=m
CONFIG_SND_LX6464ES=m
CONFIG_SND_MIXART=m
# CONFIG_SND_NM256 is not set
CONFIG_SND_PCXHR=m
# CONFIG_SND_RIPTIDE is not set
CONFIG_SND_RME32=m
CONFIG_SND_RME96=m
CONFIG_SND_RME9652=m
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VIA82XX_MODEM is not set
CONFIG_SND_VIRTUOSO=m
CONFIG_SND_VX222=m
# CONFIG_SND_YMFPCI is not set
#
# HD-Audio
#
CONFIG_SND_HDA=m
CONFIG_SND_HDA_HWDEP=y
CONFIG_SND_HDA_RECONFIG=y
CONFIG_SND_HDA_INPUT_BEEP=y
CONFIG_SND_HDA_INPUT_BEEP_MODE=0
CONFIG_SND_HDA_PATCH_LOADER=y
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1
# CONFIG_SND_HDA_CTL_DEV_ID is not set
CONFIG_SND_HDA_PREALLOC_SIZE=2048
CONFIG_SND_HDA_INTEL=m
CONFIG_SND_HDA_GENERIC_LEDS=y
CONFIG_SND_HDA_CODEC_ANALOG=m
CONFIG_SND_HDA_CODEC_SIGMATEL=m
CONFIG_SND_HDA_CODEC_VIA=m
CONFIG_SND_HDA_CODEC_CONEXANT=m
CONFIG_SND_HDA_CODEC_SENARYTECH=m
CONFIG_SND_HDA_CODEC_CA0110=m
CONFIG_SND_HDA_CODEC_CA0132=m
CONFIG_SND_HDA_CODEC_CA0132_DSP=y
CONFIG_SND_HDA_CODEC_CMEDIA=m
# CONFIG_SND_HDA_CODEC_CM9825 is not set
CONFIG_SND_HDA_CODEC_SI3054=m
CONFIG_SND_HDA_GENERIC=m
CONFIG_SND_HDA_CODEC_REALTEK=m
CONFIG_SND_HDA_CODEC_REALTEK_LIB=m
CONFIG_SND_HDA_CODEC_ALC260=m
CONFIG_SND_HDA_CODEC_ALC262=m
CONFIG_SND_HDA_CODEC_ALC268=m
CONFIG_SND_HDA_CODEC_ALC269=m
CONFIG_SND_HDA_CODEC_ALC662=m
CONFIG_SND_HDA_CODEC_ALC680=m
CONFIG_SND_HDA_CODEC_ALC861=m
CONFIG_SND_HDA_CODEC_ALC861VD=m
CONFIG_SND_HDA_CODEC_ALC880=m
CONFIG_SND_HDA_CODEC_ALC882=m
CONFIG_SND_HDA_CODEC_CIRRUS=m
CONFIG_SND_HDA_CODEC_CS420X=m
CONFIG_SND_HDA_CODEC_CS421X=m
CONFIG_SND_HDA_CODEC_CS8409=m
CONFIG_SND_HDA_CODEC_HDMI=m
CONFIG_SND_HDA_CODEC_HDMI_GENERIC=m
CONFIG_SND_HDA_CODEC_HDMI_SIMPLE=m
CONFIG_SND_HDA_CODEC_HDMI_INTEL=m
CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM=y
CONFIG_SND_HDA_CODEC_HDMI_ATI=m
CONFIG_SND_HDA_CODEC_HDMI_NVIDIA=m
CONFIG_SND_HDA_CODEC_HDMI_NVIDIA_MCP=m
CONFIG_SND_HDA_CODEC_HDMI_TEGRA=m
CONFIG_SND_HDA_SCODEC_COMPONENT=m
CONFIG_SND_HDA_CORE=m
CONFIG_SND_HDA_DSP_LOADER=y
CONFIG_SND_HDA_COMPONENT=y
CONFIG_SND_INTEL_DSP_CONFIG=m
# end of HD-Audio
CONFIG_SND_PPC=y
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=m
CONFIG_SND_USB_AUDIO_MIDI_V2=y
CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y
CONFIG_SND_USB_UA101=m
CONFIG_SND_USB_USX2Y=m
CONFIG_SND_USB_CAIAQ=m
CONFIG_SND_USB_CAIAQ_INPUT=y
CONFIG_SND_USB_6FIRE=m
CONFIG_SND_USB_HIFACE=m
CONFIG_SND_BCD2000=m
CONFIG_SND_USB_LINE6=m
CONFIG_SND_USB_POD=m
CONFIG_SND_USB_PODHD=m
CONFIG_SND_USB_TONEPORT=m
CONFIG_SND_USB_VARIAX=m
# CONFIG_SND_SOC is not set
CONFIG_SND_VIRTIO=m
CONFIG_AC97_BUS=m
CONFIG_HID_SUPPORT=y
CONFIG_HID=y
CONFIG_HID_BATTERY_STRENGTH=y
CONFIG_HIDRAW=y
CONFIG_UHID=m
CONFIG_HID_GENERIC=y
# CONFIG_HID_HAPTIC is not set
#
# Special HID drivers
#
CONFIG_HID_A4TECH=m
# CONFIG_HID_ACCUTOUCH is not set
CONFIG_HID_ACRUX=m
# CONFIG_HID_ACRUX_FF is not set
CONFIG_HID_APPLE=m
CONFIG_HID_APPLEIR=m
# CONFIG_HID_ASUS is not set
CONFIG_HID_AUREAL=m
CONFIG_HID_BELKIN=m
# CONFIG_HID_BETOP_FF is not set
# CONFIG_HID_BIGBEN_FF is not set
CONFIG_HID_CHERRY=m
CONFIG_HID_CHICONY=m
# CONFIG_HID_CORSAIR is not set
CONFIG_HID_COUGAR=m
# CONFIG_HID_MACALLY is not set
CONFIG_HID_PRODIKEYS=m
# CONFIG_HID_CMEDIA is not set
# CONFIG_HID_CP2112 is not set
# CONFIG_HID_CREATIVE_SB0540 is not set
CONFIG_HID_CYPRESS=m
CONFIG_HID_DRAGONRISE=m
# CONFIG_DRAGONRISE_FF is not set
# CONFIG_HID_EMS_FF is not set
CONFIG_HID_ELAN=m
CONFIG_HID_ELECOM=m
# CONFIG_HID_ELO is not set
CONFIG_HID_EVISION=m
CONFIG_HID_EZKEY=m
# CONFIG_HID_FT260 is not set
# CONFIG_HID_GEMBIRD is not set
# CONFIG_HID_GFRM is not set
# CONFIG_HID_GLORIOUS is not set
CONFIG_HID_HOLTEK=m
# CONFIG_HOLTEK_FF is not set
# CONFIG_HID_GOOGLE_STADIA_FF is not set
# CONFIG_HID_VIVALDI is not set
# CONFIG_HID_GT683R is not set
CONFIG_HID_KEYTOUCH=m
CONFIG_HID_KYE=m
# CONFIG_HID_KYSONA is not set
CONFIG_HID_UCLOGIC=m
CONFIG_HID_WALTOP=m
# CONFIG_HID_VIEWSONIC is not set
# CONFIG_HID_VRC2 is not set
CONFIG_HID_XIAOMI=m
CONFIG_HID_GYRATION=m
CONFIG_HID_ICADE=m
CONFIG_HID_ITE=m
CONFIG_HID_JABRA=m
CONFIG_HID_TWINHAN=m
CONFIG_HID_KENSINGTON=m
CONFIG_HID_LCPOWER=m
CONFIG_HID_LED=m
# CONFIG_HID_LENOVO is not set
CONFIG_HID_LETSKETCH=m
CONFIG_HID_MAGICMOUSE=y
# CONFIG_HID_MALTRON is not set
# CONFIG_HID_MAYFLASH is not set
# CONFIG_HID_MEGAWORLD_FF is not set
# CONFIG_HID_REDRAGON is not set
CONFIG_HID_MICROSOFT=m
CONFIG_HID_MONTEREY=m
CONFIG_HID_MULTITOUCH=m
# CONFIG_HID_NINTENDO is not set
CONFIG_HID_NTI=m
CONFIG_HID_NTRIG=y
# CONFIG_HID_NVIDIA_SHIELD is not set
CONFIG_HID_ORTEK=m
CONFIG_HID_PANTHERLORD=m
# CONFIG_PANTHERLORD_FF is not set
# CONFIG_HID_PENMOUNT is not set
CONFIG_HID_PETALYNX=m
CONFIG_HID_PICOLCD=m
CONFIG_HID_PICOLCD_FB=y
CONFIG_HID_PICOLCD_BACKLIGHT=y
CONFIG_HID_PICOLCD_LCD=y
CONFIG_HID_PICOLCD_LEDS=y
# CONFIG_HID_PLANTRONICS is not set
# CONFIG_HID_PXRC is not set
# CONFIG_HID_RAPOO is not set
# CONFIG_HID_RAZER is not set
CONFIG_HID_PRIMAX=m
# CONFIG_HID_RETRODE is not set
CONFIG_HID_ROCCAT=m
CONFIG_HID_SAITEK=m
CONFIG_HID_SAMSUNG=m
CONFIG_HID_SEMITEK=m
CONFIG_HID_SIGMAMICRO=m
CONFIG_HID_SONY=m
# CONFIG_SONY_FF is not set
CONFIG_HID_SPEEDLINK=m
# CONFIG_HID_STEAM is not set
CONFIG_HID_STEELSERIES=m
CONFIG_HID_SUNPLUS=m
CONFIG_HID_RMI=m
CONFIG_HID_GREENASIA=m
# CONFIG_GREENASIA_FF is not set
CONFIG_HID_SMARTJOYPLUS=m
# CONFIG_SMARTJOYPLUS_FF is not set
CONFIG_HID_TIVO=m
CONFIG_HID_TOPSEED=m
# CONFIG_HID_TOPRE is not set
CONFIG_HID_THINGM=m
CONFIG_HID_THRUSTMASTER=m
# CONFIG_THRUSTMASTER_FF is not set
# CONFIG_HID_UDRAW_PS3 is not set
# CONFIG_HID_U2FZERO is not set
# CONFIG_HID_UNIVERSAL_PIDFF is not set
CONFIG_HID_WACOM=m
CONFIG_HID_WIIMOTE=m
# CONFIG_HID_WINWING is not set
# CONFIG_HID_XINMO is not set
CONFIG_HID_ZEROPLUS=m
# CONFIG_ZEROPLUS_FF is not set
CONFIG_HID_ZYDACRON=m
# CONFIG_HID_SENSOR_HUB is not set
# CONFIG_HID_ALPS is not set
# CONFIG_HID_MCP2200 is not set
# CONFIG_HID_MCP2221 is not set
CONFIG_HID_KUNIT_TEST=m
# CONFIG_HID_HUAWEI is not set
# end of Special HID drivers
#
# HID-BPF support
#
# end of HID-BPF support
CONFIG_I2C_HID=y
# CONFIG_I2C_HID_OF is not set
# CONFIG_I2C_HID_OF_ELAN is not set
# CONFIG_I2C_HID_OF_GOODIX is not set
#
# USB HID support
#
CONFIG_USB_HID=y
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y
# end of USB HID support
CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
# CONFIG_USB_LED_TRIG is not set
# CONFIG_USB_ULPI_BUS is not set
# CONFIG_USB_CONN_GPIO is not set
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_PCI=y
CONFIG_USB_PCI_AMD=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
#
# Miscellaneous USB options
#
CONFIG_USB_DEFAULT_PERSIST=y
# CONFIG_USB_FEW_INIT_RETRIES is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_PRODUCTLIST is not set
# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
CONFIG_USB_LEDS_TRIGGER_USBPORT=m
CONFIG_USB_AUTOSUSPEND_DELAY=2
CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1
CONFIG_USB_MON=y
#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
CONFIG_USB_XHCI_HCD=y
# CONFIG_USB_XHCI_DBGCAP is not set
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_XHCI_PCI_RENESAS=y
# CONFIG_USB_XHCI_PLATFORM is not set
# CONFIG_USB_XHCI_SIDEBAND is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_PCI=y
# CONFIG_USB_EHCI_FSL is not set
CONFIG_USB_EHCI_HCD_PPC_OF=y
# CONFIG_USB_EHCI_HCD_PLATFORM is not set
# CONFIG_USB_OXU210HP_HCD is not set
# CONFIG_USB_ISP116X_HCD is not set
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
CONFIG_USB_OHCI_HCD_PPC_OF=y
CONFIG_USB_OHCI_HCD_PCI=y
# CONFIG_USB_OHCI_HCD_PLATFORM is not set
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set
# CONFIG_USB_R8A66597_HCD is not set
# CONFIG_USB_HCD_BCMA is not set
# CONFIG_USB_HCD_TEST_MODE is not set
#
# USB Device Class drivers
#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
CONFIG_USB_WDM=m
CONFIG_USB_TMC=m
#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
CONFIG_USB_STORAGE_REALTEK=m
CONFIG_REALTEK_AUTOPM=y
CONFIG_USB_STORAGE_DATAFAB=m
CONFIG_USB_STORAGE_FREECOM=m
# CONFIG_USB_STORAGE_ISD200 is not set
CONFIG_USB_STORAGE_USBAT=m
CONFIG_USB_STORAGE_SDDR09=m
CONFIG_USB_STORAGE_SDDR55=m
CONFIG_USB_STORAGE_JUMPSHOT=m
CONFIG_USB_STORAGE_ALAUDA=m
CONFIG_USB_STORAGE_ONETOUCH=m
CONFIG_USB_STORAGE_KARMA=m
CONFIG_USB_STORAGE_CYPRESS_ATACB=m
CONFIG_USB_STORAGE_ENE_UB6250=m
CONFIG_USB_UAS=m
#
# USB Imaging devices
#
CONFIG_USB_MDC800=m
CONFIG_USB_MICROTEK=m
CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_VHCI_HC_PORTS=8
CONFIG_USBIP_VHCI_NR_HCS=1
CONFIG_USBIP_HOST=m
# CONFIG_USBIP_DEBUG is not set
#
# USB dual-mode controller drivers
#
# CONFIG_USB_CDNS_SUPPORT is not set
# CONFIG_USB_MUSB_HDRC is not set
# CONFIG_USB_DWC3 is not set
# CONFIG_USB_DWC2 is not set
# CONFIG_USB_CHIPIDEA is not set
# CONFIG_USB_ISP1760 is not set
#
# USB port drivers
#
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_CONSOLE=y
CONFIG_USB_SERIAL_GENERIC=y
# CONFIG_USB_SERIAL_SIMPLE is not set
CONFIG_USB_SERIAL_AIRCABLE=m
CONFIG_USB_SERIAL_ARK3116=m
CONFIG_USB_SERIAL_BELKIN=m
CONFIG_USB_SERIAL_CH341=m
CONFIG_USB_SERIAL_WHITEHEAT=m
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
CONFIG_USB_SERIAL_CP210X=m
CONFIG_USB_SERIAL_CYPRESS_M8=m
CONFIG_USB_SERIAL_EMPEG=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_SERIAL_IR=m
CONFIG_USB_SERIAL_EDGEPORT=m
CONFIG_USB_SERIAL_EDGEPORT_TI=m
# CONFIG_USB_SERIAL_F81232 is not set
CONFIG_USB_SERIAL_F8153X=m
CONFIG_USB_SERIAL_GARMIN=m
CONFIG_USB_SERIAL_IPW=m
CONFIG_USB_SERIAL_IUU=m
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
CONFIG_USB_SERIAL_KLSI=m
CONFIG_USB_SERIAL_KOBIL_SCT=m
CONFIG_USB_SERIAL_MCT_U232=m
# CONFIG_USB_SERIAL_METRO is not set
CONFIG_USB_SERIAL_MOS7720=m
CONFIG_USB_SERIAL_MOS7840=m
CONFIG_USB_SERIAL_MXUPORT=m
CONFIG_USB_SERIAL_NAVMAN=m
CONFIG_USB_SERIAL_PL2303=m
CONFIG_USB_SERIAL_OTI6858=m
CONFIG_USB_SERIAL_QCAUX=m
CONFIG_USB_SERIAL_QUALCOMM=m
CONFIG_USB_SERIAL_SPCP8X5=m
CONFIG_USB_SERIAL_SAFE=m
CONFIG_USB_SERIAL_SAFE_PADDED=y
CONFIG_USB_SERIAL_SIERRAWIRELESS=m
CONFIG_USB_SERIAL_SYMBOL=m
CONFIG_USB_SERIAL_TI=m
CONFIG_USB_SERIAL_CYBERJACK=m
CONFIG_USB_SERIAL_WWAN=m
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_SERIAL_OMNINET=m
CONFIG_USB_SERIAL_OPTICON=m
CONFIG_USB_SERIAL_XSENS_MT=m
# CONFIG_USB_SERIAL_WISHBONE is not set
CONFIG_USB_SERIAL_SSU100=m
CONFIG_USB_SERIAL_QT2=m
CONFIG_USB_SERIAL_UPD78F0730=m
CONFIG_USB_SERIAL_XR=m
CONFIG_USB_SERIAL_DEBUG=m
#
# USB Miscellaneous drivers
#
CONFIG_USB_EMI62=m
CONFIG_USB_EMI26=m
CONFIG_USB_ADUTUX=m
CONFIG_USB_SEVSEG=m
CONFIG_USB_LEGOTOWER=m
CONFIG_USB_LCD=m
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
CONFIG_USB_IDMOUSE=m
CONFIG_USB_APPLEDISPLAY=m
# CONFIG_APPLE_MFI_FASTCHARGE is not set
CONFIG_USB_SISUSBVGA=m
CONFIG_USB_LD=m
# CONFIG_USB_TRANCEVIBRATOR is not set
CONFIG_USB_IOWARRIOR=m
# CONFIG_USB_TEST is not set
# CONFIG_USB_EHSET_TEST_FIXTURE is not set
CONFIG_USB_ISIGHTFW=m
# CONFIG_USB_YUREX is not set
CONFIG_USB_EZUSB_FX2=m
# CONFIG_USB_HUB_USB251XB is not set
CONFIG_USB_HSIC_USB3503=m
# CONFIG_USB_HSIC_USB4604 is not set
# CONFIG_USB_LINK_LAYER_TEST is not set
# CONFIG_USB_CHAOSKEY is not set
# CONFIG_USB_ONBOARD_DEV is not set
#
# USB Physical Layer drivers
#
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_USB_ISP1301 is not set
# end of USB Physical Layer drivers
# CONFIG_USB_GADGET is not set
CONFIG_TYPEC=y
CONFIG_TYPEC_TCPM=m
CONFIG_TYPEC_TCPCI=m
# CONFIG_TYPEC_RT1711H is not set
# CONFIG_TYPEC_TCPCI_MAXIM is not set
CONFIG_TYPEC_FUSB302=m
CONFIG_TYPEC_UCSI=y
# CONFIG_UCSI_CCG is not set
# CONFIG_UCSI_STM32G0 is not set
CONFIG_TYPEC_TPS6598X=m
# CONFIG_TYPEC_ANX7411 is not set
# CONFIG_TYPEC_RT1719 is not set
# CONFIG_TYPEC_HD3SS3220 is not set
# CONFIG_TYPEC_STUSB160X is not set
# CONFIG_TYPEC_WUSB3801 is not set
#
# USB Type-C Multiplexer/DeMultiplexer Switch support
#
CONFIG_TYPEC_MUX_FSA4480=m
# CONFIG_TYPEC_MUX_GPIO_SBU is not set
CONFIG_TYPEC_MUX_PI3USB30532=m
# CONFIG_TYPEC_MUX_IT5205 is not set
# CONFIG_TYPEC_MUX_NB7VPQ904M is not set
# CONFIG_TYPEC_MUX_PS883X is not set
# CONFIG_TYPEC_MUX_PTN36502 is not set
# CONFIG_TYPEC_MUX_TUSB1046 is not set
# CONFIG_TYPEC_MUX_WCD939X_USBSS is not set
# end of USB Type-C Multiplexer/DeMultiplexer Switch support
#
# USB Type-C Alternate Mode drivers
#
CONFIG_TYPEC_DP_ALTMODE=m
# CONFIG_TYPEC_NVIDIA_ALTMODE is not set
# CONFIG_TYPEC_TBT_ALTMODE is not set
# end of USB Type-C Alternate Mode drivers
CONFIG_USB_ROLE_SWITCH=y
CONFIG_MMC=m
# CONFIG_PWRSEQ_EMMC is not set
# CONFIG_PWRSEQ_SD8787 is not set
# CONFIG_PWRSEQ_SIMPLE is not set
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
CONFIG_SDIO_UART=m
# CONFIG_MMC_TEST is not set
#
# MMC/SD/SDIO Host Controller Drivers
#
# CONFIG_MMC_DEBUG is not set
CONFIG_MMC_SDHCI=m
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
CONFIG_MMC_SDHCI_UHS2=m
CONFIG_MMC_SDHCI_PCI=m
CONFIG_MMC_RICOH_MMC=y
CONFIG_MMC_SDHCI_PLTFM=m
# CONFIG_MMC_SDHCI_OF_ARASAN is not set
# CONFIG_MMC_SDHCI_OF_AT91 is not set
# CONFIG_MMC_SDHCI_OF_ESDHC is not set
# CONFIG_MMC_SDHCI_OF_HLWD is not set
# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
# CONFIG_MMC_SDHCI_CADENCE is not set
# CONFIG_MMC_SDHCI_F_SDH30 is not set
# CONFIG_MMC_SDHCI_MILBEAUT is not set
# CONFIG_MMC_WBSD is not set
CONFIG_MMC_TIFM_SD=m
CONFIG_MMC_CB710=m
CONFIG_MMC_VIA_SDMMC=m
CONFIG_MMC_VUB300=m
CONFIG_MMC_USHC=m
# CONFIG_MMC_USDHI6ROL0 is not set
CONFIG_MMC_REALTEK_PCI=m
CONFIG_MMC_REALTEK_USB=m
CONFIG_MMC_CQHCI=m
# CONFIG_MMC_HSQ is not set
# CONFIG_MMC_TOSHIBA_PCI is not set
# CONFIG_MMC_MTK is not set
# CONFIG_MMC_SDHCI_XENON is not set
# CONFIG_SCSI_UFSHCD is not set
CONFIG_MEMSTICK=m
# CONFIG_MEMSTICK_DEBUG is not set
#
# MemoryStick drivers
#
# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
CONFIG_MSPRO_BLOCK=m
# CONFIG_MS_BLOCK is not set
#
# MemoryStick Host Controller Drivers
#
CONFIG_MEMSTICK_TIFM_MS=m
CONFIG_MEMSTICK_JMICRON_38X=m
CONFIG_MEMSTICK_R592=m
# CONFIG_MEMSTICK_REALTEK_USB is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
# CONFIG_LEDS_CLASS_FLASH is not set
# CONFIG_LEDS_CLASS_MULTICOLOR is not set
CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y
CONFIG_LEDS_KUNIT_TEST=m
#
# LED drivers
#
# CONFIG_LEDS_AN30259A is not set
# CONFIG_LEDS_OSRAM_AMS_AS3668 is not set
# CONFIG_LEDS_AW200XX is not set
# CONFIG_LEDS_AW2013 is not set
# CONFIG_LEDS_BCM6328 is not set
# CONFIG_LEDS_BCM6358 is not set
CONFIG_LEDS_LM3530=m
# CONFIG_LEDS_LM3532 is not set
# CONFIG_LEDS_LM3642 is not set
# CONFIG_LEDS_LM3692X is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_GPIO is not set
CONFIG_LEDS_LP3944=m
# CONFIG_LEDS_LP3952 is not set
# CONFIG_LEDS_LP8860 is not set
# CONFIG_LEDS_LP8864 is not set
# CONFIG_LEDS_PCA955X is not set
# CONFIG_LEDS_PCA963X is not set
# CONFIG_LEDS_PCA995X is not set
# CONFIG_LEDS_PWM is not set
# CONFIG_LEDS_BD2606MVV is not set
# CONFIG_LEDS_BD2802 is not set
CONFIG_LEDS_LT3593=m
# CONFIG_LEDS_TCA6507 is not set
# CONFIG_LEDS_TLC591XX is not set
# CONFIG_LEDS_LM355x is not set
# CONFIG_LEDS_IS31FL319X is not set
# CONFIG_LEDS_IS31FL32XX is not set
#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
#
CONFIG_LEDS_BLINKM=m
CONFIG_LEDS_POWERNV=m
# CONFIG_LEDS_MLXREG is not set
# CONFIG_LEDS_USER is not set
# CONFIG_LEDS_LM3697 is not set
# CONFIG_LEDS_ST1202 is not set
#
# Flash and Torch LED drivers
#
#
# RGB LED drivers
#
#
# LED Triggers
#
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=m
CONFIG_LEDS_TRIGGER_ONESHOT=m
CONFIG_LEDS_TRIGGER_DISK=y
# CONFIG_LEDS_TRIGGER_MTD is not set
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
CONFIG_LEDS_TRIGGER_BACKLIGHT=m
# CONFIG_LEDS_TRIGGER_CPU is not set
# CONFIG_LEDS_TRIGGER_ACTIVITY is not set
CONFIG_LEDS_TRIGGER_GPIO=m
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
#
# iptables trigger is under Netfilter config (LED target)
#
CONFIG_LEDS_TRIGGER_TRANSIENT=m
CONFIG_LEDS_TRIGGER_CAMERA=m
# CONFIG_LEDS_TRIGGER_PANIC is not set
CONFIG_LEDS_TRIGGER_NETDEV=m
# CONFIG_LEDS_TRIGGER_PATTERN is not set
# CONFIG_LEDS_TRIGGER_TTY is not set
# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set
#
# Simatic LED drivers
#
CONFIG_ACCESSIBILITY=y
# CONFIG_A11Y_BRAILLE_CONSOLE is not set
#
# Speakup console speech
#
CONFIG_SPEAKUP=m
CONFIG_SPEAKUP_SYNTH_ACNTSA=m
CONFIG_SPEAKUP_SYNTH_APOLLO=m
CONFIG_SPEAKUP_SYNTH_AUDPTR=m
CONFIG_SPEAKUP_SYNTH_BNS=m
CONFIG_SPEAKUP_SYNTH_DECTLK=m
# CONFIG_SPEAKUP_SYNTH_DECEXT is not set
CONFIG_SPEAKUP_SYNTH_LTLK=m
CONFIG_SPEAKUP_SYNTH_SOFT=m
CONFIG_SPEAKUP_SYNTH_SPKOUT=m
CONFIG_SPEAKUP_SYNTH_TXPRT=m
# CONFIG_SPEAKUP_SYNTH_DUMMY is not set
# end of Speakup console speech
CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_MAD=m
CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_INFINIBAND_USER_MEM=y
CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
CONFIG_INFINIBAND_ADDR_TRANS=y
CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y
CONFIG_INFINIBAND_VIRT_DMA=y
CONFIG_INFINIBAND_BNXT_RE=m
CONFIG_INFINIBAND_CXGB4=m
CONFIG_INFINIBAND_EFA=m
# CONFIG_INFINIBAND_ERDMA is not set
# CONFIG_INFINIBAND_IONIC is not set
CONFIG_INFINIBAND_IRDMA=m
# CONFIG_MLX4_INFINIBAND is not set
CONFIG_MLX5_INFINIBAND=m
# CONFIG_INFINIBAND_MTHCA is not set
# CONFIG_INFINIBAND_OCRDMA is not set
CONFIG_INFINIBAND_QEDR=m
# CONFIG_RDMA_RXE is not set
# CONFIG_RDMA_SIW is not set
CONFIG_INFINIBAND_IPOIB=m
CONFIG_INFINIBAND_IPOIB_CM=y
CONFIG_INFINIBAND_IPOIB_DEBUG=y
# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
CONFIG_INFINIBAND_SRP=m
CONFIG_INFINIBAND_SRPT=m
CONFIG_INFINIBAND_ISER=m
CONFIG_INFINIBAND_ISERT=m
# CONFIG_INFINIBAND_RTRS_CLIENT is not set
# CONFIG_INFINIBAND_RTRS_SERVER is not set
CONFIG_EDAC_ATOMIC_SCRUB=y
CONFIG_EDAC_SUPPORT=y
CONFIG_EDAC=y
# CONFIG_EDAC_DEBUG is not set
# CONFIG_EDAC_SCRUB is not set
# CONFIG_EDAC_ECS is not set
# CONFIG_EDAC_MEM_REPAIR is not set
CONFIG_EDAC_CPC925=m
CONFIG_RTC_LIB=y
CONFIG_RTC_MC146818_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
CONFIG_RTC_SYSTOHC=y
CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set
CONFIG_RTC_LIB_KUNIT_TEST=m
CONFIG_RTC_NVMEM=y
#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
# CONFIG_RTC_DRV_TEST is not set
#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_ABB5ZES3 is not set
# CONFIG_RTC_DRV_ABEOZ9 is not set
# CONFIG_RTC_DRV_ABX80X is not set
CONFIG_RTC_DRV_DS1307=m
# CONFIG_RTC_DRV_DS1307_CENTURY is not set
CONFIG_RTC_DRV_DS1374=m
# CONFIG_RTC_DRV_DS1374_WDT is not set
CONFIG_RTC_DRV_DS1672=m
# CONFIG_RTC_DRV_HYM8563 is not set
CONFIG_RTC_DRV_MAX6900=m
# CONFIG_RTC_DRV_MAX31335 is not set
# CONFIG_RTC_DRV_NCT3018Y is not set
CONFIG_RTC_DRV_RS5C372=m
CONFIG_RTC_DRV_ISL1208=m
CONFIG_RTC_DRV_ISL12022=m
# CONFIG_RTC_DRV_ISL12026 is not set
CONFIG_RTC_DRV_X1205=m
CONFIG_RTC_DRV_PCF8523=m
# CONFIG_RTC_DRV_PCF85363 is not set
CONFIG_RTC_DRV_PCF8563=m
CONFIG_RTC_DRV_PCF8583=m
CONFIG_RTC_DRV_M41T80=m
CONFIG_RTC_DRV_M41T80_WDT=y
CONFIG_RTC_DRV_BQ32K=m
# CONFIG_RTC_DRV_S35390A is not set
CONFIG_RTC_DRV_FM3130=m
# CONFIG_RTC_DRV_RX8010 is not set
# CONFIG_RTC_DRV_RX8111 is not set
CONFIG_RTC_DRV_RX8581=m
CONFIG_RTC_DRV_RX8025=m
CONFIG_RTC_DRV_EM3027=m
# CONFIG_RTC_DRV_RV3028 is not set
# CONFIG_RTC_DRV_RV3032 is not set
# CONFIG_RTC_DRV_RV8803 is not set
# CONFIG_RTC_DRV_SD2405AL is not set
# CONFIG_RTC_DRV_SD3078 is not set
#
# SPI RTC drivers
#
CONFIG_RTC_I2C_AND_SPI=y
#
# SPI and I2C RTC drivers
#
CONFIG_RTC_DRV_DS3232=m
CONFIG_RTC_DRV_DS3232_HWMON=y
# CONFIG_RTC_DRV_PCF2127 is not set
# CONFIG_RTC_DRV_PCF85063 is not set
CONFIG_RTC_DRV_RV3029C2=m
# CONFIG_RTC_DRV_RV3029_HWMON is not set
# CONFIG_RTC_DRV_RX6110 is not set
#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
CONFIG_RTC_DRV_DS1286=m
CONFIG_RTC_DRV_DS1511=m
CONFIG_RTC_DRV_DS1553=m
# CONFIG_RTC_DRV_DS1685_FAMILY is not set
CONFIG_RTC_DRV_DS1742=m
CONFIG_RTC_DRV_DS2404=m
CONFIG_RTC_DRV_STK17TA8=m
# CONFIG_RTC_DRV_M48T86 is not set
CONFIG_RTC_DRV_M48T35=m
CONFIG_RTC_DRV_M48T59=m
CONFIG_RTC_DRV_MSM6242=m
CONFIG_RTC_DRV_RP5C01=m
CONFIG_RTC_DRV_OPAL=y
# CONFIG_RTC_DRV_ZYNQMP is not set
#
# on-CPU RTC drivers
#
CONFIG_RTC_DRV_GENERIC=y
# CONFIG_RTC_DRV_CADENCE is not set
# CONFIG_RTC_DRV_FTRTC010 is not set
# CONFIG_RTC_DRV_R7301 is not set
# CONFIG_RTC_DRV_GOLDFISH is not set
#
# HID Sensor RTC drivers
#
CONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set
#
# DMA Devices
#
CONFIG_DMA_ENGINE=y
CONFIG_DMA_OF=y
# CONFIG_ALTERA_MSGDMA is not set
# CONFIG_DW_AXI_DMAC is not set
# CONFIG_FSL_EDMA is not set
# CONFIG_INTEL_IDMA64 is not set
# CONFIG_PLX_DMA is not set
# CONFIG_SWITCHTEC_DMA is not set
# CONFIG_XILINX_DMA is not set
# CONFIG_XILINX_XDMA is not set
# CONFIG_XILINX_ZYNQMP_DPDMA is not set
# CONFIG_AMD_QDMA is not set
# CONFIG_QCOM_HIDMA_MGMT is not set
# CONFIG_QCOM_HIDMA is not set
CONFIG_DW_DMAC_CORE=m
CONFIG_DW_DMAC=m
# CONFIG_DW_DMAC_PCI is not set
# CONFIG_DW_EDMA is not set
# CONFIG_SF_PDMA is not set
#
# DMA Clients
#
CONFIG_ASYNC_TX_DMA=y
CONFIG_DMATEST=m
CONFIG_DMA_ENGINE_RAID=y
#
# DMABUF options
#
CONFIG_SYNC_FILE=y
# CONFIG_SW_SYNC is not set
# CONFIG_UDMABUF is not set
# CONFIG_DMABUF_DEBUG is not set
# CONFIG_DMABUF_SELFTESTS is not set
CONFIG_DMABUF_HEAPS=y
CONFIG_DMABUF_HEAPS_SYSTEM=y
# end of DMABUF options
CONFIG_UIO=m
# CONFIG_UIO_CIF is not set
# CONFIG_UIO_PDRV_GENIRQ is not set
# CONFIG_UIO_DMEM_GENIRQ is not set
# CONFIG_UIO_AEC is not set
# CONFIG_UIO_SERCOS3 is not set
CONFIG_UIO_PCI_GENERIC=m
# CONFIG_UIO_NETX is not set
# CONFIG_UIO_MF624 is not set
CONFIG_VFIO=m
CONFIG_VFIO_GROUP=y
CONFIG_VFIO_CONTAINER=y
CONFIG_VFIO_IOMMU_SPAPR_TCE=m
# CONFIG_VFIO_NOIOMMU is not set
CONFIG_VFIO_VIRQFD=y
# CONFIG_VFIO_DEBUGFS is not set
#
# VFIO support for PCI devices
#
CONFIG_VFIO_PCI_CORE=m
CONFIG_VFIO_PCI_INTX=y
CONFIG_VFIO_PCI=m
CONFIG_VFIO_PCI_DMABUF=y
CONFIG_MLX5_VFIO_PCI=m
# CONFIG_VIRTIO_VFIO_PCI is not set
# end of VFIO support for PCI devices
CONFIG_IRQ_BYPASS_MANAGER=y
CONFIG_VIRT_DRIVERS=y
CONFIG_VMGENID=y
CONFIG_VIRTIO_ANCHOR=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI_LIB=y
CONFIG_VIRTIO_PCI_LIB_LEGACY=y
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_VDPA=m
# CONFIG_VIRTIO_PMEM is not set
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
# CONFIG_VIRTIO_MMIO is not set
CONFIG_VIRTIO_DMA_SHARED_BUFFER=m
# CONFIG_VIRTIO_DEBUG is not set
# CONFIG_VIRTIO_RTC is not set
CONFIG_VDPA=m
CONFIG_VDPA_SIM=m
CONFIG_VDPA_SIM_NET=m
CONFIG_VDPA_SIM_BLOCK=m
# CONFIG_VDPA_USER is not set
CONFIG_IFCVF=m
CONFIG_MLX5_VDPA=y
CONFIG_MLX5_VDPA_NET=m
# CONFIG_MLX5_VDPA_STEERING_DEBUG is not set
CONFIG_VP_VDPA=m
# CONFIG_SNET_VDPA is not set
# CONFIG_OCTEONEP_VDPA is not set
CONFIG_VHOST_IOTLB=m
CONFIG_VHOST_RING=m
CONFIG_VHOST_TASK=y
CONFIG_VHOST=m
CONFIG_VHOST_MENU=y
CONFIG_VHOST_NET=m
# CONFIG_VHOST_SCSI is not set
CONFIG_VHOST_VSOCK=m
CONFIG_VHOST_VDPA=m
CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y
CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y
#
# Microsoft Hyper-V guest support
#
# end of Microsoft Hyper-V guest support
# CONFIG_GREYBUS is not set
# CONFIG_COMEDI is not set
# CONFIG_GPIB is not set
# CONFIG_STAGING is not set
# CONFIG_GOLDFISH is not set
CONFIG_HAVE_CLK=y
CONFIG_HAVE_CLK_PREPARE=y
CONFIG_COMMON_CLK=y
# CONFIG_COMMON_CLK_MAX9485 is not set
# CONFIG_COMMON_CLK_SI5341 is not set
# CONFIG_COMMON_CLK_SI5351 is not set
# CONFIG_COMMON_CLK_SI514 is not set
# CONFIG_COMMON_CLK_SI544 is not set
# CONFIG_COMMON_CLK_SI570 is not set
# CONFIG_COMMON_CLK_CDCE706 is not set
# CONFIG_COMMON_CLK_CDCE925 is not set
# CONFIG_COMMON_CLK_CS2000_CP is not set
# CONFIG_COMMON_CLK_AXI_CLKGEN is not set
# CONFIG_COMMON_CLK_PWM is not set
# CONFIG_COMMON_CLK_RS9_PCIE is not set
# CONFIG_COMMON_CLK_SI521XX is not set
# CONFIG_COMMON_CLK_VC3 is not set
# CONFIG_COMMON_CLK_VC5 is not set
# CONFIG_COMMON_CLK_VC7 is not set
# CONFIG_COMMON_CLK_FIXED_MMIO is not set
# CONFIG_XILINX_VCU is not set
# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set
CONFIG_CLK_KUNIT_TEST=m
CONFIG_CLK_FIXED_RATE_KUNIT_TEST=m
CONFIG_CLK_GATE_KUNIT_TEST=m
CONFIG_CLK_FD_KUNIT_TEST=m
CONFIG_HWSPINLOCK=y
#
# Clock Source drivers
#
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
# end of Clock Source drivers
# CONFIG_MAILBOX is not set
CONFIG_IOMMU_IOVA=m
CONFIG_IOMMU_API=y
CONFIG_IOMMUFD_DRIVER=y
CONFIG_IOMMU_SUPPORT=y
#
# Generic IOMMU Pagetable Support
#
# end of Generic IOMMU Pagetable Support
# CONFIG_IOMMU_DEBUGFS is not set
CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set
# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
CONFIG_OF_IOMMU=y
CONFIG_IOMMUFD_DRIVER_CORE=y
CONFIG_IOMMUFD=m
CONFIG_SPAPR_TCE_IOMMU=y
#
# Remoteproc drivers
#
# CONFIG_REMOTEPROC is not set
# end of Remoteproc drivers
#
# Rpmsg drivers
#
# CONFIG_RPMSG_VIRTIO is not set
# end of Rpmsg drivers
#
# SOC (System On Chip) specific Drivers
#
#
# Amlogic SoC drivers
#
# end of Amlogic SoC drivers
#
# Broadcom SoC drivers
#
# end of Broadcom SoC drivers
#
# NXP/Freescale QorIQ SoC drivers
#
# CONFIG_QUICC_ENGINE is not set
# end of NXP/Freescale QorIQ SoC drivers
#
# fujitsu SoC drivers
#
# end of fujitsu SoC drivers
#
# i.MX SoC drivers
#
# end of i.MX SoC drivers
#
# Enable LiteX SoC Builder specific drivers
#
# CONFIG_LITEX_SOC_CONTROLLER is not set
# end of Enable LiteX SoC Builder specific drivers
# CONFIG_WPCM450_SOC is not set
#
# Qualcomm SoC drivers
#
# end of Qualcomm SoC drivers
# CONFIG_SOC_TI is not set
#
# Xilinx SoC drivers
#
# end of Xilinx SoC drivers
# end of SOC (System On Chip) specific Drivers
#
# PM Domains
#
#
# Amlogic PM Domains
#
# end of Amlogic PM Domains
#
# Broadcom PM Domains
#
# end of Broadcom PM Domains
#
# i.MX PM Domains
#
# end of i.MX PM Domains
#
# Qualcomm PM Domains
#
# end of Qualcomm PM Domains
# end of PM Domains
# CONFIG_PM_DEVFREQ is not set
# CONFIG_EXTCON is not set
# CONFIG_MEMORY is not set
# CONFIG_IIO is not set
# CONFIG_NTB is not set
CONFIG_PWM=y
# CONFIG_PWM_DEBUG is not set
# CONFIG_PWM_PROVIDE_GPIO is not set
# CONFIG_PWM_ARGON_FAN_HAT is not set
# CONFIG_PWM_ATMEL_TCB is not set
# CONFIG_PWM_CLK is not set
# CONFIG_PWM_DWC is not set
# CONFIG_PWM_FSL_FTM is not set
# CONFIG_PWM_GPIO is not set
# CONFIG_PWM_PCA9685 is not set
# CONFIG_PWM_XILINX is not set
#
# IRQ chip support
#
CONFIG_IRQCHIP=y
CONFIG_IRQ_MSI_LIB=y
# CONFIG_AL_FIC is not set
# CONFIG_XILINX_INTC is not set
# end of IRQ chip support
# CONFIG_IPACK_BUS is not set
# CONFIG_RESET_CONTROLLER is not set
#
# PHY Subsystem
#
CONFIG_PHY_COMMON_PROPS=y
CONFIG_PHY_COMMON_PROPS_TEST=m
# CONFIG_GENERIC_PHY is not set
# CONFIG_PHY_CAN_TRANSCEIVER is not set
# CONFIG_PHY_GOOGLE_USB is not set
# CONFIG_PHY_NXP_PTN3222 is not set
#
# PHY drivers for Broadcom platforms
#
# CONFIG_BCM_KONA_USB2_PHY is not set
# end of PHY drivers for Broadcom platforms
# CONFIG_PHY_CADENCE_TORRENT is not set
# CONFIG_PHY_CADENCE_DPHY is not set
# CONFIG_PHY_CADENCE_DPHY_RX is not set
# CONFIG_PHY_CADENCE_SALVO is not set
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
# CONFIG_PHY_MAPPHONE_MDM6600 is not set
# end of PHY Subsystem
# CONFIG_POWERCAP is not set
# CONFIG_MCB is not set
#
# Performance monitor support
#
# CONFIG_DWC_PCIE_PMU is not set
CONFIG_CXL_PMU=m
# end of Performance monitor support
CONFIG_RAS=y
CONFIG_USB4=y
# CONFIG_USB4_DEBUGFS_WRITE is not set
# CONFIG_USB4_DMA_TEST is not set
#
# Android
#
# CONFIG_ANDROID_BINDER_IPC is not set
# end of Android
CONFIG_LIBNVDIMM=m
CONFIG_BLK_DEV_PMEM=m
CONFIG_ND_CLAIM=y
# CONFIG_BTT is not set
CONFIG_ND_PFN=m
CONFIG_NVDIMM_PFN=y
CONFIG_NVDIMM_DAX=y
CONFIG_OF_PMEM=m
CONFIG_RAMDAX=m
CONFIG_NVDIMM_KEYS=y
# CONFIG_NVDIMM_SECURITY_TEST is not set
CONFIG_DAX=y
CONFIG_DEV_DAX=m
CONFIG_DEV_DAX_PMEM=m
CONFIG_DEV_DAX_CXL=m
CONFIG_DEV_DAX_FSDEV=m
CONFIG_DEV_DAX_KMEM=m
CONFIG_NVMEM=y
CONFIG_NVMEM_SYSFS=y
CONFIG_NVMEM_LAYOUTS=y
#
# Layout Types
#
# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set
# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set
# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set
# end of Layout Types
# CONFIG_NVMEM_RMEM is not set
# CONFIG_NVMEM_U_BOOT_ENV is not set
#
# HW tracing support
#
# CONFIG_STM is not set
# CONFIG_INTEL_TH is not set
# end of HW tracing support
# CONFIG_FPGA is not set
# CONFIG_FSI is not set
# CONFIG_MUX_CORE is not set
# CONFIG_SIOX is not set
# CONFIG_SLIMBUS is not set
CONFIG_INTERCONNECT=y
CONFIG_INTERCONNECT_KUNIT_TEST=m
# CONFIG_COUNTER is not set
# CONFIG_MOST is not set
# CONFIG_PECI is not set
# CONFIG_HTE is not set
# end of Device Drivers
#
# File systems
#
CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_VALIDATE_FS_PARSER is not set
CONFIG_FS_IOMAP=y
CONFIG_FS_STACK=y
CONFIG_BUFFER_HEAD=y
CONFIG_LEGACY_DIRECT_IO=y
# CONFIG_EXT2_FS is not set
CONFIG_EXT4_FS=m
CONFIG_EXT4_USE_FOR_EXT2=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_DEBUG is not set
CONFIG_EXT4_KUNIT_TESTS=m
CONFIG_JBD2=m
# CONFIG_JBD2_DEBUG is not set
CONFIG_FS_MBCACHE=m
# CONFIG_JFS_FS is not set
CONFIG_XFS_FS=m
# CONFIG_XFS_SUPPORT_V4 is not set
# CONFIG_XFS_SUPPORT_ASCII_CI is not set
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
# CONFIG_XFS_RT is not set
CONFIG_XFS_DRAIN_INTENTS=y
CONFIG_XFS_LIVE_HOOKS=y
CONFIG_XFS_MEMORY_BUFS=y
CONFIG_XFS_ONLINE_SCRUB=y
# CONFIG_XFS_ONLINE_SCRUB_STATS is not set
# CONFIG_XFS_ONLINE_REPAIR is not set
# CONFIG_XFS_WARN is not set
# CONFIG_XFS_DEBUG is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
CONFIG_BTRFS_FS=y
# CONFIG_BTRFS_FS_POSIX_ACL is not set
# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
# CONFIG_BTRFS_DEBUG is not set
# CONFIG_BTRFS_ASSERT is not set
# CONFIG_BTRFS_EXPERIMENTAL is not set
# CONFIG_NILFS2_FS is not set
# CONFIG_F2FS_FS is not set
# CONFIG_ZONEFS_FS is not set
CONFIG_FS_DAX=y
CONFIG_FS_DAX_PMD=y
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
CONFIG_EXPORTFS_BLOCK_OPS=y
CONFIG_FILE_LOCKING=y
CONFIG_FS_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_ALGS=m
CONFIG_FS_VERITY=y
# CONFIG_FS_VERITY_BUILTIN_SIGNATURES is not set
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_AUTOFS_FS=y
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
CONFIG_VIRTIO_FS=m
CONFIG_FUSE_DAX=y
CONFIG_FUSE_PASSTHROUGH=y
CONFIG_FUSE_IO_URING=y
CONFIG_OVERLAY_FS=m
# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set
# CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW is not set
# CONFIG_OVERLAY_FS_INDEX is not set
# CONFIG_OVERLAY_FS_XINO_AUTO is not set
# CONFIG_OVERLAY_FS_METACOPY is not set
# CONFIG_OVERLAY_FS_DEBUG is not set
#
# Caches
#
CONFIG_NETFS_SUPPORT=m
CONFIG_NETFS_STATS=y
# CONFIG_NETFS_DEBUG is not set
CONFIG_FSCACHE=y
CONFIG_FSCACHE_STATS=y
CONFIG_CACHEFILES=m
# CONFIG_CACHEFILES_DEBUG is not set
# CONFIG_CACHEFILES_ERROR_INJECTION is not set
# CONFIG_CACHEFILES_ONDEMAND is not set
# end of Caches
#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=m
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=m
# end of CD-ROM/DVD Filesystems
#
# DOS/FAT/EXFAT/NT Filesystems
#
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
# CONFIG_FAT_DEFAULT_UTF8 is not set
CONFIG_FAT_KUNIT_TEST=m
CONFIG_EXFAT_FS=m
CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS3_FS is not set
# end of DOS/FAT/EXFAT/NT Filesystems
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_VMCORE_DEVICE_DUMP=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_PROC_CHILDREN=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_TMPFS_XATTR=y
CONFIG_TMPFS_INODE64=y
CONFIG_TMPFS_QUOTA=y
CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
CONFIG_CONFIGFS_FS=y
# end of Pseudo filesystems
CONFIG_MISC_FILESYSTEMS=y
# CONFIG_ORANGEFS_FS is not set
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_ECRYPT_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS2_FS is not set
# CONFIG_UBIFS_FS is not set
# CONFIG_CRAMFS is not set
CONFIG_SQUASHFS=m
# CONFIG_SQUASHFS_FILE_CACHE is not set
CONFIG_SQUASHFS_FILE_DIRECT=y
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set
# CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE is not set
# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set
CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU=y
CONFIG_SQUASHFS_XATTR=y
# CONFIG_SQUASHFS_COMP_CACHE_FULL is not set
CONFIG_SQUASHFS_ZLIB=y
# CONFIG_SQUASHFS_LZ4 is not set
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
# CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX6FS_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_PSTORE=y
CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240
CONFIG_PSTORE_COMPRESS=y
# CONFIG_PSTORE_CONSOLE is not set
# CONFIG_PSTORE_PMSG is not set
# CONFIG_PSTORE_FTRACE is not set
CONFIG_PSTORE_RAM=m
# CONFIG_PSTORE_BLK is not set
# CONFIG_UFS_FS is not set
CONFIG_EROFS_FS=m
# CONFIG_EROFS_FS_DEBUG is not set
CONFIG_EROFS_FS_XATTR=y
CONFIG_EROFS_FS_POSIX_ACL=y
CONFIG_EROFS_FS_SECURITY=y
CONFIG_EROFS_FS_BACKED_BY_FILE=y
CONFIG_EROFS_FS_ZIP=y
CONFIG_EROFS_FS_ZIP_LZMA=y
# CONFIG_EROFS_FS_ZIP_DEFLATE is not set
# CONFIG_EROFS_FS_ZIP_ZSTD is not set
# CONFIG_EROFS_FS_ZIP_ACCEL is not set
# CONFIG_EROFS_FS_ONDEMAND is not set
# CONFIG_EROFS_FS_PCPU_KTHREAD is not set
# CONFIG_EROFS_FS_PAGE_CACHE_SHARE is not set
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
# CONFIG_NFS_V2 is not set
CONFIG_NFS_V3=m
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=m
# CONFIG_NFS_SWAP is not set
CONFIG_NFS_V4_0=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=m
CONFIG_PNFS_BLOCK=m
CONFIG_PNFS_FLEXFILE_LAYOUT=m
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
# CONFIG_NFS_V4_1_MIGRATION is not set
CONFIG_NFS_V4_SECURITY_LABEL=y
CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_NFS_DEBUG=y
CONFIG_NFS_DISABLE_UDP_SUPPORT=y
# CONFIG_NFS_V4_2_READ_PLUS is not set
CONFIG_NFSD=m
# CONFIG_NFSD_V2 is not set
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_PNFS=y
# CONFIG_NFSD_BLOCKLAYOUT is not set
CONFIG_NFSD_SCSILAYOUT=y
# CONFIG_NFSD_FLEXFILELAYOUT is not set
# CONFIG_NFSD_V4_2_INTER_SSC is not set
CONFIG_NFSD_V4_SECURITY_LABEL=y
# CONFIG_NFSD_LEGACY_CLIENT_TRACKING is not set
# CONFIG_NFSD_V4_POSIX_ACLS is not set
CONFIG_GRACE_PERIOD=m
CONFIG_LOCKD=m
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_COMMON=y
CONFIG_NFS_COMMON_LOCALIO_SUPPORT=m
CONFIG_NFS_LOCALIO=y
CONFIG_NFS_V4_2_SSC_HELPER=y
CONFIG_SUNRPC=m
CONFIG_SUNRPC_GSS=m
CONFIG_SUNRPC_BACKCHANNEL=y
CONFIG_RPCSEC_GSS_KRB5=m
CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA1=y
CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_CAMELLIA=y
CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA2=y
CONFIG_RPCSEC_GSS_KRB5_KUNIT_TEST=m
CONFIG_SUNRPC_DEBUG=y
# CONFIG_SUNRPC_DEBUG_TRACE is not set
CONFIG_SUNRPC_XPRT_RDMA=m
CONFIG_CEPH_FS=m
# CONFIG_CEPH_FSCACHE is not set
CONFIG_CEPH_FS_POSIX_ACL=y
CONFIG_CEPH_FS_SECURITY_LABEL=y
CONFIG_CIFS=m
# CONFIG_CIFS_STATS2 is not set
CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
CONFIG_CIFS_DEBUG=y
# CONFIG_CIFS_DEBUG2 is not set
# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set
CONFIG_CIFS_DFS_UPCALL=y
# CONFIG_CIFS_SWN_UPCALL is not set
CONFIG_CIFS_SMB_DIRECT=y
# CONFIG_CIFS_FSCACHE is not set
# CONFIG_CIFS_COMPRESSION is not set
CONFIG_SMB1_KUNIT_TESTS=m
# CONFIG_SMB_SERVER is not set
CONFIG_SMBDIRECT=m
CONFIG_SMBFS=m
CONFIG_SMB_KUNIT_TESTS=m
# CONFIG_CODA_FS is not set
CONFIG_AFS_FS=m
CONFIG_AFS_DEBUG=y
CONFIG_AFS_FSCACHE=y
# CONFIG_AFS_DEBUG_CURSOR is not set
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
CONFIG_NLS_CODEPAGE_862=m
CONFIG_NLS_CODEPAGE_863=m
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_874=m
CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
CONFIG_NLS_ISO8859_5=m
CONFIG_NLS_ISO8859_6=m
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_13=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_MAC_ROMAN=m
CONFIG_NLS_MAC_CELTIC=m
CONFIG_NLS_MAC_CENTEURO=m
CONFIG_NLS_MAC_CROATIAN=m
CONFIG_NLS_MAC_CYRILLIC=m
CONFIG_NLS_MAC_GAELIC=m
CONFIG_NLS_MAC_GREEK=m
CONFIG_NLS_MAC_ICELAND=m
CONFIG_NLS_MAC_INUIT=m
CONFIG_NLS_MAC_ROMANIAN=m
CONFIG_NLS_MAC_TURKISH=m
CONFIG_NLS_UTF8=m
CONFIG_NLS_UCS2_UTILS=m
# CONFIG_DLM is not set
# CONFIG_UNICODE is not set
CONFIG_IO_WQ=y
# end of File systems
#
# Security options
#
CONFIG_KEYS=y
# CONFIG_KEYS_REQUEST_CACHE is not set
CONFIG_PERSISTENT_KEYRINGS=y
CONFIG_BIG_KEYS=y
CONFIG_TRUSTED_KEYS=y
CONFIG_HAVE_TRUSTED_KEYS=y
CONFIG_TRUSTED_KEYS_TPM=y
CONFIG_TRUSTED_KEYS_PKWM=y
CONFIG_ENCRYPTED_KEYS=y
# CONFIG_USER_DECRYPTED_DATA is not set
CONFIG_KEY_DH_OPERATIONS=y
CONFIG_KEY_NOTIFICATIONS=y
CONFIG_SECURITY_DMESG_RESTRICT=y
CONFIG_PROC_MEM_ALWAYS_FORCE=y
# CONFIG_PROC_MEM_FORCE_PTRACE is not set
# CONFIG_PROC_MEM_NO_FORCE is not set
CONFIG_SECURITY=y
CONFIG_HAS_SECURITY_AUDIT=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_INFINIBAND=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_PATH=y
CONFIG_LSM_MMAP_MIN_ADDR=65535
# CONFIG_STATIC_USERMODEHELPER is not set
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_SIDTAB_HASH_BITS=9
CONFIG_SECURITY_SELINUX_SID2STR_CACHE_SIZE=256
CONFIG_SECURITY_SELINUX_AVC_HASH_BITS=9
# CONFIG_SECURITY_SELINUX_DEBUG is not set
# CONFIG_SECURITY_SMACK is not set
# CONFIG_SECURITY_TOMOYO is not set
# CONFIG_SECURITY_APPARMOR is not set
# CONFIG_SECURITY_LOADPIN is not set
CONFIG_SECURITY_YAMA=y
# CONFIG_SECURITY_SAFESETID is not set
CONFIG_SECURITY_LOCKDOWN_LSM=y
CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y
CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y
# CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY is not set
# CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY is not set
CONFIG_SECURITY_LANDLOCK=y
# CONFIG_SECURITY_IPE is not set
CONFIG_INTEGRITY=y
CONFIG_INTEGRITY_SIGNATURE=y
CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y
CONFIG_INTEGRITY_TRUSTED_KEYRING=y
CONFIG_INTEGRITY_PLATFORM_KEYRING=y
CONFIG_INTEGRITY_MACHINE_KEYRING=y
CONFIG_INTEGRITY_CA_MACHINE_KEYRING=y
CONFIG_INTEGRITY_CA_MACHINE_KEYRING_MAX=y
CONFIG_LOAD_PPC_KEYS=y
CONFIG_INTEGRITY_AUDIT=y
CONFIG_IMA=y
CONFIG_IMA_KEXEC=y
CONFIG_IMA_MEASURE_PCR_IDX=10
CONFIG_IMA_LSM_RULES=y
# CONFIG_IMA_NG_TEMPLATE is not set
CONFIG_IMA_SIG_TEMPLATE=y
CONFIG_IMA_DEFAULT_TEMPLATE="ima-sig"
# CONFIG_IMA_DEFAULT_HASH_SHA1 is not set
CONFIG_IMA_DEFAULT_HASH_SHA256=y
# CONFIG_IMA_DEFAULT_HASH_SHA512 is not set
CONFIG_IMA_DEFAULT_HASH="sha256"
CONFIG_IMA_WRITE_POLICY=y
CONFIG_IMA_READ_POLICY=y
CONFIG_IMA_APPRAISE=y
CONFIG_IMA_ARCH_POLICY=y
# CONFIG_IMA_APPRAISE_BUILD_POLICY is not set
CONFIG_IMA_APPRAISE_BOOTPARAM=y
CONFIG_IMA_APPRAISE_MODSIG=y
CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY=y
# CONFIG_IMA_BLACKLIST_KEYRING is not set
# CONFIG_IMA_LOAD_X509 is not set
CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS=y
CONFIG_IMA_QUEUE_EARLY_BOOT_KEYS=y
CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT=y
# CONFIG_IMA_DISABLE_HTABLE is not set
CONFIG_IMA_KEXEC_EXTRA_MEMORY_KB=0
CONFIG_EVM=y
CONFIG_EVM_ATTR_FSUUID=y
# CONFIG_EVM_ADD_XATTRS is not set
# CONFIG_EVM_LOAD_X509 is not set
CONFIG_DEFAULT_SECURITY_SELINUX=y
# CONFIG_DEFAULT_SECURITY_DAC is not set
CONFIG_LSM="lockdown,yama,integrity,selinux,bpf,landlock"
#
# Kernel hardening options
#
#
# Memory initialization
#
CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y
CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y
CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y
# CONFIG_INIT_STACK_NONE is not set
# CONFIG_INIT_STACK_ALL_PATTERN is not set
CONFIG_INIT_STACK_ALL_ZERO=y
# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
# CONFIG_ZERO_CALL_USED_REGS is not set
# end of Memory initialization
#
# Bounds checking
#
CONFIG_FORTIFY_SOURCE=y
CONFIG_HARDENED_USERCOPY=y
CONFIG_HARDENED_USERCOPY_DEFAULT_ON=y
# end of Bounds checking
#
# Hardening of kernel data structures
#
CONFIG_LIST_HARDENED=y
CONFIG_BUG_ON_DATA_CORRUPTION=y
# end of Hardening of kernel data structures
CONFIG_RANDSTRUCT_NONE=y
# end of Kernel hardening options
# end of Security options
CONFIG_ASYNC_CORE=m
CONFIG_ASYNC_MEMCPY=m
CONFIG_ASYNC_XOR=m
CONFIG_ASYNC_PQ=m
CONFIG_ASYNC_RAID6_RECOV=m
CONFIG_CRYPTO=y
#
# Crypto core or helper
#
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_SIG=y
CONFIG_CRYPTO_SIG2=y
CONFIG_CRYPTO_SKCIPHER=y
CONFIG_CRYPTO_SKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=y
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_AKCIPHER2=y
CONFIG_CRYPTO_AKCIPHER=y
CONFIG_CRYPTO_KPP2=y
CONFIG_CRYPTO_KPP=y
CONFIG_CRYPTO_ACOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
CONFIG_CRYPTO_USER=y
# CONFIG_CRYPTO_SELFTESTS is not set
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_PCRYPT=m
CONFIG_CRYPTO_CRYPTD=y
CONFIG_CRYPTO_AUTHENC=y
CONFIG_CRYPTO_KRB5ENC=m
# CONFIG_CRYPTO_BENCHMARK is not set
CONFIG_CRYPTO_SIMD=y
# end of Crypto core or helper
#
# Public-key cryptography
#
CONFIG_CRYPTO_RSA=y
CONFIG_CRYPTO_DH=y
CONFIG_CRYPTO_DH_RFC7919_GROUPS=y
CONFIG_CRYPTO_ECC=y
CONFIG_CRYPTO_ECDH=y
CONFIG_CRYPTO_ECDSA=y
# CONFIG_CRYPTO_ECRDSA is not set
# CONFIG_CRYPTO_MLDSA is not set
# end of Public-key cryptography
#
# Block ciphers
#
CONFIG_CRYPTO_AES=y
# CONFIG_CRYPTO_ARIA is not set
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_BLOWFISH_COMMON=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST_COMMON=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_DES=m
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_SERPENT=m
# CONFIG_CRYPTO_SM4_GENERIC is not set
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_TWOFISH_COMMON=m
# end of Block ciphers
#
# Length-preserving ciphers and modes
#
CONFIG_CRYPTO_ADIANTUM=m
CONFIG_CRYPTO_CHACHA20=m
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_CTR=y
CONFIG_CRYPTO_CTS=y
CONFIG_CRYPTO_ECB=y
# CONFIG_CRYPTO_HCTR2 is not set
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=y
# end of Length-preserving ciphers and modes
#
# AEAD (authenticated encryption with associated data) ciphers
#
# CONFIG_CRYPTO_AEGIS128 is not set
CONFIG_CRYPTO_CHACHA20POLY1305=m
CONFIG_CRYPTO_CCM=y
CONFIG_CRYPTO_GCM=y
CONFIG_CRYPTO_GENIV=y
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_ECHAINIV=m
CONFIG_CRYPTO_ESSIV=m
# end of AEAD (authenticated encryption with associated data) ciphers
#
# Hashes, digests, and MACs
#
CONFIG_CRYPTO_BLAKE2B=m
CONFIG_CRYPTO_CMAC=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_SHA3=y
# CONFIG_CRYPTO_SM3 is not set
# CONFIG_CRYPTO_STREEBOG is not set
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_XXHASH=m
# end of Hashes, digests, and MACs
#
# CRCs (cyclic redundancy checks)
#
CONFIG_CRYPTO_CRC32C=y
CONFIG_CRYPTO_CRC32=m
# end of CRCs (cyclic redundancy checks)
#
# Compression
#
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_LZO=y
CONFIG_CRYPTO_842=m
# CONFIG_CRYPTO_LZ4 is not set
# CONFIG_CRYPTO_LZ4HC is not set
CONFIG_CRYPTO_ZSTD=m
# end of Compression
#
# Random number generation
#
CONFIG_CRYPTO_DRBG_MENU=y
CONFIG_CRYPTO_DRBG_HMAC=y
CONFIG_CRYPTO_DRBG_HASH=y
CONFIG_CRYPTO_DRBG_CTR=y
CONFIG_CRYPTO_DRBG=y
CONFIG_CRYPTO_JITTERENTROPY=y
CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64
CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32
CONFIG_CRYPTO_JITTERENTROPY_OSR=1
CONFIG_CRYPTO_KDF800108_CTR=y
CONFIG_CRYPTO_DF80090A=y
# end of Random number generation
#
# Userspace interface
#
CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CRYPTO_USER_API_SKCIPHER=y
CONFIG_CRYPTO_USER_API_RNG=y
# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set
CONFIG_CRYPTO_USER_API_AEAD=y
# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set
# end of Userspace interface
#
# Accelerated Cryptographic Algorithms for CPU (powerpc)
#
CONFIG_CRYPTO_AES_GCM_P10=y
CONFIG_CRYPTO_DEV_VMX=y
CONFIG_CRYPTO_DEV_VMX_ENCRYPT=m
# end of Accelerated Cryptographic Algorithms for CPU (powerpc)
CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_NX=y
CONFIG_CRYPTO_DEV_NX_COMPRESS=y
# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
CONFIG_CRYPTO_DEV_NITROX=m
CONFIG_CRYPTO_DEV_NITROX_CNN55XX=m
# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set
# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set
# CONFIG_CRYPTO_DEV_QAT_C62X is not set
# CONFIG_CRYPTO_DEV_QAT_4XXX is not set
# CONFIG_CRYPTO_DEV_QAT_420XX is not set
# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set
# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set
CONFIG_CRYPTO_DEV_CHELSIO=m
# CONFIG_CRYPTO_DEV_VIRTIO is not set
# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
# CONFIG_CRYPTO_DEV_CCREE is not set
# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_X509_CERTIFICATE_PARSER=y
CONFIG_PKCS8_PRIVATE_KEY_PARSER=m
CONFIG_PKCS7_MESSAGE_PARSER=y
# CONFIG_PKCS7_TEST_KEY is not set
# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
CONFIG_FIPS_SIGNATURE_SELFTEST=y
CONFIG_FIPS_SIGNATURE_SELFTEST_RSA=y
CONFIG_FIPS_SIGNATURE_SELFTEST_ECDSA=y
#
# Certificates for signature checking
#
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
# CONFIG_MODULE_SIG_KEY_TYPE_ECDSA is not set
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096
CONFIG_SECONDARY_TRUSTED_KEYRING=y
# CONFIG_SECONDARY_TRUSTED_KEYRING_SIGNED_BY_BUILTIN is not set
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""
# CONFIG_SYSTEM_REVOCATION_LIST is not set
CONFIG_SYSTEM_BLACKLIST_AUTH_UPDATE=y
# end of Certificates for signature checking
CONFIG_CRYPTO_KRB5=m
# CONFIG_CRYPTO_KRB5_SELFTESTS is not set
CONFIG_BINARY_PRINTF=y
#
# Library routines
#
CONFIG_RAID6_PQ=y
# CONFIG_RAID6_PQ_BENCHMARK is not set
CONFIG_LINEAR_RANGES=m
CONFIG_PACKING=y
CONFIG_PACKING_KUNIT_TEST=m
CONFIG_BITREVERSE=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
CONFIG_GENERIC_NET_UTILS=y
CONFIG_CORDIC=m
CONFIG_POLYNOMIAL=m
CONFIG_PRIME_NUMBERS=m
CONFIG_RATIONAL=y
CONFIG_GENERIC_IOMAP=y
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
CONFIG_CRC8=m
CONFIG_CRC16=m
CONFIG_CRC_CCITT=y
CONFIG_CRC_ITU_T=m
CONFIG_CRC_T10DIF=y
CONFIG_CRC_T10DIF_ARCH=y
CONFIG_CRC32=y
CONFIG_CRC32_ARCH=y
CONFIG_CRC64=y
CONFIG_CRC_OPTIMIZATIONS=y
CONFIG_CRC_KUNIT_TEST=m
# CONFIG_CRC_ENABLE_ALL_FOR_KUNIT is not set
# CONFIG_CRC_BENCHMARK is not set
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_LIB_UTILS=y
CONFIG_CRYPTO_LIB_AES=y
CONFIG_CRYPTO_LIB_AES_ARCH=y
CONFIG_CRYPTO_LIB_AESCFB=y
CONFIG_CRYPTO_LIB_AES_CBC_MACS=y
CONFIG_CRYPTO_LIB_ARC4=m
CONFIG_CRYPTO_LIB_GF128MUL=m
CONFIG_CRYPTO_LIB_BLAKE2B=y
CONFIG_CRYPTO_LIB_CHACHA=y
CONFIG_CRYPTO_LIB_CHACHA_ARCH=y
CONFIG_CRYPTO_LIB_CURVE25519=m
CONFIG_CRYPTO_LIB_CURVE25519_ARCH=y
CONFIG_CRYPTO_LIB_DES=m
CONFIG_CRYPTO_LIB_GF128HASH=y
CONFIG_CRYPTO_LIB_GF128HASH_ARCH=y
CONFIG_CRYPTO_LIB_MD5=y
CONFIG_CRYPTO_LIB_MD5_ARCH=y
CONFIG_CRYPTO_LIB_NH=m
CONFIG_CRYPTO_LIB_POLY1305=y
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1
CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y
CONFIG_CRYPTO_LIB_SHA1=y
CONFIG_CRYPTO_LIB_SHA1_ARCH=y
CONFIG_CRYPTO_LIB_SHA256=y
CONFIG_CRYPTO_LIB_SHA512=y
CONFIG_CRYPTO_LIB_SHA3=y
CONFIG_XOR_BLOCKS=y
CONFIG_XOR_BLOCKS_ARCH=y
CONFIG_XOR_KUNIT_TEST=m
CONFIG_XXHASH=y
CONFIG_AUDIT_GENERIC=y
CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_842_COMPRESS=m
CONFIG_842_DECOMPRESS=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4HC_COMPRESS=m
CONFIG_LZ4_DECOMPRESS=y
CONFIG_ZSTD_COMMON=y
CONFIG_ZSTD_COMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_ARM64=y
CONFIG_XZ_DEC_SPARC=y
CONFIG_XZ_DEC_RISCV=y
CONFIG_XZ_DEC_MICROLZMA=y
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_DECOMPRESS_LZ4=y
CONFIG_DECOMPRESS_ZSTD=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_REED_SOLOMON=m
CONFIG_REED_SOLOMON_ENC8=y
CONFIG_REED_SOLOMON_DEC8=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_BTREE=y
CONFIG_INTERVAL_TREE=y
CONFIG_INTERVAL_TREE_SPAN_ITER=y
CONFIG_XARRAY_MULTI=y
CONFIG_ASSOCIATIVE_ARRAY=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_IOPORT_MAP=y
CONFIG_HAS_DMA=y
CONFIG_DMA_OPS_HELPERS=y
CONFIG_DMA_OPS_BYPASS=y
CONFIG_ARCH_HAS_DMA_MAP_DIRECT=y
CONFIG_NEED_SG_DMA_FLAGS=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_DMA_DECLARE_COHERENT=y
CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED=y
CONFIG_ARCH_DMA_DEFAULT_COHERENT=y
CONFIG_SWIOTLB=y
# CONFIG_SWIOTLB_DYNAMIC is not set
CONFIG_DMA_NEED_SYNC=y
# CONFIG_DMA_RESTRICTED_POOL is not set
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_DMA_MAP_BENCHMARK is not set
CONFIG_SGL_ALLOC=y
CONFIG_IOMMU_HELPER=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_CPUMASK_OFFSTACK=y
CONFIG_CPU_RMAP=y
CONFIG_DQL=y
CONFIG_GLOB=y
CONFIG_NLATTR=y
CONFIG_CLZ_TAB=y
CONFIG_IRQ_POLL=y
CONFIG_MPILIB=y
CONFIG_SIGNATURE=y
CONFIG_DIMLIB=y
CONFIG_LIBFDT=y
CONFIG_OID_REGISTRY=y
CONFIG_HAVE_GENERIC_VDSO=y
CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_VDSO_GETRANDOM=y
CONFIG_FONT_SUPPORT=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_FONT_SUN8x16=y
CONFIG_SG_POOL=y
CONFIG_ARCH_HAS_PMEM_API=y
CONFIG_MEMREGION=y
CONFIG_ARCH_HAS_MEMREMAP_COMPAT_ALIGN=y
CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
CONFIG_ARCH_HAS_COPY_MC=y
CONFIG_ARCH_STACKWALK=y
CONFIG_STACKDEPOT=y
CONFIG_STACKDEPOT_MAX_FRAMES=64
CONFIG_SBITMAP=y
CONFIG_PARMAN=m
CONFIG_OBJAGG=m
# CONFIG_LWQ_TEST is not set
# end of Library routines
CONFIG_GENERIC_IOREMAP=y
CONFIG_PLDMFW=y
CONFIG_ASN1_ENCODER=y
CONFIG_FIRMWARE_TABLE=y
CONFIG_UNION_FIND=y
CONFIG_MIN_HEAP=y
#
# Kernel hacking
#
#
# printk and dmesg options
#
CONFIG_PRINTK_TIME=y
# CONFIG_PRINTK_CALLER is not set
CONFIG_PRINTK_EXECUTION_CTX=y
# CONFIG_STACKTRACE_BUILD_ID is not set
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
CONFIG_CONSOLE_LOGLEVEL_QUIET=4
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DYNAMIC_DEBUG_CORE=y
CONFIG_SYMBOLIC_ERRNAME=y
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_BUGVERBOSE_DETAILED is not set
# end of printk and dmesg options
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_MISC=y
#
# Compile-time checks and compiler options
#
CONFIG_DEBUG_INFO=y
CONFIG_AS_HAS_NON_CONST_ULEB128=y
# CONFIG_DEBUG_INFO_NONE is not set
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
# CONFIG_DEBUG_INFO_DWARF4 is not set
# CONFIG_DEBUG_INFO_DWARF5 is not set
# CONFIG_DEBUG_INFO_REDUCED is not set
CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
# CONFIG_GDB_SCRIPTS is not set
CONFIG_FRAME_WARN=2048
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_READABLE_ASM is not set
CONFIG_HEADERS_INSTALL=y
CONFIG_DEBUG_SECTION_MISMATCH=y
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
CONFIG_OBJTOOL=y
# CONFIG_OBJTOOL_WERROR is not set
# CONFIG_VMLINUX_MAP is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# end of Compile-time checks and compiler options
#
# Generic Kernel Debugging Instruments
#
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
CONFIG_MAGIC_SYSRQ_SERIAL=y
CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=""
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_FS_ALLOW_ALL=y
# CONFIG_DEBUG_FS_ALLOW_NONE is not set
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_HONOUR_BLOCKLIST=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
# CONFIG_KGDB_TESTS_ON_BOOT is not set
CONFIG_KGDB_KDB=y
CONFIG_KDB_DEFAULT_ENABLE=0x0
CONFIG_KDB_KEYBOARD=y
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_ARCH_HAS_UBSAN=y
# CONFIG_UBSAN is not set
CONFIG_HAVE_ARCH_KCSAN=y
CONFIG_HAVE_KCSAN_COMPILER=y
# CONFIG_KCSAN is not set
# end of Generic Kernel Debugging Instruments
#
# Networking Debugging
#
# CONFIG_NET_DEV_REFCNT_TRACKER is not set
# CONFIG_NET_NS_REFCNT_TRACKER is not set
# CONFIG_DEBUG_NET is not set
# CONFIG_DEBUG_NET_SMALL_RTNL is not set
# end of Networking Debugging
#
# Memory Debugging
#
CONFIG_PAGE_EXTENSION=y
# CONFIG_DEBUG_PAGEALLOC is not set
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_DEBUG_ON is not set
CONFIG_PAGE_OWNER=y
CONFIG_PAGE_POISONING=y
# CONFIG_DEBUG_PAGE_REF is not set
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_ARCH_HAS_DEBUG_WX=y
CONFIG_DEBUG_WX=y
CONFIG_ARCH_HAS_PTDUMP=y
CONFIG_PTDUMP=y
# CONFIG_PTDUMP_DEBUGFS is not set
CONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_KMEMLEAK is not set
CONFIG_PER_VMA_LOCK_STATS=y
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_SHRINKER_DEBUG is not set
# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_SCHED_STACK_END_CHECK=y
CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
# CONFIG_DEBUG_VFS is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VM_PGTABLE is not set
CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
# CONFIG_DEBUG_VIRTUAL is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_PER_CPU_MAPS is not set
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
CONFIG_DEBUG_STACKOVERFLOW=y
# CONFIG_MEM_ALLOC_PROFILING is not set
CONFIG_HAVE_ARCH_KASAN=y
CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
CONFIG_ARCH_DISABLE_KASAN_INLINE=y
CONFIG_ARCH_NEEDS_DEFER_KASAN=y
CONFIG_CC_HAS_KASAN_GENERIC=y
CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
# CONFIG_KASAN is not set
CONFIG_HAVE_ARCH_KFENCE=y
CONFIG_KFENCE=y
CONFIG_KFENCE_SAMPLE_INTERVAL=100
CONFIG_KFENCE_NUM_OBJECTS=255
# CONFIG_KFENCE_DEFERRABLE is not set
# CONFIG_KFENCE_STATIC_KEYS is not set
CONFIG_KFENCE_STRESS_TEST_FAULTS=0
CONFIG_KFENCE_KUNIT_TEST=m
# end of Memory Debugging
CONFIG_DEBUG_SHIRQ=y
#
# Debug Oops, Lockups and Hangs
#
CONFIG_PANIC_ON_OOPS=y
CONFIG_LOCKUP_DETECTOR=y
CONFIG_SOFTLOCKUP_DETECTOR=y
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=0
CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y
CONFIG_HARDLOCKUP_DETECTOR=y
# CONFIG_HARDLOCKUP_DETECTOR_PERF is not set
# CONFIG_HARDLOCKUP_DETECTOR_BUDDY is not set
CONFIG_HARDLOCKUP_DETECTOR_ARCH=y
# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=0
CONFIG_DETECT_HUNG_TASK_BLOCKER=y
# CONFIG_WQ_WATCHDOG is not set
# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set
CONFIG_TEST_LOCKUP=m
# end of Debug Oops, Lockups and Hangs
#
# Scheduler Debugging
#
CONFIG_SCHED_INFO=y
CONFIG_SCHEDSTATS=y
# end of Scheduler Debugging
# CONFIG_DEBUG_PREEMPT is not set
# CONFIG_DEBUG_ATOMIC is not set
#
# Lock Debugging (spinlocks, mutexes, etc...)
#
CONFIG_LOCK_DEBUGGING_SUPPORT=y
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
# CONFIG_DEBUG_RWSEMS is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
CONFIG_LOCK_TORTURE_TEST=m
# CONFIG_WW_MUTEX_SELFTEST is not set
# CONFIG_SCF_TORTURE_TEST is not set
# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
# end of Lock Debugging (spinlocks, mutexes, etc...)
# CONFIG_DEBUG_IRQFLAGS is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
#
# Debug kernel data structures
#
CONFIG_DEBUG_LIST=y
# CONFIG_DEBUG_PLIST is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_MAPLE_TREE is not set
# end of Debug kernel data structures
#
# RCU Debugging
#
CONFIG_TORTURE_TEST=m
CONFIG_RCU_SCALE_TEST=m
CONFIG_RCU_TORTURE_TEST=m
# CONFIG_RCU_TORTURE_TEST_CHK_RDR_STATE is not set
# CONFIG_RCU_TORTURE_TEST_LOG_CPU is not set
# CONFIG_RCU_TORTURE_TEST_LOG_GP is not set
CONFIG_RCU_REF_SCALE_TEST=m
CONFIG_RCU_CPU_STALL_TIMEOUT=60
CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
# CONFIG_RCU_CPU_STALL_CPUTIME is not set
CONFIG_RCU_TRACE=y
# CONFIG_RCU_EQS_DEBUG is not set
# end of RCU Debugging
# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
# CONFIG_LATENCYTOP is not set
# CONFIG_DEBUG_CGROUP_REF is not set
CONFIG_NOP_TRACER=y
CONFIG_HAVE_RETHOOK=y
CONFIG_RETHOOK=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y
CONFIG_HAVE_FTRACE_GRAPH_FUNC=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_OBJTOOL_MCOUNT=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_TRACEFS_AUTOMOUNT_DEPRECATED=y
CONFIG_BOOTTIME_TRACING=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
# CONFIG_FUNCTION_GRAPH_RETVAL is not set
# CONFIG_FUNCTION_GRAPH_RETADDR is not set
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y
# CONFIG_FUNCTION_SELF_TRACING is not set
CONFIG_FPROBE=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_STACK_TRACER=y
# CONFIG_IRQSOFF_TRACER is not set
# CONFIG_PREEMPT_TRACER is not set
CONFIG_SCHED_TRACER=y
CONFIG_HWLAT_TRACER=y
CONFIG_OSNOISE_TRACER=y
CONFIG_TIMERLAT_TRACER=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_TRACE_SYSCALL_BUF_SIZE_DEFAULT=63
CONFIG_TRACER_SNAPSHOT=y
# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_FPROBE_EVENTS=y
CONFIG_KPROBE_EVENTS=y
# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set
CONFIG_UPROBE_EVENTS=y
CONFIG_EPROBE_EVENTS=y
CONFIG_BPF_EVENTS=y
CONFIG_DYNAMIC_EVENTS=y
CONFIG_PROBE_EVENTS=y
CONFIG_FTRACE_MCOUNT_USE_OBJTOOL=y
CONFIG_TRACING_MAP=y
CONFIG_SYNTH_EVENTS=y
# CONFIG_USER_EVENTS is not set
CONFIG_HIST_TRIGGERS=y
# CONFIG_TRACE_EVENT_INJECT is not set
# CONFIG_TRACEPOINT_BENCHMARK is not set
CONFIG_RING_BUFFER_BENCHMARK=m
# CONFIG_TRACE_EVAL_MAP_FILE is not set
# CONFIG_FTRACE_RECORD_RECURSION is not set
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set
# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
# CONFIG_SYNTH_EVENT_GEN_TEST is not set
# CONFIG_KPROBE_EVENT_GEN_TEST is not set
# CONFIG_HIST_TRIGGERS_DEBUG is not set
CONFIG_RV_MON_EVENTS=y
CONFIG_RV_MON_MAINTENANCE_EVENTS=y
CONFIG_DA_MON_EVENTS_ID=y
CONFIG_RV=y
CONFIG_RV_PER_TASK_MONITORS=2
CONFIG_RV_MON_WWNR=y
# CONFIG_RV_MON_RTAPP is not set
# CONFIG_RV_MON_STALL is not set
# CONFIG_RV_MON_DEADLINE is not set
CONFIG_RV_REACTORS=y
CONFIG_RV_REACT_PRINTK=y
CONFIG_RV_REACT_PANIC=y
# CONFIG_TRACE_REMOTE_TEST is not set
# CONFIG_SAMPLES is not set
CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
CONFIG_STRICT_DEVMEM=y
# CONFIG_IO_STRICT_DEVMEM is not set
#
# powerpc Debugging
#
CONFIG_PPC_DISABLE_WERROR=y
CONFIG_PRINT_STACK_DEPTH=64
# CONFIG_HCALL_STATS is not set
CONFIG_PPC_EMULATED_STATS=y
# CONFIG_CODE_PATCHING_SELFTEST is not set
CONFIG_JUMP_LABEL_FEATURE_CHECKS=y
# CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG is not set
# CONFIG_FTR_FIXUP_SELFTEST is not set
CONFIG_MSI_BITMAP_SELFTEST=y
# CONFIG_GUEST_STATE_BUFFER_TEST is not set
# CONFIG_PPC_IRQ_SOFT_MASK_DEBUG is not set
# CONFIG_PPC_RFI_SRR_DEBUG is not set
CONFIG_XMON=y
# CONFIG_XMON_DEFAULT is not set
CONFIG_XMON_DISASSEMBLY=y
CONFIG_XMON_DEFAULT_RO_MODE=y
CONFIG_DEBUGGER=y
CONFIG_BOOTX_TEXT=y
# CONFIG_PPC_EARLY_DEBUG is not set
# end of powerpc Debugging
#
# Kernel Testing and Coverage
#
CONFIG_KUNIT=m
CONFIG_KUNIT_DEBUGFS=y
# CONFIG_KUNIT_FAULT_TEST is not set
CONFIG_KUNIT_TEST=m
CONFIG_KUNIT_EXAMPLE_TEST=m
CONFIG_KUNIT_ALL_TESTS=m
# CONFIG_KUNIT_DEFAULT_ENABLED is not set
CONFIG_KUNIT_AUTORUN_ENABLED=y
CONFIG_KUNIT_DEFAULT_FILTER_GLOB=""
CONFIG_KUNIT_DEFAULT_FILTER=""
CONFIG_KUNIT_DEFAULT_FILTER_ACTION=""
CONFIG_KUNIT_DEFAULT_TIMEOUT=300
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
# CONFIG_FUNCTION_ERROR_INJECTION is not set
# CONFIG_FAULT_INJECTION is not set
CONFIG_ARCH_HAS_KCOV=y
# CONFIG_KCOV is not set
CONFIG_RUNTIME_TESTING_MENU=y
# CONFIG_TEST_DHRY is not set
# CONFIG_LKDTM is not set
CONFIG_CPUMASK_KUNIT_TEST=m
# CONFIG_TEST_LIST_SORT is not set
CONFIG_TEST_SORT=m
# CONFIG_TEST_DIV64 is not set
# CONFIG_TEST_MULDIV64 is not set
CONFIG_TEST_IOV_ITER=m
CONFIG_KPROBES_SANITY_TEST=m
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_TEST_REF_TRACKER is not set
# CONFIG_RBTREE_TEST is not set
# CONFIG_REED_SOLOMON_TEST is not set
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_PERCPU_TEST is not set
CONFIG_ATOMIC64_SELFTEST=y
CONFIG_ASYNC_RAID6_TEST=m
# CONFIG_TEST_HEXDUMP is not set
CONFIG_PRINTF_KUNIT_TEST=m
CONFIG_SCANF_KUNIT_TEST=m
CONFIG_SEQ_BUF_KUNIT_TEST=m
CONFIG_STRING_KUNIT_TEST=m
CONFIG_STRING_HELPERS_KUNIT_TEST=m
# CONFIG_STRING_KUNIT_BENCH is not set
CONFIG_FFS_KUNIT_TEST=m
CONFIG_TEST_KSTRTOX=y
# CONFIG_TEST_BITMAP is not set
# CONFIG_TEST_XARRAY is not set
# CONFIG_TEST_MAPLE_TREE is not set
# CONFIG_TEST_RHASHTABLE is not set
# CONFIG_TEST_IDA is not set
# CONFIG_TEST_PARMAN is not set
# CONFIG_TEST_LKM is not set
# CONFIG_TEST_BITOPS is not set
CONFIG_TEST_VMALLOC=m
# CONFIG_TEST_WORKQUEUE is not set
CONFIG_TEST_BPF=m
# CONFIG_FIND_BIT_BENCHMARK is not set
# CONFIG_TEST_FIRMWARE is not set
# CONFIG_TEST_SYSCTL is not set
CONFIG_BITOPS_KUNIT=m
CONFIG_BITFIELD_KUNIT=m
CONFIG_CHECKSUM_KUNIT=m
CONFIG_UTIL_MACROS_KUNIT=m
CONFIG_HASH_KUNIT_TEST=m
CONFIG_RESOURCE_KUNIT_TEST=m
CONFIG_SYSCTL_KUNIT_TEST=m
CONFIG_KFIFO_KUNIT_TEST=m
CONFIG_LIST_KUNIT_TEST=m
CONFIG_LIST_PRIVATE_KUNIT_TEST=m
CONFIG_HASHTABLE_KUNIT_TEST=m
CONFIG_LINEAR_RANGES_TEST=m
# CONFIG_CONTEXT_ANALYSIS_TEST is not set
CONFIG_CMDLINE_KUNIT_TEST=m
CONFIG_BASE64_KUNIT=m
CONFIG_BITS_TEST=m
CONFIG_SLUB_KUNIT_TEST=m
CONFIG_RATIONAL_KUNIT_TEST=m
CONFIG_MEMCPY_KUNIT_TEST=m
CONFIG_MIN_HEAP_KUNIT_TEST=m
CONFIG_IS_SIGNED_TYPE_KUNIT_TEST=m
CONFIG_OVERFLOW_KUNIT_TEST=m
CONFIG_RANDSTRUCT_KUNIT_TEST=m
CONFIG_STACKINIT_KUNIT_TEST=m
CONFIG_FORTIFY_KUNIT_TEST=m
CONFIG_LONGEST_SYM_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_AES_CBC_MACS_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_BLAKE2B_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_BLAKE2S_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_CHACHA20POLY1305_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_CURVE25519_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_GHASH_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_MD5_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_NH_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_POLY1305_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_POLYVAL_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_SHA1_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_SHA256_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_SHA512_KUNIT_TEST=m
CONFIG_CRYPTO_LIB_SHA3_KUNIT_TEST=m
# CONFIG_CRYPTO_LIB_ENABLE_ALL_FOR_KUNIT is not set
CONFIG_CRYPTO_LIB_BENCHMARK_VISIBLE=y
# CONFIG_CRYPTO_LIB_BENCHMARK is not set
CONFIG_SIPHASH_KUNIT_TEST=m
CONFIG_USERCOPY_KUNIT_TEST=m
CONFIG_BLACKHOLE_DEV_KUNIT_TEST=m
# CONFIG_TEST_UDELAY is not set
# CONFIG_TEST_STATIC_KEYS is not set
# CONFIG_TEST_DYNAMIC_DEBUG is not set
# CONFIG_TEST_KMOD is not set
# CONFIG_TEST_KALLSYMS is not set
# CONFIG_TEST_MEMCAT_P is not set
# CONFIG_TEST_OBJAGG is not set
# CONFIG_TEST_MEMINIT is not set
CONFIG_TEST_HMM=m
# CONFIG_TEST_FREE_PAGES is not set
# CONFIG_TEST_FPU is not set
# CONFIG_TEST_OBJPOOL is not set
CONFIG_RATELIMIT_KUNIT_TEST=m
CONFIG_UUID_KUNIT_TEST=m
CONFIG_INT_POW_KUNIT_TEST=m
CONFIG_INT_SQRT_KUNIT_TEST=m
CONFIG_INT_LOG_KUNIT_TEST=m
CONFIG_GCD_KUNIT_TEST=m
CONFIG_PRIME_NUMBERS_KUNIT_TEST=m
CONFIG_GLOB_KUNIT_TEST=m
CONFIG_ARCH_USE_MEMTEST=y
CONFIG_MEMTEST=y
# end of Kernel Testing and Coverage
#
# Rust hacking
#
# end of Rust hacking
# end of Kernel hacking
CONFIG_IO_URING_ZCRX=y
CONFIG_IO_URING_BPF=y
^ permalink raw reply
* Re: [PATCH 01/13] mm: introduce vma_flags_can_grow() and vma_can_grow()
From: Lorenzo Stoakes @ 2026-06-30 7:38 UTC (permalink / raw)
To: Zi Yan
Cc: Andrew Morton, Thomas Bogendoerfer, Madhavan Srinivasan,
Michael Ellerman, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Lucas Stach,
Inki Dae, Seung-Woo Kim, Kyungmin Park, Krzysztof Kozlowski,
Peter Griffin, Jani Nikula, Joonas Lahtinen, Rodrigo Vivi,
Tvrtko Ursulin, Rob Clark, Dmitry Baryshkov, Lyude Paul,
Danilo Krummrich, Tomi Valkeinen, Sandy Huang, Heiko Stübner,
Andy Yan, Thierry Reding, Mikko Perttunen, Jonathan Hunter,
Gerd Hoffmann, Dmitry Osipenko, Zack Rusin, Matthew Brost,
Thomas Hellstrom, Oleksandr Andrushchenko, Helge Deller,
Benjamin LaHaise, Alexander Viro, Christian Brauner, Muchun Song,
Oscar Salvador, David Hildenbrand, Baolin Wang, Liam R . Howlett,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Hugh Dickins, Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan,
Michal Hocko, Jann Horn, Pedro Falcato, Kees Cook,
Jaroslav Kysela, Takashi Iwai, linux-mips, linux-kernel,
linuxppc-dev, dri-devel, etnaviv, linux-arm-kernel,
linux-samsung-soc, intel-gfx, linux-arm-msm, freedreno, nouveau,
linux-rockchip, linux-tegra, virtualization, intel-xe, xen-devel,
linux-fbdev, linux-aio, linux-fsdevel, linux-mm, linux-sound
In-Reply-To: <DJLTDCPWMXDL.4ICZ77A1LPZZ@nvidia.com>
On Mon, Jun 29, 2026 at 04:26:18PM -0400, Zi Yan wrote:
> On Mon Jun 29, 2026 at 3:25 PM EDT, Lorenzo Stoakes wrote:
> > These test whether the VMA has stack sematics, i.e. is able to grow upwards
> > or downwards depending on the architecture.
> >
> > In order to account for arches which do not support upward-growing stacks,
> > introduce VMA_GROWSUP whose definition depends on the architecture
> > supporting it, and use vma_flags_test_single_mask() in vma_flags_can_grow()
> > to account for this.
> >
> > Update the VMA userland tests to reflect the changes
> >
> > No functional change intended.
> >
> > Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
> > ---
> > include/linux/mm.h | 21 ++++++++++++++++++---
> > tools/testing/vma/include/dup.h | 4 ++++
> > 2 files changed, 22 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index 868b2334bff3..cf7df1569052 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -472,6 +472,7 @@ enum {
> > #define VM_SAO INIT_VM_FLAG(SAO)
> > #elif defined(CONFIG_PARISC)
> > #define VM_GROWSUP INIT_VM_FLAG(GROWSUP)
> > +#define VMA_GROWSUP mk_vma_flags(VMA_GROWSUP_BIT)
> > #elif defined(CONFIG_SPARC64)
> > #define VM_SPARC_ADI INIT_VM_FLAG(SPARC_ADI)
> > #define VM_ARCH_CLEAR INIT_VM_FLAG(ARCH_CLEAR)
> > @@ -483,6 +484,7 @@ enum {
> > #endif
> > #ifndef VM_GROWSUP
> > #define VM_GROWSUP VM_NONE
> > +#define VMA_GROWSUP EMPTY_VMA_FLAGS
> > #endif
> > #ifdef CONFIG_ARM64_MTE
> > #define VM_MTE INIT_VM_FLAG(MTE)
> > @@ -1563,11 +1565,24 @@ static inline bool vma_is_initial_stack(const struct vm_area_struct *vma)
> > vma->vm_end >= vma->vm_mm->start_stack;
> > }
> >
> > -static inline bool vma_is_temporary_stack(const struct vm_area_struct *vma)
> > +static inline bool vma_flags_can_grow(const vma_flags_t *flags)
> > {
> > - int maybe_stack = vma->vm_flags & (VM_GROWSDOWN | VM_GROWSUP);
> > + if (vma_flags_test_single_mask(flags, VMA_GROWSUP))
> > + return true;
> > + if (vma_flags_test(flags, VMA_GROWSDOWN_BIT))
> > + return true;
> > +
> > + return false;
> > +}
> >
> > - if (!maybe_stack)
> > +static inline bool vma_can_grow(const struct vm_area_struct *vma)
> > +{
> > + return vma_flags_can_grow(&vma->flags);
>
> Would it save vma_flags_can_grow() if we do below?
>
> return vma_test(vma, VMA_GROWSDOWN_BIT) || vma_test_single_mask(vma, VMA_GROWSUP);
>
> I find these two functions when I am reading mm.h.
Yeah but we require vma_flags_can_grow() for code in mmap.c, the majority of
checks of this have only vma_flags_t to work with not a VMA :)
>
> > +}
> > +
> > +static inline bool vma_is_temporary_stack(const struct vm_area_struct *vma)
> > +{
> > + if (!vma_can_grow(vma))
> > return false;
> >
> > if ((vma->vm_flags & VM_STACK_INCOMPLETE_SETUP) ==
> > diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/dup.h
> > index 5d7d0afd7765..6f5bcd7fbcd8 100644
> > --- a/tools/testing/vma/include/dup.h
> > +++ b/tools/testing/vma/include/dup.h
> > @@ -245,8 +245,10 @@ enum {
> > #define VM_STACK INIT_VM_FLAG(STACK)
> > #ifdef CONFIG_STACK_GROWS_UP
> > #define VM_STACK_EARLY INIT_VM_FLAG(STACK_EARLY)
> > +#define VMA_STACK_EARLY mk_vma_flags(VMA_STACK_EARLY_BIT)
> > #else
> > #define VM_STACK_EARLY VM_NONE
> > +#define VMA_STACK_EARLY EMPTY_VMA_FLAGS
> > #endif
> > #ifdef CONFIG_ARCH_HAS_PKEYS
> > #define VM_PKEY_SHIFT ((__force int)VMA_HIGH_ARCH_0_BIT)
> > @@ -315,6 +317,8 @@ enum {
> >
> > /* Bits set in the VMA until the stack is in its final location */
> > #define VM_STACK_INCOMPLETE_SETUP (VM_RAND_READ | VM_SEQ_READ | VM_STACK_EARLY)
> > +#define VMA_STACK_INCOMPLETE_SETUP append_vma_flags( \
> > + VMA_STACK_EARLY, VMA_RAND_READ_BIT, VMA_SEQ_READ_BIT)
> >
> > #define TASK_EXEC_BIT ((current->personality & READ_IMPLIES_EXEC) ? \
> > VM_EXEC_BIT : VM_READ_BIT)
>
> Why are VMA_STACK_EARLY and VMA_STACK_INCOMPLETE_SETUP added here but
> not in mm.h?
Yeah urgh oops my bad. It doesn't really break anything but I'll fix it if a
respin is needed...
>
>
> --
> Best Regards,
> Yan, Zi
>
Thanks, Lorenzo
^ permalink raw reply
* [PATCH v2 7/9] MIPS: VDSO: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
arch/mips/vdso/vdso.lds.S | 2 ++
arch/mips/vdso/vgettimeofday.c | 3 +++
2 files changed, 5 insertions(+)
diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
index 278ab6444e98..b11ee493c67f 100644
--- a/arch/mips/vdso/vdso.lds.S
+++ b/arch/mips/vdso/vdso.lds.S
@@ -97,9 +97,11 @@ VERSION
LINUX_2.6 {
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
global:
+#if _MIPS_SIM == _MIPS_SIM_ABI64 || defined(CONFIG_COMPAT_32BIT_TIME)
__vdso_clock_gettime;
__vdso_gettimeofday;
__vdso_clock_getres;
+#endif
#if _MIPS_SIM != _MIPS_SIM_ABI64
__vdso_clock_gettime64;
__vdso_clock_getres_time64;
diff --git a/arch/mips/vdso/vgettimeofday.c b/arch/mips/vdso/vgettimeofday.c
index 00f9fcfc327e..a1fb06b8973e 100644
--- a/arch/mips/vdso/vgettimeofday.c
+++ b/arch/mips/vdso/vgettimeofday.c
@@ -12,6 +12,8 @@
#include <vdso/gettime.h>
#if _MIPS_SIM != _MIPS_SIM_ABI64
+
+#ifdef CONFIG_COMPAT_32BIT_TIME
int __vdso_clock_gettime(clockid_t clock,
struct old_timespec32 *ts)
{
@@ -29,6 +31,7 @@ int __vdso_clock_getres(clockid_t clock_id,
{
return __cvdso_clock_getres_time32(clock_id, res);
}
+#endif /* CONFIG_COMPAT_32BIT_TIME */
int __vdso_clock_gettime64(clockid_t clock,
struct __kernel_timespec *ts)
--
2.55.0
^ permalink raw reply related
* [PATCH v2 9/9] vdso/gettimeofday: Verify COMPAT_32BIT_TIME interactions
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality.
Add some build-time validations to make sure the architecture-specific
glue satisfies this requirement.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
lib/vdso/gettimeofday.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/lib/vdso/gettimeofday.c b/lib/vdso/gettimeofday.c
index b8c1fc85eb74..f7a591aba59f 100644
--- a/lib/vdso/gettimeofday.c
+++ b/lib/vdso/gettimeofday.c
@@ -25,6 +25,8 @@
*/
#include <asm/vdso/gettimeofday.h>
+#include <linux/build_bug.h>
+
/* Bring in default accessors */
#include <vdso/vsyscall.h>
@@ -325,6 +327,8 @@ __cvdso_clock_gettime32_data(const struct vdso_time_data *vd, clockid_t clock,
struct __kernel_timespec ts;
bool ok;
+ BUILD_BUG_ON(!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME));
+
ok = __cvdso_clock_gettime_common(vd, clock, &ts);
if (unlikely(!ok))
@@ -354,6 +358,8 @@ __cvdso_gettimeofday_data(const struct vdso_time_data *vd,
BUILD_BUG();
#endif
+ BUILD_BUG_ON(sizeof(tv->tv_sec) != 8 && !IS_ENABLED(CONFIG_COMPAT_32BIT_TIME));
+
if (likely(tv != NULL)) {
struct __kernel_timespec ts;
@@ -392,6 +398,8 @@ __cvdso_time_data(const struct vdso_time_data *vd, __kernel_old_time_t *time)
BUILD_BUG();
#endif
+ BUILD_BUG_ON(sizeof(*time) != 8 && !IS_ENABLED(CONFIG_COMPAT_32BIT_TIME));
+
if (vdso_is_timens_clock(vc)) {
vd = vdso_timens_data(vd);
vc = vd->clock_data;
@@ -481,6 +489,8 @@ __cvdso_clock_getres_time32_data(const struct vdso_time_data *vd, clockid_t cloc
struct __kernel_timespec ts;
bool ok;
+ BUILD_BUG_ON(!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME));
+
ok = __cvdso_clock_getres_common(vd, clock, &ts);
if (unlikely(!ok))
--
2.55.0
^ permalink raw reply related
* [PATCH v2 2/9] vdso/gettimeofday: Validate system call existence for time() and gettimeofday()
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
Not all architectures have the system calls for time() and
gettimeofday(). When the system call is missing, the vDSO function
should also not be present.
Validate that.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
lib/vdso/gettimeofday.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/lib/vdso/gettimeofday.c b/lib/vdso/gettimeofday.c
index e0f289d3d110..b8c1fc85eb74 100644
--- a/lib/vdso/gettimeofday.c
+++ b/lib/vdso/gettimeofday.c
@@ -12,6 +12,8 @@
#include <vdso/time32.h>
#include <vdso/time64.h>
+#include <uapi/linux/unistd.h>
+
/*
* The generic vDSO implementation requires that gettimeofday.h
* provides:
@@ -348,6 +350,10 @@ __cvdso_gettimeofday_data(const struct vdso_time_data *vd,
{
const struct vdso_clock *vc = vd->clock_data;
+#ifndef __NR_gettimeofday
+ BUILD_BUG();
+#endif
+
if (likely(tv != NULL)) {
struct __kernel_timespec ts;
@@ -382,6 +388,10 @@ __cvdso_time_data(const struct vdso_time_data *vd, __kernel_old_time_t *time)
const struct vdso_clock *vc = vd->clock_data;
__kernel_old_time_t t;
+#ifndef __NR_time
+ BUILD_BUG();
+#endif
+
if (vdso_is_timens_clock(vc)) {
vd = vdso_timens_data(vd);
vc = vd->clock_data;
--
2.55.0
^ permalink raw reply related
* [PATCH v2 1/9] time: Respect COMPAT_32BIT_TIME for old time type functions
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
The "old" time types use 32-bit seconds which are not y2038-safe.
Respect COMPAT_32BIT_TIME for functions using those types.
time(), stime() and gettimeofday() are disabled completely.
settimeofday() is kept as it is required to do the initial timewarping
after boot. However the 'tv' argument will be rejected.
Link: https://lore.kernel.org/lkml/e9487ebe-3730-438a-9c23-e45f75986ecc@app.fastmail.com/
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
kernel/sys_ni.c | 4 ++++
kernel/time/time.c | 24 ++++++++++++++++++++----
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
index add3032da16f..c8be0abaa407 100644
--- a/kernel/sys_ni.c
+++ b/kernel/sys_ni.c
@@ -351,6 +351,10 @@ COND_SYSCALL(ppoll_time32);
COND_SYSCALL_COMPAT(ppoll_time32);
COND_SYSCALL(utimensat_time32);
COND_SYSCALL(clock_adjtime32);
+COND_SYSCALL(gettimeofday);
+COND_SYSCALL_COMPAT(gettimeofday);
+COND_SYSCALL(time);
+COND_SYSCALL(stime);
/*
* The syscalls below are not found in include/uapi/asm-generic/unistd.h
diff --git a/kernel/time/time.c b/kernel/time/time.c
index 0dd63a91e7c5..0b7aa432bc76 100644
--- a/kernel/time/time.c
+++ b/kernel/time/time.c
@@ -43,6 +43,12 @@
#include <generated/timeconst.h>
#include "timekeeping.h"
+#if defined(CONFIG_64BIT) || defined(CONFIG_COMPAT_32BIT_TIME)
+#define __WANT_OLD_TIME_TYPE_SYSCALL 1
+#endif
+
+static_assert(sizeof(__kernel_old_time_t) == 8 ? IS_ENABLED(__WANT_OLD_TIME_TYPE_SYSCALL) : true);
+
/*
* The timezone where the local system is located. Used as a default by some
* programs who obtain this value by using gettimeofday.
@@ -51,7 +57,7 @@ struct timezone sys_tz;
EXPORT_SYMBOL(sys_tz);
-#ifdef __ARCH_WANT_SYS_TIME
+#if defined(__ARCH_WANT_SYS_TIME) && defined(__WANT_OLD_TIME_TYPE_SYSCALL)
/*
* sys_time() can be implemented in user-level using
@@ -96,7 +102,7 @@ SYSCALL_DEFINE1(stime, __kernel_old_time_t __user *, tptr)
return 0;
}
-#endif /* __ARCH_WANT_SYS_TIME */
+#endif /* __ARCH_WANT_SYS_TIME && __WANT_OLD_TIME_TYPE_SYSCALL */
#ifdef CONFIG_COMPAT_32BIT_TIME
#ifdef __ARCH_WANT_SYS_TIME32
@@ -137,6 +143,7 @@ SYSCALL_DEFINE1(stime32, old_time32_t __user *, tptr)
#endif /* __ARCH_WANT_SYS_TIME32 */
#endif
+#ifdef __WANT_OLD_TIME_TYPE_SYSCALL
SYSCALL_DEFINE2(gettimeofday, struct __kernel_old_timeval __user *, tv,
struct timezone __user *, tz)
{
@@ -154,6 +161,7 @@ SYSCALL_DEFINE2(gettimeofday, struct __kernel_old_timeval __user *, tv,
}
return 0;
}
+#endif /* __WANT_OLD_TIME_TYPE_SYSCALL */
/*
* In case for some reason the CMOS clock has not already been running
@@ -203,6 +211,9 @@ SYSCALL_DEFINE2(settimeofday, struct __kernel_old_timeval __user *, tv,
struct timezone new_tz;
if (tv) {
+ if (!IS_ENABLED(__WANT_OLD_TIME_TYPE_SYSCALL))
+ return -EINVAL;
+
if (get_user(new_ts.tv_sec, &tv->tv_sec) ||
get_user(new_ts.tv_nsec, &tv->tv_usec))
return -EFAULT;
@@ -220,7 +231,7 @@ SYSCALL_DEFINE2(settimeofday, struct __kernel_old_timeval __user *, tv,
return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
}
-#ifdef CONFIG_COMPAT
+#ifdef CONFIG_COMPAT_32BIT_TIME
COMPAT_SYSCALL_DEFINE2(gettimeofday, struct old_timeval32 __user *, tv,
struct timezone __user *, tz)
{
@@ -239,7 +250,9 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct old_timeval32 __user *, tv,
return 0;
}
+#endif /* CONFIG_COMPAT_32BIT_TIME */
+#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
struct timezone __user *, tz)
{
@@ -247,6 +260,9 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
struct timezone new_tz;
if (tv) {
+ if (!IS_ENABLED(__WANT_OLD_TIME_TYPE_SYSCALL))
+ return -EINVAL;
+
if (get_user(new_ts.tv_sec, &tv->tv_sec) ||
get_user(new_ts.tv_nsec, &tv->tv_usec))
return -EFAULT;
@@ -263,7 +279,7 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
}
-#endif
+#endif /* CONFIG_COMPAT */
#ifdef CONFIG_64BIT
SYSCALL_DEFINE1(adjtimex, struct __kernel_timex __user *, txc_p)
--
2.55.0
^ permalink raw reply related
* [PATCH v2 6/9] powerpc/vdso: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
arch/powerpc/kernel/vdso/gettimeofday.S | 8 ++++++++
arch/powerpc/kernel/vdso/vdso32.lds.S | 10 ++++++----
arch/powerpc/kernel/vdso/vgettimeofday.c | 16 ++++++++++------
3 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/arch/powerpc/kernel/vdso/gettimeofday.S b/arch/powerpc/kernel/vdso/gettimeofday.S
index 1c8e51691bf8..c635cd1e77be 100644
--- a/arch/powerpc/kernel/vdso/gettimeofday.S
+++ b/arch/powerpc/kernel/vdso/gettimeofday.S
@@ -67,9 +67,11 @@
* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz);
*
*/
+#if defined(__powerpc64__) || defined(CONFIG_COMPAT_32BIT_TIME)
V_FUNCTION_BEGIN(__kernel_gettimeofday)
cvdso_call __c_kernel_gettimeofday
V_FUNCTION_END(__kernel_gettimeofday)
+#endif
/*
* Exact prototype of clock_gettime()
@@ -77,9 +79,11 @@ V_FUNCTION_END(__kernel_gettimeofday)
* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp);
*
*/
+#if defined(__powerpc64__) || defined(CONFIG_COMPAT_32BIT_TIME)
V_FUNCTION_BEGIN(__kernel_clock_gettime)
cvdso_call __c_kernel_clock_gettime
V_FUNCTION_END(__kernel_clock_gettime)
+#endif
/*
* Exact prototype of clock_gettime64()
@@ -99,9 +103,11 @@ V_FUNCTION_END(__kernel_clock_gettime64)
* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res);
*
*/
+#if defined(__powerpc64__) || defined(CONFIG_COMPAT_32BIT_TIME)
V_FUNCTION_BEGIN(__kernel_clock_getres)
cvdso_call __c_kernel_clock_getres
V_FUNCTION_END(__kernel_clock_getres)
+#endif
/*
* Exact prototype of clock_getres_time64()
@@ -122,6 +128,8 @@ V_FUNCTION_END(__kernel_clock_getres_time64)
* time_t time(time *t);
*
*/
+#if defined(__powerpc64__) || defined(CONFIG_COMPAT_32BIT_TIME)
V_FUNCTION_BEGIN(__kernel_time)
cvdso_call __c_kernel_time call_time=1
V_FUNCTION_END(__kernel_time)
+#endif
diff --git a/arch/powerpc/kernel/vdso/vdso32.lds.S b/arch/powerpc/kernel/vdso/vdso32.lds.S
index 3f384a2526ae..876c965b827d 100644
--- a/arch/powerpc/kernel/vdso/vdso32.lds.S
+++ b/arch/powerpc/kernel/vdso/vdso32.lds.S
@@ -119,13 +119,15 @@ VERSION
{
VDSO_VERSION_STRING {
global:
- __kernel_get_syscall_map;
- __kernel_gettimeofday;
+#ifdef CONFIG_COMPAT_32BIT_TIME
__kernel_clock_gettime;
- __kernel_clock_gettime64;
__kernel_clock_getres;
- __kernel_clock_getres_time64;
+ __kernel_gettimeofday;
__kernel_time;
+#endif /* CONFIG_COMPAT_32BIT_TIME */
+ __kernel_get_syscall_map;
+ __kernel_clock_gettime64;
+ __kernel_clock_getres_time64;
__kernel_get_tbfreq;
__kernel_sync_dicache;
__kernel_sigtramp32;
diff --git a/arch/powerpc/kernel/vdso/vgettimeofday.c b/arch/powerpc/kernel/vdso/vgettimeofday.c
index 3c194e1ab562..4b712fb01a3f 100644
--- a/arch/powerpc/kernel/vdso/vgettimeofday.c
+++ b/arch/powerpc/kernel/vdso/vgettimeofday.c
@@ -18,23 +18,25 @@ int __c_kernel_clock_getres(clockid_t clock_id, struct __kernel_timespec *res,
return __cvdso_clock_getres_data(vd, clock_id, res);
}
#else
+#ifdef CONFIG_COMPAT_32BIT_TIME
int __c_kernel_clock_gettime(clockid_t clock, struct old_timespec32 *ts,
const struct vdso_time_data *vd)
{
return __cvdso_clock_gettime32_data(vd, clock, ts);
}
-int __c_kernel_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts,
- const struct vdso_time_data *vd)
-{
- return __cvdso_clock_gettime_data(vd, clock, ts);
-}
-
int __c_kernel_clock_getres(clockid_t clock_id, struct old_timespec32 *res,
const struct vdso_time_data *vd)
{
return __cvdso_clock_getres_time32_data(vd, clock_id, res);
}
+#endif /* CONFIG_COMPAT_32BIT_TIME */
+
+int __c_kernel_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts,
+ const struct vdso_time_data *vd)
+{
+ return __cvdso_clock_gettime_data(vd, clock, ts);
+}
int __c_kernel_clock_getres_time64(clockid_t clock_id, struct __kernel_timespec *res,
const struct vdso_time_data *vd)
@@ -43,6 +45,7 @@ int __c_kernel_clock_getres_time64(clockid_t clock_id, struct __kernel_timespec
}
#endif
+#if defined(__powerpc64__) || defined(CONFIG_COMPAT_32BIT_TIME)
int __c_kernel_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz,
const struct vdso_time_data *vd)
{
@@ -53,3 +56,4 @@ __kernel_old_time_t __c_kernel_time(__kernel_old_time_t *time, const struct vdso
{
return __cvdso_time_data(vd, time);
}
+#endif
--
2.55.0
^ permalink raw reply related
* [PATCH v2 5/9] ARM: VDSO: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
arch/arm/vdso/vdso.lds.S | 2 ++
arch/arm/vdso/vgettimeofday.c | 14 ++++++++------
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/arch/arm/vdso/vdso.lds.S b/arch/arm/vdso/vdso.lds.S
index 74d8d8bc8a40..e61038c0195a 100644
--- a/arch/arm/vdso/vdso.lds.S
+++ b/arch/arm/vdso/vdso.lds.S
@@ -70,9 +70,11 @@ VERSION
{
LINUX_2.6 {
global:
+#ifdef CONFIG_COMPAT_32BIT_TIME
__vdso_clock_gettime;
__vdso_gettimeofday;
__vdso_clock_getres;
+#endif /* CONFIG_COMPAT_32BIT_TIME */
__vdso_clock_gettime64;
__vdso_clock_getres_time64;
local: *;
diff --git a/arch/arm/vdso/vgettimeofday.c b/arch/arm/vdso/vgettimeofday.c
index f7a2f5dc2fdc..3eebeddbfd18 100644
--- a/arch/arm/vdso/vgettimeofday.c
+++ b/arch/arm/vdso/vgettimeofday.c
@@ -10,16 +10,17 @@
#include <asm/unwind.h>
#include <vdso/gettime.h>
+#ifdef CONFIG_COMPAT_32BIT_TIME
int __vdso_clock_gettime(clockid_t clock,
struct old_timespec32 *ts)
{
return __cvdso_clock_gettime32(clock, ts);
}
-int __vdso_clock_gettime64(clockid_t clock,
- struct __kernel_timespec *ts)
+int __vdso_clock_getres(clockid_t clock_id,
+ struct old_timespec32 *res)
{
- return __cvdso_clock_gettime(clock, ts);
+ return __cvdso_clock_getres_time32(clock_id, res);
}
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
@@ -27,11 +28,12 @@ int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
{
return __cvdso_gettimeofday(tv, tz);
}
+#endif /* CONFIG_COMPAT_32BIT_TIME */
-int __vdso_clock_getres(clockid_t clock_id,
- struct old_timespec32 *res)
+int __vdso_clock_gettime64(clockid_t clock,
+ struct __kernel_timespec *ts)
{
- return __cvdso_clock_getres_time32(clock_id, res);
+ return __cvdso_clock_gettime(clock, ts);
}
int __vdso_clock_getres_time64(clockid_t clock_id, struct __kernel_timespec *res)
--
2.55.0
^ permalink raw reply related
* [PATCH v2 3/9] x86/vdso: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
arch/x86/entry/vdso/common/vclock_gettime.c | 20 ++++++++++++--------
arch/x86/entry/vdso/vdso32/vdso32.lds.S | 2 ++
2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/arch/x86/entry/vdso/common/vclock_gettime.c b/arch/x86/entry/vdso/common/vclock_gettime.c
index 57066f346b3f..304dbd1f9db4 100644
--- a/arch/x86/entry/vdso/common/vclock_gettime.c
+++ b/arch/x86/entry/vdso/common/vclock_gettime.c
@@ -15,6 +15,7 @@
#include "lib/vdso/gettimeofday.c"
+#if defined(__x86_64__) || defined(CONFIG_COMPAT_32BIT_TIME)
int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
{
return __cvdso_gettimeofday(tv, tz);
@@ -29,6 +30,7 @@ __kernel_old_time_t __vdso_time(__kernel_old_time_t *t)
}
__kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time")));
+#endif /* CONFIG_COMPAT_32BIT_TIME */
#if defined(CONFIG_X86_64) && !defined(BUILD_VDSO32_64)
@@ -51,6 +53,7 @@ int clock_getres(clockid_t, struct __kernel_timespec *)
#else
/* i386 only */
+#ifdef CONFIG_COMPAT_32BIT_TIME
int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts)
{
return __cvdso_clock_gettime32(clock, ts);
@@ -59,14 +62,6 @@ int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts)
int clock_gettime(clockid_t, struct old_timespec32 *)
__attribute__((weak, alias("__vdso_clock_gettime")));
-int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts)
-{
- return __cvdso_clock_gettime(clock, ts);
-}
-
-int clock_gettime64(clockid_t, struct __kernel_timespec *)
- __attribute__((weak, alias("__vdso_clock_gettime64")));
-
int __vdso_clock_getres(clockid_t clock, struct old_timespec32 *res)
{
return __cvdso_clock_getres_time32(clock, res);
@@ -74,6 +69,15 @@ int __vdso_clock_getres(clockid_t clock, struct old_timespec32 *res)
int clock_getres(clockid_t, struct old_timespec32 *)
__attribute__((weak, alias("__vdso_clock_getres")));
+#endif /* CONFIG_COMPAT_32BIT_TIME */
+
+int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts)
+{
+ return __cvdso_clock_gettime(clock, ts);
+}
+
+int clock_gettime64(clockid_t, struct __kernel_timespec *)
+ __attribute__((weak, alias("__vdso_clock_gettime64")));
int __vdso_clock_getres_time64(clockid_t clock, struct __kernel_timespec *ts)
{
diff --git a/arch/x86/entry/vdso/vdso32/vdso32.lds.S b/arch/x86/entry/vdso/vdso32/vdso32.lds.S
index cee8f7f9fe80..00629192db56 100644
--- a/arch/x86/entry/vdso/vdso32/vdso32.lds.S
+++ b/arch/x86/entry/vdso/vdso32/vdso32.lds.S
@@ -23,10 +23,12 @@ VERSION
{
LINUX_2.6 {
global:
+#ifdef CONFIG_COMPAT_32BIT_TIME
__vdso_clock_gettime;
__vdso_gettimeofday;
__vdso_time;
__vdso_clock_getres;
+#endif /* CONFIG_COMPAT_32BIT_TIME */
__vdso_clock_gettime64;
__vdso_clock_getres_time64;
__vdso_getcpu;
--
2.55.0
^ permalink raw reply related
* [PATCH v2 4/9] arm64: vdso32: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
arch/arm64/kernel/vdso32/vdso.lds.S | 2 ++
arch/arm64/kernel/vdso32/vgettimeofday.c | 14 ++++++++------
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/arch/arm64/kernel/vdso32/vdso.lds.S b/arch/arm64/kernel/vdso32/vdso.lds.S
index c374fb0146f3..12bfc39e8aab 100644
--- a/arch/arm64/kernel/vdso32/vdso.lds.S
+++ b/arch/arm64/kernel/vdso32/vdso.lds.S
@@ -82,9 +82,11 @@ VERSION
{
LINUX_2.6 {
global:
+#ifdef CONFIG_COMPAT_32BIT_TIME
__vdso_clock_gettime;
__vdso_gettimeofday;
__vdso_clock_getres;
+#endif /* CONFIG_COMPAT_32BIT_TIME */
__vdso_clock_gettime64;
__vdso_clock_getres_time64;
local: *;
diff --git a/arch/arm64/kernel/vdso32/vgettimeofday.c b/arch/arm64/kernel/vdso32/vgettimeofday.c
index 0c6998ebe491..12d0255cc2cf 100644
--- a/arch/arm64/kernel/vdso32/vgettimeofday.c
+++ b/arch/arm64/kernel/vdso32/vgettimeofday.c
@@ -8,16 +8,17 @@
#define BUILD_VDSO32_64
#include <vdso/gettime.h>
+#ifdef CONFIG_COMPAT_32BIT_TIME
int __vdso_clock_gettime(clockid_t clock,
struct old_timespec32 *ts)
{
return __cvdso_clock_gettime32(clock, ts);
}
-int __vdso_clock_gettime64(clockid_t clock,
- struct __kernel_timespec *ts)
+int __vdso_clock_getres(clockid_t clock_id,
+ struct old_timespec32 *res)
{
- return __cvdso_clock_gettime(clock, ts);
+ return __cvdso_clock_getres_time32(clock_id, res);
}
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
@@ -25,11 +26,12 @@ int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
{
return __cvdso_gettimeofday(tv, tz);
}
+#endif /* CONFIG_COMPAT_32BIT_TIME */
-int __vdso_clock_getres(clockid_t clock_id,
- struct old_timespec32 *res)
+int __vdso_clock_gettime64(clockid_t clock,
+ struct __kernel_timespec *ts)
{
- return __cvdso_clock_getres_time32(clock_id, res);
+ return __cvdso_clock_gettime(clock, ts);
}
int __vdso_clock_getres_time64(clockid_t clock_id, struct __kernel_timespec *res)
--
2.55.0
^ permalink raw reply related
* [PATCH v2 8/9] sparc: vdso: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
In-Reply-To: <20260630-vdso-compat_32bit_time-v2-0-520d194640dd@linutronix.de>
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
arch/sparc/vdso/vclock_gettime.c | 4 ++++
arch/sparc/vdso/vdso32/vdso32.lds.S | 6 ++++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/arch/sparc/vdso/vclock_gettime.c b/arch/sparc/vdso/vclock_gettime.c
index 1d9859392e4c..221bd4ed19f5 100644
--- a/arch/sparc/vdso/vclock_gettime.c
+++ b/arch/sparc/vdso/vclock_gettime.c
@@ -21,6 +21,7 @@
#include "../../../../lib/vdso/gettimeofday.c"
+#if defined(CONFIG_SPARC64) || defined(CONFIG_COMPAT_32BIT_TIME)
int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
{
return __cvdso_gettimeofday(tv, tz);
@@ -28,6 +29,7 @@ int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
int gettimeofday(struct __kernel_old_timeval *, struct timezone *)
__weak __alias(__vdso_gettimeofday);
+#endif
#if defined(CONFIG_SPARC64)
int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts)
@@ -40,6 +42,7 @@ int clock_gettime(clockid_t, struct __kernel_timespec *)
#else
+#if defined(CONFIG_COMPAT_32BIT_TIME)
int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts)
{
return __cvdso_clock_gettime32(clock, ts);
@@ -47,6 +50,7 @@ int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts)
int clock_gettime(clockid_t, struct old_timespec32 *)
__weak __alias(__vdso_clock_gettime);
+#endif
int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts)
{
diff --git a/arch/sparc/vdso/vdso32/vdso32.lds.S b/arch/sparc/vdso/vdso32/vdso32.lds.S
index a14e4f77e6f2..28052168b875 100644
--- a/arch/sparc/vdso/vdso32/vdso32.lds.S
+++ b/arch/sparc/vdso/vdso32/vdso32.lds.S
@@ -15,12 +15,14 @@
VERSION {
LINUX_2.6 {
global:
+#ifdef CONFIG_COMPAT_32BIT_TIME
clock_gettime;
__vdso_clock_gettime;
- clock_gettime64;
- __vdso_clock_gettime64;
gettimeofday;
__vdso_gettimeofday;
+#endif
+ clock_gettime64;
+ __vdso_clock_gettime64;
local: *;
};
}
--
2.55.0
^ permalink raw reply related
* [PATCH v2 0/9] vDSO: Respect COMPAT_32BIT_TIME
From: Thomas Weißschuh @ 2026-06-30 7:38 UTC (permalink / raw)
To: Andy Lutomirski, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Russell King, Catalin Marinas,
Will Deacon, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Thomas Bogendoerfer,
Vincenzo Frascino, John Stultz, Stephen Boyd, David S. Miller,
Andreas Larsson
Cc: Thomas Weißschuh, linux-kernel, linux-arm-kernel,
linuxppc-dev, linux-mips, Arnd Bergmann, linux-api, sparclinux
If CONFIG_COMPAT_32BIT_TIME is disabled then the vDSO should not
provide any 32-bit time related functionality. This is the intended
effect of the kconfig option and also the fallback system calls would
also not be implemented.
Currently the kconfig option does not affect the gettimeofday() syscall,
so also keep that in the vDSO.
I also tried to introduce some helpers to avoid much of the ifdeffery,
but due to the high variance in the architecture-specific glue code
these would need to handle they ended up being worse than the current
proposal.
As a side-effect this will make the self-tests more reliable,
as there is now always a matching syscall available for each vDSO function.
clock_gettime_time64() was only introduced in v6.19, so libc implementations
are likely not using it yet.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
Changes in v2:
- Also handle SPARC.
- Drop MIPS cleanup patches.
- Also handle gettimeofday().
- Add more static validations.
- Rebase on v7.2-rc1.
- Link to v1: https://lore.kernel.org/r/20260227-vdso-compat_32bit_time-v1-0-3f0286a7bac3@linutronix.de
To: Andy Lutomirski <luto@kernel.org>
To: Thomas Gleixner <tglx@kernel.org>
To: Ingo Molnar <mingo@redhat.com>
To: Borislav Petkov <bp@alien8.de>
To: Dave Hansen <dave.hansen@linux.intel.com>
To: x86@kernel.org
To: H. Peter Anvin <hpa@zytor.com>
To: Russell King <linux@armlinux.org.uk>
To: Catalin Marinas <catalin.marinas@arm.com>
To: Will Deacon <will@kernel.org>
To: Madhavan Srinivasan <maddy@linux.ibm.com>
To: Michael Ellerman <mpe@ellerman.id.au>
To: Nicholas Piggin <npiggin@gmail.com>
To: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
To: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
To: Vincenzo Frascino <vincenzo.frascino@arm.com>
To: John Stultz <jstultz@google.com>
To: Stephen Boyd <sboyd@kernel.org>
To: "David S. Miller" <davem@davemloft.net>
To: Andreas Larsson <andreas@gaisler.com>
Cc: linux-kernel@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-mips@vger.kernel.org
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-api@vger.kernel.org
Cc: sparclinux@vger.kernel.org
---
Thomas Weißschuh (9):
time: Respect COMPAT_32BIT_TIME for old time type functions
vdso/gettimeofday: Validate system call existence for time() and gettimeofday()
x86/vdso: Respect COMPAT_32BIT_TIME
arm64: vdso32: Respect COMPAT_32BIT_TIME
ARM: VDSO: Respect COMPAT_32BIT_TIME
powerpc/vdso: Respect COMPAT_32BIT_TIME
MIPS: VDSO: Respect COMPAT_32BIT_TIME
sparc: vdso: Respect COMPAT_32BIT_TIME
vdso/gettimeofday: Verify COMPAT_32BIT_TIME interactions
arch/arm/vdso/vdso.lds.S | 2 ++
arch/arm/vdso/vgettimeofday.c | 14 ++++++++------
arch/arm64/kernel/vdso32/vdso.lds.S | 2 ++
arch/arm64/kernel/vdso32/vgettimeofday.c | 14 ++++++++------
arch/mips/vdso/vdso.lds.S | 2 ++
arch/mips/vdso/vgettimeofday.c | 3 +++
arch/powerpc/kernel/vdso/gettimeofday.S | 8 ++++++++
arch/powerpc/kernel/vdso/vdso32.lds.S | 10 ++++++----
arch/powerpc/kernel/vdso/vgettimeofday.c | 16 ++++++++++------
arch/sparc/vdso/vclock_gettime.c | 4 ++++
arch/sparc/vdso/vdso32/vdso32.lds.S | 6 ++++--
arch/x86/entry/vdso/common/vclock_gettime.c | 20 ++++++++++++--------
arch/x86/entry/vdso/vdso32/vdso32.lds.S | 2 ++
kernel/sys_ni.c | 4 ++++
kernel/time/time.c | 24 ++++++++++++++++++++----
lib/vdso/gettimeofday.c | 20 ++++++++++++++++++++
16 files changed, 115 insertions(+), 36 deletions(-)
---
base-commit: e6da2429169af9b33f3629b69905d89bb5ee9e64
change-id: 20260113-vdso-compat_32bit_time-e808763e976a
Best regards,
--
Thomas Weißschuh (Schneider Electric) <thomas.weissschuh@linutronix.de>
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox