Re: [PATCH] arm: msm: smd: use either package v3 or v4 not both

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



inline.

On Fri, Apr 9, 2010 at 2:37 AM, Daniel Walker <dwalker@xxxxxxxxxxxxxx> wrote:
> From: Daniel Walker <c_dwalke@xxxxxxxxxxx>
>
>
> Dima could you review this patch please?
>
> --
>
> This modifies SMD to use either the package v3 or package v4,
> but not both. The current code tries to allocate as v4 on all
> system which can produce a scary looking error message on boot up,
>
> smem_find(16, 40): wrong size 16424
> smd_alloc_channel() cid=02 size=08192 'SMD_RPCCALL'
>
> With this error the code then falls back on the package v3 allocation
> method. This method is inefficient because it causes a slow down
> on some systems even when the allocation method can be determined
> at compile time. It also causes a kernel size increase that effects
> all system and is not needed.
>
> This change corrects the allocation to use one method or the other
> and not both.
>
> Signed-off-by: Daniel Walker <c_dwalke@xxxxxxxxxxx>
> ---
>  arch/arm/mach-msm/Kconfig       |    4 +++
>  arch/arm/mach-msm/smd.c         |   44 +-----------------------------
>  arch/arm/mach-msm/smd_private.h |   58 +++++++++++++++++++++++++++++++++++++-
>  3 files changed, 61 insertions(+), 45 deletions(-)
>
> diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig
> index b548e42..381e817 100644
> --- a/arch/arm/mach-msm/Kconfig
> +++ b/arch/arm/mach-msm/Kconfig
> @@ -7,6 +7,7 @@ choice
>  config ARCH_MSM7X00A
>        bool "MSM7x00A / MSM7x01A"
>        select ARCH_MSM_ARM11
> +       select MSM_SMD_PKG3
>        select CPU_V6
>
>  config ARCH_QSD8X50
> @@ -325,6 +326,9 @@ config MSM_SERIAL_DEBUGGER_CONSOLE
>          Enables a console so that printk messages are displayed on
>          the debugger serial port as the occur.
>
> +config MSM_SMD_PKG3

What is PKG3/PKG4? How does it relate to smd structure versions?

> +       bool
> +
>  config MSM_SMD
>        default y
>        bool "MSM Shared Memory Driver (SMD)"
> diff --git a/arch/arm/mach-msm/smd.c b/arch/arm/mach-msm/smd.c
> index 42b59c9..1b4ecce 100644
> --- a/arch/arm/mach-msm/smd.c
> +++ b/arch/arm/mach-msm/smd.c
> @@ -600,48 +600,6 @@ static int smd_packet_read(smd_channel_t *ch, void *data, int len)
>        return r;
>  }
>
> -static int smd_alloc_v2(struct smd_channel *ch)
> -{
> -       struct smd_shared_v2 *shared2;
> -       void *buffer;
> -       unsigned buffer_sz;
> -
> -       shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
> -       buffer = smem_item(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
> -
> -       if (!buffer)
> -               return -1;
> -
> -       /* buffer must be a power-of-two size */
> -       if (buffer_sz & (buffer_sz - 1))
> -               return -1;
> -
> -       buffer_sz /= 2;
> -       ch->send = &shared2->ch0;
> -       ch->recv = &shared2->ch1;
> -       ch->send_data = buffer;
> -       ch->recv_data = buffer + buffer_sz;
> -       ch->fifo_size = buffer_sz;
> -       return 0;
> -}
> -
> -static int smd_alloc_v1(struct smd_channel *ch)
> -{
> -       struct smd_shared_v1 *shared1;
> -       shared1 = smem_alloc(ID_SMD_CHANNELS + ch->n, sizeof(*shared1));
> -       if (!shared1) {
> -               pr_err("smd_alloc_channel() cid %d does not exist\n", ch->n);
> -               return -1;
> -       }
> -       ch->send = &shared1->ch0;
> -       ch->recv = &shared1->ch1;
> -       ch->send_data = shared1->data0;
> -       ch->recv_data = shared1->data1;
> -       ch->fifo_size = SMD_BUF_SIZE;
> -       return 0;
> -}
> -
> -
>  static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
>  {
>        struct smd_channel *ch;
> @@ -653,7 +611,7 @@ static int smd_alloc_channel(const char *name, uint32_t cid, uint32_t type)
>        }
>        ch->n = cid;
>
> -       if (smd_alloc_v2(ch) && smd_alloc_v1(ch)) {
> +       if (_smd_alloc_channel(ch)) {
>                kfree(ch);
>                return -1;
>        }
> diff --git a/arch/arm/mach-msm/smd_private.h b/arch/arm/mach-msm/smd_private.h
> index 33a33f1..a403424 100644
> --- a/arch/arm/mach-msm/smd_private.h
> +++ b/arch/arm/mach-msm/smd_private.h
> @@ -61,7 +61,7 @@ struct smem_shared {
>  #define SMSM_V1_SIZE           (sizeof(unsigned) * 8)
>  #define SMSM_V2_SIZE           (sizeof(unsigned) * 4)
>
> -#ifndef CONFIG_ARCH_MSM_SCORPION
> +#ifdef CONFIG_MSM_SMD_PKG3
>  struct smsm_interrupt_info {
>        uint32_t interrupt_mask;
>        uint32_t pending_interrupts;
> @@ -123,7 +123,7 @@ struct msm_dem_slave_data {
>  #define SMSM_WKUP_REASON_ALARM 0x00000010
>  #define SMSM_WKUP_REASON_RESET 0x00000020
>
> -#ifndef CONFIG_ARCH_MSM_SCORPION
> +#ifdef CONFIG_ARCH_MSM7X00A
>  enum smsm_state_item {
>        SMSM_STATE_APPS = 1,
>        SMSM_STATE_MODEM = 3,
> @@ -265,6 +265,7 @@ struct smd_half_channel {
>        unsigned head;
>  } __attribute__(( aligned(4), packed ));
>
> +/* Only used on SMD package v3 on msm7201a */
>  struct smd_shared_v1 {
>        struct smd_half_channel ch0;
>        unsigned char data0[SMD_BUF_SIZE];
> @@ -272,6 +273,7 @@ struct smd_shared_v1 {
>        unsigned char data1[SMD_BUF_SIZE];
>  };
>
> +/* Used on SMD package v4 */
>  struct smd_shared_v2 {
>        struct smd_half_channel ch0;
>        struct smd_half_channel ch1;
> @@ -330,4 +332,56 @@ uint32_t raw_smsm_get_state(enum smsm_state_item item);
>
>  extern void msm_init_last_radio_log(struct module *);
>
> +#ifdef CONFIG_MSM_SMD_PKG3
> +/*
> + * This allocator assumes an SMD Package v3 which only exists on
> + * MSM7x00 SoC's.
> + */
> +static inline int _smd_alloc_channel(struct smd_channel *ch)
> +{
> +       struct smd_shared_v1 *shared1;
> +
> +       shared1 = smem_alloc(ID_SMD_CHANNELS + ch->n, sizeof(*shared1));
> +       if (!shared1) {
> +               pr_err("smd_alloc_channel() cid %d does not exist\n", ch->n);
> +               return -1;
> +       }
> +       ch->send = &shared1->ch0;
> +       ch->recv = &shared1->ch1;
> +       ch->send_data = shared1->data0;
> +       ch->recv_data = shared1->data1;
> +       ch->fifo_size = SMD_BUF_SIZE;
> +       return 0;
> +}
> +#else
> +/*
> + * This allocator assumes an SMD Package v4, the most common
> + * and the default.
> + */
> +static inline int _smd_alloc_channel(struct smd_channel *ch)
> +{
> +       struct smd_shared_v2 *shared2;
> +       void *buffer;
> +       unsigned buffer_sz;
> +
> +       shared2 = smem_alloc(SMEM_SMD_BASE_ID + ch->n, sizeof(*shared2));
> +       buffer = smem_item(SMEM_SMD_FIFO_BASE_ID + ch->n, &buffer_sz);
> +
> +       if (!buffer)
> +               return -1;
> +
> +       /* buffer must be a power-of-two size */
> +       if (buffer_sz & (buffer_sz - 1))
> +               return -1;
> +
> +       buffer_sz /= 2;
> +       ch->send = &shared2->ch0;
> +       ch->recv = &shared2->ch1;
> +       ch->send_data = buffer;
> +       ch->recv_data = buffer + buffer_sz;
> +       ch->fifo_size = buffer_sz;
> +       return 0;
> +}
> +#endif /* CONFIG_ARCH_MSM7X00A */

get rid of the comment


Also, I'm not sure I see the benefit of putting these functions the
way they are as inlines into this header file. There's only a single
call site to this new alloc_channel function, and moving the code out
of the smd.c and putting them here doesn't make anything cleaner.

--Dima

> +
>  #endif
> --
> 1.6.2.3
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux