Memory Setting with prom_meminit() in memory.c.....

From: Greeen-III (greeen@iii.org.tw)
Date: Wed Feb 07 2001 - 20:06:12 EST


Dear all,

The board I used has two pieces of RAM. The virtual address start at 0x0000
0000 and
0x0200 0000. One is 4 MB(0x0000 0000) and the other is 16 MB(0x0200 0000).
But
orginal file is writted as the following. How could I modify this file to
match my
target board?

Green
----------------------------------------------------------------------------
------------
/*
 * memory.c: memory initialisation code.
 *
 * Copyright (C) Harald Koerfgen
 * Copyright (C) Jim Pick
 * Copyright (C) Pavel Machek
 *
 * $Id: memory.c,v 1.16 2000/07/09 03:36:18 nop Exp $
 */
#include <asm/addrspace.h>
#include <asm/r39xx.h>
#include <asm/bootinfo.h>
#include <asm/page.h>
#include <linux/init.h>
#include <linux/config.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/bootmem.h>

/* 應該不是用vitec_helio,所以會跑other ---->This line is Chinese(Big5) */
/* We don't use VTECH_HELIO. So the CONFIG_VTECH_HELIO is not defined */

#ifdef CONFIG_VTECH_HELIO
#define PROM_DEBUG
#endif

#ifdef PROM_DEBUG
extern int prom_printf(char * fmt, ...);
#endif

#ifndef CONFIG_VTECH_HELIO
int main_memory = CONFIG_MAIN_MEMORY; /* We should autoconfigure this. For
now, just let the user select. */
int exp_memory = CONFIG_EXP_MEMORY;
#define MEGA (1024*1024)
#endif

extern char _end;
extern char _fdata;

#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
#define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
#define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)

/* Modyfied by Green 2001/02/07 */
/* This function show the message through COM port */
#ifdef JAODEBUG
extern int Jprom_printf(const char * fmt, ...);
#else
#define Jprom_printf(fmt, a...)
#endif
/* End of modification*/

#ifdef CONFIG_VTECH_HELIO /* We didn't go here insteal of
prom_meminit_other() */
static void __init prom_meminit_helio(void)
{
.....
.....
}

#else /* CONFIG_VTECH_HELIO */

static void __init prom_meminit_other(void)
{
 extern unsigned long videomemory;
 unsigned long free_start;
 unsigned long free_end;
 unsigned long start_pfn;
 unsigned long bootmap_size;
 unsigned long ramspace;

 static char vidmem[(320 * 240 / 2) + PAGE_SIZE - 1];

 /* Okay the Helio has an odd memory layout, split into 4 banks of 2M
  * at the following places:
  *
  * 0x00000000
  * 0x00400000
  * 0x02000000
  * 0x02400000 (add 0x80000000 for virtual address)
  *
  * We allocate the bootmem as a continuous bank and then free up the
  * relevant memory holes. Of these the kernel will be using some
  * of the first bank so be careful how we deal with it.
  */
    Jprom_printf("prom_meminit_other------------>Beginning\n");

    videomemory = KSEG0ADDR(PFN_ALIGN(vidmem));
    start_pfn = PFN_UP((unsigned long)&_end);
/*_end=801abba0---->0x000801ac*/
    free_start = PHYSADDR(PFN_ALIGN(&_end));

#ifdef CONFIG_VTECH_HELIO_EMULATOR
        /* What's worse, the emulator implements two 4M banks at
         * 0x0000 and 0x0200. Fixing soon, but until then:
         */
 ramspace = 0x02400000; /* With holes!! */
 free_end = 0x00400000;

 Jprom_printf("--------------------------->ramspace: 0x%08x\n", ramspace);

 bootmap_size = init_bootmem(start_pfn, ramspace >> PAGE_SHIFT);

 /* Free up the *two* memory banks */
 free_bootmem(free_start + bootmap_size, free_end - free_start -
bootmap_size);
 free_bootmem(0x02000000, 0x00400000);
#else
 ramspace = 0x02600000; /* With holes!! */
 free_end = 0x00200000;

 bootmap_size = init_bootmem(start_pfn, ramspace >> PAGE_SHIFT);
 Jprom_printf("_end = 0x%08x-------->_end \n",&_end);
 Jprom_printf("start_pfn = 0x%08x-------->FPN_UP() \n",start_pfn);
 Jprom_printf("free_start = 0x%08x-------->PHYSADDR \n",free_start);
 Jprom_printf("free_end = 0x%08x-------->0x00200000 \n",free_end);
    Jprom_printf("bootmap_size =
0x%08x-------->bootmapsize\n",bootmap_size);
 Jprom_printf("PAGE_SHIFT = 0x%08x-------->PAGE_SHIFT \n",PAGE_SHIFT);
    Jprom_printf("ramspace = 0x%08x-------->0x02600000 \n",ramspace);
 /* Free up the four memory banks */
 free_bootmem(free_start + bootmap_size, free_end - free_start -
bootmap_size);
 free_bootmem(0x00400000, 0x00200000);
 free_bootmem(0x02000000, 0x00200000);
 free_bootmem(0x02400000, 0x00200000);
#endif

//#ifdef CONFIG_FB
// extern unsigned long videomemory;
//#endif
// unsigned long free_start, free_end, start_pfn, bootmap_size;
// unsigned long mem_size = main_memory*MEGA;
//
// free_end = mem_size;
// if (exp_memory)
// mem_size = 0x02000000 | (exp_memory*MEGA);
//
// free_start = PHYSADDR(PFN_ALIGN(&_end));
// start_pfn = PFN_UP((unsigned long)&_end);
//
// #ifdef CONFIG_FB
/*
 * This has to be in line with VIDEORAM_SIZE in r3912fb.c
 */
// switch (mips_machtype) {
// case MACH_R39XX_SHARP_MOBILON:
// case MACH_R39XX_COMPAQ:
//modified by Jao
//free_end -= 640*240;
// free_end -= 320*240;
// videomemory = KSEG0ADDR(free_end);
// break;
// case MACH_R39XX_PHILIPS_VELO:
// free_end -= 480*240/2; /* Velo has actually 2 different bit depths, this
is for 4bit.
// It is bigger that's why it is used here. */
// videomemory = KSEG0ADDR(free_end);
// break;
// case MACH_R39XX_PHILIPS_NINO:
// free_end -= 240*320/2;
// free_end &= PAGE_MASK;
// videomemory = KSEG0ADDR(free_end);
// break;
// default:
// break;
// }
//#endif

//#ifdef PROM_DEBUG
// prom_printf("free_start: 0x%08x\n", free_start);
// prom_printf("free_end: 0x%08x\n", free_end);
// prom_printf("start_pfn: 0x%08x\n", start_pfn);
// #ifdef CONFIG_FB
// prom_printf("videomemory: 0x%08x\n", videomemory);
// #endif
//#endif

 /* Register all the contiguous memory with the bootmem allocator
    and free it. Be careful about the bootmem freemap. */
// bootmap_size = init_bootmem(start_pfn, mem_size >> PAGE_SHIFT);
// free_bootmem(free_start + bootmap_size, free_end - free_start -
bootmap_size);
// if (exp_memory)
// free_bootmem(0x02000000, exp_memory*MEGA);
}

#endif /* CONFIG_VTECH_HELIO */
void __init prom_meminit(void)
{
Jprom_printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
#if defined(CONFIG_VTECH_HELIO)
 Jprom_printf("------->Here to go to prom_meminit_helio\n");
 prom_meminit_helio();
#else
 Jprom_printf("------->Here to go to prom_meminit_other\n");
 prom_meminit_other();
#endif
}

int __init page_is_ram(unsigned long pagenr)
{
        return 1;
}

/* Called from mem_init() to fixup the mem_map page settings. */
void __init prom_fixup_mem_map(unsigned long start, unsigned long end)
{
}

void prom_free_prom_memory (void)
{
}

************************************
* It's Green!! (萬林明)
* TEL: 886-2-23776100 ext.620
* mailto:greeen@iii.org.tw
* Working at III(資策會)
* 台北市大安區敦化南路二段216號12F
************************************

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed Feb 07 2001 - 21:00:28 EST