All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lina Iyer <ilina@codeaurora.org>
To: Stephen Boyd <swboyd@chromium.org>
Cc: Andy Gross <andy.gross@linaro.org>,
	linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Mahesh Sivasubramanian <msivasub@codeaurora.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Evan Green <evgreen@chromium.org>
Subject: Re: [PATCH v3] soc: qcom: cmd-db: Make endian-agnostic
Date: Mon, 23 Apr 2018 11:22:30 -0600	[thread overview]
Message-ID: <20180423172230.GD18235@codeaurora.org> (raw)
In-Reply-To: <20180423162054.238544-1-swboyd@chromium.org>

On Mon, Apr 23 2018 at 10:21 -0600, Stephen Boyd wrote:
>This driver deals with memory that is stored in little-endian format.
>Update the structures with the proper little-endian types and then
>do the proper conversions when reading the fields. Note that we compare
>the ids with a memcmp() because we already pad out the string 'id' field
>to exactly 8 bytes with the strncpy() onto the stack.
>
>Cc: Mahesh Sivasubramanian <msivasub@codeaurora.org>
>Cc: Lina Iyer <ilina@codeaurora.org>
>Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
>Cc: Evan Green <evgreen@chromium.org>
>Signed-off-by: Stephen Boyd <swboyd@chromium.org>
>---
>
Tested-by: Lina Iyer <ilina@codeaurora.org>

>Changes from v2:
> * Fixed rsc_offset conversion to use data_offset instead of header_offset
>   for finding first offset
> * Tested and confirmed slave ids and aux data for ARC regulators look
>   the same as before
>
>Changes from v1:
> * Fixed negation on probe time magic matches check to be correct
> * Fixed kernel doc and renamed magic_num to magic
> * Killed cmd_db_get_header_by_rsc_id() entirely
> * Changed chars to u8s for simplicity of thinking about signedness
> * Fixed cmd_db_get_header()'s memcmp to do the right thing by checking
>   for a match instead of the opposite
> * Tested on real hardware
>
> drivers/soc/qcom/cmd-db.c | 131 ++++++++++++++++++++------------------
> 1 file changed, 69 insertions(+), 62 deletions(-)
>
>diff --git a/drivers/soc/qcom/cmd-db.c b/drivers/soc/qcom/cmd-db.c
>index b5172049f608..a6f646295f06 100644
>--- a/drivers/soc/qcom/cmd-db.c
>+++ b/drivers/soc/qcom/cmd-db.c
>@@ -13,18 +13,9 @@
>
> #define NUM_PRIORITY		2
> #define MAX_SLV_ID		8
>-#define CMD_DB_MAGIC		0x0C0330DBUL
> #define SLAVE_ID_MASK		0x7
> #define SLAVE_ID_SHIFT		16
>
>-#define ENTRY_HEADER(hdr)	((void *)cmd_db_header +	\
>-				sizeof(*cmd_db_header) +	\
>-				hdr->header_offset)
>-
>-#define RSC_OFFSET(hdr, ent)	((void *)cmd_db_header +	\
>-				sizeof(*cmd_db_header) +	\
>-				hdr.data_offset + ent.offset)
>-
> /**
>  * struct entry_header: header for each entry in cmddb
>  *
>@@ -35,11 +26,11 @@
>  * @offset: offset from :@data_offset, start of the data
>  */
> struct entry_header {
>-	u64 id;
>-	u32 priority[NUM_PRIORITY];
>-	u32 addr;
>-	u16 len;
>-	u16 offset;
>+	u8 id[8];
>+	__le32 priority[NUM_PRIORITY];
>+	__le32 addr;
>+	__le16 len;
>+	__le16 offset;
> };
>
> /**
>@@ -53,30 +44,30 @@ struct entry_header {
>  * @reserved: reserved for future use.
>  */
> struct rsc_hdr {
>-	u16 slv_id;
>-	u16 header_offset;
>-	u16 data_offset;
>-	u16 cnt;
>-	u16 version;
>-	u16 reserved[3];
>+	__le16 slv_id;
>+	__le16 header_offset;
>+	__le16 data_offset;
>+	__le16 cnt;
>+	__le16 version;
>+	__le16 reserved[3];
> };
>
> /**
>  * struct cmd_db_header: The DB header information
>  *
>  * @version: The cmd db version
>- * @magic_number: constant expected in the database
>+ * @magic: constant expected in the database
>  * @header: array of resources
>  * @checksum: checksum for the header. Unused.
>  * @reserved: reserved memory
>  * @data: driver specific data
>  */
> struct cmd_db_header {
>-	u32 version;
>-	u32 magic_num;
>+	__le32 version;
>+	u8 magic[4];
> 	struct rsc_hdr header[MAX_SLV_ID];
>-	u32 checksum;
>-	u32 reserved;
>+	__le32 checksum;
>+	__le32 reserved;
> 	u8 data[];
> };
>
>@@ -99,8 +90,34 @@ struct cmd_db_header {
>  * h/w accelerator and request a resource state.
>  */
>
>+static const u8 CMD_DB_MAGIC[] = { 0xdb, 0x30, 0x03, 0x0c };
>+
>+static bool cmd_db_magic_matches(const struct cmd_db_header *header)
>+{
>+	const u8 *magic = header->magic;
>+
>+	return memcmp(magic, CMD_DB_MAGIC, ARRAY_SIZE(CMD_DB_MAGIC)) == 0;
>+}
>+
> static struct cmd_db_header *cmd_db_header;
>
>+
>+static inline void *rsc_to_entry_header(struct rsc_hdr *hdr)
>+{
>+	u16 offset = le16_to_cpu(hdr->header_offset);
>+
>+	return cmd_db_header->data + offset;
>+}
>+
>+static inline void *
>+rsc_offset(struct rsc_hdr *hdr, struct entry_header *ent)
>+{
>+	u16 offset = le16_to_cpu(hdr->data_offset);
>+	u16 loffset = le16_to_cpu(ent->offset);
>+
>+	return cmd_db_header->data + offset + loffset;
>+}
>+
> /**
>  * cmd_db_ready - Indicates if command DB is available
>  *
>@@ -110,29 +127,20 @@ int cmd_db_ready(void)
> {
> 	if (cmd_db_header == NULL)
> 		return -EPROBE_DEFER;
>-	else if (cmd_db_header->magic_num != CMD_DB_MAGIC)
>+	else if (!cmd_db_magic_matches(cmd_db_header))
> 		return -EINVAL;
>
> 	return 0;
> }
> EXPORT_SYMBOL(cmd_db_ready);
>
>-static u64 cmd_db_get_u64_id(const char *id)
>-{
>-	u64 rsc_id = 0;
>-	u8 *ch = (u8 *)&rsc_id;
>-
>-	strncpy(ch, id, min(strlen(id), sizeof(rsc_id)));
>-
>-	return rsc_id;
>-}
>-
>-static int cmd_db_get_header(u64 query, struct entry_header *eh,
>+static int cmd_db_get_header(const char *id, struct entry_header *eh,
> 			     struct rsc_hdr *rh)
> {
> 	struct rsc_hdr *rsc_hdr;
> 	struct entry_header *ent;
> 	int ret, i, j;
>+	u8 query[8];
>
> 	ret = cmd_db_ready();
> 	if (ret)
>@@ -141,18 +149,21 @@ static int cmd_db_get_header(u64 query, struct entry_header *eh,
> 	if (!eh || !rh)
> 		return -EINVAL;
>
>+	/* Pad out query string to same length as in DB */
>+	strncpy(query, id, sizeof(query));
>+
> 	for (i = 0; i < MAX_SLV_ID; i++) {
> 		rsc_hdr = &cmd_db_header->header[i];
> 		if (!rsc_hdr->slv_id)
> 			break;
>
>-		ent = ENTRY_HEADER(rsc_hdr);
>-		for (j = 0; j < rsc_hdr->cnt; j++, ent++) {
>-			if (ent->id == query)
>+		ent = rsc_to_entry_header(rsc_hdr);
>+		for (j = 0; j < le16_to_cpu(rsc_hdr->cnt); j++, ent++) {
>+			if (memcmp(ent->id, query, sizeof(ent->id)) == 0)
> 				break;
> 		}
>
>-		if (j < rsc_hdr->cnt) {
>+		if (j < le16_to_cpu(rsc_hdr->cnt)) {
> 			memcpy(eh, ent, sizeof(*ent));
> 			memcpy(rh, rsc_hdr, sizeof(*rh));
> 			return 0;
>@@ -162,15 +173,6 @@ static int cmd_db_get_header(u64 query, struct entry_header *eh,
> 	return -ENODEV;
> }
>
>-static int cmd_db_get_header_by_rsc_id(const char *id,
>-				       struct entry_header *ent_hdr,
>-				       struct rsc_hdr *rsc_hdr)
>-{
>-	u64 rsc_id = cmd_db_get_u64_id(id);
>-
>-	return cmd_db_get_header(rsc_id, ent_hdr, rsc_hdr);
>-}
>-
> /**
>  * cmd_db_read_addr() - Query command db for resource id address.
>  *
>@@ -187,9 +189,9 @@ u32 cmd_db_read_addr(const char *id)
> 	struct entry_header ent;
> 	struct rsc_hdr rsc_hdr;
>
>-	ret = cmd_db_get_header_by_rsc_id(id, &ent, &rsc_hdr);
>+	ret = cmd_db_get_header(id, &ent, &rsc_hdr);
>
>-	return ret < 0 ? 0 : ent.addr;
>+	return ret < 0 ? 0 : le32_to_cpu(ent.addr);
> }
> EXPORT_SYMBOL(cmd_db_read_addr);
>
>@@ -207,19 +209,21 @@ int cmd_db_read_aux_data(const char *id, u8 *data, size_t len)
> 	int ret;
> 	struct entry_header ent;
> 	struct rsc_hdr rsc_hdr;
>+	u16 ent_len;
>
> 	if (!data)
> 		return -EINVAL;
>
>-	ret = cmd_db_get_header_by_rsc_id(id, &ent, &rsc_hdr);
>+	ret = cmd_db_get_header(id, &ent, &rsc_hdr);
> 	if (ret)
> 		return ret;
>
>-	if (len < ent.len)
>+	ent_len = le16_to_cpu(ent.len);
>+	if (len < ent_len)
> 		return -EINVAL;
>
>-	len = min_t(u16, ent.len, len);
>-	memcpy(data, RSC_OFFSET(rsc_hdr, ent), len);
>+	len = min_t(u16, ent_len, len);
>+	memcpy(data, rsc_offset(&rsc_hdr, &ent), len);
>
> 	return len;
> }
>@@ -238,9 +242,9 @@ size_t cmd_db_read_aux_data_len(const char *id)
> 	struct entry_header ent;
> 	struct rsc_hdr rsc_hdr;
>
>-	ret = cmd_db_get_header_by_rsc_id(id, &ent, &rsc_hdr);
>+	ret = cmd_db_get_header(id, &ent, &rsc_hdr);
>
>-	return ret < 0 ? 0 : ent.len;
>+	return ret < 0 ? 0 : le16_to_cpu(ent.len);
> }
> EXPORT_SYMBOL(cmd_db_read_aux_data_len);
>
>@@ -256,11 +260,14 @@ enum cmd_db_hw_type cmd_db_read_slave_id(const char *id)
> 	int ret;
> 	struct entry_header ent;
> 	struct rsc_hdr rsc_hdr;
>+	u32 addr;
>
>-	ret = cmd_db_get_header_by_rsc_id(id, &ent, &rsc_hdr);
>+	ret = cmd_db_get_header(id, &ent, &rsc_hdr);
>+	if (ret < 0)
>+		return CMD_DB_HW_INVALID;
>
>-	return ret < 0 ? CMD_DB_HW_INVALID :
>-		       (ent.addr >> SLAVE_ID_SHIFT) & SLAVE_ID_MASK;
>+	addr = le32_to_cpu(ent.addr);
>+	return (addr >> SLAVE_ID_SHIFT) & SLAVE_ID_MASK;
> }
> EXPORT_SYMBOL(cmd_db_read_slave_id);
>
>@@ -282,7 +289,7 @@ static int cmd_db_dev_probe(struct platform_device *pdev)
> 		return ret;
> 	}
>
>-	if (cmd_db_header->magic_num != CMD_DB_MAGIC) {
>+	if (!cmd_db_magic_matches(cmd_db_header)) {
> 		dev_err(&pdev->dev, "Invalid Command DB Magic\n");
> 		return -EINVAL;
> 	}
>--
>Sent by a computer through tubes
>

      reply	other threads:[~2018-04-23 17:22 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-23 16:20 [PATCH v3] soc: qcom: cmd-db: Make endian-agnostic Stephen Boyd
2018-04-23 17:22 ` Lina Iyer [this message]

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=20180423172230.GD18235@codeaurora.org \
    --to=ilina@codeaurora.org \
    --cc=andy.gross@linaro.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=evgreen@chromium.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-soc@vger.kernel.org \
    --cc=msivasub@codeaurora.org \
    --cc=swboyd@chromium.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.