Changeset 45b26dad in mainline for kernel/arch


Ignore:
Timestamp:
2006-09-26T12:59:28Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b44939b
Parents:
6ff1f1e
Message:

sparc64 work:

  • Loader now starts all processors.
  • Kernel halts all but the bootstrup processor for now.
  • Read clock-frequency from the respective processor node in the device tree
Location:
kernel/arch/sparc64
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/include/arch.h

    r6ff1f1e r45b26dad  
    3838#define KERN_sparc64_ARCH_H_
    3939
    40 #define ASI_AIUP        0x10            /** Access to primary context with user privileges. */
    41 #define ASI_AIUS        0x11            /** Access to secondary context with user privileges. */
    42 
     40#define ASI_AIUP                0x10    /** Access to primary context with user privileges. */
     41#define ASI_AIUS                0x11    /** Access to secondary context with user privileges. */
    4342#define ASI_NUCLEUS_QUAD_LDD    0x24    /** ASI for 16-byte atomic loads. */
     43#define ASI_UPA_CONFIG          0x4a    /** ASI of the UPA_CONFIG register. */
    4444
    4545#define NWINDOW         8               /** Number of register window sets. */
  • kernel/arch/sparc64/include/asm.h

    r6ff1f1e r45b26dad  
    359359}
    360360
     361/** Read UPA_CONFIG register.
     362 *
     363 * @return Value of the UPA_CONFIG register.
     364 */
     365static inline uint64_t upa_config_read(void)
     366{
     367        return asi_u64_read(ASI_UPA_CONFIG, 0);
     368}
     369
    361370extern void cpu_halt(void);
    362371extern void cpu_sleep(void);
  • kernel/arch/sparc64/include/boot/boot.h

    r6ff1f1e r45b26dad  
    7171} memmap_t;
    7272
    73 typedef struct {
    74         uint32_t clock_frequency;
    75 } processor_t;
    76 
    7773/** Bootinfo structure.
    7874 *
     
    8278        taskmap_t taskmap;
    8379        memmap_t memmap;
    84         processor_t processor;
    8580        ballocs_t ballocs;
    8681        ofw_tree_node_t *ofw_root;
  • kernel/arch/sparc64/include/register.h

    r6ff1f1e r45b26dad  
    118118typedef union fprs_reg fprs_reg_t;
    119119
     120/** UPA_CONFIG register.
     121 *
     122 * Note that format of this register differs significantly from
     123 * processor version to version. The format defined here
     124 * is the common subset for all supported processor versions.
     125 */
     126union upa_config {
     127        uint64_t value;
     128        struct {
     129                uint64_t : 34;
     130                unsigned pcon : 8;      /**< Processor configuration. */
     131                unsigned mid : 5;       /**< Module (processor) ID register. */
     132                unsigned pcap : 17;     /**< Processor capabilities. */
     133        } __attribute__ ((packed));
     134};
     135typedef union upa_config upa_config_t;
     136
    120137#endif
    121138
  • kernel/arch/sparc64/src/cpu/cpu.c

    r6ff1f1e r45b26dad  
    3636#include <cpu.h>
    3737#include <arch.h>
     38#include <print.h>
    3839#include <arch/register.h>
    39 #include <print.h>
    40 #include <arch/boot/boot.h>
     40#include <genarch/ofw/ofw_tree.h>
     41#include <arch/types.h>
     42#include <arch/drivers/tick.h>
    4143
     44/** Perform sparc64 specific initialization of the processor structure for the current processor. */
    4245void cpu_arch_init(void)
    4346{
    44         CPU->arch.clock_frequency = bootinfo.processor.clock_frequency;
     47        ofw_tree_node_t *node;
     48        uint32_t mid;
     49        uint32_t clock_frequency = 0;
     50        upa_config_t upa_config;
     51       
     52        upa_config.value = upa_config_read();
     53        node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu");
     54        while (node) {
     55                ofw_tree_property_t *prop;
     56               
     57                prop = ofw_tree_getprop(node, "upa-portid");
     58                if (prop && prop->value) {
     59                        mid = *((uint32_t *) prop->value);
     60                        if (mid == upa_config.mid) {
     61                                prop = ofw_tree_getprop(node, "clock-frequency");
     62                                if (prop && prop->value)
     63                                        clock_frequency = *((uint32_t *) prop->value);
     64                        }
     65                }
     66                node = ofw_tree_find_peer_by_device_type(node, "cpu");
     67        }
     68
     69        CPU->arch.clock_frequency = clock_frequency;
     70        tick_init();
    4571}
    4672
     73/** Read version information from the current processor. */
    4774void cpu_identify(void)
    4875{
     
    5077}
    5178
     79/** Print version information for a processor.
     80 *
     81 * @param m Processor structure of the CPU for which version information is to be printed.
     82 */
    5283void cpu_print_report(cpu_t *m)
    5384{
  • kernel/arch/sparc64/src/drivers/tick.c

    r6ff1f1e r45b26dad  
    5353        interrupt_register(14, "tick_int", tick_interrupt);
    5454        compare.int_dis = false;
    55         compare.tick_cmpr = bootinfo.processor.clock_frequency/HZ;
     55        compare.tick_cmpr = CPU->arch.clock_frequency/HZ;
    5656        tick_compare_write(compare.value);
    5757        tick_write(0);
  • kernel/arch/sparc64/src/sparc64.c

    r6ff1f1e r45b26dad  
    3838#include <arch/trap/trap.h>
    3939#include <arch/console.h>
    40 #include <arch/drivers/tick.h>
    4140#include <proc/thread.h>
    4241#include <console/console.h>
     
    7372{
    7473        trap_init();
    75         tick_init();
    7674}
    7775
  • kernel/arch/sparc64/src/start.S

    r6ff1f1e r45b26dad  
    4444 *
    4545 * The registers are expected to be in this state:
    46  * - %o0 bootinfo structure address
    47  * - %o1 bootinfo structure size
     46 * - %o0 non-zero for the bootstrup processor, zero for application/secondary processors
     47 * - %o1 bootinfo structure address
     48 * - %o2 bootinfo structure size
    4849 *
    4950 * Moreover, we depend on boot having established the
     
    5657.global kernel_image_start
    5758kernel_image_start:
     59        brz %o0, kernel_image_start             ! block secondary processors
     60        nop
    5861
    5962        /*
     
    7376         * to the kernel bootinfo structure.
    7477         */
    75         mov %o1, %o2
    76         mov %o0, %o1
    7778        sethi %hi(bootinfo), %o0
    7879        call memcpy
Note: See TracChangeset for help on using the changeset viewer.