* [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb
@ 2023-12-04 9:27 Thomas Zimmermann
2023-12-04 9:27 ` [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer Thomas Zimmermann
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw)
To: javierm, deller, pjones; +Cc: linux-fbdev, dri-devel, Thomas Zimmermann
Replace the global instance of screen_info with the per-device instance
that is set by the sysfb code. The use of the global screen_info should
be limited and ideally be pushed into per-architecture code.
v2:
* comment on devm_kmemdup() usage (Javier)
Thomas Zimmermann (4):
fbdev/efifb: Replace references to global screen_info by local pointer
fbdev/efifb: Use screen_info pointer from device
fbdev/vesafb: Replace references to global screen_info by local
pointer
fbdev/vesafb: Use screen_info pointer from device
drivers/video/fbdev/efifb.c | 125 ++++++++++++++++++++---------------
drivers/video/fbdev/vesafb.c | 78 +++++++++++++---------
2 files changed, 117 insertions(+), 86 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-04 9:27 [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb Thomas Zimmermann @ 2023-12-04 9:27 ` Thomas Zimmermann 2023-12-04 19:53 ` [v2,1/4] " Sui Jingfeng 2023-12-06 0:19 ` [PATCH v2 1/4] " kernel test robot 2023-12-04 9:27 ` [PATCH v2 2/4] fbdev/efifb: Use screen_info pointer from device Thomas Zimmermann ` (2 subsequent siblings) 3 siblings, 2 replies; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw) To: javierm, deller, pjones; +Cc: linux-fbdev, dri-devel, Thomas Zimmermann Get the global screen_info's address once and access the data via this pointer. Limits the use of global state. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> --- drivers/video/fbdev/efifb.c | 113 ++++++++++++++++++------------------ 1 file changed, 58 insertions(+), 55 deletions(-) diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c index f9b4ddd592ce4..6cbb65bbe1110 100644 --- a/drivers/video/fbdev/efifb.c +++ b/drivers/video/fbdev/efifb.c @@ -147,10 +147,9 @@ static bool efifb_bgrt_sanity_check(struct screen_info *si, u32 bmp_width) } #endif -static void efifb_show_boot_graphics(struct fb_info *info) +static void efifb_show_boot_graphics(struct fb_info *info, struct screen_info *si) { u32 bmp_width, bmp_height, bmp_pitch, dst_x, y, src_y; - struct screen_info *si = &screen_info; struct bmp_file_header *file_header; struct bmp_dib_header *dib_header; void *bgrt_image = NULL; @@ -282,7 +281,7 @@ static const struct fb_ops efifb_ops = { .fb_setcolreg = efifb_setcolreg, }; -static int efifb_setup(char *options) +static int efifb_setup(struct screen_info *si, char *options) { char *this_opt; @@ -290,16 +289,16 @@ static int efifb_setup(char *options) while ((this_opt = strsep(&options, ",")) != NULL) { if (!*this_opt) continue; - efifb_setup_from_dmi(&screen_info, this_opt); + efifb_setup_from_dmi(si, this_opt); if (!strncmp(this_opt, "base:", 5)) - screen_info.lfb_base = simple_strtoul(this_opt+5, NULL, 0); + si->lfb_base = simple_strtoul(this_opt+5, NULL, 0); else if (!strncmp(this_opt, "stride:", 7)) - screen_info.lfb_linelength = simple_strtoul(this_opt+7, NULL, 0) * 4; + si->lfb_linelength = simple_strtoul(this_opt+7, NULL, 0) * 4; else if (!strncmp(this_opt, "height:", 7)) - screen_info.lfb_height = simple_strtoul(this_opt+7, NULL, 0); + si->lfb_height = simple_strtoul(this_opt+7, NULL, 0); else if (!strncmp(this_opt, "width:", 6)) - screen_info.lfb_width = simple_strtoul(this_opt+6, NULL, 0); + si->lfb_width = simple_strtoul(this_opt+6, NULL, 0); else if (!strcmp(this_opt, "nowc")) mem_flags &= ~EFI_MEMORY_WC; else if (!strcmp(this_opt, "nobgrt")) @@ -310,15 +309,15 @@ static int efifb_setup(char *options) return 0; } -static inline bool fb_base_is_valid(void) +static inline bool fb_base_is_valid(struct screen_info *si) { - if (screen_info.lfb_base) + if (si->lfb_base) return true; - if (!(screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)) + if (!(si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)) return false; - if (screen_info.ext_lfb_base) + if (si->ext_lfb_base) return true; return false; @@ -329,7 +328,10 @@ static ssize_t name##_show(struct device *dev, \ struct device_attribute *attr, \ char *buf) \ { \ - return sprintf(buf, fmt "\n", (screen_info.lfb_##name)); \ + struct screen_info *si = dev_get_platdata(dev); \ + if (!si) \ + return -ENODEV; \ + return sprintf(buf, fmt "\n", (si->lfb_##name)); \ } \ static DEVICE_ATTR_RO(name) @@ -356,6 +358,7 @@ static u64 bar_offset; static int efifb_probe(struct platform_device *dev) { + struct screen_info *si = &screen_info; struct fb_info *info; struct efifb_par *par; int err, orientation; @@ -365,48 +368,48 @@ static int efifb_probe(struct platform_device *dev) char *option = NULL; efi_memory_desc_t md; - if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) + if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) return -ENODEV; if (fb_get_options("efifb", &option)) return -ENODEV; - efifb_setup(option); + efifb_setup(si, option); /* We don't get linelength from UGA Draw Protocol, only from * EFI Graphics Protocol. So if it's not in DMI, and it's not * passed in from the user, we really can't use the framebuffer. */ - if (!screen_info.lfb_linelength) + if (!si->lfb_linelength) return -ENODEV; - if (!screen_info.lfb_depth) - screen_info.lfb_depth = 32; - if (!screen_info.pages) - screen_info.pages = 1; - if (!fb_base_is_valid()) { + if (!si->lfb_depth) + si->lfb_depth = 32; + if (!si->pages) + si->pages = 1; + if (!fb_base_is_valid(si)) { printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); return -ENODEV; } printk(KERN_INFO "efifb: probing for efifb\n"); /* just assume they're all unset if any are */ - if (!screen_info.blue_size) { - screen_info.blue_size = 8; - screen_info.blue_pos = 0; - screen_info.green_size = 8; - screen_info.green_pos = 8; - screen_info.red_size = 8; - screen_info.red_pos = 16; - screen_info.rsvd_size = 8; - screen_info.rsvd_pos = 24; + if (!si->blue_size) { + si->blue_size = 8; + si->blue_pos = 0; + si->green_size = 8; + si->green_pos = 8; + si->red_size = 8; + si->red_pos = 16; + si->rsvd_size = 8; + si->rsvd_pos = 24; } - efifb_fix.smem_start = screen_info.lfb_base; + efifb_fix.smem_start = si->lfb_base; - if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) { + if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { u64 ext_lfb_base; - ext_lfb_base = (u64)(unsigned long)screen_info.ext_lfb_base << 32; + ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; efifb_fix.smem_start |= ext_lfb_base; } @@ -417,10 +420,10 @@ static int efifb_probe(struct platform_device *dev) efifb_fix.smem_start = bar_resource->start + bar_offset; } - efifb_defined.bits_per_pixel = screen_info.lfb_depth; - efifb_defined.xres = screen_info.lfb_width; - efifb_defined.yres = screen_info.lfb_height; - efifb_fix.line_length = screen_info.lfb_linelength; + efifb_defined.bits_per_pixel = si->lfb_depth; + efifb_defined.xres = si->lfb_width; + efifb_defined.yres = si->lfb_height; + efifb_fix.line_length = si->lfb_linelength; /* size_vmode -- that is the amount of memory needed for the * used video mode, i.e. the minimum amount of @@ -430,7 +433,7 @@ static int efifb_probe(struct platform_device *dev) /* size_total -- all video memory we have. Used for * entries, ressource allocation and bounds * checking. */ - size_total = screen_info.lfb_size; + size_total = si->lfb_size; if (size_total < size_vmode) size_total = size_vmode; @@ -512,7 +515,7 @@ static int efifb_probe(struct platform_device *dev) pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", efifb_defined.xres, efifb_defined.yres, efifb_defined.bits_per_pixel, efifb_fix.line_length, - screen_info.pages); + si->pages); efifb_defined.xres_virtual = efifb_defined.xres; efifb_defined.yres_virtual = efifb_fix.smem_len / @@ -526,26 +529,26 @@ static int efifb_probe(struct platform_device *dev) efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; - efifb_defined.red.offset = screen_info.red_pos; - efifb_defined.red.length = screen_info.red_size; - efifb_defined.green.offset = screen_info.green_pos; - efifb_defined.green.length = screen_info.green_size; - efifb_defined.blue.offset = screen_info.blue_pos; - efifb_defined.blue.length = screen_info.blue_size; - efifb_defined.transp.offset = screen_info.rsvd_pos; - efifb_defined.transp.length = screen_info.rsvd_size; + efifb_defined.red.offset = si->red_pos; + efifb_defined.red.length = si->red_size; + efifb_defined.green.offset = si->green_pos; + efifb_defined.green.length = si->green_size; + efifb_defined.blue.offset = si->blue_pos; + efifb_defined.blue.length = si->blue_size; + efifb_defined.transp.offset = si->rsvd_pos; + efifb_defined.transp.length = si->rsvd_size; pr_info("efifb: %s: " "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", "Truecolor", - screen_info.rsvd_size, - screen_info.red_size, - screen_info.green_size, - screen_info.blue_size, - screen_info.rsvd_pos, - screen_info.red_pos, - screen_info.green_pos, - screen_info.blue_pos); + si->rsvd_size, + si->red_size, + si->green_size, + si->blue_size, + si->rsvd_pos, + si->red_pos, + si->green_pos, + si->blue_pos); efifb_fix.ypanstep = 0; efifb_fix.ywrapstep = 0; -- 2.43.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [v2,1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-04 9:27 ` [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer Thomas Zimmermann @ 2023-12-04 19:53 ` Sui Jingfeng 2023-12-06 8:50 ` [v2, 1/4] " Thomas Zimmermann 2023-12-06 9:45 ` [v2,1/4] " Thomas Zimmermann 2023-12-06 0:19 ` [PATCH v2 1/4] " kernel test robot 1 sibling, 2 replies; 11+ messages in thread From: Sui Jingfeng @ 2023-12-04 19:53 UTC (permalink / raw) To: Thomas Zimmermann, javierm, deller, pjones; +Cc: linux-fbdev, dri-devel Hi, On 2023/12/4 17:27, Thomas Zimmermann wrote: > Get the global screen_info's address once and access the data via > this pointer. Limits the use of global state. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Sui Jingfeng <suijingfeng@loongson.cn> I have applied the whole series and do a simple test with efifb: Yeah, still works! $ dmesg | grep efifb [ 0.373800] efifb: probing for efifb [ 0.373816] efifb: framebuffer at 0xe0030000000, using 5120k, total 5120k [ 0.373818] efifb: mode is 1280x1024x32, linelength=5120, pages=1 [ 0.373820] efifb: scrolling: redraw [ 0.373821] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 > --- > drivers/video/fbdev/efifb.c | 113 ++++++++++++++++++------------------ > 1 file changed, 58 insertions(+), 55 deletions(-) > > diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c > index f9b4ddd592ce4..6cbb65bbe1110 100644 > --- a/drivers/video/fbdev/efifb.c > +++ b/drivers/video/fbdev/efifb.c > @@ -147,10 +147,9 @@ static bool efifb_bgrt_sanity_check(struct screen_info *si, u32 bmp_width) > } > #endif > > -static void efifb_show_boot_graphics(struct fb_info *info) > +static void efifb_show_boot_graphics(struct fb_info *info, struct screen_info *si) I think, we probably can add a const modifier for the function which doesn't modify our local the screen_info instance in the future. static void efifb_show_boot_graphics(struct fb_info *info, const struct screen_info *si) Since screen_info is mostly used to provide information. > { > u32 bmp_width, bmp_height, bmp_pitch, dst_x, y, src_y; > - struct screen_info *si = &screen_info; > struct bmp_file_header *file_header; > struct bmp_dib_header *dib_header; > void *bgrt_image = NULL; > @@ -282,7 +281,7 @@ static const struct fb_ops efifb_ops = { > .fb_setcolreg = efifb_setcolreg, > }; > > -static int efifb_setup(char *options) > +static int efifb_setup(struct screen_info *si, char *options) > { > char *this_opt; > > @@ -290,16 +289,16 @@ static int efifb_setup(char *options) > while ((this_opt = strsep(&options, ",")) != NULL) { > if (!*this_opt) continue; > > - efifb_setup_from_dmi(&screen_info, this_opt); > + efifb_setup_from_dmi(si, this_opt); > > if (!strncmp(this_opt, "base:", 5)) > - screen_info.lfb_base = simple_strtoul(this_opt+5, NULL, 0); > + si->lfb_base = simple_strtoul(this_opt+5, NULL, 0); > else if (!strncmp(this_opt, "stride:", 7)) > - screen_info.lfb_linelength = simple_strtoul(this_opt+7, NULL, 0) * 4; > + si->lfb_linelength = simple_strtoul(this_opt+7, NULL, 0) * 4; > else if (!strncmp(this_opt, "height:", 7)) > - screen_info.lfb_height = simple_strtoul(this_opt+7, NULL, 0); > + si->lfb_height = simple_strtoul(this_opt+7, NULL, 0); > else if (!strncmp(this_opt, "width:", 6)) > - screen_info.lfb_width = simple_strtoul(this_opt+6, NULL, 0); > + si->lfb_width = simple_strtoul(this_opt+6, NULL, 0); > else if (!strcmp(this_opt, "nowc")) > mem_flags &= ~EFI_MEMORY_WC; > else if (!strcmp(this_opt, "nobgrt")) > @@ -310,15 +309,15 @@ static int efifb_setup(char *options) > return 0; > } > > -static inline bool fb_base_is_valid(void) > +static inline bool fb_base_is_valid(struct screen_info *si) > { > - if (screen_info.lfb_base) > + if (si->lfb_base) > return true; > > - if (!(screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)) > + if (!(si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)) > return false; > > - if (screen_info.ext_lfb_base) > + if (si->ext_lfb_base) > return true; > > return false; > @@ -329,7 +328,10 @@ static ssize_t name##_show(struct device *dev, \ > struct device_attribute *attr, \ > char *buf) \ > { \ > - return sprintf(buf, fmt "\n", (screen_info.lfb_##name)); \ > + struct screen_info *si = dev_get_platdata(dev); \ > + if (!si) \ > + return -ENODEV; \ > + return sprintf(buf, fmt "\n", (si->lfb_##name)); \ > } \ > static DEVICE_ATTR_RO(name) > > @@ -356,6 +358,7 @@ static u64 bar_offset; > > static int efifb_probe(struct platform_device *dev) > { > + struct screen_info *si = &screen_info; > struct fb_info *info; > struct efifb_par *par; > int err, orientation; > @@ -365,48 +368,48 @@ static int efifb_probe(struct platform_device *dev) > char *option = NULL; > efi_memory_desc_t md; > > - if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) > + if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) > return -ENODEV; > > if (fb_get_options("efifb", &option)) > return -ENODEV; > - efifb_setup(option); > + efifb_setup(si, option); > > /* We don't get linelength from UGA Draw Protocol, only from > * EFI Graphics Protocol. So if it's not in DMI, and it's not > * passed in from the user, we really can't use the framebuffer. > */ > - if (!screen_info.lfb_linelength) > + if (!si->lfb_linelength) > return -ENODEV; > > - if (!screen_info.lfb_depth) > - screen_info.lfb_depth = 32; > - if (!screen_info.pages) > - screen_info.pages = 1; > - if (!fb_base_is_valid()) { > + if (!si->lfb_depth) > + si->lfb_depth = 32; > + if (!si->pages) > + si->pages = 1; > + if (!fb_base_is_valid(si)) { > printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); > return -ENODEV; > } > printk(KERN_INFO "efifb: probing for efifb\n"); > > /* just assume they're all unset if any are */ > - if (!screen_info.blue_size) { > - screen_info.blue_size = 8; > - screen_info.blue_pos = 0; > - screen_info.green_size = 8; > - screen_info.green_pos = 8; > - screen_info.red_size = 8; > - screen_info.red_pos = 16; > - screen_info.rsvd_size = 8; > - screen_info.rsvd_pos = 24; > + if (!si->blue_size) { > + si->blue_size = 8; > + si->blue_pos = 0; > + si->green_size = 8; > + si->green_pos = 8; > + si->red_size = 8; > + si->red_pos = 16; > + si->rsvd_size = 8; > + si->rsvd_pos = 24; > } Yeah, Here the efifb modified our local screen_info instance, but this is not relevant to your patch. > > - efifb_fix.smem_start = screen_info.lfb_base; > + efifb_fix.smem_start = si->lfb_base; > > - if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) { > + if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { > u64 ext_lfb_base; > > - ext_lfb_base = (u64)(unsigned long)screen_info.ext_lfb_base << 32; > + ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; > efifb_fix.smem_start |= ext_lfb_base; > } > > @@ -417,10 +420,10 @@ static int efifb_probe(struct platform_device *dev) > efifb_fix.smem_start = bar_resource->start + bar_offset; > } > > - efifb_defined.bits_per_pixel = screen_info.lfb_depth; > - efifb_defined.xres = screen_info.lfb_width; > - efifb_defined.yres = screen_info.lfb_height; > - efifb_fix.line_length = screen_info.lfb_linelength; > + efifb_defined.bits_per_pixel = si->lfb_depth; > + efifb_defined.xres = si->lfb_width; > + efifb_defined.yres = si->lfb_height; > + efifb_fix.line_length = si->lfb_linelength; > > /* size_vmode -- that is the amount of memory needed for the > * used video mode, i.e. the minimum amount of > @@ -430,7 +433,7 @@ static int efifb_probe(struct platform_device *dev) > /* size_total -- all video memory we have. Used for > * entries, ressource allocation and bounds > * checking. */ > - size_total = screen_info.lfb_size; > + size_total = si->lfb_size; > if (size_total < size_vmode) > size_total = size_vmode; > > @@ -512,7 +515,7 @@ static int efifb_probe(struct platform_device *dev) > pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", > efifb_defined.xres, efifb_defined.yres, > efifb_defined.bits_per_pixel, efifb_fix.line_length, > - screen_info.pages); > + si->pages); > > efifb_defined.xres_virtual = efifb_defined.xres; > efifb_defined.yres_virtual = efifb_fix.smem_len / > @@ -526,26 +529,26 @@ static int efifb_probe(struct platform_device *dev) > efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; > efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; > > - efifb_defined.red.offset = screen_info.red_pos; > - efifb_defined.red.length = screen_info.red_size; > - efifb_defined.green.offset = screen_info.green_pos; > - efifb_defined.green.length = screen_info.green_size; > - efifb_defined.blue.offset = screen_info.blue_pos; > - efifb_defined.blue.length = screen_info.blue_size; > - efifb_defined.transp.offset = screen_info.rsvd_pos; > - efifb_defined.transp.length = screen_info.rsvd_size; > + efifb_defined.red.offset = si->red_pos; > + efifb_defined.red.length = si->red_size; > + efifb_defined.green.offset = si->green_pos; > + efifb_defined.green.length = si->green_size; > + efifb_defined.blue.offset = si->blue_pos; > + efifb_defined.blue.length = si->blue_size; > + efifb_defined.transp.offset = si->rsvd_pos; > + efifb_defined.transp.length = si->rsvd_size; > > pr_info("efifb: %s: " > "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", > "Truecolor", > - screen_info.rsvd_size, > - screen_info.red_size, > - screen_info.green_size, > - screen_info.blue_size, > - screen_info.rsvd_pos, > - screen_info.red_pos, > - screen_info.green_pos, > - screen_info.blue_pos); > + si->rsvd_size, > + si->red_size, > + si->green_size, > + si->blue_size, > + si->rsvd_pos, > + si->red_pos, > + si->green_pos, > + si->blue_pos); > > efifb_fix.ypanstep = 0; > efifb_fix.ywrapstep = 0; ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [v2, 1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-04 19:53 ` [v2,1/4] " Sui Jingfeng @ 2023-12-06 8:50 ` Thomas Zimmermann 2023-12-06 9:45 ` [v2,1/4] " Thomas Zimmermann 1 sibling, 0 replies; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-06 8:50 UTC (permalink / raw) To: Sui Jingfeng, javierm, deller, pjones; +Cc: linux-fbdev, dri-devel [-- Attachment #1.1: Type: text/plain, Size: 13076 bytes --] Hi Am 04.12.23 um 20:53 schrieb Sui Jingfeng: > Hi, > > > On 2023/12/4 17:27, Thomas Zimmermann wrote: >> Get the global screen_info's address once and access the data via >> this pointer. Limits the use of global state. >> >> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> > > Reviewed-by: Sui Jingfeng <suijingfeng@loongson.cn> > > > I have applied the whole series and do a simple test with efifb: > Yeah, still works! > > $ dmesg | grep efifb > > [ 0.373800] efifb: probing for efifb > [ 0.373816] efifb: framebuffer at 0xe0030000000, using 5120k, total > 5120k > [ 0.373818] efifb: mode is 1280x1024x32, linelength=5120, pages=1 > [ 0.373820] efifb: scrolling: redraw > [ 0.373821] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 > > >> --- >> drivers/video/fbdev/efifb.c | 113 ++++++++++++++++++------------------ >> 1 file changed, 58 insertions(+), 55 deletions(-) >> >> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c >> index f9b4ddd592ce4..6cbb65bbe1110 100644 >> --- a/drivers/video/fbdev/efifb.c >> +++ b/drivers/video/fbdev/efifb.c >> @@ -147,10 +147,9 @@ static bool efifb_bgrt_sanity_check(struct >> screen_info *si, u32 bmp_width) >> } >> #endif >> -static void efifb_show_boot_graphics(struct fb_info *info) >> +static void efifb_show_boot_graphics(struct fb_info *info, struct >> screen_info *si) > > I think, we probably can add a const modifier for the function > which doesn't modify our local the screen_info instance in the future. Good point. All our source code is traditionally sloppy with const correctness. Best regards Thomas > > static void efifb_show_boot_graphics(struct fb_info *info, const struct > screen_info *si) > > Since screen_info is mostly used to provide information. > > >> { >> u32 bmp_width, bmp_height, bmp_pitch, dst_x, y, src_y; >> - struct screen_info *si = &screen_info; >> struct bmp_file_header *file_header; >> struct bmp_dib_header *dib_header; >> void *bgrt_image = NULL; >> @@ -282,7 +281,7 @@ static const struct fb_ops efifb_ops = { >> .fb_setcolreg = efifb_setcolreg, >> }; >> -static int efifb_setup(char *options) >> +static int efifb_setup(struct screen_info *si, char *options) >> { >> char *this_opt; >> @@ -290,16 +289,16 @@ static int efifb_setup(char *options) >> while ((this_opt = strsep(&options, ",")) != NULL) { >> if (!*this_opt) continue; >> - efifb_setup_from_dmi(&screen_info, this_opt); >> + efifb_setup_from_dmi(si, this_opt); >> if (!strncmp(this_opt, "base:", 5)) >> - screen_info.lfb_base = simple_strtoul(this_opt+5, >> NULL, 0); >> + si->lfb_base = simple_strtoul(this_opt+5, NULL, 0); >> else if (!strncmp(this_opt, "stride:", 7)) >> - screen_info.lfb_linelength = >> simple_strtoul(this_opt+7, NULL, 0) * 4; >> + si->lfb_linelength = simple_strtoul(this_opt+7, NULL, >> 0) * 4; >> else if (!strncmp(this_opt, "height:", 7)) >> - screen_info.lfb_height = simple_strtoul(this_opt+7, >> NULL, 0); >> + si->lfb_height = simple_strtoul(this_opt+7, NULL, 0); >> else if (!strncmp(this_opt, "width:", 6)) >> - screen_info.lfb_width = simple_strtoul(this_opt+6, >> NULL, 0); >> + si->lfb_width = simple_strtoul(this_opt+6, NULL, 0); >> else if (!strcmp(this_opt, "nowc")) >> mem_flags &= ~EFI_MEMORY_WC; >> else if (!strcmp(this_opt, "nobgrt")) >> @@ -310,15 +309,15 @@ static int efifb_setup(char *options) >> return 0; >> } >> -static inline bool fb_base_is_valid(void) >> +static inline bool fb_base_is_valid(struct screen_info *si) >> { >> - if (screen_info.lfb_base) >> + if (si->lfb_base) >> return true; >> - if (!(screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)) >> + if (!(si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)) >> return false; >> - if (screen_info.ext_lfb_base) >> + if (si->ext_lfb_base) >> return true; >> return false; >> @@ -329,7 +328,10 @@ static ssize_t name##_show(struct device >> *dev, \ >> struct device_attribute *attr, \ >> char *buf) \ >> { \ >> - return sprintf(buf, fmt "\n", (screen_info.lfb_##name)); \ >> + struct screen_info *si = dev_get_platdata(dev); \ >> + if (!si) \ >> + return -ENODEV; \ >> + return sprintf(buf, fmt "\n", (si->lfb_##name)); \ >> } \ >> static DEVICE_ATTR_RO(name) >> @@ -356,6 +358,7 @@ static u64 bar_offset; >> static int efifb_probe(struct platform_device *dev) >> { >> + struct screen_info *si = &screen_info; >> struct fb_info *info; >> struct efifb_par *par; >> int err, orientation; >> @@ -365,48 +368,48 @@ static int efifb_probe(struct platform_device *dev) >> char *option = NULL; >> efi_memory_desc_t md; >> - if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || >> pci_dev_disabled) >> + if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) >> return -ENODEV; >> if (fb_get_options("efifb", &option)) >> return -ENODEV; >> - efifb_setup(option); >> + efifb_setup(si, option); >> /* We don't get linelength from UGA Draw Protocol, only from >> * EFI Graphics Protocol. So if it's not in DMI, and it's not >> * passed in from the user, we really can't use the framebuffer. >> */ >> - if (!screen_info.lfb_linelength) >> + if (!si->lfb_linelength) >> return -ENODEV; >> - if (!screen_info.lfb_depth) >> - screen_info.lfb_depth = 32; >> - if (!screen_info.pages) >> - screen_info.pages = 1; >> - if (!fb_base_is_valid()) { >> + if (!si->lfb_depth) >> + si->lfb_depth = 32; >> + if (!si->pages) >> + si->pages = 1; >> + if (!fb_base_is_valid(si)) { >> printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); >> return -ENODEV; >> } >> printk(KERN_INFO "efifb: probing for efifb\n"); >> /* just assume they're all unset if any are */ >> - if (!screen_info.blue_size) { >> - screen_info.blue_size = 8; >> - screen_info.blue_pos = 0; >> - screen_info.green_size = 8; >> - screen_info.green_pos = 8; >> - screen_info.red_size = 8; >> - screen_info.red_pos = 16; >> - screen_info.rsvd_size = 8; >> - screen_info.rsvd_pos = 24; >> + if (!si->blue_size) { >> + si->blue_size = 8; >> + si->blue_pos = 0; >> + si->green_size = 8; >> + si->green_pos = 8; >> + si->red_size = 8; >> + si->red_pos = 16; >> + si->rsvd_size = 8; >> + si->rsvd_pos = 24; >> } > > > Yeah, Here the efifb modified our local screen_info instance, but this > is not relevant to your patch. > > >> - efifb_fix.smem_start = screen_info.lfb_base; >> + efifb_fix.smem_start = si->lfb_base; >> - if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) { >> + if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { >> u64 ext_lfb_base; >> - ext_lfb_base = (u64)(unsigned long)screen_info.ext_lfb_base >> << 32; >> + ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; >> efifb_fix.smem_start |= ext_lfb_base; >> } >> @@ -417,10 +420,10 @@ static int efifb_probe(struct platform_device *dev) >> efifb_fix.smem_start = bar_resource->start + bar_offset; >> } >> - efifb_defined.bits_per_pixel = screen_info.lfb_depth; >> - efifb_defined.xres = screen_info.lfb_width; >> - efifb_defined.yres = screen_info.lfb_height; >> - efifb_fix.line_length = screen_info.lfb_linelength; >> + efifb_defined.bits_per_pixel = si->lfb_depth; >> + efifb_defined.xres = si->lfb_width; >> + efifb_defined.yres = si->lfb_height; >> + efifb_fix.line_length = si->lfb_linelength; >> /* size_vmode -- that is the amount of memory needed for the >> * used video mode, i.e. the minimum amount of >> @@ -430,7 +433,7 @@ static int efifb_probe(struct platform_device *dev) >> /* size_total -- all video memory we have. Used for >> * entries, ressource allocation and bounds >> * checking. */ >> - size_total = screen_info.lfb_size; >> + size_total = si->lfb_size; >> if (size_total < size_vmode) >> size_total = size_vmode; >> @@ -512,7 +515,7 @@ static int efifb_probe(struct platform_device *dev) >> pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", >> efifb_defined.xres, efifb_defined.yres, >> efifb_defined.bits_per_pixel, efifb_fix.line_length, >> - screen_info.pages); >> + si->pages); >> efifb_defined.xres_virtual = efifb_defined.xres; >> efifb_defined.yres_virtual = efifb_fix.smem_len / >> @@ -526,26 +529,26 @@ static int efifb_probe(struct platform_device *dev) >> efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; >> efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; >> - efifb_defined.red.offset = screen_info.red_pos; >> - efifb_defined.red.length = screen_info.red_size; >> - efifb_defined.green.offset = screen_info.green_pos; >> - efifb_defined.green.length = screen_info.green_size; >> - efifb_defined.blue.offset = screen_info.blue_pos; >> - efifb_defined.blue.length = screen_info.blue_size; >> - efifb_defined.transp.offset = screen_info.rsvd_pos; >> - efifb_defined.transp.length = screen_info.rsvd_size; >> + efifb_defined.red.offset = si->red_pos; >> + efifb_defined.red.length = si->red_size; >> + efifb_defined.green.offset = si->green_pos; >> + efifb_defined.green.length = si->green_size; >> + efifb_defined.blue.offset = si->blue_pos; >> + efifb_defined.blue.length = si->blue_size; >> + efifb_defined.transp.offset = si->rsvd_pos; >> + efifb_defined.transp.length = si->rsvd_size; >> pr_info("efifb: %s: " >> "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", >> "Truecolor", >> - screen_info.rsvd_size, >> - screen_info.red_size, >> - screen_info.green_size, >> - screen_info.blue_size, >> - screen_info.rsvd_pos, >> - screen_info.red_pos, >> - screen_info.green_pos, >> - screen_info.blue_pos); >> + si->rsvd_size, >> + si->red_size, >> + si->green_size, >> + si->blue_size, >> + si->rsvd_pos, >> + si->red_pos, >> + si->green_pos, >> + si->blue_pos); >> efifb_fix.ypanstep = 0; >> efifb_fix.ywrapstep = 0; -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 840 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [v2,1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-04 19:53 ` [v2,1/4] " Sui Jingfeng 2023-12-06 8:50 ` [v2, 1/4] " Thomas Zimmermann @ 2023-12-06 9:45 ` Thomas Zimmermann 2023-12-06 10:46 ` Sui Jingfeng 1 sibling, 1 reply; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-06 9:45 UTC (permalink / raw) To: Sui Jingfeng, javierm, deller, pjones; +Cc: linux-fbdev, dri-devel [-- Attachment #1.1: Type: text/plain, Size: 13048 bytes --] Hi Am 04.12.23 um 20:53 schrieb Sui Jingfeng: > Hi, > > > On 2023/12/4 17:27, Thomas Zimmermann wrote: >> Get the global screen_info's address once and access the data via >> this pointer. Limits the use of global state. >> >> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> > > Reviewed-by: Sui Jingfeng <suijingfeng@loongson.cn> > > > I have applied the whole series and do a simple test with efifb: > Yeah, still works! Can I take this as Tested-by: for the efifb patches ? Best regards Thomas > > $ dmesg | grep efifb > > [ 0.373800] efifb: probing for efifb > [ 0.373816] efifb: framebuffer at 0xe0030000000, using 5120k, total > 5120k > [ 0.373818] efifb: mode is 1280x1024x32, linelength=5120, pages=1 > [ 0.373820] efifb: scrolling: redraw > [ 0.373821] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 > > >> --- >> drivers/video/fbdev/efifb.c | 113 ++++++++++++++++++------------------ >> 1 file changed, 58 insertions(+), 55 deletions(-) >> >> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c >> index f9b4ddd592ce4..6cbb65bbe1110 100644 >> --- a/drivers/video/fbdev/efifb.c >> +++ b/drivers/video/fbdev/efifb.c >> @@ -147,10 +147,9 @@ static bool efifb_bgrt_sanity_check(struct >> screen_info *si, u32 bmp_width) >> } >> #endif >> -static void efifb_show_boot_graphics(struct fb_info *info) >> +static void efifb_show_boot_graphics(struct fb_info *info, struct >> screen_info *si) > > I think, we probably can add a const modifier for the function > which doesn't modify our local the screen_info instance in the future. > > static void efifb_show_boot_graphics(struct fb_info *info, const struct > screen_info *si) > > Since screen_info is mostly used to provide information. > > >> { >> u32 bmp_width, bmp_height, bmp_pitch, dst_x, y, src_y; >> - struct screen_info *si = &screen_info; >> struct bmp_file_header *file_header; >> struct bmp_dib_header *dib_header; >> void *bgrt_image = NULL; >> @@ -282,7 +281,7 @@ static const struct fb_ops efifb_ops = { >> .fb_setcolreg = efifb_setcolreg, >> }; >> -static int efifb_setup(char *options) >> +static int efifb_setup(struct screen_info *si, char *options) >> { >> char *this_opt; >> @@ -290,16 +289,16 @@ static int efifb_setup(char *options) >> while ((this_opt = strsep(&options, ",")) != NULL) { >> if (!*this_opt) continue; >> - efifb_setup_from_dmi(&screen_info, this_opt); >> + efifb_setup_from_dmi(si, this_opt); >> if (!strncmp(this_opt, "base:", 5)) >> - screen_info.lfb_base = simple_strtoul(this_opt+5, >> NULL, 0); >> + si->lfb_base = simple_strtoul(this_opt+5, NULL, 0); >> else if (!strncmp(this_opt, "stride:", 7)) >> - screen_info.lfb_linelength = >> simple_strtoul(this_opt+7, NULL, 0) * 4; >> + si->lfb_linelength = simple_strtoul(this_opt+7, NULL, >> 0) * 4; >> else if (!strncmp(this_opt, "height:", 7)) >> - screen_info.lfb_height = simple_strtoul(this_opt+7, >> NULL, 0); >> + si->lfb_height = simple_strtoul(this_opt+7, NULL, 0); >> else if (!strncmp(this_opt, "width:", 6)) >> - screen_info.lfb_width = simple_strtoul(this_opt+6, >> NULL, 0); >> + si->lfb_width = simple_strtoul(this_opt+6, NULL, 0); >> else if (!strcmp(this_opt, "nowc")) >> mem_flags &= ~EFI_MEMORY_WC; >> else if (!strcmp(this_opt, "nobgrt")) >> @@ -310,15 +309,15 @@ static int efifb_setup(char *options) >> return 0; >> } >> -static inline bool fb_base_is_valid(void) >> +static inline bool fb_base_is_valid(struct screen_info *si) >> { >> - if (screen_info.lfb_base) >> + if (si->lfb_base) >> return true; >> - if (!(screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)) >> + if (!(si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)) >> return false; >> - if (screen_info.ext_lfb_base) >> + if (si->ext_lfb_base) >> return true; >> return false; >> @@ -329,7 +328,10 @@ static ssize_t name##_show(struct device >> *dev, \ >> struct device_attribute *attr, \ >> char *buf) \ >> { \ >> - return sprintf(buf, fmt "\n", (screen_info.lfb_##name)); \ >> + struct screen_info *si = dev_get_platdata(dev); \ >> + if (!si) \ >> + return -ENODEV; \ >> + return sprintf(buf, fmt "\n", (si->lfb_##name)); \ >> } \ >> static DEVICE_ATTR_RO(name) >> @@ -356,6 +358,7 @@ static u64 bar_offset; >> static int efifb_probe(struct platform_device *dev) >> { >> + struct screen_info *si = &screen_info; >> struct fb_info *info; >> struct efifb_par *par; >> int err, orientation; >> @@ -365,48 +368,48 @@ static int efifb_probe(struct platform_device *dev) >> char *option = NULL; >> efi_memory_desc_t md; >> - if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || >> pci_dev_disabled) >> + if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) >> return -ENODEV; >> if (fb_get_options("efifb", &option)) >> return -ENODEV; >> - efifb_setup(option); >> + efifb_setup(si, option); >> /* We don't get linelength from UGA Draw Protocol, only from >> * EFI Graphics Protocol. So if it's not in DMI, and it's not >> * passed in from the user, we really can't use the framebuffer. >> */ >> - if (!screen_info.lfb_linelength) >> + if (!si->lfb_linelength) >> return -ENODEV; >> - if (!screen_info.lfb_depth) >> - screen_info.lfb_depth = 32; >> - if (!screen_info.pages) >> - screen_info.pages = 1; >> - if (!fb_base_is_valid()) { >> + if (!si->lfb_depth) >> + si->lfb_depth = 32; >> + if (!si->pages) >> + si->pages = 1; >> + if (!fb_base_is_valid(si)) { >> printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); >> return -ENODEV; >> } >> printk(KERN_INFO "efifb: probing for efifb\n"); >> /* just assume they're all unset if any are */ >> - if (!screen_info.blue_size) { >> - screen_info.blue_size = 8; >> - screen_info.blue_pos = 0; >> - screen_info.green_size = 8; >> - screen_info.green_pos = 8; >> - screen_info.red_size = 8; >> - screen_info.red_pos = 16; >> - screen_info.rsvd_size = 8; >> - screen_info.rsvd_pos = 24; >> + if (!si->blue_size) { >> + si->blue_size = 8; >> + si->blue_pos = 0; >> + si->green_size = 8; >> + si->green_pos = 8; >> + si->red_size = 8; >> + si->red_pos = 16; >> + si->rsvd_size = 8; >> + si->rsvd_pos = 24; >> } > > > Yeah, Here the efifb modified our local screen_info instance, but this > is not relevant to your patch. > > >> - efifb_fix.smem_start = screen_info.lfb_base; >> + efifb_fix.smem_start = si->lfb_base; >> - if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) { >> + if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { >> u64 ext_lfb_base; >> - ext_lfb_base = (u64)(unsigned long)screen_info.ext_lfb_base >> << 32; >> + ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; >> efifb_fix.smem_start |= ext_lfb_base; >> } >> @@ -417,10 +420,10 @@ static int efifb_probe(struct platform_device *dev) >> efifb_fix.smem_start = bar_resource->start + bar_offset; >> } >> - efifb_defined.bits_per_pixel = screen_info.lfb_depth; >> - efifb_defined.xres = screen_info.lfb_width; >> - efifb_defined.yres = screen_info.lfb_height; >> - efifb_fix.line_length = screen_info.lfb_linelength; >> + efifb_defined.bits_per_pixel = si->lfb_depth; >> + efifb_defined.xres = si->lfb_width; >> + efifb_defined.yres = si->lfb_height; >> + efifb_fix.line_length = si->lfb_linelength; >> /* size_vmode -- that is the amount of memory needed for the >> * used video mode, i.e. the minimum amount of >> @@ -430,7 +433,7 @@ static int efifb_probe(struct platform_device *dev) >> /* size_total -- all video memory we have. Used for >> * entries, ressource allocation and bounds >> * checking. */ >> - size_total = screen_info.lfb_size; >> + size_total = si->lfb_size; >> if (size_total < size_vmode) >> size_total = size_vmode; >> @@ -512,7 +515,7 @@ static int efifb_probe(struct platform_device *dev) >> pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", >> efifb_defined.xres, efifb_defined.yres, >> efifb_defined.bits_per_pixel, efifb_fix.line_length, >> - screen_info.pages); >> + si->pages); >> efifb_defined.xres_virtual = efifb_defined.xres; >> efifb_defined.yres_virtual = efifb_fix.smem_len / >> @@ -526,26 +529,26 @@ static int efifb_probe(struct platform_device *dev) >> efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; >> efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; >> - efifb_defined.red.offset = screen_info.red_pos; >> - efifb_defined.red.length = screen_info.red_size; >> - efifb_defined.green.offset = screen_info.green_pos; >> - efifb_defined.green.length = screen_info.green_size; >> - efifb_defined.blue.offset = screen_info.blue_pos; >> - efifb_defined.blue.length = screen_info.blue_size; >> - efifb_defined.transp.offset = screen_info.rsvd_pos; >> - efifb_defined.transp.length = screen_info.rsvd_size; >> + efifb_defined.red.offset = si->red_pos; >> + efifb_defined.red.length = si->red_size; >> + efifb_defined.green.offset = si->green_pos; >> + efifb_defined.green.length = si->green_size; >> + efifb_defined.blue.offset = si->blue_pos; >> + efifb_defined.blue.length = si->blue_size; >> + efifb_defined.transp.offset = si->rsvd_pos; >> + efifb_defined.transp.length = si->rsvd_size; >> pr_info("efifb: %s: " >> "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", >> "Truecolor", >> - screen_info.rsvd_size, >> - screen_info.red_size, >> - screen_info.green_size, >> - screen_info.blue_size, >> - screen_info.rsvd_pos, >> - screen_info.red_pos, >> - screen_info.green_pos, >> - screen_info.blue_pos); >> + si->rsvd_size, >> + si->red_size, >> + si->green_size, >> + si->blue_size, >> + si->rsvd_pos, >> + si->red_pos, >> + si->green_pos, >> + si->blue_pos); >> efifb_fix.ypanstep = 0; >> efifb_fix.ywrapstep = 0; -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 840 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [v2,1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-06 9:45 ` [v2,1/4] " Thomas Zimmermann @ 2023-12-06 10:46 ` Sui Jingfeng 0 siblings, 0 replies; 11+ messages in thread From: Sui Jingfeng @ 2023-12-06 10:46 UTC (permalink / raw) To: Thomas Zimmermann, javierm, deller, pjones; +Cc: linux-fbdev, dri-devel Hi, On 2023/12/6 17:45, Thomas Zimmermann wrote: > Hi > > Am 04.12.23 um 20:53 schrieb Sui Jingfeng: >> Hi, >> >> >> On 2023/12/4 17:27, Thomas Zimmermann wrote: >>> Get the global screen_info's address once and access the data via >>> this pointer. Limits the use of global state. >>> >>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >>> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> >> >> Reviewed-by: Sui Jingfeng <suijingfeng@loongson.cn> >> >> >> I have applied the whole series and do a simple test with efifb: >> Yeah, still works! > > Can I take this as Tested-by: for the efifb patches ? > No problem, with the warning reported by testing robot fixed, please! I have tested this on a non primary arch, compiled with a normal default config. Not noticed the line "static inline void efifb_show_boot_graphics(struct fb_info *info) {}". > Best regards > Thomas > >> >> $ dmesg | grep efifb >> >> [ 0.373800] efifb: probing for efifb >> [ 0.373816] efifb: framebuffer at 0xe0030000000, using 5120k, >> total 5120k >> [ 0.373818] efifb: mode is 1280x1024x32, linelength=5120, pages=1 >> [ 0.373820] efifb: scrolling: redraw >> [ 0.373821] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0 >> >> >>> --- >>> drivers/video/fbdev/efifb.c | 113 >>> ++++++++++++++++++------------------ >>> 1 file changed, 58 insertions(+), 55 deletions(-) >>> >>> diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c >>> index f9b4ddd592ce4..6cbb65bbe1110 100644 >>> --- a/drivers/video/fbdev/efifb.c >>> +++ b/drivers/video/fbdev/efifb.c >>> @@ -147,10 +147,9 @@ static bool efifb_bgrt_sanity_check(struct >>> screen_info *si, u32 bmp_width) >>> } >>> #endif >>> -static void efifb_show_boot_graphics(struct fb_info *info) >>> +static void efifb_show_boot_graphics(struct fb_info *info, struct >>> screen_info *si) >> >> I think, we probably can add a const modifier for the function >> which doesn't modify our local the screen_info instance in the future. >> >> static void efifb_show_boot_graphics(struct fb_info *info, const >> struct screen_info *si) >> >> Since screen_info is mostly used to provide information. >> >> >>> { >>> u32 bmp_width, bmp_height, bmp_pitch, dst_x, y, src_y; >>> - struct screen_info *si = &screen_info; >>> struct bmp_file_header *file_header; >>> struct bmp_dib_header *dib_header; >>> void *bgrt_image = NULL; >>> @@ -282,7 +281,7 @@ static const struct fb_ops efifb_ops = { >>> .fb_setcolreg = efifb_setcolreg, >>> }; >>> -static int efifb_setup(char *options) >>> +static int efifb_setup(struct screen_info *si, char *options) >>> { >>> char *this_opt; >>> @@ -290,16 +289,16 @@ static int efifb_setup(char *options) >>> while ((this_opt = strsep(&options, ",")) != NULL) { >>> if (!*this_opt) continue; >>> - efifb_setup_from_dmi(&screen_info, this_opt); >>> + efifb_setup_from_dmi(si, this_opt); >>> if (!strncmp(this_opt, "base:", 5)) >>> - screen_info.lfb_base = simple_strtoul(this_opt+5, >>> NULL, 0); >>> + si->lfb_base = simple_strtoul(this_opt+5, NULL, 0); >>> else if (!strncmp(this_opt, "stride:", 7)) >>> - screen_info.lfb_linelength = >>> simple_strtoul(this_opt+7, NULL, 0) * 4; >>> + si->lfb_linelength = simple_strtoul(this_opt+7, >>> NULL, 0) * 4; >>> else if (!strncmp(this_opt, "height:", 7)) >>> - screen_info.lfb_height = simple_strtoul(this_opt+7, >>> NULL, 0); >>> + si->lfb_height = simple_strtoul(this_opt+7, NULL, 0); >>> else if (!strncmp(this_opt, "width:", 6)) >>> - screen_info.lfb_width = simple_strtoul(this_opt+6, >>> NULL, 0); >>> + si->lfb_width = simple_strtoul(this_opt+6, NULL, 0); >>> else if (!strcmp(this_opt, "nowc")) >>> mem_flags &= ~EFI_MEMORY_WC; >>> else if (!strcmp(this_opt, "nobgrt")) >>> @@ -310,15 +309,15 @@ static int efifb_setup(char *options) >>> return 0; >>> } >>> -static inline bool fb_base_is_valid(void) >>> +static inline bool fb_base_is_valid(struct screen_info *si) >>> { >>> - if (screen_info.lfb_base) >>> + if (si->lfb_base) >>> return true; >>> - if (!(screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)) >>> + if (!(si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)) >>> return false; >>> - if (screen_info.ext_lfb_base) >>> + if (si->ext_lfb_base) >>> return true; >>> return false; >>> @@ -329,7 +328,10 @@ static ssize_t name##_show(struct device >>> *dev, \ >>> struct device_attribute *attr, \ >>> char *buf) \ >>> { \ >>> - return sprintf(buf, fmt "\n", (screen_info.lfb_##name)); \ >>> + struct screen_info *si = dev_get_platdata(dev); \ >>> + if (!si) \ >>> + return -ENODEV; \ >>> + return sprintf(buf, fmt "\n", (si->lfb_##name)); \ >>> } \ >>> static DEVICE_ATTR_RO(name) >>> @@ -356,6 +358,7 @@ static u64 bar_offset; >>> static int efifb_probe(struct platform_device *dev) >>> { >>> + struct screen_info *si = &screen_info; >>> struct fb_info *info; >>> struct efifb_par *par; >>> int err, orientation; >>> @@ -365,48 +368,48 @@ static int efifb_probe(struct platform_device >>> *dev) >>> char *option = NULL; >>> efi_memory_desc_t md; >>> - if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || >>> pci_dev_disabled) >>> + if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) >>> return -ENODEV; >>> if (fb_get_options("efifb", &option)) >>> return -ENODEV; >>> - efifb_setup(option); >>> + efifb_setup(si, option); >>> /* We don't get linelength from UGA Draw Protocol, only from >>> * EFI Graphics Protocol. So if it's not in DMI, and it's not >>> * passed in from the user, we really can't use the framebuffer. >>> */ >>> - if (!screen_info.lfb_linelength) >>> + if (!si->lfb_linelength) >>> return -ENODEV; >>> - if (!screen_info.lfb_depth) >>> - screen_info.lfb_depth = 32; >>> - if (!screen_info.pages) >>> - screen_info.pages = 1; >>> - if (!fb_base_is_valid()) { >>> + if (!si->lfb_depth) >>> + si->lfb_depth = 32; >>> + if (!si->pages) >>> + si->pages = 1; >>> + if (!fb_base_is_valid(si)) { >>> printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); >>> return -ENODEV; >>> } >>> printk(KERN_INFO "efifb: probing for efifb\n"); >>> /* just assume they're all unset if any are */ >>> - if (!screen_info.blue_size) { >>> - screen_info.blue_size = 8; >>> - screen_info.blue_pos = 0; >>> - screen_info.green_size = 8; >>> - screen_info.green_pos = 8; >>> - screen_info.red_size = 8; >>> - screen_info.red_pos = 16; >>> - screen_info.rsvd_size = 8; >>> - screen_info.rsvd_pos = 24; >>> + if (!si->blue_size) { >>> + si->blue_size = 8; >>> + si->blue_pos = 0; >>> + si->green_size = 8; >>> + si->green_pos = 8; >>> + si->red_size = 8; >>> + si->red_pos = 16; >>> + si->rsvd_size = 8; >>> + si->rsvd_pos = 24; >>> } >> >> >> Yeah, Here the efifb modified our local screen_info instance, but >> this is not relevant to your patch. >> >> >>> - efifb_fix.smem_start = screen_info.lfb_base; >>> + efifb_fix.smem_start = si->lfb_base; >>> - if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) { >>> + if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { >>> u64 ext_lfb_base; >>> - ext_lfb_base = (u64)(unsigned long)screen_info.ext_lfb_base >>> << 32; >>> + ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; >>> efifb_fix.smem_start |= ext_lfb_base; >>> } >>> @@ -417,10 +420,10 @@ static int efifb_probe(struct platform_device >>> *dev) >>> efifb_fix.smem_start = bar_resource->start + bar_offset; >>> } >>> - efifb_defined.bits_per_pixel = screen_info.lfb_depth; >>> - efifb_defined.xres = screen_info.lfb_width; >>> - efifb_defined.yres = screen_info.lfb_height; >>> - efifb_fix.line_length = screen_info.lfb_linelength; >>> + efifb_defined.bits_per_pixel = si->lfb_depth; >>> + efifb_defined.xres = si->lfb_width; >>> + efifb_defined.yres = si->lfb_height; >>> + efifb_fix.line_length = si->lfb_linelength; >>> /* size_vmode -- that is the amount of memory needed for the >>> * used video mode, i.e. the minimum amount of >>> @@ -430,7 +433,7 @@ static int efifb_probe(struct platform_device *dev) >>> /* size_total -- all video memory we have. Used for >>> * entries, ressource allocation and bounds >>> * checking. */ >>> - size_total = screen_info.lfb_size; >>> + size_total = si->lfb_size; >>> if (size_total < size_vmode) >>> size_total = size_vmode; >>> @@ -512,7 +515,7 @@ static int efifb_probe(struct platform_device *dev) >>> pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", >>> efifb_defined.xres, efifb_defined.yres, >>> efifb_defined.bits_per_pixel, efifb_fix.line_length, >>> - screen_info.pages); >>> + si->pages); >>> efifb_defined.xres_virtual = efifb_defined.xres; >>> efifb_defined.yres_virtual = efifb_fix.smem_len / >>> @@ -526,26 +529,26 @@ static int efifb_probe(struct platform_device >>> *dev) >>> efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; >>> efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; >>> - efifb_defined.red.offset = screen_info.red_pos; >>> - efifb_defined.red.length = screen_info.red_size; >>> - efifb_defined.green.offset = screen_info.green_pos; >>> - efifb_defined.green.length = screen_info.green_size; >>> - efifb_defined.blue.offset = screen_info.blue_pos; >>> - efifb_defined.blue.length = screen_info.blue_size; >>> - efifb_defined.transp.offset = screen_info.rsvd_pos; >>> - efifb_defined.transp.length = screen_info.rsvd_size; >>> + efifb_defined.red.offset = si->red_pos; >>> + efifb_defined.red.length = si->red_size; >>> + efifb_defined.green.offset = si->green_pos; >>> + efifb_defined.green.length = si->green_size; >>> + efifb_defined.blue.offset = si->blue_pos; >>> + efifb_defined.blue.length = si->blue_size; >>> + efifb_defined.transp.offset = si->rsvd_pos; >>> + efifb_defined.transp.length = si->rsvd_size; >>> pr_info("efifb: %s: " >>> "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", >>> "Truecolor", >>> - screen_info.rsvd_size, >>> - screen_info.red_size, >>> - screen_info.green_size, >>> - screen_info.blue_size, >>> - screen_info.rsvd_pos, >>> - screen_info.red_pos, >>> - screen_info.green_pos, >>> - screen_info.blue_pos); >>> + si->rsvd_size, >>> + si->red_size, >>> + si->green_size, >>> + si->blue_size, >>> + si->rsvd_pos, >>> + si->red_pos, >>> + si->green_pos, >>> + si->blue_pos); >>> efifb_fix.ypanstep = 0; >>> efifb_fix.ywrapstep = 0; > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-04 9:27 ` [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer Thomas Zimmermann 2023-12-04 19:53 ` [v2,1/4] " Sui Jingfeng @ 2023-12-06 0:19 ` kernel test robot 2023-12-06 8:32 ` Thomas Zimmermann 1 sibling, 1 reply; 11+ messages in thread From: kernel test robot @ 2023-12-06 0:19 UTC (permalink / raw) To: Thomas Zimmermann, javierm, deller, pjones Cc: oe-kbuild-all, linux-fbdev, Thomas Zimmermann, dri-devel Hi Thomas, kernel test robot noticed the following build errors: [auto build test ERROR on drm-misc/drm-misc-next] [also build test ERROR on linus/master v6.7-rc4 next-20231205] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/fbdev-efifb-Replace-references-to-global-screen_info-by-local-pointer/20231204-173019 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next patch link: https://lore.kernel.org/r/20231204092812.2612-2-tzimmermann%40suse.de patch subject: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer config: x86_64-randconfig-006-20231206 (https://download.01.org/0day-ci/archive/20231206/202312060820.0Kjx88on-lkp@intel.com/config) compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231206/202312060820.0Kjx88on-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202312060820.0Kjx88on-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/video/fbdev/efifb.c: In function 'efifb_probe': >> drivers/video/fbdev/efifb.c:511:2: error: too few arguments to function 'efifb_show_boot_graphics' efifb_show_boot_graphics(info); ^~~~~~~~~~~~~~~~~~~~~~~~ drivers/video/fbdev/efifb.c:150:13: note: declared here static void efifb_show_boot_graphics(struct fb_info *info, struct screen_info *si) ^~~~~~~~~~~~~~~~~~~~~~~~ vim +/efifb_show_boot_graphics +511 drivers/video/fbdev/efifb.c dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 358 e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 359 static int efifb_probe(struct platform_device *dev) 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 360 { c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 361 struct screen_info *si = &screen_info; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 362 struct fb_info *info; 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 363 struct efifb_par *par; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 364 int err, orientation; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 365 unsigned int size_vmode; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 366 unsigned int size_remap; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 367 unsigned int size_total; e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 368 char *option = NULL; 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 369 efi_memory_desc_t md; e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 370 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 371 if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 372 return -ENODEV; e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 373 e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 374 if (fb_get_options("efifb", &option)) e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 375 return -ENODEV; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 376 efifb_setup(si, option); e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 377 e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 378 /* We don't get linelength from UGA Draw Protocol, only from e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 379 * EFI Graphics Protocol. So if it's not in DMI, and it's not e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 380 * passed in from the user, we really can't use the framebuffer. e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 381 */ c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 382 if (!si->lfb_linelength) e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 383 return -ENODEV; 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 384 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 385 if (!si->lfb_depth) c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 386 si->lfb_depth = 32; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 387 if (!si->pages) c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 388 si->pages = 1; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 389 if (!fb_base_is_valid(si)) { 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 390 printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 391 return -ENODEV; 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 392 } 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 393 printk(KERN_INFO "efifb: probing for efifb\n"); 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 394 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 395 /* just assume they're all unset if any are */ c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 396 if (!si->blue_size) { c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 397 si->blue_size = 8; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 398 si->blue_pos = 0; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 399 si->green_size = 8; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 400 si->green_pos = 8; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 401 si->red_size = 8; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 402 si->red_pos = 16; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 403 si->rsvd_size = 8; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 404 si->rsvd_pos = 24; 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 405 } 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 406 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 407 efifb_fix.smem_start = si->lfb_base; ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 408 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 409 if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 410 u64 ext_lfb_base; ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 411 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 412 ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 413 efifb_fix.smem_start |= ext_lfb_base; ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 414 } ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 415 dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 416 if (bar_resource && dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 417 bar_resource->start + bar_offset != efifb_fix.smem_start) { dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 418 dev_info(&efifb_pci_dev->dev, dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 419 "BAR has moved, updating efifb address\n"); dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 420 efifb_fix.smem_start = bar_resource->start + bar_offset; dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 421 } dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 422 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 423 efifb_defined.bits_per_pixel = si->lfb_depth; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 424 efifb_defined.xres = si->lfb_width; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 425 efifb_defined.yres = si->lfb_height; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 426 efifb_fix.line_length = si->lfb_linelength; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 427 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 428 /* size_vmode -- that is the amount of memory needed for the 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 429 * used video mode, i.e. the minimum amount of 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 430 * memory we need. */ 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 431 size_vmode = efifb_defined.yres * efifb_fix.line_length; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 432 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 433 /* size_total -- all video memory we have. Used for 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 434 * entries, ressource allocation and bounds 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 435 * checking. */ c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 436 size_total = si->lfb_size; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 437 if (size_total < size_vmode) 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 438 size_total = size_vmode; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 439 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 440 /* size_remap -- the amount of video memory we are going to 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 441 * use for efifb. With modern cards it is no 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 442 * option to simply use size_total as that 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 443 * wastes plenty of kernel address space. */ 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 444 size_remap = size_vmode * 2; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 445 if (size_remap > size_total) 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 446 size_remap = size_total; 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 447 if (size_remap % PAGE_SIZE) 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 448 size_remap += PAGE_SIZE - (size_remap % PAGE_SIZE); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 449 efifb_fix.smem_len = size_remap; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 450 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 451 if (request_mem_region(efifb_fix.smem_start, size_remap, "efifb")) { da0241f12bf785 drivers/video/efifb.c Andy Lutomirski 2011-05-26 452 request_mem_succeeded = true; 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 453 } else { 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 454 /* We cannot make this fatal. Sometimes this comes from magic 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 455 spaces our resource handlers simply don't know about */ 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 456 pr_warn("efifb: cannot reserve video memory at 0x%lx\n", 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 457 efifb_fix.smem_start); 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 458 } 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 459 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 460 info = framebuffer_alloc(sizeof(*par), &dev->dev); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 461 if (!info) { 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 462 err = -ENOMEM; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 463 goto err_release_mem; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 464 } 65b4021ed67622 drivers/video/efifb.c David Rheinsberg 2014-01-23 465 platform_set_drvdata(dev, info); 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 466 par = info->par; 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 467 info->pseudo_palette = par->pseudo_palette; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 468 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 469 par->base = efifb_fix.smem_start; 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 470 par->size = size_remap; 4410f3910947dc drivers/video/efifb.c Dave Airlie 2009-06-16 471 6163a985e50cb1 drivers/video/fbdev/efifb.c Juergen Gross 2020-07-10 472 if (efi_enabled(EFI_MEMMAP) && c2999c281ea2d2 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-03-28 473 !efi_mem_desc_lookup(efifb_fix.smem_start, &md)) { 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 474 if ((efifb_fix.smem_start + efifb_fix.smem_len) > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 475 (md.phys_addr + (md.num_pages << EFI_PAGE_SHIFT))) { 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 476 pr_err("efifb: video memory @ 0x%lx spans multiple EFI memory regions\n", 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 477 efifb_fix.smem_start); 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 478 err = -EIO; 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 479 goto err_release_fb; 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 480 } 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 481 /* 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 482 * If the UEFI memory map covers the efifb region, we may only 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 483 * remap it using the attributes the memory map prescribes. 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 484 */ f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 485 md.attribute &= EFI_MEMORY_UC | EFI_MEMORY_WC | f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 486 EFI_MEMORY_WT | EFI_MEMORY_WB; f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 487 if (md.attribute) { 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 488 mem_flags |= EFI_MEMORY_WT | EFI_MEMORY_WB; 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 489 mem_flags &= md.attribute; 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 490 } f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 491 } 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 492 if (mem_flags & EFI_MEMORY_WC) 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 493 info->screen_base = ioremap_wc(efifb_fix.smem_start, 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 494 efifb_fix.smem_len); 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 495 else if (mem_flags & EFI_MEMORY_UC) 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 496 info->screen_base = ioremap(efifb_fix.smem_start, 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 497 efifb_fix.smem_len); 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 498 else if (mem_flags & EFI_MEMORY_WT) 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 499 info->screen_base = memremap(efifb_fix.smem_start, 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 500 efifb_fix.smem_len, MEMREMAP_WT); 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 501 else if (mem_flags & EFI_MEMORY_WB) 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 502 info->screen_base = memremap(efifb_fix.smem_start, 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 503 efifb_fix.smem_len, MEMREMAP_WB); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 504 if (!info->screen_base) { 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 505 pr_err("efifb: abort, cannot remap video memory 0x%x @ 0x%lx\n", 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 506 efifb_fix.smem_len, efifb_fix.smem_start); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 507 err = -EIO; 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 508 goto err_release_fb; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 509 } 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 510 34db50e5565662 drivers/video/fbdev/efifb.c Hans de Goede 2018-07-03 @511 efifb_show_boot_graphics(info); 34db50e5565662 drivers/video/fbdev/efifb.c Hans de Goede 2018-07-03 512 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 513 pr_info("efifb: framebuffer at 0x%lx, using %dk, total %dk\n", a53dd258279c1e drivers/video/fbdev/efifb.c Andy Lutomirski 2016-05-11 514 efifb_fix.smem_start, size_remap/1024, size_total/1024); 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 515 pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 516 efifb_defined.xres, efifb_defined.yres, 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 517 efifb_defined.bits_per_pixel, efifb_fix.line_length, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 518 si->pages); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 519 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 520 efifb_defined.xres_virtual = efifb_defined.xres; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 521 efifb_defined.yres_virtual = efifb_fix.smem_len / 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 522 efifb_fix.line_length; 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 523 pr_info("efifb: scrolling: redraw\n"); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 524 efifb_defined.yres_virtual = efifb_defined.yres; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 525 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 526 /* some dummy values for timing to make fbset happy */ 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 527 efifb_defined.pixclock = 10000000 / efifb_defined.xres * 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 528 1000 / efifb_defined.yres; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 529 efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 530 efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 531 c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 532 efifb_defined.red.offset = si->red_pos; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 533 efifb_defined.red.length = si->red_size; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 534 efifb_defined.green.offset = si->green_pos; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 535 efifb_defined.green.length = si->green_size; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 536 efifb_defined.blue.offset = si->blue_pos; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 537 efifb_defined.blue.length = si->blue_size; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 538 efifb_defined.transp.offset = si->rsvd_pos; c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 539 efifb_defined.transp.length = si->rsvd_size; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 540 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 541 pr_info("efifb: %s: " 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 542 "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 543 "Truecolor", c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 544 si->rsvd_size, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 545 si->red_size, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 546 si->green_size, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 547 si->blue_size, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 548 si->rsvd_pos, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 549 si->red_pos, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 550 si->green_pos, c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 551 si->blue_pos); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 552 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 553 efifb_fix.ypanstep = 0; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 554 efifb_fix.ywrapstep = 0; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 555 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 556 info->fbops = &efifb_ops; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 557 info->var = efifb_defined; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 558 info->fix = efifb_fix; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 559 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 560 orientation = drm_get_panel_orientation_quirk(efifb_defined.xres, 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 561 efifb_defined.yres); 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 562 switch (orientation) { 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 563 default: 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 564 info->fbcon_rotate_hint = FB_ROTATE_UR; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 565 break; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 566 case DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP: 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 567 info->fbcon_rotate_hint = FB_ROTATE_UD; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 568 break; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 569 case DRM_MODE_PANEL_ORIENTATION_LEFT_UP: 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 570 info->fbcon_rotate_hint = FB_ROTATE_CCW; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 571 break; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 572 case DRM_MODE_PANEL_ORIENTATION_RIGHT_UP: 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 573 info->fbcon_rotate_hint = FB_ROTATE_CW; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 574 break; 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 575 } 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 576 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 577 err = sysfs_create_groups(&dev->dev.kobj, efifb_groups); 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 578 if (err) { 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 579 pr_err("efifb: cannot add sysfs attrs\n"); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 580 goto err_unmap; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 581 } 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 582 err = fb_alloc_cmap(&info->cmap, 256, 0); 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 583 if (err < 0) { 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 584 pr_err("efifb: cannot allocate colormap\n"); 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 585 goto err_groups; 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 586 } 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 587 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 588 if (efifb_pci_dev) 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 589 WARN_ON(pm_runtime_get_sync(&efifb_pci_dev->dev) < 0); 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 590 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 591 err = devm_aperture_acquire_for_platform_device(dev, par->base, par->size); 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 592 if (err) { 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 593 pr_err("efifb: cannot acquire aperture\n"); 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 594 goto err_put_rpm_ref; 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 595 } 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 596 err = register_framebuffer(info); 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 597 if (err < 0) { 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 598 pr_err("efifb: cannot register framebuffer\n"); 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 599 goto err_put_rpm_ref; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 600 } 31b6780c15a4e3 drivers/video/efifb.c Joe Perches 2013-09-19 601 fb_info(info, "%s frame buffer device\n", info->fix.id); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 602 return 0; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 603 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 604 err_put_rpm_ref: 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 605 if (efifb_pci_dev) 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 606 pm_runtime_put(&efifb_pci_dev->dev); 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 607 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 608 fb_dealloc_cmap(&info->cmap); 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 609 err_groups: 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 610 sysfs_remove_groups(&dev->dev.kobj, efifb_groups); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 611 err_unmap: 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 612 if (mem_flags & (EFI_MEMORY_UC | EFI_MEMORY_WC)) 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 613 iounmap(info->screen_base); 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 614 else 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 615 memunmap(info->screen_base); 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 616 err_release_fb: 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 617 framebuffer_release(info); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 618 err_release_mem: da0241f12bf785 drivers/video/efifb.c Andy Lutomirski 2011-05-26 619 if (request_mem_succeeded) 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 620 release_mem_region(efifb_fix.smem_start, size_total); 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 621 return err; 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 622 } 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 623 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer 2023-12-06 0:19 ` [PATCH v2 1/4] " kernel test robot @ 2023-12-06 8:32 ` Thomas Zimmermann 0 siblings, 0 replies; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-06 8:32 UTC (permalink / raw) To: kernel test robot, javierm, deller, pjones Cc: linux-fbdev, dri-devel, oe-kbuild-all [-- Attachment #1.1: Type: text/plain, Size: 31839 bytes --] Hi Am 06.12.23 um 01:19 schrieb kernel test robot: > Hi Thomas, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on drm-misc/drm-misc-next] > [also build test ERROR on linus/master v6.7-rc4 next-20231205] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/fbdev-efifb-Replace-references-to-global-screen_info-by-local-pointer/20231204-173019 > base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next > patch link: https://lore.kernel.org/r/20231204092812.2612-2-tzimmermann%40suse.de > patch subject: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer > config: x86_64-randconfig-006-20231206 (https://download.01.org/0day-ci/archive/20231206/202312060820.0Kjx88on-lkp@intel.com/config) > compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231206/202312060820.0Kjx88on-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202312060820.0Kjx88on-lkp@intel.com/ > > All errors (new ones prefixed by >>): > > drivers/video/fbdev/efifb.c: In function 'efifb_probe': >>> drivers/video/fbdev/efifb.c:511:2: error: too few arguments to function 'efifb_show_boot_graphics' > efifb_show_boot_graphics(info); > ^~~~~~~~~~~~~~~~~~~~~~~~ > drivers/video/fbdev/efifb.c:150:13: note: declared here > static void efifb_show_boot_graphics(struct fb_info *info, struct screen_info *si) > ^~~~~~~~~~~~~~~~~~~~~~~~ I had deferred takeover disabled, so I didn't notice. Will be fixed before merging the patchset. Best regards Thomas > > > vim +/efifb_show_boot_graphics +511 drivers/video/fbdev/efifb.c > > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 358 > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 359 static int efifb_probe(struct platform_device *dev) > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 360 { > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 361 struct screen_info *si = &screen_info; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 362 struct fb_info *info; > 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 363 struct efifb_par *par; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 364 int err, orientation; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 365 unsigned int size_vmode; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 366 unsigned int size_remap; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 367 unsigned int size_total; > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 368 char *option = NULL; > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 369 efi_memory_desc_t md; > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 370 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 371 if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 372 return -ENODEV; > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 373 > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 374 if (fb_get_options("efifb", &option)) > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 375 return -ENODEV; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 376 efifb_setup(si, option); > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 377 > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 378 /* We don't get linelength from UGA Draw Protocol, only from > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 379 * EFI Graphics Protocol. So if it's not in DMI, and it's not > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 380 * passed in from the user, we really can't use the framebuffer. > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 381 */ > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 382 if (!si->lfb_linelength) > e6816a8d855494 drivers/video/efifb.c David Rheinsberg 2013-08-02 383 return -ENODEV; > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 384 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 385 if (!si->lfb_depth) > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 386 si->lfb_depth = 32; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 387 if (!si->pages) > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 388 si->pages = 1; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 389 if (!fb_base_is_valid(si)) { > 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 390 printk(KERN_DEBUG "efifb: invalid framebuffer address\n"); > 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 391 return -ENODEV; > 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 392 } > 133bb070e94ab4 drivers/video/efifb.c Matthew Garrett 2009-04-13 393 printk(KERN_INFO "efifb: probing for efifb\n"); > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 394 > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 395 /* just assume they're all unset if any are */ > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 396 if (!si->blue_size) { > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 397 si->blue_size = 8; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 398 si->blue_pos = 0; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 399 si->green_size = 8; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 400 si->green_pos = 8; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 401 si->red_size = 8; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 402 si->red_pos = 16; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 403 si->rsvd_size = 8; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 404 si->rsvd_pos = 24; > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 405 } > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 406 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 407 efifb_fix.smem_start = si->lfb_base; > ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 408 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 409 if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE) { > ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 410 u64 ext_lfb_base; > ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 411 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 412 ext_lfb_base = (u64)(unsigned long)si->ext_lfb_base << 32; > ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 413 efifb_fix.smem_start |= ext_lfb_base; > ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 414 } > ae2ee627dc87a7 drivers/video/fbdev/efifb.c Matt Fleming 2015-08-25 415 > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 416 if (bar_resource && > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 417 bar_resource->start + bar_offset != efifb_fix.smem_start) { > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 418 dev_info(&efifb_pci_dev->dev, > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 419 "BAR has moved, updating efifb address\n"); > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 420 efifb_fix.smem_start = bar_resource->start + bar_offset; > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 421 } > dcf8f5ce316565 drivers/video/fbdev/efifb.c Ard Biesheuvel 2017-08-18 422 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 423 efifb_defined.bits_per_pixel = si->lfb_depth; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 424 efifb_defined.xres = si->lfb_width; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 425 efifb_defined.yres = si->lfb_height; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 426 efifb_fix.line_length = si->lfb_linelength; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 427 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 428 /* size_vmode -- that is the amount of memory needed for the > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 429 * used video mode, i.e. the minimum amount of > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 430 * memory we need. */ > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 431 size_vmode = efifb_defined.yres * efifb_fix.line_length; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 432 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 433 /* size_total -- all video memory we have. Used for > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 434 * entries, ressource allocation and bounds > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 435 * checking. */ > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 436 size_total = si->lfb_size; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 437 if (size_total < size_vmode) > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 438 size_total = size_vmode; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 439 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 440 /* size_remap -- the amount of video memory we are going to > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 441 * use for efifb. With modern cards it is no > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 442 * option to simply use size_total as that > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 443 * wastes plenty of kernel address space. */ > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 444 size_remap = size_vmode * 2; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 445 if (size_remap > size_total) > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 446 size_remap = size_total; > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 447 if (size_remap % PAGE_SIZE) > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 448 size_remap += PAGE_SIZE - (size_remap % PAGE_SIZE); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 449 efifb_fix.smem_len = size_remap; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 450 > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 451 if (request_mem_region(efifb_fix.smem_start, size_remap, "efifb")) { > da0241f12bf785 drivers/video/efifb.c Andy Lutomirski 2011-05-26 452 request_mem_succeeded = true; > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 453 } else { > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 454 /* We cannot make this fatal. Sometimes this comes from magic > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 455 spaces our resource handlers simply don't know about */ > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 456 pr_warn("efifb: cannot reserve video memory at 0x%lx\n", > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 457 efifb_fix.smem_start); > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 458 } > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 459 > 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 460 info = framebuffer_alloc(sizeof(*par), &dev->dev); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 461 if (!info) { > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 462 err = -ENOMEM; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 463 goto err_release_mem; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 464 } > 65b4021ed67622 drivers/video/efifb.c David Rheinsberg 2014-01-23 465 platform_set_drvdata(dev, info); > 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 466 par = info->par; > 82dcb90b651bcb drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 467 info->pseudo_palette = par->pseudo_palette; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 468 > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 469 par->base = efifb_fix.smem_start; > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 470 par->size = size_remap; > 4410f3910947dc drivers/video/efifb.c Dave Airlie 2009-06-16 471 > 6163a985e50cb1 drivers/video/fbdev/efifb.c Juergen Gross 2020-07-10 472 if (efi_enabled(EFI_MEMMAP) && > c2999c281ea2d2 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-03-28 473 !efi_mem_desc_lookup(efifb_fix.smem_start, &md)) { > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 474 if ((efifb_fix.smem_start + efifb_fix.smem_len) > > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 475 (md.phys_addr + (md.num_pages << EFI_PAGE_SHIFT))) { > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 476 pr_err("efifb: video memory @ 0x%lx spans multiple EFI memory regions\n", > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 477 efifb_fix.smem_start); > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 478 err = -EIO; > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 479 goto err_release_fb; > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 480 } > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 481 /* > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 482 * If the UEFI memory map covers the efifb region, we may only > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 483 * remap it using the attributes the memory map prescribes. > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 484 */ > f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 485 md.attribute &= EFI_MEMORY_UC | EFI_MEMORY_WC | > f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 486 EFI_MEMORY_WT | EFI_MEMORY_WB; > f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 487 if (md.attribute) { > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 488 mem_flags |= EFI_MEMORY_WT | EFI_MEMORY_WB; > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 489 mem_flags &= md.attribute; > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 490 } > f8585539df0a15 drivers/video/fbdev/efifb.c Ard Biesheuvel 2019-05-16 491 } > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 492 if (mem_flags & EFI_MEMORY_WC) > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 493 info->screen_base = ioremap_wc(efifb_fix.smem_start, > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 494 efifb_fix.smem_len); > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 495 else if (mem_flags & EFI_MEMORY_UC) > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 496 info->screen_base = ioremap(efifb_fix.smem_start, > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 497 efifb_fix.smem_len); > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 498 else if (mem_flags & EFI_MEMORY_WT) > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 499 info->screen_base = memremap(efifb_fix.smem_start, > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 500 efifb_fix.smem_len, MEMREMAP_WT); > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 501 else if (mem_flags & EFI_MEMORY_WB) > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 502 info->screen_base = memremap(efifb_fix.smem_start, > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 503 efifb_fix.smem_len, MEMREMAP_WB); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 504 if (!info->screen_base) { > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 505 pr_err("efifb: abort, cannot remap video memory 0x%x @ 0x%lx\n", > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 506 efifb_fix.smem_len, efifb_fix.smem_start); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 507 err = -EIO; > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 508 goto err_release_fb; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 509 } > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 510 > 34db50e5565662 drivers/video/fbdev/efifb.c Hans de Goede 2018-07-03 @511 efifb_show_boot_graphics(info); > 34db50e5565662 drivers/video/fbdev/efifb.c Hans de Goede 2018-07-03 512 > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 513 pr_info("efifb: framebuffer at 0x%lx, using %dk, total %dk\n", > a53dd258279c1e drivers/video/fbdev/efifb.c Andy Lutomirski 2016-05-11 514 efifb_fix.smem_start, size_remap/1024, size_total/1024); > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 515 pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n", > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 516 efifb_defined.xres, efifb_defined.yres, > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 517 efifb_defined.bits_per_pixel, efifb_fix.line_length, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 518 si->pages); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 519 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 520 efifb_defined.xres_virtual = efifb_defined.xres; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 521 efifb_defined.yres_virtual = efifb_fix.smem_len / > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 522 efifb_fix.line_length; > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 523 pr_info("efifb: scrolling: redraw\n"); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 524 efifb_defined.yres_virtual = efifb_defined.yres; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 525 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 526 /* some dummy values for timing to make fbset happy */ > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 527 efifb_defined.pixclock = 10000000 / efifb_defined.xres * > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 528 1000 / efifb_defined.yres; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 529 efifb_defined.left_margin = (efifb_defined.xres / 8) & 0xf8; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 530 efifb_defined.hsync_len = (efifb_defined.xres / 8) & 0xf8; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 531 > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 532 efifb_defined.red.offset = si->red_pos; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 533 efifb_defined.red.length = si->red_size; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 534 efifb_defined.green.offset = si->green_pos; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 535 efifb_defined.green.length = si->green_size; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 536 efifb_defined.blue.offset = si->blue_pos; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 537 efifb_defined.blue.length = si->blue_size; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 538 efifb_defined.transp.offset = si->rsvd_pos; > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 539 efifb_defined.transp.length = si->rsvd_size; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 540 > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 541 pr_info("efifb: %s: " > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 542 "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n", > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 543 "Truecolor", > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 544 si->rsvd_size, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 545 si->red_size, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 546 si->green_size, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 547 si->blue_size, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 548 si->rsvd_pos, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 549 si->red_pos, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 550 si->green_pos, > c1c324fc4ecca7 drivers/video/fbdev/efifb.c Thomas Zimmermann 2023-12-04 551 si->blue_pos); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 552 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 553 efifb_fix.ypanstep = 0; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 554 efifb_fix.ywrapstep = 0; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 555 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 556 info->fbops = &efifb_ops; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 557 info->var = efifb_defined; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 558 info->fix = efifb_fix; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 559 > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 560 orientation = drm_get_panel_orientation_quirk(efifb_defined.xres, > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 561 efifb_defined.yres); > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 562 switch (orientation) { > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 563 default: > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 564 info->fbcon_rotate_hint = FB_ROTATE_UR; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 565 break; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 566 case DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP: > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 567 info->fbcon_rotate_hint = FB_ROTATE_UD; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 568 break; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 569 case DRM_MODE_PANEL_ORIENTATION_LEFT_UP: > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 570 info->fbcon_rotate_hint = FB_ROTATE_CCW; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 571 break; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 572 case DRM_MODE_PANEL_ORIENTATION_RIGHT_UP: > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 573 info->fbcon_rotate_hint = FB_ROTATE_CW; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 574 break; > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 575 } > 028b186f4489dc drivers/video/fbdev/efifb.c Hans de Goede 2017-11-25 576 > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 577 err = sysfs_create_groups(&dev->dev.kobj, efifb_groups); > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 578 if (err) { > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 579 pr_err("efifb: cannot add sysfs attrs\n"); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 580 goto err_unmap; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 581 } > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 582 err = fb_alloc_cmap(&info->cmap, 256, 0); > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 583 if (err < 0) { > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 584 pr_err("efifb: cannot allocate colormap\n"); > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 585 goto err_groups; > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 586 } > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 587 > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 588 if (efifb_pci_dev) > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 589 WARN_ON(pm_runtime_get_sync(&efifb_pci_dev->dev) < 0); > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 590 > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 591 err = devm_aperture_acquire_for_platform_device(dev, par->base, par->size); > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 592 if (err) { > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 593 pr_err("efifb: cannot acquire aperture\n"); > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 594 goto err_put_rpm_ref; > 7191ec8015f363 drivers/video/fbdev/efifb.c Thomas Zimmermann 2022-12-19 595 } > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 596 err = register_framebuffer(info); > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 597 if (err < 0) { > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 598 pr_err("efifb: cannot register framebuffer\n"); > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 599 goto err_put_rpm_ref; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 600 } > 31b6780c15a4e3 drivers/video/efifb.c Joe Perches 2013-09-19 601 fb_info(info, "%s frame buffer device\n", info->fix.id); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 602 return 0; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 603 > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 604 err_put_rpm_ref: > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 605 if (efifb_pci_dev) > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 606 pm_runtime_put(&efifb_pci_dev->dev); > 55285e21f04517 drivers/video/fbdev/efifb.c Imre Deak 2021-08-09 607 > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 608 fb_dealloc_cmap(&info->cmap); > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 609 err_groups: > 753375a881caa0 drivers/video/fbdev/efifb.c Peter Jones 2016-10-18 610 sysfs_remove_groups(&dev->dev.kobj, efifb_groups); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 611 err_unmap: > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 612 if (mem_flags & (EFI_MEMORY_UC | EFI_MEMORY_WC)) > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 613 iounmap(info->screen_base); > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 614 else > 38ac0287b7f4f3 drivers/video/fbdev/efifb.c Ard Biesheuvel 2018-07-11 615 memunmap(info->screen_base); > 7c08c9ae0c1458 drivers/video/efifb.c Peter Jones 2008-10-15 616 err_release_fb: > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 617 framebuffer_release(info); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 618 err_release_mem: > da0241f12bf785 drivers/video/efifb.c Andy Lutomirski 2011-05-26 619 if (request_mem_succeeded) > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 620 release_mem_region(efifb_fix.smem_start, size_total); > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 621 return err; > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 622 } > 7c83172b98e569 drivers/video/efifb.c Huang, Ying 2007-11-28 623 > -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 840 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 2/4] fbdev/efifb: Use screen_info pointer from device 2023-12-04 9:27 [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer Thomas Zimmermann @ 2023-12-04 9:27 ` Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 3/4] fbdev/vesafb: Replace references to global screen_info by local pointer Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device Thomas Zimmermann 3 siblings, 0 replies; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw) To: javierm, deller, pjones; +Cc: linux-fbdev, dri-devel, Thomas Zimmermann Use the screen_info instance from the device instead of dereferencing the global screen_info state. Decouples the driver from per-architecture code. Duplicated the screen_info data, so that efifb can modify it at will. v2: * comment on devm_kmemdup() usage (Javier) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> --- drivers/video/fbdev/efifb.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c index 6cbb65bbe1110..4d7e899a1c853 100644 --- a/drivers/video/fbdev/efifb.c +++ b/drivers/video/fbdev/efifb.c @@ -358,7 +358,7 @@ static u64 bar_offset; static int efifb_probe(struct platform_device *dev) { - struct screen_info *si = &screen_info; + struct screen_info *si; struct fb_info *info; struct efifb_par *par; int err, orientation; @@ -368,6 +368,18 @@ static int efifb_probe(struct platform_device *dev) char *option = NULL; efi_memory_desc_t md; + /* + * If we fail probing the device, the kernel might try a different + * driver. We get a copy of the attached screen_info, so that we can + * modify its values without affecting later drivers. + */ + si = dev_get_platdata(&dev->dev); + if (!si) + return -ENODEV; + si = devm_kmemdup(&dev->dev, si, sizeof(*si), GFP_KERNEL); + if (!si) + return -ENOMEM; + if (si->orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled) return -ENODEV; -- 2.43.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 3/4] fbdev/vesafb: Replace references to global screen_info by local pointer 2023-12-04 9:27 [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 2/4] fbdev/efifb: Use screen_info pointer from device Thomas Zimmermann @ 2023-12-04 9:27 ` Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device Thomas Zimmermann 3 siblings, 0 replies; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw) To: javierm, deller, pjones; +Cc: linux-fbdev, dri-devel, Thomas Zimmermann Get the global screen_info's address once and access the data via this pointer. Limits the use of global state. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> --- drivers/video/fbdev/vesafb.c | 66 +++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/drivers/video/fbdev/vesafb.c b/drivers/video/fbdev/vesafb.c index c0edceea0a793..ea89accbec385 100644 --- a/drivers/video/fbdev/vesafb.c +++ b/drivers/video/fbdev/vesafb.c @@ -243,6 +243,7 @@ static int vesafb_setup(char *options) static int vesafb_probe(struct platform_device *dev) { + struct screen_info *si = &screen_info; struct fb_info *info; struct vesafb_par *par; int i, err; @@ -255,17 +256,17 @@ static int vesafb_probe(struct platform_device *dev) fb_get_options("vesafb", &option); vesafb_setup(option); - if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB) + if (si->orig_video_isVGA != VIDEO_TYPE_VLFB) return -ENODEV; - vga_compat = (screen_info.capabilities & 2) ? 0 : 1; - vesafb_fix.smem_start = screen_info.lfb_base; - vesafb_defined.bits_per_pixel = screen_info.lfb_depth; + vga_compat = (si->capabilities & 2) ? 0 : 1; + vesafb_fix.smem_start = si->lfb_base; + vesafb_defined.bits_per_pixel = si->lfb_depth; if (15 == vesafb_defined.bits_per_pixel) vesafb_defined.bits_per_pixel = 16; - vesafb_defined.xres = screen_info.lfb_width; - vesafb_defined.yres = screen_info.lfb_height; - vesafb_fix.line_length = screen_info.lfb_linelength; + vesafb_defined.xres = si->lfb_width; + vesafb_defined.yres = si->lfb_height; + vesafb_fix.line_length = si->lfb_linelength; vesafb_fix.visual = (vesafb_defined.bits_per_pixel == 8) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR; @@ -277,7 +278,7 @@ static int vesafb_probe(struct platform_device *dev) /* size_total -- all video memory we have. Used for mtrr * entries, resource allocation and bounds * checking. */ - size_total = screen_info.lfb_size * 65536; + size_total = si->lfb_size * 65536; if (vram_total) size_total = vram_total * 1024 * 1024; if (size_total < size_vmode) @@ -297,7 +298,7 @@ static int vesafb_probe(struct platform_device *dev) vesafb_fix.smem_len = size_remap; #ifndef __i386__ - screen_info.vesapm_seg = 0; + si->vesapm_seg = 0; #endif if (!request_mem_region(vesafb_fix.smem_start, size_total, "vesafb")) { @@ -317,23 +318,26 @@ static int vesafb_probe(struct platform_device *dev) par = info->par; info->pseudo_palette = par->pseudo_palette; - par->base = screen_info.lfb_base; + par->base = si->lfb_base; par->size = size_total; printk(KERN_INFO "vesafb: mode is %dx%dx%d, linelength=%d, pages=%d\n", - vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, vesafb_fix.line_length, screen_info.pages); + vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, + vesafb_fix.line_length, si->pages); - if (screen_info.vesapm_seg) { + if (si->vesapm_seg) { printk(KERN_INFO "vesafb: protected mode interface info at %04x:%04x\n", - screen_info.vesapm_seg,screen_info.vesapm_off); + si->vesapm_seg, si->vesapm_off); } - if (screen_info.vesapm_seg < 0xc000) + if (si->vesapm_seg < 0xc000) ypan = pmi_setpal = 0; /* not available or some DOS TSR ... */ if (ypan || pmi_setpal) { + unsigned long pmi_phys; unsigned short *pmi_base; - pmi_base = (unsigned short*)phys_to_virt(((unsigned long)screen_info.vesapm_seg << 4) + screen_info.vesapm_off); + pmi_phys = ((unsigned long)si->vesapm_seg << 4) + si->vesapm_off; + pmi_base = (unsigned short *)phys_to_virt(pmi_phys); pmi_start = (void*)((char*)pmi_base + pmi_base[1]); pmi_pal = (void*)((char*)pmi_base + pmi_base[2]); printk(KERN_INFO "vesafb: pmi: set display start = %p, set palette = %p\n",pmi_start,pmi_pal); @@ -377,14 +381,14 @@ static int vesafb_probe(struct platform_device *dev) vesafb_defined.left_margin = (vesafb_defined.xres / 8) & 0xf8; vesafb_defined.hsync_len = (vesafb_defined.xres / 8) & 0xf8; - vesafb_defined.red.offset = screen_info.red_pos; - vesafb_defined.red.length = screen_info.red_size; - vesafb_defined.green.offset = screen_info.green_pos; - vesafb_defined.green.length = screen_info.green_size; - vesafb_defined.blue.offset = screen_info.blue_pos; - vesafb_defined.blue.length = screen_info.blue_size; - vesafb_defined.transp.offset = screen_info.rsvd_pos; - vesafb_defined.transp.length = screen_info.rsvd_size; + vesafb_defined.red.offset = si->red_pos; + vesafb_defined.red.length = si->red_size; + vesafb_defined.green.offset = si->green_pos; + vesafb_defined.green.length = si->green_size; + vesafb_defined.blue.offset = si->blue_pos; + vesafb_defined.blue.length = si->blue_size; + vesafb_defined.transp.offset = si->rsvd_pos; + vesafb_defined.transp.length = si->rsvd_size; if (vesafb_defined.bits_per_pixel <= 8) { depth = vesafb_defined.green.length; @@ -399,14 +403,14 @@ static int vesafb_probe(struct platform_device *dev) (vesafb_defined.bits_per_pixel > 8) ? "Truecolor" : (vga_compat || pmi_setpal) ? "Pseudocolor" : "Static Pseudocolor", - screen_info.rsvd_size, - screen_info.red_size, - screen_info.green_size, - screen_info.blue_size, - screen_info.rsvd_pos, - screen_info.red_pos, - screen_info.green_pos, - screen_info.blue_pos); + si->rsvd_size, + si->red_size, + si->green_size, + si->blue_size, + si->rsvd_pos, + si->red_pos, + si->green_pos, + si->blue_pos); vesafb_fix.ypanstep = ypan ? 1 : 0; vesafb_fix.ywrapstep = (ypan>1) ? 1 : 0; -- 2.43.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device 2023-12-04 9:27 [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb Thomas Zimmermann ` (2 preceding siblings ...) 2023-12-04 9:27 ` [PATCH v2 3/4] fbdev/vesafb: Replace references to global screen_info by local pointer Thomas Zimmermann @ 2023-12-04 9:27 ` Thomas Zimmermann 3 siblings, 0 replies; 11+ messages in thread From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw) To: javierm, deller, pjones; +Cc: linux-fbdev, dri-devel, Thomas Zimmermann Use the screen_info instance from the device instead of dereferencing the global screen_info state. Decouples the driver from per-architecture code. Duplicated the screen_info data, so that vesafb can modify it at will. v2: * comment on devm_kmemdup() usage (Javier) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> --- drivers/video/fbdev/vesafb.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/vesafb.c b/drivers/video/fbdev/vesafb.c index ea89accbec385..8ab64ae4cad3e 100644 --- a/drivers/video/fbdev/vesafb.c +++ b/drivers/video/fbdev/vesafb.c @@ -243,7 +243,7 @@ static int vesafb_setup(char *options) static int vesafb_probe(struct platform_device *dev) { - struct screen_info *si = &screen_info; + struct screen_info *si; struct fb_info *info; struct vesafb_par *par; int i, err; @@ -252,6 +252,18 @@ static int vesafb_probe(struct platform_device *dev) unsigned int size_total; char *option = NULL; + /* + * If we fail probing the device, the kernel might try a different + * driver. We get a copy of the attached screen_info, so that we can + * modify its values without affecting later drivers. + */ + si = dev_get_platdata(&dev->dev); + if (!si) + return -ENODEV; + si = devm_kmemdup(&dev->dev, si, sizeof(*si), GFP_KERNEL); + if (!si) + return -ENOMEM; + /* ignore error return of fb_get_options */ fb_get_options("vesafb", &option); vesafb_setup(option); -- 2.43.0 ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-12-06 10:55 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-04 9:27 [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer Thomas Zimmermann 2023-12-04 19:53 ` [v2,1/4] " Sui Jingfeng 2023-12-06 8:50 ` [v2, 1/4] " Thomas Zimmermann 2023-12-06 9:45 ` [v2,1/4] " Thomas Zimmermann 2023-12-06 10:46 ` Sui Jingfeng 2023-12-06 0:19 ` [PATCH v2 1/4] " kernel test robot 2023-12-06 8:32 ` Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 2/4] fbdev/efifb: Use screen_info pointer from device Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 3/4] fbdev/vesafb: Replace references to global screen_info by local pointer Thomas Zimmermann 2023-12-04 9:27 ` [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device Thomas Zimmermann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).