@@ -149,3 +149,59 @@ static struct fsi kernel_fsi = {
.write = kernel_fsi_putcfam,
};
DECLARE_HW_UNIT(kernel_fsi);
+
+static int kernel_pib_getscom(struct pib *pib, uint64_t addr, uint64_t *value)
+{
+ int rc;
+
+ rc = pread(pib->fd, value, 8, addr);
+ if (rc < 0) {
+ rc = errno;
+ PR_ERROR("Failed to read scom");
+ return rc;
+ }
+ return 0;
+}
+
+static int kernel_pib_putscom(struct pib *pib, uint64_t addr, uint64_t value)
+{
+ int rc;
+
+ rc = pwrite(pib->fd, &value, 8, addr);
+ if (rc < 0) {
+ rc = errno;
+ PR_ERROR("Failed to write scom");
+ return rc;
+ }
+ return 0;
+}
+
+static int kernel_pib_probe(struct pdbg_target *target)
+{
+ struct pib *pib = target_to_pib(target);
+ const char *scom_path;
+
+ scom_path = pdbg_target_property(target, "device-path", NULL);
+ assert(scom_path);
+
+ pib->fd = open(scom_path, O_RDWR | O_SYNC);
+ if (pib->fd < 0) {
+ PR_ERROR("Unable to open %s\n", scom_path);
+ return -1;
+ }
+
+ lseek(pib->fd, 0, SEEK_SET);
+ return 0;
+}
+
+struct pib kernel_pib = {
+ .target = {
+ .name = "Kernel based FSI SCOM",
+ .compatible = "ibm,kernel-pib",
+ .class = "pib",
+ .probe = kernel_pib_probe,
+ },
+ .read = kernel_pib_getscom,
+ .write = kernel_pib_putscom,
+};
+DECLARE_HW_UNIT(kernel_pib);
@@ -18,7 +18,8 @@
#size-cells = <0x1>;
reg = <0x0 0x1000 0x7>;
index = <0x0>;
- compatible = "ibm,fsi-pib", "ibm,power9-fsi-pib";
+ compatible = "ibm,kernel-pib";
+ device-path = "/dev/scom1";
include(p9-pib.dts.m4)dnl
};
@@ -35,7 +36,8 @@
#size-cells = <0x1>;
reg = <0x0 0x1000 0x7>;
index = <0x1>;
- compatible = "ibm,fsi-pib", "ibm,power9-fsi-pib";
+ compatible = "ibm,kernel-pib";
+ device-path = "/dev/scom2";
include(p9-pib.dts.m4)dnl
};
};