diff mbox

[U-Boot,RFC,v2,4/6] x86: Add basic Intel Quark processor support

Message ID 1422523121-7758-5-git-send-email-bmeng.cn@gmail.com
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Bin Meng Jan. 29, 2015, 9:18 a.m. UTC
Add minimum codes to support Intel Quark SoC. DRAM initialization
is not ready yet so a hardcoded gd->ram_size is assigned.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>

---

Changes in v2:
- Use machine-specific
- Move vairous components' base addresses within Quark SoC to Kconfig
- Rebase to u-boot-86/master

 arch/x86/cpu/quark/Kconfig             | 118 +++++++++++++++++++++++++++++++++
 arch/x86/cpu/quark/Makefile            |   8 +++
 arch/x86/cpu/quark/dram.c              |  39 +++++++++++
 arch/x86/cpu/quark/pci.c               |  70 +++++++++++++++++++
 arch/x86/cpu/quark/quark.c             |  44 ++++++++++++
 arch/x86/include/asm/arch-quark/gpio.h |  13 ++++
 6 files changed, 292 insertions(+)
 create mode 100644 arch/x86/cpu/quark/Kconfig
 create mode 100644 arch/x86/cpu/quark/Makefile
 create mode 100644 arch/x86/cpu/quark/dram.c
 create mode 100644 arch/x86/cpu/quark/pci.c
 create mode 100644 arch/x86/cpu/quark/quark.c
 create mode 100644 arch/x86/include/asm/arch-quark/gpio.h

Comments

Simon Glass Feb. 1, 2015, 4:30 p.m. UTC | #1
Hi Bin,

On 29 January 2015 at 02:18, Bin Meng <bmeng.cn@gmail.com> wrote:
> Add minimum codes to support Intel Quark SoC. DRAM initialization
> is not ready yet so a hardcoded gd->ram_size is assigned.
>
> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>
> ---
>
> Changes in v2:
> - Use machine-specific
> - Move vairous components' base addresses within Quark SoC to Kconfig
> - Rebase to u-boot-86/master
>

All looks OK but for a few nits.

>  arch/x86/cpu/quark/Kconfig             | 118 +++++++++++++++++++++++++++++++++
>  arch/x86/cpu/quark/Makefile            |   8 +++
>  arch/x86/cpu/quark/dram.c              |  39 +++++++++++
>  arch/x86/cpu/quark/pci.c               |  70 +++++++++++++++++++
>  arch/x86/cpu/quark/quark.c             |  44 ++++++++++++
>  arch/x86/include/asm/arch-quark/gpio.h |  13 ++++
>  6 files changed, 292 insertions(+)
>  create mode 100644 arch/x86/cpu/quark/Kconfig
>  create mode 100644 arch/x86/cpu/quark/Makefile
>  create mode 100644 arch/x86/cpu/quark/dram.c
>  create mode 100644 arch/x86/cpu/quark/pci.c
>  create mode 100644 arch/x86/cpu/quark/quark.c
>  create mode 100644 arch/x86/include/asm/arch-quark/gpio.h
>
> diff --git a/arch/x86/cpu/quark/Kconfig b/arch/x86/cpu/quark/Kconfig
> new file mode 100644
> index 0000000..8bccf09
> --- /dev/null
> +++ b/arch/x86/cpu/quark/Kconfig
> @@ -0,0 +1,118 @@
> +#
> +# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +config INTEL_QUARK
> +       bool
> +       select HAVE_RMU
> +
> +if INTEL_QUARK
> +
> +config HAVE_RMU
> +       bool "Add a Remote Management Unit (RMU) binary"
> +       help
> +         Select this option to add a Remote Management Unit (RMU) binary
> +         to the resulting U-Boot image. It is a data block (up to 64K) of
> +         machine-specific code which must be put in the flash for the RMU
> +         within the Quark SoC processor to access when powered up before
> +         system BIOS is executed.
> +
> +config RMU_FILE
> +       string "Remote Management Unit (RMU) binary filename"
> +       depends on HAVE_RMU
> +       default "rmu.bin"
> +       help
> +         The filename of the file to use as Remote Management Unit (RMU)
> +         binary in the board directory.
> +
> +config RMU_ADDR
> +       hex "Remote Management Unit (RMU) binary location"
> +       depends on HAVE_RMU
> +       default 0xfff00000
> +       help
> +         The location of the RMU binary is determined by a strap. It must be
> +         put in flash at a location matching the strap-determined base address.
> +
> +         The default base address of 0xfff00000 indicates that the binary must
> +         be located at offset 0 from the beginning of a 1MB flash device.
> +
> +config HAVE_CMC
> +       bool
> +       default HAVE_RMU
> +
> +config CMC_FILE
> +       string
> +       depends on HAVE_CMC
> +       default RMU_FILE
> +
> +config CMC_ADDR
> +       hex
> +       depends on HAVE_CMC
> +       default RMU_ADDR
> +
> +config ESRAM_BASE
> +       hex
> +       default 0x80000000
> +       help
> +         Embedded SRAM (eSRAM) memory-mapped base address.
> +
> +config PCIE_ECAM_BASE
> +       hex
> +       default 0xe0000000
> +
> +config RCBA_BASE
> +       hex
> +       default 0xfed1c000
> +       help
> +         Root Complex register block memory-mapped base address.
> +
> +config ACPI_PM1_BASE
> +       hex
> +       default 0x1000
> +       help
> +         ACPI PM1 i/o-mapped base address.

What is PM1?

> +
> +config ACPI_P_BASE
> +       hex
> +       default 0x1010
> +       help
> +         ACPI PBLK i/o-mapped base address.

What is PBLK?

> +
> +config SPI_DMA_BASE
> +       hex
> +       default 0x1020
> +       help
> +         SPI DMA i/o-mapped base address.
> +
> +config GPIO_BASE
> +       hex
> +       default 0x1080
> +       help
> +         GPIO i/o-mapped base address.
> +
> +config GPE0_BASE
> +       hex
> +       default 0x1100
> +       help
> +         GPE0 i/o-mapped base address.

What is GPE0?

> +
> +config WDT_BASE
> +       hex
> +       default 0x1140
> +       help
> +         Watchdog timer i/o-mapped base address.
> +
> +config SYS_CAR_ADDR
> +       hex
> +       default ESRAM_BASE
> +
> +config SYS_CAR_SIZE
> +       hex
> +       default 0x8000
> +       help
> +         Space in bytes in eSRAM used as Cache-As-ARM (CAR).
> +         Note this size must not exceed eSRAM's total size.
> +
> +endif
> diff --git a/arch/x86/cpu/quark/Makefile b/arch/x86/cpu/quark/Makefile
> new file mode 100644
> index 0000000..168c1e6
> --- /dev/null
> +++ b/arch/x86/cpu/quark/Makefile
> @@ -0,0 +1,8 @@
> +#
> +# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
> +#
> +# SPDX-License-Identifier:     GPL-2.0+
> +#
> +
> +obj-y += car.o dram.o msg_port.o quark.o
> +obj-$(CONFIG_PCI) += pci.o
> diff --git a/arch/x86/cpu/quark/dram.c b/arch/x86/cpu/quark/dram.c
> new file mode 100644
> index 0000000..fbdc3cd
> --- /dev/null
> +++ b/arch/x86/cpu/quark/dram.c
> @@ -0,0 +1,39 @@
> +/*
> + * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/post.h>
> +#include <asm/arch/quark.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int dram_init(void)
> +{
> +       /* hardcode the DRAM size for now */
> +       gd->ram_size = DRAM_MAX_SIZE;
> +       post_code(POST_DRAM);
> +
> +       return 0;
> +}
> +
> +void dram_init_banksize(void)
> +{
> +       gd->bd->bi_dram[0].start = 0;
> +       gd->bd->bi_dram[0].size = gd->ram_size;
> +}
> +
> +/*
> + * This function looks for the highest region of memory lower than 4GB which
> + * has enough space for U-Boot where U-Boot is aligned on a page boundary.
> + * It overrides the default implementation found elsewhere which simply
> + * picks the end of ram, wherever that may be. The location of the stack,
> + * the relocation address, and how far U-Boot is moved by relocation are
> + * set in the global data structure.

This comment probably doesn't make sense here.

> + */
> +ulong board_get_usable_ram_top(ulong total_size)
> +{
> +       return gd->ram_size;
> +}
> diff --git a/arch/x86/cpu/quark/pci.c b/arch/x86/cpu/quark/pci.c
> new file mode 100644
> index 0000000..354e15a
> --- /dev/null
> +++ b/arch/x86/cpu/quark/pci.c
> @@ -0,0 +1,70 @@
> +/*
> + * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <pci.h>
> +#include <asm/pci.h>
> +#include <asm/arch/device.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +void board_pci_setup_hose(struct pci_controller *hose)
> +{
> +       hose->first_busno = 0;
> +       hose->last_busno = 0;
> +
> +       /* PCI memory space */
> +       pci_set_region(hose->regions + 0,
> +                      CONFIG_PCI_MEM_BUS,
> +                      CONFIG_PCI_MEM_PHYS,
> +                      CONFIG_PCI_MEM_SIZE,
> +                      PCI_REGION_MEM);
> +
> +       /* PCI IO space */
> +       pci_set_region(hose->regions + 1,
> +                      CONFIG_PCI_IO_BUS,
> +                      CONFIG_PCI_IO_PHYS,
> +                      CONFIG_PCI_IO_SIZE,
> +                      PCI_REGION_IO);
> +
> +       pci_set_region(hose->regions + 2,
> +                      CONFIG_PCI_PREF_BUS,
> +                      CONFIG_PCI_PREF_PHYS,
> +                      CONFIG_PCI_PREF_SIZE,
> +                      PCI_REGION_PREFETCH);
> +
> +       pci_set_region(hose->regions + 3,
> +                      0,
> +                      0,
> +                      gd->ram_size,
> +                      PCI_REGION_MEM | PCI_REGION_SYS_MEMORY);
> +
> +       hose->region_count = 4;
> +}
> +
> +int board_pci_post_scan(struct pci_controller *hose)
> +{
> +       return 0;
> +}
> +
> +int pci_skip_dev(struct pci_controller *hose, pci_dev_t dev)
> +{
> +       /*
> +        * TODO:
> +        *
> +        * For some unknown reason, the PCI enumeration process hangs
> +        * when it scans to the PCIe root port 0 (D23:F0) & 1 (D23:F1).
> +        *
> +        * For now we just skip these two devices, and this needs to
> +        * be revisited later.
> +        */
> +       if (dev == QUARK_HOST_BRIDGE ||
> +           dev == QUARK_PCIE0 || dev == QUARK_PCIE1) {
> +               return 1;
> +       }
> +
> +       return 0;
> +}
> diff --git a/arch/x86/cpu/quark/quark.c b/arch/x86/cpu/quark/quark.c
> new file mode 100644
> index 0000000..47ba152
> --- /dev/null
> +++ b/arch/x86/cpu/quark/quark.c
> @@ -0,0 +1,44 @@
> +/*
> + * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/pci.h>
> +#include <asm/post.h>
> +#include <asm/processor.h>
> +
> +int arch_cpu_init(void)
> +{
> +       struct pci_controller *hose;
> +       int ret;
> +
> +       post_code(POST_CPU_INIT);
> +#ifdef CONFIG_SYS_X86_TSC_TIMER
> +       timer_set_base(rdtsc());
> +#endif
> +
> +       ret = x86_cpu_init_f();
> +       if (ret)
> +               return ret;
> +
> +       ret = pci_early_init_hose(&hose);
> +       if (ret)
> +               return ret;
> +
> +       return 0;
> +}
> +
> +int print_cpuinfo(void)
> +{
> +       post_code(POST_CPU_INFO);
> +       return default_print_cpuinfo();
> +}
> +
> +void reset_cpu(ulong addr)
> +{
> +       /* cold reset */
> +       outb(0x08, PORT_RESET);
> +}
> diff --git a/arch/x86/include/asm/arch-quark/gpio.h b/arch/x86/include/asm/arch-quark/gpio.h
> new file mode 100644
> index 0000000..ca8cba4
> --- /dev/null
> +++ b/arch/x86/include/asm/arch-quark/gpio.h
> @@ -0,0 +1,13 @@
> +/*
> + * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#ifndef _X86_ARCH_GPIO_H_
> +#define _X86_ARCH_GPIO_H_
> +
> +/* Where in config space is the register that points to the GPIO registers? */
> +#define PCI_CFG_GPIOBASE 0x44
> +
> +#endif /* _X86_ARCH_GPIO_H_ */
> --
> 1.8.2.1
>

Regards,
Simon
Bin Meng Feb. 2, 2015, 2:16 a.m. UTC | #2
Hi Simon,

On Mon, Feb 2, 2015 at 12:30 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Bin,
>
> On 29 January 2015 at 02:18, Bin Meng <bmeng.cn@gmail.com> wrote:
>> Add minimum codes to support Intel Quark SoC. DRAM initialization
>> is not ready yet so a hardcoded gd->ram_size is assigned.
>>
>> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>>
>> ---
>>
>> Changes in v2:
>> - Use machine-specific
>> - Move vairous components' base addresses within Quark SoC to Kconfig
>> - Rebase to u-boot-86/master
>>
>
> All looks OK but for a few nits.
>
>>  arch/x86/cpu/quark/Kconfig             | 118 +++++++++++++++++++++++++++++++++
>>  arch/x86/cpu/quark/Makefile            |   8 +++
>>  arch/x86/cpu/quark/dram.c              |  39 +++++++++++
>>  arch/x86/cpu/quark/pci.c               |  70 +++++++++++++++++++
>>  arch/x86/cpu/quark/quark.c             |  44 ++++++++++++
>>  arch/x86/include/asm/arch-quark/gpio.h |  13 ++++
>>  6 files changed, 292 insertions(+)
>>  create mode 100644 arch/x86/cpu/quark/Kconfig
>>  create mode 100644 arch/x86/cpu/quark/Makefile
>>  create mode 100644 arch/x86/cpu/quark/dram.c
>>  create mode 100644 arch/x86/cpu/quark/pci.c
>>  create mode 100644 arch/x86/cpu/quark/quark.c
>>  create mode 100644 arch/x86/include/asm/arch-quark/gpio.h
>>
>> diff --git a/arch/x86/cpu/quark/Kconfig b/arch/x86/cpu/quark/Kconfig
>> new file mode 100644
>> index 0000000..8bccf09
>> --- /dev/null
>> +++ b/arch/x86/cpu/quark/Kconfig
>> @@ -0,0 +1,118 @@
>> +#
>> +# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
>> +#
>> +# SPDX-License-Identifier:     GPL-2.0+
>> +#
>> +
>> +config INTEL_QUARK
>> +       bool
>> +       select HAVE_RMU
>> +
>> +if INTEL_QUARK
>> +
>> +config HAVE_RMU
>> +       bool "Add a Remote Management Unit (RMU) binary"
>> +       help
>> +         Select this option to add a Remote Management Unit (RMU) binary
>> +         to the resulting U-Boot image. It is a data block (up to 64K) of
>> +         machine-specific code which must be put in the flash for the RMU
>> +         within the Quark SoC processor to access when powered up before
>> +         system BIOS is executed.
>> +
>> +config RMU_FILE
>> +       string "Remote Management Unit (RMU) binary filename"
>> +       depends on HAVE_RMU
>> +       default "rmu.bin"
>> +       help
>> +         The filename of the file to use as Remote Management Unit (RMU)
>> +         binary in the board directory.
>> +
>> +config RMU_ADDR
>> +       hex "Remote Management Unit (RMU) binary location"
>> +       depends on HAVE_RMU
>> +       default 0xfff00000
>> +       help
>> +         The location of the RMU binary is determined by a strap. It must be
>> +         put in flash at a location matching the strap-determined base address.
>> +
>> +         The default base address of 0xfff00000 indicates that the binary must
>> +         be located at offset 0 from the beginning of a 1MB flash device.
>> +
>> +config HAVE_CMC
>> +       bool
>> +       default HAVE_RMU
>> +
>> +config CMC_FILE
>> +       string
>> +       depends on HAVE_CMC
>> +       default RMU_FILE
>> +
>> +config CMC_ADDR
>> +       hex
>> +       depends on HAVE_CMC
>> +       default RMU_ADDR
>> +
>> +config ESRAM_BASE
>> +       hex
>> +       default 0x80000000
>> +       help
>> +         Embedded SRAM (eSRAM) memory-mapped base address.
>> +
>> +config PCIE_ECAM_BASE
>> +       hex
>> +       default 0xe0000000
>> +
>> +config RCBA_BASE
>> +       hex
>> +       default 0xfed1c000
>> +       help
>> +         Root Complex register block memory-mapped base address.
>> +
>> +config ACPI_PM1_BASE
>> +       hex
>> +       default 0x1000
>> +       help
>> +         ACPI PM1 i/o-mapped base address.
>
> What is PM1?

This is defined in ACPI spec. Given U-Boot does not support ACPI yet,
and its full description is documented in the ACPI spec, I don't think
we need describe what it actually does here as this help is not a user
visible Kconfig option.

>> +
>> +config ACPI_P_BASE
>> +       hex
>> +       default 0x1010
>> +       help
>> +         ACPI PBLK i/o-mapped base address.
>
> What is PBLK?

Defined in ACPI spec. Maybe I should define this as ACPI_PBLK_BASE.

>> +
>> +config SPI_DMA_BASE
>> +       hex
>> +       default 0x1020
>> +       help
>> +         SPI DMA i/o-mapped base address.
>> +
>> +config GPIO_BASE
>> +       hex
>> +       default 0x1080
>> +       help
>> +         GPIO i/o-mapped base address.
>> +
>> +config GPE0_BASE
>> +       hex
>> +       default 0x1100
>> +       help
>> +         GPE0 i/o-mapped base address.
>
> What is GPE0?

Defined in ACPI spec. Maybe I should describe it as "ACPI GPE0", like above two.

>> +
>> +config WDT_BASE
>> +       hex
>> +       default 0x1140
>> +       help
>> +         Watchdog timer i/o-mapped base address.
>> +
>> +config SYS_CAR_ADDR
>> +       hex
>> +       default ESRAM_BASE
>> +
>> +config SYS_CAR_SIZE
>> +       hex
>> +       default 0x8000
>> +       help
>> +         Space in bytes in eSRAM used as Cache-As-ARM (CAR).
>> +         Note this size must not exceed eSRAM's total size.
>> +
>> +endif
>> diff --git a/arch/x86/cpu/quark/Makefile b/arch/x86/cpu/quark/Makefile
>> new file mode 100644
>> index 0000000..168c1e6
>> --- /dev/null
>> +++ b/arch/x86/cpu/quark/Makefile
>> @@ -0,0 +1,8 @@
>> +#
>> +# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
>> +#
>> +# SPDX-License-Identifier:     GPL-2.0+
>> +#
>> +
>> +obj-y += car.o dram.o msg_port.o quark.o
>> +obj-$(CONFIG_PCI) += pci.o
>> diff --git a/arch/x86/cpu/quark/dram.c b/arch/x86/cpu/quark/dram.c
>> new file mode 100644
>> index 0000000..fbdc3cd
>> --- /dev/null
>> +++ b/arch/x86/cpu/quark/dram.c
>> @@ -0,0 +1,39 @@
>> +/*
>> + * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <asm/post.h>
>> +#include <asm/arch/quark.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +int dram_init(void)
>> +{
>> +       /* hardcode the DRAM size for now */
>> +       gd->ram_size = DRAM_MAX_SIZE;
>> +       post_code(POST_DRAM);
>> +
>> +       return 0;
>> +}
>> +
>> +void dram_init_banksize(void)
>> +{
>> +       gd->bd->bi_dram[0].start = 0;
>> +       gd->bd->bi_dram[0].size = gd->ram_size;
>> +}
>> +
>> +/*
>> + * This function looks for the highest region of memory lower than 4GB which
>> + * has enough space for U-Boot where U-Boot is aligned on a page boundary.
>> + * It overrides the default implementation found elsewhere which simply
>> + * picks the end of ram, wherever that may be. The location of the stack,
>> + * the relocation address, and how far U-Boot is moved by relocation are
>> + * set in the global data structure.
>
> This comment probably doesn't make sense here.
>

This comment was taken from other codes. So far since we don't have
MRC, it returns a hardcoded number. Do you think I need change this
for this patch and when we support MRC we can add this comment back?

[snip]

Regards,
Bin
Simon Glass Feb. 2, 2015, 5:10 a.m. UTC | #3
Hi Bin,

On 1 February 2015 at 19:16, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Mon, Feb 2, 2015 at 12:30 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Bin,
>>
>> On 29 January 2015 at 02:18, Bin Meng <bmeng.cn@gmail.com> wrote:
>>> Add minimum codes to support Intel Quark SoC. DRAM initialization
>>> is not ready yet so a hardcoded gd->ram_size is assigned.
>>>
>>> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>>>
>>> ---
>>>
>>> Changes in v2:
>>> - Use machine-specific
>>> - Move vairous components' base addresses within Quark SoC to Kconfig
>>> - Rebase to u-boot-86/master
>>>
>>
>> All looks OK but for a few nits.
>>
>>>  arch/x86/cpu/quark/Kconfig             | 118 +++++++++++++++++++++++++++++++++
>>>  arch/x86/cpu/quark/Makefile            |   8 +++
>>>  arch/x86/cpu/quark/dram.c              |  39 +++++++++++
>>>  arch/x86/cpu/quark/pci.c               |  70 +++++++++++++++++++
>>>  arch/x86/cpu/quark/quark.c             |  44 ++++++++++++
>>>  arch/x86/include/asm/arch-quark/gpio.h |  13 ++++
>>>  6 files changed, 292 insertions(+)
>>>  create mode 100644 arch/x86/cpu/quark/Kconfig
>>>  create mode 100644 arch/x86/cpu/quark/Makefile
>>>  create mode 100644 arch/x86/cpu/quark/dram.c
>>>  create mode 100644 arch/x86/cpu/quark/pci.c
>>>  create mode 100644 arch/x86/cpu/quark/quark.c
>>>  create mode 100644 arch/x86/include/asm/arch-quark/gpio.h
>>>
>>> diff --git a/arch/x86/cpu/quark/Kconfig b/arch/x86/cpu/quark/Kconfig
>>> new file mode 100644
>>> index 0000000..8bccf09
>>> --- /dev/null
>>> +++ b/arch/x86/cpu/quark/Kconfig
>>> @@ -0,0 +1,118 @@
>>> +#
>>> +# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
>>> +#
>>> +# SPDX-License-Identifier:     GPL-2.0+
>>> +#
>>> +
>>> +config INTEL_QUARK
>>> +       bool
>>> +       select HAVE_RMU
>>> +
>>> +if INTEL_QUARK
>>> +
>>> +config HAVE_RMU
>>> +       bool "Add a Remote Management Unit (RMU) binary"
>>> +       help
>>> +         Select this option to add a Remote Management Unit (RMU) binary
>>> +         to the resulting U-Boot image. It is a data block (up to 64K) of
>>> +         machine-specific code which must be put in the flash for the RMU
>>> +         within the Quark SoC processor to access when powered up before
>>> +         system BIOS is executed.
>>> +
>>> +config RMU_FILE
>>> +       string "Remote Management Unit (RMU) binary filename"
>>> +       depends on HAVE_RMU
>>> +       default "rmu.bin"
>>> +       help
>>> +         The filename of the file to use as Remote Management Unit (RMU)
>>> +         binary in the board directory.
>>> +
>>> +config RMU_ADDR
>>> +       hex "Remote Management Unit (RMU) binary location"
>>> +       depends on HAVE_RMU
>>> +       default 0xfff00000
>>> +       help
>>> +         The location of the RMU binary is determined by a strap. It must be
>>> +         put in flash at a location matching the strap-determined base address.
>>> +
>>> +         The default base address of 0xfff00000 indicates that the binary must
>>> +         be located at offset 0 from the beginning of a 1MB flash device.
>>> +
>>> +config HAVE_CMC
>>> +       bool
>>> +       default HAVE_RMU
>>> +
>>> +config CMC_FILE
>>> +       string
>>> +       depends on HAVE_CMC
>>> +       default RMU_FILE
>>> +
>>> +config CMC_ADDR
>>> +       hex
>>> +       depends on HAVE_CMC
>>> +       default RMU_ADDR
>>> +
>>> +config ESRAM_BASE
>>> +       hex
>>> +       default 0x80000000
>>> +       help
>>> +         Embedded SRAM (eSRAM) memory-mapped base address.
>>> +
>>> +config PCIE_ECAM_BASE
>>> +       hex
>>> +       default 0xe0000000
>>> +
>>> +config RCBA_BASE
>>> +       hex
>>> +       default 0xfed1c000
>>> +       help
>>> +         Root Complex register block memory-mapped base address.
>>> +
>>> +config ACPI_PM1_BASE
>>> +       hex
>>> +       default 0x1000
>>> +       help
>>> +         ACPI PM1 i/o-mapped base address.
>>
>> What is PM1?
>
> This is defined in ACPI spec. Given U-Boot does not support ACPI yet,
> and its full description is documented in the ACPI spec, I don't think
> we need describe what it actually does here as this help is not a user
> visible Kconfig option.

OK, but perhaps you can put the abbreviated names in the help?

>
>>> +
>>> +config ACPI_P_BASE
>>> +       hex
>>> +       default 0x1010
>>> +       help
>>> +         ACPI PBLK i/o-mapped base address.
>>
>> What is PBLK?
>
> Defined in ACPI spec. Maybe I should define this as ACPI_PBLK_BASE.
>
>>> +
>>> +config SPI_DMA_BASE
>>> +       hex
>>> +       default 0x1020
>>> +       help
>>> +         SPI DMA i/o-mapped base address.
>>> +
>>> +config GPIO_BASE
>>> +       hex
>>> +       default 0x1080
>>> +       help
>>> +         GPIO i/o-mapped base address.
>>> +
>>> +config GPE0_BASE
>>> +       hex
>>> +       default 0x1100
>>> +       help
>>> +         GPE0 i/o-mapped base address.
>>
>> What is GPE0?
>
> Defined in ACPI spec. Maybe I should describe it as "ACPI GPE0", like above two.

Whatever you think is fine for the option, but please explain lots in
the help message.

>
>>> +
>>> +config WDT_BASE
>>> +       hex
>>> +       default 0x1140
>>> +       help
>>> +         Watchdog timer i/o-mapped base address.
>>> +
>>> +config SYS_CAR_ADDR
>>> +       hex
>>> +       default ESRAM_BASE
>>> +
>>> +config SYS_CAR_SIZE
>>> +       hex
>>> +       default 0x8000
>>> +       help
>>> +         Space in bytes in eSRAM used as Cache-As-ARM (CAR).
>>> +         Note this size must not exceed eSRAM's total size.
>>> +
>>> +endif
>>> diff --git a/arch/x86/cpu/quark/Makefile b/arch/x86/cpu/quark/Makefile
>>> new file mode 100644
>>> index 0000000..168c1e6
>>> --- /dev/null
>>> +++ b/arch/x86/cpu/quark/Makefile
>>> @@ -0,0 +1,8 @@
>>> +#
>>> +# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
>>> +#
>>> +# SPDX-License-Identifier:     GPL-2.0+
>>> +#
>>> +
>>> +obj-y += car.o dram.o msg_port.o quark.o
>>> +obj-$(CONFIG_PCI) += pci.o
>>> diff --git a/arch/x86/cpu/quark/dram.c b/arch/x86/cpu/quark/dram.c
>>> new file mode 100644
>>> index 0000000..fbdc3cd
>>> --- /dev/null
>>> +++ b/arch/x86/cpu/quark/dram.c
>>> @@ -0,0 +1,39 @@
>>> +/*
>>> + * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
>>> + *
>>> + * SPDX-License-Identifier:    GPL-2.0+
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <asm/post.h>
>>> +#include <asm/arch/quark.h>
>>> +
>>> +DECLARE_GLOBAL_DATA_PTR;
>>> +
>>> +int dram_init(void)
>>> +{
>>> +       /* hardcode the DRAM size for now */
>>> +       gd->ram_size = DRAM_MAX_SIZE;
>>> +       post_code(POST_DRAM);
>>> +
>>> +       return 0;
>>> +}
>>> +
>>> +void dram_init_banksize(void)
>>> +{
>>> +       gd->bd->bi_dram[0].start = 0;
>>> +       gd->bd->bi_dram[0].size = gd->ram_size;
>>> +}
>>> +
>>> +/*
>>> + * This function looks for the highest region of memory lower than 4GB which
>>> + * has enough space for U-Boot where U-Boot is aligned on a page boundary.
>>> + * It overrides the default implementation found elsewhere which simply
>>> + * picks the end of ram, wherever that may be. The location of the stack,
>>> + * the relocation address, and how far U-Boot is moved by relocation are
>>> + * set in the global data structure.
>>
>> This comment probably doesn't make sense here.
>>
>
> This comment was taken from other codes. So far since we don't have
> MRC, it returns a hardcoded number. Do you think I need change this
> for this patch and when we support MRC we can add this comment back?

Ah I see. Well it's fine to leave as it is then.

Regards,
Simon
diff mbox

Patch

diff --git a/arch/x86/cpu/quark/Kconfig b/arch/x86/cpu/quark/Kconfig
new file mode 100644
index 0000000..8bccf09
--- /dev/null
+++ b/arch/x86/cpu/quark/Kconfig
@@ -0,0 +1,118 @@ 
+#
+# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+config INTEL_QUARK
+	bool
+	select HAVE_RMU
+
+if INTEL_QUARK
+
+config HAVE_RMU
+	bool "Add a Remote Management Unit (RMU) binary"
+	help
+	  Select this option to add a Remote Management Unit (RMU) binary
+	  to the resulting U-Boot image. It is a data block (up to 64K) of
+	  machine-specific code which must be put in the flash for the RMU
+	  within the Quark SoC processor to access when powered up before
+	  system BIOS is executed.
+
+config RMU_FILE
+	string "Remote Management Unit (RMU) binary filename"
+	depends on HAVE_RMU
+	default "rmu.bin"
+	help
+	  The filename of the file to use as Remote Management Unit (RMU)
+	  binary in the board directory.
+
+config RMU_ADDR
+	hex "Remote Management Unit (RMU) binary location"
+	depends on HAVE_RMU
+	default 0xfff00000
+	help
+	  The location of the RMU binary is determined by a strap. It must be
+	  put in flash at a location matching the strap-determined base address.
+
+	  The default base address of 0xfff00000 indicates that the binary must
+	  be located at offset 0 from the beginning of a 1MB flash device.
+
+config HAVE_CMC
+	bool
+	default HAVE_RMU
+
+config CMC_FILE
+	string
+	depends on HAVE_CMC
+	default RMU_FILE
+
+config CMC_ADDR
+	hex
+	depends on HAVE_CMC
+	default RMU_ADDR
+
+config ESRAM_BASE
+	hex
+	default 0x80000000
+	help
+	  Embedded SRAM (eSRAM) memory-mapped base address.
+
+config PCIE_ECAM_BASE
+	hex
+	default 0xe0000000
+
+config RCBA_BASE
+	hex
+	default 0xfed1c000
+	help
+	  Root Complex register block memory-mapped base address.
+
+config ACPI_PM1_BASE
+	hex
+	default 0x1000
+	help
+	  ACPI PM1 i/o-mapped base address.
+
+config ACPI_P_BASE
+	hex
+	default 0x1010
+	help
+	  ACPI PBLK i/o-mapped base address.
+
+config SPI_DMA_BASE
+	hex
+	default 0x1020
+	help
+	  SPI DMA i/o-mapped base address.
+
+config GPIO_BASE
+	hex
+	default 0x1080
+	help
+	  GPIO i/o-mapped base address.
+
+config GPE0_BASE
+	hex
+	default 0x1100
+	help
+	  GPE0 i/o-mapped base address.
+
+config WDT_BASE
+	hex
+	default 0x1140
+	help
+	  Watchdog timer i/o-mapped base address.
+
+config SYS_CAR_ADDR
+	hex
+	default ESRAM_BASE
+
+config SYS_CAR_SIZE
+	hex
+	default 0x8000
+	help
+	  Space in bytes in eSRAM used as Cache-As-ARM (CAR).
+	  Note this size must not exceed eSRAM's total size.
+
+endif
diff --git a/arch/x86/cpu/quark/Makefile b/arch/x86/cpu/quark/Makefile
new file mode 100644
index 0000000..168c1e6
--- /dev/null
+++ b/arch/x86/cpu/quark/Makefile
@@ -0,0 +1,8 @@ 
+#
+# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+#
+# SPDX-License-Identifier:	GPL-2.0+
+#
+
+obj-y += car.o dram.o msg_port.o quark.o
+obj-$(CONFIG_PCI) += pci.o
diff --git a/arch/x86/cpu/quark/dram.c b/arch/x86/cpu/quark/dram.c
new file mode 100644
index 0000000..fbdc3cd
--- /dev/null
+++ b/arch/x86/cpu/quark/dram.c
@@ -0,0 +1,39 @@ 
+/*
+ * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/post.h>
+#include <asm/arch/quark.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int dram_init(void)
+{
+	/* hardcode the DRAM size for now */
+	gd->ram_size = DRAM_MAX_SIZE;
+	post_code(POST_DRAM);
+
+	return 0;
+}
+
+void dram_init_banksize(void)
+{
+	gd->bd->bi_dram[0].start = 0;
+	gd->bd->bi_dram[0].size = gd->ram_size;
+}
+
+/*
+ * This function looks for the highest region of memory lower than 4GB which
+ * has enough space for U-Boot where U-Boot is aligned on a page boundary.
+ * It overrides the default implementation found elsewhere which simply
+ * picks the end of ram, wherever that may be. The location of the stack,
+ * the relocation address, and how far U-Boot is moved by relocation are
+ * set in the global data structure.
+ */
+ulong board_get_usable_ram_top(ulong total_size)
+{
+	return gd->ram_size;
+}
diff --git a/arch/x86/cpu/quark/pci.c b/arch/x86/cpu/quark/pci.c
new file mode 100644
index 0000000..354e15a
--- /dev/null
+++ b/arch/x86/cpu/quark/pci.c
@@ -0,0 +1,70 @@ 
+/*
+ * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <pci.h>
+#include <asm/pci.h>
+#include <asm/arch/device.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void board_pci_setup_hose(struct pci_controller *hose)
+{
+	hose->first_busno = 0;
+	hose->last_busno = 0;
+
+	/* PCI memory space */
+	pci_set_region(hose->regions + 0,
+		       CONFIG_PCI_MEM_BUS,
+		       CONFIG_PCI_MEM_PHYS,
+		       CONFIG_PCI_MEM_SIZE,
+		       PCI_REGION_MEM);
+
+	/* PCI IO space */
+	pci_set_region(hose->regions + 1,
+		       CONFIG_PCI_IO_BUS,
+		       CONFIG_PCI_IO_PHYS,
+		       CONFIG_PCI_IO_SIZE,
+		       PCI_REGION_IO);
+
+	pci_set_region(hose->regions + 2,
+		       CONFIG_PCI_PREF_BUS,
+		       CONFIG_PCI_PREF_PHYS,
+		       CONFIG_PCI_PREF_SIZE,
+		       PCI_REGION_PREFETCH);
+
+	pci_set_region(hose->regions + 3,
+		       0,
+		       0,
+		       gd->ram_size,
+		       PCI_REGION_MEM | PCI_REGION_SYS_MEMORY);
+
+	hose->region_count = 4;
+}
+
+int board_pci_post_scan(struct pci_controller *hose)
+{
+	return 0;
+}
+
+int pci_skip_dev(struct pci_controller *hose, pci_dev_t dev)
+{
+	/*
+	 * TODO:
+	 *
+	 * For some unknown reason, the PCI enumeration process hangs
+	 * when it scans to the PCIe root port 0 (D23:F0) & 1 (D23:F1).
+	 *
+	 * For now we just skip these two devices, and this needs to
+	 * be revisited later.
+	 */
+	if (dev == QUARK_HOST_BRIDGE ||
+	    dev == QUARK_PCIE0 || dev == QUARK_PCIE1) {
+		return 1;
+	}
+
+	return 0;
+}
diff --git a/arch/x86/cpu/quark/quark.c b/arch/x86/cpu/quark/quark.c
new file mode 100644
index 0000000..47ba152
--- /dev/null
+++ b/arch/x86/cpu/quark/quark.c
@@ -0,0 +1,44 @@ 
+/*
+ * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/pci.h>
+#include <asm/post.h>
+#include <asm/processor.h>
+
+int arch_cpu_init(void)
+{
+	struct pci_controller *hose;
+	int ret;
+
+	post_code(POST_CPU_INIT);
+#ifdef CONFIG_SYS_X86_TSC_TIMER
+	timer_set_base(rdtsc());
+#endif
+
+	ret = x86_cpu_init_f();
+	if (ret)
+		return ret;
+
+	ret = pci_early_init_hose(&hose);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+int print_cpuinfo(void)
+{
+	post_code(POST_CPU_INFO);
+	return default_print_cpuinfo();
+}
+
+void reset_cpu(ulong addr)
+{
+	/* cold reset */
+	outb(0x08, PORT_RESET);
+}
diff --git a/arch/x86/include/asm/arch-quark/gpio.h b/arch/x86/include/asm/arch-quark/gpio.h
new file mode 100644
index 0000000..ca8cba4
--- /dev/null
+++ b/arch/x86/include/asm/arch-quark/gpio.h
@@ -0,0 +1,13 @@ 
+/*
+ * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _X86_ARCH_GPIO_H_
+#define _X86_ARCH_GPIO_H_
+
+/* Where in config space is the register that points to the GPIO registers? */
+#define PCI_CFG_GPIOBASE 0x44
+
+#endif /* _X86_ARCH_GPIO_H_ */