48 for (i = 0; i <= (size - len); i++) {
49 for (j = 0; j < len; j++)
50 if ((
char)data[i +
j] != str[
j])
59 #if defined(__powerpc__)
68 dn = pci_device_to_OF_node(pdev);
70 nv_info(bios,
"Unable to get the OF node\n");
92 u64 addr = (
u64)(nv_rd32(bios, 0x619f04) & 0xffffff00) << 8;
94 addr = (
u64)nv_rd32(bios, 0x001700) << 16;
98 bar0 = nv_mask(bios, 0x001700, 0xffffffff, addr >> 16);
102 if (nv_rd08(bios, 0x700000) != 0x55 ||
103 nv_rd08(bios, 0x700001) != 0xaa)
106 bios->
size = nv_rd08(bios, 0x700002) * 512;
112 for (i = 0; i < bios->
size; i++)
113 nv_wo08(bios, i, nv_rd08(bios, 0x700000 + i));
118 nv_wr32(bios, 0x001700, bar0);
134 access = nv_mask(bios, pcireg, 0x00000001, 0x00000000);
143 if (nv_rd08(bios, 0x300000) == 0x55)
147 if (!i || nv_rd08(bios, 0x300001) != 0xaa)
151 pcir = nv_rd08(bios, 0x300018) |
152 nv_rd08(bios, 0x300019) << 8;
153 if (nv_rd08(bios, 0x300000 + pcir) !=
'P' ||
154 nv_rd08(bios, 0x300001 + pcir) !=
'C' ||
155 nv_rd08(bios, 0x300002 + pcir) !=
'I' ||
156 nv_rd08(bios, 0x300003 + pcir) !=
'R')
160 bios->
size = nv_rd08(bios, 0x300002) * 512;
166 for (i = 0; i < bios->
size; i++)
167 nv_wo08(bios, i, nv_rd08(bios, 0x300000 + i));
172 nv_wr32(bios, pcireg, access);
175 #if defined(CONFIG_ACPI)
193 struct pci_dev *pdev = nv_device(bios)->pdev;
213 for (i = 0; bios->
data && i < bios->
size; i +=
cnt) {
224 struct pci_dev *pdev = nv_device(bios)->pdev;
246 if (bios->
size < 3 || !bios->
data || bios->
data[0] != 0x55 ||
247 bios->
data[1] != 0xAA) {
248 nv_info(bios,
"... signature not found\n");
254 nv_info(bios,
"... checksum invalid\n");
256 return writeable ? 2 : 1;
259 nv_info(bios,
"... appears to be valid\n");
275 struct methods shadow_methods[] = {
276 #if defined(__powerpc__)
277 {
"OpenFirmware", nouveau_bios_shadow_of,
true, 0, 0,
NULL },
279 {
"PRAMIN", nouveau_bios_shadow_pramin,
true, 0, 0,
NULL },
280 {
"PROM", nouveau_bios_shadow_prom,
false, 0, 0,
NULL },
281 {
"ACPI", nouveau_bios_shadow_acpi,
true, 0, 0,
NULL },
282 {
"PCIROM", nouveau_bios_shadow_pci,
true, 0, 0,
NULL },
291 optarg =
nouveau_stropt(nv_device(bios)->cfgopt,
"NvBios", &optlen);
295 mthd = shadow_methods;
302 mthd->
score = nouveau_bios_score(bios, mthd->
rw);
307 }
while ((++mthd)->
shadow);
316 nv_info(bios,
"image: %s\n", source);
317 if (nouveau_bios_score(bios, 1)) {
326 nv_error(bios,
"source \'%s\' invalid\n", source);
330 mthd = shadow_methods;
332 nv_info(bios,
"checking %s for image...\n", mthd->
desc);
334 mthd->
score = nouveau_bios_score(bios, mthd->
rw);
338 }
while (mthd->
score != 3 && (++mthd)->shadow);
340 mthd = shadow_methods;
347 }
while ((++mthd)->
shadow);
350 nv_info(bios,
"using image from %s\n", best->
desc);
356 nv_error(bios,
"unable to locate usable image\n");
371 return get_unaligned_le16(&bios->
data[addr]);
392 put_unaligned_le16(data, &bios->
data[addr]);
413 "VBIOS",
"bios", &bios);
414 *pobject = nv_object(bios);
418 ret = nouveau_bios_shadow(bios);
424 "\xff\x7f""NV\0", 5);
426 nv_info(bios,
"BMP version %x.%x\n",
427 bmp_version(bios) >> 8,
428 bmp_version(bios) & 0xff);
434 nv_info(bios,
"BIT signature found\n");
437 if (!
bit_entry(bios,
'i', &bit_i) && bit_i.length >= 4) {
438 bios->
version.major = nv_ro08(bios, bit_i.offset + 3);
439 bios->
version.chip = nv_ro08(bios, bit_i.offset + 2);
440 bios->
version.minor = nv_ro08(bios, bit_i.offset + 1);
441 bios->
version.micro = nv_ro08(bios, bit_i.offset + 0);
443 if (bmp_version(bios)) {
450 nv_info(bios,
"version %02x.%02x.%02x.%02x\n",
483 .ctor = nouveau_bios_ctor,
484 .dtor = nouveau_bios_dtor,
485 .init = nouveau_bios_init,
486 .fini = nouveau_bios_fini,
487 .rd08 = nouveau_bios_rd08,
488 .rd16 = nouveau_bios_rd16,
489 .rd32 = nouveau_bios_rd32,
490 .wr08 = nouveau_bios_wr08,
491 .wr16 = nouveau_bios_wr16,
492 .wr32 = nouveau_bios_wr32,