This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux IPC: How to configure DSP memory map for cache with Linux running on ARM on OMAPL138

Other Parts Discussed in Thread: SYSBIOS, OMAPL138, OMAP-L138

Tool/software: Linux

Hi there, I am trying to create a design similar to the example shown in the IPC ipc_3_46_00_02

I have added the resource table file to the DSP app and I am able to run the ex02_messageq example.

I have installed the SDK 4.0.0.4 for Linux and also check the DTS filr for the CMA pool its set to 0xc3000000 and there are two buffers at location:

#define RPMSG_VRING0_DA 0xc3000000
#define RPMSG_VRING1_DA 0xc3004000

The problem I have is as follows:

The examples ex02 in the IPC disables the cache for location 0xc3000000 and the whole dsp application is located in the same heap. I want to use cache for DSP app and would like to create a new heap just for IPC comms.

I have modified the resource table with the following:

#define DATA_DA1                0xc5000000

#ifndef DATA_SIZE
# define DATA_SIZE (SZ_1M * 15)
#endif

struct my_resource_table {
struct resource_table base;

UInt32 offset[4];

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

/* data carveout entry */
struct fw_rsc_carveout data_cout;

/* data carveout entry */
struct fw_rsc_carveout data_cout1;

/* trace entry */
struct fw_rsc_trace trace;
};
extern char xdc_runtime_SysMin_Module_State_0_outbuf__A;
#define TRACEBUFADDR (UInt32)&xdc_runtime_SysMin_Module_State_0_outbuf__A
#define TRACEBUFSIZE 0x8000

#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 */
4, /* 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, data_cout),
offsetof(struct my_resource_table, data_cout1),
offsetof(struct my_resource_table, trace),
},

/* rpmsg vdev entry */
{
TYPE_VDEV, VIRTIO_ID_RPMSG, 0,
RPMSG_DSP_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_CARVEOUT, DATA_DA, DATA_DA, DATA_SIZE, 0, 0, "DSP_MEM_DATA",
},

{
TYPE_CARVEOUT, DATA_DA1, DATA_DA1, DATA_SIZE, 0, 0, "DSP_MEM_DATA1",
},

{
TYPE_TRACE, TRACEBUFADDR, TRACEBUFSIZE, 0, "trace:dsp",
},
};

That's added extra TYPE_CARVEOUT with address 0xc5000000

and also made similar changes in the DTS Linux file:

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

dsp_cma_pool: dsp_cma@c3000000 {
compatible = "shared-dma-pool";
reg = <0xc3000000 0x1000000>;
reusable;
status = "okay";
};
dsp_cma_pool1: dsp_cma_ipc@c5000000 {
compatible = "shared-dma-pool";
reg = <0xc5000000 0x1000000>;
reusable;
status = "okay";
};

};

In the DSP.cfg I have also added :

var Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
Cache.MAR192_223 = 0x00000008;

to enable cache only for 0xc3000000 for DSP app and disabled cache for rest (0xc5000000).

When trying to boot DSP from remoteproc I get the following error:

root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc# echo davinci-rproc.0 > bind
davinci-rproc davinci-rproc.0: assigned reserved memory node dsp_cma@c3000000
remoteproc remoteproc0: dsp is available
root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc# remoteproc remoteproc0: powering up dsp
remoteproc remoteproc0: Booting fw image rproc-dsp-fw, size 5604612
davinci-rproc davinci-rproc.0: failed to allocate dma memory: len 0xf00000
remoteproc remoteproc0: Failed to process resources: -12

All I want to do is:

* Implement some heap buffer to be used to comms between DSP and Linux using MessageQ.

Thanks in advance.

  • Hi there, one more thing I don't understand is
    If I change the CMA Pool in DTS Linux to 0xC4000000 and also change the resource table addresses to 0xc4.. rather than 0xc3.. ANd when I boot DSP from remoteproc then are no errors as expected! however, it doesn't seems to run the app on the DSP!!!

    Now this I can't understand!!!
  • Hi,

    We're looking into this.
    Note that feedback will be delayed because of the holidays.

    Best Regards,
    Yordan
  • Hi, Mitesh,

    The CMA allocation are done through DMA API, and only a single pool can be tied to a device. You have 2 carved out areas, but both will be from the same CMA pool which is why remoteproc complains not being able to allocate that 15MB space.

    Rex
  • Hi Rex, thanks for your reply.

    Okay. What about just changing the default resource table code to address 0xc4000000 rather than 0xc3000000

    and making similar chnages in the DTS file for the CMA pool to 0xc4000000

    it still doesn't boot DSP sw.

  • One more thing, I don't understand Rex,
    * If the resource table VRING is at 0xc3000000 address and the CMA pool is of 16MB from 0xc3000000 does the DSP app entry point have to be at around 0xc3000000 address?
  • Hi Mitesh,

    You also need to make the corresponding changes to the table in config.bld. Can you verify that you've done this? If so, what does it look like?

    Regards,
    Sahin
  • Hi Sahin,

    No, I have not made any changes to the config.bld file

    Could you let me know what needs to be added and what is this file for.

    Thanks.

  • On top of the config.bld file it says "/* THIS IS A GENERATED FILE -- DO NOT EDIT */"
  • Hi Mitesh,

    The config.bld file defines the memory layout for the DSP and needs to match what is in the resource table. For example, in your resource table since you have:

    #define DATA_DA1 0xc5000000 and #define DATA_SIZE (SZ_1M * 15)

    In config.bld, change base: 0xC3100000, len: 0x800000 to base: 0xc5000000, len: 0xF00000 


    The config.bld file for this messageQ example can be found in ipc_3_46_02_04\examples\OMAPL138_linux_elf\ex02_messageq\dsp

    You can refer to this wiki for more info on the config.bld file: processors.wiki.ti.com/.../Config_bld_basics

    Also, have you set Resource.customTable config parameter to true? (see processors.wiki.ti.com/.../IPC_Resource_customTable )

    Regards,
    Sahin

  • Hi Sahin, yes I had added this in the cfg file.

    /* Override the default resource table with my own */
    var Resource = xdc.useModule('ti.ipc.remoteproc.Resource');
    Resource.customTable = true;

    Attached config.bld file from my current project design.

    0652.config.txt
    /* THIS IS A GENERATED FILE -- DO NOT EDIT */
    
    var target;    /* the target used for this build */
    
    /* configuro was passed the target's name explicitly */
    try {
        target = xdc.module('ti.targets.elf.C674');
    }
    catch (e) {
        throw new Error("Can't find the target named '" + 'ti.targets.elf.C674'
                        + "' along the path '" + environment["xdc.path"]
                        + "': please check the spelling of the target's name and that it exists along this path.");
    }
    if (!(target instanceof xdc.module("xdc.bld.ITarget").Module)) {
        throw new Error("The module named 'ti.targets.elf.C674' exists but it's not a target: please check the spelling of the target's name");
    }
    
    /* configuro was passed compiler options explicitly */
    target.ccOpts.prefix = unescape("-g%20--optimize_with_debug%20") + target.ccOpts.prefix;
    
    /* configuro was passed the target's rootDir explicitly */
    target.rootDir = 'C:/ti/ti-cgt-c6000_8.1.3';
    
    Build.targets = [target];
    

  • 8081.linker.txt
    /*
     * Do not modify this file; it is automatically generated from the template
     * linkcmd.xdt in the ti.targets.elf package and will be overwritten.
     */
    
    /*
     * put '"'s around paths because, without this, the linker
     * considers '-' as minus operator, not a file name character.
     */
    
    
    -l"P:\P16028DSP_doNOTmove\in-Development_Software\DSP\NewMotionLogger_withLinux\Debug\configPkg\package\cfg\app_pe674.oe674"
    -l"C:\ti\ipc_3_46_00_02\packages\ti\ipc\family\omapl138\lib\release\ti.ipc.family.omapl138.ae674"
    -l"P:\P16028DSP_doNOTmove\in-Development_Software\DSP\NewMotionLogger_withLinux\src\ipc\ipc.ae674"
    -l"C:\ti\uia_2_00_06_52\packages\ti\uia\sysbios\lib\release\ti.uia.sysbios.ae674"
    -l"C:\ti\uia_2_00_06_52\packages\ti\uia\loggers\lib\release\ti.uia.loggers.ae674"
    -l"P:\P16028DSP_doNOTmove\in-Development_Software\DSP\NewMotionLogger_withLinux\src\utils\utils.ae674"
    -l"P:\P16028DSP_doNOTmove\in-Development_Software\DSP\NewMotionLogger_withLinux\src\sysbios\sysbios.ae674"
    -l"C:\ti\uia_2_00_06_52\packages\ti\uia\services\lib\release\ti.uia.services.ae674"
    -l"C:\ti\uia_2_00_06_52\packages\ti\uia\runtime\lib\release\ti.uia.runtime.ae674"
    -l"C:\ti\uia_2_00_06_52\packages\ti\uia\events\lib\release\ti.uia.events.ae674"
    -l"C:\ti\bios_6_46_00_23\packages\ti\targets\rts6000\lib\ti.targets.rts6000.ae674"
    -l"C:\ti\bios_6_46_00_23\packages\ti\targets\rts6000\lib\boot.ae674"
    
    --retain="*(xdc.meta)"
    
    
    --args 0x64
    -heap  0x0
    -stack 0x1f40
    
    MEMORY
    {
        IRAM (RWX) : org = 0x11800000, len = 0x40000
        IROM (RX) : org = 0x11700000, len = 0x100000
        L1DSRAM (RW) : org = 0x11f00000, len = 0x8000
        L1PSRAM (RWX) : org = 0x11e00000, len = 0x8000
        L3_FPGAIF_RAM (RWX) : org = 0x80000000, len = 0x400
        L3_CMDIF_RAM (RWX) : org = 0x80000c00, len = 0x800
        DDR (RWX) : org = 0xc3110000, len = 0x2000000
        entry_point (RWX) : org = 0xc3100000, len = 0x100
        L3_MCOM_RAM (RWX) : org = 0x80000400, len = 0x800
        L3_RSVD_RAM (RWX) : org = 0x80001400, len = 0x1ec00
        DDR_IPC (RWX) : org = 0xc7000000, len = 0x1000000
    }
    
    /*
     * Linker command file contributions from all loaded packages:
     */
    
    /* Content from xdc.services.global (null): */
    
    /* Content from xdc (null): */
    
    /* Content from xdc.corevers (null): */
    
    /* Content from xdc.shelf (null): */
    
    /* Content from xdc.services.spec (null): */
    
    /* Content from xdc.services.intern.xsr (null): */
    
    /* Content from xdc.services.intern.gen (null): */
    
    /* Content from xdc.services.intern.cmd (null): */
    
    /* Content from xdc.bld (null): */
    
    /* Content from ti.targets (null): */
    
    /* Content from ti.targets.elf (null): */
    
    /* Content from xdc.rov (null): */
    
    /* Content from xdc.runtime (null): */
    
    /* Content from ti.targets.rts6000 (null): */
    
    /* Content from ti.sysbios.interfaces (null): */
    
    /* Content from ti.sysbios.family (null): */
    
    /* Content from xdc.services.getset (null): */
    
    /* Content from xdc.rta (null): */
    
    /* Content from ti.uia.events (null): */
    
    /* Content from ti.uia.runtime (null): */
    
    /* Content from xdc.runtime.knl (null): */
    
    /* Content from ti.sdo.ipc.family (null): */
    
    /* Content from ti.sdo.ipc.interfaces (null): */
    
    /* Content from ti.sysbios.family.c62 (null): */
    
    /* Content from ti.sysbios.family.c64p.primus (null): */
    
    /* Content from ti.uia.services (null): */
    
    /* Content from ti.catalog.c6000 (null): */
    
    /* Content from ti.catalog (null): */
    
    /* Content from ti.catalog.peripherals.hdvicp2 (null): */
    
    /* Content from xdc.platform (null): */
    
    /* Content from xdc.cfg (null): */
    
    /* Content from ti.platforms.generic (null): */
    
    /* Content from test.omapl138custom (null): */
    
    /* Content from ti.sysbios.family.c64p (ti/sysbios/family/c64p/linkcmd.xdt): */
    ti_sysbios_family_c64p_Cache_l1dSize = 0;
    ti_sysbios_family_c64p_Cache_l1pSize = 0;
    ti_sysbios_family_c64p_Cache_l2Size = 0;
    
    /* Content from ti.sysbios.hal (null): */
    
    /* Content from ti.sysbios.knl (null): */
    
    /* Content from ti.sysbios.timers.timer64 (null): */
    
    /* Content from ti.sysbios (null): */
    
    /* Content from ti.sysbios.rts (ti/sysbios/rts/linkcmd.xdt): */
    
    /* Content from ti.sysbios.rts.ti (ti/sysbios/rts/ti/linkcmd.xdt): */
    
    /* Content from ti.sysbios.syncs (null): */
    
    /* Content from ti.deh (null): */
    
    /* Content from ti.sysbios.gates (null): */
    
    /* Content from ti.sysbios.heaps (null): */
    
    /* Content from ti.sdo.utils (null): */
    
    /* Content from ti.sysbios.xdcruntime (null): */
    
    /* Content from ti.uia.loggers (null): */
    
    /* Content from ti.sysbios.utils (null): */
    
    /* Content from ti.uia.sysbios (null): */
    
    /* Content from ti.sdo.ipc.family.da830 (null): */
    
    /* Content from ti.ipc.remoteproc (ti/ipc/remoteproc/linkcmd.xdt): */
    
    
        /*
         *  Set entry point to the HWI reset vector 0 to automatically satisfy
         *  any alignment constraints for the boot vector.
         */
        -eti_sysbios_family_c64p_Hwi0
    
        /*
         * We just modified the entry point, so suppress "entry point symbol other
         * than _c_int00 specified" warning.
         */
        --diag_suppress=10063
    
    /* Content from ti.sdo.ipc.notifyDrivers (null): */
    
    /* Content from ti.sdo.ipc (ti/sdo/ipc/linkcmd.xdt): */
    
    SECTIONS
    {
    
        ti_sdo_ipc_init: load > DDR, type = NOINIT
    }
    
    /* Content from ti.ipc.ipcmgr (null): */
    
    /* Content from ti.ipc.transports (null): */
    
    /* Content from ti.ipc.rpmsg (null): */
    
    /* Content from ti.ipc.family.omapl138 (null): */
    
    /* Content from ti.ipc.namesrv (null): */
    
    /* Content from ti.sdo.ipc.heaps (null): */
    
    /* Content from ti.sdo.ipc.gates (null): */
    
    /* Content from configPkg (null): */
    
    /* Content from xdc.services.io (null): */
    
    /* Content from ti.sdo.ipc.family.ti81xx (null): */
    
    
    /*
     * symbolic aliases for static instance objects
     */
    xdc_runtime_Startup__EXECFXN__C = 1;
    xdc_runtime_Startup__RESETFXN__C = 1;
    
    SECTIONS
    {
        .text: load >> DDR
        .ti.decompress: load > DDR
        .stack: load > DDR
        GROUP: load > DDR
        {
            .bss:
            .neardata:
            .rodata:
        }
        .cinit: load > DDR
        .pinit: load >> DDR
        .init_array: load > DDR
        .const: load >> DDR
        .data: load >> DDR
        .fardata: load >> DDR
        .switch: load >> DDR
        .sysmem: load > DDR
        .far: load >> DDR
        .args: load > DDR align = 0x4, fill = 0 {_argsize = 0x64; }
        .cio: load >> DDR
        .ti.handler_table: load > DDR
        .c6xabi.exidx: load > DDR
        .c6xabi.extab: load >> DDR
        .tracebuf: load > DDR
        .errorbuf: load > DDR
        .resource_table: load > 0xc3110000, type = NOINIT
        .vecs: load > DDR
        xdc.meta: load > DDR, type = COPY
    
    }
    
    Also attached linker file.

    Point to note, I have created my own custom platform with all memory mapping.

  • Hi Mitesh,

    Typically, with IPC, what we do is use our own config.bld to modify the platform and memory config. For example, in the messageQ example:

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

    Build.platformTable["ti.platforms.evmOMAPL138:dsp"] = {

       externalMemoryMap: [

           [ "DDR", {

               name: "DDR", space: "code/data", access: "RWX",

               base: 0xC3100000, len: 0x800000,

               comment: "DSP Program Memory (8 MB)"

           }]

       ],

       codeMemory:  "DDR",

       dataMemory:  "DDR",

       stackMemory: "DDR",

       l1DMode: "32k",

       l1PMode: "32k",

       l2Mode: "32k"

    };

    It takes the platform ti.platforms.evmOMAPL138 and appends :dsp to it to create a new platform, and adds the DDR segment and cache config.

    Then in the makefile located at ex02_messageq\dsp\ it uses this custom platform:

    %/linker.cmd %/compiler.opt: $(CONFIG)/.config ;

    $(CONFIG)/.config: Dsp.cfg ../dsp/config.bld

    @$(ECHO) "#"

    @$(ECHO) "# Making $@ ..."

    $(XDC_INSTALL_DIR)/xs --xdcpath="$(subst +,;,$(PKGPATH))" \

               xdc.tools.configuro -o $(CONFIG) \

               -t ti.targets.elf.C674 \

               -c $(ti.targets.elf.C674) \

               -p ti.platforms.evmOMAPL138:dsp \

               -b ../dsp/config.bld -r $(PROFILE) \

               Dsp.cfg

    @$(ECHO) "" > $@

    Regards,

    Sahin

  • Hi Sahin, 

    The problem I am facing is.. I have got the whole design without the need of making any changes to the config.bld file and the last part of the design is to add IPC package to send 84 bytes of data to Linux at 100Hz.

    For the whole design except the IPC we used cache option enabled and loading and running from DDR memory. 

    After adding IPC we realised that the IPC MessageQ doesn't work with cache option enabled. I need the cache to be enabled for the rest of the design. I can't change that and the "entry-point" of the DSP app is at 0xc3100000 and based on your previous comments, I was thinking to move the VRING buffer to 0xc2ff8000 and 0xc2ffc000 and TYPE_TRACE address is chosen by SYSBIOS.  

    I am not sure, if even the data buffer should be in non-cache-able memory ? "TYPE_CARVEOUT, DATA_DA, DATA_DA, DATA_SIZE, 0, 0, "DSP_MEM_DATA"," but for now it's in cache memory 0xc3100000

    And in the cfg file: 

    var Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
    /* Set 0xc3000000 -> 0xc3ffffff to be cached for shared memory IPC */
    Cache.MAR192_223 = 0x00000008;

    So the 0xc2000000 to 0xc2ffffff will be not cached.

    I will do the similar changes in the DTS file for Linux: 

    Change the CMA pool to 0xc2000000 of len 0x02000000

    Would this work??? or only way to get the IPC working is by editing the config.bld file??? 

    Thanks.

  • Hi Mitesh,

    I was able to get some feedback from the team regarding your issue: 

    Without changing config.bld, you can use SYSBIOS Cache API's in your application as Rahul mentioned in the other thread.

    In regards to moving the Vring buffers outside the cached region:

    The Remoteproc driver allocates the memory for the Vring from the beginning of the CMA pool from dts. It also allocates the carveout from the same CMA pool. So the complication is separating the carveout section from the beginning section of the CMA pool.

    One way to try this is to set the CMA pool in dts to be the superset of the whole memory and specify the carveout to be 16 MB (so that it is allocated in the 16MB boundary). This may require some experimentation to get it working.

    Regards,

    Sahin

  • Hi Sahin,

    So are you saying there is no use cases for the IPC with Cache-able memory?

    I find it very strange that this OMAPL138 is design to be a SoC and yet, it's not possible to comms with the ARM-DSP core. Most of the examples explains about using shared RAM but them it's not supported for Linux-SYSBIOS comms. 

    The experiment you mentioned in your previous post, would you be able to try that? One more question I have, does the DSP app entry_point needs to be in the carveout buffer?

    Thanks

  • Hi Sahin, attached the IPC ex02 example. This should just work as it is but when we enable cache for DSP application, the example fails.

    IPC_ex02_messageq.zip

  • Hi, Mitesh,

    The logs show "failed to allocate dma memory", it indicates the VRING you wanted is not allocated from cma_pool at 0xc5000000, but still from 0xc3000000. I believe remoteproc only works on one pool. Could you try to increase the pool size for cma_pool at 0xc3000000 which is big enough to hold the VRING buffer? However, the resource table needs to be re-arranged so that the VRING is at the end and aligned at a different page from other cached entries.

    Rex
  • Hi Rex,

    Exactly, that is what Sahin and I were thinking is the reason but I was not able to change this to get it working!

    What we wanted to do is: 

    * Get the VRING and the TYPE_CARVEOUT buffers to be in 0xc3000000 and also the CMA pool in Linux DTI to be at 0xc3000000

    * Get the DSP entry call for the app to be in 0xc4000000 with cable enabled. 

    Can we do this? 

    thanks.

  • HI, Mitesh,

    You should be able to, but it's tricky to re-arrange the resource table. Please correct me if I am wrong (also for Sahin). The cache in DSP is aligned at 1MB boundary. As long as the VRING and DSP app are in different cache boundary in resource table, one can be configured as cached, and the other non-cached in DSP. I am not familiar with DSP coding, but a Linux person. I only see issue if using 2 CMA pools. I'll discuss with Sahin offline to see what he has tried.

    Rex
  • Hi Rex,
    The Cache is aligned to 16MB boundary. (MAR bit 192 to 223)
    How can we control where does the DSP app entry call goes?

    By default, in resource table, VRING buffer starts at 0xc3000000 and TYPE_CARVEOUT starts at 0xc3100000.

    Should this TYPE_CARVEOUT be changed for different DSP start address?

    Thanks.
  • Hi Mitesh,

    We were able to get this working with the following configuration:

    In DTS we made the CMA pool 32MB so that it takes up 2 16MB boundaries starting at 0xc3000000:

    dsp_cma_pool: dsp_cma@c3000000 {
    			compatible = "shared-dma-pool";
    			reg = <0xc3000000 0x2000000>;
    			reusable;
    			status = "okay";
    		};

    In the resource table:

    #define DATA_DA          0xc3100000
    
    #ifndef DATA_SIZE
    #  define DATA_SIZE          (SZ_1M * 31)
    #endif
    
    #define RPMSG_VRING0_DA          0xc3000000
    #define RPMSG_VRING1_DA          0xc3004000
    
    #define CONSOLE_VRING0_DA          0xc3008000
    #define CONSOLE_VRING1_DA          0xc300C000
    
    #define BUFS0_DA          0xc3040000
    #define BUFS1_DA          0xc3080000

    In config.bld:

    Build.platformTable["ti.platforms.evmOMAPL138:dsp"] = {
        externalMemoryMap: [
            [ "DDR", {
                name: "DDR", space: "code/data", access: "RWX",
                base: 0xC4000000, len: 0x1000000,
                comment: "DSP Program Memory (16 MB)"
            }]
        ],


    Since you are not using your own config.bld file, you can just change your entry point to 0xc4000000.

    In DSP.cfg

    /* Set 0xc4000000 -> 0xc4ffffff to be cached */
    Cache.MAR192_223 = 0x00000010;

    Remoteproc was allocating the VRINGs first and then looking for the carveout, so the simplest solution was to keep the carveout at 0xc3100000 and increase it's size to 31MB so that we can place the DSP code in the next boundary (0xc4) and enable cache for that boundary. The carveout and DSP code don't necessarily have to match, as we see above, and as long as the carveout is bigger than the code, it will work. In this case, there is 15MB of unused space from 0xc31000000-0xc4000000, this was done to accommodate the cache requirement.

    Also, I verified this on a OMAP-L138 LCDK using the example you sent, I just plugged in the config.bld file. 

    Hopefully this makes sense. Let us know if you have any questions.

  • This is great news. I will try to test this today and post my finding here. Thanks.
  • Hi Sahin, just tried this, but got the following error:

    root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc# cp /home/root/IPC_ex02_messageq.out /lib/firmware/rproc-dsp-fw
    root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc# echo davinci-rproc.0 > bind
    davinci-rproc davinci-rproc.0: assigned reserved memory node dsp_cma@c3000000
    remoteproc remoteproc0: dsp is available
    root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc# remoteproc remoteproc0: powering up dsp
    remoteproc remoteproc0: Booting fw image rproc-dsp-fw, size 4077460
    davinci-rproc davinci-rproc.0: failed to allocate dma memory: len 0x1f00000
    remoteproc remoteproc0: Failed to process resources: -12
  • Hi Sahin, you mentioned about the config.bld file;

    I have created custom platform to be used.

    I have attached the platform.xdc and config.bld file.

    Platform.txt
    /*!
     * File generated by platform wizard. DO NOT MODIFY
     *
     */
    
    metaonly module Platform inherits xdc.platform.IPlatform {
    
        config ti.platforms.generic.Platform.Instance CPU =
            ti.platforms.generic.Platform.create("CPU", {
                clockRate:      456.0,                                       
                catalogName:    "ti.catalog.c6000",
                deviceName:     "OMAPL138",
                customMemoryMap:
               [          
                    ["IROM", 
                         {
                            name: "IROM",
                            base: 0x11700000,                    
                            len: 0x00100000,                    
                            space: "code/data",
                            access: "RX",
                         }
                    ],
                    ["L3_CBA_RAM", 
                         {
                            name: "L3_CBA_RAM",
                            base: 0x80000000,                    
                            len: 0x00020000,                    
                            space: "code/data",
                            access: "RWX",
                         }
                    ],
                    ["DDR", 
                         {
                            name: "DDR",
                            base: 0xc4010000,                    
                            len: 0x01000000,                    
                            space: "code/data",
                            access: "RWX",
                         }
                    ],
                    ["entry_point", 
                         {
                            name: "entry_point",
                            base: 0xc4000000,                    
                            len: 0x00000100,                    
                            space: "code/data",
                            access: "RWX",
                         }
                    ],
               ],
              l2Mode: "0k",
              l1PMode: "0k",
              l1DMode: "0k",
    
        });
        
    instance :
        
        override config string codeMemory  = "DDR";   
        override config string dataMemory  = "DDR";                                
        override config string stackMemory = "DDR";
    
        config String l2Mode = "0k";
        config String l1PMode = "0k";
        config String l1DMode = "0k";
    }
    
    7065.config.txt
    /*!
     * File generated by platform wizard. DO NOT MODIFY
     *
     */
    
    Build.useTargets = null;
    

  • Hi Mitesh,

    Did you increase the CMA pool to 32MB? Also, you will need to rebuild the device tree binaries after modifying the dts file if you have not done so already, see:

    For example, I ran the following the command from the root of the kernel tree to rebuild the device tree binaries (in /home/sahin/ti-processor-sdk-linux-omapl138-lcdk-04.00.00.04/board-support/linux-4.9.28+gitAUTOINC+eed43d1050-geed43d1050).

    make ARCH=arm CROSS_COMPILE=/home/sahin/ti-processor-sdk-linux-omapl138-lcdk-04.00.00.04/linux-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabi- da850-lcdk.dtb

    You can verify that the CMA pool has been increased by looking for the following line at Linux boot: 

    Reserved memory: created CMA memory pool at 0xc3000000, size 32 MiB

  • Hi Sahin, yes I did rebuild and installed the Kernel to SD card. But no luck. Will check the Linux booting log.
  • Hi Sahin, I did rebuild the Linux again and looks like it at least log CMA buffer to be 32K (Log Attached)

    but still got the same error;

    linuxBoot_IPC.txt
    U-Boot SPL 2017.01-00319-g9e3097f-dirty (Sep 15 2017 - 14:25:12)
    Trying to boot from NAND
    
    
    U-Boot 2017.01-00319-g9e3097f-dirty (Sep 15 2017 - 14:25:12 +0100)
    
    I2C:   ready
    DRAM:  128 MiB
    WARNING: Caches not enabled
    NAND:  512 MiB
    MMC:   davinci: 0
    *** Warning - bad CRC, using default environment
    
    In:    serial
    Out:   serial
    Err:   serial
    Invalid MAC address read.
    Net:   DaVinci-EMAC
    Warning: DaVinci-EMAC (eth0) using random MAC address - ce:62:ce:d7:c6:5a
    
    Hit any key to stop autoboot:  3  2  1  0 
    switch to partitions #0, OK
    mmc0 is current device
    SD/MMC found on device 0
    reading boot.scr
    ** Unable to read file boot.scr **
    reading uEnv.txt
    ** Unable to read file uEnv.txt **
    switch to partitions #0, OK
    mmc0 is current device
    SD/MMC found on device 0
    2378000 bytes read in 2731 ms (849.6 KiB/s)
    11945 bytes read in 61 ms (190.4 KiB/s)
    ## Flattened Device Tree blob at c0600000
       Booting using the fdt blob at 0xc0600000
       Loading Device Tree to c7e23000, end c7e28ea8 ... OK
    
    Starting kernel ...
    
    Uncompressing Linux... done, booting the kernel.
    Booting Linux on physical CPU 0x0
    Linux version 4.9.28-geed43d1050 (root@ubuntu) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #37 PREEMPT Wed Feb 21 09:47:20 GMT 2018
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
    CPU: VIVT data cache, VIVT instruction cache
    OF: fdt:Machine model: DA850/AM1808/OMAP-L138 LCDK
    Reserved memory: created CMA memory pool at 0xc3000000, size 32 MiB
    OF: reserved mem: initialized node dsp_cma@c3000000, compatible id shared-dma-pool
    cma: Reserved 16 MiB at 0xc6c00000
    Memory policy: Data cache writethrough
    DaVinci da850/omap-l138/am18x variant 0x1
    Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32480
    Kernel command line: console=ttyS2,115200n8 root=PARTUUID=725f1c6a-02 rw rootfstype=ext4 rootwait
    PID hash table entries: 512 (order: -1, 2048 bytes)
    Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
    Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
    Memory: 73732K/131072K available (4554K kernel code, 309K rwdata, 1452K rodata, 228K init, 162K bss, 8188K reserved, 49152K cma-reserved)
    Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
        vmalloc : 0xc8800000 - 0xff800000   ( 880 MB)
        lowmem  : 0xc0000000 - 0xc8000000   ( 128 MB)
        modules : 0xbf000000 - 0xc0000000   (  16 MB)
          .text : 0xc0008000 - 0xc047aea0   (4556 kB)
          .init : 0xc05e7000 - 0xc0620000   ( 228 kB)
          .data : 0xc0620000 - 0xc066d628   ( 310 kB)
           .bss : 0xc066d628 - 0xc0696170   ( 163 kB)
    SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    Preemptible hierarchical RCU implementation.
    	Build-time adjustment of leaf fanout to 32.
    NR_IRQS:245
    clocksource: timer0_1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
    sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
    Console: colour dummy device 80x30
    Calibrating delay loop... 227.32 BogoMIPS (lpj=1136640)
    pid_max: default: 32768 minimum: 301
    Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
    Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
    CPU: Testing write buffer coherency: ok
    Setting up static identity map for 0xc0008400 - 0xc0008458
    devtmpfs: initialized
    VFP support v0.3: not present
    clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
    futex hash table entries: 256 (order: -1, 3072 bytes)
    pinctrl core: initialized pinctrl subsystem
    NET: Registered protocol family 16
    DMA: preallocated 256 KiB pool for atomic coherent allocations
    cpuidle: using governor ladder
    cpuidle: using governor menu
    mux: initialized RTC_ALARM
    mux: Setting register RTC_ALARM
    mux:    PINMUX0 (0x00000000) = 0x44080000 -> 0x24080000
    No ATAGs?
    edma 1c00000.edma: memcpy is disabled
    edma 1c00000.edma: TI EDMA DMA engine driver
    edma 1e30000.edma: memcpy is disabled
    edma 1e30000.edma: TI EDMA DMA engine driver
    i2c_davinci i2c_davinci.1: could not find pctldev for node /soc@1c00000/pinmux@14120/pinmux_i2c0_pins, deferring probe
    pps_core: LinuxPPS API ver. 1 registered
    pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
    PTP clock support registered
    clocksource: Switched to clocksource timer0_1
    NET: Registered protocol family 2
    TCP established hash table entries: 1024 (order: 0, 4096 bytes)
    TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
    TCP: Hash tables configured (established 1024 bind 1024)
    UDP hash table entries: 256 (order: 0, 4096 bytes)
    UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
    NET: Registered protocol family 1
    RPC: Registered named UNIX socket transport module.
    RPC: Registered udp transport module.
    RPC: Registered tcp transport module.
    RPC: Registered tcp NFSv4.1 backchannel transport module.
    workingset: timestamp_bits=14 max_order=15 bucket_order=1
    Block layer SCSI generic (bsg) driver version 0.4 loaded (major 248)
    io scheduler noop registered (default)
    pinctrl-single 1c14120.pinmux: please update dts to use #pinctrl-cells = <2>
    pinctrl-single 1c14120.pinmux: 160 pins at pa fec14120 size 80
    Serial: 8250/16550 driver, 10 ports, IRQ sharing disabled
    console [ttyS2] disabled
    serial8250.2: ttyS2 at MMIO 0x1d0d000 (irq = 61, base_baud = 8250000) is a TI DA8xx/66AK2x
    console [ttyS2] enabled
    brd: module loaded
    libphy: Fixed MDIO Bus: probed
    davinci_mdio davinci_mdio.0: davinci mdio revision 1.5
    davinci_mdio davinci_mdio.0: detected phy mask fffffffd
    libphy: davinci_mdio.0: probed
    davinci_mdio davinci_mdio.0: phy[1]: device davinci_mdio.0:01, driver NatSemi DP83640
    i2c /dev entries driver
    davinci_mmc da830-mmc.0: Got CD GPIO
    davinci_mmc da830-mmc.0: Using DMA, 4-bit mode
    NET: Registered protocol family 10
    sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
    NET: Registered protocol family 17
    console [netcon0] enabled
    netconsole: network logging started
    davinci_emac davinci_emac.1: incompatible machine/device type for reading mac address
    davinci_emac davinci_emac.1: using random MAC addr: 62:be:90:db:39:e5
    mmc0: host does not support reading read-only switch, assuming write-enable
    input: gpio-keys as /devices/platform/gpio-keys/input/input0
    mmc0: new high speed SDHC card at address 0002
    mmcblk0: mmc0:0002 N/A   7.50 GiB 
     mmcblk0: p1 p2
    hctosys: unable to open rtc device (rtc0)
    random: fast init done
    EXT4-fs (mmcblk0p2): recovery complete
    EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
    VFS: Mounted root (ext4 filesystem) on device 179:2.
    devtmpfs: mounted
    Freeing unused kernel memory: 228K (c05e7000 - c0620000)
    This architecture does not have kernel memory protection.
    systemd[1]: System time before build time, advancing clock.
    systemd[1]: systemd 230 running in system mode. (+PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN)
    systemd[1]: Detected architecture arm.
    
    Welcome to Arago 2017.05!
    
    systemd[1]: Set hostname to <omapl138-lcdk>.
    systemd[1]: Created slice User and Session Slice.
    [  OK  ] Created slice User and Session Slice.
    systemd[1]: Reached target Remote File Systems.
    [  OK  ] Reached target Remote File Systems.
    systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
    [  OK  ] Started Dispatch Password Requests to Console Directory Watch.
    systemd[1]: Listening on /dev/initctl Compatibility Named Pipe.
    [  OK  ] Listening on /dev/initctl Compatibility Named Pipe.
    systemd[1]: Listening on Journal Socket (/dev/log).
    [  OK  ] Listening on Journal Socket (/dev/log).
    systemd[1]: Started Forward Password Requests to Wall Directory Watch.
    [  OK  ] Started Forward Password Requests to Wall Directory Watch.
    systemd[1]: Listening on Network Service Netlink Socket.
    [  OK  ] Listening on Network Service Netlink Socket.
    [  OK  ] Listening on Syslog Socket.
    [  OK  ] Created slice System Slice.
    [  OK  ] Created slice system-serial\x2dgetty.slice.
    [  OK  ] Created slice system-getty.slice.
    [  OK  ] Reached target Slices.
    [  OK  ] Listening on udev Control Socket.
    [  OK  ] Reached target Swap.
    [  OK  ] Listening on Journal Socket.
             Starting Create list of required st... nodes for the current kernel...
             Starting Load Kernel Modules...
             Starting Remount Root and Kernel File Systems...
    cryptodev: loading out-of-tree module taints kernel.
    cryptodev: driver 1.8 loaded.
             Starting Setup Virtual Console...
             Starting Journal Service...
    EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
             Mounting POSIX Message Queue File System...
             Mounting Temporary Directory...
    [  OK  ] Reached target Paths.
    [  OK  ] Listening on udev Kernel Socket.
             Mounting Debug File System...
    [  OK  ] Mounted POSIX Message Queue File System.
    [  OK  ] Mounted Debug File System.
    [  OK  ] Mounted Temporary Directory.
    [  OK  ] Started Create list of required sta...ce nodes for the current kernel.
    [  OK  ] Started Load Kernel Modules.
    [  OK  ] Started Remount Root and Kernel File Systems.
    [  OK  ] Started Setup Virtual Console.
    [  OK  ] Started Journal Service.
             Starting udev Coldplug all Devices...
             Starting Flush Journal to Persistent Storage...
             Starting Apply Kernel Variables...
             Starting Create Static Device Nodes in /dev...
    [  OK  ] Started Apply Kernel Variables.
    systemd-journald[64]: Received request to flush runtime journal from PID 1
    [  OK  ] Started Flush Journal to Persistent Storage.
    [  OK  ] Started Create Static Device Nodes in /dev.
             Starting udev Kernel Device Manager...
    [  OK  ] Reached target Local File Systems (Pre).
             Mounting /media/ram...
             Mounting /var/volatile...
    [  OK  ] Mounted /media/ram.
    [  OK  ] Mounted /var/volatile.
             Starting Load/Save Random Seed...
    [  OK  ] Reached target Local File Systems.
             Starting Create Volatile Files and Directories...
    [  OK  ] Started udev Kernel Device Manager.
    [  OK  ] Started Load/Save Random Seed.
    [  OK  ] Started Create Volatile Files and Directories.
             Starting Network Time Synchronization...
             Starting Update UTMP about System Boot/Shutdown...
    [  OK  ] Started Update UTMP about System Boot/Shutdown.
    [  OK  ] Started Network Time Synchronization.
    [  OK  ] Reached target System Time Synchronized.
             Starting Synchronize System and HW clocks...
    [FAILED] Failed to start Synchronize System and HW clocks.
    See 'systemctl status sync-clocks.service' for details.
    davinci-rproc davinci-rproc.0: assigned reserved memory node dsp_cma@c3000000
    remoteproc remoteproc0: dsp is available
    remoteproc remoteproc0: powering up dsp
    remoteproc remoteproc0: Booting fw image rproc-dsp-fw, size 4077796
    remoteproc remoteproc0: registered virtio0 (type 7)
    remoteproc remoteproc0: remote processor dsp is now up
    [  OK  ] Started udev Coldplug all Devices.
    [  OK  ] Reached target System Initialization.
    [  OK  ] Listening on D-Bus System Message Bus Socket.
    davinci-wdt davinci-wdt: heartbeat 60 sec
    [  OK  ] Listening on RPCbind Server Activation Socket.
    [  OK  ] Listening on dropbear.socket.
    [  OK  ] Reached target Sockets.
    [  OK  ] Reached target Basic System.
    [  OK  ] Started Kernel Logging Service.
    Linux video capture interface: v2.00
             Starting Login Service...
    OF: /sound/simple-audio-card,cpu: could not get #sound-dai-cells for /soc@1c00000/mcasp@100000
    0-0018 supply IOVDD not found, using dummy regulator
    0-0018 supply DVDD not found, using dummy regulator
    0-0018 supply AVDD not found, using dummy regulator
    0-0018 supply DRVDD not found, using dummy regulator
             asoc-simple-card sound: parse error -22
    Starting Ethernet Bridge Filtering Tables...
    asoc-simple-card: probe of sound failed with error -22
    [  OK  ] Started System Logger Daemon.
    tvp514x 0-005d: Write: retry ... 0
    tvp514x 0-005d: Write: retry ... 1
    tvp514x 0-005d: Write: retry ... 2
    tvp514x 0-005d: Write: retry ... 3
    tvp514x 0-005d: Write: retry ... 4
    tvp514x 0-005d: Write: retry ... 5
    [  OK  ] Started D-Bus System Message Bus.
    tvp514x 0-005d: tvp514x 0-005d decoder driver registered !!
    vpif_capture vpif_capture: registered sub device tvp514x-0
    tvp514x 0-005d: Write: retry ... 0
    tvp514x 0-005d: Write: retry ... 1
    tvp514x 0-005d: Write: retry ... 2
    tvp514x 0-005d: Write: retry ... 3
    tvp514x 0-005d: Write: retry ... 4
    tvp514x 0-005d: Write: retry ... 5
             Starting Network Service...
    [  OK  ] Started System Logging Service.
             Starting telnetd.service...
             Starting Print notice about GPLv3 packages...
             Starting tiipclad-daemon.service...
    [  OK  ] Started Daily Cleanup of Temporary Directories.
    [  OK  ] Reached target Timers.
    [  OK  ] Started Ethernet Bridge Filtering Tables.
    [  OK  ] Found device /dev/ttyS2.
    [  OK  ] Started telnetd.service.
    [  OK  ] Started Network Service.
    davinci_mdio davinci_mdio.0: resetting idled controller
    NatSemi DP83640 davinci_mdio.0:01: attached PHY driver [NatSemi DP83640] (mii_bus:phy_addr=davinci_mdio.0:01, irq=-1)
    IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
    [  OK  ] Started tiipclad-daemon.service.
    [  OK  ] Reached target Network.
             Starting Simple Network Management Protocol (SNMP) Daemon....
    [  OK  ] Started Vsftpd ftp daemon.
             Starting Permit User Sessions...
             Starting Lightning Fast Webserver With Light System Requirements...
    [  OK  ] Started strondavinci_emac davinci_emac.1 eth0: Link is Up - 100Mbps/Full - flow control rx/tx
    gSwan IPsec IKEvIPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
    1/IKEv2 daemon using ipsec.conf.
             Starting Network Name Resolution...
             Starting thttpd.service...
    [  OK  ] Started Permit User Sessions.
    [  OK  ] Started Lightning Fast Webserver With Light System Requirements.
    FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
    [  OK  ] Started Network Name Resolution.
    [  OK  ] Started thttpd.service.
    [  OK  ] Started Login Service.
             Starting rng-tools.service...
    [  OK  ] Started Serial Getty on ttyS2.
    [  OK  ] Started Getty on tty1.
    [  OK  ] Reached target Login Prompts.
    random: crng init done
    
    
     _____                    _____           _         _   
    |  _  |___ ___ ___ ___   |  _  |___ ___  |_|___ ___| |_ 
    |     |  _| .'| . | . |  |   __|  _| . | | | -_|  _|  _|
    |__|__|_| |__,|_  |___|  |__|  |_| |___|_| |___|___|_|  
                  |___|                    |___|            
    
    Arago Project http://arago-project.org omapl138-lcdk ttyS2
    
    Arago 2017.05 omapl138-lcdk ttyS2
    
    virtio_rpmsg_bus virtio0: rpmsg host is online
    omapl138-lcdk login: nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xcc
    nand: Micron MT29F4G16ABADAH4
    nand: 512 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
    Bad block table not found for chip 0
    Bad block table not found for chip 0
    Scanning device for bad blocks
    Bad block table written to 0x00001ffe0000, version 0x01
    Bad block table written to 0x00001ffc0000, version 0x01
    3 ofpart partitions found on MTD device davinci-nand.0
    Creating 3 MTD partitions on "davinci-nand.0":
    0x000000000000-0x000000020000 : "u-boot env"
    0x000000020000-0x0000000a0000 : "u-boot"
    0x0000000a0000-0x000020000000 : "free space"
    davinci_nand davinci-nand.0: controller rev. 2.5
    ***************************************************************
    ***************************************************************
    NOTICE: This file system contains the following GPLv3 packages:
    	autoconf
    	binutils
    	cpp-symlinks
    	cpp
    	dosfstools
    	g++-symlinks
    	g++
    	gawk
    	gcc-symlinks
    	gcc
    	gdb
    	gdbserver
    	gstreamer1.0-libav
    	hidapi
    	libgmp10
    	libidn11
    	libmpc3
    	libmpfr4
    	libreadline6
    	m4
    	make
    	nettle
    
    If you do not wish to distribute GPLv3 components please remove
    the above packages prior to distribution.  This can be done using
    the opkg remove command.  i.e.:
        opkg remove <package>
    Where <package> is the name printed in the list above
    
    NOTE: If the package is a dependency of another package you
          will be notified of the dependent packages.  You should
          use the --force-removal-of-dependent-packages option to
          also remove the dependent packages as well
    ***************************************************************
    ***************************************************************
    

  • Hi Sahin and Rex, thanks a lot for all the support on this issue. This does work ;)
    Thanks a lot. (Had to rebuild zImage as well to get this working)