shurikman 0 20 марта, 2019 Опубликовано 20 марта, 2019 (изменено) · Жалоба Приветствую. Имеется плата на базе 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. Пока не могу выявить четкого соответствия между этими файлами для запуска. Может кто сталкивался, отпишитесь. Спасибо Изменено 20 марта, 2019 пользователем shurikman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 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"," Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shurikman 0 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 4 minutes ago, Jury093 said: попробуйте вывести в отладку - сколько памяти запрашивается, возможно надо смотреть параметр CMA в kernel вот этот размер бросается в глаза ""length": "0x10000000"," Это относится к примеру transportQmssDspEpK2HC66TestProject, там не получилось выделить буфер больше 4096 через HeapBufMP_create, да и скорость передачи не особо удовлетворила, даже на этом размере буфера, использовалась технология TransportQmss. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба Первое, что бросилось в глаза в dts: 1. Это что, декомпилеж готового DTB? 2. Вроде как на 66K2 ядро A15, откуда address-cells и size-cells по 2? Ну и dmesg бы увидеть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shurikman 0 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 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 бы увидеть Что конкретно выводить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 2 minutes ago, shurikman said: Правится файл dts Ой ли?! А откуда тогда phandle с числовыми значениями??? 2 minutes ago, shurikman said: Что конкретно выводить? Весь dmesg. Можно аттачем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shurikman 0 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 24 minutes ago, gosha-z said: Ой ли?! А откуда тогда phandle с числовыми значениями??? Аааа, понял)) видимо всё таки декомпилёж, ко мне он уже попал с числовыми значениями. dmesg.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба А кто ссылается на dsp_common-*_pool? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shurikman 0 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 37 minutes ago, shurikman said: Аааа, понял)) видимо всё таки декомпилёж, ко мне он уже попал с числовыми значениями. Как оказалось числовые значения там появились после компиляции ядра. 12 minutes ago, gosha-z said: А кто ссылается на dsp_common-*_pool? В каком месте, не могу уловить вашу мысль на что обратить внимание Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба Исходный dts можете показать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shurikman 0 20 марта, 2019 Опубликовано 20 марта, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться