mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 20:53:53 +08:00
drm/i915/guc: Assert we have the doorbell before setting it up
As our early doorbell is split between early allocation and a late setup after we have a channel to the GuC, it may happen due to a lapse of programmer judgement that we try to setup an invalid doorbell. Make use of our has_doorbell() function to check the doorbell does exist for the client before we try and tell the guc about it. In doing so, we prevent the compiler from warning about the otherwise unused function in some configurations. Reported-by: Matthias Kaehlcke <mka@chromium.org> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Cc: Michał Winiarski <michal.winiarski@intel.com> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com> Cc: Michel Thierry <michel.thierry@intel.com> Reviewed-by: Michel Thierry <michel.thierry@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180501075203.12458-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
46e2068081
commit
0d4b78b3d2
@ -124,9 +124,17 @@ static int reserve_doorbell(struct intel_guc_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool has_doorbell(struct intel_guc_client *client)
|
||||
{
|
||||
if (client->doorbell_id == GUC_DOORBELL_INVALID)
|
||||
return false;
|
||||
|
||||
return test_bit(client->doorbell_id, client->guc->doorbell_bitmap);
|
||||
}
|
||||
|
||||
static void unreserve_doorbell(struct intel_guc_client *client)
|
||||
{
|
||||
GEM_BUG_ON(client->doorbell_id == GUC_DOORBELL_INVALID);
|
||||
GEM_BUG_ON(!has_doorbell(client));
|
||||
|
||||
__clear_bit(client->doorbell_id, client->guc->doorbell_bitmap);
|
||||
client->doorbell_id = GUC_DOORBELL_INVALID;
|
||||
@ -184,14 +192,6 @@ static struct guc_doorbell_info *__get_doorbell(struct intel_guc_client *client)
|
||||
return client->vaddr + client->doorbell_offset;
|
||||
}
|
||||
|
||||
static bool has_doorbell(struct intel_guc_client *client)
|
||||
{
|
||||
if (client->doorbell_id == GUC_DOORBELL_INVALID)
|
||||
return false;
|
||||
|
||||
return test_bit(client->doorbell_id, client->guc->doorbell_bitmap);
|
||||
}
|
||||
|
||||
static void __create_doorbell(struct intel_guc_client *client)
|
||||
{
|
||||
struct guc_doorbell_info *doorbell;
|
||||
@ -207,7 +207,6 @@ static void __destroy_doorbell(struct intel_guc_client *client)
|
||||
struct guc_doorbell_info *doorbell;
|
||||
u16 db_id = client->doorbell_id;
|
||||
|
||||
|
||||
doorbell = __get_doorbell(client);
|
||||
doorbell->db_status = GUC_DOORBELL_DISABLED;
|
||||
doorbell->cookie = 0;
|
||||
@ -224,6 +223,9 @@ static int create_doorbell(struct intel_guc_client *client)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(!has_doorbell(client)))
|
||||
return -ENODEV; /* internal setup error, should never happen */
|
||||
|
||||
__update_doorbell_desc(client, client->doorbell_id);
|
||||
__create_doorbell(client);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user