Merge branches 'acpi-apei', 'acpi-prm' and 'acpi-docs'
Merge APEI, PRM and documentation udpates for 5.16-rc1: - Mark apei_hest_parse() static (Christoph Hellwig). - Relax platform response timeout to 1 second after instructing it to inject an error (Shuai Xue). - Make the PRM code handle memory allocation and remapping failures more gracefully and drop some unnecessary blank lines from that code (Aubrey Li). - Fix spelling mistake in the ACPI documentation (Colin Ian King). * acpi-apei: ACPI: APEI: mark apei_hest_parse() static ACPI: APEI: EINJ: Relax platform response timeout to 1 second * acpi-prm: ACPI: PRM: Handle memory allocation and memory remap failure ACPI: PRM: Remove unnecessary blank lines * acpi-docs: Documentation: ACPI: Fix spelling mistake "Millenium" -> "Millennium"
This commit is contained in:
Коммит
90e17edac4
|
@ -74,7 +74,7 @@ The ACPI BIOS flow would include an evaluation of _OS, and the AML
|
||||||
interpreter in the kernel would return to it a string identifying the OS:
|
interpreter in the kernel would return to it a string identifying the OS:
|
||||||
|
|
||||||
Windows 98, SE: "Microsoft Windows"
|
Windows 98, SE: "Microsoft Windows"
|
||||||
Windows ME: "Microsoft WindowsME:Millenium Edition"
|
Windows ME: "Microsoft WindowsME:Millennium Edition"
|
||||||
Windows NT: "Microsoft Windows NT"
|
Windows NT: "Microsoft Windows NT"
|
||||||
|
|
||||||
The idea was on a platform tasked with running multiple OS's,
|
The idea was on a platform tasked with running multiple OS's,
|
||||||
|
|
|
@ -28,9 +28,10 @@
|
||||||
#undef pr_fmt
|
#undef pr_fmt
|
||||||
#define pr_fmt(fmt) "EINJ: " fmt
|
#define pr_fmt(fmt) "EINJ: " fmt
|
||||||
|
|
||||||
#define SPIN_UNIT 100 /* 100ns */
|
#define SLEEP_UNIT_MIN 1000 /* 1ms */
|
||||||
/* Firmware should respond within 1 milliseconds */
|
#define SLEEP_UNIT_MAX 5000 /* 5ms */
|
||||||
#define FIRMWARE_TIMEOUT (1 * NSEC_PER_MSEC)
|
/* Firmware should respond within 1 seconds */
|
||||||
|
#define FIRMWARE_TIMEOUT (1 * USEC_PER_SEC)
|
||||||
#define ACPI5_VENDOR_BIT BIT(31)
|
#define ACPI5_VENDOR_BIT BIT(31)
|
||||||
#define MEM_ERROR_MASK (ACPI_EINJ_MEMORY_CORRECTABLE | \
|
#define MEM_ERROR_MASK (ACPI_EINJ_MEMORY_CORRECTABLE | \
|
||||||
ACPI_EINJ_MEMORY_UNCORRECTABLE | \
|
ACPI_EINJ_MEMORY_UNCORRECTABLE | \
|
||||||
|
@ -171,13 +172,13 @@ static int einj_get_available_error_type(u32 *type)
|
||||||
|
|
||||||
static int einj_timedout(u64 *t)
|
static int einj_timedout(u64 *t)
|
||||||
{
|
{
|
||||||
if ((s64)*t < SPIN_UNIT) {
|
if ((s64)*t < SLEEP_UNIT_MIN) {
|
||||||
pr_warn(FW_WARN "Firmware does not respond in time\n");
|
pr_warn(FW_WARN "Firmware does not respond in time\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
*t -= SPIN_UNIT;
|
*t -= SLEEP_UNIT_MIN;
|
||||||
ndelay(SPIN_UNIT);
|
usleep_range(SLEEP_UNIT_MIN, SLEEP_UNIT_MAX);
|
||||||
touch_nmi_watchdog();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,9 @@ static int hest_esrc_len(struct acpi_hest_header *hest_hdr)
|
||||||
return len;
|
return len;
|
||||||
};
|
};
|
||||||
|
|
||||||
int apei_hest_parse(apei_hest_func_t func, void *data)
|
typedef int (*apei_hest_func_t)(struct acpi_hest_header *hest_hdr, void *data);
|
||||||
|
|
||||||
|
static int apei_hest_parse(apei_hest_func_t func, void *data)
|
||||||
{
|
{
|
||||||
struct acpi_hest_header *hest_hdr;
|
struct acpi_hest_header *hest_hdr;
|
||||||
int i, rc, len;
|
int i, rc, len;
|
||||||
|
@ -121,7 +123,6 @@ int apei_hest_parse(apei_hest_func_t func, void *data)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(apei_hest_parse);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if firmware advertises firmware first mode. We need FF bit to be set
|
* Check if firmware advertises firmware first mode. We need FF bit to be set
|
||||||
|
|
|
@ -49,7 +49,6 @@ struct prm_context_buffer {
|
||||||
};
|
};
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
static LIST_HEAD(prm_module_list);
|
static LIST_HEAD(prm_module_list);
|
||||||
|
|
||||||
struct prm_handler_info {
|
struct prm_handler_info {
|
||||||
|
@ -73,7 +72,6 @@ struct prm_module_info {
|
||||||
struct prm_handler_info handlers[];
|
struct prm_handler_info handlers[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static u64 efi_pa_va_lookup(u64 pa)
|
static u64 efi_pa_va_lookup(u64 pa)
|
||||||
{
|
{
|
||||||
efi_memory_desc_t *md;
|
efi_memory_desc_t *md;
|
||||||
|
@ -88,7 +86,6 @@ static u64 efi_pa_va_lookup(u64 pa)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define get_first_handler(a) ((struct acpi_prmt_handler_info *) ((char *) (a) + a->handler_info_offset))
|
#define get_first_handler(a) ((struct acpi_prmt_handler_info *) ((char *) (a) + a->handler_info_offset))
|
||||||
#define get_next_handler(a) ((struct acpi_prmt_handler_info *) (sizeof(struct acpi_prmt_handler_info) + (char *) a))
|
#define get_next_handler(a) ((struct acpi_prmt_handler_info *) (sizeof(struct acpi_prmt_handler_info) + (char *) a))
|
||||||
|
|
||||||
|
@ -99,7 +96,7 @@ acpi_parse_prmt(union acpi_subtable_headers *header, const unsigned long end)
|
||||||
struct acpi_prmt_handler_info *handler_info;
|
struct acpi_prmt_handler_info *handler_info;
|
||||||
struct prm_handler_info *th;
|
struct prm_handler_info *th;
|
||||||
struct prm_module_info *tm;
|
struct prm_module_info *tm;
|
||||||
u64 mmio_count = 0;
|
u64 *mmio_count;
|
||||||
u64 cur_handler = 0;
|
u64 cur_handler = 0;
|
||||||
u32 module_info_size = 0;
|
u32 module_info_size = 0;
|
||||||
u64 mmio_range_size = 0;
|
u64 mmio_range_size = 0;
|
||||||
|
@ -108,6 +105,8 @@ acpi_parse_prmt(union acpi_subtable_headers *header, const unsigned long end)
|
||||||
module_info = (struct acpi_prmt_module_info *) header;
|
module_info = (struct acpi_prmt_module_info *) header;
|
||||||
module_info_size = struct_size(tm, handlers, module_info->handler_info_count);
|
module_info_size = struct_size(tm, handlers, module_info->handler_info_count);
|
||||||
tm = kmalloc(module_info_size, GFP_KERNEL);
|
tm = kmalloc(module_info_size, GFP_KERNEL);
|
||||||
|
if (!tm)
|
||||||
|
goto parse_prmt_out1;
|
||||||
|
|
||||||
guid_copy(&tm->guid, (guid_t *) module_info->module_guid);
|
guid_copy(&tm->guid, (guid_t *) module_info->module_guid);
|
||||||
tm->major_rev = module_info->major_rev;
|
tm->major_rev = module_info->major_rev;
|
||||||
|
@ -120,14 +119,24 @@ acpi_parse_prmt(union acpi_subtable_headers *header, const unsigned long end)
|
||||||
* Each module is associated with a list of addr
|
* Each module is associated with a list of addr
|
||||||
* ranges that it can use during the service
|
* ranges that it can use during the service
|
||||||
*/
|
*/
|
||||||
mmio_count = *(u64 *) memremap(module_info->mmio_list_pointer, 8, MEMREMAP_WB);
|
mmio_count = (u64 *) memremap(module_info->mmio_list_pointer, 8, MEMREMAP_WB);
|
||||||
mmio_range_size = struct_size(tm->mmio_info, addr_ranges, mmio_count);
|
if (!mmio_count)
|
||||||
|
goto parse_prmt_out2;
|
||||||
|
|
||||||
|
mmio_range_size = struct_size(tm->mmio_info, addr_ranges, *mmio_count);
|
||||||
tm->mmio_info = kmalloc(mmio_range_size, GFP_KERNEL);
|
tm->mmio_info = kmalloc(mmio_range_size, GFP_KERNEL);
|
||||||
|
if (!tm->mmio_info)
|
||||||
|
goto parse_prmt_out3;
|
||||||
|
|
||||||
temp_mmio = memremap(module_info->mmio_list_pointer, mmio_range_size, MEMREMAP_WB);
|
temp_mmio = memremap(module_info->mmio_list_pointer, mmio_range_size, MEMREMAP_WB);
|
||||||
|
if (!temp_mmio)
|
||||||
|
goto parse_prmt_out4;
|
||||||
memmove(tm->mmio_info, temp_mmio, mmio_range_size);
|
memmove(tm->mmio_info, temp_mmio, mmio_range_size);
|
||||||
} else {
|
} else {
|
||||||
mmio_range_size = struct_size(tm->mmio_info, addr_ranges, mmio_count);
|
tm->mmio_info = kmalloc(sizeof(*tm->mmio_info), GFP_KERNEL);
|
||||||
tm->mmio_info = kmalloc(mmio_range_size, GFP_KERNEL);
|
if (!tm->mmio_info)
|
||||||
|
goto parse_prmt_out2;
|
||||||
|
|
||||||
tm->mmio_info->mmio_count = 0;
|
tm->mmio_info->mmio_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,6 +154,15 @@ acpi_parse_prmt(union acpi_subtable_headers *header, const unsigned long end)
|
||||||
} while (++cur_handler < tm->handler_count && (handler_info = get_next_handler(handler_info)));
|
} while (++cur_handler < tm->handler_count && (handler_info = get_next_handler(handler_info)));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
parse_prmt_out4:
|
||||||
|
kfree(tm->mmio_info);
|
||||||
|
parse_prmt_out3:
|
||||||
|
memunmap(mmio_count);
|
||||||
|
parse_prmt_out2:
|
||||||
|
kfree(tm);
|
||||||
|
parse_prmt_out1:
|
||||||
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GET_MODULE 0
|
#define GET_MODULE 0
|
||||||
|
@ -171,7 +189,6 @@ static void *find_guid_info(const guid_t *guid, u8 mode)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct prm_module_info *find_prm_module(const guid_t *guid)
|
static struct prm_module_info *find_prm_module(const guid_t *guid)
|
||||||
{
|
{
|
||||||
return (struct prm_module_info *)find_guid_info(guid, GET_MODULE);
|
return (struct prm_module_info *)find_guid_info(guid, GET_MODULE);
|
||||||
|
|
|
@ -37,9 +37,6 @@ void __init acpi_hest_init(void);
|
||||||
static inline void acpi_hest_init(void) { return; }
|
static inline void acpi_hest_init(void) { return; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef int (*apei_hest_func_t)(struct acpi_hest_header *hest_hdr, void *data);
|
|
||||||
int apei_hest_parse(apei_hest_func_t func, void *data);
|
|
||||||
|
|
||||||
int erst_write(const struct cper_record_header *record);
|
int erst_write(const struct cper_record_header *record);
|
||||||
ssize_t erst_get_record_count(void);
|
ssize_t erst_get_record_count(void);
|
||||||
int erst_get_record_id_begin(int *pos);
|
int erst_get_record_id_begin(int *pos);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче