mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 22:44:27 +08:00
7e4b8a4fbe
Add support for the eDMA IP version 0 driver for both register maps (legacy and unroll). The legacy register mapping was the initial implementation, which consisted in having all registers belonging to channels multiplexed, which could be change anytime (which could led a race-condition) by view port register (access to only one channel available each time). This register mapping is not very effective and efficient in a multithread environment, which has led to the development of unroll registers mapping, which consists of having all channels registers accessible any time by spreading all channels registers by an offset between them. This version supports a maximum of 16 independent channels (8 write + 8 read), which can run simultaneously. Implements a scatter-gather transfer through a linked list, where the size of linked list depends on the allocated memory divided equally among all channels. Each linked list descriptor can transfer from 1 byte to 4 Gbytes and is alignmented to DWORD. Both SAR (Source Address Register) and DAR (Destination Address Register) are alignmented to byte. Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com> Cc: Vinod Koul <vkoul@kernel.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Russell King <rmk+kernel@armlinux.org.uk> Cc: Joao Pinto <jpinto@synopsys.com> Signed-off-by: Vinod Koul <vkoul@kernel.org>
29 lines
1.1 KiB
C
29 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2018-2019 Synopsys, Inc. and/or its affiliates.
|
|
* Synopsys DesignWare eDMA v0 core
|
|
*
|
|
* Author: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
|
|
*/
|
|
|
|
#ifndef _DW_EDMA_V0_CORE_H
|
|
#define _DW_EDMA_V0_CORE_H
|
|
|
|
#include <linux/dma/edma.h>
|
|
|
|
/* eDMA management callbacks */
|
|
void dw_edma_v0_core_off(struct dw_edma *chan);
|
|
u16 dw_edma_v0_core_ch_count(struct dw_edma *chan, enum dw_edma_dir dir);
|
|
enum dma_status dw_edma_v0_core_ch_status(struct dw_edma_chan *chan);
|
|
void dw_edma_v0_core_clear_done_int(struct dw_edma_chan *chan);
|
|
void dw_edma_v0_core_clear_abort_int(struct dw_edma_chan *chan);
|
|
u32 dw_edma_v0_core_status_done_int(struct dw_edma *chan, enum dw_edma_dir dir);
|
|
u32 dw_edma_v0_core_status_abort_int(struct dw_edma *chan, enum dw_edma_dir dir);
|
|
void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first);
|
|
int dw_edma_v0_core_device_config(struct dw_edma_chan *chan);
|
|
/* eDMA debug fs callbacks */
|
|
void dw_edma_v0_core_debugfs_on(struct dw_edma_chip *chip);
|
|
void dw_edma_v0_core_debugfs_off(void);
|
|
|
|
#endif /* _DW_EDMA_V0_CORE_H */
|