Lines Matching refs:init

31 #include <subdev/bios/init.h>
42 nvkm_printk(init->subdev, lvl, info, "0x%08x[%c]: "fmt, \
43 init->offset, init_exec(init) ? \
44 '0' + (init->nested - 1) : ' ', ##args); \
47 if (init->subdev->debug >= NV_DBG_TRACE) \
55 * init parser control flow helpers
59 init_exec(struct nvbios_init *init)
61 return (init->execute == 1) || ((init->execute & 5) == 5);
65 init_exec_set(struct nvbios_init *init, bool exec)
67 if (exec) init->execute &= 0xfd;
68 else init->execute |= 0x02;
72 init_exec_inv(struct nvbios_init *init)
74 init->execute ^= 0x02;
78 init_exec_force(struct nvbios_init *init, bool exec)
80 if (exec) init->execute |= 0x04;
81 else init->execute &= 0xfb;
85 * init parser wrappers for normal register/i2c/whatever accessors
89 init_or(struct nvbios_init *init)
91 if (init_exec(init)) {
92 if (init->or >= 0)
93 return init->or;
100 init_link(struct nvbios_init *init)
102 if (init_exec(init)) {
103 if (init->link)
104 return init->link == 2;
111 init_head(struct nvbios_init *init)
113 if (init_exec(init)) {
114 if (init->head >= 0)
115 return init->head;
122 init_conn(struct nvbios_init *init)
124 struct nvkm_bios *bios = init->subdev->device->bios;
129 if (init_exec(init)) {
130 if (init->outp) {
131 conn = init->outp->connector;
144 init_nvreg(struct nvbios_init *init, u32 reg)
146 struct nvkm_devinit *devinit = init->subdev->device->devinit;
159 if (init->subdev->device->card_type >= NV_50) {
161 reg += init_head(init) * 0x800;
166 reg += init_or(init) * 0x800;
169 reg += init_link(init) * 0x80;
182 init_rd32(struct nvbios_init *init, u32 reg)
184 struct nvkm_device *device = init->subdev->device;
185 reg = init_nvreg(init, reg);
186 if (reg != ~0 && init_exec(init))
192 init_wr32(struct nvbios_init *init, u32 reg, u32 val)
194 struct nvkm_device *device = init->subdev->device;
195 reg = init_nvreg(init, reg);
196 if (reg != ~0 && init_exec(init))
201 init_mask(struct nvbios_init *init, u32 reg, u32 mask, u32 val)
203 struct nvkm_device *device = init->subdev->device;
204 reg = init_nvreg(init, reg);
205 if (reg != ~0 && init_exec(init)) {
214 init_rdport(struct nvbios_init *init, u16 port)
216 if (init_exec(init))
217 return nvkm_rdport(init->subdev->device, init->head, port);
222 init_wrport(struct nvbios_init *init, u16 port, u8 value)
224 if (init_exec(init))
225 nvkm_wrport(init->subdev->device, init->head, port, value);
229 init_rdvgai(struct nvbios_init *init, u16 port, u8 index)
231 struct nvkm_subdev *subdev = init->subdev;
232 if (init_exec(init)) {
233 int head = init->head < 0 ? 0 : init->head;
240 init_wrvgai(struct nvbios_init *init, u16 port, u8 index, u8 value)
242 struct nvkm_device *device = init->subdev->device;
247 init->head = 0;
250 if (init_exec(init)) {
251 int head = init->head < 0 ? 0 : init->head;
258 init->head = 1;
263 init_i2c(struct nvbios_init *init, int index)
265 struct nvkm_i2c *i2c = init->subdev->device->i2c;
270 if (init->outp && init->outp->i2c_upper_default)
285 init_rdi2cr(struct nvbios_init *init, u8 index, u8 addr, u8 reg)
287 struct i2c_adapter *adap = init_i2c(init, index);
288 if (adap && init_exec(init))
294 init_wri2cr(struct nvbios_init *init, u8 index, u8 addr, u8 reg, u8 val)
296 struct i2c_adapter *adap = init_i2c(init, index);
297 if (adap && init_exec(init))
303 init_aux(struct nvbios_init *init)
305 struct nvkm_i2c *i2c = init->subdev->device->i2c;
306 if (!init->outp) {
307 if (init_exec(init))
311 return nvkm_i2c_aux_find(i2c, init->outp->i2c_index);
315 init_rdauxr(struct nvbios_init *init, u32 addr)
317 struct nvkm_i2c_aux *aux = init_aux(init);
320 if (aux && init_exec(init)) {
331 init_wrauxr(struct nvbios_init *init, u32 addr, u8 data)
333 struct nvkm_i2c_aux *aux = init_aux(init);
334 if (aux && init_exec(init)) {
344 init_prog_pll(struct nvbios_init *init, u32 id, u32 freq)
346 struct nvkm_devinit *devinit = init->subdev->device->devinit;
347 if (init_exec(init)) {
355 * parsing of bios structures that are required to execute init tables
377 init_table_(struct nvbios_init *init, u16 offset, const char *name)
379 struct nvkm_bios *bios = init->subdev->device->bios;
391 warn("init data too short for %s pointer", name);
395 warn("init data not found\n");
411 struct nvbios_init init = { .subdev = &bios->subdev };
422 data = init_script_table(&init);
439 init_ram_restrict_group_count(struct nvbios_init *init)
441 return nvbios_ramcfg_count(init->subdev->device->bios);
445 init_ram_restrict(struct nvbios_init *init)
455 if (!init->ramcfg || init->subdev->device->bios->version.major < 0x70)
456 init->ramcfg = 0x80000000 | nvbios_ramcfg_index(init->subdev);
457 return (init->ramcfg & 0x7fffffff);
461 init_xlat_(struct nvbios_init *init, u8 index, u8 offset)
463 struct nvkm_bios *bios = init->subdev->device->bios;
464 u16 table = init_xlat_table(init);
475 * utility functions used by various init opcode handlers
479 init_condition_met(struct nvbios_init *init, u8 cond)
481 struct nvkm_bios *bios = init->subdev->device->bios;
482 u16 table = init_condition_table(init);
489 return (init_rd32(init, reg) & msk) == val;
495 init_io_condition_met(struct nvbios_init *init, u8 cond)
497 struct nvkm_bios *bios = init->subdev->device->bios;
498 u16 table = init_io_condition_table(init);
506 return (init_rdvgai(init, port, index) & mask) == value;
512 init_io_flag_condition_met(struct nvbios_init *init, u8 cond)
514 struct nvkm_bios *bios = init->subdev->device->bios;
515 u16 table = init_io_flag_condition_table(init);
524 u8 ioval = (init_rdvgai(init, port, index) & mask) >> shift;
539 init_tmds_reg(struct nvbios_init *init, u8 tmds)
555 if (init->outp) {
556 u32 dacoffset = pramdac_offset[init->outp->or];
562 if (init_exec(init))
575 * init opcode handlers
583 init_reserved(struct nvbios_init *init)
585 struct nvkm_bios *bios = init->subdev->device->bios;
586 u8 opcode = nvbios_rd08(bios, init->offset);
600 cont(" 0x%02x", nvbios_rd08(bios, init->offset + i));
602 init->offset += length;
610 init_done(struct nvbios_init *init)
613 init->offset = 0x0000;
621 init_io_restrict_prog(struct nvbios_init *init)
623 struct nvkm_bios *bios = init->subdev->device->bios;
624 u16 port = nvbios_rd16(bios, init->offset + 1);
625 u8 index = nvbios_rd08(bios, init->offset + 3);
626 u8 mask = nvbios_rd08(bios, init->offset + 4);
627 u8 shift = nvbios_rd08(bios, init->offset + 5);
628 u8 count = nvbios_rd08(bios, init->offset + 6);
629 u32 reg = nvbios_rd32(bios, init->offset + 7);
635 init->offset += 11;
637 conf = (init_rdvgai(init, port, index) & mask) >> shift;
639 u32 data = nvbios_rd32(bios, init->offset);
643 init_wr32(init, reg, data);
648 init->offset += 4;
658 init_repeat(struct nvbios_init *init)
660 struct nvkm_bios *bios = init->subdev->device->bios;
661 u8 count = nvbios_rd08(bios, init->offset + 1);
662 u16 repeat = init->repeat;
665 init->offset += 2;
667 init->repeat = init->offset;
668 init->repend = init->offset;
670 init->offset = init->repeat;
671 nvbios_exec(init);
675 init->offset = init->repend;
676 init->repeat = repeat;
684 init_io_restrict_pll(struct nvbios_init *init)
686 struct nvkm_bios *bios = init->subdev->device->bios;
687 u16 port = nvbios_rd16(bios, init->offset + 1);
688 u8 index = nvbios_rd08(bios, init->offset + 3);
689 u8 mask = nvbios_rd08(bios, init->offset + 4);
690 u8 shift = nvbios_rd08(bios, init->offset + 5);
691 s8 iofc = nvbios_rd08(bios, init->offset + 6);
692 u8 count = nvbios_rd08(bios, init->offset + 7);
693 u32 reg = nvbios_rd32(bios, init->offset + 8);
699 init->offset += 12;
701 conf = (init_rdvgai(init, port, index) & mask) >> shift;
703 u32 freq = nvbios_rd16(bios, init->offset) * 10;
707 if (iofc > 0 && init_io_flag_condition_met(init, iofc))
709 init_prog_pll(init, reg, freq);
714 init->offset += 2;
724 init_end_repeat(struct nvbios_init *init)
727 init->offset += 1;
729 if (init->repeat) {
730 init->repend = init->offset;
731 init->offset = 0;
740 init_copy(struct nvbios_init *init)
742 struct nvkm_bios *bios = init->subdev->device->bios;
743 u32 reg = nvbios_rd32(bios, init->offset + 1);
744 u8 shift = nvbios_rd08(bios, init->offset + 5);
745 u8 smask = nvbios_rd08(bios, init->offset + 6);
746 u16 port = nvbios_rd16(bios, init->offset + 7);
747 u8 index = nvbios_rd08(bios, init->offset + 9);
748 u8 mask = nvbios_rd08(bios, init->offset + 10);
755 init->offset += 11;
757 data = init_rdvgai(init, port, index) & mask;
758 data |= init_shift(init_rd32(init, reg), shift) & smask;
759 init_wrvgai(init, port, index, data);
767 init_not(struct nvbios_init *init)
770 init->offset += 1;
771 init_exec_inv(init);
779 init_io_flag_condition(struct nvbios_init *init)
781 struct nvkm_bios *bios = init->subdev->device->bios;
782 u8 cond = nvbios_rd08(bios, init->offset + 1);
785 init->offset += 2;
787 if (!init_io_flag_condition_met(init, cond))
788 init_exec_set(init, false);
796 init_generic_condition(struct nvbios_init *init)
798 struct nvkm_bios *bios = init->subdev->device->bios;
800 u8 cond = nvbios_rd08(bios, init->offset + 1);
801 u8 size = nvbios_rd08(bios, init->offset + 2);
806 init->offset += 3;
810 if (init_conn(init) != DCB_CONNECTOR_eDP)
811 init_exec_set(init, false);
815 if ( init->outp &&
817 (init->outp->or << 0) |
818 (init->outp->sorconf.link << 6),
822 init_exec_set(init, false);
826 if (init_exec(init))
830 if (!(init_rdauxr(init, 0x0d) & 1))
831 init_exec_set(init, false);
834 init_exec_set(init, false);
838 init->offset += size;
848 init_io_mask_or(struct nvbios_init *init)
850 struct nvkm_bios *bios = init->subdev->device->bios;
851 u8 index = nvbios_rd08(bios, init->offset + 1);
852 u8 or = init_or(init);
856 init->offset += 2;
858 data = init_rdvgai(init, 0x03d4, index);
859 init_wrvgai(init, 0x03d4, index, data &= ~(1 << or));
867 init_io_or(struct nvbios_init *init)
869 struct nvkm_bios *bios = init->subdev->device->bios;
870 u8 index = nvbios_rd08(bios, init->offset + 1);
871 u8 or = init_or(init);
875 init->offset += 2;
877 data = init_rdvgai(init, 0x03d4, index);
878 init_wrvgai(init, 0x03d4, index, data | (1 << or));
886 init_andn_reg(struct nvbios_init *init)
888 struct nvkm_bios *bios = init->subdev->device->bios;
889 u32 reg = nvbios_rd32(bios, init->offset + 1);
890 u32 mask = nvbios_rd32(bios, init->offset + 5);
893 init->offset += 9;
895 init_mask(init, reg, mask, 0);
903 init_or_reg(struct nvbios_init *init)
905 struct nvkm_bios *bios = init->subdev->device->bios;
906 u32 reg = nvbios_rd32(bios, init->offset + 1);
907 u32 mask = nvbios_rd32(bios, init->offset + 5);
910 init->offset += 9;
912 init_mask(init, reg, 0, mask);
920 init_idx_addr_latched(struct nvbios_init *init)
922 struct nvkm_bios *bios = init->subdev->device->bios;
923 u32 creg = nvbios_rd32(bios, init->offset + 1);
924 u32 dreg = nvbios_rd32(bios, init->offset + 5);
925 u32 mask = nvbios_rd32(bios, init->offset + 9);
926 u32 data = nvbios_rd32(bios, init->offset + 13);
927 u8 count = nvbios_rd08(bios, init->offset + 17);
931 init->offset += 18;
934 u8 iaddr = nvbios_rd08(bios, init->offset + 0);
935 u8 idata = nvbios_rd08(bios, init->offset + 1);
938 init->offset += 2;
940 init_wr32(init, dreg, idata);
941 init_mask(init, creg, ~mask, data | iaddr);
950 init_io_restrict_pll2(struct nvbios_init *init)
952 struct nvkm_bios *bios = init->subdev->device->bios;
953 u16 port = nvbios_rd16(bios, init->offset + 1);
954 u8 index = nvbios_rd08(bios, init->offset + 3);
955 u8 mask = nvbios_rd08(bios, init->offset + 4);
956 u8 shift = nvbios_rd08(bios, init->offset + 5);
957 u8 count = nvbios_rd08(bios, init->offset + 6);
958 u32 reg = nvbios_rd32(bios, init->offset + 7);
964 init->offset += 11;
966 conf = (init_rdvgai(init, port, index) & mask) >> shift;
968 u32 freq = nvbios_rd32(bios, init->offset);
971 init_prog_pll(init, reg, freq);
975 init->offset += 4;
985 init_pll2(struct nvbios_init *init)
987 struct nvkm_bios *bios = init->subdev->device->bios;
988 u32 reg = nvbios_rd32(bios, init->offset + 1);
989 u32 freq = nvbios_rd32(bios, init->offset + 5);
992 init->offset += 9;
994 init_prog_pll(init, reg, freq);
1002 init_i2c_byte(struct nvbios_init *init)
1004 struct nvkm_bios *bios = init->subdev->device->bios;
1005 u8 index = nvbios_rd08(bios, init->offset + 1);
1006 u8 addr = nvbios_rd08(bios, init->offset + 2) >> 1;
1007 u8 count = nvbios_rd08(bios, init->offset + 3);
1010 init->offset += 4;
1013 u8 reg = nvbios_rd08(bios, init->offset + 0);
1014 u8 mask = nvbios_rd08(bios, init->offset + 1);
1015 u8 data = nvbios_rd08(bios, init->offset + 2);
1019 init->offset += 3;
1021 val = init_rdi2cr(init, index, addr, reg);
1024 init_wri2cr(init, index, addr, reg, (val & mask) | data);
1033 init_zm_i2c_byte(struct nvbios_init *init)
1035 struct nvkm_bios *bios = init->subdev->device->bios;
1036 u8 index = nvbios_rd08(bios, init->offset + 1);
1037 u8 addr = nvbios_rd08(bios, init->offset + 2) >> 1;
1038 u8 count = nvbios_rd08(bios, init->offset + 3);
1041 init->offset += 4;
1044 u8 reg = nvbios_rd08(bios, init->offset + 0);
1045 u8 data = nvbios_rd08(bios, init->offset + 1);
1048 init->offset += 2;
1050 init_wri2cr(init, index, addr, reg, data);
1059 init_zm_i2c(struct nvbios_init *init)
1061 struct nvkm_bios *bios = init->subdev->device->bios;
1062 u8 index = nvbios_rd08(bios, init->offset + 1);
1063 u8 addr = nvbios_rd08(bios, init->offset + 2) >> 1;
1064 u8 count = nvbios_rd08(bios, init->offset + 3);
1068 init->offset += 4;
1071 data[i] = nvbios_rd08(bios, init->offset);
1073 init->offset++;
1076 if (init_exec(init)) {
1077 struct i2c_adapter *adap = init_i2c(init, index);
1093 init_tmds(struct nvbios_init *init)
1095 struct nvkm_bios *bios = init->subdev->device->bios;
1096 u8 tmds = nvbios_rd08(bios, init->offset + 1);
1097 u8 addr = nvbios_rd08(bios, init->offset + 2);
1098 u8 mask = nvbios_rd08(bios, init->offset + 3);
1099 u8 data = nvbios_rd08(bios, init->offset + 4);
1100 u32 reg = init_tmds_reg(init, tmds);
1104 init->offset += 5;
1109 init_wr32(init, reg + 0, addr | 0x00010000);
1110 init_wr32(init, reg + 4, data | (init_rd32(init, reg + 4) & mask));
1111 init_wr32(init, reg + 0, addr);
1119 init_zm_tmds_group(struct nvbios_init *init)
1121 struct nvkm_bios *bios = init->subdev->device->bios;
1122 u8 tmds = nvbios_rd08(bios, init->offset + 1);
1123 u8 count = nvbios_rd08(bios, init->offset + 2);
1124 u32 reg = init_tmds_reg(init, tmds);
1127 init->offset += 3;
1130 u8 addr = nvbios_rd08(bios, init->offset + 0);
1131 u8 data = nvbios_rd08(bios, init->offset + 1);
1134 init->offset += 2;
1136 init_wr32(init, reg + 4, data);
1137 init_wr32(init, reg + 0, addr);
1146 init_cr_idx_adr_latch(struct nvbios_init *init)
1148 struct nvkm_bios *bios = init->subdev->device->bios;
1149 u8 addr0 = nvbios_rd08(bios, init->offset + 1);
1150 u8 addr1 = nvbios_rd08(bios, init->offset + 2);
1151 u8 base = nvbios_rd08(bios, init->offset + 3);
1152 u8 count = nvbios_rd08(bios, init->offset + 4);
1156 init->offset += 5;
1158 save0 = init_rdvgai(init, 0x03d4, addr0);
1160 u8 data = nvbios_rd08(bios, init->offset);
1163 init->offset += 1;
1165 init_wrvgai(init, 0x03d4, addr0, base++);
1166 init_wrvgai(init, 0x03d4, addr1, data);
1168 init_wrvgai(init, 0x03d4, addr0, save0);
1176 init_cr(struct nvbios_init *init)
1178 struct nvkm_bios *bios = init->subdev->device->bios;
1179 u8 addr = nvbios_rd08(bios, init->offset + 1);
1180 u8 mask = nvbios_rd08(bios, init->offset + 2);
1181 u8 data = nvbios_rd08(bios, init->offset + 3);
1185 init->offset += 4;
1187 val = init_rdvgai(init, 0x03d4, addr) & mask;
1188 init_wrvgai(init, 0x03d4, addr, val | data);
1196 init_zm_cr(struct nvbios_init *init)
1198 struct nvkm_bios *bios = init->subdev->device->bios;
1199 u8 addr = nvbios_rd08(bios, init->offset + 1);
1200 u8 data = nvbios_rd08(bios, init->offset + 2);
1203 init->offset += 3;
1205 init_wrvgai(init, 0x03d4, addr, data);
1213 init_zm_cr_group(struct nvbios_init *init)
1215 struct nvkm_bios *bios = init->subdev->device->bios;
1216 u8 count = nvbios_rd08(bios, init->offset + 1);
1219 init->offset += 2;
1222 u8 addr = nvbios_rd08(bios, init->offset + 0);
1223 u8 data = nvbios_rd08(bios, init->offset + 1);
1226 init->offset += 2;
1228 init_wrvgai(init, 0x03d4, addr, data);
1237 init_condition_time(struct nvbios_init *init)
1239 struct nvkm_bios *bios = init->subdev->device->bios;
1240 u8 cond = nvbios_rd08(bios, init->offset + 1);
1241 u8 retry = nvbios_rd08(bios, init->offset + 2);
1245 init->offset += 3;
1247 if (!init_exec(init))
1251 if (init_condition_met(init, cond))
1256 init_exec_set(init, false);
1264 init_ltime(struct nvbios_init *init)
1266 struct nvkm_bios *bios = init->subdev->device->bios;
1267 u16 msec = nvbios_rd16(bios, init->offset + 1);
1270 init->offset += 3;
1272 if (init_exec(init))
1281 init_zm_reg_sequence(struct nvbios_init *init)
1283 struct nvkm_bios *bios = init->subdev->device->bios;
1284 u32 base = nvbios_rd32(bios, init->offset + 1);
1285 u8 count = nvbios_rd08(bios, init->offset + 5);
1288 init->offset += 6;
1291 u32 data = nvbios_rd32(bios, init->offset);
1294 init->offset += 4;
1296 init_wr32(init, base, data);
1306 init_pll_indirect(struct nvbios_init *init)
1308 struct nvkm_bios *bios = init->subdev->device->bios;
1309 u32 reg = nvbios_rd32(bios, init->offset + 1);
1310 u16 addr = nvbios_rd16(bios, init->offset + 5);
1315 init->offset += 7;
1317 init_prog_pll(init, reg, freq);
1325 init_zm_reg_indirect(struct nvbios_init *init)
1327 struct nvkm_bios *bios = init->subdev->device->bios;
1328 u32 reg = nvbios_rd32(bios, init->offset + 1);
1329 u16 addr = nvbios_rd16(bios, init->offset + 5);
1334 init->offset += 7;
1336 init_wr32(init, addr, data);
1344 init_sub_direct(struct nvbios_init *init)
1346 struct nvkm_bios *bios = init->subdev->device->bios;
1347 u16 addr = nvbios_rd16(bios, init->offset + 1);
1352 if (init_exec(init)) {
1353 save = init->offset;
1354 init->offset = addr;
1355 if (nvbios_exec(init)) {
1359 init->offset = save;
1362 init->offset += 3;
1370 init_jump(struct nvbios_init *init)
1372 struct nvkm_bios *bios = init->subdev->device->bios;
1373 u16 offset = nvbios_rd16(bios, init->offset + 1);
1377 if (init_exec(init))
1378 init->offset = offset;
1380 init->offset += 3;
1388 init_i2c_if(struct nvbios_init *init)
1390 struct nvkm_bios *bios = init->subdev->device->bios;
1391 u8 index = nvbios_rd08(bios, init->offset + 1);
1392 u8 addr = nvbios_rd08(bios, init->offset + 2);
1393 u8 reg = nvbios_rd08(bios, init->offset + 3);
1394 u8 mask = nvbios_rd08(bios, init->offset + 4);
1395 u8 data = nvbios_rd08(bios, init->offset + 5);
1400 init->offset += 6;
1401 init_exec_force(init, true);
1403 value = init_rdi2cr(init, index, addr, reg);
1405 init_exec_set(init, false);
1407 init_exec_force(init, false);
1415 init_copy_nv_reg(struct nvbios_init *init)
1417 struct nvkm_bios *bios = init->subdev->device->bios;
1418 u32 sreg = nvbios_rd32(bios, init->offset + 1);
1419 u8 shift = nvbios_rd08(bios, init->offset + 5);
1420 u32 smask = nvbios_rd32(bios, init->offset + 6);
1421 u32 sxor = nvbios_rd32(bios, init->offset + 10);
1422 u32 dreg = nvbios_rd32(bios, init->offset + 14);
1423 u32 dmask = nvbios_rd32(bios, init->offset + 18);
1430 init->offset += 22;
1432 data = init_shift(init_rd32(init, sreg), shift);
1433 init_mask(init, dreg, ~dmask, (data & smask) ^ sxor);
1441 init_zm_index_io(struct nvbios_init *init)
1443 struct nvkm_bios *bios = init->subdev->device->bios;
1444 u16 port = nvbios_rd16(bios, init->offset + 1);
1445 u8 index = nvbios_rd08(bios, init->offset + 3);
1446 u8 data = nvbios_rd08(bios, init->offset + 4);
1449 init->offset += 5;
1451 init_wrvgai(init, port, index, data);
1459 init_compute_mem(struct nvbios_init *init)
1461 struct nvkm_devinit *devinit = init->subdev->device->devinit;
1464 init->offset += 1;
1466 init_exec_force(init, true);
1467 if (init_exec(init))
1469 init_exec_force(init, false);
1477 init_reset(struct nvbios_init *init)
1479 struct nvkm_bios *bios = init->subdev->device->bios;
1480 u32 reg = nvbios_rd32(bios, init->offset + 1);
1481 u32 data1 = nvbios_rd32(bios, init->offset + 5);
1482 u32 data2 = nvbios_rd32(bios, init->offset + 9);
1486 init->offset += 13;
1487 init_exec_force(init, true);
1489 savepci19 = init_mask(init, 0x00184c, 0x00000f00, 0x00000000);
1490 init_wr32(init, reg, data1);
1492 init_wr32(init, reg, data2);
1493 init_wr32(init, 0x00184c, savepci19);
1494 init_mask(init, 0x001850, 0x00000001, 0x00000000);
1496 init_exec_force(init, false);
1504 init_configure_mem_clk(struct nvbios_init *init)
1506 u16 mdata = bmp_mem_init_table(init->subdev->device->bios);
1508 mdata += (init_rdvgai(init, 0x03d4, 0x3c) >> 4) * 66;
1513 init_configure_mem(struct nvbios_init *init)
1515 struct nvkm_bios *bios = init->subdev->device->bios;
1520 init->offset += 1;
1523 init_done(init);
1526 init_exec_force(init, true);
1528 mdata = init_configure_mem_clk(init);
1534 data = init_rdvgai(init, 0x03c4, 0x01);
1535 init_wrvgai(init, 0x03c4, 0x01, data | 0x20);
1552 init_wr32(init, addr, data);
1555 init_exec_force(init, false);
1563 init_configure_clk(struct nvbios_init *init)
1565 struct nvkm_bios *bios = init->subdev->device->bios;
1569 init->offset += 1;
1572 init_done(init);
1575 init_exec_force(init, true);
1577 mdata = init_configure_mem_clk(init);
1581 init_prog_pll(init, 0x680500, clock);
1587 init_prog_pll(init, 0x680504, clock);
1589 init_exec_force(init, false);
1597 init_configure_preinit(struct nvbios_init *init)
1599 struct nvkm_bios *bios = init->subdev->device->bios;
1603 init->offset += 1;
1606 init_done(init);
1609 init_exec_force(init, true);
1611 strap = init_rd32(init, 0x101000);
1613 init_wrvgai(init, 0x03d4, 0x3c, strap);
1615 init_exec_force(init, false);
1623 init_io(struct nvbios_init *init)
1625 struct nvkm_bios *bios = init->subdev->device->bios;
1626 u16 port = nvbios_rd16(bios, init->offset + 1);
1627 u8 mask = nvbios_rd16(bios, init->offset + 3);
1628 u8 data = nvbios_rd16(bios, init->offset + 4);
1632 init->offset += 5;
1640 init_mask(init, 0x614100, 0xf0800000, 0x00800000);
1641 init_mask(init, 0x00e18c, 0x00020000, 0x00020000);
1642 init_mask(init, 0x614900, 0xf0800000, 0x00800000);
1643 init_mask(init, 0x000200, 0x40000000, 0x00000000);
1645 init_mask(init, 0x00e18c, 0x00020000, 0x00000000);
1646 init_mask(init, 0x000200, 0x40000000, 0x40000000);
1647 init_wr32(init, 0x614100, 0x00800018);
1648 init_wr32(init, 0x614900, 0x00800018);
1650 init_wr32(init, 0x614100, 0x10000018);
1651 init_wr32(init, 0x614900, 0x10000018);
1654 value = init_rdport(init, port) & mask;
1655 init_wrport(init, port, data | value);
1663 init_sub(struct nvbios_init *init)
1665 struct nvkm_bios *bios = init->subdev->device->bios;
1666 u8 index = nvbios_rd08(bios, init->offset + 1);
1672 if (addr && init_exec(init)) {
1673 save = init->offset;
1674 init->offset = addr;
1675 if (nvbios_exec(init)) {
1679 init->offset = save;
1682 init->offset += 2;
1690 init_ram_condition(struct nvbios_init *init)
1692 struct nvkm_bios *bios = init->subdev->device->bios;
1693 u8 mask = nvbios_rd08(bios, init->offset + 1);
1694 u8 value = nvbios_rd08(bios, init->offset + 2);
1698 init->offset += 3;
1700 if ((init_rd32(init, 0x100000) & mask) != value)
1701 init_exec_set(init, false);
1709 init_nv_reg(struct nvbios_init *init)
1711 struct nvkm_bios *bios = init->subdev->device->bios;
1712 u32 reg = nvbios_rd32(bios, init->offset + 1);
1713 u32 mask = nvbios_rd32(bios, init->offset + 5);
1714 u32 data = nvbios_rd32(bios, init->offset + 9);
1717 init->offset += 13;
1719 init_mask(init, reg, ~mask, data);
1727 init_macro(struct nvbios_init *init)
1729 struct nvkm_bios *bios = init->subdev->device->bios;
1730 u8 macro = nvbios_rd08(bios, init->offset + 1);
1735 table = init_macro_table(init);
1740 init_wr32(init, addr, data);
1743 init->offset += 2;
1751 init_resume(struct nvbios_init *init)
1754 init->offset += 1;
1755 init_exec_set(init, true);
1763 init_strap_condition(struct nvbios_init *init)
1765 struct nvkm_bios *bios = init->subdev->device->bios;
1766 u32 mask = nvbios_rd32(bios, init->offset + 1);
1767 u32 value = nvbios_rd32(bios, init->offset + 5);
1770 init->offset += 9;
1772 if ((init_rd32(init, 0x101000) & mask) != value)
1773 init_exec_set(init, false);
1781 init_time(struct nvbios_init *init)
1783 struct nvkm_bios *bios = init->subdev->device->bios;
1784 u16 usec = nvbios_rd16(bios, init->offset + 1);
1787 init->offset += 3;
1789 if (init_exec(init)) {
1802 init_condition(struct nvbios_init *init)
1804 struct nvkm_bios *bios = init->subdev->device->bios;
1805 u8 cond = nvbios_rd08(bios, init->offset + 1);
1808 init->offset += 2;
1810 if (!init_condition_met(init, cond))
1811 init_exec_set(init, false);
1819 init_io_condition(struct nvbios_init *init)
1821 struct nvkm_bios *bios = init->subdev->device->bios;
1822 u8 cond = nvbios_rd08(bios, init->offset + 1);
1825 init->offset += 2;
1827 if (!init_io_condition_met(init, cond))
1828 init_exec_set(init, false);
1836 init_zm_reg16(struct nvbios_init *init)
1838 struct nvkm_bios *bios = init->subdev->device->bios;
1839 u32 addr = nvbios_rd32(bios, init->offset + 1);
1840 u16 data = nvbios_rd16(bios, init->offset + 5);
1843 init->offset += 7;
1845 init_wr32(init, addr, data);
1853 init_index_io(struct nvbios_init *init)
1855 struct nvkm_bios *bios = init->subdev->device->bios;
1856 u16 port = nvbios_rd16(bios, init->offset + 1);
1857 u8 index = nvbios_rd16(bios, init->offset + 3);
1858 u8 mask = nvbios_rd08(bios, init->offset + 4);
1859 u8 data = nvbios_rd08(bios, init->offset + 5);
1864 init->offset += 6;
1866 value = init_rdvgai(init, port, index) & mask;
1867 init_wrvgai(init, port, index, data | value);
1875 init_pll(struct nvbios_init *init)
1877 struct nvkm_bios *bios = init->subdev->device->bios;
1878 u32 reg = nvbios_rd32(bios, init->offset + 1);
1879 u32 freq = nvbios_rd16(bios, init->offset + 5) * 10;
1882 init->offset += 7;
1884 init_prog_pll(init, reg, freq);
1892 init_zm_reg(struct nvbios_init *init)
1894 struct nvkm_bios *bios = init->subdev->device->bios;
1895 u32 addr = nvbios_rd32(bios, init->offset + 1);
1896 u32 data = nvbios_rd32(bios, init->offset + 5);
1899 init->offset += 9;
1904 init_wr32(init, addr, data);
1912 init_ram_restrict_pll(struct nvbios_init *init)
1914 struct nvkm_bios *bios = init->subdev->device->bios;
1915 u8 type = nvbios_rd08(bios, init->offset + 1);
1916 u8 count = init_ram_restrict_group_count(init);
1917 u8 strap = init_ram_restrict(init);
1921 init->offset += 2;
1924 u32 freq = nvbios_rd32(bios, init->offset);
1928 init_prog_pll(init, type, freq);
1933 init->offset += 4;
1942 init_reset_begun(struct nvbios_init *init)
1945 init->offset += 1;
1953 init_reset_end(struct nvbios_init *init)
1956 init->offset += 1;
1964 init_gpio(struct nvbios_init *init)
1966 struct nvkm_gpio *gpio = init->subdev->device->gpio;
1969 init->offset += 1;
1971 if (init_exec(init))
1980 init_ram_restrict_zm_reg_group(struct nvbios_init *init)
1982 struct nvkm_bios *bios = init->subdev->device->bios;
1983 u32 addr = nvbios_rd32(bios, init->offset + 1);
1984 u8 incr = nvbios_rd08(bios, init->offset + 5);
1985 u8 num = nvbios_rd08(bios, init->offset + 6);
1986 u8 count = init_ram_restrict_group_count(init);
1987 u8 index = init_ram_restrict(init);
1992 init->offset += 7;
1997 u32 data = nvbios_rd32(bios, init->offset);
2001 init_wr32(init, addr, data);
2006 init->offset += 4;
2018 init_copy_zm_reg(struct nvbios_init *init)
2020 struct nvkm_bios *bios = init->subdev->device->bios;
2021 u32 sreg = nvbios_rd32(bios, init->offset + 1);
2022 u32 dreg = nvbios_rd32(bios, init->offset + 5);
2025 init->offset += 9;
2027 init_wr32(init, dreg, init_rd32(init, sreg));
2035 init_zm_reg_group(struct nvbios_init *init)
2037 struct nvkm_bios *bios = init->subdev->device->bios;
2038 u32 addr = nvbios_rd32(bios, init->offset + 1);
2039 u8 count = nvbios_rd08(bios, init->offset + 5);
2042 init->offset += 6;
2045 u32 data = nvbios_rd32(bios, init->offset);
2047 init_wr32(init, addr, data);
2048 init->offset += 4;
2057 init_xlat(struct nvbios_init *init)
2059 struct nvkm_bios *bios = init->subdev->device->bios;
2060 u32 saddr = nvbios_rd32(bios, init->offset + 1);
2061 u8 sshift = nvbios_rd08(bios, init->offset + 5);
2062 u8 smask = nvbios_rd08(bios, init->offset + 6);
2063 u8 index = nvbios_rd08(bios, init->offset + 7);
2064 u32 daddr = nvbios_rd32(bios, init->offset + 8);
2065 u32 dmask = nvbios_rd32(bios, init->offset + 12);
2066 u8 shift = nvbios_rd08(bios, init->offset + 16);
2073 init->offset += 17;
2075 data = init_shift(init_rd32(init, saddr), sshift) & smask;
2076 data = init_xlat_(init, index, data) << shift;
2077 init_mask(init, daddr, ~dmask, data);
2085 init_zm_mask_add(struct nvbios_init *init)
2087 struct nvkm_bios *bios = init->subdev->device->bios;
2088 u32 addr = nvbios_rd32(bios, init->offset + 1);
2089 u32 mask = nvbios_rd32(bios, init->offset + 5);
2090 u32 add = nvbios_rd32(bios, init->offset + 9);
2094 init->offset += 13;
2096 data = init_rd32(init, addr);
2098 init_wr32(init, addr, data);
2106 init_auxch(struct nvbios_init *init)
2108 struct nvkm_bios *bios = init->subdev->device->bios;
2109 u32 addr = nvbios_rd32(bios, init->offset + 1);
2110 u8 count = nvbios_rd08(bios, init->offset + 5);
2113 init->offset += 6;
2116 u8 mask = nvbios_rd08(bios, init->offset + 0);
2117 u8 data = nvbios_rd08(bios, init->offset + 1);
2119 mask = init_rdauxr(init, addr) & mask;
2120 init_wrauxr(init, addr, mask | data);
2121 init->offset += 2;
2130 init_zm_auxch(struct nvbios_init *init)
2132 struct nvkm_bios *bios = init->subdev->device->bios;
2133 u32 addr = nvbios_rd32(bios, init->offset + 1);
2134 u8 count = nvbios_rd08(bios, init->offset + 5);
2137 init->offset += 6;
2140 u8 data = nvbios_rd08(bios, init->offset + 0);
2142 init_wrauxr(init, addr, data);
2143 init->offset += 1;
2152 init_i2c_long_if(struct nvbios_init *init)
2154 struct nvkm_bios *bios = init->subdev->device->bios;
2155 u8 index = nvbios_rd08(bios, init->offset + 1);
2156 u8 addr = nvbios_rd08(bios, init->offset + 2) >> 1;
2157 u8 reglo = nvbios_rd08(bios, init->offset + 3);
2158 u8 reghi = nvbios_rd08(bios, init->offset + 4);
2159 u8 mask = nvbios_rd08(bios, init->offset + 5);
2160 u8 data = nvbios_rd08(bios, init->offset + 6);
2166 init->offset += 7;
2168 adap = init_i2c(init, index);
2183 init_exec_set(init, false);
2191 init_gpio_ne(struct nvbios_init *init)
2193 struct nvkm_bios *bios = init->subdev->device->bios;
2196 u8 count = nvbios_rd08(bios, init->offset + 1);
2201 init->offset += 2;
2203 for (i = init->offset; i < init->offset + count; i++)
2209 for (i = init->offset; i < init->offset + count; i++) {
2215 if (i == (init->offset + count)) {
2217 if (init_exec(init))
2224 init->offset += count;
2302 nvbios_exec(struct nvbios_init *init)
2304 struct nvkm_bios *bios = init->subdev->device->bios;
2306 init->nested++;
2307 while (init->offset) {
2308 u8 opcode = nvbios_rd08(bios, init->offset);
2315 init_opcode[opcode].exec(init);
2317 init->nested--;
2330 nvkm_debug(subdev, "running init tables\n");
2333 init.execute = execute ? 1 : 0;
2337 /* the vbios parser will run this right after the normal init
2342 init.execute = execute ? 1 : 0;