drivers/ipmi/ocp: Add function to support OCP specific ipmi command
Add driver for OCP specific ipmi commands. With this driver, OCP specific ipmi command can be used after implementing functions here. TEST=Build with CB:42242 on Delta Lake, select Kconfig option: IPMI_OCP and add device in devicetree to open this function. Use ipmi-util in OpenBMC to dump raw data and check if this function work. Signed-off-by: Tim Chu <Tim.Chu@quantatw.com> Change-Id: I2efa85978ec4ad3d75f2bd93b4139ef8059127ed Reviewed-on: https://review.coreboot.org/c/coreboot/+/43996 Reviewed-by: Angel Pons <th3fanbus@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		
							
								
								
									
										5
									
								
								src/drivers/ipmi/ocp/Kconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/drivers/ipmi/ocp/Kconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| config IPMI_OCP | ||||
| 	bool | ||||
| 	default n | ||||
| 	help | ||||
| 	  This implements OCP specific IPMI command | ||||
							
								
								
									
										1
									
								
								src/drivers/ipmi/ocp/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/drivers/ipmi/ocp/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| ramstage-$(CONFIG_IPMI_OCP) += ipmi_ocp.c | ||||
							
								
								
									
										70
									
								
								src/drivers/ipmi/ocp/ipmi_ocp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/drivers/ipmi/ocp/ipmi_ocp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||||
| /* | ||||
|  * Place in devicetree.cb: | ||||
|  * | ||||
|  * chip drivers/ipmi/ocp # OCP specific IPMI porting | ||||
| 	device pnp ca2.1 on end | ||||
|  * end | ||||
|  */ | ||||
|  | ||||
| #include <console/console.h> | ||||
| #include <device/device.h> | ||||
| #include <device/pnp.h> | ||||
| #include "chip.h" | ||||
| #include "drivers/ipmi/ipmi_kcs.h" | ||||
| #include "ipmi_ocp.h" | ||||
|  | ||||
| static void ipmi_ocp_init(struct device *dev) | ||||
| { | ||||
| 	/* Add OCP specific IPMI command */ | ||||
| } | ||||
|  | ||||
| static void ipmi_ocp_final(struct device *dev) | ||||
| { | ||||
| 	/* Add OCP specific IPMI command */ | ||||
| } | ||||
|  | ||||
| static void ipmi_set_resources(struct device *dev) | ||||
| { | ||||
| 	struct resource *res; | ||||
|  | ||||
| 	for (res = dev->resource_list; res; res = res->next) { | ||||
| 		if (!(res->flags & IORESOURCE_ASSIGNED)) | ||||
| 			continue; | ||||
|  | ||||
| 		res->flags |= IORESOURCE_STORED; | ||||
| 		report_resource_stored(dev, res, ""); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void ipmi_read_resources(struct device *dev) | ||||
| { | ||||
| 	struct resource *res = new_resource(dev, 0); | ||||
| 	res->base = dev->path.pnp.port; | ||||
| 	res->size = 2; | ||||
| 	res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; | ||||
| } | ||||
|  | ||||
| static struct device_operations ops = { | ||||
| 	.read_resources   = ipmi_read_resources, | ||||
| 	.set_resources    = ipmi_set_resources, | ||||
| 	.init             = ipmi_ocp_init, | ||||
| 	.final            = ipmi_ocp_final, | ||||
| }; | ||||
|  | ||||
| static void enable_dev(struct device *dev) | ||||
| { | ||||
| 	if (dev->path.type != DEVICE_PATH_PNP) | ||||
| 		printk(BIOS_ERR, "%s: Unsupported device type\n", | ||||
| 		       dev_path(dev)); | ||||
| 	else if (dev->path.pnp.port & 1) | ||||
| 		printk(BIOS_ERR, "%s: Base address needs to be aligned to 2\n", | ||||
| 		       dev_path(dev)); | ||||
| 	else | ||||
| 		dev->ops = &ops; | ||||
| } | ||||
|  | ||||
| struct chip_operations drivers_ipmi_ocp_ops = { | ||||
| 	CHIP_NAME("IPMI OCP") | ||||
| 	.enable_dev = enable_dev, | ||||
| }; | ||||
							
								
								
									
										6
									
								
								src/drivers/ipmi/ocp/ipmi_ocp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/drivers/ipmi/ocp/ipmi_ocp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||||
|  | ||||
| #ifndef __IPMI_OCP_H | ||||
| #define __IPMI_OCP_H | ||||
|  | ||||
| #endif | ||||
| @@ -13,6 +13,7 @@ config BOARD_SPECIFIC_OPTIONS | ||||
| 	select OCP_DMI | ||||
| 	select VPD | ||||
| 	select VPD_SMBIOS_VERSION | ||||
| 	select IPMI_OCP | ||||
|  | ||||
| config POWER_STATE_DEFAULT_ON_AFTER_FAILURE | ||||
| 	default n | ||||
|   | ||||
| @@ -85,6 +85,9 @@ chip soc/intel/xeon_sp/cpx | ||||
| 				register "bmc_i2c_address" = "0x20" | ||||
| 				register "bmc_boot_timeout" = "60" | ||||
| 			end | ||||
| 			chip drivers/ipmi/ocp # OCP specific IPMI porting | ||||
| 				device pnp ca2.1 on end | ||||
| 			end | ||||
| 		end # ISA bridge: Intel Device a245 | ||||
| 		device pci 1f.1 on end # p2sb | ||||
| 		device pci 1f.2 on end # Memory controller: Intel Device a221 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user