xref: /linux/include/linux/screen_info.h (revision b7e1e969c887c897947fdc3754fe9b0c24acb155)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27e7f358cSBrian Gerst #ifndef _SCREEN_INFO_H
37e7f358cSBrian Gerst #define _SCREEN_INFO_H
47e7f358cSBrian Gerst 
5607ca46eSDavid Howells #include <uapi/linux/screen_info.h>
67e7f358cSBrian Gerst 
7*78aa89d1SThomas Zimmermann #include <linux/bits.h>
8*78aa89d1SThomas Zimmermann 
975fa9b7eSThomas Zimmermann /**
1075fa9b7eSThomas Zimmermann  * SCREEN_INFO_MAX_RESOURCES - maximum number of resources per screen_info
1175fa9b7eSThomas Zimmermann  */
1275fa9b7eSThomas Zimmermann #define SCREEN_INFO_MAX_RESOURCES	3
1375fa9b7eSThomas Zimmermann 
14036105e3SThomas Zimmermann struct pci_dev;
1575fa9b7eSThomas Zimmermann struct resource;
1675fa9b7eSThomas Zimmermann 
__screen_info_has_lfb(unsigned int type)1775fa9b7eSThomas Zimmermann static inline bool __screen_info_has_lfb(unsigned int type)
1875fa9b7eSThomas Zimmermann {
1975fa9b7eSThomas Zimmermann 	return (type == VIDEO_TYPE_VLFB) || (type == VIDEO_TYPE_EFI);
2075fa9b7eSThomas Zimmermann }
2175fa9b7eSThomas Zimmermann 
__screen_info_lfb_base(const struct screen_info * si)2275fa9b7eSThomas Zimmermann static inline u64 __screen_info_lfb_base(const struct screen_info *si)
2375fa9b7eSThomas Zimmermann {
2475fa9b7eSThomas Zimmermann 	u64 lfb_base = si->lfb_base;
2575fa9b7eSThomas Zimmermann 
2675fa9b7eSThomas Zimmermann 	if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)
2775fa9b7eSThomas Zimmermann 		lfb_base |= (u64)si->ext_lfb_base << 32;
2875fa9b7eSThomas Zimmermann 
2975fa9b7eSThomas Zimmermann 	return lfb_base;
3075fa9b7eSThomas Zimmermann }
3175fa9b7eSThomas Zimmermann 
__screen_info_set_lfb_base(struct screen_info * si,u64 lfb_base)32*78aa89d1SThomas Zimmermann static inline void __screen_info_set_lfb_base(struct screen_info *si, u64 lfb_base)
33*78aa89d1SThomas Zimmermann {
34*78aa89d1SThomas Zimmermann 	si->lfb_base = lfb_base & GENMASK_ULL(31, 0);
35*78aa89d1SThomas Zimmermann 	si->ext_lfb_base = (lfb_base & GENMASK_ULL(63, 32)) >> 32;
36*78aa89d1SThomas Zimmermann 
37*78aa89d1SThomas Zimmermann 	if (si->ext_lfb_base)
38*78aa89d1SThomas Zimmermann 		si->capabilities |= VIDEO_CAPABILITY_64BIT_BASE;
39*78aa89d1SThomas Zimmermann 	else
40*78aa89d1SThomas Zimmermann 		si->capabilities &= ~VIDEO_CAPABILITY_64BIT_BASE;
41*78aa89d1SThomas Zimmermann }
42*78aa89d1SThomas Zimmermann 
__screen_info_lfb_size(const struct screen_info * si,unsigned int type)4375fa9b7eSThomas Zimmermann static inline u64 __screen_info_lfb_size(const struct screen_info *si, unsigned int type)
4475fa9b7eSThomas Zimmermann {
4575fa9b7eSThomas Zimmermann 	u64 lfb_size = si->lfb_size;
4675fa9b7eSThomas Zimmermann 
4775fa9b7eSThomas Zimmermann 	if (type == VIDEO_TYPE_VLFB)
4875fa9b7eSThomas Zimmermann 		lfb_size <<= 16;
4975fa9b7eSThomas Zimmermann 	return lfb_size;
5075fa9b7eSThomas Zimmermann }
5175fa9b7eSThomas Zimmermann 
__screen_info_video_type(unsigned int type)5275fa9b7eSThomas Zimmermann static inline unsigned int __screen_info_video_type(unsigned int type)
5375fa9b7eSThomas Zimmermann {
5475fa9b7eSThomas Zimmermann 	switch (type) {
5575fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_MDA:
5675fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_CGA:
5775fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_EGAM:
5875fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_EGAC:
5975fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_VGAC:
6075fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_VLFB:
6175fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_PICA_S3:
6275fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_MIPS_G364:
6375fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_SGI:
6475fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_TGAC:
6575fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_SUN:
6675fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_SUNPCI:
6775fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_PMAC:
6875fa9b7eSThomas Zimmermann 	case VIDEO_TYPE_EFI:
6975fa9b7eSThomas Zimmermann 		return type;
7075fa9b7eSThomas Zimmermann 	default:
7175fa9b7eSThomas Zimmermann 		return 0;
7275fa9b7eSThomas Zimmermann 	}
7375fa9b7eSThomas Zimmermann }
7475fa9b7eSThomas Zimmermann 
7575fa9b7eSThomas Zimmermann /**
7675fa9b7eSThomas Zimmermann  * screen_info_video_type() - Decodes the video type from struct screen_info
7775fa9b7eSThomas Zimmermann  * @si: an instance of struct screen_info
7875fa9b7eSThomas Zimmermann  *
7975fa9b7eSThomas Zimmermann  * Returns:
8075fa9b7eSThomas Zimmermann  * A VIDEO_TYPE_ constant representing si's type of video display, or 0 otherwise.
8175fa9b7eSThomas Zimmermann  */
screen_info_video_type(const struct screen_info * si)8275fa9b7eSThomas Zimmermann static inline unsigned int screen_info_video_type(const struct screen_info *si)
8375fa9b7eSThomas Zimmermann {
8475fa9b7eSThomas Zimmermann 	unsigned int type;
8575fa9b7eSThomas Zimmermann 
8675fa9b7eSThomas Zimmermann 	// check if display output is on
8775fa9b7eSThomas Zimmermann 	if (!si->orig_video_isVGA)
8875fa9b7eSThomas Zimmermann 		return 0;
8975fa9b7eSThomas Zimmermann 
9075fa9b7eSThomas Zimmermann 	// check for a known VIDEO_TYPE_ constant
9175fa9b7eSThomas Zimmermann 	type = __screen_info_video_type(si->orig_video_isVGA);
9275fa9b7eSThomas Zimmermann 	if (type)
9375fa9b7eSThomas Zimmermann 		return si->orig_video_isVGA;
9475fa9b7eSThomas Zimmermann 
9575fa9b7eSThomas Zimmermann 	// check if text mode has been initialized
9675fa9b7eSThomas Zimmermann 	if (!si->orig_video_lines || !si->orig_video_cols)
9775fa9b7eSThomas Zimmermann 		return 0;
9875fa9b7eSThomas Zimmermann 
9975fa9b7eSThomas Zimmermann 	// 80x25 text, mono
10075fa9b7eSThomas Zimmermann 	if (si->orig_video_mode == 0x07) {
10175fa9b7eSThomas Zimmermann 		if ((si->orig_video_ega_bx & 0xff) != 0x10)
10275fa9b7eSThomas Zimmermann 			return VIDEO_TYPE_EGAM;
10375fa9b7eSThomas Zimmermann 		else
10475fa9b7eSThomas Zimmermann 			return VIDEO_TYPE_MDA;
10575fa9b7eSThomas Zimmermann 	}
10675fa9b7eSThomas Zimmermann 
10775fa9b7eSThomas Zimmermann 	// EGA/VGA, 16 colors
10875fa9b7eSThomas Zimmermann 	if ((si->orig_video_ega_bx & 0xff) != 0x10) {
10975fa9b7eSThomas Zimmermann 		if (si->orig_video_isVGA)
11075fa9b7eSThomas Zimmermann 			return VIDEO_TYPE_VGAC;
11175fa9b7eSThomas Zimmermann 		else
11275fa9b7eSThomas Zimmermann 			return VIDEO_TYPE_EGAC;
11375fa9b7eSThomas Zimmermann 	}
11475fa9b7eSThomas Zimmermann 
11575fa9b7eSThomas Zimmermann 	// the rest...
11675fa9b7eSThomas Zimmermann 	return VIDEO_TYPE_CGA;
11775fa9b7eSThomas Zimmermann }
11875fa9b7eSThomas Zimmermann 
11975fa9b7eSThomas Zimmermann ssize_t screen_info_resources(const struct screen_info *si, struct resource *r, size_t num);
12075fa9b7eSThomas Zimmermann 
121036105e3SThomas Zimmermann #if defined(CONFIG_PCI)
122*78aa89d1SThomas Zimmermann void screen_info_apply_fixups(void);
123036105e3SThomas Zimmermann struct pci_dev *screen_info_pci_dev(const struct screen_info *si);
124036105e3SThomas Zimmermann #else
screen_info_apply_fixups(void)125*78aa89d1SThomas Zimmermann static inline void screen_info_apply_fixups(void)
126*78aa89d1SThomas Zimmermann { }
screen_info_pci_dev(const struct screen_info * si)127036105e3SThomas Zimmermann static inline struct pci_dev *screen_info_pci_dev(const struct screen_info *si)
128036105e3SThomas Zimmermann {
129036105e3SThomas Zimmermann 	return NULL;
130036105e3SThomas Zimmermann }
131036105e3SThomas Zimmermann #endif
132036105e3SThomas Zimmermann 
133ee8e7cfeSRusty Russell extern struct screen_info screen_info;
134ee8e7cfeSRusty Russell 
1357e7f358cSBrian Gerst #endif /* _SCREEN_INFO_H */
136