print_reg_property(device *me, const device_property *property) { int reg_nr; reg_property_spec reg; for (reg_nr = 0; device_find_reg_array_property(me, property->name, reg_nr, ®); reg_nr++) { print_address(device_parent(me), ®.address); print_size(me, ®.size); } }
static void hw_nvram_init_address(device *me) { hw_nvram_device *nvram = (hw_nvram_device*)device_data(me); /* use the generic init code to attach this device to its parent bus */ generic_device_init_address(me); /* find the first non zero reg property and use that as the device size */ if (nvram->sizeof_memory == 0) { reg_property_spec reg; int reg_nr; for (reg_nr = 0; device_find_reg_array_property(me, "reg", reg_nr, ®); reg_nr++) { unsigned attach_size; if (device_size_to_attach_size(device_parent(me), ®.size, &attach_size, me)) { nvram->sizeof_memory = attach_size; break; } } if (nvram->sizeof_memory == 0) device_error(me, "reg property must contain a non-zero phys-addr:size tupple"); if (nvram->sizeof_memory < 8) device_error(me, "NVRAM must be at least 8 bytes in size"); } /* initialize the hw_nvram */ if (nvram->memory == NULL) { nvram->memory = zalloc(nvram->sizeof_memory); } else memset(nvram->memory, 0, nvram->sizeof_memory); if (device_find_property(me, "timezone") == NULL) nvram->timezone = 0; else nvram->timezone = device_find_integer_property(me, "timezone"); nvram->addr_year = nvram->sizeof_memory - 1; nvram->addr_month = nvram->sizeof_memory - 2; nvram->addr_date = nvram->sizeof_memory - 3; nvram->addr_day = nvram->sizeof_memory - 4; nvram->addr_hour = nvram->sizeof_memory - 5; nvram->addr_minutes = nvram->sizeof_memory - 6; nvram->addr_seconds = nvram->sizeof_memory - 7; nvram->addr_control = nvram->sizeof_memory - 8; }
static void hw_shm_init_data(device *me) { hw_shm_device *shm = (hw_shm_device*)device_data(me); const device_unit *d; reg_property_spec reg; int i; /* Obtain the Key Value */ if (device_find_property(me, "key") == NULL) error("shm_init_data() required key property is missing\n"); shm->key = (key_t) device_find_integer_property(me, "key"); DTRACE(shm, ("shm key (0x%08x)\n", shm->key) ); /* Figure out where this memory is in address space and how long it is */ if ( !device_find_reg_array_property(me, "reg", 0, ®) ) error("hw_shm_init_data() no address registered\n"); /* Determine the address and length being as paranoid as possible */ shm->physical_address = 0xffffffff; shm->sizeof_memory = 0xffffffff; for ( i=0 ; i<reg.address.nr_cells; i++ ) { if (reg.address.cells[0] == 0 && reg.size.cells[0] == 0) continue; if ( shm->physical_address != 0xffffffff ) device_error(me, "Only single celled address ranges supported\n"); shm->physical_address = reg.address.cells[i]; DTRACE(shm, ("shm physical_address=0x%x\n", shm->physical_address)); shm->sizeof_memory = reg.size.cells[i]; DTRACE(shm, ("shm length=0x%x\n", shm->sizeof_memory)); } if ( shm->physical_address == 0xffffffff ) device_error(me, "Address not specified\n" ); if ( shm->sizeof_memory == 0xffffffff ) device_error(me, "Length not specified\n" ); /* Now actually attach to or create the shared memory area */ shm->id = shmget(shm->key, shm->sizeof_memory, IPC_CREAT | 0660); if (shm->id == -1) error("hw_shm_init_data() shmget failed\n"); shm->shm_address = shmat(shm->id, (char *)0, SHM_RND); if (shm->shm_address == (void *)-1) error("hw_shm_init_data() shmat failed\n"); }
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; } } }