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