static void hw_disk_init_address(device *me) { hw_disk_device *disk = device_data(me); unsigned_word address; int space; const char *name; /* attach to the parent. Since the bus is logical, attach using just the unit-address (size must be zero) */ device_address_to_attach_address(device_parent(me), device_unit_address(me), &space, &address, me); device_attach_address(device_parent(me), attach_callback, space, address, 0/*size*/, access_read_write_exec, me); /* Tell the world we are a disk. */ device_add_string_property(me, "device_type", "block"); /* get the name of the file specifying the disk image */ disk->name_index = 0; disk->nr_names = device_find_string_array_property(me, "file", disk->name_index, &name); if (!disk->nr_names) device_error(me, "invalid file property"); /* is it a RO device? */ disk->read_only = (strcmp(device_name(me), "disk") != 0 && strcmp(device_name(me), "floppy") != 0 && device_find_property(me, "read-only") == NULL); /* now open it */ open_disk_image(me, disk, name); }
static void hw_iobus_attach_address_callback(device *me, attach_type type, int space, unsigned_word addr, unsigned nr_bytes, access_type access, device *client) /*callback/default*/ { int attach_space; unsigned_word attach_address; /* sanity check */ if (space != 0) device_error(me, "invalid space (%d) specified by %s", space, device_path(client)); /* get the bus address */ device_address_to_attach_address(device_parent(me), device_unit_address(me), &attach_space, &attach_address, me); if (addr < attach_address) device_error(me, "Invalid attach address 0x%lx", (unsigned long)addr); device_attach_address(device_parent(me), type, attach_space, addr, nr_bytes, access, client); }
static void build_address_decoder(device *me, address_decoder *decoder) { int reg; for (reg = 1; reg < 6; reg++) { reg_property_spec unit; int space; unsigned_word address; unsigned size; /* find and decode the reg property */ if (!device_find_reg_array_property(me, "reg", reg, &unit)) device_error(me, "missing or invalid reg entry %d", reg); device_address_to_attach_address(device_parent(me), &unit.address, &space, &address, me); device_size_to_attach_size(device_parent(me), &unit.size, &size, me); /* insert it into the address decoder */ switch (reg) { case 1: case 2: /* command register block */ if (size != 8) device_error(me, "reg entry %d must have a size of 8", reg); decoder->block[reg-1].space = space; decoder->block[reg-1].base_addr = address; decoder->block[reg-1].bound_addr = address + size - 1; decoder->block[reg-1].controller = (reg + 1) % nr_ide_controllers; decoder->block[reg-1].base_reg = ide_data_reg; DTRACE(ide, ("controller %d command register block at %d:0x%lx..0x%lx\n", decoder->block[reg-1].controller, decoder->block[reg-1].space, (unsigned long)decoder->block[reg-1].base_addr, (unsigned long)decoder->block[reg-1].bound_addr)); break; case 3: case 4: /* control register block */ if (size != 1) device_error(me, "reg entry %d must have a size of 1", reg); decoder->block[reg-1].space = space; decoder->block[reg-1].base_addr = address; decoder->block[reg-1].bound_addr = address + size - 1; decoder->block[reg-1].controller = (reg + 1) % nr_ide_controllers; decoder->block[reg-1].base_reg = ide_alternate_status_reg; DTRACE(ide, ("controller %d control register block at %d:0x%lx..0x%lx\n", decoder->block[reg-1].controller, decoder->block[reg-1].space, (unsigned long)decoder->block[reg-1].base_addr, (unsigned long)decoder->block[reg-1].bound_addr)); break; case 5: /* dma register block */ if (size != 8) device_error(me, "reg entry %d must have a size of 8", reg); decoder->block[reg-1].space = space; decoder->block[reg-1].base_addr = address; decoder->block[reg-1].bound_addr = address + 4 - 1; decoder->block[reg-1].base_reg = ide_dma_command_reg; decoder->block[reg-1].controller = 0; DTRACE(ide, ("controller %d dma register block at %d:0x%lx..0x%lx\n", decoder->block[reg-1].controller, decoder->block[reg-1].space, (unsigned long)decoder->block[reg-1].base_addr, (unsigned long)decoder->block[reg-1].bound_addr)); decoder->block[reg].space = space; decoder->block[reg].base_addr = address + 4; decoder->block[reg].bound_addr = address + 8 - 1; decoder->block[reg].controller = 1; decoder->block[reg].base_reg = ide_dma_command_reg; DTRACE(ide, ("controller %d dma register block at %d:0x%lx..0x%lx\n", decoder->block[reg].controller, decoder->block[reg-1].space, (unsigned long)decoder->block[reg].base_addr, (unsigned long)decoder->block[reg].bound_addr)); break; default: device_error(me, "internal error - bad switch"); break; } } }