[RESEND, PATCH v13 11/12] soc: mediatek: cmdq: add cmdq_dev_get_client_reg function

Matthias Brugger matthias.bgg at gmail.com
Tue Aug 27 03:13:56 PDT 2019



On 27/08/2019 05:59, Bibby Hsieh wrote:
> On Fri, 2019-08-23 at 16:21 +0200, Matthias Brugger wrote:
>>
>> On 20/08/2019 10:49, Bibby Hsieh wrote:
>>> GCE cannot know the register base address, this function
>>> can help cmdq client to get the cmdq_client_reg structure.
>>>
>>> Signed-off-by: Bibby Hsieh <bibby.hsieh at mediatek.com>
>>> Reviewed-by: CK Hu <ck.hu at mediatek.com>
>>> ---
>>>  drivers/soc/mediatek/mtk-cmdq-helper.c | 29 ++++++++++++++++++++++++++
>>>  include/linux/soc/mediatek/mtk-cmdq.h  | 21 +++++++++++++++++++
>>>  2 files changed, 50 insertions(+)
>>>
>>> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> index c53f8476c68d..80f75a1075b4 100644
>>> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> @@ -27,6 +27,35 @@ struct cmdq_instruction {
>>>  	u8 op;
>>>  };
>>>  
>>> +int cmdq_dev_get_client_reg(struct device *dev,
>>> +			    struct cmdq_client_reg *client_reg, int idx)
>>> +{
>>
>> Can't we do/call this in cmdq_mbox_create parsing the number of gce-client-reg
>> properties we have and allocating these using a pointer to cmdq_client_reg in
>> cmdq_client?
>> We will have to free the pointer then in cmdq_mbox_destroy.
>>
>> Regards,
>> Matthias
> 
> I don't think we need to keep the cmdq_client_reg in cmdq_client
> structure.
> Because our client will have own data structure, they will copy the
> client_reg information into their own structure.
> 
> In the design now, we do not allocate the cmdq_client_reg, client pass
> the cmdq_client_reg pointer into this API.
> Client will destroy the pointer after they get the information they
> want.
> 

My point wasn't so much about the lifecycle of the object, but the fact that we
add another call, which can be already full-filled by a necessary previous call
to cmdq_mbox_create. So I would prefer to add the information gathering for
cmdq_client_reg in this call, and let it live there for the time cmdq_client
lives. In the end we are talking about 40 bits of memory.

Regards,
Matthias

> Thanks for the comments so much.
> 
> Bibby
> 
>>
>>> +	struct of_phandle_args spec;
>>> +	int err;
>>> +
>>> +	if (!client_reg)
>>> +		return -ENOENT;
>>> +
>>> +	err = of_parse_phandle_with_fixed_args(dev->of_node,
>>> +					       "mediatek,gce-client-reg",
>>> +					       3, idx, &spec);
>>> +	if (err < 0) {
>>> +		dev_err(dev,
>>> +			"error %d can't parse gce-client-reg property (%d)",
>>> +			err, idx);
>>> +
>>> +		return err;
>>> +	}
>>> +
>>> +	client_reg->subsys = (u8)spec.args[0];
>>> +	client_reg->offset = (u16)spec.args[1];
>>> +	client_reg->size = (u16)spec.args[2];
>>> +	of_node_put(spec.np);
>>> +
>>> +	return 0;
>>> +}
>>> +EXPORT_SYMBOL(cmdq_dev_get_client_reg);
>>> +
>>>  static void cmdq_client_timeout(struct timer_list *t)
>>>  {
>>>  	struct cmdq_client *client = from_timer(client, t, timer);
>>> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
>>> index a345870a6d10..02ddd60b212f 100644
>>> --- a/include/linux/soc/mediatek/mtk-cmdq.h
>>> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
>>> @@ -15,6 +15,12 @@
>>>  
>>>  struct cmdq_pkt;
>>>  
>>> +struct cmdq_client_reg {
>>> +	u8 subsys;
>>> +	u16 offset;
>>> +	u16 size;
>>> +};
>>> +
>>>  struct cmdq_client {
>>>  	spinlock_t lock;
>>>  	u32 pkt_cnt;
>>> @@ -24,6 +30,21 @@ struct cmdq_client {
>>>  	u32 timeout_ms; /* in unit of microsecond */
>>>  };
>>>  
>>> +/**
>>> + * cmdq_dev_get_client_reg() - parse cmdq client reg from the device
>>> + *			       node of CMDQ client
>>> + * @dev:	device of CMDQ mailbox client
>>> + * @client_reg: CMDQ client reg pointer
>>> + * @idx:	the index of desired reg
>>> + *
>>> + * Return: 0 for success; else the error code is returned
>>> + *
>>> + * Help CMDQ client parsing the cmdq client reg
>>> + * from the device node of CMDQ client.
>>> + */
>>> +int cmdq_dev_get_client_reg(struct device *dev,
>>> +			    struct cmdq_client_reg *client_reg, int idx);
>>> +
>>>  /**
>>>   * cmdq_mbox_create() - create CMDQ mailbox client and channel
>>>   * @dev:	device of CMDQ mailbox client
>>>
> 
> 



More information about the Linux-mediatek mailing list