Skip to content

Commit f5f7937

Browse files
jannaumarcan
authored andcommitted
gpu: drm: apple: Use drm_aperture_remove_conflicting_framebuffers
This does not seem to be as racy as drm_aperture_remove_framebuffers() and seems to reliably takes over simpledrm's device node. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 42d64e3 commit f5f7937

1 file changed

Lines changed: 48 additions & 5 deletions

File tree

drivers/gpu/drm/apple/apple_drv.c

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <linux/module.h>
1111
#include <linux/dma-mapping.h>
12+
#include <linux/of_address.h>
1213
#include <linux/of_device.h>
1314

1415
#include <drm/drm_aperture.h>
@@ -339,10 +340,45 @@ static int apple_probe_per_dcp(struct device *dev,
339340
return drm_connector_attach_encoder(&connector->base, encoder);
340341
}
341342

343+
static int apple_get_fb_resource(struct device *dev, const char *name,
344+
struct resource *fb_r)
345+
{
346+
int idx, ret = -ENODEV;
347+
struct device_node *node;
348+
349+
idx = of_property_match_string(dev->of_node, "memory-region-names", name);
350+
351+
node = of_parse_phandle(dev->of_node, "memory-region", idx);
352+
if (!node) {
353+
dev_err(dev, "reserved-memory node '%s' not found\n", name);
354+
return -ENODEV;
355+
}
356+
357+
if (!of_device_is_available(node)) {
358+
dev_err(dev, "reserved-memory node '%s' is unavailable\n", name);
359+
goto err;
360+
}
361+
362+
if (!of_device_is_compatible(node, "framebuffer")) {
363+
dev_err(dev, "reserved-memory node '%s' is incompatible\n",
364+
node->full_name);
365+
goto err;
366+
}
367+
368+
ret = of_address_to_resource(node, 0, fb_r);
369+
370+
err:
371+
of_node_put(node);
372+
return ret;
373+
}
374+
375+
342376
static int apple_platform_probe(struct platform_device *pdev)
343377
{
344378
struct device *dev = &pdev->dev;
345379
struct apple_drm_private *apple;
380+
struct resource fb_r;
381+
resource_size_t fb_size;
346382
struct platform_device *dcp[MAX_COPROCESSORS];
347383
int ret, nr_dcp, i;
348384

@@ -380,6 +416,18 @@ static int apple_platform_probe(struct platform_device *pdev)
380416
if (ret)
381417
return ret;
382418

419+
ret = apple_get_fb_resource(dev, "framebuffer", &fb_r);
420+
if (ret)
421+
return ret;
422+
423+
fb_size = fb_r.end - fb_r.start + 1;
424+
ret = drm_aperture_remove_conflicting_framebuffers(fb_r.start, fb_size,
425+
false, &apple_drm_driver);
426+
if (ret) {
427+
dev_err(dev, "Failed remove fb: %d\n", ret);
428+
return ret;
429+
}
430+
383431
apple = devm_drm_dev_alloc(dev, &apple_drm_driver,
384432
struct apple_drm_private, drm);
385433
if (IS_ERR(apple))
@@ -425,11 +473,6 @@ static int apple_platform_probe(struct platform_device *pdev)
425473

426474
drm_mode_config_reset(&apple->drm);
427475

428-
// remove before registering our DRM device
429-
ret = drm_aperture_remove_framebuffers(false, &apple_drm_driver);
430-
if (ret)
431-
return ret;
432-
433476
ret = drm_dev_register(&apple->drm, 0);
434477
if (ret)
435478
goto err_unload;

0 commit comments

Comments
 (0)