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

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

 



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!

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.

> +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; 

> +/* 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.

> +	/* 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.

> + * 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.

> 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/.

	Arnd
--
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