fbdev: fbmem: add a helper to determine if an aperture is used by a fw fb
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>
This commit is contained in:
parent
eaa090538e
commit
9a45ac2320
|
@ -1762,6 +1762,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(®istration_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(®istration_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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue