Skip to content

Commit 8437459

Browse files
marcanjannau
authored andcommitted
media: apple: isp: Use preallocated heap
Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent 9cf693a commit 8437459

2 files changed

Lines changed: 29 additions & 24 deletions

File tree

drivers/media/platform/apple/isp/isp-drv.c

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -79,46 +79,52 @@ static int apple_isp_attach_genpd(struct apple_isp *isp)
7979
static 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

128134
static 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

drivers/media/platform/apple/isp/isp-drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ struct apple_isp {
196196
struct mutex iovad_lock;
197197

198198
struct isp_firmware {
199-
struct isp_surf *heap;
199+
u64 heap_top;
200200
} fw;
201201

202202
struct isp_surf *ipc_surf;

0 commit comments

Comments
 (0)