From patchwork Tue Dec 18 21:25:09 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Vetter X-Patchwork-Id: 1893681 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork2.kernel.org (Postfix) with ESMTP id E7C87DF2F6 for ; Tue, 18 Dec 2012 21:31:38 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D24B7E61E2 for ; Tue, 18 Dec 2012 13:31:38 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-ee0-f42.google.com (mail-ee0-f42.google.com [74.125.83.42]) by gabe.freedesktop.org (Postfix) with ESMTP id E06C5E5D00 for ; Tue, 18 Dec 2012 13:25:29 -0800 (PST) Received: by mail-ee0-f42.google.com with SMTP id c41so620236eek.1 for ; Tue, 18 Dec 2012 13:25:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=BhmI2bNDqnYQrh9GDc4tZYZn7iFA3jUP+glrsL11XQ8=; b=eNBPX177Z+6enB3Wjg24EZ7OwZNsmOZ9Ce4hG5fvUitKCjvpvxkjOACYU1Otj+jYSR HoCO+F6pRkoHLSCIBiJnHpRqOK+qZtDkz2L9BHM/e156twXHHQiSx4MQcmwakhiPVyEy ScjYEURS2nRDYkAmmsGoQxJZ9ljCAQb5Ksuok= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=BhmI2bNDqnYQrh9GDc4tZYZn7iFA3jUP+glrsL11XQ8=; b=nzSzpMqdnND1mkuz8V0JFrmiSNREA4nNigfGNRGCuZVFBn3V6xf366mig38tkSZrAs /E5Y7YZex3ZFkXaCJaWpmty77jsW2kJ11hLc10VtvgheuQ6THXGkKJBc6e5pR4c5XTxF Oe4wZSGNw+0Rs+CjvpozyZrTV8kDEagadJytYHtnoBiakMbMAK/Ef5IkgRlRPKOwiDn6 jD62CeaMtxah4hZ5jstYwAqpT/0LEtrfGFhX2JXxykhWYmmzTes6cWnwdKSOr6DlTpSI otTiVBrgb0Ca4wtKPOO+XBAaBDzkHjdGwc9xICJ0di7aB/WYsxNiJuS9Ol3HXCIWHFql LhRQ== X-Received: by 10.14.174.132 with SMTP id x4mr8678476eel.39.1355865928973; Tue, 18 Dec 2012 13:25:28 -0800 (PST) Received: from biers.ffwll.local (178-83-130-250.dynamic.hispeed.ch. [178.83.130.250]) by mx.google.com with ESMTPS id w3sm5549337eel.17.2012.12.18.13.25.27 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 18 Dec 2012 13:25:28 -0800 (PST) From: Daniel Vetter To: DRI Development Subject: [PATCH 06/10] drm/nouveau: protect evo_wait/evo_kick sections with a channel mutex Date: Tue, 18 Dec 2012 22:25:09 +0100 Message-Id: <1355865913-14858-7-git-send-email-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1355865913-14858-1-git-send-email-daniel.vetter@ffwll.ch> References: <1355865913-14858-1-git-send-email-daniel.vetter@ffwll.ch> X-Gm-Message-State: ALoCoQmZ7kjbBCH6NDJruL7nS4U2bCE/sBGxsapMj4MlPPxwV1QY+M0xSUp+TKkr930jRL1jI5vU Cc: Daniel Vetter X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org With per-crtc locks modeset operations can run in parallel, and the cursor code uses the device-global evo master channel for hw frobbing. But the pageflip code can also sync with the master under some circumstances. Hence just wrap things up in a mutex to ensure that pushbuf access doesn't intermingle. The approach here is a bit overkill since the per-crtc channels used to schedule the pageflips could probably be used without this pushbuf locking, but I'm not familiar enough with the nouveau codebase to be sure of that. Signed-off-by: Daniel Vetter --- drivers/gpu/drm/nouveau/nv50_display.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 3587408..5751d63 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c @@ -128,6 +128,11 @@ struct nv50_dmac { struct nv50_chan base; dma_addr_t handle; u32 *ptr; + + /* Protects against concurrent pushbuf access to this channel, lock is + * grabbed by evo_wait (if the pushbuf reservation is successful) and + * dropped again by evo_kick. */ + struct mutex lock; }; static void @@ -395,11 +400,13 @@ evo_wait(void *evoc, int nr) struct nv50_dmac *dmac = evoc; u32 put = nv_ro32(dmac->base.user, 0x0000) / 4; + mutex_lock(&dmac->lock); if (put + nr >= (PAGE_SIZE / 4) - 8) { dmac->ptr[put] = 0x20000000; nv_wo32(dmac->base.user, 0x0000, 0x00000000); if (!nv_wait(dmac->base.user, 0x0004, ~0, 0x00000000)) { + mutex_unlock(&dmac->lock); NV_ERROR(dmac->base.user, "channel stalled\n"); return NULL; } @@ -415,6 +422,7 @@ evo_kick(u32 *push, void *evoc) { struct nv50_dmac *dmac = evoc; nv_wo32(dmac->base.user, 0x0000, (push - dmac->ptr) << 2); + mutex_unlock(&dmac->lock); } #define evo_mthd(p,m,s) *((p)++) = (((s) << 18) | (m))