首页 > 其他分享 >__arm_smmu_tlb_sync调用过程

__arm_smmu_tlb_sync调用过程

时间:2024-10-20 23:43:13浏览次数:6  
标签:__ smmu SMMU sync tlb ARM arm

__arm_smmu_tlb_sync调用过程

这个函数分别在两处地方被调用:

  • arm_smmu_tlb_sync_global
#define ARM_SMMU_GR0(smmu)		((smmu)->base)
#define ARM_SMMU_GR0_sTLBGSYNC		0x70
#define ARM_SMMU_GR0_sTLBGSTATUS	0x74
static void arm_smmu_tlb_sync_global(struct arm_smmu_device *smmu)
{
	void __iomem *base = ARM_SMMU_GR0(smmu);
	unsigned long flags;

	spin_lock_irqsave(&smmu->global_sync_lock, flags);
	__arm_smmu_tlb_sync(smmu, base + ARM_SMMU_GR0_sTLBGSYNC,
			    base + ARM_SMMU_GR0_sTLBGSTATUS);
	spin_unlock_irqrestore(&smmu->global_sync_lock, flags);
}

1、通过ARM_SMMU_GR0(smmu)宏获取SMMU的基地址,将其存储在base变量中。

2、调用arm_smmu_tlb_sync函数,传入全局同步寄存器TLBGSYNC和状态寄存器TLBGSTATUS的地址。这个函数通常负责发起TLB的同步操作,并检查同步的状态。

  • arm_smmu_tlb_sync_context
#define ARM_SMMU_CB(smmu, n)	((smmu)->cb_base + ((n) << (smmu)->pgshift))
#define ARM_SMMU_CB_S1_TLBIASID		0x610
static void arm_smmu_tlb_inv_context_s1(void *cookie)
{
	struct arm_smmu_domain *smmu_domain = cookie;
	struct arm_smmu_cfg *cfg = &smmu_domain->cfg;
	void __iomem *base = ARM_SMMU_CB(smmu_domain->smmu, cfg->cbndx);

	writel_relaxed(cfg->asid, base + ARM_SMMU_CB_S1_TLBIASID);
	arm_smmu_tlb_sync_context(cookie);
}

arm_smmu_tlb_sync_global调用

arm_smmu_tlb_sync_global在两处分别被调用:

  • arm_smmu_tlb_inv_context_s2
/* Global TLB invalidation */
#define ARM_SMMU_GR0_TLBIVMID		0x64
static void arm_smmu_tlb_inv_context_s2(void *cookie)
{
	struct arm_smmu_domain *smmu_domain = cookie;
	struct arm_smmu_device *smmu = smmu_domain->smmu;
	void __iomem *base = ARM_SMMU_GR0(smmu);

	writel_relaxed(smmu_domain->cfg.vmid, base + ARM_SMMU_GR0_TLBIVMID);
	arm_smmu_tlb_sync_global(smmu);
}
  • arm_smmu_tlb_sync_vmid
static void arm_smmu_tlb_sync_vmid(void *cookie)
{
	struct arm_smmu_domain *smmu_domain = cookie;

	arm_smmu_tlb_sync_global(smmu_domain->smmu);
}
  • arm_smmu_device_reset

标签:__,smmu,SMMU,sync,tlb,ARM,arm
From: https://www.cnblogs.com/linhaostudy/p/18488087

相关文章

  • ARM CORELINK是什么?
    ARMCoreLink是ARM公司开发的一系列系统IP(知识产权)产品,用于连接和管理片上系统(SoC)中的各个组件。它是ARM系统设计生态系统的重要组成部分,旨在帮助芯片设计者更快速、更高效地开发复杂的SoC设计。让我为您详细介绍一下ARMCoreLink:主要功能:互连:提供高性能、低延迟的......
  • 动态规划
    对于一个可以用动态规划实现的题目来说我们需要有以下步骤:1.将原来划分为若干个阶段,每个阶段对应若干个子问题,提取子问题的特征(称为状态)2.找到每个状态下可能得决策或者是各个状态的转移方式(就是寻找状态转移方程式)3.按顺序求解每个阶段问题基础动态规划问题最长公共子序列......
  • 今日总结
    importjavax.swing.;importjava.awt.;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;classArithmeticProblem{privateint[]operands;char[]operators;......
  • 2024 Noip 做题记录(五)
    \(\text{ByDaiRuiChen007}\)Round#17-2024.10.8A.[ARC135D]SquareProblemLink题目大意给定\(n\timesm\)矩阵,每次操作可以把\(2\times2\)子矩形中的每个元素\(\pm1\),若干次操作后最小化所有元素的绝对值和,给出构造。数据范围:\(n,m\le500\)。思路分析......
  • Windows环境中,为自己的应用添加发行者证书
    Windows环境中,为自己的应用添加发行者证书在Windows上,如果你运行一个自定义构建的Go应用,WindowsSmartScreen或UAC可能会显示“发行者为未知”,这是因为你的应用没有经过代码签名认证。为了让Windows识别你的发行者信息,你需要给应用添加代码签名(CodeSigningCertificate......
  • 选择结构程序设计之习题
    有3个整数a,b,c,由键盘输入,输出其中最大的数//有3个整数a,b,c,由键盘输入,输出其中最大的数#include<stdio.h>intmain(void){ inta,b,c; scanf("a=%db=%dc=%d",&a,&b,&c); if(a>b) { inttemp=a; a=b; b=temp; }//a<b if(a&g......
  • linux命令
    linux命令1.远程连接linux1.1windows的指令终端连接linux打开终端语法:ssh用户名@ip地址比如:[email protected]等远程工具2.常用指令#远程登录linux系统sshroot@ip地址#断开连接exit#重启系统reboot或者shutdown-rnow#关机指令shutdown......
  • 基于Python的自然语言处理系列(34):Huggingface 自定义分词器与数据集
            在自然语言处理(NLP)中,分词是将原始文本转换为模型可处理的数字形式的关键步骤。无论是情感分析、文本生成,还是问答系统,分词都决定了模型如何理解输入数据。Huggingface的transformers库提供了多种强大的分词工具,使我们可以灵活地加载、保存和使用预训练......
  • 大道至简前10至20章读后感
    在深入阅读了《大道至简软件工程实践者的思想》的前10章至20章后,我对软件工程的理解又上升到了一个新的高度。这部分内容进一步深化了“大道至简”的理念,让我更加坚信在软件工程的实践中,简洁高效才是关键。作者通过具体的案例和分析,展示了如何在复杂的项目中运用简单的方法......
  • 位运算及其应用
    本文主要介绍C语言中的位运算及其应用。一、位运算符C语言提供6种位运算,它们是“按位取反(~)”、“左移(<<)”、“右移(>>)”、“按位与(&)”、“按位异或(^)”、“按位或(|)”。总结如下表所示,位运算符运算符含义优先级~按位取反1(高)<<左移2>>右移2&按位与3^按位异或4|按位或5(低)......