|
@@ -33,6 +33,7 @@
|
|
|
|
|
|
static LIST_HEAD(rio_mports);
|
|
|
static unsigned char next_portid;
|
|
|
+static DEFINE_SPINLOCK(rio_mmap_lock);
|
|
|
|
|
|
/**
|
|
|
* rio_local_get_device_id - Get the base/extended device id for a port
|
|
@@ -397,6 +398,49 @@ int rio_release_inb_pwrite(struct rio_dev *rdev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rio_release_inb_pwrite);
|
|
|
|
|
|
+/**
|
|
|
+ * rio_map_inb_region -- Map inbound memory region.
|
|
|
+ * @mport: Master port.
|
|
|
+ * @lstart: physical address of memory region to be mapped
|
|
|
+ * @rbase: RIO base address assigned to this window
|
|
|
+ * @size: Size of the memory region
|
|
|
+ * @rflags: Flags for mapping.
|
|
|
+ *
|
|
|
+ * Return: 0 -- Success.
|
|
|
+ *
|
|
|
+ * This function will create the mapping from RIO space to local memory.
|
|
|
+ */
|
|
|
+int rio_map_inb_region(struct rio_mport *mport, dma_addr_t local,
|
|
|
+ u64 rbase, u32 size, u32 rflags)
|
|
|
+{
|
|
|
+ int rc = 0;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ if (!mport->ops->map_inb)
|
|
|
+ return -1;
|
|
|
+ spin_lock_irqsave(&rio_mmap_lock, flags);
|
|
|
+ rc = mport->ops->map_inb(mport, local, rbase, size, rflags);
|
|
|
+ spin_unlock_irqrestore(&rio_mmap_lock, flags);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(rio_map_inb_region);
|
|
|
+
|
|
|
+/**
|
|
|
+ * rio_unmap_inb_region -- Unmap the inbound memory region
|
|
|
+ * @mport: Master port
|
|
|
+ * @lstart: physical address of memory region to be unmapped
|
|
|
+ */
|
|
|
+void rio_unmap_inb_region(struct rio_mport *mport, dma_addr_t lstart)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ if (!mport->ops->unmap_inb)
|
|
|
+ return;
|
|
|
+ spin_lock_irqsave(&rio_mmap_lock, flags);
|
|
|
+ mport->ops->unmap_inb(mport, lstart);
|
|
|
+ spin_unlock_irqrestore(&rio_mmap_lock, flags);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(rio_unmap_inb_region);
|
|
|
+
|
|
|
/**
|
|
|
* rio_mport_get_physefb - Helper function that returns register offset
|
|
|
* for Physical Layer Extended Features Block.
|