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
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# 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 ;
static ssize_t show_version ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
2017-01-31 16:21:40 +03:00
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab . version ) ;
2012-01-31 22:19:20 +04:00
}
static DEVICE_ATTR ( version , S_IRUGO , show_version , NULL ) ;
static ssize_t show_status ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
2017-01-31 16:21:40 +03:00
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab . status ) ;
2012-01-31 22:19:20 +04:00
}
static DEVICE_ATTR ( status , S_IRUGO , show_status , NULL ) ;
static ssize_t show_type ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
2017-01-31 16:21:40 +03:00
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab . image_type ) ;
2012-01-31 22:19:20 +04:00
}
static DEVICE_ATTR ( type , S_IRUGO , show_type , NULL ) ;
static ssize_t show_xoffset ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
2017-01-31 16:21:40 +03:00
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab . image_offset_x ) ;
2012-01-31 22:19:20 +04:00
}
static DEVICE_ATTR ( xoffset , S_IRUGO , show_xoffset , NULL ) ;
static ssize_t show_yoffset ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
2017-01-31 16:21:40 +03:00
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab . image_offset_y ) ;
2012-01-31 22:19:20 +04:00
}
static DEVICE_ATTR ( yoffset , S_IRUGO , show_yoffset , NULL ) ;
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 [ ] = {
& dev_attr_version . attr ,
& dev_attr_status . attr ,
& dev_attr_type . attr ,
& dev_attr_xoffset . attr ,
& dev_attr_yoffset . attr ,
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 ) ;