[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v8 8/9] hw/arm/xilinx_zynq: connect uart clocks to slcr
From: |
Alistair Francis |
Subject: |
Re: [PATCH v8 8/9] hw/arm/xilinx_zynq: connect uart clocks to slcr |
Date: |
Wed, 26 Feb 2020 14:58:13 -0800 |
On Tue, Feb 25, 2020 at 5:40 AM Damien Hedde <address@hidden> wrote:
>
> Add the connection between the slcr's output clocks and the uarts inputs.
>
> Also add the main board clock 'ps_clk', which is hard-coded to 33.33MHz
> (the default frequency). This clock is used to feed the slcr's input
> clock.
>
> Signed-off-by: Damien Hedde <address@hidden>
Reviewed-by: Alistair Francis <address@hidden>
Alistair
>
> ---
> v7
> + update ClockIn/ClockOut types
> + simplify the ps_clk frequency init
> ---
> hw/arm/xilinx_zynq.c | 57 +++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 49 insertions(+), 8 deletions(-)
>
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index 3a0fa5b23f..261a1690a8 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -34,6 +34,15 @@
> #include "hw/char/cadence_uart.h"
> #include "hw/net/cadence_gem.h"
> #include "hw/cpu/a9mpcore.h"
> +#include "hw/qdev-clock.h"
> +#include "sysemu/reset.h"
> +
> +#define TYPE_ZYNQ_MACHINE MACHINE_TYPE_NAME("xilinx-zynq-a9")
> +#define ZYNQ_MACHINE(obj) \
> + OBJECT_CHECK(ZynqMachineState, (obj), TYPE_ZYNQ_MACHINE)
> +
> +/* board base frequency: 33.333333 MHz */
> +#define PS_CLK_FREQUENCY (100 * 1000 * 1000 / 3)
>
> #define NUM_SPI_FLASHES 4
> #define NUM_QSPI_FLASHES 2
> @@ -74,6 +83,11 @@ static const int dma_irqs[8] = {
> 0xe3401000 + ARMV7_IMM16(extract32((val), 16, 16)), /* movt r1 ... */ \
> 0xe5801000 + (addr)
>
> +typedef struct ZynqMachineState {
> + MachineState parent;
> + Clock *ps_clk;
> +} ZynqMachineState;
> +
> static void zynq_write_board_setup(ARMCPU *cpu,
> const struct arm_boot_info *info)
> {
> @@ -158,12 +172,13 @@ static inline void zynq_init_spi_flashes(uint32_t
> base_addr, qemu_irq irq,
>
> static void zynq_init(MachineState *machine)
> {
> + ZynqMachineState *zynq_machine = ZYNQ_MACHINE(machine);
> ram_addr_t ram_size = machine->ram_size;
> ARMCPU *cpu;
> MemoryRegion *address_space_mem = get_system_memory();
> MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
> MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
> - DeviceState *dev;
> + DeviceState *dev, *slcr;
> SysBusDevice *busdev;
> qemu_irq pic[64];
> int n;
> @@ -208,9 +223,18 @@ static void zynq_init(MachineState *machine)
> 1, 0x0066, 0x0022, 0x0000, 0x0000, 0x0555, 0x2aa,
> 0);
>
> - dev = qdev_create(NULL, "xilinx,zynq_slcr");
> - qdev_init_nofail(dev);
> - sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xF8000000);
> + /* Create slcr, keep a pointer to connect clocks */
> + slcr = qdev_create(NULL, "xilinx,zynq_slcr");
> + qdev_init_nofail(slcr);
> + sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
> +
> + /* Create the main clock source, and feed slcr with it */
> + zynq_machine->ps_clk = CLOCK(object_new(TYPE_CLOCK));
> + object_property_add_child(OBJECT(zynq_machine), "ps_clk",
> + OBJECT(zynq_machine->ps_clk), &error_abort);
> + object_unref(OBJECT(zynq_machine->ps_clk));
> + clock_set_hz(zynq_machine->ps_clk, PS_CLK_FREQUENCY);
> + qdev_connect_clock_in(slcr, "ps_clk", zynq_machine->ps_clk);
>
> dev = qdev_create(NULL, TYPE_A9MPCORE_PRIV);
> qdev_prop_set_uint32(dev, "num-cpu", 1);
> @@ -231,8 +255,12 @@ static void zynq_init(MachineState *machine)
> sysbus_create_simple("xlnx,ps7-usb", 0xE0002000, pic[53-IRQ_OFFSET]);
> sysbus_create_simple("xlnx,ps7-usb", 0xE0003000, pic[76-IRQ_OFFSET]);
>
> - cadence_uart_create(0xE0000000, pic[59 - IRQ_OFFSET], serial_hd(0));
> - cadence_uart_create(0xE0001000, pic[82 - IRQ_OFFSET], serial_hd(1));
> + dev = cadence_uart_create(0xE0000000, pic[59 - IRQ_OFFSET],
> serial_hd(0));
> + qdev_connect_clock_in(dev, "refclk",
> + qdev_get_clock_out(slcr, "uart0_ref_clk"));
> + dev = cadence_uart_create(0xE0001000, pic[82 - IRQ_OFFSET],
> serial_hd(1));
> + qdev_connect_clock_in(dev, "refclk",
> + qdev_get_clock_out(slcr, "uart1_ref_clk"));
>
> sysbus_create_varargs("cadence_ttc", 0xF8001000,
> pic[42-IRQ_OFFSET], pic[43-IRQ_OFFSET], pic[44-IRQ_OFFSET],
> NULL);
> @@ -310,8 +338,9 @@ static void zynq_init(MachineState *machine)
> arm_load_kernel(ARM_CPU(first_cpu), machine, &zynq_binfo);
> }
>
> -static void zynq_machine_init(MachineClass *mc)
> +static void zynq_machine_class_init(ObjectClass *oc, void *data)
> {
> + MachineClass *mc = MACHINE_CLASS(oc);
> mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9";
> mc->init = zynq_init;
> mc->max_cpus = 1;
> @@ -320,4 +349,16 @@ static void zynq_machine_init(MachineClass *mc)
> mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
> }
>
> -DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)
> +static const TypeInfo zynq_machine_type = {
> + .name = TYPE_ZYNQ_MACHINE,
> + .parent = TYPE_MACHINE,
> + .class_init = zynq_machine_class_init,
> + .instance_size = sizeof(ZynqMachineState),
> +};
> +
> +static void zynq_machine_register_types(void)
> +{
> + type_register_static(&zynq_machine_type);
> +}
> +
> +type_init(zynq_machine_register_types)
> --
> 2.25.1
>
>
- Re: [PATCH v8 4/9] qdev-clock: introduce an init array to ease the device construction, (continued)
- [PATCH v8 3/9] qdev: add clock input&output support to devices., Damien Hedde, 2020/02/25
- [PATCH v8 9/9] qdev-monitor: print the device's clock with info qtree, Damien Hedde, 2020/02/25
- [PATCH v8 6/9] hw/misc/zynq_slcr: add clock generation for uarts, Damien Hedde, 2020/02/25
- [PATCH v8 7/9] hw/char/cadence_uart: add clock support, Damien Hedde, 2020/02/25
- [PATCH v8 8/9] hw/arm/xilinx_zynq: connect uart clocks to slcr, Damien Hedde, 2020/02/25
- Re: [PATCH v8 8/9] hw/arm/xilinx_zynq: connect uart clocks to slcr,
Alistair Francis <=
- [PATCH v8 5/9] docs/clocks: add device's clock documentation, Damien Hedde, 2020/02/25