Hi,

The Loongson 3B has a dma coherent bug, so I add a flag 'grub_dma_coherent'
to fix dma map. Thanks!

-- 
Best regards!
Heiher
http://hev.cc
From 15bd06d621a6e8d6bc8954dcdde1081037ea3a3c Mon Sep 17 00:00:00 2001
From: Heiher <r...@hev.cc>
Date: Fri, 29 May 2015 23:33:11 +0800
Subject: [PATCH 2/2] MIPS: Loongson: Add dma coherent flag for map dma buffer.

---
 grub-core/bus/pci.c                 |  6 +++++-
 grub-core/kern/mips/loongson/init.c | 12 +++++++++++-
 include/grub/mips/loongson/kernel.h |  2 ++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/grub-core/bus/pci.c b/grub-core/bus/pci.c
index 82d7870..04194d0 100644
--- a/grub-core/bus/pci.c
+++ b/grub-core/bus/pci.c
@@ -23,6 +23,7 @@
 #include <grub/misc.h>
 #include <grub/mm_private.h>
 #include <grub/cache.h>
+#include <grub/machine/kernel.h>
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
@@ -66,7 +67,10 @@ grub_dma_free (struct grub_pci_dma_chunk *ch)
 volatile void *
 grub_dma_get_virt (struct grub_pci_dma_chunk *ch)
 {
-  return (void *) ((((grub_uint32_t) ch) & 0x1fffffff) | 0xa0000000);
+  grub_uint32_t base;
+
+  base = grub_dma_coherent ? 0x80000000 : 0xa0000000;
+  return (void *) ((((grub_uint32_t) ch) & 0x1fffffff) | base);
 }
 
 grub_uint32_t
diff --git a/grub-core/kern/mips/loongson/init.c 
b/grub-core/kern/mips/loongson/init.c
index 2df8dfb..ae2b668 100644
--- a/grub-core/kern/mips/loongson/init.c
+++ b/grub-core/kern/mips/loongson/init.c
@@ -40,6 +40,8 @@
 #include <grub/loader.h>
 #include <grub/at_keyboard.h>
 
+grub_uint32_t grub_dma_coherent;
+
 grub_err_t
 grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
 {
@@ -132,6 +134,7 @@ grub_machine_init (void)
     case GRUB_CPU_LOONGSON_PRID_LOONGSON2E:
       grub_arch_machine = GRUB_ARCH_MACHINE_FULOONG2E;
       grub_bonito_type = GRUB_BONITO_2F;
+      grub_dma_coherent = 0;
       break;
       /* Loongson 2F.  */
     case GRUB_CPU_LOONGSON_PRID_LOONGSON2F:
@@ -139,13 +142,20 @@ grub_machine_init (void)
          && grub_arch_machine != GRUB_ARCH_MACHINE_YEELOONG)
        grub_arch_machine = GRUB_ARCH_MACHINE_YEELOONG;
       grub_bonito_type = GRUB_BONITO_2F;
+      grub_dma_coherent = 0;
       break;
-      /* Loongson 3A/3B. */
+      /* Loongson 3A. */
     case GRUB_CPU_LOONGSON_PRID_LOONGSON3A:
+      grub_arch_machine = GRUB_ARCH_MACHINE_YEELOONG_3X;
+      grub_bonito_type = GRUB_BONITO_3X;
+      grub_dma_coherent = 1;
+      break;
+      /* Loongson 3B. */
     case GRUB_CPU_LOONGSON_PRID_LOONGSON3BR1:
     case GRUB_CPU_LOONGSON_PRID_LOONGSON3BR2:
       grub_arch_machine = GRUB_ARCH_MACHINE_YEELOONG_3X;
       grub_bonito_type = GRUB_BONITO_3X;
+      grub_dma_coherent = 0;
       break;
     }
 
diff --git a/include/grub/mips/loongson/kernel.h 
b/include/grub/mips/loongson/kernel.h
index 29ad007..cdea946 100644
--- a/include/grub/mips/loongson/kernel.h
+++ b/include/grub/mips/loongson/kernel.h
@@ -29,6 +29,8 @@
 
 #ifndef ASM_FILE
 
+extern grub_uint32_t EXPORT_VAR (grub_dma_coherent);
+
 extern grub_uint32_t EXPORT_VAR (grub_arch_machine) __attribute__ 
((section(".text")));
 extern grub_addr_t EXPORT_VAR (grub_arch_lefi) __attribute__ 
((section(".text")));
 
-- 
2.4.2

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to