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