Lines Matching +full:board +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0
7 * Mostly rewritten by David Huggins-Daines, C. Scott Ananian,
37 * thought to be suitable for that and some board ROMs make it too expensive.
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()
226 int nubus_get_root_dir(const struct nubus_board *board, in nubus_get_root_dir() argument
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()
246 int nubus_get_board_dir(const struct nubus_board *board, in nubus_get_board_dir() argument
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()
255 /* Now dereference it (the first directory is always the board 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()
295 /* First byte is the resource ID */ 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
345 static int __init nubus_get_block_rsrc_dir(struct nubus_board *board, in nubus_get_block_rsrc_dir() argument
353 dir.procdir = nubus_proc_add_rsrc_dir(procdir, parent, board); in nubus_get_block_rsrc_dir()
355 while (nubus_readdir(&dir, &ent) != -1) { in nubus_get_block_rsrc_dir()
365 static int __init nubus_get_display_vidmode(struct nubus_board *board, in nubus_get_display_vidmode() argument
373 dir.procdir = nubus_proc_add_rsrc_dir(procdir, parent, board); in nubus_get_display_vidmode()
375 while (nubus_readdir(&dir, &ent) != -1) { 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()
408 ent->type, ent->data); in nubus_get_display_resource()
409 nubus_get_display_vidmode(fres->board, procdir, ent); in nubus_get_display_resource()
413 ent->type, ent->data); in nubus_get_display_resource()
423 switch (ent->type) { in nubus_get_network_resource()
435 ent->type, ent->data); in nubus_get_network_resource()
445 switch (ent->type) { in nubus_get_cpu_resource()
468 ent->type, ent->data); in nubus_get_cpu_resource()
478 switch (fres->category) { in nubus_get_private_resource()
490 ent->type, ent->data); in nubus_get_private_resource()
497 nubus_get_functional_resource(struct nubus_board *board, int slot, in nubus_get_functional_resource() argument
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()
545 use this :-) */ in nubus_get_functional_resource()
548 nubus_get_block_rsrc_dir(board, dir.procdir, &ent); in nubus_get_functional_resource()
592 static int __init nubus_get_icon(struct nubus_board *board, in nubus_get_icon() argument
611 static int __init nubus_get_vendorinfo(struct nubus_board *board, in nubus_get_vendorinfo() argument
617 static char *vendor_fields[6] = { "ID", "serial", "revision", in nubus_get_vendorinfo()
622 dir.procdir = nubus_proc_add_rsrc_dir(procdir, parent, board); in nubus_get_vendorinfo()
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()
638 static int __init nubus_get_board_resource(struct nubus_board *board, int slot, in nubus_get_board_resource() argument
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()
655 we really are looking at a board resource. */ 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()
677 nubus_get_icon(board, dir.procdir, &ent); in nubus_get_board_resource()
680 pr_debug(" board id: 0x%x\n", ent.data); in nubus_get_board_resource()
688 nubus_get_vendorinfo(board, dir.procdir, &ent); in nubus_get_board_resource()
707 nubus_get_block_rsrc_dir(board, dir.procdir, &ent); in nubus_get_board_resource()
726 struct nubus_board *board; in nubus_add_board() local
731 int prev_resid = -1; in nubus_add_board()
738 if ((board = kzalloc(sizeof(*board), GFP_ATOMIC)) == NULL) in nubus_add_board()
740 board->fblock = rp; 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()
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()
788 nubus_get_root_dir(board, &dir); in nubus_add_board()
793 /* Each slot should have one board resource and any number of in nubus_add_board()
795 * struct nubus_board from the board resource, then walk down 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()
802 kfree(board); 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()
811 nubus_get_board_resource(board, slot, &ent); in nubus_add_board()
813 while (nubus_readdir(&dir, &ent) != -1) { in nubus_add_board()
816 fres = nubus_get_functional_resource(board, slot, &ent); in nubus_add_board()
820 /* Resources should appear in ascending ID order. This sanity 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()
832 if (nubus_device_register(board)) in nubus_add_board()
833 put_device(&board->dev); in nubus_add_board()
843 for (i = 4; i; i--) { in nubus_probe_slot()
844 rp--; in nubus_probe_slot()