← Back to context

Comment by LarsKrimi

6 hours ago

Latching on to this thread, but can you make as simple as possible of an example?

Something like just a single BAR with a register that printfs whatever is written

Hi! I do have some rudimentary docs on which I made a simple device for example pruposes: https://cakehonolulu.github.io/docs/pciem/simple_device_walk...

Hopefully this is what you're searching for!

  • Hi, thanks. That's almost it. The remaining problem is just how to tie it together (where do I put the handle_mmio_read pointer or which event should it be handled in?)

    PCIEM_EVENT_MMIO_READ is defined but not used anywhere in the codebase

    • Hi! Sorry, this is an issue on my side; I forgot to update the documentation's example with the latest changes.

      You basically have the kernel eventfd notify you about any access triggered (Based on your configuration), so from userspace, you have the eventfd and then you mmap the shared lock-less ring buffer that actually contains the events PCIem notifies (So you don't end up busy polling).

      You basically mmap a struct pciem_shared_ring where you'll have your usual head/tail pointers.

      From then on, on your main, you'd have a select() or a poll() for the eventfd; when PCIem notifies the userspace you'd check head != tail (Which means there are events to process) and you can basically do:

      struct pciem_event *event = &event_ring->events[head]; atomic_thread_fence(memory_order_acquire); if (event->type == PCIEM_EVENT_MMIO_WRITE) handle_mmio_read(...);

      And that's it, don't forget to update the head pointer!

      I'll go and update the docs now. Hopefully this clears stuff up!