การสื่อสารระหว่างอินสแตนซ์ไดรเวอร์เคอร์เนล Linux สองอินสแตนซ์โดยอิงตามโหนดสองโหนดที่แยกจากกันในแผนผังอุปกรณ์

ฉันเขียนไดรเวอร์บน Linux xilinx แบบฝังไมโครเพื่อสื่อสารด้วย FPGA และรับและปฏิบัติต่อ IRQ ด้วยตัวจัดการ IRQ

แผนผังอุปกรณ์มีลักษณะเช่นนี้สำหรับสิ่งที่เราสนใจ:

stef@dell00:~$ cat /tmp/devicetree.dts | grep -A 5 FPGA
        FPGA_v1_0_2@43c00000 {
            compatible = "xlnx,FPGA-v1-0-0";
            interrupt-names = "interrupt";
            interrupt-parent = <0x4>;
            interrupts = <0x0 0x20 0x4>;
            reg = <0x43c00000 0x10000>;
            xlnx,data0-width = <0x10>;
--
        FPGA_v1_0_2@43c10000 {
            compatible = "xlnx,FPGA-v1-0-0";
            interrupt-names = "interrupt";
            interrupt-parent = <0x4>;
            interrupts = <0x0 0x21 0x4>;
            reg = <0x43c10000 0x10000>;
            xlnx,data0-width = <0x10>;

ดังนั้นฉันจึงมีสองอินสแตนซ์ของไดรเวอร์เดียวกันสำหรับการประมวลผลในการลงทะเบียน FPGA แบบขนานและ IRQ ในเวลาเดียวกัน (นั่นคือจุดประสงค์)

รหัสบนฟังก์ชันไดรเวอร์ INIT อาจมีลักษณะเช่นนี้และ/หรือมีลักษณะดังนี้:

static struct platform_driver my_driver = {
    .driver = {
        .name           = "FPGA",    
        .owner          = THIS_MODULE,
        .of_match_table = of_match_ptr(my_dt_ids),
    },
    .probe    = my_probe,
    .remove   = my_remove,
    .shutdown = my_shutdown,
};

ด้วยฟังก์ชันโพรบ:

static int my_probe(platform_device * pdev_p)
{
  u32                    baseAddr ; 
  void __iomem         * devm_ior_res_p = NULL ;
  struct resource      * resource_p     = NULL ;
  typdef_struct_mydata * my_device_datas = NULL ; 

  my_device_datas = kzalloc( sizeof(typdef_struct_mydata), GFP_ATOMIC ); 
  platform_set_drvdata( pdev_p, dev_p); 
  resource_p = platform_get_resource(pdev_p, IORESOURCE_MEM, 0);  
  devm_ior_res_p = devm_ioremap_resource(&pdev_p->dev, resource_p); 
  of_property_read_u32( pdev_p->dev.of_node, "xlnx,data0-width", &data-width ) ;
  baseAddr = (u32)devm_ior_res_p;

  // FIXME : do something else at init ....
}

และลิงค์ที่เข้ากันได้:

static const struct of_device_id my_dt_ids[] = {

    { .compatible = "xlnx,FPGA-v1-0-0", },  
    {}
};

เนื่องจากการเรียกใช้ฟังก์ชันโพรบ เราจึงสามารถทำงานกับที่อยู่ฐานและสิ่งที่เกี่ยวข้อง เช่น รีจิสเตอร์ / irq / ฯลฯ...

เนื่องจาก DTB มี 2 โหนดที่มีที่อยู่ reg ที่แตกต่างกัน 2 รายการและที่อยู่พื้นที่ MMU เราจึงเห็น 2 อินสแตนซ์ตามที่คาดไว้บน /sys FS สำหรับไดรเวอร์หนึ่งตัวที่โหลด (insmod):

root@my_target:/sys/devices/soc0/amba_pl# ls -rlt | grep FPGA

drwxr-xr-x 4 root root    0 Jan  7 15:50 43c10000.FPGA
drwxr-xr-x 4 root root    0 Jan  7 15:50 43c00000.FPGA

คำถามของฉันคือ: วิธีแยกแยะข้อมูลข้อมูลอุปกรณ์แพลตฟอร์มของอินสแตนซ์หนึ่งจากอีกอินสแตนซ์หนึ่ง

สำหรับตัวอย่างเล็กๆ น้อยๆ เพียงแค่แกล้งทำที่อยู่ฐานของอินสแตนซ์ที่ 2 จากอินสแตนซ์ที่ 1 และในทางกลับกัน

ในมุมมองทั่วไป จะสื่อสารระหว่างทั้งสองอินสแตนซ์โดยไม่ต้องไปที่ sysfs userspace API ได้อย่างไร

ฉันอ่านบทความเหล่านั้น:

แต่ยังไม่พบวิธีแก้ปัญหา


person stefff    schedule 23.01.2021    source แหล่งที่มา
comment
วิธีการสื่อสาร ... -- ก่อนอื่นให้พิจารณาว่าความสัมพันธ์เป็นแบบเพียร์ทูเพียร์ มาสเตอร์สเลฟ หรือทั้งสองอย่างอยู่ภายใต้การควบคุมของผู้ปกครอง แต่ความประทับใจแรกของฉันคือคุณอาจทำสิ่งต่างๆ ให้ยากขึ้นโดยการใช้สองอินสแตนซ์สำหรับอุปกรณ์เครื่องเดียว แทนที่จะใช้ไดรเวอร์หนึ่งตัวหรือสองไดรเวอร์ที่แตกต่างกัน คุณไม่ได้อธิบายอย่างชัดเจนถึงฟังก์ชันการทำงานที่ต้องการการจำลองแบบโดยแต่ละอินสแตนซ์ (เช่น FPGA เป็นเพียงการใช้งานจริงสำหรับอุปกรณ์สองตัวที่เหมือนกันหรือไม่) IOW คุณอาจสร้างปัญหา XY   -  person sawdust    schedule 24.01.2021
comment
มันไม่ใช่ปัญหา xy ขอบคุณ   -  person stefff    schedule 19.02.2021
comment
ดูเหมือนคุณกำลังมองหา fwnode graph API ได้รับการออกแบบมาเพื่อส่งผ่านคุณสมบัติของอุปกรณ์ระหว่างโหนดอิสระ (จากมุมมองแผนผังอุปกรณ์)   -  person 0andriy    schedule 02.03.2021
comment
อาจมีประโยชน์ (มีบางลิงก์) stackoverflow.com/q/58577825/2511795   -  person 0andriy    schedule 02.03.2021