From: "Andrew F. Davis" <afd@ti.com>
To: Roger Quadros <rogerq@ti.com>,
tony@atomide.com, ohad@wizery.com, bjorn.andersson@linaro.org
Cc: s-anna@ti.com, david@lechnology.com, nsekhar@ti.com,
t-kristo@ti.com, nsaulnier@ti.com, jreeder@ti.com,
m-karicheri2@ti.com, woods.technical@gmail.com,
linux-omap@vger.kernel.org, linux-remoteproc@vger.kernel.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH v2 06/14] remoteproc: add page lookup for TI PRU to ELF loader
Date: Mon, 4 Feb 2019 09:19:30 -0600 [thread overview]
Message-ID: <2b70cee5-70fe-9b10-5111-4dc23538b20c@ti.com> (raw)
In-Reply-To: <1549290167-876-7-git-send-email-rogerq@ti.com>
On 2/4/19 8:22 AM, Roger Quadros wrote:
> From: David Lechner <david@lechnology.com>
>
> This adds a special handler to the default remoteproc ELF firmware
> loader that looks up the memory map on TI PRU firmware files.
>
> These processors have multiple memory maps that share the same address
> space, so we need to know the page in addition to the physical address
> in order to translate the address to a local CPU address.
>
> Signed-off-by: David Lechner <david@lechnology.com>
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
> drivers/remoteproc/remoteproc_elf_loader.c | 117 +++++++++++++++++++++++++++--
> include/uapi/linux/elf-em.h | 1 +
> 2 files changed, 112 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c
> index 8888d39..79c9d39 100644
> --- a/drivers/remoteproc/remoteproc_elf_loader.c
> +++ b/drivers/remoteproc/remoteproc_elf_loader.c
> @@ -32,6 +32,103 @@
>
> #include "remoteproc_internal.h"
>
> +#define SHT_TI_PHATTRS 0x7F000004
> +#define SHT_TI_SH_PAGE 0x7F000007
> +
> +struct elf32_ti_phattrs {
> + Elf32_Half pha_seg_id; /* Segment id */
> + Elf32_Half pha_tag_id; /* Attribute kind id */
> + union {
> + Elf32_Off pha_offset; /* byte offset within the section */
> + Elf32_Word pha_value; /* Constant tag value */
> + } pha_un;
> +};
> +
> +/* this struct is reverse engineered, so not sure what most of the values are */
Do we really not know? Someone should go check this, if they are not
used then for now label them "unused", not "unknown".
Andrew
> +struct ti_section_page {
> + u32 unk0;
> + u32 unk1;
> + u32 unk2;
> + u32 unk3;
> + u32 unk4;
> + u16 size;
> + u16 unk5;
> + u16 unk6;
> + u8 data[0]; /* array of size */
> +};
> +
> +/**
> + * rproc_elf_segment_to_map() - Gets memory map for segment
> + * @id: segment id
> + * @elf_data: pointer to ELF file data
> + *
> + * Returns the memory map for the segment.
> + */
> +static int rproc_elf_segment_to_map(u32 id, const u8 *elf_data)
> +{
> + struct elf32_hdr *ehdr;
> + struct elf32_shdr *shdr;
> + struct elf32_ti_phattrs *ti_attrs = NULL;
> + int i;
> +
> + ehdr = (struct elf32_hdr *)elf_data;
> + shdr = (struct elf32_shdr *)(elf_data + ehdr->e_shoff);
> +
> + if (ehdr->e_machine != EM_TI_PRU)
> + return 0;
> +
> + for (i = 0; i < ehdr->e_shnum; i++, shdr++) {
> + if (shdr->sh_type == SHT_TI_PHATTRS) {
> + ti_attrs = (struct elf32_ti_phattrs *)(elf_data + shdr->sh_offset);
> + break;
> + }
> + }
> +
> + if (!ti_attrs)
> + return 0;
> +
> + /* list is terminated by tag id == 0 (PHA_NULL) */
> + for (; ti_attrs->pha_tag_id; ti_attrs++) {
> + if (ti_attrs->pha_tag_id == 3 && ti_attrs->pha_seg_id == id)
> + return ti_attrs->pha_un.pha_value;
> + }
> +
> + return 0;
> +}
> +
> +/**
> + * rproc_elf_section_to_map() - Gets memory map for section
> + * @id: segment id
> + * @elf_data: pointer to ELF file data
> + *
> + * Returns the memory map for the section.
> + */
> +static int rproc_elf_section_to_map(u32 id, const u8 *elf_data)
> +{
> + struct elf32_hdr *ehdr;
> + struct elf32_shdr *shdr;
> + struct ti_section_page *map = NULL;
> + int i;
> +
> + ehdr = (struct elf32_hdr *)elf_data;
> + shdr = (struct elf32_shdr *)(elf_data + ehdr->e_shoff);
> +
> + if (ehdr->e_machine != EM_TI_PRU)
> + return 0;
> +
> + for (i = 0; i < ehdr->e_shnum; i++, shdr++) {
> + if (shdr->sh_type == SHT_TI_SH_PAGE) {
> + map = (struct ti_section_page *)(elf_data + shdr->sh_offset);
> + break;
> + }
> + }
> +
> + if (!map || id >= map->size)
> + return 0;
> +
> + return map->data[id];
> +}
> +
> /**
> * rproc_elf_sanity_check() - Sanity Check ELF firmware image
> * @rproc: the remote processor handle
> @@ -147,7 +244,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
> struct device *dev = &rproc->dev;
> struct elf32_hdr *ehdr;
> struct elf32_phdr *phdr;
> - int i, ret = 0;
> + int i, map, ret = 0;
> const u8 *elf_data = fw->data;
>
> ehdr = (struct elf32_hdr *)elf_data;
> @@ -181,8 +278,10 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
> break;
> }
>
> + map = rproc_elf_segment_to_map(i, elf_data);
> +
> /* grab the kernel address for this device address */
> - ptr = rproc_da_to_va(rproc, da, memsz, 0);
> + ptr = rproc_da_to_va(rproc, da, memsz, map);
> if (!ptr) {
> dev_err(dev, "bad phdr da 0x%x mem 0x%x\n", da, memsz);
> ret = -EINVAL;
> @@ -209,7 +308,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
> EXPORT_SYMBOL(rproc_elf_load_segments);
>
> static struct elf32_shdr *
> -find_table(struct device *dev, struct elf32_hdr *ehdr, size_t fw_size)
> +find_table(struct device *dev, struct elf32_hdr *ehdr, size_t fw_size, int *id)
> {
> struct elf32_shdr *shdr;
> int i;
> @@ -261,6 +360,9 @@ find_table(struct device *dev, struct elf32_hdr *ehdr, size_t fw_size)
> return NULL;
> }
>
> + if (id)
> + *id = i;
> +
> return shdr;
> }
>
> @@ -288,7 +390,7 @@ int rproc_elf_load_rsc_table(struct rproc *rproc, const struct firmware *fw)
>
> ehdr = (struct elf32_hdr *)elf_data;
>
> - shdr = find_table(dev, ehdr, fw->size);
> + shdr = find_table(dev, ehdr, fw->size, NULL);
> if (!shdr)
> return -EINVAL;
>
> @@ -328,11 +430,14 @@ struct resource_table *rproc_elf_find_loaded_rsc_table(struct rproc *rproc,
> {
> struct elf32_hdr *ehdr = (struct elf32_hdr *)fw->data;
> struct elf32_shdr *shdr;
> + int id, map;
>
> - shdr = find_table(&rproc->dev, ehdr, fw->size);
> + shdr = find_table(&rproc->dev, ehdr, fw->size, &id);
> if (!shdr)
> return NULL;
>
> - return rproc_da_to_va(rproc, shdr->sh_addr, shdr->sh_size, 0);
> + map = rproc_elf_section_to_map(id, fw->data);
> +
> + return rproc_da_to_va(rproc, shdr->sh_addr, shdr->sh_size, map);
> }
> EXPORT_SYMBOL(rproc_elf_find_loaded_rsc_table);
> diff --git a/include/uapi/linux/elf-em.h b/include/uapi/linux/elf-em.h
> index 0c3000fa..70b487a 100644
> --- a/include/uapi/linux/elf-em.h
> +++ b/include/uapi/linux/elf-em.h
> @@ -38,6 +38,7 @@
> #define EM_BLACKFIN 106 /* ADI Blackfin Processor */
> #define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */
> #define EM_TI_C6000 140 /* TI C6X DSPs */
> +#define EM_TI_PRU 144 /* TI Programmable Realtime Unit */
> #define EM_AARCH64 183 /* ARM 64 bit */
> #define EM_TILEPRO 188 /* Tilera TILEPro */
> #define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */
>
next prev parent reply other threads:[~2019-02-04 15:19 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-04 14:22 [PATCH v2 00/14] Add support for TI PRU ICSS Roger Quadros
2019-02-04 14:22 ` [PATCH v2 01/14] dt-bindings: remoteproc: Add TI PRUSS bindings Roger Quadros
2019-02-04 16:33 ` Tony Lindgren
2019-02-05 9:39 ` Roger Quadros
2019-02-05 15:08 ` Murali Karicheri
2019-02-05 15:41 ` Roger Quadros
2019-02-05 16:15 ` Murali Karicheri
2019-02-05 16:19 ` Tony Lindgren
2019-02-06 15:04 ` Roger Quadros
2019-02-14 2:47 ` Suman Anna
2019-02-05 16:41 ` Tony Lindgren
2019-02-14 3:01 ` Suman Anna
2019-02-08 13:51 ` Linus Walleij
2019-02-14 3:12 ` Suman Anna
2019-02-14 8:37 ` Linus Walleij
2019-02-14 10:55 ` Roger Quadros
[not found] ` <86ef8asfap.wl-marc.zyngier@arm.com>
2019-02-14 15:44 ` Roger Quadros
2019-02-14 15:48 ` Roger Quadros
2019-02-15 0:59 ` Suman Anna
2019-02-20 9:51 ` Linus Walleij
2019-02-14 15:51 ` Marc Zyngier
2019-02-14 16:50 ` Roger Quadros
2019-02-14 2:52 ` Suman Anna
2019-02-14 11:08 ` Roger Quadros
2019-02-14 15:56 ` Tony Lindgren
2019-02-15 1:22 ` Suman Anna
2019-02-15 1:08 ` Suman Anna
2019-02-15 13:43 ` Matthijs van Duin
2019-02-04 14:22 ` [PATCH v2 02/14] soc: ti: pruss: Add a platform driver for PRUSS in TI SoCs Roger Quadros
2019-02-04 14:52 ` Andrew F. Davis
2019-02-04 15:32 ` Roger Quadros
2019-02-04 16:35 ` Tony Lindgren
2019-02-04 14:22 ` [PATCH v2 03/14] dt-binding: irqchip: Add pruss-intc-irq driver for PRUSS interrupts Roger Quadros
2019-02-04 16:36 ` Tony Lindgren
2019-02-14 2:40 ` Suman Anna
2019-02-18 19:32 ` Rob Herring
2019-02-04 14:22 ` [PATCH v2 04/14] irqchip: pruss: Add a PRUSS irqchip " Roger Quadros
2019-02-04 15:11 ` Andrew F. Davis
2019-02-04 15:33 ` Roger Quadros
2019-02-05 8:51 ` Roger Quadros
2019-02-14 2:15 ` Suman Anna
2019-02-04 18:15 ` Tony Lindgren
2019-02-05 10:35 ` Roger Quadros
2019-02-05 11:04 ` Marc Zyngier
2019-02-14 2:16 ` Suman Anna
2019-02-04 14:22 ` [PATCH v2 05/14] remoteproc: add map parameter to da_to_va Roger Quadros
2019-02-04 14:22 ` [PATCH v2 06/14] remoteproc: add page lookup for TI PRU to ELF loader Roger Quadros
2019-02-04 15:19 ` Andrew F. Davis [this message]
2019-02-14 2:22 ` Suman Anna
2019-02-04 14:22 ` [PATCH v2 07/14] remoteproc: Add a rproc_set_firmware() API Roger Quadros
2019-02-04 14:22 ` [PATCH v2 08/14] remoteproc: Add support to handle device specific resource types Roger Quadros
2019-02-04 14:22 ` [PATCH v2 09/14] dt-binding: remoteproc: Add binding doc for PRU Cores in the PRU-ICSS Roger Quadros
2019-02-18 19:36 ` Rob Herring
2019-02-04 14:22 ` [PATCH v2 10/14] remoteproc/pru: Add PRU remoteproc driver Roger Quadros
2019-02-14 2:35 ` Suman Anna
2019-02-14 3:44 ` Suman Anna
2019-02-04 14:22 ` [PATCH v2 11/14] remoteproc/pru: Add pru_rproc_set_ctable() and pru_rproc_set_gpimode() Roger Quadros
2019-02-04 14:22 ` [PATCH v2 12/14] remoteproc/pru: Add support for virtio rpmsg stack Roger Quadros
2019-02-04 14:22 ` [PATCH v2 13/14] rpmsg: virtio_rpmsg_bus: move back rpmsg_hdr into a public header Roger Quadros
2019-02-04 14:22 ` [PATCH v2 14/14] rpmsg: pru: add a PRU RPMsg driver Roger Quadros
2019-02-04 15:26 ` Andrew F. Davis
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=2b70cee5-70fe-9b10-5111-4dc23538b20c@ti.com \
--to=afd@ti.com \
--cc=bjorn.andersson@linaro.org \
--cc=david@lechnology.com \
--cc=devicetree@vger.kernel.org \
--cc=jreeder@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=m-karicheri2@ti.com \
--cc=nsaulnier@ti.com \
--cc=nsekhar@ti.com \
--cc=ohad@wizery.com \
--cc=rogerq@ti.com \
--cc=s-anna@ti.com \
--cc=t-kristo@ti.com \
--cc=tony@atomide.com \
--cc=woods.technical@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).