Re: [PATCH v2 2/9] ACPI, CPER: Update cper info

Mauro Carvalho Chehab
2013-10-16T16:52:50Z

Em Wed, 16 Oct 2013 10:55:59 -0400
"Chen, Gong" <gong.chen@linux.intel.com> escreveu:

> To prepare for the following patches and make related
> definition more clear, update some definitions about CPER.
>
> v2 -> v1: Update some more definitions suggested by Boris
>
> Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>

Reviewed-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

> ---
> drivers/acpi/apei/apei-internal.h | 12 ++++----
> drivers/acpi/apei/cper.c | 58 +++++++++++++++++++--------------------
> drivers/acpi/apei/ghes.c | 54 ++++++++++++++++++------------------
> include/acpi/actbl1.h | 14 +++++-----
> include/acpi/ghes.h | 2 +-
> include/linux/cper.h | 2 +-
> 6 files changed, 71 insertions(+), 71 deletions(-)
>
> diff --git a/drivers/acpi/apei/apei-internal.h b/drivers/acpi/apei/apei-internal.h
> index f220d64..21ba34a 100644
> --- a/drivers/acpi/apei/apei-internal.h
> +++ b/drivers/acpi/apei/apei-internal.h
> @@ -122,11 +122,11 @@ struct dentry;
> struct dentry *apei_get_debugfs_dir(void);
>
> #define apei_estatus_for_each_section(estatus, section) \
> - for (section = (struct acpi_hest_generic_data *)(estatus + 1); \
> + for (section = (struct acpi_generic_data *)(estatus + 1); \
> (void *)section - (void *)estatus < estatus->data_length; \
> section = (void *)(section+1) + section->error_data_length)
>
> -static inline u32 apei_estatus_len(struct acpi_hest_generic_status *estatus)
> +static inline u32 cper_estatus_len(struct acpi_generic_status *estatus)
> {
> if (estatus->raw_data_length)
> return estatus->raw_data_offset + \
> @@ -135,10 +135,10 @@ static inline u32 apei_estatus_len(struct acpi_hest_generic_status *estatus)
> return sizeof(*estatus) + estatus->data_length;
> }
>
> -void apei_estatus_print(const char *pfx,
> - const struct acpi_hest_generic_status *estatus);
> -int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus);
> -int apei_estatus_check(const struct acpi_hest_generic_status *estatus);
> +void cper_estatus_print(const char *pfx,
> + const struct acpi_generic_status *estatus);
> +int cper_estatus_check_header(const struct acpi_generic_status *estatus);
> +int cper_estatus_check(const struct acpi_generic_status *estatus);
>
> int apei_osc_setup(void);
> #endif
> diff --git a/drivers/acpi/apei/cper.c b/drivers/acpi/apei/cper.c
> index f827f02..eb5f6d6 100644
> --- a/drivers/acpi/apei/cper.c
> +++ b/drivers/acpi/apei/cper.c
> @@ -5,7 +5,7 @@
> * Author: Huang Ying <ying.huang@intel.com>
> *
> * CPER is the format used to describe platform hardware error by
> - * various APEI tables, such as ERST, BERT and HEST etc.
> + * various tables, such as ERST, BERT and HEST etc.
> *
> * For more information about CPER, please refer to Appendix N of UEFI
> * Specification version 2.3.
> @@ -73,7 +73,7 @@ static const char *cper_severity_str(unsigned int severity)
> * printed, with @pfx is printed at the beginning of each line.
> */
> void cper_print_bits(const char *pfx, unsigned int bits,
> - const char *strs[], unsigned int strs_size)
> + const char * const strs[], unsigned int strs_size)
> {
> int i, len = 0;
> const char *str;
> @@ -98,32 +98,32 @@ void cper_print_bits(const char *pfx, unsigned int bits,
> printk("%s\n", buf);
> }
>
> -static const char *cper_proc_type_strs[] = {
> +static const char * const cper_proc_type_strs[] = {
> "IA32/X64",
> "IA64",
> };
>
> -static const char *cper_proc_isa_strs[] = {
> +static const char * const cper_proc_isa_strs[] = {
> "IA32",
> "IA64",
> "X64",
> };
>
> -static const char *cper_proc_error_type_strs[] = {
> +static const char * const cper_proc_error_type_strs[] = {
> "cache error",
> "TLB error",
> "bus error",
> "micro-architectural error",
> };
>
> -static const char *cper_proc_op_strs[] = {
> +static const char * const cper_proc_op_strs[] = {
> "unknown or generic",
> "data read",
> "data write",
> "instruction execution",
> };
>
> -static const char *cper_proc_flag_strs[] = {
> +static const char * const cper_proc_flag_strs[] = {
> "restartable",
> "precise IP",
> "overflow",
> @@ -248,7 +248,7 @@ static const char *cper_pcie_port_type_strs[] = {
> };
>
> static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,
> - const struct acpi_hest_generic_data *gdata)
> + const struct acpi_generic_data *gdata)
> {
> if (pcie->validation_bits & CPER_PCIE_VALID_PORT_TYPE)
> printk("%s""port_type: %d, %s\n", pfx, pcie->port_type,
> @@ -283,17 +283,17 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,
> pfx, pcie->bridge.secondary_status, pcie->bridge.control);
> }
>
> -static const char *apei_estatus_section_flag_strs[] = {
> +static const char * const cper_estatus_section_flag_strs[] = {
> "primary",
> "containment warning",
> "reset",
> - "threshold exceeded",
> + "error threshold exceeded",
> "resource not accessible",
> "latent error",
> };
>
> -static void apei_estatus_print_section(
> - const char *pfx, const struct acpi_hest_generic_data *gdata, int sec_no)
> +static void cper_estatus_print_section(
> + const char *pfx, const struct acpi_generic_data *gdata, int sec_no)
> {
> uuid_le *sec_type = (uuid_le *)gdata->section_type;
> __u16 severity;
> @@ -302,8 +302,8 @@ static void apei_estatus_print_section(
> printk("%s""section: %d, severity: %d, %s\n", pfx, sec_no, severity,
> cper_severity_str(severity));
> printk("%s""flags: 0x%02x\n", pfx, gdata->flags);
> - cper_print_bits(pfx, gdata->flags, apei_estatus_section_flag_strs,
> - ARRAY_SIZE(apei_estatus_section_flag_strs));
> + cper_print_bits(pfx, gdata->flags, cper_estatus_section_flag_strs,
> + ARRAY_SIZE(cper_estatus_section_flag_strs));
> if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID)
> printk("%s""fru_id: %pUl\n", pfx, (uuid_le *)gdata->fru_id);
> if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT)
> @@ -339,34 +339,34 @@ err_section_too_small:
> pr_err(FW_WARN "error section length is too small\n");
> }
>
> -void apei_estatus_print(const char *pfx,
> - const struct acpi_hest_generic_status *estatus)
> +void cper_estatus_print(const char *pfx,
> + const struct acpi_generic_status *estatus)
> {
> - struct acpi_hest_generic_data *gdata;
> + struct acpi_generic_data *gdata;
> unsigned int data_len, gedata_len;
> int sec_no = 0;
> __u16 severity;
>
> - printk("%s""APEI generic hardware error status\n", pfx);
> + printk("%s""Generic Hardware Error Status\n", pfx);
> severity = estatus->error_severity;
> printk("%s""severity: %d, %s\n", pfx, severity,
> cper_severity_str(severity));
> data_len = estatus->data_length;
> - gdata = (struct acpi_hest_generic_data *)(estatus + 1);
> + gdata = (struct acpi_generic_data *)(estatus + 1);
> while (data_len >= sizeof(*gdata)) {
> gedata_len = gdata->error_data_length;
> - apei_estatus_print_section(pfx, gdata, sec_no);
> + cper_estatus_print_section(pfx, gdata, sec_no);
> data_len -= gedata_len + sizeof(*gdata);
> gdata = (void *)(gdata + 1) + gedata_len;
> sec_no++;
> }
> }
> -EXPORT_SYMBOL_GPL(apei_estatus_print);
> +EXPORT_SYMBOL_GPL(cper_estatus_print);
>
> -int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus)
> +int cper_estatus_check_header(const struct acpi_generic_status *estatus)
> {
> if (estatus->data_length &&
> - estatus->data_length < sizeof(struct acpi_hest_generic_data))
> + estatus->data_length < sizeof(struct acpi_generic_data))
> return -EINVAL;
> if (estatus->raw_data_length &&
> estatus->raw_data_offset < sizeof(*estatus) + estatus->data_length)
> @@ -374,19 +374,19 @@ int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus)
>
> return 0;
> }
> -EXPORT_SYMBOL_GPL(apei_estatus_check_header);
> +EXPORT_SYMBOL_GPL(cper_estatus_check_header);
>
> -int apei_estatus_check(const struct acpi_hest_generic_status *estatus)
> +int cper_estatus_check(const struct acpi_generic_status *estatus)
> {
> - struct acpi_hest_generic_data *gdata;
> + struct acpi_generic_data *gdata;
> unsigned int data_len, gedata_len;
> int rc;
>
> - rc = apei_estatus_check_header(estatus);
> + rc = cper_estatus_check_header(estatus);
> if (rc)
> return rc;
> data_len = estatus->data_length;
> - gdata = (struct acpi_hest_generic_data *)(estatus + 1);
> + gdata = (struct acpi_generic_data *)(estatus + 1);
> while (data_len >= sizeof(*gdata)) {
> gedata_len = gdata->error_data_length;
> if (gedata_len > data_len - sizeof(*gdata))
> @@ -399,4 +399,4 @@ int apei_estatus_check(const struct acpi_hest_generic_status *estatus)
>
> return 0;
> }
> -EXPORT_SYMBOL_GPL(apei_estatus_check);
> +EXPORT_SYMBOL_GPL(cper_estatus_check);
> diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
> index 8ec37bb..0db6e4f 100644
> --- a/drivers/acpi/apei/ghes.c
> +++ b/drivers/acpi/apei/ghes.c
> @@ -75,13 +75,13 @@
> #define GHES_ESTATUS_CACHE_LEN(estatus_len) \
> (sizeof(struct ghes_estatus_cache) + (estatus_len))
> #define GHES_ESTATUS_FROM_CACHE(estatus_cache) \
> - ((struct acpi_hest_generic_status *) \
> + ((struct acpi_generic_status *) \
> ((struct ghes_estatus_cache *)(estatus_cache) + 1))
>
> #define GHES_ESTATUS_NODE_LEN(estatus_len) \
> (sizeof(struct ghes_estatus_node) + (estatus_len))
> -#define GHES_ESTATUS_FROM_NODE(estatus_node) \
> - ((struct acpi_hest_generic_status *) \
> +#define GHES_ESTATUS_FROM_NODE(estatus_node) \
> + ((struct acpi_generic_status *) \
> ((struct ghes_estatus_node *)(estatus_node) + 1))
>
> bool ghes_disable;
> @@ -378,17 +378,17 @@ static int ghes_read_estatus(struct ghes *ghes, int silent)
> ghes->flags |= GHES_TO_CLEAR;
>
> rc = -EIO;
> - len = apei_estatus_len(ghes->estatus);
> + len = cper_estatus_len(ghes->estatus);
> if (len < sizeof(*ghes->estatus))
> goto err_read_block;
> if (len > ghes->generic->error_block_length)
> goto err_read_block;
> - if (apei_estatus_check_header(ghes->estatus))
> + if (cper_estatus_check_header(ghes->estatus))
> goto err_read_block;
> ghes_copy_tofrom_phys(ghes->estatus + 1,
> buf_paddr + sizeof(*ghes->estatus),
> len - sizeof(*ghes->estatus), 1);
> - if (apei_estatus_check(ghes->estatus))
> + if (cper_estatus_check(ghes->estatus))
> goto err_read_block;
> rc = 0;
>
> @@ -409,7 +409,7 @@ static void ghes_clear_estatus(struct ghes *ghes)
> ghes->flags &= ~GHES_TO_CLEAR;
> }
>
> -static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int sev)
> +static void ghes_handle_memory_failure(struct acpi_generic_data *gdata, int sev)
> {
> #ifdef CONFIG_ACPI_APEI_MEMORY_FAILURE
> unsigned long pfn;
> @@ -438,10 +438,10 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int
> }
>
> static void ghes_do_proc(struct ghes *ghes,
> - const struct acpi_hest_generic_status *estatus)
> + const struct acpi_generic_status *estatus)
> {
> int sev, sec_sev;
> - struct acpi_hest_generic_data *gdata;
> + struct acpi_generic_data *gdata;
>
> sev = ghes_severity(estatus->error_severity);
> apei_estatus_for_each_section(estatus, gdata) {
> @@ -496,7 +496,7 @@ static void ghes_do_proc(struct ghes *ghes,
>
> static void __ghes_print_estatus(const char *pfx,
> const struct acpi_hest_generic *generic,
> - const struct acpi_hest_generic_status *estatus)
> + const struct acpi_generic_status *estatus)
> {
> static atomic_t seqno;
> unsigned int curr_seqno;
> @@ -513,12 +513,12 @@ static void __ghes_print_estatus(const char *pfx,
> snprintf(pfx_seq, sizeof(pfx_seq), "%s{%u}" HW_ERR, pfx, curr_seqno);
> printk("%s""Hardware error from APEI Generic Hardware Error Source: %d\n",
> pfx_seq, generic->header.source_id);
> - apei_estatus_print(pfx_seq, estatus);
> + cper_estatus_print(pfx_seq, estatus);
> }
>
> static int ghes_print_estatus(const char *pfx,
> const struct acpi_hest_generic *generic,
> - const struct acpi_hest_generic_status *estatus)
> + const struct acpi_generic_status *estatus)
> {
> /* Not more than 2 messages every 5 seconds */
> static DEFINE_RATELIMIT_STATE(ratelimit_corrected, 5*HZ, 2);
> @@ -540,15 +540,15 @@ static int ghes_print_estatus(const char *pfx,
> * GHES error status reporting throttle, to report more kinds of
> * errors, instead of just most frequently occurred errors.
> */
> -static int ghes_estatus_cached(struct acpi_hest_generic_status *estatus)
> +static int ghes_estatus_cached(struct acpi_generic_status *estatus)
> {
> u32 len;
> int i, cached = 0;
> unsigned long long now;
> struct ghes_estatus_cache *cache;
> - struct acpi_hest_generic_status *cache_estatus;
> + struct acpi_generic_status *cache_estatus;
>
> - len = apei_estatus_len(estatus);
> + len = cper_estatus_len(estatus);
> rcu_read_lock();
> for (i = 0; i < GHES_ESTATUS_CACHES_SIZE; i++) {
> cache = rcu_dereference(ghes_estatus_caches[i]);
> @@ -571,19 +571,19 @@ static int ghes_estatus_cached(struct acpi_hest_generic_status *estatus)
>
> static struct ghes_estatus_cache *ghes_estatus_cache_alloc(
> struct acpi_hest_generic *generic,
> - struct acpi_hest_generic_status *estatus)
> + struct acpi_generic_status *estatus)
> {
> int alloced;
> u32 len, cache_len;
> struct ghes_estatus_cache *cache;
> - struct acpi_hest_generic_status *cache_estatus;
> + struct acpi_generic_status *cache_estatus;
>
> alloced = atomic_add_return(1, &ghes_estatus_cache_alloced);
> if (alloced > GHES_ESTATUS_CACHE_ALLOCED_MAX) {
> atomic_dec(&ghes_estatus_cache_alloced);
> return NULL;
> }
> - len = apei_estatus_len(estatus);
> + len = cper_estatus_len(estatus);
> cache_len = GHES_ESTATUS_CACHE_LEN(len);
> cache = (void *)gen_pool_alloc(ghes_estatus_pool, cache_len);
> if (!cache) {
> @@ -603,7 +603,7 @@ static void ghes_estatus_cache_free(struct ghes_estatus_cache *cache)
> {
> u32 len;
>
> - len = apei_estatus_len(GHES_ESTATUS_FROM_CACHE(cache));
> + len = cper_estatus_len(GHES_ESTATUS_FROM_CACHE(cache));
> len = GHES_ESTATUS_CACHE_LEN(len);
> gen_pool_free(ghes_estatus_pool, (unsigned long)cache, len);
> atomic_dec(&ghes_estatus_cache_alloced);
> @@ -619,7 +619,7 @@ static void ghes_estatus_cache_rcu_free(struct rcu_head *head)
>
> static void ghes_estatus_cache_add(
> struct acpi_hest_generic *generic,
> - struct acpi_hest_generic_status *estatus)
> + struct acpi_generic_status *estatus)
> {
> int i, slot = -1, count;
> unsigned long long now, duration, period, max_period = 0;
> @@ -751,7 +751,7 @@ static void ghes_proc_in_irq(struct irq_work *irq_work)
> struct llist_node *llnode, *next;
> struct ghes_estatus_node *estatus_node;
> struct acpi_hest_generic *generic;
> - struct acpi_hest_generic_status *estatus;
> + struct acpi_generic_status *estatus;
> u32 len, node_len;
>
> llnode = llist_del_all(&ghes_estatus_llist);
> @@ -765,7 +765,7 @@ static void ghes_proc_in_irq(struct irq_work *irq_work)
> estatus_node = llist_entry(llnode, struct ghes_estatus_node,
> llnode);
> estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
> - len = apei_estatus_len(estatus);
> + len = cper_estatus_len(estatus);
> node_len = GHES_ESTATUS_NODE_LEN(len);
> ghes_do_proc(estatus_node->ghes, estatus);
> if (!ghes_estatus_cached(estatus)) {
> @@ -784,7 +784,7 @@ static void ghes_print_queued_estatus(void)
> struct llist_node *llnode;
> struct ghes_estatus_node *estatus_node;
> struct acpi_hest_generic *generic;
> - struct acpi_hest_generic_status *estatus;
> + struct acpi_generic_status *estatus;
> u32 len, node_len;
>
> llnode = llist_del_all(&ghes_estatus_llist);
> @@ -797,7 +797,7 @@ static void ghes_print_queued_estatus(void)
> estatus_node = llist_entry(llnode, struct ghes_estatus_node,
> llnode);
> estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
> - len = apei_estatus_len(estatus);
> + len = cper_estatus_len(estatus);
> node_len = GHES_ESTATUS_NODE_LEN(len);
> generic = estatus_node->generic;
> ghes_print_estatus(NULL, generic, estatus);
> @@ -843,7 +843,7 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
> #ifdef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
> u32 len, node_len;
> struct ghes_estatus_node *estatus_node;
> - struct acpi_hest_generic_status *estatus;
> + struct acpi_generic_status *estatus;
> #endif
> if (!(ghes->flags & GHES_TO_CLEAR))
> continue;
> @@ -851,7 +851,7 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
> if (ghes_estatus_cached(ghes->estatus))
> goto next;
> /* Save estatus for further processing in IRQ context */
> - len = apei_estatus_len(ghes->estatus);
> + len = cper_estatus_len(ghes->estatus);
> node_len = GHES_ESTATUS_NODE_LEN(len);
> estatus_node = (void *)gen_pool_alloc(ghes_estatus_pool,
> node_len);
> @@ -923,7 +923,7 @@ static int ghes_probe(struct platform_device *ghes_dev)
>
> rc = -EIO;
> if (generic->error_block_length <
> - sizeof(struct acpi_hest_generic_status)) {
> + sizeof(struct acpi_generic_status)) {
> pr_warning(FW_BUG GHES_PFX "Invalid error block length: %u for generic hardware error source: %d\n",
> generic->error_block_length,
> generic->header.source_id);
> diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h
> index 0bd750e..556c83ee 100644
> --- a/include/acpi/actbl1.h
> +++ b/include/acpi/actbl1.h
> @@ -596,7 +596,7 @@ struct acpi_hest_generic {
>
> /* Generic Error Status block */
>
> -struct acpi_hest_generic_status {
> +struct acpi_generic_status {
> u32 block_status;
> u32 raw_data_offset;
> u32 raw_data_length;
> @@ -606,15 +606,15 @@ struct acpi_hest_generic_status {
>
> /* Values for block_status flags above */
>
> -#define ACPI_HEST_UNCORRECTABLE (1)
> -#define ACPI_HEST_CORRECTABLE (1<<1)
> -#define ACPI_HEST_MULTIPLE_UNCORRECTABLE (1<<2)
> -#define ACPI_HEST_MULTIPLE_CORRECTABLE (1<<3)
> -#define ACPI_HEST_ERROR_ENTRY_COUNT (0xFF<<4) /* 8 bits, error count */
> +#define ACPI_GEN_ERR_UC BIT(0)
> +#define ACPI_GEN_ERR_CE BIT(1)
> +#define ACPI_GEN_ERR_MULTI_UC BIT(2)
> +#define ACPI_GEN_ERR_MULTI_CE BIT(3)
> +#define ACPI_GEN_ERR_COUNT_SHIFT (0xFF<<4) /* 8 bits, error count */
>
> /* Generic Error Data entry */
>
> -struct acpi_hest_generic_data {
> +struct acpi_generic_data {
> u8 section_type[16];
> u32 error_severity;
> u16 revision;
> diff --git a/include/acpi/ghes.h b/include/acpi/ghes.h
> index 720446c..dfd60d0 100644
> --- a/include/acpi/ghes.h
> +++ b/include/acpi/ghes.h
> @@ -14,7 +14,7 @@
>
> struct ghes {
> struct acpi_hest_generic *generic;
> - struct acpi_hest_generic_status *estatus;
> + struct acpi_generic_status *estatus;
> u64 buffer_paddr;
> unsigned long flags;
> union {
> diff --git a/include/linux/cper.h b/include/linux/cper.h
> index c230494..09ebe21 100644
> --- a/include/linux/cper.h
> +++ b/include/linux/cper.h
> @@ -389,6 +389,6 @@ struct cper_sec_pcie {
>
> u64 cper_next_record_id(void);
> void cper_print_bits(const char *prefix, unsigned int bits,
> - const char *strs[], unsigned int strs_size);
> + const char * const strs[], unsigned int strs_size);
>
> #endif

--

Cheers,
Mauro