[PATCH v5 4/7] arm: omap4: hwmod: introduce emu hwmod

Ming Lei ming.lei at canonical.com
Sat Nov 19 09:37:08 EST 2011


Hi Benoit,

On Fri, Nov 18, 2011 at 8:58 PM, Cousson, Benoit <b-cousson at ti.com> wrote:
> Hi Ming Lei,
>
> Sorry, for the delay, it took me some time to gather the exhaustive data for that block.

The work is really great.

> On 11/10/2011 10:02 AM, Paul Walmsley wrote:
>> Hello Ming Lei,
>>
>> just a few quick comments for now -
>>
>> On Wed, 9 Nov 2011, Ming Lei wrote:
>>
>>> On Tue, Nov 8, 2011 at 11:26 PM, Paul Walmsley<paul at pwsan.com>  wrote:
>>>
>>>>> +static struct omap_hwmod_irq_info omap44xx_emu_irqs[] = {
>>>>> +     { .name = "cti0", .irq = 1 + OMAP44XX_IRQ_GIC_START },
>>>>> +     { .name = "cti1", .irq = 2 + OMAP44XX_IRQ_GIC_START },
>>>>> +     { .irq = -1 }
>>>>> +};
>>>>
>>>> Are you sure these are part of the emulation IP?  We already have those
>>>
>>> I am not sure, I just figure out one way to make omap4 pmu work. Since there
>>> are few descriptions in TRM about it, it is a hacking based on [1], :-)
>>>
>>>> IRQs in the MPU hwmod, see omap44xx_mpu_irqs[] in the same file.
>>>
>>> I just see it, but looks like the "mpu" hwmod isn't populated as omap_device,
>>> so the CTI irqs aren't requested now.
>>
>> Okay.  Maybe you can probably add some code in mach-omap2/devices.c to
>> build an omap_device for this for right now?  I am not 100% sure whether
>> those cti0/1 interrupts should be associated with the MPU or with the
>> DEBUGSS but Benoīt might be able to answer this.
>>
>>> Also, current arm perf code don't handle three IRQs(one pl310 irq and
>>> two CTI irq) inside one device correctly.
>>
>> To fix this, that ARM perf code should either be using
>> platform_get_irq_byname(), or the hwmod hardware data will need to be
>> rearranged to meet the arbitrary ordering requirement.  I'd suggest
>> pinging Will on this issue to see what he wants to do.
>>
>>> So any suggestion about CTI IRQs connecting to which hwmod, so that they can
>>> be found by pmu driver?
>>>
>>>>> +/*emu hwmod*/
>>>>> +static struct omap_hwmod omap44xx_emu_hwmod = {
>>>>> +     .name           = "emu",
>>>>> +     .class          =&omap44xx_emu_hwmod_class,
>>>>> +     .clkdm_name     = "emu_sys_clkdm",
>>>>> +     .prcm = {
>>>>> +             .omap4 = {
>>>>> +                     .clkctrl_offs = OMAP4_CM_EMU_CLKSTCTRL_OFFSET,
>>>>
>>>> This doesn't look right either: EMU is a clockdomain, not an IP block.
>>>
>>> I defined the 'emu' hwmod to control the clock state transition of the EMU
>>> clock domain by writing to CLKTRCTRL.CM_EMU_CLKSTCTRL with standard
>>> hwmod interface(_enable / _idle). Is there any other neat way to do it?
>>
>> So the clockdomain is already defined in
>> mach-omap2/clockdomains44xx_data.c and there's code to control it - see
>> for example clkdm_enable_idle().  But this code should not be called
>> directly by any device driver code or driver integration code.  The thing
>> to do here is to ask Benoīt to release the hwmod data for the DEBUGSS
>> hwmod, then someone will need to write an MFD driver for that which
>> exposes the PMU address space to the PMU platform driver.
>
> Following that discussion, here is the patch to expose debugss hwmod.
>
> I have moved the CTIs irq from MPU to debugss and exposed all the internals IP that are part of the OMAP debug subsystem.
>
> Since the DEBUGSS cannot be accessed at boot time if the l3_main_3 and the l3_instr interconnects are not enable, you will have some warnings.
>

Currently these two modules are enabled in my patch 5/7 and 6/7, and the
pmu omap device is built from the three IPs: debugss, l3_main_3 and
the l3_instr,
so that these two modules can be enabled in omap_device_enable().

I don't know how to enable the two IPs in other ways, also I am not
sure if the way
is suitable, but it does work, could you help to review the two patches?

> [    0.416992] omap_hwmod: debugss: softreset failed (waited 10000 usec)
> [    0.426727] omap_hwmod: debugss: _wait_target_disable failed
>
> Just let me know if you have any issue with that patch.

In fact, now it is very easy to enable pmu on omap with your patch,
I have made omap4 pmu work already using debugss:

     - replace the patch 3/7 with your debugss patch(replace 'emu'
with 'debugss')
     - modify the patch  5/7 to create pmu omap device from 'debugss'
instead of 'emu'

thanks,
--
Ming Lei

>
> Please note that will will need the fix "ARM: OMAP: hwmod: Fix the addr space, irq, dma count APIs" to avoid hwmod core messing up with the resources.
>
> I've just posted a pull request for Tony to get it for -rc3.
> http://comments.gmane.org/gmane.linux.ports.arm.kernel/140458
>
> I pushed these two patches on a branch based on mainline for your convenience.
>
> git://gitorious.org/omap-pm/linux.git wip-emu/debuss_hwmod
>
> Regards,
> Benoit
>
> ---
> From: Benoit Cousson <b-cousson at ti.com>
> Date: Fri, 18 Nov 2011 11:42:12 +0100
> Subject: [PATCH] ARM: OMAP4: hwmod data: Add support for the debug modules
>
> The OMAP4 DEBUG subsystem contains all the IPs used for emulation,
> included the ones from the CortexA9 MPU.
> Expose the individual modules base address.
>
> Re-map the CTIs IRQs from MPU to DEBUGSS.
>
> Signed-off-by: Benoit Cousson <b-cousson at ti.com>
> Cc: Ming Lei <ming.lei at canonical.com>
> ---
>  arch/arm/mach-omap2/omap_hwmod_44xx_data.c |  177 +++++++++++++++++++++++++++-
>  1 files changed, 174 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> index 7695e5d..6cf21ee 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> @@ -47,6 +47,7 @@
>
>  /* Backward references (IPs with Bus Master capability) */
>  static struct omap_hwmod omap44xx_aess_hwmod;
> +static struct omap_hwmod omap44xx_debugss_hwmod;
>  static struct omap_hwmod omap44xx_dma_system_hwmod;
>  static struct omap_hwmod omap44xx_dmm_hwmod;
>  static struct omap_hwmod omap44xx_dsp_hwmod;
> @@ -337,6 +338,14 @@ static struct omap_hwmod omap44xx_l3_main_1_hwmod = {
>  };
>
>  /* l3_main_2 */
> +/* debugss -> l3_main_2 */
> +static struct omap_hwmod_ocp_if omap44xx_debugss__l3_main_2 = {
> +       .master         = &omap44xx_debugss_hwmod,
> +       .slave          = &omap44xx_l3_main_2_hwmod,
> +       .clk            = "dbgclk_mux_ck",
> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
> +};
> +
>  /* dma_system -> l3_main_2 */
>  static struct omap_hwmod_ocp_if omap44xx_dma_system__l3_main_2 = {
>        .master         = &omap44xx_dma_system_hwmod,
> @@ -686,7 +695,6 @@ static struct omap_hwmod omap44xx_mpu_private_hwmod = {
>  *  ctrl_module_pad_core
>  *  ctrl_module_pad_wkup
>  *  ctrl_module_wkup
> - *  debugss
>  *  efuse_ctrl_cust
>  *  efuse_ctrl_std
>  *  elm
> @@ -908,6 +916,168 @@ static struct omap_hwmod omap44xx_counter_32k_hwmod = {
>  };
>
>  /*
> + * 'debugss' class
> + * debug and emulation sub system
> + */
> +
> +static struct omap_hwmod_class_sysconfig omap44xx_debugss_sysc = {
> +       .rev_offs       = 0x0000,
> +       .sysc_offs      = 0x0010,
> +       .syss_offs      = 0x0014,
> +       .sysc_flags     = (SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
> +       .sysc_fields    = &omap_hwmod_sysc_type1,
> +};
> +
> +static struct omap_hwmod_class omap44xx_debugss_hwmod_class = {
> +       .name   = "debugss",
> +       .sysc   = &omap44xx_debugss_sysc,
> +};
> +
> +/* debugss */
> +static struct omap_hwmod_irq_info omap44xx_debugss_irqs[] = {
> +       { .name = "cti0", .irq = 1 + OMAP44XX_IRQ_GIC_START },
> +       { .name = "cti1", .irq = 2 + OMAP44XX_IRQ_GIC_START },
> +       { .irq = -1 }
> +};
> +
> +/* debugss master ports */
> +static struct omap_hwmod_ocp_if *omap44xx_debugss_masters[] = {
> +       &omap44xx_debugss__l3_main_2,
> +};
> +
> +static struct omap_hwmod_addr_space omap44xx_debugss_addrs[] = {
> +       {
> +               .name           = "mipi_stm_add_sp_0",
> +               .pa_start       = 0x54000000,
> +               .pa_end         = 0x540fffff,
> +       },
> +       {
> +               .name           = "mipi_stm_add_sp_1",
> +               .pa_start       = 0x54100000,
> +               .pa_end         = 0x5413ffff,
> +       },
> +       {
> +               .name           = "mpu_c0_debug",
> +               .pa_start       = 0x54140000,
> +               .pa_end         = 0x54141fff,
> +       },
> +       {
> +               .name           = "mpu_c1_debug",
> +               .pa_start       = 0x54142000,
> +               .pa_end         = 0x54143fff,
> +       },
> +       {
> +               .name           = "cti0_mpu",
> +               .pa_start       = 0x54148000,
> +               .pa_end         = 0x54148fff,
> +       },
> +       {
> +               .name           = "cti1_mpu",
> +               .pa_start       = 0x54149000,
> +               .pa_end         = 0x54149fff,
> +       },
> +       {
> +               .name           = "ptm0_mpu",
> +               .pa_start       = 0x5414c000,
> +               .pa_end         = 0x5414cfff,
> +       },
> +       {
> +               .name           = "ptm1_mpu",
> +               .pa_start       = 0x5414d000,
> +               .pa_end         = 0x5414dfff,
> +       },
> +       {
> +               .name           = "tf_mpu",
> +               .pa_start       = 0x54158000,
> +               .pa_end         = 0x54158fff,
> +       },
> +       {
> +               .name           = "dap_pc_mpu",
> +               .pa_start       = 0x54159000,
> +               .pa_end         = 0x54159fff,
> +       },
> +       {
> +               .name           = "apb_bridge_a_ctrl_time_out",
> +               .pa_start       = 0x5415f000,
> +               .pa_end         = 0x5415ffff,
> +       },
> +       {
> +               .name           = "drm",
> +               .pa_start       = 0x54160000,
> +               .pa_end         = 0x54160fff,
> +       },
> +       {
> +               .name           = "mipi_stm",
> +               .pa_start       = 0x54161000,
> +               .pa_end         = 0x54161fff,
> +               .flags          = ADDR_TYPE_RT
> +       },
> +       {
> +               .name           = "csetb",
> +               .pa_start       = 0x54162000,
> +               .pa_end         = 0x54162fff,
> +       },
> +       {
> +               .name           = "cstpiu",
> +               .pa_start       = 0x54163000,
> +               .pa_end         = 0x54163fff,
> +       },
> +       {
> +               .name           = "cstf1",
> +               .pa_start       = 0x54164000,
> +               .pa_end         = 0x54164fff,
> +       },
> +       {
> +               .name           = "cstf2",
> +               .pa_start       = 0x54165000,
> +               .pa_end         = 0x54165fff,
> +       },
> +       {
> +               .name           = "l4_cfg_emu_conf_regs",
> +               .pa_start       = 0x54167000,
> +               .pa_end         = 0x54167fff,
> +       },
> +       {
> +               .name           = "l3_instr_emu_conf_regs",
> +               .pa_start       = 0x54180000,
> +               .pa_end         = 0x54180fff,
> +       },
> +       { }
> +};
> +
> +/* l3_instr -> debugss */
> +static struct omap_hwmod_ocp_if omap44xx_l3_instr__debugss = {
> +       .master         = &omap44xx_l3_instr_hwmod,
> +       .slave          = &omap44xx_debugss_hwmod,
> +       .clk            = "l3_div_ck",
> +       .addr           = omap44xx_debugss_addrs,
> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
> +};
> +
> +/* debugss slave ports */
> +static struct omap_hwmod_ocp_if *omap44xx_debugss_slaves[] = {
> +       &omap44xx_l3_instr__debugss,
> +};
> +
> +static struct omap_hwmod omap44xx_debugss_hwmod = {
> +       .name           = "debugss",
> +       .class          = &omap44xx_debugss_hwmod_class,
> +       .clkdm_name     = "emu_sys_clkdm",
> +       .mpu_irqs       = omap44xx_debugss_irqs,
> +       .main_clk       = "trace_clk_div_ck",
> +       .prcm = {
> +               .omap4 = {
> +                       .clkctrl_offs = OMAP4_CM_EMU_DEBUGSS_CLKCTRL_OFFSET,
> +                       .context_offs = OMAP4_RM_EMU_DEBUGSS_CONTEXT_OFFSET,
> +               },
> +       },
> +       .slaves         = omap44xx_debugss_slaves,
> +       .slaves_cnt     = ARRAY_SIZE(omap44xx_debugss_slaves),
> +       .masters        = omap44xx_debugss_masters,
> +       .masters_cnt    = ARRAY_SIZE(omap44xx_debugss_masters),
> +};
> +
> +/*
>  * 'dma' class
>  * dma controller for data exchange between memory to memory (i.e. internal or
>  * external memory) and gp peripherals to memory or memory to gp peripherals
> @@ -3902,8 +4072,6 @@ static struct omap_hwmod_class omap44xx_mpu_hwmod_class = {
>  /* mpu */
>  static struct omap_hwmod_irq_info omap44xx_mpu_irqs[] = {
>        { .name = "pl310", .irq = 0 + OMAP44XX_IRQ_GIC_START },
> -       { .name = "cti0", .irq = 1 + OMAP44XX_IRQ_GIC_START },
> -       { .name = "cti1", .irq = 2 + OMAP44XX_IRQ_GIC_START },
>        { .irq = -1 }
>  };
>
> @@ -5308,6 +5476,9 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
>        /* counter class */
>  /*     &omap44xx_counter_32k_hwmod, */
>
> +       /* debugss class */
> +       &omap44xx_debugss_hwmod,
> +
>        /* dma class */
>        &omap44xx_dma_system_hwmod,
>
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



More information about the linux-arm-kernel mailing list