Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 330168
b: refs/heads/master
c: da1589f
h: refs/heads/master
v: v3
  • Loading branch information
Alexandre Bounine authored and Linus Torvalds committed Oct 5, 2012
1 parent b046cb8 commit 3042e46
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 18f6287f538858135c2c7ed4f76d4441e28b5714
refs/heads/master: da1589f07393e88e917c317ea0c85ea37918a1cf
44 changes: 44 additions & 0 deletions trunk/drivers/rapidio/rio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/rio.h
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,8 @@ struct rio_net {
* @add_outb_message: Callback to add a message to an outbound mailbox queue.
* @add_inb_buffer: Callback to add a buffer to an inbound mailbox queue.
* @get_inb_message: Callback to get a message from an inbound mailbox queue.
* @map_inb: Callback to map RapidIO address region into local memory space.
* @unmap_inb: Callback to unmap RapidIO address region mapped with map_inb().
*/
struct rio_ops {
int (*lcread) (struct rio_mport *mport, int index, u32 offset, int len,
Expand All @@ -323,6 +325,9 @@ struct rio_ops {
int mbox, void *buffer, size_t len);
int (*add_inb_buffer)(struct rio_mport *mport, int mbox, void *buf);
void *(*get_inb_message)(struct rio_mport *mport, int mbox);
int (*map_inb)(struct rio_mport *mport, dma_addr_t lstart,
u64 rstart, u32 size, u32 flags);
void (*unmap_inb)(struct rio_mport *mport, dma_addr_t lstart);
};

#define RIO_RESOURCE_MEM 0x00000100
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/rio_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,11 @@ void rio_release_regions(struct rio_dev *);
int rio_request_region(struct rio_dev *, int, char *);
void rio_release_region(struct rio_dev *, int);

/* Memory mapping functions */
extern int rio_map_inb_region(struct rio_mport *mport, dma_addr_t local,
u64 rbase, u32 size, u32 rflags);
extern void rio_unmap_inb_region(struct rio_mport *mport, dma_addr_t lstart);

/* Port-Write management */
extern int rio_request_inb_pwrite(struct rio_dev *,
int (*)(struct rio_dev *, union rio_pw_msg*, int));
Expand Down

0 comments on commit 3042e46

Please sign in to comment.