2012-02-21 32 views
6

Tôi đang làm việc trên trình điều khiển FPGA cho hạt nhân Linux. Mã dường như làm việc tốt trên x86, nhưng trên x86_64 tôi đã có một số vấn đề. Tôi đã triển khai truyền trực tuyến DMA. Vì vậy, nó đi như thếTruyền DMA trong trình điều khiển hạt nhân Linux PCIE

get_user_pages(...); 
for (...) { 
    sg_set_page(); 
} 
pci_map_sg(); 

Nhưng pci_map_sg trở địa chỉ như 0xbd285800, mà không phải là aligned bởi PAGE_SIZE, vì vậy tôi không thể gửi đầy đủ trang đầu tiên, bởi vì đặc điểm kỹ thuật PCIE nói

"Yêu cầu không được chỉ định một kết hợp Địa chỉ/Độ dài làm cho việc truy cập không gian bộ nhớ vượt qua ranh giới 4 KB. . "

Có cách nào để có được các địa chỉ được liên kết hay không, tôi đã bỏ sót điều gì đó quan trọng?

Source code of DMA.

+0

Bạn có thể bao gồm mã từ nguồn thực của mình không? Không có đủ để phát hiện lỗi. –

+0

Vâng, tất nhiên rồi. Được đính kèm với bài đăng gốc. – soh

+0

@soh: Bất kỳ kế hoạch phát hành nó cho công chúng? Tôi đã nhìn xung quanh cho một người lái xe mở và không thể tìm thấy một người tốt. Là quá lười biếng để viết của riêng tôi, tôi muốn được vui mừng hơn để đóng góp và giúp đỡ với thử nghiệm. –

Trả lời

3

Khả năng đầu tiên lưu ý là bộ đệm người dùng đến không bắt đầu trên một ranh giới trang. Nếu địa chỉ xuất phát của bạn là 0x800 byte thông qua một trang, thì số tiền trên cuộc gọi sg_set_page đầu tiên của bạn sẽ là 0x800. Điều này sẽ tạo ra một địa chỉ DMA kết thúc bằng 0x800. Đây là một điều bình thường xảy ra, và không phải là một lỗi.

pci_map_sg các trang kết hợp, phân đoạn đầu tiên này có thể lớn hơn một trang. Điều quan trọng là pci_map_sg tạo ra các khối liền kề bộ nhớ địa chỉ DMA, nhưng nó không tạo ra một danh sách các giao dịch PCIe cấp thấp. Trên x64, bạn có nhiều khả năng nhận được một khu vực rộng lớn, bởi vì hầu hết các nền tảng x64 đều có IOMMU.

Nhiều thiết bị tôi xử lý có các công cụ DMA cho phép tôi chỉ định thời lượng truyền hợp lý là vài megabyte. Thông thường việc thực hiện DMA trong điểm cuối PCIe chịu trách nhiệm khởi động một giao dịch PCIe mới tại mỗi ranh giới 4kB và lập trình viên có thể bỏ qua ràng buộc đó. Nếu tài nguyên trong FPGA quá hạn chế để xử lý điều đó, bạn có thể xem xét viết mã trình điều khiển để chuyển đổi danh sách các khối bộ nhớ Linux thành danh sách các giao dịch PCIe (dài hơn).

+0

Cảm ơn rất nhiều. Bộ đệm người dùng là ok, nhưng lõi FPGA PCIE không xử lý bộ đệm dài. – soh

Các vấn đề liên quan