diff options
63 files changed, 1807 insertions, 944 deletions
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 7e3a2ebba29b..33244e3d9375 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
| @@ -284,6 +284,7 @@ config CPM2 | |||
| 284 | config AXON_RAM | 284 | config AXON_RAM |
| 285 | tristate "Axon DDR2 memory device driver" | 285 | tristate "Axon DDR2 memory device driver" |
| 286 | depends on PPC_IBM_CELL_BLADE && BLOCK | 286 | depends on PPC_IBM_CELL_BLADE && BLOCK |
| 287 | select DAX | ||
| 287 | default m | 288 | default m |
| 288 | help | 289 | help |
| 289 | It registers one block device per Axon's DDR2 memory bank found | 290 | It registers one block device per Axon's DDR2 memory bank found |
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index f523ac883150..a7fe5fee744f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | #include <linux/bio.h> | 26 | #include <linux/bio.h> |
| 27 | #include <linux/blkdev.h> | 27 | #include <linux/blkdev.h> |
| 28 | #include <linux/dax.h> | ||
| 28 | #include <linux/device.h> | 29 | #include <linux/device.h> |
| 29 | #include <linux/errno.h> | 30 | #include <linux/errno.h> |
| 30 | #include <linux/fs.h> | 31 | #include <linux/fs.h> |
| @@ -62,6 +63,7 @@ static int azfs_major, azfs_minor; | |||
| 62 | struct axon_ram_bank { | 63 | struct axon_ram_bank { |
| 63 | struct platform_device *device; | 64 | struct platform_device *device; |
| 64 | struct gendisk *disk; | 65 | struct gendisk *disk; |
| 66 | struct dax_device *dax_dev; | ||
| 65 | unsigned int irq_id; | 67 | unsigned int irq_id; |
| 66 | unsigned long ph_addr; | 68 | unsigned long ph_addr; |
| 67 | unsigned long io_addr; | 69 | unsigned long io_addr; |
| @@ -137,25 +139,32 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) | |||
| 137 | return BLK_QC_T_NONE; | 139 | return BLK_QC_T_NONE; |
| 138 | } | 140 | } |
| 139 | 141 | ||
| 140 | /** | 142 | static const struct block_device_operations axon_ram_devops = { |
| 141 | * axon_ram_direct_access - direct_access() method for block device | 143 | .owner = THIS_MODULE, |
| 142 | * @device, @sector, @data: see block_device_operations method | 144 | }; |
| 143 | */ | 145 | |
| 144 | static long | 146 | static long |
| 145 | axon_ram_direct_access(struct block_device *device, sector_t sector, | 147 | __axon_ram_direct_access(struct axon_ram_bank *bank, pgoff_t pgoff, long nr_pages, |
| 146 | void **kaddr, pfn_t *pfn, long size) | 148 | void **kaddr, pfn_t *pfn) |
| 147 | { | 149 | { |
| 148 | struct axon_ram_bank *bank = device->bd_disk->private_data; | 150 | resource_size_t offset = pgoff * PAGE_SIZE; |
| 149 | loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; | ||
| 150 | 151 | ||
| 151 | *kaddr = (void *) bank->io_addr + offset; | 152 | *kaddr = (void *) bank->io_addr + offset; |
| 152 | *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); | 153 | *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); |
| 153 | return bank->size - offset; | 154 | return (bank->size - offset) / PAGE_SIZE; |
| 154 | } | 155 | } |
| 155 | 156 | ||
| 156 | static const struct block_device_operations axon_ram_devops = { | 157 | static long |
| 157 | .owner = THIS_MODULE, | 158 | axon_ram_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, |
| 158 | .direct_access = axon_ram_direct_access | 159 | void **kaddr, pfn_t *pfn) |
| 160 | { | ||
| 161 | struct axon_ram_bank *bank = dax_get_private(dax_dev); | ||
| 162 | |||
| 163 | return __axon_ram_direct_access(bank, pgoff, nr_pages, kaddr, pfn); | ||
| 164 | } | ||
| 165 | |||
| 166 | static const struct dax_operations axon_ram_dax_ops = { | ||
| 167 | .direct_access = axon_ram_dax_direct_access, | ||
| 159 | }; | 168 | }; |
| 160 | 169 | ||
| 161 | /** | 170 | /** |
| @@ -219,6 +228,7 @@ static int axon_ram_probe(struct platform_device *device) | |||
| 219 | goto failed; | 228 | goto failed; |
| 220 | } | 229 | } |
| 221 | 230 | ||
| 231 | |||
| 222 | bank->disk->major = azfs_major; | 232 | bank->disk->major = azfs_major; |
| 223 | bank->disk->first_minor = azfs_minor; | 233 | bank->disk->first_minor = azfs_minor; |
| 224 | bank->disk->fops = &axon_ram_devops; | 234 | bank->disk->fops = &axon_ram_devops; |
| @@ -227,6 +237,13 @@ static int axon_ram_probe(struct platform_device *device) | |||
| 227 | sprintf(bank->disk->disk_name, "%s%d", | 237 | sprintf(bank->disk->disk_name, "%s%d", |
| 228 | AXON_RAM_DEVICE_NAME, axon_ram_bank_id); | 238 | AXON_RAM_DEVICE_NAME, axon_ram_bank_id); |
| 229 | 239 | ||
| 240 | bank->dax_dev = alloc_dax(bank, bank->disk->disk_name, | ||
| 241 | &axon_ram_dax_ops); | ||
| 242 | if (!bank->dax_dev) { | ||
| 243 | rc = -ENOMEM; | ||
| 244 | goto failed; | ||
| 245 | } | ||
| 246 | |||
| 230 | bank->disk->queue = blk_alloc_queue(GFP_KERNEL); | 247 | bank->disk->queue = blk_alloc_queue(GFP_KERNEL); |
| 231 | if (bank->disk->queue == NULL) { | 248 | if (bank->disk->queue == NULL) { |
| 232 | dev_err(&device->dev, "Cannot register disk queue\n"); | 249 | dev_err(&device->dev, "Cannot register disk queue\n"); |
| @@ -278,6 +295,8 @@ failed: | |||
| 278 | del_gendisk(bank->disk); | 295 | del_gendisk(bank->disk); |
| 279 | put_disk(bank->disk); | 296 | |
