forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c
....@@ -68,10 +68,13 @@
6868
6969 if (nvbios_M0203Em(bios, ramcfg, &ver, &hdr, &M0203E)) {
7070 switch (M0203E.type) {
71
- case M0203E_TYPE_DDR2 : return NVKM_RAM_TYPE_DDR2;
72
- case M0203E_TYPE_DDR3 : return NVKM_RAM_TYPE_DDR3;
73
- case M0203E_TYPE_GDDR3: return NVKM_RAM_TYPE_GDDR3;
74
- case M0203E_TYPE_GDDR5: return NVKM_RAM_TYPE_GDDR5;
71
+ case M0203E_TYPE_DDR2 : return NVKM_RAM_TYPE_DDR2;
72
+ case M0203E_TYPE_DDR3 : return NVKM_RAM_TYPE_DDR3;
73
+ case M0203E_TYPE_GDDR3 : return NVKM_RAM_TYPE_GDDR3;
74
+ case M0203E_TYPE_GDDR5 : return NVKM_RAM_TYPE_GDDR5;
75
+ case M0203E_TYPE_GDDR5X: return NVKM_RAM_TYPE_GDDR5X;
76
+ case M0203E_TYPE_GDDR6 : return NVKM_RAM_TYPE_GDDR6;
77
+ case M0203E_TYPE_HBM2 : return NVKM_RAM_TYPE_HBM2;
7578 default:
7679 nvkm_warn(subdev, "M0203E type %02x\n", M0203E.type);
7780 return NVKM_RAM_TYPE_UNKNOWN;
....@@ -123,6 +126,34 @@
123126 }
124127
125128 static int
129
+nvkm_fb_init_scrub_vpr(struct nvkm_fb *fb)
130
+{
131
+ struct nvkm_subdev *subdev = &fb->subdev;
132
+ int ret;
133
+
134
+ nvkm_debug(subdev, "VPR locked, running scrubber binary\n");
135
+
136
+ if (!fb->vpr_scrubber.size) {
137
+ nvkm_warn(subdev, "VPR locked, but no scrubber binary!\n");
138
+ return 0;
139
+ }
140
+
141
+ ret = fb->func->vpr.scrub(fb);
142
+ if (ret) {
143
+ nvkm_error(subdev, "VPR scrubber binary failed\n");
144
+ return ret;
145
+ }
146
+
147
+ if (fb->func->vpr.scrub_required(fb)) {
148
+ nvkm_error(subdev, "VPR still locked after scrub!\n");
149
+ return -EIO;
150
+ }
151
+
152
+ nvkm_debug(subdev, "VPR scrubber binary successful\n");
153
+ return 0;
154
+}
155
+
156
+static int
126157 nvkm_fb_init(struct nvkm_subdev *subdev)
127158 {
128159 struct nvkm_fb *fb = nvkm_fb(subdev);
....@@ -151,6 +182,14 @@
151182
152183 if (fb->func->init_unkn)
153184 fb->func->init_unkn(fb);
185
+
186
+ if (fb->func->vpr.scrub_required &&
187
+ fb->func->vpr.scrub_required(fb)) {
188
+ ret = nvkm_fb_init_scrub_vpr(fb);
189
+ if (ret)
190
+ return ret;
191
+ }
192
+
154193 return 0;
155194 }
156195
....@@ -169,6 +208,8 @@
169208 nvkm_mm_fini(&fb->tags);
170209 nvkm_ram_del(&fb->ram);
171210
211
+ nvkm_blob_dtor(&fb->vpr_scrubber);
212
+
172213 if (fb->func->dtor)
173214 return fb->func->dtor(fb);
174215 return fb;