summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/sysfb/efidrm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/sysfb/efidrm.c')
-rw-r--r--drivers/gpu/drm/sysfb/efidrm.c130
1 files changed, 12 insertions, 118 deletions
diff --git a/drivers/gpu/drm/sysfb/efidrm.c b/drivers/gpu/drm/sysfb/efidrm.c
index af90064a4c04..46912924636a 100644
--- a/drivers/gpu/drm/sysfb/efidrm.c
+++ b/drivers/gpu/drm/sysfb/efidrm.c
@@ -33,93 +33,10 @@
#define DRIVER_MAJOR 1
#define DRIVER_MINOR 0
-static int efidrm_get_validated_int(struct drm_device *dev, const char *name,
- u64 value, u32 max)
-{
- if (max > INT_MAX)
- max = INT_MAX;
- if (value > max) {
- drm_err(dev, "%s of %llu exceeds maximum of %u\n", name, value, max);
- return -EINVAL;
- }
- return value;
-}
-
-static int efidrm_get_validated_int0(struct drm_device *dev, const char *name,
- u64 value, u32 max)
-{
- if (!value) {
- drm_err(dev, "%s of 0 not allowed\n", name);
- return -EINVAL;
- }
- return efidrm_get_validated_int(dev, name, value, max);
-}
-
-static s64 efidrm_get_validated_size0(struct drm_device *dev, const char *name,
- u64 value, u64 max)
-{
- if (!value) {
- drm_err(dev, "%s of 0 not allowed\n", name);
- return -EINVAL;
- } else if (value > max) {
- drm_err(dev, "%s of %llu exceeds maximum of %llu\n", name, value, max);
- return -EINVAL;
- }
- return value;
-}
-
-static int efidrm_get_width_si(struct drm_device *dev, const struct screen_info *si)
-{
- return efidrm_get_validated_int0(dev, "width", si->lfb_width, U16_MAX);
-}
-
-static int efidrm_get_height_si(struct drm_device *dev, const struct screen_info *si)
-{
- return efidrm_get_validated_int0(dev, "height", si->lfb_height, U16_MAX);
-}
-
-static struct resource *efidrm_get_memory_si(struct drm_device *dev,
- const struct screen_info *si,
- struct resource *res)
-{
- ssize_t num;
-
- num = screen_info_resources(si, res, 1);
- if (!num) {
- drm_err(dev, "memory resource not found\n");
- return NULL;
- }
-
- return res;
-}
-
-static int efidrm_get_stride_si(struct drm_device *dev, const struct screen_info *si,
- const struct drm_format_info *format,
- unsigned int width, unsigned int height, u64 size)
-{
- u64 lfb_linelength = si->lfb_linelength;
-
- if (!lfb_linelength)
- lfb_linelength = drm_format_info_min_pitch(format, 0, width);
-
- return efidrm_get_validated_int0(dev, "stride", lfb_linelength, div64_u64(size, height));
-}
-
-static u64 efidrm_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
- unsigned int height, unsigned int stride, u64 size)
-{
- u64 vsize = PAGE_ALIGN(height * stride);
-
- return efidrm_get_validated_size0(dev, "visible size", vsize, size);
-}
-
static const struct drm_format_info *efidrm_get_format_si(struct drm_device *dev,
const struct screen_info *si)
{
- static const struct {
- struct pixel_format pixel;
- u32 fourcc;
- } efi_formats[] = {
+ static const struct drm_sysfb_format formats[] = {
{ PIXEL_FORMAT_XRGB1555, DRM_FORMAT_XRGB1555, },
{ PIXEL_FORMAT_RGB565, DRM_FORMAT_RGB565, },
{ PIXEL_FORMAT_RGB888, DRM_FORMAT_RGB888, },
@@ -127,33 +44,8 @@ static const struct drm_format_info *efidrm_get_format_si(struct drm_device *dev
{ PIXEL_FORMAT_XBGR8888, DRM_FORMAT_XBGR8888, },
{ PIXEL_FORMAT_XRGB2101010, DRM_FORMAT_XRGB2101010, },
};
- const struct drm_format_info *format = NULL;
- u32 bits_per_pixel;
- size_t i;
-
- bits_per_pixel = __screen_info_lfb_bits_per_pixel(si);
-
- for (i = 0; i < ARRAY_SIZE(efi_formats); ++i) {
- const struct pixel_format *f = &efi_formats[i].pixel;
-
- if (bits_per_pixel == f->bits_per_pixel &&
- si->red_size == f->red.length &&
- si->red_pos == f->red.offset &&
- si->green_size == f->green.length &&
- si->green_pos == f->green.offset &&
- si->blue_size == f->blue.length &&
- si->blue_pos == f->blue.offset) {
- format = drm_format_info(efi_formats[i].fourcc);
- break;
- }
- }
-
- if (!format)
- return ERR_PTR(-EINVAL);
- if (format->is_color_indexed)
- return ERR_PTR(-EINVAL);
- return format;
+ return drm_sysfb_get_format_si(dev, formats, ARRAY_SIZE(formats), si);
}
static u64 efidrm_get_mem_flags(struct drm_device *dev, resource_size_t start,
@@ -258,7 +150,7 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
struct drm_sysfb_device *sysfb;
struct drm_device *dev;
struct resource *mem = NULL;
- void __iomem *screen_base;
+ void __iomem *screen_base = NULL;
struct drm_plane *primary_plane;
struct drm_crtc *crtc;
struct drm_encoder *encoder;
@@ -289,21 +181,21 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
*/
format = efidrm_get_format_si(dev, si);
- if (IS_ERR(format))
- return ERR_CAST(format);
- width = efidrm_get_width_si(dev, si);
+ if (!format)
+ return ERR_PTR(-EINVAL);
+ width = drm_sysfb_get_width_si(dev, si);
if (width < 0)
return ERR_PTR(width);
- height = efidrm_get_height_si(dev, si);
+ height = drm_sysfb_get_height_si(dev, si);
if (height < 0)
return ERR_PTR(height);
- res = efidrm_get_memory_si(dev, si, &resbuf);
+ res = drm_sysfb_get_memory_si(dev, si, &resbuf);
if (!res)
return ERR_PTR(-EINVAL);
- stride = efidrm_get_stride_si(dev, si, format, width, height, resource_size(res));
+ stride = drm_sysfb_get_stride_si(dev, si, format, width, height, resource_size(res));
if (stride < 0)
return ERR_PTR(stride);
- vsize = efidrm_get_visible_size_si(dev, si, height, stride, resource_size(res));
+ vsize = drm_sysfb_get_visible_size_si(dev, si, height, stride, resource_size(res));
if (!vsize)
return ERR_PTR(-EINVAL);
@@ -353,6 +245,8 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
else if (mem_flags & EFI_MEMORY_WB)
screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
MEMREMAP_WB);
+ else
+ drm_err(dev, "invalid mem_flags: 0x%llx\n", mem_flags);
if (!screen_base)
return ERR_PTR(-ENOMEM);
iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);