AFHBA404
AFHBA404 connects ACQ2106 to PCI-Express
|
Go to the documentation of this file.
46 #include <linux/module.h>
70 static int MAP2BAR(
struct AFHBA_DEV *adev,
int imap)
75 static int minor2bar(
struct AFHBA_DEV *adev,
int iminor)
79 dev_err(
pdev(adev),
"bad call minor2bar %d", iminor);
87 #define VALID_BAR(bar) ((bar) != NO_BAR)
91 struct file *file,
char *buf,
size_t count, loff_t *f_pos,
int BAR)
99 dev_dbg(
pdev(adev),
"01 adev %p va %p name %s", adev, va, adev->
name);
110 for (ii = 0; ii < count/
sizeof(
u32); ++ii){
111 u32 reg = readl(va + ii*
sizeof(
u32));
112 rc = copy_to_user(buf+ii*
sizeof(
u32), ®,
sizeof(
u32));
125 struct file *file,
const char *buf,
size_t count, loff_t *f_pos,
132 int rc = copy_from_user(&data, buf, min(count,
sizeof(
u32)));
140 }
else if (count + *f_pos > LEN){
141 count = LEN - *f_pos;
144 for (ii = 0; ii < count; ii +=
sizeof(
u32)){
145 u32 readval = readl(va+ii);
146 dev_dbg(
pdev(adev),
"writing %p = 0x%08x was 0x%08x",
147 va+ii, data+ii, readval);
149 writel(data+ii, va+ii);
160 dev_dbg(
pdev(adev),
"01");
164 file->private_data = kmalloc(
PSZ, GFP_KERNEL);
165 PD(file)->dev = adev;
166 PD(file)->minor = MINOR(inode->i_rdev);
167 INIT_LIST_HEAD(&
PD(file)->my_buffers);
169 dev_dbg(
pdev(adev),
"33: minor %d",
PD(file)->minor);
171 switch((
PD(file)->minor)){
178 return file->f_op->open(inode, file);
180 dev_err(
pdev(adev),
"99 adev %p name %s", adev, adev->
name);
186 ssize_t
afhba_read(
struct file *file,
char __user *buf,
size_t count, loff_t *f_pos)
189 return bar_read(file, buf, count, f_pos, minor2bar(adev,
PD(file)->minor));
193 struct file *file,
const char *buf,
size_t count, loff_t *f_pos)
200 int bar = minor2bar(adev,
PD(file)->minor);
201 unsigned long vsize = vma->vm_end - vma->vm_start;
203 unsigned pfn = adev->
mappings[bar].
pa >> PAGE_SHIFT;
205 dev_dbg(
pdev(adev),
"%c vsize %lu psize %lu %s",
206 'D', vsize, psize, vsize>psize?
"EINVAL":
"OK");
211 if (io_remap_pfn_range(
212 vma, vma->vm_start, pfn, vsize, vma->vm_page_prot)){
223 unsigned long vsize = vma->vm_end - vma->vm_start;
225 unsigned pfn = hb->
pa >> PAGE_SHIFT;
227 dev_dbg(
pdev(adev),
"%c vsize %lu psize %lu %s",
228 'D', vsize, psize, vsize>psize?
"EINVAL":
"OK");
233 if (io_remap_pfn_range(
234 vma, vma->vm_start, pfn, vsize, vma->vm_page_prot)){
244 dev_dbg(
pdev(adev),
"01");
245 kfree(file->private_data);
251 struct pci_dev *dev = adev->
pci_dev;
255 for (imap = 0; nmappings < adev->
map_count; ++imap){
256 struct PciMapping* mp = adev->
mappings+imap;
257 int bar = MAP2BAR(adev, imap);
259 dev_dbg(
pdev(adev),
"[%d] ", imap);
264 snprintf(mp->name,
SZM1(mp->name),
"afhba.%d.%d", adev->
idx, bar);
266 mp->pa = pci_resource_start(dev,bar)&
267 PCI_BASE_ADDRESS_MEM_MASK;
268 mp->len = pci_resource_len(dev, bar);
269 mp->region = request_mem_region(
270 mp->pa, mp->len, mp->name);
271 mp->va = ioremap(mp->pa, mp->len);
273 dev_dbg(
pdev(adev),
"BAR %d va:%p", bar, mp->va);
279 dev_dbg(
pdev(adev),
"99 nmappings %d", nmappings);
284 static int getOrder(
int len)
289 for (order = 0; 1 << order < len; ++order){
296 static void init_buffers(
struct AFHBA_DEV* adev)
301 void *buf = (
void*)__get_free_pages(GFP_KERNEL|GFP_DMA32, order);
304 dev_err(
pdev(adev),
"failed to allocate buffer %d", ii);
308 dev_dbg(
pdev(adev),
"buffer %2d allocated at %p, map it", ii, buf);
311 hb->
pa = dma_map_single(&adev->
pci_dev->dev, buf,
316 dev_dbg(
pdev(adev),
"buffer %2d allocated, map done", ii);
320 dev_info(
pdev(adev),
"hb1 [%d] %p %08x %d %08x", ii,
331 static u64 dma_mask = DMA_BIT_MASK(32);
335 dev->dev.dma_mask = &dma_mask;
346 #include <linux/pci_regs.h>
348 #define AFHBA_PCI_CMD (PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY)
355 pci_read_config_word( adev->
pci_dev, PCI_COMMAND, &cmd);
358 pci_write_config_word( adev->
pci_dev, PCI_COMMAND, new_cmd);
359 dev_info(
pdev(adev),
"ENABLE BUS MASTER transactions %04x to %04x",
365 int (*stream_drv_init)(
struct AFHBA_DEV* adev))
367 static struct file_operations afhba_fops = {
383 rc = register_chrdev(0, adev->
name, &afhba_fops);
385 dev_err(
pdev(adev),
"can't get major");
398 rc = pci_enable_device(adev->
pci_dev);
400 dev_warn(
pdev(adev),
"pci_enabled_device returned %d", rc);
404 dev_dbg(
pdev(adev),
"pci_enable_device returns %d", rc);
405 dev_info(
pdev(adev),
"FPGA revision: %08x",
416 dev_dbg(
pdev(adev),
"calling afhba_create_sysfs()");
419 dev_dbg(
pdev(adev),
"calling stream_drv_init()");
420 stream_drv_init(adev);
422 dev_dbg(
pdev(adev),
"99 rc %d", rc);
428 dev_warn(
pdev(adev),
"null_stream_drv_init STUB");
431 #define STREAM afhba_stream_drv_init
432 #define NOSTREAM null_stream_drv_init
437 dev_info(
pdev(adev),
"AFHBA 4G 2-port firmware detected");
443 dev_err(
pdev(adev),
"ERROR failed to create first device");
452 dev_err(
pdev(adev2),
"ERROR failed to create second device");
464 dev_info(
pdev(adev),
"AFHBA404 detected");
468 dev_warn(
pdev(adev),
"limiting BAR count to bad_bios_bar_limit=%d",
475 if (rc!=0)
return rc;
485 dev_err(
pdev(adev2),
"ERROR failed to create device %d",
ib);
495 dev_info(
pdev(adev),
"AFHBA404 detected %s",
afhba4_stream?
"STREAM":
"NOSTREAM");
499 dev_warn(
pdev(adev),
"limiting BAR count to bad_bios_bar_limit=%d",
512 dev_info(
pdev(adev),
"AFHBA: subdevice : %04x\n", ent->subdevice);
513 switch(ent->subdevice){
515 dev_err(
pdev(adev),
"AFHBA 2G FIRMWARE detected %04x", ent->subdevice);
519 dev_err(
pdev(adev),
"AFHBA 4G OBSOLETE FIRMWARE detected %04x", ent->subdevice);
523 dev_info(
pdev(adev),
"AFHBA 4G single port firmware detected");
532 dev_info(
pdev(adev),
"KMCU detected");
535 dev_info(
pdev(adev),
"KMCU2 detected");
551 pci_disable_device(dev);
559 static struct pci_device_id afhba_pci_tbl[] = {
576 static struct pci_driver afhba_driver = {
578 .id_table = afhba_pci_tbl,
588 printk(KERN_INFO
"%s %s %s\n%s\n",
594 rc = pci_register_driver(&afhba_driver);
601 pci_unregister_driver(&afhba_driver);
int afhba_registerDevice(struct AFHBA_DEV *tdev)
ssize_t afhba_write(struct file *file, const char *buf, size_t count, loff_t *f_pos)
void afhba_remove_sysfs(struct AFHBA_DEV *adev)
#define PCI_SUBDID_HBA_KMCU
ssize_t afhba_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos)
#define FPGA_REVISION_REG
u32 afhba_read_reg(struct AFHBA_DEV *adev, int regoff)
struct AFHBA_DEV * afhba_lookupDevice(int major)
int afhba_release(struct inode *inode, struct file *file)
int _afhba_probe(struct AFHBA_DEV *adev, int remote_bar, int(*stream_drv_init)(struct AFHBA_DEV *adev))
void force_busmaster_mode(struct AFHBA_DEV *adev)
struct AFHBA_DEV * afhba_lookupDevicePci(struct pci_dev *pci_dev)
void afhba_map(struct AFHBA_DEV *adev)
int null_stream_drv_init(struct AFHBA_DEV *adev)
int __init afhba_init_module(void)
void afhba_create_sysfs_class(struct AFHBA_DEV *adev)
#define PCI_DEVICE_ID_DTACQ_PCIE
int afhba_probe(struct pci_dev *dev, const struct pci_device_id *ent)
int afhba_mmap_bar(struct file *file, struct vm_area_struct *vma)
#define PCI_SUBDID_FHBA_4G
void adevDelete(struct AFHBA_DEV *adev)
enum HostBuffer::BSTATE bstate
#define PCI_SUBDID_FHBA_4G_OLD
int afhba_mmap_hb(struct file *file, struct vm_area_struct *vma)
#define PCI_VENDOR_ID_XILINX
int afhba2_probe(struct AFHBA_DEV *adev)
MODULE_DEVICE_TABLE(pci, afhba_pci_tbl)
void afhba_create_sysfs(struct AFHBA_DEV *adev)
void afhba_createDebugfs(struct AFHBA_DEV *adev)
void afhba_remove_sysfs_class(struct AFHBA_DEV *adev)
ssize_t bar_write(struct file *file, const char *buf, size_t count, loff_t *f_pos, int BAR, int OFFSET)
struct list_head afhba_devices
struct device * class_dev
#define PCI_SUBDID_HBA_KMCU2
#define PCI_SUBDID_FHBA_4G2
EXPORT_SYMBOL_GPL(afhba_devices)
struct class * afhba_device_class
module_init(afhba_init_module)
#define PCI_SUBDID_FHBA_2G
#define PCI_DEVICE_ID_XILINX_PCIE
MODULE_DESCRIPTION("D-TACQ ACQ-FIBER-HBA Driver for ACQ400")
char afhba__driver_version[]
int afhba_stream_drv_del(struct AFHBA_DEV *adev)
void afhba_removeDebugfs(struct AFHBA_DEV *adev)
void afhba_remove(struct pci_dev *dev)
char afhba__driver_string[]
int afhba4_probe(struct AFHBA_DEV *adev)
#define AURORA_CONTROL_REGA
#define PCI_SUBDID_FHBA_4G4
struct AFHBA_DEV::PciMapping mappings[MAP_COUNT_MAX]
module_exit(afhba_exit_module)
int afhba_mtca_probe(struct AFHBA_DEV *adev)
module_param(afhba_debug, int, 0644)
ssize_t bar_read(struct file *file, char *buf, size_t count, loff_t *f_pos, int BAR)
struct AFHBA_DEV * adevCreate(struct pci_dev *dev)
int afhba_open(struct inode *inode, struct file *file)
MODULE_AUTHOR("Peter.Milne@d-tacq.com")
const char * afhba_devnames[MAXDEV]
void afhba_exit_module(void)
struct file_operations * stream_fops