1) for the SPD you should enter the values from the DDR4 datasheet.
2) if not present try it without it.
3) when discrete DRAM is soldered on the board, the DDR controller registers are programed via fixed register setting or mocked SPD is used. I have not seen any customers do the hard code the SPD (as it is read from a DIMM).
for the mocked program the ddr_raw_timing[] and enable/set the DEF (#ifdef CONFIG_SYS_DDR_RAW_TIMING)
for the fixed DDR controller register: program the fixed_ddr_pram for fixed DDR controller registers. and disable the DEF (#ifdef CONFIG_SYS_DDR_RAW_TIMING).
for example:
#ifdef CONFIG_SYS_DDR_RAW_TIMING
/* DDR model number: MT40A512M16JY-083E:B */
struct dimm_params ddr_raw_timing = {
.n_ranks = 1,
.rank_density = 4294967296u,
.capacity = 4294967296u,
.primary_sdram_width = 64,
.ec_sdram_width = 8,
.rdimm = 0,
.mirrored_dimm = 0,
.n_row_addr = 16,
.n_col_addr = 10,
.bank_group_bits = 1,
.edc_config = 2,
.burst_lengths_bitmask = 0x0c,
.tckmin_x_ps = 750,
.tckmax_ps = 1900,
.caslat_x = 0x0001FFE00,
.taa_ps = 13500,
.trcd_ps = 13500,
.trp_ps = 13500,
.tras_ps = 33000,
.trc_ps = 46500,
.twr_ps = 15000,
.trfc1_ps = 350000,
.trfc2_ps = 260000,
.trfc4_ps = 160000,
.tfaw_ps = 30000,
.trrds_ps = 5300,
.trrdl_ps = 6400,
.tccdl_ps = 5355,
.refresh_rate_ps = 7800000,
.dq_mapping[0] = 0x0,
.dq_mapping[1] = 0x0,
.dq_mapping[2] = 0x0,
.dq_mapping[3] = 0x0,
.dq_mapping[4] = 0x0,
.dq_mapping_ors = 0,
.rc = 0x1f,
};