Trivial fix to remove the following sparse warnings: arch/powerpc/kernel/module_32.c:112:74: warning: Using plain integer as NULL pointer arch/powerpc/kernel/module_32.c:117:74: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:1155:28: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:1230:20: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:1385:36: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:1752:23: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:2084:19: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:2110:32: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:2167:19: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:2183:19: warning: Using plain integer as NULL pointer drivers/macintosh/via-pmu.c:277:20: warning: Using plain integer as NULL pointer arch/powerpc/platforms/powermac/setup.c:155:67: warning: Using plain integer as NULL pointer arch/powerpc/platforms/powermac/setup.c:247:27: warning: Using plain integer as NULL pointer arch/powerpc/platforms/powermac/setup.c:249:27: warning: Using plain integer as NULL pointer arch/powerpc/platforms/powermac/setup.c:252:37: warning: Using plain integer as NULL pointer arch/powerpc/mm/tlb_hash32.c:127:21: warning: Using plain integer as NULL pointer arch/powerpc/mm/tlb_hash32.c:148:21: warning: Using plain integer as NULL pointer arch/powerpc/mm/tlb_hash32.c:44:21: warning: Using plain integer as NULL pointer arch/powerpc/mm/tlb_hash32.c:57:21: warning: Using plain integer as NULL pointer arch/powerpc/mm/tlb_hash32.c:87:21: warning: Using plain integer as NULL pointer arch/powerpc/kernel/btext.c:160:31: warning: Using plain integer as NULL pointer arch/powerpc/kernel/btext.c:167:22: warning: Using plain integer as NULL pointer arch/powerpc/kernel/btext.c:274:21: warning: Using plain integer as NULL pointer arch/powerpc/kernel/btext.c:285:31: warning: Using plain integer as NULL pointer arch/powerpc/include/asm/hugetlb.h:204:16: warning: Using plain integer as NULL pointer arch/powerpc/mm/ppc_mmu_32.c:170:21: warning: Using plain integer as NULL pointer arch/powerpc/platforms/powermac/pci.c:1227:23: warning: Using plain integer as NULL pointer arch/powerpc/platforms/powermac/pci.c:65:24: warning: Using plain integer as NULL pointer Also use `--fix` command line option from `script/checkpatch --strict` to remove the following: CHECK: Comparison to NULL could be written "!dispDeviceBase" #72: FILE: arch/powerpc/kernel/btext.c:160: + if (dispDeviceBase == NULL) CHECK: Comparison to NULL could be written "!vbase" #80: FILE: arch/powerpc/kernel/btext.c:167: + if (vbase == NULL) CHECK: Comparison to NULL could be written "!base" #89: FILE: arch/powerpc/kernel/btext.c:274: + if (base == NULL) CHECK: Comparison to NULL could be written "!dispDeviceBase" #98: FILE: arch/powerpc/kernel/btext.c:285: + if (dispDeviceBase == NULL) CHECK: Comparison to NULL could be written "strstr" #117: FILE: arch/powerpc/kernel/module_32.c:117: + if (strstr(secstrings + sechdrs[i].sh_name, ".debug") != NULL) CHECK: Comparison to NULL could be written "!Hash" #130: FILE: arch/powerpc/mm/ppc_mmu_32.c:170: + if (Hash == NULL) CHECK: Comparison to NULL could be written "Hash" #143: FILE: arch/powerpc/mm/tlb_hash32.c:44: + if (Hash != NULL) { CHECK: Comparison to NULL could be written "!Hash" #152: FILE: arch/powerpc/mm/tlb_hash32.c:57: + if (Hash == NULL) { CHECK: Comparison to NULL could be written "!Hash" #161: FILE: arch/powerpc/mm/tlb_hash32.c:87: + if (Hash == NULL) { CHECK: Comparison to NULL could be written "!Hash" #170: FILE: arch/powerpc/mm/tlb_hash32.c:127: + if (Hash == NULL) { CHECK: Comparison to NULL could be written "!Hash" #179: FILE: arch/powerpc/mm/tlb_hash32.c:148: + if (Hash == NULL) { ERROR: space required after that ';' (ctx:VxV) #192: FILE: arch/powerpc/platforms/powermac/pci.c:65: + for (; node != NULL;node = node->sibling) { CHECK: Comparison to NULL could be written "node" #192: FILE: arch/powerpc/platforms/powermac/pci.c:65: + for (; node != NULL;node = node->sibling) { CHECK: Comparison to NULL could be written "!region" #201: FILE: arch/powerpc/platforms/powermac/pci.c:1227: + if (region == NULL) CHECK: Comparison to NULL could be written "of_get_property" #214: FILE: arch/powerpc/platforms/powermac/setup.c:155: + if (of_get_property(np, "cache-unified", NULL) != NULL && dc) { CHECK: Comparison to NULL could be written "!np" #223: FILE: arch/powerpc/platforms/powermac/setup.c:247: + if (np == NULL) CHECK: Comparison to NULL could be written "np" #226: FILE: arch/powerpc/platforms/powermac/setup.c:249: + if (np != NULL) { CHECK: Comparison to NULL could be written "l2cr" #230: FILE: arch/powerpc/platforms/powermac/setup.c:252: + if (l2cr != NULL) { CHECK: Comparison to NULL could be written "via" #243: FILE: drivers/macintosh/via-pmu.c:277: + if (via != NULL) CHECK: Comparison to NULL could be written "current_req" #252: FILE: drivers/macintosh/via-pmu.c:1155: + if (current_req != NULL) { CHECK: Comparison to NULL could be written "!req" #261: FILE: drivers/macintosh/via-pmu.c:1230: + if (req == NULL || pmu_state != idle CHECK: Comparison to NULL could be written "!req" #270: FILE: drivers/macintosh/via-pmu.c:1385: + if (req == NULL) { CHECK: Comparison to NULL could be written "!pp" #288: FILE: drivers/macintosh/via-pmu.c:2084: + if (pp == NULL) CHECK: Comparison to NULL could be written "!pp" #297: FILE: drivers/macintosh/via-pmu.c:2110: + if (count < 1 || pp == NULL) CHECK: Comparison to NULL could be written "!pp" #306: FILE: drivers/macintosh/via-pmu.c:2167: + if (pp == NULL) CHECK: Comparison to NULL could be written "pp" #315: FILE: drivers/macintosh/via-pmu.c:2183: + if (pp != NULL) { Link: https://github.com/linuxppc/linux/issues/37 Signed-off-by: Mathieu Malaterre <malat@debian.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
210 lines
5.0 KiB
C
210 lines
5.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_POWERPC_HUGETLB_H
|
|
#define _ASM_POWERPC_HUGETLB_H
|
|
|
|
#ifdef CONFIG_HUGETLB_PAGE
|
|
#include <asm/page.h>
|
|
#include <asm-generic/hugetlb.h>
|
|
|
|
extern struct kmem_cache *hugepte_cache;
|
|
|
|
#ifdef CONFIG_PPC_BOOK3S_64
|
|
|
|
#include <asm/book3s/64/hugetlb.h>
|
|
/*
|
|
* This should work for other subarchs too. But right now we use the
|
|
* new format only for 64bit book3s
|
|
*/
|
|
static inline pte_t *hugepd_page(hugepd_t hpd)
|
|
{
|
|
BUG_ON(!hugepd_ok(hpd));
|
|
/*
|
|
* We have only four bits to encode, MMU page size
|
|
*/
|
|
BUILD_BUG_ON((MMU_PAGE_COUNT - 1) > 0xf);
|
|
return __va(hpd_val(hpd) & HUGEPD_ADDR_MASK);
|
|
}
|
|
|
|
static inline unsigned int hugepd_mmu_psize(hugepd_t hpd)
|
|
{
|
|
return (hpd_val(hpd) & HUGEPD_SHIFT_MASK) >> 2;
|
|
}
|
|
|
|
static inline unsigned int hugepd_shift(hugepd_t hpd)
|
|
{
|
|
return mmu_psize_to_shift(hugepd_mmu_psize(hpd));
|
|
}
|
|
static inline void flush_hugetlb_page(struct vm_area_struct *vma,
|
|
unsigned long vmaddr)
|
|
{
|
|
if (radix_enabled())
|
|
return radix__flush_hugetlb_page(vma, vmaddr);
|
|
}
|
|
|
|
#else
|
|
|
|
static inline pte_t *hugepd_page(hugepd_t hpd)
|
|
{
|
|
BUG_ON(!hugepd_ok(hpd));
|
|
#ifdef CONFIG_PPC_8xx
|
|
return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK);
|
|
#else
|
|
return (pte_t *)((hpd_val(hpd) &
|
|
~HUGEPD_SHIFT_MASK) | PD_HUGE);
|
|
#endif
|
|
}
|
|
|
|
static inline unsigned int hugepd_shift(hugepd_t hpd)
|
|
{
|
|
#ifdef CONFIG_PPC_8xx
|
|
return ((hpd_val(hpd) & _PMD_PAGE_MASK) >> 1) + 17;
|
|
#else
|
|
return hpd_val(hpd) & HUGEPD_SHIFT_MASK;
|
|
#endif
|
|
}
|
|
|
|
#endif /* CONFIG_PPC_BOOK3S_64 */
|
|
|
|
|
|
static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
|
|
unsigned pdshift)
|
|
{
|
|
/*
|
|
* On FSL BookE, we have multiple higher-level table entries that
|
|
* point to the same hugepte. Just use the first one since they're all
|
|
* identical. So for that case, idx=0.
|
|
*/
|
|
unsigned long idx = 0;
|
|
|
|
pte_t *dir = hugepd_page(hpd);
|
|
#ifndef CONFIG_PPC_FSL_BOOK3E
|
|
idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd);
|
|
#endif
|
|
|
|
return dir + idx;
|
|
}
|
|
|
|
pte_t *huge_pte_offset_and_shift(struct mm_struct *mm,
|
|
unsigned long addr, unsigned *shift);
|
|
|
|
void flush_dcache_icache_hugepage(struct page *page);
|
|
|
|
int slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
|
|
unsigned long len);
|
|
|
|
static inline int is_hugepage_only_range(struct mm_struct *mm,
|
|
unsigned long addr,
|
|
unsigned long len)
|
|
{
|
|
if (IS_ENABLED(CONFIG_PPC_MM_SLICES) && !radix_enabled())
|
|
return slice_is_hugepage_only_range(mm, addr, len);
|
|
return 0;
|
|
}
|
|
|
|
void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea,
|
|
pte_t pte);
|
|
#ifdef CONFIG_PPC_8xx
|
|
static inline void flush_hugetlb_page(struct vm_area_struct *vma,
|
|
unsigned long vmaddr)
|
|
{
|
|
flush_tlb_page(vma, vmaddr);
|
|
}
|
|
#else
|
|
void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
|
|
#endif
|
|
|
|
void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
|
|
unsigned long end, unsigned long floor,
|
|
unsigned long ceiling);
|
|
|
|
/*
|
|
* If the arch doesn't supply something else, assume that hugepage
|
|
* size aligned regions are ok without further preparation.
|
|
*/
|
|
static inline int prepare_hugepage_range(struct file *file,
|
|
unsigned long addr, unsigned long len)
|
|
{
|
|
struct hstate *h = hstate_file(file);
|
|
if (len & ~huge_page_mask(h))
|
|
return -EINVAL;
|
|
if (addr & ~huge_page_mask(h))
|
|
return -EINVAL;
|
|
return 0;
|
|
}
|
|
|
|
static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
pte_t *ptep, pte_t pte)
|
|
{
|
|
set_pte_at(mm, addr, ptep, pte);
|
|
}
|
|
|
|
static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
|
|
unsigned long addr, pte_t *ptep)
|
|
{
|
|
#ifdef CONFIG_PPC64
|
|
return __pte(pte_update(mm, addr, ptep, ~0UL, 0, 1));
|
|
#else
|
|
return __pte(pte_update(ptep, ~0UL, 0));
|
|
#endif
|
|
}
|
|
|
|
static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
|
|
unsigned long addr, pte_t *ptep)
|
|
{
|
|
pte_t pte;
|
|
pte = huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
|
|
flush_hugetlb_page(vma, addr);
|
|
}
|
|
|
|
static inline int huge_pte_none(pte_t pte)
|
|
{
|
|
return pte_none(pte);
|
|
}
|
|
|
|
static inline pte_t huge_pte_wrprotect(pte_t pte)
|
|
{
|
|
return pte_wrprotect(pte);
|
|
}
|
|
|
|
static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
|
unsigned long addr, pte_t *ptep,
|
|
pte_t pte, int dirty)
|
|
{
|
|
#ifdef HUGETLB_NEED_PRELOAD
|
|
/*
|
|
* The "return 1" forces a call of update_mmu_cache, which will write a
|
|
* TLB entry. Without this, platforms that don't do a write of the TLB
|
|
* entry in the TLB miss handler asm will fault ad infinitum.
|
|
*/
|
|
ptep_set_access_flags(vma, addr, ptep, pte, dirty);
|
|
return 1;
|
|
#else
|
|
return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
|
|
#endif
|
|
}
|
|
|
|
static inline pte_t huge_ptep_get(pte_t *ptep)
|
|
{
|
|
return *ptep;
|
|
}
|
|
|
|
static inline void arch_clear_hugepage_flags(struct page *page)
|
|
{
|
|
}
|
|
|
|
#else /* ! CONFIG_HUGETLB_PAGE */
|
|
static inline void flush_hugetlb_page(struct vm_area_struct *vma,
|
|
unsigned long vmaddr)
|
|
{
|
|
}
|
|
|
|
#define hugepd_shift(x) 0
|
|
static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
|
|
unsigned pdshift)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif /* CONFIG_HUGETLB_PAGE */
|
|
|
|
#endif /* _ASM_POWERPC_HUGETLB_H */
|