Lines Matching +full:x +full:- +full:rp
1 // SPDX-License-Identifier: GPL-2.0
7 * Mostly rewritten by David Huggins-Daines, C. Scott Ananian,
60 little-endian machine. Again, stranger things have happened)
88 len--; in nubus_get_rom()
100 p--; in nubus_rewind()
102 len--; in nubus_rewind()
115 len--; in nubus_advance()
127 nubus_rewind(ptr, -len, map); in nubus_move()
135 /* Each sResource entry consists of a 1-byte ID and a 3-byte data
137 have to expand it from a 24-bit signed number to a 32-bit signed
158 unsigned char *p = nd->base; in nubus_dirptr()
162 nubus_move(&p, nubus_expand32(nd->data), nd->mask); in nubus_dirptr()
177 *t++ = nubus_get_rom(&p, 1, dirent->mask); in nubus_get_rsrc_mem()
178 len--; in nubus_get_rsrc_mem()
190 unsigned char c = nubus_get_rom(&p, 1, dirent->mask); in nubus_get_rsrc_str()
195 len--; in nubus_get_rsrc_str()
199 return t - dest; in nubus_get_rsrc_str()
217 dirent->mask); in nubus_seq_write_rsrc_mem()
219 len -= buf_size; in nubus_seq_write_rsrc_mem()
222 while (len--) in nubus_seq_write_rsrc_mem()
223 seq_putc(m, nubus_get_rom(&p, 1, dirent->mask)); in nubus_seq_write_rsrc_mem()
229 dir->ptr = dir->base = board->directory; in nubus_get_root_dir()
230 dir->done = 0; in nubus_get_root_dir()
231 dir->mask = board->lanes; in nubus_get_root_dir()
239 dir->ptr = dir->base = fres->directory; in nubus_get_func_dir()
240 dir->done = 0; in nubus_get_func_dir()
241 dir->mask = fres->board->lanes; in nubus_get_func_dir()
251 dir->ptr = dir->base = board->directory; in nubus_get_board_dir()
252 dir->done = 0; in nubus_get_board_dir()
253 dir->mask = board->lanes; in nubus_get_board_dir()
257 if (nubus_readdir(dir, &ent) == -1) in nubus_get_board_dir()
258 return -1; in nubus_get_board_dir()
259 if (nubus_get_subdir(&ent, dir) == -1) in nubus_get_board_dir()
260 return -1; in nubus_get_board_dir()
268 dir->ptr = dir->base = nubus_dirptr(ent); in nubus_get_subdir()
269 dir->done = 0; in nubus_get_subdir()
270 dir->mask = ent->mask; in nubus_get_subdir()
279 if (nd->done) in nubus_readdir()
280 return -1; in nubus_readdir()
283 ent->base = nd->ptr; in nubus_readdir()
285 /* This moves nd->ptr forward */ in nubus_readdir()
286 resid = nubus_get_rom(&nd->ptr, 4, nd->mask); in nubus_readdir()
291 nd->done = 1; in nubus_readdir()
292 return -1; in nubus_readdir()
296 ent->type = resid >> 24; in nubus_readdir()
298 ent->data = resid & 0xffffff; in nubus_readdir()
299 ent->mask = nd->mask; in nubus_readdir()
306 dir->ptr = dir->base; in nubus_rewinddir()
307 dir->done = 0; in nubus_rewinddir()
323 if (list_is_last(&from->list, &nubus_func_rsrcs)) in nubus_next_rsrc_or_null()
333 while (nubus_readdir(dir, ent) != -1) { in nubus_find_rsrc()
334 if (ent->type == rsrc_type) in nubus_find_rsrc()
337 return -1; in nubus_find_rsrc()
341 /* Initialization functions - decide which slots contain stuff worth
355 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_block_rsrc_dir()
359 pr_debug(" block (0x%x), size %d\n", ent.type, size); in nubus_get_block_rsrc_dir()
375 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_display_vidmode()
383 pr_debug(" block (0x%x), size %d\n", ent.type, in nubus_get_display_vidmode()
389 pr_debug(" unknown resource 0x%02x, data 0x%06x\n", in nubus_get_display_vidmode()
401 switch (ent->type) { in nubus_get_display_resource()
403 pr_debug(" gamma directory offset: 0x%06x\n", ent->data); in nubus_get_display_resource()
404 nubus_get_block_rsrc_dir(fres->board, procdir, ent); in nubus_get_display_resource()
407 pr_debug(" mode 0x%02x info offset: 0x%06x\n", in nubus_get_display_resource()
408 ent->type, ent->data); in nubus_get_display_resource()
409 nubus_get_display_vidmode(fres->board, procdir, ent); in nubus_get_display_resource()
412 pr_debug(" unknown resource 0x%02x, data 0x%06x\n", in nubus_get_display_resource()
413 ent->type, ent->data); in nubus_get_display_resource()
423 switch (ent->type) { in nubus_get_network_resource()
434 pr_debug(" unknown resource 0x%02x, data 0x%06x\n", in nubus_get_network_resource()
435 ent->type, ent->data); in nubus_get_network_resource()
445 switch (ent->type) { in nubus_get_cpu_resource()
451 pr_debug(" memory: [ 0x%08lx 0x%08lx ]\n", in nubus_get_cpu_resource()
461 pr_debug(" ROM: [ 0x%08lx 0x%08lx ]\n", in nubus_get_cpu_resource()
467 pr_debug(" unknown resource 0x%02x, data 0x%06x\n", in nubus_get_cpu_resource()
468 ent->type, ent->data); in nubus_get_cpu_resource()
478 switch (fres->category) { in nubus_get_private_resource()
489 pr_debug(" unknown resource 0x%02x, data 0x%06x\n", in nubus_get_private_resource()
490 ent->type, ent->data); in nubus_get_private_resource()
504 pr_debug(" Functional resource 0x%02x:\n", parent->type); in nubus_get_functional_resource()
506 dir.procdir = nubus_proc_add_rsrc_dir(board->procdir, parent, board); in nubus_get_functional_resource()
512 fres->resid = parent->type; in nubus_get_functional_resource()
513 fres->directory = dir.base; in nubus_get_functional_resource()
514 fres->board = board; in nubus_get_functional_resource()
516 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_functional_resource()
523 fres->category = nbtdata[0]; in nubus_get_functional_resource()
524 fres->type = nbtdata[1]; in nubus_get_functional_resource()
525 fres->dr_sw = nbtdata[2]; in nubus_get_functional_resource()
526 fres->dr_hw = nbtdata[3]; in nubus_get_functional_resource()
527 pr_debug(" type: [cat 0x%x type 0x%x sw 0x%x hw 0x%x]\n", in nubus_get_functional_resource()
545 use this :-) */ in nubus_get_functional_resource()
546 pr_debug(" driver directory offset: 0x%06x\n", in nubus_get_functional_resource()
559 pr_debug(" memory offset: 0x%08x\n", base_offset); in nubus_get_functional_resource()
569 pr_debug(" memory length: 0x%08x\n", length); in nubus_get_functional_resource()
574 pr_debug(" flags: 0x%06x\n", ent.data); in nubus_get_functional_resource()
578 pr_debug(" hwdevid: 0x%06x\n", ent.data); in nubus_get_functional_resource()
603 pr_debug(" %08x %08x %08x %08x\n", in nubus_get_icon()
624 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_vendorinfo()
632 pr_debug(" %s: %s\n", vendor_fields[ent.type - 1], name); in nubus_get_vendorinfo()
644 pr_debug(" Board resource 0x%02x:\n", parent->type); in nubus_get_board_resource()
646 dir.procdir = nubus_proc_add_rsrc_dir(board->procdir, parent, board); in nubus_get_board_resource()
648 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_board_resource()
657 pr_debug(" type: [cat 0x%x type 0x%x sw 0x%x hw 0x%x]\n", in nubus_get_board_resource()
661 pr_err("Slot %X: sResource is not a board resource!\n", in nubus_get_board_resource()
670 len = nubus_get_rsrc_str(board->name, &ent, in nubus_get_board_resource()
671 sizeof(board->name)); in nubus_get_board_resource()
672 pr_debug(" name: %s\n", board->name); in nubus_get_board_resource()
680 pr_debug(" board id: 0x%x\n", ent.data); in nubus_get_board_resource()
684 pr_debug(" primary init offset: 0x%06x\n", ent.data); in nubus_get_board_resource()
691 pr_debug(" flags: 0x%06x\n", ent.data); in nubus_get_board_resource()
695 pr_debug(" hwdevid: 0x%06x\n", ent.data); in nubus_get_board_resource()
699 pr_debug(" secondary init offset: 0x%06x\n", in nubus_get_board_resource()
705 pr_debug(" vidnames directory offset: 0x%06x\n", in nubus_get_board_resource()
711 pr_debug(" video mode parameter directory offset: 0x%06x\n", in nubus_get_board_resource()
716 pr_debug(" unknown resource 0x%02x, data 0x%06x\n", in nubus_get_board_resource()
727 unsigned char *rp; in nubus_add_board() local
731 int prev_resid = -1; in nubus_add_board()
734 rp = nubus_rom_addr(slot); in nubus_add_board()
735 nubus_rewind(&rp, FORMAT_BLOCK_SIZE, bytelanes); in nubus_add_board()
740 board->fblock = rp; in nubus_add_board()
743 pr_debug("Slot %X, format block at 0x%p:\n", slot, rp); in nubus_add_board()
744 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); in nubus_add_board()
745 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); in nubus_add_board()
746 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); in nubus_add_board()
747 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); in nubus_add_board()
748 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); in nubus_add_board()
749 pr_debug("%08lx\n", nubus_get_rom(&rp, 4, bytelanes)); in nubus_add_board()
750 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); in nubus_add_board()
751 pr_debug("%02lx\n", nubus_get_rom(&rp, 1, bytelanes)); in nubus_add_board()
752 rp = board->fblock; in nubus_add_board()
754 board->slot = slot; in nubus_add_board()
755 board->slot_addr = (unsigned long)nubus_slot_addr(slot); in nubus_add_board()
756 board->doffset = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
763 board->rom_length = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
764 board->crc = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
765 board->rev = nubus_get_rom(&rp, 1, bytelanes); in nubus_add_board()
766 board->format = nubus_get_rom(&rp, 1, bytelanes); in nubus_add_board()
767 board->lanes = bytelanes; in nubus_add_board()
770 if (!(board->doffset & 0x00FF0000)) in nubus_add_board()
771 pr_warn("Slot %X: Dodgy doffset!\n", slot); in nubus_add_board()
772 dpat = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
774 pr_warn("Slot %X: Wrong test pattern %08lx!\n", slot, dpat); in nubus_add_board()
777 * I wonder how the CRC is meant to work - in nubus_add_board()
784 board->directory = board->fblock; in nubus_add_board()
785 nubus_move(&board->directory, nubus_expand32(board->doffset), in nubus_add_board()
786 board->lanes); in nubus_add_board()
791 pr_debug("Slot %X resources:\n", slot); in nubus_add_board()
799 if (nubus_readdir(&dir, &ent) == -1) { in nubus_add_board()
801 pr_err("Slot %X: Board resource not found!\n", slot); in nubus_add_board()
807 pr_warn("Slot %X: Board resource ID is invalid!\n", slot); in nubus_add_board()
809 board->procdir = nubus_proc_add_board(board); in nubus_add_board()
813 while (nubus_readdir(&dir, &ent) != -1) { in nubus_add_board()
823 if (fres->resid <= prev_resid) { in nubus_add_board()
827 prev_resid = fres->resid; in nubus_add_board()
829 list_add_tail(&fres->list, &nubus_func_rsrcs); in nubus_add_board()
833 put_device(&board->dev); in nubus_add_board()
839 unsigned char *rp; in nubus_probe_slot() local
842 rp = nubus_rom_addr(slot); in nubus_probe_slot()
843 for (i = 4; i; i--) { in nubus_probe_slot()
844 rp--; in nubus_probe_slot()
845 if (!hwreg_present(rp)) in nubus_probe_slot()
848 dp = *rp; in nubus_probe_slot()
857 if (not_useful(rp, dp)) in nubus_probe_slot()