From: Mark Salter <msalter@redhat.com>
To: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Cc: rjw@rjwysocki.net, lenb@kernel.org, catalin.marinas@arm.com,
will.deacon@arm.com, thomas.lendacky@amd.com,
herbert@gondor.apana.org.au, davem@davemloft.net, arnd@arndb.de,
hanjun.guo@linaro.org, al.stone@linaro.org,
grant.likely@linaro.org, leo.duran@amd.com,
linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org,
linux-kernel@vger.kernel.org, linaro-acpi@lists.linaro.org,
netdev@vger.kernel.org, linux-crypto@vger.kernel.org
Subject: Re: [V5 PATCH 2/5] arm64 : Introduce support for ACPI _CCA object
Date: Thu, 28 May 2015 22:38:19 -0400 [thread overview]
Message-ID: <1432867099.24429.4.camel@deneb.redhat.com> (raw)
In-Reply-To: <1432159758-4486-3-git-send-email-Suravee.Suthikulpanit@amd.com>
On Wed, 2015-05-20 at 17:09 -0500, Suravee Suthikulpanit wrote:
> From http://www.uefi.org/sites/default/files/resources/ACPI_6.0.pdf,
> section 6.2.17 _CCA states that ARM platforms require ACPI _CCA
> object to be specified for DMA-cabpable devices. Therefore, this patch
> specifies ACPI_CCA_REQUIRED in arm64 Kconfig.
>
> In addition, to handle the case when _CCA is missing, arm64 would assign
> dummy_dma_ops to disable DMA capability of the device.
>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> Signed-off-by: Mark Salter <msalter@redhat.com>
> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> ---
> arch/arm64/Kconfig | 1 +
> arch/arm64/include/asm/dma-mapping.h | 18 ++++++-
> arch/arm64/mm/dma-mapping.c | 92 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 109 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 4269dba..95307b4 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -1,5 +1,6 @@
> config ARM64
> def_bool y
> + select ACPI_CCA_REQUIRED if ACPI
> select ACPI_GENERIC_GSI if ACPI
> select ACPI_REDUCED_HARDWARE_ONLY if ACPI
> select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
> diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
> index 9437e3d..f0d6d0b 100644
> --- a/arch/arm64/include/asm/dma-mapping.h
> +++ b/arch/arm64/include/asm/dma-mapping.h
> @@ -18,6 +18,7 @@
>
> #ifdef __KERNEL__
>
> +#include <linux/acpi.h>
> #include <linux/types.h>
> #include <linux/vmalloc.h>
>
^^^ This hunk causes build issues with a couple of drivers:
drivers/scsi/megaraid/megaraid_sas_fp.c:69:0: warning: "FALSE" redefined [enabled by default]
#define FALSE 0
^
In file included from include/acpi/acpi.h:58:0,
from include/linux/acpi.h:37,
from ./arch/arm64/include/asm/dma-mapping.h:21,
from include/linux/dma-mapping.h:86,
from ./arch/arm64/include/asm/pci.h:7,
from include/linux/pci.h:1460,
from drivers/scsi/megaraid/megaraid_sas_fp.c:37:
include/acpi/actypes.h:433:0: note: this is the location of the previous definition
#define FALSE (1 == 0)
^
In file included from include/acpi/acpi.h:58:0,
from include/linux/acpi.h:37,
from ./arch/arm64/include/asm/dma-mapping.h:21,
from include/linux/dma-mapping.h:86,
from include/scsi/scsi_cmnd.h:4,
from drivers/scsi/ufs/ufshcd.h:60,
from drivers/scsi/ufs/ufshcd.c:43:
include/acpi/actypes.h:433:41: error: expected identifier before ‘(’ token
#define FALSE (1 == 0)
^
drivers/scsi/ufs/unipro.h:203:2: note: in expansion of macro ‘FALSE’
FALSE = 0,
^
This happens because the ACPI definitions of TRUE and FALSE conflict
with local definitions in megaraid and enum declaration in ufs.
> @@ -28,13 +29,23 @@
>
> #define DMA_ERROR_CODE (~(dma_addr_t)0)
> extern struct dma_map_ops *dma_ops;
> +extern struct dma_map_ops dummy_dma_ops;
>
> static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
> {
> - if (unlikely(!dev) || !dev->archdata.dma_ops)
> + if (unlikely(!dev))
> return dma_ops;
> - else
> + else if (dev->archdata.dma_ops)
> return dev->archdata.dma_ops;
> + else if (acpi_disabled)
> + return dma_ops;
> +
> + /*
> + * When ACPI is enabled, if arch_set_dma_ops is not called,
> + * we will disable device DMA capability by setting it
> + * to dummy_dma_ops.
> + */
> + return &dummy_dma_ops;
> }
>
> static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> @@ -48,6 +59,9 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> struct iommu_ops *iommu, bool coherent)
> {
> + if (!acpi_disabled && !dev->archdata.dma_ops)
> + dev->archdata.dma_ops = dma_ops;
> +
> dev->archdata.dma_coherent = coherent;
> }
> #define arch_setup_dma_ops arch_setup_dma_ops
> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index ef7d112..6e6d6ad 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -415,6 +415,98 @@ out:
> return -ENOMEM;
> }
>
> +/********************************************
> + * The following APIs are for dummy DMA ops *
> + ********************************************/
> +
> +static void *__dummy_alloc(struct device *dev, size_t size,
> + dma_addr_t *dma_handle, gfp_t flags,
> + struct dma_attrs *attrs)
> +{
> + return NULL;
> +}
> +
> +static void __dummy_free(struct device *dev, size_t size,
> + void *vaddr, dma_addr_t dma_handle,
> + struct dma_attrs *attrs)
> +{
> +}
> +
> +static int __dummy_mmap(struct device *dev,
> + struct vm_area_struct *vma,
> + void *cpu_addr, dma_addr_t dma_addr, size_t size,
> + struct dma_attrs *attrs)
> +{
> + return -ENXIO;
> +}
> +
> +static dma_addr_t __dummy_map_page(struct device *dev, struct page *page,
> + unsigned long offset, size_t size,
> + enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> + return DMA_ERROR_CODE;
> +}
> +
> +static void __dummy_unmap_page(struct device *dev, dma_addr_t dev_addr,
> + size_t size, enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> +}
> +
> +static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl,
> + int nelems, enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> + return 0;
> +}
> +
> +static void __dummy_unmap_sg(struct device *dev,
> + struct scatterlist *sgl, int nelems,
> + enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> +}
> +
> +static void __dummy_sync_single(struct device *dev,
> + dma_addr_t dev_addr, size_t size,
> + enum dma_data_direction dir)
> +{
> +}
> +
> +static void __dummy_sync_sg(struct device *dev,
> + struct scatterlist *sgl, int nelems,
> + enum dma_data_direction dir)
> +{
> +}
> +
> +static int __dummy_mapping_error(struct device *hwdev, dma_addr_t dma_addr)
> +{
> + return 1;
> +}
> +
> +static int __dummy_dma_supported(struct device *hwdev, u64 mask)
> +{
> + return 0;
> +}
> +
> +struct dma_map_ops dummy_dma_ops = {
> + .alloc = __dummy_alloc,
> + .free = __dummy_free,
> + .mmap = __dummy_mmap,
> + .map_page = __dummy_map_page,
> + .unmap_page = __dummy_unmap_page,
> + .map_sg = __dummy_map_sg,
> + .unmap_sg = __dummy_unmap_sg,
> + .sync_single_for_cpu = __dummy_sync_single,
> + .sync_single_for_device = __dummy_sync_single,
> + .sync_sg_for_cpu = __dummy_sync_sg,
> + .sync_sg_for_device = __dummy_sync_sg,
> + .mapping_error = __dummy_mapping_error,
> + .dma_supported = __dummy_dma_supported,
> +};
> +EXPORT_SYMBOL(dummy_dma_ops);
> +
> static int __init arm64_dma_init(void)
> {
> int ret;
WARNING: multiple messages have this Message-ID (diff)
From: msalter@redhat.com (Mark Salter)
To: linux-arm-kernel@lists.infradead.org
Subject: [V5 PATCH 2/5] arm64 : Introduce support for ACPI _CCA object
Date: Thu, 28 May 2015 22:38:19 -0400 [thread overview]
Message-ID: <1432867099.24429.4.camel@deneb.redhat.com> (raw)
In-Reply-To: <1432159758-4486-3-git-send-email-Suravee.Suthikulpanit@amd.com>
On Wed, 2015-05-20 at 17:09 -0500, Suravee Suthikulpanit wrote:
> From http://www.uefi.org/sites/default/files/resources/ACPI_6.0.pdf,
> section 6.2.17 _CCA states that ARM platforms require ACPI _CCA
> object to be specified for DMA-cabpable devices. Therefore, this patch
> specifies ACPI_CCA_REQUIRED in arm64 Kconfig.
>
> In addition, to handle the case when _CCA is missing, arm64 would assign
> dummy_dma_ops to disable DMA capability of the device.
>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
> Signed-off-by: Mark Salter <msalter@redhat.com>
> Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
> ---
> arch/arm64/Kconfig | 1 +
> arch/arm64/include/asm/dma-mapping.h | 18 ++++++-
> arch/arm64/mm/dma-mapping.c | 92 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 109 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 4269dba..95307b4 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -1,5 +1,6 @@
> config ARM64
> def_bool y
> + select ACPI_CCA_REQUIRED if ACPI
> select ACPI_GENERIC_GSI if ACPI
> select ACPI_REDUCED_HARDWARE_ONLY if ACPI
> select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
> diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
> index 9437e3d..f0d6d0b 100644
> --- a/arch/arm64/include/asm/dma-mapping.h
> +++ b/arch/arm64/include/asm/dma-mapping.h
> @@ -18,6 +18,7 @@
>
> #ifdef __KERNEL__
>
> +#include <linux/acpi.h>
> #include <linux/types.h>
> #include <linux/vmalloc.h>
>
^^^ This hunk causes build issues with a couple of drivers:
drivers/scsi/megaraid/megaraid_sas_fp.c:69:0: warning: "FALSE" redefined [enabled by default]
#define FALSE 0
^
In file included from include/acpi/acpi.h:58:0,
from include/linux/acpi.h:37,
from ./arch/arm64/include/asm/dma-mapping.h:21,
from include/linux/dma-mapping.h:86,
from ./arch/arm64/include/asm/pci.h:7,
from include/linux/pci.h:1460,
from drivers/scsi/megaraid/megaraid_sas_fp.c:37:
include/acpi/actypes.h:433:0: note: this is the location of the previous definition
#define FALSE (1 == 0)
^
In file included from include/acpi/acpi.h:58:0,
from include/linux/acpi.h:37,
from ./arch/arm64/include/asm/dma-mapping.h:21,
from include/linux/dma-mapping.h:86,
from include/scsi/scsi_cmnd.h:4,
from drivers/scsi/ufs/ufshcd.h:60,
from drivers/scsi/ufs/ufshcd.c:43:
include/acpi/actypes.h:433:41: error: expected identifier before ?(? token
#define FALSE (1 == 0)
^
drivers/scsi/ufs/unipro.h:203:2: note: in expansion of macro ?FALSE?
FALSE = 0,
^
This happens because the ACPI definitions of TRUE and FALSE conflict
with local definitions in megaraid and enum declaration in ufs.
> @@ -28,13 +29,23 @@
>
> #define DMA_ERROR_CODE (~(dma_addr_t)0)
> extern struct dma_map_ops *dma_ops;
> +extern struct dma_map_ops dummy_dma_ops;
>
> static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
> {
> - if (unlikely(!dev) || !dev->archdata.dma_ops)
> + if (unlikely(!dev))
> return dma_ops;
> - else
> + else if (dev->archdata.dma_ops)
> return dev->archdata.dma_ops;
> + else if (acpi_disabled)
> + return dma_ops;
> +
> + /*
> + * When ACPI is enabled, if arch_set_dma_ops is not called,
> + * we will disable device DMA capability by setting it
> + * to dummy_dma_ops.
> + */
> + return &dummy_dma_ops;
> }
>
> static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> @@ -48,6 +59,9 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev)
> static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> struct iommu_ops *iommu, bool coherent)
> {
> + if (!acpi_disabled && !dev->archdata.dma_ops)
> + dev->archdata.dma_ops = dma_ops;
> +
> dev->archdata.dma_coherent = coherent;
> }
> #define arch_setup_dma_ops arch_setup_dma_ops
> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index ef7d112..6e6d6ad 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -415,6 +415,98 @@ out:
> return -ENOMEM;
> }
>
> +/********************************************
> + * The following APIs are for dummy DMA ops *
> + ********************************************/
> +
> +static void *__dummy_alloc(struct device *dev, size_t size,
> + dma_addr_t *dma_handle, gfp_t flags,
> + struct dma_attrs *attrs)
> +{
> + return NULL;
> +}
> +
> +static void __dummy_free(struct device *dev, size_t size,
> + void *vaddr, dma_addr_t dma_handle,
> + struct dma_attrs *attrs)
> +{
> +}
> +
> +static int __dummy_mmap(struct device *dev,
> + struct vm_area_struct *vma,
> + void *cpu_addr, dma_addr_t dma_addr, size_t size,
> + struct dma_attrs *attrs)
> +{
> + return -ENXIO;
> +}
> +
> +static dma_addr_t __dummy_map_page(struct device *dev, struct page *page,
> + unsigned long offset, size_t size,
> + enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> + return DMA_ERROR_CODE;
> +}
> +
> +static void __dummy_unmap_page(struct device *dev, dma_addr_t dev_addr,
> + size_t size, enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> +}
> +
> +static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl,
> + int nelems, enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> + return 0;
> +}
> +
> +static void __dummy_unmap_sg(struct device *dev,
> + struct scatterlist *sgl, int nelems,
> + enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> +}
> +
> +static void __dummy_sync_single(struct device *dev,
> + dma_addr_t dev_addr, size_t size,
> + enum dma_data_direction dir)
> +{
> +}
> +
> +static void __dummy_sync_sg(struct device *dev,
> + struct scatterlist *sgl, int nelems,
> + enum dma_data_direction dir)
> +{
> +}
> +
> +static int __dummy_mapping_error(struct device *hwdev, dma_addr_t dma_addr)
> +{
> + return 1;
> +}
> +
> +static int __dummy_dma_supported(struct device *hwdev, u64 mask)
> +{
> + return 0;
> +}
> +
> +struct dma_map_ops dummy_dma_ops = {
> + .alloc = __dummy_alloc,
> + .free = __dummy_free,
> + .mmap = __dummy_mmap,
> + .map_page = __dummy_map_page,
> + .unmap_page = __dummy_unmap_page,
> + .map_sg = __dummy_map_sg,
> + .unmap_sg = __dummy_unmap_sg,
> + .sync_single_for_cpu = __dummy_sync_single,
> + .sync_single_for_device = __dummy_sync_single,
> + .sync_sg_for_cpu = __dummy_sync_sg,
> + .sync_sg_for_device = __dummy_sync_sg,
> + .mapping_error = __dummy_mapping_error,
> + .dma_supported = __dummy_dma_supported,
> +};
> +EXPORT_SYMBOL(dummy_dma_ops);
> +
> static int __init arm64_dma_init(void)
> {
> int ret;
next prev parent reply other threads:[~2015-05-29 2:38 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-20 22:09 [V5 PATCH 0/5] ACPI: Introduce support for _CCA object Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` [V5 PATCH 1/5] ACPI / scan: Parse _CCA and setup device coherency Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-22 21:56 ` Rafael J. Wysocki
2015-05-22 21:56 ` Rafael J. Wysocki
2015-05-22 22:24 ` Suravee Suthikulanit
2015-05-22 22:24 ` Suravee Suthikulanit
2015-05-22 22:24 ` Suravee Suthikulanit
2015-05-22 23:05 ` Rafael J. Wysocki
2015-05-22 23:05 ` Rafael J. Wysocki
2015-05-23 0:15 ` Suravee Suthikulanit
2015-05-23 0:15 ` Suravee Suthikulanit
2015-05-23 0:15 ` Suravee Suthikulanit
2015-05-23 1:25 ` Rafael J. Wysocki
2015-05-23 1:25 ` Rafael J. Wysocki
2015-05-23 1:38 ` Suravee Suthikulanit
2015-05-23 1:38 ` Suravee Suthikulanit
2015-05-23 1:38 ` Suravee Suthikulanit
2015-05-20 22:09 ` [V5 PATCH 2/5] arm64 : Introduce support for ACPI _CCA object Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-29 2:38 ` Mark Salter [this message]
2015-05-29 2:38 ` Mark Salter
2015-06-03 14:37 ` Suravee Suthikulanit
2015-06-03 14:37 ` Suravee Suthikulanit
2015-06-03 14:37 ` Suravee Suthikulanit
2015-06-03 15:03 ` Mark Salter
2015-06-03 15:03 ` Mark Salter
2015-05-20 22:09 ` [V5 PATCH 3/5] device property: Introduces device_dma_is_coherent() Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` [V5 PATCH 4/5] crypto: ccp - Unify coherency checking logic with device_dma_is_coherent() Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` [V5 PATCH 5/5] amd-xgbe: " Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
2015-05-20 22:09 ` Suravee Suthikulpanit
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=1432867099.24429.4.camel@deneb.redhat.com \
--to=msalter@redhat.com \
--cc=Suravee.Suthikulpanit@amd.com \
--cc=al.stone@linaro.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=davem@davemloft.net \
--cc=grant.likely@linaro.org \
--cc=hanjun.guo@linaro.org \
--cc=herbert@gondor.apana.org.au \
--cc=lenb@kernel.org \
--cc=leo.duran@amd.com \
--cc=linaro-acpi@lists.linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=thomas.lendacky@amd.com \
--cc=will.deacon@arm.com \
/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.