Subversion Repositories HelenOS

Rev

Rev 4614 | Rev 4663 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4614 Rev 4638
1
/*
1
/*
2
 * Copyright (c) 2006 Jakub Jermar
2
 * Copyright (c) 2006 Jakub Jermar
3
 * Copyright (c) 2009 Pavel Rimsky
3
 * Copyright (c) 2009 Pavel Rimsky
4
 * All rights reserved.
4
 * All rights reserved.
5
 *
5
 *
6
 * Redistribution and use in source and binary forms, with or without
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
7
 * modification, are permitted provided that the following conditions
8
 * are met:
8
 * are met:
9
 *
9
 *
10
 * - Redistributions of source code must retain the above copyright
10
 * - Redistributions of source code must retain the above copyright
11
 *   notice, this list of conditions and the following disclaimer.
11
 *   notice, this list of conditions and the following disclaimer.
12
 * - Redistributions in binary form must reproduce the above copyright
12
 * - Redistributions in binary form must reproduce the above copyright
13
 *   notice, this list of conditions and the following disclaimer in the
13
 *   notice, this list of conditions and the following disclaimer in the
14
 *   documentation and/or other materials provided with the distribution.
14
 *   documentation and/or other materials provided with the distribution.
15
 * - The name of the author may not be used to endorse or promote products
15
 * - The name of the author may not be used to endorse or promote products
16
 *   derived from this software without specific prior written permission.
16
 *   derived from this software without specific prior written permission.
17
 *
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 */
28
 */
29
 
29
 
30
/** @addtogroup sparc64
30
/** @addtogroup sparc64
31
 * @{
31
 * @{
32
 */
32
 */
33
/** @file
33
/** @file
34
 */
34
 */
35
 
35
 
36
#include <smp/smp.h>
36
#include <smp/smp.h>
-
 
37
#include <smp/ipi.h>
37
#include <genarch/ofw/ofw_tree.h>
38
#include <genarch/ofw/ofw_tree.h>
38
#include <cpu.h>
39
#include <cpu.h>
39
#include <arch/cpu.h>
40
#include <arch/cpu.h>
40
#include <arch/boot/boot.h>
41
#include <arch/boot/boot.h>
41
#include <arch.h>
42
#include <arch.h>
42
#include <config.h>
43
#include <config.h>
43
#include <macros.h>
44
#include <macros.h>
44
#include <arch/types.h>
45
#include <arch/types.h>
45
#include <synch/synch.h>
46
#include <synch/synch.h>
46
#include <synch/waitq.h>
47
#include <synch/waitq.h>
47
#include <print.h>
48
#include <print.h>
48
#include <arch/sun4v/hypercall.h>
49
#include <arch/sun4v/hypercall.h>
49
#include <arch/sun4v/md.h>
50
#include <arch/sun4v/md.h>
-
 
51
#include <arch/sun4v/ipi.h>
50
#include <time/delay.h>
52
#include <time/delay.h>
51
 
53
 
52
#define CPU_STATE_RUNNING   2
54
#define CPU_STATE_RUNNING   2
53
 
55
 
54
extern void kernel_image_start(void);
56
extern void kernel_image_start(void);
55
extern void *trap_table;
57
extern void *trap_table;
56
 
58
 
57
/** Determine number of processors. */
59
/** Determine number of processors. */
58
void smp_init(void)
60
void smp_init(void)
59
{
61
{
60
    md_node_t node = md_get_root();
62
    md_node_t node = md_get_root();
61
    count_t cpu_count = 0;
63
    count_t cpu_count = 0;
62
 
64
 
63
    /* walk through MD, find the current CPU node & its clock-frequency */
65
    /* walk through MD, find the current CPU node & its clock-frequency */
64
    while(md_next_node(&node, "cpu")) {
66
    while(md_next_node(&node, "cpu")) {
65
        cpu_count++;
67
        cpu_count++;
66
    }
68
    }
67
 
69
 
68
    config.cpu_count = cpu_count;
70
    config.cpu_count = cpu_count;
69
}
71
}
70
 
72
 
71
 
73
 
72
/** Wake application processors up. */
74
/** Wake application processors up. */
73
void kmp(void *arg)
75
void kmp(void *arg)
74
{
76
{
-
 
77
#if 1
75
    (void) arg;
78
    (void) arg;
76
 
79
 
77
    uint64_t myid;
80
    uint64_t myid;
78
    __hypercall_fast_ret1(0, 0, 0, 0, 0, CPU_MYID, &myid);
81
    __hypercall_fast_ret1(0, 0, 0, 0, 0, CPU_MYID, &myid);
79
 
82
 
80
    /* stop the CPUs before making them execute our code */
83
    /* stop the CPUs before making them execute our code */
81
    uint64_t i;
84
    uint64_t i;
82
    for (i = 0; i < config.cpu_count; i++) {
85
    for (i = 0; i < config.cpu_count; i++) {
83
        if (i == myid)
86
        if (i == myid)
84
            continue;
87
            continue;
85
 
88
 
86
        if (__hypercall_fast1(CPU_STOP, i) != 0)
89
        if (__hypercall_fast1(CPU_STOP, i) != 0)
87
            continue;
90
            continue;
88
 
91
 
89
        uint64_t state;
92
        uint64_t state;
90
        __hypercall_fast_ret1(i, 0, 0, 0, 0, CPU_STATE, &state);
93
        __hypercall_fast_ret1(i, 0, 0, 0, 0, CPU_STATE, &state);
91
        while (state == CPU_STATE_RUNNING) {
94
        while (state == CPU_STATE_RUNNING) {
92
            __hypercall_fast_ret1(i, 0, 0, 0, 0, CPU_STATE, &state);
95
            __hypercall_fast_ret1(i, 0, 0, 0, 0, CPU_STATE, &state);
93
        }
96
        }
94
    }
97
    }
95
 
98
 
96
    /* wake the processors up, one by one */
99
    /* wake the processors up, one by one */
97
    uint64_t state;
100
    uint64_t state;
98
    for (i = 1; i < config.cpu_count; i++) {
101
    for (i = 1; i < config.cpu_count; i++) {
99
        __hypercall_fast_ret1(i, 0, 0, 0, 0, CPU_STATE, &state);
102
        __hypercall_fast_ret1(i, 0, 0, 0, 0, CPU_STATE, &state);
100
        printf("Starting CPU %d, error code = %d.\n", i, __hypercall_fast4(
103
        printf("Starting CPU %d, error code = %d.\n", i, __hypercall_fast4(
101
            CPU_START,
104
            CPU_START,
102
            i,
105
            i,
103
            (uint64_t) KA2PA(kernel_image_start),
106
            (uint64_t) KA2PA(kernel_image_start),
104
            KA2PA(trap_table),
107
            KA2PA(trap_table),
105
            bootinfo.physmem_start         
108
            bootinfo.physmem_start         
106
        ));
109
        ));
107
 
110
 
108
        if (waitq_sleep_timeout(&ap_completion_wq, 10000000, SYNCH_FLAGS_NONE) ==
111
        if (waitq_sleep_timeout(&ap_completion_wq, 10000000, SYNCH_FLAGS_NONE) ==
109
                    ESYNCH_TIMEOUT)
112
                    ESYNCH_TIMEOUT)
110
            printf("%s: waiting for processor (cpuid = %" PRIu32
113
            printf("%s: waiting for processor (cpuid = %" PRIu32
111
                ") timed out\n", __func__, i);
114
                ") timed out\n", __func__, i);
112
       
115
       
113
    }
116
    }
-
 
117
#else
114
 
118
 
-
 
119
    asm volatile (
-
 
120
        "setx temp_cpu_mondo_handler, %g4, %g6 \n"
-
 
121
        //"setx 0x80246ad8, %g4, %g7 \n"
-
 
122
        "setx 0x80200f80, %g4, %g7 \n"
-
 
123
 
-
 
124
        "ldx [%g6], %g4 \n"
-
 
125
        "stxa %g4, [%g7] 0x14 \n"
-
 
126
        "membar #Sync \n"
-
 
127
 
-
 
128
        "add %g7, 0x8, %g7 \n"
-
 
129
        "ldx [%g6 + 0x8], %g4 \n"
-
 
130
        "stxa %g4, [%g7] 0x14 \n"
-
 
131
        "membar #Sync \n"
-
 
132
 
-
 
133
        "add %g7, 0x8, %g7 \n"
-
 
134
        "ldx [%g6 + 0x10], %g4 \n"
-
 
135
        "stxa %g4, [%g7] 0x14 \n"
-
 
136
        "membar #Sync \n"
-
 
137
 
-
 
138
        "add %g7, 0x8, %g7 \n"
-
 
139
        "ldx [%g6 + 0x18], %g4 \n"
-
 
140
        "stxa %g4, [%g7] 0x14 \n"
-
 
141
        "membar #Sync \n"
-
 
142
 
-
 
143
        "add %g7, 0x8, %g7 \n"
-
 
144
        "ldx [%g6 + 0x20], %g4 \n"
-
 
145
        "stxa %g4, [%g7] 0x14 \n"
-
 
146
        "membar #Sync \n"
-
 
147
 
-
 
148
        "add %g7, 0x8, %g7 \n"
-
 
149
        "ldx [%g6 + 0x28], %g4 \n"
-
 
150
        "stxa %g4, [%g7] 0x14 \n"
-
 
151
        "membar #Sync \n"
-
 
152
 
-
 
153
        "add %g7, 0x8, %g7 \n"
-
 
154
        "ldx [%g6 + 0x30], %g4 \n"
-
 
155
        "stxa %g4, [%g7] 0x14 \n"
-
 
156
        "membar #Sync \n"
-
 
157
 
-
 
158
        "add %g7, 0x8, %g7 \n"
-
 
159
        "ldx [%g6 + 0x38], %g4 \n"
-
 
160
        "stxa %g4, [%g7] 0x14 \n"
-
 
161
        "membar #Sync \n"
-
 
162
 
-
 
163
        "add %g7, 0x8, %g7 \n"
-
 
164
        "ldx [%g6 + 0x40], %g4 \n"
-
 
165
        "stxa %g4, [%g7] 0x14 \n"
-
 
166
        "membar #Sync \n"
-
 
167
 
-
 
168
        "flush %i7"
-
 
169
 
-
 
170
        );
-
 
171
    delay(1000);
-
 
172
    printf("Result: %d\n", ipi_unicast_to((void (*)(void)) 1234, 1));
-
 
173
        if (waitq_sleep_timeout(&ap_completion_wq, 10000000, SYNCH_FLAGS_NONE) ==
-
 
174
                    ESYNCH_TIMEOUT)
-
 
175
            printf("%s: waiting for processor (cpuid = %" PRIu32
-
 
176
                ") timed out\n", __func__, 1);
-
 
177
#endif
115
}
178
}
116
 
179
 
117
/** @}
180
/** @}
118
 */
181
 */
119
 
182