]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/powerpc/kernel/ibmebus.c
PPC: sg chaining support
[linux-2.6-omap-h63xx.git] / arch / powerpc / kernel / ibmebus.c
1 /*
2  * IBM PowerPC IBM eBus Infrastructure Support.
3  *
4  * Copyright (c) 2005 IBM Corporation
5  *  Joachim Fenkes <fenkes@de.ibm.com>
6  *  Heiko J Schick <schickhj@de.ibm.com>
7  *
8  * All rights reserved.
9  *
10  * This source code is distributed under a dual license of GPL v2.0 and OpenIB
11  * BSD.
12  *
13  * OpenIB BSD License
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions are met:
17  *
18  * Redistributions of source code must retain the above copyright notice, this
19  * list of conditions and the following disclaimer.
20  *
21  * Redistributions in binary form must reproduce the above copyright notice,
22  * this list of conditions and the following disclaimer in the documentation
23  * and/or other materials
24  * provided with the distribution.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
33  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
34  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38
39 #include <linux/init.h>
40 #include <linux/console.h>
41 #include <linux/kobject.h>
42 #include <linux/dma-mapping.h>
43 #include <linux/interrupt.h>
44 #include <asm/ibmebus.h>
45 #include <asm/abs_addr.h>
46
47 static struct device ibmebus_bus_device = { /* fake "parent" device */
48         .bus_id = "ibmebus",
49 };
50
51 struct bus_type ibmebus_bus_type;
52
53 static void *ibmebus_alloc_coherent(struct device *dev,
54                                     size_t size,
55                                     dma_addr_t *dma_handle,
56                                     gfp_t flag)
57 {
58         void *mem;
59
60         mem = kmalloc(size, flag);
61         *dma_handle = (dma_addr_t)mem;
62
63         return mem;
64 }
65
66 static void ibmebus_free_coherent(struct device *dev,
67                                   size_t size, void *vaddr,
68                                   dma_addr_t dma_handle)
69 {
70         kfree(vaddr);
71 }
72
73 static dma_addr_t ibmebus_map_single(struct device *dev,
74                                      void *ptr,
75                                      size_t size,
76                                      enum dma_data_direction direction)
77 {
78         return (dma_addr_t)(ptr);
79 }
80
81 static void ibmebus_unmap_single(struct device *dev,
82                                  dma_addr_t dma_addr,
83                                  size_t size,
84                                  enum dma_data_direction direction)
85 {
86         return;
87 }
88
89 static int ibmebus_map_sg(struct device *dev,
90                           struct scatterlist *sgl,
91                           int nents, enum dma_data_direction direction)
92 {
93         struct scatterlist *sg;
94         int i;
95
96         for_each_sg(sgl, sg, nents, i) {
97                 sg->dma_address = (dma_addr_t)page_address(sg->page)
98                         + sg->offset;
99                 sg->dma_length = sg->length;
100         }
101
102         return nents;
103 }
104
105 static void ibmebus_unmap_sg(struct device *dev,
106                              struct scatterlist *sg,
107                              int nents, enum dma_data_direction direction)
108 {
109         return;
110 }
111
112 static int ibmebus_dma_supported(struct device *dev, u64 mask)
113 {
114         return 1;
115 }
116
117 static struct dma_mapping_ops ibmebus_dma_ops = {
118         .alloc_coherent = ibmebus_alloc_coherent,
119         .free_coherent  = ibmebus_free_coherent,
120         .map_single     = ibmebus_map_single,
121         .unmap_single   = ibmebus_unmap_single,
122         .map_sg         = ibmebus_map_sg,
123         .unmap_sg       = ibmebus_unmap_sg,
124         .dma_supported  = ibmebus_dma_supported,
125 };
126
127 static int ibmebus_bus_probe(struct device *dev)
128 {
129         struct ibmebus_dev *ibmebusdev    = to_ibmebus_dev(dev);
130         struct ibmebus_driver *ibmebusdrv = to_ibmebus_driver(dev->driver);
131         const struct of_device_id *id;
132         int error = -ENODEV;
133
134         if (!ibmebusdrv->probe)
135                 return error;
136
137         id = of_match_device(ibmebusdrv->id_table, &ibmebusdev->ofdev);
138         if (id) {
139                 error = ibmebusdrv->probe(ibmebusdev, id);
140         }
141
142         return error;
143 }
144
145 static int ibmebus_bus_remove(struct device *dev)
146 {
147         struct ibmebus_dev *ibmebusdev    = to_ibmebus_dev(dev);
148         struct ibmebus_driver *ibmebusdrv = to_ibmebus_driver(dev->driver);
149
150         if (ibmebusdrv->remove) {
151                 return ibmebusdrv->remove(ibmebusdev);
152         }
153
154         return 0;
155 }
156
157 static void __devinit ibmebus_dev_release(struct device *dev)
158 {
159         of_node_put(to_ibmebus_dev(dev)->ofdev.node);
160         kfree(to_ibmebus_dev(dev));
161 }
162
163 static int __devinit ibmebus_register_device_common(
164         struct ibmebus_dev *dev, const char *name)
165 {
166         int err = 0;
167
168         dev->ofdev.dev.parent  = &ibmebus_bus_device;
169         dev->ofdev.dev.bus     = &ibmebus_bus_type;
170         dev->ofdev.dev.release = ibmebus_dev_release;
171
172         dev->ofdev.dev.archdata.of_node = dev->ofdev.node;
173         dev->ofdev.dev.archdata.dma_ops = &ibmebus_dma_ops;
174         dev->ofdev.dev.archdata.numa_node = of_node_to_nid(dev->ofdev.node);
175
176         /* An ibmebusdev is based on a of_device. We have to change the
177          * bus type to use our own DMA mapping operations.
178          */
179         if ((err = of_device_register(&dev->ofdev)) != 0) {
180                 printk(KERN_ERR "%s: failed to register device (%d).\n",
181                        __FUNCTION__, err);
182                 return -ENODEV;
183         }
184
185         return 0;
186 }
187
188 static struct ibmebus_dev* __devinit ibmebus_register_device_node(
189         struct device_node *dn)
190 {
191         struct ibmebus_dev *dev;
192         int i, len, bus_len;
193
194         dev = kzalloc(sizeof(struct ibmebus_dev), GFP_KERNEL);
195         if (!dev)
196                 return ERR_PTR(-ENOMEM);
197
198         dev->ofdev.node = of_node_get(dn);
199
200         len = strlen(dn->full_name + 1);
201         bus_len = min(len, BUS_ID_SIZE - 1);
202         memcpy(dev->ofdev.dev.bus_id, dn->full_name + 1
203                + (len - bus_len), bus_len);
204         for (i = 0; i < bus_len; i++)
205                 if (dev->ofdev.dev.bus_id[i] == '/')
206                         dev->ofdev.dev.bus_id[i] = '_';
207
208         /* Register with generic device framework. */
209         if (ibmebus_register_device_common(dev, dn->name) != 0) {
210                 kfree(dev);
211                 return ERR_PTR(-ENODEV);
212         }
213
214         return dev;
215 }
216
217 static void ibmebus_probe_of_nodes(char* name)
218 {
219         struct device_node *dn = NULL;
220
221         while ((dn = of_find_node_by_name(dn, name))) {
222                 if (IS_ERR(ibmebus_register_device_node(dn))) {
223                         of_node_put(dn);
224                         return;
225                 }
226         }
227
228         of_node_put(dn);
229
230         return;
231 }
232
233 static void ibmebus_add_devices_by_id(struct of_device_id *idt)
234 {
235         while (strlen(idt->name) > 0) {
236                 ibmebus_probe_of_nodes(idt->name);
237                 idt++;
238         }
239
240         return;
241 }
242
243 static int ibmebus_match_name(struct device *dev, void *data)
244 {
245         const struct ibmebus_dev *ebus_dev = to_ibmebus_dev(dev);
246         const char *name;
247
248         name = of_get_property(ebus_dev->ofdev.node, "name", NULL);
249
250         if (name && (strcmp(data, name) == 0))
251                 return 1;
252
253         return 0;
254 }
255
256 static int ibmebus_unregister_device(struct device *dev)
257 {
258         of_device_unregister(to_of_device(dev));
259
260         return 0;
261 }
262
263 static void ibmebus_remove_devices_by_id(struct of_device_id *idt)
264 {
265         struct device *dev;
266
267         while (strlen(idt->name) > 0) {
268                 while ((dev = bus_find_device(&ibmebus_bus_type, NULL,
269                                               (void*)idt->name,
270                                               ibmebus_match_name))) {
271                         ibmebus_unregister_device(dev);
272                 }
273                 idt++;
274         }
275
276         return;
277 }
278
279 int ibmebus_register_driver(struct ibmebus_driver *drv)
280 {
281         int err = 0;
282
283         drv->driver.name   = drv->name;
284         drv->driver.bus    = &ibmebus_bus_type;
285         drv->driver.probe  = ibmebus_bus_probe;
286         drv->driver.remove = ibmebus_bus_remove;
287
288         if ((err = driver_register(&drv->driver) != 0))
289                 return err;
290
291         /* remove all supported devices first, in case someone
292          * probed them manually before registering the driver */
293         ibmebus_remove_devices_by_id(drv->id_table);
294         ibmebus_add_devices_by_id(drv->id_table);
295
296         return 0;
297 }
298 EXPORT_SYMBOL(ibmebus_register_driver);
299
300 void ibmebus_unregister_driver(struct ibmebus_driver *drv)
301 {
302         driver_unregister(&drv->driver);
303         ibmebus_remove_devices_by_id(drv->id_table);
304 }
305 EXPORT_SYMBOL(ibmebus_unregister_driver);
306
307 int ibmebus_request_irq(struct ibmebus_dev *dev,
308                         u32 ist,
309                         irq_handler_t handler,
310                         unsigned long irq_flags, const char * devname,
311                         void *dev_id)
312 {
313         unsigned int irq = irq_create_mapping(NULL, ist);
314
315         if (irq == NO_IRQ)
316                 return -EINVAL;
317
318         return request_irq(irq, handler,
319                            irq_flags, devname, dev_id);
320 }
321 EXPORT_SYMBOL(ibmebus_request_irq);
322
323 void ibmebus_free_irq(struct ibmebus_dev *dev, u32 ist, void *dev_id)
324 {
325         unsigned int irq = irq_find_mapping(NULL, ist);
326
327         free_irq(irq, dev_id);
328 }
329 EXPORT_SYMBOL(ibmebus_free_irq);
330
331 static int ibmebus_bus_match(struct device *dev, struct device_driver *drv)
332 {
333         const struct ibmebus_dev *ebus_dev = to_ibmebus_dev(dev);
334         struct ibmebus_driver *ebus_drv    = to_ibmebus_driver(drv);
335         const struct of_device_id *ids     = ebus_drv->id_table;
336         const struct of_device_id *found_id;
337
338         if (!ids)
339                 return 0;
340
341         found_id = of_match_device(ids, &ebus_dev->ofdev);
342         if (found_id)
343                 return 1;
344
345         return 0;
346 }
347
348 static ssize_t name_show(struct device *dev,
349                          struct device_attribute *attr, char *buf)
350 {
351         struct ibmebus_dev *ebus_dev = to_ibmebus_dev(dev);
352         const char *name = of_get_property(ebus_dev->ofdev.node, "name", NULL);
353         return sprintf(buf, "%s\n", name);
354 }
355
356 static struct device_attribute ibmebus_dev_attrs[] = {
357         __ATTR_RO(name),
358         __ATTR_NULL
359 };
360
361 static int ibmebus_match_path(struct device *dev, void *data)
362 {
363         int rc;
364         struct device_node *dn =
365                 of_node_get(to_ibmebus_dev(dev)->ofdev.node);
366
367         rc = (dn->full_name && (strcasecmp((char*)data, dn->full_name) == 0));
368
369         of_node_put(dn);
370         return rc;
371 }
372
373 static char *ibmebus_chomp(const char *in, size_t count)
374 {
375         char *out = kmalloc(count + 1, GFP_KERNEL);
376
377         if (!out)
378                 return NULL;
379
380         memcpy(out, in, count);
381         out[count] = '\0';
382         if (out[count - 1] == '\n')
383                 out[count - 1] = '\0';
384
385         return out;
386 }
387
388 static ssize_t ibmebus_store_probe(struct bus_type *bus,
389                                    const char *buf, size_t count)
390 {
391         struct device_node *dn = NULL;
392         struct ibmebus_dev *dev;
393         char *path;
394         ssize_t rc;
395
396         path = ibmebus_chomp(buf, count);
397         if (!path)
398                 return -ENOMEM;
399
400         if (bus_find_device(&ibmebus_bus_type, NULL, path,
401                             ibmebus_match_path)) {
402                 printk(KERN_WARNING "%s: %s has already been probed\n",
403                        __FUNCTION__, path);
404                 rc = -EEXIST;
405                 goto out;
406         }
407
408         if ((dn = of_find_node_by_path(path))) {
409                 dev = ibmebus_register_device_node(dn);
410                 of_node_put(dn);
411                 rc = IS_ERR(dev) ? PTR_ERR(dev) : count;
412         } else {
413                 printk(KERN_WARNING "%s: no such device node: %s\n",
414                        __FUNCTION__, path);
415                 rc = -ENODEV;
416         }
417
418 out:
419         kfree(path);
420         return rc;
421 }
422
423 static ssize_t ibmebus_store_remove(struct bus_type *bus,
424                                     const char *buf, size_t count)
425 {
426         struct device *dev;
427         char *path;
428
429         path = ibmebus_chomp(buf, count);
430         if (!path)
431                 return -ENOMEM;
432
433         if ((dev = bus_find_device(&ibmebus_bus_type, NULL, path,
434                                    ibmebus_match_path))) {
435                 ibmebus_unregister_device(dev);
436
437                 kfree(path);
438                 return count;
439         } else {
440                 printk(KERN_WARNING "%s: %s not on the bus\n",
441                        __FUNCTION__, path);
442
443                 kfree(path);
444                 return -ENODEV;
445         }
446 }
447
448 static struct bus_attribute ibmebus_bus_attrs[] = {
449         __ATTR(probe, S_IWUSR, NULL, ibmebus_store_probe),
450         __ATTR(remove, S_IWUSR, NULL, ibmebus_store_remove),
451         __ATTR_NULL
452 };
453
454 struct bus_type ibmebus_bus_type = {
455         .name      = "ibmebus",
456         .match     = ibmebus_bus_match,
457         .dev_attrs = ibmebus_dev_attrs,
458         .bus_attrs = ibmebus_bus_attrs
459 };
460 EXPORT_SYMBOL(ibmebus_bus_type);
461
462 static int __init ibmebus_bus_init(void)
463 {
464         int err;
465
466         printk(KERN_INFO "IBM eBus Device Driver\n");
467
468         err = bus_register(&ibmebus_bus_type);
469         if (err) {
470                 printk(KERN_ERR ":%s: failed to register IBM eBus.\n",
471                        __FUNCTION__);
472                 return err;
473         }
474
475         err = device_register(&ibmebus_bus_device);
476         if (err) {
477                 printk(KERN_WARNING "%s: device_register returned %i\n",
478                        __FUNCTION__, err);
479                 bus_unregister(&ibmebus_bus_type);
480
481                 return err;
482         }
483
484         return 0;
485 }
486 __initcall(ibmebus_bus_init);