Having access to the secboot instance loading a LS firmware can be
useful to LS firmware handlers. At least more useful than just having an
out-of-context subdev pointer.

GP10B's firmware will also need to know the WPR address, which can be
obtained from the secboot instance.

Signed-off-by: Alexandre Courbot <acour...@nvidia.com>
---
 drm/nouveau/include/nvkm/core/msgqueue.h            |  4 +++-
 drm/nouveau/nvkm/falcon/msgqueue.c                  |  7 ++++---
 drm/nouveau/nvkm/falcon/msgqueue.h                  |  6 ++++--
 drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c         |  3 ++-
 drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c         |  3 ++-
 drm/nouveau/nvkm/subdev/secboot/acr_r352.c          | 11 +++++++----
 drm/nouveau/nvkm/subdev/secboot/acr_r352.h          |  4 +++-
 drm/nouveau/nvkm/subdev/secboot/acr_r367.c          |  3 ++-
 drm/nouveau/nvkm/subdev/secboot/acr_r367.h          |  1 +
 drm/nouveau/nvkm/subdev/secboot/ls_ucode.h          |  8 ++++----
 drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c       | 10 ++++------
 drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c | 18 ++++++++----------
 12 files changed, 44 insertions(+), 34 deletions(-)

diff --git a/drm/nouveau/include/nvkm/core/msgqueue.h 
b/drm/nouveau/include/nvkm/core/msgqueue.h
index 5c902f8c042a..26f288bcef76 100644
--- a/drm/nouveau/include/nvkm/core/msgqueue.h
+++ b/drm/nouveau/include/nvkm/core/msgqueue.h
@@ -24,6 +24,7 @@
 #define __NVKM_CORE_MSGQUEUE_H
 
 #include <core/os.h>
+#include <subdev/secboot.h>
 
 struct nvkm_falcon;
 struct nvkm_msgqueue;
@@ -32,7 +33,8 @@ enum nvkm_secboot_falcon;
 /* Hopefully we will never have firmware arguments larger than that... */
 #define NVKM_MSGQUEUE_CMDLINE_SIZE 0x100
 
-int nvkm_msgqueue_new(u32, struct nvkm_falcon *, struct nvkm_msgqueue **);
+int nvkm_msgqueue_new(u32, struct nvkm_falcon *, const struct nvkm_secboot *,
+                     struct nvkm_msgqueue **);
 void nvkm_msgqueue_del(struct nvkm_msgqueue **);
 void nvkm_msgqueue_recv(struct nvkm_msgqueue *);
 int nvkm_msgqueue_reinit(struct nvkm_msgqueue *);
diff --git a/drm/nouveau/nvkm/falcon/msgqueue.c 
b/drm/nouveau/nvkm/falcon/msgqueue.c
index 0780d340c3eb..f7101a910bc7 100644
--- a/drm/nouveau/nvkm/falcon/msgqueue.c
+++ b/drm/nouveau/nvkm/falcon/msgqueue.c
@@ -491,17 +491,18 @@ nvkm_msgqueue_acr_boot_falcons(struct nvkm_msgqueue 
*queue,
 }
 
 int
-nvkm_msgqueue_new(u32 version, struct nvkm_falcon *falcon, struct 
nvkm_msgqueue **queue)
+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, queue);
+               ret = msgqueue_0137c63d_new(falcon, sb, queue);
                break;
        case 0x0148cdec:
-               ret = msgqueue_0148cdec_new(falcon, queue);
+               ret = msgqueue_0148cdec_new(falcon, sb, queue);
                break;
        default:
                nvkm_error(subdev, "unhandled firmware version 0x%08x\n",
diff --git a/drm/nouveau/nvkm/falcon/msgqueue.h 
b/drm/nouveau/nvkm/falcon/msgqueue.h
index ea67a522a12e..2b3a6c3b8f6a 100644
--- a/drm/nouveau/nvkm/falcon/msgqueue.h
+++ b/drm/nouveau/nvkm/falcon/msgqueue.h
@@ -203,7 +203,9 @@ int nvkm_msgqueue_post(struct nvkm_msgqueue *, enum 
msgqueue_msg_priority,
 void nvkm_msgqueue_process_msgs(struct nvkm_msgqueue *,
                                struct nvkm_msgqueue_queue *);
 
-int msgqueue_0137c63d_new(struct nvkm_falcon *, struct nvkm_msgqueue **);
-int msgqueue_0148cdec_new(struct nvkm_falcon *, struct nvkm_msgqueue **);
+int msgqueue_0137c63d_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
diff --git a/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c 
b/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
index bba91207fb18..935b9a7e60a9 100644
--- a/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
+++ b/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
@@ -307,7 +307,8 @@ msgqueue_0137c63d_func = {
 };
 
 int
-msgqueue_0137c63d_new(struct nvkm_falcon *falcon, struct nvkm_msgqueue **queue)
+msgqueue_0137c63d_new(struct nvkm_falcon *falcon, const struct nvkm_secboot 
*sb,
+                     struct nvkm_msgqueue **queue)
 {
        struct msgqueue_0137c63d *ret;
 
diff --git a/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c 
b/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
index ed5d0da4f4e9..9424803b9ef4 100644
--- a/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
+++ b/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
@@ -247,7 +247,8 @@ msgqueue_0148cdec_func = {
 };
 
 int
-msgqueue_0148cdec_new(struct nvkm_falcon *falcon, struct nvkm_msgqueue **queue)
+msgqueue_0148cdec_new(struct nvkm_falcon *falcon, const struct nvkm_secboot 
*sb,
+                     struct nvkm_msgqueue **queue)
 {
        struct msgqueue_0148cdec *ret;
 
diff --git a/drm/nouveau/nvkm/subdev/secboot/acr_r352.c 
b/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
index aa4e75f0eb0a..3cb4b1953f99 100644
--- a/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
+++ b/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
@@ -241,6 +241,7 @@ struct ls_ucode_img_r352 {
  */
 struct ls_ucode_img *
 acr_r352_ls_ucode_img_load(const struct acr_r352 *acr,
+                          const struct nvkm_secboot *sb,
                           enum nvkm_secboot_falcon falcon_id)
 {
        const struct nvkm_subdev *subdev = acr->base.subdev;
@@ -253,7 +254,7 @@ acr_r352_ls_ucode_img_load(const struct acr_r352 *acr,
 
        img->base.falcon_id = falcon_id;
 
-       ret = acr->func->ls_func[falcon_id]->load(subdev, &img->base);
+       ret = acr->func->ls_func[falcon_id]->load(sb, &img->base);
 
        if (ret) {
                kfree(img->base.ucode_data);
@@ -462,12 +463,14 @@ acr_r352_ls_write_wpr(struct acr_r352 *acr, struct 
list_head *imgs,
  * will be copied into the WPR region by the HS firmware.
  */
 static int
-acr_r352_prepare_ls_blob(struct acr_r352 *acr, u64 wpr_addr, u32 wpr_size)
+acr_r352_prepare_ls_blob(struct acr_r352 *acr, struct nvkm_secboot *sb)
 {
        const struct nvkm_subdev *subdev = acr->base.subdev;
        struct list_head imgs;
        struct ls_ucode_img *img, *t;
        unsigned long managed_falcons = acr->base.managed_falcons;
+       u64 wpr_addr = sb->wpr_addr;
+       u32 wpr_size = sb->wpr_size;
        int managed_count = 0;
        u32 image_wpr_size, ls_blob_size;
        int falcon_id;
@@ -479,7 +482,7 @@ acr_r352_prepare_ls_blob(struct acr_r352 *acr, u64 
wpr_addr, u32 wpr_size)
        for_each_set_bit(falcon_id, &managed_falcons, NVKM_SECBOOT_FALCON_END) {
                struct ls_ucode_img *img;
 
-               img = acr->func->ls_ucode_img_load(acr, falcon_id);
+               img = acr->func->ls_ucode_img_load(acr, sb, falcon_id);
                if (IS_ERR(img)) {
                        if (acr->base.optional_falcons & BIT(falcon_id)) {
                                managed_falcons &= ~BIT(falcon_id);
@@ -704,7 +707,7 @@ acr_r352_load_blobs(struct acr_r352 *acr, struct 
nvkm_secboot *sb)
                return 0;
 
        /* Load and prepare the managed falcon's firmwares */
-       ret = acr_r352_prepare_ls_blob(acr, sb->wpr_addr, sb->wpr_size);
+       ret = acr_r352_prepare_ls_blob(acr, sb);
        if (ret)
                return ret;
 
diff --git a/drm/nouveau/nvkm/subdev/secboot/acr_r352.h 
b/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
index 6e88520566c9..9b9156c9c814 100644
--- a/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
+++ b/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
@@ -57,7 +57,7 @@ hsf_load_header_app_size(const struct hsf_load_header *hdr, 
u32 app)
  * @lhdr_flags: LS flags
  */
 struct acr_r352_ls_func {
-       int (*load)(const struct nvkm_subdev *, struct ls_ucode_img *);
+       int (*load)(const struct nvkm_secboot *, struct ls_ucode_img *);
        void (*generate_bl_desc)(const struct nvkm_acr *,
                                 const struct ls_ucode_img *, u64, void *);
        u32 bl_desc_size;
@@ -82,6 +82,7 @@ struct acr_r352_func {
        bool shadow_blob;
 
        struct ls_ucode_img *(*ls_ucode_img_load)(const struct acr_r352 *,
+                                                 const struct nvkm_secboot *,
                                                  enum nvkm_secboot_falcon);
        int (*ls_fill_headers)(struct acr_r352 *, struct list_head *);
        int (*ls_write_wpr)(struct acr_r352 *, struct list_head *,
@@ -145,6 +146,7 @@ struct nvkm_acr *acr_r352_new_(const struct acr_r352_func *,
                               enum nvkm_secboot_falcon, unsigned long);
 
 struct ls_ucode_img *acr_r352_ls_ucode_img_load(const struct acr_r352 *,
+                                               const struct nvkm_secboot *,
                                                enum nvkm_secboot_falcon);
 int acr_r352_ls_fill_headers(struct acr_r352 *, struct list_head *);
 int acr_r352_ls_write_wpr(struct acr_r352 *, struct list_head *,
diff --git a/drm/nouveau/nvkm/subdev/secboot/acr_r367.c 
b/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
index f860713642f1..866877b88797 100644
--- a/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
+++ b/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
@@ -107,6 +107,7 @@ struct ls_ucode_img_r367 {
 
 struct ls_ucode_img *
 acr_r367_ls_ucode_img_load(const struct acr_r352 *acr,
+                          const struct nvkm_secboot *sb,
                           enum nvkm_secboot_falcon falcon_id)
 {
        const struct nvkm_subdev *subdev = acr->base.subdev;
@@ -119,7 +120,7 @@ acr_r367_ls_ucode_img_load(const struct acr_r352 *acr,
 
        img->base.falcon_id = falcon_id;
 
-       ret = acr->func->ls_func[falcon_id]->load(subdev, &img->base);
+       ret = acr->func->ls_func[falcon_id]->load(sb, &img->base);
        if (ret) {
                kfree(img->base.ucode_data);
                kfree(img->base.sig);
diff --git a/drm/nouveau/nvkm/subdev/secboot/acr_r367.h 
b/drm/nouveau/nvkm/subdev/secboot/acr_r367.h
index ec6a71ca36be..8bdfb3e5cd1c 100644
--- a/drm/nouveau/nvkm/subdev/secboot/acr_r367.h
+++ b/drm/nouveau/nvkm/subdev/secboot/acr_r367.h
@@ -28,6 +28,7 @@
 void acr_r367_fixup_hs_desc(struct acr_r352 *, struct nvkm_secboot *, void *);
 
 struct ls_ucode_img *acr_r367_ls_ucode_img_load(const struct acr_r352 *,
+                                               const struct nvkm_secboot *,
                                                enum nvkm_secboot_falcon);
 int acr_r367_ls_fill_headers(struct acr_r352 *, struct list_head *);
 int acr_r367_ls_write_wpr(struct acr_r352 *, struct list_head *,
diff --git a/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h 
b/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h
index 4ff9138a2a83..11b88d0c4daf 100644
--- a/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h
+++ b/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h
@@ -147,11 +147,11 @@ struct fw_bl_desc {
        u32 data_size;
 };
 
-int acr_ls_ucode_load_fecs(const struct nvkm_subdev *, struct ls_ucode_img *);
-int acr_ls_ucode_load_gpccs(const struct nvkm_subdev *, struct ls_ucode_img *);
-int acr_ls_ucode_load_pmu(const struct nvkm_subdev *, struct ls_ucode_img *);
+int acr_ls_ucode_load_fecs(const struct nvkm_secboot *, struct ls_ucode_img *);
+int acr_ls_ucode_load_gpccs(const struct nvkm_secboot *, struct ls_ucode_img 
*);
+int acr_ls_ucode_load_pmu(const struct nvkm_secboot *, struct ls_ucode_img *);
 void acr_ls_pmu_post_run(const struct nvkm_acr *, const struct nvkm_secboot *);
-int acr_ls_ucode_load_sec2(const struct nvkm_subdev *, struct ls_ucode_img *);
+int acr_ls_ucode_load_sec2(const struct nvkm_secboot *, struct ls_ucode_img *);
 void acr_ls_sec2_post_run(const struct nvkm_acr *, const struct nvkm_secboot 
*);
 
 #endif
diff --git a/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c 
b/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c
index 40a6df77bb8a..d1cf02d22db1 100644
--- a/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c
+++ b/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c
@@ -144,15 +144,13 @@ error:
 }
 
 int
-acr_ls_ucode_load_fecs(const struct nvkm_subdev *subdev,
-                      struct ls_ucode_img *img)
+acr_ls_ucode_load_fecs(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
 {
-       return ls_ucode_img_load_gr(subdev, img, "fecs");
+       return ls_ucode_img_load_gr(&sb->subdev, img, "fecs");
 }
 
 int
-acr_ls_ucode_load_gpccs(const struct nvkm_subdev *subdev,
-                       struct ls_ucode_img *img)
+acr_ls_ucode_load_gpccs(const struct nvkm_secboot *sb, struct ls_ucode_img 
*img)
 {
-       return ls_ucode_img_load_gr(subdev, img, "gpccs");
+       return ls_ucode_img_load_gr(&sb->subdev, img, "gpccs");
 }
diff --git a/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c 
b/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c
index ef0b298b70d7..97c14c16e5af 100644
--- a/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c
+++ b/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c
@@ -88,19 +88,18 @@ acr_ls_msgqueue_post_run(struct nvkm_msgqueue *queue,
 }
 
 int
-acr_ls_ucode_load_pmu(const struct nvkm_subdev *subdev,
-                     struct ls_ucode_img *img)
+acr_ls_ucode_load_pmu(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
 {
-       struct nvkm_pmu *pmu = subdev->device->pmu;
+       struct nvkm_pmu *pmu = sb->subdev.device->pmu;
        int ret;
 
-       ret = acr_ls_ucode_load_msgqueue(subdev, "pmu", img);
+       ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "pmu", 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,
-                               &pmu->queue);
+                               sb, &pmu->queue);
        if (ret)
                return ret;
 
@@ -118,19 +117,18 @@ acr_ls_pmu_post_run(const struct nvkm_acr *acr, const 
struct nvkm_secboot *sb)
 }
 
 int
-acr_ls_ucode_load_sec2(const struct nvkm_subdev *subdev,
-                      struct ls_ucode_img *img)
+acr_ls_ucode_load_sec2(const struct nvkm_secboot *sb, struct ls_ucode_img *img)
 {
-       struct nvkm_sec2 *sec = subdev->device->sec2;
+       struct nvkm_sec2 *sec = sb->subdev.device->sec2;
        int ret;
 
-       ret = acr_ls_ucode_load_msgqueue(subdev, "sec2", img);
+       ret = acr_ls_ucode_load_msgqueue(&sb->subdev, "sec2", img);
        if (ret)
                return ret;
 
        /* Allocate the PMU queue corresponding to the FW version */
        ret = nvkm_msgqueue_new(img->ucode_desc.app_version, sec->falcon,
-                               &sec->queue);
+                               sb, &sec->queue);
        if (ret)
                return ret;
 
-- 
2.12.0

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to