Implementación del controlador de dispositivo PCIe Linux (quiero acceder a los registros de mi tarjeta desde el controlador del kernel)

Estoy escribiendo un controlador de dispositivo para acceder a la memoria en un FPGA en una tarjeta PCIe.
La tarjeta arranca y se prueba / se encuentra: -

/ proc / iomem

80000000-840fffff : PCI Bus #03
  80000000-83ffffff : 0000:03:00.0
  84000000-840fffff : 0000:03:00.0

Así que leyendo ldd / etc. Codifiqué una llamada arequest_mem_region en el80000000, y solicitó un puntero a través deioremap_nocache

1) ¿Necesitorequest_mem_region así como unioremap_nocache, ¿no puedo usar solo el último?

/ proc / iomem Afterinsmod controlador de mi dispositivo: -

80000000-840fffff : PCI Bus #03
  80000000-83ffffff : 0000:03:00.0
    80000000-8003ffff : fp2
  84000000-840fffff : 0000:03:00.0

2) ¿No me parece bien ...?

e todos modos, las lecturas no funcionan (no está codificado como a continuación, tiene cheques, etc.): -

#define BAR_ADDR 0x80000000
void *base = ioremap_nocache(BAR_ADDR, 0x40000);
void *address = base + KNOWN_REG_LOCATION;
int data = ioread32(address);
printk("fp2: address:0x%08x, data:0x%08x\n", address, data);

Salidas: -

address:0xfd500000, data:0xffffffff

Puedo leer elx80000000+KNOWN_REG_LOCATION desde mmap userspace.

3) He intentado__raw_readl/readl sin suerte también.

4) ¿Puedo leer en la dirección asignada actualmentex80000000?

Respuestas a la pregunta(1)

Su respuesta a la pregunta