From: Kuo-Jung Su <dant...@faraday-tech.com> These patches introduce Faraday A369 SoC platform support.
Here are some public documents for your reference. http://www.faraday-tech.com/html/documentation/index.html The partial version of faraday cpu datasheet with only the CP15 and MPU description are available at my Google Drive: https://docs.google.com/folder/d/0BwfiewvSmUgAalh5TkxyZWtlWEE/edit?usp=sharing The pre-built A369 images are also available at my Google Drive: https://docs.google.com/folder/d/0BwfiewvSmUgAX2pTTmtUMGFCZW8/edit Here is the image file list: 1. android-4.0.4/zImage: A369 linux-3.0.31 2. android-4.0.4/romfs-4.0.4.tar.bz2: android-4.0.4 3. nand.img.bz2: A369 nand flash image 4. rom.img.bz2: A369 embedded ROM image 5. u-boot: A369 u-boot-2012.10 ELF file 6. zImage: A369 linux-3.4.12 + initramfs 7. README If you want to re-build the image from scratch, try my Faraday Linux BSP/SDK: falinux. 1. Download the falinux $ git clone https://github.com/dantesu1218/falinux.git 2. Download all the required software packages: $ cd falinux $ make setup 3. Launch the menuconfig of falinux, and enable 'QEMU Support' $ make menuconfig 4. Re-build the packages $ make 5. Laungh the qemu-1.3.0 with the generated falinux images. $ make qemu Changes for v6 -> v7: 1. hw/arm/ftwdt010: Replace 'qemu_system_reset_request()' with 'watchdog_perform_action()'. 2. hw/arm/ftrtc011: Replace 'get_clock_realtime()' with 'qemu_get_clock_ns(rtc_clock)'. Replace 'qemu_new_timer_ms(rt_clock...)' with 'qemu_new_timer_ms(rtc_clock...)' Rename 'ftrtc011_timer_resync' -> 'ftrtc011_timer_rebase' Add ftrtc011_timer_resche() Add QTest support 3. hw/arm/faraday_a369_soc: Remove redundant device reset from a369soc_system_reset(...) 4. include/qemu/bitops.h: Update bitrev8() to use a kind of divide and conquer algorithm. 5. hw/arm/ftahb020,ftddrii030,ftapbbrg020,faraday_a369_soc: Drop FARADAY_SOC_GET_CORE(), replaced with device to device QOM link. 6. hw/wm8731,wm8750,marvell_88w8618_audio,spitz,z2: Add AudioCodecClass for wm87xx audio class abstration. 7. hw/arm/ftnandc021: Drop nand_init(), replaced with device to device QOM link. 8. hw/arm/ftsdc010: Bug fixed to write operation: remove sd_data_ready() in write path. 9. hw/arm/ftgmac100,ftmac110,ftwdt010: rt-clock -> vm_clock 10. hw/nand.c: Drop [hw/nand.c: correct the sense of the BUSY/READY], since it's already applied. Drop [hw/nand.c: bug fix to erase operation], since Peter has a better solution. Changes for v5 -> v6: 1. hw/arm/Makefile.objs: Shift to the next line only after current line length is > 80 characters. 2. hw/arm/faraday.h: Update debug macro format per discussions at the link bellow: http://thread.gmane.org/gmane.comp.emulators.qemu/195996/focus=196975 3. hw/arm/faraday.h: TYPE_FARADAY_SOC: 'faraday/soc' -> 'faraday.soc' 4. hw/arm/*.c: Replace '%llx' with '%HWADDR_PRIx' 5. hw/arm/*.h: Add '#include "qemu/bitops.h"' 6. hw/arm/faraday_a369_soc.c: Typo fix: salve4 -> slave4, salve6 -> slave6 7. hw/arm/*.c: Drop FROM_SYSBUS(). 8. hw/arm/ftintc020.c: Re-write the source file with pl190.c as template. 9. hw/arm/ftintc020.h: Rename the registers to improve readibility. 10. hw/arm/faraday.h: Add dedicated spi flash pointer array (DeviceState *spi_fl[2]). 11. hw/arm/faraday.h: Add 'qemu_irq pic[64]'. 12. hw/arm/*c: Replace the complex conversion in XXX_REG32() with directly array indexing. 13. hw/arm/*c: Update the error message output from 'hw_error(...)' into 'fprintf(stderr, ...)' 14. hw/arm/faraday_a369.c, hw/arm/faraday_a369_soc.c: Move the external AHB device init from faraday_a369_soc.c to faraday_a369.c 15. include/qemu/bitops.h: Move bitrev() from bitrev.[ch] into bitops.h 16. hw/nand.c: Remove the clear/set SR[6] code in read/erase/write, because it's not possible to be observed by a guest. 17. hw/arm/faraday_a369_kpd.c: Function prefix: 'ftkbc010' -> 'a369kpd' Name of struct: 'FTKBC010State' -> 'A369KPDState'. QOM: 'FTKBC010' -> 'A369KPD' 18. hw/arm/ftddrii030.c: 'case REG_MCR ... 0x4c' -> 'case REG_MCR ... (CFG_REGSIZE - 1) * 4' 19. hw/arm/ftahbc020.c: Add comments to fall-through path. (i.e. /* fall-through - skip slave6 */) 20. hw/arm/faraday_a369.c: Update spi flash init code to use the new QOM classes of m25p80. Changes for v3 -> v5: 1. [cpu] Add the unapplied patches for faraday ARMv5TE cores. 2. [nand] Add the unapplied patches for hw/nand.c. 3. [audio] Add the unapplied patches for wm8731. 4. [Global] Replace redundant statement in xxx_update_irq() with qemu_set_irq(s->irq, !!(xxxx)); 5. [Global] Introduce 'case xxx ... xxx' statement in switch { } to replace the 'if {} else {}' statement. 6. [Global] Replace complex bitwise operation with functions defined in bitops.h 7. [Global] Introduce array register caches (i.e. s->regs[]) implementation to fttsc010, ftrtc011, ftmac110, ftgmac100, ftddrii030 faraday_a369_kpd and faraday_a369_soc. 8. [Global] Add qemu_log_mask(LOG_GUEST_ERROR...) on undefined memory accesses. 9. [Global] Add missing register access size constraint to faraday_a369_kpd, faraday_a369_soc, ftahbc020.c, ftddrii030.c, ftintc020.c, ftlcdc200.c, ftpwmtmr010.c, ftspi020.c, fttmr010.c and fttsc010.c. 10. [Global] Add more register and bitmask descriptions to all the chips. 11. [Global] Rename all the MemoryRegionOps variables to 'mmio_ops' 12. [Global] Update all non-system header includes from '<>' into '""' 13. [bitrev] Port bitrev.[ch] from linux kernel into QEMU. 14. [ftapbbrg020] Replace cpu_physical_memory_read()/cpu_physical_memory_write() with dma_memory_read()/dma_memory_write() 15. [ftdmac020] Replace cpu_physical_memory_read()/cpu_physical_memory_write() with dma_memory_read()/dma_memory_write() 16. [ftgmac100/ftmac110] Replace cpu_physical_memory_read()/cpu_physical_memory_write() with dma_memory_read()/dma_memory_write() 17. [ftgmac100/ftmac110] Add a 10ms timer for polling the owner bit of descriptors to call qemu_flush_queued_packets() when it's necessary. 18. [ftgmac100/ftmac110] Replace hw_error() with qemu_log_mask(LOG_GUEST_ERROR, ) for programmer errors. 19. [ftgmac100/ftmac110] Update descriptor struct for big endian QEMU host support. 20. [ftgmac100/ftmac110] Typo fix ('FTMAC_H' --> 'HW_ARM_FTMAC110_H') to the header files. 21. [ftmac110] Update mdio phy response emulation from Marvell into Davicom PHY. 22. [ftwdt010/fttsc010] Switch to a slower timer. (i.e. rt_clock) 23. [faraday_a360] Removed. The ftmac110 and fttmr010 has been moved to A369 as external AHB devices. 24. [faraday_a369] Add register caches for AHB/APB slave devices. 25. [faraday_a369] Remember (arm_boot_info *) when launching in direct boot mode. 26. [faraday_a369] Replace pointer to (mach *) with QOM APIs. (i.e. no more DEFINE_PROP_PTR()) 27. [faraday_a369] Add a error message for ROM mode when it failed to load image. 28. [faraday_a369] Add the missing AHB remap process into direct boot mode. 29. [faraday_a369] Bug fix to ROM and RAM memory overlap issue. 30. [faraday_a369] Remove system reset order dependency from ftddrii030 and ftahbc020 31. [faraday_a369] Separate the a369 platform implementation into 2 different parts: board=faraday_a369.c, and soc=faraday_a369_soc.c 32. [faraday_a369] Copy all the un-used register values from read hardware into QEMU model. 33. [ftssp010] Add address alignment checker. 34. [ftssp010] Move the audio codec initialization code to faraday_a369.c. 35. [ftspi020] Use a constant (CFG_NR_CSLINES) for the number of cs lines. 36. [ftspi020] Replace 's->datacnt <= 0' with '!s->datacnt', because s->datacnt is unsigned. 37. [ftspi020] Replace 's->datacnt' with 's->cmd[2]' 38. [ftspi020] Remove redundant M25P80s command opcodes from the header file. 39. [ftspi020] Replace 'g_new' with 'g_new0' for cs_lines allocation. This fix the bug which crash the QEMU when de-activating an unattached spi flash chip select. Thanks to Peter. Changes for v3: 1. [global] review all commit log make sure it correctly describe the QEMU model. 2. [global] reformat the entire patch series to be compilable on its own. Thanks to Andreas and Igor. 3. [global] move all files from 'hw' into 'hw/arm', and rename a36x.c to faraday_a36x.c 4. [global] update lisence to GPLv2+ 5. [global] rename both struct and typedef names to CamelCase. 6. [global] turn printfs into DPRINTF() which is controlled by 'DEBUG_FARADAY' 7. [global] remove disabled code. 8. [global] add header files with descriptive defines to ftintc020, ftrtc011, fttmr010 ... etc. 9. [global] update all header file to have a 'HW_ARM_' prefix to header guards. 10. [faraday.h] add parameter names to ftmac110_init() and ftgmac100_init() 11. [a360/a369] remove printf("xxx %dMB ram.\n"...); 12. [a360/a369] add 'arm926' as a fail-safe cpu model. 13. [a360/a369] add DEFAULT_MACHINE_OPTIONS. 14. [a360/a369] remove USB-EHCI support, it's now a standalone patch. 15. [a360] replace ftlcdc200 init from sysbus_create_varargs() to sysbus_create_simple(). 16. [a360] make PMU a standalone file. (faraday_a360_pmu.c) 17. [a369] make SCU a standalone file. (faraday_a369_pcu.c) 18. [a369] make AHBC a standalone file. (ftahbc020.c) 19. [a369] make DDRC a standalone file. (ftddrii030.c) 20. [a369] rename ftkbc010 to faraday_a369_keypad.c 21. [a369] replace ROM emulation with PFLASH.(rom.c is deleted) 22. [ftsdc010] add sd_data_ready() to data R/W. 23. [ftsdc010] check 'datacnt' at each read/write to make sure buffer would not overflow/underflow and also prevent 'datacnt' from underflow by subtracted by a 4. 24. [ftgmac100] add 802.1Q VLAN tag insertion/removal support. 25. [ftgmac100] replace the dumb timer code with bottom half. 26. [ftgmac100] rename the struct name of descriptors to CamelCase. 27. [ftgmac100] replace 'void *' with 'Ftgmac100RXD *' and 'Ftgmac100TXD *' for descriptor read/write. 28. [ftgmac100] add buffer overflow check in ftgmac100_transmit() 29. [ftgmac100] add buffer alignment check 30. [ftmac110] replace the dumb timer code with bottom half. 31. [ftmac110] rename the struct name of descriptors to CamelCase. 32. [ftmac110] replace 'void *' with 'Ftmac110RXD *' and 'Ftmac110TXD *' for descriptor read/write. 33. [ftmac110] add buffer overflow check in ftmac110_transmit() 34. [ftmac110] add buffer alignment check 35. [ftdmac020] replace the dumb timer code with bottom half. 36. [ftdmac020] replace cpu_physical_memory_map() with cpu_physical_memory_read/write() for both simplicity and security enhancement which caused by the un-checked return mapped length from cpu_physical_memory_map(). 37. [ftapbbrg020] replace the dumb timer code with bottom half. 38. [ftapbbrg020] replace cpu_physical_memory_map() with cpu_physical_memory_read/write() for both simplicity and security enhancement which caused by the un-checked return mapped length from cpu_physical_memory_map(). 39. [ftrtc011] switch to a slower timer with msec resolution. (i.e. rt_clock) 40. [ftrtc011] re-calculate RTC counters from host timestamp upon register read/write and also vm save/restore. Changes for v2: 1. coding style fixes (verified with checkpatch.pl) 2. add Faraday A360 support 3. add Faraday USB 2.0 EHCI support 4. merge a369_scu.c into a369.c 5. introduce QOM coding style 6. remove lowercase Macros: min(), max() 7. name all struct as CamelCase style 8. move function prototypes from .c to faraday.h 9. use switch instead of if statement in a369_ahbc_write 10. remove debug prints 11. update all uarts in A36x to DEVICE_LITTLE_ENDIAN. 12. move the variable definitions to the start of the function, instead of inside a do { } while(0) 13. remove disabled and commented out code. 14. use hw_error() and exit() upon pflash register failed. 15. add const prior to TypeInfo (i.e. static *const* TypeInfo ftrtc011_info) 16. add le32_to_cpu/cpu_to_le32 to the descriptor processing in FTGMAC100/FTMAC110. 17. update the GPL license to GPL v2 (except for FTLCDC200, it's based on pl110.c which is LGPL.) 18. add const to src_* in the DMA controllers (FTAPBBRG020/FTDMAC020) Kuo-Jung Su (24): target-arm: add Faraday ARMv5TE processors support hw/arm: add Faraday a369 SoC platform support hw/arm: add FTINTC020 interrupt controller support hw/arm: add FTAHBC020 AHB controller support hw/arm: add FTDDRII030 DDRII controller support hw/arm: add FTPWMTMR010 timer support hw/arm: add FTWDT010 watchdog timer support hw/arm: add FTRTC011 RTC timer support tests: add QTest for FTRTC011 hw/arm: add FTDMAC020 AHB DMA support hw/arm: add FTAPBBRG020 APB DMA support hw/arm: add FTNANDC021 nand flash controller support hw/arm: add FTI2C010 I2C controller support hw: Add AudioCodecClass for wm87xx audio class abstration. hw: add WM8731 audio codec support hw/arm: add FTSSP010 multi-function controller support qemu/bitops.h: add the bit ordering reversal functions hw/arm: add FTGMAC100 1Gbps ethernet support hw/arm: add FTLCDC200 LCD controller support hw/arm: add FTTSC010 touchscreen controller support hw/arm: add FTSDC010 MMC/SD controller support hw/arm: add FTMAC110 10/100Mbps ethernet support hw/arm: add FTTMR010 timer support hw/arm: add FTSPI020 SPI flash controller support default-configs/arm-softmmu.mak | 1 + hw/Makefile.objs | 2 + hw/arm/Makefile.objs | 21 ++ hw/arm/faraday.h | 68 ++++ hw/arm/faraday_a369.c | 174 ++++++++++ hw/arm/faraday_a369_kpd.c | 235 +++++++++++++ hw/arm/faraday_a369_scu.c | 186 +++++++++++ hw/arm/faraday_a369_soc.c | 345 +++++++++++++++++++ hw/arm/ftahbc020.c | 209 ++++++++++++ hw/arm/ftapbbrg020.c | 475 ++++++++++++++++++++++++++ hw/arm/ftapbbrg020.h | 44 +++ hw/arm/ftddrii030.c | 190 +++++++++++ hw/arm/ftdmac020.c | 599 +++++++++++++++++++++++++++++++++ hw/arm/ftdmac020.h | 107 ++++++ hw/arm/ftgmac100.c | 696 +++++++++++++++++++++++++++++++++++++++ hw/arm/ftgmac100.h | 239 ++++++++++++++ hw/arm/fti2c010.c | 216 ++++++++++++ hw/arm/fti2c010.h | 71 ++++ hw/arm/ftintc020.c | 306 +++++++++++++++++ hw/arm/ftintc020.h | 57 ++++ hw/arm/ftkbc010.h | 44 +++ hw/arm/ftlcdc200.c | 513 +++++++++++++++++++++++++++++ hw/arm/ftlcdc200.h | 112 +++++++ hw/arm/ftlcdc200_template.h | 439 ++++++++++++++++++++++++ hw/arm/ftmac110.c | 649 ++++++++++++++++++++++++++++++++++++ hw/arm/ftmac110.h | 168 ++++++++++ hw/arm/ftnandc021.c | 523 +++++++++++++++++++++++++++++ hw/arm/ftnandc021.h | 84 +++++ hw/arm/ftpwmtmr010.c | 264 +++++++++++++++ hw/arm/ftpwmtmr010.h | 31 ++ hw/arm/ftrtc011.c | 392 ++++++++++++++++++++++ hw/arm/ftrtc011.h | 53 +++ hw/arm/ftsdc010.c | 358 ++++++++++++++++++++ hw/arm/ftsdc010.h | 90 +++++ hw/arm/ftspi020.c | 340 +++++++++++++++++++ hw/arm/ftspi020.h | 81 +++++ hw/arm/ftssp010.c | 501 ++++++++++++++++++++++++++++ hw/arm/ftssp010.h | 98 ++++++ hw/arm/fttmr010.c | 451 +++++++++++++++++++++++++ hw/arm/fttmr010.h | 41 +++ hw/arm/fttsc010.c | 264 +++++++++++++++ hw/arm/fttsc010.h | 39 +++ hw/arm/ftwdt010.c | 213 ++++++++++++ hw/arm/ftwdt010.h | 35 ++ hw/arm/spitz.c | 9 +- hw/arm/z2.c | 9 +- hw/audio_codec.c | 81 +++++ hw/audio_codec.h | 56 ++++ hw/i2c.h | 9 - hw/marvell_88w8618_audio.c | 23 +- hw/wm8731.c | 505 ++++++++++++++++++++++++++++ hw/wm8750.c | 91 ++--- include/qemu/bitops.h | 59 +++- target-arm/cpu.c | 52 +++ target-arm/cpu.h | 6 +- target-arm/helper.c | 84 +++++ target-arm/machine.c | 4 + tests/Makefile | 3 + tests/ftrtc011-test.c | 410 +++++++++++++++++++++++ 59 files changed, 11355 insertions(+), 70 deletions(-) create mode 100644 hw/arm/faraday.h create mode 100644 hw/arm/faraday_a369.c create mode 100644 hw/arm/faraday_a369_kpd.c create mode 100644 hw/arm/faraday_a369_scu.c create mode 100644 hw/arm/faraday_a369_soc.c create mode 100644 hw/arm/ftahbc020.c create mode 100644 hw/arm/ftapbbrg020.c create mode 100644 hw/arm/ftapbbrg020.h create mode 100644 hw/arm/ftddrii030.c create mode 100644 hw/arm/ftdmac020.c create mode 100644 hw/arm/ftdmac020.h create mode 100644 hw/arm/ftgmac100.c create mode 100644 hw/arm/ftgmac100.h create mode 100644 hw/arm/fti2c010.c create mode 100644 hw/arm/fti2c010.h create mode 100644 hw/arm/ftintc020.c create mode 100644 hw/arm/ftintc020.h create mode 100644 hw/arm/ftkbc010.h create mode 100644 hw/arm/ftlcdc200.c create mode 100644 hw/arm/ftlcdc200.h create mode 100644 hw/arm/ftlcdc200_template.h create mode 100644 hw/arm/ftmac110.c create mode 100644 hw/arm/ftmac110.h create mode 100644 hw/arm/ftnandc021.c create mode 100644 hw/arm/ftnandc021.h create mode 100644 hw/arm/ftpwmtmr010.c create mode 100644 hw/arm/ftpwmtmr010.h create mode 100644 hw/arm/ftrtc011.c create mode 100644 hw/arm/ftrtc011.h create mode 100644 hw/arm/ftsdc010.c create mode 100644 hw/arm/ftsdc010.h create mode 100644 hw/arm/ftspi020.c create mode 100644 hw/arm/ftspi020.h create mode 100644 hw/arm/ftssp010.c create mode 100644 hw/arm/ftssp010.h create mode 100644 hw/arm/fttmr010.c create mode 100644 hw/arm/fttmr010.h create mode 100644 hw/arm/fttsc010.c create mode 100644 hw/arm/fttsc010.h create mode 100644 hw/arm/ftwdt010.c create mode 100644 hw/arm/ftwdt010.h create mode 100644 hw/audio_codec.c create mode 100644 hw/audio_codec.h create mode 100644 hw/wm8731.c create mode 100644 tests/ftrtc011-test.c -- 1.7.9.5