aarch64的TCR寄存器介绍

文章目录

★★★个人博客导读首页—点击此处 ★★★

相关文章
1、ARM架构中MMU/TLB/Cache的一些概念和寄存器
2、ARMV8-aarch64的MMU学习笔记

一、TCR寄存器

在ARM Core中(aarch64),还有几个相关的系统寄存器:

  • TCR_EL1 banked
  • TCR_EL2
  • TCR_EL3
    aarch64的TCR寄存器介绍
比特位 功能 说明
ORGN1、IRGN1、ORGN0、IRGN0 cache属性** outer/inner cableability的属性(如直写模式、回写模式)
SH1、SH0 cache的共享方式 cache的共享属性配置(如non-shareable, outer/inner shareable)
TG0/TG1 Granule size Granule size(其实就是页面的大小,4k/16k/64k)
IPS 物理地址size 物理地址size,如32bit/36bit/40bit
EPD1、EPD0 - TTBR_EL1/TTBR_EL0的enable和disable
TBI1、TBI0 - top addr是ignore,还是用于MTE的计算
A1 - ASID的选择,是使用TTBR_EL1中的,还是使用TTBR_EL0中的
AS - ASID是使用8bit,还是使用16bit
(1)、T1SZ、T0SZ
  • T1SZ, bits [21:16] 通过TTBR1寻址的内存区域的大小偏移量,也就是TTBR1基地址下的一级页表的大小
  • T0SZ, bits [5:0]
(2)、ORGN1、IRGN1、ORGN0、IRGN0

aarch64的TCR寄存器介绍
其实可以总结为这样:
aarch64的TCR寄存器介绍

(3)、SH1、SH0

SH1, bits [29:28]
SH0, bits [13:12]
aarch64的TCR寄存器介绍
其实可以总结为这样:
aarch64的TCR寄存器介绍
Shareable的很容易理解,就是某个地址的可能被别人使用。我们在定义某个页属性的时候会给出。Non-Shareable就是只有自己使用。当然,定义成Non-Shareable不表示别人不可以用。某个地址A如果在核1上映射成Shareable,核2映射成Non-Shareable,并且两个核通过CCI400相连。那么核1在访问A的时候,总线会去监听核2,而核2访问A的时候,总线直接访问内存,不监听核1。显然这种做法是错误的。

对于Inner和Outer Shareable,有个简单的的理解,就是认为他们都是一个东西。在最近的ARM A系列处理器上上,配置处理器RTL的时候,会选择是不是把inner的传输送到ACE口上。当存在多个处理器簇或者需要双向一致性的GPU时,就需要设成送到ACE端口。这样,内部的操作,无论inner shareable还是outershareable,都会经由CCI广播到别的ACE口上。

(4)、TG0/TG1 - Granule size

aarch64的TCR寄存器介绍

(5)、IPS

aarch64的TCR寄存器介绍

(6)、EPD1、EPD0

aarch64的TCR寄存器介绍

(7)、TBI1、TBI0

aarch64的TCR寄存器介绍

(8)、A1

aarch64的TCR寄存器介绍

(10)、AS

aarch64的TCR寄存器介绍

除了以上介绍的bit之外,剩余的bit都是特有功能使用或reserved的
aarch64的TCR寄存器介绍

二、示例展示

1、设置inner/outer cache的属性(只写模式/回写模式/write allocate/No-write allocate)

如下代码所示,设置

#define TCR_IRGN_WBWA		((UL(1) << 8) | (UL(1) << 24))   //使用TTBR0和使用TTBR1时后的inner cache的属性设置

#define TCR_ORGN_WBWA		((UL(1) << 10) | (UL(1) << 26))   //使用TTBR0和使用TTBR1时后的outer cache的属性设置

#define TCR_CACHE_FLAGS	TCR_IRGN_WBWA | TCR_ORGN_WBWA   // inner + outer cache的属性值


ENTRY(__cpu_setup)
......
	/*
	 * Set/prepare TCR and TTBR. We use 512GB (39-bit) address range for
	 * both user and kernel.
	 */
	ldr	x10, =TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \
			TCR_TG_FLAGS | TCR_ASID16 | TCR_TBI0 | TCR_A1
	tcr_set_idmap_t0sz	x10, x9

......
	msr	tcr_el1, x10
	ret					// return to head.S
ENDPROC(__cpu_setup)

属性设置了1,也就是回写模式、write allocate模式
aarch64的TCR寄存器介绍

上一篇:davfs 移植到android 踩坑之旅


下一篇:Qcom平台,dump解析环境配置