Jump to content

    
Sign in to follow this  
shurikman

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

Recommended Posts

Приветствую. Имеется плата на базе 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. Пока не могу выявить четкого соответствия между этими файлами для запуска. Может кто сталкивался, отпишитесь. Спасибо

Edited by shurikman

Share this post


Link to post
Share on other sites
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","

Share this post


Link to post
Share on other sites
4 minutes ago, Jury093 said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
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 бы увидеть

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

Share this post


Link to post
Share on other sites
2 minutes ago, shurikman said:

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

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

2 minutes ago, shurikman said:

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

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

Share this post


Link to post
Share on other sites
24 minutes ago, gosha-z said:

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

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

 

dmesg.txt

Share this post


Link to post
Share on other sites
37 minutes ago, shurikman said:

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

 

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

12 minutes ago, gosha-z said:

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this