From patchwork Fri Oct 19 08:54:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Zimmermann X-Patchwork-Id: 10648891 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BCDC1112B for ; Fri, 19 Oct 2018 08:56:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AD16F28915 for ; Fri, 19 Oct 2018 08:56:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A168828924; Fri, 19 Oct 2018 08:56:14 +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=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 4900928915 for ; Fri, 19 Oct 2018 08:56:14 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AEC2F6E2CC; Fri, 19 Oct 2018 08:54:48 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2E0B76E28C; Fri, 19 Oct 2018 08:54:43 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id C0FB9ADD4; Fri, 19 Oct 2018 08:54:41 +0000 (UTC) From: Thomas Zimmermann To: christian.koenig@amd.com, ray.huang@amd.com, Jerry.Zhang@amd.com, alexander.deucher@amd.com, David1.Zhou@amd.com, airlied@linux.ie, kraxel@redhat.com, bskeggs@redhat.com, syeh@vmware.com, z.liuxinliang@hisilicon.com, zourongrong@gmail.com, kong.kongxinwei@hisilicon.com, puck.chen@hisilicon.com Subject: [PATCH 16/18] drm/ttm: Implement struct ttm_global_item and helpers Date: Fri, 19 Oct 2018 10:54:21 +0200 Message-Id: <20181019085423.28159-17-tzimmermann@suse.de> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181019085423.28159-1-tzimmermann@suse.de> References: <20181019085423.28159-1-tzimmermann@suse.de> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Zimmermann , amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP The data structure struct ttm_global_item is a replacement for struct drm_global_item. While struct drm_global_item depends on global data instances, struct ttm_global_item allows drivers to use their own privat instances. Signed-off-by: Thomas Zimmermann --- drivers/gpu/drm/ttm/ttm_global.c | 98 ++++++++++++++++++++++++++++++++ include/drm/ttm/ttm_global.h | 22 +++++++ 2 files changed, 120 insertions(+) diff --git a/drivers/gpu/drm/ttm/ttm_global.c b/drivers/gpu/drm/ttm/ttm_global.c index ca9da0a46147..1e5c2f5eeca0 100644 --- a/drivers/gpu/drm/ttm/ttm_global.c +++ b/drivers/gpu/drm/ttm/ttm_global.c @@ -31,6 +31,104 @@ #include #include +/* + * struct ttm_global_item + */ + +struct ttm_global_item { + struct mutex mutex; + void *object; + int refcount; +}; + +#define TTM_GLOBAL_ITEM_INIT(name_) { \ + .mutex = __MUTEX_INITIALIZER(name_.mutex), \ + .object = NULL, \ + .refcount = 0 } + +#define DEFINE_TTM_GLOBAL_ITEM_ARRAY(name_) \ + struct ttm_global_item name_[TTM_NUM_GLOBAL_TYPES] = { \ + [0] = TTM_GLOBAL_ITEM_INIT(name_[0]), \ + [1] = TTM_GLOBAL_ITEM_INIT(name_[0]) \ + } + +/** + * ttm_global_item_ref - Initialize and acquire reference to a global TTM item + * + * @items: Array of global TTM items + * @ref: Object for initialization + * @return Zero on success, or a negative error code otherwise. + * + * This initializes a TTM item by allocating memory and calling the + * .init() hook. Further calls will increase the reference count for + * that item. + */ +static int ttm_global_item_ref( + struct ttm_global_item items[TTM_NUM_GLOBAL_TYPES], + struct ttm_global_ref *ref) +{ + struct ttm_global_item *item = &items[ref->global_type]; + int ret = 0; + + mutex_lock(&item->mutex); + if (item->refcount == 0) { + ref->object = kzalloc(ref->size, GFP_KERNEL); + if (unlikely(ref->object == NULL)) { + ret = -ENOMEM; + goto error_mutex_unlock; + } + ret = ref->init(ref); + if (unlikely(ret != 0)) + goto error_kfree; + + item->object = ref->object; + } else { + ref->object = item->object; + } + + ++item->refcount; + mutex_unlock(&item->mutex); + + return 0; + +error_kfree: + kfree(ref->object); + ref->object = NULL; +error_mutex_unlock: + mutex_unlock(&item->mutex); + return ret; +} + +/** + * ttm_global_item_unref - Drop reference to global TTM item + * + * @items: Array of global TTM items + * @ref: Object being removed + * + * Drops a reference to the global TTM item and eventually call the + * release() hook. The allocated object should be dropped in the + * release() hook or before calling this function + */ +static void ttm_global_item_unref( + struct ttm_global_item items[TTM_NUM_GLOBAL_TYPES], + struct ttm_global_ref *ref) +{ + struct ttm_global_item *item = &items[ref->global_type]; + + mutex_lock(&item->mutex); + BUG_ON(item->refcount == 0); + BUG_ON(ref->object != item->object); + if (--item->refcount == 0) { + ref->release(ref); + item->object = NULL; + } + mutex_unlock(&item->mutex); +} + +/* + * struct ttm_global + */ + static int ttm_global_init_mem(struct drm_global_reference *ref) { BUG_ON(!ref->object); diff --git a/include/drm/ttm/ttm_global.h b/include/drm/ttm/ttm_global.h index 06e791499f87..9aa0ddbbe2ef 100644 --- a/include/drm/ttm/ttm_global.h +++ b/include/drm/ttm/ttm_global.h @@ -29,6 +29,28 @@ #define _TTM_GLOBAL_H_ #include +#include +#include + +/** + * enum ttm_global_types - Enumerates types of global TTM state + */ +enum ttm_global_types { + TTM_GLOBAL_MEM = 0, + TTM_GLOBAL_BO, + TTM_NUM_GLOBAL_TYPES +}; + +/** + * struct ttm_global_ref - References global TTM item + */ +struct ttm_global_ref { + enum ttm_global_types global_type; + size_t size; + void *object; + int (*init) (struct ttm_global_ref *); + void (*release) (struct ttm_global_ref *); +}; struct ttm_bo_global;