OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [m68k/] [amiga/] [chipram.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
**  linux/amiga/chipram.c
3
**
4
**      Modified 03-May-94 by Geert Uytterhoeven <geert@linux-m68k.org>
5
**          - 64-bit aligned allocations for full AGA compatibility
6
**
7
**      Rewritten 15/9/2000 by Geert to use resource management
8
*/
9
 
10
#include <linux/types.h>
11
#include <linux/kernel.h>
12
#include <linux/init.h>
13
#include <linux/ioport.h>
14
#include <linux/slab.h>
15
#include <linux/string.h>
16
#include <asm/page.h>
17
#include <asm/amigahw.h>
18
 
19
unsigned long amiga_chip_size;
20
 
21
static struct resource chipram_res = {
22
    .name = "Chip RAM", .start = CHIP_PHYSADDR
23
};
24
static unsigned long chipavail;
25
 
26
 
27
void __init amiga_chip_init(void)
28
{
29
    if (!AMIGAHW_PRESENT(CHIP_RAM))
30
        return;
31
 
32
#ifndef CONFIG_APUS_FAST_EXCEPT
33
    /*
34
     *  Remove the first 4 pages where PPC exception handlers will be located
35
     */
36
    amiga_chip_size -= 0x4000;
37
#endif
38
    chipram_res.end = amiga_chip_size-1;
39
    request_resource(&iomem_resource, &chipram_res);
40
 
41
    chipavail = amiga_chip_size;
42
}
43
 
44
 
45
void *amiga_chip_alloc(unsigned long size, const char *name)
46
{
47
    struct resource *res;
48
 
49
    /* round up */
50
    size = PAGE_ALIGN(size);
51
 
52
#ifdef DEBUG
53
    printk("amiga_chip_alloc: allocate %ld bytes\n", size);
54
#endif
55
    res = kzalloc(sizeof(struct resource), GFP_KERNEL);
56
    if (!res)
57
        return NULL;
58
    res->name = name;
59
 
60
    if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) {
61
        kfree(res);
62
        return NULL;
63
    }
64
    chipavail -= size;
65
#ifdef DEBUG
66
    printk("amiga_chip_alloc: returning %lx\n", res->start);
67
#endif
68
    return (void *)ZTWO_VADDR(res->start);
69
}
70
 
71
 
72
    /*
73
     *  Warning:
74
     *  amiga_chip_alloc_res is meant only for drivers that need to allocate
75
     *  Chip RAM before kmalloc() is functional. As a consequence, those
76
     *  drivers must not free that Chip RAM afterwards.
77
     */
78
 
79
void * __init amiga_chip_alloc_res(unsigned long size, struct resource *res)
80
{
81
    unsigned long start;
82
 
83
    /* round up */
84
    size = PAGE_ALIGN(size);
85
    /* dmesg into chipmem prefers memory at the safe end */
86
    start = CHIP_PHYSADDR + chipavail - size;
87
 
88
#ifdef DEBUG
89
    printk("amiga_chip_alloc_res: allocate %ld bytes\n", size);
90
#endif
91
    if (allocate_resource(&chipram_res, res, size, start, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0) {
92
        printk("amiga_chip_alloc_res: first alloc failed!\n");
93
        if (allocate_resource(&chipram_res, res, size, 0, UINT_MAX, PAGE_SIZE, NULL, NULL) < 0)
94
            return NULL;
95
    }
96
    chipavail -= size;
97
#ifdef DEBUG
98
    printk("amiga_chip_alloc_res: returning %lx\n", res->start);
99
#endif
100
    return (void *)ZTWO_VADDR(res->start);
101
}
102
 
103
void amiga_chip_free(void *ptr)
104
{
105
    unsigned long start = ZTWO_PADDR(ptr);
106
    struct resource **p, *res;
107
    unsigned long size;
108
 
109
    for (p = &chipram_res.child; (res = *p); p = &res->sibling) {
110
        if (res->start != start)
111
            continue;
112
        *p = res->sibling;
113
        size = res->end-start;
114
#ifdef DEBUG
115
        printk("amiga_chip_free: free %ld bytes at %p\n", size, ptr);
116
#endif
117
        chipavail += size;
118
        kfree(res);
119
        return;
120
    }
121
    printk("amiga_chip_free: trying to free nonexistent region at %p\n", ptr);
122
}
123
 
124
 
125
unsigned long amiga_chip_avail(void)
126
{
127
#ifdef DEBUG
128
        printk("amiga_chip_avail : %ld bytes\n", chipavail);
129
#endif
130
        return chipavail;
131
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.