1. Skip stall operation when invalid iommu tlb cache
because it does not need enter stall mode
2. Add stall operation when detach device
__raw_writel(IOMMU_COMMAND_PAGE_FAULT_DONE,
base + IOMMU_REGISTER_COMMAND);
}
__raw_writel(IOMMU_COMMAND_PAGE_FAULT_DONE,
base + IOMMU_REGISTER_COMMAND);
}
-#if 0
-static void rockchip_iommu_zap_tlb_without_stall (void __iomem *base)
+#if 1
+static int rockchip_iommu_zap_tlb_without_stall (void __iomem *base)
{
__raw_writel(IOMMU_COMMAND_ZAP_CACHE, base + IOMMU_REGISTER_COMMAND);
{
__raw_writel(IOMMU_COMMAND_ZAP_CACHE, base + IOMMU_REGISTER_COMMAND);
static int rockchip_iommu_zap_tlb(void __iomem *base)
{
if (!rockchip_iommu_enable_stall(base)) {
static int rockchip_iommu_zap_tlb(void __iomem *base)
{
if (!rockchip_iommu_enable_stall(base)) {
static inline bool rockchip_iommu_raw_reset(void __iomem *base)
{
static inline bool rockchip_iommu_raw_reset(void __iomem *base)
{
dev_info(data->iommu, "2.rawstat = 0x%08x,status = 0x%08x,reg_status = 0x%08x\n",
rawstat, status, reg_status);
dev_info(data->iommu, "2.rawstat = 0x%08x,status = 0x%08x,reg_status = 0x%08x\n",
rawstat, status, reg_status);
- ret = rockchip_iommu_zap_tlb(data->res_bases[i]);
+ ret = rockchip_iommu_zap_tlb_without_stall(data->res_bases[i]);
if (ret)
dev_err(data->iommu, "(%s) %s failed\n", data->dbgname,
__func__);
if (ret)
dev_err(data->iommu, "(%s) %s failed\n", data->dbgname,
__func__);
}
for (i = 0; i < data->num_res_mem; i++) {
}
for (i = 0; i < data->num_res_mem; i++) {
+ ret = rockchip_iommu_enable_stall(data->res_bases[i]);
+ if (!ret) {
+ dev_info(data->iommu, "(%s), %s failed\n",
+ data->dbgname, __func__);
+ spin_unlock_irqrestore(&data->data_lock, flags);
+ return false;
+ }
+
__raw_writel(0, data->res_bases[i] + IOMMU_REGISTER_INT_MASK);
__raw_writel(0, data->res_bases[i] + IOMMU_REGISTER_INT_MASK);
ret = rockchip_iommu_disable_paging(data->res_bases[i]);
if (!ret) {
ret = rockchip_iommu_disable_paging(data->res_bases[i]);
if (!ret) {
+ rockchip_iommu_disable_stall(data->res_bases[i]);
spin_unlock_irqrestore(&data->data_lock, flags);
dev_info(data->iommu, "%s error\n", __func__);
return ret;
}
spin_unlock_irqrestore(&data->data_lock, flags);
dev_info(data->iommu, "%s error\n", __func__);
return ret;
}
+ rockchip_iommu_disable_stall(data->res_bases[i]);
int ret;
for (i = 0; i < data->num_res_mem; i++) {
int ret;
for (i = 0; i < data->num_res_mem; i++) {
- ret = rockchip_iommu_zap_tlb(data->res_bases[i]);
+ ret = rockchip_iommu_zap_tlb_without_stall(data->res_bases[i]);
if (ret) {
dev_err(dev->archdata.iommu, "(%s) %s failed\n",
data->dbgname, __func__);
if (ret) {
dev_err(dev->archdata.iommu, "(%s) %s failed\n",
data->dbgname, __func__);