* [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb
@ 2023-12-04 9:27 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ 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] 20+ messages in thread
* [PATCH v2 0/4] fbdev: Remove global screen_info in efifb/vesafb
@ 2023-12-04 9:27 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw)
To: javierm, deller, pjones; +Cc: linux-fbdev, Thomas Zimmermann, dri-devel
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] 20+ messages in thread
* [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
2023-12-04 9:27 ` Thomas Zimmermann
@ 2023-12-04 9:27 ` Thomas Zimmermann
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
@ 2023-12-04 9:27 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw)
To: javierm, deller, pjones; +Cc: linux-fbdev, Thomas Zimmermann, dri-devel
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] 20+ messages in thread
* [PATCH v2 2/4] fbdev/efifb: Use screen_info pointer from device
2023-12-04 9:27 ` Thomas Zimmermann
@ 2023-12-04 9:27 ` Thomas Zimmermann
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* [PATCH v2 2/4] fbdev/efifb: Use screen_info pointer from device
@ 2023-12-04 9:27 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw)
To: javierm, deller, pjones; +Cc: linux-fbdev, Thomas Zimmermann, dri-devel
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] 20+ messages in thread
* [PATCH v2 3/4] fbdev/vesafb: Replace references to global screen_info by local pointer
2023-12-04 9:27 ` Thomas Zimmermann
@ 2023-12-04 9:27 ` Thomas Zimmermann
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* [PATCH v2 3/4] fbdev/vesafb: Replace references to global screen_info by local pointer
@ 2023-12-04 9:27 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw)
To: javierm, deller, pjones; +Cc: linux-fbdev, Thomas Zimmermann, dri-devel
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] 20+ messages in thread
* [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device
2023-12-04 9:27 ` Thomas Zimmermann
@ 2023-12-04 9:27 ` Thomas Zimmermann
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device
@ 2023-12-04 9:27 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Zimmermann @ 2023-12-04 9:27 UTC (permalink / raw)
To: javierm, deller, pjones; +Cc: linux-fbdev, Thomas Zimmermann, dri-devel
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] 20+ messages in thread
* Re: [v2, 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
2023-12-04 9:27 ` Thomas Zimmermann
@ 2023-12-04 19:53 ` Sui Jingfeng
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* Re: [v2,1/4] fbdev/efifb: Replace references to global screen_info by local pointer
@ 2023-12-04 19:53 ` Sui Jingfeng
0 siblings, 0 replies; 20+ 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] 20+ messages in thread
* Re: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
2023-12-04 9:27 ` Thomas Zimmermann
@ 2023-12-06 0:19 ` kernel test robot
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* Re: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
@ 2023-12-06 0:19 ` kernel test robot
0 siblings, 0 replies; 20+ messages in thread
From: kernel test robot @ 2023-12-06 0:19 UTC (permalink / raw)
To: Thomas Zimmermann, javierm, deller, pjones
Cc: linux-fbdev, dri-devel, Thomas Zimmermann, oe-kbuild-all
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] 20+ messages in thread
* Re: [PATCH v2 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
2023-12-06 0:19 ` kernel test robot
(?)
@ 2023-12-06 8:32 ` Thomas Zimmermann
-1 siblings, 0 replies; 20+ 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] 20+ 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
-1 siblings, 0 replies; 20+ 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] 20+ 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 9:45 ` Thomas Zimmermann
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* Re: [v2, 1/4] fbdev/efifb: Replace references to global screen_info by local pointer
@ 2023-12-06 9:45 ` Thomas Zimmermann
0 siblings, 0 replies; 20+ 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] 20+ 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
-1 siblings, 0 replies; 20+ 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] 20+ messages in thread
* Re: [v2,1/4] fbdev/efifb: Replace references to global screen_info by local pointer
@ 2023-12-06 10:46 ` Sui Jingfeng
0 siblings, 0 replies; 20+ 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] 20+ messages in thread
end of thread, other threads:[~2023-12-06 10:55 UTC | newest]
Thread overview: 20+ 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 ` 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 19:53 ` [v2, " Sui Jingfeng
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 9:45 ` [v2, 1/4] " Thomas Zimmermann
2023-12-06 10:46 ` Sui Jingfeng
2023-12-06 10:46 ` [v2,1/4] " Sui Jingfeng
2023-12-06 0:19 ` [PATCH v2 1/4] " kernel test robot
2023-12-06 0:19 ` 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 ` 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 ` Thomas Zimmermann
2023-12-04 9:27 ` [PATCH v2 4/4] fbdev/vesafb: Use screen_info pointer from device Thomas Zimmermann
2023-12-04 9:27 ` Thomas Zimmermann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.