Re: [PATCH 07/14] aspeed: Add PECI controller

2022-06-28 Thread Peter Delevoryas


> On Jun 27, 2022, at 11:47 PM, Cédric Le Goater  wrote:
> 
> On 6/27/22 21:54, Peter Delevoryas wrote:
> 
> Could we have some short intro ? :)

Yes, definitely, I’ll resubmit with some more details.

> 
>> Signed-off-by: Peter Delevoryas 
>> ---
>>  hw/arm/aspeed_ast10x0.c   |  11 ++
>>  hw/misc/aspeed_peci.c | 225 ++
>>  hw/misc/meson.build   |   3 +-
>>  include/hw/arm/aspeed_soc.h   |   3 +
>>  include/hw/misc/aspeed_peci.h |  34 +
>>  5 files changed, 275 insertions(+), 1 deletion(-)
>>  create mode 100644 hw/misc/aspeed_peci.c
>>  create mode 100644 include/hw/misc/aspeed_peci.h
>> diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
>> index 5df480a21f..780841ea84 100644
>> --- a/hw/arm/aspeed_ast10x0.c
>> +++ b/hw/arm/aspeed_ast10x0.c
>> @@ -47,6 +47,7 @@ static const hwaddr aspeed_soc_ast1030_memmap[] = {
>>  [ASPEED_DEV_UART13]= 0x7E790700,
>>  [ASPEED_DEV_WDT]   = 0x7E785000,
>>  [ASPEED_DEV_LPC]   = 0x7E789000,
>> +[ASPEED_DEV_PECI]  = 0x7E78B000,
>>  [ASPEED_DEV_I2C]   = 0x7E7B,
>>  };
>>  @@ -75,6 +76,7 @@ static const int aspeed_soc_ast1030_irqmap[] = {
>>  [ASPEED_DEV_TIMER8]= 23,
>>  [ASPEED_DEV_WDT]   = 24,
>>  [ASPEED_DEV_LPC]   = 35,
>> +[ASPEED_DEV_PECI]  = 38,
>>  [ASPEED_DEV_FMC]   = 39,
>>  [ASPEED_DEV_PWM]   = 44,
>>  [ASPEED_DEV_ADC]   = 46,
>> @@ -133,6 +135,8 @@ static void aspeed_soc_ast1030_init(Object *obj)
>>object_initialize_child(obj, "lpc", >lpc, TYPE_ASPEED_LPC);
>>  +object_initialize_child(obj, "peci", >peci, TYPE_ASPEED_PECI);
>> +
>>  object_initialize_child(obj, "sbc", >sbc, TYPE_ASPEED_SBC);
>>for (i = 0; i < sc->wdts_num; i++) {
>> @@ -238,6 +242,13 @@ static void aspeed_soc_ast1030_realize(DeviceState 
>> *dev_soc, Error **errp)
>>  /* UART */
>>  aspeed_soc_uart_init(s);
>>  +/* PECI */
>> +if (!sysbus_realize(SYS_BUS_DEVICE(>peci), errp)) {
>> +return;
>> +}
>> +sysbus_mmio_map(SYS_BUS_DEVICE(>peci), 0, 
>> sc->memmap[ASPEED_DEV_PECI]);
>> +sysbus_connect_irq(SYS_BUS_DEVICE(>peci), 0, aspeed_soc_get_irq(s, 
>> ASPEED_DEV_PECI));
>> +
>>  /* Timer */
>>  object_property_set_link(OBJECT(>timerctrl), "scu", OBJECT(>scu),
>>   _abort);
>> diff --git a/hw/misc/aspeed_peci.c b/hw/misc/aspeed_peci.c
>> new file mode 100644
>> index 00..670e532fc0
>> --- /dev/null
>> +++ b/hw/misc/aspeed_peci.c
>> @@ -0,0 +1,225 @@
>> +/*
>> + * Aspeed PECI Controller
>> + *
>> + * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
>> + *
>> + * This code is licensed under the GPL version 2 or later. See the COPYING
>> + * file in the top-level directory.
>> + */
>> +
>> +#include "qemu/osdep.h"
>> +#include "qemu/log.h"
>> +#include "hw/irq.h"
>> +#include "hw/misc/aspeed_peci.h"
>> +
>> +#define U(x) (x##U)
>> +#define GENMASK(h, l) \
>> +(((~U(0)) - (U(1) << (l)) + 1) & \
>> + (~U(0) >> (32 - 1 - (h
> 
> I beleive QEMU has similar macros to generate masks.

Ah yes good catch, I can probably fix that pretty easily.

> 
> 
>> +/* ASPEED PECI Registers */
>> +/* Control Register */
>> +#define ASPEED_PECI_CTRL (0x00 / 4)
>> +#define   ASPEED_PECI_CTRL_SAMPLING_MASKGENMASK(19, 16)
>> +#define   ASPEED_PECI_CTRL_RD_MODE_MASK GENMASK(13, 12)
>> +#define ASPEED_PECI_CTRL_RD_MODE_DBG BIT(13)
>> +#define ASPEED_PECI_CTRL_RD_MODE_COUNT BIT(12)
>> +#define   ASPEED_PECI_CTRL_CLK_SRC_HCLK BIT(11)
>> +#define   ASPEED_PECI_CTRL_CLK_DIV_MASK GENMASK(10, 8)
>> +#define   ASPEED_PECI_CTRL_INVERT_OUT BIT(7)
>> +#define   ASPEED_PECI_CTRL_INVERT_IN BIT(6)
>> +#define   ASPEED_PECI_CTRL_BUS_CONTENTION_EN BIT(5)
>> +#define   ASPEED_PECI_CTRL_PECI_EN  BIT(4)
>> +#define   ASPEED_PECI_CTRL_PECI_CLK_EN  BIT(0)
>> +
>> +/* Timing Negotiation Register */
>> +#define ASPEED_PECI_TIMING_NEGOTIATION (0x04 / 4)
>> +#define   ASPEED_PECI_T_NEGO_MSG_MASK  GENMASK(15, 8)
>> +#define   ASPEED_PECI_T_NEGO_ADDR_MASK  GENMASK(7, 0)
>> +
>> +/* Command Register */
>> +#define ASPEED_PECI_CMD (0x08 / 4)
>> +#define   ASPEED_PECI_CMD_PIN_MONITORING BIT(31)
>> +#define   ASPEED_PECI_CMD_STS_MASK  GENMASK(27, 24)
>> +#define ASPEED_PECI_CMD_STS_ADDR_T_NEGO 0x3
>> +#define   ASPEED_PECI_CMD_IDLE_MASK  \
>> +   (ASPEED_PECI_CMD_STS_MASK | ASPEED_PECI_CMD_PIN_MONITORING)
>> +#define   ASPEED_PECI_CMD_FIRE   BIT(0)
>> +
>> +/* Read/Write Length Register */
>> +#define ASPEED_PECI_RW_LENGTH (0x0c / 4)
>> +#define   ASPEED_PECI_AW_FCS_EN   BIT(31)
>> +#define   ASPEED_PECI_RD_LEN_MASK  GENMASK(23, 16)
>> +#define   ASPEED_PECI_WR_LEN_MASK  GENMASK(15, 8)
>> +#define   ASPEED_PECI_TARGET_ADDR_MASK  GENMASK(7, 0)
>> +
>> +/* Expected FCS Data Register */
>> +#define ASPEED_PECI_EXPECTED_FCS (0x10 / 4)
>> +#define   ASPEED_PECI_EXPECTED_RD_FCS_MASK GENMASK(23, 16)
>> +#define   

Re: [PATCH 07/14] aspeed: Add PECI controller

2022-06-28 Thread Cédric Le Goater

On 6/27/22 21:54, Peter Delevoryas wrote:

Could we have some short intro ? :)


Signed-off-by: Peter Delevoryas 
---
  hw/arm/aspeed_ast10x0.c   |  11 ++
  hw/misc/aspeed_peci.c | 225 ++
  hw/misc/meson.build   |   3 +-
  include/hw/arm/aspeed_soc.h   |   3 +
  include/hw/misc/aspeed_peci.h |  34 +
  5 files changed, 275 insertions(+), 1 deletion(-)
  create mode 100644 hw/misc/aspeed_peci.c
  create mode 100644 include/hw/misc/aspeed_peci.h

diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
index 5df480a21f..780841ea84 100644
--- a/hw/arm/aspeed_ast10x0.c
+++ b/hw/arm/aspeed_ast10x0.c
@@ -47,6 +47,7 @@ static const hwaddr aspeed_soc_ast1030_memmap[] = {
  [ASPEED_DEV_UART13]= 0x7E790700,
  [ASPEED_DEV_WDT]   = 0x7E785000,
  [ASPEED_DEV_LPC]   = 0x7E789000,
+[ASPEED_DEV_PECI]  = 0x7E78B000,
  [ASPEED_DEV_I2C]   = 0x7E7B,
  };
  
@@ -75,6 +76,7 @@ static const int aspeed_soc_ast1030_irqmap[] = {

  [ASPEED_DEV_TIMER8]= 23,
  [ASPEED_DEV_WDT]   = 24,
  [ASPEED_DEV_LPC]   = 35,
+[ASPEED_DEV_PECI]  = 38,
  [ASPEED_DEV_FMC]   = 39,
  [ASPEED_DEV_PWM]   = 44,
  [ASPEED_DEV_ADC]   = 46,
@@ -133,6 +135,8 @@ static void aspeed_soc_ast1030_init(Object *obj)
  
  object_initialize_child(obj, "lpc", >lpc, TYPE_ASPEED_LPC);
  
+object_initialize_child(obj, "peci", >peci, TYPE_ASPEED_PECI);

+
  object_initialize_child(obj, "sbc", >sbc, TYPE_ASPEED_SBC);
  
  for (i = 0; i < sc->wdts_num; i++) {

@@ -238,6 +242,13 @@ static void aspeed_soc_ast1030_realize(DeviceState 
*dev_soc, Error **errp)
  /* UART */
  aspeed_soc_uart_init(s);
  
+/* PECI */

+if (!sysbus_realize(SYS_BUS_DEVICE(>peci), errp)) {
+return;
+}
+sysbus_mmio_map(SYS_BUS_DEVICE(>peci), 0, sc->memmap[ASPEED_DEV_PECI]);
+sysbus_connect_irq(SYS_BUS_DEVICE(>peci), 0, aspeed_soc_get_irq(s, 
ASPEED_DEV_PECI));
+
  /* Timer */
  object_property_set_link(OBJECT(>timerctrl), "scu", OBJECT(>scu),
   _abort);
diff --git a/hw/misc/aspeed_peci.c b/hw/misc/aspeed_peci.c
new file mode 100644
index 00..670e532fc0
--- /dev/null
+++ b/hw/misc/aspeed_peci.c
@@ -0,0 +1,225 @@
+/*
+ * Aspeed PECI Controller
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
+ *
+ * This code is licensed under the GPL version 2 or later. See the COPYING
+ * file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/log.h"
+#include "hw/irq.h"
+#include "hw/misc/aspeed_peci.h"
+
+#define U(x) (x##U)
+#define GENMASK(h, l) \
+   (((~U(0)) - (U(1) << (l)) + 1) & \
+(~U(0) >> (32 - 1 - (h


I beleive QEMU has similar macros to generate masks.



+/* ASPEED PECI Registers */
+/* Control Register */
+#define ASPEED_PECI_CTRL (0x00 / 4)
+#define   ASPEED_PECI_CTRL_SAMPLING_MASK   GENMASK(19, 16)
+#define   ASPEED_PECI_CTRL_RD_MODE_MASKGENMASK(13, 12)
+#define ASPEED_PECI_CTRL_RD_MODE_DBG BIT(13)
+#define ASPEED_PECI_CTRL_RD_MODE_COUNT BIT(12)
+#define   ASPEED_PECI_CTRL_CLK_SRC_HCLK BIT(11)
+#define   ASPEED_PECI_CTRL_CLK_DIV_MASK GENMASK(10, 8)
+#define   ASPEED_PECI_CTRL_INVERT_OUT BIT(7)
+#define   ASPEED_PECI_CTRL_INVERT_IN BIT(6)
+#define   ASPEED_PECI_CTRL_BUS_CONTENTION_EN BIT(5)
+#define   ASPEED_PECI_CTRL_PECI_EN  BIT(4)
+#define   ASPEED_PECI_CTRL_PECI_CLK_EN  BIT(0)
+
+/* Timing Negotiation Register */
+#define ASPEED_PECI_TIMING_NEGOTIATION (0x04 / 4)
+#define   ASPEED_PECI_T_NEGO_MSG_MASK  GENMASK(15, 8)
+#define   ASPEED_PECI_T_NEGO_ADDR_MASK  GENMASK(7, 0)
+
+/* Command Register */
+#define ASPEED_PECI_CMD (0x08 / 4)
+#define   ASPEED_PECI_CMD_PIN_MONITORING BIT(31)
+#define   ASPEED_PECI_CMD_STS_MASK  GENMASK(27, 24)
+#define ASPEED_PECI_CMD_STS_ADDR_T_NEGO 0x3
+#define   ASPEED_PECI_CMD_IDLE_MASK  \
+   (ASPEED_PECI_CMD_STS_MASK | ASPEED_PECI_CMD_PIN_MONITORING)
+#define   ASPEED_PECI_CMD_FIRE   BIT(0)
+
+/* Read/Write Length Register */
+#define ASPEED_PECI_RW_LENGTH (0x0c / 4)
+#define   ASPEED_PECI_AW_FCS_EN   BIT(31)
+#define   ASPEED_PECI_RD_LEN_MASK  GENMASK(23, 16)
+#define   ASPEED_PECI_WR_LEN_MASK  GENMASK(15, 8)
+#define   ASPEED_PECI_TARGET_ADDR_MASK  GENMASK(7, 0)
+
+/* Expected FCS Data Register */
+#define ASPEED_PECI_EXPECTED_FCS (0x10 / 4)
+#define   ASPEED_PECI_EXPECTED_RD_FCS_MASK GENMASK(23, 16)
+#define   ASPEED_PECI_EXPECTED_AW_FCS_AUTO_MASK GENMASK(15, 8)
+#define   ASPEED_PECI_EXPECTED_WR_FCS_MASK GENMASK(7, 0)
+
+/* Captured FCS Data Register */
+#define ASPEED_PECI_CAPTURED_FCS (0x14 / 4)
+#define   ASPEED_PECI_CAPTURED_RD_FCS_MASK GENMASK(23, 16)
+#define   ASPEED_PECI_CAPTURED_WR_FCS_MASK GENMASK(7, 0)
+
+/* Interrupt Register */
+#define ASPEED_PECI_INT_CTRL (0x18 / 4)
+#define   ASPEED_PECI_TIMING_NEGO_SEL_MASK GENMASK(31, 30)
+#define ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO 0
+#define 

[PATCH 07/14] aspeed: Add PECI controller

2022-06-27 Thread Peter Delevoryas
Signed-off-by: Peter Delevoryas 
---
 hw/arm/aspeed_ast10x0.c   |  11 ++
 hw/misc/aspeed_peci.c | 225 ++
 hw/misc/meson.build   |   3 +-
 include/hw/arm/aspeed_soc.h   |   3 +
 include/hw/misc/aspeed_peci.h |  34 +
 5 files changed, 275 insertions(+), 1 deletion(-)
 create mode 100644 hw/misc/aspeed_peci.c
 create mode 100644 include/hw/misc/aspeed_peci.h

diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
index 5df480a21f..780841ea84 100644
--- a/hw/arm/aspeed_ast10x0.c
+++ b/hw/arm/aspeed_ast10x0.c
@@ -47,6 +47,7 @@ static const hwaddr aspeed_soc_ast1030_memmap[] = {
 [ASPEED_DEV_UART13]= 0x7E790700,
 [ASPEED_DEV_WDT]   = 0x7E785000,
 [ASPEED_DEV_LPC]   = 0x7E789000,
+[ASPEED_DEV_PECI]  = 0x7E78B000,
 [ASPEED_DEV_I2C]   = 0x7E7B,
 };
 
@@ -75,6 +76,7 @@ static const int aspeed_soc_ast1030_irqmap[] = {
 [ASPEED_DEV_TIMER8]= 23,
 [ASPEED_DEV_WDT]   = 24,
 [ASPEED_DEV_LPC]   = 35,
+[ASPEED_DEV_PECI]  = 38,
 [ASPEED_DEV_FMC]   = 39,
 [ASPEED_DEV_PWM]   = 44,
 [ASPEED_DEV_ADC]   = 46,
@@ -133,6 +135,8 @@ static void aspeed_soc_ast1030_init(Object *obj)
 
 object_initialize_child(obj, "lpc", >lpc, TYPE_ASPEED_LPC);
 
+object_initialize_child(obj, "peci", >peci, TYPE_ASPEED_PECI);
+
 object_initialize_child(obj, "sbc", >sbc, TYPE_ASPEED_SBC);
 
 for (i = 0; i < sc->wdts_num; i++) {
@@ -238,6 +242,13 @@ static void aspeed_soc_ast1030_realize(DeviceState 
*dev_soc, Error **errp)
 /* UART */
 aspeed_soc_uart_init(s);
 
+/* PECI */
+if (!sysbus_realize(SYS_BUS_DEVICE(>peci), errp)) {
+return;
+}
+sysbus_mmio_map(SYS_BUS_DEVICE(>peci), 0, sc->memmap[ASPEED_DEV_PECI]);
+sysbus_connect_irq(SYS_BUS_DEVICE(>peci), 0, aspeed_soc_get_irq(s, 
ASPEED_DEV_PECI));
+
 /* Timer */
 object_property_set_link(OBJECT(>timerctrl), "scu", OBJECT(>scu),
  _abort);
diff --git a/hw/misc/aspeed_peci.c b/hw/misc/aspeed_peci.c
new file mode 100644
index 00..670e532fc0
--- /dev/null
+++ b/hw/misc/aspeed_peci.c
@@ -0,0 +1,225 @@
+/*
+ * Aspeed PECI Controller
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
+ *
+ * This code is licensed under the GPL version 2 or later. See the COPYING
+ * file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/log.h"
+#include "hw/irq.h"
+#include "hw/misc/aspeed_peci.h"
+
+#define U(x) (x##U)
+#define GENMASK(h, l) \
+   (((~U(0)) - (U(1) << (l)) + 1) & \
+(~U(0) >> (32 - 1 - (h
+
+/* ASPEED PECI Registers */
+/* Control Register */
+#define ASPEED_PECI_CTRL (0x00 / 4)
+#define   ASPEED_PECI_CTRL_SAMPLING_MASK   GENMASK(19, 16)
+#define   ASPEED_PECI_CTRL_RD_MODE_MASKGENMASK(13, 12)
+#define ASPEED_PECI_CTRL_RD_MODE_DBG BIT(13)
+#define ASPEED_PECI_CTRL_RD_MODE_COUNT BIT(12)
+#define   ASPEED_PECI_CTRL_CLK_SRC_HCLK BIT(11)
+#define   ASPEED_PECI_CTRL_CLK_DIV_MASK GENMASK(10, 8)
+#define   ASPEED_PECI_CTRL_INVERT_OUT BIT(7)
+#define   ASPEED_PECI_CTRL_INVERT_IN BIT(6)
+#define   ASPEED_PECI_CTRL_BUS_CONTENTION_EN BIT(5)
+#define   ASPEED_PECI_CTRL_PECI_EN  BIT(4)
+#define   ASPEED_PECI_CTRL_PECI_CLK_EN  BIT(0)
+
+/* Timing Negotiation Register */
+#define ASPEED_PECI_TIMING_NEGOTIATION (0x04 / 4)
+#define   ASPEED_PECI_T_NEGO_MSG_MASK  GENMASK(15, 8)
+#define   ASPEED_PECI_T_NEGO_ADDR_MASK  GENMASK(7, 0)
+
+/* Command Register */
+#define ASPEED_PECI_CMD (0x08 / 4)
+#define   ASPEED_PECI_CMD_PIN_MONITORING BIT(31)
+#define   ASPEED_PECI_CMD_STS_MASK  GENMASK(27, 24)
+#define ASPEED_PECI_CMD_STS_ADDR_T_NEGO 0x3
+#define   ASPEED_PECI_CMD_IDLE_MASK  \
+   (ASPEED_PECI_CMD_STS_MASK | ASPEED_PECI_CMD_PIN_MONITORING)
+#define   ASPEED_PECI_CMD_FIRE   BIT(0)
+
+/* Read/Write Length Register */
+#define ASPEED_PECI_RW_LENGTH (0x0c / 4)
+#define   ASPEED_PECI_AW_FCS_EN   BIT(31)
+#define   ASPEED_PECI_RD_LEN_MASK  GENMASK(23, 16)
+#define   ASPEED_PECI_WR_LEN_MASK  GENMASK(15, 8)
+#define   ASPEED_PECI_TARGET_ADDR_MASK  GENMASK(7, 0)
+
+/* Expected FCS Data Register */
+#define ASPEED_PECI_EXPECTED_FCS (0x10 / 4)
+#define   ASPEED_PECI_EXPECTED_RD_FCS_MASK GENMASK(23, 16)
+#define   ASPEED_PECI_EXPECTED_AW_FCS_AUTO_MASK GENMASK(15, 8)
+#define   ASPEED_PECI_EXPECTED_WR_FCS_MASK GENMASK(7, 0)
+
+/* Captured FCS Data Register */
+#define ASPEED_PECI_CAPTURED_FCS (0x14 / 4)
+#define   ASPEED_PECI_CAPTURED_RD_FCS_MASK GENMASK(23, 16)
+#define   ASPEED_PECI_CAPTURED_WR_FCS_MASK GENMASK(7, 0)
+
+/* Interrupt Register */
+#define ASPEED_PECI_INT_CTRL (0x18 / 4)
+#define   ASPEED_PECI_TIMING_NEGO_SEL_MASK GENMASK(31, 30)
+#define ASPEED_PECI_1ST_BIT_OF_ADDR_NEGO 0
+#define ASPEED_PECI_2ND_BIT_OF_ADDR_NEGO 1
+#define ASPEED_PECI_MESSAGE_NEGO  2
+#define   ASPEED_PECI_INT_MASK   GENMASK(4, 0)
+#define ASPEED_PECI_INT_BUS_TIMEOUT  BIT(4)
+#define