@@ -79,46 +79,52 @@ static int apple_isp_attach_genpd(struct apple_isp *isp)
7979static int apple_isp_init_iommu (struct apple_isp * isp )
8080{
8181 struct device * dev = isp -> dev ;
82- struct isp_firmware * fw = & isp -> fw ;
83- u64 heap_base , heap_size , vm_size ;
82+ phys_addr_t heap_base ;
83+ size_t heap_size ;
84+ u64 vm_size ;
8485 int err ;
85- int i = 0 ;
86+ int idx ;
87+ int size ;
88+ struct device_node * mem_node ;
89+ const __be32 * maps , * end ;
8690
8791 isp -> domain = iommu_get_domain_for_dev (isp -> dev );
8892 if (!isp -> domain )
8993 return - EPROBE_DEFER ;
9094 isp -> shift = __ffs (isp -> domain -> pgsize_bitmap );
9195
92- err = of_property_read_u64 (dev -> of_node , "apple,isp-heap-base" ,
93- & heap_base );
94- if (err ) {
95- dev_err (dev , "failed to read 'apple,isp-heap-base': %d \n" , err );
96- return err ;
96+ idx = of_property_match_string (dev -> of_node , "memory-region-names" , "heap" );
97+ mem_node = of_parse_phandle ( dev -> of_node , "memory-region" , idx );
98+ if (! mem_node ) {
99+ dev_err (dev , "No memory-region found for heap \n" );
100+ return - ENODEV ;
97101 }
98102
99- err = of_property_read_u64 (dev -> of_node , "apple,isp-heap-size" ,
100- & heap_size );
101- if (err ) {
102- dev_err (dev , "failed to read 'apple,isp-heap-size': %d\n" , err );
103- return err ;
103+ maps = of_get_property (mem_node , "iommu-addresses" , & size );
104+ if (!maps || !size ) {
105+ dev_err (dev , "No valid iommu-addresses found for heap\n" );
106+ return - ENODEV ;
107+ }
108+
109+ end = maps + size / sizeof (__be32 );
110+
111+ while (maps < end ) {
112+ maps ++ ;
113+ maps = of_translate_dma_region (dev -> of_node , maps , & heap_base , & heap_size );
104114 }
105115
116+ printk ("heap: 0x%llx 0x%lx\n" , heap_base , heap_size );
117+
118+ isp -> fw .heap_top = heap_base + heap_size ;
119+
106120 err = of_property_read_u64 (dev -> of_node , "apple,dart-vm-size" ,
107121 & vm_size );
108122 if (err ) {
109123 dev_err (dev , "failed to read 'apple,dart-vm-size': %d\n" , err );
110124 return err ;
111125 }
112126
113- drm_mm_init (& isp -> iovad , heap_base , vm_size - heap_base );
114-
115- /* Allocate read-only coprocessor private heap */
116- fw -> heap = isp_alloc_surface (isp , heap_size );
117- if (!fw -> heap ) {
118- drm_mm_takedown (& isp -> iovad );
119- err = - ENOMEM ;
120- return err ;
121- }
127+ drm_mm_init (& isp -> iovad , isp -> fw .heap_top , vm_size - heap_base );
122128
123129 apple_isp_iommu_sync_ttbr (isp );
124130
@@ -127,7 +133,6 @@ static int apple_isp_init_iommu(struct apple_isp *isp)
127133
128134static void apple_isp_free_iommu (struct apple_isp * isp )
129135{
130- isp_free_surface (isp , isp -> fw .heap );
131136 drm_mm_takedown (& isp -> iovad );
132137}
133138
0 commit comments