magiclantern_simplified icon indicating copy to clipboard operation
magiclantern_simplified copied to clipboard

Digic X: New memory handling

Open kitor opened this issue 2 years ago • 0 comments

R5 has a total of 5(?)GB of RAM. There's no ARM PAE enabled. According to MPU tables, there's almost DIGIC8 mapping (see #80) so 1 gig of cacheable RAM mirrored to 1G uncacheable + almost another 1G of uncacheable.

FIO function gained a few new entries: ReadIBus and WriteIBus. There's some translation going on, as BufferAddr is CPUAddr[%#x:%#x]

Digic X is missing "old" SRM / RscMgr at all. A few stubs that exist here and there are just dummy functions that throw an error or assert.

debug_assert(0,"Resource::RscMgrOldApiStub.c",0x2b);

System is substituted by RscMgr2. No smemshowfix command - replaced by res_memshow <int>.

Example output:

res_memshow 4
     4022:  26713.744 [RSCC] ===== Map 0
     4023:  26713.749 [RSCC] ----- Allocated -----
     4024:  26713.753 [RSCC] USER_RENDERING_WORK
     4025:  26713.756 [RSCC] USER_RENDERING_IMAGE_WORK
     4026:  26713.758 [RSCC] USER_BMPVRAM
     4027:  26713.761 [RSCC] USER_AE_WORK
     4028:  26713.763 [RSCC] USER_AE_ENGINE_WORK
     4029:  26713.765 [RSCC] USER_DAF_RAW
     4030:  26713.767 [RSCC] USER_IMGVRAM_1
     4031:  26713.769 [RSCC] USER_IMGVRAM_2
     4032:  26713.771 [RSCC] USER_IMGVRAM_3
     4033:  26713.773 [RSCC] USER_IMGVRAM_4
     4034:  26713.776 [RSCC] USER_STILL_LV_WORK_1
     4035:  26713.778 [RSCC] USER_STILL_LV_WORK_2
     4036:  26713.780 [RSCC] USER_STILL_LV_WORK_3
     4037:  26713.784 [RSCC] USER_INDEXVRAM
     4038:  26713.786 [RSCC] USER_META_STORE_WORK
     4039:  26713.788 [RSCC] USER_DEFECT_PIX_BUF
     4040:  26713.791 [RSCC] USER_TVAF_WORK
     4041:  26713.793 [RSCC] USER_IBP_DATA
     4042:  26713.795 [RSCC] USER_AF_PINTDATA
     4043:  26713.799 [RSCC] USER_HDMI_RAW_META_STORE_WORK
     4044:  26713.801 [RSCC] USER_MEM3_CH2_B
     4045:  26713.805 [RSCC] ------ Waiting ------
     4046:  26713.815 [RSCC] =====

===

Some functions report addresses in form of more-than-32bit values:

K421[1]>VramRead
     3909:   7226.072 [DISP] PNL Addr:0x300000000 W:1024 H:682
channel = Peripheral::MemifCommon::CheckIbusAddress((layer->ibus).lo,(layer->ibus).hi,"Ximr/XimrApiSub.c",480);
Peripheral::MemifArbiter::MemifCheckPriority(channel,1);
buf = Peripheral::MemifCommon::CheckIbusAddress((layer->ibus).lo,(layer->ibus).hi,"Ximr/XimrApiSub.c",480);
Peripheral::MemifSelfRefresh::FUN_e08c7dfc(buf);

Number above bit 31 seems to be related to "ibus address", as:

      if (((size != 0x80000000) && (size != 0x20000000)) && (size != 0x40000000)) {
        bl_printf("Unexpected Size : %08x\n");
        return 1;
      }

Interesting function name: SystemIF::MapCpuBuffer.c MapCpuBufferToIbusBuffer(), UnmapCpuBuffer() seems to suggest there's some memory banking happening?

dibus evshell command may give a clue how to at least read other ibus channels(?):

K421[1]>dibus
0x100000000:     04 f0 1f e5 00 00 00 e0  - 00 00 00 00 01 00 00 00 
0x100000010:     c6 01 00 00 00 60 fc df  - 28 76 19 00 88 be 2a 00 
0x100000020:     7c ab 2a 00 7c ea 0f 00  - 28 ab 2a 00 00 00 00 00 
0x100000030:     fe 7f ff df fe ff ff ff  - fe ff df ff fb ff ff 7f 
0x100000040:     bd db df ff f8 5f fe ff  - ea ff ff ff ef ff ef bd 
0x100000050:     7f ff df ff df 7f ff fe  - fb fd fe fc df fe d7 ff 
0x100000060:     ff fe ff 7f fb ff fd 7f  - fe ff ff fc ff fe cf fd 
0x100000070:     ff ff f5 fd ff 7f ff ff  - fd d2 ff ff ff ff ff ff 
0x100000080:     ff 7f ff ba df fd fd ff  - df bf fd bb e7 3b ff ff 
0x100000090:     ff fd fe ff ef ff ff ff  - f7 ff ff df ff ff ef fb 
0x1000000a0:     ff ef d5 ff fe ff fe f7  - ff 2f df ff ff 7f bf ff 
0x1000000b0:     ff ff fd ff fb ef ff ff  - ff 7f f7 7f ff ff fb ff 
0x1000000c0:     ff 7a f7 3f af 7f df ff  - ff fe df ff cf df ff f9 
0x1000000d0:     ff d7 ff ff ff df ee ff  - ff ff ef f9 ff ef ff ff 
0x1000000e0:     f7 ff de f4 bf fb dd fb  - df fe 7f fd fa fd db dd 
0x1000000f0:     df fb ff ff f5 ef ff df  - ff fb ff ce ff ee ff e5 
 dibus returned 256(0x100)
K421[1]>dibus 2
0x200000000:     06 01 00 00 00 22 01 60  - 01 ff ff a0 00 00 00 00 
0x200000010:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000020:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000030:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000040:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000050:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000060:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000070:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000080:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x200000090:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x2000000a0:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x2000000b0:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x2000000c0:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x2000000d0:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x2000000e0:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
0x2000000f0:     00 00 00 00 00 00 00 00  - 00 00 00 00 00 00 00 00 
 dibus returned 256(0x100)
K421[1]>dibus 3
0x300000000:     fd 25 c0 df 04 fa 51 50  - 5f 03 fc 29 c0 df 02 03 
0x300000010:     56 40 9f 04 02 4e 40 5f  - 04 ff 29 a0 df 01 00 1e 
0x300000020:     e0 9f 04 fa 45 90 1f 03  - fd 25 d0 df 01 0b 2e 10 
0x300000030:     20 02 14 1e f0 9f 02 1a  - 3e 50 e0 04 08 56 e0 1f 
0x300000040:     04 ff 35 70 9f 04 ff 35  - a0 1f 02 00 16 00 a0 01 
0x300000050:     fb 41 90 1f 04 fc 31 80  - 5f 02 00 1a e0 5f 03 fc 
0x300000060:     41 e0 20 05 fb 45 c0 e1  - 04 fd 59 80 62 04 ff 21 
0x300000070:     a0 a0 02 fe 35 70 5f 03  - ff 21 a0 1f 02 ff 29 c0 
0x300000080:     1f 02 00 46 d0 5f 02 01  - 1a 10 e0 03 03 4e e0 1f 
0x300000090:     04 06 36 d0 5f 02 02 2a  - d0 9f 02 fd 1d 00 e0 01 
0x3000000a0:     ff 19 20 a0 01 05 1a e0  - 1f 01 03 12 e0 df 01 02 
0x3000000b0:     22 20 60 02 0d 22 10 a0  - 01 06 1a 10 a0 02 fe 31 
0x3000000c0:     c0 df 02 01 2a a0 9f 01  - ff 2d a0 df 04 fa 4d 40 
0x3000000d0:     5f 03 04 22 e0 df 01 03  - 1e 50 e0 01 00 1e 40 60 
0x3000000e0:     04 01 36 10 60 03 fc 51  - 30 df 03 fc 35 b0 df 03 
0x3000000f0:     00 56 00 9f 05 fe 51 20  - 1f 03 fb 29 d0 df 01 fc

In fact, while looking for existing XCM layer data it was on "2nd" IBus:

K421[1]>dryshDry[DivaPUX]> Dry[DivaPUX]> xd 0x22788900
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
22788900: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788910: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788920: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788930: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788940: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788950: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788960: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788970: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788980: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
22788990: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
227889a0: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
227889b0: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
227889c0: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
227889d0: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
227889e0: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
227889f0: 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff  ................
K421[1]>dibus 2 0x22788900 
0x222788900:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788910:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788920:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788930:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788940:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788950:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788960:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788970:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788980:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x222788990:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x2227889a0:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x2227889b0:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x2227889c0:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x2227889d0:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x2227889e0:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 
0x2227889f0:     00 00 00 ff 00 00 00 ff  - 00 00 00 ff 00 00 00 ff 

On older models there's a family of MEMIF functions. On R5 those are completely different when compared to any DIGIC 8 model + reference a lot of IBus addresses. Memif/MemifDynamicWindow.c, Peripheral::MemifDynamicWindow.c

When attempting to allocate own buffer for XCM, Assert went from MemifArbiter:

     4016:    962.031 Canon layer: 0x22ff8900
     4017:    962.036 Found 2 layers
     4018:    970.731 Our layer: 0x01ef7700
     4178:   1026.219 [DEVICE] ERROR MemifCheckPriority Invalid Priority!!
     4179:   1026.225 [DEVICE] ERROR pid(1) is not registered in DRAM-Ch1
     4180:   1026.243 [STARTUP] ERROR ASSERT : Peripheral::MemifArbiter.c
     4181:   1026.248 [STARTUP] ASSERT : Task = CtrlSrv
     4182:   1026.250 [STARTUP] ASSERT : Core 0
     4183:   1026.252 [STARTUP] ASSERT : Line 133
     4184:   1026.258 [STARTUP] < StackDump >

kitor avatar Jan 26 '23 22:01 kitor