blob: 499e477d69c0d28f7a63541e6876409b0f82c784 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
/*
* SPCN based LED location code and other information
*
* Copyright 2013-2016 IBM Corp.
*/
#ifndef __FSP_LEDS_H
#define __FSP_LEDS_H
/* Supported FSP response codes */
#define FSP_IND_NOT_IMPLMNTD 0x00 /* Indicator not implemented */
#define FSP_IND_IMPLMNTD 0x04 /* Indicator implemented */
#define FSP_IND_IMPL_UNKNOWN 0x08 /* Implementation unknown */
#define FSP_IND_INACTIVE 0x00 /* Indicator not active */
#define FSP_IND_IDENTIFY_ACTV 0x01 /* Identify state active */
#define FSP_IND_FAULT_ACTV 0x02 /* Fault state active */
#define FSP_IND_STATE_UNKNOWN 0xff /* Indicator state unknown */
#define FSP_RSRC_NOT_PRESENT 0x00 /* Resource not present */
#define FSP_RSRC_PRESENT 0x40 /* Resource present */
#define FSP_RSRC_PRSNC_UNKNOWN 0x80 /* Resource presence unknown */
/* LED exclusive bits */
#define FSP_LED_EXCL_FAULT (1UL << 0)
#define FSP_LED_EXCL_IDENTIFY (1UL << 1)
/* LED update message source */
enum spcn_cmd_src {
SPCN_SRC_FSP = 0,
SPCN_SRC_OPAL = 1,
SPCN_SRC_MAX = 2
};
/* SPCN set LED */
struct spcn_led_data {
u8 lc_len;
__be16 state;
char lc_code[LOC_CODE_SIZE];
} __packed;
/* LED data */
struct fsp_led_data {
u16 rid; /* Resource ID */
u8 lc_len; /* Location code len */
char loc_code[LOC_CODE_SIZE];
u16 parms; /* Parameters */
u16 status; /* Status */
u16 excl_bit; /* Exclusive LED bit */
struct list_node link;
};
/* FSP location code request */
struct fsp_loc_code_req {
__be16 len;
__be16 req_type;
u8 raw_len;
u8 lc_sz;
char loc_code[LOC_CODE_SIZE];
} __packed;
/* FSP location code data */
struct fsp_loc_code_data {
__be16 size;
__be32 ccin;
u8 status;
u8 ind_state;
u8 raw_len;
u8 fld_sz;
/* The size below must include the padding to
* make the whole structure aligned to a
* multiple of 4 bytes
*/
char loc_code[LOC_CODE_SIZE + 2]; /* 82 */
/* We need to pack the structure otherwise the
* compiler adds additional alignment to make
* it 8 bytes aligned
*/
} __packed;
/* Get indicator state request */
struct fsp_get_ind_state_req {
__be16 size;
u8 lc_len;
u8 fld_sz;
char loc_code[LOC_CODE_SIZE];
} __packed;
/* Set indicator state request */
struct fsp_set_ind_state_req {
__be16 size;
__be16 req_type;
u8 reserved[3];
u8 ind_state;
u8 lc_len;
u8 fld_sz;
char loc_code[LOC_CODE_SIZE];
} __packed;
/* LED set SPCN command */
struct led_set_cmd {
char loc_code[LOC_CODE_SIZE];
u8 command;
u8 state;
u16 ckpt_status; /* Checkpointed status */
u16 ckpt_excl_bit; /* Checkpointed exclusive status */
u64 async_token; /* OPAL async token */
enum spcn_cmd_src cmd_src; /* OPAL or FSP based */
struct list_node link;
};
/* System Attention Indicator */
struct sai_data {
uint8_t state;
char loc_code[LOC_CODE_SIZE];
};
/* LED commands and state */
#define LED_COMMAND_FAULT 1
#define LED_COMMAND_IDENTIFY 0
#define LED_STATE_ON 1
#define LED_STATE_OFF 0
/* FSP get loc-code list command request type */
#define GET_LC_CMPLT_SYS 0x8000
#define GET_LC_ENCLOSURES 0x4000
#define GET_LC_ENCL_DESCENDANTS 0x2000
#define GET_LC_SINGLE_LOC_CODE 0x0100
/* FSP set indicator command request type */
#define SET_IND_ENCLOSURE 0x4000
#define SET_IND_SINGLE_LOC_CODE 0x0001
/* Response buffer */
#define OUTBUF_HEADER_SIZE 8
/* LED miscellaneous */
#define LOC_CODE_LEN 1
#define LED_CONTROL_LEN 2
#define FSP_LC_STRUCT_FIXED_SZ 0x0a
/* LED Device tree property names */
#define DT_PROPERTY_LED_COMPATIBLE "ibm,opal-v3-led"
#define DT_PROPERTY_LED_NODE "leds"
#define DT_PROPERTY_LED_MODE "led-mode"
#define DT_PROPERTY_LED_TYPES "led-types"
/* LED Mode */
#define LED_MODE_LIGHT_PATH "lightpath"
#define LED_MODE_GUIDING_LIGHT "guidinglight"
/* LED type */
#define LED_TYPE_IDENTIFY "identify"
#define LED_TYPE_FAULT "fault"
#define LED_TYPE_ATTENTION "attention"
#endif