static void msm_pm_write_boot_vector(unsigned int cpu, unsigned long address) { uint32_t clust_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1); uint32_t cpu_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0); unsigned long *start_address; unsigned long *end_address; if (clust_id >= MAX_NUM_CLUSTER || cpu_id >= MAX_CPUS_PER_CLUSTER) BUG(); msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)] = address; start_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)]; end_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id + 1)]; dmac_clean_range((void *)start_address, (void *)end_address); }
SIM_RC sim_post_argv_init (SIM_DESC sd) { int i; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); /* Set the cpu->state backlinks for each cpu. */ for (i = 0; i < MAX_NR_PROCESSORS; ++i) { CPU_STATE (STATE_CPU (sd, i)) = sd; CPU_INDEX (STATE_CPU (sd, i)) = i; } if (sim_module_init (sd) != SIM_RC_OK) return SIM_RC_FAIL; return SIM_RC_OK; }
static unsigned hw_pal_io_read_buffer (struct hw *me, void *dest, int space, unsigned_word addr, unsigned nr_bytes) { hw_pal_device *hw_pal = (hw_pal_device *) hw_data (me); unsigned_1 *byte = (unsigned_1 *) dest; memset (dest, 0, nr_bytes); switch (addr & hw_pal_address_mask) { case hw_pal_cpu_nr_register: #ifdef CPU_INDEX *byte = CPU_INDEX (hw_system_cpu (me)); #else *byte = 0; #endif HW_TRACE ((me, "read - cpu-nr %d\n", *byte)); break; case hw_pal_nr_cpu_register: if (hw_tree_find_property (me, "/openprom/options/smp") == NULL) { *byte = 1; HW_TRACE ((me, "read - nr-cpu %d (not defined)\n", *byte)); } else { *byte = hw_tree_find_integer_property (me, "/openprom/options/smp"); HW_TRACE ((me, "read - nr-cpu %d\n", *byte)); } break; case hw_pal_read_fifo: *byte = hw_pal->input.buffer; HW_TRACE ((me, "read - input-fifo %d\n", *byte)); break; case hw_pal_read_status: scan_hw_pal (me); *byte = hw_pal->input.status; HW_TRACE ((me, "read - input-status %d\n", *byte)); break; case hw_pal_write_fifo: *byte = hw_pal->output.buffer; HW_TRACE ((me, "read - output-fifo %d\n", *byte)); break; case hw_pal_write_status: *byte = hw_pal->output.status; HW_TRACE ((me, "read - output-status %d\n", *byte)); break; case hw_pal_countdown: do_counter_read (me, hw_pal, "countdown", &hw_pal->countdown, dest, nr_bytes); break; case hw_pal_countdown_value: do_counter_value (me, hw_pal, "countdown-value", &hw_pal->countdown, dest, nr_bytes); break; case hw_pal_timer: do_counter_read (me, hw_pal, "timer", &hw_pal->timer, dest, nr_bytes); break; case hw_pal_timer_value: do_counter_value (me, hw_pal, "timer-value", &hw_pal->timer, dest, nr_bytes); break; default: HW_TRACE ((me, "read - ???\n")); break; } return nr_bytes; }
unsigned long msm_pm_read_boot_vector(unsigned int cpu) { uint32_t clust_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1); uint32_t cpu_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0); return msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)]; }