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:
parent
1b9863c6aa
commit
b84f196d96
3 changed files with 55 additions and 0 deletions
|
@ -1308,6 +1308,48 @@ void acpi_free_pnp_ids(struct acpi_device_pnp *pnp)
|
|||
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)
|
||||
{
|
||||
unsigned long long cca = 0;
|
||||
|
|
|
@ -596,6 +596,9 @@ struct acpi_pci_root {
|
|||
|
||||
/* 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,
|
||||
u64 address, bool check_children);
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
#endif /* !CONFIG_ACPI */
|
||||
|
|
Loading…
Reference in a new issue