|
|
1.1 ! root 1: Internal autoconfig ! 2: ! 3: * kern_dev_t - a linked list. Starts empty. Add to it on detection ! 4: of valid dev_type. Never free. Why should we? Probably don't need ! 5: ref_count! ! 6: ! 7: * need configurable table mapping dev_types to classes, with common ! 8: probe: function. ! 9: ! 10: indirectDevices are the classes which need to be probed with the ! 11: the id of the device. In internalDevMap, this is a null-terminated ! 12: array of strings. ! 13: ! 14: eg className = "SCSIController" ! 15: indirectDevices = "SCSIDisk", "SCSITape", ! 16: "SCSIGeneric", NULL. ! 17: ! 18: struct internalDevMap { ! 19: const char *className; ! 20: const char *indirectDevices[]; ! 21: slot_id_t slot_id; ! 22: dev_id_t dev_id; ! 23: } ! 24: ! 25: * Need need a way to probe 'devices' which don't need hardware, like using ! 26: a list of internalDevMaps with invalid slot/dev ids. ! 27: ! 28: struct pseudoDevice { ! 29: const char *className; ! 30: const char *indirectDevices[]; ! 31: } ! 32: ! 33: /* ! 34: * This routine runs as a thread in IOTask so that it can allocate a ! 35: * device_master port which can be object_copyin'd during ! 36: * register_device_master. Then, all of the drivers in IOTask can share ! 37: * this port. ! 38: */ ! 39: autoconfigInternal() { ! 40: init kern_dev_list; ! 41: allocate device_master, register via register_device_master(); ! 42: ! 43: /* ! 44: * Create a kern_dev_t for each piece of hardware, including native ! 45: * devices and NextBus devices. ! 46: */ ! 47: for each native dev_number { ! 48: if valid dev_type { ! 49: create a kern_dev_t for it { ! 50: init dev_number, phys params; ! 51: all else = null/empty; ! 52: } ! 53: } ! 54: add to kern_dev_list; ! 55: } ! 56: ! 57: for each NextBus board { ! 58: if slot device ! 59: create a kern_dev_t for it; ! 60: else ! 61: for each valid dev_type ! 62: create a kern_dev_t for it; ! 63: } ! 64: ! 65: /* ! 66: * Start up each device's driver. ! 67: */ ! 68: for each elt in kern_dev_list { ! 69: if an internalDevMap exists for this slot/dev { ! 70: if [className probe:dev_number deviceMaster:masterPort] { ! 71: mark kern_dev inUse; // should be done by driver via ! 72: // dev_port_create() ! 73: foreach indirectDevice { ! 74: [indirectDevice probe:directDevice]; ! 75: } ! 76: } ! 77: } ! 78: } ! 79: ! 80: /* ! 81: * Start up pseudoDevices. ! 82: */ ! 83: for each elt in pseudoDevice array { ! 84: if [className probe] { ! 85: foreach indirectDevice { ! 86: [indirectDevice probe:directDevice]; ! 87: } ! 88: } ! 89: } ! 90: } ! 91: ! 92: Questions ! 93: ! 94: * how to pass device_master port to internal drivers? What ports does a ! 95: kernel thread have access to when it starts? ! 96: ! 97: * Are driver threads in the kernel task, or threads in a separate task? ! 98: ! 99: * Do the calls to the dma module have to be in a thread, instead of in ! 100: probe: (in kernel's autoconf context)? Does mach_user_internal work for ! 101: threads in kernel task? Should IOThreadFork() fork threads off of the ! 102: kernel task, or a separate one? ! 103:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.