void stm32_flash_init(void) { // XXX detect here flash.size = 1024*1024; flash.geometry[0].start = ERASE_RANGE0_START; flash.geometry[0].size = ERASE_RANGE0_END - ERASE_RANGE0_START; flash.geometry[0].erase_size = _32K; flash.geometry[0].erase_size = log2_uint(_32K); flash.geometry[1].start = ERASE_RANGE1_START; flash.geometry[1].size = ERASE_RANGE1_END - ERASE_RANGE1_START; flash.geometry[1].erase_size = _128K; flash.geometry[1].erase_size = log2_uint(_128K); flash.geometry[2].start = ERASE_RANGE2_START; flash.geometry[2].size = ERASE_RANGE2_END - ERASE_RANGE2_START; flash.geometry[2].erase_size = _256K; flash.geometry[2].erase_size = log2_uint(_256K); /* construct the block device */ bio_initialize_bdev(&flash.bdev, "flash0", PROGRAM_SIZE, flash.size / PROGRAM_SIZE, 3, flash.geometry); /* override our block device hooks */ flash.bdev.read = &stm32_flash_bdev_read; flash.bdev.read_block = &stm32_flash_bdev_read_block; //flash.bdev.write = &stm32_flash_bdev_write; flash.bdev.write_block = &stm32_flash_bdev_write_block; flash.bdev.erase = &stm32_flash_bdev_erase; flash.bdev.ioctl = &stm32_flash_ioctl; bio_register_device(&flash.bdev); }
static int Cache_init(Cache *self, PyObject *args, PyObject *kwds) { PyObject *parent, *tmp; parent = NULL; static char *kwlist[] = {"sets", "ways", "cl_size", "replacement_policy", "parent", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "IIII|O!", kwlist, &self->sets, &self->ways, &self->cl_size, &self->replacement_policy, &CacheType, &parent)) { return -1; } // Set parent (if given) if(parent != NULL) { tmp = self->parent; Py_INCREF(parent); self->parent = parent; Py_XDECREF(tmp); } else { self->parent = NULL; } self->placement = PyMem_New(struct cache_entry, self->sets*self->ways); for(unsigned int i=0; i<self->sets*self->ways; i++) { self->placement[i].cl_id = 0; self->placement[i].dirty = 0; } // TODO check if ways and cl_size are of power^2 self->set_bits = log2_uint(self->sets); self->cl_bits = log2_uint(self->cl_size); self->LOAD = 0; self->STORE = 0; self->HIT = 0; self->MISS = 0; //PySys_WriteStdout("CACHE sets=%i set_bits=%i ways=%i cl_size=%i cl_bits=%i\n", self->sets, self->set_bits, self->ways, self->cl_size, self->cl_bits); return 0; }
status_t evlog_init_etc(evlog_t *e, uint len, uint unitsize, uintptr_t *items) { if (len < 2 || !ispow2(len)) { return ERR_INVALID_ARGS; } if (unitsize < 1 || !ispow2(unitsize)) { return ERR_INVALID_ARGS; } if (unitsize > len) { return ERR_INVALID_ARGS; } e->head = 0; e->unitsize = unitsize; e->len_pow2 = log2_uint(len); e->items = items; return NO_ERROR; }
static int do_boot(lkb_t *lkb, size_t len, const char **result) { LTRACEF("lkb %p, len %zu, result %p\n", lkb, len, result); void *buf; paddr_t buf_phys; if (vmm_alloc_contiguous(vmm_get_kernel_aspace(), "lkboot_iobuf", len, &buf, log2_uint(1024*1024), 0, ARCH_MMU_FLAG_UNCACHED) < 0) { *result = "not enough memory"; return -1; } buf_phys = vaddr_to_paddr(buf); LTRACEF("iobuffer %p (phys 0x%lx)\n", buf, buf_phys); if (lkb_read(lkb, buf, len)) { *result = "io error"; // XXX free buffer here return -1; } /* construct a boot argument list */ const size_t bootargs_size = PAGE_SIZE; #if 0 void *args = (void *)((uintptr_t)lkb_iobuffer + lkb_iobuffer_size - bootargs_size); paddr_t args_phys = lkb_iobuffer_phys + lkb_iobuffer_size - bootargs_size; #elif PLATFORM_ZYNQ /* grab the top page of sram */ /* XXX do this better */ paddr_t args_phys = SRAM_BASE + SRAM_SIZE - bootargs_size; void *args = paddr_to_kvaddr(args_phys); #else #error need better way #endif LTRACEF("boot args %p, phys 0x%lx, len %zu\n", args, args_phys, bootargs_size); bootargs_start(args, bootargs_size); bootargs_add_command_line(args, bootargs_size, "what what"); arch_clean_cache_range((vaddr_t)args, bootargs_size); ulong lk_args[4]; bootargs_generate_lk_arg_values(args_phys, lk_args); const void *ptr; /* sniff it to see if it's a bootimage or a raw image */ bootimage_t *bi; if (bootimage_open(buf, len, &bi) >= 0) { size_t len; /* it's a bootimage */ TRACEF("detected bootimage\n"); /* find the lk image */ if (bootimage_get_file_section(bi, TYPE_LK, &ptr, &len) >= 0) { TRACEF("found lk section at %p\n", ptr); /* add the boot image to the argument list */ size_t bootimage_size; bootimage_get_range(bi, NULL, &bootimage_size); bootargs_add_bootimage_pointer(args, bootargs_size, "pmem", buf_phys, bootimage_size); } } else { /* raw image, just chain load it directly */ TRACEF("raw image, chainloading\n"); ptr = buf; } /* start a boot thread to complete the startup */ static struct chainload_args cl_args; cl_args.func = (void *)ptr; cl_args.args[0] = lk_args[0]; cl_args.args[1] = lk_args[1]; cl_args.args[2] = lk_args[2]; cl_args.args[3] = lk_args[3]; thread_resume(thread_create("boot", &chainload_thread, &cl_args, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE)); return 0; }