URL
https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk
Subversion Repositories pcie_ds_dma
Compare Revisions
- This comparison shows the changes necessary to convert path
/pcie_ds_dma/trunk/soft/linux/driver/pexdrv
- from Rev 2 to Rev 6
- ↔ Reverse comparison
Rev 2 → Rev 6
/hardware.h
11,6 → 11,8
#define AMBPEX5_DEVID 0x5507 |
#define AMBPEXARM_DEVID 0x5702 |
#define AMBFMC106P_DEVID 0x550A |
#define AMBFMC114V_DEVID 0x550C |
#define AMBKU_SSCOS_DEVID 0x5703 |
|
//----------------------------------------------------------------------------- |
|
26,8 → 28,6
void WriteOperationReg(struct pex_device *brd, u32 RelativePort, u32 Value); |
u16 ReadOperationWordReg(struct pex_device *brd, u32 RelativePort); |
void WriteOperationWordReg(struct pex_device *brd, u32 RelativePort, u16 Value); |
u8 ReadOperationByteReg(struct pex_device *brd, u32 RelativePort); |
void WriteOperationByteReg(struct pex_device *brd, u32 RelativePort, u8 Value); |
u32 ReadAmbReg(struct pex_device *brd, u32 AdmNumber, u32 RelativePort); |
u32 ReadAmbMainReg(struct pex_device *brd, u32 RelativePort); |
void WriteAmbReg(struct pex_device *brd, u32 AdmNumber, u32 RelativePort, u32 Value); |
/pexmodule.c
39,7 → 39,7
static LIST_HEAD(device_list); |
static int boards_count = 0; |
static struct mutex pex_mutex; |
int dbg_trace = 0; |
int dbg_trace = 1; |
int err_trace = 1; |
|
//----------------------------------------------------------------------------- |
473,6 → 473,18
.subvendor = PCI_ANY_ID, |
.subdevice = PCI_ANY_ID, |
}, |
{ |
.vendor = INSYS_VENDOR_ID, |
.device = AMBFMC114V_DEVID, |
.subvendor = PCI_ANY_ID, |
.subdevice = PCI_ANY_ID, |
}, |
{ |
.vendor = INSYS_VENDOR_ID, |
.device = AMBKU_SSCOS_DEVID, |
.subvendor = PCI_ANY_ID, |
.subdevice = PCI_ANY_ID, |
}, |
{ }, |
}; |
|
573,9 → 585,9
dbg_msg(dbg_trace, "%s(): Add cdev %d\n", __FUNCTION__, boards_count); |
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
brd->m_device = device_create(pex_class, NULL, brd->m_devno, "%s", brd->m_name); |
brd->m_device = device_create(pex_class, NULL, brd->m_devno, "%s%d", "pexdrv", boards_count); |
#else |
brd->m_device = device_create(pex_class, NULL, brd->m_devno, NULL, "%s", brd->m_name); |
brd->m_device = device_create(pex_class, NULL, brd->m_devno, NULL, "%s%d", "pexdrv", boards_count); |
#endif |
if(!brd->m_device ) { |
err_msg(err_trace, "%s(): Error create device for board: %s\n", __FUNCTION__, brd->m_name); |
643,6 → 655,7
{ |
struct list_head *pos, *n; |
struct pex_device *brd = NULL; |
int i = 0; |
|
dbg_msg(dbg_trace, "%s(): device_id = %x, vendor_id = %x\n", __FUNCTION__, dev->device, dev->vendor); |
|
658,6 → 671,12
dbg_msg(dbg_trace, "%s(): free_irq() - complete\n", __FUNCTION__); |
pex_remove_proc(brd->m_name); |
dbg_msg(dbg_trace, "%s(): pex_remove_proc() - complete\n", __FUNCTION__); |
for(i = 0; i < MAX_NUMBER_OF_DMACHANNELS; i++) { |
if(brd->m_DmaChannel[i]) { |
CDmaChannelDelete(brd->m_DmaChannel[i]); |
dbg_msg(dbg_trace, "%s(): free DMA channel %d - complete\n", __FUNCTION__, i); |
} |
} |
free_memory(brd); |
dbg_msg(dbg_trace, "%s(): free_memory() - complete\n", __FUNCTION__); |
device_destroy(pex_class, brd->m_devno); |
/exam/pex_test.cpp
15,6 → 15,8
#include <sys/mman.h> |
#include <fcntl.h> |
|
#include "utypes_linux.h" |
#include "brd_info.h" |
#include "pexioctl.h" |
#include "ambpexregs.h" |
|
/exam/Makefile
12,7 → 12,7
CC = $(CROSS_COMPILE)g++ |
LD = $(CROSS_COMPILE)g++ |
|
CFLAGS := -D__LINUX__ -g -Wall -I.. |
CFLAGS := -D__LINUX__ -g -Wall -I.. -I../../../common/utils -I../../../common/board |
LFLAGS = -Wl |
|
$(TARGET_NAME): $(patsubst %.cpp,%.o, $(wildcard *.cpp)) |
/pexproc.c
19,7 → 19,7
|
void pex_register_proc( char *name, void *fptr, void *data ) |
{ |
create_proc_read_entry( name, 0, NULL, fptr, data ); |
create_proc_read_entry( name, 0, NULL, fptr, data ); |
} |
|
//-------------------------------------------------------------------- |
26,11 → 26,74
|
void pex_remove_proc( char *name ) |
{ |
remove_proc_entry( name, NULL ); |
remove_proc_entry( name, NULL ); |
} |
|
//-------------------------------------------------------------------- |
|
int pex_show_capabilities( char *buf, struct pex_device *brd ) |
{ |
int i = 0, res = -1; |
char *p = buf; |
u8 cap; |
u8 cap_id; |
|
p += sprintf(p,"\n" ); |
p += sprintf(p," Device capabilities\n" ); |
p += sprintf(p,"\n" ); |
|
res = pci_read_config_byte(brd->m_pci, 0x34, &cap); |
if(res < 0) { |
p += sprintf(p, " Error read capabilities pointer\n"); |
goto err_exit; |
} |
|
res = pci_read_config_byte(brd->m_pci, cap, &cap_id); |
if(res < 0) { |
p += sprintf(p, " Error read capabilities id\n"); |
goto err_exit; |
} |
|
if(cap_id != 0x10) { //not PCI Express capabilities |
|
res = pci_read_config_byte(brd->m_pci, cap+1, &cap); |
if(res < 0) { |
p += sprintf(p, " Error read capabilities id\n"); |
goto err_exit; |
} |
} |
|
res = pci_read_config_byte(brd->m_pci, cap, &cap_id); |
if(res < 0) { |
p += sprintf(p, " Error read capabilities id\n"); |
goto err_exit; |
} else { |
p += sprintf(p, " CAP_ID = 0x%X\n", cap_id); |
} |
|
if(cap_id != 0x10) { |
p += sprintf(p, " Can't find PCI Express capabilities\n"); |
goto err_exit; |
} |
|
for(i=0; i<9; i++) { |
u32 reg = 0; |
int j = cap + 4*i; |
res = pci_read_config_dword(brd->m_pci, j, ®); |
if(res < 0) { |
p += sprintf(p, " Error read capabilities sructure: offset %x\n", j); |
goto err_exit; |
} |
p += sprintf(p, " %x: = 0x%X\n", j, reg); |
} |
|
err_exit: |
|
return (p-buf); |
} |
|
//-------------------------------------------------------------------- |
|
int pex_proc_info( char *buf, |
char **start, |
off_t off, |
38,63 → 101,68
int *eof, |
void *data ) |
{ |
int iBlock = 0; |
char *p = buf; |
struct pex_device *brd = (struct pex_device*)data; |
int iBlock = 0; |
char *p = buf; |
struct pex_device *brd = (struct pex_device*)data; |
|
if(!brd) { |
p += sprintf(p," Invalid device pointer\n" ); |
*eof = 1; |
return p - buf; |
} |
if(!brd) { |
p += sprintf(p," Invalid device pointer\n" ); |
*eof = 1; |
return p - buf; |
} |
|
p += sprintf(p," Device information\n" ); |
p += pex_show_capabilities(p, brd); |
|
p += sprintf(p, " m_TotalIRQ = %d\n", atomic_read(&brd->m_TotalIRQ)); |
p += sprintf(p,"\n" ); |
p += sprintf(p," Device information\n" ); |
|
for(iBlock = 0; iBlock < brd->m_BlockCnt; iBlock++) |
{ |
u32 FifoAddr = 0; |
u16 val = 0; |
p += sprintf(p, " m_TotalIRQ = %d\n", atomic_read(&brd->m_TotalIRQ)); |
|
FifoAddr = (iBlock + 1) * PE_FIFO_ADDR; |
val = ReadOperationWordReg(brd, PEFIFOadr_BLOCK_ID + FifoAddr); |
|
if((val & 0x0FFF) != PE_EXT_FIFO_ID) |
continue; |
|
p += sprintf(p,"\n" ); |
p += sprintf(p," PE_EXT_FIFO %d\n", iBlock+1 ); |
p += sprintf(p,"\n" ); |
for(iBlock = 0; iBlock < brd->m_BlockCnt; iBlock++) |
{ |
u32 FifoAddr = 0; |
u16 val = 0; |
|
p += sprintf(p," BLOCK_ID = %x\n", (val & 0x0FFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_BLOCK_VER + FifoAddr); |
p += sprintf(p," BLOCK_VER = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_ID + FifoAddr); |
p += sprintf(p," FIFO_ID = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_NUM + FifoAddr); |
p += sprintf(p," FIFO_NUMBER = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_DMA_SIZE + FifoAddr); |
p += sprintf(p," RESOURCE = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_CTRL + FifoAddr); |
p += sprintf(p," DMA_MODE = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_DMA_CTRL + FifoAddr); |
p += sprintf(p," DMA_CTRL = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_STATUS + FifoAddr); |
p += sprintf(p," FIFO_STATUS = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FLAG_CLR + FifoAddr); |
p += sprintf(p," FLAG_CLR = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_PCI_ADDRL + FifoAddr); |
p += sprintf(p," PCI_ADRL = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_PCI_ADDRH + FifoAddr); |
p += sprintf(p," PCI_ADRH = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_LOCAL_ADR + FifoAddr); |
p += sprintf(p," LOCAL_ADR = %x\n", (val & 0xFFFF) ); |
} |
FifoAddr = (iBlock + 1) * PE_FIFO_ADDR; |
val = ReadOperationWordReg(brd, PEFIFOadr_BLOCK_ID + FifoAddr); |
|
*eof = 1; |
if((val & 0x0FFF) != PE_EXT_FIFO_ID) |
continue; |
|
return p - buf; |
p += sprintf(p,"\n" ); |
p += sprintf(p," PE_EXT_FIFO %d\n", iBlock+1 ); |
p += sprintf(p,"\n" ); |
|
p += sprintf(p," BLOCK_ID = %x\n", (val & 0x0FFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_BLOCK_VER + FifoAddr); |
p += sprintf(p," BLOCK_VER = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_ID + FifoAddr); |
p += sprintf(p," FIFO_ID = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_NUM + FifoAddr); |
p += sprintf(p," FIFO_NUMBER = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_DMA_SIZE + FifoAddr); |
p += sprintf(p," RESOURCE = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_CTRL + FifoAddr); |
p += sprintf(p," DMA_MODE = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_DMA_CTRL + FifoAddr); |
p += sprintf(p," DMA_CTRL = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_STATUS + FifoAddr); |
p += sprintf(p," FIFO_STATUS = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_FLAG_CLR + FifoAddr); |
p += sprintf(p," FLAG_CLR = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_PCI_ADDRL + FifoAddr); |
p += sprintf(p," PCI_ADRL = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_PCI_ADDRH + FifoAddr); |
p += sprintf(p," PCI_ADRH = %x\n", (val & 0xFFFF) ); |
val = ReadOperationWordReg(brd, PEFIFOadr_LOCAL_ADR + FifoAddr); |
p += sprintf(p," LOCAL_ADR = %x\n", (val & 0xFFFF) ); |
} |
|
*eof = 1; |
|
return p - buf; |
} |
|
//-------------------------------------------------------------------- |
/insert
4,32 → 4,69
# This script is loading modules in the kernel. |
# |
|
kernel=`uname -r | grep 2.6` |
status () |
{ |
if [ $1 -eq 0 ] ; then |
echo "[SUCCESS]" |
else |
echo "[FAILED]" |
|
if [ ${kernel} = "" ] |
if [ $2 -eq 1 ] ; then |
echo "... loading aborted." |
exit 1 |
fi |
fi |
} |
|
echo |
|
kernel=`uname -r | grep 2.4` |
|
if [ $kernel ] |
then |
module=ambpex.o |
module=pexdrv.o |
mname=${module%.o} |
else |
module=`find *.ko` |
mname=${module%.ko} |
fi |
module="pexdrv.ko" |
|
if [ ${module} = "" ] |
device=pexdrv |
mode="666" |
|
chmod 777 /dev/shm |
|
if [ ${module} ] |
then |
echo No kernel module found. ${module} |
exit |
echo -n " Find ${module} module : " |
status $? 0 |
else |
echo Find ${module} - kernel module. |
echo -n " Kernel module not found : " |
status 1 0 |
exit |
fi |
|
/sbin/insmod ./$module $* || exit 1 |
was_loaded=`/sbin/lsmod | cut -c 1-6 | grep $device` |
|
sleep 1 |
if [ ${was_loaded} ] |
then |
echo -n " Remove loaded module : " |
/sbin/rmmod $device |
status $? 0 |
else |
echo Loading module: ${module} |
fi |
|
devfiles=`ls /dev/* | grep AMB` |
echo -n " Loading pexdrv module : " |
insmod ./${module} |
|
#echo ${devfiles} |
until [ -e /dev/pexdrv0 ] |
do |
sleep 1.5 |
done |
|
chmod -v 666 ${devfiles} |
chmod 666 /dev/pexdrv* |
|
status $? 0 |
|
echo |
/ioctlrw.c
15,6 → 15,7
#include "pexioctl.h" |
#include "hardware.h" |
#include "ambpexregs.h" |
#include "brd_info.h" |
|
//-------------------------------------------------------------------- |
|
/dmachan.c
79,6 → 79,8
// а при повторных только отображаем выделенную память на пользовательское пространство |
if(!dma->m_UseCount) |
{ |
dma_addr_t pa = (dma_addr_t)0; |
|
dma->m_MemType = bMemType; |
dma->m_BlockCount = *pCount; |
dma->m_BlockSize = size; |
86,7 → 88,7
// выделяем память под описатели блоков (системный, и логический адрес для каждого блока) |
dma->m_pBufDscr.SystemAddress = (void*)dma_alloc_coherent( dma->m_dev, |
dma->m_BlockCount * sizeof(SHARED_MEMORY_DESCRIPTION), |
&dma->m_pBufDscr.LogicalAddress, GFP_KERNEL); |
&pa, GFP_KERNEL); |
if(!dma->m_pBufDscr.SystemAddress) |
{ |
printk("<0>%s(): Not memory for buffer descriptions\n", __FUNCTION__); |
93,6 → 95,7
return -ENOMEM; |
} |
|
dma->m_pBufDscr.LogicalAddress = (size_t)pa; |
dma->m_ScatterGatherTableEntryCnt = 0; |
} |
|
/pexioctl.h
93,18 → 93,6
PEX_MAKE_IOCTL(PEX_DEVICE_TYPE, PEX_ADJUST) |
|
//----------------------------------------------------------------------------- |
// board configuration data structure |
struct board_info { |
size_t PhysAddress[6]; // OUT |
void* VirtAddress[6]; // OUT |
size_t Size[6]; // OUT |
size_t InterruptLevel; // OUT |
size_t InterruptVector;// OUT |
unsigned short vendor_id; // OUT |
unsigned short device_id; // OUT |
}; |
|
//----------------------------------------------------------------------------- |
// memory block structure |
struct memory_block { |
size_t phys; |
/Makefile
1,6 → 1,7
|
KERNELVER := $(shell uname -r) |
EXTRA_CFLAGS += -O2 |
EXTRA_CFLAGS += -I $(PWD)/../../common/board |
|
ifneq ($(KERNELRELEASE),) |
|
14,7 → 15,7
PWD := $(shell pwd) |
|
modules: |
$(MAKE) -C $(KERNELDIR) M=$(PWD) $(DIRS) |
$(MAKE) -C $(KERNELDIR) M=$(PWD) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" |
|
endif |
|
29,3 → 30,6
ifeq (.depend, $(wildcard .depend)) |
include .depend |
endif |
|
install: |
./insert |
/hardware.c
27,8 → 27,10
case AMBPEX8_DEVID: snprintf(brd->m_name, 128, "%s%d", "AMBPEX8", index); break; |
case ADP201X1AMB_DEVID: snprintf(brd->m_name, 128, "%s%d", "ADP201X1AMB", index); break; |
case ADP201X1DSP_DEVID: snprintf(brd->m_name, 128, "%s%d", "ADP201X1DSP", index); break; |
case AMBPEXARM_DEVID: snprintf(brd->m_name, 128, "%s%d", "AMBPEXARM_DEVID", index); break; |
case AMBFMC106P_DEVID: snprintf(brd->m_name, 128, "%s%d", "AMBFMC106P_DEVID", index); break; |
case AMBPEXARM_DEVID: snprintf(brd->m_name, 128, "%s%d", "D2XT005", index); break; |
case AMBFMC106P_DEVID: snprintf(brd->m_name, 128, "%s%d", "AMBFMC106P", index); break; |
case AMBFMC114V_DEVID: snprintf(brd->m_name, 128, "%s%d", "AMBFMC114V", index); break; |
case AMBKU_SSCOS_DEVID: snprintf(brd->m_name, 128, "%s%d", "AMBKU_SSCOS", index); break; |
default: |
snprintf(brd->m_name, sizeof(brd->m_name), "%s%d", "Unknown", index); break; |
} |
113,8 → 115,12
if((AMBPEX8_DEVID != deviceID) && |
(ADP201X1AMB_DEVID != deviceID) && |
(AMBPEX5_DEVID != deviceID) && |
(AMBPEXARM_DEVID != deviceID)) |
(AMBPEXARM_DEVID != deviceID) && |
(AMBFMC114V_DEVID != deviceID)) { |
|
dbg_msg(dbg_trace, "%s(): Unsupported device id: 0x%X.\n", __FUNCTION__, deviceID); |
return -ENODEV; |
} |
|
temp = ReadOperationWordReg(brd, PEMAINadr_PLD_VER); |
|
265,7 → 271,9
|
u16 ReadOperationWordReg(struct pex_device *brd, u32 RelativePort) |
{ |
return readw((u16*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
u32 tmpVal = readl((u32*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
return (tmpVal & 0xFFFF); |
//return readw((u16*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
} |
|
//-------------------------------------------------------------------- |
272,25 → 280,13
|
void WriteOperationWordReg(struct pex_device *brd, u32 RelativePort, u16 Value) |
{ |
writew( Value, (u16*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
u32 tmpVal = Value; |
//writew( Value, (u16*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
writel( tmpVal, (u32*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
} |
|
//-------------------------------------------------------------------- |
|
u8 ReadOperationByteReg(struct pex_device *brd, u32 RelativePort) |
{ |
return readb((u8*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
} |
|
//-------------------------------------------------------------------- |
|
void WriteOperationByteReg(struct pex_device *brd, u32 RelativePort, u8 Value) |
{ |
writeb( Value, (u8*)((u8*)brd->m_BAR0.virtual_address + RelativePort)); |
} |
|
//-------------------------------------------------------------------- |
|
u32 ReadAmbReg(struct pex_device *brd, u32 AdmNumber, u32 RelativePort) |
{ |
u8* pBaseAddress = (u8*)brd->m_BAR1.virtual_address + AdmNumber * ADM_SIZE; |