drm/nouveau/secboot: pass instance to LS firmware loaders
authorAlexandre Courbot <acourbot@nvidia.com>
Wed, 29 Mar 2017 09:31:10 +0000 (18:31 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 6 Apr 2017 04:39:04 +0000 (14:39 +1000)
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 <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
12 files changed:
drivers/gpu/drm/nouveau/include/nvkm/core/msgqueue.h
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.c
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue.h
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0137c63d.c
drivers/gpu/drm/nouveau/nvkm/falcon/msgqueue_0148cdec.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.h
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r367.h
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode.h
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_gr.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/ls_ucode_msgqueue.c

index 5c902f8c042a1fafc8e4037c3bfb0a6c3f140272..bf3e532665fbf93b91d87611c1dc0a623d73c9bf 100644 (file)
 
 #ifndef __NVKM_CORE_MSGQUEUE_H
 #define __NVKM_CORE_MSGQUEUE_H
-
-#include <core/os.h>
-
-struct nvkm_falcon;
+#include <subdev/secboot.h>
 struct nvkm_msgqueue;
-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 *);
index 0780d340c3eb207d79991051118ea8727ea343b4..f7101a910bc78fedde7bbbc82f2a0d6736fc2d63 100644 (file)
@@ -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",
index ea67a522a12e8d0495fc84df421799623cb7da7b..2b3a6c3b8f6ae044a85814a1c4aa0425b9ed64f7 100644 (file)
@@ -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
index bba91207fb18f262c76f89a4f36bc4163150494a..935b9a7e60a9ec5ed2af498ae1beb21fbf553f49 100644 (file)
@@ -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;
 
index ed5d0da4f4e92147f0ec624712d4cf1f8655356c..9424803b9ef499d9c15b4102e6789f277863319d 100644 (file)
@@ -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;
 
index aa4e75f0eb0ab1fa85d74cc2b7d63a5b25d14ac9..3cb4b1953f9985f67ded553312083534d13f5b3a 100644 (file)
@@ -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;
 
index 6e88520566c9c8d2d7dbd8190d1fa146afba6eb5..9b9156c9c81486a00ce951021599dabc76146d20 100644 (file)
@@ -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 *,
index f860713642f1a64dff0b8b9d60cb1b36976e5400..866877b88797b568f2d604f156ed2ad4118538f3 100644 (file)
@@ -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);
index ec6a71ca36be8b0e09367fc1594ddd77194675ad..8bdfb3e5cd1cf888f4d14cc9597755b4611c35cc 100644 (file)
@@ -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 *,
index 4ff9138a2a83e9f03cfb9c245c65fd8c87fcf79f..11b88d0c4daf2650226b3436731de4661349d729 100644 (file)
@@ -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
index 40a6df77bb8a7ab8c43e9fe05cab030051f5584f..d1cf02d22db1ff24926ddd881b7f15cbcd78d82c 100644 (file)
@@ -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");
 }
index ef0b298b70d7659fdab3b20a0fa399f41a5e5acc..97c14c16e5af0853cdc4da04882d40757498e507 100644 (file)
@@ -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;