2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2012-01-31 22:19:20 +04:00
/*
2016-02-15 08:27:49 +03:00
* BGRT boot graphic support
* Authors : Matthew Garrett , Josh Triplett < josh @ joshtriplett . org >
2012-01-31 22:19:20 +04:00
* Copyright 2012 Red Hat , Inc < mjg @ redhat . com >
2012-09-29 04:57:05 +04:00
* Copyright 2012 Intel Corporation
2012-01-31 22:19:20 +04:00
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/device.h>
# include <linux/sysfs.h>
2012-09-29 04:57:05 +04:00
# include <linux/efi-bgrt.h>
2012-01-31 22:19:20 +04:00
2017-01-31 16:21:40 +03:00
static void * bgrt_image ;
2012-01-31 22:19:20 +04:00
static struct kobject * bgrt_kobj ;
2021-06-23 04:38:01 +03:00
# define BGRT_SHOW(_name, _member) \
static ssize_t _name # # _show ( struct kobject * kobj , \
struct kobj_attribute * attr , char * buf ) \
{ \
2021-06-23 04:38:02 +03:00
return sysfs_emit ( buf , " %d \n " , bgrt_tab . _member ) ; \
2021-06-23 04:38:01 +03:00
} \
2022-04-21 19:42:54 +03:00
static struct kobj_attribute bgrt_attr_ # # _name = __ATTR_RO ( _name )
2021-06-23 04:38:01 +03:00
BGRT_SHOW ( version , version ) ;
BGRT_SHOW ( status , status ) ;
BGRT_SHOW ( type , image_type ) ;
BGRT_SHOW ( xoffset , image_offset_x ) ;
BGRT_SHOW ( yoffset , image_offset_y ) ;
2012-01-31 22:19:20 +04:00
2013-08-21 04:11:49 +04:00
static ssize_t image_read ( struct file * file , struct kobject * kobj ,
2012-01-31 22:19:20 +04:00
struct bin_attribute * attr , char * buf , loff_t off , size_t count )
{
2012-09-29 04:57:05 +04:00
memcpy ( buf , attr - > private + off , count ) ;
2012-01-31 22:19:20 +04:00
return count ;
}
2013-08-21 04:11:49 +04:00
static BIN_ATTR_RO ( image , 0 ) ; /* size gets filled in later */
2012-01-31 22:19:20 +04:00
static struct attribute * bgrt_attributes [ ] = {
2021-06-23 04:38:01 +03:00
& bgrt_attr_version . attr ,
& bgrt_attr_status . attr ,
& bgrt_attr_type . attr ,
& bgrt_attr_xoffset . attr ,
& bgrt_attr_yoffset . attr ,
2012-01-31 22:19:20 +04:00
NULL ,
} ;
2013-08-21 04:11:49 +04:00
static struct bin_attribute * bgrt_bin_attributes [ ] = {
& bin_attr_image ,
NULL ,
} ;
2017-06-30 15:36:34 +03:00
static const struct attribute_group bgrt_attribute_group = {
2012-01-31 22:19:20 +04:00
. attrs = bgrt_attributes ,
2013-08-21 04:11:49 +04:00
. bin_attrs = bgrt_bin_attributes ,
2012-01-31 22:19:20 +04:00
} ;
2017-04-04 19:02:41 +03:00
int __init acpi_parse_bgrt ( struct acpi_table_header * table )
{
efi_bgrt_init ( table ) ;
return 0 ;
}
2012-01-31 22:19:20 +04:00
static int __init bgrt_init ( void )
{
int ret ;
2017-01-31 16:21:40 +03:00
if ( ! bgrt_tab . image_address )
2012-01-31 22:19:20 +04:00
return - ENODEV ;
2017-01-31 16:21:40 +03:00
bgrt_image = memremap ( bgrt_tab . image_address , bgrt_image_size ,
MEMREMAP_WB ) ;
if ( ! bgrt_image ) {
pr_notice ( " Ignoring BGRT: failed to map image memory \n " ) ;
return - ENOMEM ;
}
2013-08-21 04:11:49 +04:00
bin_attr_image . private = bgrt_image ;
bin_attr_image . size = bgrt_image_size ;
2012-01-31 22:19:20 +04:00
bgrt_kobj = kobject_create_and_add ( " bgrt " , acpi_kobj ) ;
2017-01-31 16:21:40 +03:00
if ( ! bgrt_kobj ) {
ret = - EINVAL ;
goto out_memmap ;
}
2012-01-31 22:19:20 +04:00
ret = sysfs_create_group ( bgrt_kobj , & bgrt_attribute_group ) ;
if ( ret )
goto out_kobject ;
return 0 ;
out_kobject :
kobject_put ( bgrt_kobj ) ;
2017-01-31 16:21:40 +03:00
out_memmap :
memunmap ( bgrt_image ) ;
2012-01-31 22:19:20 +04:00
return ret ;
}
2016-02-15 08:27:49 +03:00
device_initcall ( bgrt_init ) ;