| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614 |
- From 13fc0abf4b5da6f18dea15fd31697655615a79fc Mon Sep 17 00:00:00 2001
- From: Kurt Mahan <[email protected]>
- Date: Wed, 12 Mar 2008 15:39:03 -0600
- Subject: [PATCH] Move kernel to physical sdram base address.
- Work based on the patches from Systec GMBH. Also DMA support,
- uBoot integration, FEC fixes, and assorted cleanups.
- Uber patch needs to be split up.
- LTIBName: mcfv4e-kern-to-phys
- Signed-off-by: Kurt Mahan <[email protected]>
- ---
- arch/m68k/coldfire/config.c | 102 ++-----
- arch/m68k/coldfire/dma.c | 7 +-
- arch/m68k/coldfire/entry.S | 10 +
- arch/m68k/coldfire/head.S | 53 +++-
- arch/m68k/coldfire/mcf5445x-devices.c | 2 +
- arch/m68k/coldfire/mcf5445x-pci.c | 3 +
- arch/m68k/coldfire/signal.c | 3 +
- arch/m68k/configs/m5485evb_defconfig | 79 +++++-
- arch/m68k/mm/cache.c | 4 +-
- arch/m68k/mm/cf-mmu.c | 28 ++-
- arch/m68k/mm/memory.c | 8 +-
- drivers/net/fec/fec.c | 20 +-
- include/asm-m68k/bootinfo.h | 59 +++-
- include/asm-m68k/cf_cacheflush.h | 547 +++++++++++----------------------
- include/asm-m68k/cf_pgalloc.h | 5 +-
- include/asm-m68k/cf_pgtable.h | 2 +-
- include/asm-m68k/cfcache.h | 6 +
- include/asm-m68k/page.h | 8 +
- include/asm-m68k/page_offset.h | 25 +-
- 19 files changed, 446 insertions(+), 525 deletions(-)
- --- a/arch/m68k/coldfire/config.c
- +++ b/arch/m68k/coldfire/config.c
- @@ -23,7 +23,6 @@
- #include <asm/coldfire.h>
- #include <asm/cfcache.h>
- #include <asm/cacheflush.h>
- -#include <asm/bootinfo.h>
- #include <asm/io.h>
- #include <asm/cfmmu.h>
- #include <asm/setup.h>
- @@ -36,7 +35,14 @@
-
- #include <asm/mcfsim.h>
-
- -#if 0
- +#if defined(CONFIG_M54455)
- +#define UBOOT_EXTRA_CLOCKS
- +#elif defined(CONFIG_M547X_8X)
- +#define UBOOT_PCI
- +#endif
- +#include <asm/bootinfo.h>
- +
- +#ifdef CONFIG_M54455
- #include <asm/mcf5445x_intc.h>
- #include <asm/mcf5445x_sdramc.h>
- #include <asm/mcf5445x_fbcs.h>
- @@ -44,10 +50,6 @@
- #include <asm/mcf5445x_xbs.h>
- #endif
-
- -/* JKM -- testing */
- -#include <linux/pfn.h>
- -/* JKM */
- -
- extern int get_irq_list(struct seq_file *p, void *v);
- extern char _text, _end;
- extern char _etext, _edata, __init_begin, __init_end;
- @@ -58,6 +60,10 @@ extern unsigned long availmem;
- static int irq_enable[NR_IRQS];
- unsigned long num_pages;
-
- +/* ethernet mac addresses from uboot */
- +unsigned char uboot_enet0[6];
- +unsigned char uboot_enet1[6];
- +
- void coldfire_sort_memrec(void)
- {
- int i, j;
- @@ -87,6 +93,9 @@ void coldfire_sort_memrec(void)
- }
- }
-
- +/*
- + * UBoot Handler
- + */
- int __init uboot_commandline(char *bootargs)
- {
- int len = 0, cmd_line_len;
- @@ -101,12 +110,17 @@ int __init uboot_commandline(char *boota
- return 0;
-
- /* Add offset to get post-remapped kernel memory location */
- - uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + offset;
- + uboot_info.bdi = (struct bd_info *)((*(u32 *)(uboot_info_stk)) + offset);
- uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset;
- uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset;
- uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset;
- uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset;
-
- + /* copy over mac addresses */
- + memcpy(uboot_enet0, uboot_info.bdi->bi_enet0addr, 6);
- + memcpy(uboot_enet1, uboot_info.bdi->bi_enet1addr, 6);
- +
- + /* copy command line */
- cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start;
- if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1))
- len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\
- @@ -121,7 +135,7 @@ int __init uboot_commandline(char *boota
- #if defined(CONFIG_M54455)
- #define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
- #elif defined(CONFIG_M547X_8X)
- -#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
- +#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
- #endif
- asmlinkage void __init cf_early_init(void)
- {
- @@ -142,7 +156,6 @@ asmlinkage void __init cf_early_init(voi
- MCF_INTC1_IMRL = 0xFFFFFFFF;
- MCF_INTC1_IMRH = 0xFFFFFFFF;
- #elif defined(CONFIG_M547X_8X)
- -/* JKM -- ?? */
- MCF_IMRL = 0xFFFFFFFF;
- MCF_IMRH = 0xFFFFFFFF;
- #endif
- @@ -170,7 +183,6 @@ asmlinkage void __init cf_early_init(voi
- MCF_XBS_PRS_M6(MCF_XBS_PRI_1) |
- MCF_XBS_PRS_M7(MCF_XBS_PRI_7));
- #endif
- -
-
- m68k_machtype = MACH_CFMMU;
- m68k_fputype = FPU_CFV4E;
- @@ -181,7 +193,6 @@ asmlinkage void __init cf_early_init(voi
- m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
- m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
-
- -#if defined(CONFIG_M54455)
- if (!uboot_commandline(m68k_command_line)) {
- #if defined(CONFIG_BOOTPARAM)
- strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
- @@ -189,11 +200,6 @@ asmlinkage void __init cf_early_init(voi
- strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
- #endif
- }
- -#else
- -/* JKM -- hack until mappings get resolved */
- - strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
- -#endif
- -
-
- #if defined(CONFIG_BLK_DEV_INITRD)
- /* add initrd image */
- @@ -372,75 +378,11 @@ void coldfire_reboot(void)
- #endif
- }
-
- -/* int coldfire_hwclk(int i, struct rtc_time *t)
- -{
- - printk ("Real time clock needs porting.\n");
- - return 0;
- -}*/
- -
- static void coldfire_get_model(char *model)
- {
- sprintf(model, "Version 4 ColdFire");
- }
-
- -/* JKM -- Why do we need these? */
- -void coldfire_enable_irq(unsigned int vec)
- -{
- - unsigned long flags;
- -
- - vec -= 64;
- -
- - if (((int)vec < 0) || (vec > 63)) {
- - printk(KERN_WARNING "enable_irq %d failed\n", vec);
- - return;
- - }
- -
- - local_irq_save(flags);
- - irq_enable[vec]++;
- -#if defined(CONFIG_M54455)
- - if (vec < 32)
- - MCF_INTC0_IMRL &= ~(1 << vec);
- - else
- - MCF_INTC0_IMRH &= ~(1 << (vec - 32));
- -#elif defined(CONFIG_M547X_8X)
- - if (vec < 32)
- - MCF_IMRL &= ~(1 << vec);
- - else
- - MCF_IMRH &= ~(1 << (vec - 32));
- -#endif
- - local_irq_restore(flags);
- -}
- -
- -/* JKM -- Why do we need these? */
- -void coldfire_disable_irq(unsigned int vec)
- -{
- - unsigned long flags;
- -
- - vec -= 64;
- -
- - if (((int)vec < 0) || (vec > 63)) {
- - printk(KERN_WARNING "disable_irq %d failed\n", vec);
- - return;
- - }
- -
- - local_irq_save(flags);
- - if (--irq_enable[vec] == 0) {
- -#if defined(CONFIG_M54455)
- - if (vec < 32)
- - MCF_INTC0_IMRL |= (1 << vec);
- - else
- - MCF_INTC0_IMRH |= (1 << (vec - 32));
- -#elif defined(CONFIG_M547X_8X)
- - if (vec < 32)
- - MCF_IMRL |= (1 << vec);
- - else
- - MCF_IMRH |= (1 << (vec - 32));
- -#endif
- -
- - }
- - local_irq_restore(flags);
- -}
- -
- static void __init
- coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end)
- {
- --- a/arch/m68k/coldfire/dma.c
- +++ b/arch/m68k/coldfire/dma.c
- @@ -516,13 +516,8 @@ dma_init()
- MCF_DMA_DIPR = 0xFFFFFFFF;
-
- MCF_ICR(ISC_DMA) = ILP_DMA;
- -#if 0
- -// JKM
- - enable_irq( 64 + ISC_DMA );
- -#endif
-
- - result =
- - MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
- + result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
- (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
- if (result != MCD_OK) {
- printk("Cannot perform DMA initialization\n");
- --- a/arch/m68k/coldfire/entry.S
- +++ b/arch/m68k/coldfire/entry.S
- @@ -10,6 +10,8 @@
- * Kurt Mahan [email protected]
- * Copyright Freescale Semiconductor, Inc. 2007
- *
- + * Modify irq status in buserr -- (c) Copyright 2008, SYSTEM electronic Gmbh
- + *
- * Based on:
- *
- * arch/m68knommu/platform/5307/entry.S &
- @@ -77,7 +79,15 @@ sw_usp:
- .globl inthandler
-
- ENTRY(buserr)
- +#ifdef CONFIG_COLDFIRE_FOO
- + movew #0x2700,%sr /* lock interrupts */
- +#endif
- SAVE_ALL_INT
- +#ifdef CONFIG_COLDFIRE_FOO
- + movew PT_SR(%sp),%d3 /* get original %sr */
- + oril #0x2000,%d3 /* set supervisor mode in it */
- + movew %d3,%sr /* recover irq state */
- +#endif
- GET_CURRENT(%d0)
- movel %sp,%sp@- /* stack frame pointer argument */
- jsr buserr_c
- --- a/arch/m68k/coldfire/head.S
- +++ b/arch/m68k/coldfire/head.S
- @@ -5,6 +5,7 @@
- * Matt Waddel [email protected]
- * Kurt Mahan [email protected]
- * Copyright Freescale Semiconductor, Inc. 2007, 2008
- + * Phys kernel mapping Copyright Daniel Krueger, SYSTEC electornic GmbH 2008
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- @@ -52,7 +53,7 @@
- #define __FINIT .previous
- #endif
-
- -/* JKM -- REVISE DOCS FOR RIGO */
- +/* JKM -- REVISE DOCS FOR RIGO and PHYS MAPPING */
- /*
- * Setup ACR mappings to provide the following memory map:
- * Data
- @@ -62,10 +63,17 @@
- * None currently (mapped via TLBs)
- */
-
- +#if CONFIG_SDRAM_BASE != PAGE_BASE
- #if defined(CONFIG_M54455)
- +#if 0
- #define ACR0_DEFAULT #0xA00FA048 /* ACR0 default value */
- +#endif
- +#define ACR0_DEFAULT #0x400FA028 /* ACR0 default value */
- #define ACR1_DEFAULT #0xF00FA040 /* ACR1 default value */
- +#if 0
- #define ACR2_DEFAULT #0x00000000 /* ACR2 default value */
- +#endif
- +#define ACR2_DEFAULT #0x400FA028 /* ACR2 default value */
- #define ACR3_DEFAULT #0x00000000 /* ACR3 default value */
- /* ACR mapping for FPGA (maps 0) */
- #define ACR0_FPGA #0x000FA048 /* ACR0 enable FPGA */
- @@ -76,6 +84,16 @@
- #define ACR3_DEFAULT #0x00000000 /* ACR3 default value */
- #endif
-
- +#else
- +#if defined(CONFIG_M54455)
- +#elif defined(CONFIG_M547X_8X)
- +#define ACR0_DEFAULT #0xE000C040 /* ACR0 default value */
- +#define ACR1_DEFAULT #0x000FA008 /* ACR1 default value */
- +#define ACR2_DEFAULT #0x00000000 /* ACR2 default value */
- +#define ACR3_DEFAULT #0x000FA008 /* ACR3 default value */
- +#endif
- +#endif
- +
-
- /* Several macros to make the writing of subroutines easier:
- * - func_start marks the beginning of the routine which setups the frame
- @@ -153,6 +171,7 @@ func_define putn,1
- #endif
- .endm
-
- +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
- /*
- mmu_map - creates a new TLB entry
-
- @@ -222,6 +241,7 @@ func_define putn,1
- movew \temp_data_reg, (MMUOR)
- 1:
- .endm /* mmu_unmap */
- +#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
-
- /* .text */
- .section ".text.head","ax"
- @@ -235,7 +255,11 @@ ENTRY(_stext)
-
- .long BOOTINFOV_MAGIC
- .long 0
- +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
- 1: jmp __start-(0xc0000000-CONFIG_SDRAM_BASE)
- +#else
- +1: jmp __start
- +#endif
-
- .equ kernel_pg_dir,_stext
- .equ .,_stext+0x1000
- @@ -244,24 +268,13 @@ ENTRY(_start)
- jra __start
- __INIT
- ENTRY(__start)
- -
- -/* JKM -- make sure Rigo handles UBOOT */
- /* Save the location of u-boot info - cmd line, bd_info, etc. */
- movel %a7,%a4 /* Don't use %a4 before cf_early_init */
- -/* JKM -- fix to use CONFIG_SDRAM_BASE) */
- -#if defined(CONFIG_M54455)
- - addl #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
- -#elif defined(CONFIG_M547X_8X)
- - addl #0xc0000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
- -#endif
- + addl #0x00000004,%a4 /* offset past top */
- + addl #(PAGE_OFFSET-CONFIG_SDRAM_BASE),%a4 /* high mem offset */
-
- -/* JKM -- fix this to work off of CONFIG_SDRAM_BASE */
- /* Setup initial stack pointer */
- -#if defined(CONFIG_M54455)
- - movel #0x40001000,%sp
- -#elif defined(CONFIG_M547X_8X)
- - movel #0x00001000,%sp
- -#endif
- + movel #CONFIG_SDRAM_BASE+0x1000,%sp
-
- /* Setup usp */
- subl %a0,%a0
- @@ -297,16 +310,21 @@ ENTRY(__start)
- /* setup ACRs */
- movel ACR0_DEFAULT, %d0 /* ACR0 (DATA) setup */
- movec %d0, %acr0
- + nop
- movel ACR1_DEFAULT, %d0 /* ACR1 (DATA) setup */
- movec %d0, %acr1
- + nop
- movel ACR2_DEFAULT, %d0 /* ACR2 (CODE) setup */
- movec %d0, %acr2
- + nop
- movel ACR3_DEFAULT, %d0 /* ACR3 (CODE) setup */
- movec %d0, %acr3
- + nop
-
- /* If you change the memory size to another value make a matching
- change in paging_init(cf-mmu.c) to zones_size[]. */
-
- +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
- #if defined(CONFIG_M54455)
- /* Map 256MB as code */
- mmu_map (PAGE_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \
- @@ -511,6 +529,7 @@ ENTRY(__start)
- MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
- MMUDR_W, 0, 0, %d0
- #endif
- +#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
-
- /* Turn on MMU */
- movel #(MMUCR_EN),%a0
- @@ -531,6 +550,7 @@ ENTRY(__running_high)
- movel %a1,%a0@
-
- /* Unmap unity mappings */
- +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
- #if defined(CONFIG_M54455)
- mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
- mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
- @@ -544,6 +564,7 @@ ENTRY(__running_high)
- mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0
- mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0
- #endif
- +#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
-
- /* Setup initial stack pointer */
- lea init_task,%a2
- @@ -574,6 +595,7 @@ func_return set_context
- * Map in 0x00000000 -> 0x0fffffff and then do the write.
- */
- set_fpga:
- +#if 0
- movew %sr,%d1
- movew #0x2700,%sr
- movel ACR0_FPGA, %d0
- @@ -585,6 +607,7 @@ set_fpga:
- movec %d0, %acr0
- nop
- movew %d1,%sr
- +#endif
- rts
- #endif
-
- --- a/arch/m68k/coldfire/mcf5445x-devices.c
- +++ b/arch/m68k/coldfire/mcf5445x-devices.c
- @@ -127,7 +127,9 @@ static inline void mcf5445x_init_pata(vo
- static int __init mcf5445x_init_devices(void)
- {
- printk(KERN_INFO "MCF5445x INIT_DEVICES\n");
- +#if 0
- mcf5445x_init_pata();
- +#endif
-
- return 0;
- }
- --- a/arch/m68k/coldfire/mcf5445x-pci.c
- +++ b/arch/m68k/coldfire/mcf5445x-pci.c
- @@ -236,6 +236,8 @@ mcf5445x_pci_arb_interrupt(int irq, void
- int __init
- init_mcf5445x_pci(void)
- {
- + return 0;
- +#if 0
- /*
- * Initialize the PCI core
- */
- @@ -331,6 +333,7 @@ init_mcf5445x_pci(void)
- raw_pci_ops = &mcf5445x_pci_ops;
-
- return 0;
- +#endif
- }
-
- /*
- --- a/arch/m68k/coldfire/signal.c
- +++ b/arch/m68k/coldfire/signal.c
- @@ -608,7 +608,10 @@ static inline int rt_setup_ucontext(stru
-
- static inline void push_cache(unsigned long vaddr)
- {
- +#if 0
- +// JKM -- need to add into the old cpushl cache stuff
- cf_cache_push(__pa(vaddr), 8);
- +#endif
- }
-
- static inline void __user *
- --- a/arch/m68k/configs/m5485evb_defconfig
- +++ b/arch/m68k/configs/m5485evb_defconfig
- @@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.24
- -# Thu Feb 21 00:19:01 2008
- +# Wed Mar 5 16:05:25 2008
- #
- CONFIG_M68K=y
- CONFIG_MMU=y
- @@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="cfq"
- # CONFIG_SUN3 is not set
- CONFIG_COLDFIRE=y
- CONFIG_CFV4E=y
- +CONFIG_MCD_DMA=y
- # CONFIG_AMIGA is not set
- # CONFIG_ATARI is not set
- # CONFIG_MAC is not set
- @@ -135,7 +136,7 @@ CONFIG_M5485CFE=y
- # CONFIG_M5485DFE is not set
- # CONFIG_M5485EFE is not set
- # CONFIG_M5485FFE is not set
- -CONFIG_MCFCLK=50000000
- +CONFIG_MCFCLK=200000000
- # CONFIG_MCF_USER_HALT is not set
- CONFIG_MMU_CFV4E=y
- CONFIG_SDRAM_BASE=0x00000000
- @@ -279,7 +280,73 @@ CONFIG_FW_LOADER=y
- # CONFIG_DEBUG_DEVRES is not set
- # CONFIG_SYS_HYPERVISOR is not set
- # CONFIG_CONNECTOR is not set
- -# CONFIG_MTD is not set
- +CONFIG_MTD=y
- +# CONFIG_MTD_DEBUG is not set
- +# CONFIG_MTD_CONCAT is not set
- +CONFIG_MTD_PARTITIONS=y
- +# CONFIG_MTD_REDBOOT_PARTS is not set
- +CONFIG_MTD_CMDLINE_PARTS=y
- +
- +#
- +# User Modules And Translation Layers
- +#
- +# CONFIG_MTD_CHAR is not set
- +CONFIG_MTD_BLKDEVS=y
- +CONFIG_MTD_BLOCK=y
- +# CONFIG_FTL is not set
- +# CONFIG_NFTL is not set
- +# CONFIG_INFTL is not set
- +# CONFIG_RFD_FTL is not set
- +# CONFIG_SSFDC is not set
- +# CONFIG_MTD_OOPS is not set
- +
- +#
- +# RAM/ROM/Flash chip drivers
- +#
- +# CONFIG_MTD_CFI is not set
- +# CONFIG_MTD_JEDECPROBE is not set
- +CONFIG_MTD_MAP_BANK_WIDTH_1=y
- +CONFIG_MTD_MAP_BANK_WIDTH_2=y
- +CONFIG_MTD_MAP_BANK_WIDTH_4=y
- +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
- +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
- +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
- +CONFIG_MTD_CFI_I1=y
- +CONFIG_MTD_CFI_I2=y
- +# CONFIG_MTD_CFI_I4 is not set
- +# CONFIG_MTD_CFI_I8 is not set
- +CONFIG_MTD_RAM=y
- +CONFIG_MTD_ROM=y
- +# CONFIG_MTD_ABSENT is not set
- +
- +#
- +# Mapping drivers for chip access
- +#
- +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
- +# CONFIG_MTD_PHYSMAP is not set
- +# CONFIG_MTD_PLATRAM is not set
- +
- +#
- +# Self-contained MTD device drivers
- +#
- +# CONFIG_MTD_SLRAM is not set
- +# CONFIG_MTD_PHRAM is not set
- +# CONFIG_MTD_MTDRAM is not set
- +# CONFIG_MTD_BLOCK2MTD is not set
- +
- +#
- +# Disk-On-Chip Device Drivers
- +#
- +# CONFIG_MTD_DOC2000 is not set
- +# CONFIG_MTD_DOC2001 is not set
- +# CONFIG_MTD_DOC2001PLUS is not set
- +# CONFIG_MTD_NAND is not set
- +# CONFIG_MTD_ONENAND is not set
- +
- +#
- +# UBI - Unsorted block images
- +#
- +# CONFIG_MTD_UBI is not set
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_COW_COMMON is not set
- @@ -347,6 +414,9 @@ CONFIG_NETDEVICES=y
- # CONFIG_PHYLIB is not set
- CONFIG_NET_ETHERNET=y
- CONFIG_MII=y
- +CONFIG_FEC_548x=y
- +CONFIG_FEC_548x_AUTO_NEGOTIATION=y
- +# CONFIG_FEC_548x_ENABLE_FEC2 is not set
- # CONFIG_IBM_NEW_EMAC_ZMII is not set
- # CONFIG_IBM_NEW_EMAC_RGMII is not set
- # CONFIG_IBM_NEW_EMAC_TAH is not set
- @@ -530,7 +600,7 @@ CONFIG_FS_MBCACHE=y
- # CONFIG_GFS2_FS is not set
- # CONFIG_OCFS2_FS is not set
- CONFIG_MINIX_FS=y
- -# CONFIG_ROMFS_FS is not set
- +CONFIG_ROMFS_FS=y
- # CONFIG_INOTIFY is not set
- # CONFIG_QUOTA is not set
- CONFIG_DNOTIFY=y
- @@ -578,6 +648,7 @@ CONFIG_TMPFS=y
- # CONFIG_BEFS_FS is not set
- # CONFIG_BFS_FS is not set
- # CONFIG_EFS_FS is not set
- +# CONFIG_JFFS2_FS is not set
- # CONFIG_CRAMFS is not set
- # CONFIG_VXFS_FS is not set
- # CONFIG_HPFS_FS is not set
- --- a/arch/m68k/mm/cache.c
- +++ b/arch/m68k/mm/cache.c
- @@ -81,7 +81,9 @@ static unsigned long virt_to_phys_slow(u
- void flush_icache_range(unsigned long address, unsigned long endaddr)
- {
- #ifdef CONFIG_COLDFIRE
- - cf_icache_flush_range(address, endaddr);
- +// JKM -- hack until new cpushl stuff is in
- +// cf_icache_flush_range(address, endaddr);
- + flush_icache();
- #else /* !CONFIG_COLDFIRE */
-
- if (CPU_IS_040_OR_060) {
- --- a/arch/m68k/mm/cf-mmu.c
- +++ b/arch/m68k/mm/cf-mmu.c
- @@ -35,6 +35,12 @@
- #include <asm/coldfire.h>
- #include <asm/tlbflush.h>
-
- +#if PAGE_OFFSET == CONFIG_SDRAM_BASE
- +#define KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE)))
- +#else
- +#define KERNRAM(x) (x >= PAGE_OFFSET)
- +#endif
- +
- mm_context_t next_mmu_context;
- unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
-
- @@ -53,10 +59,16 @@ extern char __init_begin, __init_end;
-
- void free_initmem(void)
- {
- +#if 0
- unsigned long addr;
- unsigned long start = (unsigned long)&__init_begin;
- unsigned long end = (unsigned long)&__init_end;
-
- +/*
- + * JKM -- revisit -- the latest round of vmlinux.lds changes has caused
- + * a little grief with how init areas are handled. With the new toolchain
- + * release I'll fix this.
- + */
- printk(KERN_INFO "free_initmem: __init_begin = 0x%lx __init_end = 0x%lx\n", start, end);
-
- addr = (unsigned long)&__init_begin;
- @@ -67,6 +79,7 @@ void free_initmem(void)
- free_page(addr);
- totalram_pages++;
- }
- +#endif
- }
-
- /* Coldfire paging_init derived from sun3 */
- @@ -149,8 +162,8 @@ int cf_tlb_miss(struct pt_regs *regs, in
- mmuar = ( dtlb ) ? regs->mmuar
- : regs->pc + (extension_word * sizeof(long));
-
- - mm = (!user_mode(regs) && (mmuar >= PAGE_OFFSET)) ? &init_mm
- - : current->mm;
- + mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm;
- +
- if (!mm) {
- local_irq_restore(flags);
- return (-1);
- @@ -167,9 +180,9 @@ int cf_tlb_miss(struct pt_regs *regs, in
- local_irq_restore(flags);
- return (-1);
- }
- -
- - pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
- - : pte_offset_map(pmd, mmuar);
- +
- + pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar)
- + : pte_offset_map(pmd, mmuar);
- if (pte_none(*pte) || !pte_present(*pte)) {
- local_irq_restore(flags);
- return (-1);
- @@ -185,7 +198,7 @@ int cf_tlb_miss(struct pt_regs *regs, in
-
- set_pte(pte, pte_mkyoung(*pte));
- asid = mm->context & 0xff;
- - if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET)
- + if (!pte_dirty(*pte) && !KERNRAM(mmuar))
- set_pte(pte, pte_wrprotect(*pte));
-
- *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
- @@ -201,7 +214,8 @@ int cf_tlb_miss(struct pt_regs *regs, in
- else
- *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA;
-
- - asm ("nop");
- + asm("nop");
- +
- /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK),
- (pte_val(*pte) & PAGE_MASK));*/
- local_irq_restore(flags);
- --- a/arch/m68k/mm/memory.c
- +++ b/arch/m68k/mm/memory.c
- @@ -206,7 +206,9 @@ static inline void pushcl040(unsigned lo
- void cache_clear (unsigned long paddr, int len)
- {
- #ifdef CONFIG_COLDFIRE
- - cf_cache_clear(paddr, len);
- +// JKM -- revise to use proper caching
- +// cf_cache_clear(paddr, len);
- + flush_bcache();
- #else
- if (CPU_IS_040_OR_060) {
- int tmp;
- @@ -257,7 +259,9 @@ EXPORT_SYMBOL(cache_clear);
- void cache_push (unsigned long paddr, int len)
- {
- #ifdef CONFIG_COLDFIRE
- - cf_cache_push(paddr, len);
- +// JKM -- revise to use proper caching
- +// cf_cache_push(paddr, len);
- + flush_bcache();
- #else
- if (CPU_IS_040_OR_060) {
- int tmp = PAGE_SIZE;
- --- a/drivers/net/fec/fec.c
- +++ b/drivers/net/fec/fec.c
- @@ -99,6 +99,9 @@ unsigned char fec_mac_addr_fec0[6] = { 0
- unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 }; // Default address of FEC1
- #endif
-
- +extern unsigned char uboot_enet0[];
- +extern unsigned char uboot_enet1[];
- +
- #ifndef MODULE
- int fec_str_to_mac( char *str_mac, unsigned char* addr);
- int __init fec_mac_setup0 (char *s);
- @@ -175,6 +178,12 @@ printk(KERN_INFO "FEI: index=%d\n", inde
- printk(KERN_INFO "FEI: txdesc=0x%p rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc);
-
- /* mac addr */
- + if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] ||
- + uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) {
- + /* use uboot enet 0 addr */
- + memcpy(fec_mac_addr_fec0, uboot_enet0, 6);
- + }
- +
- fp->fecpriv_mac_addr = fec_mac_addr_fec0;
- }
- else {
- @@ -211,6 +220,11 @@ printk(KERN_INFO "FEI: txdesc=0x%p rxde
- fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1;
-
- /* mac addr */
- + if (uboot_enet1[0] || uboot_enet1[1] || uboot_enet1[2] ||
- + uboot_enet1[3] || uboot_enet1[4] || uboot_enet1[5]) {
- + /* use uboot enet 1 addr */
- + memcpy(fec_mac_addr_fec1, uboot_enet1, 6);
- + }
- fp->fecpriv_mac_addr = fec_mac_addr_fec1;
- #endif
- }
- @@ -762,7 +776,6 @@ int fec_tx(struct sk_buff *skb, struct n
- void *data, *data_aligned;
- int offset;
-
- -printk(KERN_INFO "fec_tx\n");
- data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC);
-
- if (!data)
- @@ -820,7 +833,6 @@ void fec_tx_timeout(struct net_device *d
- struct fec_priv *fp = netdev_priv(dev);
- unsigned long base_addr = (unsigned long) dev->base_addr;
-
- -printk(KERN_INFO "fec_tx_timeout\n");
- spin_lock_irq(&fp->fecpriv_lock);
- MCD_killDma(fp->fecpriv_fec_tx_channel);
- for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
- @@ -941,7 +953,6 @@ void fec_interrupt_fec_tx_handler(struct
- {
- struct fec_priv *fp = netdev_priv(dev);
-
- -printk(KERN_INFO "fectxint\n");
- //Release the socket buffer
- if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
- {
- @@ -977,7 +988,6 @@ void fec_interrupt_fec_rx_handler(struct
- struct fec_priv *fp = netdev_priv(dev);
- struct sk_buff *skb;
-
- -printk(KERN_INFO "fecrxint\n");
- fp->fecpriv_rxflag = 1;
- /*
- // Some buffers can be missed
- @@ -1070,7 +1080,6 @@ irqreturn_t fec_interrupt_handler(int ir
- unsigned long base_addr = (unsigned long) dev->base_addr;
- unsigned long events;
-
- -printk(KERN_INFO "fecerrint\n");
- // Read and clear the events
- events = FEC_EIR(base_addr) & FEC_EIMR(base_addr);
-
- @@ -1157,7 +1166,6 @@ void fec_interrupt_fec_reinit(unsigned l
- struct fec_priv *fp = netdev_priv(dev);
- unsigned long base_addr = (unsigned long) dev->base_addr;
-
- -printk(KERN_INFO "fecreinit\n");
- // Initialize reception descriptors and start DMA for the reception
- for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
- {
- --- a/include/asm-m68k/bootinfo.h
- +++ b/include/asm-m68k/bootinfo.h
- @@ -19,11 +19,59 @@
- ** Redesign of the boot information structure; renamed to bootinfo.h again
- ** 27/11/96 Geert Uytterhoeven:
- ** Backwards compatibility with bootinfo interface version 1.0
- +** 12/03/08 Kurt Mahan
- +** Copy the bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h
- +** into this file. The original author is Wolfgang Denk,
- +** DENX Software Engineering, [email protected].
- */
-
- #ifndef _M68K_BOOTINFO_H
- #define _M68K_BOOTINFO_H
-
- +#ifndef __ASSEMBLY__
- +/*
- + * UBoot Support
- + *
- + * bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h
- + */
- +struct bd_info {
- + unsigned long bi_memstart; /* start of DRAM memory */
- + unsigned long bi_memsize; /* size of DRAM memory in bytes */
- + unsigned long bi_flashstart; /* start of FLASH memory */
- + unsigned long bi_flashsize; /* size of FLASH memory */
- + unsigned long bi_flashoffset; /* reserved area for startup monitor */
- + unsigned long bi_sramstart; /* start of SRAM memory */
- + unsigned long bi_sramsize; /* size of SRAM memory */
- + unsigned long bi_mbar_base; /* base of internal registers */
- + unsigned long bi_bootflags; /* boot / reboot flag (for LynxOS) */
- + unsigned long bi_boot_params; /* where this board expects params */
- + unsigned long bi_ip_addr; /* IP Address */
- + unsigned char bi_enet0addr[6]; /* Ethernet 0 mac address */
- + unsigned short bi_ethspeed; /* Ethernet speed in Mbps */
- + unsigned long bi_intfreq; /* Internal Freq, in MHz */
- + unsigned long bi_busfreq; /* Bus Freq, in MHz */
- +#ifdef UBOOT_PCI
- + unsigned long bi_pcifreq; /* pci Freq in MHz */
- +#endif
- +#ifdef UBOOT_EXTRA_CLOCK
- + unsigned long bi_inpfreq; /* input Freq in MHz */
- + unsigned long bi_vcofreq; /* vco Freq in MHz */
- + unsigned long bi_flbfreq; /* Flexbus Freq in MHz */
- +#endif
- + unsigned long bi_baudrate; /* Console Baudrate */
- + unsigned char bi_enet1addr[6]; /* eth1 mac address */
- + unsigned char bi_enet2addr[6]; /* eth2 mac address */
- + unsigned char bi_enet3addr[6]; /* eth3 mac address */
- +};
- +
- +struct uboot_record {
- + struct bd_info *bdi;
- + unsigned long initrd_start;
- + unsigned long initrd_end;
- + unsigned long cmd_line_start;
- + unsigned long cmd_line_stop;
- +};
- +#endif /* __ASSEMBLY__ */
-
- /*
- * Bootinfo definitions
- @@ -49,17 +97,6 @@ struct bi_record {
- #endif /* __ASSEMBLY__ */
-
-
- -#ifndef __ASSEMBLY__
- -
- -struct uboot_record {
- - unsigned long bd_info;
- - unsigned long initrd_start;
- - unsigned long initrd_end;
- - unsigned long cmd_line_start;
- - unsigned long cmd_line_stop;
- -};
- -
- -#endif /* __ASSEMBLY__ */
-
-
- /*
- --- a/include/asm-m68k/cf_cacheflush.h
- +++ b/include/asm-m68k/cf_cacheflush.h
- @@ -1,335 +1,92 @@
- -/*
- - * include/asm-m68k/cf_cacheflush.h - Coldfire Cache
- - *
- - * Based on include/asm-m68k/cacheflush.h
- - *
- - * Coldfire pieces by:
- - * Kurt Mahan [email protected]
- - *
- - * Copyright Freescale Semiconductor, Inc. 2007
- - *
- - * This program is free software; you can redistribute it and/or modify it
- - * under the terms of the GNU General Public License as published by the
- - * Free Software Foundation; either version 2 of the License, or (at your
- - * option) any later version.
- - */
- #ifndef M68K_CF_CACHEFLUSH_H
- #define M68K_CF_CACHEFLUSH_H
-
- #include <asm/cfcache.h>
- -
- /*
- - * Coldfire Cache Model
- - *
- - * The Coldfire processors use a Harvard architecture cache configured
- - * as four-way set associative. The cache does not implement bus snooping
- - * so cache coherency with other masters must be maintained in software.
- - *
- - * The cache is managed via the CPUSHL instruction in conjunction with
- - * bits set in the CACR (cache control register). Currently the code
- - * uses the CPUSHL enhancement which adds the ability to
- - * invalidate/clear/push a cacheline by physical address. This feature
- - * is designated in the Hardware Configuration Register [D1-CPES].
- - *
- - * CACR Bits:
- - * DPI[28] cpushl invalidate disable for d-cache
- - * IDPI[12] cpushl invalidate disable for i-cache
- - * SPA[14] cpushl search by physical address
- - * IVO[20] cpushl invalidate only
- - *
- - * Random Terminology:
- - * * invalidate = reset the cache line's valid bit
- - * * push = generate a line-sized store of the data if its contents are marked
- - * as modifed (the modified flag is cleared after the store)
- - * * clear = push + invalidate
- - */
- -
- -/**
- - * flush_icache - Flush all of the instruction cache
- - */
- -static inline void flush_icache(void)
- -{
- - asm volatile("nop\n"
- - "moveq%.l #0,%%d0\n"
- - "moveq%.l #0,%%d1\n"
- - "move%.l %%d0,%%a0\n"
- - "1:\n"
- - "cpushl %%ic,(%%a0)\n"
- - "add%.l #0x0010,%%a0\n"
- - "addq%.l #1,%%d1\n"
- - "cmpi%.l %0,%%d1\n"
- - "bne 1b\n"
- - "moveq%.l #0,%%d1\n"
- - "addq%.l #1,%%d0\n"
- - "move%.l %%d0,%%a0\n"
- - "cmpi%.l #4,%%d0\n"
- - "bne 1b\n"
- - : : "i" (CACHE_SETS)
- - : "a0", "d0", "d1");
- -}
- -
- -/**
- - * flush_dcache - Flush all of the data cache
- - */
- -static inline void flush_dcache(void)
- -{
- - asm volatile("nop\n"
- - "moveq%.l #0,%%d0\n"
- - "moveq%.l #0,%%d1\n"
- - "move%.l %%d0,%%a0\n"
- - "1:\n"
- - "cpushl %%dc,(%%a0)\n"
- - "add%.l #0x0010,%%a0\n"
- - "addq%.l #1,%%d1\n"
- - "cmpi%.l %0,%%d1\n"
- - "bne 1b\n"
- - "moveq%.l #0,%%d1\n"
- - "addq%.l #1,%%d0\n"
- - "move%.l %%d0,%%a0\n"
- - "cmpi%.l #4,%%d0\n"
- - "bne 1b\n"
- - : : "i" (CACHE_SETS)
- - : "a0", "d0", "d1");
- -}
- -
- -/**
- - * flush_bcache - Flush all of both caches
- + * Cache handling functions
- */
- -static inline void flush_bcache(void)
- -{
- - asm volatile("nop\n"
- - "moveq%.l #0,%%d0\n"
- - "moveq%.l #0,%%d1\n"
- - "move%.l %%d0,%%a0\n"
- - "1:\n"
- - "cpushl %%bc,(%%a0)\n"
- - "add%.l #0x0010,%%a0\n"
- - "addq%.l #1,%%d1\n"
- - "cmpi%.l %0,%%d1\n"
- - "bne 1b\n"
- - "moveq%.l #0,%%d1\n"
- - "addq%.l #1,%%d0\n"
- - "move%.l %%d0,%%a0\n"
- - "cmpi%.l #4,%%d0\n"
- - "bne 1b\n"
- - : : "i" (CACHE_SETS)
- - : "a0", "d0", "d1");
- -}
-
- -/**
- - * cf_cache_clear - invalidate cache
- - * @paddr: starting physical address
- - * @len: number of bytes
- - *
- - * Invalidate cache lines starting at paddr for len bytes.
- - * Those lines are not pushed.
- - */
- -static inline void cf_cache_clear(unsigned long paddr, int len)
- -{
- - /* number of lines */
- - len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
- - if (len == 0)
- - return;
- -
- - /* align on set boundary */
- - paddr &= 0xfffffff0;
- -
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%a0\n"
- - "move%.l %1,%%d0\n"
- - "1:\n"
- - "cpushl %%bc,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "subq%.l #1,%%d0\n"
- - "bne%.b 1b\n"
- - "movec %2,%%cacr\n"
- - : : "a" (paddr), "r" (len),
- - "r" (shadow_cacr),
- - "i" (CF_CACR_SPA+CF_CACR_IVO)
- - : "a0", "d0");
- -}
- -
- -/**
- - * cf_cache_push - Push dirty cache out with no invalidate
- - * @paddr: starting physical address
- - * @len: number of bytes
- - *
- - * Push the any dirty lines starting at paddr for len bytes.
- - * Those lines are not invalidated.
- - */
- -static inline void cf_cache_push(unsigned long paddr, int len)
- -{
- - /* number of lines */
- - len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
- - if (len == 0)
- - return;
- -
- - /* align on set boundary */
- - paddr &= 0xfffffff0;
- -
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%a0\n"
- - "move%.l %1,%%d0\n"
- - "1:\n"
- - "cpushl %%bc,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "subq%.l #1,%%d0\n"
- - "bne.b 1b\n"
- - "movec %2,%%cacr\n"
- - : : "a" (paddr), "r" (len),
- - "r" (shadow_cacr),
- - "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI)
- - : "a0", "d0");
- -}
- +#define flush_icache() \
- +({ \
- + unsigned long set; \
- + unsigned long start_set; \
- + unsigned long end_set; \
- + \
- + start_set = 0; \
- + end_set = (unsigned long)LAST_DCACHE_ADDR; \
- + \
- + for (set = start_set; set <= end_set; set += (0x10 - 3)) { \
- + asm volatile("cpushl %%ic,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%ic,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%ic,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set)); \
- + } \
- +})
- +
- +#define flush_dcache() \
- +({ \
- + unsigned long set; \
- + unsigned long start_set; \
- + unsigned long end_set; \
- + \
- + start_set = 0; \
- + end_set = (unsigned long)LAST_DCACHE_ADDR; \
- + \
- + for (set = start_set; set <= end_set; set += (0x10 - 3)) { \
- + asm volatile("cpushl %%dc,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%dc,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%dc,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set)); \
- + } \
- +})
- +
- +#define flush_bcache() \
- +({ \
- + unsigned long set; \
- + unsigned long start_set; \
- + unsigned long end_set; \
- + \
- + start_set = 0; \
- + end_set = (unsigned long)LAST_DCACHE_ADDR; \
- + \
- + for (set = start_set; set <= end_set; set += (0x10 - 3)) { \
- + asm volatile("cpushl %%bc,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%bc,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%bc,(%0)\n" \
- + "\taddq%.l #1,%0\n" \
- + "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set)); \
- + } \
- +})
-
- -/**
- - * cf_cache_flush - Push dirty cache out and invalidate
- - * @paddr: starting physical address
- - * @len: number of bytes
- - *
- - * Push the any dirty lines starting at paddr for len bytes and
- - * invalidate those lines.
- +/*
- + * invalidate the cache for the specified memory range.
- + * It starts at the physical address specified for
- + * the given number of bytes.
- */
- -static inline void cf_cache_flush(unsigned long paddr, int len)
- -{
- - /* number of lines */
- - len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
- - if (len == 0)
- - return;
- -
- - /* align on set boundary */
- - paddr &= 0xfffffff0;
- -
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%a0\n"
- - "move%.l %1,%%d0\n"
- - "1:\n"
- - "cpushl %%bc,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "subq%.l #1,%%d0\n"
- - "bne.b 1b\n"
- - "movec %2,%%cacr\n"
- - : : "a" (paddr), "r" (len),
- - "r" (shadow_cacr),
- - "i" (CF_CACR_SPA)
- - : "a0", "d0");
- -}
- -
- -/**
- - * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate
- - * @vstart - starting virtual address
- - * @vend: ending virtual address
- - *
- - * Push the any dirty data/instr lines starting at paddr for len bytes and
- - * invalidate those lines.
- +extern void cache_clear(unsigned long paddr, int len);
- +/*
- + * push any dirty cache in the specified memory range.
- + * It starts at the physical address specified for
- + * the given number of bytes.
- */
- -static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend)
- -{
- - int len;
- -
- - /* align on set boundary */
- - vstart &= 0xfffffff0;
- - vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0;
- - len = vend - vstart;
- - if (len == 0)
- - return;
- - vstart = __pa(vstart);
- - vend = vstart + len;
- -
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%a0\n"
- - "move%.l %1,%%a1\n"
- - "1:\n"
- - "cpushl %%bc,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "cmpa%.l %%a0,%%a1\n"
- - "bne.b 1b\n"
- - "movec %2,%%cacr\n"
- - : /* no return */
- - : "a" (vstart), "a" (vend),
- - "r" (shadow_cacr),
- - "i" (CF_CACR_SPA)
- - : "a0", "a1", "d0");
- -}
- +extern void cache_push(unsigned long paddr, int len);
-
- -/**
- - * cf_dcache_flush_range - Push dirty data cache in range out and invalidate
- - * @vstart - starting virtual address
- - * @vend: ending virtual address
- - *
- - * Push the any dirty data lines starting at paddr for len bytes and
- - * invalidate those lines.
- +/*
- + * push and invalidate pages in the specified user virtual
- + * memory range.
- */
- -static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend)
- -{
- - /* align on set boundary */
- - vstart &= 0xfffffff0;
- - vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
- -
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%a0\n"
- - "move%.l %1,%%a1\n"
- - "1:\n"
- - "cpushl %%dc,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "cmpa%.l %%a0,%%a1\n"
- - "bne.b 1b\n"
- - "movec %2,%%cacr\n"
- - : /* no return */
- - : "a" (__pa(vstart)), "a" (__pa(vend)),
- - "r" (shadow_cacr),
- - "i" (CF_CACR_SPA)
- - : "a0", "a1", "d0");
- -}
- +extern void cache_push_v(unsigned long vaddr, int len);
-
- -/**
- - * cf_icache_flush_range - Push dirty inst cache in range out and invalidate
- - * @vstart - starting virtual address
- - * @vend: ending virtual address
- - *
- - * Push the any dirty instr lines starting at paddr for len bytes and
- - * invalidate those lines. This should just be an invalidate since you
- - * shouldn't be able to have dirty instruction cache.
- - */
- -static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend)
- -{
- - /* align on set boundary */
- - vstart &= 0xfffffff0;
- - vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
- -
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%a0\n"
- - "move%.l %1,%%a1\n"
- - "1:\n"
- - "cpushl %%ic,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "cmpa%.l %%a0,%%a1\n"
- - "bne.b 1b\n"
- - "movec %2,%%cacr\n"
- - : /* no return */
- - : "a" (__pa(vstart)), "a" (__pa(vend)),
- - "r" (shadow_cacr),
- - "i" (CF_CACR_SPA)
- - : "a0", "a1", "d0");
- -}
- +/* This is needed whenever the virtual mapping of the current
- + process changes. */
-
- /**
- * flush_cache_mm - Flush an mm_struct
- @@ -343,6 +100,8 @@ static inline void flush_cache_mm(struct
-
- #define flush_cache_dup_mm(mm) flush_cache_mm(mm)
-
- +#define flush_cache_all() flush_bcache()
- +
- /**
- * flush_cache_range - Flush a cache range
- * @vma: vma struct
- @@ -356,7 +115,8 @@ static inline void flush_cache_range(str
- unsigned long start, unsigned long end)
- {
- if (vma->vm_mm == current->mm)
- - cf_cache_flush_range(start, end);
- + flush_bcache();
- +// cf_cache_flush_range(start, end);
- }
-
- /**
- @@ -372,76 +132,113 @@ static inline void flush_cache_page(stru
- unsigned long vmaddr, unsigned long pfn)
- {
- if (vma->vm_mm == current->mm)
- - cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
- + flush_bcache();
- +// cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
- }
-
- -/**
- - * __flush_page_to_ram - Push a page out of the cache
- - * @vaddr: Virtual address at start of page
- - *
- - * Push the page at kernel virtual address *vaddr* and clear
- - * the icache.
- - */
- -static inline void __flush_page_to_ram(void *vaddr)
- -{
- - asm volatile("nop\n"
- - "move%.l %2,%%d0\n"
- - "or%.l %3,%%d0\n"
- - "movec %%d0,%%cacr\n"
- - "move%.l %0,%%d0\n"
- - "and%.l #0xfffffff0,%%d0\n"
- - "move%.l %%d0,%%a0\n"
- - "move%.l %1,%%d0\n"
- - "1:\n"
- - "cpushl %%bc,(%%a0)\n"
- - "lea 0x10(%%a0),%%a0\n"
- - "subq%.l #1,%%d0\n"
- - "bne.b 1b\n"
- - "movec %2,%%cacr\n"
- - : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE),
- - "r" (shadow_cacr), "i" (CF_CACR_SPA)
- - : "a0", "d0");
- +/* Push the page at kernel virtual address and clear the icache */
- +/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
- +#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
- +extern inline void __flush_page_to_ram(void *address)
- +{
- + unsigned long set;
- + unsigned long start_set;
- + unsigned long end_set;
- + unsigned long addr = (unsigned long) address;
- +
- + addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
- +
- + start_set = addr & _ICACHE_SET_MASK;
- + end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
- +
- + if (start_set > end_set) {
- + /* from the begining to the lowest address */
- + for (set = 0; set <= end_set; set += (0x10 - 3)) {
- + asm volatile("cpushl %%bc,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%bc,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%bc,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
- + }
- + /* next loop will finish the cache ie pass the hole */
- + end_set = LAST_ICACHE_ADDR;
- + }
- + for (set = start_set; set <= end_set; set += (0x10 - 3)) {
- + asm volatile("cpushl %%bc,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%bc,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%bc,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
- + }
- +}
- +
- +/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */
- +#define flush_dcache_page(page) \
- + __flush_page_to_ram((void *) page_address(page))
- +#define flush_icache_page(vma,pg) \
- + __flush_page_to_ram((void *) page_address(pg))
- +#define flush_icache_user_range(adr,len) do { } while (0)
- +/* NL */
- +#define flush_icache_user_page(vma,page,addr,len) do { } while (0)
- +
- +/* Push n pages at kernel virtual address and clear the icache */
- +/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
- +extern inline void flush_icache_range (unsigned long address,
- + unsigned long endaddr)
- +{
- + unsigned long set;
- + unsigned long start_set;
- + unsigned long end_set;
- +
- + start_set = address & _ICACHE_SET_MASK;
- + end_set = endaddr & _ICACHE_SET_MASK;
- +
- + if (start_set > end_set) {
- + /* from the begining to the lowest address */
- + for (set = 0; set <= end_set; set += (0x10 - 3)) {
- + asm volatile("cpushl %%ic,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%ic,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%ic,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
- + }
- + /* next loop will finish the cache ie pass the hole */
- + end_set = LAST_ICACHE_ADDR;
- + }
- + for (set = start_set; set <= end_set; set += (0x10 - 3)) {
- + asm volatile("cpushl %%ic,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%ic,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%ic,(%0)\n"
- + "\taddq%.l #1,%0\n"
- + "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
- + }
- }
-
- -/*
- - * Various defines for the kernel.
- - */
- -
- -extern void cache_clear(unsigned long paddr, int len);
- -extern void cache_push(unsigned long paddr, int len);
- -extern void flush_icache_range(unsigned long address, unsigned long endaddr);
- -
- -#define flush_cache_all() flush_bcache()
- -#define flush_cache_vmap(start, end) flush_bcache()
- -#define flush_cache_vunmap(start, end) flush_bcache()
- -
- -#define flush_dcache_range(vstart, vend) cf_dcache_flush_range(vstart, vend)
- -#define flush_dcache_page(page) __flush_page_to_ram(page_address(page))
- -#define flush_dcache_mmap_lock(mapping) do { } while (0)
- -#define flush_dcache_mmap_unlock(mapping) do { } while (0)
- -
- -#define flush_icache_page(vma, page) __flush_page_to_ram(page_address(page))
- -
- -/**
- - * copy_to_user_page - Copy memory to user page
- - */
- static inline void copy_to_user_page(struct vm_area_struct *vma,
- struct page *page, unsigned long vaddr,
- void *dst, void *src, int len)
- {
- memcpy(dst, src, len);
- - cf_cache_flush(page_to_phys(page), PAGE_SIZE);
- + flush_icache_user_page(vma, page, vaddr, len);
- }
- -
- -/**
- - * copy_from_user_page - Copy memory from user page
- - */
- static inline void copy_from_user_page(struct vm_area_struct *vma,
- struct page *page, unsigned long vaddr,
- void *dst, void *src, int len)
- {
- - cf_cache_flush(page_to_phys(page), PAGE_SIZE);
- memcpy(dst, src, len);
- }
-
- +#define flush_cache_vmap(start, end) flush_cache_all()
- +#define flush_cache_vunmap(start, end) flush_cache_all()
- +#define flush_dcache_mmap_lock(mapping) do { } while (0)
- +#define flush_dcache_mmap_unlock(mapping) do { } while (0)
- +
- #endif /* M68K_CF_CACHEFLUSH_H */
- --- a/include/asm-m68k/cf_pgalloc.h
- +++ b/include/asm-m68k/cf_pgalloc.h
- @@ -1,13 +1,9 @@
- #ifndef M68K_CF_PGALLOC_H
- #define M68K_CF_PGALLOC_H
-
- -/* JKM -- added -- needed? */
- -#include <linux/highmem.h>
- -
- #include <asm/coldfire.h>
- #include <asm/page.h>
- #include <asm/cf_tlbflush.h>
- -/* JKM -- added -- needed? */
- #include <asm/cf_cacheflush.h>
-
- extern inline void pte_free_kernel(pte_t *pte)
- @@ -41,6 +37,7 @@ extern inline pmd_t *pmd_alloc_kernel(pg
-
- #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
- (unsigned long)(page_address(page)))
- +
- #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
-
- static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page)
- --- a/include/asm-m68k/cf_pgtable.h
- +++ b/include/asm-m68k/cf_pgtable.h
- @@ -341,7 +341,7 @@ static inline pte_t pgoff_to_pte(unsigne
- #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
- #define __swp_entry_to_pte(x) (__pte((x).val))
-
- -#define pmd_page(pmd) virt_to_page(__pmd_page(pmd))
- +#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
-
- #define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) + \
- __pte_offset(address))
- --- a/include/asm-m68k/cfcache.h
- +++ b/include/asm-m68k/cfcache.h
- @@ -87,6 +87,12 @@
- #define CACHE_SETS 0x0200 /* 512 sets */
- #define CACHE_WAYS 0x0004 /* 4 way */
-
- +/* in for the old cpushl caching code */
- +#define _DCACHE_SET_MASK ((DCACHE_SIZE/64-1)<<CACHE_WAYS)
- +#define _ICACHE_SET_MASK ((ICACHE_SIZE/64-1)<<CACHE_WAYS)
- +#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
- +#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
- +
- #define CACHE_DISABLE_MODE (CF_CACR_DCINVA+ \
- CF_CACR_BCINVA+ \
- CF_CACR_ICINVA)
- --- a/include/asm-m68k/page.h
- +++ b/include/asm-m68k/page.h
- @@ -123,13 +123,21 @@ extern unsigned long m68k_memoffset;
- #if defined(CONFIG_COLDFIRE)
- static inline unsigned long ___pa(void *vaddr)
- {
- +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
- return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
- +#else
- + return (unsigned long)vaddr;
- +#endif
- }
- #define __pa(vaddr) ___pa((void *)(vaddr))
-
- static inline void *__va(unsigned long paddr)
- {
- +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
- return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
- +#else
- + return (void *)paddr;
- +#endif
- }
-
- #else
- --- a/include/asm-m68k/page_offset.h
- +++ b/include/asm-m68k/page_offset.h
- @@ -1,16 +1,15 @@
- +/*
- + * Page and physical memory maps.
- + */
- +#if defined(CONFIG_SUN3)
- +#define PAGE_OFFSET_RAW 0x0E000000
- +
- +#elif defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)
- +#define PHYS_OFFSET CONFIG_SDRAM_BASE
- +#define PAGE_OFFSET_RAW (PHYS_OFFSET)
- +/* #define PAGE_OFFSET_RAW 0xC0000000 */
-
- -/* This handles the memory map.. */
- -#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
- +#else
- +/* default */
- #define PAGE_OFFSET_RAW 0x00000000
- -#elif defined(CONFIG_SUN3)
- -#define PAGE_OFFSET_RAW 0x0E000000
- -#else /* CONFIG_COLDFIRE */
- -#if defined(CONFIG_M54455)
- -#define PAGE_OFFSET_RAW 0xC0000000
- -#define PHYS_OFFSET 0x40000000
- -#elif defined(CONFIG_M547X_8X)
- -#define PAGE_OFFSET_RAW 0xC0000000
- -#define PHYS_OFFSET 0x00000000
- #endif
- -#endif
- -
|