aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-07-16 17:48:12 +0200
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-07-16 17:49:49 +0200
commitf234146f3e7747c78abcaf2a9cf5676b2190d2b4 (patch)
treea35eb4434a25f4e521e3303ed7ceb894ead3ec1f
parentcf8ea3d14f425112990dcb94d0878fab9c767aa3 (diff)
downloadhardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-4.tar.gz
hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-4.tar.bz2
hardware_replicant_libsamsung-ipc-patches-todo/modem-abstraction-wip-rebase-4.zip
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r--samsung-ipc/Makefile.am2
-rw-r--r--samsung-ipc/devices/i9300/i9300.c28
-rw-r--r--samsung-ipc/modems/modem.c30
-rw-r--r--samsung-ipc/modems/xmm626/os_partitions.c (renamed from samsung-ipc/modems/xmm626/firmware.c)40
-rw-r--r--samsung-ipc/modems/xmm626/os_partitions.h52
5 files changed, 139 insertions, 13 deletions
diff --git a/samsung-ipc/Makefile.am b/samsung-ipc/Makefile.am
index 8c8e5bd..72503b0 100644
--- a/samsung-ipc/Makefile.am
+++ b/samsung-ipc/Makefile.am
@@ -24,7 +24,7 @@ libsamsung_ipc_la_SOURCES = \
modems/xmm616/xmm616.h \
modems/xmm626/xmm626.c \
modems/xmm626/xmm626.h \
- modems/xmm626/firmware.c \
+ modems/xmm626/os_partitions.c \
modems/xmm626/kernel_smdk4412.c \
modems/xmm626/xmm626_modem.h \
modems/xmm626/xmm626_modem_link_device_hsic.h \
diff --git a/samsung-ipc/devices/i9300/i9300.c b/samsung-ipc/devices/i9300/i9300.c
index 355ff62..6efeb67 100644
--- a/samsung-ipc/devices/i9300/i9300.c
+++ b/samsung-ipc/devices/i9300/i9300.c
@@ -387,6 +387,34 @@ int i9300_data_destroy(__attribute__((unused)) struct ipc_client *client,
return 0;
}
+struct modem_os_partition i9300_modem_os_partitions[] = {
+ {
+ .partition = MODEM_OS_PARTITION_PSIRAM,
+ .partition_offset = 0x1000,
+ .partition_size = 0xE000,
+ },
+ {
+ .partition = MODEM_OS_PARTITION_EBL,
+ .partition_offset = 0xF000,
+ .partition_size = 0x19000,
+ },
+ {
+ .partition = MODEM_OS_PARTITION_MAIN,
+ .partition_offset = 0x28000,
+ .partition_size = 0x9D7800,
+ },
+ {
+ .partition = MODEM_OS_PARTITION_SECPACK,
+ .partition_offset = 0x9FF800,
+ .partition_size = 0x800,
+ },
+ {
+ .partition = MODEM_OS_PARTITION_NV,
+ .partition_offset = 0xA00000,
+ .partition_size = 0x200000,
+ },
+}
+
struct ipc_client_ops i9300_fmt_ops = {
.boot = i9300_boot,
.send = xmm626_kernel_smdk4412_fmt_send,
diff --git a/samsung-ipc/modems/modem.c b/samsung-ipc/modems/modem.c
index 82a6ca7..2467abb 100644
--- a/samsung-ipc/modems/modem.c
+++ b/samsung-ipc/modems/modem.c
@@ -147,6 +147,14 @@ int modem_gprs_get_capabilities(struct ipc_client *client,
// | firmware | MAIN |
// | sec_start | SECPACK |
// | device specific | NV |
+enum modem_firmware_partition {
+ MODEM_OS_PARTITION_HEADER = 0,
+ MODEM_OS_PARTITION_PSIRAM,
+ MODEM_OS_PARTITION_EBL,
+ MODEM_OS_PARTITION_MAIN,
+ MODEM_OS_PARTITION_SECPACK,
+ MODEM_OS_PARTITION_NV,
+};
// int modem_psi_send(struct ipc_client *client, int serial_fd,
// const void *psi_data, unsigned short psi_size);
@@ -156,17 +164,17 @@ int modem_gprs_get_capabilities(struct ipc_client *client,
// psi_size);
// }
//
-// int modem_firmware_send(struct ipc_client *client, int device_fd,
-// void *device_address, const void *firmware_data,
-// size_t firmware_size)
-// {
-// /* TODO: get rid of device_fd */
-// return client->modem_driver_ops->firmware_send(client, device_fd,
-// device_address,
-// firmware_data,
-// firmware_size);
-// }
-//
+int modem_firmware_send(struct ipc_client *client, int device_fd,
+ void *device_address, const void *firmware_data,
+ size_t firmware_size)
+{
+ /* TODO: get rid of device_fd */
+ return client->modem_driver_ops->firmware_send(client, device_fd,
+ device_address,
+ firmware_data,
+ firmware_size);
+}
+
// int modem_nv_data_send(struct ipc_client *client, int device_fd,
// void *device_address)
// {
diff --git a/samsung-ipc/modems/xmm626/firmware.c b/samsung-ipc/modems/xmm626/os_partitions.c
index a7d5f5c..98bc16b 100644
--- a/samsung-ipc/modems/xmm626/firmware.c
+++ b/samsung-ipc/modems/xmm626/os_partitions.c
@@ -25,9 +25,47 @@
#include "ipc.h"
#include "modems/modem.h"
+#include "modems/xmm626/os_partitions.h"
#include "modems/xmm626/xmm626.h"
-int xmm626_firmware_send(struct ipc_client *client, int device_fd,
+// TODO: wrap device_fd
+
+int find_os_partition(struct ipc_client *client,
+ struct modem_os_partition *partition[])
+{
+
+
+}
+
+int xmm626_send_os_partition(struct ipc_client *client,
+ struct modem_os_partition *partition,
+ device_int device_fd)
+{
+ switch (partition->type) {
+ case MODEM_OS_PARTITION_PSIRAM:
+ // TODO: MIPI/HSIC
+ return xmm626_psi_send(client, device_fd,
+ psi_data, partition->data,
+ partition->size);
+ case MODEM_OS_PARTITION_EBL:
+ // TODO: MIPI/HSIC
+ int xmm626_hsic_ebl_send(struct ipc_client *client, int device_fd,
+ const void *ebl_data, size_t ebl_size);
+
+ case MODEM_OS_PARTITION_MAIN:
+ return xmm626_send_main_partition(client, device_fd, partition->data,
+ partition->size);
+ case MODEM_OS_PARTITION_SECPACK:
+ // TODO: MIPI/HSIC
+ return xmm626_hsic_sec_end_send(client, device_fd);
+
+ case MODEM_OS_PARTITION_NV:
+ return xmm626_nv_data_send(client, device_fd);
+ }
+}
+
+
+int xmm626_send_main_partition(struct ipc_client *client, int device_fd,
const void *firmware_data, size_t firmware_size)
{
int rc;
diff --git a/samsung-ipc/modems/xmm626/os_partitions.h b/samsung-ipc/modems/xmm626/os_partitions.h
new file mode 100644
index 0000000..518e538
--- /dev/null
+++ b/samsung-ipc/modems/xmm626/os_partitions.h
@@ -0,0 +1,52 @@
+/*
+ * This file is part of libsamsung-ipc.
+ *
+ * Copyright (C) 2013-2014 Paul Kocialkowski <contact@paulk.fr>
+ * Copyright (C) 2020 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
+ *
+ * libsamsung-ipc is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * libsamsung-ipc is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libsamsung-ipc. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef XMM626_OS_PARTITIONS
+#define XMM626_OS_PARTITIONS
+
+/* Current function/partition mapping
+ * TODO: migrate functions
+ * +-----------------+-----------+
+ * | Function | Partition |
+ * +-----------------+-----------+
+ * | psi | PSIRAM |
+ * | ebl | EBL |
+ * | firmware | MAIN |
+ * | sec_start | SECPACK |
+ * | device specific | NV |
+ * +-----------------+-----------+
+ */
+enum modem_os_partition {
+ MODEM_OS_PARTITION_HEADER = 0,
+ MODEM_OS_PARTITION_PSIRAM,
+ MODEM_OS_PARTITION_EBL,
+ MODEM_OS_PARTITION_MAIN,
+ MODEM_OS_PARTITION_SECPACK,
+ MODEM_OS_PARTITION_NV,
+};
+
+struct modem_os_partition partition {
+ const enum modem_os_partition type;
+ void *data;
+ const size_t offset;
+ const size_t size;
+};
+
+#endif /* XMM626_OS_PARTITIONS */