[PATCH 2/3] soc: qcom: rpmh and cmd-db drivers

Neil Armstrong neil.armstrong at linaro.org
Fri Jun 28 17:38:38 CEST 2024


Hi Caleb,

On 17/06/2024 10:32, Caleb Connolly wrote:
> Introduce two Qualcomm SoC drivers, the RPMh and cmd-db. RPMh is a the
> name for the second generation Resource Power Management hub on Qualcomm
> SoCs. Most core regulators have to be controlled via this hub.
> 
> The cmd-db is a region of memory which contains offsets and data about
> how to communicate with the RPMh.
> 
> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
> ---
>   drivers/soc/Kconfig              |   1 +
>   drivers/soc/Makefile             |   1 +
>   drivers/soc/qcom/Kconfig         |  25 ++
>   drivers/soc/qcom/Makefile        |   4 +
>   drivers/soc/qcom/cmd-db.c        | 246 ++++++++++++++++
>   drivers/soc/qcom/rpmh-internal.h | 141 +++++++++
>   drivers/soc/qcom/rpmh-rsc.c      | 619 +++++++++++++++++++++++++++++++++++++++
>   drivers/soc/qcom/rpmh.c          | 110 +++++++
>   include/soc/qcom/cmd-db.h        |  42 +++
>   include/soc/qcom/rpmh.h          |  29 ++
>   include/soc/qcom/tcs.h           |  78 +++++
>   11 files changed, 1296 insertions(+)
> 

<snip>

> +
> +static int cmd_db_get_header(const char *id, const struct entry_header **eh,
> +			     const struct rsc_hdr **rh)
> +{
> +	const struct rsc_hdr *rsc_hdr;
> +	const struct entry_header *ent;
> +	int i, j;
> +	u8 query[sizeof(ent->id)] __nonstring;
> +
> +	/*
> +	 * Pad out query string to same length as in DB. NOTE: the output
> +	 * query string is not necessarily '\0' terminated if it bumps up
> +	 * against the max size. That's OK and expected.
> +	 */
> +	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 = 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) {

I had to change to:
			if (strncmp(ent->id, query, sizeof(ent->id)) == 0) {
otherwise I get:
Failed to read RPMh address for bobb1
...

on SM8550 and SM8650.

Linux uses memcmp, but it pads the buffer with strtomem_pad(), strncpy doesn't seem to do the padding.
	
Neil

> +				if (eh)
> +					*eh = ent;
> +				if (rh)
> +					*rh = rsc_hdr;
> +				return 0;
> +			}
> +		}
> +	}
> +
> +	return -ENODEV;
> +}

<snip>



More information about the U-Boot mailing list