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/module.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
static struct kobject * bgrt_kobj ;
static ssize_t show_version ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab - > version ) ;
}
static DEVICE_ATTR ( version , S_IRUGO , show_version , NULL ) ;
static ssize_t show_status ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab - > status ) ;
}
static DEVICE_ATTR ( status , S_IRUGO , show_status , NULL ) ;
static ssize_t show_type ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab - > image_type ) ;
}
static DEVICE_ATTR ( type , S_IRUGO , show_type , NULL ) ;
static ssize_t show_xoffset ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab - > image_offset_x ) ;
}
static DEVICE_ATTR ( xoffset , S_IRUGO , show_xoffset , NULL ) ;
static ssize_t show_yoffset ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
return snprintf ( buf , PAGE_SIZE , " %d \n " , bgrt_tab - > image_offset_y ) ;
}
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 ,
} ;
2012-01-31 22:19:20 +04:00
static struct attribute_group bgrt_attribute_group = {
. attrs = bgrt_attributes ,
2013-08-21 04:11:49 +04:00
. bin_attrs = bgrt_bin_attributes ,
2012-01-31 22:19:20 +04:00
} ;
static int __init bgrt_init ( void )
{
int ret ;
2012-09-29 04:57:05 +04:00
if ( ! bgrt_image )
2012-01-31 22:19:20 +04:00
return - ENODEV ;
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 ) ;
2012-09-29 04:57:05 +04:00
if ( ! bgrt_kobj )
return - EINVAL ;
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 ) ;
return ret ;
}
module_init ( bgrt_init ) ;
2012-09-29 04:57:05 +04:00
MODULE_AUTHOR ( " Matthew Garrett, Josh Triplett <josh@joshtriplett.org> " ) ;
2012-01-31 22:19:20 +04:00
MODULE_DESCRIPTION ( " BGRT boot graphic support " ) ;
MODULE_LICENSE ( " GPL " ) ;