Несколько карт P CIe: считывание свойств дерева устройств экземпляра карты CURRENT P CIe (в драйвере ядра) - PullRequest
2 голосов
/ 04 мая 2020

Вопрос:

Мы расширяем драйвер устройства. Наши устройства P CIe обладают свойствами, которые невозможно определить автоматически. В соответствии с сопровождающими ядра Linux мы хотим добавить эти свойства в дерево устройств. Как я могу получить в коде драйвера свойства экземпляра CURRENT, который обрабатывает драйвер в тот момент, когда в системе присутствует более одной карты P CIe?

Context :

Мы делаем это в контексте драйвера Ethe rnet, однако проблема является общей c для любого драйвера устройств, подключенных к P CIe (или даже подключенных к шине устройств).

Пример:

pcie@1ff00000 {
    ...
    host@0 {
        reg = < 0x00 0x00 0x00 0x00 0x00 >;
        #address-cells = < 0x03 >;
        #size-cells = < 0x02 >;

        ethernet@0 {
            compatible = "weiland-yutani,nostromo";
            reg = < 0x00 0x00 0x00 0x00 0x00 >;
            phy-connection-type = "rgmii";
        };
    };
    host@1 {
        reg = < 0x00 0x00 0x00 0x00 0x00 >;
        #address-cells = < 0x03 >;
        #size-cells = < 0x02 >;

        ethernet@0 {
            compatible = "weiland-yutani,nostromo";
            reg = < 0x00 0x00 0x00 0x00 0x00 >;
            phy-connection-type = "mii";
        };
    };
};

В этом примере показаны две карты P CIe ethe rnet, одна из которых использует "rgmii", а другая - "mii" в качестве режим передачи. (Как пример, у нас есть больше конфигурации).

В коде драйвера ядра, как я могу получить доступ к узлу, который принадлежит текущему экземпляру P CIe (pci_dev * pdev) Я имею дело с? Я имею в виду, какой вызов of_find_node_by_path () или что-то еще может привести меня к правильному экземпляру? Таким образом, я могу добавить оператор if в мой драйвер ethe rnet, который реагирует на правильную конфигурацию rgmii или mii, в зависимости от того, с какой из карт P CIe драйвер работает в данный момент.

Подход должен быть обобщенным c, поскольку мы стремимся внести его обратно в ядро ​​Linux. (Произвольное количество шин PCI, карт, топологий ...)

Большое спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Текущий узел передается экземпляру драйвера с помощью pdev-> dev-> of_node .

Пример. В приведенном выше дереве устройств драйвер получит прямой доступ к узлу ethernet@0 без дальнейшего обхода:

static int nostromo_pcidev_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
    const char *conn-type;    
    of_property_read_string(pdev->dev->of_node, "phy-connection-type", &conn-type);
...