#include <sys/cdefs.h>
#include <dev/isci/scil/scic_sgpio.h>
#include <dev/isci/scil/scic_sds_controller_registers.h>
#include <dev/isci/scil/scic_user_callback.h>
static
void scic_sgpio_write_SGODSR_register(
SCIC_SDS_CONTROLLER_T *controller,
U32 phy_mask,
U32 value
)
{
U8 phy_index;
for (phy_index = 0; phy_index < SCI_MAX_PHYS; phy_index++)
{
if (phy_mask >> phy_index & 1)
{
scu_sgpio_peg0_register_write(
controller, output_data_select[phy_index], value
);
}
}
}
void scic_sgpio_set_vendor_code(
SCI_CONTROLLER_HANDLE_T controller,
U8 vendor_specific_sequence
)
{
SCIC_SDS_CONTROLLER_T * core_controller = (SCIC_SDS_CONTROLLER_T *) controller;
scu_sgpio_peg0_register_write(
core_controller, vendor_specific_code, vendor_specific_sequence);
}
void scic_sgpio_set_blink_patterns(
SCI_CONTROLLER_HANDLE_T controller,
U8 pattern_a_low,
U8 pattern_a_high,
U8 pattern_b_low,
U8 pattern_b_high
)
{
U32 value;
SCIC_SDS_CONTROLLER_T * core_controller = (SCIC_SDS_CONTROLLER_T *) controller;
value = (pattern_b_high << 12) + (pattern_b_low << 8) + (pattern_a_high << 4) + pattern_a_low;
scu_sgpio_peg0_register_write(
core_controller, blink_rate, value);
}
void scic_sgpio_set_functionality(
SCI_CONTROLLER_HANDLE_T controller,
BOOL sgpio_mode
)
{
U32 value = DISABLE_SGPIO_FUNCTIONALITY;
SCIC_SDS_CONTROLLER_T * core_controller = (SCIC_SDS_CONTROLLER_T *) controller;
if(sgpio_mode)
{
value = ENABLE_SGPIO_FUNCTIONALITY;
}
scu_sgpio_peg0_register_write(
core_controller, interface_control, value);
}
void scic_sgpio_apply_led_blink_pattern(
SCI_CONTROLLER_HANDLE_T controller,
U32 phy_mask,
BOOL error,
BOOL locate,
BOOL activity,
U8 pattern_selection
)
{
U32 output_value = 0;
SCIC_SDS_CONTROLLER_T * core_controller = (SCIC_SDS_CONTROLLER_T *) controller;
output_value = (SGODSR_INVERT_BIT << SGODSR_ERROR_LED_SHIFT)
| (SGODSR_INVERT_BIT << SGODSR_LOCATE_LED_SHIFT)
| (SGODSR_INVERT_BIT << SGODSR_ACTIVITY_LED_SHIFT);
if(error)
{
output_value |= pattern_selection << SGODSR_ERROR_LED_SHIFT;
output_value &= ~(SGODSR_INVERT_BIT << SGODSR_ERROR_LED_SHIFT);
}
if(locate)
{
output_value |= pattern_selection << SGODSR_LOCATE_LED_SHIFT;
output_value &= ~(SGODSR_INVERT_BIT << SGODSR_LOCATE_LED_SHIFT);
}
if(activity)
{
output_value |= pattern_selection << SGODSR_ACTIVITY_LED_SHIFT;
output_value &= ~(SGODSR_INVERT_BIT << SGODSR_ACTIVITY_LED_SHIFT);
}
scic_sgpio_write_SGODSR_register(core_controller, phy_mask, output_value);
}
void scic_sgpio_set_led_blink_pattern(
SCI_CONTROLLER_HANDLE_T controller,
SCI_PORT_HANDLE_T port_handle,
BOOL error,
BOOL locate,
BOOL activity,
U8 pattern_selection
)
{
U32 phy_mask;
SCIC_SDS_PORT_T * port = (SCIC_SDS_PORT_T *) port_handle;
phy_mask = scic_sds_port_get_phys(port);
scic_sgpio_apply_led_blink_pattern(
controller, phy_mask, error, locate, activity, pattern_selection);
}
void scic_sgpio_update_led_state(
SCI_CONTROLLER_HANDLE_T controller,
U32 phy_mask,
BOOL error,
BOOL locate,
BOOL activity
)
{
U32 output_value;
SCIC_SDS_CONTROLLER_T * core_controller = (SCIC_SDS_CONTROLLER_T *) controller;
output_value = 0x00000000;
if(!error)
{
output_value |= SGODSR_INVERT_BIT << SGODSR_ERROR_LED_SHIFT;
}
if(!locate)
{
output_value |= SGODSR_INVERT_BIT << SGODSR_LOCATE_LED_SHIFT;
}
if(!activity)
{
output_value |= SGODSR_INVERT_BIT << SGODSR_ACTIVITY_LED_SHIFT;
}
scic_sgpio_write_SGODSR_register(core_controller, phy_mask, output_value);
}
void scic_sgpio_set_led_state(
SCI_CONTROLLER_HANDLE_T controller,
SCI_PORT_HANDLE_T port_handle,
BOOL error,
BOOL locate,
BOOL activity
)
{
U32 phy_mask;
SCIC_SDS_PORT_T * port = (SCIC_SDS_PORT_T *) port_handle;
phy_mask = scic_sds_port_get_phys(port);
scic_sgpio_update_led_state(controller, phy_mask, error, locate, activity);
}
void scic_sgpio_set_to_hardware_control(
SCI_CONTROLLER_HANDLE_T controller,
BOOL is_hardware_controlled
)
{
SCIC_SDS_CONTROLLER_T * core_controller = (SCIC_SDS_CONTROLLER_T *) controller;
U8 i;
U32 output_value;
if(is_hardware_controlled)
{
output_value = SGPIO_HARDWARE_CONTROL;
}
else
{
output_value = SGPIO_SOFTWARE_CONTROL;
}
for(i = 0; i < SCI_MAX_PHYS; i++)
{
scu_sgpio_peg0_register_write(
core_controller, output_data_select[i], output_value);
}
}
U32 scic_sgpio_read(
SCI_CONTROLLER_HANDLE_T controller
)
{
return 0xffffffff;
}
void scic_sgpio_hardware_initialize(
SCI_CONTROLLER_HANDLE_T controller
)
{
scic_sgpio_set_functionality(controller, TRUE);
scic_sgpio_set_to_hardware_control(controller, TRUE);
scic_sgpio_set_vendor_code(controller, 0x00);
}
void scic_sgpio_initialize(
SCI_CONTROLLER_HANDLE_T controller
)
{
scic_sgpio_set_functionality(controller, TRUE);
scic_sgpio_set_to_hardware_control(controller, FALSE);
scic_sgpio_set_vendor_code(controller, 0x00);
}