mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-07 05:13:21 +09:00
![Christophe Leroy](/assets/img/avatar_default.png)
CS Systemes d'Information (CSSI) manufactures 8xx boards for
critical communication systems. Those boards have been
running U-Boot since 2010 and will have to be maintained
until at least 2027.
commit 5b8e76c35e
("powerpc, 8xx: remove support for 8xx") orphaned those boards
by removing support for the mpc8xx CPU.
This commit partially restores support for the 8xx, with the
following limitations:
- Restores support for MPC866 and MPC885 only
- Does not restore IDE, PCMCIA, I2C, USB
- Does not restore examples
- Does not restore POST
- Does not restore Ethernet on SCC
- Does not restore console on SCC
- Does not restore bedbug and kgdb support
As the 866 and 885 do not support the following features,
they are not restored either:
- VIDEO / LCD
- RTC clock
The CPM uCODE patch is not restored either, because:
- 866 and 885 already have support for I2C and SPI relocation
without a uCODE patch
- relocation of SMC, I2C or SPI is only needed for using SCCs
for Ethernet or QMC
The dynamic setup/calculation of clocks is removed, we
expect the target being use with the clock and PLPRCR register
defined in the configuration.
All the clock settings for 8xx prior to 866 is removed as
well as we now only support 866 and 885.
This code is mature and addresses mature boards. Therefore
all code enclosed in '#if 0/#endif' and '#if XX_DEBUG/#endif'
is unneeded.
The following files are not restored by this patch:
- arch/powerpc/cpu/mpc8xx/bedbug_860.c
- arch/powerpc/cpu/mpc8xx/fec.h
- arch/powerpc/cpu/mpc8xx/kgdb.S
- arch/powerpc/cpu/mpc8xx/plprcr_write.S
- arch/powerpc/cpu/mpc8xx/scc.c
- arch/powerpc/cpu/mpc8xx/upatch.c
- arch/powerpc/cpu/mpc8xx/video.c
- arch/powerpc/include/asm/status_led.h
- arch/powerpc/lib/ide.c
- arch/powerpc/lib/ide.h
- doc/README.MPC866
- drivers/pcmcia/mpc8xx_pcmcia.c
- drivers/rtc/mpc8xx.c
- drivers/usb/gadget/mpc8xx_udc.c
- drivers/video/mpc8xx_lcd.c
- examples/standalone/test_burst.c
- examples/standalone/test_burst.h
- examples/standalone/test_burst_lib.S
- examples/standalone/timer.c
- include/mpc823_lcd.h
- include/usb/mpc8xx_udc.h
- post/cpu/mpc8xx/Makefile
- post/cpu/mpc8xx/cache.c
- post/cpu/mpc8xx/cache_8xx.S
- post/cpu/mpc8xx/ether.c
- post/cpu/mpc8xx/spr.c
- post/cpu/mpc8xx/uart.c
- post/cpu/mpc8xx/usb.c
- post/cpu/mpc8xx/watchdog.c
Some of the restored files are not located in a proper location.
In order to keep traceability of the changes, they will be
moved to their correct location and moved to Kconfig in a
followup patch.
This patch also declares CSSI as point of contact for the update
of the 8xx platform, as those boards are the only ones still
being maintained on the 8xx area. A later patch will add
those boards to the tree.
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
113 lines
3.6 KiB
C
113 lines
3.6 KiB
C
/*
|
|
* include/asm-ppc/cache.h
|
|
*/
|
|
#ifndef __ARCH_PPC_CACHE_H
|
|
#define __ARCH_PPC_CACHE_H
|
|
|
|
#include <asm/processor.h>
|
|
|
|
/* bytes per L1 cache line */
|
|
#if defined(CONFIG_8xx)
|
|
#define L1_CACHE_SHIFT 4
|
|
#elif defined(CONFIG_PPC64BRIDGE)
|
|
#define L1_CACHE_SHIFT 7
|
|
#elif defined(CONFIG_E500MC)
|
|
#define L1_CACHE_SHIFT 6
|
|
#else
|
|
#define L1_CACHE_SHIFT 5
|
|
#endif
|
|
|
|
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
|
|
|
/*
|
|
* Use the L1 data cache line size value for the minimum DMA buffer alignment
|
|
* on PowerPC.
|
|
*/
|
|
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES
|
|
|
|
/*
|
|
* For compatibility reasons support the CONFIG_SYS_CACHELINE_SIZE too
|
|
*/
|
|
#ifndef CONFIG_SYS_CACHELINE_SIZE
|
|
#define CONFIG_SYS_CACHELINE_SIZE L1_CACHE_BYTES
|
|
#endif
|
|
|
|
#define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
|
|
#define L1_CACHE_PAGES 8
|
|
|
|
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
|
|
|
#ifdef MODULE
|
|
#define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_BYTES)))
|
|
#else
|
|
#define __cacheline_aligned \
|
|
__attribute__((__aligned__(L1_CACHE_BYTES), \
|
|
__section__(".data.cacheline_aligned")))
|
|
#endif
|
|
|
|
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
|
|
extern void flush_dcache_range(unsigned long start, unsigned long stop);
|
|
extern void clean_dcache_range(unsigned long start, unsigned long stop);
|
|
extern void invalidate_dcache_range(unsigned long start, unsigned long stop);
|
|
extern void flush_dcache(void);
|
|
extern void invalidate_dcache(void);
|
|
extern void invalidate_icache(void);
|
|
#ifdef CONFIG_SYS_INIT_RAM_LOCK
|
|
extern void unlock_ram_in_cache(void);
|
|
#endif /* CONFIG_SYS_INIT_RAM_LOCK */
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
|
|
int l2cache_init(void);
|
|
void enable_cpc(void);
|
|
void disable_cpc_sram(void);
|
|
#endif
|
|
|
|
/* prep registers for L2 */
|
|
#define CACHECRBA 0x80000823 /* Cache configuration register address */
|
|
#define L2CACHE_MASK 0x03 /* Mask for 2 L2 Cache bits */
|
|
#define L2CACHE_512KB 0x00 /* 512KB */
|
|
#define L2CACHE_256KB 0x01 /* 256KB */
|
|
#define L2CACHE_1MB 0x02 /* 1MB */
|
|
#define L2CACHE_NONE 0x03 /* NONE */
|
|
#define L2CACHE_PARITY 0x08 /* Mask for L2 Cache Parity Protected bit */
|
|
|
|
#ifdef CONFIG_8xx
|
|
/* Cache control on the MPC8xx is provided through some additional
|
|
* special purpose registers.
|
|
*/
|
|
#define IC_CST 560 /* Instruction cache control/status */
|
|
#define IC_ADR 561 /* Address needed for some commands */
|
|
#define IC_DAT 562 /* Read-only data register */
|
|
#define DC_CST 568 /* Data cache control/status */
|
|
#define DC_ADR 569 /* Address needed for some commands */
|
|
#define DC_DAT 570 /* Read-only data register */
|
|
|
|
/* Commands. Only the first few are available to the instruction cache.
|
|
*/
|
|
#define IDC_ENABLE 0x02000000 /* Cache enable */
|
|
#define IDC_DISABLE 0x04000000 /* Cache disable */
|
|
#define IDC_LDLCK 0x06000000 /* Load and lock */
|
|
#define IDC_UNLINE 0x08000000 /* Unlock line */
|
|
#define IDC_UNALL 0x0a000000 /* Unlock all */
|
|
#define IDC_INVALL 0x0c000000 /* Invalidate all */
|
|
|
|
#define DC_FLINE 0x0e000000 /* Flush data cache line */
|
|
#define DC_SFWT 0x01000000 /* Set forced writethrough mode */
|
|
#define DC_CFWT 0x03000000 /* Clear forced writethrough mode */
|
|
#define DC_SLES 0x05000000 /* Set little endian swap mode */
|
|
#define DC_CLES 0x07000000 /* Clear little endian swap mode */
|
|
|
|
/* Status.
|
|
*/
|
|
#define IDC_ENABLED 0x80000000 /* Cache is enabled */
|
|
#define IDC_CERR1 0x00200000 /* Cache error 1 */
|
|
#define IDC_CERR2 0x00100000 /* Cache error 2 */
|
|
#define IDC_CERR3 0x00080000 /* Cache error 3 */
|
|
|
|
#define DC_DFWT 0x40000000 /* Data cache is forced write through */
|
|
#define DC_LES 0x20000000 /* Caches are little endian mode */
|
|
#endif /* CONFIG_8xx */
|
|
|
|
#endif
|