PCIe Endpoint ke Memori Sistem / Transaksi Endpoint

1

Saya memiliki PCIe Endpoint & Root Complex adalah PC yang menjalankan linux. Sekarang, saya ingin mengirim beberapa byte (katakanlah, 4 byte) dari EP ke memori sistem (RC) menggunakan PCIe Memory Read Request (TLP) Contoh PCIe Memory TLP.

Permintaan Memori TLP


Untuk mengirim ini, EP perlu mengetahui alamat memori sistem. Sejauh yang saya mengerti, RC akan terhubung ke memori sistem sehingga setiap transaksi yang menargetkan RC akan menargetkan memori sistem sehingga EP harus mengetahui kisaran alamat RC. Berikut adalah contoh gambar:

EP untuk transaksi memori sistem

Pertanyaan saya:

  1. Bagaimana EP mengetahui alamat memori sistem? Apakah RC BAR dipetakan ke memori sistem? Jika ya, dapatkah EP mengakses RC BAR? Jika ya, bagaimana?

  2. Demikian pula, ketika EP ingin berkomunikasi dengan EP lain, ia harus tahu target EP BAR target. Jadi, bagaimana EP mengetahui alamat EP lain?

    Contoh gambar :Transaksi Memori EP ke EP

  3. Apakah ada kode / driver linux yang dapat saya rujuk untuk EP ke System-memory / komunikasi EP lainnya?


Terima kasih banyak atas bantuannya.

Abhinav kumar
sumber
Pernahkah Anda menanyakan hal ini sebelumnya? Setidaknya saya ingat pertanyaan yang sangat mirip. Jawabannya tetap: Anda tidak hanya mengirim permintaan EP "untuk membaca memori". Permintaan itu memiliki beberapa tujuan. Anda harus memberi tahu kami apa tujuannya. Biasanya tujuannya akan melibatkan driver di sisi PC, dan driver ini akan mencadangkan memori sebagai area komunikasi, dan itu akan memberi tahu perangkat keras Anda alamat fisik memori untuk DMA dll. Dan tidak, BAR tidak pernah dipetakan ke memori PC .
dirkt
Ya, pertanyaannya sangat mirip tetapi yang ini lebih rumit. Tujuannya hanya untuk melakukan transfer data dari EP ke PC (RC). Jadi, apakah itu berarti bahwa driver RC di sisi linux akan menyediakan api untuk mendapatkan alamat fisik memori untuk DMA yang dapat digunakan oleh EP? Jika ya, bisakah Anda membantu saya menemukan api itu? Maaf, saya hanya pemula di linux.
Abhinav kumar
Anda tidak dapat "hanya melakukan transfer data". Jika Anda "hanya ingin melakukan transfer data", letakkan data di suatu tempat dalam kisaran alamat BAR, dan minta PC mengeluarkan permintaan baca / tulis ke titik akhir. Ini akan mentransfer data dari / ke perangkat Anda. Itu bekerja bahkan tanpa driver, IIRC di suatu tempat di / proc atau / sys ada "file" yang mewakili area BAR.
dirkt
Terima kasih banyak, terima kasih atas jawabannya. Saya yakin Anda telah memberikan solusi yang mungkin untuk salah satu masalah saya. Untuk pertanyaan kedua tentang komunikasi EP ke EP, bagaimana hal ini ditangani? Apakah akan menjadi seperti ini: letakkan data di suatu tempat di kisaran alamat salah satu BAR dari satu EP & kemudian untuk mentransfernya ke EP lain, apakah masalah PC membaca / menulis ke BAR masing-masing titik akhir masing-masing?
Abhinav kumar