Перейти к содержанию
    

Настройка CMEM для обмена между ARM и DSP

Приветствую. Имеется плата на базе TCI6636K2H(ARM + DSP). На ARM крутится Linux, на DSP - SYS/BIOS. Из пакета pdk_k2hk_4_0_9 интересовали примеры для обмена между ARM и DSP в частности transportQmssDspEpK2HC66TestProject, после его допиливания обмен удалось запустить, но там есть ограничения на размер буфера. Далее в пакете processor_sdk_rtos_k2hk_4_03_00_05 перешли к примеру bigdataipc. Поправив все нужные пути и переменные окружения данный пример был собран для версии с Linux. Сразу не запустился, команда mpmcl load dsp0 server_dsp.xe66 завершалась с ошибкой, но после манипуляций из e2e пример стал грузиться. При выполнении следующей команды mpmcl run dsp0 в консоль вываливается ошибка  remoteproc remoteproc0: Failed to process resources: -22. Эта ошибка является следствием рассогласования содержимого одного из следующих файлов:

1. файл dts со стороны Linux

2. файл mpm_config.json со стороны Linux

3. файл rsc_table_dsp.h со стороны DSP

В файле rsc_table_dsp.h инициализируется структура ti_ipc_remoteproc_ResourceTable, которая используется при вызове команды mpmcl run dsp0 и проверяет её на соответствие первым двум файлам. Если использовать ti_ipc_remoteproc_ResourceTable по умолчанию, т.е. где не происходит выделения области CMEM для DSP, пример запускается, но падает при попытке обмена, что естественно.

Привожу кусок листинга используемого файла dts:
 

Spoiler

 

...

dspmem@a0000000 {
            compatible = "ti,keystone-dsp-mem";
            reg = <0xa0000000 0x10000000>;
        };

reserved-memory {
        #address-cells = <0x2>;
        #size-cells = <0x2>;
        ranges;

        dsp_common_cma_pool@81f800000 {
            compatible = "shared-dma-pool";
            reg = <0x8 0x1f800000 0x0 0x800000>;
            reusable;
            status = "okay";
            linux,phandle = <0x27>;
            phandle = <0x27>;
        };

        dsp_common_mpm_pool@820000000 {
            compatible = "shared-dma-pool";
            reg = <0x8 0x20000000 0x0 0x10000000>;
            no-map;
            status = "okay";
        };

        cmem_block_mem@830000000 {
            reg = <0x8 0x30000000 0x0 0x18000000>;
            no-map;
            status = "okay";
            linux,phandle = <0x53>;
            phandle = <0x53>;
        };
    };

cmem {
        compatible = "ti,cmem";
        #address-cells = <0x1>;
        #size-cells = <0x0>;
        #pool-size-cells = <0x2>;
        status = "okay";

        cmem_block@0 {
            reg = <0x0>;
            memory-region = <0x53>;
            cmem-buf-pools = <0x1 0x0 0x18000000>;
        };

    };

...

 

Файла mpm_config.json:
 

Spoiler

 

"segments": [

...
        {
            "name": "local-msmc",
            "globaladdr": "0x0c000000",
            "length": "0x600000",
            "devicename": "/dev/dspmem"
        },
        {
            "name": "local-ddr",
            "globaladdr": "0xA0000000",
            "length": "0x10000000",
            "devicename": "/dev/dspmem"
        },
        {
            "name": "mpax",
            "globaladdr": "0x0bc00000",
            "length": "0x10000",
            "devicename": "/dev/dspmem"
        }
    ],

...

 

Файл rsc_table_dsp.h:

Spoiler

#define VIRTIO_ID_RPMSG         7 /* virtio remote processor messaging */

/* flip up bits whose indices represent features we support */
#define RPMSG_IPU_C0_FEATURES         1

#define RPMSG_VRING0_DA     0xA0000000
#define RPMSG_VRING1_DA     0xA0004000

/* NOTE: Make sure this matches what is configured in the linux device tree */
#define DSP_CMEM_IOBUFS 0xA1000000
#define PHYS_CMEM_IOBUFS 0xA1000000
#define DSP_CMEM_IOBUFS_SIZE (SZ_1M)

/*
 * sizes of the virtqueues (expressed in number of buffers supported,
 * and must be power of 2)
 */
#define RPMSG_VQ0_SIZE          256
#define RPMSG_VQ1_SIZE          256

struct my_resource_table {
    struct resource_table base;

    UInt32 offset[3];

    /* rpmsg vdev entry */
    struct fw_rsc_vdev rpmsg_vdev;
    struct fw_rsc_vdev_vring rpmsg_vring0;
    struct fw_rsc_vdev_vring rpmsg_vring1;

    /* trace entry */
    struct fw_rsc_trace trace;
    /* devmem entry */
    struct fw_rsc_devmem devmem0;
};

/* Add trace buffer information to the resource table */
//#define TRACEBUFADDR (UInt32)&xdc_runtime_SysMin_Module_State_0_outbuf__A
//extern char ti_trace_SysMin_Module_State_0_outbuf__A;
extern char xdc_runtime_SysMin_Module_State_0_outbuf__A;
//#define TRACEBUFADDR (UInt32)&ti_trace_SysMin_Module_State_0_outbuf__A
#define TRACEBUFADDR (UInt32)&xdc_runtime_SysMin_Module_State_0_outbuf__A
#define TRACEBUFSIZE 0x8000

#define CARVEOUTADDR TRACEBUFADDR
#define CARVEOUTSIZE TRACEBUFSIZE

#pragma DATA_SECTION(ti_ipc_remoteproc_ResourceTable, ".resource_table")
#pragma DATA_ALIGN(ti_ipc_remoteproc_ResourceTable, 4096)

struct my_resource_table ti_ipc_remoteproc_ResourceTable = {
    1, /* we're the first version that implements this */
    3, /* number of entries in the table */
    0, 0, /* reserved, must be zero */
    /* offsets to entries */
    {
        offsetof(struct my_resource_table, rpmsg_vdev),
        offsetof(struct my_resource_table, trace),
        offsetof(struct my_resource_table, devmem0),
    },

    /* rpmsg vdev entry */
    {
        TYPE_VDEV, VIRTIO_ID_RPMSG, 0,
        RPMSG_IPU_C0_FEATURES, 0, 0, 0, 2, { 0, 0 },
        /* no config data */
    },
    /* the two vrings */
    { RPMSG_VRING0_DA, 4096, RPMSG_VQ0_SIZE, 1, 0 },
    { RPMSG_VRING1_DA, 4096, RPMSG_VQ1_SIZE, 2, 0 },

    {
        TYPE_TRACE, TRACEBUFADDR, TRACEBUFSIZE, 0, "trace:dsp",
    },
    {
        TYPE_DEVMEM,
        DSP_CMEM_IOBUFS, PHYS_CMEM_IOBUFS,
        DSP_CMEM_IOBUFS_SIZE, 0, 0, "DSP_CMEM_IOBUFS",
    },
};

 

 

 

Файл config.bld:

Spoiler

 

var Build = xdc.useModule('xdc.bld.BuildEnvironment');

/*  Memory Map for ti.platforms.evmTCI6636K2H:dsp
 *
 *  --- External Memory ---
 *  Virtual     Physical        Size            Comment
 *  ------------------------------------------------------------------------
 *  a000_0000   a000 0000    1000_0000  (  256 MB) EXT_CODE
 */
var evmTCI6636K2H_ExtMemMapDsp = {
    EXT_CODE: {
        name: "EXT_CODE",
        base: 0xa0000000,
        len:  0x10000000,
        space: "code/data",
        access: "RWX"
    },
};

Build.platformTable["ti.platforms.evmTCI6636K2H"] = {
    externalMemoryMap: [
        [ "EXT_CODE", evmTCI6636K2H_ExtMemMapDsp.EXT_CODE ],
    ],
    codeMemory: "EXT_CODE",
    dataMemory: "EXT_CODE",
    stackMemory: "EXT_CODE",
};

/*
 *  ======== ti.targets.elf.C66 ========
 */
var C66 = xdc.useModule('ti.targets.elf.C66');
C66.ccOpts.suffix += " -mi10 -mo -pdr -pden -pds=238 -pds=880 -pds1110 ";
Build.targets.$add(C66);

 

 

Адрес и размер области cmem в файле dts менял на адреса DDR, дефайны DSP_CMEM_IOBUFS, PHYS_CMEM_IOBUFS, DSP_CMEM_IOBUFS_SIZE из файла rsc_table_dsp.h делал соответствующие, но вызов команды mpmcl run dsp0 приводит к ошибке  remoteproc remoteproc0: Failed to process resources: -22. Пока не могу выявить четкого соответствия между этими файлами для запуска. Может кто сталкивался, отпишитесь. Спасибо

Изменено пользователем shurikman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, shurikman сказал:

 после его допиливания обмен удалось запустить, но там есть ограничения на размер буфера.
 

  Скрыть контент

 

"segments": [

...
        {
            "name": "local-msmc",
            "globaladdr": "0x0c000000",
            "length": "0x600000",
            "devicename": "/dev/dspmem"
        },
        {
            "name": "local-ddr",
            "globaladdr": "0xA0000000",
            "length": "0x10000000",
            "devicename": "/dev/dspmem"
        },
        {
            "name": "mpax",
            "globaladdr": "0x0bc00000",
            "length": "0x10000",
            "devicename": "/dev/dspmem"
        }
    ],

...

 

 

 

попробуйте вывести в отладку - сколько памяти запрашивается, возможно надо смотреть параметр CMA в kernel

вот этот размер бросается в глаза ""length": "0x10000000","

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Jury093 said:

попробуйте вывести в отладку - сколько памяти запрашивается, возможно надо смотреть параметр CMA в kernel

вот этот размер бросается в глаза ""length": "0x10000000","

Это относится к примеру transportQmssDspEpK2HC66TestProject, там не получилось выделить буфер больше 4096 через HeapBufMP_create, да и скорость передачи не особо удовлетворила, даже на этом размере буфера, использовалась технология TransportQmss.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первое, что бросилось в глаза в dts:

1. Это что, декомпилеж готового DTB?

2. Вроде как на 66K2 ядро A15, откуда address-cells и size-cells по 2?

Ну и dmesg бы увидеть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, gosha-z said:

1. Это что, декомпилеж готового DTB? 

Правится файл dts, из dts делается dtb

dtc -I dts /boot/keystone-k2hk-evm.dts -O dtb -o /boot/keystone-k2hk-evm.dtb

в u-boot устанавливается

set name_fdt keystone-k2hk-evm.dtb

далее

boot

и загрузка идет с использованием keystone-k2hk-evm.dtb

12 minutes ago, gosha-z said:

2. Вроде как на 66K2 ядро A15, откуда address-cells и size-cells по 2?

За это не скажу, dts брался из SDK

13 minutes ago, gosha-z said:

Ну и dmesg бы увидеть

Что конкретно выводить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, shurikman said:

Правится файл dts

Ой ли?! А откуда тогда phandle с числовыми значениями???

2 minutes ago, shurikman said:

Что конкретно выводить?

Весь dmesg. Можно аттачем

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, gosha-z said:

Ой ли?! А откуда тогда phandle с числовыми значениями??? 

Аааа, понял)) видимо всё таки декомпилёж, ко мне он уже попал с числовыми значениями.

 

dmesg.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, shurikman said:

Аааа, понял)) видимо всё таки декомпилёж, ко мне он уже попал с числовыми значениями.

 

Как оказалось числовые значения там появились после компиляции ядра.

12 minutes ago, gosha-z said:

А кто ссылается на dsp_common-*_pool?

В каком месте, не могу уловить вашу мысль на что обратить внимание

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, gosha-z said:

Исходный dts можете показать? 

Как я понял, исходный dts для кастомной платы был создан на основе keystone-k2hk-evm.dts идущим с SDK. Файл keystone-k2hk-evm.dts имеет инклюды, например:

#include "keystone.dtsi"
#include "keystone-k2hk.dtsi"

#include "k2hk-evm-cmem.dtsi"
#include "keystone-uio.dtsi"
#include "k2hk-uio.dtsi"

Также в этот файл были внесены правки с учетом используемых интерфейсов. Далее при сборке ядра получается один файл dts(уже с цифровыми значениями), который преобразуется в dtb. Могу приложить файл dts, получившийся после сборки ядра. Самой системой сборки не обладаю и что в итоге за dts до компиляции ядра использовался не могу сказать. Т.е. у меня есть железка на базе TCI6636K2H с работающим Linux + набор неких интерфейсов, поддерживаемых Linux. Можно ли имея что имея настроить CMEM, подстроить файл rsc_table_dsp.h  под имеющуюся конфигурацию Linux.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...