Browse Source

Attempt to bar1

sono 5 years ago
parent
commit
b7b37095d8
  1. 117
      usdpci.c

117
usdpci.c

@ -44,8 +44,13 @@ static unsigned int ioctl_alloc_dma = 0;
static unsigned int ioctl_refresh_link = 1; static unsigned int ioctl_refresh_link = 1;
static unsigned long bar0_addr; static unsigned long bar0_addr;
static unsigned long bar0_size = 4*1024; //TODO ask about size. 4KB static unsigned long bar0_size = 64 * 1024;
static void* bar0_ptr; static void* bar0_ptr;
static unsigned long bar1_addr;
static unsigned long bar1_size = 128 * 1024 * 1024;
static void* bar1_ptr;
static unsigned int irq; static unsigned int irq;
@ -72,6 +77,8 @@ static struct cdev cdev;
static struct class *class = NULL; static struct class *class = NULL;
#define DEV_NAME "usd_reg" #define DEV_NAME "usd_reg"
#define CLASS_NAME "usdpci"
#define NODE_0_NAME "usd_reg0"
struct file_operations chrdev_fops = struct file_operations chrdev_fops =
{ {
@ -143,8 +150,8 @@ static int chrdev_init(void)
return res; return res;
} }
class = class_create(THIS_MODULE, "usdpci"); class = class_create(THIS_MODULE, CLASS_NAME);
device = device_create(class, NULL, 0, NULL, "usd_regs0"); device = device_create(class, NULL, 0, NULL, NODE_0_NAME);
return 0; return 0;
} }
@ -170,7 +177,7 @@ static unsigned int usd_poll (struct file *filp, poll_table *wait)
/*************************************************************************************************/ /*************************************************************************************************/
static int __init pcie_probe (struct pci_dev *dev, const struct pci_device_id *id) static int __init pcie_probe (struct pci_dev *dev, const struct pci_device_id *id)
{ {
bar0_ptr = pci_iomap(dev, 0, 64 * 1024);//4KB bar0_ptr = pci_iomap(dev, 0, bar0_size);
u8* bar0_data = (u8*)bar0_ptr; u8* bar0_data = (u8*)bar0_ptr;
int rc = 0; int rc = 0;
@ -180,19 +187,19 @@ static int __init pcie_probe (struct pci_dev *dev, const struct pci_device_id *i
rc = 1; rc = 1;
goto probe_fail_release_region; goto probe_fail_release_region;
} }
bar1_ptr = pci_iomap(dev, 1, bar1_size);
u8* bar1_data = (u8*)bar1_ptr;
pci_set_master(dev); if(bar1_data == 0)
{
PRINT_ALERT("driver failed to map BAR 1");
rc = 1;
goto probe_fail_release_region;
}
// int i = 0; pci_set_master(dev);
// for( i = 0; i < 1; i++)
// {
// int r32 = ioread32(&bar0_data[i*4]);
// printk(KERN_ALERT "Read: %x (%d)\n", r32, i);
// }
iowrite32(0x45670000, &bar0_data[0x8018]);
int r32 = ioread32(&bar0_data[0x8018]);
printk(KERN_ALERT "Read: %x\n", r32);
return 0; return 0;
probe_fail_release_region: probe_fail_release_region:
@ -216,102 +223,48 @@ static void pcie_remove(struct pci_dev *dev)
__free_page(dma_pages[i]); __free_page(dma_pages[i]);
} }
if (dma_pages != NULL) kfree(dma_pages); if (dma_pages != NULL) kfree(dma_pages);
printk(KERN_ALERT "Freed DMA pages\n"); PRINT_ALERT("Freed DMA pages");
pci_clear_master(dev); pci_clear_master(dev);
printk(KERN_ALERT "Cleared PCIe master\n"); PRINT_ALERT("Cleared PCIe master");
pci_iounmap(dev, bar0_ptr); pci_iounmap(dev, bar0_ptr);
printk(KERN_ALERT "IOunmap\n"); pci_iounmap(dev, bar1_ptr);
PRINT_ALERT("IOunmap");
pci_release_regions(dev); pci_release_regions(dev);
printk(KERN_ALERT "pci_release_regions\n"); PRINT_ALERT("pci_release_regions");
pci_disable_device(dev); pci_disable_device(dev);
printk(KERN_ALERT "pci_disable_device\n"); PRINT_ALERT("pci_disable_device");
} }
/*************************************************************************************************/ /*************************************************************************************************/
static void __exit pcie_exit(void) static void __exit pcie_exit(void)
{ {
int i; PRINT_ALERT("driver unloading");
u8* bar0_data;
bar0_data = (u8*)bar0_ptr;
printk(KERN_ALERT "USDriver PCIe driver unloading\n");
printk(KERN_ALERT "USDriver PCIe driver unregistering\n"); PRINT_ALERT("driver unregistering");
pci_unregister_driver(&pci_driver); pci_unregister_driver(&pci_driver);
printk(KERN_ALERT "USDriver PCIe unregister_chrdev_region\n"); PRINT_ALERT("unregister_chrdev_region");
unregister_chrdev_region(chrdev, 1); unregister_chrdev_region(chrdev, 1);
printk(KERN_ALERT "USDriver PCIe cdev_del\n"); PRINT_ALERT("cdev_del");
cdev_del(&cdev); cdev_del(&cdev);
printk(KERN_ALERT "USDriver PCIe device_destroy\n"); PRINT_ALERT("device_destroy");
device_destroy(class, chrdev); device_destroy(class, chrdev);
printk(KERN_ALERT "USDriver PCIe class_destroy\n"); PRINT_ALERT("class_destroy");
class_destroy(class); class_destroy(class);
printk(KERN_ALERT "USDriver PCIe driver unloaded\n");
PRINT_ALERT("driver unloaded");
} }
module_init(pcie_init); module_init(pcie_init);
module_exit(pcie_exit); module_exit(pcie_exit);
/*************************************************************************************************/
static int create_dma_buffer(unsigned int bufcount)
{
int i;
int bufidx = 0;
unsigned int gfp_mask = GFP_KERNEL | __GFP_DMA;
dma_addr_t bus_addr;
u8* bar0_data;
bar0_data = (u8*)bar0_ptr;
printk(KERN_ALERT "USDriver DMA buffer alloc request: %d pages\n", bufcount);
if( dma_pages != NULL)
{
printk(KERN_ALERT "USDriver DMA buffer already exist! Strange!\n");
}
dma_pages = kmalloc(4*1024*1024 * bufcount, GFP_KERNEL);
if(dma_pages == NULL)
{
printk(KERN_ERR "USDriver DMA dma_pages alloc failed! \n" );
return 1;
}
for(bufidx = 0; bufidx < bufcount; bufidx++)
{
void __iomem *maddr = NULL;
struct page *pages = alloc_pages(gfp_mask, 10);
if(pages == NULL)
{
printk(KERN_ERR "USDriver DMA buffer alloc failed! \n" );
return 1;
}
maddr = page_address(pages);
dma_pages[bufidx] = pages;
bus_addr = pci_map_single(pcidev, maddr, 1024 * PAGE_SIZE, DMA_BIDIRECTIONAL);
printk(KERN_ALERT ">>>>>[%d] 0x%x\n", bufidx, bus_addr);
iowrite32(bus_addr, &bar0_data[DMA_ADDR_OFFSET + (4 * bufidx)]);
wmb();
if(pci_dma_mapping_error(pcidev, bus_addr))
{
return 1;
}
}
dma_pages_count = bufcount;
printk(KERN_ALERT "USDriver DMA buffer alloc successful\n");
return 0;
}
/*************************************************************************************************/ /*************************************************************************************************/
/*************************************************************************************************/ /*************************************************************************************************/
/*************************************************************************************************/ /*************************************************************************************************/

Loading…
Cancel
Save