URL
https://opencores.org/ocsvn/pcie_ds_dma/pcie_ds_dma/trunk
Subversion Repositories pcie_ds_dma
[/] [pcie_ds_dma/] [trunk/] [soft/] [linux/] [driver/] [pexdrv/] [pexproc.c] - Rev 54
Compare with Previous | Blame | View Log
#include <linux/kernel.h> #define __NO_VERSION__ #include <linux/module.h> #include <linux/version.h> #include <linux/types.h> #include <linux/ioport.h> #include <linux/pci.h> #include <linux/pagemap.h> #include <linux/interrupt.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <asm/io.h> #include "pexmodule.h" #include "pexproc.h" #include "ambpexregs.h" #include "hardware.h" //-------------------------------------------------------------------- #define print_info(p, S...) seq_printf(p, S) //-------------------------------------------------------------------- void pex_brd_capabilities(struct pex_device *brd, struct seq_file *p) { int i = 0; int res = 0; u8 cap = 0; u32 cap_id = 0; struct pci_dev *m_pci = brd->m_pci; if(!m_pci) { goto err_exit; } print_info(p,"\n" ); res = pci_read_config_byte(m_pci, 0x34, &cap); if(res < 0) { print_info(p, " Error read capabilities pointer\n"); goto err_exit; } print_info(p, " Capability pointer: 0x%x\n", cap); while(1) { res = pci_read_config_dword(m_pci, cap, &cap_id); if(res < 0) { print_info(p, " Error read capabilities id\n"); goto err_exit; } print_info(p, " Capability ID: 0x%x\n", cap_id); if((cap_id & 0xff) == 0x10) { break; } cap = ((cap_id >> 8) & 0xff); if(!cap) break; } if((cap_id & 0xff) != 0x10) { print_info(p, " Can't find PCI Express capabilities\n"); goto err_exit; } print_info(p,"\n" ); print_info(p, " PCI Express Capability Register Set\n"); print_info(p,"\n" ); for(i=0; i<9; i++) { u32 reg = 0; int j = cap + 4*i; res = pci_read_config_dword(m_pci, j, ®); if(res < 0) { print_info(p, " Error read capabilities sructure: offset %x\n", j); goto err_exit; } print_info(p, " 0x%x: 0x%X\n", j, reg); } return; err_exit: print_info(p, " Error print info\n"); } //-------------------------------------------------------------------- void pex_brd_info(struct pex_device *brd, struct seq_file *p) { int iBlock = 0; if(!brd) { print_info(p," Invalid device pointer\n" ); return; } pex_brd_capabilities(brd, p); print_info(p,"\n" ); print_info(p," Device information\n" ); print_info(p, " m_TotalIRQ = %d\n", atomic_read(&brd->m_TotalIRQ)); for(iBlock = 0; iBlock < brd->m_BlockCnt; iBlock++) { u32 FifoAddr = 0; u16 val = 0; FifoAddr = (iBlock + 1) * PE_FIFO_ADDR; val = ReadOperationWordReg(brd, PEFIFOadr_BLOCK_ID + FifoAddr); if((val & 0x0FFF) != PE_EXT_FIFO_ID) continue; print_info(p,"\n" ); print_info(p," PE_EXT_FIFO %d\n", iBlock+1 ); print_info(p,"\n" ); print_info(p," BLOCK_ID = %x\n", (val & 0x0FFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_BLOCK_VER + FifoAddr); print_info(p," BLOCK_VER = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_ID + FifoAddr); print_info(p," FIFO_ID = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_NUM + FifoAddr); print_info(p," FIFO_NUMBER = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_DMA_SIZE + FifoAddr); print_info(p," RESOURCE = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_CTRL + FifoAddr); print_info(p," DMA_MODE = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_DMA_CTRL + FifoAddr); print_info(p," DMA_CTRL = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_FIFO_STATUS + FifoAddr); print_info(p," FIFO_STATUS = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_FLAG_CLR + FifoAddr); print_info(p," FLAG_CLR = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_PCI_ADDRL + FifoAddr); print_info(p," PCI_ADRL = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_PCI_ADDRH + FifoAddr); print_info(p," PCI_ADRH = %x\n", (val & 0xFFFF) ); val = ReadOperationWordReg(brd, PEFIFOadr_LOCAL_ADR + FifoAddr); print_info(p," LOCAL_ADR = %x\n", (val & 0xFFFF) ); } } //-------------------------------------------------------------------- static int pex_proc_show(struct seq_file *m, void *v) { struct pex_device *brd = m->private; pex_brd_info(brd, m); return 0; } //-------------------------------------------------------------------- static int pex_proc_open(struct inode *inode, struct file *file) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) struct pex_device* brd = PDE_DATA(inode); #else struct pex_device* brd = PDE(inode)->data; #endif return single_open(file, pex_proc_show, brd); } //-------------------------------------------------------------------- static int pex_proc_release(struct inode *inode, struct file *file) { return single_release(inode, file); } //-------------------------------------------------------------------- static const struct file_operations pex_proc_fops = { .owner = THIS_MODULE, .open = pex_proc_open, .read = seq_read, .llseek = seq_lseek, .release = pex_proc_release, }; //-------------------------------------------------------------------- void pex_register_proc( char *name, void *fptr, void *data ) { struct pex_device *brd = (struct pex_device *)data; if(!brd) { dbg_msg( dbg_trace, "%s(): Invalid driver pointer\n", __FUNCTION__ ); return; } if(!proc_create_data(name, S_IRUGO, NULL, &pex_proc_fops, brd)) { dbg_msg(1, "%s(): Error register proc entry: /proc/%s\n", __FUNCTION__, name); } } //-------------------------------------------------------------------- void pex_remove_proc( char *name ) { remove_proc_entry(name, NULL); } //--------------------------------------------------------------------