0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

EC SRAM映射到CPU Memory空间的共享内存设计

CHANBAEK 来源: 吃面小哥 作者: 吃面小哥 2023-11-18 15:11 次阅读

ShareMemory,顾名思义就是共享内存。这个概念在很多计算机系统中都存在,本文特指 EC SRAM 映射到 CPU Memory 空间的共享内存设计。

01—ShareMemory 简介

此处的 ShareMemory 特指,在 EC 和 CPU(x86/ARM) 通过 eSPI/LPC 总线连接的系统中,EC SRAM 映射到 Host Memory 空间。当 Host 端需要访问 EC SRAM 时,就和访问 Host 的 Memory 一样简便。

ShareMemory 的设计极大提高了CPU 和 EC 之间的数据传输效率。

eSPI/LPC 的 Master Controller,一般作为一个 PCI 设备存在。因此可以通过修改 eSPI/LPC Controller 的 PCI 配置空间寄存器将指定的 IO 空间和 Memory 空间等资源分配给 eSPI/LPC Master Controller。

当 OS 或者应用软件通过 CPU 指令访问指定 IO端口,或者访问指定 Memory 地址时,访问操作会被转发至 eSPI/LPC 的

Controller。最终由 eSPI/LPC Controller

生成通讯协议发送给 eSPI/LPC 总线上连接的从设备,如下图所示。

图片

eSPI/LPC Slave 一般有 EC、BMC、SIO 等。以EC 为例,当从设备接到 eSPI/LPC 总线上的 Memory Cycle后,eSPI/LPC Slave Controller 就会解码 Memory 地址。

如果发现该地址在配置的Memory 空间内,eSPI/LPC Slave Controller 就会把数据写入指定的 SRAM,或者将指定SRAM 的值返回。如此就完成了 EC SRAM 映射到 CPU Memory 空间,这就是 EC ShareMemory 实现的原理。

图片

02—CPU 端的配置

由于设计上的差异,不同 CPU 针对

ShareMemory 的配置有所不同。

x86 Intel 平台

在 Intel 平台上,eSPI 和 LPC Controller 都是作为一个 PCI 设备存在,两个控制器的 PCI 设备号一致,都是B0:D31:F0,实际使

用时二选一。

如下图所示,配置 Offset 98h 寄存器,即可把 CPU 的指定Memory 空间分配给

eSPI/LPC Master Controller。

图片

图片

x86 AMD 平台

在 AMD 平台上 eSPI 的配置寄存器先被映射到指定的 Memory 空间。配置eSPI MMIO 寄存器即可把指定的CPU Memory 空间分配给 eSPI 控制器。eSPI 配置空间基地址为 0xFEC2_0000,MMIO 基地址配置寄存器为 Offset 50/54/58/5C,长度配置寄存器为 Offset 60/64。

图片

图片

注意 : 此处的寄存器配置后直接生效。

ARM Phytium 平台

飞腾平台上的 LPC Controller 作为一个外设存在,支持 DMA模式、IO模式、

Memory模式、FirmwareMemory 模式。

由寄存器 INT_APB_SPCE_CONF 配置,每个模块占用Memory 空间大小为 32M。

如下表格所示访问 CPU Memory 空间 0x20000062,会发起 LPC 的 IO Cycle(IO Port 62)。

访问 CPU Memory 空间 0x22000000,

会发起 LPC 的 Memory Cycle。

LPC Controller 的 CPU Memory 资源划分如下:

模块基地址
IO0x20000000
Memory0x22000000
FirmwareMemory0x24000000
DMA0x26000000

其他 CPU 平台

eSPI/LPC Master Controller 的资源分配方法在不同的 CPU 平台上都不一样,需要

根据 CPU 指导手册完成配置。

03—EC 端的配置

EC 的硬件设计中,一般有个

ShareMemory Controller,作为一个SIO设备存在,负责处理 eSPI/LPC 总线上的 Memory Cycle。

EC 端有如下两个参数需要配置:

第一,指定可识别的 Host 端的Memory 基地址。这就指明了 EC 可解码的

Host Memory 起始地址。配置寄存器一般位于 SIO 配置空间。

第二,指定EC端匹配的 SRAM 基地址和长度。这就指明了 EC 端的某段

SRAM 空间被映射到 Host Memory 空间。配置寄存器一般位于 EC 的

ShareMemory Controller 内。

上述2个配置参数的配置方法以及寄存器位置,查阅对应 EC 芯片的用户手册即可获取。如下图所示,是基于 eSPI 总线实现

ShareMemory 访问功能后,Host 读写

EC SRAM 的通讯波形。

图片

图片

EC 端和 CPU 端都完成相应配置后,在OS 下访问 Memory 即可访问到指定的 EC SRAM 存储区间。

下图 Intel ADL 平台和 EC 的配置结果,最终实现了 EC SRAM 0x300映射到

Host Memory 空间的 0xFE800300 位置。

图片

下图是 AMD Ryzen7840 平台和 EC 配置结果,最终实现了 EC

SRAM 0x300 映射到 Host Memory 空间的 0xFE0B0300 位置。

图片

04—ShareMemory 的应用

ShareMemory 的目的就是把 EC 的 SRAM 存储映射到 CPU Memory 空间,如此 CPU 就可以快速完成大量的 EC 数据访问。使用 EC 端提供的

ShareMemory Semaphore,Host 访问完 EC SRAM 还可以通知 EC 内核。

ACPI 规范定义的 ECI 也可以访问 EC SRAM,但是涉及到状态位的等待同步,访问速度没有 ShareMemory 快。

因此 Host 和 EC 之间有大量数据需要传递的时候,ShareMemory 就是第一方案。当然EC SRAM也可以映射到 CPU的 IO 空间,实现原理一样。只是方向 CPU IO端口,最终会在eSPI/LPC 总线上发起 IO Cycle,EC端接到后按映射关系转换为 SRAM的访问即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8651

    浏览量

    361816
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206564
  • sram
    +关注

    关注

    6

    文章

    742

    浏览量

    113902
  • 计算机
    +关注

    关注

    19

    文章

    6649

    浏览量

    84533
  • 共享内存
    +关注

    关注

    0

    文章

    16

    浏览量

    8278
收藏 人收藏

    评论

    相关推荐

    虚拟机:linux高端内存管理之永久内核映射

    与直接映射的物理内存末端、高端内存的始端所对应的线性地址存放在high_memory变量中,在x86体系结构上,高于896MB的所有物理内存
    的头像 发表于 06-23 08:38 3393次阅读
    虚拟机:linux高端<b class='flag-5'>内存</b>管理之永久内核<b class='flag-5'>映射</b>

    如何将共享代码映射到DSPR5以及将其映射到其他RAM区域?

    Scratch-Pad SramCPU5 DSPR)相关联。 在链接器脚本中,我已经映射了每个.text 部分移至其各自的 PSPR 内核。 我想知道如何将共享代码
    发表于 01-24 07:26

    Linux的mmap文件内存映射机制

    一。mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通
    发表于 03-08 09:54

    请问如何在platform文件中实现将msmc映射到0xa0000000起始的地址空间中?

    用openmp时讲到,需要将共享的变量放到no cacheable的空间中。对于6678片子来讲,如果想要放到共享内存中,要么将msmc全部设为no cacheable,或者将部分ms
    发表于 07-24 08:40

    mmap()函数映射到内存中出现bus error的错误

    在2440开发板上将一副BMP图片显示到LCD上(不用GUI),我的做法是将BMP图片用mmap()函数映射到内存中,在将其读到Framebuffer设备中显示(frambuffer有驱动),映射
    发表于 02-25 12:42

    为何启动模式为SRAM时0x20000000不会映射到0x00000000 ?

    0x00000000BOOT0:1,BOOT1:1时为SRAM启动,但0x20000000不会映射到0x00000000,在0x00000000区域看到的资料都是0xAA,我设置BOOT0:1,BOOT1:1 SRAM模式
    发表于 07-29 04:35

    使用UARTLite IP如何找到内存映射IO方法

    ); if(memfd == -1){printf(“无法打开/dev/mem.\n”);出口(0); } printf(“/ dev / mem opens。\ n”);//将一页内存映射到用户空间,以便
    发表于 04-16 10:07

    linux如何共享内存实验

    ;);  del_sem(semid);  exit(1);  }  /* 将共享内存地址映射到当前进程地址空间 */  shared_memory
    发表于 06-08 07:47

    共享内存知识记录

    最近学习了共享内存,做笔记记录一下。 预计会补全 信号量和消息队列。我理解的共享内存共享内存
    发表于 12-15 06:37

    地址总线是要映射到FPGA的内部还是直接ARM的内存空间

    ARM跟FPGA通信,要采用8位地址总线、8位数据总线、读写控制线,怎么实现,地址总线是要映射到FPGA的内部还是直接ARM的内存空间?最好有ARM端简单的C程序描述下,谢谢。
    发表于 11-22 14:58

    STM32G0将地址0x00000000重新映射到SRAM不起作用咋办

    ();__HAL_SYSCFG_REMAPMEMORY_SRAM();不幸的是,这不起作用,0x00000000 仍然映射到 FLASH。如果我尝试重新映射到系统内存,它工作得很好:_
    发表于 12-22 06:18

    ESP32-D0WDR2-V3带外接flash和emmc,外部闪存将无法将内存映射到cpu内存空间是怎么回事?

    用途。” 这似乎暗示相关的引脚(SD_DATA0-3、SD_CLK、GPIO16)被嵌入式PSRAM使用,不能连接到外部闪存或emmc。任何人都可以确认是否是这种情况?但是如果不使用这些 PIN,外部闪存将无法将内存映射到 cpu
    发表于 04-12 06:01

    浅析linux内存映射原理

    内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间
    发表于 08-24 09:35 1476次阅读
    浅析linux<b class='flag-5'>内存</b><b class='flag-5'>映射</b>原理

    世上最好的共享内存(Linux共享内存最透彻的一篇)上集

    现阶段广泛应用于多媒体、Graphics领域的共享内存方式,某种意义上不再强调映射到进程虚拟地址空间的概念(那无非是为了让CPU访问),而更
    的头像 发表于 11-29 14:29 1.8w次阅读

    内存是怎么映射到物理地址空间的?内存是连续分布的吗?

    如果我们将两个4G内存插入内存插槽,得到的内存地址空间是0到8G吗?是不是0到4G是第一根内存,4到8G是第二根
    的头像 发表于 06-30 15:59 2029次阅读
    <b class='flag-5'>内存</b>是怎么<b class='flag-5'>映射到</b>物理地址<b class='flag-5'>空间</b>的?<b class='flag-5'>内存</b>是连续分布的吗?