xref: /openbmc/libcper/generator/sections/gen-section-cxl-component.c (revision 2d4d3b65396596d8939bacaea54ed529530362f9)
1de9707f9SLawrence Tang /**
2efe17e2cSLawrence Tang  * Functions for generating pseudo-random CXL component error sections.
3de9707f9SLawrence Tang  *
4de9707f9SLawrence Tang  * Author: Lawrence.Tang@arm.com
5de9707f9SLawrence Tang  **/
6de9707f9SLawrence Tang 
7de9707f9SLawrence Tang #include <stdlib.h>
8e42fb487SThu Nguyen #include <libcper/BaseTypes.h>
9e42fb487SThu Nguyen #include <libcper/generator/gen-utils.h>
10e42fb487SThu Nguyen #include <libcper/generator/sections/gen-section.h>
11de9707f9SLawrence Tang 
12efe17e2cSLawrence Tang //Generates a single pseudo-random CXL component error section, saving the resulting address to the given
13de9707f9SLawrence Tang //location. Returns the size of the newly created section.
generate_section_cxl_component(void ** location,GEN_VALID_BITS_TEST_TYPE validBitsType)14ae8f6d9aSAushim Nagarkatti size_t generate_section_cxl_component(void **location,
15ae8f6d9aSAushim Nagarkatti 				      GEN_VALID_BITS_TEST_TYPE validBitsType)
16de9707f9SLawrence Tang {
17de9707f9SLawrence Tang 	//Create a random length for the CXL component event log.
18de9707f9SLawrence Tang 	//The logs attached here do not necessarily conform to the specification, and are simply random.
19*2d4d3b65SEd Tanous 	int log_len = cper_rand() % 64;
20de9707f9SLawrence Tang 
21de9707f9SLawrence Tang 	//Create random bytes.
22de9707f9SLawrence Tang 	int size = 32 + log_len;
23de9707f9SLawrence Tang 	UINT8 *bytes = generate_random_bytes(size);
24de9707f9SLawrence Tang 
25de9707f9SLawrence Tang 	//Set reserved areas to zero.
26f8fc7052SJohn Chung 	UINT32 *validation = (UINT32 *)(bytes + 4);
27f8fc7052SJohn Chung 	*validation &= 0x7;
28ae8f6d9aSAushim Nagarkatti 	if (validBitsType == ALL_VALID) {
29ae8f6d9aSAushim Nagarkatti 		*validation = 0x7;
30ae8f6d9aSAushim Nagarkatti 	} else if (validBitsType == SOME_VALID) {
31ae8f6d9aSAushim Nagarkatti 		*validation = 0x5;
32ae8f6d9aSAushim Nagarkatti 	}
33f8fc7052SJohn Chung 	*(validation + 1) = 0;
34f8fc7052SJohn Chung 	UINT8 *slot_number = (UINT8 *)(bytes + 21);
35f8fc7052SJohn Chung 	*slot_number &= ~0x7; //Device ID slot number bits 0-2.
36de9707f9SLawrence Tang 	*(bytes + 23) = 0;    //Device ID byte 11.
37de9707f9SLawrence Tang 
38de9707f9SLawrence Tang 	//Set expected values.
39de9707f9SLawrence Tang 	UINT32 *length = (UINT32 *)bytes;
40de9707f9SLawrence Tang 	*length = size;
41de9707f9SLawrence Tang 
42de9707f9SLawrence Tang 	//Set return values, exit.
43de9707f9SLawrence Tang 	*location = bytes;
44de9707f9SLawrence Tang 	return size;
45de9707f9SLawrence Tang }
46