Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
a47f60f6
Commit
a47f60f6
authored
5 years ago
by
Sandrine Bailleux
Committed by
TrustedFirmware Code Review
5 years ago
Browse files
Options
Download
Plain Diff
Merge "intel: s10: Remove unused source code" into integration
parents
49874351
0d1b704a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
plat/intel/soc/stratix10/plat_psci.c
+0
-208
plat/intel/soc/stratix10/plat_psci.c
plat/intel/soc/stratix10/plat_sip_svc.c
+0
-378
plat/intel/soc/stratix10/plat_sip_svc.c
with
0 additions
and
586 deletions
+0
-586
plat/intel/soc/stratix10/plat_psci.c
deleted
100644 → 0
View file @
49874351
/*
* Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch_helpers.h>
#include <assert.h>
#include <common/debug.h>
#include <errno.h>
#include <lib/mmio.h>
#include <drivers/arm/gic_common.h>
#include <drivers/arm/gicv2.h>
#include <plat/common/platform.h>
#include <lib/psci/psci.h>
#include "platform_def.h"
#include "s10_reset_manager.h"
#include "socfpga_mailbox.h"
#define S10_RSTMGR_OFST 0xffd11000
#define S10_RSTMGR_MPUMODRST_OFST 0x20
uintptr_t
*
stratix10_sec_entry
=
(
uintptr_t
*
)
PLAT_SEC_ENTRY
;
uintptr_t
*
cpuid_release
=
(
uintptr_t
*
)
PLAT_CPUID_RELEASE
;
/*******************************************************************************
* plat handler called when a CPU is about to enter standby.
******************************************************************************/
void
plat_cpu_standby
(
plat_local_state_t
cpu_state
)
{
/*
* Enter standby state
* dsb is good practice before using wfi to enter low power states
*/
VERBOSE
(
"%s: cpu_state: 0x%x
\n
"
,
__func__
,
cpu_state
);
dsb
();
wfi
();
}
/*******************************************************************************
* plat handler called when a power domain is about to be turned on. The
* mpidr determines the CPU to be turned on.
******************************************************************************/
int
plat_pwr_domain_on
(
u_register_t
mpidr
)
{
unsigned
int
cpu_id
=
plat_core_pos_by_mpidr
(
mpidr
);
VERBOSE
(
"%s: mpidr: 0x%lx
\n
"
,
__func__
,
mpidr
);
if
(
cpu_id
==
-
1
)
return
PSCI_E_INTERN_FAIL
;
*
cpuid_release
=
cpu_id
;
/* release core reset */
mmio_setbits_32
(
S10_RSTMGR_OFST
+
S10_RSTMGR_MPUMODRST_OFST
,
1
<<
cpu_id
);
return
PSCI_E_SUCCESS
;
}
/*******************************************************************************
* plat handler called when a power domain is about to be turned off. The
* target_state encodes the power state that each level should transition to.
******************************************************************************/
void
plat_pwr_domain_off
(
const
psci_power_state_t
*
target_state
)
{
unsigned
int
cpu_id
=
plat_my_core_pos
();
for
(
size_t
i
=
0
;
i
<=
PLAT_MAX_PWR_LVL
;
i
++
)
VERBOSE
(
"%s: target_state->pwr_domain_state[%lu]=%x
\n
"
,
__func__
,
i
,
target_state
->
pwr_domain_state
[
i
]);
/* TODO: Prevent interrupts from spuriously waking up this cpu */
/* gicv2_cpuif_disable(); */
/* assert core reset */
mmio_setbits_32
(
S10_RSTMGR_OFST
+
S10_RSTMGR_MPUMODRST_OFST
,
1
<<
cpu_id
);
}
/*******************************************************************************
* plat handler called when a power domain is about to be suspended. The
* target_state encodes the power state that each level should transition to.
******************************************************************************/
void
plat_pwr_domain_suspend
(
const
psci_power_state_t
*
target_state
)
{
unsigned
int
cpu_id
=
plat_my_core_pos
();
for
(
size_t
i
=
0
;
i
<=
PLAT_MAX_PWR_LVL
;
i
++
)
VERBOSE
(
"%s: target_state->pwr_domain_state[%lu]=%x
\n
"
,
__func__
,
i
,
target_state
->
pwr_domain_state
[
i
]);
/* assert core reset */
mmio_setbits_32
(
S10_RSTMGR_OFST
+
S10_RSTMGR_MPUMODRST_OFST
,
1
<<
cpu_id
);
}
/*******************************************************************************
* plat handler called when a power domain has just been powered on after
* being turned off earlier. The target_state encodes the low power state that
* each level has woken up from.
******************************************************************************/
void
plat_pwr_domain_on_finish
(
const
psci_power_state_t
*
target_state
)
{
for
(
size_t
i
=
0
;
i
<=
PLAT_MAX_PWR_LVL
;
i
++
)
VERBOSE
(
"%s: target_state->pwr_domain_state[%lu]=%x
\n
"
,
__func__
,
i
,
target_state
->
pwr_domain_state
[
i
]);
/* Program the gic per-cpu distributor or re-distributor interface */
gicv2_pcpu_distif_init
();
gicv2_set_pe_target_mask
(
plat_my_core_pos
());
/* Enable the gic cpu interface */
gicv2_cpuif_enable
();
}
/*******************************************************************************
* plat handler called when a power domain has just been powered on after
* having been suspended earlier. The target_state encodes the low power state
* that each level has woken up from.
* TODO: At the moment we reuse the on finisher and reinitialize the secure
* context. Need to implement a separate suspend finisher.
******************************************************************************/
void
plat_pwr_domain_suspend_finish
(
const
psci_power_state_t
*
target_state
)
{
unsigned
int
cpu_id
=
plat_my_core_pos
();
for
(
size_t
i
=
0
;
i
<=
PLAT_MAX_PWR_LVL
;
i
++
)
VERBOSE
(
"%s: target_state->pwr_domain_state[%lu]=%x
\n
"
,
__func__
,
i
,
target_state
->
pwr_domain_state
[
i
]);
/* release core reset */
mmio_clrbits_32
(
S10_RSTMGR_OFST
+
S10_RSTMGR_MPUMODRST_OFST
,
1
<<
cpu_id
);
}
/*******************************************************************************
* plat handlers to shutdown/reboot the system
******************************************************************************/
static
void
__dead2
plat_system_off
(
void
)
{
wfi
();
ERROR
(
"System Off: operation not handled.
\n
"
);
panic
();
}
static
void
__dead2
plat_system_reset
(
void
)
{
INFO
(
"assert Peripheral from Reset
\r\n
"
);
deassert_peripheral_reset
();
mailbox_reset_cold
();
while
(
1
)
wfi
();
}
int
plat_validate_power_state
(
unsigned
int
power_state
,
psci_power_state_t
*
req_state
)
{
VERBOSE
(
"%s: power_state: 0x%x
\n
"
,
__func__
,
power_state
);
return
PSCI_E_SUCCESS
;
}
int
plat_validate_ns_entrypoint
(
unsigned
long
ns_entrypoint
)
{
VERBOSE
(
"%s: ns_entrypoint: 0x%lx
\n
"
,
__func__
,
ns_entrypoint
);
return
PSCI_E_SUCCESS
;
}
void
plat_get_sys_suspend_power_state
(
psci_power_state_t
*
req_state
)
{
req_state
->
pwr_domain_state
[
PSCI_CPU_PWR_LVL
]
=
PLAT_MAX_OFF_STATE
;
req_state
->
pwr_domain_state
[
1
]
=
PLAT_MAX_OFF_STATE
;
}
/*******************************************************************************
* Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
* platform layer will take care of registering the handlers with PSCI.
******************************************************************************/
const
plat_psci_ops_t
plat_psci_pm_ops
=
{
.
cpu_standby
=
plat_cpu_standby
,
.
pwr_domain_on
=
plat_pwr_domain_on
,
.
pwr_domain_off
=
plat_pwr_domain_off
,
.
pwr_domain_suspend
=
plat_pwr_domain_suspend
,
.
pwr_domain_on_finish
=
plat_pwr_domain_on_finish
,
.
pwr_domain_suspend_finish
=
plat_pwr_domain_suspend_finish
,
.
system_off
=
plat_system_off
,
.
system_reset
=
plat_system_reset
,
.
validate_power_state
=
plat_validate_power_state
,
.
validate_ns_entrypoint
=
plat_validate_ns_entrypoint
,
.
get_sys_suspend_power_state
=
plat_get_sys_suspend_power_state
};
/*******************************************************************************
* Export the platform specific power ops.
******************************************************************************/
int
plat_setup_psci_ops
(
uintptr_t
sec_entrypoint
,
const
struct
plat_psci_ops
**
psci_ops
)
{
/* Save warm boot entrypoint.*/
*
stratix10_sec_entry
=
sec_entrypoint
;
*
psci_ops
=
&
plat_psci_pm_ops
;
return
0
;
}
This diff is collapsed.
Click to expand it.
plat/intel/soc/stratix10/plat_sip_svc.c
deleted
100644 → 0
View file @
49874351
/*
* Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/mmio.h>
#include <socfpga_mailbox.h>
#include <tools_share/uuid.h>
/* Number of SiP Calls implemented */
#define SIP_NUM_CALLS 0x3
/* Total buffer the driver can hold */
#define FPGA_CONFIG_BUFFER_SIZE 4
int
current_block
;
int
current_buffer
;
int
current_id
=
1
;
int
max_blocks
;
uint32_t
bytes_per_block
;
uint32_t
blocks_submitted
;
uint32_t
blocks_completed
;
struct
fpga_config_info
{
uint32_t
addr
;
int
size
;
int
size_written
;
uint32_t
write_requested
;
int
subblocks_sent
;
int
block_number
;
};
/* SiP Service UUID */
DEFINE_SVC_UUID2
(
intl_svc_uid
,
0xa85273b0
,
0xe85a
,
0x4862
,
0xa6
,
0x2a
,
0xfa
,
0x88
,
0x88
,
0x17
,
0x68
,
0x81
);
uint64_t
plat_sip_handler
(
uint32_t
smc_fid
,
uint64_t
x1
,
uint64_t
x2
,
uint64_t
x3
,
uint64_t
x4
,
void
*
cookie
,
void
*
handle
,
uint64_t
flags
)
{
ERROR
(
"%s: unhandled SMC (0x%x)
\n
"
,
__func__
,
smc_fid
);
SMC_RET1
(
handle
,
SMC_UNK
);
}
struct
fpga_config_info
fpga_config_buffers
[
FPGA_CONFIG_BUFFER_SIZE
];
static
void
intel_fpga_sdm_write_buffer
(
struct
fpga_config_info
*
buffer
)
{
uint32_t
args
[
3
];
while
(
max_blocks
>
0
&&
buffer
->
size
>
buffer
->
size_written
)
{
if
(
buffer
->
size
-
buffer
->
size_written
<=
bytes_per_block
)
{
args
[
0
]
=
(
1
<<
8
);
args
[
1
]
=
buffer
->
addr
+
buffer
->
size_written
;
args
[
2
]
=
buffer
->
size
-
buffer
->
size_written
;
buffer
->
size_written
+=
buffer
->
size
-
buffer
->
size_written
;
buffer
->
subblocks_sent
++
;
mailbox_send_cmd_async
(
0x4
,
MBOX_RECONFIG_DATA
,
args
,
3
,
0
);
current_buffer
++
;
current_buffer
%=
FPGA_CONFIG_BUFFER_SIZE
;
}
else
{
args
[
0
]
=
(
1
<<
8
);
args
[
1
]
=
buffer
->
addr
+
buffer
->
size_written
;
args
[
2
]
=
bytes_per_block
;
buffer
->
size_written
+=
bytes_per_block
;
mailbox_send_cmd_async
(
0x4
,
MBOX_RECONFIG_DATA
,
args
,
3
,
0
);
buffer
->
subblocks_sent
++
;
}
max_blocks
--
;
}
}
static
int
intel_fpga_sdm_write_all
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
FPGA_CONFIG_BUFFER_SIZE
;
i
++
)
intel_fpga_sdm_write_buffer
(
&
fpga_config_buffers
[
current_buffer
]);
return
0
;
}
uint32_t
intel_mailbox_fpga_config_isdone
(
void
)
{
uint32_t
args
[
2
];
uint32_t
response
[
6
];
int
status
;
status
=
mailbox_send_cmd
(
1
,
MBOX_RECONFIG_STATUS
,
args
,
0
,
0
,
response
);
if
(
status
<
0
)
return
INTEL_SIP_SMC_STATUS_ERROR
;
if
(
response
[
RECONFIG_STATUS_STATE
]
&&
response
[
RECONFIG_STATUS_STATE
]
!=
MBOX_CFGSTAT_STATE_CONFIG
)
return
INTEL_SIP_SMC_STATUS_ERROR
;
if
(
!
(
response
[
RECONFIG_STATUS_PIN_STATUS
]
&
PIN_STATUS_NSTATUS
))
return
INTEL_SIP_SMC_STATUS_ERROR
;
if
(
response
[
RECONFIG_STATUS_SOFTFUNC_STATUS
]
&
SOFTFUNC_STATUS_SEU_ERROR
)
return
INTEL_SIP_SMC_STATUS_ERROR
;
if
((
response
[
RECONFIG_STATUS_SOFTFUNC_STATUS
]
&
SOFTFUNC_STATUS_CONF_DONE
)
&&
(
response
[
RECONFIG_STATUS_SOFTFUNC_STATUS
]
&
SOFTFUNC_STATUS_INIT_DONE
))
return
INTEL_SIP_SMC_STATUS_OK
;
return
INTEL_SIP_SMC_STATUS_ERROR
;
}
static
int
mark_last_buffer_xfer_completed
(
uint32_t
*
buffer_addr_completed
)
{
int
i
;
for
(
i
=
0
;
i
<
FPGA_CONFIG_BUFFER_SIZE
;
i
++
)
{
if
(
fpga_config_buffers
[
i
].
block_number
==
current_block
)
{
fpga_config_buffers
[
i
].
subblocks_sent
--
;
if
(
fpga_config_buffers
[
i
].
subblocks_sent
==
0
&&
fpga_config_buffers
[
i
].
size
<=
fpga_config_buffers
[
i
].
size_written
)
{
fpga_config_buffers
[
i
].
write_requested
=
0
;
current_block
++
;
*
buffer_addr_completed
=
fpga_config_buffers
[
i
].
addr
;
return
0
;
}
}
}
return
-
1
;
}
unsigned
int
address_in_ddr
(
uint32_t
*
addr
)
{
if
(((
unsigned
long
long
)
addr
>
DRAM_BASE
)
&&
((
unsigned
long
long
)
addr
<
DRAM_BASE
+
DRAM_SIZE
))
return
0
;
return
-
1
;
}
int
intel_fpga_config_completed_write
(
uint32_t
*
completed_addr
,
uint32_t
*
count
)
{
uint32_t
status
=
INTEL_SIP_SMC_STATUS_OK
;
*
count
=
0
;
int
resp_len
=
0
;
uint32_t
resp
[
5
];
int
all_completed
=
1
;
int
count_check
=
0
;
if
(
address_in_ddr
(
completed_addr
)
!=
0
||
address_in_ddr
(
count
)
!=
0
)
return
INTEL_SIP_SMC_STATUS_ERROR
;
for
(
count_check
=
0
;
count_check
<
3
;
count_check
++
)
if
(
address_in_ddr
(
&
completed_addr
[
*
count
+
count_check
])
!=
0
)
return
INTEL_SIP_SMC_STATUS_ERROR
;
resp_len
=
mailbox_read_response
(
0x4
,
resp
);
while
(
resp_len
>=
0
&&
*
count
<
3
)
{
max_blocks
++
;
if
(
mark_last_buffer_xfer_completed
(
&
completed_addr
[
*
count
])
==
0
)
*
count
=
*
count
+
1
;
else
break
;
resp_len
=
mailbox_read_response
(
0x4
,
resp
);
}
if
(
*
count
<=
0
)
{
if
(
resp_len
!=
MBOX_NO_RESPONSE
&&
resp_len
!=
MBOX_TIMEOUT
&&
resp_len
!=
0
)
{
return
INTEL_SIP_SMC_STATUS_ERROR
;
}
*
count
=
0
;
}
intel_fpga_sdm_write_all
();
if
(
*
count
>
0
)
status
=
INTEL_SIP_SMC_STATUS_OK
;
else
if
(
*
count
==
0
)
status
=
INTEL_SIP_SMC_STATUS_BUSY
;
for
(
int
i
=
0
;
i
<
FPGA_CONFIG_BUFFER_SIZE
;
i
++
)
{
if
(
fpga_config_buffers
[
i
].
write_requested
!=
0
)
{
all_completed
=
0
;
break
;
}
}
if
(
all_completed
==
1
)
return
INTEL_SIP_SMC_STATUS_OK
;
return
status
;
}
int
intel_fpga_config_start
(
uint32_t
config_type
)
{
uint32_t
response
[
3
];
int
status
=
0
;
status
=
mailbox_send_cmd
(
2
,
MBOX_RECONFIG
,
0
,
0
,
0
,
response
);
if
(
status
<
0
)
return
status
;
max_blocks
=
response
[
0
];
bytes_per_block
=
response
[
1
];
for
(
int
i
=
0
;
i
<
FPGA_CONFIG_BUFFER_SIZE
;
i
++
)
{
fpga_config_buffers
[
i
].
size
=
0
;
fpga_config_buffers
[
i
].
size_written
=
0
;
fpga_config_buffers
[
i
].
addr
=
0
;
fpga_config_buffers
[
i
].
write_requested
=
0
;
fpga_config_buffers
[
i
].
block_number
=
0
;
fpga_config_buffers
[
i
].
subblocks_sent
=
0
;
}
blocks_submitted
=
0
;
current_block
=
0
;
current_buffer
=
0
;
return
0
;
}
uint32_t
intel_fpga_config_write
(
uint64_t
mem
,
uint64_t
size
)
{
int
i
=
0
;
uint32_t
status
=
INTEL_SIP_SMC_STATUS_OK
;
if
(
mem
<
DRAM_BASE
||
mem
>
DRAM_BASE
+
DRAM_SIZE
)
status
=
INTEL_SIP_SMC_STATUS_REJECTED
;
if
(
mem
+
size
>
DRAM_BASE
+
DRAM_SIZE
)
status
=
INTEL_SIP_SMC_STATUS_REJECTED
;
for
(
i
=
0
;
i
<
FPGA_CONFIG_BUFFER_SIZE
;
i
++
)
{
if
(
!
fpga_config_buffers
[
i
].
write_requested
)
{
fpga_config_buffers
[
i
].
addr
=
mem
;
fpga_config_buffers
[
i
].
size
=
size
;
fpga_config_buffers
[
i
].
size_written
=
0
;
fpga_config_buffers
[
i
].
write_requested
=
1
;
fpga_config_buffers
[
i
].
block_number
=
blocks_submitted
++
;
fpga_config_buffers
[
i
].
subblocks_sent
=
0
;
break
;
}
}
if
(
i
==
FPGA_CONFIG_BUFFER_SIZE
)
{
status
=
INTEL_SIP_SMC_STATUS_REJECTED
;
return
status
;
}
else
if
(
i
==
FPGA_CONFIG_BUFFER_SIZE
-
1
)
{
status
=
INTEL_SIP_SMC_STATUS_BUSY
;
}
intel_fpga_sdm_write_all
();
return
status
;
}
/*
* This function is responsible for handling all SiP calls from the NS world
*/
uintptr_t
sip_smc_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
,
void
*
cookie
,
void
*
handle
,
u_register_t
flags
)
{
uint32_t
status
=
INTEL_SIP_SMC_STATUS_OK
;
uint32_t
completed_addr
[
3
];
uint32_t
count
=
0
;
switch
(
smc_fid
)
{
case
SIP_SVC_UID
:
/* Return UID to the caller */
SMC_UUID_RET
(
handle
,
intl_svc_uid
);
break
;
case
INTEL_SIP_SMC_FPGA_CONFIG_ISDONE
:
status
=
intel_mailbox_fpga_config_isdone
();
SMC_RET4
(
handle
,
status
,
0
,
0
,
0
);
break
;
case
INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM
:
SMC_RET3
(
handle
,
INTEL_SIP_SMC_STATUS_OK
,
INTEL_SIP_SMC_FPGA_CONFIG_ADDR
,
INTEL_SIP_SMC_FPGA_CONFIG_SIZE
-
INTEL_SIP_SMC_FPGA_CONFIG_ADDR
);
break
;
case
INTEL_SIP_SMC_FPGA_CONFIG_START
:
status
=
intel_fpga_config_start
(
x1
);
SMC_RET4
(
handle
,
status
,
0
,
0
,
0
);
break
;
case
INTEL_SIP_SMC_FPGA_CONFIG_WRITE
:
status
=
intel_fpga_config_write
(
x1
,
x2
);
SMC_RET4
(
handle
,
status
,
0
,
0
,
0
);
break
;
case
INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE
:
status
=
intel_fpga_config_completed_write
(
completed_addr
,
&
count
);
switch
(
count
)
{
case
1
:
SMC_RET4
(
handle
,
INTEL_SIP_SMC_STATUS_OK
,
completed_addr
[
0
],
0
,
0
);
break
;
case
2
:
SMC_RET4
(
handle
,
INTEL_SIP_SMC_STATUS_OK
,
completed_addr
[
0
],
completed_addr
[
1
],
0
);
break
;
case
3
:
SMC_RET4
(
handle
,
INTEL_SIP_SMC_STATUS_OK
,
completed_addr
[
0
],
completed_addr
[
1
],
completed_addr
[
2
]);
break
;
case
0
:
SMC_RET4
(
handle
,
status
,
0
,
0
,
0
);
break
;
default:
SMC_RET1
(
handle
,
INTEL_SIP_SMC_STATUS_ERROR
);
}
break
;
default:
return
plat_sip_handler
(
smc_fid
,
x1
,
x2
,
x3
,
x4
,
cookie
,
handle
,
flags
);
}
}
DECLARE_RT_SVC
(
s10_sip_svc
,
OEN_SIP_START
,
OEN_SIP_END
,
SMC_TYPE_FAST
,
NULL
,
sip_smc_handler
);
DECLARE_RT_SVC
(
s10_sip_svc_std
,
OEN_SIP_START
,
OEN_SIP_END
,
SMC_TYPE_YIELD
,
NULL
,
sip_smc_handler
);
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help