patch-2.1.80 linux/arch/arm/mm/mm-rpc.c

Next file: linux/arch/arm/mm/proc-arm2,3.S
Previous file: linux/arch/arm/mm/mm-nexuspci.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.79/linux/arch/arm/mm/mm-rpc.c linux/arch/arm/mm/mm-rpc.c
@@ -0,0 +1,80 @@
+/*
+ * arch/arm/mm/mm-rpc.c
+ *
+ * Extra MM routines for RiscPC architecture
+ *
+ * Copyright (C) 1998 Russell King
+ */
+
+#include <asm/setup.h>
+
+#define NR_DRAM_BANKS	4
+#define NR_VRAM_BANKS	1
+
+#define NR_BANKS	(NR_DRAM_BANKS + NR_VRAM_BANKS)
+
+#define FIRST_BANK	0
+#define FIRST_DRAM_BANK	0
+#define FIRST_VRAM_BANK	NR_DRAM_BANKS
+
+#define BANK_SHIFT	26
+#define FIRST_DRAM_ADDR	0x10000000
+
+#define PHYS_TO_BANK(x)	(((x) >> BANK_SHIFT) & (NR_DRAM_BANKS - 1))
+#define BANK_TO_PHYS(x)	((FIRST_DRAM_ADDR) +
+			    (((x) - FIRST_DRAM_BANK) << BANK_SHIFT)
+
+struct ram_bank {
+	unsigned int virt_addr;		/* virtual address of the *end* of this bank + 1 */
+	  signed int phys_offset;	/* offset to physical address of this bank */
+};
+
+static struct ram_bank rambank[NR_BANKS];
+
+/*
+ * Return the physical (0x10000000 -> 0x20000000) address of
+ * the virtual (0xc0000000 -> 0xd0000000) address
+ */
+unsigned long __virt_to_phys(unsigned long vpage)
+{
+	unsigned int bank = FIRST_BANK;
+
+	while (vpage >= rambank[bank].virt_addr && bank < NR_BANKS)
+		bank ++;
+
+	return vpage - rambank[bank].phys_offset;
+}
+
+/*
+ * Return the virtual (0xc0000000 -> 0xd0000000) address of
+ * the physical (0x10000000 -> 0x20000000) address
+ */
+unsigned long __phys_to_virt(unsigned long phys)
+{
+	unsigned int bank;
+
+	if (phys > FIRST_DRAM_ADDR)
+		bank = PHYS_TO_BANK(phys);
+	else
+		bank = FIRST_VRAM_BANK;
+
+	return phys + rambank[bank].phys_offset;
+}
+
+void init_dram_banks(struct param_struct *params)
+{
+	unsigned int bank;
+	unsigned int bytes = 0;
+
+	for (bank = FIRST_DRAM_BANK; bank < NR_DRAM_BANKS; bank++) {
+		rambank[bank].phys_offset = PAGE_OFFSET + bytes
+						- BANK_TO_PHYS(bank);
+
+		bytes += params->u1.s.pages_in_bank[bank - FIRST_DRAM_BANK] * PAGE_SIZE;
+
+		rambank[bank].virt_addr   = PAGE_OFFSET + bytes;
+	}
+
+	drambank[4].phys_offset = 0xd6000000;
+	drambank[4].virt_addr   = 0xd8000000;
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov