Linux Audio

Check our new training course

Loading...
v4.6
  1/*
  2 * Copyright 2012 Red Hat Inc.
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice shall be included in
 12 * all copies or substantial portions of the Software.
 13 *
 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 20 * OTHER DEALINGS IN THE SOFTWARE.
 21 *
 22 * Authors: Ben Skeggs
 23 */
 24
 25#include "nouveau_drm.h"
 
 26#include "nouveau_dma.h"
 
 27#include "nouveau_fence.h"
 28
 29#include <nvif/if0004.h>
 30
 31struct nv04_fence_chan {
 32	struct nouveau_fence_chan base;
 
 33};
 34
 35struct nv04_fence_priv {
 36	struct nouveau_fence_priv base;
 37};
 38
 39static int
 40nv04_fence_emit(struct nouveau_fence *fence)
 41{
 42	struct nouveau_channel *chan = fence->channel;
 43	int ret = RING_SPACE(chan, 2);
 44	if (ret == 0) {
 45		BEGIN_NV04(chan, NvSubSw, 0x0150, 1);
 46		OUT_RING  (chan, fence->base.seqno);
 47		FIRE_RING (chan);
 48	}
 49	return ret;
 50}
 51
 52static int
 53nv04_fence_sync(struct nouveau_fence *fence,
 54		struct nouveau_channel *prev, struct nouveau_channel *chan)
 55{
 56	return -ENODEV;
 57}
 58
 
 
 
 
 
 
 
 
 59static u32
 60nv04_fence_read(struct nouveau_channel *chan)
 61{
 62	struct nv04_nvsw_get_ref_v0 args = {};
 63	WARN_ON(nvif_object_mthd(&chan->nvsw, NV04_NVSW_GET_REF,
 64				 &args, sizeof(args)));
 65	return args.ref;
 66}
 67
 68static void
 69nv04_fence_context_del(struct nouveau_channel *chan)
 70{
 71	struct nv04_fence_chan *fctx = chan->fence;
 72	nouveau_fence_context_del(&fctx->base);
 73	chan->fence = NULL;
 74	nouveau_fence_context_free(&fctx->base);
 75}
 76
 77static int
 78nv04_fence_context_new(struct nouveau_channel *chan)
 79{
 80	struct nv04_fence_chan *fctx = kzalloc(sizeof(*fctx), GFP_KERNEL);
 81	if (fctx) {
 82		nouveau_fence_context_new(chan, &fctx->base);
 83		fctx->base.emit = nv04_fence_emit;
 84		fctx->base.sync = nv04_fence_sync;
 85		fctx->base.read = nv04_fence_read;
 86		chan->fence = fctx;
 87		return 0;
 88	}
 89	return -ENOMEM;
 90}
 91
 
 
 
 
 
 
 
 
 
 
 
 
 92static void
 93nv04_fence_destroy(struct nouveau_drm *drm)
 94{
 95	struct nv04_fence_priv *priv = drm->fence;
 96	drm->fence = NULL;
 
 
 97	kfree(priv);
 98}
 99
100int
101nv04_fence_create(struct nouveau_drm *drm)
102{
 
103	struct nv04_fence_priv *priv;
 
104
105	priv = drm->fence = kzalloc(sizeof(*priv), GFP_KERNEL);
106	if (!priv)
107		return -ENOMEM;
108
109	priv->base.dtor = nv04_fence_destroy;
110	priv->base.context_new = nv04_fence_context_new;
111	priv->base.context_del = nv04_fence_context_del;
112	priv->base.contexts = 15;
113	priv->base.context_base = fence_context_alloc(priv->base.contexts);
114	return 0;
 
 
 
 
115}
v3.5.6
  1/*
  2 * Copyright 2012 Red Hat Inc.
  3 *
  4 * Permission is hereby granted, free of charge, to any person obtaining a
  5 * copy of this software and associated documentation files (the "Software"),
  6 * to deal in the Software without restriction, including without limitation
  7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8 * and/or sell copies of the Software, and to permit persons to whom the
  9 * Software is furnished to do so, subject to the following conditions:
 10 *
 11 * The above copyright notice and this permission notice shall be included in
 12 * all copies or substantial portions of the Software.
 13 *
 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 20 * OTHER DEALINGS IN THE SOFTWARE.
 21 *
 22 * Authors: Ben Skeggs
 23 */
 24
 25#include "drmP.h"
 26#include "nouveau_drv.h"
 27#include "nouveau_dma.h"
 28#include "nouveau_ramht.h"
 29#include "nouveau_fence.h"
 30
 
 
 31struct nv04_fence_chan {
 32	struct nouveau_fence_chan base;
 33	atomic_t sequence;
 34};
 35
 36struct nv04_fence_priv {
 37	struct nouveau_fence_priv base;
 38};
 39
 40static int
 41nv04_fence_emit(struct nouveau_fence *fence)
 42{
 43	struct nouveau_channel *chan = fence->channel;
 44	int ret = RING_SPACE(chan, 2);
 45	if (ret == 0) {
 46		BEGIN_NV04(chan, NvSubSw, 0x0150, 1);
 47		OUT_RING  (chan, fence->sequence);
 48		FIRE_RING (chan);
 49	}
 50	return ret;
 51}
 52
 53static int
 54nv04_fence_sync(struct nouveau_fence *fence,
 55		struct nouveau_channel *prev, struct nouveau_channel *chan)
 56{
 57	return -ENODEV;
 58}
 59
 60int
 61nv04_fence_mthd(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data)
 62{
 63	struct nv04_fence_chan *fctx = chan->engctx[NVOBJ_ENGINE_FENCE];
 64	atomic_set(&fctx->sequence, data);
 65	return 0;
 66}
 67
 68static u32
 69nv04_fence_read(struct nouveau_channel *chan)
 70{
 71	struct nv04_fence_chan *fctx = chan->engctx[NVOBJ_ENGINE_FENCE];
 72	return atomic_read(&fctx->sequence);
 
 
 73}
 74
 75static void
 76nv04_fence_context_del(struct nouveau_channel *chan, int engine)
 77{
 78	struct nv04_fence_chan *fctx = chan->engctx[engine];
 79	nouveau_fence_context_del(&fctx->base);
 80	chan->engctx[engine] = NULL;
 81	kfree(fctx);
 82}
 83
 84static int
 85nv04_fence_context_new(struct nouveau_channel *chan, int engine)
 86{
 87	struct nv04_fence_chan *fctx = kzalloc(sizeof(*fctx), GFP_KERNEL);
 88	if (fctx) {
 89		nouveau_fence_context_new(&fctx->base);
 90		atomic_set(&fctx->sequence, 0);
 91		chan->engctx[engine] = fctx;
 
 
 92		return 0;
 93	}
 94	return -ENOMEM;
 95}
 96
 97static int
 98nv04_fence_fini(struct drm_device *dev, int engine, bool suspend)
 99{
100	return 0;
101}
102
103static int
104nv04_fence_init(struct drm_device *dev, int engine)
105{
106	return 0;
107}
108
109static void
110nv04_fence_destroy(struct drm_device *dev, int engine)
111{
112	struct drm_nouveau_private *dev_priv = dev->dev_private;
113	struct nv04_fence_priv *priv = nv_engine(dev, engine);
114
115	dev_priv->eng[engine] = NULL;
116	kfree(priv);
117}
118
119int
120nv04_fence_create(struct drm_device *dev)
121{
122	struct drm_nouveau_private *dev_priv = dev->dev_private;
123	struct nv04_fence_priv *priv;
124	int ret;
125
126	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
127	if (!priv)
128		return -ENOMEM;
129
130	priv->base.engine.destroy = nv04_fence_destroy;
131	priv->base.engine.init = nv04_fence_init;
132	priv->base.engine.fini = nv04_fence_fini;
133	priv->base.engine.context_new = nv04_fence_context_new;
134	priv->base.engine.context_del = nv04_fence_context_del;
135	priv->base.emit = nv04_fence_emit;
136	priv->base.sync = nv04_fence_sync;
137	priv->base.read = nv04_fence_read;
138	dev_priv->eng[NVOBJ_ENGINE_FENCE] = &priv->base.engine;
139	return ret;
140}