Skip to content

Commit ff319e7

Browse files
committed
add basic dbg2 table.
1 parent 8dd4593 commit ff319e7

File tree

5 files changed

+272
-1
lines changed

5 files changed

+272
-1
lines changed

include/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ typedef int64_t INT64;
3636
#define FALSE false;
3737
typedef bool BOOLEAN;
3838
typedef void VOID;
39+
typedef char CHAR8;
40+
_Static_assert(sizeof(CHAR8) == 1, "CHAR8 size incorrect");
3941

4042
/* For generator parsing acpi table in compiled binary */
4143
#define ACPI_TABLE_START_MAGIC 'A', 'C', 'G', 'S'

include/common/dbg2.h

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#pragma once
2+
#include <acpi.h>
3+
#include <common.h>
4+
/** Reference
5+
https://learn.microsoft.com/en-us/windows-hardware/drivers/bringup/acpi-debug-port-table
6+
*/
7+
//
8+
/* Table signature */
9+
#define ACPI_DBG2_SIGNATURE 'D', 'B', 'G', '2'
10+
#define ACPI_DBG2_REVISION 1
11+
12+
#define ACPI_DBG2_TABLE_STRUCTURE_NAME DEBUG_PORT_TABLE_2
13+
14+
typedef struct {
15+
UINT8 AddressSpaceID;
16+
UINT8 RegisterBitWidth;
17+
UINT8 RegisterBitOffset;
18+
UINT8 AccessSize;
19+
UINT64 Address;
20+
} __attribute__((packed)) ACPI_GAS;
21+
_Static_assert(sizeof(ACPI_GAS) == 12, "ACPI_GAS size incorrect");
22+
23+
/* Body Structures */
24+
typedef struct {
25+
UINT32 OffsetDbgDeviceInfo;
26+
UINT32 NumberOfDbgDevices;
27+
// followed by Debug device info
28+
} __attribute__((packed)) DBG2_HEADER_EXTRA_DATA;
29+
_Static_assert(sizeof(DBG2_HEADER_EXTRA_DATA) == 8,
30+
"DBG2_HEADER_EXTRA_DATA size incorrect");
31+
32+
enum DBG2_DEBUG_PORT_TYPE {
33+
DBG2_DEBUG_PORT_TYPE_RESERVED = 0,
34+
/* 0-0x7FFF are reserved */
35+
DBG2_DEBUG_PORT_TYPE_SERIAL = 0x8000,
36+
DBG2_DEBUG_PORT_TYPE_1394 = 0x8001,
37+
DBG2_DEBUG_PORT_TYPE_USB = 0x8002,
38+
DBG2_DEBUG_PORT_TYPE_NETWORK = 0x8003,
39+
/* 0x8004 - 0xFFFF are reserved */
40+
DBG2_DEBUG_PORT_TYPE_NET2 = 0x8004, /* Reserved */
41+
DBG2_DEBUG_PORT_TYPE_RESERVED2 = 0xFFFF,
42+
};
43+
44+
enum DBG2_DEBUG_PORT_SUBTYPE_SERIAL {
45+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_FULLY_16550_COMPATIBLE = 0,
46+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_16550_SUBSET_COMPATIBLE_WITH_DBGP = 1,
47+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_NAX311XE_SPI_UART = 2,
48+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_ARM_PL011 = 3,
49+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_MSM_8x60 = 4,
50+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_NVIDIA_16550 = 5,
51+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_TI_OMAP = 6,
52+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_RESERVED = 7,
53+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_APM88XXXX = 8,
54+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_MSM8974 = 9,
55+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_SAM5250 = 0xA,
56+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_INTEL_USIF = 0xB,
57+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_IMX_6 = 0xC,
58+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_DEPRECATED_ARM_SBSA_2_0_ONLY = 0xD,
59+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART = 0xE,
60+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_ARM_DCC = 0xF,
61+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_BCM2835 = 0x10,
62+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_SDM845_1P8432_MHZ_CLK = 0x11,
63+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_16550_COMPATIBLE_WITH_PARAS_DEF_IN_GAS = 0x12,
64+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_SDM845_7P372_MHZ_CLK = 0x13,
65+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_INTEL_LPSS = 0x14,
66+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_RISC_V_SBI_CONSOLE = 0x15,
67+
/* 0x16 - 0xFFFF are reserved for future use */
68+
DBG2_DEBUG_PORT_SUBTYPE_SERIAL_RESERVED2 = 0xFFFF,
69+
};
70+
71+
enum DBG2_DEBUG_PORT_SUBTYPE_1394 {
72+
DBG2_DEBUG_PORT_SUBTYPE_1394_STD_HOST_CONTROLLER_INTERFACE = 0,
73+
/* 0x1 - 0xFFFF are reserved for future use */
74+
DBG2_DEBUG_PORT_SUBTYPE_1394_RESERVED = 0xFFFF,
75+
};
76+
77+
enum DBG2_DEBUG_PORT_SUBTYPE_USB {
78+
DBG2_DEBUG_PORT_SUBTYPE_USB_XHCI_COMPLIANT_CONTROLLER = 0,
79+
DBG2_DEBUG_PORT_SUBTYPE_USB_EHCI_COMPLIANT_CONTROLLER = 1,
80+
/* 0x7 - 0xFFFF are reserved for future use */
81+
DBG2_DEBUG_PORT_SUBTYPE_USB_RESERVED = 0xFFFF,
82+
};
83+
84+
enum DBG2_DEBUG_PORT_SUBTYPE_NET {
85+
DBG2_DEBUG_PORT_SUBTYPE_USB_SYNOPSYS = 0x5143,
86+
/* Other Vendor IDs can be used */
87+
};
88+
89+
/* Helper macros */
90+
#define DEBUG_DEVICE_INFO_STRUCTURE_SIZE_CHECK(name, num_gas, ns_len, \
91+
oemd_len) \
92+
_Static_assert(sizeof(DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name)) == \
93+
22 + sizeof(ACPI_GAS) * num_gas + \
94+
sizeof(UINT32) * num_gas + ns_len + oemd_len, \
95+
"DBG2_DEBUG_DEVICE_INFO_STRUCTURE_" #name " size incorrect");
96+
97+
#define DBG2_DEFINE_DEBUG_DEVICE_INFO_STRUCTURE( \
98+
name, num_of_generic_addr_regs, namespacestr_len, oemdata_len) \
99+
typedef struct { \
100+
UINT8 Revision; \
101+
UINT16 Length; \
102+
UINT8 NumOfGenericAddrRegs; \
103+
UINT16 NamespaceStringLen; \
104+
UINT16 NamespaceStringOffset; \
105+
UINT16 OemDataLen; \
106+
UINT16 OemDataOffset; \
107+
UINT16 PortType; \
108+
UINT16 PortSubtype; \
109+
UINT16 Reserved; \
110+
UINT16 BaseAddrRegOffset; \
111+
UINT16 AddrSizeOffset; \
112+
ACPI_GAS BaseAddrRegister[num_of_generic_addr_regs]; \
113+
UINT32 AddressSize[num_of_generic_addr_regs]; \
114+
CHAR8 NamespaceString[namespacestr_len]; \
115+
UINT8 OemData[oemdata_len]; \
116+
} __attribute__((packed)) DBG2_DEBUG_DEVICE_INFO_STRUCTURE_##name; \
117+
DEBUG_DEVICE_INFO_STRUCTURE_SIZE_CHECK(name, num_of_generic_addr_regs, \
118+
namespacestr_len, oemdata_len);
119+
120+
#define DBG2_DEFINE_TABLE(...) \
121+
typedef struct { \
122+
ACPI_TABLE_HEADER Header; \
123+
DBG2_HEADER_EXTRA_DATA Dbg2HeaderExtraData; \
124+
__VA_OPT__(__VA_ARGS__) \
125+
} __attribute__((packed)) ACPI_DBG2_TABLE_STRUCTURE_NAME;
126+
127+
#define DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name) \
128+
DBG2_DEBUG_DEVICE_INFO_STRUCTURE_##name
129+
130+
#define DBG2_DEFINE_DEVICE_INFO_IN_TABLE(name) \
131+
DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name) name;
132+
133+
#define DBG2_DECLARE_HEADER \
134+
ACPI_DECLARE_TABLE_HEADER( \
135+
ACPI_DBG2_SIGNATURE, ACPI_DBG2_TABLE_STRUCTURE_NAME, ACPI_DBG2_REVISION)
136+
137+
/* DBG2 Table with Magic */
138+
#define DBG2_DEFINE_WITH_MAGIC \
139+
ACPI_TABLE_WITH_MAGIC(ACPI_DBG2_TABLE_STRUCTURE_NAME)
140+
#define DBG2_START ACPI_TABLE_START(ACPI_DBG2_TABLE_STRUCTURE_NAME)
141+
#define DBG2_END ACPI_TABLE_END(ACPI_DBG2_TABLE_STRUCTURE_NAME)

include/vendor/qcom/acpi_vendor.h

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,35 @@
11
#pragma once
22

33
#define ACPI_TABLE_HEADER_OEM_ID 'Q', 'C', 'O', 'M', ' ', ' ' // "QCOM"
4-
#define ACPI_TABLE_HEADER_OEM_TABLE_ID 'Q', 'C', 'O', 'M', 'E', 'D', 'K', '2' // "QCOMEDK2"
4+
#define ACPI_TABLE_HEADER_OEM_TABLE_ID 'Q', 'C', 'O', 'M', 'E', 'D', 'K', '2' // "QCOMEDK2"
5+
6+
#define DBG2_DECLARE_QCOM_SDM845_UARD(name, namepath, address) \
7+
.UARD = { \
8+
.Revision = 1, \
9+
.Length = sizeof(DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name)), \
10+
.NumOfGenericAddrRegs = 1, \
11+
.NamespaceStringLen = sizeof(namepath), \
12+
.NamespaceStringOffset = offsetof( \
13+
DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name), NamespaceString), \
14+
.OemDataLen = 0, \
15+
.OemDataOffset = 0, \
16+
.PortType = DBG2_DEBUG_PORT_TYPE_SERIAL, \
17+
.PortSubtype = DBG2_DEBUG_PORT_SUBTYPE_SERIAL_SDM845_7P372_MHZ_CLK, \
18+
.BaseAddrRegOffset = offsetof( \
19+
DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name), BaseAddrRegister), \
20+
.AddrSizeOffset = offsetof( \
21+
DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(name), AddressSize), \
22+
.BaseAddrRegister = \
23+
{ \
24+
{ \
25+
.AddressSpaceID = 00, \
26+
.RegisterBitWidth = 0x20, \
27+
.RegisterBitOffset = 0, \
28+
.AccessSize = 0x20, \
29+
.Address = address, \
30+
}, \
31+
}, \
32+
.AddressSize = {0x1000}, \
33+
.NamespaceString = namepath, \
34+
}
35+

include/vendor/qcom/sm8850/dbg2.h

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#pragma once
2+
#include "table_header.h"
3+
#include <common/dbg2.h>
4+
5+
// DEBUG UART
6+
#define UARD_NAMESPACE_STRING "\\_SB.UARD"
7+
// USB
8+
#define URS0_NAMESPACE_STRING "\\_SB.URS0"
9+
10+
#define UARD_BASE_ADDRESS 0xA9C000ULL
11+
#define USB_OEM_DATA_SIZE 0x94
12+
13+
#define UARD_NUM_GAS 1
14+
#define URS0_NUM_GAS 2
15+
16+
/* typedef */
17+
DBG2_DEFINE_DEBUG_DEVICE_INFO_STRUCTURE(UARD, UARD_NUM_GAS,
18+
sizeof(UARD_NAMESPACE_STRING), 0);
19+
_Static_assert(sizeof(DBG2_DEBUG_DEVICE_INFO_STRUCTURE_UARD) ==
20+
22 + sizeof(ACPI_GAS) * 1 + sizeof(UINT32) * 1 +
21+
sizeof("\\_SB.UARD") + 0,
22+
"DBG2_DEBUG_DEVICE_INFO_STRUCTURE_"
23+
"UARD"
24+
" size incorrect");
25+
;
26+
27+
DBG2_DEFINE_DEBUG_DEVICE_INFO_STRUCTURE(URS0, URS0_NUM_GAS,
28+
sizeof(URS0_NAMESPACE_STRING),
29+
USB_OEM_DATA_SIZE);
30+
31+
DBG2_DEFINE_TABLE(DBG2_DEFINE_DEVICE_INFO_IN_TABLE(UARD);
32+
DBG2_DEFINE_DEVICE_INFO_IN_TABLE(URS0););
33+
DBG2_DEFINE_WITH_MAGIC;
34+
35+
/* Initialize struct */
36+
DBG2_START{
37+
DBG2_DECLARE_HEADER,
38+
DBG2_DECLARE_QCOM_SDM845_UARD(UARD, UARD_NAMESPACE_STRING,
39+
UARD_BASE_ADDRESS),
40+
.URS0 =
41+
{
42+
.Revision = 1,
43+
.Length = sizeof(DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(URS0)),
44+
.NumOfGenericAddrRegs = URS0_NUM_GAS,
45+
.NamespaceString = URS0_NAMESPACE_STRING,
46+
.NamespaceStringLen = sizeof(URS0_NAMESPACE_STRING),
47+
.NamespaceStringOffset =
48+
offsetof(DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(URS0),
49+
NamespaceString),
50+
.OemDataLen = USB_OEM_DATA_SIZE,
51+
.OemDataOffset = offsetof(
52+
DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(URS0), OemData),
53+
.PortType = DBG2_DEBUG_PORT_TYPE_NETWORK,
54+
.PortSubtype = DBG2_DEBUG_PORT_SUBTYPE_USB_SYNOPSYS,
55+
.BaseAddrRegOffset =
56+
offsetof(DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(URS0),
57+
BaseAddrRegister),
58+
.AddrSizeOffset = offsetof(
59+
DBG2_GET_DEBUG_DEVICE_INFO_STRUCTURE_NAME(URS0), AddressSize),
60+
.BaseAddrRegister =
61+
{
62+
{
63+
.AddressSpaceID = 00,
64+
.RegisterBitWidth = 0x20,
65+
.RegisterBitOffset = 0,
66+
.AccessSize = 0x20,
67+
.Address = 0xA600000,
68+
},
69+
{
70+
.AddressSpaceID = 00,
71+
.RegisterBitWidth = 0x20,
72+
.RegisterBitOffset = 0,
73+
.AccessSize = 0x20,
74+
.Address = 0xA600000,
75+
},
76+
},
77+
.AddressSize = {0xFFFFF, 0x1000},
78+
.OemData = {0x05, 0x00, 0x00, 0x00, 0x32, 0x58, 0x49, 0x46, 0x03,
79+
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc7,
80+
0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
81+
0x00, 0x00, 0x02, 0x00, 0x00, 0x10, 0x88, 0x0f, 0x00,
82+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
83+
0x02, 0x00, 0x00, 0xb4, 0x88, 0x0f, 0x00, 0x00, 0x00,
84+
0x00, 0x00, 0xeb, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
85+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94+
0x43, 0x42, 0x53, 0x55},
95+
},
96+
} DBG2_END

src/dummy/dbg2.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include <dbg2.h>

0 commit comments

Comments
 (0)