[Intel-gfx] [PATCH 02/12] drm/i915/guc: Allocate separate shared data object for GuC communication
Michel Thierry
michel.thierry at intel.com
Fri Oct 13 00:19:51 UTC 2017
On 12/10/17 13:35, Michel Thierry wrote:
> On 09/10/17 15:35, Michel Thierry wrote:
>> On 10/9/2017 11:41 AM, Daniele Ceraolo Spurio wrote:
>>>
>>>
>>> On 09/10/17 07:52, Michał Winiarski wrote:
>>>> We were using first page of kernel context render state for sharing
>>>> data
>>>> with GuC. While it's justified by the fact that those pages are not
>>>> used
>>>> (note, GuC still enforces this layout and refuses to work if we remove
>>>> the extra page in front), it's also confusing (why are we using this
>>>> particular page?). Let's allocate a separate object instead.
>>>>
>>>> Suggested-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>>>> Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>
>>>> Cc: Chris Wilson <chris at chris-wilson.co.uk>
>>>> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>>>> Cc: Jeff McGee <jeff.mcgee at intel.com>
>>>> Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
>>>> Cc: Oscar Mateo <oscar.mateo at intel.com>
>>>
>>> +Michel (engine and watchdog reset with GuC use the shared page)
>>>
>>>> ---
>>>> drivers/gpu/drm/i915/i915_guc_submission.c | 36
>>>> +++++++++++++++++++++++++++++-
>>>> drivers/gpu/drm/i915/intel_guc.c | 8 ++-----
>>>> drivers/gpu/drm/i915/intel_guc.h | 2 ++
>>>> 3 files changed, 39 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c
>>>> b/drivers/gpu/drm/i915/i915_guc_submission.c
>>>> index 8983d53af229..30f026566001 100644
>>>> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
>>>> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
>>>> @@ -437,6 +437,33 @@ static void guc_stage_desc_fini(struct
>>>> intel_guc *guc,
>>>> memset(desc, 0, sizeof(*desc));
>>>> }
>>>> +static int guc_shared_data_create(struct intel_guc *guc)
>>>> +{
>>>> + struct i915_vma *vma;
>>>> + void *vaddr;
>>>> +
>>>> + vma = intel_guc_allocate_vma(guc, PAGE_SIZE);
>>>> + if (IS_ERR(vma))
>>>> + return PTR_ERR(vma);
>>>> +
>>>> + vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
>>>> + if (IS_ERR(vaddr)) {
>>>> + i915_vma_unpin_and_release(&vma);
>>>> + return PTR_ERR(vaddr);
>>>> + }
>>>> +
>>>> + guc->shared_data = vma;
>>>> + guc->shared_data_vaddr = vaddr;
>>
>> Hi,
>>
>> Allocating the shared_data until this point (i915_guc_submission_init)
>> will be too late for GuC's watchdog.
>>
>> GuC watchdog happens without i915 knowledge, so we have to pass this
>> shared_data_offset during guc_params_init (in params[9] for the
>> curious) instead of a h2g command; and the GuC parameters block has
>> this note: "These parameters are read by the firmware on startup and
>> cannot be changed thereafter".
>>
>> Michał, if you plan to send another version of this, could you move it
>> to guc_params_init? It isn't a big issue, I can just move it when we
>> have an open source user and can upstream GuC watchdog.
>>
>> Thanks,
>>
>> -Michel
>>
>
> Ignore my previous reply, this is already being allocated before
> guc_params_init as it is.
>
> Reviewed-by: Michel Thierry <michel.thierry at intel.com>
>
I spoke too soon (and sorry for all the spam), the kernel_context is now
redundant code and should be removed from the suspend & resume functions:
diff --git a/drivers/gpu/drm/i915/intel_guc.c
b/drivers/gpu/drm/i915/intel_guc.c
index 5cd9bc53e021..47c74ef0bd23 100644
--- a/drivers/gpu/drm/i915/intel_guc.c
+++ b/drivers/gpu/drm/i915/intel_guc.c
@@ -176,7 +176,6 @@ int intel_guc_auth_huc(struct intel_guc *guc, u32
rsa_offset)
int intel_guc_suspend(struct drm_i915_private *dev_priv)
{
struct intel_guc *guc = &dev_priv->guc;
- struct i915_gem_context *ctx;
u32 data[3];
if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
@@ -184,8 +183,6 @@ int intel_guc_suspend(struct drm_i915_private *dev_priv)
gen9_disable_guc_interrupts(dev_priv);
- ctx = dev_priv->kernel_context;
-
data[0] = INTEL_GUC_ACTION_ENTER_S_STATE;
/* any value greater than GUC_POWER_D0 */
data[1] = GUC_POWER_D1;
@@ -225,7 +222,6 @@ int intel_guc_suspend(struct drm_i915_private *dev_priv)
int intel_guc_resume(struct drm_i915_private *dev_priv)
{
struct intel_guc *guc = &dev_priv->guc;
- struct i915_gem_context *ctx;
u32 data[3];
if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
@@ -234,8 +230,6 @@ int intel_guc_resume(struct drm_i915_private *dev_priv)
if (i915_modparams.guc_log_level >= 0)
gen9_enable_guc_interrupts(dev_priv);
- ctx = dev_priv->kernel_context;
-
data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
data[1] = GUC_POWER_D0;
data[2] = guc_ggtt_offset(guc->shared_data);
More information about the Intel-gfx
mailing list