summaryrefslogtreecommitdiffstats
path: root/drivers/uio
diff options
context:
space:
mode:
authorMichal Sojka <sojkam1@fel.cvut.cz>2017-03-16 14:50:10 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-04-08 18:13:28 +0200
commit270579d95f820e93b39dafd4382530b3beb744e4 (patch)
tree39791f3bdb9937b180fbf2f7256649488f32799c /drivers/uio
parenta15d2ddba9ee94b252d2737419bff285d6b0e239 (diff)
downloadlinux-270579d95f820e93b39dafd4382530b3beb744e4.tar.bz2
uio_mf624: Align memory regions to page size and set correct offsets
mf624 card has its registers not aligned to pages. Since commit b65502879556 ("uio: we cannot mmap unaligned page contents") mmap()ing mf624 registers fails, because now the uio drivers must set uio_mem->addr to be page-aligned. We align the address here and set the newly introduced offs field to the offset of the mf264 registers within the page so that userspace can find the address of the mmap()ed register by reading /sys/class/uio/uio?/maps/map?/offset. Tested with real mf624 card. Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/uio')
-rw-r--r--drivers/uio/uio_mf624.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/uio/uio_mf624.c b/drivers/uio/uio_mf624.c
index 8f30fa1af2ab..35187c052e8c 100644
--- a/drivers/uio/uio_mf624.c
+++ b/drivers/uio/uio_mf624.c
@@ -129,11 +129,15 @@ static int mf624_irqcontrol(struct uio_info *info, s32 irq_on)
static int mf624_setup_mem(struct pci_dev *dev, int bar, struct uio_mem *mem, const char *name)
{
+ resource_size_t start = pci_resource_start(dev, bar);
+ resource_size_t len = pci_resource_len(dev, bar);
+
mem->name = name;
- mem->addr = pci_resource_start(dev, bar);
+ mem->addr = start & PAGE_MASK;
+ mem->offs = start & ~PAGE_MASK;
if (!mem->addr)
return -ENODEV;
- mem->size = pci_resource_len(dev, bar);
+ mem->size = ((start & ~PAGE_MASK) + len + PAGE_SIZE - 1) & PAGE_MASK;
mem->memtype = UIO_MEM_PHYS;
mem->internal_addr = pci_ioremap_bar(dev, bar);
if (!mem->internal_addr)