drm/nouveau/core: add SEC2 engine
SEC2 is the name given by NVIDIA to the SEC engine post-Fermi (reasons unknown). Even though it shares the same address range as SEC, its usage is quite different and this justifies a new engine. Add this engine and make TOP use it all post-TOP devices should use this implementation and not the older SEC. Also quickly add the short gp102 implementation which will be used for falcon booting purposes. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
16307b5d72
commit
b62880f796
@ -59,6 +59,7 @@ enum nvkm_devidx {
|
||||
NVKM_ENGINE_NVDEC,
|
||||
NVKM_ENGINE_PM,
|
||||
NVKM_ENGINE_SEC,
|
||||
NVKM_ENGINE_SEC2,
|
||||
NVKM_ENGINE_SW,
|
||||
NVKM_ENGINE_VIC,
|
||||
NVKM_ENGINE_VP,
|
||||
@ -158,6 +159,7 @@ struct nvkm_device {
|
||||
struct nvkm_nvdec *nvdec;
|
||||
struct nvkm_pm *pm;
|
||||
struct nvkm_engine *sec;
|
||||
struct nvkm_sec2 *sec2;
|
||||
struct nvkm_sw *sw;
|
||||
struct nvkm_engine *vic;
|
||||
struct nvkm_engine *vp;
|
||||
@ -228,6 +230,7 @@ struct nvkm_device_chip {
|
||||
int (*nvdec )(struct nvkm_device *, int idx, struct nvkm_nvdec **);
|
||||
int (*pm )(struct nvkm_device *, int idx, struct nvkm_pm **);
|
||||
int (*sec )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*sec2 )(struct nvkm_device *, int idx, struct nvkm_sec2 **);
|
||||
int (*sw )(struct nvkm_device *, int idx, struct nvkm_sw **);
|
||||
int (*vic )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
int (*vp )(struct nvkm_device *, int idx, struct nvkm_engine **);
|
||||
|
13
drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h
Normal file
13
drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef __NVKM_SEC2_H__
|
||||
#define __NVKM_SEC2_H__
|
||||
#include <core/engine.h>
|
||||
|
||||
struct nvkm_sec2 {
|
||||
struct nvkm_engine engine;
|
||||
struct nvkm_falcon *falcon;
|
||||
struct nvkm_msgqueue *queue;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
int gp102_sec2_new(struct nvkm_device *, int, struct nvkm_sec2 **);
|
||||
#endif
|
@ -78,6 +78,7 @@ nvkm_subdev_name[NVKM_SUBDEV_NR] = {
|
||||
[NVKM_ENGINE_NVDEC ] = "nvdec",
|
||||
[NVKM_ENGINE_PM ] = "pm",
|
||||
[NVKM_ENGINE_SEC ] = "sec",
|
||||
[NVKM_ENGINE_SEC2 ] = "sec2",
|
||||
[NVKM_ENGINE_SW ] = "sw",
|
||||
[NVKM_ENGINE_VIC ] = "vic",
|
||||
[NVKM_ENGINE_VP ] = "vp",
|
||||
|
@ -18,6 +18,7 @@ include $(src)/nvkm/engine/nvenc/Kbuild
|
||||
include $(src)/nvkm/engine/nvdec/Kbuild
|
||||
include $(src)/nvkm/engine/pm/Kbuild
|
||||
include $(src)/nvkm/engine/sec/Kbuild
|
||||
include $(src)/nvkm/engine/sec2/Kbuild
|
||||
include $(src)/nvkm/engine/sw/Kbuild
|
||||
include $(src)/nvkm/engine/vic/Kbuild
|
||||
include $(src)/nvkm/engine/vp/Kbuild
|
||||
|
@ -2365,6 +2365,7 @@ nvkm_device_engine(struct nvkm_device *device, int index)
|
||||
_(NVDEC , device->nvdec , &device->nvdec->engine);
|
||||
_(PM , device->pm , &device->pm->engine);
|
||||
_(SEC , device->sec , device->sec);
|
||||
_(SEC2 , device->sec2 , &device->sec2->engine);
|
||||
_(SW , device->sw , &device->sw->engine);
|
||||
_(VIC , device->vic , device->vic);
|
||||
_(VP , device->vp , device->vp);
|
||||
@ -2812,6 +2813,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
|
||||
_(NVKM_ENGINE_NVDEC , nvdec);
|
||||
_(NVKM_ENGINE_PM , pm);
|
||||
_(NVKM_ENGINE_SEC , sec);
|
||||
_(NVKM_ENGINE_SEC2 , sec2);
|
||||
_(NVKM_ENGINE_SW , sw);
|
||||
_(NVKM_ENGINE_VIC , vic);
|
||||
_(NVKM_ENGINE_VP , vp);
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <engine/nvdec.h>
|
||||
#include <engine/pm.h>
|
||||
#include <engine/sec.h>
|
||||
#include <engine/sec2.h>
|
||||
#include <engine/sw.h>
|
||||
#include <engine/vic.h>
|
||||
#include <engine/vp.h>
|
||||
|
2
drivers/gpu/drm/nouveau/nvkm/engine/sec2/Kbuild
Normal file
2
drivers/gpu/drm/nouveau/nvkm/engine/sec2/Kbuild
Normal file
@ -0,0 +1,2 @@
|
||||
nvkm-y += nvkm/engine/sec2/base.o
|
||||
nvkm-y += nvkm/engine/sec2/gp102.o
|
101
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
Normal file
101
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "priv.h"
|
||||
|
||||
#include <core/msgqueue.h>
|
||||
#include <engine/falcon.h>
|
||||
|
||||
static void *
|
||||
nvkm_sec2_dtor(struct nvkm_engine *engine)
|
||||
{
|
||||
struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
|
||||
nvkm_msgqueue_del(&sec2->queue);
|
||||
nvkm_falcon_del(&sec2->falcon);
|
||||
return sec2;
|
||||
}
|
||||
|
||||
static void
|
||||
nvkm_sec2_intr(struct nvkm_engine *engine)
|
||||
{
|
||||
struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
|
||||
struct nvkm_subdev *subdev = &engine->subdev;
|
||||
struct nvkm_device *device = subdev->device;
|
||||
u32 disp = nvkm_rd32(device, 0x8701c);
|
||||
u32 intr = nvkm_rd32(device, 0x87008) & disp & ~(disp >> 16);
|
||||
|
||||
if (intr & 0x00000040) {
|
||||
schedule_work(&sec2->work);
|
||||
nvkm_wr32(device, 0x87004, 0x00000040);
|
||||
intr &= ~0x00000040;
|
||||
}
|
||||
|
||||
if (intr) {
|
||||
nvkm_error(subdev, "unhandled intr %08x\n", intr);
|
||||
nvkm_wr32(device, 0x87004, intr);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nvkm_sec2_recv(struct work_struct *work)
|
||||
{
|
||||
struct nvkm_sec2 *sec2 = container_of(work, typeof(*sec2), work);
|
||||
nvkm_msgqueue_recv(sec2->queue);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
nvkm_sec2_oneinit(struct nvkm_engine *engine)
|
||||
{
|
||||
struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
|
||||
return nvkm_falcon_v1_new(&sec2->engine.subdev, "SEC2", 0x87000,
|
||||
&sec2->falcon);
|
||||
}
|
||||
|
||||
static int
|
||||
nvkm_sec2_fini(struct nvkm_engine *engine, bool suspend)
|
||||
{
|
||||
struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
|
||||
flush_work(&sec2->work);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct nvkm_engine_func
|
||||
nvkm_sec2 = {
|
||||
.dtor = nvkm_sec2_dtor,
|
||||
.oneinit = nvkm_sec2_oneinit,
|
||||
.fini = nvkm_sec2_fini,
|
||||
.intr = nvkm_sec2_intr,
|
||||
};
|
||||
|
||||
int
|
||||
nvkm_sec2_new_(struct nvkm_device *device, int index,
|
||||
struct nvkm_sec2 **psec2)
|
||||
{
|
||||
struct nvkm_sec2 *sec2;
|
||||
|
||||
if (!(sec2 = *psec2 = kzalloc(sizeof(*sec2), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
INIT_WORK(&sec2->work, nvkm_sec2_recv);
|
||||
|
||||
return nvkm_engine_ctor(&nvkm_sec2, device, index, true, &sec2->engine);
|
||||
};
|
30
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
Normal file
30
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "priv.h"
|
||||
|
||||
int
|
||||
gp102_sec2_new(struct nvkm_device *device, int index,
|
||||
struct nvkm_sec2 **psec2)
|
||||
{
|
||||
return nvkm_sec2_new_(device, index, psec2);
|
||||
}
|
9
drivers/gpu/drm/nouveau/nvkm/engine/sec2/priv.h
Normal file
9
drivers/gpu/drm/nouveau/nvkm/engine/sec2/priv.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef __NVKM_SEC2_PRIV_H__
|
||||
#define __NVKM_SEC2_PRIV_H__
|
||||
#include <engine/sec2.h>
|
||||
|
||||
#define nvkm_sec2(p) container_of((p), struct nvkm_sec2, engine)
|
||||
|
||||
int nvkm_sec2_new_(struct nvkm_device *, int, struct nvkm_sec2 **);
|
||||
|
||||
#endif
|
@ -82,7 +82,7 @@ gk104_top_oneinit(struct nvkm_top *top)
|
||||
case 0x0000000a: A_(MSVLD ); break;
|
||||
case 0x0000000b: A_(MSENC ); break;
|
||||
case 0x0000000c: A_(VIC ); break;
|
||||
case 0x0000000d: A_(SEC ); break;
|
||||
case 0x0000000d: A_(SEC2 ); break;
|
||||
case 0x0000000e: B_(NVENC ); break;
|
||||
case 0x0000000f: A_(NVENC1); break;
|
||||
case 0x00000010: A_(NVDEC ); break;
|
||||
|
Loading…
Reference in New Issue
Block a user