From 902ecda3bb1c95671459ec632c25c56aff19ef63 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Oct 30 2018 12:41:32 +0000 Subject: import opal-prd-6.0.4-2.el7 --- diff --git a/.gitignore b/.gitignore index 89b96a2..4866561 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/skiboot-5.9.tar.gz +SOURCES/skiboot-6.0.4.tar.gz diff --git a/.opal-prd.metadata b/.opal-prd.metadata index 5971af7..10edb0a 100644 --- a/.opal-prd.metadata +++ b/.opal-prd.metadata @@ -1 +1 @@ -95f453b3229a1ac4ce193163e418907990c0986e SOURCES/skiboot-5.9.tar.gz +ab15b0b448b26550e4d822256da58648277cf582 SOURCES/skiboot-6.0.4.tar.gz diff --git a/SOURCES/opal-prd-49999302251b3e3e2fdca2cbcdeb6aab9add7412.patch b/SOURCES/opal-prd-49999302251b3e3e2fdca2cbcdeb6aab9add7412.patch deleted file mode 100644 index a85c4c4..0000000 --- a/SOURCES/opal-prd-49999302251b3e3e2fdca2cbcdeb6aab9add7412.patch +++ /dev/null @@ -1,478 +0,0 @@ -diff -up skiboot-5.9/core/hostservices.c.me skiboot-5.9/core/hostservices.c ---- skiboot-5.9/core/hostservices.c.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/core/hostservices.c 2018-01-22 11:42:23.462547265 +0100 -@@ -697,34 +697,49 @@ static int hservice_clr_special_wakeup(s - return 0; - } - --static int hservice_wakeup(uint32_t i_core, uint32_t i_mode) -+int hservice_wakeup(uint32_t i_core, uint32_t i_mode) - { -+ int (*set_wakeup)(struct cpu_thread *cpu); -+ int (*clear_wakeup)(struct cpu_thread *cpu); - struct cpu_thread *cpu; - int rc = OPAL_SUCCESS; - -- /* -- * Mask out the top nibble of i_core since it may contain -- * 0x4 (which we use for XSCOM targeting) -- */ -- i_core &= 0x0fffffff; -+ switch (proc_gen) { -+ case proc_gen_p8: -+ /* -+ * Mask out the top nibble of i_core since it may contain -+ * 0x4 (which we use for XSCOM targeting) -+ */ -+ i_core &= 0x0fffffff; -+ i_core <<= 3; -+ set_wakeup = hservice_set_special_wakeup; -+ clear_wakeup = hservice_clr_special_wakeup; -+ break; -+ case proc_gen_p9: -+ i_core &= SPR_PIR_P9_MASK; -+ i_core <<= 2; -+ set_wakeup = dctl_set_special_wakeup; -+ clear_wakeup = dctl_clear_special_wakeup; -+ break; -+ default: -+ return OPAL_UNSUPPORTED; -+ } - - /* What do we need to do ? */ - switch(i_mode) { - case 0: /* Assert special wakeup */ -- /* XXX Assume P8 */ -- cpu = find_cpu_by_pir(i_core << 3); -+ cpu = find_cpu_by_pir(i_core); - if (!cpu) - return OPAL_PARAMETER; - prlog(PR_DEBUG, "HBRT: Special wakeup assert for core 0x%x," - " count=%d\n", i_core, cpu->hbrt_spec_wakeup); - if (cpu->hbrt_spec_wakeup == 0) -- rc = hservice_set_special_wakeup(cpu); -+ rc = set_wakeup(cpu); - if (rc == 0) - cpu->hbrt_spec_wakeup++; - return rc; - case 1: /* Deassert special wakeup */ -- /* XXX Assume P8 */ -- cpu = find_cpu_by_pir(i_core << 3); -+ cpu = find_cpu_by_pir(i_core); - if (!cpu) - return OPAL_PARAMETER; - prlog(PR_DEBUG, "HBRT: Special wakeup release for core" -@@ -738,7 +753,7 @@ static int hservice_wakeup(uint32_t i_co - /* What to do with count on errors ? */ - cpu->hbrt_spec_wakeup--; - if (cpu->hbrt_spec_wakeup == 0) -- rc = hservice_clr_special_wakeup(cpu); -+ rc = clear_wakeup(cpu); - return rc; - case 2: /* Clear all special wakeups */ - prlog(PR_DEBUG, "HBRT: Special wakeup release for all cores\n"); -@@ -746,7 +761,7 @@ static int hservice_wakeup(uint32_t i_co - if (cpu->hbrt_spec_wakeup) { - cpu->hbrt_spec_wakeup = 0; - /* What to do on errors ? */ -- hservice_clr_special_wakeup(cpu); -+ clear_wakeup(cpu); - } - } - return OPAL_SUCCESS; -diff -up skiboot-5.9/external/opal-prd/opal-prd.c.me skiboot-5.9/external/opal-prd/opal-prd.c ---- skiboot-5.9/external/opal-prd/opal-prd.c.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/external/opal-prd/opal-prd.c 2018-01-22 11:42:23.463547227 +0100 -@@ -163,6 +163,9 @@ struct func_desc { - void *toc; - } hbrt_entry; - -+static int nr_chips; -+static u64 chips[256]; -+ - static int read_prd_msg(struct opal_prd_ctx *ctx); - - static struct prd_range *find_range(const char *name, uint32_t instance) -@@ -521,6 +524,24 @@ int hservice_i2c_write(uint64_t i_master - i_offset, i_length, i_data); - } - -+int hservice_wakeup(u32 core, u32 mode) -+{ -+ struct opal_prd_msg msg; -+ -+ msg.hdr.type = OPAL_PRD_MSG_TYPE_CORE_SPECIAL_WAKEUP; -+ msg.hdr.size = htobe16(sizeof(msg)); -+ msg.spl_wakeup.core = htobe32(core); -+ msg.spl_wakeup.mode = htobe32(mode); -+ -+ if (write(ctx->fd, &msg, sizeof(msg)) != sizeof(msg)) { -+ pr_log(LOG_ERR, "FW: Failed to send CORE_SPECIAL_WAKEUP msg %x : %m\n", -+ core); -+ return -1; -+ } -+ -+ return 0; -+} -+ - static void ipmi_init(struct opal_prd_ctx *ctx) - { - insert_module("ipmi_devintf"); -@@ -1170,6 +1191,52 @@ static void print_ranges(struct opal_prd - } - } - -+static int chip_init(void) -+{ -+ struct dirent *dirent; -+ char *path; -+ DIR *dir; -+ __be32 *chipid; -+ void *buf; -+ int rc, len, i; -+ -+ dir = opendir(devicetree_base); -+ if (!dir) { -+ pr_log(LOG_ERR, "FW: Can't open %s", devicetree_base); -+ return -1; -+ } -+ -+ for (;;) { -+ dirent = readdir(dir); -+ if (!dirent) -+ break; -+ -+ if (strncmp("xscom", dirent->d_name, 5)) -+ continue; -+ -+ rc = asprintf(&path, "%s/%s/ibm,chip-id", devicetree_base, -+ dirent->d_name); -+ if (rc < 0) { -+ pr_log(LOG_ERR, "FW: Failed to create chip-id path"); -+ return -1; -+ } -+ -+ rc = open_and_read(path, &buf, &len); -+ if (rc) { -+ pr_log(LOG_ERR, "FW; Failed to read chipid"); -+ return -1; -+ } -+ chipid = buf; -+ chips[nr_chips++] = be32toh(*chipid); -+ } -+ -+ pr_log(LOG_DEBUG, "FW: Chip init"); -+ for (i = 0; i < nr_chips; i++) -+ pr_log(LOG_DEBUG, "FW: Chip 0x%lx", chips[i]); -+ -+ return 0; -+} -+ - static int prd_init_ranges(struct opal_prd_ctx *ctx) - { - struct dirent *dirent; -@@ -1290,6 +1357,10 @@ static int prd_init(struct opal_prd_ctx - return -1; - } - -+ rc = chip_init(); -+ if (rc) -+ pr_log(LOG_ERR, "FW: Failed to initialize chip IDs"); -+ - return 0; - } - -@@ -1433,6 +1504,41 @@ static int handle_msg_sbe_passthrough(st - return rc; - } - -+static int handle_msg_fsp_occ_reset(struct opal_prd_msg *msg) -+{ -+ struct opal_prd_msg omsg; -+ int rc = -1, i; -+ -+ pr_debug("FW: FSP requested OCC reset"); -+ -+ if (!hservice_runtime->reset_pm_complex) { -+ pr_log_nocall("reset_pm_complex"); -+ return rc; -+ } -+ -+ for (i = 0; i < nr_chips; i++) { -+ pr_debug("PM: calling pm_complex_reset(0x%lx)", chips[i]); -+ rc = call_reset_pm_complex(chips[i]); -+ if (rc) { -+ pr_log(LOG_ERR, "PM: Failed pm_complex_reset(0x%lx) %m", -+ chips[i]); -+ break; -+ } -+ } -+ -+ omsg.hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_RESET_STATUS; -+ omsg.hdr.size = htobe16(sizeof(omsg)); -+ omsg.fsp_occ_reset_status.chip = msg->occ_reset.chip; -+ omsg.fsp_occ_reset_status.status = htobe64(rc); -+ -+ if (write(ctx->fd, &omsg, sizeof(omsg)) != sizeof(omsg)) { -+ pr_log(LOG_ERR, "FW: Failed to send FSP_OCC_RESET_STATUS msg: %m"); -+ return -1; -+ } -+ -+ return rc; -+} -+ - static int handle_prd_msg(struct opal_prd_ctx *ctx, struct opal_prd_msg *msg) - { - int rc = -1; -@@ -1453,6 +1559,9 @@ static int handle_prd_msg(struct opal_pr - case OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH: - rc = handle_msg_sbe_passthrough(ctx, msg); - break; -+ case OPAL_PRD_MSG_TYPE_FSP_OCC_RESET: -+ rc = handle_msg_fsp_occ_reset(msg); -+ break; - default: - pr_log(LOG_WARNING, "Invalid incoming message type 0x%x", - msg->hdr.type); -@@ -1985,6 +2094,9 @@ static int run_prd_daemon(struct opal_pr - hinterface.pnor_write = NULL; - } - -+ if (!is_fsp_system()) -+ hinterface.wakeup = NULL; -+ - ipmi_init(ctx); - - pr_debug("HBRT: calling hservices_init"); -diff -up skiboot-5.9/external/opal-prd/thunk.S.me skiboot-5.9/external/opal-prd/thunk.S ---- skiboot-5.9/external/opal-prd/thunk.S.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/external/opal-prd/thunk.S 2018-01-22 11:42:23.463547227 +0100 -@@ -183,7 +183,7 @@ hinterface: - DISABLED_THUNK(hservice_lid_load) - DISABLED_THUNK(hservice_lid_unload) - CALLBACK_THUNK(hservice_get_reserved_mem) -- DISABLED_THUNK(hservice_wakeup) -+ CALLBACK_THUNK(hservice_wakeup) - CALLBACK_THUNK(hservice_nanosleep) - DISABLED_THUNK(hservice_report_occ_failure) - CALLBACK_THUNK(hservice_clock_gettime) -diff -up skiboot-5.9/hw/occ.c.me skiboot-5.9/hw/occ.c ---- skiboot-5.9/hw/occ.c.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/hw/occ.c 2018-01-22 11:42:23.463547227 +0100 -@@ -1837,6 +1837,44 @@ out: - return rc; - } - -+static u32 last_seq_id; -+ -+int fsp_occ_reset_status(u64 chipid, s64 status) -+{ -+ struct fsp_msg *stat; -+ int rc = OPAL_NO_MEM; -+ int status_word = 0; -+ -+ prlog(PR_INFO, "HBRT: OCC stop() completed with %lld\n", status); -+ -+ if (status) { -+ struct proc_chip *chip = get_chip(chipid); -+ -+ if (!chip) -+ return OPAL_PARAMETER; -+ -+ status_word = 0xfe00 | (chip->pcid & 0xff); -+ log_simple_error(&e_info(OPAL_RC_OCC_RESET), -+ "OCC: Error %lld in OCC reset of chip %lld\n", -+ status, chipid); -+ } else { -+ occ_msg_queue_occ_reset(); -+ } -+ -+ stat = fsp_mkmsg(FSP_CMD_RESET_OCC_STAT, 2, status_word, last_seq_id); -+ if (!stat) -+ return rc; -+ -+ rc = fsp_queue_msg(stat, fsp_freemsg); -+ if (rc) { -+ fsp_freemsg(stat); -+ log_simple_error(&e_info(OPAL_RC_OCC_RESET), -+ "OCC: Error %d queueing FSP OCC RESET STATUS message\n", -+ rc); -+ } -+ return rc; -+} -+ - static void occ_do_reset(u8 scope, u32 dbob_id, u32 seq_id) - { - struct fsp_msg *rsp, *stat; -@@ -1877,7 +1915,18 @@ static void occ_do_reset(u8 scope, u32 d - * FSP will request OCC to left in stopped state. - */ - -- rc = host_services_occ_stop(); -+ switch (proc_gen) { -+ case proc_gen_p8: -+ rc = host_services_occ_stop(); -+ break; -+ case proc_gen_p9: -+ last_seq_id = seq_id; -+ chip = next_chip(NULL); -+ prd_fsp_occ_reset(chip->id); -+ return; -+ default: -+ return; -+ } - - /* Handle fallback to preload */ - if (rc == -ENOENT && chip->homer_base) { -diff -up skiboot-5.9/hw/prd.c.me skiboot-5.9/hw/prd.c ---- skiboot-5.9/hw/prd.c.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/hw/prd.c 2018-01-22 11:42:23.464547189 +0100 -@@ -29,6 +29,7 @@ enum events { - EVENT_OCC_ERROR = 1 << 1, - EVENT_OCC_RESET = 1 << 2, - EVENT_SBE_PASSTHROUGH = 1 << 3, -+ EVENT_FSP_OCC_RESET = 1 << 4, - }; - - static uint8_t events[MAX_CHIPS]; -@@ -114,6 +115,10 @@ static void prd_msg_consumed(void *data) - proc = msg->sbe_passthrough.chip; - event = EVENT_SBE_PASSTHROUGH; - break; -+ case OPAL_PRD_MSG_TYPE_FSP_OCC_RESET: -+ proc = msg->occ_reset.chip; -+ event = EVENT_FSP_OCC_RESET; -+ break; - default: - prlog(PR_ERR, "PRD: invalid msg consumed, type: 0x%x\n", - msg->hdr.type); -@@ -188,6 +193,9 @@ static void send_next_pending_event(void - } else if (event & EVENT_SBE_PASSTHROUGH) { - prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH; - prd_msg->sbe_passthrough.chip = proc; -+ } else if (event & EVENT_FSP_OCC_RESET) { -+ prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_RESET; -+ prd_msg->occ_reset.chip = proc; - } - - /* -@@ -274,6 +282,11 @@ void prd_occ_reset(uint32_t proc) - prd_event(proc, EVENT_OCC_RESET); - } - -+void prd_fsp_occ_reset(uint32_t proc) -+{ -+ prd_event(proc, EVENT_FSP_OCC_RESET); -+} -+ - void prd_sbe_passthrough(uint32_t proc) - { - prd_event(proc, EVENT_SBE_PASSTHROUGH); -@@ -418,6 +431,14 @@ static int64_t opal_prd_msg(struct opal_ - case OPAL_PRD_MSG_TYPE_FIRMWARE_REQUEST: - rc = prd_msg_handle_firmware_req(msg); - break; -+ case OPAL_PRD_MSG_TYPE_FSP_OCC_RESET_STATUS: -+ rc = fsp_occ_reset_status(msg->fsp_occ_reset_status.chip, -+ msg->fsp_occ_reset_status.status); -+ break; -+ case OPAL_PRD_MSG_TYPE_CORE_SPECIAL_WAKEUP: -+ rc = hservice_wakeup(msg->spl_wakeup.core, -+ msg->spl_wakeup.mode); -+ break; - default: - rc = OPAL_UNSUPPORTED; - } -diff -up skiboot-5.9/include/hostservices.h.me skiboot-5.9/include/hostservices.h ---- skiboot-5.9/include/hostservices.h.me 2018-01-22 11:42:23.464547189 +0100 -+++ skiboot-5.9/include/hostservices.h 2018-01-22 11:42:57.522259222 +0100 -@@ -38,5 +38,7 @@ void host_services_occ_base_setup(void); - - int find_master_and_slave_occ(uint64_t **master, uint64_t **slave, - int *nr_masters, int *nr_slaves); -+int hservice_wakeup(uint32_t i_core, uint32_t i_mode); -+int fsp_occ_reset_status(u64 chipid, s64 status); - - #endif /* __HOSTSERVICES_H */ -diff -up skiboot-5.9/include/opal-api.h.me skiboot-5.9/include/opal-api.h ---- skiboot-5.9/include/opal-api.h.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/include/opal-api.h 2018-01-22 11:42:23.465547151 +0100 -@@ -1054,6 +1054,9 @@ enum opal_prd_msg_type { - OPAL_PRD_MSG_TYPE_FIRMWARE_RESPONSE, /* HBRT <-- OPAL */ - OPAL_PRD_MSG_TYPE_FIRMWARE_NOTIFY, /* HBRT <-- OPAL */ - OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH, /* HBRT <-- OPAL */ -+ OPAL_PRD_MSG_TYPE_FSP_OCC_RESET, /* HBRT <-- OPAL */ -+ OPAL_PRD_MSG_TYPE_FSP_OCC_RESET_STATUS, /* HBRT --> OPAL */ -+ OPAL_PRD_MSG_TYPE_CORE_SPECIAL_WAKEUP, /* HBRT --> OPAL */ - }; - - struct opal_prd_msg_header { -@@ -1101,6 +1104,14 @@ struct opal_prd_msg { - struct { - __be64 chip; - } sbe_passthrough; -+ struct { -+ __be64 chip; -+ __be64 status; /* 0 SUCCESS */ -+ } fsp_occ_reset_status; -+ struct { -+ __be32 core; -+ __be32 mode; -+ } spl_wakeup; - }; - }; - -diff -up skiboot-5.9/include/skiboot.h.me skiboot-5.9/include/skiboot.h ---- skiboot-5.9/include/skiboot.h.me 2017-10-31 05:29:28.000000000 +0100 -+++ skiboot-5.9/include/skiboot.h 2018-01-22 11:42:23.465547151 +0100 -@@ -293,6 +293,7 @@ extern void prd_occ_reset(uint32_t proc) - extern void prd_sbe_passthrough(uint32_t proc); - extern void prd_init(void); - extern void prd_register_reserved_memory(void); -+extern void prd_fsp_occ_reset(uint32_t proc); - - /* Flatten device-tree */ - extern void *create_dtb(const struct dt_node *root, bool exclusive); -diff -up skiboot-5.9/core/direct-controls.c.me skiboot-5.9/core/direct-controls.c ---- skiboot-5.9/core/direct-controls.c.me 2017-10-31 00:29:28.000000000 -0400 -+++ skiboot-5.9/core/direct-controls.c 2018-01-22 07:12:07.642733620 -0500 -@@ -220,7 +220,7 @@ static int p9_sreset_thread(struct cpu_t - return 0; - } - --static int dctl_set_special_wakeup(struct cpu_thread *t) -+int dctl_set_special_wakeup(struct cpu_thread *t) - { - struct cpu_thread *c = t->primary; - int rc = OPAL_SUCCESS; -@@ -238,7 +238,7 @@ static int dctl_set_special_wakeup(struc - return rc; - } - --static int dctl_clear_special_wakeup(struct cpu_thread *t) -+int dctl_clear_special_wakeup(struct cpu_thread *t) - { - struct cpu_thread *c = t->primary; - int rc = OPAL_SUCCESS; -diff -up skiboot-5.9/hw/prd.c.me skiboot-5.9/hw/prd.c ---- skiboot-5.9/hw/prd.c.me 2018-01-22 07:14:59.985852136 -0500 -+++ skiboot-5.9/hw/prd.c 2018-01-22 07:15:11.146054087 -0500 -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - - enum events { - EVENT_ATTN = 1 << 0, -diff -up skiboot-5.9/include/cpu.h.me skiboot-5.9/include/cpu.h ---- skiboot-5.9/include/cpu.h.me 2017-10-31 00:29:28.000000000 -0400 -+++ skiboot-5.9/include/cpu.h 2018-01-22 07:12:07.642733620 -0500 -@@ -284,4 +284,7 @@ extern void cpu_idle_delay(unsigned long - extern void cpu_set_radix_mode(void); - extern void cpu_fast_reboot_complete(void); - -+int dctl_set_special_wakeup(struct cpu_thread *t); -+int dctl_clear_special_wakeup(struct cpu_thread *t); -+ - #endif /* __CPU_H */ diff --git a/SOURCES/opal-prd-781b10633945df32fa2292ee8b196c74f8ef2c7c.patch b/SOURCES/opal-prd-781b10633945df32fa2292ee8b196c74f8ef2c7c.patch deleted file mode 100644 index 1341477..0000000 --- a/SOURCES/opal-prd-781b10633945df32fa2292ee8b196c74f8ef2c7c.patch +++ /dev/null @@ -1,321 +0,0 @@ -diff -up skiboot-5.9/external/opal-prd/opal-prd.c.me skiboot-5.9/external/opal-prd/opal-prd.c ---- skiboot-5.9/external/opal-prd/opal-prd.c.me 2018-01-22 11:44:50.353992246 +0100 -+++ skiboot-5.9/external/opal-prd/opal-prd.c 2018-01-22 11:44:50.362991906 +0100 -@@ -303,6 +303,8 @@ extern int call_sbe_message_passing(uint - extern uint64_t call_get_ipoll_events(void); - extern int call_firmware_notify(uint64_t len, void *data); - extern int call_reset_pm_complex(uint64_t chip); -+extern int call_load_pm_complex(u64 chip, u64 homer, u64 occ_common, u32 mode); -+extern int call_start_pm_complex(u64 chip); - - void hservice_puts(const char *str) - { -@@ -1418,6 +1420,61 @@ static int handle_msg_occ_error(struct o - return 0; - } - -+static int pm_complex_load_start(void) -+{ -+ struct prd_range *range; -+ u64 homer, occ_common; -+ int rc = -1, i; -+ -+ if (!hservice_runtime->load_pm_complex) { -+ pr_log_nocall("load_pm_complex"); -+ return rc; -+ } -+ -+ if (!hservice_runtime->start_pm_complex) { -+ pr_log_nocall("start_pm_complex"); -+ return rc; -+ } -+ -+ range = find_range("ibm,occ-common-area", 0); -+ if (!range) { -+ pr_log(LOG_ERR, "PM: ibm,occ-common-area not found"); -+ return rc; -+ } -+ occ_common = range->physaddr; -+ -+ for (i = 0; i < nr_chips; i++) { -+ range = find_range("ibm,homer-image", chips[i]); -+ if (!range) { -+ pr_log(LOG_ERR, "PM: ibm,homer-image not found 0x%lx", -+ chips[i]); -+ return -1; -+ } -+ homer = range->physaddr; -+ -+ pr_debug("PM: calling load_pm_complex(0x%lx, 0x%lx, 0x%lx, LOAD)", -+ chips[i], homer, occ_common); -+ rc = call_load_pm_complex(chips[i], homer, occ_common, 0); -+ if (rc) { -+ pr_log(LOG_ERR, "PM: Failed load_pm_complex(0x%lx) %m", -+ chips[i]); -+ return rc; -+ } -+ } -+ -+ for (i = 0; i < nr_chips; i++) { -+ pr_debug("PM: calling start_pm_complex(0x%lx)", chips[i]); -+ rc = call_start_pm_complex(chips[i]); -+ if (rc) { -+ pr_log(LOG_ERR, "PM: Failed start_pm_complex(0x%lx): %m", -+ chips[i]); -+ return rc; -+ } -+ } -+ -+ return rc; -+} -+ - static int pm_complex_reset(uint64_t chip) - { - int rc; -@@ -1427,13 +1484,24 @@ static int pm_complex_reset(uint64_t chi - * BMC system -> process_occ_reset - */ - if (is_fsp_system()) { -+ int i; -+ - if (!hservice_runtime->reset_pm_complex) { - pr_log_nocall("reset_pm_complex"); - return -1; - } - -- pr_debug("PM: calling pm_complex_reset(%ld)", chip); -- rc = call_reset_pm_complex(chip); -+ for (i = 0; i < nr_chips; i++) { -+ pr_debug("PM: calling pm_complex_reset(%ld)", chips[i]); -+ rc = call_reset_pm_complex(chip); -+ if (rc) { -+ pr_log(LOG_ERR, "PM: Failed pm_complex_reset(%ld): %m", -+ chips[i]); -+ return rc; -+ } -+ } -+ -+ rc = pm_complex_load_start(); - } else { - if (!hservice_runtime->process_occ_reset) { - pr_log_nocall("process_occ_reset"); -@@ -1539,6 +1607,27 @@ static int handle_msg_fsp_occ_reset(stru - return rc; - } - -+static int handle_msg_fsp_occ_load_start(struct opal_prd_msg *msg) -+{ -+ struct opal_prd_msg omsg; -+ int rc; -+ -+ pr_debug("FW: FSP requested OCC load/start"); -+ rc = pm_complex_load_start(); -+ -+ omsg.hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START_STATUS; -+ omsg.hdr.size = htobe16(sizeof(omsg)); -+ omsg.fsp_occ_reset_status.chip = msg->occ_reset.chip; -+ omsg.fsp_occ_reset_status.status = htobe64(rc); -+ -+ if (write(ctx->fd, &omsg, sizeof(omsg)) != sizeof(omsg)) { -+ pr_log(LOG_ERR, "FW: Failed to send FSP_OCC_LOAD_START_STATUS msg: %m"); -+ return -1; -+ } -+ -+ return rc; -+} -+ - static int handle_prd_msg(struct opal_prd_ctx *ctx, struct opal_prd_msg *msg) - { - int rc = -1; -@@ -1562,6 +1651,9 @@ static int handle_prd_msg(struct opal_pr - case OPAL_PRD_MSG_TYPE_FSP_OCC_RESET: - rc = handle_msg_fsp_occ_reset(msg); - break; -+ case OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START: -+ rc = handle_msg_fsp_occ_load_start(msg); -+ break; - default: - pr_log(LOG_WARNING, "Invalid incoming message type 0x%x", - msg->hdr.type); -diff -up skiboot-5.9/hw/occ.c.me skiboot-5.9/hw/occ.c ---- skiboot-5.9/hw/occ.c.me 2018-01-22 11:44:50.355992171 +0100 -+++ skiboot-5.9/hw/occ.c 2018-01-22 11:44:50.362991906 +0100 -@@ -1748,6 +1748,8 @@ void occ_poke_load_queue(void) - } - } - -+static u32 last_seq_id; -+static bool in_ipl = true; - static void occ_do_load(u8 scope, u32 dbob_id __unused, u32 seq_id) - { - struct fsp_msg *rsp; -@@ -1780,15 +1782,25 @@ static void occ_do_load(u8 scope, u32 db - return; - - if (proc_gen == proc_gen_p9) { -- rc = -ENOMEM; -- /* OCC is pre-loaded in P9, so send SUCCESS to FSP */ -- rsp = fsp_mkmsg(FSP_CMD_LOAD_OCC_STAT, 2, 0, seq_id); -- if (rsp) -+ if (in_ipl) { -+ /* OCC is pre-loaded in P9, so send SUCCESS to FSP */ -+ rsp = fsp_mkmsg(FSP_CMD_LOAD_OCC_STAT, 2, 0, seq_id); -+ if (!rsp) -+ return; -+ - rc = fsp_queue_msg(rsp, fsp_freemsg); -- if (rc) { -- log_simple_error(&e_info(OPAL_RC_OCC_LOAD), -- "OCC: Error %d queueing FSP OCC LOAD STATUS msg", rc); -- fsp_freemsg(rsp); -+ if (rc) { -+ log_simple_error(&e_info(OPAL_RC_OCC_LOAD), -+ "OCC: Error %d queueing OCC LOAD STATUS msg", -+ rc); -+ fsp_freemsg(rsp); -+ } -+ in_ipl = false; -+ } else { -+ struct proc_chip *chip = next_chip(NULL); -+ -+ last_seq_id = seq_id; -+ prd_fsp_occ_load_start(chip->id); - } - return; - } -@@ -1837,8 +1849,6 @@ out: - return rc; - } - --static u32 last_seq_id; -- - int fsp_occ_reset_status(u64 chipid, s64 status) - { - struct fsp_msg *stat; -@@ -1875,6 +1885,38 @@ int fsp_occ_reset_status(u64 chipid, s64 - return rc; - } - -+int fsp_occ_load_start_status(u64 chipid, s64 status) -+{ -+ struct fsp_msg *stat; -+ int rc = OPAL_NO_MEM; -+ int status_word = 0; -+ -+ if (status) { -+ struct proc_chip *chip = get_chip(chipid); -+ -+ if (!chip) -+ return OPAL_PARAMETER; -+ -+ status_word = 0xB500 | (chip->pcid & 0xff); -+ log_simple_error(&e_info(OPAL_RC_OCC_LOAD), -+ "OCC: Error %d in load/start OCC %lld\n", rc, -+ chipid); -+ } -+ -+ stat = fsp_mkmsg(FSP_CMD_LOAD_OCC_STAT, 2, status_word, last_seq_id); -+ if (!stat) -+ return rc; -+ -+ rc = fsp_queue_msg(stat, fsp_freemsg); -+ if (rc) { -+ fsp_freemsg(stat); -+ log_simple_error(&e_info(OPAL_RC_OCC_LOAD), -+ "OCC: Error %d queueing FSP OCC LOAD STATUS msg", rc); -+ } -+ -+ return rc; -+} -+ - static void occ_do_reset(u8 scope, u32 dbob_id, u32 seq_id) - { - struct fsp_msg *rsp, *stat; -diff -up skiboot-5.9/hw/prd.c.me skiboot-5.9/hw/prd.c ---- skiboot-5.9/hw/prd.c.me 2018-01-22 11:44:50.356992133 +0100 -+++ skiboot-5.9/hw/prd.c 2018-01-22 11:44:50.363991868 +0100 -@@ -30,6 +30,7 @@ enum events { - EVENT_OCC_RESET = 1 << 2, - EVENT_SBE_PASSTHROUGH = 1 << 3, - EVENT_FSP_OCC_RESET = 1 << 4, -+ EVENT_FSP_OCC_LOAD_START = 1 << 5, - }; - - static uint8_t events[MAX_CHIPS]; -@@ -119,6 +120,10 @@ static void prd_msg_consumed(void *data) - proc = msg->occ_reset.chip; - event = EVENT_FSP_OCC_RESET; - break; -+ case OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START: -+ proc = msg->occ_reset.chip; -+ event = EVENT_FSP_OCC_LOAD_START; -+ break; - default: - prlog(PR_ERR, "PRD: invalid msg consumed, type: 0x%x\n", - msg->hdr.type); -@@ -196,6 +201,9 @@ static void send_next_pending_event(void - } else if (event & EVENT_FSP_OCC_RESET) { - prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_RESET; - prd_msg->occ_reset.chip = proc; -+ } else if (event & EVENT_FSP_OCC_LOAD_START) { -+ prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START; -+ prd_msg->occ_reset.chip = proc; - } - - /* -@@ -292,6 +300,11 @@ void prd_sbe_passthrough(uint32_t proc) - prd_event(proc, EVENT_SBE_PASSTHROUGH); - } - -+void prd_fsp_occ_load_start(uint32_t proc) -+{ -+ prd_event(proc, EVENT_FSP_OCC_LOAD_START); -+} -+ - /* incoming message handlers */ - static int prd_msg_handle_attn_ack(struct opal_prd_msg *msg) - { -@@ -439,6 +452,10 @@ static int64_t opal_prd_msg(struct opal_ - rc = hservice_wakeup(msg->spl_wakeup.core, - msg->spl_wakeup.mode); - break; -+ case OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START_STATUS: -+ rc = fsp_occ_load_start_status(msg->fsp_occ_reset_status.chip, -+ msg->fsp_occ_reset_status.status); -+ break; - default: - rc = OPAL_UNSUPPORTED; - } -diff -up skiboot-5.9/include/hostservices.h.me skiboot-5.9/include/hostservices.h ---- skiboot-5.9/include/hostservices.h.me 2018-01-22 11:44:50.363991868 +0100 -+++ skiboot-5.9/include/hostservices.h 2018-01-22 11:45:21.221824912 +0100 -@@ -40,5 +40,6 @@ int find_master_and_slave_occ(uint64_t * - int *nr_masters, int *nr_slaves); - int hservice_wakeup(uint32_t i_core, uint32_t i_mode); - int fsp_occ_reset_status(u64 chipid, s64 status); -+int fsp_occ_load_start_status(u64 chipid, s64 status); - - #endif /* __HOSTSERVICES_H */ -diff -up skiboot-5.9/include/opal-api.h.me skiboot-5.9/include/opal-api.h ---- skiboot-5.9/include/opal-api.h.me 2018-01-22 11:44:50.357992095 +0100 -+++ skiboot-5.9/include/opal-api.h 2018-01-22 11:44:50.363991868 +0100 -@@ -1057,6 +1057,8 @@ enum opal_prd_msg_type { - OPAL_PRD_MSG_TYPE_FSP_OCC_RESET, /* HBRT <-- OPAL */ - OPAL_PRD_MSG_TYPE_FSP_OCC_RESET_STATUS, /* HBRT --> OPAL */ - OPAL_PRD_MSG_TYPE_CORE_SPECIAL_WAKEUP, /* HBRT --> OPAL */ -+ OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START, /* HBRT <-- OPAL */ -+ OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START_STATUS, /* HBRT --> OPAL */ - }; - - struct opal_prd_msg_header { -diff -up skiboot-5.9/include/skiboot.h.me skiboot-5.9/include/skiboot.h ---- skiboot-5.9/include/skiboot.h.me 2018-01-22 11:44:50.358992057 +0100 -+++ skiboot-5.9/include/skiboot.h 2018-01-22 11:44:50.364991831 +0100 -@@ -294,6 +294,7 @@ extern void prd_sbe_passthrough(uint32_t - extern void prd_init(void); - extern void prd_register_reserved_memory(void); - extern void prd_fsp_occ_reset(uint32_t proc); -+extern void prd_fsp_occ_load_start(u32 proc); - - /* Flatten device-tree */ - extern void *create_dtb(const struct dt_node *root, bool exclusive); diff --git a/SOURCES/opal-prd.service b/SOURCES/opal-prd.service deleted file mode 100644 index 451e445..0000000 --- a/SOURCES/opal-prd.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=OPAL PRD daemon -ConditionArchitecture=ppc64-le -ConditionVirtualization=false -ConditionPathExists=/sys/firmware/devicetree/base/ibm,opal/diagnostics - -[Service] -ExecStart=/usr/sbin/opal-prd --pnor /dev/mtd0 -Restart=always - -[Install] -WantedBy=multi-user.target diff --git a/SOURCES/skiboot-5.10.2-alignment.patch b/SOURCES/skiboot-5.10.2-alignment.patch new file mode 100644 index 0000000..730713b --- /dev/null +++ b/SOURCES/skiboot-5.10.2-alignment.patch @@ -0,0 +1,12 @@ +diff -up skiboot-5.10.2/hdata/i2c.c.me skiboot-5.10.2/hdata/i2c.c +--- skiboot-5.10.2/hdata/i2c.c.me 2018-05-14 12:23:30.413536519 +0200 ++++ skiboot-5.10.2/hdata/i2c.c 2018-05-14 12:26:27.036752163 +0200 +@@ -181,7 +181,7 @@ static bool is_zeros(const void *p, size + struct host_i2c_hdr { + const struct HDIF_array_hdr hdr; + __be32 version; +-} __packed; ++} __packed __align(0x4); + + int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index, + struct dt_node *xscom) diff --git a/SOURCES/skiboot-6.0.4-77f510d35e8d60faed989496fac2de16663ff332.patch b/SOURCES/skiboot-6.0.4-77f510d35e8d60faed989496fac2de16663ff332.patch new file mode 100644 index 0000000..e1c5474 --- /dev/null +++ b/SOURCES/skiboot-6.0.4-77f510d35e8d60faed989496fac2de16663ff332.patch @@ -0,0 +1,241 @@ +commit 77f510d35e8d60faed989496fac2de16663ff332 +Author: Vasant Hegde +Date: Tue Jun 26 16:50:51 2018 +0530 + + vpd: Sanitize VPD data + + On OpenPower system, VPD keyword size tells us the maximum size of the data. + But they fill trailing end with space (0x20) instead of NULL. Also spec + doesn't stop user to have space (0x20) within actual data. + + This patch discards trailing spaces before populating device tree. + + Reported-by: Pridhiviraj Paidipeddi + Signed-off-by: Vasant Hegde + [stewart: fixup make check] + Signed-off-by: Stewart Smith + +diff --git a/hdata/test/p8-840-spira.dts b/hdata/test/p8-840-spira.dts +index e73c691d..428683b1 100644 +--- a/hdata/test/p8-840-spira.dts ++++ b/hdata/test/p8-840-spira.dts +@@ -900,7 +900,7 @@ + card-type = [80 b5 00]; + hw-characteristics = [00]; + ccin = "2B08"; +- description = "CEC OP PANEL "; ++ description = "CEC OP PANEL"; + }; + + power-supply@3102 { +diff --git a/hdata/test/p81-811.spira.dts b/hdata/test/p81-811.spira.dts +index 2ca361ee..800468e3 100644 +--- a/hdata/test/p81-811.spira.dts ++++ b/hdata/test/p81-811.spira.dts +@@ -2119,7 +2119,7 @@ + card-type = [80 b5 00]; + hw-characteristics = [00]; + ccin = "2B08"; +- description = "CEC OP PANEL "; ++ description = "CEC OP PANEL"; + }; + + power-supply@3100 { +diff --git a/hdata/vpd.c b/hdata/vpd.c +index 038569af..98123e5a 100644 +--- a/hdata/vpd.c ++++ b/hdata/vpd.c +@@ -22,6 +22,7 @@ + #include + #include "hdata.h" + #include ++#include + + struct card_info { + const char *ccin; /* Customer card identification number */ +@@ -221,6 +222,32 @@ static const struct card_info *card_info_lookup(char *ccin) + return NULL; + } + ++/* Discard trailing spaces and populate device tree */ ++static struct dt_property *dt_add_prop_sanitize_val(struct dt_node *node, ++ const char *name, const char *val, int vlen) ++{ ++ char *prop = zalloc(vlen + 1); ++ int i; ++ struct dt_property *p = NULL; ++ ++ if (!prop) ++ return p; ++ ++ memcpy(prop, val, vlen); ++ for (i = vlen - 1; i >= 0; i--) { ++ if (prop[i] != 0x20) { ++ prop[i + 1] = '\0'; ++ break; ++ } ++ } ++ ++ if (i >= 0 && !dt_find_property(node, name)) ++ p = dt_add_property_string(node, name, prop); ++ ++ free(prop); ++ return p; ++} ++ + /* + * For OpenPOWER, we only decipher OPFR records. While OP HDAT have VINI + * records too, populating the fields in there is optional. Also, there +@@ -235,27 +262,27 @@ static void vpd_opfr_parse(struct dt_node *node, + /* Vendor Name */ + kw = vpd_find(fruvpd, fruvpd_sz, "OPFR", "VN", &sz); + if (kw) +- dt_add_property_nstr(node, "vendor", kw, sz); ++ dt_add_prop_sanitize_val(node, "vendor", kw, sz); + + /* FRU Description */ + kw = vpd_find(fruvpd, fruvpd_sz, "OPFR", "DR", &sz); + if (kw) +- dt_add_property_nstr(node, "description", kw, sz); ++ dt_add_prop_sanitize_val(node, "description", kw, sz); + + /* Part number */ + kw = vpd_find(fruvpd, fruvpd_sz, "OPFR", "VP", &sz); + if (kw) +- dt_add_property_nstr(node, "part-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "part-number", kw, sz); + + /* Serial number */ + kw = vpd_find(fruvpd, fruvpd_sz, "OPFR", "VS", &sz); + if (kw) +- dt_add_property_nstr(node, "serial-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "serial-number", kw, sz); + + /* Build date in BCD */ + kw = vpd_find(fruvpd, fruvpd_sz, "OPFR", "MB", &sz); + if (kw) +- dt_add_property_nstr(node, "build-date", kw, sz); ++ dt_add_prop_sanitize_val(node, "build-date", kw, sz); + + return; + } +@@ -272,12 +299,12 @@ static void vpd_vrml_parse(struct dt_node *node, + /* Part number */ + kw = vpd_find(fruvpd, fruvpd_sz, "VRML", "PN", &sz); + if (kw) +- dt_add_property_nstr(node, "part-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "part-number", kw, sz); + + /* Serial number */ + kw = vpd_find(fruvpd, fruvpd_sz, "VRML", "SN", &sz); + if (kw) +- dt_add_property_nstr(node, "serial-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "serial-number", kw, sz); + + return; + } +@@ -292,47 +319,47 @@ static void vpd_vini_parse(struct dt_node *node, + /* FRU Stocking Part Number */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "FN", &sz); + if (kw) +- dt_add_property_nstr(node, "fru-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "fru-number", kw, sz); + + /* Serial Number */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "SN", &sz); + if (kw) +- dt_add_property_nstr(node, "serial-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "serial-number", kw, sz); + + /* Part Number */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "PN", &sz); + if (kw) +- dt_add_property_nstr(node, "part-number", kw, sz); ++ dt_add_prop_sanitize_val(node, "part-number", kw, sz); + + /* Vendor Name */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "VN", &sz); + if (kw) +- dt_add_property_nstr(node, "vendor", kw, sz); ++ dt_add_prop_sanitize_val(node, "vendor", kw, sz); + + /* CCIN Extension */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CE", &sz); + if (kw) +- dt_add_property_nstr(node, "ccin-extension", kw, sz); ++ dt_add_prop_sanitize_val(node, "ccin-extension", kw, sz); + + /* HW Version info */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "HW", &sz); + if (kw) +- dt_add_property_nstr(node, "hw-version", kw, sz); ++ dt_add_prop_sanitize_val(node, "hw-version", kw, sz); + + /* Card type info */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CT", &sz); + if (kw) +- dt_add_property_nstr(node, "card-type", kw, sz); ++ dt_add_prop_sanitize_val(node, "card-type", kw, sz); + + /* HW characteristics info */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "B3", &sz); + if (kw) +- dt_add_property_nstr(node, "hw-characteristics", kw, sz); ++ dt_add_prop_sanitize_val(node, "hw-characteristics", kw, sz); + + /* Customer Card Identification Number (CCIN) */ + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "CC", &sz); + if (kw) { +- dt_add_property_nstr(node, "ccin", kw, sz); ++ dt_add_prop_sanitize_val(node, "ccin", kw, sz); + + cinfo = card_info_lookup((char *)kw); + if (cinfo) { +@@ -341,7 +368,7 @@ static void vpd_vini_parse(struct dt_node *node, + } else { + kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "DR", &sz); + if (kw) { +- dt_add_property_nstr(node, ++ dt_add_prop_sanitize_val(node, + "description", kw, sz); + } else { + dt_add_property_string(node, "description", "Unknown"); +@@ -548,13 +575,13 @@ static void sysvpd_parse_opp(const void *sysvpd, unsigned int sysvpd_sz) + + v = vpd_find(sysvpd, sysvpd_sz, "OSYS", "MM", &sz); + if (v) +- dt_add_property_nstr(dt_root, "model", v, sz); ++ dt_add_prop_sanitize_val(dt_root, "model", v, sz); + else + dt_add_property_string(dt_root, "model", "Unknown"); + + v = vpd_find(sysvpd, sysvpd_sz, "OSYS", "SS", &sz); + if (v) +- dt_add_property_nstr(dt_root, "system-id", v, sz); ++ dt_add_prop_sanitize_val(dt_root, "system-id", v, sz); + else + dt_add_property_string(dt_root, "system-id", "Unknown"); + } +@@ -569,19 +596,19 @@ static void sysvpd_parse_legacy(const void *sysvpd, unsigned int sysvpd_sz) + + model = vpd_find(sysvpd, sysvpd_sz, "VSYS", "TM", &sz); + if (model) +- dt_add_property_nstr(dt_root, "model", model, sz); ++ dt_add_prop_sanitize_val(dt_root, "model", model, sz); + else + dt_add_property_string(dt_root, "model", "Unknown"); + + system_id = vpd_find(sysvpd, sysvpd_sz, "VSYS", "SE", &sz); + if (system_id) +- dt_add_property_nstr(dt_root, "system-id", system_id, sz); ++ dt_add_prop_sanitize_val(dt_root, "system-id", system_id, sz); + else + dt_add_property_string(dt_root, "system-id", "Unknown"); + + brand = vpd_find(sysvpd, sysvpd_sz, "VSYS", "BR", &sz); + if (brand) +- dt_add_property_nstr(dt_root, "system-brand", brand, sz); ++ dt_add_prop_sanitize_val(dt_root, "system-brand", brand, sz); + else + dt_add_property_string(dt_root, "brand", "Unknown"); + } diff --git a/SOURCES/skiboot-6.0.4-861350941f9a3fb76ebcae3e5a32b3cbec929d03.patch b/SOURCES/skiboot-6.0.4-861350941f9a3fb76ebcae3e5a32b3cbec929d03.patch new file mode 100644 index 0000000..0b8a0ac --- /dev/null +++ b/SOURCES/skiboot-6.0.4-861350941f9a3fb76ebcae3e5a32b3cbec929d03.patch @@ -0,0 +1,65 @@ +commit 861350941f9a3fb76ebcae3e5a32b3cbec929d03 +Author: Vasant Hegde +Date: Tue Jun 26 16:50:52 2018 +0530 + + vpd: Add vendor property to processor node + + Processor FRU vpd doesn't contain vendor detail. We have to parse + module VPD to get vendor detail. + + Reported-by: Pridhiviraj Paidipeddi + Signed-off-by: Vasant Hegde + Signed-off-by: Stewart Smith + +diff --git a/hdata/hdata.h b/hdata/hdata.h +index 981affd4..426c9c98 100644 +--- a/hdata/hdata.h ++++ b/hdata/hdata.h +@@ -50,6 +50,8 @@ extern const char *slca_get_vpd_name(uint16_t slca_index); + extern const char *slca_get_loc_code_index(uint16_t slca_index); + extern void slca_vpd_add_loc_code(struct dt_node *node, uint16_t slca_index); + extern void slca_dt_add_sai_node(void); ++extern void dt_add_proc_vendor(struct dt_node *proc_node, ++ const void *mvpd, unsigned int mvpd_sz); + + extern bool hservices_from_hdat(const void *fdt, size_t size); + int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index, +diff --git a/hdata/spira.c b/hdata/spira.c +index d459df7c..189584d5 100644 +--- a/hdata/spira.c ++++ b/hdata/spira.c +@@ -561,6 +561,8 @@ static bool add_xscom_sppcrd(uint64_t xscom_base) + dt_add_property(np, "ibm,module-vpd", vpd, + vpd_sz); + vpd_data_parse(np, vpd, vpd_sz); ++ if (vpd_node) ++ dt_add_proc_vendor(vpd_node, vpd, vpd_sz); + } + } + +diff --git a/hdata/vpd.c b/hdata/vpd.c +index 98123e5a..129b5062 100644 +--- a/hdata/vpd.c ++++ b/hdata/vpd.c +@@ -248,6 +248,21 @@ static struct dt_property *dt_add_prop_sanitize_val(struct dt_node *node, + return p; + } + ++/* ++ * OpenPower system does not provide processor vendor name under FRU VPD. ++ * Parse processor module VPD to get vendor detail ++ */ ++void dt_add_proc_vendor(struct dt_node *proc_node, ++ const void *mvpd, unsigned int mvpd_sz) ++{ ++ const void *kw; ++ uint8_t sz; ++ ++ kw = vpd_find(mvpd, mvpd_sz, "VINI", "VN", &sz); ++ if (kw) ++ dt_add_prop_sanitize_val(proc_node, "vendor", kw, sz); ++} ++ + /* + * For OpenPOWER, we only decipher OPFR records. While OP HDAT have VINI + * records too, populating the fields in there is optional. Also, there diff --git a/SPECS/opal-prd.spec b/SPECS/opal-prd.spec index 352e6ba..afeec64 100644 --- a/SPECS/opal-prd.spec +++ b/SPECS/opal-prd.spec @@ -1,28 +1,35 @@ -Name: opal-prd -Version: 5.9 -Release: 2%{?dist} -Summary: OPAL Processor Recovery Diagnostics Daemon +%global project skiboot -Group: System Environment/Daemons -License: ASL 2.0 -URL: http://github.com/open-power/skiboot +Name: opal-prd +Version: 6.0.4 +Release: 2%{?dist} +Summary: OPAL Processor Recovery Diagnostics Daemon -# Presently opal-prd is supported on ppc64le architecture only. -ExclusiveArch: ppc64le - -BuildRequires: systemd -BuildRequires: openssl-devel - -Requires(post): systemd -Requires(preun): systemd -Requires(postun): systemd - -Source0: https://github.com/open-power/skiboot/archive/v%{version}.tar.gz#/skiboot-%{version}.tar.gz -Source1: opal-prd.service +Group: System Environment/Daemons +License: ASL 2.0 +URL: http://github.com/open-power/skiboot -# upstream fix, Add support for runtime OCC load/start in ZZ -Patch0: opal-prd-49999302251b3e3e2fdca2cbcdeb6aab9add7412.patch -Patch1: opal-prd-781b10633945df32fa2292ee8b196c74f8ef2c7c.patch +# Presently opal-prd is supported on ppc64le architecture only. +ExclusiveArch: ppc64le + +BuildRequires: systemd +BuildRequires: gcc +%if 0%{?fedora} +BuildRequires: gcc-powerpc64-linux-gnu +%endif +BuildRequires: openssl-devel + +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd + +Source0: https://github.com/open-power/%{project}/archive/v%{version}/%{project}-%{version}.tar.gz +# https://github.com/open-power/skiboot/issues/160 +Patch0: skiboot-5.10.2-alignment.patch +# 1596245 - "diag_encl -d" creates xml file with blank space in file name also +# file contains attributes with NULL value. +Patch1: skiboot-6.0.4-77f510d35e8d60faed989496fac2de16663ff332.patch +Patch2: skiboot-6.0.4-861350941f9a3fb76ebcae3e5a32b3cbec929d03.patch %description This package provides a daemon to load and run the OpenPower firmware's @@ -31,8 +38,8 @@ maintenance of OpenPower Systems hardware. %package -n opal-utils -Summary: OPAL firmware utilities -Group: Applications/System +Summary: OPAL firmware utilities +Group: Applications/System %description -n opal-utils This package contains utility programs. @@ -53,28 +60,37 @@ services to the OS (Linux) on IBM Power and OpenPower systems. %prep -%setup -q -n skiboot-%{version} +%setup -q -n %{project}-%{version} %patch0 -p1 %patch1 -p1 +%patch2 -p1 %build -OPAL_PRD_VERSION=%{version} make V=1 CFLAGS="%{optflags}" -C external/opal-prd -GARD_VERSION=%{version} make V=1 CFLAGS="%{optflags}" -C external/gard -PFLASH_VERSION=%{version} make V=1 CFLAGS="%{optflags}" -C external/pflash -XSCOM_VERSION=%{version} make V=1 CFLAGS="%{optflags}" -C external/xscom-utils -SKIBOOT_VERSION=%{version} CROSS= make V=1 %{?_smp_mflags} +OPAL_PRD_VERSION=%{version} make V=1 CC="gcc" CFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}" -C external/opal-prd +GARD_VERSION=%{version} make V=1 CC="gcc" CFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}" -C external/gard +PFLASH_VERSION=%{version} make V=1 CC="gcc" CFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}" -C external/pflash +XSCOM_VERSION=%{version} make V=1 CC="gcc" CFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}" -C external/xscom-utils + +# build skiboot with a cross-compiler on Fedora and with system compiler otherwise +# and always use upstream compiler flags for the firmware (no CFLAGS override) +%if 0%{?fedora} +SKIBOOT_VERSION=%{version} make V=1 CROSS="powerpc64-linux-gnu-" +%else +SKIBOOT_VERSION=%{version} make V=1 CROSS= +%endif %install make -C external/opal-prd install DESTDIR=%{buildroot} prefix=/usr make -C external/gard install DESTDIR=%{buildroot} prefix=/usr -make -C external/pflash install DESTDIR=%{buildroot} prefix=/usr -make -C external/xscom-utils install DESTDIR=%{buildroot} prefix=/usr +cp external/pflash/pflash %{buildroot}%{_sbindir} +cp external/xscom-utils/{get,put}scom %{buildroot}%{_sbindir} mkdir -p %{buildroot}%{_unitdir} -install -m 644 -p %{SOURCE1} %{buildroot}%{_unitdir}/opal-prd.service +install -m 644 -p external/opal-prd/opal-prd.service %{buildroot}%{_unitdir}/opal-prd.service mkdir -p %{buildroot}%{_datadir}/qemu install -m 644 -p skiboot.lid %{buildroot}%{_datadir}/qemu/skiboot.lid +install -m 644 -p skiboot.lid.xz %{buildroot}%{_datadir}/qemu/skiboot.lid.xz %post %systemd_post opal-prd.service @@ -98,7 +114,6 @@ install -m 644 -p skiboot.lid %{buildroot}%{_datadir}/qemu/skiboot.lid %{_sbindir}/opal-gard %{_sbindir}/getscom %{_sbindir}/putscom -%{_sbindir}/getsram %{_sbindir}/pflash %{_mandir}/man1/* @@ -108,6 +123,12 @@ install -m 644 -p skiboot.lid %{buildroot}%{_datadir}/qemu/skiboot.lid %{_datadir}/qemu/ %changelog +* Thu Jun 28 2018 Than Ngo - 6.0.4-2 +- Resolves: #1596245 - "diag_encl -d" creates xml file with blank space in file name + +* Thu Jun 21 2018 Than Ngo - 6.0.4-1 +- Resolves: #1537001 - update to 6.0.4 + * Mon Jan 22 2018 Than Ngo - 5.9-2 - Related: rhbz#1456536 - add support for runtime OCC load/start in ZZ