cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

acpi.c (1249B)


      1// SPDX-License-Identifier: GPL-2.0
      2// Copyright (C) 2013,2019 Intel Corporation
      3
      4#include <linux/acpi.h>
      5#include <linux/acpi_dma.h>
      6
      7#include "internal.h"
      8
      9static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param)
     10{
     11	struct acpi_dma_spec *dma_spec = param;
     12	struct dw_dma_slave slave = {
     13		.dma_dev = dma_spec->dev,
     14		.src_id = dma_spec->slave_id,
     15		.dst_id = dma_spec->slave_id,
     16		.m_master = 0,
     17		.p_master = 1,
     18	};
     19
     20	return dw_dma_filter(chan, &slave);
     21}
     22
     23void dw_dma_acpi_controller_register(struct dw_dma *dw)
     24{
     25	struct device *dev = dw->dma.dev;
     26	struct acpi_dma_filter_info *info;
     27	int ret;
     28
     29	if (!has_acpi_companion(dev))
     30		return;
     31
     32	info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
     33	if (!info)
     34		return;
     35
     36	dma_cap_zero(info->dma_cap);
     37	dma_cap_set(DMA_SLAVE, info->dma_cap);
     38	info->filter_fn = dw_dma_acpi_filter;
     39
     40	ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info);
     41	if (ret)
     42		dev_err(dev, "could not register acpi_dma_controller\n");
     43}
     44EXPORT_SYMBOL_GPL(dw_dma_acpi_controller_register);
     45
     46void dw_dma_acpi_controller_free(struct dw_dma *dw)
     47{
     48	struct device *dev = dw->dma.dev;
     49
     50	if (!has_acpi_companion(dev))
     51		return;
     52
     53	acpi_dma_controller_free(dev);
     54}
     55EXPORT_SYMBOL_GPL(dw_dma_acpi_controller_free);