国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

smmu學習筆記之streamtable 2

2019-11-06 09:38:02
字體:
來源:轉載
供稿:網友
streamtable的另一種組織方式是linear,調用的是static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu){    void *strtab;    u64 reg;    u32 size;    struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;    #計算size    size = (1 << smmu->sid_bits) * (STRTAB_STE_DWordS << 3);    #申請memory    strtab = dmam_alloc_coherent(smmu->dev, size, &cfg->strtab_dma,                     GFP_KERNEL | __GFP_ZERO);    if (!strtab) {        dev_err(smmu->dev,            "failed to allocate linear stream table (%u bytes)/n",            size);        return -ENOMEM;    }    cfg->strtab = strtab;    cfg->num_l1_ents = 1 << smmu->sid_bits;    /* Configure strtab_base_cfg for a linear table covering all SIDs */    reg  = STRTAB_BASE_CFG_FMT_LINEAR;    reg |= (smmu->sid_bits & STRTAB_BASE_CFG_LOG2SIZE_MASK)        << STRTAB_BASE_CFG_LOG2SIZE_SHIFT;    cfg->strtab_base_cfg = reg;    arm_smmu_init_bypass_stes(strtab, cfg->num_l1_ents);    return 0;}在arm_smmu_init_bypass_stes中會根據cfg->num_l1_ents 為最大值來逐一調用arm_smmu_write_strtab_ent而這里的ste定義如下:可見valid和bypass都是true    struct arm_smmu_strtab_ent ste = {        .valid    = true,        .bypass    = true,    };在arm_smmu_write_strtab_ent中主要是給strtab 賦值。最終調用arm_smmu_cmdq_issue_cmd 來發送CMDQ_OP_CFGI_STE 和 CMDQ_OP_PREFETCH_CFG命令。static void arm_smmu_cmdq_issue_cmd(struct arm_smmu_device *smmu,                    struct arm_smmu_cmdq_ent *ent){    u64 cmd[CMDQ_ENT_DWORDS];    unsigned long flags;    bool wfe = !!(smmu->features & ARM_SMMU_FEAT_SEV);    struct arm_smmu_queue *q = &smmu->cmdq.q;    if (arm_smmu_cmdq_build_cmd(cmd, ent)) {        dev_warn(smmu->dev, "ignoring unknown CMDQ opcode 0x%x/n",             ent->opcode);        return;    }    spin_lock_irqsave(&smmu->cmdq.lock, flags);    while (queue_insert_raw(q, cmd) == -ENOSPC) {        if (queue_poll_cons(q, false, wfe))            dev_err_ratelimited(smmu->dev, "CMDQ timeout/n");    }    if (ent->opcode == CMDQ_OP_CMD_SYNC && queue_poll_cons(q, true, wfe))        dev_err_ratelimited(smmu->dev, "CMD_SYNC timeout/n");    spin_unlock_irqrestore(&smmu->cmdq.lock, flags);}從arm_smmu_cmdq_issue_cmd 中可以看到線根據arm_smmu_cmdq_ent->opcode的不同,bycase來對cmd賦值然后將cmd插入到queue中,并通過queue_poll_cons 來查詢是否執行插入成功    while (queue_insert_raw(q, cmd) == -ENOSPC) {        if (queue_poll_cons(q, false, wfe))            dev_err_ratelimited(smmu->dev, "CMDQ timeout/n");    }特別的是如果ent->opcode == CMDQ_OP_CMD_SYNC的話,還要查詢queue是否為null。    if (ent->opcode == CMDQ_OP_CMD_SYNC && queue_poll_cons(q, true, wfe))        dev_err_ratelimited(smmu->dev, "CMD_SYNC timeout/n");
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝阳县| 巨鹿县| 华蓥市| 江口县| 长兴县| 贺州市| 安新县| 乌拉特后旗| 瓦房店市| 闽清县| 仪陇县| 夹江县| 冷水江市| 墨玉县| 镇远县| 恩平市| 那坡县| 东乡| 石阡县| 繁峙县| 怀集县| 城固县| 青州市| 南郑县| 吉木萨尔县| 秦安县| 武宁县| 陆河县| 大理市| 句容市| 乐业县| 鹿邑县| 安康市| 甘洛县| 江安县| 全椒县| SHOW| 昆明市| 九台市| 利川市| 甘南县|