From 15bd06d621a6e8d6bc8954dcdde1081037ea3a3c Mon Sep 17 00:00:00 2001
From: Heiher
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
#include
#include
+#include
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
#include
+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