diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-07-16 17:48:12 +0200 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-07-16 17:49:49 +0200 |
commit | f234146f3e7747c78abcaf2a9cf5676b2190d2b4 (patch) | |
tree | a35eb4434a25f4e521e3303ed7ceb894ead3ec1f | |
parent | cf8ea3d14f425112990dcb94d0878fab9c767aa3 (diff) | |
download | hardware_replicant_libsamsung-ipc-f234146f3e7747c78abcaf2a9cf5676b2190d2b4.tar.gz hardware_replicant_libsamsung-ipc-f234146f3e7747c78abcaf2a9cf5676b2190d2b4.tar.bz2 hardware_replicant_libsamsung-ipc-f234146f3e7747c78abcaf2a9cf5676b2190d2b4.zip |
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r-- | samsung-ipc/Makefile.am | 2 | ||||
-rw-r--r-- | samsung-ipc/devices/i9300/i9300.c | 28 | ||||
-rw-r--r-- | samsung-ipc/modems/modem.c | 30 | ||||
-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.h | 52 |
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 */ |