forked from Imagelibrary/rtems
leon, grpci2dma: add GR740 PCI DMA driver
This commit is contained in:
committed by
Daniel Hellstrom
parent
31ba1f218a
commit
93c5e6376c
@@ -42,9 +42,11 @@ EXTRA_DIST += shared/timer/tlib_ckinit.c
|
|||||||
# PCI bus
|
# PCI bus
|
||||||
EXTRA_DIST += shared/include/grpci.h
|
EXTRA_DIST += shared/include/grpci.h
|
||||||
EXTRA_DIST += shared/include/grpci2.h
|
EXTRA_DIST += shared/include/grpci2.h
|
||||||
|
EXTRA_DIST += shared/include/grpci2dma.h
|
||||||
EXTRA_DIST += shared/include/pcif.h
|
EXTRA_DIST += shared/include/pcif.h
|
||||||
EXTRA_DIST += shared/pci/grpci.c
|
EXTRA_DIST += shared/pci/grpci.c
|
||||||
EXTRA_DIST += shared/pci/grpci2.c
|
EXTRA_DIST += shared/pci/grpci2.c
|
||||||
|
EXTRA_DIST += shared/pci/grpci2dma.c
|
||||||
EXTRA_DIST += shared/pci/pcif.c
|
EXTRA_DIST += shared/pci/pcif.c
|
||||||
EXTRA_DIST += shared/pci/pci_memreg_sparc_le.c
|
EXTRA_DIST += shared/pci/pci_memreg_sparc_le.c
|
||||||
EXTRA_DIST += shared/pci/pci_memreg_sparc_be.c
|
EXTRA_DIST += shared/pci/pci_memreg_sparc_be.c
|
||||||
|
|||||||
@@ -96,9 +96,11 @@ libbsp_a_SOURCES += ../../sparc/shared/timer/tlib.c
|
|||||||
# PCI
|
# PCI
|
||||||
include_bsp_HEADERS += ../../sparc/shared/include/grpci.h
|
include_bsp_HEADERS += ../../sparc/shared/include/grpci.h
|
||||||
include_bsp_HEADERS += ../../sparc/shared/include/grpci2.h
|
include_bsp_HEADERS += ../../sparc/shared/include/grpci2.h
|
||||||
|
include_bsp_HEADERS += ../../sparc/shared/include/grpci2dma.h
|
||||||
include_bsp_HEADERS += ../../sparc/shared/include/pcif.h
|
include_bsp_HEADERS += ../../sparc/shared/include/pcif.h
|
||||||
include_bsp_HEADERS += include/at697_pci.h
|
include_bsp_HEADERS += include/at697_pci.h
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci2.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci2.c
|
||||||
|
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci2dma.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/pcif.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/pcif.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/pci_memreg_sparc_le.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/pci_memreg_sparc_le.c
|
||||||
|
|||||||
@@ -129,6 +129,10 @@ $(PROJECT_INCLUDE)/bsp/grpci2.h: ../../sparc/shared/include/grpci2.h $(PROJECT_I
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/grpci2.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/grpci2.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/grpci2.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/grpci2.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/grpci2dma.h: ../../sparc/shared/include/grpci2dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/grpci2dma.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/grpci2dma.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/bsp/pcif.h: ../../sparc/shared/include/pcif.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
$(PROJECT_INCLUDE)/bsp/pcif.h: ../../sparc/shared/include/pcif.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/pcif.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/pcif.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/pcif.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/pcif.h
|
||||||
|
|||||||
@@ -109,9 +109,11 @@ libbsp_a_SOURCES += \
|
|||||||
# PCI
|
# PCI
|
||||||
include_bsp_HEADERS += ../../sparc/shared/include/grpci.h
|
include_bsp_HEADERS += ../../sparc/shared/include/grpci.h
|
||||||
include_bsp_HEADERS += ../../sparc/shared/include/grpci2.h
|
include_bsp_HEADERS += ../../sparc/shared/include/grpci2.h
|
||||||
|
include_bsp_HEADERS += ../../sparc/shared/include/grpci2dma.h
|
||||||
include_bsp_HEADERS += ../../sparc/shared/include/pcif.h
|
include_bsp_HEADERS += ../../sparc/shared/include/pcif.h
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci2.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci2.c
|
||||||
|
libbsp_a_SOURCES += ../../sparc/shared/pci/grpci2dma.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/pcif.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/pcif.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/pci_memreg_sparc_le.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/pci_memreg_sparc_le.c
|
||||||
libbsp_a_SOURCES += ../../sparc/shared/pci/pci_memreg_sparc_be.c
|
libbsp_a_SOURCES += ../../sparc/shared/pci/pci_memreg_sparc_be.c
|
||||||
|
|||||||
@@ -149,6 +149,10 @@ $(PROJECT_INCLUDE)/bsp/grpci2.h: ../../sparc/shared/include/grpci2.h $(PROJECT_I
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/grpci2.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/grpci2.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/grpci2.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/grpci2.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/grpci2dma.h: ../../sparc/shared/include/grpci2dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/grpci2dma.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/grpci2dma.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/bsp/pcif.h: ../../sparc/shared/include/pcif.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
$(PROJECT_INCLUDE)/bsp/pcif.h: ../../sparc/shared/include/pcif.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/pcif.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/pcif.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/pcif.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/pcif.h
|
||||||
|
|||||||
263
c/src/lib/libbsp/sparc/shared/include/grpci2dma.h
Normal file
263
c/src/lib/libbsp/sparc/shared/include/grpci2dma.h
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
/*
|
||||||
|
* GRPCI2 DMA Driver
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 2017
|
||||||
|
* Cobham Gaisler AB
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.org/license/LICENSE.
|
||||||
|
*
|
||||||
|
* OVERVIEW
|
||||||
|
* ========
|
||||||
|
* This driver controls the DMA on the GRPCI2 device, located
|
||||||
|
* at an on-chip AMBA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GRPCI2DMA_H__
|
||||||
|
#define __GRPCI2DMA_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Error return codes */
|
||||||
|
#define GRPCI2DMA_ERR_OK 0
|
||||||
|
#define GRPCI2DMA_ERR_WRONGPTR -1
|
||||||
|
#define GRPCI2DMA_ERR_NOINIT -2
|
||||||
|
#define GRPCI2DMA_ERR_TOOMANY -3
|
||||||
|
#define GRPCI2DMA_ERR_ERROR -4
|
||||||
|
#define GRPCI2DMA_ERR_STOPDMA -5
|
||||||
|
#define GRPCI2DMA_ERR_NOTFOUND -6
|
||||||
|
|
||||||
|
/* Size of a dma descriptors */
|
||||||
|
#define GRPCI2DMA_BD_CHAN_SIZE 0x10
|
||||||
|
#define GRPCI2DMA_BD_DATA_SIZE 0x10
|
||||||
|
|
||||||
|
/* Alignment of dma descriptors */
|
||||||
|
#define GRPCI2DMA_BD_CHAN_ALIGN 0x10
|
||||||
|
#define GRPCI2DMA_BD_DATA_ALIGN 0x10
|
||||||
|
|
||||||
|
/* User-helper functions to allocate/deallocate
|
||||||
|
* channel and data descriptors
|
||||||
|
*/
|
||||||
|
extern void * grpci2dma_channel_new(int number);
|
||||||
|
extern void grpci2dma_channel_delete(void * chanbd);
|
||||||
|
extern void * grpci2dma_data_new(int number);
|
||||||
|
extern void grpci2dma_data_delete(void * databd);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_prepare
|
||||||
|
* Description:
|
||||||
|
* -Prepare a transfer, initializing the required data descriptors
|
||||||
|
* Parameters:
|
||||||
|
* -pci_start: Where in PCI/remote starts the transfer
|
||||||
|
* -ahb_start: Where in AHB/local starts the transfer
|
||||||
|
* -dir: Direction of the transfer (AHBTOPCI or PCITOAHB)
|
||||||
|
* -endianness: Endianness of the transfer (LITTLEENDIAN or BIGENDIAN)
|
||||||
|
* -size: Size in bytes of the transfer (the function will calculate if there
|
||||||
|
* are enough descriptors)
|
||||||
|
* -databd: Pointer to the data descriptor buffer
|
||||||
|
* -bdindex: Where in the buffer to start the transfer
|
||||||
|
* -bdmax: Maximum index for the data descriptor buffer
|
||||||
|
* -block_size: Size in bytes for each PCI transaction (or block). Guaranteed
|
||||||
|
* to be at least smaller that this value. Put 0 to use default.
|
||||||
|
* Default is maximum, which is 0x10000*4 bytes.
|
||||||
|
* Returns:
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -TOOMANY: Not enough data descriptors in the buffer
|
||||||
|
* -value > 0: A positive return value means the number of data descriptors
|
||||||
|
* prepared/used in the buffer, starting from index.
|
||||||
|
*/
|
||||||
|
#define GRPCI2DMA_AHBTOPCI 1
|
||||||
|
#define GRPCI2DMA_PCITOAHB 0
|
||||||
|
#define GRPCI2DMA_LITTLEENDIAN 1
|
||||||
|
#define GRPCI2DMA_BIGENDIAN 0
|
||||||
|
extern int grpci2dma_prepare(
|
||||||
|
uint32_t pci_start, uint32_t ahb_start, int dir, int endianness,
|
||||||
|
int size, void * databd, int bdindex, int bdmax, int block_size);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_status
|
||||||
|
* Description:
|
||||||
|
* -Status of an transfer:
|
||||||
|
* Parameters:
|
||||||
|
* -databd: Pointer to the data descriptor buffer
|
||||||
|
* -bdindex: Where in the buffer starts the transfer
|
||||||
|
* -bdsize: Number of descriptors used by the transfer
|
||||||
|
* Returns:
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -GRPCI2DMA_BD_DATA_STATUS_ERR: If at least one of the descriptors has an
|
||||||
|
* error
|
||||||
|
* -GRPCI2DMA_BD_DATA_STATUS_ENABLED: If at least one of the descriptors is
|
||||||
|
* enabled, which means that the transfer is still not finished.
|
||||||
|
* -GRPCI2DMA_BD_DATA_STATUS_DISABLED: If all the descriptors are disabled,
|
||||||
|
* which means that either the transfer finished or it was never prepared.
|
||||||
|
*/
|
||||||
|
#define GRPCI2DMA_BD_STATUS_DISABLED 0
|
||||||
|
#define GRPCI2DMA_BD_STATUS_ENABLED 1
|
||||||
|
#define GRPCI2DMA_BD_STATUS_ERR 2
|
||||||
|
extern int grpci2dma_status(void *databd, int bdindex, int bdsize);
|
||||||
|
|
||||||
|
/* Function Interrupt-Code ISR callback prototype.
|
||||||
|
* arg - Custom arg provided by user
|
||||||
|
* cid - Channel ID that got the interrupt
|
||||||
|
* status - Error status of the DMA core
|
||||||
|
*/
|
||||||
|
typedef void (*grpci2dma_isr_t)(void *arg, int cid, unsigned int status);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_isr_register
|
||||||
|
* Description:
|
||||||
|
* -Register an ISR for a channel (and enable interrupts if disabled)
|
||||||
|
* Parameters:
|
||||||
|
* -chan_no: ID of the channel
|
||||||
|
* -dmaisr: ISR
|
||||||
|
* -arg: Argument to pass to the ISR when called
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -OK (=0): Done
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_isr_register(
|
||||||
|
int chan_no, grpci2dma_isr_t dmaisr, void *arg);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_isr_unregister
|
||||||
|
* Description:
|
||||||
|
* -Unregister an ISR for a channel (and enable interrupts if disabled)
|
||||||
|
* Parameters:
|
||||||
|
* -chan_no: ID of the channel
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -OK (=0): Done
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_isr_unregister(int chan_no);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_open
|
||||||
|
* Description:
|
||||||
|
* -Open a channel (and allocate the descriptor if the user does not provide
|
||||||
|
* one).
|
||||||
|
* Parameters:
|
||||||
|
* -chan: Descriptor for the channel (must be aligned to 0x10)
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -TOOMANY: Maximum number of channels already opened.
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -ERROR: Inconsistent state found in driver
|
||||||
|
* -value > 0: A positive return value means the id for the channel.
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_open(void * chan);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_close
|
||||||
|
* Description:
|
||||||
|
* -Stop and close a channel (and deallocate it if the user did not provide a
|
||||||
|
* pointer when opening it)
|
||||||
|
* Parameters:
|
||||||
|
* -chan_no: Id of the channel
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -NOTFOUND: Channel not opened.
|
||||||
|
* -STOPDMA: Cannot stop channel.
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -OK (=0): Done.
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_close(int chan_no);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_start
|
||||||
|
* Description:
|
||||||
|
* -Start a channel
|
||||||
|
* Parameters:
|
||||||
|
* -chan_no: Id of the channel
|
||||||
|
* -options: Maximum number of data descriptors to be executed before moving
|
||||||
|
* to next channel (up to 0x10000)
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -ERROR: Inconsistent state found in driver
|
||||||
|
* -OK (=0): Done.
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_start(int chan_no, int options);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_stop
|
||||||
|
* Description:
|
||||||
|
* -Start a channel
|
||||||
|
* Parameters:
|
||||||
|
* -chan_no: Id of the channel
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -ERROR: Inconsistent state found in driver
|
||||||
|
* -OK (=0): Done.
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_stop(int chan_no);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_push
|
||||||
|
* Description:
|
||||||
|
* -Push a transfer into a channel (already started or not)
|
||||||
|
* Parameters:
|
||||||
|
* -chan_no: Id of the channel
|
||||||
|
* -databd: Pointer to the data descriptor buffer
|
||||||
|
* -bdindex: Where in the buffer starts the transfer
|
||||||
|
* -bdsize: Number of descriptors used by the transfer
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -NOTFOUND: Channel not opened.
|
||||||
|
* -OK (=0): Done.
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_push(int chan_no, void *databd, int bdindex, int bdsize);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_active
|
||||||
|
* Description:
|
||||||
|
* -Check if dma is active
|
||||||
|
* Parameters:
|
||||||
|
* Returns:
|
||||||
|
* -(!=0): Active.
|
||||||
|
* -(=0): Not active.
|
||||||
|
*/
|
||||||
|
extern int grpci2dma_active(void);
|
||||||
|
|
||||||
|
/* Function:
|
||||||
|
* -grpci2dma_interrupt_enable
|
||||||
|
* Description:
|
||||||
|
* -Enable interrupt for a transfer
|
||||||
|
* Parameters:
|
||||||
|
* -databd: Pointer to the data descriptor buffer
|
||||||
|
* -bdindex: Where in the buffer starts the transfer
|
||||||
|
* -bdmax: Upper limit for index. index < bdmax
|
||||||
|
* -options:
|
||||||
|
* (=GRPCI2DMA_OPTIONS_ALL)=Enable interrupt on all transfer descriptors.
|
||||||
|
* (=GRPCI2DMA_OPTIONS_ONE)=Enable interrupt on transfer descriptor
|
||||||
|
* indicated by bdindex.
|
||||||
|
* Returns:
|
||||||
|
* -NOINIT: GRPCI2 DMA not initialized
|
||||||
|
* -WRONGPTR: Wrong input parameters
|
||||||
|
* -ERROR: Inconsistent state found in driver
|
||||||
|
* -OK (=0): Done.
|
||||||
|
*/
|
||||||
|
#define GRPCI2DMA_OPTIONS_ALL 1
|
||||||
|
#define GRPCI2DMA_OPTIONS_ONE 0
|
||||||
|
extern int grpci2dma_interrupt_enable(
|
||||||
|
void *databd, int bdindex, int bdmax, int options);
|
||||||
|
|
||||||
|
/* Debug function: print dma channel and associated data descriptors.
|
||||||
|
* Only prints if driver internal DEBUG flag is defined. */
|
||||||
|
extern int grpci2dma_print(int chan_no);
|
||||||
|
extern int grpci2dma_print_bd(void * data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __GRPCI2DMA_H__ */
|
||||||
2058
c/src/lib/libbsp/sparc/shared/pci/grpci2dma.c
Normal file
2058
c/src/lib/libbsp/sparc/shared/pci/grpci2dma.c
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user