All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anshuman Khandual <anshuman.khandual@arm.com>
To: Kefeng Wang <wangkefeng.wang@huawei.com>,
	catalin.marinas@arm.com, will@kernel.org,
	akpm@linux-foundation.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org, hch@infradead.org, arnd@arndb.de
Subject: Re: [PATCH v2 resend 4/5] arm64: mm: Convert to GENERIC_IOREMAP
Date: Thu, 19 May 2022 11:04:14 +0530	[thread overview]
Message-ID: <25a90892-957c-e5b4-e121-948e85d3caee@arm.com> (raw)
In-Reply-To: <20220502032751.21503-1-wangkefeng.wang@huawei.com>



On 5/2/22 08:57, Kefeng Wang wrote:
> Add hook for arm64's special operation when ioremap() and iounmap(),
> then ioremap_wc/np/cache is converted to use ioremap_prot()
> from GENERIC_IOREMAP, update the Copyright and kill the unused
> inclusions.
> 
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
> v2 resend:
> - use IOMEM_ERR_PTR to fix sparse warning found by lkp
> 
>  arch/arm64/Kconfig          |  1 +
>  arch/arm64/include/asm/io.h | 20 ++++++---
>  arch/arm64/kernel/acpi.c    |  2 +-
>  arch/arm64/mm/ioremap.c     | 85 +++++--------------------------------
>  4 files changed, 27 insertions(+), 81 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 20ea89d9ac2f..56673209fdb9 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -123,6 +123,7 @@ config ARM64
>  	select GENERIC_CPU_VULNERABILITIES
>  	select GENERIC_EARLY_IOREMAP
>  	select GENERIC_IDLE_POLL_SETUP
> +	select GENERIC_IOREMAP
>  	select GENERIC_IRQ_IPI
>  	select GENERIC_IRQ_PROBE
>  	select GENERIC_IRQ_SHOW
> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
> index 7fd836bea7eb..042fa01940b8 100644
> --- a/arch/arm64/include/asm/io.h
> +++ b/arch/arm64/include/asm/io.h
> @@ -163,13 +163,21 @@ extern void __memset_io(volatile void __iomem *, int, size_t);
>  /*
>   * I/O memory mapping functions.
>   */
> -extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot);
> -extern void iounmap(volatile void __iomem *addr);
> -extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
>  
> -#define ioremap(addr, size)		__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
> -#define ioremap_wc(addr, size)		__ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
> -#define ioremap_np(addr, size)		__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRnE))
> +void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size, unsigned long prot);
> +#define arch_ioremap arch_ioremap
> +
> +int arch_iounmap(void __iomem *addr);
> +#define arch_iounmap arch_iounmap
> +
> +#define _PAGE_IOREMAP PROT_DEVICE_nGnRE

Small nit, should we have a comment here for the above components i.e
PAGE_IOREMAP and callbacks arch_ioremap()/arch_iounmap() are required
because of enabling GENERIC_IOREMAP ?

> +
> +#define ioremap_wc(addr, size)		ioremap_prot((addr), (size), PROT_NORMAL_NC)
> +#define ioremap_np(addr, size)		ioremap_prot((addr), (size), PROT_DEVICE_nGnRnE)
> +#define ioremap_cache(addr, size) ({							\
> +	pfn_is_map_memory(__phys_to_pfn(addr)) ?					\
> +	(void __iomem *)__phys_to_virt(addr) : ioremap_prot(addr, size, PROT_NORMAL);	\
> +})
>  
>  /*
>   * io{read,write}{16,32,64}be() macros
> diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
> index e4dea8db6924..a5a256e3f9fe 100644
> --- a/arch/arm64/kernel/acpi.c
> +++ b/arch/arm64/kernel/acpi.c
> @@ -351,7 +351,7 @@ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
>  				prot = __acpi_get_writethrough_mem_attribute();
>  		}
>  	}
> -	return __ioremap(phys, size, prot);
> +	return ioremap_prot(phys, size, pgprot_val(prot));
>  }
>  
>  /*
> diff --git a/arch/arm64/mm/ioremap.c b/arch/arm64/mm/ioremap.c
> index b7c81dacabf0..08fc30eb2721 100644
> --- a/arch/arm64/mm/ioremap.c
> +++ b/arch/arm64/mm/ioremap.c
> @@ -1,96 +1,33 @@
>  // SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Based on arch/arm/mm/ioremap.c
> - *
> - * (C) Copyright 1995 1996 Linus Torvalds
> - * Hacked for ARM by Phil Blundell <philb@gnu.org>
> - * Hacked to allow all architectures to build, and various cleanups
> - * by Russell King
> - * Copyright (C) 2012 ARM Ltd.
> - */
>  
> -#include <linux/export.h>
>  #include <linux/mm.h>
>  #include <linux/vmalloc.h>
>  #include <linux/io.h>
>  
> -#include <asm/fixmap.h>
> -#include <asm/tlbflush.h>
> -
> -static void __iomem *__ioremap_caller(phys_addr_t phys_addr, size_t size,
> -				      pgprot_t prot, void *caller)
> +void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size, unsigned long prot)
>  {
> -	unsigned long last_addr;
> -	unsigned long offset = phys_addr & ~PAGE_MASK;
> -	int err;
> -	unsigned long addr;
> -	struct vm_struct *area;
> -
> -	/*
> -	 * Page align the mapping address and size, taking account of any
> -	 * offset.
> -	 */
> -	phys_addr &= PAGE_MASK;
> -	size = PAGE_ALIGN(size + offset);
> +	unsigned long last_addr = phys_addr + size - 1;
> +	int ret = -EINVAL;
>  
> -	/*
> -	 * Don't allow wraparound, zero size or outside PHYS_MASK.
> -	 */
> -	last_addr = phys_addr + size - 1;
> -	if (!size || last_addr < phys_addr || (last_addr & ~PHYS_MASK))
> -		return NULL;
> +	/* Don't allow outside PHYS_MASK */
> +	if (last_addr & ~PHYS_MASK)
> +		return IOMEM_ERR_PTR(ret);
>  
> -	/*
> -	 * Don't allow RAM to be mapped.
> -	 */
> +	/* Don't allow RAM to be mapped. */
>  	if (WARN_ON(pfn_is_map_memory(__phys_to_pfn(phys_addr))))
> -		return NULL;
> +		return IOMEM_ERR_PTR(ret);
>  
> -	area = get_vm_area_caller(size, VM_IOREMAP, caller);
> -	if (!area)
> -		return NULL;
> -	addr = (unsigned long)area->addr;
> -	area->phys_addr = phys_addr;
> -
> -	err = ioremap_page_range(addr, addr + size, phys_addr, prot);
> -	if (err) {
> -		vunmap((void *)addr);
> -		return NULL;
> -	}
> -
> -	return (void __iomem *)(offset + addr);
> -}
> -
> -void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot)
> -{
> -	return __ioremap_caller(phys_addr, size, prot,
> -				__builtin_return_address(0));
> +	return NULL;
>  }
> -EXPORT_SYMBOL(__ioremap);
>  
> -void iounmap(volatile void __iomem *io_addr)
> +int arch_iounmap(void __iomem *addr)
>  {
> -	unsigned long addr = (unsigned long)io_addr & PAGE_MASK;
> -
>  	/*
>  	 * We could get an address outside vmalloc range in case
>  	 * of ioremap_cache() reusing a RAM mapping.
>  	 */
> -	if (is_vmalloc_addr((void *)addr))
> -		vunmap((void *)addr);
> -}
> -EXPORT_SYMBOL(iounmap);
> -
> -void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size)
> -{
> -	/* For normal memory we already have a cacheable mapping. */
> -	if (pfn_is_map_memory(__phys_to_pfn(phys_addr)))
> -		return (void __iomem *)__phys_to_virt(phys_addr);
> -
> -	return __ioremap_caller(phys_addr, size, __pgprot(PROT_NORMAL),
> -				__builtin_return_address(0));
> +	return is_vmalloc_addr(addr) ? 0 : -EINVAL;
>  }
> -EXPORT_SYMBOL(ioremap_cache);
>  
>  /*
>   * Must be called after early_fixmap_init

Otherwise LGTM.

Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Anshuman Khandual <anshuman.khandual@arm.com>
To: Kefeng Wang <wangkefeng.wang@huawei.com>,
	catalin.marinas@arm.com, will@kernel.org,
	akpm@linux-foundation.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org, hch@infradead.org, arnd@arndb.de
Subject: Re: [PATCH v2 resend 4/5] arm64: mm: Convert to GENERIC_IOREMAP
Date: Thu, 19 May 2022 11:04:14 +0530	[thread overview]
Message-ID: <25a90892-957c-e5b4-e121-948e85d3caee@arm.com> (raw)
In-Reply-To: <20220502032751.21503-1-wangkefeng.wang@huawei.com>



On 5/2/22 08:57, Kefeng Wang wrote:
> Add hook for arm64's special operation when ioremap() and iounmap(),
> then ioremap_wc/np/cache is converted to use ioremap_prot()
> from GENERIC_IOREMAP, update the Copyright and kill the unused
> inclusions.
> 
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
> v2 resend:
> - use IOMEM_ERR_PTR to fix sparse warning found by lkp
> 
>  arch/arm64/Kconfig          |  1 +
>  arch/arm64/include/asm/io.h | 20 ++++++---
>  arch/arm64/kernel/acpi.c    |  2 +-
>  arch/arm64/mm/ioremap.c     | 85 +++++--------------------------------
>  4 files changed, 27 insertions(+), 81 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 20ea89d9ac2f..56673209fdb9 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -123,6 +123,7 @@ config ARM64
>  	select GENERIC_CPU_VULNERABILITIES
>  	select GENERIC_EARLY_IOREMAP
>  	select GENERIC_IDLE_POLL_SETUP
> +	select GENERIC_IOREMAP
>  	select GENERIC_IRQ_IPI
>  	select GENERIC_IRQ_PROBE
>  	select GENERIC_IRQ_SHOW
> diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h
> index 7fd836bea7eb..042fa01940b8 100644
> --- a/arch/arm64/include/asm/io.h
> +++ b/arch/arm64/include/asm/io.h
> @@ -163,13 +163,21 @@ extern void __memset_io(volatile void __iomem *, int, size_t);
>  /*
>   * I/O memory mapping functions.
>   */
> -extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot);
> -extern void iounmap(volatile void __iomem *addr);
> -extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
>  
> -#define ioremap(addr, size)		__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
> -#define ioremap_wc(addr, size)		__ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
> -#define ioremap_np(addr, size)		__ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRnE))
> +void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size, unsigned long prot);
> +#define arch_ioremap arch_ioremap
> +
> +int arch_iounmap(void __iomem *addr);
> +#define arch_iounmap arch_iounmap
> +
> +#define _PAGE_IOREMAP PROT_DEVICE_nGnRE

Small nit, should we have a comment here for the above components i.e
PAGE_IOREMAP and callbacks arch_ioremap()/arch_iounmap() are required
because of enabling GENERIC_IOREMAP ?

> +
> +#define ioremap_wc(addr, size)		ioremap_prot((addr), (size), PROT_NORMAL_NC)
> +#define ioremap_np(addr, size)		ioremap_prot((addr), (size), PROT_DEVICE_nGnRnE)
> +#define ioremap_cache(addr, size) ({							\
> +	pfn_is_map_memory(__phys_to_pfn(addr)) ?					\
> +	(void __iomem *)__phys_to_virt(addr) : ioremap_prot(addr, size, PROT_NORMAL);	\
> +})
>  
>  /*
>   * io{read,write}{16,32,64}be() macros
> diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
> index e4dea8db6924..a5a256e3f9fe 100644
> --- a/arch/arm64/kernel/acpi.c
> +++ b/arch/arm64/kernel/acpi.c
> @@ -351,7 +351,7 @@ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
>  				prot = __acpi_get_writethrough_mem_attribute();
>  		}
>  	}
> -	return __ioremap(phys, size, prot);
> +	return ioremap_prot(phys, size, pgprot_val(prot));
>  }
>  
>  /*
> diff --git a/arch/arm64/mm/ioremap.c b/arch/arm64/mm/ioremap.c
> index b7c81dacabf0..08fc30eb2721 100644
> --- a/arch/arm64/mm/ioremap.c
> +++ b/arch/arm64/mm/ioremap.c
> @@ -1,96 +1,33 @@
>  // SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Based on arch/arm/mm/ioremap.c
> - *
> - * (C) Copyright 1995 1996 Linus Torvalds
> - * Hacked for ARM by Phil Blundell <philb@gnu.org>
> - * Hacked to allow all architectures to build, and various cleanups
> - * by Russell King
> - * Copyright (C) 2012 ARM Ltd.
> - */
>  
> -#include <linux/export.h>
>  #include <linux/mm.h>
>  #include <linux/vmalloc.h>
>  #include <linux/io.h>
>  
> -#include <asm/fixmap.h>
> -#include <asm/tlbflush.h>
> -
> -static void __iomem *__ioremap_caller(phys_addr_t phys_addr, size_t size,
> -				      pgprot_t prot, void *caller)
> +void __iomem *arch_ioremap(phys_addr_t phys_addr, size_t size, unsigned long prot)
>  {
> -	unsigned long last_addr;
> -	unsigned long offset = phys_addr & ~PAGE_MASK;
> -	int err;
> -	unsigned long addr;
> -	struct vm_struct *area;
> -
> -	/*
> -	 * Page align the mapping address and size, taking account of any
> -	 * offset.
> -	 */
> -	phys_addr &= PAGE_MASK;
> -	size = PAGE_ALIGN(size + offset);
> +	unsigned long last_addr = phys_addr + size - 1;
> +	int ret = -EINVAL;
>  
> -	/*
> -	 * Don't allow wraparound, zero size or outside PHYS_MASK.
> -	 */
> -	last_addr = phys_addr + size - 1;
> -	if (!size || last_addr < phys_addr || (last_addr & ~PHYS_MASK))
> -		return NULL;
> +	/* Don't allow outside PHYS_MASK */
> +	if (last_addr & ~PHYS_MASK)
> +		return IOMEM_ERR_PTR(ret);
>  
> -	/*
> -	 * Don't allow RAM to be mapped.
> -	 */
> +	/* Don't allow RAM to be mapped. */
>  	if (WARN_ON(pfn_is_map_memory(__phys_to_pfn(phys_addr))))
> -		return NULL;
> +		return IOMEM_ERR_PTR(ret);
>  
> -	area = get_vm_area_caller(size, VM_IOREMAP, caller);
> -	if (!area)
> -		return NULL;
> -	addr = (unsigned long)area->addr;
> -	area->phys_addr = phys_addr;
> -
> -	err = ioremap_page_range(addr, addr + size, phys_addr, prot);
> -	if (err) {
> -		vunmap((void *)addr);
> -		return NULL;
> -	}
> -
> -	return (void __iomem *)(offset + addr);
> -}
> -
> -void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot)
> -{
> -	return __ioremap_caller(phys_addr, size, prot,
> -				__builtin_return_address(0));
> +	return NULL;
>  }
> -EXPORT_SYMBOL(__ioremap);
>  
> -void iounmap(volatile void __iomem *io_addr)
> +int arch_iounmap(void __iomem *addr)
>  {
> -	unsigned long addr = (unsigned long)io_addr & PAGE_MASK;
> -
>  	/*
>  	 * We could get an address outside vmalloc range in case
>  	 * of ioremap_cache() reusing a RAM mapping.
>  	 */
> -	if (is_vmalloc_addr((void *)addr))
> -		vunmap((void *)addr);
> -}
> -EXPORT_SYMBOL(iounmap);
> -
> -void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size)
> -{
> -	/* For normal memory we already have a cacheable mapping. */
> -	if (pfn_is_map_memory(__phys_to_pfn(phys_addr)))
> -		return (void __iomem *)__phys_to_virt(phys_addr);
> -
> -	return __ioremap_caller(phys_addr, size, __pgprot(PROT_NORMAL),
> -				__builtin_return_address(0));
> +	return is_vmalloc_addr(addr) ? 0 : -EINVAL;
>  }
> -EXPORT_SYMBOL(ioremap_cache);
>  
>  /*
>   * Must be called after early_fixmap_init

Otherwise LGTM.

Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>


  parent reply	other threads:[~2022-05-19  5:35 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-29 10:32 [PATCH v2 0/5] arm64: Cleanup ioremap() and support ioremap_prot() Kefeng Wang
2022-04-29 10:32 ` Kefeng Wang
2022-04-29 10:32 ` [PATCH v2 1/5] mm: ioremap: Use more sensibly name in ioremap_prot() Kefeng Wang
2022-04-29 10:32   ` Kefeng Wang
2022-05-02  9:38   ` Anshuman Khandual
2022-05-02  9:38     ` Anshuman Khandual
2022-04-29 10:32 ` [PATCH v2 2/5] mm: ioremap: Setup phys_addr of struct vm_struct Kefeng Wang
2022-04-29 10:32   ` Kefeng Wang
2022-05-02  9:50   ` Anshuman Khandual
2022-05-02  9:50     ` Anshuman Khandual
2022-04-29 10:32 ` [PATCH v2 3/5] mm: ioremap: Add arch_ioremap/iounmap() Kefeng Wang
2022-04-29 10:32   ` Kefeng Wang
2022-05-19  4:46   ` Anshuman Khandual
2022-05-19  4:46     ` Anshuman Khandual
2022-05-19  6:24     ` Kefeng Wang
2022-05-19  6:24       ` Kefeng Wang
2022-04-29 10:32 ` [PATCH v2 4/5] arm64: mm: Convert to GENERIC_IOREMAP Kefeng Wang
2022-04-29 10:32   ` Kefeng Wang
2022-04-29 23:15   ` kernel test robot
2022-04-29 23:15     ` kernel test robot
2022-05-02  3:27   ` [PATCH v2 resend " Kefeng Wang
2022-05-02  3:27     ` Kefeng Wang
2022-05-16 22:47     ` Catalin Marinas
2022-05-16 22:47       ` Catalin Marinas
2022-05-19  5:34     ` Anshuman Khandual [this message]
2022-05-19  5:34       ` Anshuman Khandual
2022-05-19  6:31       ` Kefeng Wang
2022-05-19  6:31         ` Kefeng Wang
2022-04-29 10:32 ` [PATCH v2 5/5] arm64: Add HAVE_IOREMAP_PROT support Kefeng Wang
2022-04-29 10:32   ` Kefeng Wang
2022-05-16 22:48   ` Catalin Marinas
2022-05-16 22:48     ` Catalin Marinas
2022-05-19  5:06   ` Anshuman Khandual
2022-05-19  5:06     ` Anshuman Khandual
2022-05-10  7:06 ` [PATCH v2 0/5] arm64: Cleanup ioremap() and support ioremap_prot() Kefeng Wang
2022-05-10  7:06   ` Kefeng Wang
2022-05-16 22:51 ` Catalin Marinas
2022-05-16 22:51   ` Catalin Marinas
2022-05-19  3:37   ` Kefeng Wang
2022-05-19  3:37     ` Kefeng Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=25a90892-957c-e5b4-e121-948e85d3caee@arm.com \
    --to=anshuman.khandual@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=catalin.marinas@arm.com \
    --cc=hch@infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=wangkefeng.wang@huawei.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.