patch-2.4.20 linux-2.4.20/arch/ppc64/kernel/lmb.c
Next file: linux-2.4.20/arch/ppc64/kernel/mf.c
Previous file: linux-2.4.20/arch/ppc64/kernel/irq.c
Back to the patch index
Back to the overall index
- Lines: 62
- Date:
Thu Nov 28 15:53:11 2002
- Orig file:
linux-2.4.19/arch/ppc64/kernel/lmb.c
- Orig date:
Fri Aug 2 17:39:43 2002
diff -urN linux-2.4.19/arch/ppc64/kernel/lmb.c linux-2.4.20/arch/ppc64/kernel/lmb.c
@@ -12,6 +12,7 @@
*/
#include <linux/config.h>
+#include <linux/kernel.h>
#include <asm/types.h>
#include <asm/page.h>
#include <asm/prom.h>
@@ -27,7 +28,7 @@
static long lmb_add_region(struct lmb_region *, unsigned long, unsigned long, unsigned long);
struct lmb lmb = {
- 0,
+ 0, 0,
{0,0,0,0,{{0,0,0}}},
{0,0,0,0,{{0,0,0}}}
};
@@ -135,6 +136,10 @@
struct lmb *_lmb = PTRRELOC(&lmb);
struct lmb_region *_rgn = &(_lmb->memory);
+ /* On pSeries LPAR systems, the first LMB is our RMO region. */
+ if ( base == 0 )
+ _lmb->rmo_size = size;
+
return lmb_add_region(_rgn, base, size, LMB_MEMORY_AREA);
}
@@ -242,12 +247,17 @@
return (i < rgn->cnt) ? i : -1;
}
-
unsigned long
lmb_alloc(unsigned long size, unsigned long align)
{
+ return lmb_alloc_base(size, align, LMB_ALLOC_ANYWHERE);
+}
+
+unsigned long
+lmb_alloc_base(unsigned long size, unsigned long align, unsigned long max_addr)
+{
long i, j;
- unsigned long base;
+ unsigned long base = 0;
unsigned long offset = reloc_offset();
struct lmb *_lmb = PTRRELOC(&lmb);
struct lmb_region *_mem = &(_lmb->memory);
@@ -261,7 +271,12 @@
if ( lmbtype != LMB_MEMORY_AREA )
continue;
- base = _ALIGN_DOWN(lmbbase+lmbsize-size, align);
+ if ( max_addr == LMB_ALLOC_ANYWHERE )
+ base = _ALIGN_DOWN(lmbbase+lmbsize-size, align);
+ else if ( lmbbase < max_addr )
+ base = _ALIGN_DOWN(min(lmbbase+lmbsize,max_addr)-size, align);
+ else
+ continue;
while ( (lmbbase <= base) &&
((j = lmb_overlaps_region(_rsv,base,size)) >= 0) ) {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)