浏览代码

msm: camera: smmu: Add support for new subregions

Add support for new subregion to account for two different
HW mutex regions for ICP. The change also adds support for
new global cntr subregion.

CRs-Fixed: 3469619
Change-Id: I8625230bfec23d2a12699a283a33e6ab83acaf00
Signed-off-by: Karthik Anantha Ram <[email protected]>
Karthik Anantha Ram 2 年之前
父节点
当前提交
eea5a9b44b

+ 2 - 2
drivers/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c

@@ -3287,7 +3287,7 @@ static void cam_icp_free_hfi_mem(struct cam_icp_hw_mgr *hw_mgr)
 		cam_smmu_unmap_phy_mem_region(hw_mgr->iommu_hdl, CAM_SMMU_REGION_FWUNCACHED,
 			CAM_SMMU_SUBREGION_GLOBAL_SYNC_MEM);
 		cam_smmu_unmap_phy_mem_region(hw_mgr->iommu_hdl, CAM_SMMU_REGION_DEVICE,
-			CAM_SMMU_SUBREGION_HWMUTEX);
+			CAM_SMMU_SUBREGION_SYNX_HWMUTEX);
 	}
 }
 
@@ -3463,7 +3463,7 @@ static int cam_icp_allocate_device_hwmutex_mem(struct cam_icp_hw_mgr *hw_mgr)
 	dma_addr_t iova;
 
 	rc = cam_smmu_map_phy_mem_region(hw_mgr->iommu_hdl,
-		CAM_SMMU_REGION_DEVICE, CAM_SMMU_SUBREGION_HWMUTEX, &iova, &len);
+		CAM_SMMU_REGION_DEVICE, CAM_SMMU_SUBREGION_SYNX_HWMUTEX, &iova, &len);
 	if (rc) {
 		CAM_ERR(CAM_ICP,
 			"Failed in allocating hwmutex mem rc %d", rc);

+ 31 - 5
drivers/cam_smmu/cam_smmu_api.c

@@ -4569,7 +4569,7 @@ static int cam_smmu_get_subregions_memory_info(
 			subregions->subregion_info.iova_len = subregion_len;
 			subregions->subregion_info.iova_start = subregion_start;
 			break;
-		case CAM_SMMU_SUBREGION_HWMUTEX:
+		case CAM_SMMU_SUBREGION_SYNX_HWMUTEX:
 			if (subregion_mask & BIT(subregion_id))
 				goto repeated_subregion;
 
@@ -4579,8 +4579,21 @@ static int cam_smmu_get_subregions_memory_info(
 			rc = of_property_read_u32(sub_node,
 				"phy-addr", (uint32_t *)&subregions->subregion_info.phy_addr);
 			if (rc < 0) {
-				CAM_ERR(CAM_SMMU,
-					"Failed to read phy addr");
+				CAM_ERR(CAM_SMMU, "Failed to read phy addr");
+				goto err;
+			}
+			break;
+		case CAM_SMMU_SUBREGION_IPC_HWMUTEX:
+			if (subregion_mask & BIT(subregion_id))
+				goto repeated_subregion;
+
+			subregions->subregion_id = subregion_id;
+			subregions->subregion_info.iova_len = subregion_len;
+			subregions->subregion_info.iova_start = subregion_start;
+			rc = of_property_read_u32(sub_node,
+				"phy-addr", (uint32_t *)&subregions->subregion_info.phy_addr);
+			if (rc < 0) {
+				CAM_ERR(CAM_SMMU, "Failed to read phy addr");
 				goto err;
 			}
 			break;
@@ -4594,8 +4607,21 @@ static int cam_smmu_get_subregions_memory_info(
 			rc = of_property_read_u32(sub_node,
 				"phy-addr", (uint32_t *)&subregions->subregion_info.phy_addr);
 			if (rc < 0) {
-				CAM_ERR(CAM_SMMU,
-					"Failed to read phy addr");
+				CAM_ERR(CAM_SMMU, "Failed to read phy addr");
+				goto err;
+			}
+			break;
+		case CAM_SMMU_SUBREGION_GLOBAL_CNTR:
+			if (subregion_mask & BIT(subregion_id))
+				goto repeated_subregion;
+
+			subregions->subregion_id = subregion_id;
+			subregions->subregion_info.iova_len = subregion_len;
+			subregions->subregion_info.iova_start = subregion_start;
+			rc = of_property_read_u32(sub_node,
+				"phy-addr", (uint32_t *)&subregions->subregion_info.phy_addr);
+			if (rc < 0) {
+				CAM_ERR(CAM_SMMU, "Failed to read phy addr");
 				goto err;
 			}
 			break;

+ 3 - 1
drivers/cam_smmu/cam_smmu_api.h

@@ -60,8 +60,10 @@ enum cam_smmu_region_id {
 
 enum cam_smmu_subregion_id {
 	CAM_SMMU_SUBREGION_GENERIC,
-	CAM_SMMU_SUBREGION_HWMUTEX,
+	CAM_SMMU_SUBREGION_SYNX_HWMUTEX,
+	CAM_SMMU_SUBREGION_IPC_HWMUTEX,
 	CAM_SMMU_SUBREGION_GLOBAL_SYNC_MEM,
+	CAM_SMMU_SUBREGION_GLOBAL_CNTR,
 	CAM_SMMU_SUBREGION_MAX,
 };