18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci/*
48c2ecf20Sopenharmony_ci *  Linux logo to be displayed on boot
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci *  Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu)
78c2ecf20Sopenharmony_ci *  Copyright (C) 1996,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
88c2ecf20Sopenharmony_ci *  Copyright (C) 2001 Greg Banks <gnb@alphalink.com.au>
98c2ecf20Sopenharmony_ci *  Copyright (C) 2001 Jan-Benedict Glaw <jbglaw@lug-owl.de>
108c2ecf20Sopenharmony_ci *  Copyright (C) 2003 Geert Uytterhoeven <geert@linux-m68k.org>
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/linux_logo.h>
148c2ecf20Sopenharmony_ci#include <linux/stddef.h>
158c2ecf20Sopenharmony_ci#include <linux/module.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#ifdef CONFIG_M68K
188c2ecf20Sopenharmony_ci#include <asm/setup.h>
198c2ecf20Sopenharmony_ci#endif
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic bool nologo;
228c2ecf20Sopenharmony_cimodule_param(nologo, bool, 0);
238c2ecf20Sopenharmony_ciMODULE_PARM_DESC(nologo, "Disables startup logo");
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci/*
268c2ecf20Sopenharmony_ci * Logos are located in the initdata, and will be freed in kernel_init.
278c2ecf20Sopenharmony_ci * Use late_init to mark the logos as freed to prevent any further use.
288c2ecf20Sopenharmony_ci */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic bool logos_freed;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistatic int __init fb_logo_late_init(void)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	logos_freed = true;
358c2ecf20Sopenharmony_ci	return 0;
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cilate_initcall_sync(fb_logo_late_init);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/* logo's are marked __initdata. Use __ref to tell
418c2ecf20Sopenharmony_ci * modpost that it is intended that this function uses data
428c2ecf20Sopenharmony_ci * marked __initdata.
438c2ecf20Sopenharmony_ci */
448c2ecf20Sopenharmony_ciconst struct linux_logo * __ref fb_find_logo(int depth)
458c2ecf20Sopenharmony_ci{
468c2ecf20Sopenharmony_ci	const struct linux_logo *logo = NULL;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	if (nologo || logos_freed)
498c2ecf20Sopenharmony_ci		return NULL;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	if (depth >= 1) {
528c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_LINUX_MONO
538c2ecf20Sopenharmony_ci		/* Generic Linux logo */
548c2ecf20Sopenharmony_ci		logo = &logo_linux_mono;
558c2ecf20Sopenharmony_ci#endif
568c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_SUPERH_MONO
578c2ecf20Sopenharmony_ci		/* SuperH Linux logo */
588c2ecf20Sopenharmony_ci		logo = &logo_superh_mono;
598c2ecf20Sopenharmony_ci#endif
608c2ecf20Sopenharmony_ci	}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	if (depth >= 4) {
638c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_LINUX_VGA16
648c2ecf20Sopenharmony_ci		/* Generic Linux logo */
658c2ecf20Sopenharmony_ci		logo = &logo_linux_vga16;
668c2ecf20Sopenharmony_ci#endif
678c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_SUPERH_VGA16
688c2ecf20Sopenharmony_ci		/* SuperH Linux logo */
698c2ecf20Sopenharmony_ci		logo = &logo_superh_vga16;
708c2ecf20Sopenharmony_ci#endif
718c2ecf20Sopenharmony_ci	}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	if (depth >= 8) {
748c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_LINUX_CLUT224
758c2ecf20Sopenharmony_ci		/* Generic Linux logo */
768c2ecf20Sopenharmony_ci		logo = &logo_linux_clut224;
778c2ecf20Sopenharmony_ci#endif
788c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_DEC_CLUT224
798c2ecf20Sopenharmony_ci		/* DEC Linux logo on MIPS/MIPS64 or ALPHA */
808c2ecf20Sopenharmony_ci		logo = &logo_dec_clut224;
818c2ecf20Sopenharmony_ci#endif
828c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_MAC_CLUT224
838c2ecf20Sopenharmony_ci		/* Macintosh Linux logo on m68k */
848c2ecf20Sopenharmony_ci		if (MACH_IS_MAC)
858c2ecf20Sopenharmony_ci			logo = &logo_mac_clut224;
868c2ecf20Sopenharmony_ci#endif
878c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_PARISC_CLUT224
888c2ecf20Sopenharmony_ci		/* PA-RISC Linux logo */
898c2ecf20Sopenharmony_ci		logo = &logo_parisc_clut224;
908c2ecf20Sopenharmony_ci#endif
918c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_SGI_CLUT224
928c2ecf20Sopenharmony_ci		/* SGI Linux logo on MIPS/MIPS64 */
938c2ecf20Sopenharmony_ci		logo = &logo_sgi_clut224;
948c2ecf20Sopenharmony_ci#endif
958c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_SUN_CLUT224
968c2ecf20Sopenharmony_ci		/* Sun Linux logo */
978c2ecf20Sopenharmony_ci		logo = &logo_sun_clut224;
988c2ecf20Sopenharmony_ci#endif
998c2ecf20Sopenharmony_ci#ifdef CONFIG_LOGO_SUPERH_CLUT224
1008c2ecf20Sopenharmony_ci		/* SuperH Linux logo */
1018c2ecf20Sopenharmony_ci		logo = &logo_superh_clut224;
1028c2ecf20Sopenharmony_ci#endif
1038c2ecf20Sopenharmony_ci	}
1048c2ecf20Sopenharmony_ci	return logo;
1058c2ecf20Sopenharmony_ci}
1068c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(fb_find_logo);
107