From patchwork Thu Jul 10 21:50:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oded Gabbay X-Patchwork-Id: 4528141 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 41BBF9F37C for ; Thu, 10 Jul 2014 23:33:29 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2EFE8201F2 for ; Thu, 10 Jul 2014 23:33:28 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 355A9201B4 for ; Thu, 10 Jul 2014 23:33:27 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D240D6E708; Thu, 10 Jul 2014 16:33:13 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wi0-f169.google.com (mail-wi0-f169.google.com [209.85.212.169]) by gabe.freedesktop.org (Postfix) with ESMTP id 169476E01B for ; Thu, 10 Jul 2014 14:50:53 -0700 (PDT) Received: by mail-wi0-f169.google.com with SMTP id hi2so5151366wib.0 for ; Thu, 10 Jul 2014 14:50:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nsGCqkavMk+0IYnT1QNhLRawPEJ8qK4oTqiarcKl5yA=; b=zU4E0YFDR2dz3CrdniURjQJEeAe0OM84ohbE6N67VonaR8Cs1LjuZYfzIeZ8yX2yWV RspQTqdkTBpWqO2ocmI7irfzkOE94l2WHb+fkemp5G07j8ilsOq32SXixpdfRFyij6QY uioDbJ8rFnY4waR6Ag965Hiw97nrcflvFFDxsKtYM2H7J6Tij0z6zqwwhBViofrCinC+ G8P9BqIfuEhL2Y5YPFNmRWn1MgLrifliLkb8b4zdme6HBQLTUjmIszelJtP402Kwz9Jb PsJpGpu2PwGwGm7n63+V9+UAh1LAFnPD7SCIv8MGI1jxW5wf56fFRPRQwfB02kV2AYtu Edxw== X-Received: by 10.180.19.40 with SMTP id b8mr22390243wie.77.1405029052547; Thu, 10 Jul 2014 14:50:52 -0700 (PDT) Received: from localhost.localdomain ([77.127.59.49]) by mx.google.com with ESMTPSA id n2sm805353wjf.40.2014.07.10.14.50.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 10 Jul 2014 14:50:51 -0700 (PDT) From: Oded Gabbay X-Google-Original-From: Oded Gabbay To: David Airlie , Alex Deucher , Jerome Glisse Subject: [PATCH 06/83] drm/radeon: Add kfd-->kgd interfaces of memory allocation/mapping Date: Fri, 11 Jul 2014 00:50:06 +0300 Message-Id: <1405029027-6085-5-git-send-email-oded.gabbay@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1405029027-6085-1-git-send-email-oded.gabbay@amd.com> References: <1405029027-6085-1-git-send-email-oded.gabbay@amd.com> X-Mailman-Approved-At: Thu, 10 Jul 2014 16:33:12 -0700 Cc: Andrew Lewycky , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, =?UTF-8?q?Christian=20K=C3=B6nig?= X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.0 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_WEB, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds new interfaces to kfd2kgd_calls structure. The new interfaces allow the kfd driver to : 1. Allocated video memory through the radeon driver 2. Map and unmap video memory with GPUVM through the radeon driver 3. Map and unmap system memory with GPUVM through the radeon driver Signed-off-by: Oded Gabbay --- drivers/gpu/drm/radeon/radeon_kfd.c | 129 ++++++++++++++++++++++++++++++++++++ include/linux/radeon_kfd.h | 23 +++++++ 2 files changed, 152 insertions(+) diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index 1b859b5..66ee36b 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c @@ -25,9 +25,31 @@ #include #include "radeon.h" +struct kgd_mem { + struct radeon_bo *bo; + u32 domain; +}; + +static int allocate_mem(struct kgd_dev *kgd, size_t size, size_t alignment, + enum kgd_memory_pool pool, struct kgd_mem **memory_handle); + +static void free_mem(struct kgd_dev *kgd, struct kgd_mem *memory_handle); + +static int gpumap_mem(struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *vmid0_address); +static void ungpumap_mem(struct kgd_dev *kgd, struct kgd_mem *mem); + +static int kmap_mem(struct kgd_dev *kgd, struct kgd_mem *mem, void **ptr); +static void unkmap_mem(struct kgd_dev *kgd, struct kgd_mem *mem); + static uint64_t get_vmem_size(struct kgd_dev *kgd); static const struct kfd2kgd_calls kfd2kgd = { + .allocate_mem = allocate_mem, + .free_mem = free_mem, + .gpumap_mem = gpumap_mem, + .ungpumap_mem = ungpumap_mem, + .kmap_mem = kmap_mem, + .unkmap_mem = unkmap_mem, .get_vmem_size = get_vmem_size, }; @@ -96,6 +118,113 @@ void radeon_kfd_device_fini(struct radeon_device *rdev) } } +static u32 pool_to_domain(enum kgd_memory_pool p) +{ + switch (p) { + case KGD_POOL_FRAMEBUFFER: return RADEON_GEM_DOMAIN_VRAM; + default: return RADEON_GEM_DOMAIN_GTT; + } +} + +static int allocate_mem(struct kgd_dev *kgd, size_t size, size_t alignment, + enum kgd_memory_pool pool, struct kgd_mem **memory_handle) +{ + struct radeon_device *rdev = (struct radeon_device *)kgd; + struct kgd_mem *mem; + int r; + + mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL); + if (!mem) + return -ENOMEM; + + mem->domain = pool_to_domain(pool); + + r = radeon_bo_create(rdev, size, alignment, true, mem->domain, NULL, &mem->bo); + if (r) { + kfree(mem); + return r; + } + + *memory_handle = mem; + return 0; +} + +static void free_mem(struct kgd_dev *kgd, struct kgd_mem *mem) +{ + /* Assume that KFD will never free gpumapped or kmapped memory. This is not quite settled. */ + radeon_bo_unref(&mem->bo); + kfree(mem); +} + +static int gpumap_mem(struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *vmid0_address) +{ + int r; + + r = radeon_bo_reserve(mem->bo, true); + + /* + * ttm_bo_reserve can only fail if the buffer reservation lock + * is held in circumstances that would deadlock + */ + BUG_ON(r != 0); + r = radeon_bo_pin(mem->bo, mem->domain, vmid0_address); + radeon_bo_unreserve(mem->bo); + + return r; +} + +static void ungpumap_mem(struct kgd_dev *kgd, struct kgd_mem *mem) +{ + int r; + + r = radeon_bo_reserve(mem->bo, true); + + /* + * ttm_bo_reserve can only fail if the buffer reservation lock + * is held in circumstances that would deadlock + */ + BUG_ON(r != 0); + r = radeon_bo_unpin(mem->bo); + + /* + * This unpin only removed NO_EVICT placement flags + * and should never fail + */ + BUG_ON(r != 0); + radeon_bo_unreserve(mem->bo); +} + +static int kmap_mem(struct kgd_dev *kgd, struct kgd_mem *mem, void **ptr) +{ + int r; + + r = radeon_bo_reserve(mem->bo, true); + + /* + * ttm_bo_reserve can only fail if the buffer reservation lock + * is held in circumstances that would deadlock + */ + BUG_ON(r != 0); + r = radeon_bo_kmap(mem->bo, ptr); + radeon_bo_unreserve(mem->bo); + + return r; +} + +static void unkmap_mem(struct kgd_dev *kgd, struct kgd_mem *mem) +{ + int r; + + r = radeon_bo_reserve(mem->bo, true); + /* + * ttm_bo_reserve can only fail if the buffer reservation lock + * is held in circumstances that would deadlock + */ + BUG_ON(r != 0); + radeon_bo_kunmap(mem->bo); + radeon_bo_unreserve(mem->bo); +} + static uint64_t get_vmem_size(struct kgd_dev *kgd) { struct radeon_device *rdev = (struct radeon_device *)kgd; diff --git a/include/linux/radeon_kfd.h b/include/linux/radeon_kfd.h index 28cddf5..c7997d4 100644 --- a/include/linux/radeon_kfd.h +++ b/include/linux/radeon_kfd.h @@ -36,6 +36,14 @@ struct pci_dev; struct kfd_dev; struct kgd_dev; +struct kgd_mem; + +enum kgd_memory_pool { + KGD_POOL_SYSTEM_CACHEABLE = 1, + KGD_POOL_SYSTEM_WRITECOMBINE = 2, + KGD_POOL_FRAMEBUFFER = 3, +}; + struct kgd2kfd_shared_resources { void __iomem *mmio_registers; /* Mapped pointer to GFX MMIO registers. */ @@ -57,6 +65,21 @@ struct kgd2kfd_calls { }; struct kfd2kgd_calls { + /* Memory management. */ + int (*allocate_mem)(struct kgd_dev *kgd, + size_t size, + size_t alignment, + enum kgd_memory_pool pool, + struct kgd_mem **memory_handle); + + void (*free_mem)(struct kgd_dev *kgd, struct kgd_mem *memory_handle); + + int (*gpumap_mem)(struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *vmid0_address); + void (*ungpumap_mem)(struct kgd_dev *kgd, struct kgd_mem *mem); + + int (*kmap_mem)(struct kgd_dev *kgd, struct kgd_mem *mem, void **ptr); + void (*unkmap_mem)(struct kgd_dev *kgd, struct kgd_mem *mem); + uint64_t (*get_vmem_size)(struct kgd_dev *kgd); };