Связь между двумя экземплярами драйвера ядра Linux на основе двух отдельных узлов в дереве устройств

Я написал драйвер для встроенного Linux с microzed 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", },  
    {}
};

Поскольку вызывается функция probe, мы можем работать с базовым адресом и сопутствующими вещами, такими как регистры/irq/и т.д...

Поскольку у DTB есть 2 узла с 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

Мой вопрос: как отличить информацию об устройстве платформы одного экземпляра от другого;

Для тривиального примера просто сделайте prink базового адреса 2-го экземпляра из 1-го и наоборот.

В общем, как общаться между двумя экземплярами, не используя API пользовательского пространства sysfs?

Я читал эти статьи:

но решения не нашел.


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