Lines Matching +full:board +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0
7 * Mostly rewritten by David Huggins-Daines, C. Scott Ananian,
53 little-endian machine. Again, stranger things have happened)
81 len--; in nubus_get_rom()
93 p--; in nubus_rewind()
95 len--; in nubus_rewind()
108 len--; in nubus_advance()
120 nubus_rewind(ptr, -len, map); in nubus_move()
128 /* Each sResource entry consists of a 1-byte ID and a 3-byte data
130 have to expand it from a 24-bit signed number to a 32-bit signed
151 unsigned char *p = nd->base; in nubus_dirptr()
155 nubus_move(&p, nubus_expand32(nd->data), nd->mask); in nubus_dirptr()
170 *t++ = nubus_get_rom(&p, 1, dirent->mask); in nubus_get_rsrc_mem()
171 len--; in nubus_get_rsrc_mem()
183 unsigned char c = nubus_get_rom(&p, 1, dirent->mask); in nubus_get_rsrc_str()
188 len--; in nubus_get_rsrc_str()
192 return t - dest; in nubus_get_rsrc_str()
210 dirent->mask); in nubus_seq_write_rsrc_mem()
212 len -= buf_size; in nubus_seq_write_rsrc_mem()
215 while (len--) in nubus_seq_write_rsrc_mem()
216 seq_putc(m, nubus_get_rom(&p, 1, dirent->mask)); in nubus_seq_write_rsrc_mem()
219 int nubus_get_root_dir(const struct nubus_board *board, in nubus_get_root_dir() argument
222 dir->ptr = dir->base = board->directory; in nubus_get_root_dir()
223 dir->done = 0; in nubus_get_root_dir()
224 dir->mask = board->lanes; in nubus_get_root_dir()
232 dir->ptr = dir->base = fres->directory; in nubus_get_func_dir()
233 dir->done = 0; in nubus_get_func_dir()
234 dir->mask = fres->board->lanes; in nubus_get_func_dir()
239 int nubus_get_board_dir(const struct nubus_board *board, in nubus_get_board_dir() argument
244 dir->ptr = dir->base = board->directory; in nubus_get_board_dir()
245 dir->done = 0; in nubus_get_board_dir()
246 dir->mask = board->lanes; in nubus_get_board_dir()
248 /* Now dereference it (the first directory is always the board in nubus_get_board_dir()
250 if (nubus_readdir(dir, &ent) == -1) in nubus_get_board_dir()
251 return -1; in nubus_get_board_dir()
252 if (nubus_get_subdir(&ent, dir) == -1) in nubus_get_board_dir()
253 return -1; in nubus_get_board_dir()
261 dir->ptr = dir->base = nubus_dirptr(ent); in nubus_get_subdir()
262 dir->done = 0; in nubus_get_subdir()
263 dir->mask = ent->mask; in nubus_get_subdir()
272 if (nd->done) in nubus_readdir()
273 return -1; in nubus_readdir()
276 ent->base = nd->ptr; in nubus_readdir()
278 /* This moves nd->ptr forward */ in nubus_readdir()
279 resid = nubus_get_rom(&nd->ptr, 4, nd->mask); in nubus_readdir()
284 nd->done = 1; in nubus_readdir()
285 return -1; in nubus_readdir()
289 ent->type = resid >> 24; in nubus_readdir()
291 ent->data = resid & 0xffffff; in nubus_readdir()
292 ent->mask = nd->mask; in nubus_readdir()
299 dir->ptr = dir->base; in nubus_rewinddir()
300 dir->done = 0; in nubus_rewinddir()
316 if (list_is_last(&from->list, &nubus_func_rsrcs)) in nubus_next_rsrc_or_null()
326 while (nubus_readdir(dir, ent) != -1) { in nubus_find_rsrc()
327 if (ent->type == rsrc_type) in nubus_find_rsrc()
330 return -1; in nubus_find_rsrc()
334 /* Initialization functions - decide which slots contain stuff worth
338 static int __init nubus_get_block_rsrc_dir(struct nubus_board *board, in nubus_get_block_rsrc_dir() argument
346 dir.procdir = nubus_proc_add_rsrc_dir(procdir, parent, board); in nubus_get_block_rsrc_dir()
348 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_block_rsrc_dir()
358 static int __init nubus_get_display_vidmode(struct nubus_board *board, in nubus_get_display_vidmode() argument
366 dir.procdir = nubus_proc_add_rsrc_dir(procdir, parent, board); in nubus_get_display_vidmode()
368 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_display_vidmode()
371 case 2: /* mTable */ in nubus_get_display_vidmode()
394 switch (ent->type) { in nubus_get_display_resource()
396 pr_debug(" gamma directory offset: 0x%06x\n", ent->data); in nubus_get_display_resource()
397 nubus_get_block_rsrc_dir(fres->board, procdir, ent); in nubus_get_display_resource()
401 ent->type, ent->data); in nubus_get_display_resource()
402 nubus_get_display_vidmode(fres->board, procdir, ent); in nubus_get_display_resource()
406 ent->type, ent->data); in nubus_get_display_resource()
416 switch (ent->type) { in nubus_get_network_resource()
428 ent->type, ent->data); in nubus_get_network_resource()
438 switch (ent->type) { in nubus_get_cpu_resource()
441 unsigned long meminfo[2]; in nubus_get_cpu_resource()
451 unsigned long rominfo[2]; in nubus_get_cpu_resource()
461 ent->type, ent->data); in nubus_get_cpu_resource()
471 switch (fres->category) { in nubus_get_private_resource()
483 ent->type, ent->data); in nubus_get_private_resource()
490 nubus_get_functional_resource(struct nubus_board *board, int slot, in nubus_get_functional_resource() argument
497 pr_debug(" Functional resource 0x%02x:\n", parent->type); in nubus_get_functional_resource()
499 dir.procdir = nubus_proc_add_rsrc_dir(board->procdir, parent, board); in nubus_get_functional_resource()
505 fres->resid = parent->type; in nubus_get_functional_resource()
506 fres->directory = dir.base; in nubus_get_functional_resource()
507 fres->board = board; in nubus_get_functional_resource()
509 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_functional_resource()
516 fres->category = nbtdata[0]; in nubus_get_functional_resource()
517 fres->type = nbtdata[1]; in nubus_get_functional_resource()
518 fres->dr_sw = nbtdata[2]; in nubus_get_functional_resource()
519 fres->dr_hw = nbtdata[3]; in nubus_get_functional_resource()
521 nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]); in nubus_get_functional_resource()
538 use this :-) */ in nubus_get_functional_resource()
541 nubus_get_block_rsrc_dir(board, dir.procdir, &ent); in nubus_get_functional_resource()
585 static int __init nubus_get_icon(struct nubus_board *board, in nubus_get_icon() argument
598 icon[i * 4 + 2], icon[i * 4 + 3]); in nubus_get_icon()
604 static int __init nubus_get_vendorinfo(struct nubus_board *board, in nubus_get_vendorinfo() argument
615 dir.procdir = nubus_proc_add_rsrc_dir(procdir, parent, board); in nubus_get_vendorinfo()
617 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_vendorinfo()
625 pr_debug(" %s: %s\n", vendor_fields[ent.type - 1], name); in nubus_get_vendorinfo()
631 static int __init nubus_get_board_resource(struct nubus_board *board, int slot, in nubus_get_board_resource() argument
637 pr_debug(" Board resource 0x%02x:\n", parent->type); in nubus_get_board_resource()
639 dir.procdir = nubus_proc_add_rsrc_dir(board->procdir, parent, board); in nubus_get_board_resource()
641 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_board_resource()
648 we really are looking at a board resource. */ in nubus_get_board_resource()
651 nbtdata[0], nbtdata[1], nbtdata[2], nbtdata[3]); in nubus_get_board_resource()
653 nbtdata[2] != 0 || nbtdata[3] != 0) in nubus_get_board_resource()
654 pr_err("Slot %X: sResource is not a board resource!\n", in nubus_get_board_resource()
663 len = nubus_get_rsrc_str(board->name, &ent, in nubus_get_board_resource()
664 sizeof(board->name)); in nubus_get_board_resource()
665 pr_debug(" name: %s\n", board->name); in nubus_get_board_resource()
670 nubus_get_icon(board, dir.procdir, &ent); in nubus_get_board_resource()
673 pr_debug(" board id: 0x%x\n", ent.data); in nubus_get_board_resource()
681 nubus_get_vendorinfo(board, dir.procdir, &ent); in nubus_get_board_resource()
700 nubus_get_block_rsrc_dir(board, dir.procdir, &ent); in nubus_get_board_resource()
719 struct nubus_board *board; in nubus_add_board() local
724 int prev_resid = -1; in nubus_add_board()
731 if ((board = kzalloc(sizeof(*board), GFP_ATOMIC)) == NULL) in nubus_add_board()
733 board->fblock = rp; in nubus_add_board()
745 rp = board->fblock; in nubus_add_board()
747 board->slot = slot; in nubus_add_board()
748 board->slot_addr = (unsigned long)nubus_slot_addr(slot); in nubus_add_board()
749 board->doffset = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
756 board->rom_length = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
757 board->crc = nubus_get_rom(&rp, 4, bytelanes); in nubus_add_board()
758 board->rev = nubus_get_rom(&rp, 1, bytelanes); in nubus_add_board()
759 board->format = nubus_get_rom(&rp, 1, bytelanes); in nubus_add_board()
760 board->lanes = bytelanes; in nubus_add_board()
763 if (!(board->doffset & 0x00FF0000)) in nubus_add_board()
770 * I wonder how the CRC is meant to work - in nubus_add_board()
777 board->directory = board->fblock; in nubus_add_board()
778 nubus_move(&board->directory, nubus_expand32(board->doffset), in nubus_add_board()
779 board->lanes); in nubus_add_board()
781 nubus_get_root_dir(board, &dir); in nubus_add_board()
786 /* Each slot should have one board resource and any number of in nubus_add_board()
788 * struct nubus_board from the board resource, then walk down in nubus_add_board()
792 if (nubus_readdir(&dir, &ent) == -1) { in nubus_add_board()
794 pr_err("Slot %X: Board resource not found!\n", slot); in nubus_add_board()
795 kfree(board); in nubus_add_board()
800 pr_warn("Slot %X: Board resource ID is invalid!\n", slot); in nubus_add_board()
802 board->procdir = nubus_proc_add_board(board); in nubus_add_board()
804 nubus_get_board_resource(board, slot, &ent); in nubus_add_board()
806 while (nubus_readdir(&dir, &ent) != -1) { in nubus_add_board()
809 fres = nubus_get_functional_resource(board, slot, &ent); in nubus_add_board()
816 if (fres->resid <= prev_resid) { in nubus_add_board()
820 prev_resid = fres->resid; in nubus_add_board()
822 list_add_tail(&fres->list, &nubus_func_rsrcs); in nubus_add_board()
825 if (nubus_device_register(board)) in nubus_add_board()
826 put_device(&board->dev); in nubus_add_board()
836 for (i = 4; i; i--) { in nubus_probe_slot()
837 rp--; in nubus_probe_slot()