1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Siemens SIMATIC IPC drivers
5 * Copyright (c) Siemens AG, 2018-2023
8 * Henning Schild <henning.schild@siemens.com>
9 * Gerd Haeussler <gerd.haeussler.ext@siemens.com>
12 #ifndef __PLATFORM_DATA_X86_SIMATIC_IPC_H
13 #define __PLATFORM_DATA_X86_SIMATIC_IPC_H
15 #include <linux/dmi.h>
16 #include <linux/platform_data/x86/simatic-ipc-base.h>
18 #define SIMATIC_IPC_DMI_ENTRY_OEM 129
20 #define SIMATIC_IPC_DMI_TYPE 0xff
21 #define SIMATIC_IPC_DMI_GROUP 0x05
22 #define SIMATIC_IPC_DMI_ENTRY 0x02
23 #define SIMATIC_IPC_DMI_TID 0x02
25 enum simatic_ipc_station_ids
{
26 SIMATIC_IPC_INVALID_STATION_ID
= 0,
27 SIMATIC_IPC_IPC227D
= 0x00000501,
28 SIMATIC_IPC_IPC427D
= 0x00000701,
29 SIMATIC_IPC_IPC227E
= 0x00000901,
30 SIMATIC_IPC_IPC277E
= 0x00000902,
31 SIMATIC_IPC_IPC427E
= 0x00000A01,
32 SIMATIC_IPC_IPC477E
= 0x00000A02,
33 SIMATIC_IPC_IPC127E
= 0x00000D01,
34 SIMATIC_IPC_IPC227G
= 0x00000F01,
35 SIMATIC_IPC_IPC277G
= 0x00000F02,
36 SIMATIC_IPC_IPCBX_39A
= 0x00001001,
37 SIMATIC_IPC_IPCPX_39A
= 0x00001002,
38 SIMATIC_IPC_IPCBX_21A
= 0x00001101,
39 SIMATIC_IPC_IPCBX_56A
= 0x00001201,
40 SIMATIC_IPC_IPCBX_59A
= 0x00001202,
43 static inline u32
simatic_ipc_get_station_id(u8
*data
, int max_len
)
46 u8 type
; /* type (0xff = binary) */
47 u8 len
; /* len of data entry */
51 __le32 station_id
; /* station id (LE) */
52 } __packed
* data_entry
= (void *)data
+ sizeof(struct dmi_header
);
54 while ((u8
*)data_entry
< data
+ max_len
) {
55 if (data_entry
->type
== SIMATIC_IPC_DMI_TYPE
&&
56 data_entry
->len
== sizeof(*data_entry
) &&
57 data_entry
->group
== SIMATIC_IPC_DMI_GROUP
&&
58 data_entry
->entry
== SIMATIC_IPC_DMI_ENTRY
&&
59 data_entry
->tid
== SIMATIC_IPC_DMI_TID
) {
60 return le32_to_cpu(data_entry
->station_id
);
62 data_entry
= (void *)((u8
*)(data_entry
) + data_entry
->len
);
65 return SIMATIC_IPC_INVALID_STATION_ID
;
69 simatic_ipc_find_dmi_entry_helper(const struct dmi_header
*dh
, void *_data
)
73 if (dh
->type
!= SIMATIC_IPC_DMI_ENTRY_OEM
)
76 *id
= simatic_ipc_get_station_id((u8
*)dh
, dh
->length
);
79 #endif /* __PLATFORM_DATA_X86_SIMATIC_IPC_H */