yv9200 发表于 2015-01-19 17:09

mips架构的ioport_map()函数的一些问题

在龙芯的mips架构下开发驱动程序,对pci设备的io端口进行访问,通过pci_resource_start()得到io端口的物理地址,然后通过ioport_map()得到它的虚拟地址,然后通过readl()或者ioread32()等函数访问,但目前出现oop错误,提示cpu 1 unable to handle kernelpaging request at virtual address .......。我感觉是这个映射后的虚拟地址有问题,谁遇到过类似的问题,或者对pci设备驱动比较明白的 ,帮我一下。。多谢。。。。

Tinnal 发表于 2015-01-19 20:04

流程应该没有问题呀。void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
{
        resource_size_t start = pci_resource_start(dev, bar);
        resource_size_t len   = pci_resource_len(dev, bar);
        unsigned long flags = pci_resource_flags(dev, bar);

        if (!len || !start)
                return NULL;
        if (maxlen && len > maxlen)
                len = maxlen;
        if (flags & IORESOURCE_IO)
                return ioport_map(start, len);
        if (flags & IORESOURCE_MEM) {
                if (flags & IORESOURCE_CACHEABLE)
                        return ioremap(start, len);
                return ioremap_nocache(start, len);
        }
        return NULL;
}
EXPORT_SYMBOL(pci_iomap);你是不是内型取错了呀。

yv9200 发表于 2015-01-20 09:29

本帖最后由 yv9200 于 2015-01-20 18:26 编辑

我目前还怀疑那个inioport_map()函数映射的地址可能不对,因为iomem通过ioremap()函数映射的地址为0x9000000048600000(对应物理地址48600000),可以正常访问;但是ioport_map()映射的地址为fc007000(对应物理地址7000),我看龙芯64位地址空间划分,fc007000对应的根本就是用户空间地址,你看看下面这图:



猫头鹰大神,方便给我个别的联系方式吗?

回复 2# Tinnal


   
页: [1]
查看完整版本: mips架构的ioport_map()函数的一些问题