Как прочитать адрес зарезервированной памяти в дереве устройств

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

/ {
    reserved-memory {
        my_reserve: my_reserve@a0000000 {
            compatible = "shared-dma-pool";
            reg = <0 0xa0000000 0 0x20000>;
            no-map;
        };
    };

    my_device {
        compatible = "my_device";
        memory-region = <&my_reserve>;
    };
};

Как мне прочитать физический адрес зарезервированной памяти (т.е. как мне прочитать значение 0xa000'0000) в моем драйвере устройства? Кажется, есть API для зарезервированной памяти, но я не вижу ничего, что возвращало бы struct reserved_mem *


person Kotte    schedule 22.03.2019    source источник


Ответы (1)


Если struct device *hwdev указывает на ваше оборудование struct device (например, если hwdev указывает на dev член struct platform_device), то этот фрагмент показывает, как получить доступ к узлу дерева устройств в зарезервированной области памяти и преобразовать его в struct resource.

        struct device_node *memnp;
        struct resource mem_res;
        int rc;

        /* Get pointer to memory region device node from "memory-region" phandle. */
        memnp = of_parse_phandle(hwdev->of_node, "memory-region", 0);
        if (!memnp) {
                dev_err(hwdev, "no memory-region node\n");
                rc = -ENXIO;
                goto err1;
        }
        /* Convert memory region to a struct resource */
        rc = of_address_to_resource(memnp, 0, &mem_res);
        /* finished with memnp */
        of_node_put(memnp);
        if (rc) {
                dev_err(hwdev, "failed to translate memory-region to a resource\n");
                goto err1;
        }

Начальный адрес заканчивается mem_res.start, а длина задается resource_size(&mem_res);.

person Ian Abbott    schedule 22.03.2019
comment
of_parse_phandle также требуется аргумент индекса. Кроме того, это сработало как шарм. - person Kotte; 25.03.2019
comment
Приносим извинения за отсутствие аргумента индекса. Я добавил это сейчас. Приятно слышать, что у вас все равно работает! - person Ian Abbott; 25.03.2019