ACPI: Adding DMA Attribute APIs for ACPI Device
Adding acpi_get_dma_attr() to query DMA attributes of ACPI devices. It returns the enum dev_dma_attr, which communicates DMA information more clearly. This API replaces the acpi_check_dma(), which will be removed in subsequent patch. This patch also provides a convenient function, acpi_dma_supported(), to check DMA support of the specified ACPI device. Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Родитель
1b9863c6aa
Коммит
b84f196d96
|
@ -1308,6 +1308,48 @@ void acpi_free_pnp_ids(struct acpi_device_pnp *pnp)
|
||||||
kfree(pnp->unique_id);
|
kfree(pnp->unique_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* acpi_dma_supported - Check DMA support for the specified device.
|
||||||
|
* @adev: The pointer to acpi device
|
||||||
|
*
|
||||||
|
* Return false if DMA is not supported. Otherwise, return true
|
||||||
|
*/
|
||||||
|
bool acpi_dma_supported(struct acpi_device *adev)
|
||||||
|
{
|
||||||
|
if (!adev)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (adev->flags.cca_seen)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Per ACPI 6.0 sec 6.2.17, assume devices can do cache-coherent
|
||||||
|
* DMA on "Intel platforms". Presumably that includes all x86 and
|
||||||
|
* ia64, and other arches will set CONFIG_ACPI_CCA_REQUIRED=y.
|
||||||
|
*/
|
||||||
|
if (!IS_ENABLED(CONFIG_ACPI_CCA_REQUIRED))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* acpi_get_dma_attr - Check the supported DMA attr for the specified device.
|
||||||
|
* @adev: The pointer to acpi device
|
||||||
|
*
|
||||||
|
* Return enum dev_dma_attr.
|
||||||
|
*/
|
||||||
|
enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev)
|
||||||
|
{
|
||||||
|
if (!acpi_dma_supported(adev))
|
||||||
|
return DEV_DMA_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
if (adev->flags.coherent_dma)
|
||||||
|
return DEV_DMA_COHERENT;
|
||||||
|
else
|
||||||
|
return DEV_DMA_NON_COHERENT;
|
||||||
|
}
|
||||||
|
|
||||||
static void acpi_init_coherency(struct acpi_device *adev)
|
static void acpi_init_coherency(struct acpi_device *adev)
|
||||||
{
|
{
|
||||||
unsigned long long cca = 0;
|
unsigned long long cca = 0;
|
||||||
|
|
|
@ -596,6 +596,9 @@ struct acpi_pci_root {
|
||||||
|
|
||||||
/* helper */
|
/* helper */
|
||||||
|
|
||||||
|
bool acpi_dma_supported(struct acpi_device *adev);
|
||||||
|
enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev);
|
||||||
|
|
||||||
struct acpi_device *acpi_find_child_device(struct acpi_device *parent,
|
struct acpi_device *acpi_find_child_device(struct acpi_device *parent,
|
||||||
u64 address, bool check_children);
|
u64 address, bool check_children);
|
||||||
int acpi_is_root_bridge(acpi_handle);
|
int acpi_is_root_bridge(acpi_handle);
|
||||||
|
|
|
@ -579,6 +579,16 @@ static inline bool acpi_check_dma(struct acpi_device *adev, bool *coherent)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool acpi_dma_supported(struct acpi_device *adev)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev)
|
||||||
|
{
|
||||||
|
return DEV_DMA_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
#define ACPI_PTR(_ptr) (NULL)
|
#define ACPI_PTR(_ptr) (NULL)
|
||||||
|
|
||||||
#endif /* !CONFIG_ACPI */
|
#endif /* !CONFIG_ACPI */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче