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 ) ;
static ssize_t show_image ( struct file * file , struct kobject * kobj ,
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 ;
}
static struct bin_attribute image_attr = {
. attr = {
. name = " image " ,
. mode = S_IRUGO ,
} ,
. read = show_image ,
} ;
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 ,
} ;
static struct attribute_group bgrt_attribute_group = {
. attrs = bgrt_attributes ,
} ;
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 ;
sysfs_bin_attr_init ( & image_attr ) ;
2012-09-29 04:57:05 +04:00
image_attr . private = bgrt_image ;
image_attr . 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 ;
ret = sysfs_create_bin_file ( bgrt_kobj , & image_attr ) ;
if ( ret )
goto out_group ;
return 0 ;
out_group :
sysfs_remove_group ( bgrt_kobj , & bgrt_attribute_group ) ;
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 " ) ;