Skip to content

Commit

Permalink
fbdev: fbmem: add a helper to determine if an aperture is used by a f…
Browse files Browse the repository at this point in the history
…w fb

commit 9a45ac2 upstream.

Add a function for drivers to check if the a firmware initialized
fb is corresponds to their aperture.  This allows drivers to check if the
device corresponds to what the firmware set up as the display device.

Bug: https://bugzilla.kernel.org/show_bug.cgi?id=215203
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1840
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
alexdeucher authored and gregkh committed Jan 11, 2022
1 parent 9ca97a6 commit fa3d845
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
47 changes: 47 additions & 0 deletions drivers/video/fbdev/core/fbmem.c
Expand Up @@ -1759,6 +1759,53 @@ int remove_conflicting_framebuffers(struct apertures_struct *a,
}
EXPORT_SYMBOL(remove_conflicting_framebuffers);

/**
* is_firmware_framebuffer - detect if firmware-configured framebuffer matches
* @a: memory range, users of which are to be checked
*
* This function checks framebuffer devices (initialized by firmware/bootloader)
* which use memory range described by @a. If @a matchesm the function returns
* true, otherwise false.
*/
bool is_firmware_framebuffer(struct apertures_struct *a)
{
bool do_free = false;
bool found = false;
int i;

if (!a) {
a = alloc_apertures(1);
if (!a)
return false;

a->ranges[0].base = 0;
a->ranges[0].size = ~0;
do_free = true;
}

mutex_lock(&registration_lock);
/* check all firmware fbs and kick off if the base addr overlaps */
for_each_registered_fb(i) {
struct apertures_struct *gen_aper;

if (!(registered_fb[i]->flags & FBINFO_MISC_FIRMWARE))
continue;

gen_aper = registered_fb[i]->apertures;
if (fb_do_apertures_overlap(gen_aper, a)) {
found = true;
break;
}
}
mutex_unlock(&registration_lock);

if (do_free)
kfree(a);

return found;
}
EXPORT_SYMBOL(is_firmware_framebuffer);

/**
* remove_conflicting_pci_framebuffers - remove firmware-configured framebuffers for PCI devices
* @pdev: PCI device
Expand Down
1 change: 1 addition & 0 deletions include/linux/fb.h
Expand Up @@ -610,6 +610,7 @@ extern int remove_conflicting_pci_framebuffers(struct pci_dev *pdev,
const char *name);
extern int remove_conflicting_framebuffers(struct apertures_struct *a,
const char *name, bool primary);
extern bool is_firmware_framebuffer(struct apertures_struct *a);
extern int fb_prepare_logo(struct fb_info *fb_info, int rotate);
extern int fb_show_logo(struct fb_info *fb_info, int rotate);
extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
Expand Down

0 comments on commit fa3d845

Please sign in to comment.