Re: [PATCH v5 1/2] Mailbox: Add support for Platform Communication Channel

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

 



Hi Arnd,

On 4 September 2014 04:56, Arnd Bergmann <arnd@xxxxxxxx> wrote:
> On Wednesday 03 September 2014 18:19:19 Ashwin Chaugule wrote:
>> ACPI 5.0+ spec defines a generic mode of communication
>> between the OS and a platform such as the BMC. This medium
>> (PCC) is typically used by CPPC (ACPI CPU Performance management),
>> RAS (ACPI reliability protocol) and MPST (ACPI Memory power
>> states).
>
> Ok, the interaction with the mailbox subsystem looks much nicer now!

Cool. Thanks for the help!

>
> Some comments on the actual driver:
>
>> +struct mbox_chan *pcc_mbox_request_channel(struct mbox_client *cl,
>> +             int index)
>> +{
>> +     struct device *dev = pcc_mbox_ctrl.dev;
>> +     struct mbox_chan *chan;
>> +     unsigned long flags;
>> +
>> +     /*
>> +      * Each PCC Subspace is a Mailbox Channel.
>> +      * The PCC Clients get their PCC Subspace ID
>> +      * from their own tables and pass it here.
>> +      * This returns a pointer to the PCC subspace
>> +      * for the Client to operate on.
>> +      */
>> +     chan = &pcc_mbox_chan[index];
>> +
>> +     if (!chan || chan->cl || !try_module_get(dev->driver->owner)) {
>> +             dev_err(dev, "%s: PCC mailbox not free\n", __func__);
>> +             return ERR_PTR(-EBUSY);
>> +     }
>
> The try_module_get is now pointless, since dev->driver->owner is
> the current module.

:) Yea, it occurred to me as well, but I wasn't too sure.

>
>> +static int get_subspace_id(struct mbox_chan *chan)
>> +{
>> +     unsigned int i;
>> +
>> +     for (i = 0; i < pcc_mbox_ctrl.num_chans; i++) {
>> +             if (chan == &pcc_mbox_chan[i])
>> +                     return i;
>> +     }
>> +
>> +     return -ENOENT;
>> +}
>
> Isn't this the same as this?
>
>         int id = chan - pcc_mbox_chan;
>         if (id < 0 || id > pcc_mbox_ctrl.num_chans
>                 return -ENOENT;
>         return id;

Seems better.

>
>> +/* Channel lock is already held by mbox controller code. */
>> +static int pcc_send_data(struct mbox_chan *chan, void *data)
>> +{
>> +     struct acpi_pcct_subspace *pcct_ss = chan->con_priv;
>> +     struct acpi_pcct_shared_memory *generic_comm_base =
>> +             (struct acpi_pcct_shared_memory *) pcct_ss->base_address;
>> +     struct acpi_generic_address doorbell;
>> +     u64 doorbell_preserve;
>> +     u64 doorbell_val;
>> +     u64 doorbell_write;
>> +     u16 cmd = 0;
>> +     u16 ss_idx = -1;
>> +     int ret = 0;
>> +
>> +     /* Get PCC CMD */
>> +     ret = kstrtou16((char*)data, 0, &cmd);
>
> What is this supposed to do? Why would a client pass data as a string?
> Just make it a u16 pointer and force the client to do the conversion
> so you have a proper format.
>
> Mailbox drivers should generally have a fixed-format mailbox data pointer.
>

Ok.

>> +     /* Write to the shared comm region. */
>> +     iowrite16(cmd, &generic_comm_base->command);
>> +
>> +     /* Write Subspace MAGIC value so platform can identify destination. */
>> +     iowrite32((PCCS_SS_SIG_MAGIC | ss_idx), &generic_comm_base->signature);
>> +
>> +     /* Flip CMD COMPLETE bit */
>> +     iowrite16(0, &generic_comm_base->status);
>
> using writel_relaxed/writew_relaxed should be more efficient here.
>

Ok.

>> + * Create a virtual device to back the PCCT, so
>> + * that the generic Mailbox framework can do its
>> + * ref counting.
>> + */
>> +struct platform_device pcc_pdev = {
>> +     .name = "PCCT",
>> +};
>
> Don't declare platform devices statically in C code, just
> use platform_create_bundle() here to create the device dynamically
> and bind it to the driver. That will also simplify the driver
> initalization.
>

Nice. Didn't know about this.

>> diff --git a/include/linux/mailbox_controller.h b/include/linux/mailbox_controller.h
>> index 9ee195b..956cc06 100644
>> --- a/include/linux/mailbox_controller.h
>> +++ b/include/linux/mailbox_controller.h
>> @@ -15,6 +15,10 @@
>>
>>  struct mbox_chan;
>>
>> +#define TXDONE_BY_IRQ        BIT(0) /* controller has remote RTR irq */
>> +#define TXDONE_BY_POLL       BIT(1) /* controller can read status of last TX */
>> +#define TXDONE_BY_ACK        BIT(2) /* S/W ACK recevied by Client ticks the TX */
>> +
>>  /**
>>   * struct mbox_chan_ops - methods to control mailbox channels
>>   * @send_data:       The API asks the MBOX controller driver, in atomic
>>
>
> I don't think we want these in a global header file. Better put them in
> a local header file in drivers/mailbox/.
>

Ok.

Thanks,
Ashwin
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux