diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-06-19 01:17:35 +0200 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-06-19 01:17:35 +0200 |
commit | e193cd15ae98817ad82cc8bad61a200ac561e98c (patch) | |
tree | a4b645de8fe35f75e3d9459461bb89e8ffc41979 /drivers/acpi/scan.c | |
parent | 4def8a360fc6119e09916708cca0977a1495ccf4 (diff) | |
parent | e144cd045e123757b6b5f732c420b94dd5544407 (diff) | |
download | linux-e193cd15ae98817ad82cc8bad61a200ac561e98c.tar.gz linux-e193cd15ae98817ad82cc8bad61a200ac561e98c.tar.bz2 linux-e193cd15ae98817ad82cc8bad61a200ac561e98c.zip |
Merge branch 'acpi-cca'
* acpi-cca:
ufs: fix TRUE and FALSE re-define build error
megaraid_sas: fix TRUE and FALSE re-define build error
amd-xgbe: Unify coherency checking logic with device_dma_is_coherent()
crypto: ccp - Unify coherency checking logic with device_dma_is_coherent()
device property: Introduces device_dma_is_coherent()
arm64 : Introduce support for ACPI _CCA object
ACPI / scan: Parse _CCA and setup device coherency
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r-- | drivers/acpi/scan.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 4bbc8f89257f..2649a068671d 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -11,6 +11,7 @@ #include <linux/kthread.h> #include <linux/dmi.h> #include <linux/nls.h> +#include <linux/dma-mapping.h> #include <asm/pgtable.h> @@ -2153,6 +2154,39 @@ void acpi_free_pnp_ids(struct acpi_device_pnp *pnp) kfree(pnp->unique_id); } +static void acpi_init_coherency(struct acpi_device *adev) +{ + unsigned long long cca = 0; + acpi_status status; + struct acpi_device *parent = adev->parent; + + if (parent && parent->flags.cca_seen) { + /* + * From ACPI spec, OSPM will ignore _CCA if an ancestor + * already saw one. + */ + adev->flags.cca_seen = 1; + cca = parent->flags.coherent_dma; + } else { + status = acpi_evaluate_integer(adev->handle, "_CCA", + NULL, &cca); + if (ACPI_SUCCESS(status)) + adev->flags.cca_seen = 1; + else if (!IS_ENABLED(CONFIG_ACPI_CCA_REQUIRED)) + /* + * If architecture does not specify that _CCA is + * required for DMA-able devices (e.g. x86), + * we default to _CCA=1. + */ + cca = 1; + else + acpi_handle_debug(adev->handle, + "ACPI device is missing _CCA.\n"); + } + + adev->flags.coherent_dma = cca; +} + void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, int type, unsigned long long sta) { @@ -2171,6 +2205,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, device->flags.visited = false; device_initialize(&device->dev); dev_set_uevent_suppress(&device->dev, true); + acpi_init_coherency(device); } void acpi_device_add_finalize(struct acpi_device *device) |