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.

关于Keystone中逻辑地址与物理地址的映射关系

Hi 大家好。

     关于K2芯片中的DDR_3A与DDR3B的地址空间,我有一些疑问,请各位专家解惑。

     首先,我理解对DSP核来说,其使用的都是32位的逻辑地址。经过corepac中XMC的MPAX进行address extension后变成36位物理地址。而对于SOC来说,32位逻辑地址经过MSMC的MPAX后变成36位物理地址。在DSP复位后,默认的XMC中MPAX设置为:

         0x0000 0000 - 0x7fff ffff,映射到0:0000 0000 - 0:7fff ffff。

         0x8000 0000 - 0xffff ffff,映射到8:0000 0000 - 8:7fff ffff

     而SES中的MPAX: 

         0x8000 0000 - 0xffff ffff,映射到8:0000 0000 - 8:7fff ffff

     以上理解如有错误请指出。

     根据上面的理解,对照数据手册中的地址空间,如果没有做额外的MPAX设置,我的问题:

1.    DSP访问逻辑地址0x6000 0000-0x7fff ffff会映射到00 6000 0000的DDR3B的空间。而SOC, 比如EDMA,我有些迷惘,因为SES的MPAX中并没有直到SES对于0x8000 0000以下地址的映射。此时,如果SOC访问0x6000 0000地址,会发生什么?(比如EDMA的dst addr设为0x6000 0000)

2.  对于00 8000 0000物理地址空间,DSP与SOC的view不相同。此时如果SES与XMC中都将 0x8000 0000 - 0xffff ffff,映射到0:0000 0000 - 0:7fff ffff,即将相同的逻辑地址(如0x8000 0000)映射到相同的物理地址(如00 8000 0000),但实际上这个物理地址对DSP是在DDR3B上,对SOC是在DDR3A,此时就会出现DSP与SOC访问同一地址但实际并不是同一个内存单元的问题,这感觉很奇怪啊。请问如何理解这一点?是不是需要将SES与XMC的配置不同才能解决这一问题?

3. 对于DDR3A的配置空间,是在01 2100 0000物理地址。复位后的DSP MPAX并没有这一地址的映射。是不是DSP需要先自己设置XMC中的 MPAX才能对DDR_3A进行配置?还是说也有默认的配置已经做好了?如果有,是在哪里配的?多谢。

    

  • K2里的地址映射确实有点复杂。

    我们先看SOC部分(指除CPU外的其它Masters,EDMA)。SOC产生的访问地址是32-bit的,它访问的地址空间分三类:

    1. 0x0C000000~0x0FFFFFFF,对这个空间的访问请求会被送给SMSSMS中的MPAX可以被配置来把这个地址范围的访问映射到MSRAM
    2.  0x80000000~0xFFFFFFFF,对这个空间的请求会被送到SESSES中的MPAX可以被配置来把这个地址范围的访问映射到DDR3A
    3. 对所有其他空间(包括DDR3B0x60000000~0x7FFFFFFF)都是直接访问的,也就是说没有软件可配的地址映射的功能。

    再来看DSP核,它产生的访问地址是32-bit的,它访问的地址空间分三类:

    1.  <0x0C000000,主要是内核寄存器和外设寄存器,都是直接访问的,也就是说没有软件可配的地址映射的功能。
    2. 0x0C0000000x0CFFFFFF,直接访问MSRAM,也没有软件可配的地址映射的功能。
    3. 0x0D0000000xFFFFFFFF。这个地址范围的访问请求会被送给XMC MPAX,我们可通过XMC MPAX配置映射到DDR3ADDR3B, MSMC或其它外设的数据端口。

    所有不经过MPAX (MSMC)的访问,我们可以说它的物理地址和虚拟地址是一样的。只有经过MAPX (MSMC)的访问才会有虚拟地址和物理地址的区别。前面已经总结了各个MPAX可能的输入地址(虚拟地址),我们再来总结一下MPAX的输出地址(物理地址)。

    地址空间

    被访问模块

    00:0C000000~00:0FFFFFFF

    MSRAM

    00:10000000~00:5FFFFFFF

    外设数据端口,所有DSP核的LL2

    00:60000000~00:7FFFFFFF

    DDR3B的前256MB,与00:80000000~00:9FFFFFFF  访问相同DDR3B空间

    00:80000000~00:FFFFFFFF

    DDR3B

    01:21010000~01:210101FF

    DDR3A 寄存器

    08:00000000~09:FFFFFFFF

    DDR3A

    DSP核访问DDR3A配置寄存器是需要通过MPAX映射的,一般K2器件缺省的映射里有,如下图是我在K2H EVM上查到的缺省配置。

    ARM访问方式不同,ARM核内有MMU,从ARM CorPac送到MSMC的地址已经是36-bit物理地址,ARM访问的物理地址空间又受DDR3A_REMAP_EN的影响,下面是总结。

    地址空间

    DDR3A_REMAP_EN=0

    DDR3A_REMAP_EN=1

    00:0C000000~00:0FFFFFFF

    MSRAM

    00:10000000~00:5FFFFFFF

    外设数据端口,所有DSP核的LL2

    00:60000000~00:7FFFFFFF

    DDR3B的前256MB (00:80000000~00:9FFFFFFF  访问相同DDR3B空间)

    DDR3B

    00:80000000~00:FFFFFFFF

    DDR3B

    DDR3A2GB(08:00000000~08:7FFFFFFF访问相同DDR3A空间)

    01:21010000~01:210101FF

    DDR3A 寄存器

    08:00000000~09:FFFFFFFF

    DDR3A

    DDR3A_REMAP_EN=0时,ARM访问的物理地址空间和通过MPAX访问的物理地址空间基本相同。

     要更深入的理解,建议研究一下数据手册中的“7 System Interconnect”。

  • 多谢,非常详尽而且清晰的解答。

  • 另外,Brighton,对于DSP, “0x0C0000000x0FFFFFFF,直接访问MSRAM,也没有软件可配的地址映射的功能。”请你再确认一下。从dsp corepac手册上来看,0x0C000000以上的空间,都是可以通过MPAX配置的。正如我原帖中的提起过,只是在复位以后,MPAX0和MPAX1已经默认配好了他们的映射。不需要我们更改。但实际上,这部分还是可以配置的(或者直接修改MPAX0和MPAX1,或者通过设置MPAX2~15来覆盖)。参见sprugw0b的figure 7-10, pg148。

  • 上次给的信息不是很准确。

    MSRAM可以被映射到0x0D000000以上的以上的任何虚拟地址空间,但虚拟地址“0x0C0000000x0CFFFFFF”不能被映射到其它物理空间。下面是DSP核的不可重映射的空间的详细总结:

    Address Range

    Size

    Description

    0000_0000 07FF_FFFF

    128MB

    Accesses to addresses 0000_0000 to 07FF_FFFF are decoded internally to C66x Megamodule and not sent to XMC. This address range includes the internal and external configuration busses, as well as the L1D, L1P and L2 memories.

    0800_0000 0BFF_FFFF

    64MB

    accesses to 0800_0000 through 0BFF_FFFF are considered accesses to XMC memory mapped control registers. These addresses never match any segment. The MPAX unit does not modify these addresses, nor does it perform a segment-based protection check for accesses in this range, regardless of whether a segment overlaps this range.

    0C00_0000

    0CFF_FFFF

    16MB

    C66x Megamodule expects accesses in the address range to go to MSMC RAM, and uses this information to place the request on a “Fast RAM” path, eliminating a cycle of latency.

  • 我明白了,在sprugw0b的7.3.2.2.1中,明确说明,对于0x0C00 0000-0x0x0CFF FFFF是强制映射36位中的高12位为00C的,已经解答了我上面的问题。

  • 好贴一定要顶!

    Br

    William.dong@enea.com

  • 中断向量配置正确,确认一下
  • 受益匪浅,感谢非常!