summaryrefslogtreecommitdiffstats
path: root/src/occ/gpe/apss_altitude.pS
blob: df72fcc0ba1623f3813600e49d7dd61163a65093 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: src/occ/gpe/apss_altitude.pS $
#
# OpenPOWER OnChipController Project
#
# Contributors Listed Below - COPYRIGHT 2011,2014
# [+] Google Inc.
# [+] International Business Machines Corp.
#
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# IBM_PROLOG_END_TAG

//////////////////////////////////////////////////////////////////////
// Includes
//////////////////////////////////////////////////////////////////////
.nolist
#include "pgp.h"
#include "pgas.h"
.list

//////////////////////////////////////////////////////////////////////
// Define Address Space
//////////////////////////////////////////////////////////////////////
.oci

//////////////////////////////////////////////////////////////////////
// Define Symbols
//////////////////////////////////////////////////////////////////////

#include <pss_constants.h>

#define GPE_PROG_ID 0x0002

//////////////////////////////////////////////////////////////////////
// Define Structures
//////////////////////////////////////////////////////////////////////

// Declare the offsets of the struct that will be passed to the
// GPE program via the ETR register
//
// struct G_gpe_apss_read_altitude_args =
// {
.struct     0
ERROR_RC:
    .struct ERROR_RC + 8
ERROR_FFDC:
    .struct ERROR_FFDC + 8
ALTITUDE:
// };

//////////////////////////////////////////////////////////////////////
// Begin Program
//////////////////////////////////////////////////////////////////////

.text

#include <gpe_macros.h>
#include <pss_macros.h>

//--------------------------------------------------------------------
// PORE-GPE Routine Specification:
//
// Name: GPE_apss_read_altitude
//
// Description:  Read APSS altitude
//
// Inputs:       G_gpe_apss_read_altitude_args
//     struct {
//         PoreGpeErrorStruct error;
//         uint16_t altitude;     // This is where the altitude will be stored (output)
//         uint8_t reserved[6];   // Requried since GPE only does 8 byte writes.
//     } G_gpe_apss_read_altitude_args
//     struct {
//         uint64_t rc;          // This should be read as 63:32=addr, 31:0=rc
//         uint64_t ffdc;        // Whatever GPE program puts in for FFDC data
//     } PoreGpeErrorStruct;
//
// Outputs:      Altitude (and FFDC on failure)
//
// End PORE-GPE Routine Specification
//--------------------------------------------------------------------
.global GPE_apss_read_altitude
GPE_apss_read_altitude:

    // Copy passed Structure Pointer into A1
    mr      A1, ETR

    // Wait for SPI operations to be complete (10usec timeout)
    _wait_for_spi_ops_complete 10, error_timeout

    // Setup control regs
    // frame_size=16, out_count=16, in_delay1=never, in_count2=16
    _putscom SPIPSS_P2S_CTRL_REG0, 0x410FC00004000000
    // bridge_enable, clock_divider=7, 2 frames
    _putscom SPIPSS_P2S_CTRL_REG1, 0x801C400000000000
    // inter_frame_delay=25 (2.5usec)
    _putscom SPIPSS_P2S_CTRL_REG2, 0x000C800000000000

    // APSS command to get the altitude (APSS cmd 0x9000)
    li      D0, 0x9000000000000000
    _putscom_d0 SPIPSS_P2S_WDATA_REG

    // Start SPI transaction
    _putscom SPIPSS_P2S_COMMAND_REG, 0x8000000000000000

    // wait 10usec for command to complete
    waits (10 * MICROSECONDS)

    // Wait for SPI operations to be complete (10usec timeout)
    _wait_for_spi_ops_complete 10, error_altitude_timeout

    // Read altitude and store in structure
    _getscom SPIPSS_P2S_RDATA_REG
    // The scom data for that cmd is in 2nd two bytes of the register (shift left 2 bytes)
    rols    D0, D0, 16
    std     D0, ALTITUDE, A1

    halt


error_statusreg:
    // An error/reserved bit was set when reading p2s status register...
    // D0: P2S_STATUS_REG
    _saveffdc GPE_PROG_ID, 0x0002
    halt


error_timeout:
    // p2s_ongoing bit was never cleared after several retries...
    // D0: P2S_STATUS_REG
    _saveffdc GPE_PROG_ID, 0x0001
    halt


error_altitude_timeout:
    // After sending the read altitude command, the p2s_ongoing bit was
    // never cleared after several retries...
    // D0: P2S_STATUS_REG
    _saveffdc GPE_PROG_ID, 0x0003
    halt


//////////////////////////////////////////////////////////////////////
// End of Program
//////////////////////////////////////////////////////////////////////
OpenPOWER on IntegriCloud