From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79CC7363090 for ; Thu, 11 Jun 2026 07:26:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781162801; cv=none; b=Cib5vr1QMXWPhJhEiMRc2MDyQ09L/n+j8y9XBSGio9OIPyNltMsbH3ZpdnUZfilSSZj9mJSnxQsslNmL6szJ3uVy0ZwoUGJnJWHMTeMdykZGk1Glv1WlG3RuuA3m8NOkB9+75dryAwFoZJMNDvjy+2olIMtdFaG26Hnf9a6zovQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781162801; c=relaxed/simple; bh=I/F7N9AXhu6QlRfspiSm+IDB8k6xvKMTdrXMT+23Zgo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qnLkCNrVqFvawbK6bGWTUjH+SlYWrrly8pdK0/cGSWi4R5lGGQ5qjOFrZLpBNm9uCRJbmpilZpLROLJEplMJunAje1Uo8hDAy/CWhW2HTgkKUjjljw6ClPfO7f2FWw9RtYlexXl5vONewevjfEjsNfMiC6Md2mqBlW7RD6sd6AQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=je7nQIgq; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="je7nQIgq" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-490a78fbd7bso9537395e9.2 for ; Thu, 11 Jun 2026 00:26:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781162798; x=1781767598; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5eKc8xoinNQulP3EE43EUw/q3KLX56zkxbj8GquDS6g=; b=je7nQIgq8XgNm7AFYJGiqwZ5GCrbkWb/ackAcM3qSxkN6OkJYSPDTqv3L5zpyUr/IG p53jthvu+4eRpaAHc6B8iMlh0/wKzDGLVCyWtYly2+f0TuRtGe1Y9JcwBkVcwvw7iQTS Gh7BQdgNKWFrdomHwZEvTxCKkdfbd2KEBwYnmWulmChUEnphU7BLXnXqDAgDjKwizHjH 63Ro4ntnlT9CUruyXdje0N/H6Fx3L5R0AzfUSXOrFS3ibIuDgY067cgsnhAHiq4A9c9B hRWxjB67IEFdamyHbHxKl1N34sAX1lyWR1M1LE85igpWfji30hJsVYHDISseKQytRNwv TeYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781162798; x=1781767598; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5eKc8xoinNQulP3EE43EUw/q3KLX56zkxbj8GquDS6g=; b=MhBdQpByznJUbT3WT2rVfAFHW2pN3ZeExlHl7aD2x/UBaneGG2KMrkljZ+I7TdZUCs XyU73wlnJQvx1EZ8tVwNgfRtZOt8QctCDXxiuJ9U3Vh7Iu0YSZNn95TTrCCSWgFFDtAY DDzJQC0C+Ickr4qoAsEjrZWde/Ub194MDwXUg+/LaY5D6NXb3jevYfElrCnZMqr37xYZ pzx0/pJBJ+Hj+QhZ5vxTWyT+qI+KYlx63Se5Yrf/pGWa6o8jq9jNK3nFNBkRk3BFWEDK dJyWrbzq+V3PJuSjmETV9sUTxQMrrXW5x/6Tq9qIzI0Te6FPD9+O0ckLzKQo3Zo6fHUH gZYA== X-Forwarded-Encrypted: i=1; AFNElJ9z/b9Bd8O5DmrzIVo0h/ssBkF3G/OcpSGNHe4xCJpyXymrbK29eaMgaFoWfR6KmEkcb2Kl4UiNXLIHOqQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyqSnJbAuOxZ+wrUnk9Jo7VWcGHlxOzmFlc0DRwydR2aILH5LsN JsmEzEXoQ5rS42tePzbC4eLArv4zO2YxKVAytFr/SSuNu3414v3zOCoI X-Gm-Gg: Acq92OEFkybDE8VyiNya5V72Ls0kfl0Td+xGuX1J1gpW1eCsoJHlbHdkhujttQ297Fo hoJgGyIgIQkty7u1NDTsdBRdsaMVxMF5im7fRJBdKcoJxMeg/DRkLXGXr9eYWLydOw85OxMY/ny MGcUgzz3SHRnHsQXH+tMwOXvGkiTcbsJq3A0GD3t9GjfRNfUBDTSnB0Qp9ribBmT6ahOD97pWrp gDVkXA2iQZ2ORbKaMcEXuZvJWneo3JmKoiAVvAXLQSyPmojgK882tzfCfEC8QxX30RAUZts6lNJ 0Gej+1Na+xTiJTPIQB0DGTifFdAZtKOpNUDzyq8aRgfTzX7A+bgPN6nf2KCs3ZfhHj4NXINgwoa lVMMZP/W7pvFycE1g2zc0mHxMsbYaQRDUV93nHtUbPj4GXoIsWKV9UdXKHIQWEWubmcRMnv/Ffo nH+wOZtcOzdmYPIzaHSM/luhNsnT6VKM8S9kyDrDye+AmWj1lMkxeEIsNSoSK3yTS7OImn7J8Al yUVRaz+ZiaEyEtd13YAo9j08A== X-Received: by 2002:a05:600c:3104:b0:490:b2b2:87d2 with SMTP id 5b1f17b1804b1-490e561be8cmr6449625e9.5.1781162797702; Thu, 11 Jun 2026 00:26:37 -0700 (PDT) Received: from localhost.localdomain (ip-109-193-028-127.um39.pools.vodafone-ip.de. [109.193.28.127]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-490e2c7ea21sm42585795e9.1.2026.06.11.00.26.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2026 00:26:37 -0700 (PDT) From: Marek Czernohous X-Google-Original-From: Marek Czernohous To: Lyude Paul , Danilo Krummrich Cc: dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, linux-kernel@vger.kernel.org, Fab Stz Subject: [PATCH v2 1/2] drm/nouveau/pci: use config-space MSI rearm on MCP79/MCP7A (NVAC) Date: Thu, 11 Jun 2026 09:26:33 +0200 Message-ID: X-Mailer: git-send-email 2.53.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Marek Czernohous From: Marek Czernohous NVAC (MCP79/MCP7A) uses g94_pci_func, whose .msi_rearm is nv40_pci_msi_rearm(): a re-arm write through the MMIO mirror of PCI config space. On this IGP that path is unreliable; when a re-arm is missed the interrupt line stays dead, command submission times out and the GPU appears hung until reboot. On an Apple Mac mini (early 2009, MCP79, 0xac080b1) this showed as sporadic fifo timeouts and GPU hangs under load unless MSI was disabled via config=NvMSI=0. Give NVAC its own pci func that re-arms through real PCI config space (nv46_pci_msi_rearm) instead. This follows existing precedent: nv46.c documents the MMIO-mirror re-arm as broken on several related parts, and commit 5112abc6a433 ("drm/nouveau/pci/g92: Fix rearm") already split g92 out of the shared table for the same reason. The sibling IGP NVAA (MCP77/MCP78) has MSI disabled entirely as "reported broken" in nvkm_pci_new_(); NVAC works correctly once the re-arm goes through config space, so disabling MSI is not necessary. Only NVAC is switched: that is the hardware this has been validated on. The other users of g94_pci_func (G94/G96/G98/GT2xx and the MCP77/MCP89 IGPs) keep their current behavior; MCP77 and MCP89 plausibly want the same treatment but were not tested. Tested on the Mac mini as a daily driver for two months with MSI enabled and zero fifo timeouts; independently confirmed stable on an iMac9,1 (MCP79) running 6.12.90. Fixes: 5112abc6a433 ("drm/nouveau/pci/g92: Fix rearm") Cc: Tested-by: Fab Stz Assisted-by: Claude:claude-opus-4-7 Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Marek Czernohous --- v1 -> v2: narrowed to NVAC via a dedicated mcp79 pci func instead of changing the shared g94 table (only chipset the fix was validated on); added Fixes/stable/Assisted-by tags. v1: https://lore.kernel.org/nouveau/20260409172126.115441-2-marek@czernohous.de/ .../gpu/drm/nouveau/include/nvkm/subdev/pci.h | 2 ++ .../gpu/drm/nouveau/nvkm/engine/device/base.c | 2 +- .../gpu/drm/nouveau/nvkm/subdev/pci/Kbuild | 1 + .../gpu/drm/nouveau/nvkm/subdev/pci/mcp79.c | 33 +++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/nouveau/nvkm/subdev/pci/mcp79.c diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h index 112b674..88efe06 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pci.h @@ -46,6 +46,8 @@ int nv4c_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct n int g84_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **); int g92_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **); int g94_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **); +int mcp79_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, + int inst, struct nvkm_pci **ppci); int gf100_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **); int gf106_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **); int gk104_pci_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_pci **); diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c index b101e14..a809ec3 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c @@ -1237,7 +1237,7 @@ nvac_chipset = { .mc = { 0x00000001, g98_mc_new }, .mmu = { 0x00000001, mcp77_mmu_new }, .mxm = { 0x00000001, nv50_mxm_new }, - .pci = { 0x00000001, g94_pci_new }, + .pci = { 0x00000001, mcp79_pci_new }, .therm = { 0x00000001, g84_therm_new }, .timer = { 0x00000001, nv41_timer_new }, .volt = { 0x00000001, nv40_volt_new }, diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/Kbuild index a14ea0f..90f03ba 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/Kbuild +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/Kbuild @@ -9,6 +9,7 @@ nvkm-y += nvkm/subdev/pci/nv4c.o nvkm-y += nvkm/subdev/pci/g84.o nvkm-y += nvkm/subdev/pci/g92.o nvkm-y += nvkm/subdev/pci/g94.o +nvkm-y += nvkm/subdev/pci/mcp79.o nvkm-y += nvkm/subdev/pci/gf100.o nvkm-y += nvkm/subdev/pci/gf106.o nvkm-y += nvkm/subdev/pci/gk104.o diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/mcp79.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/mcp79.c new file mode 100644 index 0000000..9f6a6cd --- /dev/null +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/mcp79.c @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +/* + * MCP79/MCP7A (NVAC): like g94, but MSI re-arm goes through real PCI + * config space. The MMIO-mirror re-arm is unreliable on this IGP and a + * missed re-arm kills the interrupt line (see the nv46 comment; g92 was + * split out of the shared table for the same reason). + */ +#include "priv.h" + +static const struct nvkm_pci_func +mcp79_pci_func = { + .cfg = { .addr = 0x088000, .size = 0x1000 }, + + .init = g84_pci_init, + .msi_rearm = nv46_pci_msi_rearm, + + .pcie.init = g84_pcie_init, + .pcie.set_link = g84_pcie_set_link, + + .pcie.max_speed = g84_pcie_max_speed, + .pcie.cur_speed = g84_pcie_cur_speed, + + .pcie.set_version = g84_pcie_set_version, + .pcie.version = g84_pcie_version, + .pcie.version_supported = g92_pcie_version_supported, +}; + +int +mcp79_pci_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, + struct nvkm_pci **ppci) +{ + return nvkm_pci_new_(&mcp79_pci_func, device, type, inst, ppci); +} -- 2.53.0