From patchwork Fri May 27 19:42:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: akash.goel@intel.com X-Patchwork-Id: 9138907 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 529E46075A for ; Fri, 27 May 2016 19:32:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 450AD27CF9 for ; Fri, 27 May 2016 19:32:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3A1C128294; Fri, 27 May 2016 19:32:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ED7ED27CF9 for ; Fri, 27 May 2016 19:32:06 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3D96E6ED1E; Fri, 27 May 2016 19:32:05 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id D82016E0DF for ; Fri, 27 May 2016 19:30:10 +0000 (UTC) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga103.fm.intel.com with ESMTP; 27 May 2016 12:30:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.26,375,1459839600"; d="scan'208";a="986117563" Received: from akashgoe-desktop.iind.intel.com ([10.223.82.36]) by orsmga002.jf.intel.com with ESMTP; 27 May 2016 12:30:08 -0700 From: akash.goel@intel.com To: intel-gfx@lists.freedesktop.org Date: Sat, 28 May 2016 01:12:59 +0530 Message-Id: <1464378183-9433-9-git-send-email-akash.goel@intel.com> X-Mailer: git-send-email 1.9.2 In-Reply-To: <1464378183-9433-1-git-send-email-akash.goel@intel.com> References: <1464378183-9433-1-git-send-email-akash.goel@intel.com> Cc: sourab.gupta@intel.com, Akash Goel Subject: [Intel-gfx] [RFC 08/12] drm/i915: Store GuC ukernel logs in the local buffer X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP From: Akash Goel This patch copies the content of GuC log buffer into the local buffer. The data is written into local buffer in a circular manner, so 2 pointers are maintained to track the data inside the buffer. And after copying the logs, readers waiting for the data are woken up. The data from the local buffer is supposed to be consumed by Userspace. Signed-off-by: Akash Goel --- drivers/gpu/drm/i915/i915_guc_submission.c | 27 +++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_guc.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c index 26b95e7..149826a 100644 --- a/drivers/gpu/drm/i915/i915_guc_submission.c +++ b/drivers/gpu/drm/i915/i915_guc_submission.c @@ -776,6 +776,11 @@ static void guc_move_to_next_buf(struct intel_guc *guc) #ifdef CONFIG_DEBUG_FS /* nothing to do here, all managed by relay */ return; +#else + /* New log buffer produced, wake up the readers */ + guc->log.next_seq++; + spin_unlock(&guc->log.buf_lock); + wake_up_interruptible_all(&guc->log.wq); #endif } @@ -796,6 +801,27 @@ static void* guc_get_write_buffer(struct intel_guc *guc) relay_reserve(guc->log_relay_chan, guc->log_obj->base.size); return base_addr; +#else + size_t n_subbufs, subbuf_size; + int next_index; + + base_addr = guc->log.buf_obj->mapping; + if (!base_addr) + return NULL; + + subbuf_size = guc->log_obj->base.size; + n_subbufs = guc->log.buf_obj->base.size / subbuf_size; + + spin_lock(&guc->log.buf_lock); + next_index = guc->log.next_seq & (n_subbufs - 1); + /* + * If the logs are not being consumed fast enough, do not wait + * and overwrite the oldest data. + */ + if ((guc->log.next_seq - guc->log.first_seq) >= n_subbufs) + guc->log.first_seq++; + + return (base_addr + next_index * subbuf_size); #endif } @@ -983,6 +1009,7 @@ static void guc_logging_init(struct intel_guc *guc) void *vaddr; spin_lock_init(&guc->log.buf_lock); + init_waitqueue_head(&guc->log.wq); subbuf_size = guc->log_obj->base.size; /* TODO: Decide based on the User's input */ diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h index 9e6ce2d..bdc3e63 100644 --- a/drivers/gpu/drm/i915/intel_guc.h +++ b/drivers/gpu/drm/i915/intel_guc.h @@ -124,6 +124,9 @@ struct intel_guc_fw { struct intel_guc_log { struct drm_i915_gem_object *buf_obj; spinlock_t buf_lock; + wait_queue_head_t wq; + uint64_t first_seq; + uint64_t next_seq; }; struct intel_guc {