[Balloon-svn] r1174 - balloon/branches/menuconfig/kernel/2.6…

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: subversion@balloonboard.org
Date:  
To: balloon-svn
Subject: [Balloon-svn] r1174 - balloon/branches/menuconfig/kernel/2.6.34
Author: nick
Date: 2010-06-24 16:37:15 +0100 (Thu, 24 Jun 2010)
New Revision: 1174

Added:
balloon/branches/menuconfig/kernel/2.6.34/balloon3-ramdisks.patch
Modified:
balloon/branches/menuconfig/kernel/2.6.34/series-CUED
Log:
add ramdisk support for extra CUED ram and static ram

Added: balloon/branches/menuconfig/kernel/2.6.34/balloon3-ramdisks.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.34/balloon3-ramdisks.patch                            (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.34/balloon3-ramdisks.patch    2010-06-24 15:37:15 UTC (rev 1174)
@@ -0,0 +1,404 @@
+Index: linux-2.6.34/drivers/block/Kconfig
+===================================================================
+--- linux-2.6.34.orig/drivers/block/Kconfig    2010-06-22 17:53:07.000000000 +0100
++++ linux-2.6.34/drivers/block/Kconfig    2010-06-24 15:45:52.000000000 +0100
+@@ -488,4 +488,25 @@
+ 
+       If unsure, say N.
+ 
++config BLK_DEV_SRRD
++    tristate "PXA270 static ram ramdisk driver"
++    depends on HAVE_IDE
++    depends on ARCH_PXA
++    help
++      This is a simple static ramdisk implementation
++      to provide access to the pxa270 static ram
++
++      If unsure, say N.
++
++config BLK_DEV_B3RD
++    tristate "Balloon3 extra ram ramdisk driver"
++    depends on HAVE_IDE
++    depends on ARCH_PXA
++    help
++      This is a simple ramdisk implementation
++      to provide access to the balloon3 128MB extra ram
++      fitted to some builds that is otherwise inaccessible.
++
++      If unsure, say N.
++
+ endif # BLK_DEV
+Index: linux-2.6.34/drivers/block/Makefile
+===================================================================
+--- linux-2.6.34.orig/drivers/block/Makefile    2010-06-22 17:53:03.000000000 +0100
++++ linux-2.6.34/drivers/block/Makefile    2010-06-24 15:46:11.000000000 +0100
+@@ -37,5 +37,7 @@
+ 
+ obj-$(CONFIG_XEN_BLKDEV_FRONTEND)    += xen-blkfront.o
+ obj-$(CONFIG_BLK_DEV_DRBD)     += drbd/
++obj-$(CONFIG_BLK_DEV_B3RD)     += b3rd.o
++obj-$(CONFIG_BLK_DEV_SRRD)     += b3srrd.o
+ 
+ swim_mod-objs    := swim.o swim_asm.o
+Index: linux-2.6.34/drivers/block/b3rd.c
+===================================================================
+--- /dev/null    1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.34/drivers/block/b3rd.c    2010-06-24 12:23:10.000000000 +0100
+@@ -0,0 +1,176 @@
++/*
++ * Balloon3 Extra Ram backed block device driver.
++ *
++ * Copyright (C) 2010 Nick Bane 
++ *
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++//#include <linux/moduleparam.h>
++#include <linux/major.h>
++#include <linux/blkdev.h>
++
++#define VERIFY_WRITES
++#define B3NAME "b3ramdisk"
++
++#define ram_physaddr 0x80000000
++#define b3_sect_size  512
++#define ram_size  (128 * 1024 * 1024UL)
++#define b3_sectors (ram_size / b3_sect_size)
++
++static int b3_major = 0;
++static char * ram_ptr = NULL;
++static struct resource * ram_resource = NULL;
++static struct gendisk *b3_disk = NULL;
++static struct request_queue *b3_queue = NULL;
++static DEFINE_SPINLOCK(b3_spinlock);
++
++static int b3_ioctl ( struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) {
++    return -EINVAL;
++}
++
++static struct block_device_operations b3_fops = {
++    .owner    = THIS_MODULE,
++    .ioctl = b3_ioctl,
++};
++
++static void
++b3_request(struct request_queue *rq) {
++    struct request *req;
++    req = blk_fetch_request(rq);
++    while (req) {
++        int err = 0;
++        if (blk_fs_request(req)) {
++            unsigned long start = blk_rq_pos(req) << 9;
++            unsigned long len = blk_rq_cur_bytes(req);
++            if (ram_ptr == NULL) {
++                printk(KERN_ERR B3NAME ": no ram backing store\n");
++                err = -EIO;
++            }
++            else if (start + len > ram_size) {
++                printk(KERN_ERR B3NAME ": trying to access beyond size limit\n");
++                err = -EIO;
++            }
++            else {
++                switch (rq_data_dir(req)) {
++                case READ:
++                    memcpy (req->buffer, ram_ptr + start, len);
++                    break;
++                case WRITE:
++                    memcpy (ram_ptr + start, req->buffer, len);
++#ifdef VERIFY_WRITES
++                    {
++                        unsigned long i;
++                        for (i =0; i < len; i++) {
++                            if (*(ram_ptr + start + i) != req->buffer[i]) {
++                                printk(KERN_INFO B3NAME ": Write verify failure in sector 0x%lx, offset 0x%lx, xfer size 0x%lx\n", start >> 9, i, len);
++                                printk(KERN_INFO B3NAME ": Byte is 0x%x, should be 0x%x\n", *(ram_ptr + start +i), req->buffer[i]);
++                                break;
++                            }
++                        }
++                    }
++#endif
++                    break;
++                }
++            }
++        }
++        if (!__blk_end_request_cur(req,err))
++            req = blk_fetch_request(rq);
++    }
++}
++
++static struct kobject *
++b3_probe(dev_t dev, int *part, void *data)
++{
++    struct kobject *kobj;
++    kobj = get_disk(b3_disk);
++    *part = 0;
++    return kobj;
++}
++
++/* simple sanity check to see if we are in a writable region */
++static int
++check_ram(void) {
++#if 0
++    unsigned long i;
++    /* I am sure this could be much more efficient but it will do for now */
++    for (i = 0; i < 4096 * 2; i++) {
++        char foo = ram_ptr[i];
++        ram_ptr[i] = ~foo;
++        if (ram_ptr[i] != ~foo) {
++            printk(KERN_INFO "b3rd: unable write to ram at offset %ld\n",i);
++            return -EIO;
++        }
++        ram_ptr[i] = foo;
++    }
++#endif
++    return 0;
++}
++
++static int __init b3rd_init(void)
++{
++    if ((ram_resource = request_mem_region_exclusive(ram_physaddr, ram_size, B3NAME)) != NULL)
++        ram_ptr = ioremap(ram_physaddr, ram_size);
++    if (!ram_ptr) {
++        printk(KERN_INFO "b3rd: unable to ioremap ram\n");
++        goto err;
++    }
++    if (check_ram() != 0)
++        goto err;
++    if ((b3_major = register_blkdev(b3_major, B3NAME)) <= 0)
++        goto err;
++    if ((b3_queue = blk_init_queue(b3_request, &b3_spinlock)) == NULL)
++        goto err;
++    blk_queue_logical_block_size(b3_queue, b3_sect_size);
++    if ((b3_disk = alloc_disk(1)) == NULL)
++        goto err;
++    b3_disk->fops = &b3_fops;
++    set_capacity(b3_disk, ram_size / 512);
++    b3_disk->queue =  b3_queue;
++    b3_disk->major = b3_major;
++    b3_disk->first_minor = 0;
++    sprintf(b3_disk->disk_name,B3NAME);
++    add_disk(b3_disk);
++    blk_register_region(MKDEV(b3_major, 0), 1, THIS_MODULE, b3_probe, NULL, NULL);
++    printk(KERN_INFO "b3rd: %ldk ramdisk installed\n", ram_size/1024);
++    return 0;
++err:
++    if (ram_ptr)
++        iounmap(ram_ptr);
++    if (ram_resource)
++        release_mem_region(ram_physaddr, ram_size);
++    if (b3_disk) {
++        del_gendisk(b3_disk);
++        put_disk(b3_disk);
++    }
++    if (b3_queue)
++        blk_cleanup_queue(b3_queue);
++    if (b3_major) {
++        blk_unregister_region(MKDEV(b3_major, 0), 1);
++        unregister_blkdev(b3_major, B3NAME);
++    }
++    return -EIO;
++}
++
++static void __exit b3rd_exit(void)
++{
++    blk_unregister_region(MKDEV(b3_major, 0), 1);
++    unregister_blkdev(b3_major, B3NAME);
++    del_gendisk(b3_disk);
++    put_disk(b3_disk);
++    blk_cleanup_queue(b3_queue);
++    if (ram_ptr)
++        iounmap(ram_ptr);
++    if (ram_resource)
++        release_mem_region(ram_physaddr, ram_size);
++}
++
++module_init(b3rd_init);
++module_exit(b3rd_exit);
++
++MODULE_AUTHOR("Nick Bane");
++MODULE_DESCRIPTION("Ramdisk Driver for Balloon3 optional 128MB of non kernel mappable ram");
++MODULE_SUPPORTED_DEVICE("Balloon3");
++MODULE_VERSION("3.6.34");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.34/drivers/block/b3srrd.c
+===================================================================
+--- /dev/null    1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.34/drivers/block/b3srrd.c    2010-06-24 16:00:22.000000000 +0100
+@@ -0,0 +1,176 @@
++/*
++ * Balloon3 Static Ram backed block device driver.
++ *
++ * Copyright (C) 2010 Nick Bane 
++ *
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++//#include <linux/moduleparam.h>
++#include <linux/major.h>
++#include <linux/blkdev.h>
++
++#define VERIFY_WRITES
++#define SRNAME "srrd"
++
++#define sr_physaddr 0x5c000000
++#define sr_sect_size  512
++#define sr_size  (256 * 1024UL)
++#define sr_sectors (sr_size / sr_sect_size)
++
++static int sr_major = 0;
++static char * sr_ptr = NULL;
++static struct resource * sr_resource = NULL;
++static struct gendisk *sr_disk = NULL;
++static struct request_queue *sr_queue = NULL;
++static DEFINE_SPINLOCK(sr_spinlock);
++
++static int sr_ioctl ( struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) {
++    return -EINVAL;
++}
++
++static struct block_device_operations sr_fops = {
++    .owner    = THIS_MODULE,
++    .ioctl = sr_ioctl,
++};
++
++static void
++sr_request(struct request_queue *rq) {
++    struct request *req;
++    req = blk_fetch_request(rq);
++    while (req) {
++        int err = 0;
++        if (blk_fs_request(req)) {
++            unsigned long start = blk_rq_pos(req) << 9;
++            unsigned long len = blk_rq_cur_bytes(req);
++            if (sr_ptr == NULL) {
++                printk(KERN_ERR SRNAME ": no ram backing store\n");
++                err = -EIO;
++            }
++            else if (start + len > sr_size) {
++                printk(KERN_ERR SRNAME ": trying to access beyond size limit\n");
++                err = -EIO;
++            }
++            else {
++                switch (rq_data_dir(req)) {
++                case READ:
++                    memcpy (req->buffer, sr_ptr + start, len);
++                    break;
++                case WRITE:
++                    memcpy (sr_ptr + start, req->buffer, len);
++#ifdef VERIFY_WRITES
++                    {
++                        unsigned long i;
++                        for (i =0; i < len; i++) {
++                            if (*(sr_ptr + start + i) != req->buffer[i]) {
++                                printk(KERN_INFO SRNAME ": Write verify failure in sector 0x%lx, offset 0x%lx, xfer size 0x%lx\n", start >> 9, i, len);
++                                printk(KERN_INFO SRNAME ": Byte is 0x%x, should be 0x%x\n", *(sr_ptr + start +i), req->buffer[i]);
++                                break;
++                            }
++                        }
++                    }
++#endif
++                    break;
++                }
++            }
++        }
++        if (!__blk_end_request_cur(req,err))
++            req = blk_fetch_request(rq);
++    }
++}
++
++static struct kobject *
++sr_probe(dev_t dev, int *part, void *data)
++{
++    struct kobject *kobj;
++    kobj = get_disk(sr_disk);
++    *part = 0;
++    return kobj;
++}
++
++/* simple sanity check to see if we are in a writable region */
++static int
++check_ram(void) {
++#if 0
++    unsigned long i;
++    /* I am sure this could be much more efficient but it will do for now */
++    for (i = 0; i < 4096 * 2; i++) {
++        char foo = sr_ptr[i];
++        sr_ptr[i] = ~foo;
++        if (sr_ptr[i] != ~foo) {
++            printk(KERN_INFO "srrd: unable write to ram at offset %ld\n",i);
++            return -EIO;
++        }
++        ram_ptr[i] = foo;
++    }
++#endif
++    return 0;
++}
++
++static int __init srrd_init(void)
++{
++    if ((sr_resource = request_mem_region_exclusive(sr_physaddr, sr_size, SRNAME)) != NULL)
++        sr_ptr = ioremap(sr_physaddr, sr_size);
++    if (!sr_ptr) {
++        printk(KERN_INFO "srrd: unable to ioremap ram\n");
++        goto err;
++    }
++    if (check_ram() != 0)
++        goto err;
++    if ((sr_major = register_blkdev(sr_major, SRNAME)) <= 0)
++        goto err;
++    if ((sr_queue = blk_init_queue(sr_request, &sr_spinlock)) == NULL)
++        goto err;
++    blk_queue_logical_block_size(sr_queue, sr_sect_size);
++    if ((sr_disk = alloc_disk(1)) == NULL)
++        goto err;
++    sr_disk->fops = &sr_fops;
++    set_capacity(sr_disk, sr_size / 512);
++    sr_disk->queue =  sr_queue;
++    sr_disk->major = sr_major;
++    sr_disk->first_minor = 0;
++    sprintf(sr_disk->disk_name,SRNAME);
++    add_disk(sr_disk);
++    blk_register_region(MKDEV(sr_major, 0), 1, THIS_MODULE, sr_probe, NULL, NULL);
++    printk(KERN_INFO "srrd: %ldk ramdisk installed\n", sr_size/1024);
++    return 0;
++err:
++    if (sr_ptr)
++        iounmap(sr_ptr);
++    if (sr_resource)
++        release_mem_region(sr_physaddr, sr_size);
++    if (sr_disk) {
++        del_gendisk(sr_disk);
++        put_disk(sr_disk);
++    }
++    if (sr_queue)
++        blk_cleanup_queue(sr_queue);
++    if (sr_major) {
++        blk_unregister_region(MKDEV(sr_major, 0), 1);
++        unregister_blkdev(sr_major, SRNAME);
++    }
++    return -EIO;
++}
++
++static void __exit srrd_exit(void)
++{
++    blk_unregister_region(MKDEV(sr_major, 0), 1);
++    unregister_blkdev(sr_major, SRNAME);
++    del_gendisk(sr_disk);
++    put_disk(sr_disk);
++    blk_cleanup_queue(sr_queue);
++    if (sr_ptr)
++        iounmap(sr_ptr);
++    if (sr_resource)
++        release_mem_region(sr_physaddr, sr_size);
++}
++
++module_init(srrd_init);
++module_exit(srrd_exit);
++
++MODULE_AUTHOR("Nick Bane");
++MODULE_DESCRIPTION("PXA270 Static Ramdisk Driver for non kernel mappable ram");
++MODULE_SUPPORTED_DEVICE("Balloon3");
++MODULE_VERSION("3.6.34");
++MODULE_LICENSE("GPL");


Modified: balloon/branches/menuconfig/kernel/2.6.34/series-CUED
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.34/series-CUED    2010-06-21 13:34:07 UTC (rev 1173)
+++ balloon/branches/menuconfig/kernel/2.6.34/series-CUED    2010-06-24 15:37:15 UTC (rev 1174)
@@ -14,3 +14,4 @@
 #balloon3-gether-autoifupdown.patch
 yaffsconfig.patch -p0
 yaffsrootmode.patch
+balloon3-ramdisks.patch