EXPORT_SYMBOL_GPL(ps3_gpu_mutex);
 
 static union ps3_firmware_version ps3_firmware_version;
+static char ps3_firmware_version_str[16];
 
 void ps3_get_firmware_version(union ps3_firmware_version *v)
 {
        return lv1_set_dabr(dabr, dabrx) ? -1 : 0;
 }
 
+static ssize_t ps3_fw_version_show(struct kobject *kobj,
+       struct kobj_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%s", ps3_firmware_version_str);
+}
+
+static int __init ps3_setup_sysfs(void)
+{
+       static struct kobj_attribute attr = __ATTR(fw-version, S_IRUGO,
+               ps3_fw_version_show, NULL);
+       static struct kobject *kobj;
+       int result;
+
+       kobj = kobject_create_and_add("ps3", firmware_kobj);
+
+       if (!kobj) {
+               pr_warn("%s:%d: kobject_create_and_add failed.\n", __func__,
+                       __LINE__);
+               return -ENOMEM;
+       }
+
+       result = sysfs_create_file(kobj, &attr.attr);
+
+       if (result) {
+               pr_warn("%s:%d: sysfs_create_file failed.\n", __func__,
+                       __LINE__);
+               kobject_put(kobj);
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+core_initcall(ps3_setup_sysfs);
+
 static void __init ps3_setup_arch(void)
 {
        u64 tmp;
 
        lv1_get_version_info(&ps3_firmware_version.raw, &tmp);
 
-       printk(KERN_INFO "PS3 firmware version %u.%u.%u\n",
-              ps3_firmware_version.major, ps3_firmware_version.minor,
-              ps3_firmware_version.rev);
+       snprintf(ps3_firmware_version_str, sizeof(ps3_firmware_version_str),
+               "%u.%u.%u", ps3_firmware_version.major,
+               ps3_firmware_version.minor, ps3_firmware_version.rev);
+
+       printk(KERN_INFO "PS3 firmware version %s\n", ps3_firmware_version_str);
 
        ps3_spu_set_platform();