GNU Linux-libre 5.15.72-gnu
[releases.git] / arch / powerpc / platforms / ps3 / mm.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  PS3 address space management.
4  *
5  *  Copyright (C) 2006 Sony Computer Entertainment Inc.
6  *  Copyright 2006 Sony Corp.
7  */
8
9 #include <linux/dma-mapping.h>
10 #include <linux/kernel.h>
11 #include <linux/export.h>
12 #include <linux/memblock.h>
13 #include <linux/slab.h>
14
15 #include <asm/cell-regs.h>
16 #include <asm/firmware.h>
17 #include <asm/prom.h>
18 #include <asm/udbg.h>
19 #include <asm/lv1call.h>
20 #include <asm/setup.h>
21
22 #include "platform.h"
23
24 #if defined(DEBUG)
25 #define DBG udbg_printf
26 #else
27 #define DBG pr_devel
28 #endif
29
30 enum {
31 #if defined(CONFIG_PS3_DYNAMIC_DMA)
32         USE_DYNAMIC_DMA = 1,
33 #else
34         USE_DYNAMIC_DMA = 0,
35 #endif
36 };
37
38 enum {
39         PAGE_SHIFT_4K = 12U,
40         PAGE_SHIFT_64K = 16U,
41         PAGE_SHIFT_16M = 24U,
42 };
43
44 static unsigned long make_page_sizes(unsigned long a, unsigned long b)
45 {
46         return (a << 56) | (b << 48);
47 }
48
49 enum {
50         ALLOCATE_MEMORY_TRY_ALT_UNIT = 0X04,
51         ALLOCATE_MEMORY_ADDR_ZERO = 0X08,
52 };
53
54 /* valid htab sizes are {18,19,20} = 256K, 512K, 1M */
55
56 enum {
57         HTAB_SIZE_MAX = 20U, /* HV limit of 1MB */
58         HTAB_SIZE_MIN = 18U, /* CPU limit of 256KB */
59 };
60
61 /*============================================================================*/
62 /* virtual address space routines                                             */
63 /*============================================================================*/
64
65 /**
66  * struct mem_region - memory region structure
67  * @base: base address
68  * @size: size in bytes
69  * @offset: difference between base and rm.size
70  * @destroy: flag if region should be destroyed upon shutdown
71  */
72
73 struct mem_region {
74         u64 base;
75         u64 size;
76         unsigned long offset;
77         int destroy;
78 };
79
80 /**
81  * struct map - address space state variables holder
82  * @total: total memory available as reported by HV
83  * @vas_id - HV virtual address space id
84  * @htab_size: htab size in bytes
85  *
86  * The HV virtual address space (vas) allows for hotplug memory regions.
87  * Memory regions can be created and destroyed in the vas at runtime.
88  * @rm: real mode (bootmem) region
89  * @r1: highmem region(s)
90  *
91  * ps3 addresses
92  * virt_addr: a cpu 'translated' effective address
93  * phys_addr: an address in what Linux thinks is the physical address space
94  * lpar_addr: an address in the HV virtual address space
95  * bus_addr: an io controller 'translated' address on a device bus
96  */
97
98 struct map {
99         u64 total;
100         u64 vas_id;
101         u64 htab_size;
102         struct mem_region rm;
103         struct mem_region r1;
104 };
105
106 #define debug_dump_map(x) _debug_dump_map(x, __func__, __LINE__)
107 static void __maybe_unused _debug_dump_map(const struct map *m,
108         const char *func, int line)
109 {
110         DBG("%s:%d: map.total     = %llxh\n", func, line, m->total);
111         DBG("%s:%d: map.rm.size   = %llxh\n", func, line, m->rm.size);
112         DBG("%s:%d: map.vas_id    = %llu\n", func, line, m->vas_id);
113         DBG("%s:%d: map.htab_size = %llxh\n", func, line, m->htab_size);
114         DBG("%s:%d: map.r1.base   = %llxh\n", func, line, m->r1.base);
115         DBG("%s:%d: map.r1.offset = %lxh\n", func, line, m->r1.offset);
116         DBG("%s:%d: map.r1.size   = %llxh\n", func, line, m->r1.size);
117 }
118
119 static struct map map;
120
121 /**
122  * ps3_mm_phys_to_lpar - translate a linux physical address to lpar address
123  * @phys_addr: linux physical address
124  */
125
126 unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr)
127 {
128         BUG_ON(is_kernel_addr(phys_addr));
129         return (phys_addr < map.rm.size || phys_addr >= map.total)
130                 ? phys_addr : phys_addr + map.r1.offset;
131 }
132
133 EXPORT_SYMBOL(ps3_mm_phys_to_lpar);
134
135 /**
136  * ps3_mm_vas_create - create the virtual address space
137  */
138
139 void __init ps3_mm_vas_create(unsigned long* htab_size)
140 {
141         int result;
142         u64 start_address;
143         u64 size;
144         u64 access_right;
145         u64 max_page_size;
146         u64 flags;
147
148         result = lv1_query_logical_partition_address_region_info(0,
149                 &start_address, &size, &access_right, &max_page_size,
150                 &flags);
151
152         if (result) {
153                 DBG("%s:%d: lv1_query_logical_partition_address_region_info "
154                         "failed: %s\n", __func__, __LINE__,
155                         ps3_result(result));
156                 goto fail;
157         }
158
159         if (max_page_size < PAGE_SHIFT_16M) {
160                 DBG("%s:%d: bad max_page_size %llxh\n", __func__, __LINE__,
161                         max_page_size);
162                 goto fail;
163         }
164
165         BUILD_BUG_ON(CONFIG_PS3_HTAB_SIZE > HTAB_SIZE_MAX);
166         BUILD_BUG_ON(CONFIG_PS3_HTAB_SIZE < HTAB_SIZE_MIN);
167
168         result = lv1_construct_virtual_address_space(CONFIG_PS3_HTAB_SIZE,
169                         2, make_page_sizes(PAGE_SHIFT_16M, PAGE_SHIFT_64K),
170                         &map.vas_id, &map.htab_size);
171
172         if (result) {
173                 DBG("%s:%d: lv1_construct_virtual_address_space failed: %s\n",
174                         __func__, __LINE__, ps3_result(result));
175                 goto fail;
176         }
177
178         result = lv1_select_virtual_address_space(map.vas_id);
179
180         if (result) {
181                 DBG("%s:%d: lv1_select_virtual_address_space failed: %s\n",
182                         __func__, __LINE__, ps3_result(result));
183                 goto fail;
184         }
185
186         *htab_size = map.htab_size;
187
188         debug_dump_map(&map);
189
190         return;
191
192 fail:
193         panic("ps3_mm_vas_create failed");
194 }
195
196 /**
197  * ps3_mm_vas_destroy -
198  *
199  * called during kexec sequence with MMU off.
200  */
201
202 notrace void ps3_mm_vas_destroy(void)
203 {
204         int result;
205
206         if (map.vas_id) {
207                 result = lv1_select_virtual_address_space(0);
208                 result += lv1_destruct_virtual_address_space(map.vas_id);
209
210                 if (result) {
211                         lv1_panic(0);
212                 }
213
214                 map.vas_id = 0;
215         }
216 }
217
218 static int ps3_mm_get_repository_highmem(struct mem_region *r)
219 {
220         int result;
221
222         /* Assume a single highmem region. */
223
224         result = ps3_repository_read_highmem_info(0, &r->base, &r->size);
225
226         if (result)
227                 goto zero_region;
228
229         if (!r->base || !r->size) {
230                 result = -1;
231                 goto zero_region;
232         }
233
234         r->offset = r->base - map.rm.size;
235
236         DBG("%s:%d: Found high region in repository: %llxh %llxh\n",
237             __func__, __LINE__, r->base, r->size);
238
239         return 0;
240
241 zero_region:
242         DBG("%s:%d: No high region in repository.\n", __func__, __LINE__);
243
244         r->size = r->base = r->offset = 0;
245         return result;
246 }
247
248 static int ps3_mm_set_repository_highmem(const struct mem_region *r)
249 {
250         /* Assume a single highmem region. */
251
252         return r ? ps3_repository_write_highmem_info(0, r->base, r->size) :
253                 ps3_repository_write_highmem_info(0, 0, 0);
254 }
255
256 /**
257  * ps3_mm_region_create - create a memory region in the vas
258  * @r: pointer to a struct mem_region to accept initialized values
259  * @size: requested region size
260  *
261  * This implementation creates the region with the vas large page size.
262  * @size is rounded down to a multiple of the vas large page size.
263  */
264
265 static int ps3_mm_region_create(struct mem_region *r, unsigned long size)
266 {
267         int result;
268         u64 muid;
269
270         r->size = ALIGN_DOWN(size, 1 << PAGE_SHIFT_16M);
271
272         DBG("%s:%d requested  %lxh\n", __func__, __LINE__, size);
273         DBG("%s:%d actual     %llxh\n", __func__, __LINE__, r->size);
274         DBG("%s:%d difference %llxh (%lluMB)\n", __func__, __LINE__,
275                 size - r->size, (size - r->size) / 1024 / 1024);
276
277         if (r->size == 0) {
278                 DBG("%s:%d: size == 0\n", __func__, __LINE__);
279                 result = -1;
280                 goto zero_region;
281         }
282
283         result = lv1_allocate_memory(r->size, PAGE_SHIFT_16M, 0,
284                 ALLOCATE_MEMORY_TRY_ALT_UNIT, &r->base, &muid);
285
286         if (result || r->base < map.rm.size) {
287                 DBG("%s:%d: lv1_allocate_memory failed: %s\n",
288                         __func__, __LINE__, ps3_result(result));
289                 goto zero_region;
290         }
291
292         r->destroy = 1;
293         r->offset = r->base - map.rm.size;
294         return result;
295
296 zero_region:
297         r->size = r->base = r->offset = 0;
298         return result;
299 }
300
301 /**
302  * ps3_mm_region_destroy - destroy a memory region
303  * @r: pointer to struct mem_region
304  */
305
306 static void ps3_mm_region_destroy(struct mem_region *r)
307 {
308         int result;
309
310         if (!r->destroy) {
311                 return;
312         }
313
314         if (r->base) {
315                 result = lv1_release_memory(r->base);
316
317                 if (result) {
318                         lv1_panic(0);
319                 }
320
321                 r->size = r->base = r->offset = 0;
322                 map.total = map.rm.size;
323         }
324
325         ps3_mm_set_repository_highmem(NULL);
326 }
327
328 /*============================================================================*/
329 /* dma routines                                                               */
330 /*============================================================================*/
331
332 /**
333  * dma_sb_lpar_to_bus - Translate an lpar address to ioc mapped bus address.
334  * @r: pointer to dma region structure
335  * @lpar_addr: HV lpar address
336  */
337
338 static unsigned long dma_sb_lpar_to_bus(struct ps3_dma_region *r,
339         unsigned long lpar_addr)
340 {
341         if (lpar_addr >= map.rm.size)
342                 lpar_addr -= map.r1.offset;
343         BUG_ON(lpar_addr < r->offset);
344         BUG_ON(lpar_addr >= r->offset + r->len);
345         return r->bus_addr + lpar_addr - r->offset;
346 }
347
348 #define dma_dump_region(_a) _dma_dump_region(_a, __func__, __LINE__)
349 static void  __maybe_unused _dma_dump_region(const struct ps3_dma_region *r,
350         const char *func, int line)
351 {
352         DBG("%s:%d: dev        %llu:%llu\n", func, line, r->dev->bus_id,
353                 r->dev->dev_id);
354         DBG("%s:%d: page_size  %u\n", func, line, r->page_size);
355         DBG("%s:%d: bus_addr   %lxh\n", func, line, r->bus_addr);
356         DBG("%s:%d: len        %lxh\n", func, line, r->len);
357         DBG("%s:%d: offset     %lxh\n", func, line, r->offset);
358 }
359
360   /**
361  * dma_chunk - A chunk of dma pages mapped by the io controller.
362  * @region - The dma region that owns this chunk.
363  * @lpar_addr: Starting lpar address of the area to map.
364  * @bus_addr: Starting ioc bus address of the area to map.
365  * @len: Length in bytes of the area to map.
366  * @link: A struct list_head used with struct ps3_dma_region.chunk_list, the
367  * list of all chuncks owned by the region.
368  *
369  * This implementation uses a very simple dma page manager
370  * based on the dma_chunk structure.  This scheme assumes
371  * that all drivers use very well behaved dma ops.
372  */
373
374 struct dma_chunk {
375         struct ps3_dma_region *region;
376         unsigned long lpar_addr;
377         unsigned long bus_addr;
378         unsigned long len;
379         struct list_head link;
380         unsigned int usage_count;
381 };
382
383 #define dma_dump_chunk(_a) _dma_dump_chunk(_a, __func__, __LINE__)
384 static void _dma_dump_chunk (const struct dma_chunk* c, const char* func,
385         int line)
386 {
387         DBG("%s:%d: r.dev        %llu:%llu\n", func, line,
388                 c->region->dev->bus_id, c->region->dev->dev_id);
389         DBG("%s:%d: r.bus_addr   %lxh\n", func, line, c->region->bus_addr);
390         DBG("%s:%d: r.page_size  %u\n", func, line, c->region->page_size);
391         DBG("%s:%d: r.len        %lxh\n", func, line, c->region->len);
392         DBG("%s:%d: r.offset     %lxh\n", func, line, c->region->offset);
393         DBG("%s:%d: c.lpar_addr  %lxh\n", func, line, c->lpar_addr);
394         DBG("%s:%d: c.bus_addr   %lxh\n", func, line, c->bus_addr);
395         DBG("%s:%d: c.len        %lxh\n", func, line, c->len);
396 }
397
398 static struct dma_chunk * dma_find_chunk(struct ps3_dma_region *r,
399         unsigned long bus_addr, unsigned long len)
400 {
401         struct dma_chunk *c;
402         unsigned long aligned_bus = ALIGN_DOWN(bus_addr, 1 << r->page_size);
403         unsigned long aligned_len = ALIGN(len+bus_addr-aligned_bus,
404                                               1 << r->page_size);
405
406         list_for_each_entry(c, &r->chunk_list.head, link) {
407                 /* intersection */
408                 if (aligned_bus >= c->bus_addr &&
409                     aligned_bus + aligned_len <= c->bus_addr + c->len)
410                         return c;
411
412                 /* below */
413                 if (aligned_bus + aligned_len <= c->bus_addr)
414                         continue;
415
416                 /* above */
417                 if (aligned_bus >= c->bus_addr + c->len)
418                         continue;
419
420                 /* we don't handle the multi-chunk case for now */
421                 dma_dump_chunk(c);
422                 BUG();
423         }
424         return NULL;
425 }
426
427 static struct dma_chunk *dma_find_chunk_lpar(struct ps3_dma_region *r,
428         unsigned long lpar_addr, unsigned long len)
429 {
430         struct dma_chunk *c;
431         unsigned long aligned_lpar = ALIGN_DOWN(lpar_addr, 1 << r->page_size);
432         unsigned long aligned_len = ALIGN(len + lpar_addr - aligned_lpar,
433                                               1 << r->page_size);
434
435         list_for_each_entry(c, &r->chunk_list.head, link) {
436                 /* intersection */
437                 if (c->lpar_addr <= aligned_lpar &&
438                     aligned_lpar < c->lpar_addr + c->len) {
439                         if (aligned_lpar + aligned_len <= c->lpar_addr + c->len)
440                                 return c;
441                         else {
442                                 dma_dump_chunk(c);
443                                 BUG();
444                         }
445                 }
446                 /* below */
447                 if (aligned_lpar + aligned_len <= c->lpar_addr) {
448                         continue;
449                 }
450                 /* above */
451                 if (c->lpar_addr + c->len <= aligned_lpar) {
452                         continue;
453                 }
454         }
455         return NULL;
456 }
457
458 static int dma_sb_free_chunk(struct dma_chunk *c)
459 {
460         int result = 0;
461
462         if (c->bus_addr) {
463                 result = lv1_unmap_device_dma_region(c->region->dev->bus_id,
464                         c->region->dev->dev_id, c->bus_addr, c->len);
465                 BUG_ON(result);
466         }
467
468         kfree(c);
469         return result;
470 }
471
472 static int dma_ioc0_free_chunk(struct dma_chunk *c)
473 {
474         int result = 0;
475         int iopage;
476         unsigned long offset;
477         struct ps3_dma_region *r = c->region;
478
479         DBG("%s:start\n", __func__);
480         for (iopage = 0; iopage < (c->len >> r->page_size); iopage++) {
481                 offset = (1 << r->page_size) * iopage;
482                 /* put INVALID entry */
483                 result = lv1_put_iopte(0,
484                                        c->bus_addr + offset,
485                                        c->lpar_addr + offset,
486                                        r->ioid,
487                                        0);
488                 DBG("%s: bus=%#lx, lpar=%#lx, ioid=%d\n", __func__,
489                     c->bus_addr + offset,
490                     c->lpar_addr + offset,
491                     r->ioid);
492
493                 if (result) {
494                         DBG("%s:%d: lv1_put_iopte failed: %s\n", __func__,
495                             __LINE__, ps3_result(result));
496                 }
497         }
498         kfree(c);
499         DBG("%s:end\n", __func__);
500         return result;
501 }
502
503 /**
504  * dma_sb_map_pages - Maps dma pages into the io controller bus address space.
505  * @r: Pointer to a struct ps3_dma_region.
506  * @phys_addr: Starting physical address of the area to map.
507  * @len: Length in bytes of the area to map.
508  * c_out: A pointer to receive an allocated struct dma_chunk for this area.
509  *
510  * This is the lowest level dma mapping routine, and is the one that will
511  * make the HV call to add the pages into the io controller address space.
512  */
513
514 static int dma_sb_map_pages(struct ps3_dma_region *r, unsigned long phys_addr,
515             unsigned long len, struct dma_chunk **c_out, u64 iopte_flag)
516 {
517         int result;
518         struct dma_chunk *c;
519
520         c = kzalloc(sizeof(*c), GFP_ATOMIC);
521         if (!c) {
522                 result = -ENOMEM;
523                 goto fail_alloc;
524         }
525
526         c->region = r;
527         c->lpar_addr = ps3_mm_phys_to_lpar(phys_addr);
528         c->bus_addr = dma_sb_lpar_to_bus(r, c->lpar_addr);
529         c->len = len;
530
531         BUG_ON(iopte_flag != 0xf800000000000000UL);
532         result = lv1_map_device_dma_region(c->region->dev->bus_id,
533                                            c->region->dev->dev_id, c->lpar_addr,
534                                            c->bus_addr, c->len, iopte_flag);
535         if (result) {
536                 DBG("%s:%d: lv1_map_device_dma_region failed: %s\n",
537                         __func__, __LINE__, ps3_result(result));
538                 goto fail_map;
539         }
540
541         list_add(&c->link, &r->chunk_list.head);
542
543         *c_out = c;
544         return 0;
545
546 fail_map:
547         kfree(c);
548 fail_alloc:
549         *c_out = NULL;
550         DBG(" <- %s:%d\n", __func__, __LINE__);
551         return result;
552 }
553
554 static int dma_ioc0_map_pages(struct ps3_dma_region *r, unsigned long phys_addr,
555                               unsigned long len, struct dma_chunk **c_out,
556                               u64 iopte_flag)
557 {
558         int result;
559         struct dma_chunk *c, *last;
560         int iopage, pages;
561         unsigned long offset;
562
563         DBG(KERN_ERR "%s: phy=%#lx, lpar%#lx, len=%#lx\n", __func__,
564             phys_addr, ps3_mm_phys_to_lpar(phys_addr), len);
565         c = kzalloc(sizeof(*c), GFP_ATOMIC);
566         if (!c) {
567                 result = -ENOMEM;
568                 goto fail_alloc;
569         }
570
571         c->region = r;
572         c->len = len;
573         c->lpar_addr = ps3_mm_phys_to_lpar(phys_addr);
574         /* allocate IO address */
575         if (list_empty(&r->chunk_list.head)) {
576                 /* first one */
577                 c->bus_addr = r->bus_addr;
578         } else {
579                 /* derive from last bus addr*/
580                 last  = list_entry(r->chunk_list.head.next,
581                                    struct dma_chunk, link);
582                 c->bus_addr = last->bus_addr + last->len;
583                 DBG("%s: last bus=%#lx, len=%#lx\n", __func__,
584                     last->bus_addr, last->len);
585         }
586
587         /* FIXME: check whether length exceeds region size */
588
589         /* build ioptes for the area */
590         pages = len >> r->page_size;
591         DBG("%s: pgsize=%#x len=%#lx pages=%#x iopteflag=%#llx\n", __func__,
592             r->page_size, r->len, pages, iopte_flag);
593         for (iopage = 0; iopage < pages; iopage++) {
594                 offset = (1 << r->page_size) * iopage;
595                 result = lv1_put_iopte(0,
596                                        c->bus_addr + offset,
597                                        c->lpar_addr + offset,
598                                        r->ioid,
599                                        iopte_flag);
600                 if (result) {
601                         pr_warn("%s:%d: lv1_put_iopte failed: %s\n",
602                                 __func__, __LINE__, ps3_result(result));
603                         goto fail_map;
604                 }
605                 DBG("%s: pg=%d bus=%#lx, lpar=%#lx, ioid=%#x\n", __func__,
606                     iopage, c->bus_addr + offset, c->lpar_addr + offset,
607                     r->ioid);
608         }
609
610         /* be sure that last allocated one is inserted at head */
611         list_add(&c->link, &r->chunk_list.head);
612
613         *c_out = c;
614         DBG("%s: end\n", __func__);
615         return 0;
616
617 fail_map:
618         for (iopage--; 0 <= iopage; iopage--) {
619                 lv1_put_iopte(0,
620                               c->bus_addr + offset,
621                               c->lpar_addr + offset,
622                               r->ioid,
623                               0);
624         }
625         kfree(c);
626 fail_alloc:
627         *c_out = NULL;
628         return result;
629 }
630
631 /**
632  * dma_sb_region_create - Create a device dma region.
633  * @r: Pointer to a struct ps3_dma_region.
634  *
635  * This is the lowest level dma region create routine, and is the one that
636  * will make the HV call to create the region.
637  */
638
639 static int dma_sb_region_create(struct ps3_dma_region *r)
640 {
641         int result;
642         u64 bus_addr;
643
644         DBG(" -> %s:%d:\n", __func__, __LINE__);
645
646         BUG_ON(!r);
647
648         if (!r->dev->bus_id) {
649                 pr_info("%s:%d: %llu:%llu no dma\n", __func__, __LINE__,
650                         r->dev->bus_id, r->dev->dev_id);
651                 return 0;
652         }
653
654         DBG("%s:%u: len = 0x%lx, page_size = %u, offset = 0x%lx\n", __func__,
655             __LINE__, r->len, r->page_size, r->offset);
656
657         BUG_ON(!r->len);
658         BUG_ON(!r->page_size);
659         BUG_ON(!r->region_ops);
660
661         INIT_LIST_HEAD(&r->chunk_list.head);
662         spin_lock_init(&r->chunk_list.lock);
663
664         result = lv1_allocate_device_dma_region(r->dev->bus_id, r->dev->dev_id,
665                 roundup_pow_of_two(r->len), r->page_size, r->region_type,
666                 &bus_addr);
667         r->bus_addr = bus_addr;
668
669         if (result) {
670                 DBG("%s:%d: lv1_allocate_device_dma_region failed: %s\n",
671                         __func__, __LINE__, ps3_result(result));
672                 r->len = r->bus_addr = 0;
673         }
674
675         return result;
676 }
677
678 static int dma_ioc0_region_create(struct ps3_dma_region *r)
679 {
680         int result;
681         u64 bus_addr;
682
683         INIT_LIST_HEAD(&r->chunk_list.head);
684         spin_lock_init(&r->chunk_list.lock);
685
686         result = lv1_allocate_io_segment(0,
687                                          r->len,
688                                          r->page_size,
689                                          &bus_addr);
690         r->bus_addr = bus_addr;
691         if (result) {
692                 DBG("%s:%d: lv1_allocate_io_segment failed: %s\n",
693                         __func__, __LINE__, ps3_result(result));
694                 r->len = r->bus_addr = 0;
695         }
696         DBG("%s: len=%#lx, pg=%d, bus=%#lx\n", __func__,
697             r->len, r->page_size, r->bus_addr);
698         return result;
699 }
700
701 /**
702  * dma_region_free - Free a device dma region.
703  * @r: Pointer to a struct ps3_dma_region.
704  *
705  * This is the lowest level dma region free routine, and is the one that
706  * will make the HV call to free the region.
707  */
708
709 static int dma_sb_region_free(struct ps3_dma_region *r)
710 {
711         int result;
712         struct dma_chunk *c;
713         struct dma_chunk *tmp;
714
715         BUG_ON(!r);
716
717         if (!r->dev->bus_id) {
718                 pr_info("%s:%d: %llu:%llu no dma\n", __func__, __LINE__,
719                         r->dev->bus_id, r->dev->dev_id);
720                 return 0;
721         }
722
723         list_for_each_entry_safe(c, tmp, &r->chunk_list.head, link) {
724                 list_del(&c->link);
725                 dma_sb_free_chunk(c);
726         }
727
728         result = lv1_free_device_dma_region(r->dev->bus_id, r->dev->dev_id,
729                 r->bus_addr);
730
731         if (result)
732                 DBG("%s:%d: lv1_free_device_dma_region failed: %s\n",
733                         __func__, __LINE__, ps3_result(result));
734
735         r->bus_addr = 0;
736
737         return result;
738 }
739
740 static int dma_ioc0_region_free(struct ps3_dma_region *r)
741 {
742         int result;
743         struct dma_chunk *c, *n;
744
745         DBG("%s: start\n", __func__);
746         list_for_each_entry_safe(c, n, &r->chunk_list.head, link) {
747                 list_del(&c->link);
748                 dma_ioc0_free_chunk(c);
749         }
750
751         result = lv1_release_io_segment(0, r->bus_addr);
752
753         if (result)
754                 DBG("%s:%d: lv1_free_device_dma_region failed: %s\n",
755                         __func__, __LINE__, ps3_result(result));
756
757         r->bus_addr = 0;
758         DBG("%s: end\n", __func__);
759
760         return result;
761 }
762
763 /**
764  * dma_sb_map_area - Map an area of memory into a device dma region.
765  * @r: Pointer to a struct ps3_dma_region.
766  * @virt_addr: Starting virtual address of the area to map.
767  * @len: Length in bytes of the area to map.
768  * @bus_addr: A pointer to return the starting ioc bus address of the area to
769  * map.
770  *
771  * This is the common dma mapping routine.
772  */
773
774 static int dma_sb_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
775            unsigned long len, dma_addr_t *bus_addr,
776            u64 iopte_flag)
777 {
778         int result;
779         unsigned long flags;
780         struct dma_chunk *c;
781         unsigned long phys_addr = is_kernel_addr(virt_addr) ? __pa(virt_addr)
782                 : virt_addr;
783         unsigned long aligned_phys = ALIGN_DOWN(phys_addr, 1 << r->page_size);
784         unsigned long aligned_len = ALIGN(len + phys_addr - aligned_phys,
785                                               1 << r->page_size);
786         *bus_addr = dma_sb_lpar_to_bus(r, ps3_mm_phys_to_lpar(phys_addr));
787
788         if (!USE_DYNAMIC_DMA) {
789                 unsigned long lpar_addr = ps3_mm_phys_to_lpar(phys_addr);
790                 DBG(" -> %s:%d\n", __func__, __LINE__);
791                 DBG("%s:%d virt_addr %lxh\n", __func__, __LINE__,
792                         virt_addr);
793                 DBG("%s:%d phys_addr %lxh\n", __func__, __LINE__,
794                         phys_addr);
795                 DBG("%s:%d lpar_addr %lxh\n", __func__, __LINE__,
796                         lpar_addr);
797                 DBG("%s:%d len       %lxh\n", __func__, __LINE__, len);
798                 DBG("%s:%d bus_addr  %llxh (%lxh)\n", __func__, __LINE__,
799                 *bus_addr, len);
800         }
801
802         spin_lock_irqsave(&r->chunk_list.lock, flags);
803         c = dma_find_chunk(r, *bus_addr, len);
804
805         if (c) {
806                 DBG("%s:%d: reusing mapped chunk", __func__, __LINE__);
807                 dma_dump_chunk(c);
808                 c->usage_count++;
809                 spin_unlock_irqrestore(&r->chunk_list.lock, flags);
810                 return 0;
811         }
812
813         result = dma_sb_map_pages(r, aligned_phys, aligned_len, &c, iopte_flag);
814
815         if (result) {
816                 *bus_addr = 0;
817                 DBG("%s:%d: dma_sb_map_pages failed (%d)\n",
818                         __func__, __LINE__, result);
819                 spin_unlock_irqrestore(&r->chunk_list.lock, flags);
820                 return result;
821         }
822
823         c->usage_count = 1;
824
825         spin_unlock_irqrestore(&r->chunk_list.lock, flags);
826         return result;
827 }
828
829 static int dma_ioc0_map_area(struct ps3_dma_region *r, unsigned long virt_addr,
830              unsigned long len, dma_addr_t *bus_addr,
831              u64 iopte_flag)
832 {
833         int result;
834         unsigned long flags;
835         struct dma_chunk *c;
836         unsigned long phys_addr = is_kernel_addr(virt_addr) ? __pa(virt_addr)
837                 : virt_addr;
838         unsigned long aligned_phys = ALIGN_DOWN(phys_addr, 1 << r->page_size);
839         unsigned long aligned_len = ALIGN(len + phys_addr - aligned_phys,
840                                               1 << r->page_size);
841
842         DBG(KERN_ERR "%s: vaddr=%#lx, len=%#lx\n", __func__,
843             virt_addr, len);
844         DBG(KERN_ERR "%s: ph=%#lx a_ph=%#lx a_l=%#lx\n", __func__,
845             phys_addr, aligned_phys, aligned_len);
846
847         spin_lock_irqsave(&r->chunk_list.lock, flags);
848         c = dma_find_chunk_lpar(r, ps3_mm_phys_to_lpar(phys_addr), len);
849
850         if (c) {
851                 /* FIXME */
852                 BUG();
853                 *bus_addr = c->bus_addr + phys_addr - aligned_phys;
854                 c->usage_count++;
855                 spin_unlock_irqrestore(&r->chunk_list.lock, flags);
856                 return 0;
857         }
858
859         result = dma_ioc0_map_pages(r, aligned_phys, aligned_len, &c,
860                                     iopte_flag);
861
862         if (result) {
863                 *bus_addr = 0;
864                 DBG("%s:%d: dma_ioc0_map_pages failed (%d)\n",
865                         __func__, __LINE__, result);
866                 spin_unlock_irqrestore(&r->chunk_list.lock, flags);
867                 return result;
868         }
869         *bus_addr = c->bus_addr + phys_addr - aligned_phys;
870         DBG("%s: va=%#lx pa=%#lx a_pa=%#lx bus=%#llx\n", __func__,
871             virt_addr, phys_addr, aligned_phys, *bus_addr);
872         c->usage_count = 1;
873
874         spin_unlock_irqrestore(&r->chunk_list.lock, flags);
875         return result;
876 }
877
878 /**
879  * dma_sb_unmap_area - Unmap an area of memory from a device dma region.
880  * @r: Pointer to a struct ps3_dma_region.
881  * @bus_addr: The starting ioc bus address of the area to unmap.
882  * @len: Length in bytes of the area to unmap.
883  *
884  * This is the common dma unmap routine.
885  */
886
887 static int dma_sb_unmap_area(struct ps3_dma_region *r, dma_addr_t bus_addr,
888         unsigned long len)
889 {
890         unsigned long flags;
891         struct dma_chunk *c;
892
893         spin_lock_irqsave(&r->chunk_list.lock, flags);
894         c = dma_find_chunk(r, bus_addr, len);
895
896         if (!c) {
897                 unsigned long aligned_bus = ALIGN_DOWN(bus_addr,
898                         1 << r->page_size);
899                 unsigned long aligned_len = ALIGN(len + bus_addr
900                         - aligned_bus, 1 << r->page_size);
901                 DBG("%s:%d: not found: bus_addr %llxh\n",
902                         __func__, __LINE__, bus_addr);
903                 DBG("%s:%d: not found: len %lxh\n",
904                         __func__, __LINE__, len);
905                 DBG("%s:%d: not found: aligned_bus %lxh\n",
906                         __func__, __LINE__, aligned_bus);
907                 DBG("%s:%d: not found: aligned_len %lxh\n",
908                         __func__, __LINE__, aligned_len);
909                 BUG();
910         }
911
912         c->usage_count--;
913
914         if (!c->usage_count) {
915                 list_del(&c->link);
916                 dma_sb_free_chunk(c);
917         }
918
919         spin_unlock_irqrestore(&r->chunk_list.lock, flags);
920         return 0;
921 }
922
923 static int dma_ioc0_unmap_area(struct ps3_dma_region *r,
924                         dma_addr_t bus_addr, unsigned long len)
925 {
926         unsigned long flags;
927         struct dma_chunk *c;
928
929         DBG("%s: start a=%#llx l=%#lx\n", __func__, bus_addr, len);
930         spin_lock_irqsave(&r->chunk_list.lock, flags);
931         c = dma_find_chunk(r, bus_addr, len);
932
933         if (!c) {
934                 unsigned long aligned_bus = ALIGN_DOWN(bus_addr,
935                                                         1 << r->page_size);
936                 unsigned long aligned_len = ALIGN(len + bus_addr
937                                                       - aligned_bus,
938                                                       1 << r->page_size);
939                 DBG("%s:%d: not found: bus_addr %llxh\n",
940                     __func__, __LINE__, bus_addr);
941                 DBG("%s:%d: not found: len %lxh\n",
942                     __func__, __LINE__, len);
943                 DBG("%s:%d: not found: aligned_bus %lxh\n",
944                     __func__, __LINE__, aligned_bus);
945                 DBG("%s:%d: not found: aligned_len %lxh\n",
946                     __func__, __LINE__, aligned_len);
947                 BUG();
948         }
949
950         c->usage_count--;
951
952         if (!c->usage_count) {
953                 list_del(&c->link);
954                 dma_ioc0_free_chunk(c);
955         }
956
957         spin_unlock_irqrestore(&r->chunk_list.lock, flags);
958         DBG("%s: end\n", __func__);
959         return 0;
960 }
961
962 /**
963  * dma_sb_region_create_linear - Setup a linear dma mapping for a device.
964  * @r: Pointer to a struct ps3_dma_region.
965  *
966  * This routine creates an HV dma region for the device and maps all available
967  * ram into the io controller bus address space.
968  */
969
970 static int dma_sb_region_create_linear(struct ps3_dma_region *r)
971 {
972         int result;
973         unsigned long virt_addr, len;
974         dma_addr_t tmp;
975
976         if (r->len > 16*1024*1024) {    /* FIXME: need proper fix */
977                 /* force 16M dma pages for linear mapping */
978                 if (r->page_size != PS3_DMA_16M) {
979                         pr_info("%s:%d: forcing 16M pages for linear map\n",
980                                 __func__, __LINE__);
981                         r->page_size = PS3_DMA_16M;
982                         r->len = ALIGN(r->len, 1 << r->page_size);
983                 }
984         }
985
986         result = dma_sb_region_create(r);
987         BUG_ON(result);
988
989         if (r->offset < map.rm.size) {
990                 /* Map (part of) 1st RAM chunk */
991                 virt_addr = map.rm.base + r->offset;
992                 len = map.rm.size - r->offset;
993                 if (len > r->len)
994                         len = r->len;
995                 result = dma_sb_map_area(r, virt_addr, len, &tmp,
996                         CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_SO_RW |
997                         CBE_IOPTE_M);
998                 BUG_ON(result);
999         }
1000
1001         if (r->offset + r->len > map.rm.size) {
1002                 /* Map (part of) 2nd RAM chunk */
1003                 virt_addr = map.rm.size;
1004                 len = r->len;
1005                 if (r->offset >= map.rm.size)
1006                         virt_addr += r->offset - map.rm.size;
1007                 else
1008                         len -= map.rm.size - r->offset;
1009                 result = dma_sb_map_area(r, virt_addr, len, &tmp,
1010                         CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_SO_RW |
1011                         CBE_IOPTE_M);
1012                 BUG_ON(result);
1013         }
1014
1015         return result;
1016 }
1017
1018 /**
1019  * dma_sb_region_free_linear - Free a linear dma mapping for a device.
1020  * @r: Pointer to a struct ps3_dma_region.
1021  *
1022  * This routine will unmap all mapped areas and free the HV dma region.
1023  */
1024
1025 static int dma_sb_region_free_linear(struct ps3_dma_region *r)
1026 {
1027         int result;
1028         dma_addr_t bus_addr;
1029         unsigned long len, lpar_addr;
1030
1031         if (r->offset < map.rm.size) {
1032                 /* Unmap (part of) 1st RAM chunk */
1033                 lpar_addr = map.rm.base + r->offset;
1034                 len = map.rm.size - r->offset;
1035                 if (len > r->len)
1036                         len = r->len;
1037                 bus_addr = dma_sb_lpar_to_bus(r, lpar_addr);
1038                 result = dma_sb_unmap_area(r, bus_addr, len);
1039                 BUG_ON(result);
1040         }
1041
1042         if (r->offset + r->len > map.rm.size) {
1043                 /* Unmap (part of) 2nd RAM chunk */
1044                 lpar_addr = map.r1.base;
1045                 len = r->len;
1046                 if (r->offset >= map.rm.size)
1047                         lpar_addr += r->offset - map.rm.size;
1048                 else
1049                         len -= map.rm.size - r->offset;
1050                 bus_addr = dma_sb_lpar_to_bus(r, lpar_addr);
1051                 result = dma_sb_unmap_area(r, bus_addr, len);
1052                 BUG_ON(result);
1053         }
1054
1055         result = dma_sb_region_free(r);
1056         BUG_ON(result);
1057
1058         return result;
1059 }
1060
1061 /**
1062  * dma_sb_map_area_linear - Map an area of memory into a device dma region.
1063  * @r: Pointer to a struct ps3_dma_region.
1064  * @virt_addr: Starting virtual address of the area to map.
1065  * @len: Length in bytes of the area to map.
1066  * @bus_addr: A pointer to return the starting ioc bus address of the area to
1067  * map.
1068  *
1069  * This routine just returns the corresponding bus address.  Actual mapping
1070  * occurs in dma_region_create_linear().
1071  */
1072
1073 static int dma_sb_map_area_linear(struct ps3_dma_region *r,
1074         unsigned long virt_addr, unsigned long len, dma_addr_t *bus_addr,
1075         u64 iopte_flag)
1076 {
1077         unsigned long phys_addr = is_kernel_addr(virt_addr) ? __pa(virt_addr)
1078                 : virt_addr;
1079         *bus_addr = dma_sb_lpar_to_bus(r, ps3_mm_phys_to_lpar(phys_addr));
1080         return 0;
1081 }
1082
1083 /**
1084  * dma_unmap_area_linear - Unmap an area of memory from a device dma region.
1085  * @r: Pointer to a struct ps3_dma_region.
1086  * @bus_addr: The starting ioc bus address of the area to unmap.
1087  * @len: Length in bytes of the area to unmap.
1088  *
1089  * This routine does nothing.  Unmapping occurs in dma_sb_region_free_linear().
1090  */
1091
1092 static int dma_sb_unmap_area_linear(struct ps3_dma_region *r,
1093         dma_addr_t bus_addr, unsigned long len)
1094 {
1095         return 0;
1096 };
1097
1098 static const struct ps3_dma_region_ops ps3_dma_sb_region_ops =  {
1099         .create = dma_sb_region_create,
1100         .free = dma_sb_region_free,
1101         .map = dma_sb_map_area,
1102         .unmap = dma_sb_unmap_area
1103 };
1104
1105 static const struct ps3_dma_region_ops ps3_dma_sb_region_linear_ops = {
1106         .create = dma_sb_region_create_linear,
1107         .free = dma_sb_region_free_linear,
1108         .map = dma_sb_map_area_linear,
1109         .unmap = dma_sb_unmap_area_linear
1110 };
1111
1112 static const struct ps3_dma_region_ops ps3_dma_ioc0_region_ops = {
1113         .create = dma_ioc0_region_create,
1114         .free = dma_ioc0_region_free,
1115         .map = dma_ioc0_map_area,
1116         .unmap = dma_ioc0_unmap_area
1117 };
1118
1119 int ps3_dma_region_init(struct ps3_system_bus_device *dev,
1120         struct ps3_dma_region *r, enum ps3_dma_page_size page_size,
1121         enum ps3_dma_region_type region_type, void *addr, unsigned long len)
1122 {
1123         unsigned long lpar_addr;
1124         int result;
1125
1126         lpar_addr = addr ? ps3_mm_phys_to_lpar(__pa(addr)) : 0;
1127
1128         r->dev = dev;
1129         r->page_size = page_size;
1130         r->region_type = region_type;
1131         r->offset = lpar_addr;
1132         if (r->offset >= map.rm.size)
1133                 r->offset -= map.r1.offset;
1134         r->len = len ? len : ALIGN(map.total, 1 << r->page_size);
1135
1136         dev->core.dma_mask = &r->dma_mask;
1137
1138         result = dma_set_mask_and_coherent(&dev->core, DMA_BIT_MASK(32));
1139
1140         if (result < 0) {
1141                 dev_err(&dev->core, "%s:%d: dma_set_mask_and_coherent failed: %d\n",
1142                         __func__, __LINE__, result);
1143                 return result;
1144         }
1145
1146         switch (dev->dev_type) {
1147         case PS3_DEVICE_TYPE_SB:
1148                 r->region_ops =  (USE_DYNAMIC_DMA)
1149                         ? &ps3_dma_sb_region_ops
1150                         : &ps3_dma_sb_region_linear_ops;
1151                 break;
1152         case PS3_DEVICE_TYPE_IOC0:
1153                 r->region_ops = &ps3_dma_ioc0_region_ops;
1154                 break;
1155         default:
1156                 BUG();
1157                 return -EINVAL;
1158         }
1159         return 0;
1160 }
1161 EXPORT_SYMBOL(ps3_dma_region_init);
1162
1163 int ps3_dma_region_create(struct ps3_dma_region *r)
1164 {
1165         BUG_ON(!r);
1166         BUG_ON(!r->region_ops);
1167         BUG_ON(!r->region_ops->create);
1168         return r->region_ops->create(r);
1169 }
1170 EXPORT_SYMBOL(ps3_dma_region_create);
1171
1172 int ps3_dma_region_free(struct ps3_dma_region *r)
1173 {
1174         BUG_ON(!r);
1175         BUG_ON(!r->region_ops);
1176         BUG_ON(!r->region_ops->free);
1177         return r->region_ops->free(r);
1178 }
1179 EXPORT_SYMBOL(ps3_dma_region_free);
1180
1181 int ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr,
1182         unsigned long len, dma_addr_t *bus_addr,
1183         u64 iopte_flag)
1184 {
1185         return r->region_ops->map(r, virt_addr, len, bus_addr, iopte_flag);
1186 }
1187
1188 int ps3_dma_unmap(struct ps3_dma_region *r, dma_addr_t bus_addr,
1189         unsigned long len)
1190 {
1191         return r->region_ops->unmap(r, bus_addr, len);
1192 }
1193
1194 /*============================================================================*/
1195 /* system startup routines                                                    */
1196 /*============================================================================*/
1197
1198 /**
1199  * ps3_mm_init - initialize the address space state variables
1200  */
1201
1202 void __init ps3_mm_init(void)
1203 {
1204         int result;
1205
1206         DBG(" -> %s:%d\n", __func__, __LINE__);
1207
1208         result = ps3_repository_read_mm_info(&map.rm.base, &map.rm.size,
1209                 &map.total);
1210
1211         if (result)
1212                 panic("ps3_repository_read_mm_info() failed");
1213
1214         map.rm.offset = map.rm.base;
1215         map.vas_id = map.htab_size = 0;
1216
1217         /* this implementation assumes map.rm.base is zero */
1218
1219         BUG_ON(map.rm.base);
1220         BUG_ON(!map.rm.size);
1221
1222         /* Check if we got the highmem region from an earlier boot step */
1223
1224         if (ps3_mm_get_repository_highmem(&map.r1)) {
1225                 result = ps3_mm_region_create(&map.r1, map.total - map.rm.size);
1226
1227                 if (!result)
1228                         ps3_mm_set_repository_highmem(&map.r1);
1229         }
1230
1231         /* correct map.total for the real total amount of memory we use */
1232         map.total = map.rm.size + map.r1.size;
1233
1234         if (!map.r1.size) {
1235                 DBG("%s:%d: No highmem region found\n", __func__, __LINE__);
1236         } else {
1237                 DBG("%s:%d: Adding highmem region: %llxh %llxh\n",
1238                         __func__, __LINE__, map.rm.size,
1239                         map.total - map.rm.size);
1240                 memblock_add(map.rm.size, map.total - map.rm.size);
1241         }
1242
1243         DBG(" <- %s:%d\n", __func__, __LINE__);
1244 }
1245
1246 /**
1247  * ps3_mm_shutdown - final cleanup of address space
1248  *
1249  * called during kexec sequence with MMU off.
1250  */
1251
1252 notrace void ps3_mm_shutdown(void)
1253 {
1254         ps3_mm_region_destroy(&map.r1);
1255 }