1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _SCREEN_INFO_H 3 #define _SCREEN_INFO_H 4 5 #include <uapi/linux/screen_info.h> 6 7 #include <linux/bits.h> 8 9 /** 10 * SCREEN_INFO_MAX_RESOURCES - maximum number of resources per screen_info 11 */ 12 #define SCREEN_INFO_MAX_RESOURCES 3 13 14 struct pci_dev; 15 struct resource; 16 17 static inline bool __screen_info_has_lfb(unsigned int type) 18 { 19 return (type == VIDEO_TYPE_VLFB) || (type == VIDEO_TYPE_EFI); 20 } 21 22 static inline u64 __screen_info_lfb_base(const struct screen_info *si) 23 { 24 u64 lfb_base = si->lfb_base; 25 26 if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) 27 lfb_base |= (u64)si->ext_lfb_base << 32; 28 29 return lfb_base; 30 } 31 32 static inline void __screen_info_set_lfb_base(struct screen_info *si, u64 lfb_base) 33 { 34 si->lfb_base = lfb_base & GENMASK_ULL(31, 0); 35 si->ext_lfb_base = (lfb_base & GENMASK_ULL(63, 32)) >> 32; 36 37 if (si->ext_lfb_base) 38 si->capabilities |= VIDEO_CAPABILITY_64BIT_BASE; 39 else 40 si->capabilities &= ~VIDEO_CAPABILITY_64BIT_BASE; 41 } 42 43 static inline u64 __screen_info_lfb_size(const struct screen_info *si, unsigned int type) 44 { 45 u64 lfb_size = si->lfb_size; 46 47 if (type == VIDEO_TYPE_VLFB) 48 lfb_size <<= 16; 49 return lfb_size; 50 } 51 52 static inline unsigned int __screen_info_video_type(unsigned int type) 53 { 54 switch (type) { 55 case VIDEO_TYPE_MDA: 56 case VIDEO_TYPE_CGA: 57 case VIDEO_TYPE_EGAM: 58 case VIDEO_TYPE_EGAC: 59 case VIDEO_TYPE_VGAC: 60 case VIDEO_TYPE_VLFB: 61 case VIDEO_TYPE_PICA_S3: 62 case VIDEO_TYPE_MIPS_G364: 63 case VIDEO_TYPE_SGI: 64 case VIDEO_TYPE_TGAC: 65 case VIDEO_TYPE_SUN: 66 case VIDEO_TYPE_SUNPCI: 67 case VIDEO_TYPE_PMAC: 68 case VIDEO_TYPE_EFI: 69 return type; 70 default: 71 return 0; 72 } 73 } 74 75 /** 76 * screen_info_video_type() - Decodes the video type from struct screen_info 77 * @si: an instance of struct screen_info 78 * 79 * Returns: 80 * A VIDEO_TYPE_ constant representing si's type of video display, or 0 otherwise. 81 */ 82 static inline unsigned int screen_info_video_type(const struct screen_info *si) 83 { 84 unsigned int type; 85 86 // check if display output is on 87 if (!si->orig_video_isVGA) 88 return 0; 89 90 // check for a known VIDEO_TYPE_ constant 91 type = __screen_info_video_type(si->orig_video_isVGA); 92 if (type) 93 return si->orig_video_isVGA; 94 95 // check if text mode has been initialized 96 if (!si->orig_video_lines || !si->orig_video_cols) 97 return 0; 98 99 // 80x25 text, mono 100 if (si->orig_video_mode == 0x07) { 101 if ((si->orig_video_ega_bx & 0xff) != 0x10) 102 return VIDEO_TYPE_EGAM; 103 else 104 return VIDEO_TYPE_MDA; 105 } 106 107 // EGA/VGA, 16 colors 108 if ((si->orig_video_ega_bx & 0xff) != 0x10) { 109 if (si->orig_video_isVGA) 110 return VIDEO_TYPE_VGAC; 111 else 112 return VIDEO_TYPE_EGAC; 113 } 114 115 // the rest... 116 return VIDEO_TYPE_CGA; 117 } 118 119 ssize_t screen_info_resources(const struct screen_info *si, struct resource *r, size_t num); 120 121 #if defined(CONFIG_PCI) 122 void screen_info_apply_fixups(void); 123 struct pci_dev *screen_info_pci_dev(const struct screen_info *si); 124 #else 125 static inline void screen_info_apply_fixups(void) 126 { } 127 static inline struct pci_dev *screen_info_pci_dev(const struct screen_info *si) 128 { 129 return NULL; 130 } 131 #endif 132 133 extern struct screen_info screen_info; 134 135 #endif /* _SCREEN_INFO_H */ 136