ইন্টেল-লোগো

intel OPAE FPGA লিনাক্স ডিভাইস ড্রাইভার আর্কিটেকচার

intel-OPAE-FPGA-লিনাক্স-ডিভাইস-ড্রাইভার-আর্কিটেকচার-পণ্য

OPAE Intel FPGA Linux ডিভাইস ড্রাইভার আর্কিটেকচার

OPAE Intel FPGA ড্রাইভার ব্যবহারকারী-স্পেস অ্যাপ্লিকেশনের জন্য ইন্টারফেস প্রদান করে যাতে Intel FPGA সলিউশনের সাথে সজ্জিত প্ল্যাটফর্মে FPGA অ্যাক্সিলারেটর কনফিগার করা, গণনা করা, খোলা এবং অ্যাক্সেস করা যায় এবং FPGA পুনর্বিন্যাস, পাওয়ার ম্যানেজমেন্ট এবং ভার্চুয়ালাইজেশনের মতো সিস্টেম-লেভেল ম্যানেজমেন্ট ফাংশন সক্ষম করে।

হার্ডওয়্যার আর্কিটেকচার

OS এর বিন্দু থেকে view, FPGA হার্ডওয়্যার একটি নিয়মিত PCIe ডিভাইস হিসাবে উপস্থিত হয়। FPGA ডিভাইস মেমরি একটি পূর্বনির্ধারিত ডেটা স্ট্রাকচার (ডিভাইস বৈশিষ্ট্য তালিকা) ব্যবহার করে সংগঠিত হয়। FPGA ডিভাইস দ্বারা সমর্থিত বৈশিষ্ট্যগুলি এই ডেটা স্ট্রাকচারের মাধ্যমে উন্মুক্ত করা হয়, যেমনটি নীচের চিত্রে দেখানো হয়েছে:

FPGA PCIe ডিভাইস

intel-OPAE-FPGA-লিনাক্স-ডিভাইস-ড্রাইভার-আর্কিটেকচার-চিত্র- (1)

ভার্চুয়াল ফাংশন (VFs) তৈরি করতে ড্রাইভার PCIe SR-IOV সমর্থন করে যা ভার্চুয়াল মেশিনে পৃথক এক্সিলারেটর বরাদ্দ করতে ব্যবহার করা যেতে পারে।

ইন্টেল কর্পোরেশন। সমস্ত অধিকার সংরক্ষিত. ইন্টেল, ইন্টেল লোগো এবং অন্যান্য ইন্টেল চিহ্নগুলি হল ইন্টেল কর্পোরেশন বা এর সহযোগী সংস্থাগুলির ট্রেডমার্ক৷ ইন্টেল তার এফপিজিএ এবং সেমিকন্ডাক্টর পণ্যগুলির কার্যকারিতাকে ইন্টেলের স্ট্যান্ডার্ড ওয়ারেন্টি অনুসারে বর্তমান স্পেসিফিকেশনের জন্য ওয়ারেন্টি দেয় তবে নোটিশ ছাড়াই যে কোনও সময় যে কোনও পণ্য এবং পরিষেবাতে পরিবর্তন করার অধিকার সংরক্ষণ করে৷ ইন্টেল লিখিতভাবে স্পষ্টভাবে সম্মত হওয়া ছাড়া এখানে বর্ণিত কোনো তথ্য, পণ্য বা পরিষেবার আবেদন বা ব্যবহারের ফলে উদ্ভূত কোনো দায়িত্ব বা দায়ভার গ্রহণ করে না। Intel গ্রাহকদের কোনো প্রকাশিত তথ্যের উপর নির্ভর করার আগে এবং পণ্য বা পরিষেবার জন্য অর্ডার দেওয়ার আগে ডিভাইসের স্পেসিফিকেশনের সর্বশেষ সংস্করণ পেতে পরামর্শ দেওয়া হয়।

অন্যান্য নাম এবং ব্র্যান্ডগুলি অন্যের সম্পত্তি হিসাবে দাবি করা যেতে পারে।

ভার্চুয়ালাইজড FPGA PCIe ডিভাইস

intel-OPAE-FPGA-লিনাক্স-ডিভাইস-ড্রাইভার-আর্কিটেকচার-চিত্র- (2)

FPGA ম্যানেজমেন্ট ইঞ্জিন (FME)
এফপিজিএ ম্যানেজমেন্ট ইঞ্জিন শক্তি এবং তাপ ব্যবস্থাপনা, ত্রুটি প্রতিবেদন, পুনর্বিন্যাস, কর্মক্ষমতা প্রতিবেদন এবং অন্যান্য অবকাঠামো কার্য সম্পাদন করে। প্রতিটি এফপিজিএ একটি এফএমই আছে, যা সর্বদা শারীরিক ফাংশন (পিএফ) এর মাধ্যমে অ্যাক্সেস করা হয়। ইউজার-স্পেস অ্যাপ্লিকেশানগুলি open() ব্যবহার করে FME-এ একচেটিয়া অ্যাক্সেস অর্জন করতে পারে এবং এটিকে একটি বিশেষ সুবিধাপ্রাপ্ত ব্যবহারকারী (রুট) হিসাবে close() ব্যবহার করে ছেড়ে দিতে পারে।

বন্দর
একটি পোর্ট স্ট্যাটিক FPGA ফ্যাব্রিক ("FPGA ইন্টারফেস ম্যানেজার (FIM)") এবং একটি অ্যাক্সিলারেটর ফাংশন (AF) ধারণকারী একটি আংশিকভাবে পুনর্বিন্যাসযোগ্য অঞ্চলের মধ্যে ইন্টারফেস উপস্থাপন করে। পোর্ট সফ্টওয়্যার থেকে এক্সিলারেটরে যোগাযোগ নিয়ন্ত্রণ করে এবং রিসেট এবং ডিবাগের মতো বৈশিষ্ট্যগুলি প্রকাশ করে। একটি PCIe ডিভাইসে একাধিক পোর্ট থাকতে পারে এবং FME ডিভাইসে FPGA_FME_PORT_ASSIGN ioctl ব্যবহার করে প্রতিটি পোর্ট একটি VF এর মাধ্যমে প্রকাশ করা যেতে পারে।

এক্সিলারেটর ফাংশন (AF) ইউনিট

  • একটি এক্সিলারেটর ফাংশন (AF) ইউনিট একটি বন্দরের সাথে সংযুক্ত থাকে এবং এক্সেলারেটর-নির্দিষ্ট নিয়ন্ত্রণ রেজিস্টারের জন্য ব্যবহার করার জন্য একটি 256K MMIO অঞ্চল প্রকাশ করে।
  • ইউজার-স্পেস অ্যাপ্লিকেশনগুলি পোর্ট ডিভাইসে open() ব্যবহার করে একটি পোর্টের সাথে সংযুক্ত একটি AFU-তে একচেটিয়া অ্যাক্সেস অর্জন করতে পারে এবং close() ব্যবহার করে এটি ছেড়ে দিতে পারে।
  • ইউজার-স্পেস অ্যাপ্লিকেশনগুলি mmap() অ্যাক্সিলারেটর MMIO অঞ্চলগুলিও করতে পারে।

আংশিক পুনর্বিন্যাস
উপরে উল্লিখিত হিসাবে, এক্সিলারেটরগুলি একটি অ্যাক্সিলারেটর ফাংশন (AF) এর আংশিক পুনর্বিন্যাসের মাধ্যমে পুনরায় কনফিগার করা যেতে পারে। file. অ্যাক্সিলারেটর ফাংশন (AF) অবশ্যই FPGA-এর সঠিক FIM এবং টার্গেটেড স্ট্যাটিক অঞ্চলের (পোর্ট) জন্য তৈরি করা হয়েছে; অন্যথায়, পুনরায় কনফিগারেশন অপারেশন ব্যর্থ হবে এবং সম্ভবত সিস্টেম অস্থিরতা সৃষ্টি করবে। এই সামঞ্জস্যতা AF হেডারে উল্লেখ করা ইন্টারফেস আইডির সাথে sysfs-এর মাধ্যমে FME দ্বারা প্রকাশিত ইন্টারফেস আইডির সাথে তুলনা করে পরীক্ষা করা যেতে পারে। IOCTL পুনরায় কনফিগারেশন কল করার আগে এই চেকটি সাধারণত ইউজার স্পেস দ্বারা করা হয়।

দ্রষ্টব্য:
বর্তমানে, ভার্চুয়ালাইজড হোস্টে চলমান সফ্টওয়্যারগুলি সহ FPGA-তে অ্যাক্সেস করা যেকোন সফ্টওয়্যার প্রোগ্রাম আংশিক পুনর্বিন্যাস করার চেষ্টা করার আগে অবশ্যই বন্ধ করতে হবে। পদক্ষেপগুলি হবে:

  1. গেস্ট থেকে ড্রাইভার আনলোড
  2. গেস্ট থেকে VF আনপ্লাগ করুন
  3. SR-IOV নিষ্ক্রিয় করুন
  4. আংশিক পুনর্বিন্যাস সঞ্চালন
  5. SR-IOV সক্ষম করুন৷
  6. অতিথিকে VF প্লাগ করুন
  7. গেস্ট মধ্যে ড্রাইভার লোড

FPGA ভার্চুয়ালাইজেশন
একটি VM-এ চলমান অ্যাপ্লিকেশনগুলি থেকে একটি অ্যাক্সিলারেটর অ্যাক্সেস সক্ষম করতে, নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করে সংশ্লিষ্ট AFU-এর পোর্টকে একটি VF-এ বরাদ্দ করতে হবে:

  1. PF ডিফল্টরূপে সমস্ত AFU পোর্টের মালিক। যেকোন পোর্ট যেটিকে VF-এ পুনরায় নিয়োগ করতে হবে তা প্রথমে FME ডিভাইসে FPGA_FME_PORT_RELEASE ioctl এর মাধ্যমে PF থেকে মুক্তি দিতে হবে।
  2. একবার N পোর্টগুলি PF থেকে মুক্তি পেলে, নীচের কমান্ডটি SRIOV এবং VF সক্রিয় করতে ব্যবহার করা যেতে পারে। প্রতিটি VF AFU-এর সাথে শুধুমাত্র একটি পোর্টের মালিক। echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. VFs এর মধ্য দিয়ে VM-তে যান।
  4. VF-এর অধীনে AFU VM-এর অ্যাপ্লিকেশন থেকে অ্যাক্সেসযোগ্য (VF-এর ভিতরে একই ড্রাইভার ব্যবহার করে)।

দ্রষ্টব্য:
একটি এফএমই একটি ভিএফকে বরাদ্দ করা যায় না, এইভাবে পিআর এবং অন্যান্য ব্যবস্থাপনা ফাংশন শুধুমাত্র পিএফ-এর মাধ্যমে উপলব্ধ।

চালক সংস্থা

PCIe মডিউল ডিভাইস ড্রাইভার

চালক সংস্থা

intel-OPAE-FPGA-লিনাক্স-ডিভাইস-ড্রাইভার-আর্কিটেকচার-চিত্র- (3)

FPGA ডিভাইসগুলি নিয়মিত PCIe ডিভাইস হিসাবে উপস্থিত হয়; এইভাবে, FPGA PCIe ডিভাইস ড্রাইভার (intel-FPGA-PCI.ko) একটি FPGA PCIe PF বা VF সনাক্ত করা হলে সর্বদা প্রথমে লোড করা হয়। এই ড্রাইভারটি ড্রাইভার আর্কিটেকচারে একটি অবকাঠামোগত ভূমিকা পালন করে। এটা:

  • বৈশিষ্ট্য ডিভাইসগুলির একটি অভিভাবক হিসাবে একটি FPGA কন্টেইনার ডিভাইস তৈরি করে৷
  • ডিভাইস বৈশিষ্ট্য তালিকার মধ্য দিয়ে চলে, যা PCIe ডিভাইস বার মেমরিতে প্রয়োগ করা হয়, বৈশিষ্ট্য ডিভাইস এবং তাদের উপ-বৈশিষ্ট্যগুলি আবিষ্কার করতে এবং কন্টেইনার ডিভাইসের অধীনে তাদের জন্য প্ল্যাটফর্ম ডিভাইস তৈরি করতে।
  • SR-IOV সমর্থন করে।
  • বৈশিষ্ট্য ডিভাইস পরিকাঠামো প্রবর্তন করে, যা উপ-বৈশিষ্ট্যগুলির জন্য ক্রিয়াকলাপগুলিকে বিমূর্ত করে এবং বৈশিষ্ট্য ডিভাইস ড্রাইভারগুলিতে সাধারণ ফাংশনগুলিকে প্রকাশ করে৷

PCIe মডিউল ডিভাইস ড্রাইভার ফাংশন

  • PCIe আবিষ্কার, ডিভাইস গণনা এবং বৈশিষ্ট্য আবিষ্কার রয়েছে।
  • মূল ডিভাইস, FPGA ম্যানেজমেন্ট ইঞ্জিন (FME), এবং পোর্টের জন্য sysfs ডিরেক্টরি তৈরি করে।
  • প্ল্যাটফর্ম ড্রাইভারের উদাহরণ তৈরি করে, যার ফলে লিনাক্স কার্নেল তাদের নিজ নিজ প্ল্যাটফর্ম মডিউল ড্রাইভার লোড করে।

FME প্ল্যাটফর্ম মডিউল ডিভাইস ড্রাইভার

  • শক্তি এবং তাপ ব্যবস্থাপনা, ত্রুটি রিপোর্টিং, কর্মক্ষমতা রিপোর্টিং, এবং অন্যান্য অবকাঠামো ফাংশন. আপনি FME ড্রাইভার দ্বারা উন্মুক্ত sysfs ইন্টারফেসের মাধ্যমে এই ফাংশনগুলি অ্যাক্সেস করতে পারেন।
  • আংশিক পুনর্বিন্যাস। PR সাব-ফিচার ইনিশিয়ালাইজেশনের সময় FME ড্রাইভার একজন FPGA ম্যানেজার নিবন্ধন করে; একবার এটি আপনার কাছ থেকে একটি FPGA_FME_PORT_PR ioctl গ্রহণ করলে, এটি প্রদত্ত পোর্টে বিটস্ট্রিমের আংশিক পুনর্বিন্যাস সম্পূর্ণ করার জন্য FPGA ম্যানেজার থেকে সাধারণ ইন্টারফেস ফাংশনকে আহ্বান করে।
  • ভার্চুয়ালাইজেশনের জন্য পোর্ট ম্যানেজমেন্ট। FME ড্রাইভার দুটি ioctls, FPGA_FME_PORT_RELEASE প্রবর্তন করে, যেটি PF থেকে প্রদত্ত পোর্টকে ছেড়ে দেয়; এবং FPGA_FME_PORT_ASSIGN, যা PF-এ পোর্ট ফিরিয়ে দেয়। একবার PF থেকে পোর্ট রিলিজ হয়ে গেলে, PCIe ড্রাইভার দ্বারা প্রদত্ত SR-IOV ইন্টারফেসের মাধ্যমে এটি VF-এ বরাদ্দ করা যেতে পারে। আরও তথ্যের জন্য, "FPGA ভার্চুয়ালাইজেশন" পড়ুন।

FME প্ল্যাটফর্ম মডিউল ডিভাইস ড্রাইভার ফাংশন

  • FME অক্ষর ডিভাইস নোড তৈরি করে।
  • FME sysfs তৈরি করে files এবং FME sysfs প্রয়োগ করে file অ্যাক্সেসর
  • FME প্রাইভেট ফিচার সাব-ড্রাইভার প্রয়োগ করে।
  • FME প্রাইভেট ফিচার সাব-ড্রাইভার:
    • FME হেডার
    • তাপ ব্যবস্থাপনা
    • পাওয়ার ম্যানেজমেন্ট
    • বিশ্বব্যাপী ত্রুটি
    • আংশিক পুনর্বিন্যাস
    • গ্লোবাল পারফরম্যান্স

পোর্ট প্ল্যাটফর্ম মডিউল ডিভাইস ড্রাইভার
FME ড্রাইভারের মতো, FPGA পোর্ট (এবং AFU) ড্রাইভার (intel-fpga-afu. ko) একবার পোর্ট প্ল্যাটফর্ম ডিভাইস তৈরি হয়ে গেলে অনুসন্ধান করা হয়। এই মডিউলটির প্রধান কাজ হল পোর্টে মৌলিক রিসেট নিয়ন্ত্রণ, AFU MMIO অঞ্চল রপ্তানি, DMA বাফার ম্যাপিং পরিষেবা, UMsg(1) বিজ্ঞপ্তি, এবং দূরবর্তী ডিবাগ ফাংশন সহ পৃথক এক্সেলারেটর অ্যাক্সেস করার জন্য ব্যবহারকারী-স্পেস অ্যাপ্লিকেশনগুলির জন্য একটি ইন্টারফেস প্রদান করা। উপরে দেখুন).

UMsg শুধুমাত্র ইন্টিগ্রেটেড FPGA সহ Intel Xeon® প্রসেসরের জন্য Acceleration Stack এর মাধ্যমে সমর্থিত।

পোর্ট প্ল্যাটফর্ম মডিউল ডিভাইস ড্রাইভার ফাংশন

  • পোর্ট ক্যারেক্টার ডিভাইস নোড তৈরি করে।
  • পোর্ট sysfs তৈরি করে files এবং পোর্ট sysfs প্রয়োগ করে file অ্যাক্সেসর
  • পোর্ট প্রাইভেট ফিচার সাব-ড্রাইভার বাস্তবায়ন করে।
  • পোর্ট প্রাইভেট ফিচার সাব-ড্রাইভার:
    • পোর্ট হেডার
    • এএফইউ
    • পোর্ট ত্রুটি
    • UMsg(2)
    • সিগন্যাল ট্যাপ

অ্যাপ্লিকেশন FPGA ডিভাইস গণনা
এই বিভাগে /sys/class/fpga-এর অধীনে sysfs অনুক্রম থেকে কীভাবে অ্যাপ্লিকেশনগুলি FPGA ডিভাইস গণনা করে তা উপস্থাপন করে। প্রাক্তন মধ্যেampনীচে, দুটি Intel FPGA ডিভাইস হোস্টে ইনস্টল করা আছে। প্রতিটি FPGA ডিভাইসে একটি FME এবং দুটি পোর্ট (AFUs) থাকে। প্রতিটি FPGA ডিভাইসের জন্য, /sys/class/fpga এর অধীনে একটি ডিভাইস ডিরেক্টরি তৈরি করা হয়:

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

প্রতিটি নোডে একটি FME এবং দুটি পোর্ট (AFUs) আছে চাইল্ড ডিভাইস হিসেবে:
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-fme.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.2
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.3

সাধারণভাবে, FME/Port sysfs ইন্টারফেসের নাম নিম্নরূপ:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

আমি ধারাবাহিকভাবে সমস্ত কন্টেইনার ডিভাইসগুলিকে নম্বর দিয়েছি, j পরপর FME-এর নম্বর দিয়েছি এবং k ধারাবাহিকভাবে সমস্ত পোর্টকে নম্বর দিয়েছি।

ioctl() এবং mmap() এর জন্য ব্যবহৃত ডিভাইস নোডগুলি এর মাধ্যমে উল্লেখ করা যেতে পারে:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe ড্রাইভার গণনা
এই বিভাগটি একটি ওভার দেয়view intel-fpga-pci.ko দ্বারা সঞ্চালিত ডিভাইস গণনার জন্য কোড প্রবাহ। প্রধান তথ্য কাঠামো এবং ফাংশন হাইলাইট করা হয়. এই বিভাগটি সর্বোত্তমভাবে অনুসরণ করা হয় যখন viewসহগামী সোর্স কোড (pcie.c) ব্যবহার করুন।

গণনা ডেটা স্ট্রাকচার

enum fpga_id_type {
অভিভাবক আইডি,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
স্ট্যাটিক কাঠামো idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *নাম;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .নাম = FPGA_FEATURE_DEV_FME },
{ .নাম = FPGA_FEATURE_DEV_PORT },
};
স্ট্যাটিক স্ট্রাকট ক্লাস *fpga_class;
স্ট্যাটিক struct pci_device_id cci_pcie_id_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_DCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_DCP),},
{0,}
};
স্ট্যাটিক struct pci_driver cci_pci_driver = {
নাম = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int device_id;
struct ডিভাইস *fme_dev;
struct mutex লক;
struct list_head port_dev_list;
int release_port_num;
struct list_head অঞ্চল;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
struct ডিভাইস *parent_dev;
struct platform_device *feature_dev;
};

গণনা প্রবাহ

  • ccidrv_init()
    • idr_init() ব্যবহার করে fpga_ids আরম্ভ করুন।
    • alloc_chrdev_region() ব্যবহার করে fpga_chrdevs[i].devt শুরু করুন।
    • class_create() ব্যবহার করে fpga_class শুরু করুন।
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • PCI ডিভাইস সক্ষম করুন, এর অঞ্চলগুলিতে অ্যাক্সেসের অনুরোধ করুন, PCI মাস্টার মোড সেট করুন এবং DMA কনফিগার করুন।
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • একটি struct build_feature_devs_info বরাদ্দ করুন, এটি শুরু করুন।
      .parent_dev একটি প্যারেন্ট sysfs ডিরেক্টরিতে (intel-fpga-dev.id) সেট করা হয়েছে যেখানে FME এবং Port sysfs ডিরেক্টরি রয়েছে।
  • পার্স_ফিচার_তালিকা()
    • FME, পোর্ট এবং তাদের ব্যক্তিগত বৈশিষ্ট্যগুলি আবিষ্কার করতে BAR0 ডিভাইস বৈশিষ্ট্যের তালিকায় যান৷
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • যখন একটি FME সম্মুখীন হয়:
  • build_info_create_dev()
    • FME-এর জন্য একটি প্ল্যাটফর্ম ডিভাইস বরাদ্দ করুন, build_feature_devs_info.feature_dev-এ সঞ্চয় করুন।
    • feature_dev.id idr_alloc(fpga_ids[FME_ID]-এর ফলাফলে আরম্ভ করা হয়েছে,
    • feature_dev.parent-এ সেট করা হয়েছে build_feature_devs_info.parent_dev।
    • feature_dev.resource-এ struct সম্পদের একটি অ্যারে বরাদ্দ করুন।
  • একটি struct বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা বরাদ্দ করুন, এটি শুরু করুন এবং বৈশিষ্ট্য_dev.dev.platform_data এ একটি পয়েন্টার সংরক্ষণ করুন
    • create_feature_instance() build_info_add_sub_feature()
    • শুরু করুন feature_dev.resource[FME_FEATURE_ID_HEADER]।
    • বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা_অ্যাড()
    • ফিচার_প্ল্যাটফর্ম_ডেটা শুরু করুন।
  • parse_feature() parse_feature_afus() parse_feature_port()
    • যখন একটি পোর্ট সম্মুখীন হয়:
  • build_info_create_dev()
    • পোর্টের জন্য একটি প্ল্যাটফর্ম ডিভাইস বরাদ্দ করুন, build_feature_devs_info.feature_dev-এ সঞ্চয় করুন।
    • feature_dev.id idr_alloc(fpga_ids[PORT_ID] এর ফলাফলে আরম্ভ করা হয়েছে,
    • feature_dev.parent-এ সেট করা হয়েছে build_feature_devs_info.parent_dev।
    • feature_dev.resource-এ struct রিসোর্সের একটি অ্যারে বরাদ্দ করুন।
    • একটি struct বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা বরাদ্দ করুন, এটি শুরু করুন এবং বৈশিষ্ট্য_dev.dev.platform_data এ একটি পয়েন্টার সংরক্ষণ করুন
  • build_info_commit_dev()
    • struct cci_drvdata.port_dev_list-এ পোর্টের তালিকায় পোর্টের জন্য struct feature_platform_data.node যোগ করুন
  • create_feature_instance() build_info_add_sub_feature()
    • শুরু করুন feature_dev.resource[PORT_FEATURE_ID_HEADER]।
  • বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা_অ্যাড()
    • ফিচার_প্ল্যাটফর্ম_ডাটা.ফিচার[PORT_FEATURE_ID_HEADER] শুরু করুন, .fops ছাড়া সবকিছু।
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • যখন একটি AFU সম্মুখীন হয়:
  • create_feature_instance() build_info_add_sub_feature()
    • শুরু করুন feature_dev.resource[PORT_FEATURE_ID_UAFU]।
  • বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা_অ্যাড()
    • ফিচার_প্ল্যাটফর্ম_ডেটা শুরু করুন।
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • যখন একটি FME ব্যক্তিগত বৈশিষ্ট্য সম্মুখীন হয়:
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[id] শুরু করুন।
  • বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা_অ্যাড()
    • ফিচার_প্ল্যাটফর্ম_ডেটা শুরু করুন।
  • পার্স_ফিচার() পার্স_ফিচার_প্রাইভেট() পার্স_ফিচার_পোর্ট_প্রাইভেট()
  • যখন একটি পোর্ট ব্যক্তিগত বৈশিষ্ট্য সম্মুখীন হয়: * create_feature_instance() build_info_add_sub_feature() * initialize feature_dev.resource[id]। * ফিচার_প্ল্যাটফর্ম_ডেটা_অ্যাড() ফিচার_প্ল্যাটফর্ম_ডাটা.ফিচার[আইডি] শুরু করুন, .ফপস ছাড়া সবকিছু।
  • parse_ports_from_fme()
    • ড্রাইভার যদি ফিজিক্যাল ফাংশন (PF) এ লোড করা হয়, তাহলে:
  • FME হেডারে বর্ণিত প্রতিটি পোর্টে parse_feature_list() ফ্লো চালান।
  • হেডারে প্রতিটি পোর্ট এন্ট্রিতে উল্লেখিত বার ব্যবহার করুন।

FME প্ল্যাটফর্ম ডিভাইস সূচনা
এই বিভাগটি একটি ওভার দেয়view intel-fpga-fme.ko দ্বারা সঞ্চালিত FME ডিভাইস আরম্ভের জন্য কোড প্রবাহ। প্রধান তথ্য কাঠামো এবং ফাংশন হাইলাইট করা হয়. এই বিভাগটি সর্বোত্তমভাবে অনুসরণ করা হয় যখন viewসহগামী সোর্স কোড (fme-main.c) ব্যবহার করুন।

FME প্ল্যাটফর্ম ডিভাইস ডেটা স্ট্রাকচার

গঠন বৈশিষ্ট্য_অপস {
int (*init)(struct platform_device *pdev, struct বৈশিষ্ট্য *বৈশিষ্ট্য);
int (*uinit)(struct platform_device *pdev, struct বৈশিষ্ট্য * বৈশিষ্ট্য);
দীর্ঘ (*ioctl)(struct platform_device *pdev, struct বৈশিষ্ট্য *বৈশিষ্ট্য,
স্বাক্ষরবিহীন int cmd, স্বাক্ষরবিহীন দীর্ঘ arg);
int (*test)(struct platform_device *pdev, struct বৈশিষ্ট্য *বৈশিষ্ট্য);
};
গঠন বৈশিষ্ট্য {
const char *নাম;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
গঠন বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা {
struct list_head নোড;
struct mutex লক;
স্বাক্ষরবিহীন দীর্ঘ dev_status;
struct cdev cdev;
struct platform_device *dev;
স্বাক্ষরবিহীন int disable_count;
অকার্যকর * ব্যক্তিগত;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device*,
void *, int (*match)(struct platform_device *, void *)); গঠন
বৈশিষ্ট্য বৈশিষ্ট্য [0];
};
struct perf_object {
আইটি আইডি;
const struct attribute_group **attr_groups;
struct ডিভাইস *fme_dev;
struct list_head নোড;
struct list_head Children;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct ডিভাইস *dev_err;
struct perf_object *perf_dev;
struct বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা *পিডেটা;
};

FME প্ল্যাটফর্ম ডিভাইস ইনিশিয়ালাইজেশন ফ্লো

FME ইনিশিয়ালাইজেশন ফ্লোintel-OPAE-FPGA-লিনাক্স-ডিভাইস-ড্রাইভার-আর্কিটেকচার-চিত্র- (4)

  • fme_probe() fme_dev_init()
    • একটি struct fpga_fme শুরু করুন এবং এটিকে feature_platform_data.private ক্ষেত্রে সংরক্ষণ করুন।
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • প্রতিটি জনবহুল বৈশিষ্ট্যের জন্য feature_platform_data.features-এ একটি struct feature_ops সংরক্ষণ করুন।
    • struct থেকে পরীক্ষার ফাংশন, যদি থাকে, কল করুন।
    • struct থেকে init ফাংশন কল করুন।
  • fme_probe() fpga_register_dev_ops()
    • FME অক্ষর ডিভাইস নোড তৈরি করুন, একটি কাঠামো নিবন্ধন করুন file_অপারেশন।

পোর্ট প্ল্যাটফর্ম ডিভাইস সূচনা
এই বিভাগটি একটি ওভার দেয়view intel-fpga-afu.ko দ্বারা সম্পাদিত পোর্ট ডিভাইস আরম্ভের জন্য কোড প্রবাহ। প্রধান তথ্য কাঠামো এবং ফাংশন হাইলাইট করা হয়. এই বিভাগটি সর্বোত্তমভাবে অনুসরণ করা হয় যখন viewসহগামী সোর্স কোড (afu.c) ব্যবহার করুন।

পোর্ট প্ল্যাটফর্ম ডিভাইস ডেটা স্ট্রাকচার

গঠন বৈশিষ্ট্য_অপস {
int (*init)(struct platform_device *pdev, struct বৈশিষ্ট্য *বৈশিষ্ট্য);
int (*uinit)(struct platform_device *pdev, struct বৈশিষ্ট্য * বৈশিষ্ট্য);
দীর্ঘ (*ioctl)(struct platform_device *pdev, struct বৈশিষ্ট্য *বৈশিষ্ট্য,
স্বাক্ষরবিহীন int cmd, স্বাক্ষরবিহীন দীর্ঘ arg);
int (*test)(struct platform_device *pdev, struct বৈশিষ্ট্য *বৈশিষ্ট্য);
};
গঠন বৈশিষ্ট্য {
const char *নাম;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
গঠন বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা {
struct list_head নোড;
struct mutex লক;
স্বাক্ষরবিহীন দীর্ঘ dev_status;
struct cdev cdev;
struct platform_device *dev;
স্বাক্ষরবিহীন int disable_count;
অকার্যকর * ব্যক্তিগত;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device*,
void *, int (*match)(struct platform_device *, void *));
গঠন বৈশিষ্ট্য বৈশিষ্ট্য [0];
};
struct fpga_afu_region {
u32 সূচক;
u32 পতাকা;
u64 আকার;
u64 অফসেট;
u64 ফিজ;
struct list_head নোড;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 দৈর্ঘ্য;
u64 iova;
struct পৃষ্ঠা **পৃষ্ঠা;
struct rb_node নোড;
bool in_use;
};
struct fpga_afu {
u64 অঞ্চল_কার_অফসেট;
int num_regions;
u8 num_umsgs;
struct list_head অঞ্চল;
struct rb_root dma_regions;
struct বৈশিষ্ট্য_প্ল্যাটফর্ম_ডেটা *পিডেটা;
};

পোর্ট প্ল্যাটফর্ম ডিভাইস ইনিশিয়ালাইজেশন ফ্লো

পোর্ট ইনিশিয়ালাইজেশন ফ্লোintel-OPAE-FPGA-লিনাক্স-ডিভাইস-ড্রাইভার-আর্কিটেকচার-চিত্র- (5)

  • afu_probe() afu_dev_init()
    • একটি struct fpga_afu শুরু করুন এবং এটিকে feature_platform_data.private ক্ষেত্রে সংরক্ষণ করুন।
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • প্রতিটি জনবহুল বৈশিষ্ট্যের জন্য feature_platform_data.features-এ একটি struct feature_ops সংরক্ষণ করুন।
    • struct থেকে পরীক্ষার ফাংশন, যদি থাকে, কল করুন।
    • struct থেকে init ফাংশন কল করুন।
  • afu_probe() fpga_register_dev_ops()
    • পোর্ট অক্ষর ডিভাইস নোড তৈরি করুন, একটি কাঠামো নিবন্ধন করুন file_অপারেশন।

FME IOCTLs
IOCTL যেগুলোকে ওপেন বলা হয় file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION-এর জন্য বর্ণনাকারী— 0 থেকে শুরু করে বর্তমান সংস্করণটিকে পূর্ণসংখ্যা হিসাবে ফিরিয়ে দিন।

FPGA_CHECK_EXTENSION—বর্তমানে সমর্থিত নয়।

FPGA_FME_PORT_RELEASE—আর্গ হল একটি নির্দেশক:

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 পতাকা; // ইন: 0 হতে হবে
__u32 পোর্ট_আইডি; // ইন: পোর্ট আইডি (0 থেকে) প্রকাশ করতে।
};

FPGA_FME_PORT_ASSIGN—আর্গ হল একটি নির্দেশক:

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 পতাকা; // ইন: 0 হতে হবে
__u32 পোর্ট_আইডি; // ইন: পোর্ট আইডি (0 থেকে) বরাদ্দ করতে। (হয়েছে
পূর্বে FPGA_FME_PORT_RELEASE দ্বারা প্রকাশিত)
};

FPGA_FME_PORT_PR—আর্গ হল একটি নির্দেশক:

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 পতাকা; // ইন: 0 হতে হবে
__u32 পোর্ট_আইডি; // ইন: পোর্ট আইডি (0 থেকে)
__u32 বাফার_সাইজ; // ইন: বাইটে বিটস্ট্রিম বাফারের আকার। 4-বাইট হতে হবে
সারিবদ্ধ
__u64 বাফার_ঠিকানা; // ইন: বিটস্ট্রিম বাফারের প্রসেস অ্যাড্রেস
__u64 অবস্থা; // আউট: ত্রুটি অবস্থা (বিটমাস্ক)
};

পোর্ট IOCTLs
IOCTL যেগুলোকে ওপেন বলা হয় file /dev/intel-fpga-port.k FPGA_GET_API_VERSION-এর জন্য বর্ণনাকারী—বর্তমান সংস্করণটিকে পূর্ণসংখ্যা হিসাবে ফিরিয়ে দিন, 0 থেকে শুরু হচ্ছে। FPGA_CHECK_EXTENSION—বর্তমানে সমর্থিত নয়।

FPGA_PORT_GET_INFO—আর্গ হল একটি নির্দেশক:

struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 পতাকা; // আউট: রিটার্ন 0
__u32 সংখ্যা_অঞ্চল; // আউট: MMIO অঞ্চলের সংখ্যা, 2 (1 AFU এর জন্য এবং 1 এর জন্য
STP)
__u32 num_umsgs; // আউট: হার্ডওয়্যার দ্বারা সমর্থিত UMsg এর সংখ্যা
};

FPGA_PORT_GET_REGION_INFO—আর্গ হল একটি নির্দেশক:

struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 পতাকা; // আউট: (বিটমাস্ক) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 সূচক; // ইন: FPGA_PORT_INDEX_UAFU বা FPGA_PORT_INDEX_STP
__u32 প্যাডিং; // ইন: 0 হতে হবে
__u64 আকার; // আউট: বাইটে MMIO অঞ্চলের আকার
__u64 অফসেট; // আউট: ডিভাইস fd শুরু থেকে MMIO অঞ্চলের অফসেট
};

FPGA_PORT_DMA_MAP—আর্গ হল একটি নির্দেশক:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 পতাকা; // in: 0 __u64 user_addr হতে হবে; // ইন: প্রক্রিয়া ভার্চুয়াল
ঠিকানা পৃষ্ঠা সারিবদ্ধ হতে হবে।
__u64 দৈর্ঘ্য; // ইন: বাইটে ম্যাপিংয়ের দৈর্ঘ্য। পৃষ্ঠার একাধিক হতে হবে
আকার
__u64 iova; // আউট: IO ভার্চুয়াল ঠিকানা };

FPGA_PORT_DMA_UNMAP—আর্গ হল একটি নির্দেশক:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 পতাকা; // ইন: 0 হতে হবে
__u64 iova; // in: IO ভার্চুয়াল ঠিকানা পূর্ববর্তী দ্বারা ফিরে এসেছে
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—আর্গ অবশ্যই শূন্য হতে হবে।
  • FPGA_PORT_UMSG_ENABLE—আর্গ অবশ্যই শূন্য হতে হবে।
  • FPGA_PORT_UMSG_DISABLE—আর্গ অবশ্যই শূন্য হতে হবে।

FPGA_PORT_UMSG_SET_MODE—আর্গ হল একটি নির্দেশক:

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 পতাকা; // ইন: 0 হতে হবে
__u32 hint_bitmap; // in: UMsg ইঙ্গিত মোড বিটম্যাপ। UMsg কোনটি তা বোঝায়
সক্রিয়
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • এই ioctl ইস্যু করার আগে UMsg অবশ্যই নিষ্ক্রিয় করতে হবে।
  • iova ক্ষেত্রটি অবশ্যই সমস্ত UMsg এর (num_umsgs * PAGE_SIZE) জন্য যথেষ্ট বড় একটি বাফারের জন্য হতে হবে।
    • ড্রাইভারের বাফার ম্যানেজমেন্ট দ্বারা বাফারটিকে "ব্যবহারে" হিসাবে চিহ্নিত করা হয়েছে।
    • iova যদি NULL হয়, তাহলে আগের যেকোনো অঞ্চলকে "ব্যবহারে" হিসেবে চিহ্নিত করা হবে না।
  • arg হল একটি নির্দেশক:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • u32 পতাকা; // ইন: 0 হতে হবে
    • u64 iova; // in: FPGA_PORT_DMA_MAP থেকে IO ভার্চুয়াল ঠিকানা। };

দ্রষ্টব্য:

  • পোর্ট ত্রুটিগুলি সাফ করতে, আপনাকে বর্তমান ত্রুটিগুলির সঠিক বিটমাস্ক লিখতে হবে, প্রাক্তনের জন্যample, বিড়াল ত্রুটি > পরিষ্কার
  • UMsg শুধুমাত্র ইন্টিগ্রেটেড FPGA সহ Intel Xeon প্রসেসরের জন্য অ্যাক্সিলারেশন স্ট্যাকের মাধ্যমে সমর্থিত।

sysfs Files

FME হেডার sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
ports_num fme_header.capability.num_ports দশমিক int শুধুমাত্র পঠনযোগ্য
ক্যাশে_সাইজ fme_header.capability.cache_size দশমিক int শুধুমাত্র পঠনযোগ্য
সংস্করণ fme_header.capability.fabric_verid দশমিক int শুধুমাত্র পঠনযোগ্য
সকেট_আইডি fme_header.capability.socket_id দশমিক int শুধুমাত্র পঠনযোগ্য
bitstream_id fme_header.bitstream_id hex uint64_t শুধুমাত্র পঠনযোগ্য
bitstream_metadata fme_header.bitstream_md hex uint64_t শুধুমাত্র পঠনযোগ্য

এফএমই থার্মাল ম্যানেজমেন্ট সিএসএফএস files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
থ্রেশহোল্ড1 thermal.threshold.tmp_thshold1 দশমিক int ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
থ্রেশহোল্ড2 thermal.threshold.tmp_thshold2 দশমিক int ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
থ্রেশহোল্ড_ট্রিপ thermal.threshold.therm_trip_thshold দশমিক int শুধুমাত্র পঠনযোগ্য
থ্রেশহোল্ড1_এ পৌঁছেছে thermal.threshold.thshold1_status দশমিক int শুধুমাত্র পঠনযোগ্য
থ্রেশহোল্ড2_এ পৌঁছেছে thermal.threshold.thshold2_status দশমিক int শুধুমাত্র পঠনযোগ্য
থ্রেশহোল্ড1_নীতি তাপীয়. threshold.thshold_policy দশমিক int ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
তাপমাত্রা thermal.rdsensor_fm1.fpga_temp দশমিক int শুধুমাত্র পঠনযোগ্য

এফএমই পাওয়ার ম্যানেজমেন্ট সিএসএফএস files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
গ্রাস করা power.status.pwr_consumed hex uint64_t শুধুমাত্র পঠনযোগ্য
থ্রেশহোল্ড1 power.threshold.threshold1 hex uint64_t ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
থ্রেশহোল্ড2 power.threshold.threshold2 hex uint64_t ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
threshold1_status power.threshold.threshold1_status দশমিক স্বাক্ষরহীন শুধুমাত্র পঠনযোগ্য
threshold2_status power.threshold.threshold2_status দশমিক স্বাক্ষরহীন শুধুমাত্র পঠনযোগ্য
rtl power.status.fpga_latency_report দশমিক স্বাক্ষরহীন শুধুমাত্র পঠনযোগ্য

FME গ্লোবাল ত্রুটি sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
pcie0_ত্রুটি gerror.pcie0_err hex uint64_t পড়ুন-লিখুন
pcie1_ত্রুটি gerror.pcie1_err hex uint64_t পড়ুন-লিখুন
inject_error gerror.ras_error_inj hex uint64_t পড়ুন-লিখুন

intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
ত্রুটি gerror.fme_err hex uint64_t শুধুমাত্র পঠনযোগ্য
প্রথম_ত্রুটি gerror.fme_first_err.err_reg_status hex uint64_t শুধুমাত্র পঠনযোগ্য
পরবর্তী_ত্রুটি gerror.fme_next_err.err_reg_status hex uint64_t শুধুমাত্র পঠনযোগ্য
পরিষ্কার ত্রুটি সাফ করে, প্রথম_ত্রুটি, পরবর্তী_ত্রুটি বিভিন্ন uint64_t শুধুমাত্র লিখুন

দ্রষ্টব্য:
FME ত্রুটিগুলি সাফ করতে, আপনাকে অবশ্যই বর্তমান ত্রুটিগুলির সঠিক বিটমাস্ক লিখতে হবে, যেমনampবিড়াল ত্রুটি> পরিষ্কার.

FME আংশিক পুনর্বিন্যাস sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
ইন্টারফেস_আইডি pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l হেক্স 16-বাইট শুধুমাত্র পঠনযোগ্য

FME গ্লোবাল পারফরম্যান্স sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
ঘড়ি gperf.clk.afu_interf_clock hex uint64_t শুধুমাত্র পঠনযোগ্য

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGAs সহ Intel Xeon CPU-এর জন্য অ্যাক্সিলারেশন স্ট্যাকের জন্য বৈধ নয়)

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
হিমায়িত করা gperf.ch_ctl.freeze দশমিক int পড়ুন-লিখুন
পড়া_হিট gperf.CACHE_RD_HIT hex uint64_t শুধুমাত্র পঠনযোগ্য
পড়া_মিস gperf.CACHE_RD_MISS hex uint64_t শুধুমাত্র পঠনযোগ্য
লিখুন_হিট gperf.CACHE_WR_HIT hex uint64_t শুধুমাত্র পঠনযোগ্য
লিখুন_মিস gperf.CACHE_WR_MISS hex uint64_t শুধুমাত্র পঠনযোগ্য
হোল্ড_রিকোয়েস্ট gperf.CACHE_HOLD_REQ hex uint64_t শুধুমাত্র পঠনযোগ্য
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t শুধুমাত্র পঠনযোগ্য
sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t শুধুমাত্র পঠনযোগ্য
data_write_port_content gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t শুধুমাত্র পঠনযোগ্য
tag_write_port_content gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t শুধুমাত্র পঠনযোগ্য

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGAs সহ Intel Xeon CPU-এর জন্য অ্যাক্সিলারেশন স্ট্যাকের জন্য বৈধ নয়)

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
হিমায়িত করা gperf.vtd_ctl.freeze দশমিক int ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGAs সহ Intel Xeon CPU-এর জন্য অ্যাক্সিলারেশন স্ট্যাকের জন্য বৈধ নয়)

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
পড়া_লেনদেন gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t শুধুমাত্র পঠনযোগ্য
লিখুন_লেনদেন gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t শুধুমাত্র পঠনযোগ্য
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t শুধুমাত্র পঠনযোগ্য
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t শুধুমাত্র পঠনযোগ্য

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
সক্ষম gperf.fab_ctl.(সক্ষম) দশমিক int ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
হিমায়িত করা gperf.fab_ctl.freeze দশমিক int ব্যবহারকারী: শুধুমাত্র-পঠন রুট: পঠন-লেখা
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t শুধুমাত্র পঠনযোগ্য
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t শুধুমাত্র পঠনযোগ্য
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t শুধুমাত্র পঠনযোগ্য
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t শুধুমাত্র পঠনযোগ্য
upi_read gperf.FAB_UPI_RD hex uint64_t শুধুমাত্র পঠনযোগ্য
upi_write gperf.FAB_UPI_WR hex uint64_t শুধুমাত্র পঠনযোগ্য

intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t শুধুমাত্র পঠনযোগ্য
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t শুধুমাত্র পঠনযোগ্য
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t শুধুমাত্র পঠনযোগ্য
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t শুধুমাত্র পঠনযোগ্য
upi_read gperf.FAB_UPI_RD hex uint64_t শুধুমাত্র পঠনযোগ্য
upi_write gperf.FAB_UPI_WR hex uint64_t শুধুমাত্র পঠনযোগ্য

পোর্ট হেডার sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
id port_header.capability.port_number দশমিক int শুধুমাত্র পঠনযোগ্য
লিটার port_header.control.latency_tolerance দশমিক int শুধুমাত্র পঠনযোগ্য

পোর্ট AFU হেডার sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
afu_id afu_header.guid হেক্স 16-বাইট শুধুমাত্র পঠনযোগ্য

পোর্ট ত্রুটি sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio ক্ষেত্র প্রকার অ্যাক্সেস
ত্রুটি pererror.port_error hex uint64_t শুধুমাত্র পঠনযোগ্য
প্রথম_ত্রুটি pererror.port_first_error hex uint64_t শুধুমাত্র পঠনযোগ্য
first_malformed_req pererror.malreq হেক্স 16-বাইট শুধুমাত্র পঠনযোগ্য
পরিষ্কার ভুল। (সমস্ত ত্রুটি) বিভিন্ন uint64_t শুধুমাত্র লিখুন

দ্রষ্টব্য:
পোর্ট ত্রুটিগুলি সাফ করতে, আপনাকে অবশ্যই বর্তমান ত্রুটিগুলির সঠিক বিটমাস্ক লিখতে হবে, প্রাক্তনের জন্যampবিড়াল ত্রুটি> পরিষ্কার.

পুনর্বিবেচনার ইতিহাস

নথি সংস্করণ পরিবর্তন
2017.10.02 প্রাথমিক রিলিজ।

OPAE Intel FPGA Linux ডিভাইস ড্রাইভার আর্কিটেকচার গাইড

দলিল/সম্পদ

intel OPAE FPGA লিনাক্স ডিভাইস ড্রাইভার আর্কিটেকচার [পিডিএফ] ব্যবহারকারীর নির্দেশিকা
OPAE FPGA লিনাক্স ডিভাইস ড্রাইভার আর্কিটেকচার, OPAE FPGA, লিনাক্স ডিভাইস ড্রাইভার আর্কিটেকচার, ড্রাইভার আর্কিটেকচার, আর্কিটেকচার

তথ্যসূত্র

একটি মন্তব্য করুন

আপনার ইমেল ঠিকানা প্রকাশ করা হবে না. প্রয়োজনীয় ক্ষেত্রগুলি চিহ্নিত করা হয়েছে *