Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
7a4dde71
K
Kernel
项目概览
openeuler
/
Kernel
2 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
7a4dde71
编写于
1月 15, 2020
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/secboot: move code to boot LS falcons to subdevs
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
91a4e83a
变更
24
隐藏空白更改
内联
并排
Showing
24 changed file
with
77 addition
and
517 deletion
+77
-517
drivers/gpu/drm/nouveau/include/nvfw/pmu.h
drivers/gpu/drm/nouveau/include/nvfw/pmu.h
+20
-0
drivers/gpu/drm/nouveau/include/nvfw/sec2.h
drivers/gpu/drm/nouveau/include/nvfw/sec2.h
+8
-0
drivers/gpu/drm/nouveau/include/nvkm/core/msgqueue.h
drivers/gpu/drm/nouveau/include/nvkm/core/msgqueue.h
+0
-10
drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h
drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h
+0
-1
drivers/gpu/drm/nouveau/include/nvkm/subdev/acr.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/acr.h
+1
-0
drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
+0
-1
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
+0
-2
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
+12
-0
drivers/gpu/drm/nouveau/nvkm/falcon/Kbuild
drivers/gpu/drm/nouveau/nvkm/falcon/Kbuild
+0
-3
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.c
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.c
+0
-87
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.h
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.h
+0
-95
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
+0
-131
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
+0
-87
drivers/gpu/drm/nouveau/nvkm/falcon/qmgr.h
drivers/gpu/drm/nouveau/nvkm/falcon/qmgr.h
+0
-1
drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c
+21
-0
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
+0
-2
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
+11
-0
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
+3
-16
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
+0
-2
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r361.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r361.c
+0
-2
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
+0
-1
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r370.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r370.c
+0
-1
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r375.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r375.c
+0
-1
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c
...s/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c
+1
-74
未找到文件。
drivers/gpu/drm/nouveau/include/nvfw/pmu.h
浏览文件 @
7a4dde71
#ifndef __NVFW_PMU_H__
#define __NVFW_PMU_H__
struct
nv_pmu_args
{
u32
reserved
;
u32
freq_hz
;
u32
trace_size
;
u32
trace_dma_base
;
u16
trace_dma_base1
;
u8
trace_dma_offset
;
u32
trace_dma_idx
;
bool
secure_mode
;
bool
raise_priv_sec
;
struct
{
u32
dma_base
;
u16
dma_base1
;
u8
dma_offset
;
u16
fb_size
;
u8
dma_idx
;
}
gc6_ctx
;
u8
pad
;
};
#define NV_PMU_UNIT_INIT 0x07
#define NV_PMU_UNIT_ACR 0x0a
...
...
drivers/gpu/drm/nouveau/include/nvfw/sec2.h
浏览文件 @
7a4dde71
#ifndef __NVFW_SEC2_H__
#define __NVFW_SEC2_H__
struct
nv_sec2_args
{
u32
freq_hz
;
u32
falc_trace_size
;
u32
falc_trace_dma_base
;
u32
falc_trace_dma_idx
;
bool
secure_mode
;
};
#define NV_SEC2_UNIT_INIT 0x01
#define NV_SEC2_UNIT_ACR 0x08
...
...
drivers/gpu/drm/nouveau/include/nvkm/core/msgqueue.h
浏览文件 @
7a4dde71
...
...
@@ -22,17 +22,7 @@
#ifndef __NVKM_CORE_MSGQUEUE_H
#define __NVKM_CORE_MSGQUEUE_H
#include <subdev/secboot.h>
struct
nvkm_msgqueue
;
/* Hopefully we will never have firmware arguments larger than that... */
#define NVKM_MSGQUEUE_CMDLINE_SIZE 0x100
int
nvkm_msgqueue_new
(
u32
,
struct
nvkm_falcon
*
,
const
struct
nvkm_secboot
*
,
struct
nvkm_msgqueue
**
);
void
nvkm_msgqueue_del
(
struct
nvkm_msgqueue
**
);
/* useful if we run a NVIDIA-signed firmware */
void
nvkm_msgqueue_write_cmdline
(
struct
nvkm_msgqueue
*
,
void
*
);
#endif
drivers/gpu/drm/nouveau/include/nvkm/engine/sec2.h
浏览文件 @
7a4dde71
...
...
@@ -13,7 +13,6 @@ struct nvkm_sec2 {
struct
nvkm_falcon_qmgr
*
qmgr
;
struct
nvkm_falcon_cmdq
*
cmdq
;
struct
nvkm_falcon_msgq
*
msgq
;
struct
nvkm_msgqueue
*
queue
;
struct
work_struct
work
;
bool
initmsg_received
;
...
...
drivers/gpu/drm/nouveau/include/nvkm/subdev/acr.h
浏览文件 @
7a4dde71
...
...
@@ -74,6 +74,7 @@ struct nvkm_acr_lsfw {
};
struct
nvkm_acr_lsf_func
{
int
(
*
boot
)(
struct
nvkm_falcon
*
);
int
(
*
bootstrap_falcon
)(
struct
nvkm_falcon
*
,
enum
nvkm_acr_lsf_id
);
int
(
*
bootstrap_multiple_falcons
)(
struct
nvkm_falcon
*
,
u32
mask
);
};
...
...
drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
浏览文件 @
7a4dde71
...
...
@@ -14,7 +14,6 @@ struct nvkm_pmu {
struct
nvkm_falcon_cmdq
*
lpq
;
struct
nvkm_falcon_msgq
*
msgq
;
bool
initmsg_received
;
struct
nvkm_msgqueue
*
queue
;
struct
completion
wpr_ready
;
...
...
drivers/gpu/drm/nouveau/nvkm/engine/sec2/base.c
浏览文件 @
7a4dde71
...
...
@@ -22,7 +22,6 @@
#include "priv.h"
#include <core/firmware.h>
#include <core/msgqueue.h>
#include <subdev/top.h>
static
void
...
...
@@ -70,7 +69,6 @@ static void *
nvkm_sec2_dtor
(
struct
nvkm_engine
*
engine
)
{
struct
nvkm_sec2
*
sec2
=
nvkm_sec2
(
engine
);
nvkm_msgqueue_del
(
&
sec2
->
queue
);
nvkm_falcon_msgq_del
(
&
sec2
->
msgq
);
nvkm_falcon_cmdq_del
(
&
sec2
->
cmdq
);
nvkm_falcon_qmgr_del
(
&
sec2
->
qmgr
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
浏览文件 @
7a4dde71
...
...
@@ -64,8 +64,19 @@ gp102_sec2_acr_bootstrap_falcon(struct nvkm_falcon *falcon,
msecs_to_jiffies
(
1000
));
}
static
int
gp102_sec2_acr_boot
(
struct
nvkm_falcon
*
falcon
)
{
struct
nv_sec2_args
args
=
{};
nvkm_falcon_load_dmem
(
falcon
,
&
args
,
falcon
->
func
->
emem_addr
,
sizeof
(
args
),
0
);
nvkm_falcon_start
(
falcon
);
return
0
;
}
static
const
struct
nvkm_acr_lsf_func
gp102_sec2_acr_0
=
{
.
boot
=
gp102_sec2_acr_boot
,
.
bootstrap_falcon
=
gp102_sec2_acr_bootstrap_falcon
,
};
...
...
@@ -210,6 +221,7 @@ MODULE_FIRMWARE("nvidia/gp107/sec2/sig.bin");
const
struct
nvkm_acr_lsf_func
gp102_sec2_acr_1
=
{
.
boot
=
gp102_sec2_acr_boot
,
.
bootstrap_falcon
=
gp102_sec2_acr_bootstrap_falcon
,
};
...
...
drivers/gpu/drm/nouveau/nvkm/falcon/Kbuild
浏览文件 @
7a4dde71
...
...
@@ -4,6 +4,3 @@ nvkm-y += nvkm/falcon/cmdq.o
nvkm-y += nvkm/falcon/msgq.o
nvkm-y += nvkm/falcon/qmgr.o
nvkm-y += nvkm/falcon/v1.o
nvkm-y += nvkm/falcon/msgqueue.o
nvkm-y += nvkm/falcon/msgqueue_0137c63d.o
nvkm-y += nvkm/falcon/msgqueue_0148cdec.o
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.c
已删除
100644 → 0
浏览文件 @
91a4e83a
/*
* 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 "msgqueue.h"
#include <engine/falcon.h>
#include <subdev/secboot.h>
void
nvkm_msgqueue_write_cmdline
(
struct
nvkm_msgqueue
*
queue
,
void
*
buf
)
{
if
(
!
queue
||
!
queue
->
func
||
!
queue
->
func
->
init_func
)
return
;
queue
->
func
->
init_func
->
gen_cmdline
(
queue
,
buf
);
}
int
nvkm_msgqueue_new
(
u32
version
,
struct
nvkm_falcon
*
falcon
,
const
struct
nvkm_secboot
*
sb
,
struct
nvkm_msgqueue
**
queue
)
{
const
struct
nvkm_subdev
*
subdev
=
falcon
->
owner
;
int
ret
=
-
EINVAL
;
switch
(
version
)
{
case
0x0137c63d
:
ret
=
msgqueue_0137c63d_new
(
falcon
,
sb
,
queue
);
break
;
case
0x0137bca5
:
ret
=
msgqueue_0137bca5_new
(
falcon
,
sb
,
queue
);
break
;
case
0x0148cdec
:
case
0x015ccf3e
:
case
0x0167d263
:
ret
=
msgqueue_0148cdec_new
(
falcon
,
sb
,
queue
);
break
;
default:
nvkm_error
(
subdev
,
"unhandled firmware version 0x%08x
\n
"
,
version
);
break
;
}
if
(
ret
==
0
)
{
nvkm_debug
(
subdev
,
"firmware version: 0x%08x
\n
"
,
version
);
(
*
queue
)
->
fw_version
=
version
;
}
return
ret
;
}
void
nvkm_msgqueue_del
(
struct
nvkm_msgqueue
**
queue
)
{
if
(
*
queue
)
{
(
*
queue
)
->
func
->
dtor
(
*
queue
);
*
queue
=
NULL
;
}
}
void
nvkm_msgqueue_ctor
(
const
struct
nvkm_msgqueue_func
*
func
,
struct
nvkm_falcon
*
falcon
,
struct
nvkm_msgqueue
*
queue
)
{
queue
->
func
=
func
;
queue
->
falcon
=
falcon
;
}
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.h
已删除
100644 → 0
浏览文件 @
91a4e83a
/*
* 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
*
*/
#ifndef __NVKM_CORE_FALCON_MSGQUEUE_H
#define __NVKM_CORE_FALCON_MSGQUEUE_H
#include <core/falcon.h>
#include <core/msgqueue.h>
/*
* The struct nvkm_msgqueue (named so for lack of better candidate) manages
* a firmware (typically, NVIDIA signed firmware) running under a given falcon.
*
* Such firmwares expect to receive commands (through one or several command
* queues) and will reply to such command by sending messages (using one
* message queue).
*
* Each firmware can support one or several units - ACR for managing secure
* falcons, PMU for power management, etc. A unit can be seen as a class to
* which command can be sent.
*
* One usage example would be to send a command to the SEC falcon to ask it to
* reset a secure falcon. The SEC falcon will receive the command, process it,
* and send a message to signal success or failure. Only when the corresponding
* message is received can the requester assume the request has been processed.
*
* Since we expect many variations between the firmwares NVIDIA will release
* across GPU generations, this library is built in a very modular way. Message
* formats and queues details (such as number of usage) are left to
* specializations of struct nvkm_msgqueue, while the functions in msgqueue.c
* take care of posting commands and processing messages in a fashion that is
* universal.
*
*/
struct
nvkm_msgqueue
;
/**
* struct nvkm_msgqueue_init_func - msgqueue functions related to initialization
*
* @gen_cmdline: build the commandline into a pre-allocated buffer
* @init_callback: called to process the init message
*/
struct
nvkm_msgqueue_init_func
{
void
(
*
gen_cmdline
)(
struct
nvkm_msgqueue
*
,
void
*
);
};
struct
nvkm_msgqueue_func
{
const
struct
nvkm_msgqueue_init_func
*
init_func
;
void
(
*
dtor
)(
struct
nvkm_msgqueue
*
);
};
/**
* struct nvkm_msgqueue - manage a command/message based FW on a falcon
*
* @falcon: falcon to be managed
* @func: implementation of the firmware to use
* @init_msg_received: whether the init message has already been received
*/
struct
nvkm_msgqueue
{
struct
nvkm_falcon
*
falcon
;
const
struct
nvkm_msgqueue_func
*
func
;
u32
fw_version
;
};
void
nvkm_msgqueue_ctor
(
const
struct
nvkm_msgqueue_func
*
,
struct
nvkm_falcon
*
,
struct
nvkm_msgqueue
*
);
int
msgqueue_0137c63d_new
(
struct
nvkm_falcon
*
,
const
struct
nvkm_secboot
*
,
struct
nvkm_msgqueue
**
);
int
msgqueue_0137bca5_new
(
struct
nvkm_falcon
*
,
const
struct
nvkm_secboot
*
,
struct
nvkm_msgqueue
**
);
int
msgqueue_0148cdec_new
(
struct
nvkm_falcon
*
,
const
struct
nvkm_secboot
*
,
struct
nvkm_msgqueue
**
);
#endif
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
已删除
100644 → 0
浏览文件 @
91a4e83a
/*
* 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 "msgqueue.h"
#include <engine/falcon.h>
#include <subdev/pmu.h>
#include <subdev/secboot.h>
struct
msgqueue_0137c63d
{
struct
nvkm_msgqueue
base
;
};
#define msgqueue_0137c63d(q) \
container_of(q, struct msgqueue_0137c63d, base)
struct
msgqueue_0137bca5
{
struct
msgqueue_0137c63d
base
;
u64
wpr_addr
;
};
#define msgqueue_0137bca5(q) \
container_of(container_of(q, struct msgqueue_0137c63d, base), \
struct msgqueue_0137bca5, base);
/* Init unit */
static
void
init_gen_cmdline
(
struct
nvkm_msgqueue
*
queue
,
void
*
buf
)
{
struct
{
u32
reserved
;
u32
freq_hz
;
u32
trace_size
;
u32
trace_dma_base
;
u16
trace_dma_base1
;
u8
trace_dma_offset
;
u32
trace_dma_idx
;
bool
secure_mode
;
bool
raise_priv_sec
;
struct
{
u32
dma_base
;
u16
dma_base1
;
u8
dma_offset
;
u16
fb_size
;
u8
dma_idx
;
}
gc6_ctx
;
u8
pad
;
}
*
args
=
buf
;
args
->
secure_mode
=
1
;
}
static
const
struct
nvkm_msgqueue_init_func
msgqueue_0137c63d_init_func
=
{
.
gen_cmdline
=
init_gen_cmdline
,
};
static
void
msgqueue_0137c63d_dtor
(
struct
nvkm_msgqueue
*
queue
)
{
kfree
(
msgqueue_0137c63d
(
queue
));
}
static
const
struct
nvkm_msgqueue_func
msgqueue_0137c63d_func
=
{
.
init_func
=
&
msgqueue_0137c63d_init_func
,
.
dtor
=
msgqueue_0137c63d_dtor
,
};
int
msgqueue_0137c63d_new
(
struct
nvkm_falcon
*
falcon
,
const
struct
nvkm_secboot
*
sb
,
struct
nvkm_msgqueue
**
queue
)
{
struct
msgqueue_0137c63d
*
ret
;
ret
=
kzalloc
(
sizeof
(
*
ret
),
GFP_KERNEL
);
if
(
!
ret
)
return
-
ENOMEM
;
*
queue
=
&
ret
->
base
;
nvkm_msgqueue_ctor
(
&
msgqueue_0137c63d_func
,
falcon
,
&
ret
->
base
);
return
0
;
}
static
const
struct
nvkm_msgqueue_func
msgqueue_0137bca5_func
=
{
.
init_func
=
&
msgqueue_0137c63d_init_func
,
.
dtor
=
msgqueue_0137c63d_dtor
,
};
int
msgqueue_0137bca5_new
(
struct
nvkm_falcon
*
falcon
,
const
struct
nvkm_secboot
*
sb
,
struct
nvkm_msgqueue
**
queue
)
{
struct
msgqueue_0137bca5
*
ret
;
ret
=
kzalloc
(
sizeof
(
*
ret
),
GFP_KERNEL
);
if
(
!
ret
)
return
-
ENOMEM
;
*
queue
=
&
ret
->
base
.
base
;
/*
* FIXME this must be set to the address of a *GPU* mapping within the
* ACR address space!
*/
/* ret->wpr_addr = sb->wpr_addr; */
nvkm_msgqueue_ctor
(
&
msgqueue_0137bca5_func
,
falcon
,
&
ret
->
base
.
base
);
return
0
;
}
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
已删除
100644 → 0
浏览文件 @
91a4e83a
/*
* 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 "msgqueue.h"
#include <engine/falcon.h>
#include <engine/sec2.h>
#include <subdev/secboot.h>
/*
* This firmware runs on the SEC falcon. It only has one command and one
* message queue, and uses a different command line and init message.
*/
struct
msgqueue_0148cdec
{
struct
nvkm_msgqueue
base
;
};
#define msgqueue_0148cdec(q) \
container_of(q, struct msgqueue_0148cdec, base)
static
void
init_gen_cmdline
(
struct
nvkm_msgqueue
*
queue
,
void
*
buf
)
{
struct
{
u32
freq_hz
;
u32
falc_trace_size
;
u32
falc_trace_dma_base
;
u32
falc_trace_dma_idx
;
bool
secure_mode
;
}
*
args
=
buf
;
args
->
secure_mode
=
false
;
}
static
const
struct
nvkm_msgqueue_init_func
msgqueue_0148cdec_init_func
=
{
.
gen_cmdline
=
init_gen_cmdline
,
};
static
void
msgqueue_0148cdec_dtor
(
struct
nvkm_msgqueue
*
queue
)
{
kfree
(
msgqueue_0148cdec
(
queue
));
}
const
struct
nvkm_msgqueue_func
msgqueue_0148cdec_func
=
{
.
init_func
=
&
msgqueue_0148cdec_init_func
,
.
dtor
=
msgqueue_0148cdec_dtor
,
};
int
msgqueue_0148cdec_new
(
struct
nvkm_falcon
*
falcon
,
const
struct
nvkm_secboot
*
sb
,
struct
nvkm_msgqueue
**
queue
)
{
struct
msgqueue_0148cdec
*
ret
;
ret
=
kzalloc
(
sizeof
(
*
ret
),
GFP_KERNEL
);
if
(
!
ret
)
return
-
ENOMEM
;
*
queue
=
&
ret
->
base
;
nvkm_msgqueue_ctor
(
&
msgqueue_0148cdec_func
,
falcon
,
&
ret
->
base
);
return
0
;
}
drivers/gpu/drm/nouveau/nvkm/falcon/qmgr.h
浏览文件 @
7a4dde71
...
...
@@ -2,7 +2,6 @@
#ifndef __NVKM_FALCON_QMGR_H__
#define __NVKM_FALCON_QMGR_H__
#include <core/falcon.h>
#include "msgqueue.h"
#define HDR_SIZE sizeof(struct nv_falcon_msg)
#define QUEUE_ALIGNMENT 4
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.c
浏览文件 @
7a4dde71
...
...
@@ -62,6 +62,27 @@ nvkm_acr_bootstrap_falcons(struct nvkm_device *device, unsigned long mask)
return
0
;
}
int
nvkm_acr_boot_ls_falcons
(
struct
nvkm_device
*
device
)
{
struct
nvkm_acr
*
acr
=
device
->
acr
;
struct
nvkm_acr_lsf
*
lsf
;
int
ret
;
if
(
!
acr
)
return
-
ENOSYS
;
list_for_each_entry
(
lsf
,
&
acr
->
lsf
,
head
)
{
if
(
lsf
->
func
->
boot
)
{
ret
=
lsf
->
func
->
boot
(
lsf
->
falcon
);
if
(
ret
)
break
;
}
}
return
ret
;
}
static
void
nvkm_acr_cleanup
(
struct
nvkm_acr
*
acr
)
{
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
浏览文件 @
7a4dde71
...
...
@@ -24,7 +24,6 @@
#include "priv.h"
#include <core/firmware.h>
#include <core/msgqueue.h>
#include <subdev/timer.h>
bool
...
...
@@ -144,7 +143,6 @@ static void *
nvkm_pmu_dtor
(
struct
nvkm_subdev
*
subdev
)
{
struct
nvkm_pmu
*
pmu
=
nvkm_pmu
(
subdev
);
nvkm_msgqueue_del
(
&
pmu
->
queue
);
nvkm_falcon_msgq_del
(
&
pmu
->
msgq
);
nvkm_falcon_cmdq_del
(
&
pmu
->
lpq
);
nvkm_falcon_cmdq_del
(
&
pmu
->
hpq
);
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
浏览文件 @
7a4dde71
...
...
@@ -56,8 +56,19 @@ gm20b_pmu_acr_bootstrap_falcon(struct nvkm_falcon *falcon,
return
ret
;
}
int
gm20b_pmu_acr_boot
(
struct
nvkm_falcon
*
falcon
)
{
struct
nv_pmu_args
args
=
{
.
secure_mode
=
true
};
const
u32
addr_args
=
falcon
->
data
.
limit
-
NVKM_MSGQUEUE_CMDLINE_SIZE
;
/*XXX*/
nvkm_falcon_load_dmem
(
falcon
,
&
args
,
addr_args
,
sizeof
(
args
),
0
);
nvkm_falcon_start
(
falcon
);
return
0
;
}
static
const
struct
nvkm_acr_lsf_func
gm20b_pmu_acr
=
{
.
boot
=
gm20b_pmu_acr_boot
,
.
bootstrap_falcon
=
gm20b_pmu_acr_bootstrap_falcon
,
};
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
浏览文件 @
7a4dde71
...
...
@@ -900,12 +900,12 @@ acr_r352_wpr_is_set(const struct acr_r352 *acr, const struct nvkm_secboot *sb)
wpr_hi
>
wpr_range_lo
&&
wpr_hi
<=
wpr_range_hi
);
}
int
nvkm_acr_boot_ls_falcons
(
struct
nvkm_device
*
);
static
int
acr_r352_bootstrap
(
struct
acr_r352
*
acr
,
struct
nvkm_secboot
*
sb
)
{
const
struct
nvkm_subdev
*
subdev
=
&
sb
->
subdev
;
unsigned
long
managed_falcons
=
acr
->
base
.
managed_falcons
;
int
falcon_id
;
int
ret
;
if
(
sb
->
wpr_set
)
...
...
@@ -934,19 +934,7 @@ acr_r352_bootstrap(struct acr_r352 *acr, struct nvkm_secboot *sb)
return
-
EINVAL
;
}
/* Run LS firmwares post_run hooks */
for_each_set_bit
(
falcon_id
,
&
managed_falcons
,
NVKM_SECBOOT_FALCON_END
)
{
const
struct
acr_r352_ls_func
*
func
=
acr
->
func
->
ls_func
[
falcon_id
];
if
(
func
->
post_run
)
{
ret
=
func
->
post_run
(
&
acr
->
base
,
sb
);
if
(
ret
)
return
ret
;
}
}
return
0
;
return
nvkm_acr_boot_ls_falcons
(
subdev
->
device
);
}
/**
...
...
@@ -1168,7 +1156,6 @@ acr_r352_ls_pmu_func_0 = {
static
const
struct
acr_r352_ls_func
acr_r352_ls_pmu_func
=
{
.
load
=
acr_ls_ucode_load_pmu
,
.
post_run
=
acr_ls_pmu_post_run
,
.
version_max
=
0
,
.
version
=
{
&
acr_r352_ls_pmu_func_0
,
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
浏览文件 @
7a4dde71
...
...
@@ -65,12 +65,10 @@ struct acr_r352_lsf_func {
* struct acr_r352_ls_func - manages a single LS falcon
*
* @load: load the external firmware into a ls_ucode_img
* @post_run: hook called right after the ACR is executed
*/
struct
acr_r352_ls_func
{
int
(
*
load
)(
const
struct
nvkm_secboot
*
,
int
maxver
,
struct
ls_ucode_img
*
);
int
(
*
post_run
)(
const
struct
nvkm_acr
*
,
const
struct
nvkm_secboot
*
);
int
version_max
;
const
struct
acr_r352_lsf_func
*
version
[];
};
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r361.c
浏览文件 @
7a4dde71
...
...
@@ -150,7 +150,6 @@ acr_r361_ls_pmu_func_0 = {
const
struct
acr_r352_ls_func
acr_r361_ls_pmu_func
=
{
.
load
=
acr_ls_ucode_load_pmu
,
.
post_run
=
acr_ls_pmu_post_run
,
.
version_max
=
0
,
.
version
=
{
&
acr_r361_ls_pmu_func_0
,
...
...
@@ -197,7 +196,6 @@ acr_r361_ls_sec2_func_0 = {
static
const
struct
acr_r352_ls_func
acr_r361_ls_sec2_func
=
{
.
load
=
acr_ls_ucode_load_sec2
,
.
post_run
=
acr_ls_sec2_post_run
,
.
version_max
=
0
,
.
version
=
{
&
acr_r361_ls_sec2_func_0
,
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
浏览文件 @
7a4dde71
...
...
@@ -385,7 +385,6 @@ acr_r367_fixup_hs_desc(struct acr_r352 *acr, struct nvkm_secboot *sb,
static
const
struct
acr_r352_ls_func
acr_r367_ls_sec2_func
=
{
.
load
=
acr_ls_ucode_load_sec2
,
.
post_run
=
acr_ls_sec2_post_run
,
.
version_max
=
1
,
.
version
=
{
&
acr_r361_ls_sec2_func_0
,
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r370.c
浏览文件 @
7a4dde71
...
...
@@ -120,7 +120,6 @@ acr_r370_ls_sec2_func_0 = {
const
struct
acr_r352_ls_func
acr_r370_ls_sec2_func
=
{
.
load
=
acr_ls_ucode_load_sec2
,
.
post_run
=
acr_ls_sec2_post_run
,
.
version_max
=
0
,
.
version
=
{
&
acr_r370_ls_sec2_func_0
,
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r375.c
浏览文件 @
7a4dde71
...
...
@@ -63,7 +63,6 @@ acr_r375_ls_pmu_func_0 = {
const
struct
acr_r352_ls_func
acr_r375_ls_pmu_func
=
{
.
load
=
acr_ls_ucode_load_pmu
,
.
post_run
=
acr_ls_pmu_post_run
,
.
version_max
=
0
,
.
version
=
{
&
acr_r375_ls_pmu_func_0
,
...
...
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c
浏览文件 @
7a4dde71
...
...
@@ -75,62 +75,16 @@ acr_ls_ucode_load_msgqueue(const struct nvkm_subdev *subdev, const char *name,
return
ver
;
}
static
int
acr_ls_msgqueue_post_run
(
struct
nvkm_msgqueue
*
queue
,
struct
nvkm_falcon
*
falcon
,
u32
addr_args
)
{
struct
nvkm_device
*
device
=
falcon
->
owner
->
device
;
u8
buf
[
NVKM_MSGQUEUE_CMDLINE_SIZE
];
memset
(
buf
,
0
,
sizeof
(
buf
));
nvkm_msgqueue_write_cmdline
(
queue
,
buf
);
nvkm_falcon_load_dmem
(
falcon
,
buf
,
addr_args
,
sizeof
(
buf
),
0
);
/* Enable interrupts */
nvkm_falcon_wr32
(
falcon
,
0x10
,
0xff
);
nvkm_mc_intr_mask
(
device
,
falcon
->
owner
->
index
,
true
);
/* Start LS firmware on boot falcon */
nvkm_falcon_start
(
falcon
);
return
0
;
}
int
acr_ls_ucode_load_pmu
(
const
struct
nvkm_secboot
*
sb
,
int
maxver
,
struct
ls_ucode_img
*
img
)
{
struct
nvkm_pmu
*
pmu
=
sb
->
subdev
.
device
->
pmu
;
int
ret
;
ret
=
acr_ls_ucode_load_msgqueue
(
&
sb
->
subdev
,
"pmu"
,
maxver
,
img
);
if
(
ret
)
return
ret
;
/* Allocate the PMU queue corresponding to the FW version */
ret
=
nvkm_msgqueue_new
(
img
->
ucode_desc
.
app_version
,
&
pmu
->
falcon
,
sb
,
&
pmu
->
queue
);
if
(
ret
)
return
ret
;
return
0
;
}
int
acr_ls_pmu_post_run
(
const
struct
nvkm_acr
*
acr
,
const
struct
nvkm_secboot
*
sb
)
{
struct
nvkm_device
*
device
=
sb
->
subdev
.
device
;
struct
nvkm_pmu
*
pmu
=
device
->
pmu
;
u32
addr_args
=
pmu
->
falcon
.
data
.
limit
-
NVKM_MSGQUEUE_CMDLINE_SIZE
;
int
ret
;
ret
=
acr_ls_msgqueue_post_run
(
pmu
->
queue
,
&
pmu
->
falcon
,
addr_args
);
if
(
ret
)
return
ret
;
nvkm_debug
(
&
sb
->
subdev
,
"%s started
\n
"
,
nvkm_secboot_falcon_name
[
acr
->
boot_falcon
]);
return
0
;
}
...
...
@@ -138,38 +92,11 @@ int
acr_ls_ucode_load_sec2
(
const
struct
nvkm_secboot
*
sb
,
int
maxver
,
struct
ls_ucode_img
*
img
)
{
struct
nvkm_sec2
*
sec
=
sb
->
subdev
.
device
->
sec2
;
int
ver
,
ret
;
int
ver
;
ver
=
acr_ls_ucode_load_msgqueue
(
&
sb
->
subdev
,
"sec2"
,
maxver
,
img
);
if
(
ver
<
0
)
return
ver
;
/* Allocate the PMU queue corresponding to the FW version */
ret
=
nvkm_msgqueue_new
(
img
->
ucode_desc
.
app_version
,
&
sec
->
falcon
,
sb
,
&
sec
->
queue
);
if
(
ret
)
return
ret
;
return
ver
;
}
int
acr_ls_sec2_post_run
(
const
struct
nvkm_acr
*
acr
,
const
struct
nvkm_secboot
*
sb
)
{
const
struct
nvkm_subdev
*
subdev
=
&
sb
->
subdev
;
struct
nvkm_device
*
device
=
subdev
->
device
;
struct
nvkm_sec2
*
sec
=
device
->
sec2
;
/* on SEC arguments are always at the beginning of EMEM */
const
u32
addr_args
=
0x01000000
;
int
ret
;
ret
=
acr_ls_msgqueue_post_run
(
sec
->
queue
,
&
sec
->
falcon
,
addr_args
);
if
(
ret
)
return
ret
;
nvkm_debug
(
&
sb
->
subdev
,
"%s started
\n
"
,
nvkm_secboot_falcon_name
[
acr
->
boot_falcon
]);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录