[Intel-gfx] [PATCH] drm/i915/guc: Make intel_guc_send a function pointer

Oscar Mateo oscar.mateo at intel.com
Tue Feb 7 08:43:52 UTC 2017




On 02/03/2017 03:48 AM, Michal Wajdeczko wrote:
> On Thu, Feb 02, 2017 at 07:42:46AM -0800, Oscar Mateo wrote:
>> From: Michal Wajdeczko <michal.wajdeczko at intel.com>
>>
>> Prepare for an alternate GuC communication interface.
>>
>> v2: Make a few functions static and name them correctly while we are at it (Oscar)
>>
>> Signed-off-by: Michel Thierry <michel.thierry at intel.com>
>> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
>> Signed-off-by: Oscar Mateo <oscar.mateo at intel.com>
>> ---
>>   drivers/gpu/drm/i915/intel_uc.c | 25 +++++++++++++++----------
>>   drivers/gpu/drm/i915/intel_uc.h |  9 ++++++++-
>>   2 files changed, 23 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
>> index c46bc85..0e45ef0 100644
>> --- a/drivers/gpu/drm/i915/intel_uc.c
>> +++ b/drivers/gpu/drm/i915/intel_uc.c
>> @@ -25,16 +25,11 @@
>>   #include "i915_drv.h"
>>   #include "intel_uc.h"
>>   
>> -void intel_uc_init_early(struct drm_i915_private *dev_priv)
>> -{
>> -	mutex_init(&dev_priv->guc.send_mutex);
>> -}
>> -
>>   /*
>>    * Read GuC command/status register (SOFT_SCRATCH_0)
>>    * Return true if it contains a response rather than a command
>>    */
>> -static bool intel_guc_recv(struct intel_guc *guc, u32 *status)
>> +static bool guc_recv(struct intel_guc *guc, u32 *status)
>>   {
>>   	struct drm_i915_private *dev_priv = guc_to_i915(guc);
>>   
>> @@ -43,7 +38,10 @@ static bool intel_guc_recv(struct intel_guc *guc, u32 *status)
>>   	return INTEL_GUC_RECV_IS_RESPONSE(val);
>>   }
>>   
>> -int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
>> +/*
>> + * This function implements the MMIO based host to GuC interface.
>> + */
>> +static int guc_send_mmio(struct intel_guc *guc, const u32 *action, u32 len)
> Btw, while this change is fine for now, what if in the future we will need
> MMIO based interface for some kind of OOB communication to GuC that bypasses
> alternate interface?
I see. So you'd prefer to have an intel_guc_send for normal 
communication with the GuC and an intel_guc_send_mmio for the few cases 
where you want to fallback to a MMIO style? I'll change this and resend.
>>   {
>>   	struct drm_i915_private *dev_priv = guc_to_i915(guc);
>>   	u32 status;
>> @@ -71,9 +69,9 @@ int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
>>   	 * up to that length of time, then switch to a slower sleep-wait loop.
>>   	 * No inte_guc_send command should ever take longer than 10ms.
>>   	 */
>> -	ret = wait_for_us(intel_guc_recv(guc, &status), 10);
>> +	ret = wait_for_us(guc_recv(guc, &status), 10);
>>   	if (ret)
>> -		ret = wait_for(intel_guc_recv(guc, &status), 10);
>> +		ret = wait_for(guc_recv(guc, &status), 10);
>>   	if (status != INTEL_GUC_STATUS_SUCCESS) {
>>   		/*
>>   		 * Either the GuC explicitly returned an error (which
>> @@ -98,6 +96,14 @@ int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
>>   	return ret;
>>   }
>>   
>> +void intel_uc_init_early(struct drm_i915_private *dev_priv)
>> +{
>> +	struct intel_guc *guc = &dev_priv->guc;
>> +
>> +	mutex_init(&dev_priv->guc.send_mutex);
> No need to use dev_priv here, you can refer to the guc directly.
>
> Regards,
> Michal
ACK. I'll fix it in the next version.

>> +	guc->send = guc_send_mmio;
>> +}
>> +
>>   int intel_guc_sample_forcewake(struct intel_guc *guc)
>>   {
>>   	struct drm_i915_private *dev_priv = guc_to_i915(guc);
>> @@ -113,4 +119,3 @@ int intel_guc_sample_forcewake(struct intel_guc *guc)
>>   
>>   	return intel_guc_send(guc, action, ARRAY_SIZE(action));
>>   }
>> -
>> diff --git a/drivers/gpu/drm/i915/intel_uc.h b/drivers/gpu/drm/i915/intel_uc.h
>> index d74f4d3..aed8653 100644
>> --- a/drivers/gpu/drm/i915/intel_uc.h
>> +++ b/drivers/gpu/drm/i915/intel_uc.h
>> @@ -174,6 +174,9 @@ struct intel_guc {
>>   
>>   	/* To serialize the intel_guc_send actions */
>>   	struct mutex send_mutex;
>> +
>> +	/* GuC's FW specific send function */
>> +	int (*send)(struct intel_guc *guc, const u32 *data, u32 len);
>>   };
>>   
>>   struct intel_huc {
>> @@ -185,9 +188,13 @@ struct intel_huc {
>>   
>>   /* intel_uc.c */
>>   void intel_uc_init_early(struct drm_i915_private *dev_priv);
>> -int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len);
>>   int intel_guc_sample_forcewake(struct intel_guc *guc);
>>   
>> +static inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
>> +{
>> +	return guc->send(guc, action, len);
>> +}
>> +
>>   /* intel_guc_loader.c */
>>   extern void intel_guc_init(struct drm_i915_private *dev_priv);
>>   extern int intel_guc_setup(struct drm_i915_private *dev_priv);
>> -- 
>> 1.9.1
>>




More information about the Intel-gfx mailing list