1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/*
* Creation Date: <1999/11/16 00:47:06 samuel>
* Time-stamp: <2003/10/18 13:28:14 samuel>
*
* <ofmem.h>
*
*
*
* Copyright (C) 1999, 2002 Samuel Rydh (samuel@ibrium.se)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation
*
*/
#ifndef _H_OFMEM
#define _H_OFMEM
#include "kernel/stack.h"
typedef struct alloc_desc {
struct alloc_desc *next;
ucell size; /* size (including) this struct */
} alloc_desc_t;
typedef struct mem_range {
struct mem_range *next;
phys_addr_t start; /* sizeof(phys) >= sizeof(virt), e.g SPARC32 */
ucell size;
} range_t;
typedef struct trans {
struct trans *next;
ucell virt; /* chain is sorted by virt */
ucell size;
phys_addr_t phys;
ucell mode;
} translation_t;
/* ofmem private data */
typedef struct {
ucell ramsize;
char *next_malloc;
alloc_desc_t *mfree; /* list of free malloc blocks */
range_t *phys_range;
range_t *virt_range;
range_t *io_range;
translation_t *trans; /* this is really a translation_t */
} ofmem_t;
/* structure for retained data */
typedef struct {
ucell magic;
ucell numentries;
range_t retain_phys_range[8]; /* physical memory that should survive a warm reset */
} retain_t;
/* TODO: temporary migration interface */
extern ofmem_t* ofmem_arch_get_private(void);
extern void* ofmem_arch_get_malloc_base(void);
extern ucell ofmem_arch_get_heap_top(void);
extern ucell ofmem_arch_get_virt_top(void);
extern ucell ofmem_arch_get_iomem_base(void);
extern ucell ofmem_arch_get_iomem_top(void);
extern retain_t* ofmem_arch_get_retained(void);
extern int ofmem_arch_get_physaddr_cellsize(void);
extern int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value);
extern int ofmem_arch_get_available_entry_size(phandle_t ph);
extern void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size);
extern int ofmem_arch_get_translation_entry_size(void);
extern void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t);
extern ucell ofmem_arch_default_translation_mode( phys_addr_t phys );
extern ucell ofmem_arch_io_translation_mode( phys_addr_t phys );
extern void ofmem_arch_map_pages(phys_addr_t phys, ucell virt, ucell size,
ucell mode);
extern void ofmem_arch_unmap_pages(ucell virt, ucell size);
/* sparc64 uses this method */
extern int ofmem_map_page_range( phys_addr_t phys, ucell virt, ucell size,
ucell mode );
/* Private functions for mapping between physical/virtual addresses */
extern phys_addr_t va2pa(unsigned long va);
extern unsigned long pa2va(phys_addr_t pa);
/* malloc interface */
extern int ofmem_posix_memalign( void **memptr, size_t alignment, size_t size );
extern void* ofmem_malloc( size_t size );
extern void ofmem_free( void *ptr );
extern void* ofmem_realloc( void *ptr, size_t size );
/* ofmem_common.c */
extern void ofmem_cleanup( void );
extern void ofmem_init( void );
/*
* register /memory and /virtual-memory handles
* ofmem module will update "available" and "translations" properties
* using these handles
*
* to disable updating /memory properties pass zero memory handle
*/
extern void ofmem_register( phandle_t ph_memory, phandle_t ph_mmu );
extern ucell ofmem_claim( ucell addr, ucell size, ucell align );
extern phys_addr_t ofmem_claim_phys( phys_addr_t mphys, ucell size, ucell align );
extern ucell ofmem_claim_virt( ucell mvirt, ucell size, ucell align );
extern ucell ofmem_claim_io( ucell virt, ucell size, ucell align );
extern phys_addr_t ofmem_retain( phys_addr_t phys, ucell size, ucell align );
extern int ofmem_map( phys_addr_t phys, ucell virt, ucell size, ucell mode );
extern int ofmem_unmap( ucell virt, ucell size );
extern ucell ofmem_map_io( phys_addr_t phys, ucell size );
extern void ofmem_release( ucell virt, ucell size );
extern void ofmem_release_phys( phys_addr_t phys, ucell size );
extern void ofmem_release_virt( ucell virt, ucell size );
extern void ofmem_release_io( ucell virt, ucell size );
extern phys_addr_t ofmem_translate( ucell virt, ucell *ret_mode );
/* memory and virtual-memory nodes */
extern phandle_t s_phandle_memory;
extern phandle_t s_phandle_mmu;
#define PAGE_SIZE (1 << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE - 1))
#define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
#if defined(CONFIG_DEBUG_OFMEM)
#define DEBUG_OFMEM 1
#else
#define DEBUG_OFMEM 0
#endif
#define OFMEM_TRACE(fmt, ...) do { \
if (DEBUG_OFMEM) { \
printk("OFMEM: " fmt, ## __VA_ARGS__); \
} \
} while (0);
#endif /* _H_OFMEM */
|