[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

atari bootstrap copes with alloc from FastRAM now



Hi,

below you'll find hopefully the final solution of problem with
"Load-to-TT-RAM" flag on AfterBurner040 and Centurbo2 FastRAM cards.
It's actually generic and should take care of any FastRAM&MMU problem.

--- /tmp/m68kboot/common/atari/linuxboot.c	2004-08-14 09:37:23.000000000 +0200
+++ common/atari/linuxboot.c	2004-08-14 10:23:15.000000000 +0200
@@ -132,6 +132,35 @@
     } while(0)
 

+/* taken from arch/m68k/kernel/sys_m68k.c */
+#define MMU_R_040	0x0001
+#define PAGE_SHIFT	(12)
+#define PAGE_SIZE	(1UL << PAGE_SHIFT)
+#define PAGE_MASK	(~(PAGE_SIZE-1))
+/* Convert virtual (user) address VADDR to physical address PADDR */
+#define virt_to_phys_040(vaddr)						\
+({									\
+  unsigned long _mmusr, _paddr;						\
+									\
+  __asm__ __volatile__ (".chip 68040\n\t"				\
+			"ptestr (%1)\n\t"				\
+			"movec %%mmusr,%0\n\t"				\
+			".chip 68k"					\
+			: "=r" (_mmusr)					\
+			: "a" (vaddr));					\
+  _paddr = (_mmusr & MMU_R_040) ? (_mmusr & PAGE_MASK) : 0;		\
+  _paddr;								\
+})
+
+/* return offset between physical and virtual (MMU remapped) address */
+long phys_offset(u_long vaddr) {
+    if (bi.mch_type == ATARI_MACH_AB40 && ((unsigned long)vaddr & 0xff000000))
+	return virt_to_phys_040(vaddr & PAGE_MASK) - (vaddr & PAGE_MASK);
+    if (getcookie("_CT2", NULL) != -1 && ((unsigned long)vaddr & 0xff000000))
+	return CT2_FAST_START - TT_RAM_BASE;
+    return 0;
+}
+
 void linux_boot( void )
 {
     char *kname;
@@ -141,6 +170,9 @@
     u_long kernel_size;		/* size of kernel image */
     char *memptr;		/* addr and size of load region */
     u_long memreq;
+    long memptr_mmu_offset;	/* physical memptr addr offset */
+    long kernel_mmu_offset;	/* physical kernel dest addr offset */
+    long ramdisk_mmu_offset;	/* physical ramdisk dest addr offset */
     u_long rd_size;		/* size of ramdisk and array of pointers to
 				 * its data */
 
@@ -239,14 +271,6 @@
     if (!(memptr = malloc( memreq )))
 	ERROR( "Unable to allocate %ld kB of memory for kernel%s\n",
 		memreq / 1024, (rd_size > 0) ? " and ramdisk" : "" );
-    /* Second part of the AB40 no-FastRAM test */
-    if (bi.mch_type == ATARI_MACH_AB40 && ((unsigned long)memptr & 0xff000000))
-	ERROR( "Error: Bootstrap may not allocate memory from FastRAM "
-	       "on Afterburner040\n" );
-    if (getcookie("_CT2", NULL) != -1 &&
-	((unsigned long)memptr & 0xff000000))
-	ERROR( "Error: Bootstrap may not allocate memory from TT-RAM "
-		"on Centurbo2\n" );
 
     /* clearing the kernel's memory perhaps avoids "uninitialized bss"
      * types of bugs... */
@@ -282,6 +306,11 @@
     /* copy the boot_info struct to the end of the kernel image */
     memcpy( memptr + kernel_size, bi_ptr, bi_size );
 
+    /* find out the physical offsets if the memory is MMU mapped */
+    memptr_mmu_offset = phys_offset((u_long)memptr);
+    kernel_mmu_offset = phys_offset(start_mem);
+    ramdisk_mmu_offset = phys_offset(bi.ramdisk.addr);
+
     /* for those who want to debug */
     if (debugflag) {
 	if (rd_size) {
@@ -294,6 +323,13 @@
 	printf ("boot_info is at %#lx\n",
 		start_mem + kernel_size);
 
+	if (memptr_mmu_offset)
+	    printf ("kernel src offset = %#lx\n", memptr_mmu_offset);
+	if (kernel_mmu_offset)
+	    printf ("kernel dest offset = %#lx\n", kernel_mmu_offset);
+	if (ramdisk_mmu_offset)
+	    printf ("ramdisk dest offset = %#lx\n", ramdisk_mmu_offset);
+
 	printf ("\nType a key to continue the Linux boot...");
 	fflush (stdout);
 	getchar();
@@ -312,6 +348,11 @@
     /* ..and any MMU translation */
     disable_mmu();
 
+    /* correct pointers to physical memory after MMU translation was disabled */
+    memptr += memptr_mmu_offset;
+    start_mem += kernel_mmu_offset;
+    bi.ramdisk.addr += ramdisk_mmu_offset;
+
     /* ++guenther: allow reset if launched with MiNT */
     *(long*)0x426 = 0;
 




Reply to: