From: noralf@tronnes.org (Noralf Trønnes)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/3 v2] ARM: bcm2835: Add the Raspberry Pi firmware driver
Date: Sun, 17 May 2015 19:30:06 +0200 [thread overview]
Message-ID: <5558D01E.2070809@tronnes.org> (raw)
In-Reply-To: <1431543609-19646-3-git-send-email-eric@anholt.net>
Den 13.05.2015 21:00, skrev Eric Anholt:
> This gives us a function for making mailbox property channel requests
> of the firmware, which is most notable in that it will let us get and
> set clock rates.
>
> Signed-off-by: Eric Anholt <eric@anholt.net>
> ---
>
> v2: Drop power-domains stuff for now since we don't have the driver
> core support to make it useful. Move to drivers/firmware/.
> Capitalize the enums. De-global the firmware variable. Use the
> firmware device to allocate our DMA buffer, so that the dma-ranges
> DT property gets respected. Simplify the property tag transaction
> interface even more, leaving a multi-tag interface still
> available. For conciseness, rename "raspberrypi" to "rpi" on all
> functions/enums/structs, and the "firmware" variable to "fw".
> Print when the driver is probed successfully, since debugging
> -EPROBE_DEFER handling is such a big part of bcm2835 development.
> Drop -EBUSY mailbox handling since the mailbox core has been fixed
> to return -EPROBE_DEFER in -next.
>
> Note that I don't think I've done what srwarren wanted for
> -EPROBE_DEFER, because I'm not clear what he wants. I think he might
> just be asking for a function that does:
>
> /*
> * Returns 0 if the firmware device is probed and available, otherwise
> * -EPROBE_DEFER.
> */
> int rpi_firmware_get(struct device_node *firmware_node)
> {
> struct platform_device *pdev = of_find_device_by_node(of_node);
> if (!platform_get_drvdata(pdev))
> return -EPROBE_DEFER;
> return 0;
> }
> EXPORT_SYMBOL(rpi_firmware_get)
>
> If that's all, I'm happy to add it.
>
> Note that a client could currently do this:
>
> ret = rpi_firmware_property_list(firmware_node, NULL, 0);
>
> in exchange for a bit of overhead in the case that it's actually probed already.
>
[...]
> diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
[...]
> +int rpi_firmware_property_list(struct device_node *of_node,
> + void *data, size_t tag_size)
> +{
> + struct platform_device *pdev = of_find_device_by_node(of_node);
> + struct rpi_firmware *fw = platform_get_drvdata(pdev);
> + size_t size = tag_size + 12;
> + u32 *buf;
> + dma_addr_t bus_addr;
> + int ret = 0;
> +
> + if (!fw)
> + return -EPROBE_DEFER;
> +
> + /* Packets are processed a dword at a time. */
> + if (size & 3)
> + return -EINVAL;
> +
> + buf = dma_alloc_coherent(fw->cl.dev, PAGE_ALIGN(size), &bus_addr,
[...]
> + dma_free_coherent(NULL, PAGE_ALIGN(size), buf, bus_addr);
Should probably pass the device when freeing as well.
> +static int rpi_firmware_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + int ret = 0;
> + struct rpi_firmware *fw;
> +
> + fw = devm_kzalloc(dev, sizeof(*fw), GFP_KERNEL);
> + if (!fw)
> + return -ENOMEM;
> +
> + fw->cl.dev = dev;
> + fw->cl.rx_callback = response_callback;
> + fw->cl.tx_block = true;
> +
> + fw->chan = mbox_request_channel(&fw->cl, 0);
> + if (IS_ERR(fw->chan)) {
Definition of ret can be move here.
> + ret = PTR_ERR(fw->chan);
> + /* An -EBUSY from the core means it couldn't find our
> + * channel, because the mailbox driver hadn't
> + * registered yet.
> + */
You forgot to remove this comment.
> + if (ret != -EPROBE_DEFER)
> + dev_err(dev, "Failed to get mbox channel: %d\n", ret);
> + return ret;
> + }
Why not turn the comments into kernel-doc comments:
(Thunderbird converts my tabs into spaces, sorry about that)
/**
* struct rpi_firmware_property_tag_header - Firmware property tag header
* @tag: One of enum_mbox_property_tag.
* @buf_size: The number of bytes in the value buffer following this
struct.
* @req_resp_size: On submit, the length of the request (though it doesn't
* appear to be currently used by the firmware). On
return,
* the length of the response (always 4 byte aligned), with
* the low bit set.
*/
struct rpi_firmware_property_tag_header {
u32 tag;
u32 buf_size;
u32 req_resp_size;
};
/**
* rpi_firmware_property_list - Submit firmware property list
* @of_node: Pointer to the firmware Device Tree node.
* @data: Buffer holding tags.
* @tag_size: Size of tags buffer.
*
* Submits a set of concatenated tags to the VPU firmware through the
* mailbox property interface.
*
* The buffer header and the ending tag are added by this function and
* don't need to be supplied, just the actual tags for your operation.
* See struct rpi_firmware_property_tag_header for the per-tag
* structure.
*/
int rpi_firmware_property_list(struct device_node *of_node,
void *data, size_t tag_size)
/**
* rpi_firmware_property - Submit single firmware property
* @of_node: Pointer to the firmware Device Tree node.
* @tag: One of enum_mbox_property_tag.
* @tag_data: Tag data buffer.
* @buf_size: Buffer size.
*
* Submits a single tag to the VPU firmware through the mailbox
* property interface.
*
* This is a convenience wrapper around
* rpi_firmware_property_list() to avoid some of the
* boilerplate in property calls.
*/
int rpi_firmware_property(struct device_node *of_node,
u32 tag, void *tag_data, size_t buf_size)
WARNING: multiple messages have this Message-ID (diff)
From: "Noralf Trønnes" <noralf@tronnes.org>
To: Eric Anholt <eric@anholt.net>, linux-arm-kernel@lists.infradead.org
Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-rpi-kernel@lists.infradead.org
Subject: Re: [PATCH 2/3 v2] ARM: bcm2835: Add the Raspberry Pi firmware driver
Date: Sun, 17 May 2015 19:30:06 +0200 [thread overview]
Message-ID: <5558D01E.2070809@tronnes.org> (raw)
In-Reply-To: <1431543609-19646-3-git-send-email-eric@anholt.net>
Den 13.05.2015 21:00, skrev Eric Anholt:
> This gives us a function for making mailbox property channel requests
> of the firmware, which is most notable in that it will let us get and
> set clock rates.
>
> Signed-off-by: Eric Anholt <eric@anholt.net>
> ---
>
> v2: Drop power-domains stuff for now since we don't have the driver
> core support to make it useful. Move to drivers/firmware/.
> Capitalize the enums. De-global the firmware variable. Use the
> firmware device to allocate our DMA buffer, so that the dma-ranges
> DT property gets respected. Simplify the property tag transaction
> interface even more, leaving a multi-tag interface still
> available. For conciseness, rename "raspberrypi" to "rpi" on all
> functions/enums/structs, and the "firmware" variable to "fw".
> Print when the driver is probed successfully, since debugging
> -EPROBE_DEFER handling is such a big part of bcm2835 development.
> Drop -EBUSY mailbox handling since the mailbox core has been fixed
> to return -EPROBE_DEFER in -next.
>
> Note that I don't think I've done what srwarren wanted for
> -EPROBE_DEFER, because I'm not clear what he wants. I think he might
> just be asking for a function that does:
>
> /*
> * Returns 0 if the firmware device is probed and available, otherwise
> * -EPROBE_DEFER.
> */
> int rpi_firmware_get(struct device_node *firmware_node)
> {
> struct platform_device *pdev = of_find_device_by_node(of_node);
> if (!platform_get_drvdata(pdev))
> return -EPROBE_DEFER;
> return 0;
> }
> EXPORT_SYMBOL(rpi_firmware_get)
>
> If that's all, I'm happy to add it.
>
> Note that a client could currently do this:
>
> ret = rpi_firmware_property_list(firmware_node, NULL, 0);
>
> in exchange for a bit of overhead in the case that it's actually probed already.
>
[...]
> diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
[...]
> +int rpi_firmware_property_list(struct device_node *of_node,
> + void *data, size_t tag_size)
> +{
> + struct platform_device *pdev = of_find_device_by_node(of_node);
> + struct rpi_firmware *fw = platform_get_drvdata(pdev);
> + size_t size = tag_size + 12;
> + u32 *buf;
> + dma_addr_t bus_addr;
> + int ret = 0;
> +
> + if (!fw)
> + return -EPROBE_DEFER;
> +
> + /* Packets are processed a dword at a time. */
> + if (size & 3)
> + return -EINVAL;
> +
> + buf = dma_alloc_coherent(fw->cl.dev, PAGE_ALIGN(size), &bus_addr,
[...]
> + dma_free_coherent(NULL, PAGE_ALIGN(size), buf, bus_addr);
Should probably pass the device when freeing as well.
> +static int rpi_firmware_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + int ret = 0;
> + struct rpi_firmware *fw;
> +
> + fw = devm_kzalloc(dev, sizeof(*fw), GFP_KERNEL);
> + if (!fw)
> + return -ENOMEM;
> +
> + fw->cl.dev = dev;
> + fw->cl.rx_callback = response_callback;
> + fw->cl.tx_block = true;
> +
> + fw->chan = mbox_request_channel(&fw->cl, 0);
> + if (IS_ERR(fw->chan)) {
Definition of ret can be move here.
> + ret = PTR_ERR(fw->chan);
> + /* An -EBUSY from the core means it couldn't find our
> + * channel, because the mailbox driver hadn't
> + * registered yet.
> + */
You forgot to remove this comment.
> + if (ret != -EPROBE_DEFER)
> + dev_err(dev, "Failed to get mbox channel: %d\n", ret);
> + return ret;
> + }
Why not turn the comments into kernel-doc comments:
(Thunderbird converts my tabs into spaces, sorry about that)
/**
* struct rpi_firmware_property_tag_header - Firmware property tag header
* @tag: One of enum_mbox_property_tag.
* @buf_size: The number of bytes in the value buffer following this
struct.
* @req_resp_size: On submit, the length of the request (though it doesn't
* appear to be currently used by the firmware). On
return,
* the length of the response (always 4 byte aligned), with
* the low bit set.
*/
struct rpi_firmware_property_tag_header {
u32 tag;
u32 buf_size;
u32 req_resp_size;
};
/**
* rpi_firmware_property_list - Submit firmware property list
* @of_node: Pointer to the firmware Device Tree node.
* @data: Buffer holding tags.
* @tag_size: Size of tags buffer.
*
* Submits a set of concatenated tags to the VPU firmware through the
* mailbox property interface.
*
* The buffer header and the ending tag are added by this function and
* don't need to be supplied, just the actual tags for your operation.
* See struct rpi_firmware_property_tag_header for the per-tag
* structure.
*/
int rpi_firmware_property_list(struct device_node *of_node,
void *data, size_t tag_size)
/**
* rpi_firmware_property - Submit single firmware property
* @of_node: Pointer to the firmware Device Tree node.
* @tag: One of enum_mbox_property_tag.
* @tag_data: Tag data buffer.
* @buf_size: Buffer size.
*
* Submits a single tag to the VPU firmware through the mailbox
* property interface.
*
* This is a convenience wrapper around
* rpi_firmware_property_list() to avoid some of the
* boilerplate in property calls.
*/
int rpi_firmware_property(struct device_node *of_node,
u32 tag, void *tag_data, size_t buf_size)
next prev parent reply other threads:[~2015-05-17 17:30 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-13 19:00 RPi firmware driver v2 Eric Anholt
2015-05-13 19:00 ` Eric Anholt
2015-05-13 19:00 ` [PATCH 1/3 v2] dt/bindings: Add binding for the Raspberry Pi firmware driver Eric Anholt
2015-05-13 19:00 ` Eric Anholt
2015-05-14 8:40 ` Lee Jones
2015-05-14 8:40 ` Lee Jones
2015-05-14 8:40 ` Lee Jones
2015-05-14 9:57 ` Eric Anholt
2015-05-14 9:57 ` Eric Anholt
2015-05-14 9:57 ` Eric Anholt
2015-05-17 17:11 ` Noralf Trønnes
2015-05-17 17:11 ` Noralf Trønnes
2015-05-18 17:59 ` [PATCH 1/3 v3] " Eric Anholt
2015-05-18 17:59 ` Eric Anholt
2015-05-28 21:12 ` Stephen Warren
2015-05-28 21:12 ` Stephen Warren
2015-05-28 21:12 ` Stephen Warren
2015-05-13 19:00 ` [PATCH 2/3 v2] ARM: bcm2835: Add " Eric Anholt
2015-05-13 19:00 ` Eric Anholt
2015-05-13 19:00 ` Eric Anholt
2015-05-17 17:30 ` Noralf Trønnes [this message]
2015-05-17 17:30 ` Noralf Trønnes
2015-05-17 18:26 ` Noralf Trønnes
2015-05-17 18:26 ` Noralf Trønnes
2015-05-17 18:26 ` Noralf Trønnes
2015-05-18 17:34 ` Eric Anholt
2015-05-18 17:34 ` Eric Anholt
2015-05-18 18:00 ` [PATCH 2/3 v3] " Eric Anholt
2015-05-18 18:00 ` Eric Anholt
[not found] ` <20150528112610.GO11677@x1>
2015-05-28 11:45 ` [PATCH 2/3 v2] " Lee Jones
2015-05-28 11:45 ` Lee Jones
2015-05-28 11:45 ` Lee Jones
2015-05-28 18:33 ` [PATCH 2/3 v4] " Eric Anholt
2015-05-28 18:33 ` Eric Anholt
2015-05-28 18:33 ` Eric Anholt
2015-05-28 21:28 ` Stephen Warren
2015-05-28 21:28 ` Stephen Warren
2015-05-28 21:39 ` Noralf Trønnes
2015-05-28 21:39 ` Noralf Trønnes
2015-05-28 21:39 ` Noralf Trønnes
2015-05-28 22:09 ` Stephen Warren
2015-05-28 22:09 ` Stephen Warren
2015-05-28 22:09 ` Stephen Warren
2015-05-28 22:36 ` Eric Anholt
2015-05-28 22:36 ` Eric Anholt
2015-05-28 21:42 ` Noralf Trønnes
2015-05-28 21:42 ` Noralf Trønnes
2015-05-28 22:10 ` Stephen Warren
2015-05-28 22:10 ` Stephen Warren
2015-05-28 22:10 ` Stephen Warren
2015-05-28 22:38 ` Eric Anholt
2015-05-28 22:38 ` Eric Anholt
2015-05-28 22:38 ` Eric Anholt
2015-05-28 22:43 ` Noralf Trønnes
2015-05-28 22:43 ` Noralf Trønnes
2015-05-28 22:43 ` Noralf Trønnes
2015-05-28 21:17 ` [PATCH 2/3 v2] " Stephen Warren
2015-05-28 21:17 ` Stephen Warren
2015-05-28 21:17 ` Stephen Warren
2015-05-28 22:40 ` Noralf Trønnes
2015-05-28 22:40 ` Noralf Trønnes
2015-05-28 22:40 ` Noralf Trønnes
2015-05-13 19:00 ` [PATCH 3/3 v2] ARM: bcm2835: Add the firmware driver information to the RPi DT Eric Anholt
2015-05-13 19:00 ` Eric Anholt
2015-05-28 21:29 ` Stephen Warren
2015-05-28 21:29 ` Stephen Warren
2015-05-28 21:29 ` Stephen Warren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5558D01E.2070809@tronnes.org \
--to=noralf@tronnes.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.